From ac60b02465db1958366b2581c747581f0a18bf6a Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Tue, 1 Jul 2025 14:33:50 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20=20=E6=89=B9=E6=AC=A1=E8=A7=84?= =?UTF-8?q?=E5=88=99=E6=89=B9=E9=87=8F=E4=BF=AE=E6=94=B9bug=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=B8=80=E6=AC=A1=E6=80=A7?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=B9=E6=AC=A1=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=BC=8F=E7=BB=84=E6=89=B9=E6=AC=A1=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E8=AF=A2=E7=BB=84=E6=89=B9=E6=AC=A1=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E6=9D=A1=E4=BB=B6=EF=BC=8C=E6=9F=A5=E6=A0=91=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=A0=B9=E6=8D=AE=E5=A7=8B=E5=8F=91=E7=BD=91=E7=82=B9?= =?UTF-8?q?=E6=9F=A5=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/emis/EmisTmsSiteBatchController.java | 10 + .../mapper/EmisTmsSiteBatchDtlMapper.java | 8 + .../mapper/EmisTmsSiteBatchLoadingMapper.java | 7 + .../emis/mapper/EmisTmsSiteBatchMapper.java | 8 + .../service/IEmisTmsSiteBatchService.java | 8 + .../impl/EmisTmsSiteBatchServiceImpl.java | 39 ++- .../impl/EmisTransPlanRuleServiceImpl.java | 65 +++-- .../mapper/EmisTmsSiteBatchDtlMapper.xml | 6 + .../mapper/EmisTmsSiteBatchLoadingMapper.xml | 6 + .../mapper/EmisTmsSiteBatchMapper.xml | 53 +--- .../mapper/EmisTmsSiteBatchMissMapper.xml | 263 +++++++++++------- 11 files changed, 306 insertions(+), 167 deletions(-) diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java index b83aa5f4e..9d66007b6 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java @@ -302,4 +302,14 @@ public class EmisTmsSiteBatchController extends EmisBaseController } return AjaxResult.success("批量修改成功"); } + + /** + * 批量编辑一级网点TMS组批次 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsSiteBatch:editAll')") + @Log(title = "一级网点TMS组批次", businessType = BusinessType.UPDATE) + @PostMapping("/editAll") + public AjaxResult editAll(@RequestBody EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError { + return toAjax(emisTmsSiteBatchService.editAll(emisTmsSiteBatch)); + } } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchDtlMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchDtlMapper.java index a5037a1cd..311c82d86 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchDtlMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchDtlMapper.java @@ -78,4 +78,12 @@ public interface EmisTmsSiteBatchDtlMapper extends BaseMapper selectEmisWayBillByBatchNo(@Param("batchNo") String batchNo); + + /** + * 根据batchNo批量软删除(del_flag=1) + * @param batchNo 批次号 + * @return 影响行数 + */ + int updateDelFlagByBatchNo(String batchNo); + } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchLoadingMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchLoadingMapper.java index bee952547..a15738ebb 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchLoadingMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchLoadingMapper.java @@ -76,4 +76,11 @@ public interface EmisTmsSiteBatchLoadingMapper extends BaseMapper * @return 组批次信息列表 */ List selectEmisTmsSiteBatchListByBillCodes(@Param("billCodes") List billCodes); + + /** + * 验重 + * + * @param emisTmsSiteBatch + * @return + */ + int checkUnique(EmisTmsSiteBatch emisTmsSiteBatch); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsSiteBatchService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsSiteBatchService.java index 0a564974e..d21412012 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsSiteBatchService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsSiteBatchService.java @@ -112,4 +112,12 @@ public interface IEmisTmsSiteBatchService * @return */ public EmisTmsSiteBatch geDetail(Long id); + + /** + * 批量编辑一级网点TMS组批次 + * + * @param emisTmsSiteBatch 一级网点TMS组批次 + * @return 结果 + */ + int editAll(EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java index 1a3132002..6722ea196 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java @@ -98,6 +98,7 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi /** * 批次明细 + * * @param emisTmsSiteBatch * @return */ @@ -154,14 +155,9 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi } } - private void checkUnique(EmisTmsSiteBatch oldSiteBatch, String billCode) throws EmisBizError { - EmisTmsSiteBatch emisTmsSiteBatch = new EmisTmsSiteBatch(); - emisTmsSiteBatch.setStartSiteCode(oldSiteBatch.getStartSiteCode()); - emisTmsSiteBatch.setNextSiteCode(oldSiteBatch.getNextSiteCode()); - emisTmsSiteBatch.setSupplierCode(oldSiteBatch.getSupplierCode()); + private void checkUnique(EmisTmsSiteBatch emisTmsSiteBatch, String billCode) throws EmisBizError { emisTmsSiteBatch.getParams().put("billCode", billCode); - List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchList(emisTmsSiteBatch); - if (CollectionUtil.isNotEmpty(batchList)) { + if (emisTmsSiteBatchMapper.checkUnique(emisTmsSiteBatch) > 0) { throw new EmisBizError(EmisBizErrorType.FAIL, billCode + "已组批次,不要重复组"); } } @@ -248,4 +244,33 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi return emisTmsSiteBatchMapper.selectEmisTmsSiteBatchWithDetailsById(id); } + @Override + @Transactional + public int editAll(EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError { + if (!CollectionUtils.isEmpty(emisTmsSiteBatch.getBatchDtlList())) { + for (EmisTmsSiteBatchDtl itemDtl : emisTmsSiteBatch.getBatchDtlList()) { + checkSiteBatch(emisTmsSiteBatch, itemDtl.getBillCode()); + } + } + emisTmsSiteBatchMapper.updateEmisTmsSiteBatch(emisTmsSiteBatch); + emisTmsSiteBatchDtlMapper.updateDelFlagByBatchNo(emisTmsSiteBatch.getBatchNo()); + emisTmsSiteBatchLoadingMapper.updateDelFlagByBatchNo(emisTmsSiteBatch.getBatchNo()); + if (StringUtil.isBlank(emisTmsSiteBatch.getBatchNo())) { + return 1; + } + if (CollectionUtil.isNotEmpty(emisTmsSiteBatch.getBatchDtlList())) { + for (EmisTmsSiteBatchDtl itemDtl : emisTmsSiteBatch.getBatchDtlList()) { + itemDtl.setBatchNo(emisTmsSiteBatch.getBatchNo()); + emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(itemDtl); + } + } + if (CollectionUtil.isNotEmpty(emisTmsSiteBatch.getLoadingList())) { + for (EmisTmsSiteBatchLoading batchLoading : emisTmsSiteBatch.getLoadingList()) { + batchLoading.setBatchNo(emisTmsSiteBatch.getBatchNo()); + emisTmsSiteBatchLoadingMapper.insertEmisTmsSiteBatchLoading(batchLoading); + } + } + return 1; + } + } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTransPlanRuleServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTransPlanRuleServiceImpl.java index 35cc3843c..8c650f5b9 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTransPlanRuleServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTransPlanRuleServiceImpl.java @@ -145,7 +145,13 @@ public class EmisTransPlanRuleServiceImpl extends EmisBaseService implements IEm } // 构建树形结构 - return buildTree(allRules, emisTransPlanRule); + List trees = buildTree(allRules, emisTransPlanRule); + String lineStartSiteCode = (String) emisTransPlanRule.getParams().get("lineStartSiteCode"); + if (StringUtil.isNotBlank(lineStartSiteCode)) { + trees = trees.stream().filter(i -> lineStartSiteCode.equals(i.getStartSiteCode())) + .collect(Collectors.toList()); + } + return trees; } @Override @@ -378,8 +384,6 @@ public class EmisTransPlanRuleServiceImpl extends EmisBaseService implements IEm } } - - @Override public List checkTree(EmisTransPlanRule emisTransPlanRule) { List allRules = emisTransPlanRuleMapper.selectEmisTransPlanRuleTree(emisTransPlanRule); @@ -400,37 +404,52 @@ public class EmisTransPlanRuleServiceImpl extends EmisBaseService implements IEm } int successCount = 0; - for (EmisTransPlanRule emisTransPlanRule : emisTransPlanRuleList) { + for (EmisTransPlanRule inputRule : emisTransPlanRuleList) { try { - // 校验非空 - checkCode(emisTransPlanRule); - checkDate(emisTransPlanRule); - - // 检查重复(排除自身) - checkDuplicateForUpdate(emisTransPlanRule); - - // 校验循环引用 + // 1. 查历史数据 + EmisTransPlanRule dbRule = emisTransPlanRuleMapper.selectEmisTransPlanRuleById(inputRule.getId()); + if (dbRule == null) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "ID:" + inputRule.getId() + "的规则不存在"); + } + // 2. 合并前端传递的字段到历史数据对象 + EmisTransPlanRule mergedRule = new EmisTransPlanRule(); + org.springframework.beans.BeanUtils.copyProperties(dbRule, mergedRule); + // 只覆盖前端传递的非null字段,跳过static/final字段 + java.lang.reflect.Field[] fields = EmisTransPlanRule.class.getDeclaredFields(); + for (java.lang.reflect.Field field : fields) { + int modifiers = field.getModifiers(); + if (java.lang.reflect.Modifier.isStatic(modifiers) + || java.lang.reflect.Modifier.isFinal(modifiers)) { + continue; + } + field.setAccessible(true); + Object val = field.get(inputRule); + if (val != null) { + field.set(mergedRule, val); + } + } + // 3. 校验合并后的对象 + checkCode(mergedRule); + checkDate(mergedRule); + checkDuplicateForUpdate(mergedRule); EmisTransPlanRule checkRule = new EmisTransPlanRule(); - checkRule.setProductType(emisTransPlanRule.getProductType()); + checkRule.setProductType(mergedRule.getProductType()); List allRules = emisTransPlanRuleMapper .selectEmisTransPlanRuleListWithoutName(checkRule); - // 移除当前要修改的规则,避免自己与自己比较 - allRules.removeIf(rule -> rule.getId().equals(emisTransPlanRule.getId())); - allRules.add(emisTransPlanRule); - buildTree(allRules, emisTransPlanRule); - - // 执行更新 - int result = emisTransPlanRuleMapper.updateEmisTransPlanRule(emisTransPlanRule); + allRules.removeIf(rule -> rule.getId().equals(mergedRule.getId())); + allRules.add(mergedRule); + buildTree(allRules, mergedRule); + // 4. 只更新前端传递的字段 + int result = emisTransPlanRuleMapper.updateEmisTransPlanRule(inputRule); if (result > 0) { successCount++; } } catch (Exception e) { - log.error("批量修改供应商线路规划失败,ID: {}, 错误: {}", emisTransPlanRule.getId(), e.getMessage()); + log.error("批量修改供应商线路规划失败,ID: {}, 错误: {}", inputRule.getId(), e.getMessage()); throw new EmisBizError(EmisBizErrorType.SYS_EXCEPTION, - "批量修改失败,ID: " + emisTransPlanRule.getId() + ", 错误: " + e.getMessage()); + "批量修改失败,ID: " + inputRule.getId() + ", 错误: " + e.getMessage()); } } - return successCount; } diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml index db75737e1..3d42d729c 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml @@ -193,4 +193,10 @@ and a.del_flag = '0' and a.send_date ]]> '2025-01-01 00:00:00' + + + update emis_tms_site_batch_dtl + set del_flag = '1' + where batch_no = #{batchNo} and del_flag = '0' + \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchLoadingMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchLoadingMapper.xml index 63710b54b..1e9a4ec17 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchLoadingMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchLoadingMapper.xml @@ -148,4 +148,10 @@ #{id} + + + update emis_tms_site_batch_loading + set del_flag = '1' + where batch_no = #{batchNo} and del_flag = '0' + \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMapper.xml index b0c596ef9..9ef6c34f4 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMapper.xml @@ -301,46 +301,19 @@ ORDER BY a.etd DESC - + - - - m.del_flag = '0' - - - - AND m.miss_type = 2 - - - AND m.miss_type = 3 - - - AND m.miss_type = 1 - - - AND m.bill_code IN ( - SELECT bill_code - FROM emis_tms_site_batch_miss - WHERE del_flag = '0' - GROUP BY bill_code - HAVING COUNT(*) = #{missCount} + + + + select + null as id, w.bill_code, '已组批次成功' as miss_reason, + null as create_by, null as create_time, null as update_by, null as update_time, + null as remark, '0' as del_flag, + w.trans_line_type as line_code, w.product_type, w.start_site_code, w.next_site_code, + null as supplier_code, null as start_date, null as end_date, '0' as miss_type, + w.send_site_code, s1.site_name as send_site_name, + w.send_country, c1.name as send_country_name, w.destination_code, n.dest_name as destination_name, w.bl_is_question, + l.line_name as line_name, + w.receive_country, c2.name as receive_country_name, w.send_date, w.bl_sign, w.sign_date, + w.product_type, + w.payment_type, w.parcel_qty, w.bill_weight, w.total_volume, w.volume_weight, + w.settlement_weight, w.freight, w.remark as waybill_remark, w.fee_remark, + null as manager, null as trans_manager, + (SELECT GROUP_CONCAT(s.site_name ORDER BY FIND_IN_SET(s.site_code, w.start_site_code)) + FROM emis_site s + WHERE FIND_IN_SET(s.site_code, w.start_site_code) AND s.del_flag = 0) as start_site_name, + (SELECT GROUP_CONCAT(s.site_name ORDER BY FIND_IN_SET(s.site_code, w.next_site_code)) + FROM emis_site s + WHERE FIND_IN_SET(s.site_code, w.next_site_code) AND s.del_flag = 0) as next_site_name, + null as supplier_name, + (SELECT GROUP_CONCAT(p.prod_name) + FROM emis_trans_product p + WHERE FIND_IN_SET(p.prod_code, w.product_type) + AND p.del_flag = '0') as product_type_name + from emis_waybill_batch_status b + inner join emis_waybill w on b.bill_code = w.bill_code and w.del_flag='0' + left join emis_site s1 on w.send_site_code=s1.site_code and s1.del_flag=0 + left join emis_country c1 on w.send_country=c1.code and c1.del_flag=0 + left join emis_destination n on w.destination_code=n.dest_code and n.del_flag=0 + left join emis_trans_line l on w.trans_line_type=l.line_code and l.del_flag=0 + left join emis_country c2 on w.receive_country=c2.code and c2.del_flag=0 + + b.site_batch_status = '1' + + AND w.bill_code REGEXP REPLACE(#{billCode}, '\n', '|') + + + AND w.trans_line_type = #{lineCode} + + + AND FIND_IN_SET(#{productType}, w.product_type) + + + AND ( + w.start_site_code REGEXP REPLACE(#{startSiteCode}, ',', '|') ) - AND m.miss_type = 0 - - - - - AND m.bill_code REGEXP REPLACE(#{billCode}, '\n', '|') - - - AND m.miss_reason like concat('%', #{missReason}, '%') - - - AND ( - m.manager REGEXP REPLACE(#{manager}, ',', '|') - ) - - - AND k.trans_manager like concat('%', #{transManager}, '%') - - - and (r.manager=#{params.privEmpName} or k.trans_manager=#{params.privEmpName}) - - - AND m.line_code = #{lineCode} - - - AND FIND_IN_SET(#{productType}, m.product_type) - - - AND ( - m.start_site_code REGEXP REPLACE(#{startSiteCode}, ',', '|') - ) - - - AND ( - m.next_site_code REGEXP REPLACE(#{nextSiteCode}, ',', '|') - ) - - - AND FIND_IN_SET(#{supplierCode}, m.supplier_code) - - - AND m.start_date = #{startDate} - - - AND m.end_date = #{endDate} - - - AND w.bl_is_question = #{blIsQuestion} - - - AND w.send_site_code = #{sendSiteCode} - - - and w.send_date = ]]> #{params.beginSendDate} - - - and w.send_date #{params.endSendDate} - - - order by m.bill_code desc + + + AND ( + w.next_site_code REGEXP REPLACE(#{nextSiteCode}, ',', '|') + ) + + + AND w.bl_is_question = #{blIsQuestion} + + + AND w.send_site_code = #{sendSiteCode} + + + and w.send_date = ]]> #{params.beginSendDate} + + + and w.send_date #{params.endSendDate} + + + order by w.bill_code desc + + + + + m.del_flag = '0' + + + + AND m.miss_type = 2 + + + AND m.miss_type = 3 + + + AND m.miss_type = 1 + + + AND m.bill_code IN ( + SELECT bill_code + FROM emis_tms_site_batch_miss + WHERE del_flag = '0' + GROUP BY bill_code + HAVING COUNT(*) = #{missCount} + ) + AND m.miss_type = 0 + + + + + AND m.bill_code REGEXP REPLACE(#{billCode}, '\n', '|') + + + AND m.miss_reason like concat('%', #{missReason}, '%') + + + AND ( + m.manager REGEXP REPLACE(#{manager}, ',', '|') + ) + + + AND k.trans_manager like concat('%', #{transManager}, '%') + + + and (r.manager=#{params.privEmpName} or k.trans_manager=#{params.privEmpName}) + + + AND m.line_code = #{lineCode} + + + AND FIND_IN_SET(#{productType}, m.product_type) + + + AND ( + m.start_site_code REGEXP REPLACE(#{startSiteCode}, ',', '|') + ) + + + AND ( + m.next_site_code REGEXP REPLACE(#{nextSiteCode}, ',', '|') + ) + + + AND FIND_IN_SET(#{supplierCode}, m.supplier_code) + + + AND m.start_date = #{startDate} + + + AND m.end_date = #{endDate} + + + AND w.bl_is_question = #{blIsQuestion} + + + AND w.send_site_code = #{sendSiteCode} + + + and w.send_date = ]]> #{params.beginSendDate} + + + and w.send_date #{params.endSendDate} + + + order by m.bill_code desc + +