Browse Source

refactor(check): 优化RFID盘点头表处理逻辑

- 修改labelCount字段注释,明确表示该次盘点的标签数量
- 更新isUsed字段含义,从"是否已使用"改为"是否已处理"
- 调整定时任务查询条件,移除label_count为null的限制
- 将数据源从mes_unit改为handling_unit查询标签详细信息
- 完善业务逻辑描述,添加处理完成后可生成正式盘点单的说明
- 优化代码实现,每次处理完记录后同时更新labelCount和isUsed字段
- 修复快照表更新逻辑,使用LambdaUpdateWrapper处理联合主键场景
master
常熟吴彦祖 2 days ago
parent
commit
9e99bbd124
  1. 13
      src/main/java/com/gaotao/modules/check/entity/RfidCountHeader.java
  2. 7
      src/main/java/com/gaotao/modules/check/service/RfidCountHeaderService.java
  3. 61
      src/main/java/com/gaotao/modules/check/service/impl/RfidCountHeaderServiceImpl.java

13
src/main/java/com/gaotao/modules/check/entity/RfidCountHeader.java

@ -83,18 +83,23 @@ public class RfidCountHeader {
private Date countTime; private Date countTime;
/** /**
* 标签数量定时任务填充后更新
* 标签数量定时任务填充后更新表示该次盘点的标签数量
*/ */
@TableField("label_count") @TableField("label_count")
private Integer labelCount; private Integer labelCount;
/** /**
* 是否已使用是否已生成盘点单
* 是否已使用是否已处理
* <p><b>枚举值说明</b></p> * <p><b>枚举值说明</b></p>
* <ul> * <ul>
* <li>N = 使用可以生成盘点单</li>
* <li>Y = 使用已生成盘点单</li>
* <li>N = 处理定时任务会填充明细和快照表</li>
* <li>Y = 处理定时任务不再处理此记录</li>
* </ul> * </ul>
* <p><b> 重要说明</b></p>
* <pre>
* is_used='Y'表示定时任务已处理完成填充了子表和快照表
* 后续人工可以基于此数据生成正式盘点单count_result
* </pre>
*/ */
@TableField("is_used") @TableField("is_used")
private String isUsed; private String isUsed;

7
src/main/java/com/gaotao/modules/check/service/RfidCountHeaderService.java

@ -25,14 +25,15 @@ public interface RfidCountHeaderService extends IService<RfidCountHeader> {
* *
* <p><b>业务逻辑</b></p> * <p><b>业务逻辑</b></p>
* <pre> * <pre>
* 1. 查询rfid_count_headeris_used='N'且label_count=null的记录
* 1. 查询rfid_count_headeris_used='N'的记录
* 2. 遍历每条记录 * 2. 遍历每条记录
* - 从pallet_detail查询标签列表site+pallet_id * - 从pallet_detail查询标签列表site+pallet_id
* - mes_unit查询标签详细信息
* - handling_unit查询标签详细信息
* - 批量保存到rfid_count_detail * - 批量保存到rfid_count_detail
* - 更新或新增到rfid_count_snapshot * - 更新或新增到rfid_count_snapshot
* - 更新rfid_count_header的label_count
* - 更新rfid_count_headerlabel_count=标签数量is_used='Y'
* 3. 事务处理每条主表记录独立事务 * 3. 事务处理每条主表记录独立事务
* 4. label_count仅记录标签数量is_used='Y'表示已处理
* </pre> * </pre>
* *
* @author rqrq * @author rqrq

61
src/main/java/com/gaotao/modules/check/service/impl/RfidCountHeaderServiceImpl.java

@ -104,13 +104,13 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
* *
* <p><b>业务逻辑</b></p> * <p><b>业务逻辑</b></p>
* <pre> * <pre>
* 1. 查询未填充的主表记录is_used='N' AND label_count IS NULL
* 1. 查询未处理的主表记录is_used='N'
* 2. 遍历每条记录 * 2. 遍历每条记录
* - 从pallet_detail查询标签列表 * - 从pallet_detail查询标签列表
* - 从handling_unit查询标签详细信息 * - 从handling_unit查询标签详细信息
* - 批量保存到rfid_count_detail * - 批量保存到rfid_count_detail
* - 更新或新增到rfid_count_snapshot * - 更新或新增到rfid_count_snapshot
* - 更新rfid_count_header的label_count
* - 更新rfid_count_headerlabel_count=标签数量is_used='Y'
* 3. 每条主表记录独立事务处理 * 3. 每条主表记录独立事务处理
* </pre> * </pre>
* *
@ -122,24 +122,23 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
log.info("开始填充RFID日常入库盘点明细和快照表 - rqrq"); log.info("开始填充RFID日常入库盘点明细和快照表 - rqrq");
try { try {
// 1. 查询未填充的主表记录 - rqrq
List<RfidCountHeader> unfilledHeaders = this.lambdaQuery()
// 1. 查询未处理的主表记录只查is_used='N'- rqrq
List<RfidCountHeader> unprocessedHeaders = this.lambdaQuery()
.eq(RfidCountHeader::getIsUsed, "N") .eq(RfidCountHeader::getIsUsed, "N")
.isNull(RfidCountHeader::getLabelCount)
.list(); .list();
if (unfilledHeaders.isEmpty()) {
log.info("没有待填充的盘点记录 - rqrq");
if (unprocessedHeaders.isEmpty()) {
log.info("没有待处理的盘点记录 - rqrq");
return; return;
} }
log.info("查询到{}条待填充的盘点记录 - rqrq", unfilledHeaders.size());
log.info("查询到{}条待处理的盘点记录 - rqrq", unprocessedHeaders.size());
int successCount = 0; int successCount = 0;
int failCount = 0; int failCount = 0;
// 2. 遍历处理每条记录 - rqrq // 2. 遍历处理每条记录 - rqrq
for (RfidCountHeader header : unfilledHeaders) {
for (RfidCountHeader header : unprocessedHeaders) {
try { try {
processOneHeader(header); processOneHeader(header);
successCount++; successCount++;
@ -152,7 +151,7 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
} }
log.info("填充RFID日常入库盘点明细完成 - rqrq,总数={}, 成功={}, 失败={}", log.info("填充RFID日常入库盘点明细完成 - rqrq,总数={}, 成功={}, 失败={}",
unfilledHeaders.size(), successCount, failCount);
unprocessedHeaders.size(), successCount, failCount);
} catch (Exception e) { } catch (Exception e) {
log.error("填充RFID日常入库盘点明细失败 - rqrq:{}", e.getMessage(), e); log.error("填充RFID日常入库盘点明细失败 - rqrq:{}", e.getMessage(), e);
@ -178,8 +177,9 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
if (palletDetailList == null || palletDetailList.isEmpty()) { if (palletDetailList == null || palletDetailList.isEmpty()) {
log.warn("托盘无标签明细 - rqrq,site={}, palletId={}", log.warn("托盘无标签明细 - rqrq,site={}, palletId={}",
header.getSite(), header.getPalletId()); header.getSite(), header.getPalletId());
// 更新label_count为0 - rqrq
// 更新label_count为0is_used='Y' - rqrq
header.setLabelCount(0); header.setLabelCount(0);
header.setIsUsed("Y");
this.updateById(header); this.updateById(header);
return; return;
} }
@ -245,7 +245,7 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
log.info("保存{}条明细记录 - rqrq,palletId={}", detailList.size(), header.getPalletId()); log.info("保存{}条明细记录 - rqrq,palletId={}", detailList.size(), header.getPalletId());
} }
// 6. 更新或新增快照 - rqrq
// 6. 更新或新增快照联合主键需要用LambdaUpdateWrapper- rqrq
if (!snapshotList.isEmpty()) { if (!snapshotList.isEmpty()) {
for (RfidCountSnapshot snapshot : snapshotList) { for (RfidCountSnapshot snapshot : snapshotList) {
// 查询是否已存在 - rqrq // 查询是否已存在 - rqrq
@ -256,19 +256,25 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
); );
if (existSnapshot != null) { if (existSnapshot != null) {
// 存在则更新 - rqrq
existSnapshot.setPartNo(snapshot.getPartNo());
existSnapshot.setQty(snapshot.getQty());
existSnapshot.setBatchNo(snapshot.getBatchNo());
existSnapshot.setLocationId(snapshot.getLocationId());
existSnapshot.setWarehouseId(snapshot.getWarehouseId());
existSnapshot.setWdr(snapshot.getWdr());
existSnapshot.setLastCountDate(snapshot.getLastCountDate());
existSnapshot.setPalletId(snapshot.getPalletId());
existSnapshot.setCountResult(snapshot.getCountResult());
existSnapshot.setCountTimes(existSnapshot.getCountTimes() + 1); // 累加次数 - rqrq
existSnapshot.setUpdatedDate(new Date());
rfidCountSnapshotMapper.updateById(existSnapshot);
// 存在则更新使用LambdaUpdateWrapper因为是联合主键- rqrq
int countTimes = existSnapshot.getCountTimes() != null ? existSnapshot.getCountTimes() + 1 : 1;
rfidCountSnapshotMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<RfidCountSnapshot>()
.eq(RfidCountSnapshot::getSite, snapshot.getSite())
.eq(RfidCountSnapshot::getUnitId, snapshot.getUnitId())
.set(RfidCountSnapshot::getPartNo, snapshot.getPartNo())
.set(RfidCountSnapshot::getQty, snapshot.getQty())
.set(RfidCountSnapshot::getBatchNo, snapshot.getBatchNo())
.set(RfidCountSnapshot::getLocationId, snapshot.getLocationId())
.set(RfidCountSnapshot::getWarehouseId, snapshot.getWarehouseId())
.set(RfidCountSnapshot::getWdr, snapshot.getWdr())
.set(RfidCountSnapshot::getLastCountDate, snapshot.getLastCountDate())
.set(RfidCountSnapshot::getPalletId, snapshot.getPalletId())
.set(RfidCountSnapshot::getCountResult, snapshot.getCountResult())
.set(RfidCountSnapshot::getCountTimes, countTimes)
.set(RfidCountSnapshot::getUpdatedDate, new Date())
);
} else { } else {
// 不存在则新增 - rqrq // 不存在则新增 - rqrq
snapshot.setCountTimes(1); snapshot.setCountTimes(1);
@ -280,11 +286,12 @@ public class RfidCountHeaderServiceImpl extends ServiceImpl<RfidCountHeaderMappe
log.info("更新{}条快照记录 - rqrq,palletId={}", snapshotList.size(), header.getPalletId()); log.info("更新{}条快照记录 - rqrq,palletId={}", snapshotList.size(), header.getPalletId());
} }
// 7. 更新主表的label_count - rqrq
// 7. 更新主表label_count=标签数量is_used='Y'标记已处理- rqrq
header.setLabelCount(detailList.size()); header.setLabelCount(detailList.size());
header.setIsUsed("Y");
this.updateById(header); this.updateById(header);
log.info("处理盘点记录完成 - rqrq,site={}, palletId={}, labelCount={}",
log.info("处理盘点记录完成 - rqrq,site={}, palletId={}, labelCount={}, is_used=Y",
header.getSite(), header.getPalletId(), detailList.size()); header.getSite(), header.getPalletId(), detailList.size());
} }
} }
Loading…
Cancel
Save