Browse Source

包不包装都需要创建HU

master
han\hanst 4 months ago
parent
commit
78b068fc43
  1. 31
      src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java
  2. 6
      src/main/java/com/gaotao/modules/handlingunit/entity/HandlingUnit.java
  3. 21
      src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java
  4. 208
      src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

31
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<ReportLabelListMappe
@Lazy
private LabelDataProcessorService labelDataProcessorService;
@Autowired
private HandlingUnitService handlingUnitService;
@Override
@Transactional
public void saveZplElements(ZplDataDto zplDataDto) {
@ -311,7 +313,7 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
log.info("开始保存WMS标签记录,标签索引: {}", labelIndex);
// 1. 获取流水号 - 从数据库中查询已保存的流水号
String serialNo = getSerialNumberFromDatabase(labelNo, labelIndex);
/*String serialNo = getSerialNumberFromDatabase(labelNo, labelIndex);
// 2. 从查询参数中获取其他信息
WmsLabel wmsLabel = new WmsLabel();
@ -336,10 +338,21 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
}
// 5. 保存到数据库
baseService.saveWmsLabel(wmsLabel);
log.info("WMS标签记录保存成功: {}", wmsLabel);
// 6. 更新TransDetailSub的subNo
baseService.saveWmsLabel(wmsLabel);*/
// 根据site+unitId获取HU更新HU的tid和epc
HandlingUnit hUnit = handlingUnitService.lambdaQuery()
.eq(HandlingUnit::getSite, printRequest.getSite())
.eq(HandlingUnit::getUnitId, getStringValue(labelData, "unit_id", null))
.one();
hUnit.setTid(printResult.getTid());
hUnit.setEpc(printResult.getEpcData());
handlingUnitService.lambdaUpdate()
.set(HandlingUnit::getTid, printResult.getTid())
.set(HandlingUnit::getEpc, printResult.getEpcData())
.eq(HandlingUnit::getSite, printRequest.getSite())
.eq(HandlingUnit::getUnitId, getStringValue(labelData, "unit_id", null))
.update();
log.info("WMS标签记录保存成功: {}", hUnit);
} catch (Exception e) {
log.error("保存WMS标签记录失败: {}", e.getMessage(), e);
// 不抛出异常避免影响打印流程

6
src/main/java/com/gaotao/modules/handlingunit/entity/HandlingUnit.java

@ -54,7 +54,11 @@ public class HandlingUnit {
private String printerName;
private Date lastPrintDate;
private Integer printCount;
private String handlingUnitQty; //出库数量不能大于库存数量 - Handling Unit上的数量
//private String handlingUnitQty; //出库数量不能大于库存数量 - Handling Unit上的数量
private BigDecimal originalQty; // 原始数量
private Date receiveDate; // 收货日期
private String tid;
private String epc;
// RFID识别需要的关键字段
@TableField(exist = false)

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

@ -9,11 +9,9 @@ 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.entity.*;
import com.gaotao.modules.trans.service.TransDetailService;
import com.gaotao.modules.trans.service.TransDetailSubService;
import com.gaotao.modules.trans.service.TransHeaderService;
import com.gaotao.modules.trans.service.TransNoControlService;
import com.gaotao.modules.warehouse.entity.InventoryStock;
@ -48,6 +46,8 @@ public class InspectionInboundServiceImpl implements InspectionInboundService {
@Autowired
private TransNoControlService transNoControlService;
@Autowired
private TransDetailSubService subService;
@Override
public List<QualifiedInspectionDto> 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") // 检验合格

208
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<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());
}
}
/**
* 创建采购接收记录
*/

Loading…
Cancel
Save