From 97ff62ca74d1f3452afc26757ce9f3e7dd3c3076 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Mon, 16 Jun 2025 16:19:03 +0800 Subject: [PATCH 01/10] =?UTF-8?q?demand:=20=E8=BF=90=E5=8D=95=E5=BD=95?= =?UTF-8?q?=E5=85=A5=E7=95=8C=E9=9D=A2-=E7=BC=85=E7=94=B8=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E5=8D=95=E8=B0=83=E6=95=B4=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/web/emis/EmisWaybillController.java | 11 +++ .../xdadan/erp/emis/domain/EmisWaybill.java | 2 + .../erp/emis/domain/vo/WaybillOrder.java | 8 +++ .../erp/emis/mapper/EmisWaybillMapper.java | 8 +++ .../erp/emis/service/IEmisWaybillService.java | 8 +++ .../service/impl/EmisWaybillServiceImpl.java | 72 ++++++++++++++++++- .../resources/mapper/EmisWaybillMapper.xml | 24 ++++++- 7 files changed, 131 insertions(+), 2 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 f04bf1ab9..cd9b39e29 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 @@ -108,6 +108,17 @@ public class EmisWaybillController extends EmisBaseController return AjaxResult.success("操作成功", emisBaseService.checkWaybillIsExists(billCode)); } + /** + * 查询主单号列表 + */ + @GetMapping(value = "/getMasterBillCodes") + public TableDataInfo getMasterBillCodes(EmisWaybill emisWaybill){ + startPage(); + emisWaybill.getParams().put("privSiteCode", getLoginUser().getUser().getOwnerSiteCode()); + List list = emisWaybillService.selectMasterBillCodes(emisWaybill); + return getDataTable(list); + } + /** * 获取运单信息 */ diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java index 73bd785d6..01d13ccfb 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java @@ -314,6 +314,8 @@ public class EmisWaybill extends BaseEntity private String blOverLong; /* 是否虚拟单 */ private String blVirtual; + /* 主单号 */ + private String masterBillCode; /* 是否付款 */ private String blBill; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java index 7432882b2..f185e22ec 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java @@ -389,6 +389,10 @@ public class WaybillOrder implements Serializable { /* 箱量 */ private String boxQuantity; + /* 是否虚拟单 0:否,1:是,默认为0 */ + private String blVirtual; + /* 主单号 */ + private String masterBillCode; // 销售,回款 // private String salesmenName; @@ -732,6 +736,10 @@ public class WaybillOrder implements Serializable { dbWaybill.setUserId(this.getUserId()); dbWaybill.setCustomerCode(this.getCustomerCode()); + // 虚拟单 + dbWaybill.setBlVirtual(this.getBlVirtual()); + dbWaybill.setMasterBillCode(this.getMasterBillCode()); + // dbWaybill.setCustomerName(this.getCustomerName()); // dbWaybill.setReceiveCustomerCode(this.getReceiveCustomerCode()); // dbWaybill.setReceiveCustomerName(this.getReceiveCustomerName()); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java index 2792a8f40..7c817bbb5 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java @@ -304,4 +304,12 @@ public interface EmisWaybillMapper extends BaseMapper EmisWaybill selectCustEmisWaybillByBillCode(EmisWaybill queryWaybill); EmisWaybill selectEmisWaybillByCustOrderId(String custOrderId); + + /** + * 查询主单号列表 + * + * @param emisWaybill + * @return + */ + List selectMasterBillCodes(EmisWaybill emisWaybill); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java index 023557730..a29377ef0 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java @@ -289,4 +289,12 @@ public interface IEmisWaybillService extends IDataAuditService * @throws EmisBizError 业务异常 */ void updateWaybillInfo(JSONObject orderData, String appId) throws EmisBizError; + + /** + * 查询主单号 + * + * @param emisWaybill + * @return + */ + List selectMasterBillCodes(EmisWaybill emisWaybill); } 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 0df86280e..16fc25a13 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 @@ -14,6 +14,7 @@ package com.xdadan.erp.emis.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; + import com.beust.jcommander.internal.Lists; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.PictureType; @@ -135,6 +136,9 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb @Autowired private EmisCustomerSignMapper emisCustomerSignMapper; + @Autowired + private EmisTmsSiteBatchMapper emisTmsSiteBatchMapper; + /** * 获取稽核数据 * @param id @@ -3075,6 +3079,13 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb } + // 是否是虚拟问题件 + if (!StringUtils.isEmpty(emisWaybillSave.getBlVirtual())) { + if ("1".equals(emisWaybillSave.getBlVirtual())) { + checkVirtual(emisWaybillSave); + } + } + // 设定为业务开单 emisWaybillSave.setOrderType("1"); emisWaybillSave.setOrderDate(new Date()); @@ -3240,6 +3251,62 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb } } + private void checkVirtual(EmisWaybill emisWaybillSave) throws EmisBizError { + if (StringUtil.isBlank(emisWaybillSave.getMasterBillCode())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不能为空"); + } + EmisWaybill masterWaybill = emisWaybillMapper + .selectEmisWaybillByBillCode(emisWaybillSave.getMasterBillCode()); + if (Objects.isNull(masterWaybill)) { + throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不存在"); + } + if (!emisWaybillSave.getReceiveCountry().equals(masterWaybill.getReceiveCountry()) + || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "主单和虚拟单线路不一致"); + } + + List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchListByBillCodes( + Lists.newArrayList(Collections.singleton(emisWaybillSave.getMasterBillCode()))); + if (CollectionUtil.isNotEmpty(batchList)) { + throw new EmisBizError(EmisBizErrorType.FAIL, "该单号已经录入批次,请先在组批次中剔除该运单"); + } + String remark = masterWaybill.getRemark(); + String virtualBillCode = emisWaybillSave.getBillCode(); + String virtualBillCodeLastSix = virtualBillCode.substring(virtualBillCode.length() - 6); + if (remark != null && remark.contains("该运单为主单,对应虚拟单为")) { + // 如果包含关键字,在最后一个虚拟单号后添加新的虚拟单号 + int lastIndex = remark.lastIndexOf("该运单为主单,对应虚拟单为"); + String prefix = remark.substring(0, lastIndex + "该运单为主单,对应虚拟单为".length()); + String suffix = remark.substring(lastIndex + "该运单为主单,对应虚拟单为".length()); + + // 处理虚拟单号去重 + Set virtualBillSet = new LinkedHashSet<>(); + if (!suffix.trim().isEmpty()) { + // 将现有虚拟单号添加到Set中,并去除空格 + String[] codes = suffix.split(","); + for (String code : codes) { + String trimmedCode = code.trim(); + if (!trimmedCode.isEmpty()) { + virtualBillSet.add(trimmedCode); + } + } + } + // 添加新的虚拟单号 + virtualBillSet.add(virtualBillCodeLastSix); + + // 重新拼接去重后的虚拟单号,保持原有顺序 + remark = prefix + String.join(",", virtualBillSet); + } else { + // 如果不包含关键字,在备注末尾添加新的信息 + remark = (remark != null ? remark + " " : "") + "该运单为主单,对应虚拟单为" + virtualBillCodeLastSix; + } + EmisWaybill emisWaybill = new EmisWaybill(); + emisWaybill.setRemark(remark); + emisWaybill.setId(masterWaybill.getId()); + emisWaybillSave.setRemark("该单为虚拟单:对应主单为" + emisWaybillSave.getMasterBillCode()); + emisWaybillMapper.updateEmisWaybill(emisWaybill); + } + private void checkCountry(EmisWaybill emisWaybillSave) throws EmisBizError { EmisTransLine emisTransLine = new EmisTransLine(); emisTransLine.setLineCode(emisWaybillSave.getTransLineType()); @@ -5813,8 +5880,11 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb reUpdateWayBillByOms(oldWaybill, waybillUpdate); } + @Override + public List selectMasterBillCodes(EmisWaybill emisWaybill) { - + return emisWaybillMapper.selectMasterBillCodes(emisWaybill); + } public static void main(String[] args) { diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml index 0767a2514..a150848db 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml @@ -225,6 +225,9 @@ + + + @@ -298,7 +301,7 @@ a.goods_type, a.goods_info, a.goods_pics, a.bl_prepare_in_freight, a.prepare_in_est_fee, a.prepare_in_real_fee, a.prepare_in_express, a.prepare_in_bill_code, a.prepare_in_remark, a.prepare_in_supplier, a.total_weight, a.total_volume, a.parcel_qty, a.bill_weight, a.volume_weight, a.currency, - a.settlement_weight, a.scan_weight, a.fee_weight, a.freight, a.real_payment_type, a.real_fee, a.bl_special_quote, + a.settlement_weight, a.scan_weight, a.fee_weight, a.freight, a.real_payment_type, a.real_fee, a.bl_special_quote,a.bl_virtual,a.master_bill_code a.bl_over_long, a.bl_bill, a.bl_bill_text, a.bl_over_weight, a.over_weight_number, a.fee_remark, a.third_code, a.real_value, a.bl_insure, a.insure_value, a.insure_value_currency, a.insure_fee_currency, a.insure_fee, a.insure_remark, a.insure_site_code, a.insure_date, a.bl_print, a.print_man_code, a.print_site, a.print_date, a.print_count, a.bl_disp_fd, @@ -547,6 +550,22 @@ + - + + where a.del_flag = '0' + and a.send_date >= date_sub(curdate(), interval 3 day) + and a.trans_line_type = #{transLineType} + and (a.bl_virtual is null or a.bl_virtual != '1') - and bill_code like concat('%', #{billCode}, '%') + and a.bill_code like concat('%', #{billCode}, '%') and ( @@ -3147,8 +3146,8 @@ bl_sensitive = #{blSensitive}, bl_over_long = #{blOverLong}, bl_virtual = #{blVirtual}, - master_bill_code= #{masterBillCode}, - virtual_remark= #{virtualRemark}, + master_bill_code= #{masterBillCode}, + virtual_remark= #{virtualRemark}, bl_bill = #{blBill}, bl_bill_text = #{blBillText}, bl_profit = #{blProfit}, diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillProblemInfoMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillProblemInfoMapper.xml index 00cda2fc3..b3e6773e3 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillProblemInfoMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillProblemInfoMapper.xml @@ -127,6 +127,12 @@ where a.id = #{id} + + insert into emis_waybill_problem_info @@ -250,6 +256,13 @@ update emis_waybill_problem_info set del_flag='1' where id = #{id} + + update emis_waybill_problem_info + set del_flag='1' + where bill_code = #{billCode} + and (problem_type = '170' or problem_type = '173') + + update emis_waybill_problem_info set del_flag='1' where id in From 44cc39999bd9a5a8b4f3a2e22b6da4b3c7670d92 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Fri, 20 Jun 2025 13:56:56 +0800 Subject: [PATCH 04/10] =?UTF-8?q?demand:=20TMS-=E7=BC=85=E7=94=B8=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E5=8D=95=E8=B0=83=E6=95=B4=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/web/emis/EmisCommonController.java | 24 ++ .../erp/web/emis/EmisCountryController.java | 5 + .../web/emis/EmisTmsSiteBatchController.java | 18 +- .../emis/EmisTmsSiteBatchDtlController.java | 21 +- .../erp/emis/domain/EmisTmsSiteBatch.java | 1 + .../erp/emis/domain/vo/WaybillOrder.java | 4 + .../erp/emis/mapper/EmisWaybillMapper.java | 12 + .../mapper/EmisWaybillProblemInfoMapper.java | 8 + .../erp/emis/service/EmisBaseService.java | 105 +++++--- .../service/IEmisTmsSiteBatchService.java | 22 +- .../erp/emis/service/IEmisWaybillService.java | 5 + .../impl/EmisTmsSiteBatchDtlServiceImpl.java | 16 +- .../impl/EmisTmsSiteBatchServiceImpl.java | 63 ++++- .../impl/EmisTransPlanRuleServiceImpl.java | 15 ++ .../service/impl/EmisWaybillServiceImpl.java | 229 ++++++++++++++++++ .../mapper/EmisTmsSiteBatchMissMapper.xml | 5 +- .../resources/mapper/EmisWaybillMapper.xml | 216 ++++++++++++++++- .../mapper/EmisWaybillProblemInfoMapper.xml | 9 + 18 files changed, 711 insertions(+), 67 deletions(-) diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCommonController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCommonController.java index 226e2a98d..8f8a138f0 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCommonController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCommonController.java @@ -751,6 +751,30 @@ public class EmisCommonController extends EmisBaseController } + /** + * 处理历史虚拟单 + * @return + */ + @GetMapping("/handleHistoryVirtualWaybill") + public AjaxResult handleHistoryVirtualWaybill(){ + String lockKey="handleHistoryVirtualWaybill"; + log.info("handleHistoryVirtualWaybill start"); + + // 加锁查询 + redissonService.lock(lockKey,300); + try{ + emisWaybillService.handleHistoryVirtualWaybill(); + }catch(Exception ex){ + ex.printStackTrace(); + log.error("handleHistoryVirtualWaybill exception:"+ex.getMessage()); + } + log.info("handleHistoryVirtualWaybill end"); + + redissonService.unlock(lockKey); + return AjaxResult.success("发送成功"); + + } + /** * 自动出账触发 * @return diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCountryController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCountryController.java index aa26cfca8..251dcf99c 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCountryController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCountryController.java @@ -11,6 +11,7 @@ package com.xdadan.erp.web.emis; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; @@ -152,4 +153,8 @@ public class EmisCountryController extends EmisBaseController { return toAjax(emisCountryService.deleteEmisCountryByIds(ids)); } + + public static void main(String[] args) { + List list = new ArrayList(); + } } 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 6f329a29c..74a25c3fc 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 @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.utils.WaybillHelper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -152,19 +153,28 @@ public class EmisTmsSiteBatchController extends EmisBaseController @PreAuthorize("@ss.hasPermi('emis:emisTmsSiteBatch:add')") @Log(title = "一级网点TMS组批次", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody EmisTmsSiteBatch emisTmsSiteBatch) - { + public AjaxResult add(@RequestBody EmisTmsSiteBatch emisTmsSiteBatch) { return toAjax(emisTmsSiteBatchService.insertEmisTmsSiteBatch(emisTmsSiteBatch)); } + + /** + * 新增一级网点TMS组批次 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTmsSiteBatch:addAll')") + @Log(title = "一级网点TMS组批次", businessType = BusinessType.INSERT) + @PostMapping("/addAll") + public AjaxResult addAll(@RequestBody EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError { + return toAjax(emisTmsSiteBatchService.addAll(emisTmsSiteBatch)); + } + /** * 修改一级网点TMS组批次 */ @PreAuthorize("@ss.hasPermi('emis:emisTmsSiteBatch:edit')") @Log(title = "一级网点TMS组批次", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody EmisTmsSiteBatch emisTmsSiteBatch) - { + public AjaxResult edit(@RequestBody EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError { return toAjax(emisTmsSiteBatchService.updateEmisTmsSiteBatch(emisTmsSiteBatch)); } diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchDtlController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchDtlController.java index 030316c68..327bb51e5 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchDtlController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchDtlController.java @@ -98,26 +98,7 @@ public class EmisTmsSiteBatchDtlController extends EmisBaseController @Log(title = "一级网点TMS组批次明细", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody EmisTmsSiteBatchDtl emisTmsSiteBatchDtl) throws EmisBizError { - JSONObject jObjOut = new JSONObject(); - String result = "success"; - String msg = "提交成功"; - try { - emisTmsSiteBatchDtlService.insertEmisTmsSiteBatchDtl(emisTmsSiteBatchDtl); - } catch (EmisBizError ex) { - ex.printStackTrace(); - result = "fail"; - msg = ex.getErrorCode() + ":" + ex.getMessage(); - } catch (Exception ex) { - result = "fail"; - ex.printStackTrace(); - msg = "系统异常:" + ex.getMessage(); - if (ex instanceof EmisBizError) { - msg = ((EmisBizError) ex).getErrorCode() + ":" + ex.getMessage(); - } - } - jObjOut.put("result", result); - jObjOut.put("msg", msg); - return AjaxResult.success("成功", jObjOut); + return toAjax(emisTmsSiteBatchDtlService.insertEmisTmsSiteBatchDtl(emisTmsSiteBatchDtl)); } /** diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatch.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatch.java index 9fa781163..8c4d3740a 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatch.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatch.java @@ -114,6 +114,7 @@ public class EmisTmsSiteBatch extends BaseEntity private String blEntering; private List batchDtlList; + private List loadingList; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java index 0c6361311..ebb4a07c6 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java @@ -522,6 +522,10 @@ public class WaybillOrder implements Serializable { voItem.setPrintManName(dbWaybill.getPrintManName()); voItem.setPrintSiteName(dbWaybill.getPrintSiteName()); + voItem.setBlVirtual(dbWaybill.getBlVirtual()); + voItem.setMasterBillCode(dbWaybill.getMasterBillCode()); + voItem.setVirtualRemark(dbWaybill.getVirtualRemark()); + voItem.setOpenId(dbWaybill.getOpenId()); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java index 908080112..d8ac6c2b8 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillMapper.java @@ -32,6 +32,8 @@ public interface EmisWaybillMapper extends BaseMapper public EmisWaybill selectEmisWaybillByBillCode(@Param("billCode")String billCode); + public EmisWaybill selectMasterWaybillByBillCode(@Param("billCode")String billCode); + public List selectWaybillStatByEmpCode(@Param("empCode")String empCode,@Param("waybillStatus")String waybillStatus); public List selectCommissionStatData(EmisWaybill emisWaybill); @@ -104,6 +106,8 @@ public interface EmisWaybillMapper extends BaseMapper @DataAuditLog(operateType= OperateType.UPDATE,serviceClass=EmisWaybillServiceImpl.class) public int updateEmisWaybill(EmisWaybill emisWaybill); + public int updateVirtualWaybill(EmisWaybill emisWaybill); + /** * 删除 @@ -312,4 +316,12 @@ public interface EmisWaybillMapper extends BaseMapper * @return */ List selectMasterEmisWaybills(EmisWaybill emisWaybill); + + /** + * + * @param offset + * @param pageSize + * @return + */ + List selectHistoryVirtualWaybill(@Param("offset")int offset, @Param("pageSize")int pageSize); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillProblemInfoMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillProblemInfoMapper.java index b12a6bccd..be638e97b 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillProblemInfoMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisWaybillProblemInfoMapper.java @@ -95,4 +95,12 @@ public interface EmisWaybillProblemInfoMapper extends BaseMapper selectEmisWaybillProblemInfoByBillCodes(@Param("billCodes") List billCodes); } 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 c4adae7d5..757962f73 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 @@ -1704,8 +1704,11 @@ public class EmisBaseService { } log.info("query emisSettleSubBillList , emisSettleSubBillList,{}", emisSettleSubBillList); BigDecimal inTermMoney = new BigDecimal(emisSettleSubBillList.stream() - .map(EmisSettleSubBill::getBillFee) - .filter(i -> i != null) + .map(bill -> { + BigDecimal billFee = bill.getBillFee() == null ? BigDecimal.ZERO : bill.getBillFee(); + BigDecimal recedMoney = bill.getRecedMoney() == null ? BigDecimal.ZERO : bill.getRecedMoney(); + return billFee.subtract(recedMoney); + }) .reduce(BigDecimal.ZERO, BigDecimal::add) .stripTrailingZeros().toPlainString()); log.info("success.getInTermMoney , inTermMoney,{}", inTermMoney); @@ -2835,12 +2838,16 @@ public class EmisBaseService { if("3".equals(waybill.getPaymentType()) || "4".equals(waybill.getPaymentType()) ){ remark = WaybillHelper.removeUnSeeChar(waybill.getRemark()); remark = remark + " " + WaybillHelper.removeUnSeeChar(waybill.getFeeRemark()); - if (StringUtil.isNotBlank(waybill.getVirtualRemark())) { - remark = remark + " " + "该运单为主单,对应虚拟单为" + waybill.getVirtualRemark(); - } } } + if (StringUtil.isNotBlank(waybill.getVirtualRemark())) { + remark = remark + " " + "该运单为主单,对应虚拟单为" + waybill.getVirtualRemark(); + } + // if (StringUtil.isNotBlank(waybill.getMasterBillCode())) { + // remark = remark + " " + "该运单为虚拟单,对应主单为" + waybill.getMasterBillCode(); + // } + order.put("remark",remark); // 备注拆分为多行 List remarkList=WaybillHelper.wrap(remark,40); @@ -4099,31 +4106,75 @@ public class EmisBaseService { } } - /** - * 深度复制节点及其子节点 - * - * @param source 源节点 - * @return 复制后的新节点 - */ - private EmisTransPlanRule deepCopyNode(EmisTransPlanRule source) { - if (source == null) { - return null; - } + /** + * 深度复制节点及其子节点 + * + * @param source 源节点 + * @return 复制后的新节点 + */ + private EmisTransPlanRule deepCopyNode(EmisTransPlanRule source) { + return deepCopyNode(source, new HashSet<>(), new ArrayList<>()); + } - EmisTransPlanRule copy = new EmisTransPlanRule(); - BeanUtils.copyProperties(source, copy); + /** + * 深度复制节点及其子节点(带循环引用检测) + * + * @param source 源节点 + * @param visitedIds 已访问的节点ID集合 + * @param visitPath 访问路径,用于记录循环引用的路径 + * @return 复制后的新节点 + */ + private EmisTransPlanRule deepCopyNode(EmisTransPlanRule source, Set visitedIds, List visitPath) { + if (source == null) { + return null; + } - // 递归复制子节点 - if (source.getChildren() != null) { - List copiedChildren = new ArrayList<>(); - for (EmisTransPlanRule child : source.getChildren()) { - copiedChildren.add(deepCopyNode(child)); - } - copy.setChildren(copiedChildren); - } + // 检查循环引用 + if (visitedIds.contains(source.getId())) { + // 找到循环引用的起始位置 + int cycleStartIndex = visitPath.indexOf(source.getId()); + if (cycleStartIndex != -1) { + // 构建循环路径 + List cyclePath = visitPath.subList(cycleStartIndex, visitPath.size()); + cyclePath.add(source.getId()); - return copy; - } + // 构建详细的错误信息 + StringBuilder errorMsg = new StringBuilder(); + errorMsg.append("检测到循环引用!循环路径:"); + for (int i = 0; i < cyclePath.size(); i++) { + if (i > 0) { + errorMsg.append(" -> "); + } + errorMsg.append("节点ID:").append(cyclePath.get(i)); + } + errorMsg.append("\n循环引用发生在节点ID:").append(source.getId()); + errorMsg.append(",该节点在路径中重复出现"); + + throw new RuntimeException(errorMsg.toString()); + } + } + + // 添加到已访问集合和路径中 + visitedIds.add(source.getId()); + visitPath.add(source.getId()); + + EmisTransPlanRule copy = new EmisTransPlanRule(); + BeanUtils.copyProperties(source, copy); + + // 递归复制子节点 + if (source.getChildren() != null) { + List copiedChildren = new ArrayList<>(); + for (EmisTransPlanRule child : source.getChildren()) { + copiedChildren.add(deepCopyNode(child, visitedIds, visitPath)); + } + copy.setChildren(copiedChildren); + } + + // 从路径中移除当前节点(回溯) + visitPath.remove(visitPath.size() - 1); + + return copy; + } /** * 检查月结客户首次签约日期,首次签约之前开的不允许修改 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 9ef466b3c..35fb41dae 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 @@ -11,8 +11,10 @@ package com.xdadan.erp.emis.service; import java.util.List; import com.xdadan.erp.emis.domain.EmisTmsSiteBatch; +import com.xdadan.erp.emis.domain.EmisTmsSiteBatchDtl; +import com.xdadan.erp.emis.domain.exception.EmisBizError; -/** + /** * @ClassName EmisTmsSiteBatchService * @Description 一级网点TMS组批次 * @author linfso @@ -48,7 +50,14 @@ public interface IEmisTmsSiteBatchService * @param emisTmsSiteBatch 一级网点TMS组批次 * @return 结果 */ - public int insertEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch); + public int insertEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch) ; + + /** + * + * @param oldSiteBatch + * @param billCode + */ + public void checkSiteBatch(EmisTmsSiteBatch oldSiteBatch, String billCode) throws EmisBizError; /** * 修改一级网点TMS组批次 @@ -56,7 +65,7 @@ public interface IEmisTmsSiteBatchService * @param emisTmsSiteBatch 一级网点TMS组批次 * @return 结果 */ - public int updateEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch); + public int updateEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError; /** * 批量删除一级网点TMS组批次 @@ -80,4 +89,11 @@ public interface IEmisTmsSiteBatchService * @param batchNo */ void scanSiteBatch(String batchNo); + + /** + * + * @param emisTmsSiteBatch + * @return + */ + int addAll(EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java index 073fe5eb9..9acde5d6f 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java @@ -297,4 +297,9 @@ public interface IEmisWaybillService extends IDataAuditService * @return */ List selectMasterEmisWaybills(EmisWaybill emisWaybill); + + /** + * + */ + void handleHistoryVirtualWaybill(); } 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 ba9c1c10a..9cba692e6 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 @@ -13,10 +13,14 @@ package com.xdadan.erp.emis.service.impl; import java.util.List; import java.util.Objects; +import cn.hutool.core.collection.CollectionUtil; +import com.xdadan.erp.emis.domain.EmisTmsSiteBatch; import com.xdadan.erp.emis.domain.EmisWaybill; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.exception.EmisBizError; +import com.xdadan.erp.emis.mapper.EmisTmsSiteBatchMapper; import com.xdadan.erp.emis.mapper.EmisWaybillMapper; +import com.xdadan.erp.emis.service.IEmisTmsSiteBatchService; import jodd.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,6 +43,12 @@ public class EmisTmsSiteBatchDtlServiceImpl implements IEmisTmsSiteBatchDtlServi @Autowired private EmisWaybillMapper emisWaybillMapper; + @Autowired + private EmisTmsSiteBatchMapper emisTmsSiteBatchMapper; + + @Autowired + private IEmisTmsSiteBatchService emisTmsSiteBatchService; + /** * 查询一级网点TMS组批次明细 * @@ -71,10 +81,8 @@ public class EmisTmsSiteBatchDtlServiceImpl implements IEmisTmsSiteBatchDtlServi */ @Override public int insertEmisTmsSiteBatchDtl(EmisTmsSiteBatchDtl emisTmsSiteBatchDtl) throws EmisBizError { - EmisWaybill emisWaybill = emisWaybillMapper.selectEmisWaybillByBillCode(emisTmsSiteBatchDtl.getBillCode()); - if (Objects.nonNull(emisWaybill) && StringUtil.isNotBlank(emisWaybill.getVirtualRemark())) { - throw new EmisBizError(EmisBizErrorType.FAIL, emisTmsSiteBatchDtl.getBillCode() + "已绑定虚拟单,无法录入批次"); - } + EmisTmsSiteBatch oldSiteBatch = emisTmsSiteBatchMapper.selectTmsSiteBatchByBatchNo(emisTmsSiteBatchDtl.getBatchNo()); + emisTmsSiteBatchService.checkSiteBatch(oldSiteBatch, emisTmsSiteBatchDtl.getBillCode()); 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 c36028c9f..d65901cb4 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 @@ -12,15 +12,17 @@ package com.xdadan.erp.emis.service.impl; import java.util.Date; import java.util.List; +import java.util.Objects; 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.EmisSite; -import com.xdadan.erp.emis.domain.EmisTmsSiteBatchDtl; -import com.xdadan.erp.emis.domain.EmisWaybill; +import com.xdadan.erp.emis.domain.*; +import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; +import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.mapper.EmisTmsSiteBatchDtlMapper; +import com.xdadan.erp.emis.mapper.EmisTmsSiteBatchLoadingMapper; import com.xdadan.erp.emis.service.EmisBaseService; import jodd.util.StringUtil; import lombok.extern.slf4j.Slf4j; @@ -28,7 +30,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import com.xdadan.erp.emis.domain.EmisTmsSiteBatch; import com.xdadan.erp.emis.mapper.EmisTmsSiteBatchMapper; import com.xdadan.erp.emis.service.IEmisTmsSiteBatchService; import org.springframework.transaction.annotation.Transactional; @@ -50,6 +51,9 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi @Autowired private EmisTmsSiteBatchDtlMapper emisTmsSiteBatchDtlMapper; + @Autowired + private EmisTmsSiteBatchLoadingMapper emisTmsSiteBatchLoadingMapper; + @Autowired RedissonService redissonService; @@ -113,6 +117,26 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi return 1; } + public void checkSiteBatch(EmisTmsSiteBatch oldSiteBatch, String billCode) throws EmisBizError { + EmisWaybill emisWaybill = emisWaybillMapper.selectEmisWaybillByBillCode(billCode); + if (Objects.nonNull(emisWaybill) && StringUtil.isNotBlank(emisWaybill.getVirtualRemark())) { + throw new EmisBizError(EmisBizErrorType.FAIL, billCode + "已绑定虚拟单,无法录入批次"); + } + checkUnique(oldSiteBatch, billCode); + } + + 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()); + emisTmsSiteBatch.getParams().put("billCode", billCode); + List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchList(emisTmsSiteBatch); + if (CollectionUtil.isNotEmpty(batchList)) { + throw new EmisBizError(EmisBizErrorType.FAIL, billCode + "已组批次,不要重复组"); + } + } + /** * 修改一级网点TMS组批次 * @@ -120,8 +144,11 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi * @return 结果 */ @Override - public int updateEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch) - { + public int updateEmisTmsSiteBatch(EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError { + List emisWaybills = emisTmsSiteBatchDtlMapper.selectEmisWayBillByBatchNo(emisTmsSiteBatch.getBatchNo()); + for (EmisWaybill emisWaybill : emisWaybills) { + checkUnique(emisTmsSiteBatch, emisWaybill.getBillCode()); + } return emisTmsSiteBatchMapper.updateEmisTmsSiteBatch(emisTmsSiteBatch); } @@ -163,4 +190,28 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi scanSiteBatchByWaybills(waybills); } + @Override + @Transactional + public int addAll(EmisTmsSiteBatch emisTmsSiteBatch) throws EmisBizError { + // 插入明细数据 + if (!CollectionUtils.isEmpty(emisTmsSiteBatch.getBatchDtlList())) { + for (EmisTmsSiteBatchDtl itemDtl : emisTmsSiteBatch.getBatchDtlList()) { + checkSiteBatch(emisTmsSiteBatch, itemDtl.getBillCode()); + itemDtl.setBatchNo(emisTmsSiteBatch.getBatchNo()); + emisTmsSiteBatchDtlMapper.insertEmisTmsSiteBatchDtl(itemDtl); + } + } + if (!CollectionUtils.isEmpty(emisTmsSiteBatch.getLoadingList())) { + for (EmisTmsSiteBatchLoading batchLoading : emisTmsSiteBatch.getLoadingList()) { + batchLoading.setBatchNo(emisTmsSiteBatch.getBatchNo()); + emisTmsSiteBatchLoadingMapper.insertEmisTmsSiteBatchLoading(batchLoading); + } + } + + // 插入主批次数据 + emisTmsSiteBatchMapper.insertEmisTmsSiteBatch(emisTmsSiteBatch); + + 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 2147b20d1..f933798a9 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 @@ -210,6 +210,15 @@ public class EmisTransPlanRuleServiceImpl extends EmisBaseService implements IEm if (existingRules != null && !existingRules.isEmpty()) { throw new EmisBizError(EmisBizErrorType.EXISTS, "已存在相同的规则配置"); } + EmisTransPlanRule emisTransPlanRule1 = new EmisTransPlanRule(); + emisTransPlanRule1.setLineCode(emisTransPlanRule.getLineCode()); + emisTransPlanRule1.setProductType(emisTransPlanRule.getProductType()); + emisTransPlanRule1.setStartSiteCode(emisTransPlanRule.getNextSiteCode()); + emisTransPlanRule1.setNextSiteCode(emisTransPlanRule.getStartSiteCode()); + List existingRules1 = emisTransPlanRuleMapper.checkDuplicate(emisTransPlanRule); + if (existingRules1 != null && !existingRules1.isEmpty()) { + throw new EmisBizError(EmisBizErrorType.EXISTS, "已存在相同的规则配置"); + } } private static void checkName(EmisTransPlanRule emisTransPlanRule) throws EmisBizError { @@ -233,6 +242,9 @@ public class EmisTransPlanRuleServiceImpl extends EmisBaseService implements IEm if (StringUtil.isBlank(emisTransPlanRule.getSupplierName())) { throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "供应商名称不能为空"); } + if(emisTransPlanRule.getStartSiteName().equals(emisTransPlanRule.getNextSiteName())){ + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "同一产品类型下起始网点、下一网点不能相同"); + } } private static void checkCode(EmisTransPlanRule emisTransPlanRule) throws EmisBizError { @@ -254,6 +266,9 @@ public class EmisTransPlanRuleServiceImpl extends EmisBaseService implements IEm if (StringUtil.isBlank(emisTransPlanRule.getSupplierCode())) { throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "供应商名称不能为空"); } + if(emisTransPlanRule.getStartSiteCode().equals(emisTransPlanRule.getNextSiteCode())){ + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "同一产品类型下起始网点、下一网点不能相同"); + } } private static void checkDate(EmisTransPlanRule emisTransPlanRule) throws EmisBizError { 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 273d7ab51..67df9a415 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 @@ -65,6 +65,9 @@ package com.xdadan.erp.emis.service.impl; import java.net.URLEncoder; import java.text.DecimalFormat; import java.util.*; + import java.util.concurrent.ExecutorService; + import java.util.concurrent.Executors; + import java.util.concurrent.Future; import java.util.stream.Collectors; /** @@ -5818,6 +5821,232 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb return emisWaybillMapper.selectMasterEmisWaybills(emisWaybill); } + @Override + @Async + public void handleHistoryVirtualWaybill() { + try { + long startTime = System.currentTimeMillis(); + int pageSize = 1000; + int offset = 0; + int totalProcessed = 0; + int successCount = 0; + int failCount = 0; + List failedBillCodes = new ArrayList<>(); + List failedBills = new ArrayList<>(); + List filterForProblemCodes = new ArrayList<>(); + + // 创建线程池 + int processors = Runtime.getRuntime().availableProcessors(); + ExecutorService executorService = Executors.newFixedThreadPool(processors); + List>> futures = new ArrayList<>(); + + // 先查询所有数据 + while (true) { + List waybills = emisWaybillMapper.selectHistoryVirtualWaybill(offset, pageSize); + if (waybills.isEmpty()) { + break; + } + futures.add(executorService.submit(() -> waybills)); + offset += pageSize; + } + + // 等待所有查询完成并收集结果 + List allWaybills = new ArrayList<>(); + for (Future> future : futures) { + try { + List waybills = future.get(); + allWaybills.addAll(waybills); + totalProcessed += waybills.size(); + } catch (Exception e) { + log.error("Error getting waybill results", e); + } + } + + // 关闭线程池 + executorService.shutdown(); + + // 按1000条数据分组处理 + List> batches = new ArrayList<>(); + for (int i = 0; i < allWaybills.size(); i += pageSize) { + int end = Math.min(i + pageSize, allWaybills.size()); + batches.add(allWaybills.subList(i, end)); + } + + // 处理每个批次 + for (List batch : batches) { + for (EmisWaybill waybill : batch) { + try { + String remark = waybill.getRemark(); + if (StringUtils.isNotEmpty(remark)) { + String masterBillCode = extractMasterBillCode(remark); + if (StringUtil.isBlank(masterBillCode)) { + masterBillCode=extractMasterBillCode(waybill.getFeeRemark()); + } + if (StringUtil.isBlank(masterBillCode)) { + failedBillCodes.add(waybill.getBillCode()); + failedBills.add(waybill); + log.error("masterBillCode is null,billCode:{}", waybill.getBillCode()); + failCount++; + continue; + } + waybill.setMasterBillCode(masterBillCode); + // 更新运单信息 + updateWaybill(waybill); + successCount++; + } + } catch (Exception e) { + log.error("处理运单失败,运单号:{},错误:{}", waybill.getBillCode(), e.getMessage()); + failCount++; + failedBillCodes.add(waybill.getBillCode()); + failedBills.add(waybill); + } + } + } + + handleProblem(failedBillCodes, filterForProblemCodes, failedBills,successCount,failCount); + + long endTime = System.currentTimeMillis(); + long processTime = endTime - startTime; + + log.debug("处理完成,总处理数:{},成功数:{},失败数:{},耗时:{}ms", + totalProcessed, successCount, failCount, processTime); + + if (CollectionUtil.isNotEmpty(failedBillCodes)) { + log.debug("Failed bill codes: {}", failedBillCodes); + } + if (CollectionUtil.isNotEmpty(filterForProblemCodes)) { + log.debug("Failed for problemCodes: {}", filterForProblemCodes); + } + } catch (Exception e) { + log.error("Error in autoScanSiteBatch", e); + } + } + + private void handleProblem(List failedBillCodes, List filterForProblemCodes, List failedBills, int successCount, int failCount) { + List emisWaybillProblemInfos = emisWaybillProblemInfoMapper.selectEmisWaybillProblemInfoByBillCodes(failedBillCodes); + if(emisWaybillProblemInfos==null){ + log.error("emisWaybillProblemInfos is null"); + return; + } + for (EmisWaybillProblemInfo emisWaybillProblemInfo : emisWaybillProblemInfos) { + try { + String remark = emisWaybillProblemInfo.getProblemCause(); + if (StringUtil.isBlank(remark)) { + filterForProblemCodes.add(emisWaybillProblemInfo.getBillCode()); + continue; + } + String masterBillCode = extractMasterBillCode(remark); + if (StringUtil.isBlank(masterBillCode)) { + filterForProblemCodes.add(emisWaybillProblemInfo.getBillCode()); + continue; + } + List fiterBills = failedBills.stream().filter(i -> i.getBillCode().equals(emisWaybillProblemInfo.getBillCode())).collect(Collectors.toList()); + EmisWaybill waybill = new EmisWaybill(); + waybill.setMasterBillCode(masterBillCode); + waybill.setId(fiterBills.get(0).getId()); + waybill.setBillCode(emisWaybillProblemInfo.getBillCode()); + // 更新运单信息 + updateWaybill(waybill); + successCount++; + failCount--; + } catch (Exception e) { + log.error("处理问题件失败,运单号:{},错误:{}", emisWaybillProblemInfo.getBillCode(), e.getMessage()); + filterForProblemCodes.add(emisWaybillProblemInfo.getBillCode()); + } + + } + } + + private void updateWaybill(EmisWaybill virtualWaybill) { + EmisWaybill masterWaybill = emisWaybillMapper + .selectMasterWaybillByBillCode(virtualWaybill.getMasterBillCode()); + String virtualRemark = masterWaybill.getVirtualRemark(); + String virtualBillCode = virtualWaybill.getBillCode(); + String virtualBillCodeLastSix = virtualBillCode.substring(virtualBillCode.length() - 6); + if (StringUtil.isNotBlank(virtualRemark)) { + Set virtualBillSet = new LinkedHashSet<>(); + String[] codes = virtualRemark.split(","); + virtualBillSet.addAll(Arrays.asList(codes)); + virtualBillSet.add(virtualBillCodeLastSix); + virtualRemark = String.join(",", virtualBillSet); + } else { + virtualRemark = virtualBillCodeLastSix; + } + EmisWaybill updateMasterWaybill = new EmisWaybill(); + updateMasterWaybill.setVirtualRemark(virtualRemark); + updateMasterWaybill.setId(masterWaybill.getId()); + emisWaybillMapper.updateVirtualWaybill(updateMasterWaybill); + + EmisWaybill updateVirtualWaybill = new EmisWaybill(); + updateVirtualWaybill.setMasterBillCode(virtualWaybill.getMasterBillCode()); + updateVirtualWaybill.setId(virtualWaybill.getId()); + updateVirtualWaybill.setBlVirtual("1"); + emisWaybillMapper.updateVirtualWaybill(updateVirtualWaybill); + } + + private String extractMasterBillCode(String remark) { + if (StringUtils.isEmpty(remark)) { + return null; + } + + // 原有规则:查找T7080开头的主单号 + int startIndex = remark.indexOf("T7080"); + if (startIndex != -1) { + String subStr = remark.substring(startIndex); + java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("T7080\\d+"); + java.util.regex.Matcher matcher = pattern.matcher(subStr); + if (matcher.find()) { + return matcher.group(); + } + } + + // 新规则:查找主单相关关键词后的内容,直到最后一位数字为止,且不能包含汉字 + String[] keywords = {"主单为", "主单是", "主单位", "主单号", "主单","真实单号"}; + for (String keyword : keywords) { + int idx = remark.indexOf(keyword); + if (idx != -1) { + int start = idx + keyword.length(); + // 从关键词后开始,提取到最后一个数字为止 + StringBuilder sb = new StringBuilder(); + boolean hasDigit = false; + for (int i = start; i < remark.length(); i++) { + char c = remark.charAt(i); + // 如果遇到汉字则停止 + if (Character.toString(c).matches("[\u4e00-\u9fa5]")) { + break; + } + // 允许字母、数字、-、_等常见单号字符 + if (Character.isLetterOrDigit(c) || c == '-' || c == '_' || c == '/') { + sb.append(c); + if (Character.isDigit(c)) { + hasDigit = true; + } + } else if (sb.length() > 0) { + // 如果已经开始提取,遇到其他字符则停止 + break; + } + } + // 去除首尾空格 + String candidate = sb.toString().trim(); + // 必须包含数字,且不能包含汉字 + if (hasDigit && !candidate.matches(".*[\u4e00-\u9fa5].*")) { + // 只保留最后一位是数字的部分 + int lastDigitIdx = -1; + for (int i = candidate.length() - 1; i >= 0; i--) { + if (Character.isDigit(candidate.charAt(i))) { + lastDigitIdx = i; + break; + } + } + if (lastDigitIdx != -1) { + return candidate.substring(0, lastDigitIdx + 1); + } + } + } + } + return null; + } + public static void main(String[] args) { double volumeWeight=0.8 * (1000000 / Double.valueOf(4000)); diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml index d9a609293..0658a1fa4 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml @@ -43,12 +43,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + select m.id, m.bill_code, m.miss_reason, m.create_by, m.create_time, m.update_by, m.update_time, m.remark, m.del_flag, - m.line_code, m.product_type, m.start_site_code, m.next_site_code, m.supplier_code, m.start_date, m.end_date, + m.line_code, m.product_type, m.start_site_code, m.next_site_code, m.supplier_code, m.start_date, m.end_date,m.miss_type, w.send_site_code, s1.site_name as send_site_name,s2.site_name as start_site_name,s3.site_name as next_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, @@ -148,6 +149,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY bill_code HAVING COUNT(*) = #{missCount} ) + AND m.miss_type = 0 @@ -197,6 +199,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and w.send_date #{params.endSendDate} + order by m.bill_code desc + + + + + + + insert into emis_waybill_problem_info From 3c4dbf03110ae6495e03e2ef1fbd14def85e2c77 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Sat, 21 Jun 2025 13:23:18 +0800 Subject: [PATCH 05/10] =?UTF-8?q?demand:=20TMS-=E7=BC=85=E7=94=B8=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E5=8D=95=E8=B0=83=E6=95=B4=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/emis/EmisTmsSiteBatchController.java | 1 + .../emis/mapper/EmisTransPlanRuleMapper.java | 31 +++++- .../erp/emis/service/EmisBaseService.java | 11 +- .../impl/EmisTmsSiteBatchMissServiceImpl.java | 105 ++++++++++++------ .../EmisWaybillAjustApplyServiceImpl.java | 3 + .../service/impl/EmisWaybillServiceImpl.java | 7 +- .../mapper/EmisTmsSiteBatchDtlMapper.xml | 1 + .../mapper/EmisTmsSiteBatchMissMapper.xml | 2 +- .../mapper/EmisTransPlanRuleMapper.xml | 81 +++++++++++++- .../resources/mapper/EmisWaybillMapper.xml | 1 + 10 files changed, 203 insertions(+), 40 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 4a366f643..b49685b38 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 @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.utils.WaybillHelper; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java index 5adeb04bb..004cd7f9c 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java @@ -104,10 +104,11 @@ public interface EmisTransPlanRuleMapper { * 根据产品类型名称查询产品类型信息 * * @param productTypeNames 产品类型名称列表 - * @param code 线路编码 + * @param code 线路编码 * @return 产品类型信息列表 */ - public List> selectProductTypeInfoByNamesAndLineCode(@Param("productTypeNames") List productTypeNames, @Param("lineCode") String code); + public List> selectProductTypeInfoByNamesAndLineCode( + @Param("productTypeNames") List productTypeNames, @Param("lineCode") String code); /** * 根据网点名称查询网点信息 @@ -139,4 +140,30 @@ public interface EmisTransPlanRuleMapper { * @return */ List selectEmisTransPlanRuleByLineCodes(@Param("lineCodes") List lineCodes); + + /** + * + * @param emisTransPlanRule + * @return + */ + List selectRulesForAllScan(EmisTransPlanRule emisTransPlanRule); + + /** + * 分页查询供应商线路规划(多线程用) + * + * @param emisTransPlanRule 查询条件 + * @param offset 偏移量 + * @param limit 每页数量 + * @return 供应商线路规划集合 + */ + List selectRulesForAllScanPaged(@Param("emisTransPlanRule") EmisTransPlanRule emisTransPlanRule, + @Param("offset") int offset, @Param("limit") int limit); + + /** + * 查询总数(多线程分页用) + * + * @param emisTransPlanRule 查询条件 + * @return 总数 + */ + int countForAllScan(EmisTransPlanRule emisTransPlanRule); } \ No newline at end of file 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 f3f92452d..c556ecbb0 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 @@ -4788,6 +4788,10 @@ public class EmisBaseService { } updateMasterWaybill(emisWaybillSave); // 做问题件录入 + scanProblemInfo(emisWaybillSave); + } + + public void scanProblemInfo(EmisWaybill emisWaybillSave) { String dispatchOrSendManCode = ""; if ("1".equals(emisWaybillSave.getPickupMethod())) { dispatchOrSendManCode = emisWaybillSave.getOperateEmployeeCode(); @@ -4816,7 +4820,7 @@ public class EmisBaseService { emisTmsScanRecordService.scan(scanInfoProm, dispatchOrSendManCode, emisWaybillSave.getSendSiteCode()); } - private void updateMasterWaybill(EmisWaybill emisWaybillSave) throws EmisBizError { + public void updateMasterWaybill(EmisWaybill emisWaybillSave) throws EmisBizError { EmisWaybill masterWaybill = checkVirtualParam(emisWaybillSave); String virtualRemark = masterWaybill.getVirtualRemark(); String virtualBillCode = emisWaybillSave.getBillCode(); @@ -4849,9 +4853,12 @@ public class EmisBaseService { throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不存在"); } if (!emisWaybillSave.getReceiveCountry().equals(masterWaybill.getReceiveCountry()) - || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType())) { + || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType()) || !emisWaybillSave.getProductType().equals(masterWaybill.getProductType())) { throw new EmisBizError(EmisBizErrorType.FAIL, "主单和虚拟单线路不一致"); } + if ("1".equals(masterWaybill.getBlVirtual())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单不能作为主单"); + } List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchListByBillCodes( Lists.newArrayList(Collections.singleton(emisWaybillSave.getMasterBillCode()))); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java index 71b8cfc2c..39b2de422 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java @@ -48,9 +48,6 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements @Autowired private EmisTmsSiteBatchMissRecordMapper emisTmsSiteBatchMissRecordMapper; - private int totalBatchStatusRecords = 0; - private int totalMissRecords = 0; - /** * 查询TMS漏组批次信息 * @@ -142,6 +139,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements int totalProcessed = 0; int successCount = 0; int failCount = 0; + int totalBatchStatusRecords = 0; + int totalMissRecords = 0; List failedBillCodes = new ArrayList<>(); // 获取所有线路规划 @@ -162,7 +161,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements // 先查询所有数据 while (true) { - List waybills = emisWaybillMapper.selectWaybillListBySiteBatchStatus(offset, pageSize,lineCode); + List waybills = emisWaybillMapper.selectWaybillListBySiteBatchStatus(offset, pageSize, + lineCode); if (waybills.isEmpty()) { break; } @@ -192,6 +192,10 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements batches.add(allWaybills.subList(i, end)); } + if (CollectionUtil.isEmpty(batches)) { + return; + } + // 创建新的线程池处理数据 executorService = Executors.newFixedThreadPool(processors); List> processFutures = new ArrayList<>(); @@ -201,44 +205,52 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } // 收集处理结果 + List allBatchStatus = new ArrayList<>(); + List allMissRecords = new ArrayList<>(); for (Future future : processFutures) { try { ProcessResult result = future.get(); successCount += result.getSuccessCount(); failCount += result.getFailCount(); failedBillCodes.addAll(result.getFailedBillCodes()); - - // 批量插入运单组批次状态记录 - if (!result.getBatchStatusList().isEmpty()) { - emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(result.getBatchStatusList()); - totalBatchStatusRecords += result.getBatchStatusList().size(); - } - - // 批量保存漏组记录 - if (!result.getMissRecords().isEmpty()) { - List filteredRecords = result.getMissRecords().stream() - .collect(Collectors.collectingAndThen( - Collectors.toMap( - record -> record.getBillCode() + "_" + record.getMissReason(), - record -> record, - (existing, replacement) -> existing), - map -> new ArrayList<>(map.values()))); - emisTmsSiteBatchMissMapper.batchInsertEmisTmsSiteBatchMiss(filteredRecords); - totalMissRecords += filteredRecords.size(); - } + allBatchStatus.addAll(result.getBatchStatusList()); + allMissRecords.addAll(result.getMissRecords()); } catch (Exception e) { log.error("Error processing batch", e); } } - // 关闭线程池 - executorService.shutdown(); + // 全局去重 + Map batchStatusMap = allBatchStatus.stream() + .collect(Collectors.toMap( + EmisWaybillBatchStatus::getBillCode, + v -> v, + (existing, replacement) -> existing)); + List uniqueBatchStatus = new ArrayList<>(batchStatusMap.values()); + + Map missMap = allMissRecords.stream() + .collect(Collectors.toMap( + r -> r.getBillCode() + "_" + r.getMissReason(), + v -> v, + (existing, replacement) -> existing)); + List uniqueMissRecords = new ArrayList<>(missMap.values()); + + // 批量插入 + if (!uniqueBatchStatus.isEmpty()) { + emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(uniqueBatchStatus); + totalBatchStatusRecords += uniqueBatchStatus.size(); + } + if (!uniqueMissRecords.isEmpty()) { + emisTmsSiteBatchMissMapper.batchInsertEmisTmsSiteBatchMiss(uniqueMissRecords); + totalMissRecords += uniqueMissRecords.size(); + } long endTime = System.currentTimeMillis(); long processTime = endTime - startTime; // 保存扫描记录 - saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes); + saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes, totalBatchStatusRecords, + totalMissRecords); log.info( "Auto scan completed. Total processed: {}, Success: {}, Failed: {}, Time taken: {}ms, Batch status records: {}, Miss records: {}", @@ -253,7 +265,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } private void saveRecord(int totalProcessed, int successCount, int failCount, long processTime, - List failedBillCodes) { + List failedBillCodes, int totalBatchStatusRecords, int totalMissRecords) { EmisTmsSiteBatchMissRecord record = new EmisTmsSiteBatchMissRecord(); record.setTotalProcessed(totalProcessed); record.setSuccessCount(successCount); @@ -385,6 +397,10 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements // 合并相同起始网点和下一网点的批次 Map mergedBatches = new HashMap<>(); for (EmisTmsSiteBatch batch : waybillBatches) { + if (StringUtils.isAnyBlank(batch.getStartSiteCode(), batch.getNextSiteCode(), + batch.getSupplierCode())) { + continue; + } String key = batch.getStartSiteCode() + "_" + batch.getNextSiteCode(); if (mergedBatches.containsKey(key)) { EmisTmsSiteBatch existingBatch = mergedBatches.get(key); @@ -426,11 +442,33 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } public List selectEmisTransPlanRuleTree(String lineCode) { - log.info("Start querying supplier route plan tree"); + log.info("Start querying supplier route plan tree (multi-threaded)"); EmisTransPlanRule emisTransPlanRule = new EmisTransPlanRule(); emisTransPlanRule.setLineCode(lineCode); - List list = emisTransPlanRuleMapper.selectEmisTransPlanRuleList(emisTransPlanRule); - List tree = buildTree(list); + int pageSize = 100; + int total = emisTransPlanRuleMapper.countForAllScan(emisTransPlanRule); + int pageCount = (total + pageSize - 1) / pageSize; + int processors = Runtime.getRuntime().availableProcessors(); + ExecutorService executor = Executors.newFixedThreadPool(processors); + List>> futures = new ArrayList<>(); + for (int i = 0; i < pageCount; i++) { + int offset = i * pageSize; + futures.add(executor.submit( + () -> emisTransPlanRuleMapper.selectRulesForAllScanPaged(emisTransPlanRule, offset, pageSize))); + } + List allRules = new ArrayList<>(); + for (Future> future : futures) { + try { + List rules = future.get(); + if (rules != null) { + allRules.addAll(rules); + } + } catch (Exception e) { + log.error("Error getting trans plan rule results", e); + } + } + executor.shutdown(); + List tree = buildTree(allRules); log.info("Queried supplier route plan tree, node count={}", tree != null ? tree.size() : 0); return tree; } @@ -518,7 +556,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } private boolean checkRule(EmisTransPlanRule rule, List waybillBatches, - List list) { + List list) { // 检查当前节点是否匹配 boolean currentMatch = false; for (EmisTmsSiteBatch batch : waybillBatches) { @@ -617,7 +655,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements * 递归检查下一级节点 */ private boolean checkNextLevel(Set currentLevelRules, - List waybillBatches, List list) { + List waybillBatches, List list) { // 如果当前级为空,说明已经到底了,返回true if (currentLevelRules.isEmpty()) { return true; @@ -708,7 +746,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements .anyMatch( filterRule -> filterRule.getStartSiteCode().equals(childRule.getStartSiteCode()) && filterRule.getNextSiteCode().equals(childRule.getNextSiteCode()) && - compareSupplierCodes(filterRule.getSupplierCode(), childRule.getSupplierCode()))); + compareSupplierCodes(filterRule.getSupplierCode(), + childRule.getSupplierCode()))); if (!hasMatchedChild) { // 如果所有子节点都不匹配,为每个子节点创建漏组记录 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 9089c8cfe..262c6ae57 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 @@ -140,6 +140,9 @@ public class EmisWaybillAjustApplyServiceImpl extends EmisBaseService implements checkUseQuotaCredit(emisWaybillOld, getEmisWaybillNewFromJson(emisWaybillAjustApply)); } + // 校验虚拟单逻辑 + checkVirtualParam(getEmisWaybillNewFromJson(emisWaybillAjustApply)); + // 插入数据 emisWaybillAjustApplyMapper.insertEmisWaybillAjustApply(emisWaybillAjustApply); 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 21ab3699e..e73691faa 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 @@ -3116,6 +3116,11 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb // 检查信用额度 checkUseQuotaCredit(null,emisWaybillSave); + // 虚拟件逻辑 + if ("1".equals(emisWaybillSave.getBlVirtual())) { + updateMasterWaybill(emisWaybillSave); + } + //插入新单 emisWaybillMapper.insertEmisWaybill(emisWaybillSave); @@ -3220,7 +3225,7 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb } // 处理虚拟件逻辑 - handleVirtual(emisWaybillSave); + scanProblemInfo(emisWaybillSave); // 运单立即重新出账 try { diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml index c0cc5735f..9db188fac 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml @@ -191,5 +191,6 @@ left join emis_tms_site_batch_dtl b on a.bill_code = b.bill_code and b.del_flag = '0' where b.batch_no = #{batchNo} and a.del_flag = '0' + and a.send_date ]]> '2025-01-01 00:00:00' \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml index 0658a1fa4..4005615bf 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml @@ -154,7 +154,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - AND m.bill_code = #{billCode} + AND m.bill_code REGEXP REPLACE(#{billCode}, '\n', '|') AND m.miss_reason like concat('%', #{missReason}, '%') diff --git a/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml b/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml index 8535ab645..334bf7eaa 100644 --- a/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml @@ -61,8 +61,46 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by id desc + + + + + + \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml index d6f9894ad..d71892e5f 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml @@ -3763,6 +3763,7 @@ and a.trans_line_type = #{lineCode} + and a.send_date ]]> '2025-01-01 00:00:00' and (a.virtual_remark is null or virtual_remark = '') order by a.create_time desc limit #{offset}, #{pageSize} From 5dd79f74f7291cdfb6812505fd76d848a0ba537d Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Sat, 21 Jun 2025 15:40:02 +0800 Subject: [PATCH 06/10] =?UTF-8?q?demand:=20=E6=96=B0=E5=A2=9E=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=9A=E5=A7=8B=E5=8F=91=E7=BD=91=E7=82=B9=20?= =?UTF-8?q?=E7=BD=91=E7=82=B9=E8=A1=A8=E5=B7=B2=E5=90=AF=E7=94=A8=E7=BD=91?= =?UTF-8?q?=E7=82=B9=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xdadan/erp/emis/domain/EmisWaybill.java | 4 ++++ .../erp/emis/domain/EmisWaybillAjustApply.java | 2 ++ .../xdadan/erp/emis/domain/vo/WaybillOrder.java | 6 ++++++ .../xdadan/erp/emis/service/EmisBaseService.java | 13 ++++++------- .../impl/EmisWaybillAjustApplyServiceImpl.java | 6 +++--- .../service/impl/EmisWaybillServiceImpl.java | 16 ++++++++++++++-- .../main/resources/mapper/EmisWaybillMapper.xml | 9 ++++++++- 7 files changed, 43 insertions(+), 13 deletions(-) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java index ea1f5902e..8d316a266 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybill.java @@ -408,6 +408,10 @@ public class EmisWaybill extends BaseEntity private String takePieceEmployeeCode; /* 发件网点代码 */ private String sendSiteCode; + /* 始发网点代码 */ + private String startSiteCode; + /* 始发网点名称 */ + private String startSiteName; /* 发件财务中心代码 */ private String sendCenterCode; /* 发货时间 - 取本地时间 */ diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAjustApply.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAjustApply.java index d4c33611a..e1ec1a602 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAjustApply.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWaybillAjustApply.java @@ -46,6 +46,8 @@ public class EmisWaybillAjustApply extends BaseEntity private String applyManCode; /* 申请站点代码 */ private String applySiteCode; + /* 始发网点代码 */ + private String startSiteCode; /* 申请财务中心编码 */ private String applyFinanceCenterCode; /* 申请时间 */ diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java index ebb4a07c6..af6d05767 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java @@ -212,6 +212,10 @@ public class WaybillOrder implements Serializable { /* 发件网点代码 */ private String sendSiteCode; + /* 始发网点代码 */ + private String startSiteCode; + /* 始发网点名称 */ + private String startSiteName; /* 派件人代码 */ private String dispatchManCode; @@ -882,6 +886,8 @@ public class WaybillOrder implements Serializable { // dbWaybill.setRegisterManCode(this.getRegisterManCode()); dbWaybill.setTakePieceEmployeeCode(this.getTakePieceEmployeeCode()); dbWaybill.setSendSiteCode(this.getSendSiteCode()); + dbWaybill.setStartSiteCode(this.getStartSiteCode()); + dbWaybill.setStartSiteName(this.getStartSiteName()); dbWaybill.setSendDate(this.getSendDate()); dbWaybill.setSendSiteName(this.getSendSiteName()); 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 c556ecbb0..b296bc070 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,9 +193,6 @@ public class EmisBaseService { @Autowired private EmisTmsSiteBatchMissRecordMapper emisTmsSiteBatchMissRecordMapper; - private int totalBatchStatusRecords = 0; - private int totalMissRecords = 0; - private static SysUser emptySysUser = new SysUser(); static { @@ -4235,9 +4232,11 @@ public class EmisBaseService { } emisTmsSiteBatchMissMapper.deleteByBillCodes(billCodes); long startTime = System.currentTimeMillis(); - int totalProcessed = 0; + int totalProcessed = emisWaybills.size(); int successCount = 0; int failCount = 0; + int totalBatchStatusRecords = 0; + int totalMissRecords = 0; List failedBillCodes = new ArrayList<>(); // 获取所有线路规划 @@ -4259,7 +4258,7 @@ public class EmisBaseService { // 批量插入运单组批次状态记录 if (!result.getBatchStatusList().isEmpty()) { -// emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(result.getBatchStatusList()); + emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(result.getBatchStatusList()); totalBatchStatusRecords += result.getBatchStatusList().size(); } @@ -4280,7 +4279,7 @@ public class EmisBaseService { long processTime = endTime - startTime; // 保存扫描记录 - saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes); + saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes,totalBatchStatusRecords,totalMissRecords); log.info( "Auto scan completed. Total processed: {}, Success: {}, Failed: {}, Time taken: {}ms, Batch status records: {}, Miss records: {}", @@ -4295,7 +4294,7 @@ public class EmisBaseService { } private void saveRecord(int totalProcessed, int successCount, int failCount, long processTime, - List failedBillCodes) { + List failedBillCodes, int totalBatchStatusRecords, int totalMissRecords) { EmisTmsSiteBatchMissRecord record = new EmisTmsSiteBatchMissRecord(); record.setTotalProcessed(totalProcessed); record.setSuccessCount(successCount); 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 262c6ae57..0e7364525 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 @@ -359,6 +359,9 @@ public class EmisWaybillAjustApplyServiceImpl extends EmisBaseService implements throw new EmisBizError(EmisBizErrorType.FAIL,"单号不存在!"); } + // 处理虚拟件逻辑 + handleVirtualForUpdate(emisWaybillSave, emisWaybillOld); + recordWaybillOperLog( emisWaybillAjustApply.getBillCode(), WaybillOperLogType.SITE_MODIFY_APPLY, @@ -385,9 +388,6 @@ public class EmisWaybillAjustApplyServiceImpl extends EmisBaseService implements emisCommissionDtlMapper.deleteEmisCommissionDtlByBillCode(emisWaybillSave.getBillCode()); } - // 处理虚拟件逻辑 - handleVirtualForUpdate(emisWaybillSave, emisWaybillOld); - // 审核通过 emisWaybillAjustApplyMapper.auditCenterPass(emisWaybillAjustApply); 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 e73691faa..d9ff0287f 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 @@ -871,6 +871,16 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb // throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "货值必填"); } + // 始发网点 + if(StringUtil.isBlank(emisWaybillSave.getStartSiteName())){ + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "始发网点不能为空"); + } + EmisSite site = getSiteByName(emisWaybillSave.getStartSiteName()); + if(site==null){ + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS, "始发网点不正确"); + } + emisWaybillSave.setStartSiteCode(site.getSiteCode()); + // 线路转换 EmisTransLine transLine=getTransLineByName(emisWaybillSave.getTransLineType()); if(transLine==null){ @@ -3224,8 +3234,10 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb e.printStackTrace(); } - // 处理虚拟件逻辑 - scanProblemInfo(emisWaybillSave); + // 问题件逻辑 + if ("1".equals(emisWaybillSave.getBlVirtual())) { + scanProblemInfo(emisWaybillSave); + } // 运单立即重新出账 try { diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml index d71892e5f..ae26f01b5 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml @@ -12,6 +12,8 @@ + + @@ -292,7 +294,7 @@ a.id,a.order_sn, a.cust_order_id, a.bill_code, a.order_status, a.waybill_status, a.order_type, a.order_date, a.user_id, a.customer_code, a.customer_name, a.open_id, a.receive_name, a.receive_company, a.receive_mobile, a.receive_tel, a.receive_country, a.receive_province, a.receive_city, - a.receive_county, a.receive_town, a.receive_address, a.receive_postcode, a.receive_pcd, a.send_name, a.send_company, + a.receive_county, a.receive_town, a.receive_address, a.receive_postcode, a.receive_pcd, a.send_name, a.send_company,a.start_site_code, a.send_mobile, a.send_tel, a.send_country, a.send_province, a.send_city, a.send_county, a.send_town, a.send_address, a.send_postcode, a.send_pcd, a.payment_type, a.calc_fee_type, a.cust_no, a.cust_name, a.trans_line_type, a.product_type, a.time_type, a.meter_type, a.carry_type, a.customs_clear, a.customs_eclaration, a.estimate_date, a.pack_type, a.dispatch_method, @@ -341,6 +343,7 @@ w.site_name as current_site_name, x.site_name as next_site_name, y.site_name as last_site_name, + start.site_name as start_site_name, z.type_name as problem_type_name, k.trans_type as trans_type @@ -378,6 +381,7 @@ left join emis_site a1 on a.send_center_code=a1.site_code and a1.del_flag='0' left join emis_site a2 on a.destination_center_code=a2.site_code and a2.del_flag='0' + left join emis_site start on a.start_site_code=start.site_code and start.del_flag='0' left join emis_customer_user a3 on a.customer_code=a3.customer_code and a3.del_flag='0' left join emis_site seaway1 on a.departure_port=seaway1.site_code and seaway1.del_flag='0' left join emis_site seaway2 on a.destination_port=seaway2.site_code and seaway2.del_flag='0' @@ -2702,6 +2706,7 @@ bill_code_sub, order_status, waybill_status, + start_site_code, order_type, order_date, user_id, @@ -2887,6 +2892,7 @@ #{billCodeSub}, #{orderStatus}, #{waybillStatus}, + #{startSiteCode}, #{orderType}, #{orderDate}, #{userId}, @@ -3074,6 +3080,7 @@ bill_code_sub = #{billCodeSub}, order_status = #{orderStatus}, waybill_status = #{waybillStatus}, + start_site_code = #{startSiteCode}, order_type = #{orderType}, order_date = #{orderDate}, user_id = #{userId}, From 467839d750bd85da4019a4f116b6dd774d088f0c Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Sat, 21 Jun 2025 17:26:40 +0800 Subject: [PATCH 07/10] =?UTF-8?q?demand:=20=20TMS=E7=B3=BB=E7=BB=9F=20-=20?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86=20-=20=E7=8E=B0=E9=87=91?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E9=A2=9D=E5=BA=A6=20-=20=E8=B6=85=E6=9C=9F?= =?UTF-8?q?=E5=B7=B2=E7=94=A8=E9=A2=9D=E5=BA=A6=20=E4=B8=8E=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E6=98=8E=E7=BB=86=E5=8D=95=E5=8F=B7=E8=BF=90=E8=B4=B9?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=9B=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- emis-biz/src/main/resources/mapper/EmisCreditSalesmenMapper.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/emis-biz/src/main/resources/mapper/EmisCreditSalesmenMapper.xml b/emis-biz/src/main/resources/mapper/EmisCreditSalesmenMapper.xml index 2e59897f1..bc6958f55 100644 --- a/emis-biz/src/main/resources/mapper/EmisCreditSalesmenMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisCreditSalesmenMapper.xml @@ -175,6 +175,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.trans_line_type=c.line_code and a.payee=#{salesmen} and FIND_IN_SET(c.trans_type,#{transType}) + and FIND_IN_SET(a.payment_status,'0,2') and a.send_date ]]> #{startDate} and a.send_date #{endDate} From 659179197a9ab2bd45f7808427203370c32fc721 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Mon, 23 Jun 2025 14:07:08 +0800 Subject: [PATCH 08/10] =?UTF-8?q?demand:=20=20TMS=E7=B3=BB=E7=BB=9F=20-=20?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86=20-=20=E7=8E=B0=E9=87=91?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E9=A2=9D=E5=BA=A6=20-=20=E8=B6=85=E6=9C=9F?= =?UTF-8?q?=E5=B7=B2=E7=94=A8=E9=A2=9D=E5=BA=A6=20=E4=B8=8E=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E6=98=8E=E7=BB=86=E5=8D=95=E5=8F=B7=E8=BF=90=E8=B4=B9?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=9B=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/emis/domain/vo/WaybillOrder.java | 2 ++ .../erp/emis/service/EmisBaseService.java | 17 +++++++---- .../EmisWaybillAjustApplyServiceImpl.java | 4 ++- .../service/impl/EmisWaybillServiceImpl.java | 2 +- .../resources/mapper/EmisWaybillMapper.xml | 30 +++++++++++++------ 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java index af6d05767..f36fe3f16 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/WaybillOrder.java @@ -456,6 +456,8 @@ public class WaybillOrder implements Serializable { voItem.setDeclareGoodsList(declareGoodsCvt.cvtToVoList(dbDecareGoodsList)); voItem.setDeclareAttachmentList(declareAttachmentCvt.cvtToVoList(dbDeclareAttachmentList)); + voItem.setStartSiteCode(dbWaybill.getStartSiteCode()); + voItem.setStartSiteName(dbWaybill.getStartSiteName()); // 收件人 Reciever reciever = new Reciever(); 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 b296bc070..4e0d40b92 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 @@ -4781,11 +4781,11 @@ public class EmisBaseService { } } - public void handleVirtual(EmisWaybill emisWaybillSave) throws EmisBizError { + public void handleVirtual(EmisWaybill emisWaybillSave,EmisWaybill emisWaybillOld) throws EmisBizError { if (!"1".equals(emisWaybillSave.getBlVirtual())) { return; } - updateMasterWaybill(emisWaybillSave); + updateMasterWaybill(emisWaybillSave,emisWaybillOld); // 做问题件录入 scanProblemInfo(emisWaybillSave); } @@ -4819,8 +4819,8 @@ public class EmisBaseService { emisTmsScanRecordService.scan(scanInfoProm, dispatchOrSendManCode, emisWaybillSave.getSendSiteCode()); } - public void updateMasterWaybill(EmisWaybill emisWaybillSave) throws EmisBizError { - EmisWaybill masterWaybill = checkVirtualParam(emisWaybillSave); + public void updateMasterWaybill(EmisWaybill emisWaybillSave,EmisWaybill emisWaybillOld) throws EmisBizError { + EmisWaybill masterWaybill = checkVirtualParam(emisWaybillSave, emisWaybillOld); String virtualRemark = masterWaybill.getVirtualRemark(); String virtualBillCode = emisWaybillSave.getBillCode(); String virtualBillCodeLastSix = virtualBillCode.substring(virtualBillCode.length() - 6); @@ -4839,7 +4839,7 @@ public class EmisBaseService { emisWaybillMapper.updateEmisWaybill(emisWaybill); } - public EmisWaybill checkVirtualParam(EmisWaybill emisWaybillSave) throws EmisBizError { + public EmisWaybill checkVirtualParam(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) throws EmisBizError { if (StringUtil.isBlank(emisWaybillSave.getMasterBillCode())) { throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不能为空"); } @@ -4858,6 +4858,11 @@ public class EmisBaseService { if ("1".equals(masterWaybill.getBlVirtual())) { throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单不能作为主单"); } + if (emisWaybillOld == null || !"1".equals(emisWaybillOld.getBlVirtual())) { + if (masterWaybill.getVirtualRemark().split(",").length >= masterWaybill.getParcelQty()) { + throw new EmisBizError(EmisBizErrorType.FAIL, emisWaybillSave.getMasterBillCode() + "最多只能绑定" + masterWaybill.getParcelQty() + "个虚拟单"); + } + } List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchListByBillCodes( Lists.newArrayList(Collections.singleton(emisWaybillSave.getMasterBillCode()))); @@ -4869,7 +4874,7 @@ public class EmisBaseService { public void handleVirtualForUpdate(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) throws EmisBizError { if (!StringUtils.isEmpty(emisWaybillSave.getBlVirtual()) && "1".equals(emisWaybillSave.getBlVirtual())) { - handleVirtual(emisWaybillSave); + handleVirtual(emisWaybillSave,emisWaybillOld); } else { String masterBillCode = emisWaybillOld.getMasterBillCode(); if (StringUtil.isNotBlank(masterBillCode)) { 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 0e7364525..1a2a6dcdb 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 @@ -141,7 +141,9 @@ public class EmisWaybillAjustApplyServiceImpl extends EmisBaseService implements } // 校验虚拟单逻辑 - checkVirtualParam(getEmisWaybillNewFromJson(emisWaybillAjustApply)); + if ("1".equals(getEmisWaybillNewFromJson(emisWaybillAjustApply).getBlVirtual())) { + checkVirtualParam(getEmisWaybillNewFromJson(emisWaybillAjustApply),emisWaybillOld); + } // 插入数据 emisWaybillAjustApplyMapper.insertEmisWaybillAjustApply(emisWaybillAjustApply); 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 d9ff0287f..548ff7fa9 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 @@ -3128,7 +3128,7 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb // 虚拟件逻辑 if ("1".equals(emisWaybillSave.getBlVirtual())) { - updateMasterWaybill(emisWaybillSave); + updateMasterWaybill(emisWaybillSave,null); } //插入新单 diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml index ae26f01b5..85bf867b7 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml @@ -392,7 +392,7 @@ select - a.id,a.order_sn, a.cust_order_id, a.bill_code,a.bill_code_sub, a.order_status, a.waybill_status,a.bl_virtual,a.master_bill_code,a.virtual_remark, + a.id,a.order_sn, a.cust_order_id, a.bill_code,a.bill_code_sub, a.order_status, a.waybill_status,a.bl_virtual,a.master_bill_code,a.virtual_remark,a.start_site_code, a.order_type, a.order_date, a.user_id, a.customer_code, a.customer_name, a.open_id, a.receive_name, a.receive_company, a.receive_mobile, a.receive_tel, a.receive_country, a.receive_province, a.receive_city, a.receive_county, a.receive_town, a.receive_address, a.receive_postcode, a.receive_pcd, a.send_name, a.send_company, @@ -445,6 +445,7 @@ x.site_name as next_site_name, y.site_name as last_site_name, z.type_name as problem_type_name, + start.site_name as start_site_name, k.trans_type as trans_type @@ -485,6 +486,7 @@ left join emis_customer_user a3 on a.customer_code=a3.customer_code and a3.del_flag='0' left join emis_site seaway1 on a.departure_port=seaway1.site_code and seaway1.del_flag='0' left join emis_site seaway2 on a.destination_port=seaway2.site_code and seaway2.del_flag='0' + left join emis_site start on a.start_site_code=start.site_code and start.del_flag='0' @@ -568,17 +570,27 @@ From 413aefda368710914329f6345204a2fbdbd0da99 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Mon, 23 Jun 2025 20:04:55 +0800 Subject: [PATCH 10/10] =?UTF-8?q?demand:=20=20TMS=E7=B3=BB=E7=BB=9F=20-=20?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86=20-=20=E7=8E=B0=E9=87=91?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E9=A2=9D=E5=BA=A6=20-=20=E8=B6=85=E6=9C=9F?= =?UTF-8?q?=E5=B7=B2=E7=94=A8=E9=A2=9D=E5=BA=A6=20=E4=B8=8E=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E6=98=8E=E7=BB=86=E5=8D=95=E5=8F=B7=E8=BF=90=E8=B4=B9?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=EF=BC=9B=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/emis/service/EmisBaseService.java | 103 +++++++++++------- .../service/impl/EmisWaybillServiceImpl.java | 60 +++++++--- .../resources/mapper/EmisWaybillMapper.xml | 10 +- 3 files changed, 110 insertions(+), 63 deletions(-) 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 5a889a3f5..b39f011a9 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 @@ -2845,7 +2845,13 @@ public class EmisBaseService { } if (StringUtil.isNotBlank(waybill.getVirtualRemark())) { - remark = remark + " " + "该运单为主单,对应虚拟单为" + waybill.getVirtualRemark(); + // 取每个虚拟单号的后六位,用逗号拼接 + String[] codes = waybill.getVirtualRemark().split(","); + String shortCodes = Arrays.stream(codes) + .filter(s -> s != null && s.length() >= 6) + .map(s -> s.substring(s.length() - 6)) + .collect(Collectors.joining(",")); + remark = remark + " " + "该运单为主单,对应虚拟单为" + shortCodes; } // if (StringUtil.isNotBlank(waybill.getMasterBillCode())) { // remark = remark + " " + "该运单为虚拟单,对应主单为" + waybill.getMasterBillCode(); @@ -4787,10 +4793,10 @@ public class EmisBaseService { } updateMasterWaybill(emisWaybillSave,emisWaybillOld); // 做问题件录入 - scanProblemInfo(emisWaybillSave); + scanProblemInfo(emisWaybillSave,emisWaybillOld); } - public void scanProblemInfo(EmisWaybill emisWaybillSave) { + public void scanProblemInfo(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) { String dispatchOrSendManCode = ""; if ("1".equals(emisWaybillSave.getPickupMethod())) { dispatchOrSendManCode = emisWaybillSave.getOperateEmployeeCode(); @@ -4812,7 +4818,11 @@ public class EmisBaseService { scanDatePromItem.put("remark", "返货虚拟面单"); } scanDatePromItem.put("notifySite", emisWaybillSave.getSendSiteCode()); - scanDatePromItem.put("scanDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, emisWaybillSave.getSendDate())); + if (null == emisWaybillOld) { + scanDatePromItem.put("scanDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, emisWaybillSave.getSendDate())); + } else { + scanDatePromItem.put("scanDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getNowDate())); + } scanDatePromItem.put("scanWeight", "0.0"); scanDataPromList.add(scanDatePromItem); scanInfoProm.setScanData(scanDataPromList); @@ -4839,45 +4849,54 @@ public class EmisBaseService { emisWaybillMapper.updateEmisWaybill(emisWaybill); } - public EmisWaybill checkVirtualParam(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) throws EmisBizError { - if (StringUtil.isBlank(emisWaybillSave.getMasterBillCode())) { - throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不能为空"); - } - if (!"002".equals(emisWaybillSave.getTransLineType()) && !"012".equals(emisWaybillSave.getTransLineType()) - && !"014".equals(emisWaybillSave.getTransLineType())) { - throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单只支持线路为缅甸快递/缅甸快递进口/柬埔寨快递进口"); - } - EmisWaybill masterWaybill = emisWaybillMapper - .selectEmisWaybillByBillCode(emisWaybillSave.getMasterBillCode()); - if (Objects.isNull(masterWaybill)) { - throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不存在"); - } - if (!emisWaybillSave.getReceiveCountry().equals(masterWaybill.getReceiveCountry()) - || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType()) - || !emisWaybillSave.getProductType().equals(masterWaybill.getProductType())) { - throw new EmisBizError(EmisBizErrorType.FAIL, "主单和虚拟单线路不一致"); - } - if ("1".equals(masterWaybill.getBlVirtual())) { - throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单不能作为主单"); - } - if (!emisWaybillSave.getMasterBillCode().equals(emisWaybillOld.getMasterBillCode())) { - String virtualRemark = masterWaybill.getVirtualRemark() == null ? "" : masterWaybill.getVirtualRemark(); - long count = Arrays.stream(virtualRemark.split(",")) - .filter(s -> s != null && !s.trim().isEmpty()) - .count(); - if (count >= masterWaybill.getParcelQty()) { - throw new EmisBizError(EmisBizErrorType.FAIL, - emisWaybillSave.getMasterBillCode() + "最多只能绑定" + masterWaybill.getParcelQty() + "个虚拟单"); - } - } + public EmisWaybill checkVirtualParam(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) throws EmisBizError { + if (StringUtil.isBlank(emisWaybillSave.getMasterBillCode())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不能为空"); + } + if(StringUtil.isNotBlank(emisWaybillOld.getVirtualRemark())){ + throw new EmisBizError(EmisBizErrorType.FAIL, "主单不能改虚拟单"); + } + if (emisWaybillSave.getParcelQty() != 1) { + throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单件数只能为1"); + } + if (emisWaybillSave.getMasterBillCode().equals(emisWaybillSave.getBillCode())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "运单号主单号不能相同"); + } + if (!"002".equals(emisWaybillSave.getTransLineType()) && !"012".equals(emisWaybillSave.getTransLineType()) + && !"014".equals(emisWaybillSave.getTransLineType())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单只支持线路为缅甸快递/缅甸快递进口/柬埔寨快递进口"); + } + EmisWaybill masterWaybill = emisWaybillMapper + .selectMasterWaybillByBillCode(emisWaybillSave.getMasterBillCode()); + if (Objects.isNull(masterWaybill)) { + throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不存在"); + } + if (!emisWaybillSave.getReceiveCountry().equals(masterWaybill.getReceiveCountry()) + || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType()) + || !emisWaybillSave.getProductType().equals(masterWaybill.getProductType())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "主单和虚拟单线路不一致"); + } + if ("1".equals(masterWaybill.getBlVirtual())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单不能作为主单"); + } + if (!emisWaybillSave.getMasterBillCode().equals(emisWaybillOld.getMasterBillCode())) { + String virtualRemark = masterWaybill.getVirtualRemark() == null ? "" : masterWaybill.getVirtualRemark(); + long count = Arrays.stream(virtualRemark.split(",")) + .filter(s -> s != null && !s.trim().isEmpty()) + .count(); + if (count >= masterWaybill.getParcelQty()) { + throw new EmisBizError(EmisBizErrorType.FAIL, + emisWaybillSave.getMasterBillCode() + "最多只能绑定" + masterWaybill.getParcelQty() + "个虚拟单"); + } + } - List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchListByBillCodes( - Lists.newArrayList(Collections.singleton(emisWaybillSave.getMasterBillCode()))); - if (CollectionUtil.isNotEmpty(batchList)) { - throw new EmisBizError(EmisBizErrorType.FAIL, "该单号已经录入批次,请先在组批次中剔除该运单"); - } - return masterWaybill; - } + List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchListByBillCodes( + Lists.newArrayList(Collections.singleton(emisWaybillSave.getMasterBillCode()))); + if (CollectionUtil.isNotEmpty(batchList)) { + throw new EmisBizError(EmisBizErrorType.FAIL, "该单号已经录入批次,请先在组批次中剔除该运单"); + } + return masterWaybill; + } public void handleVirtualForUpdate(EmisWaybill emisWaybillSave, EmisWaybill emisWaybillOld) throws EmisBizError { if (!StringUtils.isEmpty(emisWaybillSave.getBlVirtual()) && "1".equals(emisWaybillSave.getBlVirtual())) { 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 ffe6aef3d..0fdeb703b 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 @@ -3236,7 +3236,7 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb // 问题件逻辑 if ("1".equals(emisWaybillSave.getBlVirtual())) { - scanProblemInfo(emisWaybillSave); + scanProblemInfo(emisWaybillSave, null); } // 运单立即重新出账 @@ -5895,7 +5895,7 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb if (StringUtils.isNotEmpty(remark)) { String masterBillCode = extractMasterBillCode(remark); if (StringUtil.isBlank(masterBillCode)) { - masterBillCode=extractMasterBillCode(waybill.getFeeRemark()); + masterBillCode = extractMasterBillCode(waybill.getFeeRemark()); } if (StringUtil.isBlank(masterBillCode)) { failedBillCodes.add(waybill.getBillCode()); @@ -5918,30 +5918,55 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb } } - handleProblem(failedBillCodes, filterForProblemCodes, failedBills,successCount,failCount); + // 修正:handleProblem返回统计结果 + ProblemHandleResult problemResult = handleProblem(failedBillCodes, filterForProblemCodes, failedBills, + successCount, failCount); + if (problemResult != null) { + successCount = problemResult.successCount; + failCount = problemResult.failCount; + filterForProblemCodes = problemResult.filterForProblemCodes; + } long endTime = System.currentTimeMillis(); long processTime = endTime - startTime; - log.debug("处理完成,总处理数:{},成功数:{},失败数:{},耗时:{}ms", - totalProcessed, successCount, failCount, processTime); + log.debug("处理完成,总处理数:{},成功数:{},失败数:{},耗时:{}ms", totalProcessed, successCount, failCount, processTime); if (CollectionUtil.isNotEmpty(failedBillCodes)) { - log.debug("Failed bill codes: {}", failedBillCodes); + log.debug("Failed bill codes ({}): {}", failedBillCodes.size(), failedBillCodes); } if (CollectionUtil.isNotEmpty(filterForProblemCodes)) { - log.debug("Failed for problemCodes: {}", filterForProblemCodes); + log.debug("Failed for problemCodes ({}): {}", filterForProblemCodes.size(), filterForProblemCodes); } } catch (Exception e) { log.error("Error in autoScanSiteBatch", e); } } - private void handleProblem(List failedBillCodes, List filterForProblemCodes, List failedBills, int successCount, int failCount) { - List emisWaybillProblemInfos = emisWaybillProblemInfoMapper.selectEmisWaybillProblemInfoByBillCodes(failedBillCodes); - if(emisWaybillProblemInfos==null){ + // 新增内部类用于返回统计结果 + private static class ProblemHandleResult { + int successCount; + int failCount; + List filterForProblemCodes; + + ProblemHandleResult(int successCount, int failCount, List filterForProblemCodes) { + this.successCount = successCount; + this.failCount = failCount; + this.filterForProblemCodes = filterForProblemCodes; + } + } + + // 修改handleProblem返回统计结果 + private ProblemHandleResult handleProblem(List failedBillCodes, List filterForProblemCodes, + List failedBills, int successCount, int failCount) { + if (CollectionUtil.isEmpty(failedBillCodes)) { + return new ProblemHandleResult(successCount, failCount, filterForProblemCodes); + } + List emisWaybillProblemInfos = emisWaybillProblemInfoMapper + .selectEmisWaybillProblemInfoByBillCodes(failedBillCodes); + if (emisWaybillProblemInfos == null) { log.error("emisWaybillProblemInfos is null"); - return; + return new ProblemHandleResult(successCount, failCount, filterForProblemCodes); } for (EmisWaybillProblemInfo emisWaybillProblemInfo : emisWaybillProblemInfos) { try { @@ -5955,7 +5980,9 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb filterForProblemCodes.add(emisWaybillProblemInfo.getBillCode()); continue; } - List fiterBills = failedBills.stream().filter(i -> i.getBillCode().equals(emisWaybillProblemInfo.getBillCode())).collect(Collectors.toList()); + List fiterBills = failedBills.stream() + .filter(i -> i.getBillCode().equals(emisWaybillProblemInfo.getBillCode())) + .collect(Collectors.toList()); EmisWaybill waybill = new EmisWaybill(); waybill.setMasterBillCode(masterBillCode); waybill.setId(fiterBills.get(0).getId()); @@ -5968,8 +5995,8 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb log.error("处理问题件失败,运单号:{},错误:{}", emisWaybillProblemInfo.getBillCode(), e.getMessage()); filterForProblemCodes.add(emisWaybillProblemInfo.getBillCode()); } - } + return new ProblemHandleResult(successCount, failCount, filterForProblemCodes); } private void updateWaybill(EmisWaybill virtualWaybill) { @@ -5977,15 +6004,14 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb .selectMasterWaybillByBillCode(virtualWaybill.getMasterBillCode()); String virtualRemark = masterWaybill.getVirtualRemark(); String virtualBillCode = virtualWaybill.getBillCode(); - String virtualBillCodeLastSix = virtualBillCode.substring(virtualBillCode.length() - 6); if (StringUtil.isNotBlank(virtualRemark)) { Set virtualBillSet = new LinkedHashSet<>(); String[] codes = virtualRemark.split(","); virtualBillSet.addAll(Arrays.asList(codes)); - virtualBillSet.add(virtualBillCodeLastSix); + virtualBillSet.add(virtualBillCode); virtualRemark = String.join(",", virtualBillSet); } else { - virtualRemark = virtualBillCodeLastSix; + virtualRemark = virtualBillCode; } EmisWaybill updateMasterWaybill = new EmisWaybill(); updateMasterWaybill.setVirtualRemark(virtualRemark); @@ -6016,7 +6042,7 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb } // 新规则:查找主单相关关键词后的内容,直到最后一位数字为止,且不能包含汉字 - String[] keywords = {"主单为", "主单是", "主单位", "主单号", "主单","真实单号"}; + String[] keywords = { "主单为", "主单是", "主单位", "主单号", "主单", "真实单号" }; for (String keyword : keywords) { int idx = remark.indexOf(keyword); if (idx != -1) { diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml index 1c1dc6088..36d700ee6 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml @@ -503,9 +503,9 @@ @@ -584,6 +584,8 @@ and a.bill_code like concat('%', #{billCode}, '%') + and a.order_status != '0' + and a.order_status != '2' @@ -3794,8 +3796,8 @@ from emis_waybill a where a.del_flag = '0' and a.problem_type in (173,170) - and master_bill_code is null --- and a.bill_code ='7080300044761' + and (master_bill_code is null or master_bill_code='') +-- and a.bill_code ='T708030039025903' order by a.create_time desc limit #{offset}, #{pageSize}