diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java
index e18484e8d..0d65c89a1 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java
@@ -18,7 +18,7 @@ import java.util.Set;
/**
* bms财务结算系统feign调用接口
*/
-@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
+@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface BmsServiceFeign {
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java
index e9418197a..8a7006304 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java
@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.concurrent.CompletableFuture;
-@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
+@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface OmsServiceFeign {
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java
index de19e469b..ba9a45148 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java
@@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
-@FeignClient(contextId = "commonWlhyServiceFeign",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class)
+@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.33.0.129:8014",configuration = FeignAutoConfiguration.class)
public interface WlhyServiceFeign {
/**
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java
index 26a92624c..7fbd7dd9b 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java
@@ -21,7 +21,7 @@ import java.util.Map;
* @description: TODO
* @date 2024/5/10 8:58
**/
-@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class)
+@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface WmsServiceFeign {
/**
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java
index 12571141a..beba5b1af 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java
@@ -9,7 +9,7 @@ import com.mhd.system.api.feign.FeignAutoConfiguration;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
-@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
+@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface YmsServiceFeign {
/**
diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialInventoryOmsParamDO.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialInventoryOmsParamDO.java
index 242ad102f..05f165a1a 100644
--- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialInventoryOmsParamDO.java
+++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialInventoryOmsParamDO.java
@@ -83,6 +83,8 @@ public class MaterialInventoryOmsParamDO extends BaseVOEntity {
private Date productionDate;
//过期日期
private Date expiryDate;
+ //进货日期
+ private Date purchaseDate;
private String executioOrderNumber;
diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java
index 6238639f6..9fd21ae67 100644
--- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java
+++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java
@@ -26,7 +26,7 @@ import java.io.InputStream;
import java.util.List;
import java.util.Map;
-@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.30:8012", configuration = FeignAutoConfiguration.class)
+@FeignClient(value = "mhd-third-party-service",url = "http://10.33.0.129:8012",configuration = FeignAutoConfiguration.class)
public interface ThirdPartyServiceFeign {
//查询当前组织所有三方接口信息
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 buildExportList(ExpenseAccountDO expenseAccountDO) {
+ List exportList = new ArrayList<>();
+ List list = this.queryList(expenseAccountDO);
+ if (list == null || list.isEmpty()) {
+ return exportList;
+ }
+ for (ExpenseAccountPO po : list) {
+ ExpenseAccountExportVO vo = new ExpenseAccountExportVO();
+ BeanUtils.copyProperties(po, vo);
+ exportList.add(vo);
+ }
+ return exportList;
+ }
+
/**
* 修改状态
* @param expenseAccountDTO
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java
index 566c37e41..7bd6df9fa 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java
@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON;
import com.mhd.basic.domain.storageLocation.repository.po.StorageLocationPO;
import com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO;
import com.mhd.basic.domain.storageLocation.service.StorageLocationDomainService;
+import com.mhd.basic.interfaces.dto.storageLocation.StorageLocationDTO;
import com.mhd.basic.domain.storageSection.repository.todo.StorageSectionDO;
import com.mhd.basic.infrastructure.feign.vo.SysDictDataVo;
import com.mhd.common.core.domain.po.UserPo;
@@ -207,6 +208,39 @@ public class StorageLocationApplicationService {
return storageLocationDomainService.getInfo(storageLocationId);
}
+ /**
+ * 复制库位-获取原库位数据供前端回显
+ * 前端拿到数据后跳转到新增库位页面,用户修改编码后通过edit接口提交新增
+ */
+ public StorageLocationPO copyStorageLocation(StorageLocationDTO storageLocationDTO) {
+ if (storageLocationDTO.getStorageLocationId() == null) {
+ throw new ServiceException("原库位id不能为空");
+ }
+ // 获取原库位信息
+ StorageLocationPO originalStorageLocation = storageLocationDomainService.getInfo(storageLocationDTO.getStorageLocationId());
+ if (null == originalStorageLocation) {
+ throw new ServiceException("原库位信息未找到");
+ }
+ // 清空唯一性字段:库位id不清空会导致提交后走修改分支覆盖原库位;
+ // 库位编码同组织同仓库唯一,须由用户重新填写;条码为物理唯一标识,一并清空
+ originalStorageLocation.setStorageLocationId(null);
+ originalStorageLocation.setStorageLocationCode(null);
+ originalStorageLocation.setLocationBarCode(null);
+ // 状态重置为初始值:新库位无库存(空)、启用、未作废
+ originalStorageLocation.setStatus(1);
+ originalStorageLocation.setOpeningUp(1);
+ originalStorageLocation.setNullify(1);
+ // 清空审计字段,提交新增时由Assembler按当前登录人重新生成
+ originalStorageLocation.setCreateBy(null);
+ originalStorageLocation.setCreateByName(null);
+ originalStorageLocation.setCreateTime(null);
+ originalStorageLocation.setUpdateBy(null);
+ originalStorageLocation.setUpdateByName(null);
+ originalStorageLocation.setUpdateTime(null);
+ // 其余业务字段(仓库/库区/库位组、分类/种类/混放策略、限制、长宽高、坐标、备注)保留回显
+ return originalStorageLocation;
+ }
+
public int getStorageLocationCount(StorageLocationDO storageLocationDO)
{
return storageLocationDomainService.getStorageLocationCount(storageLocationDO);
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageSection/StorageSectionApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageSection/StorageSectionApplicationService.java
index 0a17bb062..83cfb1af9 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageSection/StorageSectionApplicationService.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageSection/StorageSectionApplicationService.java
@@ -21,6 +21,7 @@ import com.mhd.system.service.ISysDictTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
import java.util.List;
/**
* 库区ApplicationService
@@ -42,11 +43,32 @@ public class StorageSectionApplicationService {
*/
public List queryList(StorageSectionDO storageSectionDO) {
+ //设置查询数据权限
+ applyQueryDataPermission(storageSectionDO);
+ return storageSectionDomainService.queryList(storageSectionDO);
+ }
+
+ /**
+ * 库区面积合计:与 /list 相同的数据权限和筛选条件,SQL 直接 SUM(库区面积),
+ * 保证合计数与列表中各行库区面积之和一致
+ */
+ public BigDecimal sumStorageRegion(StorageSectionDO storageSectionDO) {
+ //与 /list 共用同一数据权限,保证合计与列表口径一致
+ applyQueryDataPermission(storageSectionDO);
+ return storageSectionDomainService.sumStorageRegion(storageSectionDO);
+ }
+
+ /**
+ * @description 设置查询数据权限(queryList 与 sumStorageRegion 共用)
+ * @author ZhouGY
+ * @param storageSectionDO
+ */
+ private void applyQueryDataPermission(StorageSectionDO storageSectionDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = storageSectionDO.getOrganizationId(); // 前端传递的 organizationId
-
+
// 数据权限:根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己
if (userOrganizationId != null && userOrganizationId == 2827L) {
@@ -91,7 +113,6 @@ public class StorageSectionApplicationService {
}
}
}
- return storageSectionDomainService.queryList(storageSectionDO);
}
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/facade/IStorageSectionService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/facade/IStorageSectionService.java
index 925dfb501..2d26a4299 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/facade/IStorageSectionService.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/facade/IStorageSectionService.java
@@ -5,6 +5,7 @@ import com.mhd.basic.domain.storageSection.entity.StorageSection;
import com.mhd.basic.domain.storageSection.repository.po.StorageSectionPO;
import com.mhd.basic.domain.storageSection.repository.todo.StorageSectionDO;
+import java.math.BigDecimal;
import java.util.List;
/**
@@ -20,6 +21,11 @@ public interface IStorageSectionService extends IService
*/
public List queryList(StorageSectionDO storageSectionDO);
+ /**
+ * 库区面积合计(与 queryList 相同筛选条件)
+ */
+ public BigDecimal sumStorageRegion(StorageSectionDO storageSectionDO);
+
/**
* 新增库区
*/
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/mapper/StorageSectionMapper.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/mapper/StorageSectionMapper.java
index 46153810f..82196f40e 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/mapper/StorageSectionMapper.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/mapper/StorageSectionMapper.java
@@ -1,5 +1,6 @@
package com.mhd.basic.domain.storageSection.repository.mapper;
+import java.math.BigDecimal;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.basic.domain.storageSection.entity.StorageSection;
@@ -19,4 +20,9 @@ public interface StorageSectionMapper extends BaseMapper
*/
public List queryList(StorageSectionDO storageSectionDO);
+ /**
+ * 库区面积合计(与 queryList 相同筛选条件)
+ */
+ public BigDecimal sumStorageRegion(StorageSectionDO storageSectionDO);
+
}
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/persistence/StorageSectionImpl.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/persistence/StorageSectionImpl.java
index 2f6e3fcfb..5f1f0baae 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/persistence/StorageSectionImpl.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/storageSection/repository/persistence/StorageSectionImpl.java
@@ -10,6 +10,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -33,6 +34,15 @@ public class StorageSectionImpl extends ServiceImpl list = expenseAccountApplicationService.buildExportList(expenseAccountDO);
+
+ //设置下载头,防止浏览器乱码
+ String fileName = URLEncoder.encode("费用科目导出", "UTF-8").replaceAll("\\+", "%20");
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setCharacterEncoding("utf-8");
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+
+ ExcelUtil util = new ExcelUtil<>(ExpenseAccountExportVO.class);
+ util.exportExcel(response, list, "费用科目");
+ }
}
\ No newline at end of file
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java
index 6f071de45..2c211ae5d 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java
@@ -19,6 +19,7 @@ import com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO;
import com.mhd.basic.domain.storageLocation.repository.po.StorageLocationPO;
import com.mhd.basic.application.service.storageLocation.StorageLocationApplicationService;
import com.mhd.basic.interfaces.assember.storageLocation.StorageLocationAssembler;
+import com.mhd.common.core.exception.ServiceException;
import javax.annotation.Resource;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
@@ -127,6 +128,24 @@ public class StorageLocationApi extends BaseController{
{
return AjaxResult.success(storageLocationApplicationService.getInfo(storageLocationId));
}
+
+ /**
+ * 复制库位-获取原库位数据用于回显
+ */
+ @ApiOperation("复制库位-获取原库位数据用于回显")
+ @PostMapping("/copyStorageLocation")
+ public AjaxResult copyStorageLocation(@RequestBody StorageLocationDTO storageLocationDTO)
+ {
+ if(storageLocationDTO.getStorageLocationId() == null){
+ throw new ServiceException("原库位id不能为空");
+ }
+ try {
+ StorageLocationPO result = storageLocationApplicationService.copyStorageLocation(storageLocationDTO);
+ return AjaxResult.success(result);
+ }catch (Exception e){
+ return AjaxResult.error("复制库位失败:"+e.getMessage());
+ }
+ }
@ApiOperation("获取库位总数")
@PostMapping(value = "/getStorageLocationCount")
public AjaxResult getStorageLocationCount(@RequestBody StorageLocationDTO storageLocationDTO)
diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageSection/StorageSectionApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageSection/StorageSectionApi.java
index 8125fdb67..3b7ff2366 100644
--- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageSection/StorageSectionApi.java
+++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageSection/StorageSectionApi.java
@@ -55,6 +55,18 @@ public class StorageSectionApi extends BaseController{
return getDataTable(list);
}
+ /**
+ * 库区面积合计:与 /list 相同的筛选条件,返回库区面积总和
+ */
+ @ApiOperation("查询库区面积合计(与库区列表相同筛选条件,SUM(库区面积))")
+ @GetMapping("/sumStorageRegion")
+ public AjaxResult sumStorageRegion(StorageSectionDTO storageSectionDTO)
+ {
+ //转换实体
+ StorageSectionDO storageSectionDO = storageSectionAssembler.toDO(storageSectionDTO);
+ return AjaxResult.success(storageSectionApplicationService.sumStorageRegion(storageSectionDO));
+ }
+
/**
* 分页查询库区列表
*/
diff --git a/mhd-modules/mhd-system/src/main/resources/mapper/basic/storageSection/StorageSectionMapper.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/storageSection/StorageSectionMapper.xml
index d90903254..415037983 100644
--- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/storageSection/StorageSectionMapper.xml
+++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/storageSection/StorageSectionMapper.xml
@@ -102,4 +102,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
order by a.storage_name asc, a.create_time desc
+
+
+
\ No newline at end of file
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/facade/IExecutionInboundRankService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/facade/IExecutionInboundRankService.java
new file mode 100644
index 000000000..183035a7e
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/facade/IExecutionInboundRankService.java
@@ -0,0 +1,26 @@
+package com.mhd.oms.domain.inboundRank.repository.facade;
+
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundMaterialRankPO;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundRankTotalPO;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDO;
+
+import java.util.List;
+
+/**
+ * 入库排名统计Service接口
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+public interface IExecutionInboundRankService {
+
+ /**
+ * 商品入库排名列表(仓单+货品汇总,按件数降序)
+ */
+ List queryMaterialRankList(ExecutionInboundRankDO executionInboundRankDO);
+
+ /**
+ * 商品入库排名合计(不分页)
+ */
+ ExecutionInboundRankTotalPO queryMaterialRankTotal(ExecutionInboundRankDO executionInboundRankDO);
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java
new file mode 100644
index 000000000..64654e548
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java
@@ -0,0 +1,26 @@
+package com.mhd.oms.domain.inboundRank.repository.mapper;
+
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundMaterialRankPO;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundRankTotalPO;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDO;
+
+import java.util.List;
+
+/**
+ * 入库排名统计Mapper接口
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+public interface ExecutionInboundRankMapper {
+
+ /**
+ * 商品入库排名列表(仓单+货品汇总,按件数降序)
+ */
+ List queryMaterialRankList(ExecutionInboundRankDO executionInboundRankDO);
+
+ /**
+ * 商品入库排名合计(不分页,当前筛选条件全量合计)
+ */
+ ExecutionInboundRankTotalPO queryMaterialRankTotal(ExecutionInboundRankDO executionInboundRankDO);
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/persistence/ExecutionInboundRankImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/persistence/ExecutionInboundRankImpl.java
new file mode 100644
index 000000000..fe2f19f1c
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/persistence/ExecutionInboundRankImpl.java
@@ -0,0 +1,34 @@
+package com.mhd.oms.domain.inboundRank.repository.persistence;
+
+import com.mhd.oms.domain.inboundRank.repository.facade.IExecutionInboundRankService;
+import com.mhd.oms.domain.inboundRank.repository.mapper.ExecutionInboundRankMapper;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundMaterialRankPO;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundRankTotalPO;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 入库排名统计Service业务层处理
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Service
+public class ExecutionInboundRankImpl implements IExecutionInboundRankService {
+
+ @Autowired
+ private ExecutionInboundRankMapper executionInboundRankMapper;
+
+ @Override
+ public List queryMaterialRankList(ExecutionInboundRankDO executionInboundRankDO) {
+ return executionInboundRankMapper.queryMaterialRankList(executionInboundRankDO);
+ }
+
+ @Override
+ public ExecutionInboundRankTotalPO queryMaterialRankTotal(ExecutionInboundRankDO executionInboundRankDO) {
+ return executionInboundRankMapper.queryMaterialRankTotal(executionInboundRankDO);
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java
new file mode 100644
index 000000000..6532af87f
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java
@@ -0,0 +1,81 @@
+package com.mhd.oms.domain.inboundRank.repository.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mhd.common.core.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 入库排名统计PO(一行 = 某仓单内某货品的合计,按件数降序排名)
+ *
+ * 数据源跨库取 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
+ * @date 2026-08-31
+ */
+@Data
+@ApiModel(value = "入库排名统计对象", description = "入库排名统计响应对象")
+public class ExecutionInboundMaterialRankPO 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("仓单编号(WMS入库单号)")
+ @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("件数(仓单内该货品实际上架量合计 SHELVES_QUANTITY,排名依据)")
+ @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_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
new file mode 100644
index 000000000..c8a51892e
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java
@@ -0,0 +1,39 @@
+package com.mhd.oms.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 ExecutionInboundRankTotalPO 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_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDO.java
new file mode 100644
index 000000000..2004bbc56
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDO.java
@@ -0,0 +1,47 @@
+package com.mhd.oms.domain.inboundRank.repository.todo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 入库排名统计查询DO
+ *
+ * topOrganizationId 由服务端按登录用户注入,前端不传
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Data
+public class ExecutionInboundRankDO 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;
+}
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
new file mode 100644
index 000000000..968c289d5
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java
@@ -0,0 +1,44 @@
+package com.mhd.oms.domain.inboundRank.repository.todo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 入库排名统计入参DTO
+ *
+ * 数据源跨库取 WMS 入库链路(NGWL_TEST_WMS.stock_in_order / in_material_detail,OMS 执行单状态/上架量不回传)
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Data
+public class ExecutionInboundRankDTO 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_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankApplicationService.java
new file mode 100644
index 000000000..5539189ca
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankApplicationService.java
@@ -0,0 +1,69 @@
+package com.mhd.oms.domain.inboundRank.service;
+
+import com.mhd.common.core.exception.ServiceException;
+import com.mhd.common.core.utils.StringUtils;
+import com.mhd.common.security.utils.SecurityUtils;
+import com.mhd.system.api.model.LoginUser;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundMaterialRankPO;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundRankTotalPO;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 入库排名统计应用服务
+ *
+ * 负责登录用户组织隔离注入、日期区间校验,查询逻辑在 ExecutionInboundRankDomainService → ExecutionInboundRankMapper.xml
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Service
+@Slf4j
+public class ExecutionInboundRankApplicationService {
+
+ @Autowired
+ private ExecutionInboundRankDomainService executionInboundRankDomainService;
+
+ /**
+ * 分页查询商品入库排名列表(仓单+货品汇总,按件数降序)
+ */
+ public List queryMaterialRankList(ExecutionInboundRankDO executionInboundRankDO) {
+ fillLoginContext(executionInboundRankDO);
+ return executionInboundRankDomainService.queryMaterialRankList(executionInboundRankDO);
+ }
+
+ /**
+ * 商品入库排名合计(当前筛选条件全量,不分页)
+ */
+ public ExecutionInboundRankTotalPO queryMaterialRankTotal(ExecutionInboundRankDO executionInboundRankDO) {
+ return executionInboundRankDomainService.queryMaterialRankTotal(executionInboundRankDO);
+ }
+
+ /**
+ * 导出商品入库排名(不分页全量)
+ */
+ public List exportMaterialRank(ExecutionInboundRankDO executionInboundRankDO) {
+ fillLoginContext(executionInboundRankDO);
+ return executionInboundRankDomainService.queryMaterialRankList(executionInboundRankDO);
+ }
+
+ /**
+ * 注入登录用户组织隔离,并校验入仓日期区间必填
+ */
+ private void fillLoginContext(ExecutionInboundRankDO executionInboundRankDO) {
+ if (StringUtils.isEmpty(executionInboundRankDO.getWarehouseDateStart()) || StringUtils.isEmpty(executionInboundRankDO.getWarehouseDateEnd())) {
+ throw new ServiceException("请选择统计日期区间");
+ }
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (loginUser != null && loginUser.getUserPo() != null) {
+ Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
+ if (topOrganizationId != null && topOrganizationId != 1) {
+ executionInboundRankDO.setTopOrganizationId(topOrganizationId);
+ }
+ }
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankAssembler.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankAssembler.java
new file mode 100644
index 000000000..eb4262b8c
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankAssembler.java
@@ -0,0 +1,36 @@
+package com.mhd.oms.domain.inboundRank.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException;
+import com.mhd.common.core.exception.digitalLogisticsException.UserError;
+import com.mhd.common.core.utils.IgnoreNullUtil;
+import com.mhd.common.core.utils.bean.BeanUtils;
+import com.mhd.common.security.utils.SecurityUtils;
+import com.mhd.system.api.model.LoginUser;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDO;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDTO;
+import org.springframework.stereotype.Component;
+
+/**
+ * 入库排名统计Assembler
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Component
+public class ExecutionInboundRankAssembler {
+
+ /**
+ * 转换实体
+ */
+ public ExecutionInboundRankDO toDO(ExecutionInboundRankDTO executionInboundRankDTO) {
+ ExecutionInboundRankDO executionInboundRankDO = new ExecutionInboundRankDO();
+ // 拷贝
+ BeanUtils.copyProperties(executionInboundRankDTO, executionInboundRankDO, IgnoreNullUtil.getNullPropertyNames(executionInboundRankDTO));
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (ObjectUtil.isNull(loginUser)) {
+ throw new DigitalLogisticsException(UserError.TIMEOUT);
+ }
+ return executionInboundRankDO;
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankDomainService.java
new file mode 100644
index 000000000..1b2c34971
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/service/ExecutionInboundRankDomainService.java
@@ -0,0 +1,39 @@
+package com.mhd.oms.domain.inboundRank.service;
+
+import com.mhd.oms.domain.inboundRank.repository.facade.IExecutionInboundRankService;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundMaterialRankPO;
+import com.mhd.oms.domain.inboundRank.repository.po.ExecutionInboundRankTotalPO;
+import com.mhd.oms.domain.inboundRank.repository.todo.ExecutionInboundRankDO;
+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 ExecutionInboundRankDomainService {
+
+ @Autowired
+ private IExecutionInboundRankService executionInboundRankService;
+
+ /**
+ * 商品入库排名列表(仓单+货品汇总,按件数降序)
+ */
+ public List queryMaterialRankList(ExecutionInboundRankDO executionInboundRankDO) {
+ return executionInboundRankService.queryMaterialRankList(executionInboundRankDO);
+ }
+
+ /**
+ * 商品入库排名合计(不分页)
+ */
+ public ExecutionInboundRankTotalPO queryMaterialRankTotal(ExecutionInboundRankDO executionInboundRankDO) {
+ return executionInboundRankService.queryMaterialRankTotal(executionInboundRankDO);
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java
new file mode 100644
index 000000000..b7a1a0830
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java
@@ -0,0 +1,37 @@
+package com.mhd.oms.domain.outboundRank.repository.facade;
+
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO;
+
+import java.util.List;
+
+/**
+ * 出库排名统计Service接口
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+public interface IExecutionOutboundRankService {
+
+ /**
+ * 商品出库排名列表
+ */
+ List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO);
+
+ /**
+ * 线路出库排名列表
+ */
+ List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO);
+
+ /**
+ * 商品出库排名合计(不分页)
+ */
+ ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO);
+
+ /**
+ * 线路出库排名合计(不分页)
+ */
+ ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO);
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java
new file mode 100644
index 000000000..b6722a546
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java
@@ -0,0 +1,37 @@
+package com.mhd.oms.domain.outboundRank.repository.mapper;
+
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO;
+
+import java.util.List;
+
+/**
+ * 出库排名统计Mapper接口
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+public interface ExecutionOutboundRankMapper {
+
+ /**
+ * 商品出库排名列表(按销售量倒序)
+ */
+ List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO);
+
+ /**
+ * 线路出库排名列表(按销售量倒序)
+ */
+ List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO);
+
+ /**
+ * 商品出库排名合计(不分页,当前筛选条件全量合计)
+ */
+ ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO);
+
+ /**
+ * 线路出库排名合计(不分页,当前筛选条件全量合计)
+ */
+ ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO);
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java
new file mode 100644
index 000000000..3c06f90ab
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java
@@ -0,0 +1,45 @@
+package com.mhd.oms.domain.outboundRank.repository.persistence;
+
+import com.mhd.oms.domain.outboundRank.repository.facade.IExecutionOutboundRankService;
+import com.mhd.oms.domain.outboundRank.repository.mapper.ExecutionOutboundRankMapper;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 出库排名统计Service业务层处理
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Service
+public class ExecutionOutboundRankImpl implements IExecutionOutboundRankService {
+
+ @Autowired
+ private ExecutionOutboundRankMapper executionOutboundRankMapper;
+
+ @Override
+ public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankMapper.queryMaterialRankList(executionOutboundRankDO);
+ }
+
+ @Override
+ public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankMapper.queryLineRankList(executionOutboundRankDO);
+ }
+
+ @Override
+ public ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankMapper.queryMaterialRankTotal(executionOutboundRankDO);
+ }
+
+ @Override
+ public ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankMapper.queryLineRankTotal(executionOutboundRankDO);
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java
new file mode 100644
index 000000000..974944f90
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java
@@ -0,0 +1,45 @@
+package com.mhd.oms.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(明细总价);
+ * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Data
+@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象")
+public class ExecutionOutboundLineRankPO 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_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
new file mode 100644
index 000000000..c32046d9f
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java
@@ -0,0 +1,52 @@
+package com.mhd.oms.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 ExecutionOutboundMaterialRankPO 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_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java
new file mode 100644
index 000000000..7622c3593
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java
@@ -0,0 +1,32 @@
+package com.mhd.oms.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 ExecutionOutboundRankTotalPO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("销售量合计")
+ private BigDecimal totalSalesQuantity;
+
+ @ApiModelProperty("交易数合计(去重出库单数)")
+ private Long totalTradeCount;
+
+ @ApiModelProperty("金额合计")
+ private BigDecimal totalAmount;
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java
new file mode 100644
index 000000000..83e8064ce
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java
@@ -0,0 +1,50 @@
+package com.mhd.oms.domain.outboundRank.repository.todo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 出库排名统计查询DO
+ *
+ * topOrganizationId 由服务端按登录用户注入,前端不传
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Data
+public class ExecutionOutboundRankDO 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;
+}
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
new file mode 100644
index 000000000..0637173b7
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java
@@ -0,0 +1,46 @@
+package com.mhd.oms.domain.outboundRank.repository.todo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 出库排名统计入参DTO
+ *
+ * 按日期区间统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据),
+ * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail),与 WMS 端 /outboundRankApi 同口径
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Data
+public class ExecutionOutboundRankDTO {
+
+ @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_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
new file mode 100644
index 000000000..158f2b8c2
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java
@@ -0,0 +1,93 @@
+package com.mhd.oms.domain.outboundRank.service;
+
+import com.mhd.common.core.exception.ServiceException;
+import com.mhd.common.core.utils.StringUtils;
+import com.mhd.common.security.utils.SecurityUtils;
+import com.mhd.system.api.model.LoginUser;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 出库排名统计应用服务
+ *
+ * 负责登录用户组织隔离注入、日期区间校验,统计逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml(跨库取 WMS 出库数据)
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Service
+@Slf4j
+public class ExecutionOutboundRankApplicationService {
+
+ @Autowired
+ private ExecutionOutboundRankDomainService executionOutboundRankDomainService;
+
+ /**
+ * 分页查询商品出库排名列表
+ */
+ public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ fillLoginContext(executionOutboundRankDO);
+ return executionOutboundRankDomainService.queryMaterialRankList(executionOutboundRankDO);
+ }
+
+ /**
+ * 分页查询线路出库排名列表
+ */
+ public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ fillLoginContext(executionOutboundRankDO);
+ return executionOutboundRankDomainService.queryLineRankList(executionOutboundRankDO);
+ }
+
+ /**
+ * 商品出库排名合计(当前筛选条件全量,不分页)
+ */
+ public ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankDomainService.queryMaterialRankTotal(executionOutboundRankDO);
+ }
+
+ /**
+ * 线路出库排名合计(当前筛选条件全量,不分页)
+ */
+ public ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankDomainService.queryLineRankTotal(executionOutboundRankDO);
+ }
+
+ /**
+ * 导出商品出库排名(不分页全量)
+ */
+ public List exportMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ fillLoginContext(executionOutboundRankDO);
+ return executionOutboundRankDomainService.queryMaterialRankList(executionOutboundRankDO);
+ }
+
+ /**
+ * 导出线路出库排名(不分页全量)
+ */
+ public List exportLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ fillLoginContext(executionOutboundRankDO);
+ return executionOutboundRankDomainService.queryLineRankList(executionOutboundRankDO);
+ }
+
+ /**
+ * 注入登录用户组织隔离,并校验日期区间必填
+ */
+ private void fillLoginContext(ExecutionOutboundRankDO executionOutboundRankDO) {
+ if (StringUtils.isEmpty(executionOutboundRankDO.getCreateTimeStart()) || StringUtils.isEmpty(executionOutboundRankDO.getCreateTimeEnd())) {
+ throw new ServiceException("请选择统计日期区间");
+ }
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (loginUser != null && loginUser.getUserPo() != null) {
+ Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
+ if (topOrganizationId != null && topOrganizationId != 1) {
+ executionOutboundRankDO.setTopOrganizationId(topOrganizationId);
+ }
+ }
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankAssembler.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankAssembler.java
new file mode 100644
index 000000000..88ec8e165
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankAssembler.java
@@ -0,0 +1,36 @@
+package com.mhd.oms.domain.outboundRank.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException;
+import com.mhd.common.core.exception.digitalLogisticsException.UserError;
+import com.mhd.common.core.utils.IgnoreNullUtil;
+import com.mhd.common.core.utils.bean.BeanUtils;
+import com.mhd.common.security.utils.SecurityUtils;
+import com.mhd.system.api.model.LoginUser;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDTO;
+import org.springframework.stereotype.Component;
+
+/**
+ * 出库排名统计Assembler
+ *
+ * @author rcx
+ * @date 2026-08-31
+ */
+@Component
+public class ExecutionOutboundRankAssembler {
+
+ /**
+ * 转换实体
+ */
+ public ExecutionOutboundRankDO toDO(ExecutionOutboundRankDTO executionOutboundRankDTO) {
+ ExecutionOutboundRankDO executionOutboundRankDO = new ExecutionOutboundRankDO();
+ // 拷贝
+ BeanUtils.copyProperties(executionOutboundRankDTO, executionOutboundRankDO, IgnoreNullUtil.getNullPropertyNames(executionOutboundRankDTO));
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (ObjectUtil.isNull(loginUser)) {
+ throw new DigitalLogisticsException(UserError.TIMEOUT);
+ }
+ return executionOutboundRankDO;
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java
new file mode 100644
index 000000000..ce87d4968
--- /dev/null
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java
@@ -0,0 +1,54 @@
+package com.mhd.oms.domain.outboundRank.service;
+
+import com.mhd.oms.domain.outboundRank.repository.facade.IExecutionOutboundRankService;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO;
+import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO;
+import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO;
+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 ExecutionOutboundRankDomainService {
+
+ @Autowired
+ private IExecutionOutboundRankService executionOutboundRankService;
+
+ /**
+ * 商品出库排名列表
+ */
+ public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankService.queryMaterialRankList(executionOutboundRankDO);
+ }
+
+ /**
+ * 线路出库排名列表
+ */
+ public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankService.queryLineRankList(executionOutboundRankDO);
+ }
+
+ /**
+ * 商品出库排名合计(不分页)
+ */
+ public ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankService.queryMaterialRankTotal(executionOutboundRankDO);
+ }
+
+ /**
+ * 线路出库排名合计(不分页)
+ */
+ public ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) {
+ return executionOutboundRankService.queryLineRankTotal(executionOutboundRankDO);
+ }
+}
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/entity/ReservationMaterialInventory.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/entity/ReservationMaterialInventory.java
index e75764b66..41d50c856 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/entity/ReservationMaterialInventory.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/entity/ReservationMaterialInventory.java
@@ -210,6 +210,12 @@ public class ReservationMaterialInventory extends BaseVOEntity {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
+ @ApiModelProperty("进货日期")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ private Date purchaseDate;
+
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/facade/IReservationMaterialInventoryService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/facade/IReservationMaterialInventoryService.java
index 5344f3163..bd81f1a21 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/facade/IReservationMaterialInventoryService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/facade/IReservationMaterialInventoryService.java
@@ -2,6 +2,7 @@ package com.mhd.oms.domain.reservationMaterialInventory.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory;
+import com.mhd.oms.domain.reservationMaterialInventory.repository.po.MaterialInventoryExpiryBatchPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryQueryListPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.todo.MaterialInventoryParamDO;
@@ -113,4 +114,9 @@ public interface IReservationMaterialInventoryService extends IService selectRecentExpiryBatches(String materialCode, Long topOrganizationId);
}
\ No newline at end of file
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/mapper/ReservationMaterialInventoryMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/mapper/ReservationMaterialInventoryMapper.java
index e655c623d..a73033a6b 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/mapper/ReservationMaterialInventoryMapper.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/mapper/ReservationMaterialInventoryMapper.java
@@ -2,6 +2,7 @@ package com.mhd.oms.domain.reservationMaterialInventory.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory;
+import com.mhd.oms.domain.reservationMaterialInventory.repository.po.MaterialInventoryExpiryBatchPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.todo.MaterialBarCodePO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.todo.MaterialBaseInfo;
@@ -36,4 +37,7 @@ public interface ReservationMaterialInventoryMapper extends BaseMapper getInfoByMaterialBaseInfoIds(@Param("id") Long id);
+
+ //入库业务单新增:根据物料编号查询库存批次去重后的过期日期+批次号(最近5条),供前端下拉回显
+ public List selectRecentExpiryBatches(@Param("materialCode") String materialCode, @Param("topOrganizationId") Long topOrganizationId);
}
\ No newline at end of file
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java
index 508bf043b..d666fc65a 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java
@@ -13,6 +13,7 @@ import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.repository.mapper
import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory;
import com.mhd.oms.domain.reservationMaterialInventory.repository.facade.IReservationMaterialInventoryService;
import com.mhd.oms.domain.reservationMaterialInventory.repository.mapper.ReservationMaterialInventoryMapper;
+import com.mhd.oms.domain.reservationMaterialInventory.repository.po.MaterialInventoryExpiryBatchPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryQueryListPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.todo.MaterialBarCodePO;
@@ -120,6 +121,14 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl selectRecentExpiryBatches(String materialCode, Long topOrganizationId) {
+ return materialInventoryMapper.selectRecentExpiryBatches(materialCode, topOrganizationId);
+ }
+
@Override
public Boolean omsEdit(MaterialInventoryOmsParamDO materialInventoryOmsParamDO) {
String inOrderNumber = materialInventoryOmsParamDO.getInOrderNumber();
@@ -127,6 +136,9 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl param = new LambdaQueryWrapper()
// .eq(ReservationMaterialInventory::getInOrderNumber, inOrderNumber)
//.eq(ReservationMaterialInventory::getLotNumber, lotNumber)
@@ -148,6 +160,11 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl reservationMaterialInventories = materialInventoryMapper.selectList(param);
if (reservationMaterialInventories != null && reservationMaterialInventories.size() > 0) {
ReservationMaterialInventory reservationMaterialInventory = reservationMaterialInventories.get(0);
@@ -542,6 +559,7 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl selectRecentExpiryBatches(String materialCode) {
+ Long topOrganizationId = null;
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (loginUser != null && loginUser.getUserPo() != null) {
+ Long loginTopOrgId = loginUser.getUserPo().getTopOrganizationId();
+ if (loginTopOrgId != null && loginTopOrgId != 1) {
+ topOrganizationId = loginTopOrgId;
+ }
+ }
+ return materialInventoryDomainService.selectRecentExpiryBatches(materialCode, topOrganizationId);
+ }
+
/**
* @description:库存查询列表
* @param materialInventoryQueryListDO
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/service/ReservationMaterialInventoryDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/service/ReservationMaterialInventoryDomainService.java
index fc73a5f42..40cc12ad1 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/service/ReservationMaterialInventoryDomainService.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/service/ReservationMaterialInventoryDomainService.java
@@ -3,6 +3,7 @@ package com.mhd.oms.domain.reservationMaterialInventory.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory;
import com.mhd.oms.domain.reservationMaterialInventory.repository.facade.IReservationMaterialInventoryService;
+import com.mhd.oms.domain.reservationMaterialInventory.repository.po.MaterialInventoryExpiryBatchPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.po.ReservationMaterialInventoryQueryListPO;
import com.mhd.oms.domain.reservationMaterialInventory.repository.todo.ReservationMaterialInventoryDO;
@@ -88,6 +89,13 @@ public class ReservationMaterialInventoryDomainService {
return materialInventory.getInventoryQuantity();
}
+ /**
+ * 根据物料编号查询库存批次最近5条过期日期+批次号(入库业务单新增页面下拉回显)
+ */
+ public List selectRecentExpiryBatches(String materialCode, Long topOrganizationId) {
+ return materialInventoryService.selectRecentExpiryBatches(materialCode, topOrganizationId);
+ }
+
/**
* @description:库存查询列表
* @param materialInventoryQueryListDO
diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java
index 9b898afb5..07ae79d33 100644
--- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java
+++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java
@@ -21,20 +21,47 @@ import java.util.Map;
/**
* 维他奶出库Excel解析监听器(新模板版)
* 新模板特点:货品明细与客户配送明细左右分栏展示
- * 核心功能:
- * 1. 左侧栏:第1-3行解析表头(送货日期/送货线号/车次),第5行解析纪录合共,第7行起解析货品明细
- * 2. 右侧栏:第2行解析发票张数/小计,第4行起解析客户配送明细
- * 3. 自动处理文本型数字转换(String→Integer/BigDecimal)
- * 4. 完整的异常处理和日志记录
+ * 核心功能(行列位置均不写死,模板调整行/列顺序不影响解析):
+ * 1. 表头标签(送货日期/送货线号/车次/发票张数/小计/纪录合共):按标签文字定位标签所在列,取右侧相邻列的值
+ * 2. 货品明细:按列头文字(貨品編號/簡稱/箱/支等,繁简体归一化)定位各列,列头行之后的行按数据解析
+ * 3. 客户配送明细:按列头文字(類别/發票編號/客户編號/名稱/箱/包/金額等)定位各列
+ * 4. 列头行识别失败时兜底:按老模板固定布局(左栏A-D列、右栏F-L列、行号1-7)解析,保证老模板不受影响
+ * 5. 自动处理文本型数字转换(String→Integer/BigDecimal)
*/
public class DynamicDeliveryExcelListener extends AnalysisEventListener