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 8cc8bfd57..ff342323e 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.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3: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 4ef3bed80..e9418197a 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.33:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4: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 d976fcc98..e4a817238 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",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.30: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 1fe69a003..26a92624c 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.32:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.3: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 750ed853e..12571141a 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.33:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.4: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/InMaterialDetail.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java index ff112e22d..927a883aa 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java @@ -375,6 +375,11 @@ public class InMaterialDetail extends BaseVOEntity { @DateTimeFormat(pattern="yyyy-MM-dd") private Date drinkDate; + @ApiModelProperty("过期日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date expiryDate; + @ApiModelProperty("来货验收是否合格;1 合格,0 不合格") @Excel(name = "来货验收是否合格;1 合格,0 不合格") private String arrivalAcceptQualified; 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-auth/src/main/resources/bootstrap.yml b/mhd-auth/src/main/resources/bootstrap.yml index cc317d58e..82b5aa50d 100644 --- a/mhd-auth/src/main/resources/bootstrap.yml +++ b/mhd-auth/src/main/resources/bootstrap.yml @@ -12,10 +12,10 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -23,8 +23,8 @@ spring: # username: nacos # password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 - server-addr: 10.102.192.31:6848 + server-addr: 127.0.0.1:8848 +# server-addr: 10.102.192.31:6848 # 测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java index 1f283297c..3a4c041e8 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java @@ -6,6 +6,7 @@ import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformInfoPO; import java.util.List; @@ -39,4 +40,7 @@ public interface BiPlatformRealDataMapper { /** 月台监控-按楼层统计月台车辆(楼层、月台数量、今日预约车辆、当前作业车辆) */ List queryPlatformFloorStats(); + + /** 月台管理列表(YMS qms_window_info,含机构/鹤位/状态/楼层/UUID 等完整信息) */ + List queryPlatformInfoList(); } \ No newline at end of file diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java new file mode 100644 index 000000000..2a1f971e3 --- /dev/null +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java @@ -0,0 +1,59 @@ +package com.mhd.bi.domain.biPlatformRealData.repository.po; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 月台管理列表(真实数据,来自 TEST_NGWL_YMS.QMS_WINDOW_INFO) + * 对应 YMS qms_window_info 月台/鹤位窗口表 + */ +@Data +public class RealPlatformInfoPO implements Serializable { + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 机构代码(org_no) */ + private String orgNo; + + /** 机构名称(dept_name) */ + private String deptName; + + /** 鹤位号/月台号(window_number) */ + private String windowNumber; + + /** 鹤位名称/月台名称(window_name) */ + private String windowName; + + /** 优先级别(priority_set) */ + private String prioritySet; + + /** 鹤位状态/月台状态(running_status) */ + private String runningStatus; + + /** uuid */ + private String uuid; + + /** 鹤位屏名字集合/绑定月台屏(berr_names) */ + private String berrNames; + + /** 最新业务状态(new_flow_status) */ + private String newFlowStatus; + + /** 月台图片(guide_images) */ + private String guideImages; + + /** 月台楼层(platform_floor) */ + private String platformFloor; + + /** 作业状态 0-空闲 1-占用(job_status) */ + private Integer jobStatus; + + /** 创建人(create_by) */ + private String createBy; + + /** 创建时间(create_time) */ + private String createTime; +} diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java index 9e2470dc6..703c71e2a 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java @@ -8,6 +8,7 @@ import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformInfoPO; import com.mhd.bi.domain.biPlatformSurveillance.repository.mapper.BiPlatformSurveillanceReportMapper; import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper; import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder; @@ -231,15 +232,30 @@ public class BiPlatformRealDataService { } /** - * 实时组装月台监测数据:真实字段查 YMS 库,写死字段保留静态值。 + * 月台管理列表:实时查 YMS qms_window_info,返回月台/鹤位窗口完整信息,不落库。 + */ + public List queryPlatformInfoList() { + try { + return biPlatformRealDataMapper.queryPlatformInfoList(); + } catch (Exception e) { + log.error("【YMS】查询月台管理列表失败: {}", e.getMessage(), e); + return java.util.Collections.emptyList(); + } + } + + /** + * 实时组装月台监测数据:原则「有真实数据源用真实,无真实数据源用写死模拟」。 + * 有真实数据源的字段(vehicles / platformOverview / vehicleStatus / taskLoad / taskTotal) + * 无条件用 YMS 真实查询覆盖,真实为空即为空,不用模板兜底; + * 无真实数据源的字段(效率统计、趋势、告警、任务类型等)保留模板写死值。 * 每次调用实时查库,不经过快照表。 */ public PlatformSurveillanceVO buildRealTimePlatformSurveillance() { - // 固定种子,保证写死字段每次生成值一致(真实字段随后实时覆盖) + // 固定种子生成写死模板:仅用于没有真实数据源的字段 Random r = new Random(20260825L); PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r); - // 作业车辆列表 + // 作业车辆列表:真实数据源,无条件覆盖(真实为空则返回空列表,不用模板模拟) List realVehicles = queryVehicles(); List vehicleVos = new ArrayList<>(); for (RealPlatformVehiclePO rv : realVehicles) { @@ -252,52 +268,47 @@ public class BiPlatformRealDataService { v.setPlatformDuration(rv.getPlatformDuration() == null ? 0 : rv.getPlatformDuration().intValue()); vehicleVos.add(v); } - if (!vehicleVos.isEmpty()) { - template.setVehicles(vehicleVos); - } + template.setVehicles(vehicleVos); - // 月台实时概览 - RealPlatformOverviewPO ov = queryPlatformOverview(); + // 月台实时概览:真实数据源,无条件覆盖 if (template.getPlatformOverview() != null) { - template.getPlatformOverview().setTotalPlatforms(ov.getTotalPlatforms().intValue()); - template.getPlatformOverview().setOperatingPlatforms(ov.getOperatingPlatforms().intValue()); + RealPlatformOverviewPO ov = queryPlatformOverview(); int total = ov.getTotalPlatforms().intValue(); int occ = ov.getOperatingPlatforms().intValue(); double rate = total > 0 ? Math.round(((double) occ / total) * 100.0 * 100.0) / 100.0 : 0d; + template.getPlatformOverview().setTotalPlatforms(total); + template.getPlatformOverview().setOperatingPlatforms(occ); template.getPlatformOverview().setCurrentOccupancyRate(rate); - } - long todayTasks = countTodayTasks(); - if (template.getPlatformOverview() != null) { - template.getPlatformOverview().setTodayTasks((int) todayTasks); + template.getPlatformOverview().setTodayTasks((int) countTodayTasks()); } - // 作业车辆状态统计 - RealVehicleStatusPO vs = queryVehicleStatusToday(); + // 作业车辆状态统计:真实数据源,无条件覆盖 if (template.getVehicleStatus() != null) { + RealVehicleStatusPO vs = queryVehicleStatusToday(); template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue()); template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue()); template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue()); template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue()); } - // 本月任务统计 taskTotal - long monthTasks = countMonthTasks(); + // 本月任务统计:taskTotal 有真实数据源无条件覆盖;YoY 等无真实数据源保留模板写死值 if (template.getMonthlyTaskStatistics() != null) { - template.getMonthlyTaskStatistics().setTaskTotal((int) monthTasks); + template.getMonthlyTaskStatistics().setTaskTotal((int) countMonthTasks()); } - // 任务负荷(今日 24 小时) + // 任务负荷:有真实数据源;真实为空则清空不用模板模拟,有数据则按真实小时覆盖 List loads = queryTaskLoadToday(); - if (!loads.isEmpty() && template.getTaskLoadStatistics() != null) { + if (loads.isEmpty()) { + template.setTaskLoadStatistics(new ArrayList<>()); + } else if (template.getTaskLoadStatistics() != null) { Map hourMap = new HashMap<>(); for (RealTaskLoadPO l : loads) { hourMap.put(l.getHourOfDay(), l.getTaskCount()); } for (TaskLoadItemVO item : template.getTaskLoadStatistics()) { Integer hour = parseHourFromLabel(item.getTime()); - if (hour != null) { - Long n = hourMap.get(hour); - if (n != null) item.setTaskCount(n.intValue()); + if (hour != null && hourMap.containsKey(hour)) { + item.setTaskCount(hourMap.get(hour).intValue()); } } } diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java index 0375dc7d6..38a6778b4 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java @@ -6,6 +6,7 @@ import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceRe import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformInfoPO; import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService; import com.mhd.bi.domain.biHkMacaoServiceZone.service.BiHkMacaoServiceZoneReportService; import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService; @@ -128,6 +129,16 @@ public class BiReportApi extends BaseController { List data = biPlatformRealDataService.queryPlatformFloorStats(); return BiApiResult.ok(data); } + + /** + * 月台管理列表(实时查 YMS qms_window_info,不落库) + */ + @ApiOperation(value = "月台管理列表", notes = "实时查询 YMS 库 qms_window_info,返回月台/鹤位窗口列表(机构、月台号、月台名称、楼层、绑定屏、UUID、状态等),不落库") + @GetMapping("/platformInfoList") + public BiApiResult> platformInfoList() { + List data = biPlatformRealDataService.queryPlatformInfoList(); + return BiApiResult.ok(data); + } //园区物流大屏接口---------------------------------------------------------------------- /** * 总体运营态势 diff --git a/mhd-bi/src/main/resources/bootstrap.yml b/mhd-bi/src/main/resources/bootstrap.yml index b949b746f..fa1d95e1a 100644 --- a/mhd-bi/src/main/resources/bootstrap.yml +++ b/mhd-bi/src/main/resources/bootstrap.yml @@ -16,12 +16,12 @@ spring: # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.5:6848 - username: nacos - password: manhuoda@2023 - #线上正式环境 - server-addr: 10.102.192.31:6848 # username: nacos # password: manhuoda@2023 + #线上正式环境 + server-addr: 10.102.192.31:6848 + username: nacos + password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 diff --git a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml index 883d07526..d3d0b3c12 100644 --- a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml +++ b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + \ No newline at end of file diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java index e1f4b27ed..841ba0ded 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java @@ -16,7 +16,8 @@ public enum RoleEnum { STORE_ADMIN("店铺管理员", "store_admin"), OWNER_CARGO("货主", "ownerCargo"), SUPPLIER("供应商", "supplier"), - CUSTOMER("客户", "customer"); + CUSTOMER("客户", "customer"), + TENANT("租户", "tenant"); private String name; private String code; 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 509644885..61f781399 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.31:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.30:8012",configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd-gateway/src/main/resources/bootstrap.yml b/mhd-gateway/src/main/resources/bootstrap.yml index 5a4743585..65f8dd835 100644 --- a/mhd-gateway/src/main/resources/bootstrap.yml +++ b/mhd-gateway/src/main/resources/bootstrap.yml @@ -13,15 +13,15 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - server-addr: 10.102.192.30:6848 + server-addr: 127.0.0.1:8848 +# server-addr: 10.102.192.30:6848 # server-addr: 10.33.0.129:6010 username: nacos password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java index 689b2dc2e..b951552ee 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java @@ -278,7 +278,7 @@ public class LeaseApplicationService { * 货主租赁明细 * 定时任务:每天凌晨1点执行,计算前一天的货主租赁明细 */ - @Scheduled(cron = "0 0 1 * * ?") +// @Scheduled(cron = "0 0 1 * * ?") public void shipperLeaseDetails() { log.info("开始执行货主租赁明细定时任务"); // 计算前一天的日期,将时间设置为当天的0点0分0秒,只保留日期部分 diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java index afa11d0ef..62703d4b2 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java @@ -461,7 +461,8 @@ public class MessageManageApplicationService //获取当前登录人 LoginUser loginUser = SecurityUtils.getLoginUser(); if(null == loginUser){ - throw new ServiceException("获取登录人失败"); + //未登录(游客):返回空消息中心结构,保证小程序界面正常展示而不报错 + return buildEmptyAppNoticeList(); } noticeMessageLoggingDo.setUserId(loginUser.getUserid()); //获取每种类型的最新一条 @@ -522,6 +523,27 @@ public class MessageManageApplicationService return result; } + /** + * 未登录(游客)时返回空的消息中心结构,避免前端页面因无登录上下文而报错 + * @return NoticeMessageLoggingAppListPo + */ + private NoticeMessageLoggingAppListPo buildEmptyAppNoticeList() { + NoticeMessageLoggingAppListPo result = new NoticeMessageLoggingAppListPo(); + NoticeMessageLoggingAppListPo.CommonNotice serviceNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + serviceNotice.setUnreadNum("0"); + NoticeMessageLoggingAppListPo.CommonNotice activityNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + activityNotice.setUnreadNum("0"); + NoticeMessageLoggingAppListPo.CommonNotice logisticsNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + logisticsNotice.setUnreadNum("0"); + NoticeMessageLoggingAppListPo.CommonNotice systemNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + systemNotice.setUnreadNum("0"); + result.setServiceNotice(serviceNotice); + result.setActivityNotice(activityNotice); + result.setLogisticsNotice(logisticsNotice); + result.setSystemNotice(systemNotice); + return result; + } + /** * APP根据类型获取消息通知 * @param noticeMessageLoggingDo 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-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java index 04c8c3236..4968160c9 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java @@ -129,8 +129,14 @@ public class CommonApplicationService { * @param userDO */ public void checkAccountInfo(UserDO userDO) { - //获取当前登录用户的最高组织 - Long topOrganizationId = SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId(); + //获取当前登录用户的最高组织,远程Feign调用无loginUser时从userDO取 + Long topOrganizationId; + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + } else { + topOrganizationId = userDO.getTopOrganizationId(); + } checkUserInfo(topOrganizationId, userDO); } diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java index e4372185b..1f44ce5eb 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java @@ -735,14 +735,20 @@ public class UserApplicationService { */ public void addUserInfo(UserDO userDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.USER_NULL); + UserPo loginUserPo = null; + if (ObjectUtil.isNotNull(loginUser)) { + loginUserPo = loginUser.getUserPo(); } - UserPo loginUserPo = loginUser.getUserPo(); CheckDO checkDO = userFactory.getCheckDo(userDO); //用户密码传值 if (StringUtils.isNotEmpty(userDO.getUserPassword())) { - String userPassword = AESUtil.decrypt(userDO.getUserPassword()); + String userPassword; + if (ObjectUtil.isNotNull(loginUser)) { + userPassword = AESUtil.decrypt(userDO.getUserPassword()); + } else { + // Feign调用传入的是明文密码,无需AES解密 + userPassword = userDO.getUserPassword(); + } checkDO.setUserPassword(userPassword); } //用户信息格式校验 @@ -750,9 +756,15 @@ public class UserApplicationService { String salt = OConvertUtils.randomGen(8); userDO.setUserSalt(salt); regCheck(checkDO); - //用户密码传值 + //用户密码加密入库 if (StringUtils.isNotEmpty(userDO.getUserPassword())) { - String userPassword = AESUtil.decrypt(userDO.getUserPassword()); + String userPassword; + if (ObjectUtil.isNotNull(loginUser)) { + userPassword = AESUtil.decrypt(userDO.getUserPassword()); + } else { + // Feign调用传入的是明文密码,无需AES解密 + userPassword = userDO.getUserPassword(); + } //加密算法,PBEWithMD5AndDES, String passwordEncode = PasswordUtil.encrypt(userDO.getUserAccount(), userPassword, salt); userDO.setUserPassword(passwordEncode); @@ -783,11 +795,13 @@ public class UserApplicationService { String idCardDes = DesensitizedUtil.desensitizedIdNumber(idCard); userDO.setUserIdcardNumberDes(idCardDes); } - userDO.setCreateBy(loginUserPo.getUserId()); - userDO.setCreateByName(loginUserPo.getUserName()); - if (loginUserPo.getUserAccountType() != null && loginUserPo.getUserAccountType() == 5) { - userDO.setCreateBy(loginUserPo.getCreateBy()); - userDO.setCreateByName(loginUserPo.getCreateByName()); + if (ObjectUtil.isNotNull(loginUserPo)) { + userDO.setCreateBy(loginUserPo.getUserId()); + userDO.setCreateByName(loginUserPo.getUserName()); + if (loginUserPo.getUserAccountType() != null && loginUserPo.getUserAccountType() == 5) { + userDO.setCreateBy(loginUserPo.getCreateBy()); + userDO.setCreateByName(loginUserPo.getCreateByName()); + } } userDO.setCreateTime(new Date()); //用户状态:0-无状态,1-正常,2-锁定 @@ -1379,6 +1393,66 @@ public class UserApplicationService { } } + /** + * 远程Feign调用新增用户(无token),仅操作USER表基本字段 + * 调用方需传入:organizationId、userAccount、userPassword(明文)、userName + */ + @Transactional(rollbackFor = Exception.class) + public UserPo addUserByFeign(UserDO userDO) { + // 1. 获取一级组织 + AjaxResult organizationInfo = productServiceFeign.getTopOrganization(userDO.getOrganizationId()); + String code = organizationInfo.get("code").toString(); + if (!"200".equals(code)) { + throw new DigitalLogisticsException(UserError.USER_ACCOUNT_REG_ERROR); + } + String data = organizationInfo.get("data").toString(); + if (ObjectUtil.isNotNull(data)) { + userDO.setTopOrganizationId(Long.parseLong(data)); + } + // 2. 获取组织名称 + AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId()); + if ("200".equals(orgInfoResult.get("code").toString())) { + Object orgData = orgInfoResult.get("data"); + if (ObjectUtil.isNotNull(orgData)) { + OrganizationPo organizationPo = BeanUtil.toBean(orgData, OrganizationPo.class); + if (ObjectUtil.isNotNull(organizationPo)) { + userDO.setOrganizationName(organizationPo.getOrganizationName()); + } + } + } + // 3. 密码加密(调用方传入明文,无需AES解密) + if (StringUtils.isNotEmpty(userDO.getUserPassword())) { + String salt = OConvertUtils.randomGen(8); + userDO.setUserSalt(salt); + String passwordEncode = PasswordUtil.encrypt(userDO.getUserAccount(), userDO.getUserPassword(), salt); + userDO.setUserPassword(passwordEncode); + } + // 4. 根据userId判断新增还是更新 + if (ObjectUtil.isNotNull(userDO.getUserId())) { + // 有userId,更新已有用户 + UserEntity updateEntity = new UserEntity(); + BeanUtils.copyProperties(userDO, updateEntity); + userMapper.updateById(updateEntity); + UserPo userPo = userMapper.selectByUserId(userDO.getUserId()); + return userPo; + } else { + // 无userId,新增用户 + userDO.setCreateTime(new Date()); + userDO.setUserStatus(1); + userDO.setUserAuthStatus(1); + userDO.setDelFlag(1); + userDO.setRoleCode(RoleEnum.MUST.getCode()); + userDO.setRoleName(RoleEnum.MUST.getName()); + if (ObjectUtil.isNull(userDO.getUserAccount()) && ObjectUtil.isNotNull(userDO.getUserPhone())) { + userDO.setUserAccount(userDO.getUserPhone()); + } + UserEntity userEntity = userDomainService.addUser(userDO); + UserPo userPo = new UserPo(); + BeanUtils.copyProperties(userEntity, userPo); + return userPo; + } + } + /** * @Description 新增用户 * @Author Alex @@ -1388,18 +1462,31 @@ public class UserApplicationService { public UserPo addUserYG(UserDO userDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); String password = userDO.getPlainPassword(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.TIMEOUT); + // 远程Feign调用时可能无loginUser,优先从loginUser取组织信息,否则使用userDO自身携带的数据 + if (ObjectUtil.isNotNull(loginUser)) { + userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } else if (ObjectUtil.isNotNull(userDO.getOrganizationId()) && ObjectUtil.isNull(userDO.getTopOrganizationId())) { + // 无loginUser时,提前获取一级组织ID,供后续checkAccountInfo使用 + AjaxResult topOrgResult = productServiceFeign.getTopOrganization(userDO.getOrganizationId()); + if ("200".equals(topOrgResult.get("code").toString())) { + String topOrgData = topOrgResult.get("data").toString(); + if (ObjectUtil.isNotNull(topOrgData)) { + userDO.setTopOrganizationId(Long.parseLong(topOrgData)); + } + } } - userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); //2023年3月24日 bug修改 增加登录账号/手机号唯一性校验 commonApplicationService.checkAccountInfo(userDO); if (ObjectUtil.isNotNull(userDO.getUserId())) { return updateUser(userDO); } else { if (ObjectUtil.isNull(userDO.getOrganizationId())) { - userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); - userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + if (ObjectUtil.isNotNull(loginUser)) { + userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } else { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } } else { // 如果前端传递了 organizationId,根据 organizationId 查询组织信息,获取正确的组织名称 AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId()); @@ -1441,7 +1528,14 @@ public class UserApplicationService { //组装新增用户信息 addUserInfo(userDO); + // 远程Feign调用无loginUser时,强制分配默认普通角色,不走管理员 + if (ObjectUtil.isNull(loginUser)) { + userDO.setRoleCode(RoleEnum.TENANT.getCode()); + userDO.setRoleName(RoleEnum.TENANT.getName()); + userDO.setUserAccountType(null); + } UserEntity userEntity = userDomainService.addUser(userDO); + if (ObjectUtil.isNotNull(loginUser)) { if (isCustomerManagementPresetRole(userEntity.getRoleCode())) { // 保持插入结果,不再改 role_code / user_role } else if ((StringUtils.isEmpty(userEntity.getRoleCode()) || !RoleEnum.PLAT_ADMIN.getCode().equals(userEntity.getRoleCode())) && @@ -1480,6 +1574,22 @@ public class UserApplicationService { userDomainService.updateUser(userDO); } } + } // end of loginUser != null check + else { + RoleDo roleDo = new RoleDo(); + roleDo.setRoleCode(userEntity.getRoleCode()); + roleDo.setOrganizationId(userEntity.getOrganizationId()); + RoleEntity roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo); + if (roleEntity != null) { + UserRoleDo userRoleDo = new UserRoleDo(); + userRoleDo.setUserId(userEntity.getUserId()); + userRoleDo.setRoleId(roleEntity.getRoleId()); + userRoleDomainService.addUserRole(userRoleDo); + userDO.setRoleId(roleEntity.getRoleId()); + userDO.setUserId(userEntity.getUserId()); + userDomainService.updateUser(userDO); + } + } BeanUtils.copyProperties(userEntity, userPo); //同步网货平台员工信息 try { @@ -1492,13 +1602,15 @@ public class UserApplicationService { // throw e; } //获取组织信息 - Long organizationId = loginUser.getUserPo().getOrganizationId(); + Long organizationId = ObjectUtil.isNotNull(loginUser) ? loginUser.getUserPo().getOrganizationId() : userDO.getOrganizationId(); Integer isQueue = userMapper.getOrdIsQueue(organizationId); if (isQueue==1) { //同步YMS员工信息 try { - userEntity.setUserPassword(password); + if (StringUtils.isNotEmpty(password)) { + userEntity.setUserPassword(password); + } ymsDomainService.addOrEditYmsUser(userEntity); } catch (Exception e) { // 同步YMS失败时,记录日志但不影响用户保存 diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java index d4c2c0388..96af6ea6a 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java @@ -22,12 +22,12 @@ public class UserRoleFactory { UserRoleEntity userRoleEntity = new UserRoleEntity(); BeanUtils.copyProperties(userRoleDo,userRoleEntity, IgnoreNullUtil.getNullPropertyNames(userRoleDo)); LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.TIMEOUT); + String userName = null; + Long userId = null; + if (ObjectUtil.isNotNull(loginUser)) { + userName = loginUser.getUsername(); + userId = loginUser.getUserid(); } - String userName = loginUser.getUsername(); - // 获取登录人id - Long userId = loginUser.getUserid(); if(userRoleDo.getUserRoleId() != null){ if(userId != null){ userRoleEntity.setUpdateBy(userId); diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java index 5605c1dfb..a421ca8ec 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java @@ -12,6 +12,7 @@ import com.mhd.user.domain.userAggregate.repository.todo.UserDO; import com.mhd.common.core.domain.po.app.UserAppPo; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueMethod; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import com.mhd.user.infrastructure.util.annotation.DataPermissions; import com.mhd.user.interfaces.dto.queryDTO.UserDocumentWarningQueryDTO; import com.mhd.user.interfaces.dto.updateDTO.UpdateHasDefaultAddressDTO; @@ -50,9 +51,12 @@ public class UserDomainService { */ public UserEntity updateUser(UserDO userDO) { UserEntity userEntity = userFactory.getUserEntity(userDO); - userEntity.setUpdateBy(SecurityUtils.getLoginUser().getUserid()); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + userEntity.setUpdateBy(loginUser.getUserid()); + userEntity.setUpdateByName(loginUser.getUsername()); + } userEntity.setUpdateTime(new Date()); - userEntity.setUpdateByName(SecurityUtils.getLoginUser().getUsername()); userRepositoryInterface.updateUser(userEntity); return userEntity; } diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java index 96d2f14e6..52d5058f9 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java @@ -283,6 +283,22 @@ public class UserAPI extends BaseController { return R.ok(sysUserVo, "操作成功"); } + /** + * 远程Feign调用新增用户(无token),仅操作USER表基本字段 + */ + @ApiOperation("远程Feign修改用户(无token)") + @PostMapping("/addUserByFeign") + public R addUserByFeign(@RequestBody UserDTO userDTO) { + LoginUser sysUserVo = new LoginUser(); + UserDO userDO = userAssember.toUserDO(userDTO); + UserPo userPo = userApplicationService.addUserByFeign(userDO); + if (ObjectUtil.isNotNull(userPo)) { + sysUserVo.setUserid(userPo.getUserId()); + } + sysUserVo.setUserPo(userPo); + return R.ok(sysUserVo, "操作成功"); + } + /** * @Description 新增合作商 * @Author Alex diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index dd13bfba5..fd3e72060 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -19,14 +19,12 @@ spring: nacos: discovery: # server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 server-addr: 10.102.192.31:6848 username: nacos diff --git a/mhd_bms/src/main/java/com/mhd/bms/config/MybatisPlusConfig.java b/mhd_bms/src/main/java/com/mhd/bms/config/MybatisPlusConfig.java new file mode 100644 index 000000000..553ba85e7 --- /dev/null +++ b/mhd_bms/src/main/java/com/mhd/bms/config/MybatisPlusConfig.java @@ -0,0 +1,22 @@ +package com.mhd.bms.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatis-Plus 分页插件配置 + * 不注册该拦截器时,Mapper 里传入的 Page 不生效:SQL 不分页、total 恒为 0 + */ +@Configuration +public class MybatisPlusConfig { + + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); + // 达梦数据库(不设置也会根据 jdbc:dm:// 自动识别,这里显式指定更稳妥) + paginationInterceptor.setDialectType(DbType.DM.getDb()); + return paginationInterceptor; + } +} diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BmsInvoiceListApi.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BmsInvoiceListApi.java index cb4f790b5..9bee593e5 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BmsInvoiceListApi.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BmsInvoiceListApi.java @@ -52,11 +52,14 @@ public class BmsInvoiceListApi extends BaseController { @ApiOperation(value = "销项发票表-分页列表查询", notes = "销项发票表-分页列表查询") @RequestMapping(value = "/queryList") public Result> queryList(BmsInvoiceListQueryDTO bmsInvoiceListQueryDTO, - @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageNo", required=false) Integer pageNo, + @RequestParam(name="pageNum", required=false) Integer pageNum, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + // 前端分页参数名不统一(pageNum / pageNo),两个都兼容,优先 pageNo + int currentPage = pageNo != null ? pageNo : (pageNum != null ? pageNum : 1); Result> result = new Result>(); - Page pageList = new Page(pageNo,pageSize); + Page pageList = new Page(currentPage,pageSize); pageList = bmsInvoiceListService.queryList(pageList, bmsInvoiceListQueryDTO); result.setResult(pageList); result.setSuccess(true); diff --git a/mhd_bms/src/main/resources/bootstrap.yml b/mhd_bms/src/main/resources/bootstrap.yml index 1b1edd68f..57159b97e 100644 --- a/mhd_bms/src/main/resources/bootstrap.yml +++ b/mhd_bms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd_bms/src/main/resources/mapper/BmsInvoiceListMapper.xml b/mhd_bms/src/main/resources/mapper/BmsInvoiceListMapper.xml index 4f2eb2a0a..6cd8a897f 100644 --- a/mhd_bms/src/main/resources/mapper/BmsInvoiceListMapper.xml +++ b/mhd_bms/src/main/resources/mapper/BmsInvoiceListMapper.xml @@ -10,7 +10,7 @@ where a.is_delete = 0 group by a.id - order by a.create_time desc + order by a.create_time desc, a.id desc and a.organization_id = #{organizationId} diff --git a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml new file mode 100644 index 000000000..f73e13eea --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml @@ -0,0 +1,109 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.status = 5 + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and b.shipper_code like concat('%', #{shipperCode}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + + + and date_format(IFNULL(b.warehouse_date, b.create_time),'%Y-%m-%d') >= #{warehouseDateStart} + + + and date_format(IFNULL(b.warehouse_date, b.create_time),'%Y-%m-%d') <= #{warehouseDateEnd} + + + + + from NGWL_TEST_WMS.in_material_detail a + join NGWL_TEST_WMS.stock_in_order b on a.in_order_number = b.in_order_number and b.del_flag = 1 + left join NGWL_TEST_WMS.material_base_info c on a.material_base_info_id = c.material_base_info_id + + + + + + + + diff --git a/mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml b/mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml new file mode 100644 index 000000000..d5a2017aa --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + a.id,a.create_by,a.create_by_name,a.create_time,a.update_by,a.update_by_name,a.update_time,a.del_flag, + a.entrust_number,a.warehouse_id,a.warehouse_code,a.warehouse_name,a.shipper_id,a.shipper_code,a.shipper_name, + a.salesman_id,a.salesman_name,a.order_type_code,a.order_type_name,a.settlement_currency,a.priority_level_code,a.priority_level_name, + a.direct_warehouse,a.review,a.expect_time,a.outbound_date,a.order_date,a.complete_time, + a.to_receiver,a.contact_person,a.vehicle_model_plate,a.entrust_no,a.tel,a.fax,a.driver_sign, + a.carrier,a.carrier_name,a.container_no,a.container_no_name, + a.transport_mode_code,a.transport_mode_name,a.supervision_mode_code,a.supervision_mode_name, + a.declare_customs,a.entry_exit_customs,a.departure_arrival_country,a.customs_inspection_flag, + a.need_declare_flag,a.need_transport_flag,a.manufacturer,a.customs_declarer_info,a.delivery_addr,a.annex_url, + a.order_status,a.audit_by,a.audit_by_name,a.audit_time,a.audit_remark, + a.issue_status,a.issue_by,a.issue_by_name,a.issue_time,a.declare_total_quantity, + a.remark,a.organization_id,a.organization_name,a.top_organization_id, + case a.order_status when 1 then '待审核' when 2 then '已审核' when 3 then '已驳回' when 4 then '进行中' when 5 then '已入库' else '未知状态' end order_status_str, + case a.issue_status when 1 then '未下发' when 2 then '已下发' else '未知状态' end issue_status_str + from + oms_out_entrust_order a + + + + + a.del_flag = 1 + + and a.entrust_number like concat('%', #{entrustNumber}, '%') + + + and a.entrust_no like concat('%', #{entrustNo}, '%') + + + and a.warehouse_id = #{warehouseId} + + + and a.warehouse_name like concat('%', #{warehouseName}, '%') + + + and a.shipper_id = #{shipperId} + + + and a.shipper_name like concat('%', #{shipperName}, '%') + + + and a.salesman_id = #{salesmanId} + + + and a.salesman_name like concat('%', #{salesmanName}, '%') + + + and a.container_no like concat('%', #{containerNo}, '%') + + + and a.order_status = #{orderStatus} + + + and a.issue_status = #{issueStatus} + + + and a.settlement_currency = #{settlementCurrency} + + + and exists ( + select 1 from oms_out_entrust_order_detail d + where d.entrust_number = a.entrust_number + and d.del_flag = 1 + and d.invoice_no like concat('%', #{invoiceNo}, '%') + ) + + + and a.top_organization_id = #{topOrganizationId} + + + and a.create_time >= #{beginCreateTime} + + + and a.create_time <= #{endCreateTime} + + + and a.id in + + #{id} + + + + order by a.create_time desc + + + + + + + diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml new file mode 100644 index 000000000..260bf0f80 --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -0,0 +1,133 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.status in (9, 12, 13) + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.customer_name like concat('%', #{customerName}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and b.line_code like concat('%', #{lineCode}, '%') + + + and b.line_name like concat('%', #{lineName}, '%') + + + and b.out_order_number like concat('%', #{outOrderNumber}, '%') + + + and a.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + + + and date_format(b.create_time,'%Y-%m-%d') >= #{createTimeStart} + + + and date_format(b.create_time,'%Y-%m-%d') <= #{createTimeEnd} + + + + + from NGWL_TEST_WMS.out_material_detail a + join NGWL_TEST_WMS.stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 + + + + + + + + + + + + + + diff --git a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml index 0297f8a29..e9cd17b19 100644 --- a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml @@ -56,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -64,6 +65,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -138,7 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL (sum(a.GROSS_WEIGHT), 0) GROSS_WEIGHT, IFNULL (sum(a.VOLUME), 0) VOLUME, a.ext_attr_1, a.ext_attr_2, a.ext_attr_3, a.ext_attr_4, - a.production_date, a.expiry_date, a.inventory_date, + a.production_date, a.expiry_date, a.inventory_date, a.purchase_date, a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO,nvl(a.unit_name,b.unit_name) as unit_name, a.bar_code as inv_bar_code, a.in_order_number,a.lot_number @@ -280,6 +285,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.expiry_date DATEADD(DAY, 1, #{expiryDateEnd}) + + AND TO_CHAR(a.purchase_date, 'yyyy-MM-dd') = #{purchaseDateStr} + + + and a.purchase_date >= #{purchaseDateStart} + + + and a.purchase_date DATEADD(DAY, 1, #{purchaseDateEnd}) + + + + + + + HAVING IFNULL(SUM(a.inventory_quantity), 0) > 0 + + + + + + order by CASE WHEN MAX(a.expiry_date) IS NULL THEN 1 ELSE 0 END ASC, MAX(a.expiry_date) DESC, + MAX(b.material_code) ASC, + CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END ASC, + MAX(a.update_time) DESC, + MAX(a.material_inventory_id) DESC @@ -353,12 +405,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(SUM(a.VOLUME), 0) AS VOLUME, MAX(a.unit) AS unit, MAX(a.unit_name) AS unit_name, + MAX(a.create_time) AS create_time, + MAX(a.update_time) AS update_time, MAX(a.production_date) AS production_date, MAX(a.inventory_date) AS inventory_date, + MAX(a.purchase_date) AS purchase_date, MAX(a.batch_ref_no) AS batch_ref_no, MAX(a.sheet_ref_no) AS sheet_ref_no, MAX(a.box_pallet_no) AS box_pallet_no, MAX(a.bar_code) AS inv_bar_code, MAX(a.in_order_number) AS in_order_number, MAX(a.lot_number) AS lot_number, b.material_code, b.material_name, + MAX(b.material_classify_code) AS material_classify_code, + MAX(b.material_classify_name) AS material_classify_name, CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END AS sort_order from reservation_material_inventory a left join NGWL_TEST_WMS.material_base_info b on a.material_base_info_id = b.material_base_info_id @@ -369,16 +426,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.MATERIAL_BASE_INFO_ID, a.EXPIRY_DATE, a.shipper_id, a.shipper_code, a.shipper_name, a.organization_id, a.organization_name, a.top_organization_id, b.material_code, b.material_name - + + - - order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, - sort_order, MAX(a.update_time) DESC + + - order by sort_order, MAX(a.update_time) desc + + + + order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, + sort_order, MAX(a.update_time) DESC + + + order by sort_order, MAX(a.update_time) desc + + @@ -394,6 +461,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.SHIPPER_ID + + + + @@ -447,6 +518,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -527,4 +599,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM NGWL_TEST_WMS.material_bar_code WHERE material_base_info_id = #{id} AND del_flag = 1 + + + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml index 8d7578d06..bc72a3926 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -556,6 +556,11 @@ SELECT COUNT(1) FROM reservation_stock_in_order WHERE in_order_number = #{inOrderNumber} + + + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml index 68fd934af..aec1a3b05 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml @@ -470,8 +470,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select max(u.user_id) as user_id, max(u.user_name) as user_name, max(u.user_member_code) as user_member_code + from NGWL_TEST_USER."USER" u + where u.ORGANIZATION_ID = #{organizationId} and u.DEL_FLAG = 1 + and u.USER_MEMBER_CODE = #{userMemberCode} select - b.* + b.*, a.status, a.issue_status from reserve_stock_out_order a left join reserve_out_material_detail b on a.OUT_ORDER_NUMBER = b.OUT_ORDER_NUMBER diff --git a/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java b/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java index 2c188f6a9..ded62eab6 100644 --- a/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java +++ b/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java @@ -87,13 +87,23 @@ public class AppMenuApplicationService { if (StringUtils.isBlank(appMenuDO.getAppPackage()) || StringUtils.isBlank(appMenuDO.getAppLocationCode())){ throw new ServiceException("app包名或app位置不能为空"); } - if (appMenuDO.getUserId() == null){ - appMenuDO.setUserId(SecurityUtils.getUserId()); - } - if (appMenuDO.getTopOrganizationId() == null){ - appMenuDO.setTopOrganizationId(SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId()); + // 判断是否为已登录用户(小程序未登录访问时,getLoginUser/getUserPo 可能为空) + LoginUser loginUser = SecurityUtils.getLoginUser(); + boolean isLogin = loginUser != null && loginUser.getUserPo() != null; + if (isLogin) { + if (appMenuDO.getUserId() == null){ + // 用 token 中解析出的真实用户ID,避免依赖网关 header(未注入时 SecurityUtils.getUserId() 会返回 0) + appMenuDO.setUserId(loginUser.getUserid()); + } + if (appMenuDO.getTopOrganizationId() == null){ + appMenuDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } } + // 未登录(游客):userId/topOrganizationId 保持为空,走公共菜单查询,返回该 app 全部菜单 List menuPos = appMenuDomainService.queryMenuListByApp(appMenuDO); + if (!isLogin) { + return menuPos != null ? menuPos : new ArrayList<>(); + } // 获取用户角色 → 查角色APP菜单权限 → 取交集去重 List userRoles = userFeignService.selectUserRoles(appMenuDO.getUserId()); menuPos = filterMenuByUserRole(menuPos, userRoles); diff --git a/mhd_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 521cfaa6f..07b279b1a 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/src/main/resources/bootstrap.yml @@ -20,7 +20,7 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -29,7 +29,7 @@ spring: config: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_product/src/main/resources/mapper/appMenu/AppMenuMapper.xml b/mhd_product/src/main/resources/mapper/appMenu/AppMenuMapper.xml index abddc0176..b9e3148aa 100644 --- a/mhd_product/src/main/resources/mapper/appMenu/AppMenuMapper.xml +++ b/mhd_product/src/main/resources/mapper/appMenu/AppMenuMapper.xml @@ -99,7 +99,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and me.menu_show = 1 and co.app_package = #{appPackage} and me.app_location_code = #{appLocationCode} + + and me.top_organization_id = #{topOrganizationId} + order by me.menu_sort,me.create_time asc \ No newline at end of file diff --git a/mhd_thrid_party/src/main/resources/bootstrap.yml b/mhd_thrid_party/src/main/resources/bootstrap.yml index e93b1f240..bdc9a37f6 100644 --- a/mhd_thrid_party/src/main/resources/bootstrap.yml +++ b/mhd_thrid_party/src/main/resources/bootstrap.yml @@ -18,16 +18,14 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 127.0.0.1:8848 +# server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 127.0.0.1:8848 +# server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java index b3e4d2147..5f306f16d 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java @@ -32,6 +32,7 @@ import com.linke.transport.interfaces.assemble.vehicle.VehicleAssembler; import com.mhd.common.core.constant.Constants; import com.mhd.common.core.domain.dto.SyncTmsVehicleDTO; import com.linke.transport.interfaces.dto.vehicle.VehicleDto; +import com.linke.transport.interfaces.dto.vehicle.VehicleExportVO; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueField; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueMethod; import com.mhd.common.core.constant.NoticeConstants; @@ -238,6 +239,33 @@ public class VehicleApplicationService { return vehiclePos; } + /** + * 构建车辆管理导出数据(不分页,按列表查询条件导出) + * + * @param vehiclePo 查询条件 + * @param dataPermission 数据权限 + * @return 导出数据 + */ + public List buildExportList(VehiclePo vehiclePo, DataPermission dataPermission) { + List vehiclePos = selectVehicleList(vehiclePo, dataPermission); + List exportList = new ArrayList<>(); + if (CollUtil.isEmpty(vehiclePos)) { + return exportList; + } + for (VehiclePo po : vehiclePos) { + VehicleExportVO vo = new VehicleExportVO(); + BeanUtils.copyProperties(po, vo); + // 司机名称集合拼接为字符串(List与String类型不匹配,copyProperties不会复制,需手动设置) + if (CollUtil.isNotEmpty(po.getDriverNames())) { + vo.setDriverNames(String.join(",", po.getDriverNames())); + } + // 所属组织与归属组织一致 + vo.setBelongOrganizationName(po.getOrganizationName()); + exportList.add(vo); + } + return exportList; + } + /** * 查询未绑定车辆列表 * diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java new file mode 100644 index 000000000..b98554e7c --- /dev/null +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java @@ -0,0 +1,178 @@ +package com.linke.transport.interfaces.dto.vehicle; + +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; +import java.util.Date; + +/** + * 车辆管理导出对象(基础数据-运营数据-车辆管理列表,列顺序与页面列表一致) + * + * @author gen + */ +@Data +@ApiModel(value = "车辆管理导出对象", description = "车辆管理导出对象") +public class VehicleExportVO implements Serializable +{ + private static final long serialVersionUID = 1L; + + @Excel(name = "车辆主体", readConverterExp = "1=主车,2=挂车") + @ApiModelProperty(name = "车辆主体(1-主车,2-挂车)") + private Integer vehicleBody; + + @Excel(name = "车牌号码") + @ApiModelProperty(name = "车牌号码") + private String vehicleLicensePlateNumber; + + @Excel(name = "跨境车牌") + @ApiModelProperty(name = "跨境车牌") + private String crossPlate; + + @Excel(name = "车辆类型") + @ApiModelProperty(name = "车辆类型") + private String vehicleTypeName; + + @Excel(name = "类型", readConverterExp = "0=自由车辆,1=社会车辆") + @ApiModelProperty(name = "类型(车辆来源)") + private Integer vehicleSource; + + @Excel(name = "部门") + @ApiModelProperty(name = "部门") + private String departmentName; + + @Excel(name = "车辆认证", readConverterExp = "0=无状态,1=未认证,2=等待审核,3=已通过,4=已驳回") + @ApiModelProperty(name = "车辆认证状态") + private Integer authenticationStatus; + + @Excel(name = "司机姓名") + @ApiModelProperty(name = "司机姓名(多个以逗号分隔)") + private String driverNames; + + @Excel(name = "副驾1") + @ApiModelProperty(name = "副驾1") + private String pilot1; + + @Excel(name = "副驾2") + @ApiModelProperty(name = "副驾2") + private String pilot2; + + @Excel(name = "车队名称") + @ApiModelProperty(name = "车队名称") + private String motorcadeName; + + @Excel(name = "年检有效期", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "年检有效期") + private Date annualValidityPeriod; + + @Excel(name = "保险有效期", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "保险有效期") + private Date insuranceValidityPeriod; + + @Excel(name = "运载状态", readConverterExp = "0=无状态,1=空载,2=负载") + @ApiModelProperty(name = "运载状态") + private Integer carryStatus; + + @Excel(name = "使用性质") + @ApiModelProperty(name = "使用性质") + private String vehicleUseNature; + + @Excel(name = "总质量(kg)") + @ApiModelProperty(name = "总质量(kg)") + private BigDecimal vehicleTotalMass; + + @Excel(name = "核定载质量(kg)") + @ApiModelProperty(name = "核定载质量(kg)") + private BigDecimal vehicleApprovedLoadQuantity; + + @Excel(name = "车轴数") + @ApiModelProperty(name = "车轴数") + private String otherAxlesNumberName; + + @Excel(name = "车长(米)") + @ApiModelProperty(name = "车长(米)") + private String otherCarLengthName; + + @Excel(name = "容积(方)") + @ApiModelProperty(name = "容积(方)") + private String otherVehicleVolumeName; + + @Excel(name = "车牌颜色") + @ApiModelProperty(name = "车牌颜色") + private String otherLicensePlateColorName; + + @Excel(name = "行驶证有效期限", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "行驶证有效期限") + private Date vehicleCheckoutPeriodValidity; + + @Excel(name = "道路运输证号") + @ApiModelProperty(name = "道路运输证号") + private String roadTransportCertificateNo; + + @Excel(name = "道路运输证有效期限", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "道路运输证有效期限") + private Date roadTransportCertificateExpireDate; + + @Excel(name = "道路运输证校验状态", readConverterExp = "0=无状态,1=未核验,2=核验通过,3=核验失败") + @ApiModelProperty(name = "道路运输证校验状态") + private Integer roadTransportCertificateCheckoutStatus; + + @Excel(name = "经营许可证号") + @ApiModelProperty(name = "经营许可证号") + private String businessLicenseNumber; + + @Excel(name = "经营许可证业户名称") + @ApiModelProperty(name = "经营许可证业户名称") + private String specializedHouseholdsName; + + @Excel(name = "道路运输经营许可证有效期", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "道路运输经营许可证有效期(截止日期)") + private Date businessLicenseExpireEndDate; + + @Excel(name = "经营许可证校验状态", readConverterExp = "0=无状态,1=未核验,2=核验通过,3=核验失败") + @ApiModelProperty(name = "经营许可证校验状态") + private Integer businessLicenseCheckoutStatus; + + @Excel(name = "入网校验状态", readConverterExp = "0=无状态,1=未核验,2=已入网,3=未入网") + @ApiModelProperty(name = "入网校验状态") + private Integer netInStatus; + + @Excel(name = "入网查询时间", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "入网查询时间") + private Date netInDate; + + @Excel(name = "使用状态", readConverterExp = "0=无状态,1=正常,2=黑名单") + @ApiModelProperty(name = "使用状态") + private Integer useStatus; + + @Excel(name = "归属组织") + @ApiModelProperty(name = "归属组织") + private String organizationName; + + @Excel(name = "添加人员") + @ApiModelProperty(name = "添加人员") + private String createByName; + + @Excel(name = "添加时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(name = "添加时间") + private Date createTime; + + @Excel(name = "审核人员") + @ApiModelProperty(name = "审核人员") + private String checkoutPersonName; + + @Excel(name = "审核时间", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "审核时间") + private Date checkoutDate; + + @Excel(name = "更新时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(name = "更新时间") + private Date updateTime; + + @Excel(name = "所属组织") + @ApiModelProperty(name = "所属组织(与归属组织一致)") + private String belongOrganizationName; +} diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java index 661c393d5..cbd1f33b7 100644 --- a/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java @@ -9,6 +9,7 @@ import com.linke.transport.domain.vehicle.repository.po.VehiclePo; import com.linke.transport.interfaces.assemble.vehicle.VehicleAssembler; import com.mhd.common.core.domain.dto.SyncTmsVehicleDTO; import com.linke.transport.interfaces.dto.vehicle.VehicleDto; +import com.linke.transport.interfaces.dto.vehicle.VehicleExportVO; import com.mhd.common.core.domain.dto.StatisticalMattersDTO; import com.mhd.common.core.domain.entity.R; import com.mhd.common.core.domain.todo.StatisticalMattersDo; @@ -16,6 +17,7 @@ import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; import com.mhd.common.core.utils.IgnoreNullUtil; import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; @@ -28,6 +30,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; import java.util.List; /** @@ -65,6 +70,33 @@ public class VehicleApi extends BaseController return getDataTable(list); } + /** + * 导出车辆管理列表 + */ + @Log(title = "车辆管理-导出", description = "导出车辆管理列表", businessType = BusinessType.EXPORT) + @ApiOperation("导出车辆管理列表") + // 同时支持 GET(query 参数)与 POST(form 表单,兼容前端 this.download() 工具) + @RequestMapping(value = "/export", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + public void export(VehicleDto vehicleDto, HttpServletResponse response) throws IOException + { + VehiclePo vehiclePo = new VehiclePo(); + //转换实体 + BeanUtils.copyProperties(vehicleDto, vehiclePo); + //判断当前登录人数据权限 + DataPermission dataPermission = commonApplicationService.dataPermission(vehiclePo.getPermissionMenuId()); + //查询全量(不分页) + List list = vehicleApplicationService.buildExportList(vehiclePo, dataPermission); + + //设置下载头,防止浏览器乱码 + 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<>(VehicleExportVO.class); + util.exportExcel(response, list, "车辆管理数据"); + } + /** * 车辆绑定副驾 */ diff --git a/mhd_transport/src/main/resources/bootstrap.yml b/mhd_transport/src/main/resources/bootstrap.yml index 99a170008..1bdedb7d4 100644 --- a/mhd_transport/src/main/resources/bootstrap.yml +++ b/mhd_transport/src/main/resources/bootstrap.yml @@ -18,10 +18,9 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置使用ip+端口号 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -31,9 +30,8 @@ spring: #线上正式环境 # server-addr: 10.102.192.105:6848 config: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置使用ip+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 127.0.0.1:8848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/inboundRank/InboundRankApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/inboundRank/InboundRankApplicationService.java new file mode 100644 index 000000000..c5a18f4ff --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/inboundRank/InboundRankApplicationService.java @@ -0,0 +1,76 @@ +package com.mhd.wms.application.service.inboundRank; + +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.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.domain.inboundRank.service.InboundRankDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 入库排名统计应用服务 + * + *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 InboundRankDomainService → InboundRankMapper.xml

+ * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class InboundRankApplicationService { + + @Autowired + private InboundRankDomainService inboundRankDomainService; + + /** + * 分页查询商品入库排名列表(仓单+货品汇总,按件数降序) + */ + public List queryMaterialRankList(InboundRankDO inboundRankDO) { + fillLoginContext(inboundRankDO); + return inboundRankDomainService.queryMaterialRankList(inboundRankDO); + } + + /** + * 商品入库排名合计(当前筛选条件全量,不分页) + */ + public InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO) { + return inboundRankDomainService.queryMaterialRankTotal(inboundRankDO); + } + + /** + * 导出商品入库排名(不分页全量) + */ + public List exportMaterialRank(InboundRankDO inboundRankDO) { + fillLoginContext(inboundRankDO); + return inboundRankDomainService.queryMaterialRankList(inboundRankDO); + } + + /** + * 注入登录用户组织隔离与关联仓库,并校验入仓日期区间必填 + */ + private void fillLoginContext(InboundRankDO inboundRankDO) { + if (StringUtils.isEmpty(inboundRankDO.getWarehouseDateStart()) || StringUtils.isEmpty(inboundRankDO.getWarehouseDateEnd())) { + throw new ServiceException("请选择统计日期区间"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + inboundRankDO.setTopOrganizationId(topOrganizationId); + } + AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null && associationWarehouseCacheDO.getWarehouseId() != null) { + inboundRankDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + } + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java new file mode 100644 index 000000000..d6980900f --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java @@ -0,0 +1,100 @@ +package com.mhd.wms.application.service.outboundRank; + +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import com.mhd.wms.domain.outboundRank.service.OutboundRankDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库排名统计应用服务 + * + *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 OutboundRankDomainService → OutboundRankMapper.xml

+ * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class OutboundRankApplicationService { + + @Autowired + private OutboundRankDomainService outboundRankDomainService; + + /** + * 分页查询商品出库排名列表(货品聚合) + */ + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryMaterialRankList(outboundRankDO); + } + + /** + * 商品出库排名合计(当前筛选条件全量,不分页) + */ + public OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryMaterialRankTotal(outboundRankDO); + } + + /** + * 导出商品出库排名(不分页全量) + */ + public List exportMaterialRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryMaterialRankList(outboundRankDO); + } + + /** + * 分页查询线路出库排名列表(线路×货品聚合) + */ + public List queryLineRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryLineRankList(outboundRankDO); + } + + /** + * 线路出库排名合计(当前筛选条件全量,不分页) + */ + public OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryLineRankTotal(outboundRankDO); + } + + /** + * 导出线路出库排名(不分页全量) + */ + public List exportLineRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryLineRankList(outboundRankDO); + } + + /** + * 注入登录用户组织隔离与关联仓库,并校验日期区间必填 + */ + private void fillLoginContext(OutboundRankDO outboundRankDO) { + if (StringUtils.isEmpty(outboundRankDO.getCreateTimeStart()) || StringUtils.isEmpty(outboundRankDO.getCreateTimeEnd())) { + throw new ServiceException("请选择统计日期区间"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + outboundRankDO.setTopOrganizationId(topOrganizationId); + } + AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null && associationWarehouseCacheDO.getWarehouseId() != null) { + outboundRankDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + } + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index 50c3e19cd..af7cae9d0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -1005,7 +1005,8 @@ public class StockOutOrderApplicationService { } BeanUtils.copyProperties(stockOutOrderDb, stockOutOrderD); List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() - .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber())); + .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag,1)); List materialDetailList = cn.hutool.core.bean.BeanUtil.copyToList(outMaterialDetailList, OutMaterialDetailDO.class); List materialDetailList2 = new ArrayList<>(); // 仅通宇账号启用与库存分配弹窗同口径的新匹配(物料+箱号/卡板+Sheet Ref 多值拆 token); @@ -1103,7 +1104,8 @@ public class StockOutOrderApplicationService { } BeanUtils.copyProperties(stockOutOrderDb, stockOutOrderD); List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() - .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber())); + .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag, 1)); List materialDetailList = cn.hutool.core.bean.BeanUtil.copyToList(outMaterialDetailList, OutMaterialDetailDO.class); List materialDetailList2 = new ArrayList<>(); for (OutMaterialDetailDO detail : materialDetailList) { @@ -1122,8 +1124,20 @@ public class StockOutOrderApplicationService { // throw new ServiceException("库存不存在:" + batchRefNo + " " + sheetRefNo + " " + boxPalletNo); // } Long materialInventoryId = detail.getMaterialInventoryId(); + String materialDesc = detail.getMaterialCode() != null ? detail.getMaterialCode() + : (detail.getMaterialName() != null ? detail.getMaterialName() : String.valueOf(detail.getUniqueId())); + //OMS推送的库存ID缺失或在WMS不存在时明确报错(此前直接解引用空指针,异常被Feign降级吞掉后单据卡死) + if (materialInventoryId == null || materialInventoryId <= 0) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]未关联库存,无法自动分配"); + } MaterialInventory materialInventory = materialInventoryMapper.selectById(materialInventoryId); + if (materialInventory == null) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]库存不存在,库存ID=" + materialInventoryId + ",无法自动分配"); + } BigDecimal remainingQuantity = detail.getQuantity(); // 计划数量 + if (remainingQuantity == null || remainingQuantity.compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]计划数量为0,无法自动分配"); + } // 当前物料的可用库存 BigDecimal availableStock = materialInventory.getAllocationQuantity(); @@ -1132,9 +1146,9 @@ public class StockOutOrderApplicationService { continue; } if (availableStock.compareTo(remainingQuantity) < 0) { - throw new RuntimeException( - String.format("可用库存不足,计划数量:%s,当前可用库存:%s", - remainingQuantity, availableStock) + throw new ServiceException( + String.format("出库单[%s]物料[%s]可用库存不足,计划数量:%s,当前可用库存:%s", + outOrderNumber, materialDesc, remainingQuantity, availableStock) ); } // detail.setMaterialInventoryId(materialInventory.getMaterialInventoryId()); @@ -1148,6 +1162,10 @@ public class StockOutOrderApplicationService { detail.setAllocationQuantity(remainingQuantity); materialDetailList2.add(detail); } + //全部明细因可用库存为0被跳过时明确报错(此前空明细落入batchAssignUpdate抛出笼统的"物料明细不能为空",难定位) + if (materialDetailList2.isEmpty()) { + throw new ServiceException("出库单[" + stockOutOrderDb.getOutOrderNumber() + "]所有物料明细的可用库存为0,无法自动分配"); + } stockOutOrderD.setMaterialDetailList(materialDetailList2); StockOutOrderDO assembleStockOutOrderDO = assembleParamByOutOrder(stockOutOrderD); Boolean assignResult = stockOutOrderDomainService.autoAssign(assembleStockOutOrderDO); @@ -1425,7 +1443,9 @@ public class StockOutOrderApplicationService { List returnOutMaterialDetailDOList = new ArrayList<>(); for (OutMaterialDetailDO outMaterialDetailDO : stockOutOrderDO.getMaterialDetailList()){ Long uniqueId = outMaterialDetailDO.getUniqueId(); - OutMaterialDetail outMaterialDetail = outMaterialDetailService.getOne(new LambdaQueryWrapper().eq(OutMaterialDetail::getUniqueId, uniqueId)); + OutMaterialDetail outMaterialDetail = outMaterialDetailService.getOne(new LambdaQueryWrapper() + .eq(OutMaterialDetail::getUniqueId, uniqueId) + .eq(OutMaterialDetail::getDelFlag,1)); if (outMaterialDetail == null){ throw new ServiceException("出库明细不存在"); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java index 5d9fbaa99..df5867e8d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java @@ -120,7 +120,8 @@ public class DeliveTaskImpl extends ServiceImpl im String orderNumber = handoverTaskOrder.getOrderNumber();//出库单号 // 已复核数量、出库单信息:直接从出库单获取(需在物料统计前获取,用于判断是否需要复核) StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(StockOutOrder::getOutOrderNumber, orderNumber)); + .eq(StockOutOrder::getOutOrderNumber, orderNumber) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder != null) { deliveTaskPO.setOutOrderNumber(stockOutOrder.getOutOrderNumber()); deliveTaskPO.setOutOrderStatus(stockOutOrder.getStatus()); @@ -297,4 +298,4 @@ public class DeliveTaskImpl extends ServiceImpl im public DeliveTaskPO querySum(DeliveTaskDO deliveTaskDO) { return deliveTaskMapper.querySum(deliveTaskDO); } -} +} \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index e9ecea6d7..e7e0d0941 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -407,6 +407,7 @@ public class HandoverTaskOrderDomainService { //交接完成节点修改库存 String orderNumber = handoverTaskOrder.getOrderNumber(); StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, orderNumber)); if (stockOutOrder == null) { continue; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/facade/IInboundRankService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/facade/IInboundRankService.java new file mode 100644 index 000000000..9559e2d5f --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/facade/IInboundRankService.java @@ -0,0 +1,26 @@ +package com.mhd.wms.domain.inboundRank.repository.facade; + +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; + +import java.util.List; + +/** + * 入库排名统计Service接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface IInboundRankService { + + /** + * 商品入库排名列表(仓单+货品汇总,按件数降序) + */ + List queryMaterialRankList(InboundRankDO inboundRankDO); + + /** + * 商品入库排名合计(不分页) + */ + InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java new file mode 100644 index 000000000..bb30997d2 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java @@ -0,0 +1,26 @@ +package com.mhd.wms.domain.inboundRank.repository.mapper; + +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; + +import java.util.List; + +/** + * 入库排名统计Mapper接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface InboundRankMapper { + + /** + * 商品入库排名列表(按物料编码合并,按件数降序,过滤0件行) + */ + List queryMaterialRankList(InboundRankDO inboundRankDO); + + /** + * 商品入库排名合计(不分页,当前筛选条件全量合计) + */ + InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/persistence/InboundRankImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/persistence/InboundRankImpl.java new file mode 100644 index 000000000..519b7cc13 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/persistence/InboundRankImpl.java @@ -0,0 +1,34 @@ +package com.mhd.wms.domain.inboundRank.repository.persistence; + +import com.mhd.wms.domain.inboundRank.repository.facade.IInboundRankService; +import com.mhd.wms.domain.inboundRank.repository.mapper.InboundRankMapper; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import 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 InboundRankImpl implements IInboundRankService { + + @Autowired + private InboundRankMapper inboundRankMapper; + + @Override + public List queryMaterialRankList(InboundRankDO inboundRankDO) { + return inboundRankMapper.queryMaterialRankList(inboundRankDO); + } + + @Override + public InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO) { + return inboundRankMapper.queryMaterialRankTotal(inboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java new file mode 100644 index 000000000..0805c433c --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java @@ -0,0 +1,58 @@ +package com.mhd.wms.domain.inboundRank.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(一行 = 一个物料的合计(按物料编码合并,查询区间内全部已入库仓单),按件数降序排名) + * + *

