Browse Source

fix(production): 修复临期品类型判断逻辑并优化分组处理

- 修正SQL映射中的类型判断条件,将'过期品'改为'临期品'
- 在分组处理逻辑中优先处理临期品,避免同一物料重复生成检验任务
- 添加日志记录以跟踪类型提取和数据插入过程
- 移除过期的注释文档
- 优化物料分组算法,确保临期品优先处理,呆滞品不重复处理
master
qiankanghui 1 week ago
parent
commit
4f4506e7d2
  1. 26
      src/main/java/com/heai/modules/production/service/impl/StagnationInspectionServiceImpl.java
  2. 4
      src/main/resources/mapper/production/StagnationDetailMapper.xml

26
src/main/java/com/heai/modules/production/service/impl/StagnationInspectionServiceImpl.java

@ -67,6 +67,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
try { try {
// 4.1 从key中提取类型 // 4.1 从key中提取类型
String type = extractTypeFromKey(key); String type = extractTypeFromKey(key);
log.info("🔑 从分组 key [{}] 提取类型: {}", key, type);
// 4.2 先生成SQC检验任务获取检验单信息 // 4.2 先生成SQC检验任务获取检验单信息
InspectionInfo inspectionInfo = generateSqcInspectionTask(labels, type); InspectionInfo inspectionInfo = generateSqcInspectionTask(labels, type);
@ -99,11 +100,6 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
} }
} }
/**
* site + part_no + type 分组不包含 batch_no
* <p>
* 注意呆滞品和临期品分开处理不混合在同一组
*/
private Map<String, List<PrintLabelRecord>> groupLabelsBySitePartBatch( private Map<String, List<PrintLabelRecord>> groupLabelsBySitePartBatch(
List<PrintLabelRecord> stagnationLabels, List<PrintLabelRecord> stagnationLabels,
List<PrintLabelRecord> expiredLabels) { List<PrintLabelRecord> expiredLabels) {
@ -111,16 +107,31 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
Map<String, List<PrintLabelRecord>> groupedMap = new HashMap<>(); Map<String, List<PrintLabelRecord>> groupedMap = new HashMap<>();
Set<Long> processedIds = new HashSet<>(); Set<Long> processedIds = new HashSet<>();
// 处理呆滞品标记为呆滞品类型
// 1. 先找出所有临期品的 site+partNo 组合
Set<String> expiredPartKeys = new HashSet<>();
for (PrintLabelRecord label : expiredLabels) {
String key = label.getSite() + "_" + label.getPartNo();
expiredPartKeys.add(key);
}
// 2. 处理呆滞品排除掉同时也是临期品的物料
for (PrintLabelRecord label : stagnationLabels) { for (PrintLabelRecord label : stagnationLabels) {
if (!processedIds.contains(label.getId())) { if (!processedIds.contains(label.getId())) {
String partKey = label.getSite() + "_" + label.getPartNo();
// 如果这个物料也是临期品跳过后面会优先生成临期品任务
if (expiredPartKeys.contains(partKey)) {
log.debug("⚠️ 物料 [{}] 既是呆滞品又是临期品,跳过呆滞品处理,优先生成临期品任务", partKey);
continue;
}
String key = buildGroupKey(label.getSite(), label.getPartNo(), "呆滞品"); String key = buildGroupKey(label.getSite(), label.getPartNo(), "呆滞品");
groupedMap.computeIfAbsent(key, k -> new ArrayList<>()).add(label); groupedMap.computeIfAbsent(key, k -> new ArrayList<>()).add(label);
processedIds.add(label.getId()); processedIds.add(label.getId());
} }
} }
// 处理临期品标记为过期类型即使同一批号也单独分组
// 3. 处理临期品优先处理包括那些既是呆滞品又是临期品的物料
for (PrintLabelRecord label : expiredLabels) { for (PrintLabelRecord label : expiredLabels) {
if (!processedIds.contains(label.getId())) { if (!processedIds.contains(label.getId())) {
String key = buildGroupKey(label.getSite(), label.getPartNo(), "临期品"); String key = buildGroupKey(label.getSite(), label.getPartNo(), "临期品");
@ -372,6 +383,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
String partNo, String batchNo, BigDecimal totalQty, String type) { String partNo, String batchNo, BigDecimal totalQty, String type) {
try { try {
// 插入单据头 // 插入单据头
log.info("🔍 准备插入 SOOpsTransferHeader - transNo: {}, type: {}", transNo, type);
stagnationDetailMapper.insertSOOpsTransferHeader(transNo, site, "SYSTEM", batchNo, type); stagnationDetailMapper.insertSOOpsTransferHeader(transNo, site, "SYSTEM", batchNo, type);
log.debug("插入 SOOpsTransferHeader 成功: {}, type: {}", transNo, type); log.debug("插入 SOOpsTransferHeader 成功: {}, type: {}", transNo, type);

4
src/main/resources/mapper/production/StagnationDetailMapper.xml

@ -100,8 +100,8 @@
#{userId}, GETDATE(), GETDATE(), '', #{userId}, #{userId}, GETDATE(), GETDATE(), '', #{userId},
'', '', 'N', 'N', '', '0', '', '', 'N', 'N', '', '0',
'已入库', '已入库',
CASE WHEN #{type} = '期品' THEN 'G' ELSE 'D' END,
CASE WHEN #{type} = '过期品' THEN N'过期品送检' ELSE N'呆滞品送检' END,
CASE WHEN #{type} = '期品' THEN 'G' ELSE 'D' END,
CASE WHEN #{type} = '临期品' THEN N'临期品送检' ELSE N'呆滞品送检' END,
'', 'Y', 'N', #{batchNo} '', 'Y', 'N', #{batchNo}
) )
</insert> </insert>

Loading…
Cancel
Save