Browse Source

feat(production): 实现过期品标签查询和检验功能

- 更新 PrintLabelRecordMapper.xml 中的 selectExpiredLabels 查询,实现临期品标签查询逻辑
- 修改 StagnationDetailMapper 接口和 XML 映射,添加 type 参数支持过期品和呆滞品区分
- 更新 StagnationInspectionServiceImpl 实现类,激活过期品标签查询功能
- 修改标签分组逻辑,从按 site+part_no+batch_no+type 分组改为按 site+part_no+type 分组
- 移除废弃的 insertStagnationDetails 方法,优化代码结构
- 更新实验室单据插入方法,添加类型参数以区分过期品和呆滞品处理
- 根据检验类型动态设置操作描述,支持过期品自动检验和呆滞品自动检验
master
qiankanghui 1 week ago
parent
commit
32eac270bd
  1. 3
      src/main/java/com/heai/modules/production/dao/StagnationDetailMapper.java
  2. 63
      src/main/java/com/heai/modules/production/service/impl/StagnationInspectionServiceImpl.java
  3. 55
      src/main/resources/mapper/production/PrintLabelRecordMapper.xml
  4. 5
      src/main/resources/mapper/production/StagnationDetailMapper.xml

3
src/main/java/com/heai/modules/production/dao/StagnationDetailMapper.java