字段口径:件数=实际上架量(SHELVES_QUANTITY)合计;毛重(吨)=明细总毛重KG/1000;体积=明细合计; + * 投保总额=货品档案保额(material_base_info.insure_amount,物料维度单一值取MAX,不跨仓单累加); + * 仓单编号/客户编号/存货人/入仓日期为单据级字段,按物料合并后单值失真,仅作查询条件不返回

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "入库排名统计对象", description = "入库排名统计响应对象") +public class InboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("物料编码(合并依据)") + @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_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java new file mode 100644 index 000000000..59ac8006b --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.inboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 入库排名统计合计PO + * + *

当前筛选条件下不分页的全量合计,随分页列表一起返回 + * (totalPieceCount/totalGrossWeightTon/totalInsureAmount/totalVolume/totalOrderCount)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "入库排名统计合计对象", description = "入库排名统计合计响应对象") +public class InboundRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("件数合计(实际上架量)") + private BigDecimal totalPieceCount; + + @ApiModelProperty("毛重(吨)合计") + private BigDecimal totalGrossWeightTon; + + @ApiModelProperty("投保总额合计(各物料保额之和,每物料计一次)") + private BigDecimal totalInsureAmount; + + @ApiModelProperty("体积(CBM)合计") + private BigDecimal totalVolume; + + @ApiModelProperty("涉及仓单数(当前筛选条件下去重统计)") + private Long totalOrderCount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java new file mode 100644 index 000000000..1cc725242 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java @@ -0,0 +1,50 @@ +package com.mhd.wms.domain.inboundRank.repository.todo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 入库排名统计查询DO + * + *

topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class InboundRankDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期-开始 yyyy-MM-dd(必填)") + private String warehouseDateStart; + + @ApiModelProperty("入仓日期-结束 yyyy-MM-dd(必填)") + private String warehouseDateEnd; + + @ApiModelProperty("仓单编号/入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("客户编号(模糊)") + private String shipperCode; + + @ApiModelProperty("存货人/客户名称(模糊)") + private String shipperName; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("一级组织表ID(登录用户隔离,非1时注入)") + private Long topOrganizationId; + + @ApiModelProperty("仓库id(按用户关联仓库注入)") + private Long warehouseId; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java new file mode 100644 index 000000000..53e948b61 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.inboundRank.service; + +import com.mhd.wms.domain.inboundRank.repository.facade.IInboundRankService; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 入库排名统计领域服务 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class InboundRankDomainService { + + @Autowired + private IInboundRankService inboundRankService; + + /** + * 商品入库排名列表(仓单+货品汇总,按件数降序) + */ + public List queryMaterialRankList(InboundRankDO inboundRankDO) { + return inboundRankService.queryMaterialRankList(inboundRankDO); + } + + /** + * 商品入库排名合计(不分页) + */ + public InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO) { + return inboundRankService.queryMaterialRankTotal(inboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/entity/MaterialInventory.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/entity/MaterialInventory.java index 22cd47527..ac62dee18 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/entity/MaterialInventory.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/entity/MaterialInventory.java @@ -210,6 +210,12 @@ public class MaterialInventory 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_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java index ee83c4cd7..91afbce94 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java @@ -874,6 +874,7 @@ public class MaterialInventoryImpl extends ServiceImpl boxPalletNoList; @@ -271,4 +287,7 @@ public class MaterialInventoryDO extends MaterialBaseDO { @ApiModelProperty("库存分配匹配:Batch Ref NO's token 列表(默认不启用,仅显式赋值时参与匹配)") private List batchRefNoList; + + @ApiModelProperty("导出标识:导出与查询共用 /list,true-本次为导出请求,启用导出融合排序(到期日倒序优先→同到期日按物料编码升序→0库存靠后→更新时间倒序);不传-保持原有排序") + private Boolean isExport; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryParamDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryParamDO.java index d14ce404c..81465edd2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryParamDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryParamDO.java @@ -88,6 +88,8 @@ public class MaterialInventoryParamDO extends MaterialBaseDO { private Date expiryDate; //库存日期 private Date inventoryDate; + //进货日期 + private Date purchaseDate; //扩展字段3 private Date extAttr3; //扩展字段4 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java index ee2655055..a473fa5ed 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java @@ -551,7 +551,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1)); for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) { BigDecimal nowAllocationQuantity = outMaterialDetail.getNowAllocationQuantity(); if (nowAllocationQuantity == null || nowAllocationQuantity.compareTo(BigDecimal.ZERO) <= 0) { @@ -700,7 +702,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag,1)); for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) { BigDecimal nowAllocationQuantity = outMaterialDetail.getNowAllocationQuantity(); if (nowAllocationQuantity == null || nowAllocationQuantity.compareTo(BigDecimal.ZERO) <= 0) { @@ -995,7 +999,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag,1) + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); for (OutMaterialDetailDO outMaterialDetail : outMaterialDetailList) { Long materialInventoryId = outMaterialDetail.getMaterialInventoryId(); BigDecimal allocationQuantity = outMaterialDetail.getActualQuantity(); @@ -1105,7 +1111,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag,1) + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); for (OutMaterialDetailDO outMaterialDetail : outMaterialDetailList) { Long materialInventoryId = outMaterialDetail.getMaterialInventoryId(); BigDecimal allocationQuantity = outMaterialDetail.getActualQuantity(); @@ -1241,11 +1249,13 @@ public class OutMaterialDetailImpl extends ServiceImpl().lambda() .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDO.getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag,1) .eq(OutMaterialDetail::getBarCode, stockOutOrderDO.getBarCode())); }else { OutMaterialDetailSerialNumber outMaterialDetailSerialNumber = outMaterialDetailSerialNumberService.getOne(new QueryWrapper().lambda() .eq(OutMaterialDetailSerialNumber::getSerialNumber, stockOutOrderDO.getSerialNumber())); outMaterialDetailDb = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getDelFlag,1) .eq(OutMaterialDetail::getUniqueId, outMaterialDetailSerialNumber.getMaterialDetailUniqueId())); } if(outMaterialDetailDb == null){ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java new file mode 100644 index 000000000..2bc25d4a3 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java @@ -0,0 +1,37 @@ +package com.mhd.wms.domain.outboundRank.repository.facade; + +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; + +import java.util.List; + +/** + * 出库排名统计Service接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface IOutboundRankService { + + /** + * 商品出库排名列表(货品聚合) + */ + List queryMaterialRankList(OutboundRankDO outboundRankDO); + + /** + * 商品出库排名合计(不分页) + */ + OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名列表(线路×货品聚合) + */ + List queryLineRankList(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名合计(不分页) + */ + OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java new file mode 100644 index 000000000..ff5f702d8 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java @@ -0,0 +1,37 @@ +package com.mhd.wms.domain.outboundRank.repository.mapper; + +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; + +import java.util.List; + +/** + * 出库排名统计Mapper接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface OutboundRankMapper { + + /** + * 商品出库排名列表(一行=一个货品,跨单汇总,按实际出库量降序) + */ + List queryMaterialRankList(OutboundRankDO outboundRankDO); + + /** + * 商品出库排名合计(不分页,当前筛选条件全量合计) + */ + OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名列表(一行=线路×货品,按实际出库量降序,仅统计带线路的单) + */ + List queryLineRankList(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名合计(不分页,当前筛选条件全量合计) + */ + OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java new file mode 100644 index 000000000..6555dc647 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java @@ -0,0 +1,45 @@ +package com.mhd.wms.domain.outboundRank.repository.persistence; + +import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; +import com.mhd.wms.domain.outboundRank.repository.mapper.OutboundRankMapper; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +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 OutboundRankImpl implements IOutboundRankService { + + @Autowired + private OutboundRankMapper outboundRankMapper; + + @Override + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryMaterialRankList(outboundRankDO); + } + + @Override + public OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryMaterialRankTotal(outboundRankDO); + } + + @Override + public List queryLineRankList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryLineRankList(outboundRankDO); + } + + @Override + public OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryLineRankTotal(outboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java new file mode 100644 index 000000000..397126046 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 出库排名统计(明细)合计PO + * + *

当前筛选条件下不分页的全量合计,随分页列表一起返回 + * (totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名统计明细合计对象", description = "出库排名统计明细合计响应对象") +public class OutboundDetailRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("件数合计") + private BigDecimal totalPieceCount; + + @ApiModelProperty("毛重(吨)合计") + private BigDecimal totalGrossWeightTon; + + @ApiModelProperty("体积(CBM)合计") + private BigDecimal totalVolume; + + @ApiModelProperty("仓单数合计(去重出库单数)") + private Long totalOrderCount; + + @ApiModelProperty("线路数合计(去重线路数,线路排名使用)") + private Long totalLineCount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java new file mode 100644 index 000000000..38b7ecc4a --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java @@ -0,0 +1,59 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 线路出库排名PO(一行 = 线路×货品,日期区间内汇总) + * + *

按线路+物料编码合并:多张出库单合并为一行,单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)不提供; + * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空,不参与线路排名); + * 件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") +public class OutboundLineRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("线路编码") + @Excel(name = "线路编码") + private String lineCode; + + @ApiModelProperty("线路") + @Excel(name = "线路") + private String lineName; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java new file mode 100644 index 000000000..d58cac1d5 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java @@ -0,0 +1,50 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品出库排名PO(一行 = 一个货品,日期区间内跨出库单汇总) + * + *

按物料编码合并:一个货品会走多条线路/多张单,单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)与 + * 线路字段均无单值可返,不提供;件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") +public class OutboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java new file mode 100644 index 000000000..6ace89562 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java @@ -0,0 +1,59 @@ +package com.mhd.wms.domain.outboundRank.repository.todo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 出库排名统计(明细)查询DO + * + *

topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class OutboundRankDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填)") + private String createTimeStart; + + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填)") + private String createTimeEnd; + + @ApiModelProperty("仓单编号/出库单号(模糊)") + private String outOrderNumber; + + @ApiModelProperty("入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("线路编码(模糊)") + private String lineCode; + + @ApiModelProperty("线路名称(模糊)") + private String lineName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("客户名称(模糊)") + private String customerName; + + @ApiModelProperty("货主名称(模糊)") + private String shipperName; + + @ApiModelProperty("一级组织表ID(登录用户隔离,非1时注入)") + private Long topOrganizationId; + + @ApiModelProperty("仓库id(按用户关联仓库注入)") + private Long warehouseId; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java new file mode 100644 index 000000000..18af50291 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java @@ -0,0 +1,54 @@ +package com.mhd.wms.domain.outboundRank.service; + +import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库排名统计领域服务 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class OutboundRankDomainService { + + @Autowired + private IOutboundRankService outboundRankService; + + /** + * 商品出库排名列表(货品聚合) + */ + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryMaterialRankList(outboundRankDO); + } + + /** + * 商品出库排名合计(不分页) + */ + public OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryMaterialRankTotal(outboundRankDO); + } + + /** + * 线路出库排名列表(线路×货品聚合) + */ + public List queryLineRankList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryLineRankList(outboundRankDO); + } + + /** + * 线路出库排名合计(不分页) + */ + public OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryLineRankTotal(outboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java index d79187f09..d255f2cea 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java @@ -401,7 +401,8 @@ public class PickingOrderDomainService { // 拣货提交(/pickingOrderApi/picking)一次拣满也会完成拣货,此前仅 completePicking 会生成复核单,此处对齐 if (Boolean.TRUE.equals(updated) && Integer.valueOf(1).equals(pickingOrderPODb.getType())) { StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); + .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder != null) { Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, stockOutOrder); if (newReviewId != null) { @@ -493,7 +494,8 @@ public class PickingOrderDomainService { int status = 6; //不需要复核的单子 标记出库单完成 StockOutOrder stockOutOrderDb = stockOutOrderService.getOne(new QueryWrapper().lambda() - .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); + .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); // 与下发拣货数量比较:只下发部分时用拣货计划数量,否则用出库单总数量 List allPickingOrders = pickingOrderService.list(new QueryWrapper().lambda() .eq(PickingOrder::getDelFlag, 1) @@ -522,7 +524,9 @@ public class PickingOrderDomainService { List list = pickingMaterialDetailService.list(new QueryWrapper().lambda().eq(PickingMaterialDetail::getPickingOrderNumber, pickingOrder.getPickingOrderNumber())); for (PickingMaterialDetail pickingMaterialDetail :list){ - OutMaterialDetail outMaterialDetail = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda().eq(OutMaterialDetail::getUniqueId, pickingMaterialDetail.getOutUniqueId())); + OutMaterialDetail outMaterialDetail = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getUniqueId, pickingMaterialDetail.getOutUniqueId()) + .eq(OutMaterialDetail::getDelFlag,1)); outMaterialDetail.setPickingQuantity(pickingMaterialDetail.getPickingQuantity()); outMaterialDetailMapper.updateById(outMaterialDetail); } @@ -734,7 +738,7 @@ public class PickingOrderDomainService { throw new ServiceException("拣货单不存在"); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StockOutOrder::getOutOrderNumber, pickingOrderPO.getOrderNumber()); + queryWrapper.eq(StockOutOrder::getDelFlag,1).eq(StockOutOrder::getOutOrderNumber, pickingOrderPO.getOrderNumber()); StockOutOrder stockOutOrder = stockOutOrderService.getOne(queryWrapper); if(null == stockOutOrder){ throw new ServiceException("出库单不存在"); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java index 56ecf7782..054f14b46 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java @@ -260,7 +260,8 @@ public class ReviewOrderDomainService { .eq(OutMaterialDetail::getDelFlag, 1)); if (outMd == null) { outMd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper() - .eq(OutMaterialDetail::getUniqueId, line.getOutUniqueId())); + .eq(OutMaterialDetail::getUniqueId, line.getOutUniqueId()) + .eq(OutMaterialDetail::getDelFlag, 1)); } if (outMd != null) { d.setMaterialDetailId(outMd.getMaterialDetailId()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java index 14861f700..85876594f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java @@ -48,7 +48,7 @@ public class PushSyncBmsDomainService { public void pushInShelfOrder(String inOrderNumber) { // 根据入库单号,查询入库单信息,并拼接推送所需参数 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StockInOrder::getInOrderNumber, inOrderNumber); + queryWrapper.eq(StockInOrder::getInOrderNumber, inOrderNumber).eq(StockInOrder::getDelFlag,1); StockInOrder stockInOrder = iStockInOrderService.getOne(queryWrapper); if(null == stockInOrder){ throw new ServiceException("入库单信息未找到"); @@ -96,7 +96,7 @@ public class PushSyncBmsDomainService { */ public void pushOutOrder(String outOrderNumber) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StockOutOrder::getOutOrderNumber, outOrderNumber); + queryWrapper.eq(StockOutOrder::getOutOrderNumber, outOrderNumber).eq(StockOutOrder::getDelFlag,1); StockOutOrder stockOutOrder = iStockOutOrderService.getOne(queryWrapper); if(null == stockOutOrder){ throw new ServiceException("出库单信息未找到"); @@ -153,4 +153,4 @@ public class PushSyncBmsDomainService { } -} +} \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/entity/ReceiptMaterialDetail.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/entity/ReceiptMaterialDetail.java index 7155196a6..8718e1c0a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/entity/ReceiptMaterialDetail.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/entity/ReceiptMaterialDetail.java @@ -286,6 +286,11 @@ public class ReceiptMaterialDetail extends BaseVOEntity { @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date inventoryDate; + @ApiModelProperty("进货日期") + @Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date purchaseDate; + @ApiModelProperty("扩展属性1") @Excel(name = "扩展属性1") @TableField("ext_attr_1") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index 78ad82483..c4a2dee8d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -743,14 +743,19 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl lqw = new LambdaQueryWrapper<>(); // 按照物料名称排序 - lqw.eq(ShiftMaterialDetail::getShiftIoDetailId, shiftIoDetailId).orderByAsc(ShiftMaterialDetail::getMaterialName); + lqw.eq(ShiftMaterialDetail::getShiftIoDetailId, shiftIoDetailId) + .eq(ShiftMaterialDetail::getDelFlag, 1) + .orderByAsc(ShiftMaterialDetail::getMaterialName); ShiftMaterialDetail shiftMaterialDetail = shiftMaterialDetailMapper.selectOne(lqw); ShiftMaterialDetailPO shiftMaterialDetailPO = new ShiftMaterialDetailPO(); BeanUtils.copyProperties(shiftMaterialDetail, shiftMaterialDetailPO); @@ -888,4 +891,4 @@ public class ShiftMaterialDetailImpl extends ServiceImpl().lambda(). - eq(OutMaterialDetail::getUniqueId, outMaterialDetailSerialNumber.getMaterialDetailUniqueId())); + OutMaterialDetail outMaterialDetail = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getDelFlag,1) + .eq(OutMaterialDetail::getUniqueId, outMaterialDetailSerialNumber.getMaterialDetailUniqueId())); if (outMaterialDetail == null){ throw new ServiceException("物料不存在"); } @@ -273,7 +274,9 @@ public class SowingDistributionDetailsImpl extends ServiceImpl allocationByOrder(AllocationByOrderDO allocationByOrderDO) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber())); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder == null){ throw new ServiceException("出库单不存在"); } @@ -306,7 +309,9 @@ public class SowingDistributionDetailsImpl extends ServiceImpl().lambda().eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber())); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder == null){ throw new ServiceException("出库单不存在"); } @@ -356,4 +361,4 @@ public class SowingDistributionDetailsImpl extends ServiceImpl().lambda().in(StockOutOrder::getOutOrderId, stockOutOrderId)); List stockOutOrderNumber = stockOutOrderList.stream().map(StockOutOrder::getOutOrderNumber).collect(Collectors.toList()); - List list = outMaterialDetailService.list(new QueryWrapper().lambda().in(OutMaterialDetail::getOutOrderNumber, stockOutOrderNumber).eq(OutMaterialDetail::getGenPickingOrder, 2)); + List list = outMaterialDetailService.list(new QueryWrapper().lambda() + .in(OutMaterialDetail::getOutOrderNumber, stockOutOrderNumber) + .eq(OutMaterialDetail::getGenPickingOrder, 2) + .eq(OutMaterialDetail::getDelFlag, 1)); if (CollectionUtils.isEmpty(list)){ throw new ServiceException("不存在已分配且未生成拣货单的物料明细,无法生成拣货单!"); } @@ -2542,6 +2545,13 @@ public class StockOutOrderDomainService { private static final String OMS_AUTO_AUDIT_REMARK = "OMS下发自动审核"; public void omsOrderAdd(StockOutOrder stockOutOrder) { + //幂等保护:重复下发时同单号活动单已存在则跳过,避免插入重复出库单(下发失败重试场景此前会产生重复数据) + StockOutOrder existOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, stockOutOrder.getOutOrderNumber()) + .eq(StockOutOrder::getDelFlag, 1), false); + if (existOrder != null) { + return; + } // 任务下发用户id String userId = stockInOrderMapper.queryWarehouseUserId(stockOutOrder.getOrganizationId(), stockOutOrder.getWarehouseId(), stockOutOrder.getTopOrganizationId()); stockOutOrder.setTaskIssueUserId(userId); @@ -2608,6 +2618,11 @@ public class StockOutOrderDomainService { if (CollectionUtils.isEmpty(outMaterialDetails)) { return; } + //幂等保护:重复下发时先逻辑删除同单号已存在的活动明细,避免重复插入导致分配/拣货数据错乱 + outMaterialDetailService.update(new UpdateWrapper().lambda() + .set(OutMaterialDetail::getDelFlag, 2) + .eq(OutMaterialDetail::getOutOrderNumber, outMaterialDetails.get(0).getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag, 1)); outMaterialDetailService.saveBatch(outMaterialDetails); autoAuditOmsOutOrder(outMaterialDetails.get(0).getOutOrderNumber()); } @@ -2617,6 +2632,14 @@ public class StockOutOrderDomainService { if (CollectionUtils.isEmpty(deliveryDetailsLinks)) { return; } + //幂等保护:重复下发时先逻辑删除同单号已存在的配送明细,避免重复插入 + String firstOrderNumber = deliveryDetailsLinks.get(0).getOrderNumber(); + if (StringUtils.isNotEmpty(firstOrderNumber)) { + deliveryDetailsLinkService.update(new UpdateWrapper().lambda() + .set(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 2) + .eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getOrderNumber, firstOrderNumber) + .eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 1)); + } for (DeliveryDetailsLink deliveryDetailsLink : deliveryDetailsLinks) { com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink deliveryDetailsLinkEntity = new com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink(); BeanUtils.copyProperties(deliveryDetailsLink, deliveryDetailsLinkEntity); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java index 5b66ed57e..652ab1e59 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java @@ -865,7 +865,9 @@ public class StockOutTaskOrderDomainService { pickingOrderDO.setUpdateByName(loginUser.getUsername()); pickingOrderDO.setUpdateTime(new Date()); pickingOrderService.addQuantity(pickingOrderDO); - PickingOrder onePickingOrder = pickingOrderService.getOne(new QueryWrapper().lambda().eq(PickingOrder::getPickingOrderNumber, stockOutTaskOrderPODb.getPickingOrderNumber())); + PickingOrder onePickingOrder = pickingOrderService.getOne(new QueryWrapper().lambda() + .eq(PickingOrder::getPickingOrderNumber, stockOutTaskOrderPODb.getPickingOrderNumber()) + .eq(PickingOrder::getDelFlag,1)); PickingOrderPO pickingOrderPODb = pickingOrderService.getInfoByIdAndType(onePickingOrder.getPickingOrderId(), onePickingOrder.getType()); return updateStockOutOrder(pickingOrderPODb); } @@ -938,6 +940,7 @@ public class StockOutTaskOrderDomainService { // 与 PickingOrderDomainService.picking 一致:PDA 按物料拣货/作业单路径拣满时只走本方法,需触发生成复核单 if (stockOutUpdated) { StockOutOrder so = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); if (so != null) { Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, so); @@ -1068,4 +1071,4 @@ public class StockOutTaskOrderDomainService { } } -} +} \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java index e323c2b06..43519937c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java @@ -1493,6 +1493,7 @@ public class StockReceiptOrderDomainService { shelfMaterialDetailDO.setTotalGrossWeight(receiptMaterialDetailDO.getTotalGrossWeight()); shelfMaterialDetailDO.setExpiryDate(receiptMaterialDetailDO.getExpiryDate()); shelfMaterialDetailDO.setInventoryDate(receiptMaterialDetailDO.getInventoryDate()); + shelfMaterialDetailDO.setPurchaseDate(receiptMaterialDetailDO.getPurchaseDate()); shelfMaterialDetailDO.setBatchRefNo(receiptMaterialDetailDO.getBatchRefNo()); shelfMaterialDetailDO.setSheetRefNo(receiptMaterialDetailDO.getSheetRefNo()); shelfMaterialDetailDO.setBoxPalletNo(receiptMaterialDetailDO.getBoxPalletNo()); @@ -1533,6 +1534,7 @@ public class StockReceiptOrderDomainService { shelfMaterialDetailDOChildren.setProductionDate(receiptMaterialDetailDOChildren.getProductionDate()); shelfMaterialDetailDOChildren.setExpiryDate(receiptMaterialDetailDOChildren.getExpiryDate()); shelfMaterialDetailDOChildren.setInventoryDate(receiptMaterialDetailDOChildren.getInventoryDate()); + shelfMaterialDetailDOChildren.setPurchaseDate(receiptMaterialDetailDOChildren.getPurchaseDate()); shelfMaterialDetailDOChildren.setBatchRefNo(receiptMaterialDetailDOChildren.getBatchRefNo()); shelfMaterialDetailDOChildren.setSheetRefNo(receiptMaterialDetailDOChildren.getSheetRefNo()); shelfMaterialDetailDOChildren.setBoxPalletNo(receiptMaterialDetailDOChildren.getBoxPalletNo()); @@ -1634,10 +1636,11 @@ public class StockReceiptOrderDomainService { shelfMaterialDetailDO.setTotalVolume(receiptMaterialDetailPO.getTotalVolume()); shelfMaterialDetailDO.setTotalNetWeight(receiptMaterialDetailPO.getTotalNetWeight()); shelfMaterialDetailDO.setTotalGrossWeight(receiptMaterialDetailPO.getTotalGrossWeight()); - // 传递生产日期、过期日期、存货日期、Batch Ref NO's、Sheet Ref NO's、箱号/卡板号、扩展属性1-4 + // 传递生产日期、过期日期、存货日期、进货日期、Batch Ref NO's、Sheet Ref NO's、箱号/卡板号、扩展属性1-4 shelfMaterialDetailDO.setProductionDate(receiptMaterialDetailPO.getProductionDate()); shelfMaterialDetailDO.setExpiryDate(receiptMaterialDetailPO.getExpiryDate()); shelfMaterialDetailDO.setInventoryDate(receiptMaterialDetailPO.getInventoryDate()); + shelfMaterialDetailDO.setPurchaseDate(receiptMaterialDetailPO.getPurchaseDate()); shelfMaterialDetailDO.setBatchRefNo(receiptMaterialDetailPO.getBatchRefNo()); shelfMaterialDetailDO.setSheetRefNo(receiptMaterialDetailPO.getSheetRefNo()); shelfMaterialDetailDO.setBoxPalletNo(receiptMaterialDetailPO.getBoxPalletNo()); @@ -1686,6 +1689,7 @@ public class StockReceiptOrderDomainService { shelfMaterialDetailDOChildren.setProductionDate(receiptMaterialDetailPOChildren.getProductionDate()); shelfMaterialDetailDOChildren.setExpiryDate(receiptMaterialDetailPOChildren.getExpiryDate()); shelfMaterialDetailDOChildren.setInventoryDate(receiptMaterialDetailPOChildren.getInventoryDate()); + shelfMaterialDetailDOChildren.setPurchaseDate(receiptMaterialDetailPOChildren.getPurchaseDate()); shelfMaterialDetailDOChildren.setBatchRefNo(receiptMaterialDetailPOChildren.getBatchRefNo()); shelfMaterialDetailDOChildren.setSheetRefNo(receiptMaterialDetailPOChildren.getSheetRefNo()); shelfMaterialDetailDOChildren.setBoxPalletNo(receiptMaterialDetailPOChildren.getBoxPalletNo()); @@ -1767,10 +1771,11 @@ public class StockReceiptOrderDomainService { shelfMaterialDetailDO.setQuantity(receiptMaterialDetailPO.getReceiptQuantity()); shelfMaterialDetailDO.setInUniqueId(receiptMaterialDetailPO.getInUniqueId()); shelfMaterialDetailDO.setReceiptUniqueId(receiptMaterialDetailPO.getUniqueId()); - // 传递生产日期、过期日期、存货日期、Batch Ref NO's、Sheet Ref NO's、箱号/卡板号、扩展属性1-4 + // 传递生产日期、过期日期、存货日期、进货日期、Batch Ref NO's、Sheet Ref NO's、箱号/卡板号、扩展属性1-4 shelfMaterialDetailDO.setProductionDate(receiptMaterialDetailPO.getProductionDate()); shelfMaterialDetailDO.setExpiryDate(receiptMaterialDetailPO.getExpiryDate()); shelfMaterialDetailDO.setInventoryDate(receiptMaterialDetailPO.getInventoryDate()); + shelfMaterialDetailDO.setPurchaseDate(receiptMaterialDetailPO.getPurchaseDate()); shelfMaterialDetailDO.setBatchRefNo(receiptMaterialDetailPO.getBatchRefNo()); shelfMaterialDetailDO.setSheetRefNo(receiptMaterialDetailPO.getSheetRefNo()); shelfMaterialDetailDO.setBoxPalletNo(receiptMaterialDetailPO.getBoxPalletNo()); @@ -1809,10 +1814,11 @@ public class StockReceiptOrderDomainService { shelfMaterialDetailDOChildren.setInUniqueId(receiptMaterialDetailPO.getInUniqueId()); // 子项使用自身的 uniqueId 作为 receiptUniqueId,以便正确关联 material_more_detail 中的扩展属性 shelfMaterialDetailDOChildren.setReceiptUniqueId(receiptMaterialDetailDOChildren.getUniqueId()); - // 传递生产日期、过期日期、存货日期、Batch Ref NO's、Sheet Ref NO's、箱号/卡板号、扩展属性1-4 + // 传递生产日期、过期日期、存货日期、进货日期、Batch Ref NO's、Sheet Ref NO's、箱号/卡板号、扩展属性1-4 shelfMaterialDetailDOChildren.setProductionDate(receiptMaterialDetailDOChildren.getProductionDate()); shelfMaterialDetailDOChildren.setExpiryDate(receiptMaterialDetailDOChildren.getExpiryDate()); shelfMaterialDetailDOChildren.setInventoryDate(receiptMaterialDetailDOChildren.getInventoryDate()); + shelfMaterialDetailDOChildren.setPurchaseDate(receiptMaterialDetailDOChildren.getPurchaseDate()); shelfMaterialDetailDOChildren.setBatchRefNo(receiptMaterialDetailDOChildren.getBatchRefNo()); shelfMaterialDetailDOChildren.setSheetRefNo(receiptMaterialDetailDOChildren.getSheetRefNo()); shelfMaterialDetailDOChildren.setBoxPalletNo(receiptMaterialDetailDOChildren.getBoxPalletNo()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index bf0b3c47b..8c52ff32f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -62,6 +62,8 @@ import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO; import com.mhd.wms.domain.materialMoreDetail.repository.todo.MaterialMoreDetailDO; +import com.mhd.wms.domain.receiptMaterialDetail.entity.ReceiptMaterialDetail; +import com.mhd.wms.domain.receiptMaterialDetail.repository.facade.IReceiptMaterialDetailService; import com.mhd.wms.domain.serialNumber.entity.SerialNumber; import com.mhd.wms.domain.serialNumber.repository.facade.ISerialNumberService; import com.mhd.wms.domain.shelfMaterialDetail.entity.ShelfMaterialDetail; @@ -148,6 +150,8 @@ public class StockShelfOrderDomainService { private MaterialBaseInfoMapper materialBaseInfoMapper; @Autowired private ICopyCodeReferenceService copyCodeReferenceService; + @Autowired + private IReceiptMaterialDetailService receiptMaterialDetailService; @Resource private OmsServiceFeign omsServiceFeign; @@ -1134,6 +1138,21 @@ public class StockShelfOrderDomainService { .collect(Collectors.toList()); } } + // 过期日期兜底:上架明细未带过期日期时,回查收货明细补齐(优先过期日期,其次饮用日期), + // 避免收货环节补填的效期丢失导致库存过期日期为空不回显 + if (shelfMaterialDetail.getExpiryDate() == null && shelfMaterialDetail.getReceiptUniqueId() != null) { + ReceiptMaterialDetail receiptDetail = receiptMaterialDetailService.getOne( + new LambdaQueryWrapper() + .eq(ReceiptMaterialDetail::getUniqueId, shelfMaterialDetail.getReceiptUniqueId()) + .last("LIMIT 1")); + if (receiptDetail != null) { + if (receiptDetail.getExpiryDate() != null) { + shelfMaterialDetail.setExpiryDate(receiptDetail.getExpiryDate()); + } else if (receiptDetail.getDrinkDate() != null) { + shelfMaterialDetail.setExpiryDate(receiptDetail.getDrinkDate()); + } + } + } Long shipperId = stockReceiptOrderDO.getShipperId(); MaterialInventory param = getParam(shelfMaterialDetail, fieldNames, shipperId,stockReceiptOrderDO.getInOrderNumber()); List materialInventoryPOS = materialInventoryMapper.selectListByWhere(param); @@ -1262,6 +1281,7 @@ public class StockShelfOrderDomainService { inventoryParamDO.setInventoryDate(shelfMaterialDetail.getInventoryDate()); inventoryParamDO.setExpiryDate(shelfMaterialDetail.getExpiryDate()); inventoryParamDO.setProductionDate(shelfMaterialDetail.getProductionDate()); + inventoryParamDO.setPurchaseDate(shelfMaterialDetail.getPurchaseDate()); inventoryParamDO.setBoxPalletNo(shelfMaterialDetail.getBoxPalletNo()); inventoryParamDO.setSheetRefNo(shelfMaterialDetail.getSheetRefNo()); inventoryParamDO.setBatchRefNo(shelfMaterialDetail.getBatchRefNo()); @@ -1348,6 +1368,7 @@ public class StockShelfOrderDomainService { BeanUtils.copyProperties(inventoryParamDO, materialInventoryOmsParamDO); materialInventoryOmsParamDO.setProductionDate(materialInventoryPO.getProductionDate()); materialInventoryOmsParamDO.setExpiryDate(materialInventoryPO.getExpiryDate()); + materialInventoryOmsParamDO.setPurchaseDate(materialInventoryPO.getPurchaseDate()); materialInventoryOmsParamDO.setMaterialBaseInfoId(materialInventoryPO.getMaterialBaseInfoId()); materialInventoryOmsParamDO.setWarehouseId(materialInventoryPO.getWarehouseId()); materialInventoryOmsParamDO.setLotNumber(materialInventoryPO.getLotNumber()); @@ -1510,6 +1531,9 @@ public class StockShelfOrderDomainService { case "production_date": param.setProductionDate(shelfMaterialDetail.getProductionDate()); break; + case "purchase_date": + param.setPurchaseDate(shelfMaterialDetail.getPurchaseDate()); + break; } } } else { diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inboundRank/InboundRankAssembler.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inboundRank/InboundRankAssembler.java new file mode 100644 index 000000000..f884e0715 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inboundRank/InboundRankAssembler.java @@ -0,0 +1,36 @@ +package com.mhd.wms.interfaces.assember.inboundRank; + +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.wms.domain.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.interfaces.dto.inboundRank.InboundRankDTO; +import org.springframework.stereotype.Component; + +/** + * 入库排名统计Assembler + * + * @author rcx + * @date 2026-08-31 + */ +@Component +public class InboundRankAssembler { + + /** + * 转换实体 + */ + public InboundRankDO toDO(InboundRankDTO inboundRankDTO) { + InboundRankDO inboundRankDO = new InboundRankDO(); + // 拷贝 + BeanUtils.copyProperties(inboundRankDTO, inboundRankDO, IgnoreNullUtil.getNullPropertyNames(inboundRankDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + return inboundRankDO; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outboundRank/OutboundRankAssembler.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outboundRank/OutboundRankAssembler.java new file mode 100644 index 000000000..8388a919f --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outboundRank/OutboundRankAssembler.java @@ -0,0 +1,36 @@ +package com.mhd.wms.interfaces.assember.outboundRank; + +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.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import com.mhd.wms.interfaces.dto.outboundRank.OutboundRankDTO; +import org.springframework.stereotype.Component; + +/** + * 出库排名统计Assembler + * + * @author rcx + * @date 2026-08-31 + */ +@Component +public class OutboundRankAssembler { + + /** + * 转换实体 + */ + public OutboundRankDO toDO(OutboundRankDTO outboundRankDTO) { + OutboundRankDO outboundRankDO = new OutboundRankDO(); + // 拷贝 + BeanUtils.copyProperties(outboundRankDTO, outboundRankDO, IgnoreNullUtil.getNullPropertyNames(outboundRankDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + return outboundRankDO; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java new file mode 100644 index 000000000..a73386995 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java @@ -0,0 +1,46 @@ +package com.mhd.wms.interfaces.dto.inboundRank; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 入库排名统计入参DTO + * + *

按入仓日期区间筛选商品入库量统计排名,统计口径:入仓日期 + 仅已入库状态(5) + 明细仅取 level=1 主行; + * 一行 = 一个物料的合计(按物料编码合并),按件数降序排名; + * 仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件,返回列不含这些字段

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class InboundRankDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期-开始 yyyy-MM-dd(必填,按入仓单入仓日期筛选)") + private String warehouseDateStart; + + @ApiModelProperty("入仓日期-结束 yyyy-MM-dd(必填,按入仓单入仓日期筛选)") + private String warehouseDateEnd; + + @ApiModelProperty("仓单编号/入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("客户编号(模糊)") + private String shipperCode; + + @ApiModelProperty("存货人/客户名称(模糊)") + private String shipperName; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java index 2c5009552..944626b17 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java @@ -188,11 +188,17 @@ public class MaterialInventoryDTO extends MaterialBaseDTO { /** 为 true 时排除库存数量为 0 的行(出库分配选库存用);库存查询页不传或 false */ @ApiModelProperty(value = "是否排除库存数量为0", example = "false") private Boolean excludeZeroInventoryQuantity; + /** 为 true 时排除可用数量为 0 的行(库存数量>0 但可用数量=0 表示已被冻结/占用完,无法出库);不传或 false 不过滤 */ + @ApiModelProperty(value = "是否排除可用数量为0", example = "false") + private Boolean excludeZeroAllocationQuantity; private String expiryDate; private String productionDate; + /** 进货日期(yyyy-MM-dd,单日精确查询) */ + private String purchaseDate; private String expiryDateStr; private String productionDateStr; private String updateTimeStr; + private String purchaseDateStr; private String expiryDateStart; private String expiryDateEnd; @@ -203,4 +209,11 @@ public class MaterialInventoryDTO extends MaterialBaseDTO { private String updateTimeStart; private String updateTimeEnd; + private String purchaseDateStart; + private String purchaseDateEnd; + + /** 入库日期(库存行创建时间)区间查询 */ + private String createTimeStart; + private String createTimeEnd; + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java new file mode 100644 index 000000000..8c32b7844 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java @@ -0,0 +1,54 @@ +package com.mhd.wms.interfaces.dto.outboundRank; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 出库排名统计(明细)入参DTO + * + *

按日期区间筛选出库明细列表,一行 = 仓单×货品(件数/毛重/体积按行汇总,件数降序), + * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13) + 明细仅取 level=1 主行

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class OutboundRankDTO 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 outOrderNumber; + + @ApiModelProperty("入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("线路编码(模糊)") + private String lineCode; + + @ApiModelProperty("线路名称(模糊)") + private String lineName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("客户名称(模糊)") + private String customerName; + + @ApiModelProperty("货主名称(模糊)") + private String shipperName; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java index 0518516cb..5a1116d93 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java @@ -311,6 +311,12 @@ public class ShelfMaterialDetailDTO 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_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java new file mode 100644 index 000000000..a60b9308a --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java @@ -0,0 +1,107 @@ +package com.mhd.wms.interfaces.facadeApi.inboundRank; + +import com.github.pagehelper.PageInfo; +import com.mhd.common.core.constant.HttpStatus; +import com.mhd.common.core.utils.PageUtils; +import com.mhd.common.core.utils.poi.ExcelUtil; +import com.mhd.wms.application.service.inboundRank.InboundRankApplicationService; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.interfaces.assember.inboundRank.InboundRankAssembler; +import com.mhd.wms.interfaces.dto.inboundRank.InboundRankDTO; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; + +/** + * 入库排名统计Api + * + *

按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底) + 仅已入库状态(5), + * 明细仅取 level=1 主行;一行 = 一个物料的合计(按物料编码合并区间内全部已入库仓单), + * 按件数(实际上架量 SHELVES_QUANTITY)降序排名,件数为0的物料不返回。 + * 返回字段:物料编码/货名/规格型号/单位/件数/毛重(吨)/投保总额/体积(CBM); + * 仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件,不返回。 + * 与出库排名(/outboundRankApi)配对,前端用 tab 页区分

+ * + * @author rcx + * @date 2026-08-31 + */ +@RestController +@RequestMapping("/inboundRankApi") +public class InboundRankApi { + + @Resource + private InboundRankAssembler inboundRankAssembler; + + @Autowired + private InboundRankApplicationService inboundRankApplicationService; + + /** + * 分页查询商品入库排名列表(含合计行) + */ + @ApiOperation("分页查询商品入库排名列表") + @GetMapping("/queryMaterialRankList") + public HashMap queryMaterialRankList(InboundRankDTO inboundRankDTO) { + //转换实体 + InboundRankDO inboundRankDO = inboundRankAssembler.toDO(inboundRankDTO); + startPage(); + List list = inboundRankApplicationService.queryMaterialRankList(inboundRankDO); + InboundRankTotalPO total = inboundRankApplicationService.queryMaterialRankTotal(inboundRankDO); + return getDataTableWithTotal(list, total); + } + + /** + * 导出商品入库排名Excel + */ + @ApiOperation("导出商品入库排名Excel") + @GetMapping("/exportMaterialRank") + public void exportMaterialRank(HttpServletResponse response, InboundRankDTO inboundRankDTO) throws Exception { + //转换实体(不分页,导出全量) + InboundRankDO inboundRankDO = inboundRankAssembler.toDO(inboundRankDTO); + List list = inboundRankApplicationService.exportMaterialRank(inboundRankDO); + + 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<>(InboundMaterialRankPO.class); + util.exportExcel(response, list, "入库排名统计"); + } + + /** + * 分页结果 + 合计行:data/total/code/msg 之外追加 + * totalPieceCount/totalGrossWeightTon/totalInsureAmount/totalVolume/totalOrderCount + */ + private HashMap getDataTableWithTotal(List list, InboundRankTotalPO 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("totalPieceCount", total.getTotalPieceCount()); + result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); + result.put("totalInsureAmount", total.getTotalInsureAmount()); + result.put("totalVolume", total.getTotalVolume()); + result.put("totalOrderCount", total.getTotalOrderCount()); + } + return result; + } + + /** + * 设置请求分页数据 + */ + protected void startPage() { + PageUtils.startPage(); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java index 2369c4637..ff774c2bb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java @@ -53,18 +53,31 @@ public class MaterialInventoryApi extends BaseController { /** * 分页查询物料库存列表 */ - @ApiOperation(value = "查询物料库存列表", notes = "库存查询页不传 excludeZeroInventoryQuantity 可查出数量为0;出库分配页传 excludeZeroInventoryQuantity=true 排除库存数量为0") + @ApiOperation(value = "查询物料库存列表", notes = "两个隐藏0库存开关(均不传或 false 不过滤,保持原行为):" + + "excludeZeroInventoryQuantity=true 排除库存数量为0(盘点-库存选择页\"隐藏数量为0的物料\");" + + "excludeZeroAllocationQuantity=true 排除可用数量为0(出库选库存,可用数量=0 表示已被冻结/占用完无法出库);" + + "物料编号筛选传 materialCode(精确匹配),仓库筛选传 warehouseId(下拉);" + + "库存查询页不传开关可查出数量为0;导出复用本接口:传 isExport=true 标识导出请求" + + "(导出显示:商品饮用有效期expiryDate/物料分类materialClassifyName/进货日期purchaseDate,所有查询维度均返回)") @GetMapping("/list") public TableDataInfo list(MaterialInventoryDTO materialInventoryDTO, @RequestParam(value = "customerName", required = false) String customerName, @RequestParam(value = "excludeZeroInventoryQuantity", required = false) Boolean excludeZeroInventoryQuantity, + @RequestParam(value = "excludeZeroAllocationQuantity", required = false) Boolean excludeZeroAllocationQuantity, @RequestParam(value = "expiryDateStart", required = false) String expiryDateStart, @RequestParam(value = "expiryDateEnd", required = false) String expiryDateEnd, - @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate) + @RequestParam(value = "purchaseDateStart", required = false) String purchaseDateStart, + @RequestParam(value = "purchaseDateEnd", required = false) String purchaseDateEnd, + @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate, + // 导出标识:导出与查询共用本接口,isExport=true 表示本次请求为导出(导出专属排序等逻辑以此开关) + @RequestParam(value = "isExport", required = false) Boolean isExport) { if (Boolean.TRUE.equals(excludeZeroInventoryQuantity)) { materialInventoryDTO.setExcludeZeroInventoryQuantity(true); } + if (Boolean.TRUE.equals(excludeZeroAllocationQuantity)) { + materialInventoryDTO.setExcludeZeroAllocationQuantity(true); + } // 出库分配前端传的是客户名称 customerName,这里通过名称查询货主ID,使用精确匹配(不模糊匹配) String shipperName = null; // 保存查询到的货主名称 if (StringUtils.isNotBlank(customerName) && materialInventoryDTO.getShipperId() == null) { @@ -91,10 +104,15 @@ public class MaterialInventoryApi extends BaseController { MaterialInventoryDO materialInventoryDO = materialInventoryAssembler.toDO(materialInventoryDTO); materialInventoryDO.setExpiryDateStr(materialInventoryDTO.getExpiryDate()); materialInventoryDO.setProductionDateStr(materialInventoryDTO.getProductionDate()); + materialInventoryDO.setPurchaseDateStr(materialInventoryDTO.getPurchaseDate()); materialInventoryDO.setExpiryDateStart(expiryDateStart); materialInventoryDO.setExpiryDateEnd(expiryDateEnd); + materialInventoryDO.setPurchaseDateStart(purchaseDateStart); + materialInventoryDO.setPurchaseDateEnd(purchaseDateEnd); // 导出场景:queryRule=wlExpiry + orderByExpiryDate=true 时 SQL 按到期日倒序分组(与 OMS 库存查询导出一致) materialInventoryDO.setOrderByExpiryDate(orderByExpiryDate); + // 导出标识:isExport=true 启用导出融合排序(到期日倒序优先 → 同到期日按物料编码升序,所有维度生效) + materialInventoryDO.setIsExport(isExport); Date updateTime = materialInventoryDTO.getUpdateTime(); if (updateTime != null) { LocalDateTime localDateTime = updateTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); @@ -167,7 +185,10 @@ public class MaterialInventoryApi extends BaseController { // materialDetailId 是新接口专用参数(出库单明细ID),库存 DTO 的同名字段语义是「上架单明细ID」, // 泄入原查询会生成错误的 a.material_detail_id 条件导致查空,进原查询前显式清除 materialInventoryDTO.setMaterialDetailId(null); - return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, orderByExpiryDate); + // assignableList 非导出场景,isExport 传 null;excludeZeroAllocationQuantity 已随 DTO 绑定,透传保持开关生效 + return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, + materialInventoryDTO.getExcludeZeroAllocationQuantity(), + expiryDateStart, expiryDateEnd, null, null, orderByExpiryDate, null); } @ApiOperation("查询物料库存列表不分页;queryRule=hz 时按货主+物料分组(同一物料在不同货主各占一行)") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java new file mode 100644 index 000000000..649e3906a --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java @@ -0,0 +1,151 @@ +package com.mhd.wms.interfaces.facadeApi.outboundRank; + +import com.github.pagehelper.PageInfo; +import com.mhd.common.core.constant.HttpStatus; +import com.mhd.common.core.utils.PageUtils; +import com.mhd.common.core.utils.poi.ExcelUtil; +import com.mhd.wms.application.service.outboundRank.OutboundRankApplicationService; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import com.mhd.wms.interfaces.assember.outboundRank.OutboundRankAssembler; +import com.mhd.wms.interfaces.dto.outboundRank.OutboundRankDTO; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; + +/** + * 出库排名统计Api + * + *

按日期区间筛选出库量统计排名,按出库数量(实际复核出库量)降序。 + * 商品tab:一行 = 一个货品(货号/货名/件数/毛重(吨)/体积(CBM)/退保总额占位),跨出库单汇总,忽略线路筛选参数; + * 线路tab:一行 = 线路×货品(线路编码/线路/货号/货名/件数/毛重(吨)/体积(CBM)/退保总额占位),按线路+物料编码合并, + * 仅统计带线路的单,商品/线路筛选参数均生效; + * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行; + * 件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@RestController +@RequestMapping("/outboundRankApi") +public class OutboundRankApi { + + @Resource + private OutboundRankAssembler outboundRankAssembler; + + @Autowired + private OutboundRankApplicationService outboundRankApplicationService; + + /** + * 分页查询商品出库排名列表(含合计行,商品tab;忽略线路筛选参数) + */ + @ApiOperation("分页查询商品出库排名列表") + @GetMapping("/queryMaterialRankList") + public HashMap queryMaterialRankList(OutboundRankDTO outboundRankDTO) { + //转换实体 + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + //商品tab:忽略线路筛选参数 + outboundRankDO.setLineCode(null); + outboundRankDO.setLineName(null); + startPage(); + List list = outboundRankApplicationService.queryMaterialRankList(outboundRankDO); + OutboundDetailRankTotalPO total = outboundRankApplicationService.queryMaterialRankTotal(outboundRankDO); + return getDataTableWithTotal(list, total); + } + + /** + * 分页查询线路出库排名列表(含合计行,线路tab;一行=线路×货品,仅统计带线路的单) + */ + @ApiOperation("分页查询线路出库排名列表") + @GetMapping("/queryLineRankList") + public HashMap queryLineRankList(OutboundRankDTO outboundRankDTO) { + //转换实体(线路tab:商品/线路筛选参数均生效,按线路+物料编码合并) + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + startPage(); + List list = outboundRankApplicationService.queryLineRankList(outboundRankDO); + OutboundDetailRankTotalPO total = outboundRankApplicationService.queryLineRankTotal(outboundRankDO); + return getDataTableWithTotal(list, total); + } + + /** + * 导出商品出库排名Excel(商品tab;忽略线路筛选参数) + */ + @ApiOperation("导出商品出库排名Excel") + @GetMapping("/exportMaterialRank") + public void exportMaterialRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { + //转换实体(不分页,导出全量) + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + //商品tab:忽略线路筛选参数 + outboundRankDO.setLineCode(null); + outboundRankDO.setLineName(null); + List list = outboundRankApplicationService.exportMaterialRankList(outboundRankDO); + + 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<>(OutboundMaterialRankPO.class); + util.exportExcel(response, list, "商品出库排名"); + } + + /** + * 导出线路出库排名Excel(线路tab;一行=线路×货品,仅统计带线路的单) + */ + @ApiOperation("导出线路出库排名Excel") + @GetMapping("/exportLineRank") + public void exportLineRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { + //转换实体(不分页,导出全量;线路tab:商品/线路筛选参数均生效,按线路+物料编码合并) + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + List list = outboundRankApplicationService.exportLineRankList(outboundRankDO); + + 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<>(OutboundLineRankPO.class); + util.exportExcel(response, list, "线路出库排名"); + } + + /** + * 分页结果 + 合计行:data/total/code/msg 之外追加合计字段(商品tab含 totalOrderCount,线路tab含 totalOrderCount/totalLineCount) + */ + private HashMap getDataTableWithTotal(List list, OutboundDetailRankTotalPO 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("totalPieceCount", total.getTotalPieceCount()); + result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); + result.put("totalVolume", total.getTotalVolume()); + if (total.getTotalOrderCount() != null) { + result.put("totalOrderCount", total.getTotalOrderCount()); + } + if (total.getTotalLineCount() != null) { + result.put("totalLineCount", total.getTotalLineCount()); + } + } + return result; + } + + /** + * 设置请求分页数据 + */ + protected void startPage() { + PageUtils.startPage(); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java index 6e3d11735..eb8575300 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java @@ -208,6 +208,7 @@ public class StockOutOrderApi extends BaseController { public AjaxResult getInfoOutOrderNumber(String outOrderNumber) { // 根据出库单号查询出库单,再按出库单ID查询详情,保证与出库管理页面一致 StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); @@ -226,6 +227,7 @@ public class StockOutOrderApi extends BaseController { return AjaxResult.error("orderNumber不能为空"); } StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, orderNumber)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index b99fb0b27..fc7380c20 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -14,18 +14,18 @@ spring: nacos: discovery: # server-addr: 127.0.0.1:8848 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -34,26 +34,4 @@ spring: file-extension: yml # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} -# XXL-JOB 配置 -#xxl: -# job: -# # 调度中心地址(填你部署的地址) -# admin: -# addresses: http://192.168.1.6:8020/xxl-job-admin -# # 执行器配置 -# executor: -# # 执行器名称(自定义,后面调度中心要用到) -# appname: wms-service-executor -# # 执行器注册地址,默认0表示自动获取 -# address: -# # 执行器IP,默认空自动获取 -# ip: -# # 执行器端口号(每个微服务不能重复,建议9997/9998/9999) -# port: 9997 -# # 执行器日志存放路径 -# logpath: /data/applogs/xxl-job/jobhandler -# # 日志保留天数 -# logretentiondays: 30 -# # 调度中心通讯令牌(默认空,安全可设置) -# accessToken: default_token \ No newline at end of file + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml new file mode 100644 index 000000000..f4c34136c --- /dev/null +++ b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml @@ -0,0 +1,107 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.status = 5 + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_id = #{warehouseId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and b.shipper_code like concat('%', #{shipperCode}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + + + and date_format(IFNULL(b.warehouse_date, b.create_time),'%Y-%m-%d') >= #{warehouseDateStart} + + + and date_format(IFNULL(b.warehouse_date, b.create_time),'%Y-%m-%d') <= #{warehouseDateEnd} + + + + + from in_material_detail a + join stock_in_order b on a.in_order_number = b.in_order_number and b.del_flag = 1 + left join material_base_info c on a.material_base_info_id = c.material_base_info_id + + + + + + + + diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index cfeb130d3..18cdfa24f 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -56,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -65,6 +66,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -84,7 +89,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL (sum(a.GROSS_WEIGHT), 0) GROSS_WEIGHT, IFNULL (sum(a.VOLUME), 0) VOLUME, a.ext_attr_1, a.ext_attr_2, a.ext_attr_3, a.ext_attr_4, - a.production_date, a.expiry_date, a.inventory_date, + a.production_date, a.expiry_date, a.inventory_date, a.purchase_date, a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO,nvl(a.unit_name,b.unit_name) as unit_name, a.bar_code as inv_bar_code, a.in_order_number,a.lot_number, @@ -108,7 +113,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL (sum(a.GROSS_WEIGHT), 0) GROSS_WEIGHT, IFNULL (sum(a.VOLUME), 0) VOLUME, a.ext_attr_1, a.ext_attr_2, a.ext_attr_3, a.ext_attr_4, - a.production_date, a.expiry_date, a.inventory_date, + a.production_date, a.expiry_date, a.inventory_date, a.purchase_date, a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO,nvl(a.unit_name,b.unit_name) as unit_name, a.bar_code as inv_bar_code, a.in_order_number,a.lot_number, @@ -212,6 +217,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and COALESCE(a.inventory_quantity, 0) > 0 + + and COALESCE(a.allocation_quantity, 0) > 0 + and a.create_by_name like concat('%', #{createByName}, '%') @@ -263,6 +271,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.expiry_date DATEADD(DAY, 1, #{expiryDateEnd}) + + AND TO_CHAR(a.purchase_date, 'yyyy-MM-dd') = #{purchaseDateStr} + + + and a.purchase_date >= #{purchaseDateStart} + + + and a.purchase_date DATEADD(DAY, 1, #{purchaseDateEnd}) + + + and date_format(a.create_time,'%Y-%m-%d') >= #{createTimeStart} + + + and date_format(a.create_time,'%Y-%m-%d') <= #{createTimeEnd} + @@ -358,6 +381,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and COALESCE(mi.inventory_quantity, 0) > 0 + + and COALESCE(mi.allocation_quantity, 0) > 0 + and mi.create_by_name like concat('%', #{createByName}, '%') @@ -383,6 +409,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + order by CASE WHEN MAX(a.expiry_date) IS NULL THEN 1 ELSE 0 END ASC, MAX(a.expiry_date) DESC, + MAX(b.material_code) ASC, + CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END ASC, + MAX(a.update_time) DESC, + MAX(a.material_inventory_id) DESC + + + + + @@ -532,13 +606,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(SUM(a.VOLUME), 0) AS VOLUME, MAX(a.unit) AS unit, MAX(a.unit_name) AS unit_name, + MAX(a.create_time) AS create_time, + MAX(a.update_time) AS update_time, MAX(a.production_date) AS production_date, MAX(a.inventory_date) AS inventory_date, + MAX(a.purchase_date) AS purchase_date, MAX(a.batch_ref_no) AS batch_ref_no, MAX(a.sheet_ref_no) AS sheet_ref_no, MAX(a.box_pallet_no) AS box_pallet_no, MAX(a.bar_code) AS inv_bar_code, MAX(a.in_order_number) AS in_order_number, MAX(a.lot_number) AS lot_number, MAX(b.specification_model) AS specification_model, MAX(b.material_code) AS material_code, MAX(b.material_name) AS material_name, + MAX(b.material_classify_code) AS material_classify_code, + MAX(b.material_classify_name) AS material_classify_name, CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END AS sort_order from material_inventory a left join material_base_info b on a.material_base_info_id = b.material_base_info_id @@ -548,16 +627,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
GROUP BY a.MATERIAL_BASE_INFO_ID, a.EXPIRY_DATE, a.shipper_id, a.organization_id, a.top_organization_id - + - - order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, - sort_order, MAX(a.update_time) DESC + + - order by sort_order, MAX(a.update_time) desc + + + + order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, + sort_order, MAX(a.update_time) DESC + + + order by sort_order, MAX(a.update_time) desc + + @@ -593,7 +681,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.SHIPPER_ID, a.MATERIAL_BASE_INFO_ID, loc.warehouse_id, loc.warehouse_code, loc.warehouse_name, loc.storage_section_id, loc.storage_code, loc.storage_name, - loc.storage_location_id, loc.storage_location_code, loc.storage_location_name order by sort_order, a.update_time desc + loc.storage_location_id, loc.storage_location_code, loc.storage_location_name + + + + + order by sort_order, a.update_time desc + @@ -614,6 +708,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.top_organization_id, MAX(b.material_type) AS material_type, MAX(b.material_type_name) AS material_type_name, + MAX(b.material_classify_code) AS material_classify_code, + MAX(b.material_classify_name) AS material_classify_name, MAX(b.bar_code) AS bar_code, MAX(nvl(a.unit_name, b.unit_name)) AS unit_name, MAX(b.pack_id) AS pack_id, @@ -651,7 +747,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" b.material_code, a.warehouse_id, a.organization_id, a.top_organization_id - ORDER BY sort_order, MAX(a.update_time) DESC + + + + + ORDER BY sort_order, MAX(a.update_time) DESC + @@ -728,6 +835,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -1195,6 +1306,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -1513,6 +1625,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND TRUNC(a.PRODUCTION_DATE) = TRUNC(#{productionDate}) + + AND TRUNC(a.purchase_date) = TRUNC(#{purchaseDate}) + AND a.EXT_ATTR_2 = #{extAttr2} @@ -1544,6 +1659,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND a.PRODUCTION_DATE is null + + AND a.purchase_date is null + AND a.EXT_ATTR_2 = #{extAttr2} diff --git a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml new file mode 100644 index 000000000..b35a01337 --- /dev/null +++ b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml @@ -0,0 +1,132 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.status in (9, 12, 13) + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_id = #{warehouseId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.customer_name like concat('%', #{customerName}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and b.line_code like concat('%', #{lineCode}, '%') + + + and b.line_name like concat('%', #{lineName}, '%') + + + and b.out_order_number like concat('%', #{outOrderNumber}, '%') + + + and a.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + + + and date_format(b.create_time,'%Y-%m-%d') >= #{createTimeStart} + + + and date_format(b.create_time,'%Y-%m-%d') <= #{createTimeEnd} + + + + + from out_material_detail a + join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 + + + + + + + + + + + + + + diff --git a/sql/20260831_wms_oms_add_purchase_date.sql b/sql/20260831_wms_oms_add_purchase_date.sql new file mode 100644 index 000000000..a521b45c7 --- /dev/null +++ b/sql/20260831_wms_oms_add_purchase_date.sql @@ -0,0 +1,68 @@ +-- ============================================================================= +-- OMS/WMS 库存查询新增「进货日期」查询条件 —— 新增 PURCHASE_DATE 列 +-- 日期: 2026-08-31 +-- 数据库: 达梦(DM8), 兼容 Oracle 语法, 表名/字段名统一大写 +-- 模式: NGWL_TEST_WMS (mhd_wms) / NGWL_TEST_OMS (mhd_oms) +-- 需求: +-- OMS-库存管理-库存查询 / WMS-库存管理-库存查询 增加查询条件: +-- 物料分类(后端已支持, 无需改表)、进货日期(本脚本, 新字段)、入库日期(复用 +-- create_time, 无需改表)。 +-- 说明: +-- 1. 进货日期录入入口为「收货批次属性」(batch_detail 配置标签「进货日期」), +-- 链路: 收货明细 -> 上架明细 -> WMS 物料库存 -> Feign -> OMS 预留库存。 +-- 2. 列追加在表尾(DM 不支持 AFTER 定位); 历史数据该列为空, 按进货日期查询 +-- 查不到存量库存(无来源可回填)。 +-- 3. DATE 类型与同表现有 PRODUCTION_DATE/EXPIRY_DATE/INVENTORY_DATE 保持一致。 +-- ============================================================================= + +-- WMS 收货明细 +ALTER TABLE "NGWL_TEST_WMS"."RECEIPT_MATERIAL_DETAIL" ADD COLUMN PURCHASE_DATE DATE; +COMMENT ON COLUMN "NGWL_TEST_WMS"."RECEIPT_MATERIAL_DETAIL".PURCHASE_DATE IS '进货日期'; + +-- WMS 上架明细 +ALTER TABLE "NGWL_TEST_WMS"."SHELF_MATERIAL_DETAIL" ADD COLUMN PURCHASE_DATE DATE; +COMMENT ON COLUMN "NGWL_TEST_WMS"."SHELF_MATERIAL_DETAIL".PURCHASE_DATE IS '进货日期'; + +-- WMS 物料库存 +ALTER TABLE "NGWL_TEST_WMS"."MATERIAL_INVENTORY" ADD COLUMN PURCHASE_DATE DATE; +COMMENT ON COLUMN "NGWL_TEST_WMS"."MATERIAL_INVENTORY".PURCHASE_DATE IS '进货日期'; + +-- OMS 预留库存 +ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_MATERIAL_INVENTORY" ADD COLUMN PURCHASE_DATE DATE; +COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_MATERIAL_INVENTORY".PURCHASE_DATE IS '进货日期'; + +-- ============================================================================= +-- 批次明细配置(可选, 数据操作): 需要按进货日期录入/分行的物料, 在其批次规则中 +-- 新增一条明细。BATCH_LABELS 必须一字不差为「进货日期」(后端 setMore() 按标签 +-- 精确匹配解析); IS_DISPLAY=1 时同时参与库存行合并键(不同进货日期分库存行)。 +-- +-- 参考现有「生产日期」配置行(格式/控件取值对齐): +-- SELECT * FROM "NGWL_TEST_SYSTEM"."BATCH_DETAIL" WHERE BATCH_LABELS = '生产日期'; +-- +-- 配置模板(BATCH_ID 等按实际批次规则替换, 建议直接在 系统-批次管理 界面新增): +-- INSERT INTO "NGWL_TEST_SYSTEM"."BATCH_DETAIL" +-- (BATCH_DETAIL_ID, ORGANIZATION_ID, TOP_ORGANIZATION_ID, BATCH_ID, +-- BATCH_LABELS, FIELD_NAME, INPUT_CONTROL, ATTRIBUTE_FORMAT, IS_DISPLAY) +-- VALUES +-- (<主键>, <组织ID>, <顶级组织ID>, <批次规则ID>, +-- '进货日期', 'purchase_date', <同生产日期行>, '2', 1); +-- -- ATTRIBUTE_FORMAT: 2-日期 +-- ============================================================================= + +-- ============================================================================= +-- 执行前检查(确认列不存在, 避免重复执行报错; DM 数据字典标识符按大写存储) +-- SELECT OWNER, TABLE_NAME, COLUMN_NAME +-- FROM ALL_TAB_COLUMNS +-- WHERE COLUMN_NAME = 'PURCHASE_DATE' +-- AND OWNER IN ('NGWL_TEST_WMS', 'NGWL_TEST_OMS') +-- AND TABLE_NAME IN ('RECEIPT_MATERIAL_DETAIL', 'SHELF_MATERIAL_DETAIL', +-- 'MATERIAL_INVENTORY', 'RESERVATION_MATERIAL_INVENTORY'); +-- +-- 回滚(发布前执行了本脚本需回退时) +-- ALTER TABLE "NGWL_TEST_WMS"."RECEIPT_MATERIAL_DETAIL" DROP COLUMN PURCHASE_DATE; +-- ALTER TABLE "NGWL_TEST_WMS"."SHELF_MATERIAL_DETAIL" DROP COLUMN PURCHASE_DATE; +-- ALTER TABLE "NGWL_TEST_WMS"."MATERIAL_INVENTORY" DROP COLUMN PURCHASE_DATE; +-- ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_MATERIAL_INVENTORY" DROP COLUMN PURCHASE_DATE; +-- +-- 发布顺序: 先执行本 DDL 再发布服务(实体带新字段而表无列, MyBatis-Plus insert 会报错) +-- ============================================================================= diff --git a/sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql b/sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql new file mode 100644 index 000000000..c336f89e8 --- /dev/null +++ b/sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql @@ -0,0 +1,230 @@ +-- ---------------------------- +-- 通宇「出仓委托单」OMS 建表脚本 —— 达梦(DM)数据库版(最终版,新库直接执行本脚本即可,无需任何增量) +-- 适用:mhd-oms-service 连接的达梦库(生产/测试按环境选择,在OMS服务连接的用户/模式下执行) +-- 含:明细单价UNIT_PRICE、结算币种、审核备注、订单状态(1-待审核 2-已审核 3-已驳回 4-进行中(预留) 5-已入库,默认1待审核) +-- @date 2026-09-03 +-- ---------------------------- + +-- 主表:出仓委托单 +CREATE TABLE OMS_OUT_ENTRUST_ORDER ( + ID BIGINT IDENTITY(1,1) NOT NULL, + ENTRUST_NUMBER VARCHAR(50) DEFAULT NULL, + WAREHOUSE_ID BIGINT DEFAULT NULL, + WAREHOUSE_CODE VARCHAR(50) DEFAULT NULL, + WAREHOUSE_NAME VARCHAR(100) DEFAULT NULL, + SHIPPER_ID BIGINT DEFAULT NULL, + SHIPPER_CODE VARCHAR(50) DEFAULT NULL, + SHIPPER_NAME VARCHAR(100) DEFAULT NULL, + SALESMAN_ID VARCHAR(64) DEFAULT NULL, + SALESMAN_NAME VARCHAR(50) DEFAULT NULL, + ORDER_TYPE_CODE VARCHAR(50) DEFAULT NULL, + ORDER_TYPE_NAME VARCHAR(100) DEFAULT NULL, + SETTLEMENT_CURRENCY VARCHAR(50) DEFAULT NULL, + PRIORITY_LEVEL_CODE VARCHAR(50) DEFAULT NULL, + PRIORITY_LEVEL_NAME VARCHAR(50) DEFAULT NULL, + DIRECT_WAREHOUSE INT DEFAULT NULL, + REVIEW INT DEFAULT NULL, + EXPECT_TIME DATETIME DEFAULT NULL, + OUTBOUND_DATE DATETIME DEFAULT NULL, + ORDER_DATE DATETIME DEFAULT NULL, + COMPLETE_TIME DATETIME DEFAULT NULL, + TO_RECEIVER VARCHAR(200) DEFAULT NULL, + CONTACT_PERSON VARCHAR(100) DEFAULT NULL, + VEHICLE_MODEL_PLATE VARCHAR(100) DEFAULT NULL, + ENTRUST_NO VARCHAR(100) DEFAULT NULL, + TEL VARCHAR(50) DEFAULT NULL, + FAX VARCHAR(50) DEFAULT NULL, + DRIVER_SIGN VARCHAR(100) DEFAULT NULL, + CARRIER VARCHAR(100) DEFAULT NULL, + CARRIER_NAME VARCHAR(200) DEFAULT NULL, + CONTAINER_NO VARCHAR(100) DEFAULT NULL, + CONTAINER_NO_NAME VARCHAR(50) DEFAULT NULL, + TRANSPORT_MODE_CODE VARCHAR(50) DEFAULT NULL, + TRANSPORT_MODE_NAME VARCHAR(50) DEFAULT NULL, + SUPERVISION_MODE_CODE VARCHAR(50) DEFAULT NULL, + SUPERVISION_MODE_NAME VARCHAR(50) DEFAULT NULL, + DECLARE_CUSTOMS VARCHAR(100) DEFAULT NULL, + ENTRY_EXIT_CUSTOMS VARCHAR(100) DEFAULT NULL, + DEPARTURE_ARRIVAL_COUNTRY VARCHAR(100) DEFAULT NULL, + CUSTOMS_INSPECTION_FLAG VARCHAR(50) DEFAULT NULL, + NEED_DECLARE_FLAG VARCHAR(50) DEFAULT NULL, + NEED_TRANSPORT_FLAG VARCHAR(50) DEFAULT NULL, + MANUFACTURER VARCHAR(200) DEFAULT NULL, + CUSTOMS_DECLARER_INFO VARCHAR(200) DEFAULT NULL, + DELIVERY_ADDR VARCHAR(500) DEFAULT NULL, + ANNEX_URL VARCHAR(500) DEFAULT NULL, + ORDER_STATUS INT DEFAULT 1, + AUDIT_BY BIGINT DEFAULT NULL, + AUDIT_BY_NAME VARCHAR(50) DEFAULT NULL, + AUDIT_TIME DATETIME DEFAULT NULL, + AUDIT_REMARK VARCHAR(500) DEFAULT NULL, + ISSUE_STATUS INT DEFAULT 1, + ISSUE_BY BIGINT DEFAULT NULL, + ISSUE_BY_NAME VARCHAR(50) DEFAULT NULL, + ISSUE_TIME DATETIME DEFAULT NULL, + DECLARE_TOTAL_QUANTITY DECIMAL(24,6) DEFAULT 0, + REMARK VARCHAR(500) DEFAULT NULL, + ORGANIZATION_ID BIGINT DEFAULT NULL, + ORGANIZATION_NAME VARCHAR(100) DEFAULT NULL, + TOP_ORGANIZATION_ID BIGINT DEFAULT NULL, + CREATE_BY BIGINT DEFAULT NULL, + CREATE_BY_NAME VARCHAR(50) DEFAULT NULL, + CREATE_TIME DATETIME DEFAULT NULL, + UPDATE_BY BIGINT DEFAULT NULL, + UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL, + UPDATE_TIME DATETIME DEFAULT NULL, + DEL_FLAG INT DEFAULT 1, + CONSTRAINT PK_OMS_OUT_ENTRUST_ORDER PRIMARY KEY (ID) +); + +COMMENT ON TABLE OMS_OUT_ENTRUST_ORDER IS '出仓委托单主表'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ID IS '编号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRUST_NUMBER IS '委托单号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_ID IS '出库仓库ID(必填)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_CODE IS '仓库编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_NAME IS '仓库名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_ID IS '客户ID(货主,必填)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_CODE IS '客户编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_NAME IS '客户名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SALESMAN_ID IS '业务员ID(必填)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SALESMAN_NAME IS '业务员名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_TYPE_CODE IS '订单类型编码(字典outDocumentType,为空时下发默认普通出库)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_TYPE_NAME IS '订单类型名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SETTLEMENT_CURRENCY IS '结算币种'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.PRIORITY_LEVEL_CODE IS '优先级别编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.PRIORITY_LEVEL_NAME IS '优先级别名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DIRECT_WAREHOUSE IS '是否直接出库: 1-是 2-否'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.REVIEW IS '是否复核: 1-是 2-否'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.EXPECT_TIME IS '预计出货时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.OUTBOUND_DATE IS '出仓日期'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_DATE IS 'orderDate'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.COMPLETE_TIME IS '完成时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TO_RECEIVER IS 'To(收货人)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTACT_PERSON IS '联系人'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.VEHICLE_MODEL_PLATE IS '车型及车牌'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRUST_NO IS '委托编号(客户委托单号)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TEL IS 'Tel电话'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.FAX IS 'Fax传真'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DRIVER_SIGN IS '司机签名'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CARRIER IS '承运商编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CARRIER_NAME IS '承运商名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTAINER_NO IS '柜号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTAINER_NO_NAME IS '柜'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TRANSPORT_MODE_CODE IS '运输方式编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TRANSPORT_MODE_NAME IS '运输方式名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SUPERVISION_MODE_CODE IS '监管方式编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SUPERVISION_MODE_NAME IS '监管方式名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DECLARE_CUSTOMS IS '申报地关区'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRY_EXIT_CUSTOMS IS '进出境关别'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DEPARTURE_ARRIVAL_COUNTRY IS '起运/运抵国(地区)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CUSTOMS_INSPECTION_FLAG IS '海关是否查验货物'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.NEED_DECLARE_FLAG IS '是否需要报关(预留,页面隐藏)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.NEED_TRANSPORT_FLAG IS '是否需要运输(预留,页面隐藏)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.MANUFACTURER IS '生产商'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CUSTOMS_DECLARER_INFO IS '报关员姓名及联系方式'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DELIVERY_ADDR IS '送货地址'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ANNEX_URL IS '附件url'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_STATUS IS '订单状态:1-待审核 2-已审核(含已下发) 3-已驳回 4-进行中(预留) 5-已入库'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_BY IS '审核人ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_BY_NAME IS '审核人姓名'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_TIME IS '审核时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_REMARK IS '审核备注(驳回原因)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_STATUS IS '下发状态:1-未下发 2-已下发'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_BY IS '下发人ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_BY_NAME IS '下发人姓名'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_TIME IS '下发时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DECLARE_TOTAL_QUANTITY IS '申报总数量(明细申报数量之和)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.REMARK IS '备注'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORGANIZATION_ID IS '组织ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORGANIZATION_NAME IS '组织名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TOP_ORGANIZATION_ID IS '一级组织ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DEL_FLAG IS '删除标记:0-无状态,1-正常,2-已删除'; + +CREATE INDEX IDX_OOE_ENTRUST_NUMBER ON OMS_OUT_ENTRUST_ORDER (ENTRUST_NUMBER); +CREATE INDEX IDX_OOE_TOP_ORG ON OMS_OUT_ENTRUST_ORDER (TOP_ORGANIZATION_ID); + +-- 明细表:出仓委托单明细 +CREATE TABLE OMS_OUT_ENTRUST_ORDER_DETAIL ( + ID BIGINT IDENTITY(1,1) NOT NULL, + ENTRUST_NUMBER VARCHAR(50) DEFAULT NULL, + MATERIAL_BASE_INFO_ID BIGINT DEFAULT NULL, + MATERIAL_CODE VARCHAR(100) DEFAULT NULL, + MATERIAL_NAME VARCHAR(200) DEFAULT NULL, + BAR_CODE VARCHAR(100) DEFAULT NULL, + COMMODITY_NAME VARCHAR(200) DEFAULT NULL, + COMMODITY_NO VARCHAR(100) DEFAULT NULL, + MATERIAL_NO VARCHAR(100) DEFAULT NULL, + SPECIFICATION_MODEL VARCHAR(200) DEFAULT NULL, + SKUCODE VARCHAR(100) DEFAULT NULL, + INVOICE_NO VARCHAR(200) DEFAULT NULL, + DECLARE_UNIT VARCHAR(50) DEFAULT NULL, + DECLARE_QUANTITY DECIMAL(24,6) DEFAULT NULL, + UNIT_PRICE DECIMAL(24,6) DEFAULT NULL, + UNIT VARCHAR(50) DEFAULT NULL, + LITER VARCHAR(50) DEFAULT NULL, + "SIZE" VARCHAR(100) DEFAULT NULL, + CASE_COUNT DECIMAL(24,6) DEFAULT NULL, + PIECE_COUNT DECIMAL(24,6) DEFAULT NULL, + OUTBOUND_QUANTITY DECIMAL(24,6) DEFAULT NULL, + TOTAL_NET_WEIGHT DECIMAL(24,6) DEFAULT NULL, + TOTAL_GROSS_WEIGHT DECIMAL(24,6) DEFAULT NULL, + TOTAL_VOLUME DECIMAL(24,6) DEFAULT NULL, + TOTAL_AREA DECIMAL(24,6) DEFAULT NULL, + TOTAL_AMOUNT DECIMAL(24,6) DEFAULT NULL, + CURRENCY VARCHAR(50) DEFAULT NULL, + BATCH_REF_NO VARCHAR(100) DEFAULT NULL, + SHEET_REF_NO VARCHAR(100) DEFAULT NULL, + COUNTRY_OF_ORIGIN VARCHAR(100) DEFAULT NULL, + BOX_PALLET_NO VARCHAR(100) DEFAULT NULL, + REMARK VARCHAR(500) DEFAULT NULL, + CREATE_BY BIGINT DEFAULT NULL, + CREATE_BY_NAME VARCHAR(50) DEFAULT NULL, + CREATE_TIME DATETIME DEFAULT NULL, + UPDATE_BY BIGINT DEFAULT NULL, + UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL, + UPDATE_TIME DATETIME DEFAULT NULL, + DEL_FLAG INT DEFAULT 1, + CONSTRAINT PK_OMS_OUT_ENTRUST_ORDER_DETAIL PRIMARY KEY (ID) +); + +COMMENT ON TABLE OMS_OUT_ENTRUST_ORDER_DETAIL IS '出仓委托单明细表'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.ID IS '编号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.ENTRUST_NUMBER IS '委托单号(关联主表)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_BASE_INFO_ID IS '物料基础信息ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_CODE IS '商品编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_NAME IS '商品名称(物料档案名,与COMMODITY_NAME至少其一)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BAR_CODE IS '商品条形码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COMMODITY_NAME IS '商品名称(委托单品名,与MATERIAL_NAME至少其一)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COMMODITY_NO IS '商品编号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_NO IS '料号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SPECIFICATION_MODEL IS '规格型号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SKUCODE IS 'SKU码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.INVOICE_NO IS '发票号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DECLARE_UNIT IS '申报单位'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DECLARE_QUANTITY IS '申报数量(必填,大于0)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.UNIT_PRICE IS '单价'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.UNIT IS '单位'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.LITER IS '升'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL."SIZE" IS '尺寸'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.CASE_COUNT IS '箱数'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.PIECE_COUNT IS '件数'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.OUTBOUND_QUANTITY IS '出库数量'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_NET_WEIGHT IS '总净重(千克)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_GROSS_WEIGHT IS '总毛重(千克)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_VOLUME IS '总体积(立方米)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_AREA IS '总面积'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_AMOUNT IS '总金额'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.CURRENCY IS '币制'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BATCH_REF_NO IS '批次'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SHEET_REF_NO IS '单据参考号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COUNTRY_OF_ORIGIN IS '原产国'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BOX_PALLET_NO IS '箱/托盘号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DEL_FLAG IS '删除标记:0-无状态,1-正常,2-已删除'; + +CREATE INDEX IDX_OOED_ENTRUST_NUMBER ON OMS_OUT_ENTRUST_ORDER_DETAIL (ENTRUST_NUMBER); + +-- ---------------------------- +-- 回滚脚本 +-- DROP TABLE OMS_OUT_ENTRUST_ORDER_DETAIL; +-- DROP TABLE OMS_OUT_ENTRUST_ORDER; +-- ----------------------------