diff --git a/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java b/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java index aa1da0c..1ba812f 100644 --- a/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java +++ b/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java @@ -11,6 +11,8 @@ import com.gaotao.modules.base.service.BaseService; import com.gaotao.modules.base.service.LabelDataProcessorService; import com.gaotao.modules.base.service.ReportLabelListService; +import com.gaotao.modules.handlingunit.entity.HandlingUnit; +import com.gaotao.modules.handlingunit.service.HandlingUnitService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -19,10 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @Slf4j @@ -42,6 +41,9 @@ public class ReportLabelListServiceImpl extends ServiceImpl getQualifiedInspectionList(QualifiedInspectionDto qualifiedInspectionDto) { @@ -174,7 +174,18 @@ public class InspectionInboundServiceImpl implements InspectionInboundService { inboundDetail.setOrderRef5(""); inboundDetail.setRemark("检验合格入库"); transDetailService.save(inboundDetail); - + TransDetailSub transDetailSub = new TransDetailSub(); + transDetailSub.setSite(inboundConfirm.getSite()); + transDetailSub.setTransNo(inboundTransNo); + transDetailSub.setItemNo((double) 1); + transDetailSub.setHandlingUnitId("*"); + transDetailSub.setSeqNo(poReceiptDetail.getItemNo()); + transDetailSub.setSubQty(inboundConfirm.getInboundQty().doubleValue()); + transDetailSub.setOrderRef1(poReceiptDetail.getOrderNo()); + transDetailSub.setLocationId(poReceiptDetail.getLocationId()); + transDetailSub.setBatchNo(poReceiptDetail.getBatchNo()); + transDetailSub.setPartNo(poReceiptDetail.getPartNo()); + subService.save(transDetailSub); // 6. 更新采购接收单明细的状态 poReceiptDetailService.lambdaUpdate() .set(PoReceiptDetail::getStatus, "RECEIVED") // 检验合格 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 085a625..57be01c 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 @@ -11,7 +11,8 @@ import com.gaotao.modules.factory.entity.Site; import lombok.extern.slf4j.Slf4j; import java.math.RoundingMode; -import java.util.Map; +import java.util.*; + import com.gaotao.modules.handlingunit.entity.HandlingUnit; import com.gaotao.modules.handlingunit.entity.HandlingUnitDetail; import com.gaotao.modules.handlingunit.service.HandlingUnitDetailService; @@ -39,10 +40,6 @@ import org.springframework.data.relational.core.sql.In; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; @Slf4j @Service @@ -137,12 +134,12 @@ public class PoServiceImpl extends ServiceImpl implemen ); ObjectMapper objectMapper = new ObjectMapper(); String jsonBody = objectMapper.writeValueAsString(params); - String poResponse = HttpUtils.doGetWithBody(ifsUrl+"InventoryPart",jsonBody,null); + String partResponse = HttpUtils.doGetWithBody(ifsUrl+"InventoryPart",jsonBody,null); ObjectMapper mapper = new ObjectMapper(); - List> poData = mapper.readValue(poResponse, new TypeReference<>() {}); + List> partData = mapper.readValue(partResponse, new TypeReference<>() {}); Integer shelfLife = null; // 有效期 - if (poData!=null && !poData.isEmpty()) { - shelfLife = poData.getFirst().get("durabilityDays")!=null?(Integer) poData.getFirst().get("durabilityDays"):null; + if (partData!=null && !partData.isEmpty()) { + shelfLife = partData.getFirst().get("durabilityDays")!=null?(Integer) partData.getFirst().get("durabilityDays"):null; } SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); String transType = "CRT"; @@ -164,25 +161,34 @@ public class PoServiceImpl extends ServiceImpl implemen transHeader.setOrderRef2(inData.getOrderRef2()); transHeader.setOrderRef3(inData.getOrderRef3()); transHeader.setEnterDate(new Date()); + headerService.save(transHeader); + inData.setTransNo(transHeader.getTransNo()); + inData.setDirection("+"); + detailService.save(inData); // 创建采购接收记录 - 在库存更新之前创建 String receiptNo = createPoReceiptRecords(inData,shelfLife); inData.setReceiptNo(receiptNo); - if ("Y".equals(inData.getNeedHandlingUnit())) { - // 创建Handling Unit相关数据 - for (int i = 0; i < inData.getHandlingUnitList().size(); i++) { - handlingUnitPart(inData, i, transHeader, currentUser,shelfLife); - } + if (inData.getHandlingUnitList().isEmpty()) { + TransDetailSubDto huInfo = new TransDetailSubDto(); + huInfo.setPerQty(1D); + huInfo.setPackageQty(inData.getTransQty().setScale(2, RoundingMode.HALF_UP).doubleValue()); + inData.setHandlingUnitList(Collections.singletonList(huInfo)); + } + // 创建Handling Unit相关数据 + for (int i = 0; i < inData.getHandlingUnitList().size(); i++) { + handlingUnitPart(inData, i, transHeader, currentUser,shelfLife); } // 免检更新库存 待检验的出入库记录状态为待检验 if ("N".equals(inData.getNeedCheck())) { - headerService.save(transHeader); - inData.setTransNo(transHeader.getTransNo()); - inData.setDirection("+"); - detailService.save(inData); genInventoryStock(inData, transHeader); } - // 同步到IFS 免检和待检验是同一个吗? - syncToIFS(inData); + // 同步到IFS + Map weiwaiMap = isWeiwai(inData); + if (weiwaiMap!=null) { + syncToIFSOfWeiWai(inData,weiwaiMap); + } else { + syncToIFS(inData); + } return receiptNo; } catch (Exception e) { log.error("采购入库失败,PO号: {}, 错误: {}", inData.getPoNo(), e.getMessage()); @@ -198,20 +204,19 @@ public class PoServiceImpl extends ServiceImpl implemen // 获取流水号 TransNoControl huTrans = transNoService.getTransNo(inData.getSite(), subType, 10); // 创建TransDetailSub记录(保持原有逻辑) - if ("N".equals(inData.getNeedCheck())) { - TransDetailSub transDetailSub = new TransDetailSub(); - transDetailSub.setSite(inData.getSite()); - transDetailSub.setTransNo(transHeader.getTransNo()); - transDetailSub.setItemNo((double) j); - transDetailSub.setHandlingUnitId(huTrans.getNewTransNo()); - transDetailSub.setSeqNo(inData.getItemNo()); - transDetailSub.setSubQty(huInfo.getPackageQty()); - transDetailSub.setOrderRef1(inData.getPoNo()); - transDetailSub.setLocationId(inData.getLocationNo()); - transDetailSub.setBatchNo(inData.getBatchNo()); - transDetailSub.setPartNo(inData.getPartNo()); - subService.save(transDetailSub); - } + TransDetailSub transDetailSub = new TransDetailSub(); + transDetailSub.setSite(inData.getSite()); + transDetailSub.setTransNo(transHeader.getTransNo()); + transDetailSub.setItemNo((double) j); + transDetailSub.setSeqNo(inData.getItemNo()); + transDetailSub.setSubQty(huInfo.getPackageQty()); + transDetailSub.setOrderRef1(inData.getPoNo()); + transDetailSub.setOrderRef2(huTrans.getNewTransNo()); + transDetailSub.setLocationId(inData.getLocationNo()); + transDetailSub.setBatchNo(inData.getBatchNo()); + transDetailSub.setPartNo(inData.getPartNo()); + transDetailSub.setSubNo(huTrans.getNewTransNo()); + subService.save(transDetailSub); // 创建HandlingUnit主记录 HandlingUnit handlingUnit = new HandlingUnit(); // 生成处理单元ID @@ -225,8 +230,6 @@ public class PoServiceImpl extends ServiceImpl implemen handlingUnit.setOrderNo(inData.getOrderNo()); handlingUnit.setLineNo(inData.getLineNo()); handlingUnit.setReleaseNo(inData.getReleaseNo()); - //handlingUnit.setReceiptNo(inData.getReceiptNo()); - //handlingUnit.setPartDesc(inData.getPartDesc()); handlingUnit.setQty(BigDecimal.valueOf(huInfo.getPackageQty())); handlingUnit.setBatchNo(inData.getBatchNo()); handlingUnit.setLocationId(inData.getLocationNo()); @@ -256,8 +259,6 @@ public class PoServiceImpl extends ServiceImpl implemen handlingUnit.setOrderRef2(inData.getReceiptNo()); handlingUnit.setOrderRef3(inData.getOrderRef3()); handlingUnit.setSupplierId(inData.getSupplierNo()); - //handlingUnit.setManufactureDate(inData.getManufactureDate()); - //handlingUnit.setExpiredDate(inData.getExpiredDate()); handlingUnit.setCreatedDate(new Date()); handlingUnit.setCreatedBy(currentUser.getUserDisplay()); handlingUnit.setModifiedDate(new Date()); @@ -268,29 +269,10 @@ public class PoServiceImpl extends ServiceImpl implemen // 生成条码和二维码 handlingUnit.setBarCode(unitId); handlingUnit.setQrCode(unitId); + handlingUnit.setOriginalQty(BigDecimal.valueOf(huInfo.getPackageQty())); + handlingUnit.setReceiveDate(inData.getArrivalDate()!=null?inData.getArrivalDate():new Date()); // 保存HandlingUnit主记录 handlingUnitService.save(handlingUnit); - // 创建HandlingUnitDetail明细记录(如果需要) - HandlingUnitDetail handlingUnitDetail = new HandlingUnitDetail(); - handlingUnitDetail.setDetailId(UUID.randomUUID().toString()); - handlingUnitDetail.setSite(inData.getSite()); - handlingUnitDetail.setUnitId(unitId); - handlingUnitDetail.setPartNo(inData.getPartNo()); - //handlingUnitDetail.setPartDesc(inData.getPartDesc()); - handlingUnitDetail.setQty(BigDecimal.valueOf(huInfo.getPackageQty())); - handlingUnitDetail.setBatchNo(inData.getBatchNo()); - //handlingUnitDetail.setSerialNo(huInfo.getSerialNo()); - handlingUnitDetail.setStatus("ACTIVE"); - handlingUnitDetail.setStatusDb("A"); - handlingUnitDetail.setOrderRef1(inData.getPoNo()); - handlingUnitDetail.setCreatedDate(new Date()); - handlingUnitDetail.setCreatedBy(currentUser.getUserDisplay()); - handlingUnitDetail.setModifiedDate(new Date()); - handlingUnitDetail.setModifiedBy(currentUser.getUserDisplay()); - handlingUnitDetail.setRemark("PO接收创建"); - - // 保存HandlingUnitDetail记录 - handlingUnitDetailService.save(handlingUnitDetail); } } @@ -307,6 +289,39 @@ public class PoServiceImpl extends ServiceImpl implemen ); } + private Map isWeiwai(TransDetailDto inData) { + try { + Map POLineSupplierMaterialParams = Map.of("ifsDBName", ifsDBName, "domainUserID", domainUserID, + "ifsSiteID", inData.getSite(), + "ifsPurchaseOrderNo", inData.getOrderNo() + ); + ObjectMapper objectMapper = new ObjectMapper(); + String pmJsonBody = objectMapper.writeValueAsString(POLineSupplierMaterialParams); + String pmResponse = HttpUtils.doGetWithBody(ifsUrl+"POLineSupplierMaterial",pmJsonBody,null); + List> poLineData = objectMapper.readValue(pmResponse, new TypeReference<>() {}); + if (poLineData.isEmpty()) { + return null; + } else { + // 获取对应行号和releaseNo的数据 + for (Map line : poLineData) { + String lineNo = line.get("lineNo") != null ? line.get("lineNo").toString() : ""; + String releaseNo = line.get("releaseNo") != null ? line.get("releaseNo").toString() : ""; + if (inData.getLineNo().equals(lineNo) && (inData.getReleaseNo() != null && inData.getReleaseNo().equals(releaseNo))) { + return line; + } + } + } + return null; + } catch (XJException e) { + // 重新抛出业务异常,确保事务回滚 + throw e; + } catch (Exception e) { + log.error("IFS同步异常,PO号: {}, 错误: {}", inData.getOrderNo(), e.getMessage()); + // 同步异常需要回滚前面所有的数据库操作 + throw new XJException("IFS同步异常: " + e.getMessage()); + } + } + /** * 同步到IFS */ @@ -350,6 +365,81 @@ public class PoServiceImpl extends ServiceImpl implemen } } + /** + * 委外 + * @param inData + */ + private void syncToIFSOfWeiWai(TransDetailDto inData, Map weiwaiMap) { + try { + Map params = Map.ofEntries( + Map.entry("ifsDBName", ifsDBName), + Map.entry("domainUserID", domainUserID), + Map.entry("ifsSiteID", inData.getSite()), + Map.entry("ifsOrderNo", inData.getOrderNo()), + Map.entry("ifsLineNo", inData.getLineNo()), + Map.entry("ifsReleaseNo", inData.getReleaseNo()), + Map.entry("ifsLineItemNo", "1"), + Map.entry("ifsOrderCode", "1"), + Map.entry("ifsPartNo", weiwaiMap.get("componentPartNo")), + Map.entry("ifsLocationNo", inData.getLocationNo()), + Map.entry("ifsLotBatchNo", "2756083-*-*-1"), + Map.entry("ifsSerialNo", "*"), + Map.entry("ifsEngChgLevel", "1"), + Map.entry("ifsWDRNo", "外发东琨"), + Map.entry("ifsActivitySequenceNo", 0), + Map.entry("ifsHandlingUnitID", 0), + Map.entry("ifsReverseQty", "-2") + ); + ObjectMapper objectMapper = new ObjectMapper(); + String jsonBody = objectMapper.writeValueAsString(params); + String PurchaseOrderReserveComponent = HttpUtils.doPost(ifsUrl+"PurchaseOrderReserveComponent",jsonBody,null); + log.info("委外预留结果: {}", PurchaseOrderReserveComponent); + if ("IFSUpdated".equals(PurchaseOrderReserveComponent) || "\"IFSUpdated\"".equals(PurchaseOrderReserveComponent)) { + log.info("委外poIFS同步成功,PO号: {}", inData.getOrderNo()); + } else { + log.error("委外poIFS同步失败,PO号: {}, 响应: {}", inData.getOrderNo(), PurchaseOrderReserveComponent); + // 同步失败需要回滚前面所有的数据库操作 + throw new XJException("IFS同步失败,响应: " + PurchaseOrderReserveComponent); + } + Map params2 = Map.ofEntries( + Map.entry("ifsDBName", ifsDBName), + Map.entry("domainUserID", domainUserID), + Map.entry("ifsSiteID", inData.getSite()), + Map.entry("ifsOrderNo", inData.getOrderNo()), + Map.entry("ifsLineNo", inData.getLineNo()), + Map.entry("ifsReleaseNo", inData.getReleaseNo()), + Map.entry("ifsLineItemNo", "1"), + Map.entry("ifsOrderCode", "1"), + Map.entry("ifsPartNo", weiwaiMap.get("componentPartNo")), + Map.entry("ifsLocationNo", inData.getLocationNo()), + Map.entry("ifsLotBatchNo", "2756083-*-*-1"), + Map.entry("ifsSerialNo", "*"), + Map.entry("ifsEngChgLevel", "1"), + Map.entry("ifsWDRNo", "外发东琨"), + Map.entry("ifsActivitySequenceNo", 0), + Map.entry("ifsHandlingUnitID", 0), + Map.entry("ifsQtyToShip", "2") + ); + String jsonBody2 = objectMapper.writeValueAsString(params2); + String PurchaseOrderIssueComponent = HttpUtils.doPost(ifsUrl+"PurchaseOrderIssueComponent",jsonBody2,null); + log.info("委外,PO号: {}", inData.getOrderNo()); + if ("IFSUpdated".equals(PurchaseOrderIssueComponent) || "\"IFSUpdated\"".equals(PurchaseOrderIssueComponent)) { + log.info("委外poIFS同步成功,PO号: {}", inData.getOrderNo()); + } else { + log.error("委外poIFS同步失败,PO号: {}, 响应: {}", inData.getOrderNo(), PurchaseOrderIssueComponent); + // 同步失败需要回滚前面所有的数据库操作 + throw new XJException("IFS同步失败,响应: " + PurchaseOrderIssueComponent); + } + } catch (XJException e) { + // 重新抛出业务异常,确保事务回滚 + throw e; + } catch (Exception e) { + log.error("委外poIFS同步异常,PO号: {}, 错误: {}", inData.getOrderNo(), e.getMessage()); + // 同步异常需要回滚前面所有的数据库操作 + throw new XJException("IFS同步异常: " + e.getMessage()); + } + } + /** * 创建采购接收记录 */