From 8655501ffb8dbdaf2508e575933063e6731be714 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 28 八月 2026 17:14:40 +0800
Subject: [PATCH] refactor(mes): 重构MES生产批次和袋码管理功能
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java | 91 ++++++++++++++++++++++++++++++---------------
1 files changed, 60 insertions(+), 31 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
index d346513..1611599 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
@@ -4,8 +4,10 @@
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindBatchReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceItemRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeReplaceReqVO;
@@ -62,43 +64,54 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public String generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
- // 1. 鏍¢獙鎵规瀛樺湪涓斿浜庣敓浜т腑鐘舵��
- MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId());
- if (batch == null) {
- throw exception(PRO_BATCH_NOT_EXISTS);
- }
- if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
- throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
- }
+ public MesProBagCodeGenerateRespVO generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
if (generateReqVO.getCount() == null || generateReqVO.getCount() <= 0) {
throw exception(PRO_BAG_CODE_GENERATE_COUNT_INVALID);
}
- // 2. 璁$畻璧峰搴忓彿锛堝寘鍚凡閫昏緫鍒犻櫎璁板綍锛屼繚璇佸簭鍙蜂笉鍥為��銆佺爜鍊煎敮涓�锛�
- int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
-
- // 3. 鎵归噺鐢熸垚琚嬬爜锛氭壒娆″彿 + - + 4 浣嶈搴忓彿锛屽悓涓�娆$敓鎴愬叡浜悓涓� UUID锛堟暟鎹寘锛�
+ // 鐢熸垚闃舵鍙垱寤哄叏灞�鍞竴琚嬬爜锛岀敓浜ф壒娆″湪鍚庣画褰曞叆
+ int startNo = bagCodeMapper.selectMaxBagNo() + 1;
String uuid = IdUtil.fastSimpleUUID();
List<MesProBagCodeDO> bagCodes = new ArrayList<>(generateReqVO.getCount());
for (int i = 0; i < generateReqVO.getCount(); i++) {
int bagNo = startNo + i;
bagCodes.add(new MesProBagCodeDO()
.setUuid(uuid)
- .setCode(batch.getCode() + "-" + StrUtil.padPre(String.valueOf(bagNo), 4, '0'))
+ .setCode("BAG-" + StrUtil.padPre(String.valueOf(bagNo), 8, '0'))
.setBagNo(bagNo)
- .setBatchId(batch.getId())
- .setBatchCode(batch.getCode())
.setStatus(MesProBagCodeStatusEnum.GENERATED.getStatus())
.setRemark(generateReqVO.getRemark()));
}
bagCodeMapper.insertBatch(bagCodes);
+ return new MesProBagCodeGenerateRespVO().setUuid(uuid);
+ }
- // 4. 鍥炲啓鎵规琚嬬爜鏁伴噺
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void bindBatch(MesProBagCodeBindBatchReqVO bindReqVO) {
+ MesProBatchDO batch = batchMapper.selectByIdForUpdate(bindReqVO.getBatchId());
+ if (batch == null) {
+ throw exception(PRO_BATCH_NOT_EXISTS);
+ }
+ if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
+ throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
+ }
+ // 涓存椂鎵规锛堟湭琛ュ綍姝e紡鎵规鍙凤級涓嶅厑璁歌鐮佸綍鍏�
+ if (StrUtil.isEmpty(batch.getCode())) {
+ throw exception(PRO_BATCH_NOT_FILLED);
+ }
+ List<Long> ids = bindReqVO.getIds().stream().distinct().toList();
+ List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(ids);
+ if (bagCodes.size() != ids.size() || bagCodes.stream().anyMatch(code ->
+ code.getBatchId() != null || !MesProBagCodeStatusEnum.GENERATED.getStatus().equals(code.getStatus()))) {
+ throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+ }
+ if (bagCodeMapper.bindBatchByIds(ids, batch.getId(), batch.getCode(),
+ MesProBagCodeStatusEnum.GENERATED.getStatus()) != ids.size()) {
+ throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+ }
batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
- .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity())
- + generateReqVO.getCount()));
- return uuid;
+ .setBagQuantity(bagCodeMapper.selectEffectiveCountByBatchId(batch.getId())));
}
@Override
@@ -144,7 +157,7 @@
String replaceUuid = IdUtil.fastSimpleUUID();
LocalDateTime replaceTime = LocalDateTime.now();
- int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
+ int startNo = bagCodeMapper.selectMaxBagNo() + 1;
List<MesProBagCodeDO> newBagCodes = new ArrayList<>(oldBagCodes.size());
List<MesProBagCodeReplaceDO> replacements = new ArrayList<>(oldBagCodes.size());
List<MesProBagCodeReplaceItemRespVO> items = new ArrayList<>(oldBagCodes.size());
@@ -242,10 +255,13 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void bindPallet(MesProBagCodeBindReqVO bindReqVO) {
- // 1. 鏍¢獙鎵樼洏瀛樺湪
- MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId());
- // 2. 鏍¢獙琚嬬爜
- List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet);
+ // 1. 閿佸畾鎵樼洏锛岄伩鍏嶄笌鑷姩褰掗泦骞跺彂淇敼琚嬫暟
+ MesProPalletDO pallet = palletMapper.selectByIdForUpdate(bindReqVO.getPalletId());
+ if (pallet == null) {
+ throw exception(PRO_PALLET_NOT_EXISTS);
+ }
+ // 2. 閿佸畾骞舵牎楠岃鐮�
+ List<MesProBagCodeDO> bagCodes = validateBagCodesForBind(bindReqVO.getIds(), pallet, true);
// 3. 鏍¢獙涓嶈秴杩囨墭鐩樺彲瑁呰鏁�
int currentCount = pallet.getBagCount() == null ? 0 : pallet.getBagCount();
if (pallet.getCapacity() != null && pallet.getCapacity() > 0
@@ -260,10 +276,13 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void unbindPallet(MesProBagCodeBindReqVO bindReqVO) {
- // 1. 鏍¢獙鎵樼洏瀛樺湪
- MesProPalletDO pallet = palletService.validatePalletExists(bindReqVO.getPalletId());
- // 2. 鏍¢獙琚嬬爜鍧囩粦瀹氬湪褰撳墠鎵樼洏涓�
- List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(bindReqVO.getIds());
+ // 1. 閿佸畾鎵樼洏锛岄伩鍏嶄笌鑷姩褰掗泦骞跺彂淇敼琚嬫暟
+ MesProPalletDO pallet = palletMapper.selectByIdForUpdate(bindReqVO.getPalletId());
+ if (pallet == null) {
+ throw exception(PRO_PALLET_NOT_EXISTS);
+ }
+ // 2. 閿佸畾骞舵牎楠岃鐮佸潎缁戝畾鍦ㄥ綋鍓嶆墭鐩樹笂
+ List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(bindReqVO.getIds());
if (bagCodes.size() != bindReqVO.getIds().size()) {
throw exception(PRO_BAG_CODE_NOT_EXISTS);
}
@@ -334,13 +353,23 @@
return bagCodeMapper.selectListByBatchId(batchId);
}
+ @Override
+ public void markOutbound(Long id, Long salesId) {
+ bagCodeMapper.markOutbound(id, salesId, LocalDateTime.now());
+ }
+
+ @Override
+ public void clearOutbound(Long id) {
+ bagCodeMapper.clearOutbound(id);
+ }
+
// ==================== 绉佹湁鏂规硶 ====================
/**
* 鏍¢獙寰呯粦瀹氱殑琚嬬爜锛氬瓨鍦ㄣ�佷笌鎵樼洏鍚屾壒娆°�佹湭缁戝畾杩囨墭鐩樸�佺姸鎬佹湁鏁堬紙宸茬敓鎴�/宸插鍑哄嵃鍒凤級
*/
- private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet) {
- List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIds(ids);
+ private List<MesProBagCodeDO> validateBagCodesForBind(List<Long> ids, MesProPalletDO pallet, boolean lock) {
+ List<MesProBagCodeDO> bagCodes = lock ? bagCodeMapper.selectListByIdsForUpdate(ids) : bagCodeMapper.selectListByIds(ids);
if (bagCodes.size() != ids.size()) {
throw exception(PRO_BAG_CODE_NOT_EXISTS);
}
--
Gitblit v1.9.3