From 888a293ebda0bd706eaf8ea39ea2204f253f2318 Mon Sep 17 00:00:00 2001
From: rcx <3084692334@qq.com>
Date: Mon, 14 Sep 2026 13:55:10 +0800
Subject: [PATCH 1/3] =?UTF-8?q?feat(oms):=20=E5=87=BA/=E5=85=A5=E4=BB=93?=
=?UTF-8?q?=E5=A7=94=E6=89=98=E5=8D=95=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3(=E5=A7=94=E6=89=98=E5=8D=95=E6=A8=A1?=
=?UTF-8?q?=E6=9D=BF=E4=B8=8EW=E5=87=BA=E5=85=A5=E5=BA=93=E7=AE=A1?=
=?UTF-8?q?=E7=90=86=E5=AF=BC=E5=85=A5=E4=B8=80=E8=87=B4)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
出仓: POST /outEntrustOrderApi/import, EasyExcel两遍解析(前11行表头+第12行起明细), 客户名称解析货主, 明细按料号>SKU>品名匹配货主物料档案(料号不存在/规格/SKU不一致报错), 柜号/运输方式/监管方式字典转码, 校验通过复用新增链路落库(生成CKWT单号, 待审核/未下发); 入仓: POST /reservationStockInOrderApi/importData, 恢复原注释W式导入并按现行类型重写——POI标签扫描前12行表头+ExcelUtil读13行列名明细, 按委托编号NO分组建单, 料号必填且须在该货主下存在, 规格/SKU与档案一致性校验, 数量空行/容器行跳过, 计划数量=入库数量之和, 订单来源=数据导入; OutEntrustOrderMapper新增跨库物料直查(NGWL_TEST_WMS.MATERIAL_BASE_INFO, 货主+一级组织过滤)
---
.../OutEntrustOrderApplicationService.java | 45 ++
.../listener/NoConvertConverter.java | 58 ++
.../listener/OutEntrustExcelParseService.java | 481 +++++++++++++
.../listener/OutEntrustHeaderListener.java | 201 ++++++
.../listener/OutEntrustItemListener.java | 282 ++++++++
.../mapper/OutEntrustOrderMapper.java | 22 +
...rvationStockInOrderApplicationService.java | 633 ++++++++++++++++++
.../outEntrustOrder/OutEntrustOrderApi.java | 38 ++
.../ReservationStockInOrderApi.java | 32 +-
.../outEntrustOrder/OutEntrustOrderMapper.xml | 25 +
10 files changed, 1806 insertions(+), 11 deletions(-)
create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/NoConvertConverter.java
create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/OutEntrustExcelParseService.java
create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/OutEntrustHeaderListener.java
create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/OutEntrustItemListener.java
diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java
index bcdfacb14..0b6ed4003 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java
@@ -11,6 +11,7 @@ import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO;
import com.mhd.oms.domain.outEntrustOrder.service.OutEntrustOrderDomainService;
+import com.mhd.oms.domain.outEntrustOrder.repository.listener.OutEntrustExcelParseService;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.WmsServiceFeign;
import com.mhd.system.api.domain.NoticeMaterialDetailDTO;
@@ -20,8 +21,10 @@ import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
+import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
@@ -52,6 +55,9 @@ public class OutEntrustOrderApplicationService {
@Resource
private WmsServiceFeign wmsServiceFeign;
+ @Resource
+ private OutEntrustExcelParseService outEntrustExcelParseService;
+
/**
* 分页查询出仓委托单列表(不做默认状态过滤,显示全部数据)
*/
@@ -108,6 +114,45 @@ public class OutEntrustOrderApplicationService {
return outEntrustOrderDomainService.insert(outEntrustOrderDO);
}
+ /**
+ * 导入出仓委托单(模板与WMS出库管理导入一致:前11行表头+第12行起明细)
+ * 解析校验通过后复用新增链路落库:生成CKWT委托单号,状态待审核/未下发
+ *
+ * @return 校验错误信息;空串表示导入成功
+ */
+ public StringBuilder importOutEntrustOrder(MultipartFile file, Long warehouseId, String warehouseCode, String warehouseName) throws IOException {
+ //解析+校验(客户解析/物料匹配/字典转换/必填项)
+ OutEntrustExcelParseService.ParseResult parseResult =
+ outEntrustExcelParseService.parseOutEntrustOrderExcel(file, warehouseName, warehouseCode, warehouseId);
+ if (parseResult.getErrorMsg().length() > 0) {
+ return parseResult.getErrorMsg();
+ }
+ OutEntrustOrderDO outEntrustOrderDO = parseResult.getOrder();
+ //审计信息(与WMS出库导入一致,导入人=当前登录人)
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (loginUser != null) {
+ String userRealName;
+ if (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
+ && !loginUser.getUserPo().getUserName().trim().isEmpty()) {
+ userRealName = loginUser.getUserPo().getUserName();
+ } else if (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) {
+ userRealName = loginUser.getRealname();
+ } else {
+ userRealName = loginUser.getUsername();
+ }
+ Date now = new Date();
+ outEntrustOrderDO.setCreateBy(loginUser.getUserid());
+ outEntrustOrderDO.setCreateByName(userRealName);
+ outEntrustOrderDO.setCreateTime(now);
+ outEntrustOrderDO.setUpdateBy(loginUser.getUserid());
+ outEntrustOrderDO.setUpdateByName(userRealName);
+ outEntrustOrderDO.setUpdateTime(now);
+ }
+ //复用新增链路:必填校验→默认普通出库→仓库校验→组织信息→汇总申报数量→生成CKWT委托单号(待审核/未下发)
+ insert(outEntrustOrderDO);
+ return new StringBuilder();
+ }
+
/**
* 修改出仓委托单(仅待审核/已驳回且未下发可修改;已驳回单编辑后状态重置为待审核)
*/
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/NoConvertConverter.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/NoConvertConverter.java
new file mode 100644
index 000000000..07d44ae51
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/NoConvertConverter.java
@@ -0,0 +1,58 @@
+package com.mhd.oms.domain.outEntrustOrder.repository.listener;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+/**
+ * 自定义转换器,不进行任何类型转换,直接返回原始值
+ * 覆盖EasyExcel默认的StringNumberConverter,避免数字格式化错误
+ *
+ * @author rcx
+ * @date 2026-09-14
+ */
+public class NoConvertConverter implements Converter {
+
+ @Override
+ public Class> supportJavaTypeKey() {
+ return String.class;
+ }
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ // 关键:返回NUMBER类型,覆盖StringNumberConverter
+ return CellDataTypeEnum.NUMBER;
+ }
+
+ @Override
+ public String convertToJavaData(ReadCellData> cellData, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) {
+ // 不进行任何格式化,直接返回原始值的字符串表示
+ if (cellData == null) {
+ return "";
+ }
+
+ // 根据单元格类型获取原始值
+ try {
+ CellDataTypeEnum type = cellData.getType();
+ if (type == CellDataTypeEnum.STRING) {
+ return cellData.getStringValue() != null ? cellData.getStringValue() : "";
+ } else if (type == CellDataTypeEnum.NUMBER) {
+ // 直接转换数字为字符串,不进行格式化
+ return cellData.getNumberValue() != null ? cellData.getNumberValue().toString() : "";
+ } else if (type == CellDataTypeEnum.BOOLEAN) {
+ return cellData.getBooleanValue() != null ? cellData.getBooleanValue().toString() : "";
+ } else if (type == CellDataTypeEnum.EMPTY) {
+ return "";
+ } else {
+ // 其他类型尝试获取字符串值
+ return cellData.getStringValue() != null ? cellData.getStringValue() : "";
+ }
+ } catch (Exception e) {
+ // 如果获取失败,返回空字符串
+ return "";
+ }
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/OutEntrustExcelParseService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/OutEntrustExcelParseService.java
new file mode 100644
index 000000000..38cfa81ad
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/listener/OutEntrustExcelParseService.java
@@ -0,0 +1,481 @@
+package com.mhd.oms.domain.outEntrustOrder.repository.listener;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelReader;
+import com.alibaba.excel.read.metadata.ReadSheet;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.TypeReference;
+import com.mhd.common.core.domain.po.SysDictDataVo;
+import com.mhd.common.core.domain.po.UserPo;
+import com.mhd.common.core.exception.ServiceException;
+import com.mhd.common.core.utils.StringUtils;
+import com.mhd.common.core.web.domain.AjaxResult;
+import com.mhd.common.security.utils.SecurityUtils;
+import com.mhd.oms.domain.outEntrustOrder.repository.mapper.OutEntrustOrderMapper;
+import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO;
+import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO;
+import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO;
+import com.mhd.system.api.SystemServiceFeign;
+import com.mhd.system.api.UserServiceFeign;
+import com.mhd.system.api.model.LoginUser;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 出仓委托单Excel解析服务
+ * 模板与WMS出库管理导入一致:前11行为表头,第12行起为明细
+ *
+ * @author rcx
+ * @date 2026-09-14
+ */
+@Slf4j
+@Service
+public class OutEntrustExcelParseService {
+
+ @Resource
+ private SystemServiceFeign systemServiceFeign;
+
+ @Resource
+ private UserServiceFeign userServiceFeign;
+
+ @Autowired
+ private OutEntrustOrderMapper outEntrustOrderMapper;
+
+ /**
+ * 解析结果:委托单对象 + 校验错误信息(空串表示通过)
+ */
+ @Getter
+ public static class ParseResult {
+ private final OutEntrustOrderDO order;
+ private final StringBuilder errorMsg;
+
+ public ParseResult(OutEntrustOrderDO order, StringBuilder errorMsg) {
+ this.order = order;
+ this.errorMsg = errorMsg;
+ }
+ }
+
+ /**
+ * 解析出仓委托单Excel(不落库,落库由应用服务走新增链路)
+ *
+ * @param file 上传的Excel文件
+ * @param warehouseName 仓库名称(导入弹窗选择)
+ * @param warehouseCode 仓库编码
+ * @param warehouseId 仓库ID
+ * @return 解析结果:委托单对象 + 校验错误信息;错误信息非空时不应落库
+ */
+ public ParseResult parseOutEntrustOrderExcel(MultipartFile file, String warehouseName, String warehouseCode, Long warehouseId) throws IOException {
+
+ OutEntrustHeaderListener headerListener = new OutEntrustHeaderListener();
+
+ ReadSheet headerSheet = EasyExcel.readSheet(0)
+ .headRowNumber(0)
+ .build();
+
+ ExcelReader headerReader = EasyExcel.read(file.getInputStream())
+ .autoCloseStream(false)
+ .registerReadListener(headerListener)
+ .registerConverter(new NoConvertConverter())
+ .headRowNumber(0)
+ .build();
+
+ // 通过监听器控制只读取前11行
+ headerReader.read(headerSheet);
+
+ InputStream itemInputStream = file.getInputStream();
+ OutEntrustItemListener itemListener = new OutEntrustItemListener();
+
+ // 商品明细需要跳过前11行,从第12行开始读取
+ ExcelReader itemReader = EasyExcel.read(itemInputStream)
+ .autoCloseStream(false)
+ .registerReadListener(itemListener)
+ .registerConverter(new NoConvertConverter())
+ .headRowNumber(12)
+ .build();
+
+ ReadSheet itemSheet = EasyExcel.readSheet(0).build();
+ itemReader.read(itemSheet);
+
+ itemReader.finish();
+ List itemList = itemListener.getItemList();
+ OutEntrustOrderDO outEntrustOrder = headerListener.getOutEntrustOrder();
+
+ // 提前获取货主ID,用于查询物料基础信息时过滤
+ String customerName = outEntrustOrder.getShipperName();
+ UserPo shipperUser = resolveCustomerShipperUserPoForImport(customerName);
+ Long shipperId = shipperUser != null ? shipperUser.getUserId() : null;
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ Long topOrganizationId = loginUser != null && loginUser.getUserPo() != null
+ ? loginUser.getUserPo().getTopOrganizationId() : null;
+ initList(itemList, shipperId, topOrganizationId);
+ outEntrustOrder.setMaterialDetailList(itemList);
+ outEntrustOrder.setWarehouseName(warehouseName);
+ outEntrustOrder.setWarehouseCode(warehouseCode);
+ outEntrustOrder.setWarehouseId(warehouseId);
+
+ //业务员默认当前登录人
+ if (loginUser != null) {
+ outEntrustOrder.setSalesmanId(String.valueOf(loginUser.getUserid()));
+ outEntrustOrder.setSalesmanName(loginUser.getUserPo() != null ? loginUser.getUserPo().getUserName() : loginUser.getUsername());
+ }
+ //货主信息回填(名称/编号以用户中心为准)
+ if (shipperUser != null) {
+ outEntrustOrder.setShipperId(shipperUser.getUserId());
+ outEntrustOrder.setShipperCode(shipperUser.getUserMemberCode());
+ outEntrustOrder.setShipperName(shipperUser.getUserName());
+ }
+ initDict(outEntrustOrder);
+ //校验必填字段
+ StringBuilder errorMsg = check(outEntrustOrder);
+ // 日期单元格有值但解析失败:与物料一致性错误同等对待,阻断导入并明确提示,杜绝静默丢日期
+ for (String dateError : headerListener.getDateParseErrors()) {
+ errorMsg.append(dateError).append("; ");
+ }
+ return new ParseResult(outEntrustOrder, errorMsg);
+ }
+
+ /**
+ * 校验导入明细是否已在当前货主下维护物料基础信息
+ */
+ private StringBuilder validateShipperMaterialDetails(OutEntrustOrderDO outEntrustOrder) {
+ StringBuilder sb = new StringBuilder();
+ List details = outEntrustOrder.getMaterialDetailList();
+ if (details == null || details.isEmpty()) {
+ return sb;
+ }
+ Long shipperId = outEntrustOrder.getShipperId();
+ for (OutEntrustOrderDetailDO row : details) {
+ if (row.getMaterialBaseInfoId() != null) {
+ continue;
+ }
+ boolean hasIdentifier = StringUtils.isNotBlank(row.getMaterialNo())
+ || StringUtils.isNotBlank(row.getSkucode())
+ || StringUtils.isNotBlank(row.getCommodityName());
+ if (!hasIdentifier) {
+ continue;
+ }
+ String desc = buildImportMaterialRowDesc(row);
+ if (ObjectUtil.isEmpty(shipperId)) {
+ sb.append("请先确认客户(货主)信息;无法校验以下物料是否已在货主下维护:").append(desc).append("; ");
+ } else {
+ sb.append("当前货主下未维护以下物料:").append(desc).append("; ");
+ }
+ }
+ return sb;
+ }
+
+ /**
+ * 提示文案只强调 Excel 导入列「商品名称」;商品名称为空时用导入料号/SKU 辅助说明。
+ */
+ private String buildImportMaterialRowDesc(OutEntrustOrderDetailDO row) {
+ String commodityName = StringUtils.trimToEmpty(row.getCommodityName());
+ if (StringUtils.isNotBlank(commodityName)) {
+ return "商品名称「" + commodityName + "」";
+ }
+ String materialNo = StringUtils.trimToEmpty(row.getMaterialNo());
+ String sku = StringUtils.trimToEmpty(row.getSkucode());
+ StringBuilder b = new StringBuilder("导入商品名称为空");
+ if (StringUtils.isNotBlank(materialNo)) {
+ b.append(",料号「").append(materialNo).append("」");
+ }
+ if (StringUtils.isNotBlank(sku)) {
+ b.append(",SKU「").append(sku).append("」");
+ }
+ return b.toString();
+ }
+
+ private StringBuilder check(OutEntrustOrderDO outEntrustOrder) {
+ StringBuilder errorMsg = new StringBuilder();
+ errorMsg.append(validateShipperMaterialDetails(outEntrustOrder));
+ if (outEntrustOrder.getMaterialDetailList() == null || outEntrustOrder.getMaterialDetailList().isEmpty()) {
+ errorMsg.append("物料明细列表不能为空或匹配不上物料信息; ");
+ }
+ if (StringUtils.isEmpty(outEntrustOrder.getToReceiver())) errorMsg.append("To不能为空; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getCarrier())) errorMsg.append("承运商不能为空; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getTransportModeCode())) errorMsg.append("运输方式不能为空; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getSupervisionModeCode())) errorMsg.append("监督方式不能为空; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getDepartureArrivalCountry())) errorMsg.append("出发/到达国家不能为空; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getContactPerson())) errorMsg.append("联系人不能为空; ");
+ if (ObjectUtil.isEmpty(outEntrustOrder.getShipperId())) errorMsg.append("客户名称不能为空或匹配不上客户信息; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getDeclareCustoms())) errorMsg.append("申报地关区不能为空; ");
+ if (StringUtils.isEmpty(outEntrustOrder.getEntryExitCustoms())) errorMsg.append("进出境关别不能为空; ");
+ return errorMsg;
+ }
+
+ /**
+ * @description 初始化物料明细列表,查询物料基础信息并设置物料基础信息ID(与WMS出库管理导入逻辑一致:料号 > SKU码 > 商品名称)
+ * @param itemList 出仓委托单明细列表
+ * @param shipperId 货主ID(用于过滤物料基础信息,确保查询到的是该货主绑定的物料)
+ * @param topOrganizationId 一级组织ID(用于过滤物料基础信息)
+ */
+ private void initList(List itemList, Long shipperId, Long topOrganizationId) {
+ for (OutEntrustOrderDetailDO detail : itemList) {
+ // 未识别货主时不查物料,避免匹配到其他货主的物料基础信息
+ if (shipperId == null) {
+ continue;
+ }
+
+ // 根据明细表中的字段查询物料基础信息(优先:料号 > 商品SKU码 > 商品名称)
+ MaterialBaseInfoPO materialBaseInfoPO = null;
+
+ // 优先使用料号查询(materialNo对应materialCode)
+ String materialNo = detail.getMaterialNo();
+ if (StringUtils.isNotBlank(materialNo)) {
+ List materialList = outEntrustOrderMapper.getMaterialByMaterialCode(materialNo, shipperId, topOrganizationId);
+ if (materialList != null && !materialList.isEmpty()) {
+ materialBaseInfoPO = materialList.get(0);
+ // ==== 料号与规格型号/SKU码一致性校验:任何一项不符直接报对应错误 ====
+ // 双方(trim后)必须完全一致:Excel留空而档案有值、或Excel填了值而档案为空,均视为不一致报错
+ String excelSpec = StringUtils.trimToEmpty(detail.getSpecificationModel());
+ String dbSpec = StringUtils.trimToEmpty(materialBaseInfoPO.getSpecificationModel());
+ if (!excelSpec.equals(dbSpec)) {
+ throw new ServiceException(String.format("导入失败:料号「%s」规格型号与物料档案不一致(Excel:%s / 档案:%s)",
+ materialNo, excelSpec.isEmpty() ? "空" : excelSpec, dbSpec.isEmpty() ? "空" : dbSpec));
+ }
+ String excelSku = StringUtils.trimToEmpty(detail.getSkucode());
+ String dbSku = StringUtils.trimToEmpty(materialBaseInfoPO.getBarCode());
+ if (!excelSku.equals(dbSku)) {
+ throw new ServiceException(String.format("导入失败:料号「%s」SKU码与物料档案不一致(Excel:%s / 档案:%s)",
+ materialNo, excelSku.isEmpty() ? "空" : excelSku, dbSku.isEmpty() ? "空" : dbSku));
+ }
+ } else {
+ // 料号已填写但在该货主下查不到 → 直接报错(与WMS出库导入一致),不再被SKU码/商品名称静默兜底
+ throw new ServiceException(String.format("导入失败:料号「%s」在当前客户(货主)下不存在,请核对料号或在物料管理中维护", materialNo));
+ }
+ }
+
+ // 如果料号查询不到,使用商品SKU码查询(skucode对应barCode)
+ if (materialBaseInfoPO == null && StringUtils.isNotBlank(detail.getSkucode())) {
+ List materialList = outEntrustOrderMapper.getMaterialByBarCode(detail.getSkucode(), shipperId, topOrganizationId);
+ if (materialList != null && !materialList.isEmpty()) {
+ materialBaseInfoPO = materialList.get(0);
+ }
+ }
+
+ // 如果料号和SKU码都查询不到,使用商品名称查询(commodityName对应materialName)
+ if (materialBaseInfoPO == null && StringUtils.isNotBlank(detail.getCommodityName())) {
+ List materialList = outEntrustOrderMapper.getMaterialByMaterialName(detail.getCommodityName(), shipperId, topOrganizationId);
+ if (materialList != null && !materialList.isEmpty()) {
+ materialBaseInfoPO = materialList.get(0);
+ }
+ }
+
+ // 设置物料基础信息ID,并从物料基础信息中回填料号、物料编码、物料名称等信息
+ if (materialBaseInfoPO != null) {
+ detail.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId());
+ // 单价统一从物料档案回填
+ detail.setUnitPrice(materialBaseInfoPO.getUnitPrice());
+ // 如果Excel中没有料号,从物料基础信息中回填
+ if (StringUtils.isBlank(detail.getMaterialNo())) {
+ detail.setMaterialNo(materialBaseInfoPO.getMaterialCode());
+ }
+ // 回填物料编码
+ if (StringUtils.isBlank(detail.getMaterialCode())) {
+ detail.setMaterialCode(materialBaseInfoPO.getMaterialCode());
+ }
+ // 回填商品编号
+ if (StringUtils.isBlank(detail.getCommodityNo())) {
+ detail.setCommodityNo(materialBaseInfoPO.getMaterialCode());
+ }
+ // 回填物料名称(如果Excel中的商品名称为空,使用物料基础信息中的名称)
+ if (StringUtils.isBlank(detail.getCommodityName())) {
+ detail.setCommodityName(materialBaseInfoPO.getMaterialName());
+ }
+ // 回填物料名称到materialName字段
+ detail.setMaterialName(materialBaseInfoPO.getMaterialName());
+ // 回填条形码
+ detail.setBarCode(materialBaseInfoPO.getBarCode());
+ // 如果Excel中没有SKU码,从物料基础信息中回填
+ if (StringUtils.isBlank(detail.getSkucode())) {
+ detail.setSkucode(materialBaseInfoPO.getBarCode());
+ }
+ }
+ // 单位:优先使用Excel中的"单位"字段,如果为空则使用"申报单位",如果还为空则从物料主数据获取(与WMS出库导入处理一致)
+ String unit = StringUtils.isNotBlank(detail.getUnit()) ? detail.getUnit() : null;
+ if (StringUtils.isBlank(unit) && StringUtils.isNotBlank(detail.getDeclareUnit())) {
+ unit = detail.getDeclareUnit();
+ }
+ if (StringUtils.isBlank(unit) && materialBaseInfoPO != null && StringUtils.isNotBlank(materialBaseInfoPO.getUnitName())) {
+ unit = materialBaseInfoPO.getUnitName();
+ }
+ detail.setUnit(unit);
+ }
+ }
+
+ private void initDict(OutEntrustOrderDO outEntrustOrder) {
+ if (ObjectUtil.isNotNull(outEntrustOrder.getContainerNoName())) {
+ AjaxResult containerNo = systemServiceFeign.selectListByDictType("cabinetNo");
+ if (ObjectUtil.isNotNull(containerNo) && "200".equals(String.valueOf(containerNo.get("code")))) {
+ List containerNoList = JSON.parseArray(JSONObject.toJSONString(containerNo.get("data")), SysDictDataVo.class);
+ for (SysDictDataVo sysDictDataVo : containerNoList) {
+ if (outEntrustOrder.getContainerNoName().equals(sysDictDataVo.getDictLabel())) {
+ outEntrustOrder.setContainerNo(sysDictDataVo.getDictValue());
+ break;
+ }
+ }
+ }
+ }
+
+ if (ObjectUtil.isNotNull(outEntrustOrder.getTransportModeName())) {
+ AjaxResult transportMode = systemServiceFeign.selectListByDictType("transportMode");
+ if (ObjectUtil.isNotNull(transportMode) && "200".equals(String.valueOf(transportMode.get("code")))) {
+ List transportModeList = JSON.parseArray(JSONObject.toJSONString(transportMode.get("data")), SysDictDataVo.class);
+ for (SysDictDataVo sysDictDataVo : transportModeList) {
+ if (outEntrustOrder.getTransportModeName().equals(sysDictDataVo.getDictLabel())) {
+ outEntrustOrder.setTransportModeCode(sysDictDataVo.getDictValue());
+ break;
+ }
+ }
+ }
+ }
+
+ if (ObjectUtil.isNotNull(outEntrustOrder.getSupervisionModeName())) {
+ AjaxResult supervisionMode = systemServiceFeign.selectListByDictType("controlType");
+ if (ObjectUtil.isNotNull(supervisionMode) && "200".equals(String.valueOf(supervisionMode.get("code")))) {
+ List supervisionModeList = JSON.parseArray(JSONObject.toJSONString(supervisionMode.get("data")), SysDictDataVo.class);
+ for (SysDictDataVo sysDictDataVo : supervisionModeList) {
+ if (outEntrustOrder.getSupervisionModeName().equals(sysDictDataVo.getDictLabel())) {
+ outEntrustOrder.setSupervisionModeCode(sysDictDataVo.getDictValue());
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * 导入出库单:解析出的货主用户是否属于当前登录用户同一组织(organizationId)。
+ * 仅当登录用户带有 organizationId 时启用过滤;否则保持与旧行为一致。
+ */
+ private boolean shipperMatchesImporterOrganization(UserPo userPo, Long loginOrganizationId) {
+ if (loginOrganizationId == null) {
+ return true;
+ }
+ if (userPo == null) {
+ return false;
+ }
+ Long oid = userPo.getOrganizationId();
+ return oid != null && loginOrganizationId.equals(oid);
+ }
+
+ /**
+ * 按客户名称或数字ID解析货主用户,逻辑与WMS出库管理导入一致:getInfoByName → 货主列表兜底,均做 organizationId 校验。
+ */
+ private UserPo resolveCustomerShipperUserPoForImport(String customerName) {
+ if (StringUtils.isEmpty(customerName)) {
+ return null;
+ }
+ Long loginOrganizationId = null;
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (loginUser != null && loginUser.getUserPo() != null) {
+ loginOrganizationId = loginUser.getUserPo().getOrganizationId();
+ }
+ String shipperName = customerName.trim();
+ if (StringUtils.isEmpty(shipperName)) {
+ return null;
+ }
+
+ // 纯数字:按用户ID查询
+ if (shipperName.matches("\\d+")) {
+ try {
+ Long possibleId = Long.valueOf(shipperName);
+ AjaxResult ajaxResult = userServiceFeign.getInfo(possibleId);
+ if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
+ UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
+ if (userPo != null && shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
+ return userPo;
+ }
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ return null;
+ }
+
+ // 按名称查询(用户中心)
+ try {
+ AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName);
+ if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
+ UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
+ if (userPo != null && shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
+ return userPo;
+ }
+ }
+ } catch (Exception e) {
+ // 继续货主列表兜底
+ }
+
+ // 货主列表兜底(与WMS出库导入一致)
+ try {
+ AjaxResult shipperListResult = userServiceFeign.userShipperListAll();
+ if ("200".equals(String.valueOf(shipperListResult.get("code"))) && shipperListResult.get("data") != null) {
+ Object data = shipperListResult.get("data");
+ List
+ *
+ * @author rcx
+ * @date 2026-09-14
+ */
+@Data
+@ApiModel(value = "出库执行单列表合计对象", description = "出库执行单列表合计响应对象")
+public class ExecutionStockOutOrderTotalPO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("计划数量总数(一级明细计划数量之和)")
+ private BigDecimal totalPlanQuantity;
+
+ @ApiModelProperty("出库数量总数(一级明细出库数量之和)")
+ private BigDecimal totalOutboundQuantity;
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java
index 320fa25fa..5b1971c29 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java
@@ -26,6 +26,7 @@ import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder;
import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService;
import com.mhd.oms.domain.executionStockOutOrder.repository.mapper.ExecutionStockOutOrderMapper;
import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO;
+import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderTotalPO;
import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO;
import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDTO;
import com.mhd.oms.domain.gwLog.entity.GwLog;
@@ -225,6 +226,15 @@ public class ExecutionStockOutOrderApplicationService {
return stockOutOrderPOS;
}
+ /**
+ * 列表合计:按查询条件全量(不分页)汇总一级明细的计划数量与出库数量。
+ * 须在 queryList/queryList1 之后用同一个DO调用:数据权限条件由列表查询原地写入DO,
+ * 合计查询才能继承生效后的筛选;且 PageHelper startPage 只拦截下一条SQL,本查询不会被分页。
+ */
+ public ExecutionStockOutOrderTotalPO queryListTotal(ExecutionStockOutOrderDO stockOutOrderDO) {
+ return stockOutOrderDomainService.queryListTotal(stockOutOrderDO);
+ }
+
/**
* 新增出库单
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java
index bb352395a..1dbeed71b 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java
@@ -30,6 +30,7 @@ import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder;
import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService;
import com.mhd.oms.domain.executionStockOutOrder.repository.mapper.ExecutionStockOutOrderMapper;
import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO;
+import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderTotalPO;
import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO;
import com.mhd.oms.domain.materialBaseInfo.service.MaterialBaseInfoResolveService;
import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink;
@@ -114,6 +115,13 @@ public class ExecutionStockOutOrderDomainService {
return stockOutOrderService.queryList(stockOutOrderDO);
}
+ /**
+ * 列表合计:按查询条件全量(不分页)汇总一级明细的计划数量与出库数量
+ */
+ public ExecutionStockOutOrderTotalPO queryListTotal(ExecutionStockOutOrderDO stockOutOrderDO) {
+ return stockOutOrderService.queryListTotal(stockOutOrderDO);
+ }
+
/**
* 从单号列表中提取最大序号
* 单号格式: prefix + 数字序号(如 RK260807001 中 prefix=RK260807, 序号=001)
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/facade/IReservationStockOutOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/facade/IReservationStockOutOrderService.java
index b0ce26bdd..36d728c3a 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/facade/IReservationStockOutOrderService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/facade/IReservationStockOutOrderService.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
+import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderTotalPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
@@ -22,6 +23,11 @@ public interface IReservationStockOutOrderService extends IService queryList(ReservationStockOutOrderDO stockOutOrderDO);
+ /**
+ * 列表合计:按查询条件全量(不分页)汇总一级明细的计划数量与出库数量
+ */
+ public ReservationStockOutOrderTotalPO queryListTotal(ReservationStockOutOrderDO stockOutOrderDO);
+
/**
* 新增出库单
*/
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/mapper/ReservationStockOutOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/mapper/ReservationStockOutOrderMapper.java
index a459e02e2..62fc97bee 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/mapper/ReservationStockOutOrderMapper.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/mapper/ReservationStockOutOrderMapper.java
@@ -6,6 +6,7 @@ import com.mhd.common.core.domain.po.UserPo;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
+import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderTotalPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import org.apache.ibatis.annotations.Param;
//import com.mhd.wms.domain.stockOutOrder.entity.ReservationStockOutOrder;
@@ -27,6 +28,11 @@ public interface ReservationStockOutOrderMapper extends BaseMapper queryList(ReservationStockOutOrderDO stockOutOrderDO);
+ /**
+ * 列表合计:按查询条件全量(不分页)汇总一级明细的计划数量与出库数量
+ */
+ public ReservationStockOutOrderTotalPO queryListTotal(ReservationStockOutOrderDO stockOutOrderDO);
+
/**
* 出库单提货单打印-表头
*/
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/persistence/ReservationStockOutOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/persistence/ReservationStockOutOrderImpl.java
index c91598bc3..e7aea671c 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/persistence/ReservationStockOutOrderImpl.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/repository/persistence/ReservationStockOutOrderImpl.java
@@ -11,6 +11,7 @@ import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrd
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.mapper.ReservationStockOutOrderMapper;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
+import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderTotalPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.system.api.model.LoginUser;
//import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskTypeService;
@@ -48,6 +49,15 @@ public class ReservationStockOutOrderImpl extends ServiceImpl当前筛选条件下不分页的全量合计,随分页列表一起返回
+ * (totalPlanQuantity/totalOutboundQuantity),计划数量与出库数量分开计算
+ *
+ * @author rcx
+ * @date 2026-09-14
+ */
+@Data
+@ApiModel(value = "出库业务单列表合计对象", description = "出库业务单列表合计响应对象")
+public class ReservationStockOutOrderTotalPO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("计划数量总数(一级明细计划数量之和)")
+ private BigDecimal totalPlanQuantity;
+
+ @ApiModelProperty("出库数量总数(一级明细出库数量之和)")
+ private BigDecimal totalOutboundQuantity;
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java
index e10484acd..b3186978b 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java
@@ -45,6 +45,7 @@ import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrd
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.mapper.ReservationStockOutOrderMapper;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
+import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderTotalPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDTO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.vo.GwOutDetail;
@@ -246,6 +247,15 @@ public class ReservationStockOutOrderApplicationService {
return stockOutOrderPOS;
}
+ /**
+ * 列表合计:按查询条件全量(不分页)汇总一级明细的计划数量与出库数量。
+ * 须在 queryList/queryList1 之后用同一个DO调用:数据权限条件由列表查询原地写入DO,
+ * 合计查询才能继承生效后的筛选;且 PageHelper startPage 只拦截下一条SQL,本查询不会被分页。
+ */
+ public ReservationStockOutOrderTotalPO queryListTotal(ReservationStockOutOrderDO stockOutOrderDO) {
+ return stockOutOrderDomainService.queryListTotal(stockOutOrderDO);
+ }
+
/**
* 新增出库单
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java
index 9b91a0600..35fc4b80b 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java
@@ -57,6 +57,7 @@ import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.repository.mapper
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.mapper.ReservationStockOutOrderMapper;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
+import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderTotalPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.oms.domain.reserveStockOutOrder.repository.mapper.ReserveStockOutOrderMapper;
import com.mhd.system.api.SystemServiceFeign;
@@ -142,6 +143,13 @@ public class ReservationStockOutOrderDomainService {
public List queryList(ReservationStockOutOrderDO stockOutOrderDO) {
return stockOutOrderService.queryList(stockOutOrderDO);
}
+
+ /**
+ * 列表合计:按查询条件全量(不分页)汇总一级明细的计划数量与出库数量
+ */
+ public ReservationStockOutOrderTotalPO queryListTotal(ReservationStockOutOrderDO stockOutOrderDO) {
+ return stockOutOrderService.queryListTotal(stockOutOrderDO);
+ }
/**
* 从单号列表中提取最大序号
* 单号格式: prefix + 数字序号(如 RK260807001 中 prefix=RK260807, 序号=001)
diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java
index ee912d037..277ab2e10 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java
@@ -1,15 +1,17 @@
package com.mhd.oms.interfaces.facade.ReservationStockOutOrder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.pagehelper.PageInfo;
+import com.mhd.common.core.constant.HttpStatus;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
-import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO;
import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDTO;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
+import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderTotalPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDTO;
import com.mhd.oms.domain.reservationStockOutOrder.service.ReservationStockOutOrderApplicationService;
@@ -46,17 +48,19 @@ public class ReservationStockOutOrderApi extends BaseController {
private IReservationStockOutOrderService stockOutOrderService;
/**
- * 分页查询出库单列表
+ * 分页查询出库单列表(附:当前查询条件下全量不分页的计划数量总数/出库数量总数)
*/
@ApiOperation("查询出库单列表")
@GetMapping("/list")
- public TableDataInfo list(ReservationStockOutOrderDTO stockOutOrderDTO)
+ public HashMap list(ReservationStockOutOrderDTO stockOutOrderDTO)
{
//转换实体
ReservationStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO);
startPage();
List list = stockOutOrderApplicationService.queryList(stockOutOrderDO);
- return getDataTable(list);
+ // 合计须在列表查询后用同一个DO查询:数据权限条件由列表查询原地写入DO,且不再被分页拦截
+ ReservationStockOutOrderTotalPO total = stockOutOrderApplicationService.queryListTotal(stockOutOrderDO);
+ return getDataTableWithTotal(list, total);
}
@@ -250,13 +254,31 @@ public class ReservationStockOutOrderApi extends BaseController {
@ApiOperation("查询出库单列表")
@GetMapping("/list1")
- public TableDataInfo list1(ReservationStockOutOrderDTO stockOutOrderDTO)
+ public HashMap list1(ReservationStockOutOrderDTO stockOutOrderDTO)
{
//转换实体
ReservationStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO);
startPage();
List list = stockOutOrderApplicationService.queryList1(stockOutOrderDO);
- return getDataTable(list);
+ // 合计须在列表查询后用同一个DO查询:数据权限条件由列表查询原地写入DO,且不再被分页拦截
+ ReservationStockOutOrderTotalPO total = stockOutOrderApplicationService.queryListTotal(stockOutOrderDO);
+ return getDataTableWithTotal(list, total);
+ }
+
+ /**
+ * 分页结果 + 合计:data/total/code/msg 之外追加计划数量总数/出库数量总数(key与TableDataInfo序列化结果一致,仅多两个字段)
+ */
+ private HashMap getDataTableWithTotal(List> list, ReservationStockOutOrderTotalPO total) {
+ HashMap result = new HashMap<>();
+ result.put("data", list);
+ result.put("total", new PageInfo<>(list).getTotal());
+ result.put("code", HttpStatus.SUCCESS);
+ result.put("msg", "查询成功");
+ if (total != null) {
+ result.put("totalPlanQuantity", total.getTotalPlanQuantity());
+ result.put("totalOutboundQuantity", total.getTotalOutboundQuantity());
+ }
+ return result;
}
@ApiOperation("生成出库预约单号")
diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java
index d0c679bc3..f4583ed3d 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java
@@ -1,13 +1,15 @@
package com.mhd.oms.interfaces.facade.executionStockOutOrder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.pagehelper.PageInfo;
+import com.mhd.common.core.constant.HttpStatus;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
-import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO;
import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder;
import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService;
import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO;
+import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderTotalPO;
import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO;
import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDTO;
import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderApplicationService;
@@ -45,17 +47,19 @@ public class ExecutionStockOutOrderApi extends BaseController {
private IExecutionStockOutOrderService stockOutOrderService;
/**
- * 分页查询出库单列表
+ * 分页查询出库单列表(附:当前查询条件下全量不分页的计划数量总数/出库数量总数)
*/
@ApiOperation("查询出库单列表")
@GetMapping("/list")
- public TableDataInfo list(ExecutionStockOutOrderDTO stockOutOrderDTO)
+ public HashMap list(ExecutionStockOutOrderDTO stockOutOrderDTO)
{
//转换实体
ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO);
startPage();
List list = stockOutOrderApplicationService.queryList(stockOutOrderDO);
- return getDataTable(list);
+ // 合计须在列表查询后用同一个DO查询:数据权限条件由列表查询原地写入DO,且不再被分页拦截
+ ExecutionStockOutOrderTotalPO total = stockOutOrderApplicationService.queryListTotal(stockOutOrderDO);
+ return getDataTableWithTotal(list, total);
}
@@ -234,13 +238,31 @@ public class ExecutionStockOutOrderApi extends BaseController {
@ApiOperation("查询出库单列表")
@GetMapping("/list1")
- public TableDataInfo list1(ExecutionStockOutOrderDTO stockOutOrderDTO)
+ public HashMap list1(ExecutionStockOutOrderDTO stockOutOrderDTO)
{
//转换实体
ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO);
startPage();
List list = stockOutOrderApplicationService.queryList1(stockOutOrderDO);
- return getDataTable(list);
+ // 合计须在列表查询后用同一个DO查询:数据权限条件由列表查询原地写入DO,且不再被分页拦截
+ ExecutionStockOutOrderTotalPO total = stockOutOrderApplicationService.queryListTotal(stockOutOrderDO);
+ return getDataTableWithTotal(list, total);
+ }
+
+ /**
+ * 分页结果 + 合计:data/total/code/msg 之外追加计划数量总数/出库数量总数(key与TableDataInfo序列化结果一致,仅多两个字段)
+ */
+ private HashMap getDataTableWithTotal(List> list, ExecutionStockOutOrderTotalPO total) {
+ HashMap result = new HashMap<>();
+ result.put("data", list);
+ result.put("total", new PageInfo<>(list).getTotal());
+ result.put("code", HttpStatus.SUCCESS);
+ result.put("msg", "查询成功");
+ if (total != null) {
+ result.put("totalPlanQuantity", total.getTotalPlanQuantity());
+ result.put("totalOutboundQuantity", total.getTotalOutboundQuantity());
+ }
+ return result;
}
}
\ No newline at end of file
diff --git a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml
index ced13d638..ca551b9c2 100644
--- a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml
+++ b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml
@@ -117,6 +117,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
@@ -408,7 +409,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
+
+
+
+
+