From b29d86d9ed34fd890eb14cb7a75f6ae4f7148865 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 01 九月 2026 13:58:03 +0800
Subject: [PATCH] feat(mes): 新增防伪防窜货功能模块
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java | 79 +++++++++++++++++++++++++++++++++++++--
1 files changed, 75 insertions(+), 4 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
index de727f9..0fe4f45 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
@@ -19,6 +20,7 @@
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.pro.line.MesProLineService;
+import cn.iocoder.yudao.module.mes.service.trace.integrity.MesTraceIntegrityService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -26,6 +28,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -63,6 +66,8 @@
private MesMdmItemService mdmItemService;
@Resource
private MesProLineService lineService;
+ @Resource
+ private MesTraceIntegrityService integrityService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -87,7 +92,60 @@
// 4. 鎻掑叆鐢熶骇浜哄憳閰嶇疆
insertBatchWorkers(batch.getId(), createReqVO.getWorkers());
+ // 5. 鐢熸垚鎵规瀹屾暣鎬ф憳瑕�
+ integrityService.recordBatchIntegrity(batch.getId());
return batch.getId();
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public List<MesProBatchDO> preGenerateBatch(MesProBatchPreGenerateReqVO reqVO) {
+ // 1. 鐢熸垚涓存椂鎵规鐮侊紙鍏ㄥ眬 8 浣嶅簭鍙凤紝鏍煎紡 PB-00000001锛�
+ int startSeq = batchMapper.selectMaxTempCodeSeq() + 1;
+ List<MesProBatchDO> list = new ArrayList<>(reqVO.getCount());
+ for (int i = 0; i < reqVO.getCount(); i++) {
+ list.add(new MesProBatchDO()
+ .setTempCode("PB-" + StrUtil.padPre(String.valueOf(startSeq + i), 8, '0'))
+ .setBagQuantity(0)
+ .setPalletQuantity(0)
+ .setStatus(MesProBatchStatusEnum.DRAFT.getStatus())
+ .setRemark(reqVO.getRemark()));
+ }
+ // 2. 鎵归噺鎻掑叆锛堣崏绋跨姸鎬侊紝绛夊緟琛ュ綍涓氬姟淇℃伅锛�
+ for (MesProBatchDO batch : list) {
+ batchMapper.insert(batch);
+ }
+ return list;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void fillBatchInfo(MesProBatchSaveReqVO fillReqVO) {
+ // 1. 閿佸畾鎵规锛屼粎鍏佽灏氭湭琛ュ綍姝e紡淇℃伅鐨勪复鏃舵壒娆�
+ MesProBatchDO batch = batchMapper.selectByIdForUpdate(fillReqVO.getId());
+ if (batch == null) {
+ throw exception(PRO_BATCH_NOT_EXISTS);
+ }
+ if (StrUtil.isNotEmpty(batch.getCode())) {
+ throw exception(PRO_BATCH_ALREADY_FILLED);
+ }
+ // 2. 鏍¢獙鍏宠仈鏁版嵁骞剁敓鎴愭寮忔壒娆″彿
+ MesMdmItemDO item = mdmItemService.validateItemExists(fillReqVO.getItemId());
+ MesProLineDO line = lineService.validateLineExistsAndEnable(fillReqVO.getLineId());
+ validateRelations(fillReqVO);
+ String code = generateBatchCode(line.getCode(), item.getCode());
+ // 3. 钀藉簱涓氬姟淇℃伅锛堜繚鐣欎复鏃舵壒娆$爜鐢ㄤ簬鍘嗗彶鎵爜杩芥函锛涗骇绾跨紪鐮�/鍚嶇О鍐椾綑鍥炲~锛�
+ MesProBatchDO updateObj = BeanUtils.toBean(fillReqVO, MesProBatchDO.class)
+ .setCode(code)
+ .setLineCode(line.getCode())
+ .setLineName(line.getName())
+ .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
+ batchMapper.updateById(updateObj);
+ // 4. 閲嶅缓鐢熶骇浜哄憳閰嶇疆
+ batchWorkerMapper.deleteByBatchId(fillReqVO.getId());
+ insertBatchWorkers(fillReqVO.getId(), fillReqVO.getWorkers());
+ // 5. 鐢熸垚鎵规瀹屾暣鎬ф憳瑕侊紙琛ュ綍姝e紡淇℃伅鍚庤鐩栵級
+ integrityService.recordBatchIntegrity(fillReqVO.getId());
}
@Override
@@ -99,15 +157,16 @@
// 2. 鏍¢獙鍏宠仈鏁版嵁锛堢敓浜т汉鍛橈級
validateRelations(updateReqVO);
- // 3. 鍝佺/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+ // 3. 鏈敓鎴愭寮忔壒娆″彿鎴栧搧绉�/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+ boolean codeEmpty = StrUtil.isEmpty(oldBatch.getCode());
boolean itemChanged = !Objects.equals(oldBatch.getItemId(), updateReqVO.getItemId());
boolean lineChanged = !Objects.equals(oldBatch.getLineId(), updateReqVO.getLineId());
String code = oldBatch.getCode();
MesProBatchDO updateObj = BeanUtils.toBean(updateReqVO, MesProBatchDO.class);
- if (itemChanged || lineChanged) {
+ if (codeEmpty || itemChanged || lineChanged) {
MesMdmItemDO item = mdmItemService.validateItemExists(updateReqVO.getItemId());
// 鍙樻洿浜х嚎鏃讹紝鐩爣浜х嚎蹇呴』鍚敤锛涙湭鍙樻洿鍒欎粎鏍¢獙瀛樺湪锛堥伩鍏嶅仠鐢ㄤ骇绾跨殑鍘嗗彶鎵规鏃犳硶缂栬緫鍏朵粬瀛楁锛�
- MesProLineDO line = lineChanged
+ MesProLineDO line = (lineChanged || codeEmpty)
? lineService.validateLineExistsAndEnable(updateReqVO.getLineId())
: lineService.validateLineExists(updateReqVO.getLineId());
code = generateBatchCode(line.getCode(), item.getCode());
@@ -120,6 +179,8 @@
// 5. 閲嶅缓鐢熶骇浜哄憳閰嶇疆
batchWorkerMapper.deleteByBatchId(updateReqVO.getId());
insertBatchWorkers(updateReqVO.getId(), updateReqVO.getWorkers());
+ // 6. 鎽樿瑕嗙洊鑼冨洿鍚搧绉�/浜х嚎/鐢熶骇鏃ユ湡/璁″垝鏁伴噺锛岀紪杈戝悗閲嶆柊鐢熸垚閬垮厤璇姤绡℃敼
+ integrityService.recordBatchIntegrity(updateReqVO.getId());
}
@Override
@@ -158,6 +219,12 @@
if (!valid) {
throw exception(PRO_BATCH_STATUS_INVALID);
}
+ if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)) {
+ // 鏈ˉ褰曚笟鍔′俊鎭殑涓存椂鎵规涓嶅厑璁歌繘鍏ョ敓浜�
+ if (StrUtil.isEmpty(batch.getCode())) {
+ throw exception(PRO_BATCH_NOT_FILLED);
+ }
+ }
// 3. 鏇存柊鐘舵��
batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status));
}
@@ -169,7 +236,11 @@
@Override
public MesProBatchDO getBatchByCode(String code) {
- return batchMapper.selectByCode(code);
+ MesProBatchDO batch = batchMapper.selectByCode(code);
+ if (batch == null) {
+ batch = batchMapper.selectByTempCode(code);
+ }
+ return batch;
}
@Override
--
Gitblit v1.9.3