From f8afe8d0e706993b6dded9d9563fc58a24982d66 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Tue, 28 Oct 2025 14:56:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/WmsMaterialCoilServiceImpl.java | 187 ++++++++++-------- script/sql/mysql/stock.sql | 11 +- 2 files changed, 109 insertions(+), 89 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index d8732fdc..c2e1c0b1 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -253,16 +253,15 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { @Override @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(WmsMaterialCoilBo bo) { - if (bo.getCoilId() == null) { - throw new RuntimeException("钢卷ID不能为空"); - } - // 判断是否批量更新 if (bo.getNewCoils() != null && !bo.getNewCoils().isEmpty()) { // 批量更新逻辑(分卷/合卷) return updateByBatch(bo); } else { - // 单个更新逻辑 + // 单个更新逻辑,需要coilId + if (bo.getCoilId() == null) { + throw new RuntimeException("钢卷ID不能为空"); + } return updateBySingle(bo); } } @@ -330,32 +329,40 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { * 批量更新(分卷/合卷) */ private Boolean updateByBatch(WmsMaterialCoilBo bo) { - // 查询原钢卷 - WmsMaterialCoil oldCoil = baseMapper.selectById(bo.getCoilId()); - if (oldCoil == null) { - throw new RuntimeException("原钢卷不存在"); + // 查询原钢卷(分卷时需要,合卷时可能不需要) + WmsMaterialCoil oldCoil = null; + if (bo.getCoilId() != null) { + oldCoil = baseMapper.selectById(bo.getCoilId()); + if (oldCoil == null) { + throw new RuntimeException("原钢卷不存在"); + } } // 判断是分卷还是合卷 boolean isSplit = false; boolean isMerge = false; - for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) { - if (newCoilBo.getHasMergeSplit() != null) { - if (newCoilBo.getHasMergeSplit() == 1) { + + // 检查bo本身是否为合卷 + if (bo.getHasMergeSplit() != null && bo.getHasMergeSplit() == 2) { + isMerge = true; + } else if (bo.getNewCoils() != null && !bo.getNewCoils().isEmpty()) { + // 检查newCoils中是否有分卷 + for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) { + if (newCoilBo.getHasMergeSplit() != null && newCoilBo.getHasMergeSplit() == 1) { isSplit = true; break; - } else if (newCoilBo.getHasMergeSplit() == 2) { - isMerge = true; - break; } } } // 1. 将原数据更新为历史数据(data_type=0) - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(WmsMaterialCoil::getCoilId, bo.getCoilId()) - .set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据 - baseMapper.update(null, updateWrapper); + // 注意:合卷时bo的coilId可能为空,因为bo是合卷后的新钢卷 + if (bo.getCoilId() != null) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(WmsMaterialCoil::getCoilId, bo.getCoilId()) + .set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据 + baseMapper.update(null, updateWrapper); + } // 2. 插入多条新的当前数据(data_type=1) List newCoils = new ArrayList<>(); @@ -367,7 +374,14 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } if (isSplit) { - // 分卷:为每个子钢卷生成独立的二维码 + // 分卷:将bo作为被分卷的原始对象,newCoils中的对象作为分卷后产生的新钢卷 + if (oldCoil == null) { + throw new RuntimeException("分卷操作需要原钢卷信息"); + } + + // 1. 将原始钢卷更新为历史数据(已在上面完成) + + // 2. 为每个分卷后的子钢卷生成独立的二维码并插入数据库 for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) { WmsMaterialCoil newCoil = BeanUtil.toBean(newCoilBo, WmsMaterialCoil.class); newCoil.setCoilId(null); @@ -383,20 +397,37 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { newCoils.add(newCoil); } } else if (isMerge) { - // 合卷:合并多个二维码信息为一个 - Long mergedQrcodeId = generateQrcodeForMerge(oldCoil, bo.getNewCoils()); - - for (WmsMaterialCoilBo newCoilBo : bo.getNewCoils()) { - WmsMaterialCoil newCoil = BeanUtil.toBean(newCoilBo, WmsMaterialCoil.class); - newCoil.setCoilId(null); - newCoil.setDataType(1); - newCoil.setEnterCoilNo(oldCoil.getEnterCoilNo()); - newCoil.setQrcodeRecordId(mergedQrcodeId); // 所有合卷后的钢卷共享一个二维码 - - validEntityBeforeSave(newCoil); - baseMapper.insert(newCoil); - newCoils.add(newCoil); + // 合卷:将bo作为合卷后的新钢卷,newCoils中的对象作为参与合卷的原始钢卷 + // 1. 将参与合卷的原始钢卷更新为历史数据 + for (WmsMaterialCoilBo originalCoilBo : bo.getNewCoils()) { + if (originalCoilBo.getCoilId() != null) { + LambdaUpdateWrapper originalUpdateWrapper = new LambdaUpdateWrapper<>(); + originalUpdateWrapper.eq(WmsMaterialCoil::getCoilId, originalCoilBo.getCoilId()) + .set(WmsMaterialCoil::getDataType, 0); // 设置为历史数据 + baseMapper.update(null, originalUpdateWrapper); + } } + + // 2. 生成合卷后的新钢卷二维码 + Long mergedQrcodeId = generateQrcodeForMerge(bo, bo.getNewCoils()); + + // 3. 插入合卷后的新钢卷 + WmsMaterialCoil newCoil = BeanUtil.toBean(bo, WmsMaterialCoil.class); + newCoil.setCoilId(null); + newCoil.setDataType(1); + // 合卷后的钢卷使用自己的enterCoilNo,如果没有则从参与合卷的原始钢卷中获取 + if (newCoil.getEnterCoilNo() == null && !bo.getNewCoils().isEmpty()) { + // 从第一个参与合卷的原始钢卷获取enterCoilNo + WmsMaterialCoil firstOriginalCoil = baseMapper.selectById(bo.getNewCoils().get(0).getCoilId()); + if (firstOriginalCoil != null) { + newCoil.setEnterCoilNo(firstOriginalCoil.getEnterCoilNo()); + } + } + newCoil.setQrcodeRecordId(mergedQrcodeId); + + validEntityBeforeSave(newCoil); + baseMapper.insert(newCoil); + newCoils.add(newCoil); } return true; @@ -459,58 +490,46 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { /** * 为合卷生成新二维码(合并多个父钢卷的二维码信息) */ - private Long generateQrcodeForMerge(WmsMaterialCoil oldCoil, List newCoils) { + private Long generateQrcodeForMerge(WmsMaterialCoilBo mergedCoilBo, List originalCoils) { try { - if (newCoils.isEmpty()) { + if (mergedCoilBo == null) { throw new RuntimeException("合卷后的钢卷数据不能为空"); } - WmsMaterialCoilBo mergedCoilBo = newCoils.get(0); - Map contentMap = new HashMap<>(); - contentMap.put("enter_coil_no", oldCoil.getEnterCoilNo()); - contentMap.put("current_coil_no", mergedCoilBo.getCurrentCoilNo()); - - // 合并所有父钢卷的历史steps - List> steps = new ArrayList<>(); - - // 如果有父钢卷号,获取它们的二维码信息并合并 - if (mergedCoilBo.getParentCoilNos() != null && !mergedCoilBo.getParentCoilNos().trim().isEmpty()) { - String[] parentCoilNos = mergedCoilBo.getParentCoilNos().split(","); - for (String parentCoilNo : parentCoilNos) { - // 查找父钢卷 - LambdaQueryWrapper parentLqw = Wrappers.lambdaQuery(); - parentLqw.eq(WmsMaterialCoil::getCurrentCoilNo, parentCoilNo.trim()) - .eq(WmsMaterialCoil::getDataType, 1); - List parentCoils = baseMapper.selectList(parentLqw); - - if (!parentCoils.isEmpty() && parentCoils.get(0).getQrcodeRecordId() != null) { - WmsGenerateRecordVo parentQr = generateRecordService.queryById(parentCoils.get(0).getQrcodeRecordId()); - if (parentQr != null) { - ObjectMapper objectMapper = new ObjectMapper(); - @SuppressWarnings("unchecked") - Map parentContentMap = objectMapper.readValue(parentQr.getContent(), Map.class); - @SuppressWarnings("unchecked") - List> parentSteps = (List>) parentContentMap.get("steps"); - if (parentSteps != null) { - steps.addAll(parentSteps); - } - } - } + // 获取enterCoilNo,优先使用mergedCoilBo的,如果没有则从原始钢卷中获取 + String enterCoilNo = mergedCoilBo.getEnterCoilNo(); + if (enterCoilNo == null && originalCoils != null && !originalCoils.isEmpty()) { + WmsMaterialCoil firstOriginalCoil = baseMapper.selectById(originalCoils.get(0).getCoilId()); + if (firstOriginalCoil != null) { + enterCoilNo = firstOriginalCoil.getEnterCoilNo(); } } + contentMap.put("enter_coil_no", enterCoilNo); + contentMap.put("current_coil_no", mergedCoilBo.getCurrentCoilNo()); - // 添加原钢卷的历史 - if (oldCoil.getQrcodeRecordId() != null) { - WmsGenerateRecordVo oldRecord = generateRecordService.queryById(oldCoil.getQrcodeRecordId()); - if (oldRecord != null) { - ObjectMapper objectMapper = new ObjectMapper(); - @SuppressWarnings("unchecked") - Map oldContentMap = objectMapper.readValue(oldRecord.getContent(), Map.class); - @SuppressWarnings("unchecked") - List> oldSteps = (List>) oldContentMap.get("steps"); - if (oldSteps != null) { - steps.addAll(oldSteps); + // 合并所有参与合卷的原始钢卷的历史steps + List> steps = new ArrayList<>(); + + // 从参与合卷的原始钢卷中获取二维码信息并合并 + if (originalCoils != null && !originalCoils.isEmpty()) { + for (WmsMaterialCoilBo originalCoilBo : originalCoils) { + if (originalCoilBo.getCoilId() != null) { + // 查询原始钢卷的二维码信息 + WmsMaterialCoil originalCoil = baseMapper.selectById(originalCoilBo.getCoilId()); + if (originalCoil != null && originalCoil.getQrcodeRecordId() != null) { + WmsGenerateRecordVo originalQr = generateRecordService.queryById(originalCoil.getQrcodeRecordId()); + if (originalQr != null) { + ObjectMapper objectMapper = new ObjectMapper(); + @SuppressWarnings("unchecked") + Map originalContentMap = objectMapper.readValue(originalQr.getContent(), Map.class); + @SuppressWarnings("unchecked") + List> originalSteps = (List>) originalContentMap.get("steps"); + if (originalSteps != null) { + steps.addAll(originalSteps); + } + } + } } } } @@ -520,7 +539,17 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { mergeStep.put("step", steps.size() + 1); mergeStep.put("action", "更新"); mergeStep.put("operation", "合卷"); - mergeStep.put("parent_coil_nos", mergedCoilBo.getParentCoilNos()); + + // 收集参与合卷的原始钢卷号 + List originalCoilNos = new ArrayList<>(); + if (originalCoils != null && !originalCoils.isEmpty()) { + for (WmsMaterialCoilBo originalCoilBo : originalCoils) { + if (originalCoilBo.getCurrentCoilNo() != null) { + originalCoilNos.add(originalCoilBo.getCurrentCoilNo()); + } + } + } + mergeStep.put("parent_coil_nos", String.join(",", originalCoilNos)); mergeStep.put("new_current_coil_no", mergedCoilBo.getCurrentCoilNo()); steps.add(mergeStep); @@ -531,7 +560,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { WmsGenerateRecordBo recordBo = new WmsGenerateRecordBo(); recordBo.setContent(contentJson); - recordBo.setSerialNumber(oldCoil.getEnterCoilNo() + "-" + mergedCoilBo.getCurrentCoilNo()); + recordBo.setSerialNumber(enterCoilNo + "-" + mergedCoilBo.getCurrentCoilNo()); recordBo.setQrcodeType(0L); recordBo.setIsEnabled(0L); recordBo.setSize(200L); diff --git a/script/sql/mysql/stock.sql b/script/sql/mysql/stock.sql index 443004e4..42d9c186 100644 --- a/script/sql/mysql/stock.sql +++ b/script/sql/mysql/stock.sql @@ -16,19 +16,10 @@ create table wms_stock update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', update_by varchar(50) null comment '更新人', constraint fk_stock_warehouse - foreign key (warehouse_id) references wms_warehouse (warehouse_id), - constraint fk_stock_raw_material - foreign key (raw_material_id) references wms_raw_material (raw_material_id), - constraint fk_stock_coil - foreign key (coil_id) references wms_material_coil (coil_id) + foreign key (warehouse_id) references wms_warehouse (warehouse_id) ) comment '库存表:原材料-钢卷-库区的存放关系' charset = utf8mb4; -create index idx_stock_raw_material - on wms_stock (raw_material_id); - -create index idx_stock_coil - on wms_stock (coil_id); create index idx_stock_warehouse on wms_stock (warehouse_id);