From d586d7ab85c6affbc89c504fb17872f2ba7d869e Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Fri, 1 Aug 2025 16:51:43 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20=20=20=20=E6=96=B0=E5=A2=9E/=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E8=B4=A7=E7=89=A9=E7=BB=84=E6=89=B9=E6=AC=A1=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BF=AE=E6=94=B9=E8=BF=90=E5=8D=95=E4=BB=B6=E6=95=B0?= =?UTF-8?q?=E3=80=81=E9=87=8D=E9=87=8F=E3=80=81=E4=BD=93=E7=A7=AF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91=E8=B4=A7?= =?UTF-8?q?=E7=89=A9=E7=BB=84=E6=89=B9=E6=AC=A1=E5=A2=9E=E5=8A=A0=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=BB=B6=E6=95=B0=E3=80=81=E9=87=8D=E9=87=8F=E3=80=81?= =?UTF-8?q?=E4=BD=93=E7=A7=AF=E6=98=AF=E5=90=A6=E7=AC=A6=E5=90=88=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E5=8A=9F=E8=83=BD=E3=80=82=20=E8=BF=90=E5=8D=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E3=80=81=E7=BD=91=E7=82=B9=E8=B4=B9=E7=94=A8?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=A2=9E=E5=8A=A0=E6=A0=A1=E9=AA=8C=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E7=BB=84=E6=89=B9=E6=AC=A1=E6=98=AF=E5=90=A6=E5=88=86?= =?UTF-8?q?=E6=89=B9=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/web/emis/EmisWaybillController.java | 8 +- .../erp/emis/domain/EmisTmsSiteBatchDtl.java | 8 + .../emis/mapper/EmisTmsSiteBatchMapper.java | 15 +- .../erp/emis/service/EmisBaseService.java | 38 +++ .../service/IEmisTmsSiteBatchService.java | 16 +- .../impl/EmisTmsSiteBatchDtlServiceImpl.java | 2 +- .../impl/EmisTmsSiteBatchServiceImpl.java | 237 +++++++++++++++--- .../EmisWaybillAjustApplyServiceImpl.java | 3 + .../service/impl/EmisWaybillServiceImpl.java | 3 + .../mapper/EmisTmsSiteBatchDtlMapper.xml | 30 ++- .../mapper/EmisTmsSiteBatchMapper.xml | 29 +++ 11 files changed, 338 insertions(+), 51 deletions(-) diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java index c00423d92..6a931c715 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java @@ -197,9 +197,11 @@ public class EmisWaybillController extends EmisBaseController } // 获取取件员电话 - if(!StringUtils.isEmpty(waybillOrder.getTakePieceEmployeeCode())){ - SysUser user= sysUserService.selectUserByUserName(waybillOrder.getTakePieceEmployeeCode()); - waybillOrder.setTakePieceEmployeePhone(user.getPhonenumber()); + if (!StringUtils.isEmpty(waybillOrder.getTakePieceEmployeeCode())) { + SysUser user = sysUserService.selectUserByUserName(waybillOrder.getTakePieceEmployeeCode()); + if (Objects.nonNull(user)) { + waybillOrder.setTakePieceEmployeePhone(user.getPhonenumber()); + } } return AjaxResult.success("获取成功",waybillOrder); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchDtl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchDtl.java index ece69780d..4ff17a5f3 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchDtl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchDtl.java @@ -57,6 +57,14 @@ public class EmisTmsSiteBatchDtl extends BaseEntity private String scanMan; /* 扫描站点 */ private String scanSite; + /* 分批体积 */ + private BigDecimal batchVolume; + /* 分批件数 */ + private Integer batchParcelQty; + /* 分批重量 */ + private BigDecimal batchWeight; + /* 运单分批状态 1-已分批 0-未分批,默认为0 */ + private String blBatch; // 扩展参数 private EmisWaybill waybillDetail; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchMapper.java index 33cb76898..aec1aedd6 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsSiteBatchMapper.java @@ -15,9 +15,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xdadan.erp.common.annotation.audit.DataAuditLog; import com.xdadan.erp.common.annotation.audit.OperateType; import com.xdadan.erp.emis.domain.EmisTmsSiteBatch; -import com.xdadan.erp.emis.domain.EmisWaybill; import com.xdadan.erp.emis.service.impl.EmisTmsSiteBatchServiceImpl; -import com.xdadan.erp.emis.service.impl.EmisWaybillServiceImpl; import org.apache.ibatis.annotations.Param; /** @@ -119,6 +117,19 @@ public interface EmisTmsSiteBatchMapper extends BaseMapper */ List selectEmisTmsSiteBatchListByBillCodes(@Param("billCodes") List billCodes); + /** + * 根据起始网点、下一网点和运单号查询TMS组批次 + * + * @param startSiteCode 起始网点编码 + * @param nextSiteCode 下一网点编码 + * @param billCode 运单号 + * @param id + * @return TMS组批次列表 + */ + List selectTmsSiteBatchBySiteAndBillCode(@Param("startSiteCode") String startSiteCode, + @Param("nextSiteCode") String nextSiteCode, + @Param("billCode") String billCode, @Param("id")Long id); + /** * 验重 * diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java index 3388d23a1..085719c38 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java @@ -193,6 +193,9 @@ public class EmisBaseService { @Autowired private EmisTmsSiteBatchMissRecordMapper emisTmsSiteBatchMissRecordMapper; + @Autowired + private EmisTmsSiteBatchDtlMapper emisTmsSiteBatchDtlMapper; + private static SysUser emptySysUser = new SysUser(); static { @@ -5315,6 +5318,41 @@ public class EmisBaseService { masterBillCode, virtualBillCode, newVirtualRemark); } + /** + * 检查运单是否已分批 + * + * @param emisWaybillSave 保存的运单信息 + * @param emisWaybillOld 原运单信息 + * @throws EmisBizError 业务异常 + */ + public void checkBatch(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) throws EmisBizError { + // 检查运单号是否为空 + if (StringUtils.isBlank(emisWaybillSave.getBillCode())) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "运单号不能为空"); + } + + if (emisWaybillSave.getParcelQty().equals(emisWaybillOld.getParcelQty()) + && emisWaybillSave.getBillWeight().equals(emisWaybillOld.getBillWeight()) + && emisWaybillSave.getTotalVolume().equals(emisWaybillOld.getTotalVolume())) { + return; + } + + // 构建查询条件:根据运单号和bl_batch=1查询批次详情 + EmisTmsSiteBatchDtl queryCondition = new EmisTmsSiteBatchDtl(); + queryCondition.setBillCode(emisWaybillSave.getBillCode()); + queryCondition.setBlBatch("1"); // 已分批状态 + + // 查询批次详情表 + List batchDtlList = emisTmsSiteBatchDtlMapper + .selectEmisTmsSiteBatchDtlList(queryCondition); + + // 如果查询结果数量大于0,说明该运单已分批,抛出业务异常 + if (batchDtlList != null && batchDtlList.size() > 0) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, + "运单[" + emisWaybillSave.getBillCode() + "]已分批,不允许修改件数、重量、体积"); + } + } + public static void main(String[] args) throws ParseException { // Date startDate = new Date("202"); Date startDate= new SimpleDateFormat("yyyy-MM-dd").parse("2025-05-11"); 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 7f1e8ab85..945307255 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 @@ -41,6 +41,18 @@ public interface IEmisTmsSiteBatchService extends IDataAuditService */ public List selectTmsSiteBatchBySupplerAndCarNo(String supplierCode, String carNo, Date etd); + /** + * 根据起始网点、下一网点和运单号查询TMS组批次 + * + * @param startSiteCode 起始网点编码 + * @param nextSiteCode 下一网点编码 + * @param billCode 运单号 + * @param id + * @return TMS组批次列表 + */ + public List selectTmsSiteBatchBySiteAndBillCode(String startSiteCode, String nextSiteCode, + String billCode, Long id); + /** * 查询一级网点TMS组批次列表 * @@ -67,9 +79,9 @@ public interface IEmisTmsSiteBatchService extends IDataAuditService /** * * @param oldSiteBatch - * @param billCode + * @param itemDtl */ - public void checkSiteBatch(EmisTmsSiteBatch oldSiteBatch, String billCode) throws EmisBizError; + public void checkSiteBatch(EmisTmsSiteBatch oldSiteBatch, EmisTmsSiteBatchDtl itemDtl) throws EmisBizError; /** * 修改一级网点TMS组批次 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchDtlServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchDtlServiceImpl.java index 9cba692e6..0126679f3 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchDtlServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchDtlServiceImpl.java @@ -82,7 +82,7 @@ public class EmisTmsSiteBatchDtlServiceImpl implements IEmisTmsSiteBatchDtlServi @Override public int insertEmisTmsSiteBatchDtl(EmisTmsSiteBatchDtl emisTmsSiteBatchDtl) throws EmisBizError { EmisTmsSiteBatch oldSiteBatch = emisTmsSiteBatchMapper.selectTmsSiteBatchByBatchNo(emisTmsSiteBatchDtl.getBatchNo()); - emisTmsSiteBatchService.checkSiteBatch(oldSiteBatch, emisTmsSiteBatchDtl.getBillCode()); + emisTmsSiteBatchService.checkSiteBatch(oldSiteBatch, emisTmsSiteBatchDtl); return emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(emisTmsSiteBatchDtl); } 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 8b6528c50..f7365f3a3 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 @@ -10,14 +10,13 @@ package com.xdadan.erp.emis.service.impl; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import java.util.ArrayList; import cn.hutool.core.collection.CollectionUtil; import com.xdadan.erp.common.core.redis.RedissonService; -import com.xdadan.erp.common.utils.DateUtils; -import com.xdadan.erp.common.utils.SecurityUtils; import com.xdadan.erp.emis.domain.*; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.exception.EmisBizError; @@ -27,7 +26,6 @@ import com.xdadan.erp.emis.mapper.EmisTransPlanRuleMapper; import com.xdadan.erp.emis.mapper.EmisTmsSiteBatchLogMapper; import com.xdadan.erp.emis.mapper.EmisWaybillMapper; import com.xdadan.erp.emis.service.EmisBaseService; -import com.xdadan.erp.emis.service.IEmisTmsSiteBatchDtlService; import jodd.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -39,7 +37,7 @@ import com.xdadan.erp.emis.service.IEmisTmsSiteBatchService; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; - /** +/** * 一级网点TMS组批次Service业务层处理 * * @author linfso @@ -47,8 +45,7 @@ import org.springframework.util.CollectionUtils; */ @Service @Slf4j -public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmisTmsSiteBatchService -{ +public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmisTmsSiteBatchService { @Autowired private EmisTmsSiteBatchMapper emisTmsSiteBatchMapper; @@ -105,6 +102,11 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi return emisTmsSiteBatchMapper.selectTmsSiteBatchBySupplerAndCarNo(emisTmsSiteBatch); } + @Override + public List selectTmsSiteBatchBySiteAndBillCode(String startSiteCode, String nextSiteCode, + String billCode, Long id) { + return emisTmsSiteBatchMapper.selectTmsSiteBatchBySiteAndBillCode(startSiteCode, nextSiteCode, billCode,id); + } /** * 查询一级网点TMS组批次列表 @@ -113,8 +115,7 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi * @return 一级网点TMS组批次 */ @Override - public List selectEmisTmsSiteBatchList(EmisTmsSiteBatch emisTmsSiteBatch) - { + public List selectEmisTmsSiteBatchList(EmisTmsSiteBatch emisTmsSiteBatch) { return emisTmsSiteBatchMapper.selectEmisTmsSiteBatchList(emisTmsSiteBatch); } @@ -125,8 +126,7 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi * @return */ @Override - public List selectEmisTmsSiteBatchDtlList(EmisTmsSiteBatch emisTmsSiteBatch) - { + public List selectEmisTmsSiteBatchDtlList(EmisTmsSiteBatch emisTmsSiteBatch) { return emisTmsSiteBatchMapper.selectEmisTmsSiteBatchDtlList(emisTmsSiteBatch); } @@ -138,11 +138,10 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi */ @Transactional @Override - public int insertEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch) - { + public int insertEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch) { // 插入明细数据 - if(!CollectionUtils.isEmpty(emisTmsSiteBatch.getBatchDtlList())){ - for (EmisTmsSiteBatchDtl itemDtl:emisTmsSiteBatch.getBatchDtlList()) { + if (!CollectionUtils.isEmpty(emisTmsSiteBatch.getBatchDtlList())) { + for (EmisTmsSiteBatchDtl itemDtl : emisTmsSiteBatch.getBatchDtlList()) { itemDtl.setId(null); itemDtl.setBatchNo(emisTmsSiteBatch.getBatchNo()); emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(itemDtl); @@ -155,11 +154,119 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi return 1; } - public void checkSiteBatch(EmisTmsSiteBatch oldSiteBatch, String billCode) throws EmisBizError { - EmisWaybill emisWaybill = emisWaybillMapper.selectEmisWaybillByBillCode(billCode); - checkVirtual(billCode, emisWaybill); - checkTransPlanRule(oldSiteBatch, emisWaybill); - checkUnique(oldSiteBatch, billCode); + public void checkSiteBatch(EmisTmsSiteBatch oldSiteBatch, EmisTmsSiteBatchDtl itemDtl) throws EmisBizError { + + EmisWaybill emisWaybill = emisWaybillMapper.selectEmisWaybillByBillCode(itemDtl.getBillCode()); + checkVirtual(itemDtl.getBillCode(), emisWaybill); + EmisTransPlanRule rule = checkTransPlanRule(oldSiteBatch, emisWaybill); + checkItemDtl(oldSiteBatch, itemDtl, emisWaybill, rule); + + } + + private void checkItemDtl(EmisTmsSiteBatch oldSiteBatch, EmisTmsSiteBatchDtl itemDtl, EmisWaybill emisWaybill, + EmisTransPlanRule rule) throws EmisBizError { + if (emisWaybill.getParcelQty().equals(itemDtl.getBatchParcelQty()) + && emisWaybill.getBillWeight().equals(itemDtl.getBatchWeight()) + && emisWaybill.getTotalVolume().equals(itemDtl.getBatchVolume())) { + checkUnique(oldSiteBatch, itemDtl.getBillCode()); + return; + } + + itemDtl.setBlBatch("1"); + + // 校验批次重量、件数、体积都得大于0 + if (itemDtl.getBatchWeight() == null || itemDtl.getBatchWeight().compareTo(BigDecimal.ZERO) <= 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, itemDtl.getBillCode() + "的批次重量必须大于0"); + } + if (itemDtl.getBatchParcelQty() == null || itemDtl.getBatchParcelQty() <= 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, itemDtl.getBillCode() + "的批次件数必须大于0"); + } + if (itemDtl.getBatchVolume() == null || itemDtl.getBatchVolume().compareTo(BigDecimal.ZERO) <= 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, itemDtl.getBillCode() + "的批次体积必须大于0"); + } + + // 根据起始网点、下一网点和运单号查询TMS组批次 + List existingBatches = selectTmsSiteBatchBySiteAndBillCode( + oldSiteBatch.getStartSiteCode(), + oldSiteBatch.getNextSiteCode(), + itemDtl.getBillCode(),itemDtl.getId()); + + // 创建包含当前批次的临时批次列表用于分组去重 + List allBatches = new ArrayList<>(existingBatches); + + // 创建当前批次的临时对象用于分组计算 + EmisTmsSiteBatch currentBatch = new EmisTmsSiteBatch(); + currentBatch.setStartSiteCode(oldSiteBatch.getStartSiteCode()); + currentBatch.setNextSiteCode(oldSiteBatch.getNextSiteCode()); + currentBatch.setTotalWeight(itemDtl.getBatchWeight()); + currentBatch.setTotalParcelQty(itemDtl.getBatchParcelQty()); + currentBatch.setTotalVolume(itemDtl.getBatchVolume()); + allBatches.add(currentBatch); + + // 将allBatches根据起始网点、下一网点、批次重量、件数、体积分组去重 + Map> groupedBatches = allBatches.stream() + .collect(Collectors.groupingBy(batch -> batch.getStartSiteCode() + "_" + batch.getNextSiteCode() + "_" + + batch.getTotalWeight() + "_" + batch.getTotalParcelQty() + "_" + batch.getTotalVolume())); + + // 计算去重后的批次总重量、总件数、总体积 + BigDecimal totalWeight = groupedBatches.values().stream() + .map(batchList -> batchList.get(0).getTotalWeight()) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + Integer totalParcelQty = groupedBatches.values().stream() + .map(batchList -> batchList.get(0).getTotalParcelQty()) + .filter(Objects::nonNull) + .reduce(0, Integer::sum); + + BigDecimal totalVolume = groupedBatches.values().stream() + .map(batchList -> batchList.get(0).getTotalVolume()) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 校验总重量、总件数、总体积不能超过运单数据 + if (totalWeight.compareTo(emisWaybill.getBillWeight()) > 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, + itemDtl.getBillCode() + "的批次总重量(" + totalWeight + ")超过运单重量(" + emisWaybill.getBillWeight() + ")"); + } + if (totalParcelQty > emisWaybill.getParcelQty()) { + throw new EmisBizError(EmisBizErrorType.FAIL, + itemDtl.getBillCode() + "的批次总件数(" + totalParcelQty + ")超过运单件数(" + emisWaybill.getParcelQty() + ")"); + } + if (totalVolume.compareTo(emisWaybill.getTotalVolume()) > 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, + itemDtl.getBillCode() + "的批次总体积(" + totalVolume + ")超过运单体积(" + emisWaybill.getTotalVolume() + ")"); + } + + // 检查rule.supplierCode是否包含多个供应商编码(用逗号隔开) + if (StringUtils.isNotBlank(rule.getSupplierCode()) && rule.getSupplierCode().contains(",")) { + // 将supplierCode按逗号分割成数组 + String[] supplierCodes = rule.getSupplierCode().split(","); + List supplierCodeList = Arrays.asList(supplierCodes); + + // 检查现有批次中是否有supplierCode在rule.supplierCode内 + boolean hasMatchingSupplier = existingBatches.stream() + .anyMatch(batch -> supplierCodeList.contains(batch.getSupplierCode())); + + if (hasMatchingSupplier) { + // 找到匹配的批次,检查重量、体积、件数是否一致 + EmisTmsSiteBatch matchingBatch = existingBatches.stream() + .filter(batch -> supplierCodeList.contains(batch.getSupplierCode())) + .findFirst() + .orElse(null); + + if (matchingBatch != null) { + // 检查批次重量、体积、件数是否一致 + if (!Objects.equals(matchingBatch.getTotalWeight(), itemDtl.getBatchWeight()) || + !Objects.equals(matchingBatch.getTotalVolume(), itemDtl.getBatchVolume()) || + !Objects.equals(matchingBatch.getTotalParcelQty(), itemDtl.getBatchParcelQty())) { + throw new EmisBizError(EmisBizErrorType.FAIL, + itemDtl.getBillCode() + "的批次重量、体积、件数与批次" + matchingBatch.getBatchNo() + "不一致,请检查后重新录入"); + } + } + + } + } } private static void checkVirtual(String billCode, EmisWaybill emisWaybill) throws EmisBizError { @@ -176,7 +283,8 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi } } - private void checkTransPlanRule(EmisTmsSiteBatch oldSiteBatch, EmisWaybill emisWaybill) throws EmisBizError { + private EmisTransPlanRule checkTransPlanRule(EmisTmsSiteBatch oldSiteBatch, EmisWaybill emisWaybill) + throws EmisBizError { EmisTransPlanRule emisTransPlanRule = new EmisTransPlanRule(); emisTransPlanRule.setStartSiteCode(oldSiteBatch.getStartSiteCode()); emisTransPlanRule.setNextSiteCode(oldSiteBatch.getNextSiteCode()); @@ -185,8 +293,9 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi emisTransPlanRule.setProductType(emisWaybill.getProductType()); List list = emisTransPlanRuleMapper.checkTransPlanRule(emisTransPlanRule); if (CollectionUtil.isEmpty(list)) { - throw new EmisBizError(EmisBizErrorType.FAIL, emisWaybill.getBillCode()+"组批次起始网点、下一网点、供应商与规则不匹配"); + throw new EmisBizError(EmisBizErrorType.FAIL, emisWaybill.getBillCode() + "组批次起始网点、下一网点、供应商与规则不匹配"); } + return list.get(0); } private void checkUnique(EmisTmsSiteBatch emisTmsSiteBatch, String billCode) throws EmisBizError { @@ -266,12 +375,13 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi .collect(Collectors.toList()); for (EmisTmsSiteBatchDtl itemDtl : distinctBatchDtlList) { - checkSiteBatch(emisTmsSiteBatch, itemDtl.getBillCode()); + checkSiteBatch(emisTmsSiteBatch, itemDtl); itemDtl.setBatchNo(emisTmsSiteBatch.getBatchNo()); emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(itemDtl); } - List billCodes = distinctBatchDtlList.stream().map(EmisTmsSiteBatchDtl::getBillCode).distinct().collect(Collectors.toList()); - if(CollectionUtil.isNotEmpty(billCodes)) { + List billCodes = distinctBatchDtlList.stream().map(EmisTmsSiteBatchDtl::getBillCode).distinct() + .collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(billCodes)) { setOperateLog(emisTmsSiteBatch, "1", "新增运单", billCodes); } } @@ -308,9 +418,6 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi .values() .stream() .collect(Collectors.toList()); - for (EmisTmsSiteBatchDtl itemDtl : distinctBatchDtlList) { - checkSiteBatch(emisTmsSiteBatch, itemDtl.getBillCode()); - } } emisTmsSiteBatchMapper.updateEmisTmsSiteBatch(emisTmsSiteBatch); emisTmsSiteBatchLoadingMapper.updateDelFlagByBatchNo(emisTmsSiteBatch.getBatchNo()); @@ -337,16 +444,68 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi (existing, replacement) -> existing)) : new HashMap<>(); + // 分离插入和删除的数据 + List insertList = new ArrayList<>(); + List deleteList = new ArrayList<>(); + // 处理需要插入的新数据 if (CollectionUtil.isNotEmpty(distinctBatchDtlList)) { - List newBillCodes = new ArrayList<>(); for (EmisTmsSiteBatchDtl itemDtl : distinctBatchDtlList) { - // 如果历史数据中不存在该billCode,则插入新数据 + // 如果历史数据中不存在该billCode,则加入插入列表 if (!historyBatchDtlMap.containsKey(itemDtl.getBillCode())) { - emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(itemDtl); - newBillCodes.add(itemDtl.getBillCode()); + insertList.add(itemDtl); } } + } + + // 处理需要软删除的历史数据 + if (CollectionUtil.isNotEmpty(historyBatchDtlList)) { + for (EmisTmsSiteBatchDtl historyDtl : historyBatchDtlList) { + // 如果新数据中不存在该billCode,则加入删除列表 + if (!newBatchDtlMap.containsKey(historyDtl.getBillCode())) { + deleteList.add(historyDtl); + } + } + } + + // 从distinctBatchDtlList中剔除insertList和deleteList中的数据 + List remainingList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(distinctBatchDtlList)) { + Set insertBillCodes = insertList.stream() + .map(EmisTmsSiteBatchDtl::getBillCode) + .collect(Collectors.toSet()); + Set deleteBillCodes = deleteList.stream() + .map(EmisTmsSiteBatchDtl::getBillCode) + .collect(Collectors.toSet()); + + remainingList = distinctBatchDtlList.stream() + .filter(item -> !insertBillCodes.contains(item.getBillCode()) && + !deleteBillCodes.contains(item.getBillCode())) + .collect(Collectors.toList()); + } + + // 对剩余数据调用checkSiteBatch + if (CollectionUtil.isNotEmpty(remainingList)) { + for (EmisTmsSiteBatchDtl itemDtl : remainingList) { + checkSiteBatch(emisTmsSiteBatch, itemDtl); + emisTmsSiteBatchDtlMapper.updateEmisTmsSiteBatchDtl(itemDtl); + } + } + + // 对插入列表中的数据调用checkItemDtl + if (CollectionUtil.isNotEmpty(insertList)) { + for (EmisTmsSiteBatchDtl itemDtl : insertList) { + checkSiteBatch(emisTmsSiteBatch, itemDtl); + } + } + + // 执行新增操作 + if (CollectionUtil.isNotEmpty(insertList)) { + List newBillCodes = new ArrayList<>(); + for (EmisTmsSiteBatchDtl itemDtl : insertList) { + emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(itemDtl); + newBillCodes.add(itemDtl.getBillCode()); + } // 记录新增运单日志 if (!newBillCodes.isEmpty()) { @@ -354,15 +513,12 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi } } - // 处理需要软删除的历史数据 - if (CollectionUtil.isNotEmpty(historyBatchDtlList)) { + // 执行删除操作 + if (CollectionUtil.isNotEmpty(deleteList)) { List deletedBillCodes = new ArrayList<>(); - for (EmisTmsSiteBatchDtl historyDtl : historyBatchDtlList) { - // 如果新数据中不存在该billCode,则软删除历史数据 - if (!newBatchDtlMap.containsKey(historyDtl.getBillCode())) { - emisTmsSiteBatchDtlMapper.deleteEmisTmsSiteBatchDtlById(historyDtl.getId()); - deletedBillCodes.add(historyDtl.getBillCode()); - } + for (EmisTmsSiteBatchDtl historyDtl : deleteList) { + emisTmsSiteBatchDtlMapper.deleteEmisTmsSiteBatchDtlById(historyDtl.getId()); + deletedBillCodes.add(historyDtl.getBillCode()); } // 记录删除运单日志 @@ -381,7 +537,8 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi return 1; } - private void setOperateLog(EmisTmsSiteBatch emisTmsSiteBatch, String number, String 删除运单, List deletedBillCodes) { + private void setOperateLog(EmisTmsSiteBatch emisTmsSiteBatch, String number, String 删除运单, + List deletedBillCodes) { EmisTmsSiteBatchLog log = new EmisTmsSiteBatchLog(); log.setBatchNo(emisTmsSiteBatch.getBatchNo()); log.setOpType(number); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java index f7d3de756..5898979f4 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java @@ -370,6 +370,9 @@ public class EmisWaybillAjustApplyServiceImpl extends EmisBaseService implements // 处理虚拟件逻辑 handleVirtualForUpdate(emisWaybillSave, emisWaybillOld); + // 校验运单是否分批 + checkBatch(emisWaybillSave, emisWaybillOld); + recordWaybillOperLog( emisWaybillAjustApply.getBillCode(), WaybillOperLogType.SITE_MODIFY_APPLY, diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java index 3f8b82a36..c74e3c0a2 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java @@ -1521,6 +1521,9 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb // 处理虚拟件逻辑 handleVirtualForUpdate(emisWaybillSave, emisWaybillOld); + // 校验运单是否分批 + checkBatch(emisWaybillSave, emisWaybillOld); + // 修改运单 reUpdateWayBill(emisWaybillOld, emisWaybillSave,true,false); diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml index 3d42d729c..71ac88565 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml @@ -13,6 +13,10 @@ + + + + @@ -26,7 +30,7 @@ - select id, bill_code, batch_no, scan_date, scan_status, group_status, scan_man, scan_site, remark, tenant_id, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_tms_site_batch_dtl + select id, bill_code, batch_no, scan_date, scan_status, group_status, scan_man, scan_site, batch_volume, batch_parcel_qty, batch_weight, bl_batch, remark, tenant_id, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_tms_site_batch_dtl @@ -113,6 +125,10 @@ group_status, scan_man, scan_site, + batch_volume, + batch_parcel_qty, + batch_weight, + bl_batch, remark, tenant_id, del_flag, @@ -131,6 +147,10 @@ #{groupStatus}, #{scanMan}, #{scanSite}, + #{batchVolume}, + #{batchParcelQty}, + #{batchWeight}, + #{blBatch}, #{remark}, #{tenantId}, #{delFlag}, @@ -153,6 +173,10 @@ group_status = #{groupStatus}, scan_man = #{scanMan}, scan_site = #{scanSite}, + batch_volume = #{batchVolume}, + batch_parcel_qty = #{batchParcelQty}, + batch_weight = #{batchWeight}, + bl_batch = #{blBatch}, remark = #{remark}, tenant_id = #{tenantId}, del_flag = #{delFlag}, @@ -179,7 +203,7 @@ + + + \ No newline at end of file