@ -51,7 +51,8 @@ public interface StagnationDetailMapper extends BaseMapper<StagnationDetail> {
@Param("transNo") String transNo,
@Param("site") String site,
@Param("userId") String userId,
@Param("batchNo") String batchNo);
@Param("batchNo") String batchNo,
@Param("type") String type);
void insertSOOpsTransferDetail(

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

@ -45,11 +45,9 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
List<PrintLabelRecord> stagnationLabels = printLabelRecordMapper.selectStagnationLabels();
log.info("查询到呆滞品标签数量: {}", stagnationLabels.size());
// TODO: 过期品功能预留后续启用
// 2. 查询过期品标签
// List<PrintLabelRecord> expiredLabels = printLabelRecordMapper.selectExpiredLabels();
// log.info("查询到过期品标签数量: {}", expiredLabels.size());
List<PrintLabelRecord> expiredLabels = new ArrayList<>();
List<PrintLabelRecord> expiredLabels = printLabelRecordMapper.selectExpiredLabels();
log.info("查询到过期品标签数量: {}", expiredLabels.size());
// 3. 合并并按 site + part_no + batch_no + type 分组
Map<String, List<PrintLabelRecord>> groupedLabels = groupLabelsBySitePartBatch(
@ -57,7 +55,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
log.info("分组后共 {} 组需要生成检验任务", groupedLabels.size());
// 4. 为每组生成SQC检验任务事务性全部成功或全部失败
// 4. 为每组生成SQC检验任务
int successCount = 0;
int failCount = 0;
List<String> failedKeys = new ArrayList<>();
@ -102,7 +100,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
}
/**
* site + part_no + batch_no + type 分组
* site + part_no + type 分组不包含 batch_no
* <p>
* 注意呆滞品和过期品分开处理不混合在同一组
*/
@ -116,7 +114,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
// 处理呆滞品标记为呆滞品类型
for (PrintLabelRecord label : stagnationLabels) {
if (!processedIds.contains(label.getId())) {
String key = buildGroupKey(label.getSite(), label.getPartNo(), label.getBatchNo(), "呆滞品");
String key = buildGroupKey(label.getSite(), label.getPartNo(), "呆滞品");
groupedMap.computeIfAbsent(key, k -> new ArrayList<>()).add(label);
processedIds.add(label.getId());
}
@ -125,7 +123,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
// 处理过期品标记为过期类型即使同一批号也单独分组
for (PrintLabelRecord label : expiredLabels) {
if (!processedIds.contains(label.getId())) {
String key = buildGroupKey(label.getSite(), label.getPartNo(), label.getBatchNo(), "过期");
String key = buildGroupKey(label.getSite(), label.getPartNo(), "过期");
groupedMap.computeIfAbsent(key, k -> new ArrayList<>()).add(label);
processedIds.add(label.getId());
}
@ -135,10 +133,10 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
}
/**
* 构建分组key包含类型
* 构建分组key
*/
private String buildGroupKey(String site, String partNo, String batchNo, String type) {
return site + "_" + partNo + "_" + batchNo + "_" + type;
private String buildGroupKey(String site, String partNo, String type) {
return site + "_" + partNo + "_" + type;
}
/**
@ -149,9 +147,9 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
return "呆滞品";
}
// key格式: site_partNo_batchNo_type
// key格式: site_partNo_type
String[] parts = key.split("_");
if (parts.length >= 4) {
if (parts.length >= 3) {
// 最后一个部分是类型
return parts[parts.length - 1];
}
@ -205,29 +203,6 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
}
}
/**
* 插入呆滞明细表
*/
private void insertStagnationDetails(List<PrintLabelRecord> labels, String type) {
List<StagnationDetail> details = new ArrayList<>();
for (PrintLabelRecord label : labels) {
StagnationDetail detail = new StagnationDetail();
detail.setLabelRecordId(label.getId());
detail.setType(type);
detail.setIsInspectionCompleted(0); // 未完成
// sqcInspectionNolaboratoryOrderNolaboratoryItemNo 后续回填
details.add(detail);
}
// 批量插入
if (!details.isEmpty()) {
stagnationDetailMapper.batchInsert(details);
log.debug("批量插入呆滞明细 {} 条", details.size());
}
}
/**
* 生成SQC检验任务返回检验单信息
*/
@ -268,7 +243,7 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
String transNo = generateTransNo(site, partNo, batchNo);
// 2. 插入 SOOpsTransferHeader SOOpsTransferDetail
insertLaboratoryTransferData(transNo, site, partNo, batchNo, totalQty);
insertLaboratoryTransferData(transNo, site, partNo, batchNo, totalQty, type);
// 3. 调用存储过程生成SQC任务(使用 transNo 作为 @order_no)
List<Object> params = buildSqcParams(site, partNo, batchNo, seqNo, transNo, totalQty, type);
@ -356,7 +331,9 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
params.add(""); // @document_type - 单据类型
params.add(""); // @document_no - 单据号
params.add(partNo); // @part_no - 物料编号
params.add("呆滞品自动检验"); // @operation_desc - 操作描述
// 根据类型设置操作描述
String operationDesc = "过期品".equals(type) ? "过期品自动检验" : "呆滞品自动检验";
params.add(operationDesc); // @operation_desc - 操作描述
params.add(""); // @resource_id - 机台编码
return params;
}
@ -381,19 +358,19 @@ public class StagnationInspectionServiceImpl implements StagnationInspectionServ
* 插入实验室单据数据SOOpsTransferHeader SOOpsTransferDetail
*/
private void insertLaboratoryTransferData(String transNo, String site,
String partNo, String batchNo, BigDecimal totalQty) {
String partNo, String batchNo, BigDecimal totalQty, String type) {
try {
// 插入单据头
stagnationDetailMapper.insertSOOpsTransferHeader(transNo, site, "SYSTEM", batchNo);
log.debug("插入 SOOpsTransferHeader 成功: {}", transNo);
stagnationDetailMapper.insertSOOpsTransferHeader(transNo, site, "SYSTEM", batchNo, type);
log.debug("插入 SOOpsTransferHeader 成功: {}, type: {}", transNo, type);
// 插入单据明细
stagnationDetailMapper.insertSOOpsTransferDetail(transNo, site, partNo);
log.debug("插入 SOOpsTransferDetail 成功: {}", transNo);
} catch (Exception e) {
log.error("插入实验室单据失败 - transNo: {}, site: {}, partNo: {}, batchNo: {}",
transNo, site, partNo, batchNo, e);
log.error("插入实验室单据失败 - transNo: {}, site: {}, partNo: {}, batchNo: {}, type: {}",
transNo, site, partNo, batchNo, type, e);
throw new RuntimeException("插入实验室单据失败: " + e.getMessage(), e);
}
}

55
src/main/resources/mapper/production/PrintLabelRecordMapper.xml

@ -268,29 +268,40 @@
)
</select>
<!-- 查询过期品标签 -->
<!-- 查询临期品标签(Part表 ExpireDateControlFlag='Y' and ToExpireDays >= 0) -->
<select id="selectExpiredLabels" resultType="com.heai.modules.production.entity.PrintLabelRecord">
SELECT
id,
site,
part_no,
seq_no,
print_qty,
create_time,
item_no,
batch_no,
warehouse_id,
location_id,
status,
scan_seq_no,
parent_id,
update_time,
weight,
stagnation_refresh_date
FROM print_label_record
WHERE status = '已入库'
AND expiry_date &lt; GETDATE()
AND id NOT IN (
SELECT DISTINCT
plr.id,
plr.site,
plr.part_no,
plr.seq_no,
plr.print_qty,
plr.create_time,
plr.item_no,
plr.batch_no,
plr.warehouse_id,
plr.location_id,
plr.status,
plr.scan_seq_no,
plr.parent_id,
plr.update_time,
plr.weight,
plr.stagnation_refresh_date,
ISNULL(istk.ExpiredDate_new, istk.ExpiredDate) AS expiry_date
FROM print_label_record plr
INNER JOIN InventoryStock istk
ON plr.site = istk.Site
AND plr.part_no = istk.PartNo
AND plr.batch_no = istk.BatchNo
AND plr.warehouse_id = istk.WarehouseID
AND plr.location_id = istk.LocationID
INNER JOIN Part p
ON plr.site = p.Site
AND plr.part_no = p.PartNo
WHERE plr.status = '已入库'
AND p.ExpireDateControlFlag = 'Y'
AND ISNULL(p.ToExpireDays, 0) >= 0
AND plr.id NOT IN (
SELECT label_record_id
FROM stagnation_detail
WHERE is_inspection_completed = 0

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

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

Loading…
Cancel
Save