demand: tms-统计报表-月结客户出货统计-按运输方式统计-统计增加与前一个时间段比较逻辑 tms-统计报表-月结客户出货统计-按目的国家统计-统计增加与前一个时间段比较逻辑

committer: heyu
This commit is contained in:
aike 2025-11-19 14:56:55 +08:00
parent 362740d903
commit 4a7268b6e3
4 changed files with 259 additions and 7 deletions

View File

@ -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<MonthlyCustomerShipmentStatVO> list = emisCustomerUserService

View File

@ -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;
}

View File

@ -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<MonthlyCustomerShipmentStatVO> selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill);
public List<MonthlyCustomerShipmentStatVO> selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill) throws EmisBizError;
/**
* 查询月结客户出货明细

View File

@ -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<MonthlyCustomerShipmentStatVO> selectMonthlyCustomerShipmentStat(EmisWaybill emisWaybill) {
public List<MonthlyCustomerShipmentStatVO> 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<MonthlyCustomerShipmentStatVO> 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<MonthlyCustomerShipmentStatVO> currentList = byTransType
? emisWaybillMapper.selectMonthlyCustomerShipmentStat(emisWaybill)
: emisWaybillMapper.selectMonthlyCustomerShipmentStatByCountry(emisWaybill);
try {
// 使用前端传入的对比时间段参数
emisWaybill.getParams().put("beginSendDate", beginCompareDate);
emisWaybill.getParams().put("endSendDate", endCompareDate);
List<MonthlyCustomerShipmentStatVO> 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<String, MonthlyCustomerShipmentStatVO> 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;
}
/**