From 627376da076341191546c657218a87081008b609 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 28 Aug 2026 09:13:10 +0800 Subject: [PATCH 01/19] =?UTF-8?q?feat(sys):=E8=B4=B9=E7=94=A8=E7=A7=91?= =?UTF-8?q?=E7=9B=AE=E5=A2=9E=E5=8A=A0=E5=A4=8D=E5=88=B6=E3=80=81=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、新增 POST /expenseAccountApi/copy 复制接口(回显式,清空主键及科目编码) 2、新增 GET/POST /expenseAccountApi/export 导出接口(按列表查询条件+数据权限全量导出) 3、新增 ExpenseAccountExportVO 导出对象(27列业务字段) --- .../ExpenseAccountApplicationService.java | 51 +++++++++++++++++++ .../expenseAccount/ExpenseAccountApi.java | 45 ++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java index 6bfb55e13..11dddd5a9 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java @@ -13,6 +13,7 @@ import com.mhd.basic.application.service.contractManage.ContractManageApplicatio import com.mhd.basic.domain.expenseAccount.service.ExpenseAccountDomainService; import com.mhd.basic.infrastructure.feign.vo.SysDictDataVo; import com.mhd.basic.interfaces.dto.expenseAccount.ExpenseAccountDTO; +import com.mhd.basic.interfaces.dto.expenseAccount.ExpenseAccountExportVO; import com.mhd.basic.interfaces.dto.expenseAccount.SearchExpenseAccountDTO; import com.mhd.common.core.enums.DictCode; import com.mhd.common.core.exception.ServiceException; @@ -27,6 +28,7 @@ import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.model.LoginUser; import com.mhd.common.core.domain.po.UserPo; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -378,6 +380,55 @@ public class ExpenseAccountApplicationService { return expenseAccountDomainService.getInfo(expenseAccountId); } + /** + * 复制费用科目-获取原科目数据供前端回显 + *
前端拿到数据后回显到新增弹窗,用户填写新科目编码后通过 /edit 接口(id 为空走新增)提交保存。 + * 清空科目编码是为了避免直接复制出重复编码(费用科目编码无唯一性校验)。
+ */ + public ExpenseAccountPO copy(ExpenseAccountDTO expenseAccountDTO) { + if (expenseAccountDTO == null || expenseAccountDTO.getExpenseAccountId() == null) { + throw new ServiceException("原费用科目id不能为空"); + } + // 获取原费用科目信息 + ExpenseAccountPO original = expenseAccountDomainService.getInfo(expenseAccountDTO.getExpenseAccountId()); + if (null == original) { + throw new ServiceException("原费用科目信息未找到"); + } + // 清空主键,前端提交时走新增 + original.setExpenseAccountId(null); + // 清空科目编码,强制用户输入新编码,避免编码重复 + original.setSubjectCode(null); + // 清空审计字段,新增时由 ExpenseAccountAssembler 重新生成 + original.setCreateBy(null); + original.setCreateByName(null); + original.setCreateTime(null); + original.setUpdateBy(null); + original.setUpdateByName(null); + original.setUpdateTime(null); + original.setDelFlag(null); + // 清空非表字段 + original.setUnit(null); + original.setExpenseAccountPOList(null); + return original; + } + + /** + * 构建费用科目导出数据(不分页全量,按列表页查询条件 + 数据权限过滤) + */ + public List负责登录用户组织隔离注入、日期区间校验,查询逻辑在 InboundRankDomainService → InboundRankMapper.xml
+ * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class InboundRankApplicationService { + + @Autowired + private InboundRankDomainService inboundRankDomainService; + + /** + * 分页查询商品入库排名列表(仓单+货品汇总,按件数降序) + */ + public List负责登录用户组织隔离注入、日期区间校验,统计逻辑在 OutboundRankDomainService → OutboundRankMapper.xml
+ * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class OutboundRankApplicationService { + + @Autowired + private OutboundRankDomainService outboundRankDomainService; + + /** + * 分页查询商品出库排名列表 + */ + public List字段口径:入仓日期=入仓单入仓日期;仓单编号=入库单号;客户编号/存货人=入仓单货主; + * 件数/毛重/体积=仓单内该货品明细合计;毛重(吨)=明细总毛重KG/1000; + * 投保总额=货品档案保额(material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "入库排名统计对象", description = "入库排名统计响应对象") +public class InboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("仓单编号(入库单号)") + @Excel(name = "仓单编号") + private String inOrderNumber; + + @ApiModelProperty("客户编号") + @Excel(name = "客户编号") + private String shipperCode; + + @ApiModelProperty("存货人(客户名称)") + @Excel(name = "存货人") + private String shipperName; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名/商品名称") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unitName; + + @ApiModelProperty("件数(仓单内该货品合计,排名依据)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)(仓单内该货品合计,KG/1000)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("投保总额(货品档案保额)") + @Excel(name = "投保总额") + private BigDecimal insureAmount; + + @ApiModelProperty("体积(CBM)(仓单内该货品合计)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java new file mode 100644 index 000000000..551bf25d4 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.inboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 入库排名统计合计PO + * + *当前筛选条件下不分页的全量合计,随分页列表一起返回 + * (totalPieceCount/totalGrossWeightTon/totalInsureAmount/totalVolume/totalOrderCount)
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "入库排名统计合计对象", description = "入库排名统计合计响应对象") +public class InboundRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("件数合计") + private BigDecimal totalPieceCount; + + @ApiModelProperty("毛重(吨)合计") + private BigDecimal totalGrossWeightTon; + + @ApiModelProperty("投保总额合计(各仓单+货品行保额之和)") + private BigDecimal totalInsureAmount; + + @ApiModelProperty("体积(CBM)合计") + private BigDecimal totalVolume; + + @ApiModelProperty("仓单数合计") + private Long totalOrderCount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java new file mode 100644 index 000000000..1cc725242 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java @@ -0,0 +1,50 @@ +package com.mhd.wms.domain.inboundRank.repository.todo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 入库排名统计查询DO + * + *topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class InboundRankDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期-开始 yyyy-MM-dd(必填)") + private String warehouseDateStart; + + @ApiModelProperty("入仓日期-结束 yyyy-MM-dd(必填)") + private String warehouseDateEnd; + + @ApiModelProperty("仓单编号/入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("客户编号(模糊)") + private String shipperCode; + + @ApiModelProperty("存货人/客户名称(模糊)") + private String shipperName; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("一级组织表ID(登录用户隔离,非1时注入)") + private Long topOrganizationId; + + @ApiModelProperty("仓库id(按用户关联仓库注入)") + private Long warehouseId; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java new file mode 100644 index 000000000..53e948b61 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.inboundRank.service; + +import com.mhd.wms.domain.inboundRank.repository.facade.IInboundRankService; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 入库排名统计领域服务 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class InboundRankDomainService { + + @Autowired + private IInboundRankService inboundRankService; + + /** + * 商品入库排名列表(仓单+货品汇总,按件数降序) + */ + public List按日期区间对出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); + * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") +public class OutboundLineRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("线路编码") + @Excel(name = "线路编码") + private String lineCode; + + @ApiModelProperty("线路名称") + @Excel(name = "线路名称") + private String lineName; + + @ApiModelProperty("销售量(出库数量合计)") + @Excel(name = "销售量") + private BigDecimal salesQuantity; + + @ApiModelProperty("交易数(出库单据数)") + @Excel(name = "交易数") + private Long tradeCount; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java new file mode 100644 index 000000000..9725d50ab --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java @@ -0,0 +1,52 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品出库排名PO + * + *按日期区间对出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") +public class OutboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("商品名称") + @Excel(name = "商品名称") + private String materialName; + + @ApiModelProperty("规格") + @Excel(name = "规格") + private String specificationModel; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unitName; + + @ApiModelProperty("销售量(出库数量合计)") + @Excel(name = "销售量") + private BigDecimal salesQuantity; + + @ApiModelProperty("交易数(出库单据数)") + @Excel(name = "交易数") + private Long tradeCount; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java new file mode 100644 index 000000000..ea0e9ace9 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java @@ -0,0 +1,32 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 出库排名合计PO + * + *当前筛选条件下不分页的全量合计,随分页列表一起返回(totalSalesQuantity/totalTradeCount/totalAmount)
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名合计对象", description = "出库排名合计响应对象") +public class OutboundRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("销售量合计") + private BigDecimal totalSalesQuantity; + + @ApiModelProperty("交易数合计(去重出库单数)") + private Long totalTradeCount; + + @ApiModelProperty("金额合计") + private BigDecimal totalAmount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java new file mode 100644 index 000000000..c38c77230 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java @@ -0,0 +1,53 @@ +package com.mhd.wms.domain.outboundRank.repository.todo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 出库排名统计查询DO + * + *topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class OutboundRankDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填)") + private String createTimeStart; + + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填)") + private String createTimeEnd; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("商品名称(模糊)") + private String materialName; + + @ApiModelProperty("线路编码(模糊)") + private String lineCode; + + @ApiModelProperty("线路名称(模糊)") + private String lineName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("客户名称(模糊)") + private String customerName; + + @ApiModelProperty("货主名称(模糊)") + private String shipperName; + + @ApiModelProperty("一级组织表ID(登录用户隔离,非1时注入)") + private Long topOrganizationId; + + @ApiModelProperty("仓库id(按用户关联仓库注入)") + private Long warehouseId; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java new file mode 100644 index 000000000..1d2fe84c2 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java @@ -0,0 +1,54 @@ +package com.mhd.wms.domain.outboundRank.service; + +import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库排名统计领域服务 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class OutboundRankDomainService { + + @Autowired + private IOutboundRankService outboundRankService; + + /** + * 商品出库排名列表 + */ + public List按入仓日期区间筛选商品入库量统计排名,统计口径:入仓日期 + 仅已入库状态(5) + 明细仅取 level=1 主行; + * 一行 = 某仓单内某货品的合计,按件数降序排名
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class InboundRankDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期-开始 yyyy-MM-dd(必填,按入仓单入仓日期筛选)") + private String warehouseDateStart; + + @ApiModelProperty("入仓日期-结束 yyyy-MM-dd(必填,按入仓单入仓日期筛选)") + private String warehouseDateEnd; + + @ApiModelProperty("仓单编号/入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("客户编号(模糊)") + private String shipperCode; + + @ApiModelProperty("存货人/客户名称(模糊)") + private String shipperName; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java new file mode 100644 index 000000000..eac2c07b5 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java @@ -0,0 +1,43 @@ +package com.mhd.wms.interfaces.dto.outboundRank; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 出库排名统计入参DTO + * + *按日期区间统计商品/线路出库量排名,统计口径:出库单创建时间 + 已出库及之后状态(9,12,13)
+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class OutboundRankDTO { + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间统计)") + private String createTimeStart; + + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间统计)") + private String createTimeEnd; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("商品名称(模糊)") + private String materialName; + + @ApiModelProperty("线路编码(模糊)") + private String lineCode; + + @ApiModelProperty("线路名称(模糊)") + private String lineName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("客户名称(模糊)") + private String customerName; + + @ApiModelProperty("货主名称(模糊)") + private String shipperName; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java new file mode 100644 index 000000000..b979e988b --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java @@ -0,0 +1,105 @@ +package com.mhd.wms.interfaces.facadeApi.inboundRank; + +import com.github.pagehelper.PageInfo; +import com.mhd.common.core.constant.HttpStatus; +import com.mhd.common.core.utils.PageUtils; +import com.mhd.common.core.utils.poi.ExcelUtil; +import com.mhd.wms.application.service.inboundRank.InboundRankApplicationService; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.interfaces.assember.inboundRank.InboundRankAssembler; +import com.mhd.wms.interfaces.dto.inboundRank.InboundRankDTO; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; + +/** + * 入库排名统计Api + * + *按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期 + 仅已入库状态(5), + * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 + * 与出库排名(/outboundRankApi)配对,前端用 tab 页区分
+ * + * @author rcx + * @date 2026-08-31 + */ +@RestController +@RequestMapping("/inboundRankApi") +public class InboundRankApi { + + @Resource + private InboundRankAssembler inboundRankAssembler; + + @Autowired + private InboundRankApplicationService inboundRankApplicationService; + + /** + * 分页查询商品入库排名列表(含合计行) + */ + @ApiOperation("分页查询商品入库排名列表") + @GetMapping("/queryMaterialRankList") + public HashMap按日期区间筛选,统计商品/线路出库量排名。统计口径:出库单创建时间 + 已出库及之后状态(9,12,13), + * 明细仅取 level=1 主行;销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)
+ * + * @author rcx + * @date 2026-08-31 + */ +@RestController +@RequestMapping("/outboundRankApi") +public class OutboundRankApi { + + @Resource + private OutboundRankAssembler outboundRankAssembler; + + @Autowired + private OutboundRankApplicationService outboundRankApplicationService; + + /** + * 分页查询商品出库排名列表(含合计行) + */ + @ApiOperation("分页查询商品出库排名列表") + @GetMapping("/queryMaterialRankList") + public HashMap按日期区间对执行出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); + *
按日期区间对出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)
* * @author rcx diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java index ce1cb867e..c32046d9f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java @@ -11,7 +11,7 @@ import java.math.BigDecimal; /** * 商品出库排名PO * - *按日期区间对执行出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)
+ *按日期区间对出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)
* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java index 9b055286f..0637173b7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java @@ -8,7 +8,8 @@ import java.io.Serializable; /** * 出库排名统计入参DTO * - *按日期区间统计商品/线路出库量排名,数据源为 OMS 执行出库链路(execution_out_material_detail / execution_stock_out_order)
+ *按日期区间统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据), + * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail),与 WMS 端 /outboundRankApi 同口径
* * @author rcx * @date 2026-08-31 @@ -16,10 +17,10 @@ import java.io.Serializable; @Data public class ExecutionOutboundRankDTO { - @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按执行出库单创建时间统计)") + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间统计)") private String createTimeStart; - @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按执行出库单创建时间统计)") + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间统计)") private String createTimeEnd; @ApiModelProperty("商品货号(模糊)") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java index ef14d18bc..158f2b8c2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java @@ -17,7 +17,7 @@ import java.util.List; /** * 出库排名统计应用服务 * - *负责登录用户组织隔离注入、日期区间校验,统计逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml
+ *负责登录用户组织隔离注入、日期区间校验,统计逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml(跨库取 WMS 出库数据)
* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java index 07cb22725..f1222e413 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java @@ -27,8 +27,11 @@ import java.util.List; /** * 出库排名统计Api * - *按日期区间筛选,统计商品/线路出库量排名。统计口径:执行出库单创建时间 + 已出库状态(9), - * 明细仅取 level=1 主行;销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)
+ *按日期区间筛选,统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据), + * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail), + * 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致; + * 统计条件:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行; + * 销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)
* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml index 77fccdc12..f35689979 100644 --- a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -5,16 +5,19 @@按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期 + 仅已入库状态(5), - * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + *
按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底); + * OMS 执行入库单状态不回传(长期停留已创建),不按"已入库"过滤,仅排除已取消(6)/已关闭(7), + * 与入库明细查询页面口径一致;明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/executionOutboundRankApi)配对,前端用 tab 页区分
* diff --git a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml index 46c335671..0401cc603 100644 --- a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml @@ -8,15 +8,16 @@ 入库排名统计公共查询条件(OMS 执行入库链路) 数据源:执行入库明细 execution_in_material_detail(a,仅 level=1 主行防重复) join 执行入仓单 execution_stock_in_order(b) left join NGWL_TEST_WMS.material_base_info(c,跨库取货品档案保额作投保总额) - 口径:b.status = 5已入库(OMS 入库状态枚举 1~7,排除已取消(6)/已关闭(7)及未完成单据); - 日期筛选按执行入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源); + 口径:b.status not in (6已取消,7已关闭)(OMS 执行入库单状态不回传,实际数据长期停留 status=1已创建, + 无法按"已入库5"过滤,与入库明细查询页面口径一致不按状态筛选,仅排除已取消/已关闭); + 日期筛选按执行入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源,为空的历史单按建档时间兜底); 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计,按件数降序排名 -->按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期 + 仅已入库状态(5), + *
按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底) + 仅已入库状态(5), * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/outboundRankApi)配对,前端用 tab 页区分
diff --git a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml index fc1e6f238..45f454d58 100644 --- a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml @@ -9,7 +9,7 @@ 数据源:入库明细 in_material_detail(a,仅 level=1 主行防重复) join 入仓单 stock_in_order(b) left join 货品档案 material_base_info(c,取保额作投保总额) 口径:b.status = 5已入库(排除已取消(6)/已关闭(7)及未完成单据); - 日期筛选按入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源); + 日期筛选按入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源,为空的历史单按建档时间兜底); 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计,按件数降序排名 -->字段口径:入仓日期=执行入仓单入仓日期;仓单编号=执行入库单号;客户编号/存货人=入仓单货主; - * 件数/毛重/体积=仓单内该货品明细合计;毛重(吨)=明细总毛重KG/1000; + *
数据源跨库取 WMS 入库表(NGWL_TEST_WMS.stock_in_order / in_material_detail,OMS 执行单状态/上架量不回传), + * 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致。 + * 字段口径:入仓日期=WMS入仓单入仓日期(为空兜底建档时间);仓单编号=WMS入库单号;客户编号/存货人=入仓单货主; + * 件数/毛重/体积=仓单内该货品明细合计(件数取实际上架量 SHELVES_QUANTITY);毛重(吨)=明细总毛重KG/1000; * 投保总额=货品档案保额(NGWL_TEST_WMS.material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)
* * @author rcx @@ -33,7 +35,7 @@ public class ExecutionInboundMaterialRankPO implements Serializable { @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") private Date warehouseDate; - @ApiModelProperty("仓单编号(执行入库单号)") + @ApiModelProperty("仓单编号(WMS入库单号)") @Excel(name = "仓单编号") private String inOrderNumber; @@ -61,7 +63,7 @@ public class ExecutionInboundMaterialRankPO implements Serializable { @Excel(name = "单位") private String unitName; - @ApiModelProperty("件数(仓单内该货品合计,排名依据)") + @ApiModelProperty("件数(仓单内该货品实际上架量合计 SHELVES_QUANTITY,排名依据)") @Excel(name = "件数") private BigDecimal pieceCount; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java index d3d1bd88d..c8a51892e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java @@ -22,7 +22,7 @@ public class ExecutionInboundRankTotalPO implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty("件数合计") + @ApiModelProperty("件数合计(实际上架量)") private BigDecimal totalPieceCount; @ApiModelProperty("毛重(吨)合计") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java index 3e557dd6d..968c289d5 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 入库排名统计入参DTO * - *数据源为 OMS 执行入库链路(execution_in_material_detail / execution_stock_in_order)
+ *数据源跨库取 WMS 入库链路(NGWL_TEST_WMS.stock_in_order / in_material_detail,OMS 执行单状态/上架量不回传)
* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java index b7cfd6391..f97d23e57 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java @@ -26,9 +26,11 @@ import java.util.List; /** * 入库排名统计Api * - *按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底); - * OMS 执行入库单状态不回传(长期停留已创建),不按"已入库"过滤,仅排除已取消(6)/已关闭(7), - * 与入库明细查询页面口径一致;明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + *
按入仓日期区间筛选商品入库量统计排名。OMS 库执行入库单状态/上架数量均不回传,真实数据在 WMS 库, + * 故数据源跨库取 WMS 入库表(NGWL_TEST_WMS.stock_in_order/in_material_detail,与 OMS 出库排名跨库修法一致); + * 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致:仅已入库(5) + 明细 level=1 主行 + + * 入仓日期(为空的历史单按建档时间兜底) + 件数=实际上架量(SHELVES_QUANTITY); + * 一行 = 某仓单内某货品的合计,按件数降序排名。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/executionOutboundRankApi)配对,前端用 tab 页区分
* diff --git a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml index 0401cc603..e6b76eb0d 100644 --- a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml @@ -5,19 +5,23 @@字段口径:入仓日期=入仓单入仓日期;仓单编号=入库单号;客户编号/存货人=入仓单货主; - * 件数/毛重/体积=仓单内该货品明细合计;毛重(吨)=明细总毛重KG/1000; + *
字段口径:入仓日期=入仓单入仓日期(为空兜底建档时间);仓单编号=入库单号;客户编号/存货人=入仓单货主; + * 件数/毛重/体积=仓单内该货品明细合计(件数取实际上架量 SHELVES_QUANTITY);毛重(吨)=明细总毛重KG/1000; * 投保总额=货品档案保额(material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)
* * @author rcx @@ -61,7 +61,7 @@ public class InboundMaterialRankPO implements Serializable { @Excel(name = "单位") private String unitName; - @ApiModelProperty("件数(仓单内该货品合计,排名依据)") + @ApiModelProperty("件数(仓单内该货品实际上架量合计 SHELVES_QUANTITY,排名依据)") @Excel(name = "件数") private BigDecimal pieceCount; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java index 551bf25d4..f7433e5af 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java @@ -22,7 +22,7 @@ public class InboundRankTotalPO implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty("件数合计") + @ApiModelProperty("件数合计(实际上架量)") private BigDecimal totalPieceCount; @ApiModelProperty("毛重(吨)合计") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java index 15b0843ce..bde6855dd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java @@ -26,7 +26,7 @@ import java.util.List; * 入库排名统计Api * *按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底) + 仅已入库状态(5), - * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数(实际上架量 SHELVES_QUANTITY)降序排名。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/outboundRankApi)配对,前端用 tab 页区分
* diff --git a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml index 45f454d58..63f9a07e0 100644 --- a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml @@ -10,7 +10,7 @@ left join 货品档案 material_base_info(c,取保额作投保总额) 口径:b.status = 5已入库(排除已取消(6)/已关闭(7)及未完成单据); 日期筛选按入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源,为空的历史单按建档时间兜底); - 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计,按件数降序排名 + 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计,按件数(实际上架量 SUM(a.SHELVES_QUANTITY))降序排名 -->