diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCustomerUserController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCustomerUserController.java index d65b12235..95821223b 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCustomerUserController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisCustomerUserController.java @@ -485,7 +485,7 @@ public class EmisCustomerUserController extends EmisBaseController */ @PreAuthorize("@ss.hasPermi('emis:emisCustomerUser:monthlyShipmentStat')") @GetMapping("/monthlyShipmentStat") - public TableDataInfo monthlyShipmentStat(EmisWaybill emisWaybill) { + public TableDataInfo monthlyShipmentStat(EmisWaybill emisWaybill) throws EmisBizError { startPage(); // 设置权限参数 setPrivParams(emisWaybill); @@ -513,7 +513,7 @@ public class EmisCustomerUserController extends EmisBaseController @PreAuthorize("@ss.hasPermi('emis:emisCustomerUser:export')") @Log(title = "月结客户出货统计", businessType = BusinessType.EXPORT) @PostMapping("/exportMonthlyShipmentStat") - public void exportMonthlyShipmentStat(HttpServletResponse response, EmisWaybill emisWaybill) { + public void exportMonthlyShipmentStat(HttpServletResponse response, EmisWaybill emisWaybill) throws EmisBizError { // 设置权限参数 setPrivParams(emisWaybill); List list = emisCustomerUserService diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/MonthlyCustomerShipmentStatVO.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/MonthlyCustomerShipmentStatVO.java index 5bed08112..c2ba0f794 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/MonthlyCustomerShipmentStatVO.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/vo/MonthlyCustomerShipmentStatVO.java @@ -40,6 +40,12 @@ public class MonthlyCustomerShipmentStatVO implements Serializable { /* 总重量 */ private BigDecimal totalWeight; + /* 总票数对比标记:1-大于上一时间段;2-小于上一时间段;0-相等;*/ + private Integer totalTicketsCompareFlag; + + /* 总重量对比标记:1-大于上一时间段;2-小于上一时间段;0-相等 */ + private Integer totalWeightCompareFlag; + /* 销售联系人(多个用/分隔) */ private String salesmen; @@ -49,71 +55,142 @@ public class MonthlyCustomerShipmentStatVO implements Serializable { /* 快递实际重量 */ private BigDecimal expressWeight; + /* 快递票数对比标记 */ + private Integer expressTicketsCompareFlag; + + /* 快递实际重量对比标记 */ + private Integer expressWeightCompareFlag; + /* 空运票数 */ private Integer airTickets; /* 空运实际重量 */ private BigDecimal airWeight; + /* 空运票数对比标记 */ + private Integer airTicketsCompareFlag; + + /* 空运实际重量对比标记 */ + private Integer airWeightCompareFlag; + /* 陆运票数 */ private Integer landTickets; /* 陆运实际重量 */ private BigDecimal landWeight; + /* 陆运票数对比标记 */ + private Integer landTicketsCompareFlag; + + /* 陆运实际重量对比标记 */ + private Integer landWeightCompareFlag; + /* 海运票数 */ private Integer seaTickets; /* 海运实际重量 */ private BigDecimal seaWeight; + /* 海运票数对比标记 */ + private Integer seaTicketsCompareFlag; + + /* 海运实际重量对比标记 */ + private Integer seaWeightCompareFlag; + /* 进口票数 */ private Integer importTickets; /* 进口实际重量 */ private BigDecimal importWeight; + /* 进口票数对比标记 */ + private Integer importTicketsCompareFlag; + + /* 进口实际重量对比标记 */ + private Integer importWeightCompareFlag; + /* 其他票数 */ private Integer otherTickets; /* 其他实际重量 */ private BigDecimal otherWeight; + /* 其他票数对比标记 */ + private Integer otherTicketsCompareFlag; + + /* 其他实际重量对比标记 */ + private Integer otherWeightCompareFlag; + /* 中国票数 */ private Integer chinaTickets; /* 中国实际重量 */ private BigDecimal chinaWeight; + /* 中国票数对比标记 */ + private Integer chinaTicketsCompareFlag; + /* 中国实际重量对比标记 */ + private Integer chinaWeightCompareFlag; + /* 越南票数 */ private Integer vietnamTickets; /* 越南实际重量 */ private BigDecimal vietnamWeight; + /* 越南票数对比标记 */ + private Integer vietnamTicketsCompareFlag; + /* 越南实际重量对比标记 */ + private Integer vietnamWeightCompareFlag; + /* 柬埔寨票数 */ private Integer cambodiaTickets; /* 柬埔寨实际重量 */ private BigDecimal cambodiaWeight; + /* 柬埔寨票数对比标记 */ + private Integer cambodiaTicketsCompareFlag; + /* 柬埔寨实际重量对比标记 */ + private Integer cambodiaWeightCompareFlag; + /* 缅甸票数 */ private Integer myanmarTickets; /* 缅甸实际重量 */ private BigDecimal myanmarWeight; + /* 缅甸票数对比标记 */ + private Integer myanmarTicketsCompareFlag; + /* 缅甸实际重量对比标记 */ + private Integer myanmarWeightCompareFlag; + /* 孟加拉票数 */ private Integer bangladeshTickets; /* 孟加拉实际重量 */ private BigDecimal bangladeshWeight; + /* 孟加拉票数对比标记 */ + private Integer bangladeshTicketsCompareFlag; + /* 孟加拉实际重量对比标记 */ + private Integer bangladeshWeightCompareFlag; + /* 老挝票数 */ private Integer laosTickets; /* 老挝实际重量 */ private BigDecimal laosWeight; + /* 老挝票数对比标记 */ + private Integer laosTicketsCompareFlag; + /* 老挝实际重量对比标记 */ + private Integer laosWeightCompareFlag; + /* 泰国票数 */ private Integer thailandTickets; /* 泰国实际重量 */ private BigDecimal thailandWeight; + /* 泰国票数对比标记 */ + private Integer thailandTicketsCompareFlag; + /* 泰国实际重量对比标记 */ + private Integer thailandWeightCompareFlag; + /* 首次签约日期 */ private String firstSigningDay; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisCustomerUserService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisCustomerUserService.java index e3acbf6e8..2d13a2a31 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisCustomerUserService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisCustomerUserService.java @@ -12,6 +12,7 @@ package com.xdadan.erp.emis.service; import java.util.List; import com.xdadan.erp.emis.domain.EmisCustomerUser; import com.xdadan.erp.emis.domain.EmisWaybill; +import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.domain.vo.MonthlyCustomerShipmentStatVO; /** @@ -94,8 +95,9 @@ public interface IEmisCustomerUserService * * @param emisWaybill 查询条件 * @return 统计结果列表 + * @throws com.xdadan.erp.emis.domain.exception.EmisBizError 当statType=3或4时,必需的时间参数缺失时抛出异常 */ - public List selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill); + public List selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill) throws EmisBizError; /** * 查询月结客户出货明细 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCustomerUserServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCustomerUserServiceImpl.java index fe69f2abb..eada1c6f5 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCustomerUserServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCustomerUserServiceImpl.java @@ -10,9 +10,11 @@ package com.xdadan.erp.emis.service.impl; -import java.util.List; +import java.util.*; import com.xdadan.erp.common.utils.SecurityUtils; +import com.xdadan.erp.emis.domain.exception.EmisBizError; +import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.service.EmisBaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -159,13 +161,184 @@ public class EmisCustomerUserServiceImpl extends EmisBaseService implements IEmi * @return 统计结果列表 */ @Override - public List selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill) { + public List selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill) throws EmisBizError { if("1".equals(emisWaybill.getParams().get("statType"))){ // 按运输方式统计 return emisWaybillMapper.selectMonthlyCustomerShipmentStat(emisWaybill); } - // 按目的国家统计 - return emisWaybillMapper.selectMonthlyCustomerShipmentStatByCountry(emisWaybill); + if("2".equals(emisWaybill.getParams().get("statType"))){ + // 按目的国家统计 + return emisWaybillMapper.selectMonthlyCustomerShipmentStatByCountry(emisWaybill); + } + if("3".equals(emisWaybill.getParams().get("statType"))){ + // 按运输方式统计,增加与上一个时间段的票数、重量对比标记 + return buildShipmentStatWithCompare(emisWaybill, true); + } + if("4".equals(emisWaybill.getParams().get("statType"))){ + // 按目的国家统计,增加与上一个时间段的票数、重量对比标记 + return buildShipmentStatWithCompare(emisWaybill, false); + } + + return Collections.emptyList(); + } + + /** + * 构建带有对比标记的统计结果 + * + * @param emisWaybill 查询条件(包含当前时间段和对比时间段) + * @param byTransType true=按运输方式统计;false=按目的国家统计 + * @throws EmisBizError 当必需的时间参数缺失时抛出异常 + */ + private List buildShipmentStatWithCompare(EmisWaybill emisWaybill, boolean byTransType) throws EmisBizError { + if (emisWaybill.getParams() == null) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "比对参数不能为空"); + } + + // 获取当前时间段参数 + Object beginSendObj = emisWaybill.getParams().get("beginSendDate"); + Object endSendObj = emisWaybill.getParams().get("endSendDate"); + + // 获取对比时间段参数(前端传入) + Object beginCompareObj = emisWaybill.getParams().get("beginCompareDate"); + Object endCompareObj = emisWaybill.getParams().get("endCompareDate"); + + // 验证所有时间参数必须存在 + if (beginSendObj == null || !(beginSendObj instanceof String) || ((String) beginSendObj).trim().isEmpty()) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "请选择寄件日期"); + } + if (endSendObj == null || !(endSendObj instanceof String) || ((String) endSendObj).trim().isEmpty()) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "请选择寄件日期"); + } + if (beginCompareObj == null || !(beginCompareObj instanceof String) || ((String) beginCompareObj).trim().isEmpty()) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "请选择比对日期"); + } + if (endCompareObj == null || !(endCompareObj instanceof String) || ((String) endCompareObj).trim().isEmpty()) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR, "请选择比对日期"); + } + + String beginSendDate = ((String) beginSendObj).trim(); + String endSendDate = ((String) endSendObj).trim(); + String beginCompareDate = ((String) beginCompareObj).trim(); + String endCompareDate = ((String) endCompareObj).trim(); + + // 当前时间段统计 + List currentList = byTransType + ? emisWaybillMapper.selectMonthlyCustomerShipmentStat(emisWaybill) + : emisWaybillMapper.selectMonthlyCustomerShipmentStatByCountry(emisWaybill); + + try { + // 使用前端传入的对比时间段参数 + emisWaybill.getParams().put("beginSendDate", beginCompareDate); + emisWaybill.getParams().put("endSendDate", endCompareDate); + + List prevList = byTransType + ? emisWaybillMapper.selectMonthlyCustomerShipmentStat(emisWaybill) + : emisWaybillMapper.selectMonthlyCustomerShipmentStatByCountry(emisWaybill); + + // 还原时间参数 + emisWaybill.getParams().put("beginSendDate", beginSendDate); + emisWaybill.getParams().put("endSendDate", endSendDate); + + if (currentList == null || currentList.isEmpty() + || prevList == null || prevList.isEmpty()) { + return currentList; + } + + // 以 custNo 作为 key 进行对比 + Map prevMap = new HashMap<>(); + for (MonthlyCustomerShipmentStatVO item : prevList) { + if (item.getCustNo() != null) { + prevMap.put(item.getCustNo(), item); + } + } + + for (MonthlyCustomerShipmentStatVO cur : currentList) { + if (cur.getCustNo() == null) { + continue; + } + MonthlyCustomerShipmentStatVO prev = prevMap.get(cur.getCustNo()); + if (prev == null) { + continue; + } + + // 所有票数、重量字段都做对比:1-大于上一时间段;2-小于上一时间段;0-相等 + cur.setTotalTicketsCompareFlag(compareInteger(cur.getTotalTickets(), prev.getTotalTickets())); + cur.setTotalWeightCompareFlag(compareBigDecimal(cur.getTotalWeight(), prev.getTotalWeight())); + + // 按运输方式的票数、重量 + cur.setExpressTicketsCompareFlag(compareInteger(cur.getExpressTickets(), prev.getExpressTickets())); + cur.setExpressWeightCompareFlag(compareBigDecimal(cur.getExpressWeight(), prev.getExpressWeight())); + + cur.setAirTicketsCompareFlag(compareInteger(cur.getAirTickets(), prev.getAirTickets())); + cur.setAirWeightCompareFlag(compareBigDecimal(cur.getAirWeight(), prev.getAirWeight())); + + cur.setLandTicketsCompareFlag(compareInteger(cur.getLandTickets(), prev.getLandTickets())); + cur.setLandWeightCompareFlag(compareBigDecimal(cur.getLandWeight(), prev.getLandWeight())); + + cur.setSeaTicketsCompareFlag(compareInteger(cur.getSeaTickets(), prev.getSeaTickets())); + cur.setSeaWeightCompareFlag(compareBigDecimal(cur.getSeaWeight(), prev.getSeaWeight())); + + cur.setImportTicketsCompareFlag(compareInteger(cur.getImportTickets(), prev.getImportTickets())); + cur.setImportWeightCompareFlag(compareBigDecimal(cur.getImportWeight(), prev.getImportWeight())); + + cur.setOtherTicketsCompareFlag(compareInteger(cur.getOtherTickets(), prev.getOtherTickets())); + cur.setOtherWeightCompareFlag(compareBigDecimal(cur.getOtherWeight(), prev.getOtherWeight())); + + // 按目的国家的票数、重量(statType=4 时使用) + cur.setChinaTicketsCompareFlag(compareInteger(cur.getChinaTickets(), prev.getChinaTickets())); + cur.setChinaWeightCompareFlag(compareBigDecimal(cur.getChinaWeight(), prev.getChinaWeight())); + + cur.setVietnamTicketsCompareFlag(compareInteger(cur.getVietnamTickets(), prev.getVietnamTickets())); + cur.setVietnamWeightCompareFlag(compareBigDecimal(cur.getVietnamWeight(), prev.getVietnamWeight())); + + cur.setCambodiaTicketsCompareFlag(compareInteger(cur.getCambodiaTickets(), prev.getCambodiaTickets())); + cur.setCambodiaWeightCompareFlag(compareBigDecimal(cur.getCambodiaWeight(), prev.getCambodiaWeight())); + + cur.setMyanmarTicketsCompareFlag(compareInteger(cur.getMyanmarTickets(), prev.getMyanmarTickets())); + cur.setMyanmarWeightCompareFlag(compareBigDecimal(cur.getMyanmarWeight(), prev.getMyanmarWeight())); + + cur.setBangladeshTicketsCompareFlag(compareInteger(cur.getBangladeshTickets(), prev.getBangladeshTickets())); + cur.setBangladeshWeightCompareFlag(compareBigDecimal(cur.getBangladeshWeight(), prev.getBangladeshWeight())); + + cur.setLaosTicketsCompareFlag(compareInteger(cur.getLaosTickets(), prev.getLaosTickets())); + cur.setLaosWeightCompareFlag(compareBigDecimal(cur.getLaosWeight(), prev.getLaosWeight())); + + cur.setThailandTicketsCompareFlag(compareInteger(cur.getThailandTickets(), prev.getThailandTickets())); + cur.setThailandWeightCompareFlag(compareBigDecimal(cur.getThailandWeight(), prev.getThailandWeight())); + } + + return currentList; + } finally { + // 防御性措施:确保还原时间参数 + emisWaybill.getParams().put("beginSendDate", beginSendDate); + emisWaybill.getParams().put("endSendDate", endSendDate); + } + } + + private Integer compareInteger(Integer current, Integer previous) { + if (current == null || previous == null) { + return null; + } + int cmp = current.compareTo(previous); + if (cmp > 0) { + return 1; + } else if (cmp < 0) { + return 2; + } + return 0; + } + + private Integer compareBigDecimal(java.math.BigDecimal current, java.math.BigDecimal previous) { + if (current == null || previous == null) { + return null; + } + int cmp = current.compareTo(previous); + if (cmp > 0) { + return 1; + } else if (cmp < 0) { + return 2; + } + return 0; } /**