diff --git a/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java b/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java index 3b6791a1..32e71080 100644 --- a/src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java +++ b/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 getQualifiedInspectionList(QualifiedInspectionDto qualifiedInspectionDto) { - // 查询状态为检验合格(A)但未入库的交易记录 - QueryWrapper headerWrapper = new QueryWrapper<>(); - headerWrapper.eq("status", "C"); // 检验合格状态 - headerWrapper.eq("trans_type_db", "CRT"); // 采购入库类型 - //headerWrapper.eq("inbound_flag", "N"); // 未入库标识 + // 直接查询po_receipt_detail表中状态为ARRIVED的记录 + QueryWrapper 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 headers = transHeaderService.list(headerWrapper); - List result = new ArrayList<>(); + detailWrapper.orderByDesc("receipt_no"); - for (TransHeader header : headers) { - // 查询对应的明细 - QueryWrapper detailWrapper = new QueryWrapper<>(); - detailWrapper.eq("site", header.getSite()); - detailWrapper.eq("trans_no", header.getTransNo()); + List details = poReceiptDetailService.list(detailWrapper); + List result = new ArrayList<>(); - List details = transDetailService.list(detailWrapper); + for (PoReceiptDetail detail : details) { + // 获取对应的接收单主记录 + QueryWrapper 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); } } diff --git a/src/main/java/com/gaotao/modules/po/dao/PoReceiptDetailMapper.java b/src/main/java/com/gaotao/modules/po/dao/PoReceiptDetailMapper.java new file mode 100644 index 00000000..96223872 --- /dev/null +++ b/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 { + +} diff --git a/src/main/java/com/gaotao/modules/po/dao/PoReceiptMapper.java b/src/main/java/com/gaotao/modules/po/dao/PoReceiptMapper.java new file mode 100644 index 00000000..f43c6c7d --- /dev/null +++ b/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 { + +} diff --git a/src/main/java/com/gaotao/modules/po/entity/PoReceipt.java b/src/main/java/com/gaotao/modules/po/entity/PoReceipt.java new file mode 100644 index 00000000..87a3a347 --- /dev/null +++ b/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; + +} + diff --git a/src/main/java/com/gaotao/modules/po/entity/PoReceiptDetail.java b/src/main/java/com/gaotao/modules/po/entity/PoReceiptDetail.java new file mode 100644 index 00000000..019bd4f9 --- /dev/null +++ b/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; +} + diff --git a/src/main/java/com/gaotao/modules/po/service/PoReceiptDetailService.java b/src/main/java/com/gaotao/modules/po/service/PoReceiptDetailService.java new file mode 100644 index 00000000..04557a03 --- /dev/null +++ b/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 { + +} diff --git a/src/main/java/com/gaotao/modules/po/service/PoReceiptService.java b/src/main/java/com/gaotao/modules/po/service/PoReceiptService.java new file mode 100644 index 00000000..bdbea2ea --- /dev/null +++ b/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 { + +} diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoReceiptDetailServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoReceiptDetailServiceImpl.java new file mode 100644 index 00000000..935e597d --- /dev/null +++ b/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 implements PoReceiptDetailService { + +} diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoReceiptServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoReceiptServiceImpl.java new file mode 100644 index 00000000..d0a7339d --- /dev/null +++ b/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 implements PoReceiptService { + +} diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java index 45c6d9c4..599151dc 100644 --- a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java +++ b/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 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 implemen @Value("${custom.wcs-url}") private String wcsUrl; - @Override public List> getPoList(PurchaseOrderDto purchaseOrder) { try { - // 注意:这里应该根据实际的IFS接口调用方式进行调整 - // 如果需要获取多行数据,可能需要先获取PO头,再获取行数据 Map 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 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> ifsData = mapper.readValue(json, new TypeReference<>() {}); - - return ifsData; + List> poData = mapper.readValue(poResponse, new TypeReference<>() {}); + List> 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 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 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 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 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 implemen //subService.updateById(transDetailSub); } } + + // 创建采购接收记录 - 在库存更新之前创建 + createPoReceiptRecords(inData, transHeader); + // 免检更新库存 待检验的出入库记录状态为待检验 if ("N".equals(inData.getNeedCheck())) { genInventoryStock(inData, transHeader); @@ -281,6 +256,7 @@ public class PoServiceImpl extends ServiceImpl 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 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()); + } + } + }