|
|
|
@ -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<PoMapper, PurchaseOrder> 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<Map<String, Object>> poData = mapper.readValue(poResponse, new TypeReference<>() {}); |
|
|
|
List<Map<String, Object>> 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<PoMapper, PurchaseOrder> 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<String, Object> 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<PoMapper, PurchaseOrder> 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<PoMapper, PurchaseOrder> 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<PoMapper, PurchaseOrder> 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<PoMapper, PurchaseOrder> 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<PoMapper, PurchaseOrder> implemen |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
private Map<String, Object> isWeiwai(TransDetailDto inData) { |
|
|
|
try { |
|
|
|
Map<String, Object> 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<Map<String, Object>> poLineData = objectMapper.readValue(pmResponse, new TypeReference<>() {}); |
|
|
|
if (poLineData.isEmpty()) { |
|
|
|
return null; |
|
|
|
} else { |
|
|
|
// 获取对应行号和releaseNo的数据 |
|
|
|
for (Map<String, Object> 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<PoMapper, PurchaseOrder> implemen |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 委外 |
|
|
|
* @param inData |
|
|
|
*/ |
|
|
|
private void syncToIFSOfWeiWai(TransDetailDto inData, Map<String, Object> weiwaiMap) { |
|
|
|
try { |
|
|
|
Map<String, Object> 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<String, Object> 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()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 创建采购接收记录 |
|
|
|
*/ |
|
|
|
|