Browse Source

检验合格入库

master
han\hanst 1 year ago
parent
commit
144dbf36bb
  1. 187
      src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java
  2. 13
      src/main/java/com/gaotao/modules/po/dao/PoReceiptDetailMapper.java
  3. 13
      src/main/java/com/gaotao/modules/po/dao/PoReceiptMapper.java
  4. 91
      src/main/java/com/gaotao/modules/po/entity/PoReceipt.java
  5. 268
      src/main/java/com/gaotao/modules/po/entity/PoReceiptDetail.java
  6. 11
      src/main/java/com/gaotao/modules/po/service/PoReceiptDetailService.java
  7. 11
      src/main/java/com/gaotao/modules/po/service/PoReceiptService.java
  8. 15
      src/main/java/com/gaotao/modules/po/service/impl/PoReceiptDetailServiceImpl.java
  9. 15
      src/main/java/com/gaotao/modules/po/service/impl/PoReceiptServiceImpl.java
  10. 208
      src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

187
src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java

@ -4,13 +4,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gaotao.modules.inspection.entity.QualifiedInspectionDto;
import com.gaotao.modules.inspection.entity.InboundConfirmDto;
import com.gaotao.modules.inspection.service.InspectionInboundService;
import com.gaotao.modules.po.entity.PoReceipt;
import com.gaotao.modules.po.entity.PoReceiptDetail;
import com.gaotao.modules.po.service.PoReceiptDetailService;
import com.gaotao.modules.po.service.PoReceiptService;
import com.gaotao.modules.sys.entity.SysUserEntity;
import com.gaotao.modules.trans.entity.TransDetail;
import com.gaotao.modules.trans.entity.TransDetailDto;
import com.gaotao.modules.trans.entity.TransHeader;
import com.gaotao.modules.trans.entity.TransNoControl;
import com.gaotao.modules.trans.service.TransDetailService;
import com.gaotao.modules.trans.service.TransHeaderService;
import com.gaotao.modules.trans.service.TransNoControlService;
import com.gaotao.modules.warehouse.entity.InventoryStock;
import com.gaotao.modules.warehouse.service.InventoryStockService;
import jakarta.transaction.Transactional;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -31,53 +40,67 @@ public class InspectionInboundServiceImpl implements InspectionInboundService {
@Autowired
private InventoryStockService inventoryStockService;
@Autowired
private PoReceiptService poReceiptService;
@Autowired
private PoReceiptDetailService poReceiptDetailService;
@Autowired
private TransNoControlService transNoControlService;
@Override
public List<QualifiedInspectionDto> getQualifiedInspectionList(QualifiedInspectionDto qualifiedInspectionDto) {
// 查询状态为检验合格(A)但未入库的交易记录
QueryWrapper<TransHeader> headerWrapper = new QueryWrapper<>();
headerWrapper.eq("status", "C"); // 检验合格状态
headerWrapper.eq("trans_type_db", "CRT"); // 采购入库类型
//headerWrapper.eq("inbound_flag", "N"); // 未入库标识
// 直接查询po_receipt_detail表中状态为ARRIVED的记录
QueryWrapper<PoReceiptDetail> detailWrapper = new QueryWrapper<>();
detailWrapper.eq("status", "ARRIVED"); // 状态为已到货
if (qualifiedInspectionDto.getSite() != null) {
headerWrapper.eq("site", qualifiedInspectionDto.getSite());
detailWrapper.eq("site", qualifiedInspectionDto.getSite());
}
// 支持根据接收单号或采购单号查找
if (qualifiedInspectionDto.getTransNo() != null) {
headerWrapper.eq("trans_no", qualifiedInspectionDto.getTransNo());
detailWrapper.and(wrapper -> wrapper
.eq("receipt_no", qualifiedInspectionDto.getTransNo()) // 接收单号
.or()
.eq("order_no", qualifiedInspectionDto.getTransNo()) // 采购单号
);
}
headerWrapper.orderByDesc("trans_date");
List<TransHeader> headers = transHeaderService.list(headerWrapper);
List<QualifiedInspectionDto> result = new ArrayList<>();
detailWrapper.orderByDesc("receipt_no");
for (TransHeader header : headers) {
// 查询对应的明细
QueryWrapper<TransDetail> detailWrapper = new QueryWrapper<>();
detailWrapper.eq("site", header.getSite());
detailWrapper.eq("trans_no", header.getTransNo());
List<PoReceiptDetail> details = poReceiptDetailService.list(detailWrapper);
List<QualifiedInspectionDto> result = new ArrayList<>();
List<TransDetail> details = transDetailService.list(detailWrapper);
for (PoReceiptDetail detail : details) {
// 获取对应的接收单主记录
QueryWrapper<PoReceipt> receiptWrapper = new QueryWrapper<>();
receiptWrapper.eq("site", detail.getSite());
receiptWrapper.eq("receipt_no", detail.getReceiptNo());
PoReceipt receipt = poReceiptService.getOne(receiptWrapper);
for (TransDetail detail : details) {
if (receipt != null) {
QualifiedInspectionDto dto = new QualifiedInspectionDto();
dto.setSite(header.getSite());
dto.setTransNo(header.getTransNo());
dto.setSite(detail.getSite());
dto.setTransNo(detail.getReceiptNo()); // 使用接收单号作为事务号
dto.setItemNo(String.valueOf(detail.getItemNo()));
dto.setPartNo(detail.getPartNo());
dto.setPartDesc("物料描述"); // 这里需要关联物料主数据获取描述
dto.setTransQty(detail.getTransQty());
dto.setQualifiedQty(detail.getTransQty()); // 假设检验合格数量等于交易数量
dto.setPartDesc(""); // TODO: 需要关联物料主数据获取描述
dto.setTransQty(detail.getArriveQty());
dto.setQualifiedQty(detail.getQtyToInspect()); // 待检验数量
dto.setBatchNo(detail.getBatchNo());
dto.setLocationId(detail.getLocationId());
dto.setWarehouseId(header.getWarehouseId());
dto.setOrderRef1(detail.getOrderRef1());
dto.setOrderRef2(detail.getOrderRef2());
dto.setOrderRef3(detail.getOrderRef3());
dto.setTransDate(header.getTransDate());
//dto.setInspectionDate(header.getInspectionDate()); // 假设有检验日期字段
//dto.setInspectionUser(header.getInspectionUser()); // 假设有检验人字段
dto.setStatus(header.getStatus());
dto.setUserName(header.getUserName());
dto.setRemark(header.getRemark());
dto.setWarehouseId(receipt.getWarehouseId());
dto.setOrderRef1(detail.getOrderNo()); // 采购单号
dto.setOrderRef2("");
dto.setOrderRef3("");
dto.setTransDate(receipt.getReceiveDate());
dto.setInspectionDate(detail.getInspectionTime());
dto.setInspectionUser(detail.getInspector());
dto.setStatus("A"); // ARRIVED状态
dto.setUserName(receipt.getReceiver());
dto.setRemark(receipt.getRemark());
result.add(dto);
}
@ -89,35 +112,85 @@ public class InspectionInboundServiceImpl implements InspectionInboundService {
@Override
@Transactional
public void confirmQualifiedInbound(InboundConfirmDto inboundConfirm) {
// 1. 更新交易头入库标识
TransHeader transHeader = transHeaderService.lambdaQuery()
.eq(TransHeader::getSite, inboundConfirm.getSite())
.eq(TransHeader::getTransNo, inboundConfirm.getTransNo())
.one();
try {
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
// 1. 获取采购接收单信息
PoReceipt poReceipt = poReceiptService.lambdaQuery()
.eq(PoReceipt::getSite, inboundConfirm.getSite())
.eq(PoReceipt::getReceiptNo, inboundConfirm.getTransNo())
.one();
if (poReceipt == null) {
throw new RuntimeException("采购接收单不存在: " + inboundConfirm.getTransNo());
}
if (transHeader != null) {
transHeader.setStatus("Y"); // 已入库
//transHeader.setInboundDate(inboundConfirm.getInboundDate());
//transHeader.setInboundUser(inboundConfirm.getOperatorName());
transHeaderService.lambdaUpdate()
.set(TransHeader::getStatus, transHeader.getStatus())
//.set(TransHeader::getInboundDate, inboundConfirm.getInboundDate())
//.set(TransHeader::getInboundUser, inboundConfirm.getOperatorName())
.eq(TransHeader::getSite, inboundConfirm.getSite())
.eq(TransHeader::getTransNo, inboundConfirm.getTransNo())
// 2. 获取采购接收单明细
PoReceiptDetail poReceiptDetail = poReceiptDetailService.lambdaQuery()
.eq(PoReceiptDetail::getSite, inboundConfirm.getSite())
.eq(PoReceiptDetail::getReceiptNo, inboundConfirm.getTransNo())
.eq(PoReceiptDetail::getItemNo, Double.valueOf(inboundConfirm.getItemNo()))
.one();
if (poReceiptDetail == null) {
throw new RuntimeException("采购接收单明细不存在");
}
// 3. 创建入库事务头记录
TransNoControl transNoControl = transNoControlService.getTransNo(inboundConfirm.getSite(), "INB", 12);
String inboundTransNo = transNoControl.getNewTransNo();
TransHeader inboundHeader = new TransHeader();
inboundHeader.setSite(inboundConfirm.getSite());
inboundHeader.setTransNo(inboundTransNo);
inboundHeader.setTransDate(inboundConfirm.getInboundDate());
inboundHeader.setTransTypeDb("INB"); // 检验合格入库
inboundHeader.setWarehouseId(poReceipt.getWarehouseId());
inboundHeader.setUserId(currentUser.getUserId().toString());
inboundHeader.setUserName(currentUser.getUserDisplay());
inboundHeader.setRemark("检验合格入库 - 接收单号: " + inboundConfirm.getTransNo());
inboundHeader.setOrderRef1(poReceipt.getOrderref1()); // PO号
inboundHeader.setStatus("COMPLETED");
inboundHeader.setStatusDb("C");
inboundHeader.setEnterDate(new Date());
inboundHeader.setIfsFlag("N");
transHeaderService.save(inboundHeader);
// 4. 创建入库事务明细记录
TransDetail inboundDetail = new TransDetail();
inboundDetail.setSite(inboundConfirm.getSite());
inboundDetail.setTransNo(inboundTransNo);
inboundDetail.setItemNo(Double.valueOf(inboundConfirm.getItemNo()));
inboundDetail.setPartNo(poReceiptDetail.getPartNo());
inboundDetail.setTransQty(inboundConfirm.getInboundQty());
inboundDetail.setBatchNo(poReceiptDetail.getBatchNo());
inboundDetail.setLocationId(inboundConfirm.getTargetLocationId());
inboundDetail.setDirection("+"); // 入库方向
inboundDetail.setOrderRef1(poReceipt.getOrderref1()); // PO号
inboundDetail.setOrderRef2(inboundConfirm.getTransNo()); // 接收单号
inboundDetail.setOrderRef3("");
inboundDetail.setOrderRef4("");
inboundDetail.setOrderRef5("");
inboundDetail.setRemark("检验合格入库");
transDetailService.save(inboundDetail);
// 6. 更新采购接收单明细的状态
poReceiptDetailService.lambdaUpdate()
.set(PoReceiptDetail::getStatus, "RECEIVED") // 检验合格
.set(PoReceiptDetail::getQtyReceived,
poReceiptDetail.getQtyReceived() == null ? inboundConfirm.getInboundQty() :
poReceiptDetail.getQtyReceived().add(inboundConfirm.getInboundQty()))
.eq(PoReceiptDetail::getSite, inboundConfirm.getSite())
.eq(PoReceiptDetail::getReceiptNo, inboundConfirm.getTransNo())
.eq(PoReceiptDetail::getItemNo, Double.valueOf(inboundConfirm.getItemNo()))
.update();
}
// 2. 获取交易明细
TransDetail transDetail = transDetailService.lambdaQuery()
.eq(TransDetail::getSite, inboundConfirm.getSite())
.eq(TransDetail::getTransNo, inboundConfirm.getTransNo())
.eq(TransDetail::getItemNo, inboundConfirm.getItemNo())
.one();
// 7. 更新库存
updateInventoryStock(inboundHeader, inboundDetail, inboundConfirm);
if (transDetail != null) {
// 3. 更新库存
updateInventoryStock(transHeader, transDetail, inboundConfirm);
} catch (Exception e) {
throw new RuntimeException("检验合格入库失败: " + e.getMessage(), e);
}
}

13
src/main/java/com/gaotao/modules/po/dao/PoReceiptDetailMapper.java

@ -0,0 +1,13 @@
package com.gaotao.modules.po.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gaotao.modules.po.entity.PoReceiptDetail;
import org.apache.ibatis.annotations.Mapper;
/**
* 采购接收单明细Mapper
*/
@Mapper
public interface PoReceiptDetailMapper extends BaseMapper<PoReceiptDetail> {
}

13
src/main/java/com/gaotao/modules/po/dao/PoReceiptMapper.java

@ -0,0 +1,13 @@
package com.gaotao.modules.po.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gaotao.modules.po.entity.PoReceipt;
import org.apache.ibatis.annotations.Mapper;
/**
* 采购接收单Mapper
*/
@Mapper
public interface PoReceiptMapper extends BaseMapper<PoReceipt> {
}

91
src/main/java/com/gaotao/modules/po/entity/PoReceipt.java

@ -0,0 +1,91 @@
package com.gaotao.modules.po.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 采购接收单表 (po_receipt)
*/
@Data
@TableName("po_receipt")
public class PoReceipt implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 工厂编码
*/
private String site;
/**
* 自动生成接受单号
*/
@TableId(value = "receipt_no", type = IdType.INPUT)
private String receiptNo;
/**
* 接收日期
*/
private Date receiveDate;
/**
* 当前日期
*/
private Date enterDate;
/**
* 供应商编码
*/
private String supplierId;
/**
* 接收人
*/
private String receiver;
/**
* 用户名称
*/
private String username;
/**
* 送货单号
*/
private String deliveryNoteNo;
/**
* 是否打印 (Y/N)
*/
private String printed;
/**
* 备注
*/
private String remark;
/**
* 仓库id
*/
private String warehouseId;
/**
* 默认存入N
*/
private String outWorkOrderFlag;
/**
* 默认存入N
*/
private String emailCanSendFlag;
/**
* 订单参考字段
*/
private String orderref1;
}

268
src/main/java/com/gaotao/modules/po/entity/PoReceiptDetail.java

@ -0,0 +1,268 @@
package com.gaotao.modules.po.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 采购接收单明细表 (po_receipt_detail)
*/
@Data
@TableName("po_receipt_detail")
public class PoReceiptDetail implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 工厂编码
*/
private String site;
/**
* 接收单号
*/
private String receiptNo;
/**
* 明细行号
*/
private Double itemNo;
/**
* 物料编码
*/
private String partNo;
/**
* 到货数量
*/
private BigDecimal arriveQty;
/**
* 新检验数量
*/
private BigDecimal qtyInspectedNew;
/**
* 单位ID
*/
private String poumId;
/**
* 转换因子
*/
private Integer convertFactor;
/**
* 状态
*/
private String status;
/**
* 是否需要检验 (Y/N)
*/
private String needInspectFlag;
/**
* 检验代码
*/
private String inspectCode;
/**
* 抽样数量
*/
private BigDecimal qtySample;
/**
* 抽样百分比
*/
private BigDecimal percentSample;
/**
* 待检数量
*/
private BigDecimal qtyToInspect;
/**
* 已检数量
*/
private BigDecimal qtyInspected;
/**
* 合格数量
*/
private BigDecimal qtyApproved;
/**
* 退货数量
*/
private BigDecimal qtyReturned;
/**
* 替换数量
*/
private BigDecimal qtyReplace;
/**
* 报废数量
*/
private BigDecimal qtyScrapt;
/**
* 待接收数量
*/
private BigDecimal qtyToReceived;
/**
* 已接收数量
*/
private BigDecimal qtyReceived;
/**
* 发票数量
*/
private BigDecimal invoiceQty;
/**
* 发票价格
*/
private BigDecimal invoicePrice;
/**
* 发票号
*/
private String invoiceNo;
/**
* 库位ID
*/
private String locationId;
/**
* 订单号
*/
private String orderNo;
/**
* 订单行号
*/
private Double orderItemNo;
/**
* 取消原因备注
*/
private String canceIremark;
/**
* 批次号
*/
private String batchNo;
/**
* 生产日期
*/
private Date manuFactureDate;
/**
* 失效日期
*/
private Date expiredDate;
/**
* 抽样检验方法ID
*/
private String sampleInspectionMethodId;
/**
* 抽样检验水平号
*/
private String sampleInspectionLevelNo;
/**
* 备注
*/
private String remark;
/**
* 待通知开票数量
*/
private BigDecimal toInvNofityQty;
/**
* 已通知开票数量
*/
private BigDecimal invNotifyQty;
/**
* 检验类型DB
*/
private String inspectTypeDb;
/**
* 检验类型
*/
private String inspectType;
/**
* 是否需要接收 (Y/N)
*/
private String needReceiveFlag;
/**
* 待开票数量
*/
private BigDecimal toInvoiceQty;
/**
* RBJS数量
*/
private BigDecimal qtyRbjs;
/**
* 自定义字段1
*/
private String orderfef1;
/**
* 自定义字段2
*/
private String orderfef2;
/**
* 自定义字段类型
*/
private String orderfefType;
/**
* 不含税价格
*/
private BigDecimal priceNoTax;
/**
* 状态2
*/
private String status2;
/**
* 检验人
*/
private String checkBy;
/**
* 备注2
*/
private String remark2;
/**
* 检验员
*/
private String inspector;
/**
* 检验时间
*/
private Date inspectionTime;
}

11
src/main/java/com/gaotao/modules/po/service/PoReceiptDetailService.java

@ -0,0 +1,11 @@
package com.gaotao.modules.po.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gaotao.modules.po.entity.PoReceiptDetail;
/**
* 采购接收单明细Service接口
*/
public interface PoReceiptDetailService extends IService<PoReceiptDetail> {
}

11
src/main/java/com/gaotao/modules/po/service/PoReceiptService.java

@ -0,0 +1,11 @@
package com.gaotao.modules.po.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gaotao.modules.po.entity.PoReceipt;
/**
* 采购接收单Service接口
*/
public interface PoReceiptService extends IService<PoReceipt> {
}

15
src/main/java/com/gaotao/modules/po/service/impl/PoReceiptDetailServiceImpl.java

@ -0,0 +1,15 @@
package com.gaotao.modules.po.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gaotao.modules.po.dao.PoReceiptDetailMapper;
import com.gaotao.modules.po.entity.PoReceiptDetail;
import com.gaotao.modules.po.service.PoReceiptDetailService;
import org.springframework.stereotype.Service;
/**
* 采购接收单明细Service实现类
*/
@Service
public class PoReceiptDetailServiceImpl extends ServiceImpl<PoReceiptDetailMapper, PoReceiptDetail> implements PoReceiptDetailService {
}

15
src/main/java/com/gaotao/modules/po/service/impl/PoReceiptServiceImpl.java

@ -0,0 +1,15 @@
package com.gaotao.modules.po.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gaotao.modules.po.dao.PoReceiptMapper;
import com.gaotao.modules.po.entity.PoReceipt;
import com.gaotao.modules.po.service.PoReceiptService;
import org.springframework.stereotype.Service;
/**
* 采购接收单Service实现类
*/
@Service
public class PoReceiptServiceImpl extends ServiceImpl<PoReceiptMapper, PoReceipt> implements PoReceiptService {
}

208
src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

@ -16,8 +16,12 @@ import com.gaotao.modules.handlingunit.entity.HandlingUnitDetail;
import com.gaotao.modules.handlingunit.service.HandlingUnitDetailService;
import com.gaotao.modules.handlingunit.service.HandlingUnitService;
import com.gaotao.modules.po.dao.PoMapper;
import com.gaotao.modules.po.entity.PoReceipt;
import com.gaotao.modules.po.entity.PoReceiptDetail;
import com.gaotao.modules.po.entity.PurchaseOrder;
import com.gaotao.modules.po.entity.PurchaseOrderDto;
import com.gaotao.modules.po.service.PoReceiptDetailService;
import com.gaotao.modules.po.service.PoReceiptService;
import com.gaotao.modules.po.service.PoService;
import com.gaotao.modules.sys.entity.SysUserEntity;
import com.gaotao.modules.trans.entity.*;
@ -56,6 +60,10 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
@Autowired
private HandlingUnitDetailService handlingUnitDetailService;
@Autowired
private PoReceiptService poReceiptService;
@Autowired
private PoReceiptDetailService poReceiptDetailService;
@Autowired
private AgvClientUtil agvClientUtil;
@Autowired
private AccessSiteMapper accessSiteMapper;
@ -70,77 +78,39 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
@Value("${custom.wcs-url}")
private String wcsUrl;
@Override
public List<Map<String, Object>> getPoList(PurchaseOrderDto purchaseOrder) {
try {
// 注意:这里应该根据实际的IFS接口调用方式进行调整
// 如果需要获取多行数据,可能需要先获取PO头,再获取行数据
Map<String, Object> params = Map.of("ifsDBName", ifsDBName, "domainUserID", domainUserID,
"ifsSiteID", purchaseOrder.getSite(),
"ifsPurchaseOrderNo", purchaseOrder.getPoNumber()
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(params);
//String ifsResponse = HttpUtils.doGetWithBody(ifsUrl+"PurchaseOrderLine",jsonBody,null);
String poResponse = HttpUtils.doGetWithBody(ifsUrl+"PurchaseOrder",jsonBody,null);
String poLineResponse = HttpUtils.doGetWithBody(ifsUrl+"PurchaseOrderLine",jsonBody,null);
ObjectMapper mapper = new ObjectMapper();
/*Map<String, Object> params2 = Map.of(
"ifsDBName", ifsDBName,
"domainUserID", domainUserID,
"ifsSiteID", "55",
"partNo", "80900095-1DF",
"qtyToIssue", 10,
"locationNo", "DF1FT0101",
"destLocationNo", "DF1RS0202",
"lotBatchNo", "2883779-*-*-1"
);
String jsonBody2 = objectMapper.writeValueAsString(params2);
String ifsResponse2 = HttpUtils.doPost("https://cclifswebservice.ccldesign.com/api/v1/MoveInventoryPart",jsonBody2,null);*/
String json = """
[
{
"convFactor":1,
"description":"micro R6p 4up P19.05 S42.5 Dry 22x7.5",
"inventoryQty":537000,
"inventoryuoM":"pcs",
"invotyToReceive":530000,
"lineNo":"1",
"orderNo":"1321807",
"partNo":"70004171",
"plannedDeliveryDate":"2025-05-21T00:00:00",
"purchaseQty":537000,
"purchaseUOM":"pcs",
"qtyToReceive":530000,
"receivecase":"Receive into Arrival",
"releaseNo":"1",
"site":"55",
"status":"Arrived"
},
{
"convFactor":1,
"description":"micro R6p 4up P19.05 S42.5 Dry 22x7.5",
"inventoryQty":537000,
"inventoryuoM":"pcs",
"invotyToReceive":530000,
"lineNo":"1",
"orderNo":"1321807",
"partNo":"70004171",
"plannedDeliveryDate":"2025-05-21T00:00:00",
"purchaseQty":537000,
"purchaseUOM":"pcs",
"qtyToReceive":530000,
"receivecase":"Receive into Arrival",
"releaseNo":"1",
"site":"55",
"status":"Arrived"
}
]
""";
List<Map<String, Object>> ifsData = mapper.readValue(json, new TypeReference<>() {});
return ifsData;
List<Map<String, Object>> poData = mapper.readValue(poResponse, new TypeReference<>() {});
List<Map<String, Object>> poLineData = mapper.readValue(poLineResponse, new TypeReference<>() {});
if (poData.isEmpty()) {
throw new XJException("未找到对应的采购订单");
}
if (poLineData.isEmpty()) {
throw new XJException("未找到对应的采购订单行");
}
// 将Po状态放到每个行数据中
String poStatus = poData.getFirst().get("status") != null ? poData.getFirst().get("status").toString() : "";
for (Map<String, Object> line : poLineData) {
line.put("poStatus", poStatus);
// 根据poLine的receiveCase判断是否需要检验
String receiveCase = line.get("receiveCase") != null ? line.get("receiveCase").toString() : "";
if ("Receive into Inventory".equals(receiveCase)) {
line.put("needCheck", "N");
} else {
line.put("needCheck", "Y");
}
}
return poLineData;
} catch (Exception e) {
log.error("获取PO列表异常: {}", e.getMessage());
throw new XJException("获取PO列表失败: " + e.getMessage());
@ -154,6 +124,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
TransHeader transHeader = headerService.genTrans(inData, "CRT");
inData.setTransNo(transHeader.getTransNo());
inData.setDirection("+");
detailService.save(inData);
if ("Y".equals(inData.getNeedHandlingUnit())) {
// 创建Handling Unit相关数据
@ -167,8 +138,8 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
transDetailSub.setItemNo((double) i);
String subType = "HU";
// 获取流水号
TransNoControl subNo = transNoService.getTransNo(inData.getSite(), subType, 8);
transDetailSub.setSubNo(subNo.getNewTransNo());
TransNoControl huTrans = transNoService.getTransNo(inData.getSite(), subType, 10);
transDetailSub.setHandlingUnitId(huTrans.getNewTransNo());
transDetailSub.setSeqNo(inData.getItemNo());
transDetailSub.setSubQty(huInfo.getPerQty());
transDetailSub.setOrderRef1(inData.getPoNo());
@ -178,7 +149,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
HandlingUnit handlingUnit = new HandlingUnit();
// 生成处理单元ID
TransNoControl huTrans = transNoService.getTransNo(inData.getSite(), "HU", 10);
String unitId = huTrans.getNewTransNo();
handlingUnit.setUnitId(unitId);
handlingUnit.setSite(inData.getSite());
@ -259,6 +230,10 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
//subService.updateById(transDetailSub);
}
}
// 创建采购接收记录 - 在库存更新之前创建
createPoReceiptRecords(inData, transHeader);
// 免检更新库存 待检验的出入库记录状态为待检验
if ("N".equals(inData.getNeedCheck())) {
genInventoryStock(inData, transHeader);
@ -281,6 +256,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
handlePalletAndAGVDispatch(inData, transHeader);
}
} catch (Exception e) {
log.error("采购入库失败,PO号: {}, 错误: {}", inData.getPoNo(), e.getMessage());
throw new XJException("采购入库失败: " + e.getMessage());
}
}
@ -545,4 +521,108 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
}
}
/**
* 创建采购接收记录
*/
private void createPoReceiptRecords(TransDetailDto inData, TransHeader transHeader) {
try {
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
// 生成接收单号
TransNoControl receiptNoControl = transNoService.getTransNo(inData.getSite(), "PR", 10);
String receiptNo = receiptNoControl.getNewTransNo();
// 创建采购接收单主记录
PoReceipt poReceipt = new PoReceipt();
poReceipt.setSite(inData.getSite());
poReceipt.setReceiptNo(receiptNo);
poReceipt.setReceiveDate(new Date());
poReceipt.setEnterDate(new Date());
// 从PO或其他地方获取供应商信息,这里先设为空
poReceipt.setSupplierId("");
poReceipt.setReceiver(currentUser.getUserDisplay());
poReceipt.setUsername(currentUser.getUserDisplay());
poReceipt.setDeliveryNoteNo(inData.getPoNo()); // 使用PO号作为送货单号
poReceipt.setPrinted("N");
poReceipt.setRemark("PO接收自动创建 - " + inData.getRemark());
poReceipt.setWarehouseId(transHeader.getWarehouseId());
poReceipt.setOutWorkOrderFlag("N");
poReceipt.setEmailCanSendFlag("N");
poReceipt.setOrderref1(inData.getPoNo());
// 保存采购接收单主记录
poReceiptService.save(poReceipt);
// 创建采购接收单明细记录
PoReceiptDetail poReceiptDetail = new PoReceiptDetail();
poReceiptDetail.setSite(inData.getSite());
poReceiptDetail.setReceiptNo(receiptNo);
poReceiptDetail.setItemNo(inData.getItemNo());
poReceiptDetail.setPartNo(inData.getPartNo());
poReceiptDetail.setArriveQty(inData.getTransQty());
poReceiptDetail.setQtyInspectedNew(BigDecimal.valueOf(0.0));
poReceiptDetail.setPoumId(""); // TODO: 需要从其他地方获取单位信息
poReceiptDetail.setConvertFactor((int) 1.0);
poReceiptDetail.setStatus("Y".equals(inData.getNeedCheck())?"ARRIVED":"RECEIVED");
// 设置检验相关字段
poReceiptDetail.setNeedInspectFlag(inData.getNeedCheck());
if ("Y".equals(inData.getNeedCheck())) {
poReceiptDetail.setQtyToInspect(inData.getTransQty());
poReceiptDetail.setQtyInspected(BigDecimal.valueOf(0.0));
poReceiptDetail.setQtyApproved(BigDecimal.valueOf(0.0));
} else {
poReceiptDetail.setQtyToInspect(BigDecimal.valueOf(0.0));
poReceiptDetail.setQtyInspected(inData.getTransQty());
poReceiptDetail.setQtyApproved(inData.getTransQty());
}
poReceiptDetail.setQtyReturned(BigDecimal.valueOf(0.0));
poReceiptDetail.setQtyReplace(BigDecimal.valueOf(0.0));
poReceiptDetail.setQtyScrapt(BigDecimal.valueOf(0.0));
poReceiptDetail.setQtyToReceived(inData.getTransQty());
poReceiptDetail.setQtyReceived(inData.getTransQty());
poReceiptDetail.setInvoiceQty(BigDecimal.valueOf(0.0));
poReceiptDetail.setInvoicePrice(BigDecimal.valueOf(0.0));
poReceiptDetail.setLocationId(inData.getLocationNo());
// PO相关信息
poReceiptDetail.setOrderNo(inData.getOrderNo());
poReceiptDetail.setOrderItemNo(Double.valueOf(inData.getLineNo() != null ? inData.getLineNo() : "0"));
poReceiptDetail.setBatchNo(inData.getBatchNo());
// 日期信息
if (inData.getManufactureDate() != null) {
poReceiptDetail.setManuFactureDate(inData.getManufactureDate());
// 计算失效日期
Date expiredDate = calculateExpiredDate(inData.getManufactureDate(), inData.getPartNo());
if (expiredDate != null) {
poReceiptDetail.setExpiredDate(expiredDate);
}
}
poReceiptDetail.setRemark("PO接收自动创建 - " + inData.getRemark());
poReceiptDetail.setNeedReceiveFlag("Y");
poReceiptDetail.setToInvoiceQty(inData.getTransQty());
poReceiptDetail.setQtyRbjs(BigDecimal.valueOf(0.0));
poReceiptDetail.setInspectType("ARRIVAL");
poReceiptDetail.setInspectTypeDb("A");
// 保存采购接收单明细记录
poReceiptDetailService.save(poReceiptDetail);
// 如果是免检,创建检验记录
if ("N".equals(inData.getNeedCheck())) {
//createInspectionRecord(inData, transHeader, receiptNo);
}
log.info("采购接收记录创建成功,接收单号: {}, PO号: {}, 物料: {}, 数量: {}",
receiptNo, inData.getPoNo(), inData.getPartNo(), inData.getTransQty());
} catch (Exception e) {
log.error("创建采购接收记录失败,PO号: {}, 错误: {}", inData.getPoNo(), e.getMessage());
throw new XJException("创建采购接收记录失败: " + e.getMessage());
}
}
}
Loading…
Cancel
Save