diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java index e18484e8d..8cc8bfd57 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e34bb9cd4..560febea1 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 e4a817238..d976fcc98 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.30:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 8625bcd8e..653f44d4b 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 @@ -1,5 +1,6 @@ package com.mhd.system.api; +import cn.hutool.json.JSONUtil; import com.mhd.common.core.constant.ServiceNameConstants; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; @@ -20,7 +21,7 @@ import java.util.Map; * @description: TODO * @date 2024/5/10 8:58 **/ -@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.3:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface WmsServiceFeign { /** @@ -97,6 +98,18 @@ public interface WmsServiceFeign { @PostMapping(value = "/stockInOrderApi/omsInOrderAdd") public void omsInOrderAdd(@RequestBody StockInOrder stockInOrder); + @ApiOperation("oms取消下发单保存") + @PostMapping(value = "/stockOutOrderApi/cancelExecutionOrder") + public void omsCancelExecutionOrder(@RequestBody StockOutOrder stockOutOrder); + + @ApiOperation("oms取消下发单自动分配") + @PostMapping(value = "/stockOutOrderApi/omsAutoAssign") + public void omsAutoAssign(@RequestBody StockOutOrderDTO stockOutOrderDTO); + + @ApiOperation("oms出库执行") + @PostMapping(value = "/stockOutOrderApi/execution") + public AjaxResult execution(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO); + /** * oms下发单明细保存 */ @@ -121,4 +134,11 @@ public interface WmsServiceFeign { */ @GetMapping("/materialBaseInfoApi/getBatchByIds") public TableDataInfo getBatchByIds(@RequestParam("materialBaseInfoIds") List materialBaseInfoIds); + + /** + * 生成拣货单 + */ + @ApiOperation("生成拣货单") + @PostMapping("/stockOutOrderApi/genPickingOrderByOms") + public AjaxResult genPickingOrderByOms(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO); } \ No newline at end of file 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 dfac7337f..238ec5f81 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,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.102.192.4:8018", configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.102.192.33:8018", configuration = FeignAutoConfiguration.class) public interface YmsServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialInventoryOmsParamDO.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialInventoryOmsParamDO.java index a070f5b25..242ad102f 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 @@ -84,4 +84,6 @@ public class MaterialInventoryOmsParamDO extends BaseVOEntity { //过期日期 private Date expiryDate; + private String executioOrderNumber; + } \ No newline at end of file diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrderDTO.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrderDTO.java new file mode 100644 index 000000000..376ae27a6 --- /dev/null +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrderDTO.java @@ -0,0 +1,486 @@ +package com.mhd.system.api.domain; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 出库单对象 stock_out_order + * + * @author gen + * @date 2024-05-28 + */ + +@Data +public class StockOutOrderDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库单id") + private Long outOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + private Integer status; + + @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("出库单审核备注") + @Excel(name = "出库单审核备注") + private String auditRemark; + + @ApiModelProperty("出库单审核人") + @Excel(name = "出库单审核人") + private Long auditBy; + + @ApiModelProperty("出库单审核人姓名") + @Excel(name = "出库单审核人姓名") + private String auditByName; + + @ApiModelProperty("出库单审核时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date auditTime; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String orderTypeName; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @ApiModelProperty("预计出货时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + @Excel(name = "是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + @Excel(name = "是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + + @ApiModelProperty("已生成拣货单数量") + @Excel(name = "已生成拣货单分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @ApiModelProperty("取消订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @ApiModelProperty("关闭订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date closeTime; + + @ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核") + @Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核") + private Integer checkStatus; + + @ApiModelProperty("复核任务是否下发: 1-是 2-否") + @Excel(name = "复核任务是否下发: 1-是 2-否") + private Integer checkTaskDistribution; + + @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 checkTaskDistributionTime; + + @ApiModelProperty("复核作业人用户ID") + @Excel(name = "复核作业人用户ID") + @JsonAlias({"checkOperatorId", "operatorId"}) + private Long checkOperatorsBy; + + @ApiModelProperty("复核作业人姓名") + @Excel(name = "复核作业人姓名") + private String checkOperatorsName; + + @ApiModelProperty("调度单号") + @Excel(name = "调度单号") + private String mobilizeCode; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("出库单id集合") + private List outOrderIds; + +// @ApiModelProperty("物料明细") +// private List materialDetailList; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("物料审核数量") + @Excel(name = "物料审核数量") + private BigDecimal actualQuantity; + + @ApiModelProperty("波次类型编码") + private String waveOrderTypeCode; + + @ApiModelProperty("大于复核状态: 1-未复核 2-复核中 3-已复核") + private Integer gtCheckStatus; + + @ApiModelProperty("小于复核状态: 1-未复核 2-复核中 3-已复核") + private Integer ltCheckStatus; + + @ApiModelProperty("PDA复核查询tab: 1-列表(待复核) 2-历史记录(已复核)") + private Integer tabType; + + @ApiModelProperty("to") + @Excel(name = "to") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号") + @Excel(name = "委托编号") + private String entrustNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSign; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declareCustoms; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddr; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("柜") + @Excel(name = "柜") + private String containerNoName; + + @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") + private Date outboundDate; + @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 completeTime; + @ApiModelProperty("orderDate") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeCode; + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeName; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeCode; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeName; + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private String customsInspectionFlag; + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private String needTransportFlag; + + @ApiModelProperty(name = "创建时间查询条件开始日期") + private String createTimeStart; + + @ApiModelProperty(name = "创建时间查询条件结束日期") + private String createTimeEnd; + + @ApiModelProperty(name = "审核时间查询条件开始日期") + private String auditTimeStart; + + @ApiModelProperty(name = "审核时间查询条件结束日期") + private String auditTimeEnd; + + @ApiModelProperty("出库明细-物料名称(商品名称),模糊匹配,与前端参数 materialName 一致") + private String materialName; + + @ApiModelProperty("出库明细-物料编码,模糊匹配,与前端参数 materialCode 一致") + private String materialCode; + + @ApiModelProperty("出库交接图片,PDA出库交接时上传的照片,多张图片以逗号隔开") + private String pictureApp; + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + @ApiModelProperty("承运商名称") + @Excel(name = "承运商名称") + private String carrierName; + @ApiModelProperty("计费信息") + private String billingJson; + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; +// @ApiModelProperty("费用") +// List receiptOrderAccountList; + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private BigDecimal returnQuantity; + /** + * 提货单打印所选模版(与图5单选项文案一致即可)。可传副标题如「谷丰--营销部」,或整段「提货单--谷丰--营销部」;不传则标题为「提货单」 + */ + @ApiModelProperty("提货单打印模版名/弹窗选项全文;后端生成 printTitle(-- 会规范为 ——)") + private String noticePrintTemplateName; + @ApiModelProperty("车次") + @Excel(name = "车次") + private Integer trainNo; + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeTo; + + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeTo; +} \ No newline at end of file diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java index 55ab7572a..19b01814a 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java @@ -73,6 +73,21 @@ public class RemoteWmsFallbackFactory implements FallbackFactory inMaterialDetails) { } @@ -99,6 +114,11 @@ public class RemoteWmsFallbackFactory implements FallbackFactory userResult = userServiceFeign.getUserByTopOrganizationUserPhone(userDTO, SecurityConstants.INNER); if (R.FAIL == userResult.getCode()) { @@ -153,7 +157,8 @@ public class TokenLoginApplicationService { }else { userDTO.setBusinessType(4); } - userDTO.setOrganizationName(sysTenantsPo.getOrganizationName()); + userDTO.setOrganizationName(StringUtils.isNotBlank(loginDTO.getOrganizationName()) + ? loginDTO.getOrganizationName() : sysTenantsPo.getOrganizationName()); userResult = userServiceFeign.registerAddUser(userDTO, SecurityConstants.INNER); userInfo = userResult.getData(); } else { @@ -379,6 +384,10 @@ public class TokenLoginApplicationService { throw new ServiceException("用户不存在/密码错误"); } } + // 验证码登录时 userInfo.getUserPo() 可能为null,加保护 + if (userInfo == null || userInfo.getUserPo() == null || userInfo.getUserPo().getOrganizationId() == null) { + throw new ServiceException("登录用户组织信息不完整,请联系管理员"); + } R organizationInfo = organizationServiceFeign.getInfoForIdList(userInfo.getUserPo().getOrganizationId()); if (ObjectUtil.isNull(organizationInfo) || ObjectUtil.isNull(organizationInfo.getData())) { throw new ServiceException("登录用户组织不存在"); @@ -569,4 +578,29 @@ public class TokenLoginApplicationService { sysPasswordService.validateByWms(userPo, verificationCode, 1); return userInfo; } + + /** + * 根据域名获取组织信息(免Token,供司机APP注册时选择组织用) + */ + public AjaxResult getOrganizationByPath(String path) { + if (StringUtils.isBlank(path)) { + return AjaxResult.error("域名不能为空"); + } + try { + AjaxResult result = organizationServiceFeign.getOrganizationByPath(path); + if (ObjectUtil.isNull(result) || ObjectUtil.isNull(result.get("data"))) { + return AjaxResult.error("未找到对应组织"); + } + SysTenantsPo sysTenantsPo = JSON.parseObject(JSON.toJSONString(result.get("data")), SysTenantsPo.class); + Long topOrganizationId = sysTenantsPo.getOrganizationId(); + // 返回一级组织ID和名称,前端可据此展示组织选择 + Map data = new java.util.HashMap<>(); + data.put("organizationId", topOrganizationId); + data.put("organizationName", sysTenantsPo.getOrganizationName()); + return AjaxResult.success(data); + } catch (Exception e) { + log.error("获取组织信息失败, path={}", path, e); + return AjaxResult.error("获取组织信息失败:" + e.getMessage()); + } + } } diff --git a/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/dto/LoginDTO.java b/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/dto/LoginDTO.java index 4cf88930f..bbd7dbf08 100644 --- a/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/dto/LoginDTO.java +++ b/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/dto/LoginDTO.java @@ -34,4 +34,10 @@ public class LoginDTO { @ApiModelProperty(name = "APP包名") private String appMark; + @ApiModelProperty(name = "组织ID(司机选择组织,不传默认一级组织)") + private Long organizationId; + + @ApiModelProperty(name = "组织名称(司机选择组织时传入)") + private String organizationName; + } diff --git a/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java b/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java index a7d62da14..ff4654e0b 100644 --- a/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java +++ b/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java @@ -9,11 +9,13 @@ import com.mhd.common.core.domain.po.UserPo; import com.mhd.common.core.utils.JwtUtils; import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.annotation.RepeatSubmit; import com.mhd.common.security.auth.AuthUtil; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -75,6 +77,15 @@ public class AppTokenController extends BaseController { return R.ok(); } + /** + * 根据域名获取组织信息(免Token,供司机APP注册时选择组织用) + */ + @ApiOperation("根据域名获取组织信息") + @GetMapping("/getOrganizationByPath/{path}") + public AjaxResult getOrganizationByPath(@PathVariable("path") String path) { + return tokenLoginApplicationService.getOrganizationByPath(path); + } + /** * @Description wms 新登录接口 diff --git a/mhd-auth/src/main/resources/bootstrap.yml b/mhd-auth/src/main/resources/bootstrap.yml index 4e9491205..cee59473b 100644 --- a/mhd-auth/src/main/resources/bootstrap.yml +++ b/mhd-auth/src/main/resources/bootstrap.yml @@ -14,19 +14,20 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 - username: nacos - password: manhuoda@2023 - #线上正式环境 -# server-addr: 10.102.192.5:6848 +# server-addr: 10.33.0.129:6010 # 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 # 测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.102.192.5:6848 + # + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserShipperPo.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserShipperPo.java index db3ff7e9f..12bd8cfbb 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserShipperPo.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserShipperPo.java @@ -271,4 +271,8 @@ public class UserShipperPo { @ApiModelProperty("货主code") private String roleCodeShipper; + @ApiModelProperty(name = "是否校验信用") + private String isCheckCredit; + @ApiModelProperty(name = "组织代码") + private String orgCode; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java index 922bfd098..9c481ad5e 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java @@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import com.mhd.common.core.utils.StringUtils; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; @@ -98,6 +99,13 @@ public class WarehouseApplicationService { } } } + String orgIds = warehouseDO.getOrgIds(); + if (StringUtils.isNotEmpty(orgIds)) { + String[] orgIdArray = orgIds.split(","); + List orgIdList = Arrays.stream(orgIdArray).map(Long::valueOf).collect(Collectors.toList()); + warehouseDO.setOrgIdList(orgIdList); + warehouseDO.setOrganizationId(null); + } return warehouseDomainService.queryList(warehouseDO); } @@ -314,4 +322,4 @@ public class WarehouseApplicationService { return warehouseDomainService.getWarehouseChildren(warehouseId, storageLocationType); } -} +} \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/repository/todo/WarehouseDO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/repository/todo/WarehouseDO.java index 62d55c832..f5bd4ec85 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/repository/todo/WarehouseDO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/repository/todo/WarehouseDO.java @@ -127,4 +127,8 @@ public class WarehouseDO extends BaseVOEntity{ private Integer isEnable; @ApiModelProperty("仓库id 集合") private List warehouseIds; + @ApiModelProperty("组织id 集合") + private String orgIds; + @ApiModelProperty("组织id 集合") + private List orgIdList; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/warehouse/WarehouseDTO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/warehouse/WarehouseDTO.java index 9e982c719..62bd089cf 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/warehouse/WarehouseDTO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/warehouse/WarehouseDTO.java @@ -132,4 +132,8 @@ public class WarehouseDTO extends BaseVOEntity{ @ApiModelProperty("是否启用: 1-否 2-是") @Excel(name = "是否启用: 1-否 2-是") private Integer isEnable; + @ApiModelProperty("组织id 集合") + private String orgIds; + @ApiModelProperty("组织id 集合") + private List orgIdList; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/resources/mapper/basic/warehouse/WarehouseMapper.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/warehouse/WarehouseMapper.xml index 57a1d2ef0..04fcb50ca 100644 --- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/warehouse/WarehouseMapper.xml +++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/warehouse/WarehouseMapper.xml @@ -130,6 +130,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{item} + + and organization_id in + + #{item} + + and del_flag = #{delFlag} and del_flag = 1 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 832f860bb..0c30b3f42 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 @@ -1860,25 +1860,64 @@ public class UserApplicationService { userDO.setUserName("用户" + userDO.getUserPhone().substring(userDO.getUserPhone().length() - 4)); } UserEntity userEntity = userDomainService.addUser(userDO); - //同步网货平台员工信息 - wlhyDomainService.addOrEditPlatformUser1(userEntity); - //同步商城用户 - userMallDomainService.syncDriverUserInfo(userEntity); - //给用户分配默认普通角色权限 - RoleDo roleDo = new RoleDo(); - roleDo.setRoleCode(RoleEnum.DRIVER.getCode()); - roleDo.setOrganizationId(userEntity.getOrganizationId()); - RoleEntity roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo); - if (null != roleEntity) { - UserRoleDo userRoleDo = new UserRoleDo(); - userRoleDo.setUserId(userEntity.getUserId()); - userRoleDo.setRoleId(roleEntity.getRoleId()); - //判断是否存在当前登录人 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - userRoleDomainService.addUserRole(userRoleDo,userEntity); - }else { - userRoleDomainService.addUserRole(userRoleDo); + //给小程序注册用户分配默认普通用户角色(must),本组织没有则找上级 + userEntity.setUserPassword("Aa123456"); // 三方同步需要密码 + try { + RoleDo mustRoleDo = new RoleDo(); + mustRoleDo.setRoleCode(RoleEnum.MUST.getCode()); + mustRoleDo.setOrganizationId(userEntity.getOrganizationId()); + RoleEntity mustRoleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(mustRoleDo); + // 本组织没有,找上级组织 + if (null == mustRoleEntity && userEntity.getTopOrganizationId() != null + && !userEntity.getTopOrganizationId().equals(userEntity.getOrganizationId())) { + mustRoleDo.setOrganizationId(userEntity.getTopOrganizationId()); + mustRoleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(mustRoleDo); + } + if (null != mustRoleEntity) { + UserRoleDo mustUserRoleDo = new UserRoleDo(); + mustUserRoleDo.setUserId(userEntity.getUserId()); + mustUserRoleDo.setRoleId(mustRoleEntity.getRoleId()); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + userRoleDomainService.addUserRole(mustUserRoleDo, userEntity); + } else { + userRoleDomainService.addUserRole(mustUserRoleDo); + } + userDO.setRoleCode(RoleEnum.MUST.getCode()); + userDO.setRoleName(mustRoleEntity.getRoleName()); + userEntity.setRoleCode(RoleEnum.MUST.getCode()); + userEntity.setRoleName(mustRoleEntity.getRoleName()); + } + } catch (Exception e) { + log.warn("分配默认角色失败,但不影响用户保存: {}", e.getMessage()); + } + //更新user表role_code和role_name(用mapper直接更新,避免需要loginUser) + userMapper.update(null, new LambdaUpdateWrapper() + .set(UserEntity::getRoleCode, userDO.getRoleCode()) + .set(UserEntity::getRoleName, userDO.getRoleName()) + .eq(UserEntity::getUserId, userEntity.getUserId())); + //同步三方平台(放在角色分配之后,确保roleCode已设置) + try { + wlhyDomainService.addOrEditPlatformUser1(userEntity); + } catch (Exception e) { + log.warn("同步网货平台员工信息失败,但不影响用户保存: {}", e.getMessage()); + } + try { + userMallDomainService.syncDriverUserInfo(userEntity); + } catch (Exception e) { + log.warn("同步商城用户失败,但不影响用户保存: {}", e.getMessage()); + } + // 只有组织开启园区(排队)才同步YMS + Integer isQueue = userMapper.getOrdIsQueue(userEntity.getOrganizationId()); + if (isQueue != null && isQueue == 1) { + try { + // 截断avatar URL(YMS的avatar列长度有限,去掉OSS签名参数) + if (userEntity.getAvatar() != null && userEntity.getAvatar().contains("?")) { + userEntity.setAvatar(userEntity.getAvatar().substring(0, userEntity.getAvatar().indexOf("?"))); + } + ymsDomainService.addOrEditYmsUser(userEntity); + } catch (Exception e) { + log.warn("同步YMS平台员工信息失败,但不影响用户保存: {}", e.getMessage()); } } //2024年3月27日16:40:15 处理用户验证码注册,首次登录redis用户数据不更新问题 @@ -1934,6 +1973,23 @@ public class UserApplicationService { userDO.setDriverEnterpriseCode(driverEnterpriseCode); UserPo userPo = registerAddUser(userDO); + // 承运企业添加司机,补分配driver角色 + RoleDo driverRoleDo = new RoleDo(); + driverRoleDo.setRoleCode(RoleEnum.DRIVER.getCode()); + driverRoleDo.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + RoleEntity driverRoleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(driverRoleDo); + if (null != driverRoleEntity) { + UserRoleDo driverUserRoleDo = new UserRoleDo(); + driverUserRoleDo.setUserId(userPo.getUserId()); + driverUserRoleDo.setRoleId(driverRoleEntity.getRoleId()); + userRoleDomainService.addUserRole(driverUserRoleDo); + // 更新user表role_code和role_name为driver(承运企业司机不需要must) + userMapper.update(null, new LambdaUpdateWrapper() + .set(UserEntity::getRoleCode, RoleEnum.DRIVER.getCode()) + .set(UserEntity::getRoleName, RoleEnum.DRIVER.getName()) + .eq(UserEntity::getUserId, userPo.getUserId())); + } + //20240314 运输企业添加司机,默认生成一条空的司机信息方便列表查询 UserDriverDO userDriverDO = new UserDriverDO(); userDriverDO.setUserId(userPo.getUserId()); diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java index b83a922a7..e56af2e41 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserShipperApplicationService.java @@ -521,6 +521,7 @@ public class UserShipperApplicationService { userShipperDO.setUpdateBy(loginUserPo.getUserId()); userShipperDO.setUpdateByName(loginUserPo.getUserName()); userShipperDO.setUpdateTime(new Date()); + userShipperDO.setRoleCode("ownerCargo"); updateUserInformation(userShipperDO); //保存托运人信息 userShipperDomainService.saveUserShipper(userShipperDO); @@ -583,6 +584,7 @@ public class UserShipperApplicationService { refreshShipperDictData(userShipperDO); UserDO userDO = new UserDO(); BeanUtils.copyProperties(userShipperDO, userDO, IgnoreNullUtil.getNullPropertyNames(userShipperDO)); + //修改用户表信息 UserPo userPo = userApplicationService.updateUser(userDO); @@ -1372,6 +1374,62 @@ public class UserShipperApplicationService { throw new ServiceException("获取组织配置失败"); } + // 检查是否已存在相同customerNcCode的委托方(可能在不同组织) + List existingShippers = userShipperMapper.selectList( + new LambdaQueryWrapper() + .eq(UserShipperEntity::getShipperEnterpriseName, record.getDesc1()) + .eq(UserShipperEntity::getDelFlag, 1)); + + if (CollUtil.isNotEmpty(existingShippers)) { + // 找到已存在的委托方,检查是否已经有该组织 + UserShipperEntity existingShipper = existingShippers.get(0); + String existingOrgCode = existingShipper.getOrgCode(); + + boolean hasOrg = false; + com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); + if (StringUtils.isNotEmpty(existingOrgCode)) { + try { + orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode); + // 检查是否已包含当前组织 + for (int i = 0; i < orgCodeArray.size(); i++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); + Long itemCode = orgItem.getLong("code"); + if (targetOrganizationId.equals(itemCode)) { + hasOrg = true; + break; + } + } + } catch (Exception e) { + log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e); + } + } + + if (!hasOrg) { + // 添加新组织到orgCode数组 + com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); + newOrgItem.put("name", targetOrganizationName); + newOrgItem.put("code", targetOrganizationId); + newOrgItem.put("ncCustomer", record.getCode()); + newOrgItem.put("names", targetOrganizationId); + orgCodeArray.add(newOrgItem); + + // 更新委托方的orgCode字段 + existingShipper.setOrgCode(orgCodeArray.toJSONString()); + existingShipper.setUpdateBy(loginUser.getUserPo().getUserId()); + existingShipper.setUpdateByName(loginUser.getUserPo().getUserName()); + existingShipper.setUpdateTime(new Date()); + userShipperMapper.updateById(existingShipper); + + log.info("委托方已存在,添加新组织到orgCode,customerNcCode={},新增组织code={},name={}", + record.getCode(), targetOrganizationId, targetOrganizationName); + } else { + log.info("委托方已存在且已包含该组织,跳过添加,customerNcCode={},组织code={}", + record.getCode(), targetOrganizationId); + } + return; // 不新增,直接返回 + } + + // 不存在相同的委托方,执行新增逻辑 UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser, targetOrganizationId, targetOrganizationName, targetTopOrganizationId); userShipperDO.setDataSource(1); @@ -1581,95 +1639,247 @@ public class UserShipperApplicationService { com.alibaba.fastjson.JSONObject allResults = new com.alibaba.fastjson.JSONObject(); for (UserShipperEntity userShipperEntity : customerNcCodeList) { - if (StringUtils.isEmpty(userShipperEntity.getCustomerNcCode())) { + + UserShipperEntity userShipperEntity1 = userShipperMapper.selectOne(new LambdaQueryWrapper() + + .eq(UserShipperEntity::getUserId, userShipperEntity.getUserId())); + + if (userShipperEntity1 == null) { + log.warn("未找到对应货主,custcode={}", userShipperEntity.getCustomerNcCode()); continue; } - UserShipperEntity userShipperEntity1 = userShipperMapper.selectOne(new LambdaQueryWrapper() - .eq(UserShipperEntity::getCustomerNcCode, userShipperEntity.getCustomerNcCode()) - .eq(UserShipperEntity::getUserId, userShipperEntity.getUserId())); - String orgcode = userShipperMapper.getOrgNcCode(userShipperEntity1.getOrganizationId()); - if (StringUtils.isEmpty(orgcode)) { - return AjaxResult.error("组织NC编码不能为空"); - } - try { - com.alibaba.fastjson.JSONObject queryParam = new com.alibaba.fastjson.JSONObject(); - queryParam.put("custcode", userShipperEntity.getCustomerNcCode()); - queryParam.put("orgcode", orgcode); - log.info("调用赊销额度查询接口,custcode={},orgcode={}", userShipperEntity.getCustomerNcCode(), orgcode); - - String queryResult = HttpRequest.post(queryUrl) - .header("Content-Type", "application/json") - .header("uap_token", uapToken) - .header("uap_usercode", uapUsercode) - .header("uap_dataSource", uapDataSource) - .header("token", "94B3992EAD9747D3598CC6F7775F6239B5DC3B526DF7DE0091CB8B2D") - .body(queryParam.toJSONString()) - .execute() - .body(); - log.info("赊销额度查询接口返回,custcode={},result={}", userShipperEntity.getCustomerNcCode(), queryResult); - - if (StringUtils.isNotEmpty(queryResult)) { - com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(queryResult); - allResults.put(userShipperEntity.getCustomerNcCode(), resultJson); - - // 第三步:查询成功,更新货主的额度同步时间(limitTime) - - if (userShipperEntity1 != null) { - // 根据查询结果同步数据 - com.alibaba.fastjson.JSONObject dataJson = resultJson.getJSONObject("data"); - if (dataJson != null) { - // 同步额度数据(limitdatas) - com.alibaba.fastjson.JSONArray limitdatas = dataJson.getJSONArray("limitdatas"); - if (limitdatas != null && !limitdatas.isEmpty()) { - com.alibaba.fastjson.JSONObject limitData = limitdatas.getJSONObject(0); - userShipperEntity1.setLimitTime(new Date()); - userShipperEntity1.setAuthorizedQuota(limitData.getBigDecimal("nlimitmny")); - userShipperEntity1.setAuthorizedUsedAmount(limitData.getBigDecimal("nengrossmny")); - userShipperEntity1.setSettlementCurrency(limitData.getString("currencycode")); - userShipperEntity1.setCreditAmount(limitData.getBigDecimal("nbalancemny")); - userShipperMapper.updateById(userShipperEntity1); - log.info("更新货主额度同步成功,custcode={},shipperId={}", userShipperEntity1.getCustomerNcCode(), userShipperEntity1.getShipperId()); - } else { - log.info("赊销额度查询无limitdatas返回,跳过额度更新,custcode={}", userShipperEntity1.getCustomerNcCode()); + + // 解析org_code,支持多组织 + List orgCodeList = new ArrayList<>(); + if (StringUtils.isNotEmpty(userShipperEntity1.getOrgCode())) { + try { + // 解析JSON数组:[{"name":"通宇","code":2830,"ncOrganizationId":"145222101124","names":2830},...] + com.alibaba.fastjson.JSONArray orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(userShipperEntity1.getOrgCode()); + if (orgCodeArray != null && !orgCodeArray.isEmpty()) { + for (int i = 0; i < orgCodeArray.size(); i++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); + Long code = orgItem.getLong("code"); + if (code != null) { + orgCodeList.add(code); } + } + } + log.info("解析org_code成功,custcode={},orgCodeList={}", userShipperEntity.getCustomerNcCode(), orgCodeList); + } catch (Exception e) { + log.error("解析org_code失败,custcode={},orgCode={}", userShipperEntity.getCustomerNcCode(), userShipperEntity1.getOrgCode(), e); + } + } + + // 如果org_code为空或解析失败,使用原来的organizationId方式 + if (orgCodeList.isEmpty()) { + Long organizationId = userShipperEntity1.getOrganizationId(); + if (organizationId != null) { + orgCodeList.add(organizationId); + log.info("org_code为空,使用organizationId,custcode={},organizationId={}", organizationId); + } + } + + if (orgCodeList.isEmpty()) { + log.warn("货主无组织信息,跳过查询,custcode={}"); + continue; + } + + // 遍历每个组织code,分别调用接口 + int orgIndex = 0; // 组织循环计数器 + for (Long orgCode : orgCodeList) { + String orgcode = userShipperMapper.getOrgNcCode(orgCode); + if (StringUtils.isEmpty(orgcode)) { + log.warn("组织NC编码为空,跳过查询,custcode={},orgCode={}", orgCode); + orgIndex++; + continue; + } + + // 从orgCode数组中获取当前组织的ncCustomer字段 + String ncCustomer = null; + if (StringUtils.isNotEmpty(userShipperEntity1.getOrgCode())) { + try { + com.alibaba.fastjson.JSONArray orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(userShipperEntity1.getOrgCode()); + for (int i = 0; i < orgCodeArray.size(); i++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); + Long itemCode = orgItem.getLong("code"); + if (orgCode.equals(itemCode)) { + ncCustomer = orgItem.getString("ncCustomer"); + break; + } + } + } catch (Exception e) { + log.error("解析orgCode数组获取ncCustomer失败,orgCode={}", orgCode, e); + } + } + + if (StringUtils.isEmpty(ncCustomer)) { + log.warn("未找到组织code={}对应的ncCustomer,跳过查询,custcode={}", orgCode); + orgIndex++; + continue; + } + + try { + com.alibaba.fastjson.JSONObject queryParam = new com.alibaba.fastjson.JSONObject(); + queryParam.put("custcode", ncCustomer); // 使用当前组织的ncCustomer + queryParam.put("orgcode", orgcode); + log.info("调用赊销额度查询接口,custcode={},ncCustomer={},orgcode={}", ncCustomer, orgcode); - // 同步协议明细(agreedaydatas),与limitdatas独立 - com.alibaba.fastjson.JSONArray agreedaydatas = dataJson.getJSONArray("agreedaydatas"); - if (agreedaydatas != null && !agreedaydatas.isEmpty()) { - // 先删除该货主已有的协议明细,避免重复 - agreementDetailsMapper.delete(new LambdaQueryWrapper() - .eq(AgreementDetails::getShipperId, userShipperEntity1.getShipperId())); - int i; - for (i = 0; i < agreedaydatas.size(); i++) { - com.alibaba.fastjson.JSONObject agreeItem = agreedaydatas.getJSONObject(i); - AgreementDetails agreementDetails = new AgreementDetails(); - agreementDetails.setShipperId(userShipperEntity1.getShipperId()); - agreementDetails.setOrgcode(agreeItem.getString("orgcode")); - agreementDetails.setCode(agreeItem.getString("code")); - agreementDetails.setPday(agreeItem.getString("pday")); - agreementDetails.setPname(agreeItem.getString("pname")); - agreementDetails.setPtypename(agreeItem.getString("ptypename")); - agreementDetails.setPcode(agreeItem.getString("pcode")); - agreementDetails.setPtype(agreeItem.getString("ptype")); - agreementDetailsMapper.insert(agreementDetails); + String queryResult = HttpRequest.post(queryUrl) + .header("Content-Type", "application/json") + .header("uap_token", uapToken) + .header("uap_usercode", uapUsercode) + .header("uap_dataSource", uapDataSource) + .header("token", "94B3992EAD9747D3598CC6F7775F6239B5DC3B526DF7DE0091CB8B2D") + .body(queryParam.toJSONString()) + .execute() + .body(); + log.info("赊销额度查询接口返回,custcode={},ncCustomer={},orgcode={},result={}", ncCustomer, orgcode, queryResult); + + if (StringUtils.isNotEmpty(queryResult)) { + com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(queryResult); + allResults.put(ncCustomer + "_" + orgcode, resultJson); // 使用ncCustomer作为key + + // 第三步:查询成功,更新货主的额度同步时间(limitTime) + + if (userShipperEntity1 != null) { + // 根据查询结果同步数据 + com.alibaba.fastjson.JSONObject dataJson = resultJson.getJSONObject("data"); + if (dataJson != null) { + // 解析现有的orgCode数组 + com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); + if (StringUtils.isNotEmpty(userShipperEntity1.getOrgCode())) { + try { + orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(userShipperEntity1.getOrgCode()); + } catch (Exception e) { + log.warn("解析现有orgCode失败,将创建新的数组,shipperId={}", userShipperEntity1.getShipperId()); + } } - userShipperEntity1.setAgreementCount(i); - userShipperMapper.updateById(userShipperEntity1); - log.info("同步协议明细成功,custcode={},shipperId={},共{}条", userShipperEntity1.getCustomerNcCode(), userShipperEntity1.getShipperId(), agreedaydatas.size()); + + // 同步额度数据(limitdatas) + com.alibaba.fastjson.JSONArray limitdatas = dataJson.getJSONArray("limitdatas"); + if (limitdatas != null && !limitdatas.isEmpty()) { + // 将limitdatas按orgcode值合并到orgCode数组中 + for (int i = 0; i < limitdatas.size(); i++) { + com.alibaba.fastjson.JSONObject limitItem = limitdatas.getJSONObject(i); + String limitOrgcode = limitItem.getString("orgcode"); // 例如 "NA01" + + if (StringUtils.isNotEmpty(limitOrgcode)) { + // 在orgCode数组中查找code匹配的组织(注意:这里的code是2830, 2839等) + boolean found = false; + for (int j = 0; j < orgCodeArray.size(); j++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(j); + String orgItemCode = orgItem.getString("code"); // orgCode数组中的code + + // 如果orgCode数组中的code与当前orgCode(如2830)匹配,将limitdatas的字段添加到该组织对象中 + String currentOrgCodeStr = String.valueOf(orgCode); + if (currentOrgCodeStr.equals(orgItemCode)) { + orgItem.putAll(limitItem); + found = true; + log.info("匹配到code={}的组织,将额度数据(orgcode={})添加到orgCode中,custcode={}", orgItemCode, limitOrgcode, userShipperEntity1.getCustomerNcCode()); + break; + } + } + + // 如果没有找到匹配的组织,创建新的组织对象 + if (!found) { + com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); + newOrgItem.put("code", orgCode); // 使用当前orgCode + newOrgItem.putAll(limitItem); + orgCodeArray.add(newOrgItem); + log.info("未找到code={}的组织,创建新组织并添加额度数据(orgcode={}),custcode={}", orgCode, limitOrgcode, userShipperEntity1.getCustomerNcCode()); + } + } + } + + // 使用limitdatas中的数据更新额度字段 + com.alibaba.fastjson.JSONObject firstLimitData = limitdatas.getJSONObject(0); + userShipperEntity1.setLimitTime(new Date()); + userShipperEntity1.setAuthorizedQuota(firstLimitData.getBigDecimal("nlimitmny")); + userShipperEntity1.setAuthorizedUsedAmount(firstLimitData.getBigDecimal("nengrossmny")); + userShipperEntity1.setSettlementCurrency(firstLimitData.getString("currencycode")); + userShipperEntity1.setCreditAmount(firstLimitData.getBigDecimal("nbalancemny")); + + log.info("更新货主额度同步成功,custcode={},orgcode={},shipperId={},orgCode组织数={}", userShipperEntity1.getCustomerNcCode(), orgcode, userShipperEntity1.getShipperId(), orgCodeArray.size()); + } else { + log.info("赊销额度查询无limitdatas返回,跳过额度更新,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); + } + + // 同步协议明细(agreedaydatas),与limitdatas独立 + com.alibaba.fastjson.JSONArray agreedaydatas = dataJson.getJSONArray("agreedaydatas"); + if (agreedaydatas != null && !agreedaydatas.isEmpty()) { + // 只在第一次循环时删除该货主的所有协议明细,避免重复 + if (orgIndex == 0) { + agreementDetailsMapper.delete(new LambdaQueryWrapper() + .eq(AgreementDetails::getShipperId, userShipperEntity1.getShipperId())); + log.info("第一次循环,删除货主所有协议明细,shipperId={}", userShipperEntity1.getShipperId()); + } + + // 将agreedaydatas保存到orgCode数组中,与code同一级别 + String currentOrgCodeStr = String.valueOf(orgCode); + boolean foundOrg = false; + for (int j = 0; j < orgCodeArray.size(); j++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(j); + String orgItemCode = orgItem.getString("code"); + + // 找到当前组织,将agreedaydatas添加到该组织对象中 + if (currentOrgCodeStr.equals(orgItemCode)) { + orgItem.put("agreedaydatas", agreedaydatas); + foundOrg = true; + log.info("将agreedaydatas添加到code={}的组织中,共{}条", orgItemCode, agreedaydatas.size()); + break; + } + } + + // 如果没找到,创建新组织对象 + if (!foundOrg) { + com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); + newOrgItem.put("code", orgCode); + newOrgItem.put("agreedaydatas", agreedaydatas); + orgCodeArray.add(newOrgItem); + log.info("创建新组织并添加agreedaydatas,code={},共{}条", orgCode, agreedaydatas.size()); + } + + // 同时插入到agreement_details表 + for (int i = 0; i < agreedaydatas.size(); i++) { + com.alibaba.fastjson.JSONObject agreeItem = agreedaydatas.getJSONObject(i); + AgreementDetails agreementDetails = new AgreementDetails(); + agreementDetails.setShipperId(userShipperEntity1.getShipperId()); + agreementDetails.setOrgcode(agreeItem.getString("orgcode")); + agreementDetails.setCode(agreeItem.getString("code")); + agreementDetails.setPday(agreeItem.getString("pday")); + agreementDetails.setPname(agreeItem.getString("pname")); + agreementDetails.setPtypename(agreeItem.getString("ptypename")); + agreementDetails.setPcode(agreeItem.getString("pcode")); + agreementDetails.setPtype(agreeItem.getString("ptype")); + agreementDetailsMapper.insert(agreementDetails); + } + log.info("同步协议明细成功,custcode={},orgcode={},shipperId={},共{}条", userShipperEntity1.getCustomerNcCode(), orgcode, userShipperEntity1.getShipperId(), agreedaydatas.size()); + } else { + log.info("赊销额度查询无agreedaydatas返回,跳过协议明细同步,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); + } + + // 保存更新后的orgCode数组(统一在最后保存) + userShipperEntity1.setOrgCode(orgCodeArray.toJSONString()); } else { - log.info("赊销额度查询无agreedaydatas返回,跳过协议明细同步,custcode={}", userShipperEntity1.getCustomerNcCode()); + log.info("赊销额度查询无data返回,跳过更新,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); } } else { - log.info("赊销额度查询无data返回,跳过更新,custcode={}", userShipperEntity1.getCustomerNcCode()); + log.warn("未找到对应货主,custcode={},orgCode={}", orgCode); } } else { - log.warn("未找到对应货主,custcode={},organizationId={}", userShipperEntity1.getCustomerNcCode(), userShipperDTO.getOrganizationId()); + log.warn("赊销额度查询返回为空,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); } - } else { - log.warn("赊销额度查询返回为空,custcode={}", userShipperEntity1.getCustomerNcCode()); + } catch (Exception e) { + log.error("查询赊销额度异常,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode, e); + } finally { + orgIndex++; // 计数器递增 } - } catch (Exception e) { - log.error("查询赊销额度异常,custcode={}", userShipperEntity1.getCustomerNcCode(), e); + } + + // 所有组织循环完成后,统一更新数据库(只更新一次) + if (userShipperEntity1 != null) { + userShipperMapper.updateById(userShipperEntity1); + log.info("批量更新货主额度完成,custcode={},shipperId={}", userShipperEntity1.getCustomerNcCode(), userShipperEntity1.getShipperId()); } } return AjaxResult.success(allResults); @@ -1723,89 +1933,243 @@ public class UserShipperApplicationService { UserShipperEntity userShipperEntity1 = userShipperMapper.selectOne(new LambdaQueryWrapper() .eq(UserShipperEntity::getCustomerNcCode, userShipperEntity.getCustomerNcCode()) .eq(UserShipperEntity::getUserId, userShipperEntity.getUserId())); - String orgcode = userShipperMapper.getOrgNcCode(userShipperEntity1.getOrganizationId()); - if (StringUtils.isEmpty(orgcode)) { - return AjaxResult.error("组织NC编码不能为空"); + + if (userShipperEntity1 == null) { + log.warn("未找到对应货主,custcode={}", userShipperEntity.getCustomerNcCode()); + continue; } - try { - com.alibaba.fastjson.JSONObject queryParam = new com.alibaba.fastjson.JSONObject(); - queryParam.put("custcode", userShipperEntity.getCustomerNcCode()); - queryParam.put("orgcode", orgcode); - log.info("调用赊销额度查询接口,custcode={},orgcode={}", userShipperEntity.getCustomerNcCode(), orgcode); - - String queryResult = HttpRequest.post(queryUrl) - .header("Content-Type", "application/json") - .header("uap_token", uapToken) - .header("uap_usercode", uapUsercode) - .header("uap_dataSource", uapDataSource) - .header("token", "94B3992EAD9747D3598CC6F7775F6239B5DC3B526DF7DE0091CB8B2D") - .body(queryParam.toJSONString()) - .execute() - .body(); - log.info("赊销额度查询接口返回,custcode={},result={}", userShipperEntity.getCustomerNcCode(), queryResult); - - if (StringUtils.isNotEmpty(queryResult)) { - com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(queryResult); - allResults.put(userShipperEntity.getCustomerNcCode(), resultJson); - - // 第三步:查询成功,更新货主的额度同步时间(limitTime) - - if (userShipperEntity1 != null) { - // 根据查询结果同步数据 - com.alibaba.fastjson.JSONObject dataJson = resultJson.getJSONObject("data"); - if (dataJson != null) { - // 同步额度数据(limitdatas) - com.alibaba.fastjson.JSONArray limitdatas = dataJson.getJSONArray("limitdatas"); - if (limitdatas != null && !limitdatas.isEmpty()) { - com.alibaba.fastjson.JSONObject limitData = limitdatas.getJSONObject(0); - userShipperEntity1.setLimitTime(new Date()); - userShipperEntity1.setAuthorizedQuota(limitData.getBigDecimal("nlimitmny")); - userShipperEntity1.setAuthorizedUsedAmount(limitData.getBigDecimal("nengrossmny")); - userShipperEntity1.setSettlementCurrency(limitData.getString("currencycode")); - userShipperEntity1.setCreditAmount(limitData.getBigDecimal("nbalancemny")); - userShipperMapper.updateById(userShipperEntity1); - log.info("更新货主额度同步成功,custcode={},shipperId={}", userShipperEntity1.getCustomerNcCode(), userShipperEntity1.getShipperId()); - } else { - log.info("赊销额度查询无limitdatas返回,跳过额度更新,custcode={}", userShipperEntity1.getCustomerNcCode()); + + // 解析org_code,支持多组织 + List orgCodeList = new ArrayList<>(); + if (StringUtils.isNotEmpty(userShipperEntity1.getOrgCode())) { + try { + // 解析JSON数组:[{"name":"通宇","code":2830,"ncOrganizationId":"145222101124","names":2830},...] + com.alibaba.fastjson.JSONArray orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(userShipperEntity1.getOrgCode()); + if (orgCodeArray != null && !orgCodeArray.isEmpty()) { + for (int i = 0; i < orgCodeArray.size(); i++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); + Long code = orgItem.getLong("code"); + if (code != null) { + orgCodeList.add(code); } + } + } + log.info("解析org_code成功,custcode={},orgCodeList={}", userShipperEntity.getCustomerNcCode(), orgCodeList); + } catch (Exception e) { + log.error("解析org_code失败,custcode={},orgCode={}", userShipperEntity.getCustomerNcCode(), userShipperEntity1.getOrgCode(), e); + } + } + + // 如果org_code为空或解析失败,使用原来的organizationId方式 + if (orgCodeList.isEmpty()) { + Long organizationId = userShipperEntity1.getOrganizationId(); + if (organizationId != null) { + orgCodeList.add(organizationId); + log.info("org_code为空,使用organizationId,custcode={},organizationId={}", userShipperEntity.getCustomerNcCode(), organizationId); + } + } + + if (orgCodeList.isEmpty()) { + log.warn("货主无组织信息,跳过查询,custcode={}", userShipperEntity.getCustomerNcCode()); + continue; + } + + // 遍历每个组织code,分别调用接口 + int orgIndex = 0; // 组织循环计数器 + for (Long orgCode : orgCodeList) { + String orgcode = userShipperMapper.getOrgNcCode(orgCode); + if (StringUtils.isEmpty(orgcode)) { + log.warn("组织NC编码为空,跳过查询,custcode={},orgCode={}", userShipperEntity.getCustomerNcCode(), orgCode); + orgIndex++; + continue; + } + + // 从orgCode数组中获取当前组织的ncCustomer字段 + String ncCustomer = null; + if (StringUtils.isNotEmpty(userShipperEntity1.getOrgCode())) { + try { + com.alibaba.fastjson.JSONArray orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(userShipperEntity1.getOrgCode()); + for (int i = 0; i < orgCodeArray.size(); i++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i); + Long itemCode = orgItem.getLong("code"); + if (orgCode.equals(itemCode)) { + ncCustomer = orgItem.getString("ncCustomer"); + break; + } + } + } catch (Exception e) { + log.error("解析orgCode数组获取ncCustomer失败,orgCode={}", orgCode, e); + } + } + + if (StringUtils.isEmpty(ncCustomer)) { + log.warn("未找到组织code={}对应的ncCustomer,跳过查询,custcode={}", orgCode, userShipperEntity.getCustomerNcCode()); + orgIndex++; + continue; + } + + try { + com.alibaba.fastjson.JSONObject queryParam = new com.alibaba.fastjson.JSONObject(); + queryParam.put("custcode", ncCustomer); // 使用当前组织的ncCustomer + queryParam.put("orgcode", orgcode); + log.info("调用赊销额度查询接口,custcode={},ncCustomer={},orgcode={}", userShipperEntity.getCustomerNcCode(), ncCustomer, orgcode); - // 同步协议明细(agreedaydatas),与limitdatas独立 - com.alibaba.fastjson.JSONArray agreedaydatas = dataJson.getJSONArray("agreedaydatas"); - if (agreedaydatas != null && !agreedaydatas.isEmpty()) { - // 先删除该货主已有的协议明细,避免重复 - agreementDetailsMapper.delete(new LambdaQueryWrapper() - .eq(AgreementDetails::getShipperId, userShipperEntity1.getShipperId())); - int i; - for (i = 0; i < agreedaydatas.size(); i++) { - com.alibaba.fastjson.JSONObject agreeItem = agreedaydatas.getJSONObject(i); - AgreementDetails agreementDetails = new AgreementDetails(); - agreementDetails.setShipperId(userShipperEntity1.getShipperId()); - agreementDetails.setOrgcode(agreeItem.getString("orgcode")); - agreementDetails.setCode(agreeItem.getString("code")); - agreementDetails.setPday(agreeItem.getString("pday")); - agreementDetails.setPname(agreeItem.getString("pname")); - agreementDetails.setPtypename(agreeItem.getString("ptypename")); - agreementDetails.setPcode(agreeItem.getString("pcode")); - agreementDetails.setPtype(agreeItem.getString("ptype")); - agreementDetailsMapper.insert(agreementDetails); + String queryResult = HttpRequest.post(queryUrl) + .header("Content-Type", "application/json") + .header("uap_token", uapToken) + .header("uap_usercode", uapUsercode) + .header("uap_dataSource", uapDataSource) + .header("token", "94B3992EAD9747D3598CC6F7775F6239B5DC3B526DF7DE0091CB8B2D") + .body(queryParam.toJSONString()) + .execute() + .body(); + log.info("赊销额度查询接口返回,custcode={},ncCustomer={},orgcode={},result={}", userShipperEntity.getCustomerNcCode(), ncCustomer, orgcode, queryResult); + + if (StringUtils.isNotEmpty(queryResult)) { + com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(queryResult); + allResults.put(ncCustomer + "_" + orgcode, resultJson); // 使用ncCustomer作为key + + // 第三步:查询成功,更新货主的额度同步时间(limitTime) + + if (userShipperEntity1 != null) { + // 根据查询结果同步数据 + com.alibaba.fastjson.JSONObject dataJson = resultJson.getJSONObject("data"); + if (dataJson != null) { + // 解析现有的orgCode数组(提到外面,limitdatas和agreedaydatas共用) + com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray(); + if (StringUtils.isNotEmpty(userShipperEntity1.getOrgCode())) { + try { + orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(userShipperEntity1.getOrgCode()); + } catch (Exception e) { + log.warn("解析现有orgCode失败,将创建新的数组,shipperId={}", userShipperEntity1.getShipperId()); + } } - userShipperEntity1.setAgreementCount(i); - userShipperMapper.updateById(userShipperEntity1); - log.info("同步协议明细成功,custcode={},shipperId={},共{}条", userShipperEntity1.getCustomerNcCode(), userShipperEntity1.getShipperId(), agreedaydatas.size()); + + // 同步额度数据(limitdatas) + com.alibaba.fastjson.JSONArray limitdatas = dataJson.getJSONArray("limitdatas"); + if (limitdatas != null && !limitdatas.isEmpty()) { + // 将limitdatas按orgcode值合并到orgCode数组中 + for (int i = 0; i < limitdatas.size(); i++) { + com.alibaba.fastjson.JSONObject limitItem = limitdatas.getJSONObject(i); + String limitOrgcode = limitItem.getString("orgcode"); // 例如 "NA01" + + if (StringUtils.isNotEmpty(limitOrgcode)) { + // 在orgCode数组中查找code匹配的组织(注意:这里的code是2830, 2839等) + boolean found = false; + for (int j = 0; j < orgCodeArray.size(); j++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(j); + String orgItemCode = orgItem.getString("code"); // orgCode数组中的code + + // 如果orgCode数组中的code与当前orgCode(如2830)匹配,将limitdatas的字段添加到该组织对象中 + String currentOrgCodeStr = String.valueOf(orgCode); + if (currentOrgCodeStr.equals(orgItemCode)) { + orgItem.putAll(limitItem); + found = true; + log.info("匹配到code={}的组织,将额度数据(orgcode={})添加到orgCode中,custcode={}", orgItemCode, limitOrgcode, userShipperEntity1.getCustomerNcCode()); + break; + } + } + + // 如果没有找到匹配的组织,创建新的组织对象 + if (!found) { + com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); + newOrgItem.put("code", orgCode); // 使用当前orgCode + newOrgItem.putAll(limitItem); + orgCodeArray.add(newOrgItem); + log.info("未找到code={}的组织,创建新组织并添加额度数据(orgcode={}),custcode={}", orgCode, limitOrgcode, userShipperEntity1.getCustomerNcCode()); + } + } + } + + // 使用limitdatas中的数据更新额度字段 + com.alibaba.fastjson.JSONObject firstLimitData = limitdatas.getJSONObject(0); + userShipperEntity1.setLimitTime(new Date()); + userShipperEntity1.setAuthorizedQuota(firstLimitData.getBigDecimal("nlimitmny")); + userShipperEntity1.setAuthorizedUsedAmount(firstLimitData.getBigDecimal("nengrossmny")); + userShipperEntity1.setSettlementCurrency(firstLimitData.getString("currencycode")); + userShipperEntity1.setCreditAmount(firstLimitData.getBigDecimal("nbalancemny")); + + log.info("更新货主额度同步成功,custcode={},orgcode={},shipperId={},orgCode组织数={}", userShipperEntity1.getCustomerNcCode(), orgcode, userShipperEntity1.getShipperId(), orgCodeArray.size()); + } else { + log.info("赊销额度查询无limitdatas返回,跳过额度更新,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); + } + + // 同步协议明细(agreedaydatas),与limitdatas独立 + com.alibaba.fastjson.JSONArray agreedaydatas = dataJson.getJSONArray("agreedaydatas"); + if (agreedaydatas != null && !agreedaydatas.isEmpty()) { + // 只在第一次循环时删除该货主的所有协议明细,避免重复 + if (orgIndex == 0) { + agreementDetailsMapper.delete(new LambdaQueryWrapper() + .eq(AgreementDetails::getShipperId, userShipperEntity1.getShipperId())); + log.info("第一次循环,删除货主所有协议明细,shipperId={}", userShipperEntity1.getShipperId()); + } + + // 将agreedaydatas保存到orgCode数组中,与code同一级别 + String currentOrgCodeStr = String.valueOf(orgCode); + boolean foundOrg = false; + for (int j = 0; j < orgCodeArray.size(); j++) { + com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(j); + String orgItemCode = orgItem.getString("code"); + + // 找到当前组织,将agreedaydatas添加到该组织对象中 + if (currentOrgCodeStr.equals(orgItemCode)) { + orgItem.put("agreedaydatas", agreedaydatas); + foundOrg = true; + log.info("将agreedaydatas添加到code={}的组织中,共{}条", orgItemCode, agreedaydatas.size()); + break; + } + } + + // 如果没找到,创建新组织对象 + if (!foundOrg) { + com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject(); + newOrgItem.put("code", orgCode); + newOrgItem.put("agreedaydatas", agreedaydatas); + orgCodeArray.add(newOrgItem); + log.info("创建新组织并添加agreedaydatas,code={},共{}条", orgCode, agreedaydatas.size()); + } + + // 同时插入到agreement_details表 + for (int i = 0; i < agreedaydatas.size(); i++) { + com.alibaba.fastjson.JSONObject agreeItem = agreedaydatas.getJSONObject(i); + AgreementDetails agreementDetails = new AgreementDetails(); + agreementDetails.setShipperId(userShipperEntity1.getShipperId()); + agreementDetails.setOrgcode(agreeItem.getString("orgcode")); + agreementDetails.setCode(agreeItem.getString("code")); + agreementDetails.setPday(agreeItem.getString("pday")); + agreementDetails.setPname(agreeItem.getString("pname")); + agreementDetails.setPtypename(agreeItem.getString("ptypename")); + agreementDetails.setPcode(agreeItem.getString("pcode")); + agreementDetails.setPtype(agreeItem.getString("ptype")); + agreementDetailsMapper.insert(agreementDetails); + } + log.info("同步协议明细成功,custcode={},orgcode={},shipperId={},共{}条", userShipperEntity1.getCustomerNcCode(), orgcode, userShipperEntity1.getShipperId(), agreedaydatas.size()); + } else { + log.info("赊销额度查询无agreedaydatas返回,跳过协议明细同步,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); + } + + // 保存更新后的orgCode数组(统一在最后保存) + userShipperEntity1.setOrgCode(orgCodeArray.toJSONString()); } else { - log.info("赊销额度查询无agreedaydatas返回,跳过协议明细同步,custcode={}", userShipperEntity1.getCustomerNcCode()); + log.info("赊销额度查询无data返回,跳过更新,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); } } else { - log.info("赊销额度查询无data返回,跳过更新,custcode={}", userShipperEntity1.getCustomerNcCode()); + log.warn("未找到对应货主,custcode={},orgCode={}", userShipperEntity.getCustomerNcCode(), orgCode); } } else { - log.warn("未找到对应货主,custcode={},organizationId={}", userShipperEntity1.getCustomerNcCode(), userShipperDTO.getOrganizationId()); + log.warn("赊销额度查询返回为空,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode); } - } else { - log.warn("赊销额度查询返回为空,custcode={}", userShipperEntity1.getCustomerNcCode()); + } catch (Exception e) { + log.error("查询赊销额度异常,custcode={},orgcode={}", userShipperEntity1.getCustomerNcCode(), orgcode, e); + } finally { + orgIndex++; // 计数器递增 } - } catch (Exception e) { - log.error("查询赊销额度异常,custcode={}", userShipperEntity1.getCustomerNcCode(), e); + } + + // 所有组织循环完成后,统一更新数据库(只更新一次) + if (userShipperEntity1 != null) { + userShipperMapper.updateById(userShipperEntity1); + log.info("批量更新货主额度完成,custcode={},shipperId={}", userShipperEntity1.getCustomerNcCode(), userShipperEntity1.getShipperId()); } } return AjaxResult.success(allResults); diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/WechatMiniAppService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/WechatMiniAppService.java new file mode 100644 index 000000000..557d632b3 --- /dev/null +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/WechatMiniAppService.java @@ -0,0 +1,148 @@ +package com.mhd.user.application.service; + +import com.alibaba.fastjson.JSONObject; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.user.interfaces.dto.wechat.WxPhoneNumberDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 微信小程序手机号快速验证 + * appId/appSecret 在 bootstrap.yml / Nacos 中配置,不同环境配置不同值即可 + */ +@Service +@Slf4j +public class WechatMiniAppService { + + private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; + private static final String GET_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s"; + + @Value("${wechat.miniapp.appId:}") + private String appId; + + @Value("${wechat.miniapp.appSecret:}") + private String appSecret; + + /** access_token 缓存:{token, expireTime} */ + private volatile String cachedToken; + private volatile long tokenExpireTime; + + public AjaxResult wxGetPhoneNumber(WxPhoneNumberDTO dto, Long organizationId) { + if (dto == null || dto.getCode() == null || dto.getCode().isEmpty()) { + return AjaxResult.error("code 不能为空"); + } + if (appId.isEmpty() || appSecret.isEmpty()) { + return AjaxResult.error("未配置 wechat.miniapp.appId / wechat.miniapp.appSecret"); + } + + try { + String accessToken = getAccessToken(); + String body = "{\"code\":\"" + dto.getCode() + "\"}"; + String phoneJson = doPost(String.format(GET_PHONE_URL, accessToken), body); + JSONObject result = JSONObject.parseObject(phoneJson); + + int errcode = result.getIntValue("errcode"); + if (errcode != 0) { + String errmsg = result.getString("errmsg"); + log.error("微信手机号解密失败, errcode={}, errmsg={}", errcode, errmsg); + return AjaxResult.error("获取手机号失败:" + errmsg); + } + + JSONObject phoneInfo = result.getJSONObject("phone_info"); + if (phoneInfo == null) { + return AjaxResult.error("未获取到手机号信息"); + } + + JSONObject data = new JSONObject(); + data.put("phoneNumber", phoneInfo.getString("phoneNumber")); + data.put("purePhoneNumber", phoneInfo.getString("purePhoneNumber")); + data.put("countryCode", phoneInfo.getString("countryCode")); + return AjaxResult.success(data); + + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("微信手机号验证异常", e); + return AjaxResult.error("微信手机号验证失败:" + e.getMessage()); + } + } + + private String getAccessToken() { + if (cachedToken != null && System.currentTimeMillis() < tokenExpireTime) { + return cachedToken; + } + synchronized (this) { + if (cachedToken != null && System.currentTimeMillis() < tokenExpireTime) { + return cachedToken; + } + String url = String.format(ACCESS_TOKEN_URL, appId, appSecret); + String response = doGet(url); + JSONObject result = JSONObject.parseObject(response); + if (result.containsKey("errcode") && result.getIntValue("errcode") != 0) { + throw new ServiceException("获取微信 access_token 失败:" + result.getString("errmsg")); + } + cachedToken = result.getString("access_token"); + int expiresIn = result.getIntValue("expires_in"); + tokenExpireTime = System.currentTimeMillis() + (expiresIn - 300) * 1000L; + return cachedToken; + } + } + + private String doGet(String urlStr) { + try { + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000); + return readResponse(conn); + } catch (Exception e) { + throw new ServiceException("微信接口请求失败:" + e.getMessage()); + } + } + + private String doPost(String urlStr, String body) { + try { + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000); + try (OutputStream os = conn.getOutputStream()) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + os.flush(); + } + return readResponse(conn); + } catch (Exception e) { + throw new ServiceException("微信接口请求失败:" + e.getMessage()); + } + } + + private String readResponse(HttpURLConnection conn) throws Exception { + int code = conn.getResponseCode(); + BufferedReader reader = new BufferedReader(new InputStreamReader( + code >= 400 ? conn.getErrorStream() : conn.getInputStream(), StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + reader.close(); + if (code >= 400) { + throw new ServiceException("微信接口 HTTP " + code + ":" + sb); + } + return sb.toString(); + } +} diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/entity/UserShipperEntity.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/entity/UserShipperEntity.java index fc8e6a274..56f93c213 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/entity/UserShipperEntity.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/entity/UserShipperEntity.java @@ -291,4 +291,7 @@ public class UserShipperEntity extends BaseVOEntity { @ApiModelProperty(name = "是否校验信用") private String isCheckCredit; + @ApiModelProperty(name = "组织代码") + private String orgCode; + } \ No newline at end of file diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/po/UserShipperPo.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/po/UserShipperPo.java index 15958b775..8d6869c92 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/po/UserShipperPo.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/po/UserShipperPo.java @@ -354,4 +354,6 @@ public class UserShipperPo implements Serializable { private BigDecimal agreementCount; @ApiModelProperty(name = "是否校验信用") private String isCheckCredit; + @ApiModelProperty(name = "组织代码") + private String orgCode; } \ No newline at end of file diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/todo/UserShipperDO.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/todo/UserShipperDO.java index 73d309227..e96c43d8c 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/todo/UserShipperDO.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/repository/todo/UserShipperDO.java @@ -322,4 +322,7 @@ public class UserShipperDO extends UserDO { private String userPassword; @ApiModelProperty(name = "是否校验信用") private String isCheckCredit; + + @ApiModelProperty(name = "组织代码") + private String orgCode; } \ No newline at end of file diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/addDTO/UserShipperDTO.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/addDTO/UserShipperDTO.java index e3717759d..50bf04ab3 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/addDTO/UserShipperDTO.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/addDTO/UserShipperDTO.java @@ -268,4 +268,7 @@ public class UserShipperDTO extends UserDTO { private String userPassword; @ApiModelProperty(name = "是否校验信用") private String isCheckCredit; + + @ApiModelProperty(name = "组织代码") + private String orgCode; } \ No newline at end of file diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/wechat/WxPhoneNumberDTO.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/wechat/WxPhoneNumberDTO.java new file mode 100644 index 000000000..1049ebef3 --- /dev/null +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/dto/wechat/WxPhoneNumberDTO.java @@ -0,0 +1,14 @@ +package com.mhd.user.interfaces.dto.wechat; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 微信小程序手机号快速验证——请求参数 + */ +@Data +public class WxPhoneNumberDTO { + + @ApiModelProperty("wx.getPhoneNumber 返回的 code(注意:非 wx.login 的 code)") + private String code; +} 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 ca42936d6..29bf15f6e 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 @@ -12,9 +12,11 @@ import com.mhd.common.log.enums.BusinessType; import com.mhd.user.application.service.UserApplicationService; import com.mhd.user.application.service.UserDriverApplicationService; import com.mhd.user.application.service.UserShipperApplicationService; +import com.mhd.user.domain.roleAggregate.repository.todo.RoleDo; import com.mhd.user.domain.userAggregate.repository.po.UserDocumentWarningQueryPo; import com.mhd.user.domain.userAggregate.repository.todo.*; import com.mhd.user.domain.userAggregate.service.UserRoleDomainService; + import com.mhd.user.interfaces.assember.*; import com.mhd.user.interfaces.dto.addDTO.*; import com.mhd.user.interfaces.dto.queryDTO.UserDataPermissionQueryDTO; diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserShipperAPI.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserShipperAPI.java index 82c801b75..f070f084b 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserShipperAPI.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserShipperAPI.java @@ -5,7 +5,9 @@ import com.mhd.common.core.domain.entity.R; import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.log.annotation.Log; import com.mhd.common.log.enums.BusinessType; +import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.domain.UserShipperFeignDTO; +import com.mhd.system.api.model.LoginUser; import com.mhd.user.application.service.UserApplicationService; import com.mhd.user.application.service.UserShipperApplicationService; import com.mhd.user.domain.userAggregate.repository.todo.*; @@ -18,6 +20,7 @@ import com.mhd.common.core.web.page.TableDataInfo; import com.mhd.common.security.annotation.RepeatSubmit; import com.mhd.common.security.service.TokenService; import com.mhd.user.application.service.UserShipperMasterDataSyncService; +import com.mhd.user.application.service.WechatMiniAppService; import com.mhd.user.interfaces.dto.updateDTO.SettlementInfoUpdateDTO; import com.mhd.user.interfaces.vo.SettlementInfoQueryVo; import com.mhd.user.interfaces.vo.ShipperMasterDataSyncTimeVo; @@ -42,6 +45,8 @@ public class UserShipperAPI extends BaseController { @Resource private UserShipperMasterDataSyncService userShipperMasterDataSyncService; @Resource + private WechatMiniAppService wechatMiniAppService; + @Resource private UserApplicationService userApplicationService; @Resource private UserShipperAssember userShipperAssember; @@ -342,4 +347,13 @@ public class UserShipperAPI extends BaseController { } return AjaxResult.success(resultMap); } + + @ApiOperation("微信小程序手机号快速验证") + @PostMapping("/wxGetPhoneNumber") + public AjaxResult wxGetPhoneNumber(@RequestBody com.mhd.user.interfaces.dto.wechat.WxPhoneNumberDTO dto) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long organizationId = (loginUser != null && loginUser.getUserPo() != null) + ? loginUser.getUserPo().getOrganizationId() : null; + return wechatMiniAppService.wxGetPhoneNumber(dto, organizationId); + } } \ No newline at end of file diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index e1d177712..c17c2833e 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -20,15 +20,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.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 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd-user-center/src/main/resources/mapper/UserMapper.xml b/mhd-user-center/src/main/resources/mapper/UserMapper.xml index 8e7d02061..7255f64c7 100644 --- a/mhd-user-center/src/main/resources/mapper/UserMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserMapper.xml @@ -264,8 +264,8 @@ - and a.organization_id = #{organizationId} - and a.organization_name IS NOT NULL + and (a.organization_id = #{organizationId} + or b.ORG_CODE like concat('%', to_char(#{organizationId}), '%')) @@ -773,7 +773,13 @@ /*组织ID - 数据隔离:南光组织(organizationId=2827)查询全部,其他组织查询自己组织的数据*/ - AND u.organization_id = #{organizationId} + AND ( + u.organization_id = #{organizationId} + OR b.org_code LIKE concat('%"code":"', #{organizationId}, '"%') + OR b.org_code LIKE concat('%code:', #{organizationId}, '%') + OR b.org_code LIKE concat('%code: ', #{organizationId}, '%') + OR b.org_code LIKE concat('%"code":', #{organizationId}, '%') + ) AND u.organization_name IS NOT NULL GROUP BY u.user_id, u.user_name, u.user_area_address, u.user_area_county_id, u.user_area_name, u.user_phone, u.has_default_address, b.shipper_id, b.shipper_enterprise_name, u.DOCUMENT_PREPARER_NC_CODE, b.CUSTOMER_NC_CODE, u.organization_id, u.top_organization_id, b.settlement_currency diff --git a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml index 0e9754f99..20f663b17 100644 --- a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml @@ -67,6 +67,7 @@ a.esign_auth_status, a.esign_enterprise_status, a.CUSTOMER_NC_CODE, + a.org_code, a.esign_seal_auth_id FROM user_shipper a LEFT JOIN "USER" b ON a.user_id = b.user_id @@ -171,7 +172,8 @@ b.LIMIT_TIME, b.CREDIT_AMOUNT, b.IS_CHECK_CREDIT, - b.AGREEMENT_COUNT + b.AGREEMENT_COUNT, + b.org_code FROM "USER" a LEFT JOIN user_shipper b ON a.user_id = b.user_id left join (select user_id, LISTAGG(DISTINCT r.role_name, '&') WITHIN GROUP(ORDER BY r.role_name) AS roleName @@ -375,7 +377,13 @@ /*用户组织ID*/ - and a.organization_id = #{organizationId} + AND ( + a.organization_id = #{organizationId} + OR b.org_code LIKE concat('%"code":"', #{organizationId}, '"%') + OR b.org_code LIKE concat('%code:', #{organizationId}, '%') + OR b.org_code LIKE concat('%code: ', #{organizationId}, '%') + OR b.org_code LIKE concat('%"code":', #{organizationId}, '%') + ) /*组织名称*/ @@ -511,6 +519,7 @@ OR a.create_by = #{createBy}) + + + diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/mapper/ReconciliationMapper.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/mapper/ReconciliationMapper.java index eb50d1751..e68dd0b01 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/mapper/ReconciliationMapper.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/mapper/ReconciliationMapper.java @@ -39,6 +39,8 @@ public interface ReconciliationMapper extends BaseMapper String getCustomerCodeNc(@Param("actualInvoiceCustomerId") String actualInvoiceCustomerId); + String getCustomerCodeNcJson(@Param("actualInvoiceCustomerId") String actualInvoiceCustomerId); + String getDocumentPreparerNcCode(@Param("salesmanId") String salesmanId); String getSettlementCurrencyNcCode(@Param("settlementCurrency") String settlementCurrency); diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 19c67e240..c2f386f31 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.linke.finance.domain.approvalDocument.entity.ApprovalDocument; import com.linke.finance.domain.approvalDocument.repository.mapper.ApprovalDocumentMapper; @@ -725,6 +727,26 @@ public class ReconciliationImpl extends ServiceImpl> list = objectMapper.readValue( + customerCodeNcJson, + new TypeReference>>() {} + ); + if (list != null && list.size() > 0) { + Map targetMap = list.stream() + .filter(map -> { + Object codeObj = map.get("code"); + return codeObj != null && codeObj.toString().equals(reconciliation.getOrganizationId().toString()); + }) + .findFirst() + .orElse(null); + if (targetMap != null) { + customerCodeNc = (String) targetMap.get("ncCustomer"); + } + } + } String settlementCurrency=order.getSettlementCurrency(); String salesmanId = order.getSalesmanId(); String customerUserDept = reconciliationMapper.getCustomerUserDept(salesmanId); @@ -952,6 +974,10 @@ public class ReconciliationImpl extends ServiceImpl> list = objectMapper.readValue( + customerCodeNcJson, + new TypeReference>>() {} + ); + if (list != null && list.size() > 0) { + Map targetMap = list.stream() + .filter(map -> { + Object codeObj = map.get("code"); + return codeObj != null && codeObj.toString().equals(reconciliation.getOrganizationId().toString()); + }) + .findFirst() + .orElse(null); + if (targetMap != null) { + customerCodeNc = (String) targetMap.get("ncCustomer"); + } + } + } + String settlementCurrency=order.getSettlementCurrency(); String salesmanId = order.getSalesmanId(); String customerUserDept = reconciliationMapper.getCustomerUserDept(salesmanId); @@ -1235,6 +1282,10 @@ public class ReconciliationImpl extends ServiceImpl> listNc = objectMapper.readValue( + customerCodeNcJson, + new TypeReference>>() {} + ); + if (listNc != null && listNc.size() > 0) { + Map targetMap = listNc.stream() + .filter(map -> { + Object codeObj = map.get("code"); + return codeObj != null && codeObj.toString().equals(reconciliation.getOrganizationId().toString()); + }) + .findFirst() + .orElse(null); + if (targetMap != null) { + customerCodeNc = (String) targetMap.get("ncCustomer"); + } + } + } String documentPreparerNcCode = reconciliationMapper.getDocumentPreparerNcCode(salesmanId); String settlementCurrency=order.getSettlementCurrency(); String settlementCurrencyNcCode = settlementCurrency; @@ -1759,6 +1830,10 @@ public class ReconciliationImpl extends ServiceImpl> listNc = objectMapper.readValue( + customerCodeNcJson, + new TypeReference>>() {} + ); + if (listNc != null && listNc.size() > 0) { + Map targetMap = listNc.stream() + .filter(map -> { + Object codeObj = map.get("code"); + return codeObj != null && codeObj.toString().equals(reconciliation.getOrganizationId().toString()); + }) + .findFirst() + .orElse(null); + if (targetMap != null) { + customerCodeNc = (String) targetMap.get("ncCustomer"); + } + } + } String documentPreparerNcCode = reconciliationMapper.getDocumentPreparerNcCode(salesmanId); String settlementCurrency=order.getSettlementCurrency(); String settlementCurrencyNcCode = settlementCurrency; @@ -2046,6 +2141,10 @@ public class ReconciliationImpl extends ServiceImpl + + diff --git a/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml b/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml index 65777d7e9..1db972407 100644 --- a/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml +++ b/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml @@ -123,6 +123,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/entity/ExecutionInMaterialDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/entity/ExecutionInMaterialDetail.java new file mode 100644 index 000000000..1a4dce0d3 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/entity/ExecutionInMaterialDetail.java @@ -0,0 +1,396 @@ +package com.mhd.oms.domain.executionInMaterialDetail.entity; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionInMaterialDetail extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + @TableId(type = IdType.AUTO) + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("收货数量") + @Excel(name = "收货数量") + private BigDecimal receiptQuantity; + + @ApiModelProperty("上架数量") + @Excel(name = "上架数量") + private BigDecimal shelvesQuantity; + + @ApiModelProperty("作业数量(例如:收货数量 上架数量)") + @Excel(name = "作业数量(例如:收货数量 上架数量)") + private BigDecimal actualQuantity; + + @ApiModelProperty("收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + @Excel(name = "收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + private Integer receiptStatus; + + @ApiModelProperty("上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + @Excel(name = "上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + private Integer shelvesStatus; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("是否质检管理: 1-是 2-否") + @Excel(name = "是否质检管理: 1-是 2-否") + private Integer qualityInspectionManage; + + @ApiModelProperty("质检阶段: 1-收货前 2-收货后上架前") + @Excel(name = "质检阶段: 1-收货前 2-收货后上架前") + private Integer qualityInspectionStage; + + @ApiModelProperty("质检规则: 1-全检 2-抽检 ") + @Excel(name = "质检规则: 1-全检 2-抽检 ") + private Integer qualityInspectionRule; + + @ApiModelProperty("抽检比例") + @Excel(name = "抽检比例") + private BigDecimal qualityInspectionRatio; + + @ApiModelProperty("质检项: 1-包装 2-纯度") + @Excel(name = "质检项: 1-包装 2-纯度") + private Integer qualityInspectionTerm; + + @ApiModelProperty("质检结果: 1-正常 2-异常") + @Excel(name = "质检结果: 1-正常 2-异常") + private Integer qualityInspectionResults; + + @ApiModelProperty("是否允许超收: 1-是 2-否") + @Excel(name = "是否允许超收: 1-是 2-否") + private Integer allowOvercharge; + + @ApiModelProperty("超收比例") + @Excel(name = "超收比例") + private BigDecimal overchargeRatio; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("分配规则id") + @Excel(name = "分配规则id") + private Long distributeRuleId; + + @ApiModelProperty("分配规则编码") + @Excel(name = "分配规则编码") + private String distributeRuleCode; + + @ApiModelProperty("分配规则名称") + @Excel(name = "分配规则名称") + private String distributeRuleName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("上架仓库id") + private Long warehouseId; + + @ApiModelProperty("上架仓库编码") + @Excel(name = "上架仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("上架库区id") + @Excel(name = "上架库区id") + private Long storageSectionId; + + @ApiModelProperty("上架库区编码") + @Excel(name = "上架库区编码") + private String storageCode; + + @ApiModelProperty("上架库区名称") + @Excel(name = "上架库区名称") + private String storageName; + + @ApiModelProperty("上架库位id") + @Excel(name = "上架库位id") + private Long storageLocationId; + + @ApiModelProperty("上架库位编码") + @Excel(name = "上架库位编码") + private String storageLocationCode; + + @ApiModelProperty("上架库位名称") + @Excel(name = "上架库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + private Long parentUniqueId; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + // ========== 报关相关明细字段 ========== + @ApiModelProperty("规格型号") + @Excel(name = "规格型号/ITEM") + private String specificationModel; + + @ApiModelProperty("SKU码") + @Excel(name = "SKU码") + private String skuCode; + + @ApiModelProperty("Invoice No.") + @Excel(name = "Invoice No.") + private String invoiceNo; + + @ApiModelProperty("升") + @Excel(name = "升") + private BigDecimal liter; + + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String dimensions; + + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declarationUnit; + + @ApiModelProperty("Batch Ref NO's") + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @ApiModelProperty("Sheet Ref NO's") + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String originCountry; + + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declaredQuantity; + + @ApiModelProperty("箱数") + @Excel(name = "箱数") + private BigDecimal boxCount; + + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("入库数量(输入大于等于0的数字,可以为小数)") + @Excel(name = "入库数量") + private BigDecimal inboundQuantity; + + @ApiModelProperty("总净重(KG)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + @ApiModelProperty("总毛重(KG)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + @ApiModelProperty("总体积(CBM)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("总面积(SQM)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal totalPrice; + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + @ApiModelProperty(value = "饮用时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + private Date drinkDate; + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/facade/IExecutionInMaterialDetailService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/facade/IExecutionInMaterialDetailService.java new file mode 100644 index 000000000..ffa353bb7 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/facade/IExecutionInMaterialDetailService.java @@ -0,0 +1,68 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.InventoryAdjustmentRecordPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.QueryOrderOverStockDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailBaseDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; + +import java.util.List; + +/** + * 物料明细Service接口 + * + * @author gen + * @date 2024-05-21 + */ +public interface IExecutionInMaterialDetailService extends IService +{ + + /** + * 分页查询物料明细列表 + */ + public List queryList(ExecutionInMaterialDetailDO inMaterialDetailDO); + + + public List queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + + /** + * 分页查询物料明细列表 + */ + public List queryListChildren(ExecutionInMaterialDetailDO inMaterialDetailDO); + + /** + * 新增物料明细 + */ + public Boolean insert(ExecutionInMaterialDetailDO inMaterialDetailDO); + + /** + * 修改物料明细 + */ + public Boolean update(ExecutionInMaterialDetailDO inMaterialDetailDO); + + /** + * 新增物料明细 + */ + public Boolean batchInsert(String orderNumber, List inMaterialDetailDOList); + + + /** + * 修改物料明细 + */ + public Boolean batchUpdate(List inMaterialDetailDOList, ExecutionInMaterialDetailBaseDO inMaterialDetailBaseDO); + + /** + * 批量删除物料明细 + */ + public Boolean delete(Long[] materialDetailIds); + + + /** + * 查询物料明细 + */ + public ExecutionInMaterialDetailPO getInfo(Long materialDetailId); + + public List getkctzjl(Long materialBaseInfoId, String orderNumber, String adjustType); +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/mapper/ExecutionInMaterialDetailMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/mapper/ExecutionInMaterialDetailMapper.java new file mode 100644 index 000000000..c9fbc4970 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/mapper/ExecutionInMaterialDetailMapper.java @@ -0,0 +1,33 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.InventoryAdjustmentRecordPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.QueryOrderOverStockDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 物料明细Mapper接口 + * + * @author gen + * @date 2024-05-21 + */ +public interface ExecutionInMaterialDetailMapper extends BaseMapper +{ + /** + * 查询物料明细列表 + */ + public List queryList(ExecutionInMaterialDetailDO inMaterialDetailDO); + + /** + * 关联入库单查询物料明细列表 + */ + public List queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + + public List getkctzjl(@Param("materialBaseInfoId") Long materialBaseInfoId, @Param("orderNumber") String orderNumber, @Param("adjustType") String adjustType); + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/persistence/ExecutionInMaterialDetailImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/persistence/ExecutionInMaterialDetailImpl.java new file mode 100644 index 000000000..c013de9dd --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/persistence/ExecutionInMaterialDetailImpl.java @@ -0,0 +1,312 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.persistence; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.common.core.constant.SnowFlakeConstants; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.uuid.IdGenerator; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionInMaterialDetail.repository.mapper.ExecutionInMaterialDetailMapper; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.InventoryAdjustmentRecordPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.QueryOrderOverStockDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailBaseDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory; +import com.mhd.oms.domain.reservationMaterialInventory.repository.facade.IReservationMaterialInventoryService; +import com.mhd.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 物料明细Service业务层处理 + * + * @author gen + * @date 2024-05-21 + */ +@Service +public class ExecutionInMaterialDetailImpl extends ServiceImpl implements IExecutionInMaterialDetailService { + @Autowired + private ExecutionInMaterialDetailMapper inMaterialDetailMapper; +// @Autowired +// private IMaterialBaseInfoService materialBaseInfoService; +// @Autowired +// private IMaterialGoodsRuleService materialGoodsRuleService; +// @Autowired +// private IMaterialWarehouseControlService materialWarehouseControlService; +// @Autowired +// private SystemServiceFeign systemServiceFeign; + @Autowired + private IdGenerator idGenerator; + + @Autowired + private IReservationMaterialInventoryService reservationMaterialInventoryService; + + + /** + * 查询物料明细列表 + */ + @Override + public List queryList(ExecutionInMaterialDetailDO inMaterialDetailDO) { + return inMaterialDetailMapper.queryList(inMaterialDetailDO); + } + + /** + * 关联入库单查询物料明细列表 + */ + @Override + public List queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO) { + return inMaterialDetailMapper.queryInOrderList(queryOrderOverStockDO); + } + + /** + * 查询物料明细列表 + */ + @Override + public List queryListChildren(ExecutionInMaterialDetailDO inMaterialDetailDO) + { + List inMaterialDetailPOList = inMaterialDetailMapper.queryList(inMaterialDetailDO); + + // 获取查询的层级 + List inMaterialDetailPOParentList = inMaterialDetailPOList + .stream().filter(e -> 1 == e.getLevel()).collect(Collectors.toList()); + // 递归查询子集 + inMaterialDetailPOParentList.forEach(materialDetailPO -> materialDetailPO.setChildren(getChildren(materialDetailPO.getUniqueId(), inMaterialDetailPOList, 2))); + return inMaterialDetailPOParentList; + } + + private List getChildren(Long parentUniqueId, List inMaterialDetailPOList, Integer maxLevel){ + List childrenCityList = inMaterialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(childrenCityList)){ + childrenCityList.forEach(childrenCity -> { + if (childrenCity.getLevel() < maxLevel){ + childrenCity.setChildren(getChildren(childrenCity.getUniqueId(), inMaterialDetailPOList, maxLevel)); + } + }); + } + return childrenCityList; + } + + /** + * 新增物料明细 + */ + @Override + public Boolean insert(ExecutionInMaterialDetailDO inMaterialDetailDO) { + ExecutionInMaterialDetail inMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(inMaterialDetailDO, inMaterialDetail); + return this.save(inMaterialDetail); + } + + /** + * 修改物料明细 + */ + @Override + public Boolean update(ExecutionInMaterialDetailDO inMaterialDetailDO) { + ExecutionInMaterialDetail inMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(inMaterialDetailDO, inMaterialDetail); + return this.updateById(inMaterialDetail); + } + + /** + * @description 批量新增物流明细 + * @author ZhouGY + * @date 2024/5/22 9:27 + * @param inOrderNumber + * @param inMaterialDetailDOList + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean batchInsert(String inOrderNumber, List inMaterialDetailDOList) { + if (CollectionUtils.isEmpty(inMaterialDetailDOList)) { + throw new ServiceException("物料明细不能为空"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + // 批量新增或修改 + List inMaterialDetailList = new ArrayList<>(); + for (ExecutionInMaterialDetailDO inMaterialDetailDO : inMaterialDetailDOList){ + ExecutionInMaterialDetail inMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(inMaterialDetailDO, inMaterialDetail); + inMaterialDetail.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + inMaterialDetail.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + inMaterialDetail.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + inMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); + inMaterialDetail.setInOrderNumber(inOrderNumber); + inMaterialDetail.setLevel(1); + inMaterialDetail.setCreateBy(loginUser.getUserid()); + inMaterialDetail.setCreateByName(userRealName); + inMaterialDetail.setCreateTime(new Date()); + // 新增入库单明细时,如果计划数量为空,则使用入库数量作为计划数量 + if (inMaterialDetail.getQuantity() == null && inMaterialDetailDO.getInboundQuantity() != null) { + inMaterialDetail.setQuantity(inMaterialDetailDO.getInboundQuantity()); + } + + if (inMaterialDetail.getInboundQuantity() == null && inMaterialDetailDO.getQuantity() != null) { + inMaterialDetail.setInboundQuantity(inMaterialDetailDO.getQuantity()); + } + inMaterialDetailList.add(inMaterialDetail); + } + //插入库存表 + putIntoInventory(inMaterialDetailList); + return saveBatch(inMaterialDetailList); + } + + + private void putIntoInventory(List inMaterialDetailList) { + for (ExecutionInMaterialDetail reservationInMaterialDetail : inMaterialDetailList) { + ReservationMaterialInventory reservationMaterialInventory = new ReservationMaterialInventory(); + BeanUtils.copyProperties(reservationInMaterialDetail, reservationMaterialInventory); + reservationMaterialInventory.setLotNumber(reservationInMaterialDetail.getLotNo()); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda() + .eq(reservationMaterialInventory.getShipperId() != null,ReservationMaterialInventory::getShipperId, reservationMaterialInventory.getShipperId()) + .eq(reservationMaterialInventory.getWarehouseId() != null,ReservationMaterialInventory::getWarehouseId, reservationMaterialInventory.getWarehouseId()) + .eq(reservationMaterialInventory.getMaterialBaseInfoId() != null,ReservationMaterialInventory::getMaterialBaseInfoId, reservationMaterialInventory.getMaterialBaseInfoId()) + .eq(reservationMaterialInventory.getInOrderNumber() != null,ReservationMaterialInventory::getInOrderNumber, reservationMaterialInventory.getInOrderNumber()) + .eq(reservationMaterialInventory.getLotNumber() != null,ReservationMaterialInventory::getLotNumber, reservationMaterialInventory.getLotNumber()) + .eq(reservationMaterialInventory.getBatchNumber() != null,ReservationMaterialInventory::getBatchNumber, reservationMaterialInventory.getBatchNumber()) + ; + //reservationMaterialInventoryService.saveOrUpdate(reservationMaterialInventory,updateWrapper); + } + } + + /** + * @description 批量修改物流明细 + * @author ZhouGY + * @date 2024/5/22 9:27 + * @param inMaterialDetailDOList + * @param inMaterialDetailBaseDO + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean batchUpdate(List inMaterialDetailDOList, ExecutionInMaterialDetailBaseDO inMaterialDetailBaseDO) { + if (CollectionUtils.isEmpty(inMaterialDetailDOList)) { + throw new ServiceException("物料明细不能为空"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + + // 查询所有记录(包括已删除的),用于判断是否需要恢复已删除的记录 + List inMaterialDetailDbAllList = inMaterialDetailMapper.selectList(new QueryWrapper().lambda() + .eq(ExecutionInMaterialDetail::getInOrderNumber, inMaterialDetailBaseDO.getInOrderNumber())); + // 查询未删除的记录,用于正常的更新逻辑 + List inMaterialDetailDbList = inMaterialDetailDbAllList.stream() + .filter(item -> item.getDelFlag() != null && item.getDelFlag() == 1) + .collect(Collectors.toList()); + Map materialDetailMap = inMaterialDetailDbList.stream().collect(Collectors.toMap(ExecutionInMaterialDetail::getMaterialDetailId, Function.identity())); + // 查询已删除的记录,用于恢复逻辑 + Map materialDetailDeletedMap = inMaterialDetailDbAllList.stream() + .filter(item -> item.getDelFlag() != null && item.getDelFlag() == 2) + .collect(Collectors.toMap(ExecutionInMaterialDetail::getMaterialDetailId, Function.identity())); + //批量新增或修改物料信息 + List inMaterialDetailList = new ArrayList<>(); + //需要修改的物流明细 + List materialDetailIdsByUpdate = new ArrayList<>(); + for (ExecutionInMaterialDetailDO inMaterialDetailDO : inMaterialDetailDOList){ + //判断是否需要修改 + ExecutionInMaterialDetail inMaterialDetail = null; + if (inMaterialDetailDO.getMaterialDetailId() != null) { + // 先查找未删除的记录 + inMaterialDetail = materialDetailMap.get(inMaterialDetailDO.getMaterialDetailId()); + // 如果未删除的记录中找不到,检查是否在已删除的记录中 + if (inMaterialDetail == null) { + ExecutionInMaterialDetail deletedDetail = materialDetailDeletedMap.get(inMaterialDetailDO.getMaterialDetailId()); + if (deletedDetail != null) { + // 恢复已删除的记录 + inMaterialDetail = deletedDetail; + inMaterialDetail.setDelFlag(1); // 恢复记录 + } + } + } + if (inMaterialDetail == null){ + // 新增明细:清空 materialDetailId,让数据库自动生成 + inMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(inMaterialDetailDO, inMaterialDetail); + inMaterialDetail.setMaterialDetailId(null); // 清空ID,确保新增 + inMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); + inMaterialDetail.setInOrderNumber(inMaterialDetailBaseDO.getInOrderNumber()); + inMaterialDetail.setOrganizationId(inMaterialDetailBaseDO.getOrganizationId()); + inMaterialDetail.setOrganizationName(inMaterialDetailBaseDO.getOrganizationName()); + inMaterialDetail.setTopOrganizationId(inMaterialDetailBaseDO.getTopOrganizationId()); + inMaterialDetail.setDelFlag(1); // 确保新增记录的delFlag为1 + }else { + BeanUtils.copyProperties(inMaterialDetailDO, inMaterialDetail); + inMaterialDetail.setUpdateBy(loginUser.getUserid()); + inMaterialDetail.setUpdateByName(userRealName); + inMaterialDetail.setUpdateTime(new Date()); + materialDetailIdsByUpdate.add(inMaterialDetailDO.getMaterialDetailId()); + } + inMaterialDetailList.add(inMaterialDetail); + } + //需修改的物料明细id集合不为空 + if (!CollectionUtils.isEmpty(inMaterialDetailDbList) && !CollectionUtils.isEmpty(materialDetailIdsByUpdate)){ + List materialDetailIdsByDb = inMaterialDetailDbList.stream().map(ExecutionInMaterialDetail::getMaterialDetailId).collect(Collectors.toList()); + //过滤需要修改的id集合 + materialDetailIdsByDb.removeAll(materialDetailIdsByUpdate); + //判断是否存在需要删除的物流明细 标记删除 + if (!CollectionUtils.isEmpty(materialDetailIdsByDb)){ + update(new UpdateWrapper().lambda() + .set(ExecutionInMaterialDetail::getDelFlag, 2) + .set(ExecutionInMaterialDetail::getUpdateBy, loginUser.getUserid()) + .set(ExecutionInMaterialDetail::getUpdateByName, userRealName) + .set(ExecutionInMaterialDetail::getUpdateTime, new Date()) + .in(ExecutionInMaterialDetail::getMaterialDetailId, materialDetailIdsByDb)); + } + } + //保存物料明细信息 + return saveOrUpdateBatch(inMaterialDetailList); + } + + /** + * 批量删除物料明细 + */ + @Override + public Boolean delete(Long[] materialDetailIds ) { + List list = new ArrayList<>(); + for (Long id : materialDetailIds) { + ExecutionInMaterialDetail inMaterialDetail = new ExecutionInMaterialDetail(); + inMaterialDetail.setMaterialDetailId(id); + inMaterialDetail.setDelFlag(2); + list.add(inMaterialDetail); + } + return this.updateBatchById(list); + } + + /** + * 修改物料明细 + */ + @Override + public ExecutionInMaterialDetailPO getInfo(Long materialDetailId) { + ExecutionInMaterialDetail inMaterialDetail = this.getById(materialDetailId); + ExecutionInMaterialDetailPO inMaterialDetailPO = new ExecutionInMaterialDetailPO(); + BeanUtils.copyProperties(inMaterialDetail, inMaterialDetailPO); + return inMaterialDetailPO; + } + + @Override + public List getkctzjl(Long materialBaseInfoId, String orderNumber, String adjustType) { + return inMaterialDetailMapper.getkctzjl(materialBaseInfoId, orderNumber, adjustType); + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailPO.java new file mode 100644 index 000000000..6a1a637c4 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailPO.java @@ -0,0 +1,498 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderBasePO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +import java.util.List; + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +@ApiModel(value = "物料明细对象", description = "物料明细响应对象") +public class ExecutionInMaterialDetailPO extends ExecutionStockInOrderBasePO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("收货数量") + @Excel(name = "收货数量") + private BigDecimal receiptQuantity; + + @ApiModelProperty("上架数量") + @Excel(name = "上架数量") + private BigDecimal shelvesQuantity; + + @ApiModelProperty("作业数量(例如:收货数量 上架数量)") + @Excel(name = "作业数量(例如:收货数量 上架数量)") + private BigDecimal actualQuantity; + + @ApiModelProperty("收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + @Excel(name = "收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + private Integer receiptStatus; + + @ApiModelProperty("上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + @Excel(name = "上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + private Integer shelvesStatus; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("是否质检管理: 1-是 2-否") + @Excel(name = "是否质检管理: 1-是 2-否") + private Integer qualityInspectionManage; + + @ApiModelProperty("质检阶段: 1-收货前 2-收货后上架前") + @Excel(name = "质检阶段: 1-收货前 2-收货后上架前") + private Integer qualityInspectionStage; + + @ApiModelProperty("质检规则: 1-全检 2-抽检 ") + @Excel(name = "质检规则: 1-全检 2-抽检 ") + private Integer qualityInspectionRule; + + @ApiModelProperty("抽检比例") + @Excel(name = "抽检比例") + private BigDecimal qualityInspectionRatio; + + @ApiModelProperty("质检项: 1-包装 2-纯度") + @Excel(name = "质检项: 1-包装 2-纯度") + private Integer qualityInspectionTerm; + + @ApiModelProperty("质检结果: 1-正常 2-异常") + @Excel(name = "质检结果: 1-正常 2-异常") + private Integer qualityInspectionResults; + + @ApiModelProperty("是否允许超收: 1-是 2-否") + @Excel(name = "是否允许超收: 1-是 2-否") + private Integer allowOvercharge; + + @ApiModelProperty("超收比例") + @Excel(name = "超收比例") + private BigDecimal overchargeRatio; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("分配规则id") + @Excel(name = "分配规则id") + private Long distributeRuleId; + + @ApiModelProperty("分配规则编码") + @Excel(name = "分配规则编码") + private String distributeRuleCode; + + @ApiModelProperty("分配规则名称") + @Excel(name = "分配规则名称") + private String distributeRuleName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("上架仓库id") + private Long warehouseId; + + @ApiModelProperty("上架仓库编码") + @Excel(name = "上架仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("上架库区id") + @Excel(name = "上架库区id") + private Long storageSectionId; + + @ApiModelProperty("上架库区编码") + @Excel(name = "上架库区编码") + private String storageCode; + + @ApiModelProperty("上架库区名称") + @Excel(name = "上架库区名称") + private String storageName; + + @ApiModelProperty("上架库位id") + @Excel(name = "上架库位id") + private Long storageLocationId; + + @ApiModelProperty("上架库位编码") + @Excel(name = "上架库位编码") + private String storageLocationCode; + + @ApiModelProperty("上架库位名称") + @Excel(name = "上架库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + @JsonSerialize(using = ToStringSerializer.class) + private Long parentUniqueId; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("未收货数量") + @Excel(name = "未收货数量") + private BigDecimal waitReceiptQuantity; + + @ApiModelProperty("未上架数量") + @Excel(name = "未上架数量") + private BigDecimal waitShelvesQuantity; + + @ApiModelProperty("物料明细") + private List children; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + // ========== 报关相关明细字段 ========== + @ApiModelProperty("规格型号") + @Excel(name = "规格型号/ITEM") + private String specificationModel; + + @ApiModelProperty("SKU码") + @Excel(name = "SKU码") + private String skuCode; + + @ApiModelProperty("Invoice No.") + @Excel(name = "Invoice No.") + private String invoiceNo; + + @ApiModelProperty("升") + @Excel(name = "升") + private BigDecimal liter; + + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String dimensions; + + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declarationUnit; + + @ApiModelProperty("Batch Ref NO's") + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @ApiModelProperty("Sheet Ref NO's") + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String originCountry; + + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declaredQuantity; + + @ApiModelProperty("箱数") + @Excel(name = "箱数") + private BigDecimal boxCount; + + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("入库数量") + @Excel(name = "入库数量") + private BigDecimal inboundQuantity; + + @ApiModelProperty("总净重(KG)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + @ApiModelProperty("总毛重(KG)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + @ApiModelProperty("总体积(CBM)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("总面积(SQM)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal totalPrice; + + @ApiModelProperty("生产日期") + @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date productionDate; + + @ApiModelProperty("过期日期") + @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date expiryDate; + + @ApiModelProperty("存货日期") + @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date inventoryDate; + + @ApiModelProperty("扩展属性1") + @Excel(name = "扩展属性1") + private String extAttr1; + + @ApiModelProperty("扩展属性2") + @Excel(name = "扩展属性2") + private String extAttr2; + + @ApiModelProperty("扩展属性3") + @Excel(name = "扩展属性3") + private String extAttr3; + + @ApiModelProperty("扩展属性4") + @Excel(name = "扩展属性4") + private String extAttr4; + + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + @ApiModelProperty(value = "饮用时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + private Date drinkDate; + private String lotNumber; + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; + private String khdm; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailBaseDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailBaseDO.java new file mode 100644 index 000000000..373eebf98 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailBaseDO.java @@ -0,0 +1,42 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.todo; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ZhouGY + * @title StockBaseDO + * @description: TODO + * @date 2024/5/23 20:30 + **/ +@Data +public class ExecutionInMaterialDetailBaseDO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("收货单号") + @Excel(name = "收货单号") + private String receiptOrderNumber; + + @ApiModelProperty("上架单号") + @Excel(name = "上架单号") + private String shelfOrderNumber; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailDO.java new file mode 100644 index 000000000..1ac1b43e9 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailDO.java @@ -0,0 +1,463 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +//import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ExecutionStockInOrderBaseDO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderBaseDO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionInMaterialDetailDO extends ExecutionStockInOrderBaseDO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("收货数量") + @Excel(name = "收货数量") + private BigDecimal receiptQuantity; + + @ApiModelProperty("上架数量") + @Excel(name = "上架数量") + private BigDecimal shelvesQuantity; + + @ApiModelProperty("作业数量(例如:收货数量 上架数量)") + @Excel(name = "作业数量(例如:收货数量 上架数量)") + private BigDecimal actualQuantity; + + @ApiModelProperty("收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + @Excel(name = "收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + private Integer receiptStatus; + + @ApiModelProperty("上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + @Excel(name = "上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + private Integer shelvesStatus; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("是否质检管理: 1-是 2-否") + @Excel(name = "是否质检管理: 1-是 2-否") + private Integer qualityInspectionManage; + + @ApiModelProperty("质检阶段: 1-收货前 2-收货后上架前") + @Excel(name = "质检阶段: 1-收货前 2-收货后上架前") + private Integer qualityInspectionStage; + + @ApiModelProperty("质检规则: 1-全检 2-抽检 ") + @Excel(name = "质检规则: 1-全检 2-抽检 ") + private Integer qualityInspectionRule; + + @ApiModelProperty("抽检比例") + @Excel(name = "抽检比例") + private BigDecimal qualityInspectionRatio; + + @ApiModelProperty("质检项: 1-包装 2-纯度") + @Excel(name = "质检项: 1-包装 2-纯度") + private Integer qualityInspectionTerm; + + @ApiModelProperty("质检结果: 1-正常 2-异常") + @Excel(name = "质检结果: 1-正常 2-异常") + private Integer qualityInspectionResults; + + @ApiModelProperty("是否允许超收: 1-是 2-否") + @Excel(name = "是否允许超收: 1-是 2-否") + private Integer allowOvercharge; + + @ApiModelProperty("超收比例") + @Excel(name = "超收比例") + private BigDecimal overchargeRatio; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("分配规则id") + @Excel(name = "分配规则id") + private Long distributeRuleId; + + @ApiModelProperty("分配规则编码") + @Excel(name = "分配规则编码") + private String distributeRuleCode; + + @ApiModelProperty("分配规则名称") + @Excel(name = "分配规则名称") + private String distributeRuleName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("上架仓库id") + private Long warehouseId; + + @ApiModelProperty("上架仓库编码") + @Excel(name = "上架仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("上架库区id") + @Excel(name = "上架库区id") + private Long storageSectionId; + + @ApiModelProperty("上架库区编码") + @Excel(name = "上架库区编码") + private String storageCode; + + @ApiModelProperty("上架库区名称") + @Excel(name = "上架库区名称") + private String storageName; + + @ApiModelProperty("上架库位id") + @Excel(name = "上架库位id") + private Long storageLocationId; + + @ApiModelProperty("上架库位编码") + @Excel(name = "上架库位编码") + private String storageLocationCode; + + @ApiModelProperty("上架库位名称") + @Excel(name = "上架库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + private Long parentUniqueId; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("物料明细子集") + private List children; + +// @ApiModelProperty("更多属性") +// private List materialMoreDetailList; + +// @ApiModelProperty("序列号") +// private List materialDetailSerialNumberList; + + @ApiModelProperty("入库单号集合") + @Excel(name = "入库单号集合") + private List inOrderNumberList; + + // ========== 报关相关明细字段 ========== + @ApiModelProperty("规格型号(选择物料后自动带出,不可编辑)") + @Excel(name = "规格型号/ITEM") + private String specificationModel; + + @ApiModelProperty("SKU码(选择物料后自动带出,不可编辑)") + @Excel(name = "SKU码") + private String skuCode; + + @ApiModelProperty("Invoice No.") + @Excel(name = "Invoice No.") + private String invoiceNo; + + @ApiModelProperty("升(输入大于等于0的数字,可以为小数)") + @Excel(name = "升") + private BigDecimal liter; + + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String dimensions; + + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declarationUnit; + + @ApiModelProperty("Batch Ref NO's") + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @ApiModelProperty("Sheet Ref NO's") + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String originCountry; + + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + @ApiModelProperty("单位(数据字典下拉选择框)") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("申报数量(输入大于等于0的数字,可以为小数)") + @Excel(name = "申报数量") + private BigDecimal declaredQuantity; + + @ApiModelProperty("箱数(输入大于等于0的数字,可以为小数)") + @Excel(name = "箱数") + private BigDecimal boxCount; + + @ApiModelProperty("件数(输入大于等于0的数字,可以为小数)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("入库数量(输入大于等于0的数字,可以为小数)") + @Excel(name = "ruku数量") + private BigDecimal inboundQuantity; + + @ApiModelProperty("总净重(KG)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + @ApiModelProperty("总毛重(KG)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + @ApiModelProperty("总体积(CBM)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("总面积(SQM)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + + @ApiModelProperty("总价(输入大于等于0的数字,可以为小数)") + @Excel(name = "总价") + private BigDecimal totalPrice; + + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + + @ApiModelProperty(value = "饮用时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + private Date drinkDate; + private String expiryDate; + private String productionDate; + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailDTO.java new file mode 100644 index 000000000..f839deffe --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailDTO.java @@ -0,0 +1,469 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionInMaterialDetailDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("物料库存id") + @Excel(name = "物料库存id") + private Long materialInventoryId; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("收货数量") + @Excel(name = "收货数量") + private BigDecimal receiptQuantity; + + @ApiModelProperty("上架数量") + @Excel(name = "上架数量") + private BigDecimal shelvesQuantity; + + @ApiModelProperty("作业数量(例如:收货数量 上架数量)") + @Excel(name = "作业数量(例如:收货数量 上架数量)") + private BigDecimal actualQuantity; + + @ApiModelProperty("收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + @Excel(name = "收货状态: 1-待收货 2-收货中 3-已收货 4-已收货(少收) 5-已收货(超收)") + private Integer receiptStatus; + + @ApiModelProperty("上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + @Excel(name = "上架状态: 1-待上架 2-上架中 3-已上架 4-已上架(少上) 5-已上架(超上)") + private Integer shelvesStatus; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("是否质检管理: 1-是 2-否") + @Excel(name = "是否质检管理: 1-是 2-否") + private Integer qualityInspectionManage; + + @ApiModelProperty("质检阶段: 1-收货前 2-收货后上架前") + @Excel(name = "质检阶段: 1-收货前 2-收货后上架前") + private Integer qualityInspectionStage; + + @ApiModelProperty("质检规则: 1-全检 2-抽检 ") + @Excel(name = "质检规则: 1-全检 2-抽检 ") + private Integer qualityInspectionRule; + + @ApiModelProperty("抽检比例") + @Excel(name = "抽检比例") + private BigDecimal qualityInspectionRatio; + + @ApiModelProperty("质检项: 1-包装 2-纯度") + @Excel(name = "质检项: 1-包装 2-纯度") + private Integer qualityInspectionTerm; + + @ApiModelProperty("质检结果: 1-正常 2-异常") + @Excel(name = "质检结果: 1-正常 2-异常") + private Integer qualityInspectionResults; + + @ApiModelProperty("是否允许超收: 1-是 2-否") + @Excel(name = "是否允许超收: 1-是 2-否") + private Integer allowOvercharge; + + @ApiModelProperty("超收比例") + @Excel(name = "超收比例") + private BigDecimal overchargeRatio; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("分配规则id") + @Excel(name = "分配规则id") + private Long distributeRuleId; + + @ApiModelProperty("分配规则编码") + @Excel(name = "分配规则编码") + private String distributeRuleCode; + + @ApiModelProperty("分配规则名称") + @Excel(name = "分配规则名称") + private String distributeRuleName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("上架仓库id") + private Long warehouseId; + + @ApiModelProperty("上架仓库编码") + @Excel(name = "上架仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("上架库区id") + @Excel(name = "上架库区id") + private Long storageSectionId; + + @ApiModelProperty("上架库区编码") + @Excel(name = "上架库区编码") + private String storageCode; + + @ApiModelProperty("上架库区名称") + @Excel(name = "上架库区名称") + private String storageName; + + @ApiModelProperty("上架库位id") + @Excel(name = "上架库位id") + private Long storageLocationId; + + @ApiModelProperty("上架库位编码") + @Excel(name = "上架库位编码") + private String storageLocationCode; + + @ApiModelProperty("上架库位名称") + @Excel(name = "上架库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + @JsonSerialize(using = ToStringSerializer.class) + private Long parentUniqueId; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + +// @ApiModelProperty("更多属性") +// private List materialMoreDetailList; + +// @ApiModelProperty("序列号") +// private List materialDetailSerialNumberList; + + @ApiModelProperty("入库单号集合") + @Excel(name = "入库单号集合") + private List inOrderNumberList; + + @ApiModelProperty("是否是差异单") + private Integer isDifferentType; + + // ========== 报关相关明细字段 ========== + @ApiModelProperty("规格型号(选择物料后自动带出,不可编辑)") + @Excel(name = "规格型号/ITEM") + private String specificationModel; + + @ApiModelProperty("SKU码(选择物料后自动带出,不可编辑)") + @Excel(name = "SKU码") + private String skuCode; + + @ApiModelProperty("Invoice No.") + @Excel(name = "Invoice No.") + private String invoiceNo; + + @ApiModelProperty("升(输入大于等于0的数字,可以为小数)") + @Excel(name = "升") + private BigDecimal liter; + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String dimensions; + + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declarationUnit; + + @ApiModelProperty("Batch Ref NO's") + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @ApiModelProperty("Sheet Ref NO's") + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String originCountry; + + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + @ApiModelProperty("单位(数据字典下拉选择框)") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("申报数量(输入大于等于0的数字,可以为小数)") + @Excel(name = "申报数量") + private BigDecimal declaredQuantity; + + @ApiModelProperty("箱数(输入大于等于0的数字,可以为小数)") + @Excel(name = "箱数") + private BigDecimal boxCount; + + @ApiModelProperty("件数(输入大于等于0的数字,可以为小数)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("入库数量(输入大于等于0的数字,可以为小数)") + @Excel(name = "入库数量") + private BigDecimal inboundQuantity; + + @ApiModelProperty("出库数量(输入大于等于0的数字,可以为小数)") + @Excel(name = "出库数量") + private BigDecimal outboundQuantity; + + @ApiModelProperty("总净重(KG)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + @ApiModelProperty("总毛重(KG)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + @ApiModelProperty("总体积(CBM)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("总面积(SQM)(输入大于等于0的数字,可以为小数)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + + @ApiModelProperty("总价(输入大于等于0的数字,可以为小数)") + @Excel(name = "总价") + private BigDecimal totalPrice; + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + + @ApiModelProperty(value = "饮用时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + private Date drinkDate; + private String expiryDate; + private String productionDate; + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/InventoryAdjustmentRecordPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/InventoryAdjustmentRecordPO.java new file mode 100644 index 000000000..3a199fc7d --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/InventoryAdjustmentRecordPO.java @@ -0,0 +1,254 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 库存调整记录对象 inventory_adjustment_record + * + * @author gen + * @date 2024-07-17 + */ + +@Data +@ApiModel(value = "库存调整记录对象", description = "库存调整记录响应对象") +public class InventoryAdjustmentRecordPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("库存调整记录id") + private Long inventoryAdjustmentId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("物料库存id") + private Long materialInventoryId; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("库区id") + @Excel(name = "库区id") + private Long storageSectionId; + + @ApiModelProperty("库区编码") + @Excel(name = "库区编码") + private String storageCode; + + @ApiModelProperty("库区名称") + @Excel(name = "库区名称") + private String storageName; + + @ApiModelProperty("库位id") + @Excel(name = "库位id") + private Long storageLocationId; + + @ApiModelProperty("库位编码") + @Excel(name = "库位编码") + private String storageLocationCode; + + @ApiModelProperty("库位名称") + @Excel(name = "库位名称") + private String storageLocationName; + + @ApiModelProperty("调整类型:0:无状态 1:数量调整 :2:状态调整 3:库存冻结") + @Excel(name = "调整类型:0:无状态 1:数量调整 :2:状态调整 3:库存冻结") + private Long adjustType; + + @ApiModelProperty("调整方向:0:无状态 1:增库存 2:减库存") + @Excel(name = "调整方向:0:无状态 1:增库存 2:减库存") + private Long adjustDirection; + + @ApiModelProperty("调整前状态编码") + @Excel(name = "调整前状态编码") + private String adjustBeforeStatusCode; + + @ApiModelProperty("调整前状态名称") + @Excel(name = "调整前状态名称") + private String adjustBeforeStatusName; + + @ApiModelProperty("调整后状态编码") + @Excel(name = "调整后状态编码") + private String adjustAfterStatusCode; + + @ApiModelProperty("调整后状态名称") + @Excel(name = "调整后状态名称") + private String adjustAfterStatusName; + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + @ApiModelProperty("Batch Ref NO's") + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @ApiModelProperty("Sheet Ref NO's") + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + @ApiModelProperty("扩展字段1") + @Excel(name = "扩展字段1") + private String extAttr1; + + @ApiModelProperty("扩展字段2") + @Excel(name = "扩展字段2") + private String extAttr2; + + @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 productionDate; + + @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 expiryDate; + + @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 inventoryDate; + + @ApiModelProperty("ExtAttr3") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date extAttr3; + + @ApiModelProperty("ExtAttr4") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date extAttr4; +// +// @ApiModelProperty("物料更多属性列表(批次属性)") +// private List materialMoreDetailList; + + @ApiModelProperty("调整动作") + @Excel(name = "调整动作") + private String adjustAction; + + @ApiModelProperty("关联单号") + @Excel(name = "关联单号") + private String relateNo; + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("LOT编号") + @Excel(name = "LOT编号") +// private String LotNumber; + private String lotNumber; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java new file mode 100644 index 000000000..df2f48055 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java @@ -0,0 +1,140 @@ +package com.mhd.oms.domain.executionInMaterialDetail.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + + +/** + * 越库管理对象 over_stock + * + * @author gen + * @date 2024-07-23 + */ + +@Data +public class QueryOrderOverStockDO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String inOrderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String inOrderTypeName; + + @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 inOrderExpectStartTime; + + @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 inOrderExpectEndTime; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String outOrderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String outOrderTypeName; + + @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 outOrderExpectStartTime; + + @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 outOrderExpectEndTime; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private List shipperIdList; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private List materialBaseInfoIdList; + + @ApiModelProperty("入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer inStatus; + + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + private Integer outStatus; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java new file mode 100644 index 000000000..96a9749d3 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java @@ -0,0 +1,72 @@ +package com.mhd.oms.domain.executionInMaterialDetail.service; + +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 物料明细ApplicationService + * + * @author gen + * @date 2024-05-21 + */ +@Service +@Slf4j +public class ExecutionInMaterialDetailApplicationService { + @Autowired + private ExecutionInMaterialDetailDomainService inMaterialDetailDomainService; + + + /** + * 分页查询物料明细列表 + */ + + public List queryList(ExecutionInMaterialDetailDO inMaterialDetailDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null){ + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1){ + inMaterialDetailDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } + } + return inMaterialDetailDomainService.queryList(inMaterialDetailDO); + } + + + /** + * 新增物料明细 + */ + public Boolean insert(ExecutionInMaterialDetailDO inMaterialDetailDO) { + + return inMaterialDetailDomainService.insert(inMaterialDetailDO); + } + + /** + * 修改物料明细 + */ + public Boolean update(ExecutionInMaterialDetailDO inMaterialDetailDO) { + return inMaterialDetailDomainService.update(inMaterialDetailDO); + } + + /** + * 批量删除物料明细 + */ + public boolean delete(Long[] materialDetailIds) { + return inMaterialDetailDomainService.delete(materialDetailIds); + } + + /** + * 获取物料明细详细信息 + */ + public ExecutionInMaterialDetailPO getInfo(Long materialDetailId) + { + return inMaterialDetailDomainService.getInfo(materialDetailId); + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailAssembler.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailAssembler.java new file mode 100644 index 000000000..cdd1ab53b --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailAssembler.java @@ -0,0 +1,65 @@ +package com.mhd.oms.domain.executionInMaterialDetail.service; + +import cn.hutool.core.util.ObjectUtil; +import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; +import com.mhd.common.core.exception.digitalLogisticsException.UserError; +import com.mhd.common.core.utils.IgnoreNullUtil; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDTO; +import com.mhd.system.api.model.LoginUser; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 物料明细Assembler + * + * @author gen + * @date 2024-05-21 + */ +@Component +public class ExecutionInMaterialDetailAssembler { + + /** + * 转换实体 + */ + public ExecutionInMaterialDetailDO toDO(ExecutionInMaterialDetailDTO inMaterialDetailDTO) { + ExecutionInMaterialDetailDO inMaterialDetailDO = new ExecutionInMaterialDetailDO(); + // 拷贝 + BeanUtils.copyProperties(inMaterialDetailDTO, inMaterialDetailDO, IgnoreNullUtil.getNullPropertyNames(inMaterialDetailDTO)); + return inMaterialDetailDO; + } + + /** + * 转换实体 + */ + public ExecutionInMaterialDetailDO toDOByEdit(ExecutionInMaterialDetailDTO inMaterialDetailDTO) { + ExecutionInMaterialDetailDO inMaterialDetailDO = new ExecutionInMaterialDetailDO(); + // 拷贝 + BeanUtils.copyProperties(inMaterialDetailDTO, inMaterialDetailDO, IgnoreNullUtil.getNullPropertyNames(inMaterialDetailDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + String userName = loginUser.getUsername(); + // 获取登录人id + Long userId = loginUser.getUserid(); + if(inMaterialDetailDTO.getMaterialDetailId() != null){ + inMaterialDetailDO.setUpdateBy(userId); + inMaterialDetailDO.setUpdateByName(userName); + inMaterialDetailDO.setUpdateTime(new Date()); + }else { + inMaterialDetailDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + inMaterialDetailDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + inMaterialDetailDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + inMaterialDetailDO.setCreateBy(userId); + inMaterialDetailDO.setCreateByName(userName); + inMaterialDetailDO.setCreateTime(new Date()); + inMaterialDetailDO.setDelFlag(1); + } + return inMaterialDetailDO; + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailDomainService.java new file mode 100644 index 000000000..7bc0a922b --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailDomainService.java @@ -0,0 +1,65 @@ +package com.mhd.oms.domain.executionInMaterialDetail.service; + +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 物料明细 + * + * @author gen + * @date 2024-05-21 + */ +@Service +@Slf4j +public class ExecutionInMaterialDetailDomainService { + + @Autowired + private IExecutionInMaterialDetailService materialDetailService; + + + /** + * 分页查询物料明细列表 + */ + public List queryList(ExecutionInMaterialDetailDO inMaterialDetailDO) { + return materialDetailService.queryList(inMaterialDetailDO); + } + + + /** + * 新增物料明细 + */ + public Boolean insert(ExecutionInMaterialDetailDO inMaterialDetailDO) { + + return materialDetailService.insert(inMaterialDetailDO); + } + + /** + * 修改物料明细 + */ + public Boolean update(ExecutionInMaterialDetailDO inMaterialDetailDO) { + return materialDetailService.update(inMaterialDetailDO); + } + + /** + * 批量删除物料明细 + */ + public Boolean delete(Long[] materialDetailIds) { + return materialDetailService.delete(materialDetailIds); + } + + /** + * 获取物料明细详细信息 + */ + public ExecutionInMaterialDetailPO getInfo(Long materialDetailId) + { + return materialDetailService.getInfo(materialDetailId); + } + + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/entity/ExecutionOutMaterialDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/entity/ExecutionOutMaterialDetail.java new file mode 100644 index 000000000..f5de4d62e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/entity/ExecutionOutMaterialDetail.java @@ -0,0 +1,521 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionOutMaterialDetail extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + @TableId(type = IdType.AUTO) + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("已分配数量") + @Excel(name = "已分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("本次分配数量") + @Excel(name = "本次分配数量") + @TableField(exist = false) + private BigDecimal nowAllocationQuantity; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("物料库存id") + @Excel(name = "物料库存id") + private Long materialInventoryId; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("分配仓库id") + private Long warehouseId; + + @ApiModelProperty("分配仓库编码") + @Excel(name = "分配仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("分配库区id") + @Excel(name = "分配库区id") + private Long storageSectionId; + + @ApiModelProperty("分配库区编码") + @Excel(name = "分配库区编码") + private String storageCode; + + @ApiModelProperty("分配库区名称") + @Excel(name = "分配库区名称") + private String storageName; + + @ApiModelProperty("分配库位id") + @Excel(name = "分配库位id") + private Long storageLocationId; + + @ApiModelProperty("分配库位编码") + @Excel(name = "分配库位编码") + private String storageLocationCode; + + @ApiModelProperty("分配库位名称") + @Excel(name = "分配库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + private Long parentUniqueId; + + @ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改") + @Excel(name = "是否允许修改: 1-是 2-否") + private Integer allowModify; + + @ApiModelProperty("是否生成拣货单: 1-是 2-否") + @Excel(name = "是否生成拣货单: 1-是 2-否") + private Integer genPickingOrder; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + + /** + * 商品名称 + */ + @ApiModelProperty("商品名称") + @Excel(name = "商品名称") + private String commodityName; + /** + * 商品编码 + */ + @ApiModelProperty("商品编码") + @Excel(name = "商品编码") + private String commodityNo; + /** + * 料号 + */ + @ApiModelProperty("料号") + @Excel(name = "料号") + private String materialNo; + /** + * 规格型号 + */ + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + /** + * 商品SKU码 + */ + @ApiModelProperty("商品SKU码") + @Excel(name = "商品SKU码") + private String skucode; + /** + * Invoice No + */ + @ApiModelProperty("Invoice No") + @Excel(name = "Invoice No") + private String invoiceNo; + /** + * 升 + */ + @ApiModelProperty("升") + @Excel(name = "升") + private String liter; + + /** + * 尺寸 + */ + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String size; + + /** + * 申报单位 + */ + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declareUnit; + + /** + * Batch Ref NO’s + */ + @ApiModelProperty("Batch Ref NO’s") + @Excel(name = "Batch Ref NO’s") + private String batchRefNo; + + /** + * Sheet Ref NO’s + */ + @ApiModelProperty("Sheet Ref NO’s") + @Excel(name = "Sheet Ref NO’s") + private String sheetRefNo; + + /** + * 原产国 + */ + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String countryOfOrigin; + + /** + * 箱号/卡板号 + */ + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + /** + * 币制 + */ + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + /** + * 申报数量 + */ + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declareQuantity; + + /** + * 箱数 + */ + @ApiModelProperty("箱数") + @Excel(name = "箱数") + private BigDecimal caseCount; + + /** + * 件数 + */ + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + /** + * 出库数量 + */ + @ApiModelProperty("出库数量") + @Excel(name = "出库数量") + private BigDecimal outboundQuantity; + + /** + * 总净重(KG) + */ + @ApiModelProperty("总净重(KG)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + /** + * 总毛重(KG) + */ + @ApiModelProperty("总毛重(KG)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + /** + * 总体积(CBM) + */ + @ApiModelProperty("总体积(CBM)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + /** + * 总面积(SQM) + */ + @ApiModelProperty("总面积(SQM)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + /** + * 总价 + */ + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal totalAmount; + + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + + /** + * 单位 + */ + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("扩展属性1") + @Excel(name = "扩展属性1") + @TableField("ext_attr_1") + private String extAttr1; + + @ApiModelProperty("扩展属性2") + @Excel(name = "扩展属性2") + @TableField("ext_attr_2") + private String extAttr2; + + @ApiModelProperty("生产日期") + @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date productionDate; + + @ApiModelProperty("过期日期") + @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expiryDate; + + @ApiModelProperty("存货日期") + @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date inventoryDate; + + @ApiModelProperty("扩展属性3") + @Excel(name = "扩展属性3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @TableField("ext_attr_3") + private Date extAttr3; + + @ApiModelProperty("扩展属性4") + @Excel(name = "扩展属性4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @TableField("ext_attr_4") + private Date extAttr4; + + /** + * 库存数量(仅用于前端展示,从material_inventory表中带出) + */ + @ApiModelProperty("分配时库存数量") + private BigDecimal inventoryQuantity; + + @TableField(exist = false) + private BigDecimal actualQuantity; + + @ApiModelProperty("复核总净重(KG)") + @Excel(name = "复核总净重(KG)") + private BigDecimal checkNetWeight; + + @ApiModelProperty("复核总毛重(KG)") + @Excel(name = "复核总毛重(KG)") + private BigDecimal checkGrossWeight; + + @ApiModelProperty("复核总体积(CBM)") + @Excel(name = "复核总体积(CBM)") + private BigDecimal checkVolume; + + @ApiModelProperty("复核总面积(SQM)") + @Excel(name = "复核总面积(SQM)") + private BigDecimal checkArea; + + @ApiModelProperty("是否已分配") + @Excel(name = "是否已分配") + private String isAllocated; + + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("库存单位") + @Excel(name = "库存单位") + private String stockUnit; + + @ApiModelProperty("库存数量") + @Excel(name = "库存数量") + private BigDecimal stockQuantity; + + + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; + private String inOrderNumberGw; + private String inLineNumGw; + private String opWhLocGw; + private String warehouseGw; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/facade/IExecutionOutMaterialDetailService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/facade/IExecutionOutMaterialDetailService.java new file mode 100644 index 000000000..78e1975b9 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/facade/IExecutionOutMaterialDetailService.java @@ -0,0 +1,65 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.executionOutMaterialDetail.entity.ExecutionOutMaterialDetail; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailBaseDO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.QueryOrderOverStockDO; + +import java.util.List; + +/** + * 物料明细Service接口 + * + * @author gen + * @date 2024-05-21 + */ +public interface IExecutionOutMaterialDetailService extends IService +{ + /** + * 分页查询物料明细列表 + */ + public List queryList(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * 关联出库单 查询物料明细列表 + */ + public List queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + + + + public List queryListChildren(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * 新增物料明细 + */ + public Boolean insert(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * 修改物料明细 + */ + public Boolean update(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * 新增物料明细 + */ + public Boolean batchInsert(String orderNumber, List outMaterialDetailDOList); + + /** + * 修改物料明细 + */ + public Boolean batchUpdate(List outMaterialDetailDOList, ExecutionOutMaterialDetailBaseDO outMaterialDetailBaseDO); + + + /** + * 批量删除物料明细 + */ + public Boolean delete(Long[] materialDetailIds); + + + /** + * 查询物料明细 + */ + public ExecutionOutMaterialDetailPO getInfo(Long materialDetailId); +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/mapper/ExecutionOutMaterialDetailMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/mapper/ExecutionOutMaterialDetailMapper.java new file mode 100644 index 000000000..8268d7b9e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/mapper/ExecutionOutMaterialDetailMapper.java @@ -0,0 +1,70 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.executionOutMaterialDetail.entity.ExecutionOutMaterialDetail; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.QueryOrderOverStockDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 物料明细Mapper接口 + * + * @author gen + * @date 2024-05-21 + */ +public interface ExecutionOutMaterialDetailMapper extends BaseMapper +{ + /** + * 查询物料明细列表 + */ + public List queryList(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * 关联出库单 查询物料明细列表 + */ + public List queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + + + /** + * @description 批量修改指定物料明细分配数量 + * @author ZhouGY + * @date 2024/6/7 14:29 + * @param outMaterialDetailDO + * @return int + */ + public int batchAddAllocationQuantityByIds(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * @description 批量修改指定物料明细拣货数量 + * @author ZhouGY + * @date 2024/6/7 14:29 + * @param outMaterialDetailDO + * @return int + */ + public int batchAddPickingQuantityByIds(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + /** + * @description 批量修改指定物料明细拣货数量 + * @author ZhouGY + * @date 2024/6/7 14:29 + * @param outMaterialDetailDO + * @return int + */ + public int batchAddPickingQuantityByUniqueIds(ExecutionOutMaterialDetailDO outMaterialDetailDO); + + public Long getKcId(@Param("lotNo") String lotNo); + + public String getLot(@Param("uniqueId") Long uniqueId); + + public Long getkcIdByUniqueId(@Param("uniqueId") Long uniqueId); + + public String getInOrderNumber(@Param("id") Long id); + public String getWarehouse(@Param("id") Long id); + public String getOpWhLoc(@Param("id") Long id); + public String getLotByKcId(@Param("id") Long id); + + public String getInLotNo(@Param("inOrderNumber") String inOrderNumber, @Param("baseId") Long baseId); +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/persistence/ExecutionOutMaterialDetailImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/persistence/ExecutionOutMaterialDetailImpl.java new file mode 100644 index 000000000..8d7e0babd --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/persistence/ExecutionOutMaterialDetailImpl.java @@ -0,0 +1,264 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.persistence; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.common.core.constant.SnowFlakeConstants; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.uuid.IdGenerator; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionOutMaterialDetail.entity.ExecutionOutMaterialDetail; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.facade.IExecutionOutMaterialDetailService; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.mapper.ExecutionOutMaterialDetailMapper; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailBaseDO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.QueryOrderOverStockDO; +//import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +//import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 物料明细Service业务层处理 + * + * @author gen + * @date 2024-05-21 + */ +@Service +public class ExecutionOutMaterialDetailImpl extends ServiceImpl implements IExecutionOutMaterialDetailService { + @Autowired + private ExecutionOutMaterialDetailMapper outMaterialDetailMapper; +// @Autowired +// private IExecutionOutMaterialDetailSerialNumberService outMaterialDetailSerialNumberService; + @Autowired + private IdGenerator idGenerator; + @Autowired + private ExecutionStockInOrderMapper reservationStockInOrderMapper; +// @Autowired +// private MaterialBaseInfoMapper materialBaseInfoMapper; + + + + /** + * 查询物料明细列表 + */ + @Override + public List queryList(ExecutionOutMaterialDetailDO outMaterialDetailDO) + { + return outMaterialDetailMapper.queryList(outMaterialDetailDO); + } + + /** + * 关联出库单 查询物料明细列表 + */ + @Override + public List queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailMapper.queryOutOrderList(queryOrderOverStockDO); + } + + /** + * 查询物料明细列表 + */ + @Override + public List queryListChildren(ExecutionOutMaterialDetailDO outMaterialDetailDO) + { + List outMaterialDetailPOList = outMaterialDetailMapper.queryList(outMaterialDetailDO); + // 获取查询的层级 + List outMaterialDetailParentList = outMaterialDetailPOList + .stream().filter(e -> 1 == e.getLevel()).collect(Collectors.toList()); + // 递归查询子集 + outMaterialDetailParentList.forEach(materialDetailPO -> materialDetailPO.setChildren(getChildren(materialDetailPO.getUniqueId(), outMaterialDetailPOList, 2))); + return outMaterialDetailParentList; + } + + private List getChildren(Long parentUniqueId, List materialDetailPOList, Integer maxLevel){ + List childrenCityList = materialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(childrenCityList)){ + childrenCityList.forEach(childrenCity -> { + if (childrenCity.getLevel() < maxLevel){ + childrenCity.setChildren(getChildren(childrenCity.getUniqueId(), materialDetailPOList, maxLevel)); + } + }); + } + return childrenCityList; + } + + /** + * 新增物料明细 + */ + @Override + public Boolean insert(ExecutionOutMaterialDetailDO outMaterialDetailDO) { + ExecutionOutMaterialDetail outMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail); + return this.save(outMaterialDetail); + } + + /** + * 修改物料明细 + */ + @Override + public Boolean update(ExecutionOutMaterialDetailDO outMaterialDetailDO) { + ExecutionOutMaterialDetail outMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail); + return this.updateById(outMaterialDetail); + } + + /** + * @description 批量新增物流明细 + * @author ZhouGY + * @date 2024/5/22 9:27 + * @param outOrderNumber + * @param outMaterialDetailDOList + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean batchInsert(String outOrderNumber, List outMaterialDetailDOList) { + if (CollectionUtils.isEmpty(outMaterialDetailDOList)) { + throw new ServiceException("物料明细不能为空"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 批量新增或修改 + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) + ? loginUser.getRealname() + : loginUser.getUsername(); + List outMaterialDetailList = new ArrayList<>(); + for (ExecutionOutMaterialDetailDO outMaterialDetailDO : outMaterialDetailDOList){ + ExecutionOutMaterialDetail outMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail); + outMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); + outMaterialDetail.setOutOrderNumber(outOrderNumber); + outMaterialDetail.setTopOrganizationId(loginUser.getUserPo().getOrganizationId()); + outMaterialDetail.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + outMaterialDetail.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + outMaterialDetail.setCreateBy(loginUser.getUserid()); + outMaterialDetail.setCreateByName(userRealName); + outMaterialDetail.setCreateTime(new Date()); + // 计划数量:接口常传 quantity;有 outboundQuantity 时与 quantity 对齐,否则用 quantity 回填 outbound + if (outMaterialDetail.getOutboundQuantity() != null) { + outMaterialDetail.setQuantity(outMaterialDetail.getOutboundQuantity()); + } else if (outMaterialDetail.getQuantity() != null) { + outMaterialDetail.setOutboundQuantity(outMaterialDetail.getQuantity()); + } + String materialNo = outMaterialDetail.getMaterialNo(); + List materialBaseInfos = reservationStockInOrderMapper.getMaterialBaseInfoList(materialNo); + //List materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper().lambda().eq(MaterialBaseInfo::getMaterialCode, materialNo)); + if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) { + outMaterialDetail.setCommodityName(materialBaseInfos.get(0).getMaterialName()); + outMaterialDetail.setBarCode(materialBaseInfos.get(0).getBarCode()); + outMaterialDetail.setPackName(materialBaseInfos.get(0).getPackName()); + outMaterialDetail.setPackCode(materialBaseInfos.get(0).getPackCode()); + outMaterialDetail.setUnitCode(materialBaseInfos.get(0).getUnitCode()); + outMaterialDetail.setUnitName(materialBaseInfos.get(0).getUnitName()); + } + outMaterialDetailList.add(outMaterialDetail); + } + return saveBatch(outMaterialDetailList); + } + + /** + * @description 批量修改物流明细 + * @author ZhouGY + * @date 2024/5/22 9:27 + * @param outMaterialDetailDOList + * @param outMaterialDetailBaseDO + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean batchUpdate(List outMaterialDetailDOList, ExecutionOutMaterialDetailBaseDO outMaterialDetailBaseDO) { + if (CollectionUtils.isEmpty(outMaterialDetailDOList)) { + throw new ServiceException("物料明细不能为空"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + + List outMaterialDetailDbList = outMaterialDetailMapper.selectList(new QueryWrapper().lambda().eq(ExecutionOutMaterialDetail::getOutOrderNumber, outMaterialDetailBaseDO.getOutOrderNumber())); + Map materialDetailMap = outMaterialDetailDbList.stream().collect(Collectors.toMap(ExecutionOutMaterialDetail::getMaterialDetailId, Function.identity())); + //批量新增或修改物料信息 + List outMaterialDetailList = new ArrayList<>(); + //需要修改的物流明细 + List materialDetailIdsByUpdate = new ArrayList<>(); + for (ExecutionOutMaterialDetailDO outMaterialDetailDO : outMaterialDetailDOList){ + //判断是否需要修改 + ExecutionOutMaterialDetail outMaterialDetail = materialDetailMap.get(outMaterialDetailDO.getMaterialDetailId()); + if (outMaterialDetail == null){ + outMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail); + outMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); + outMaterialDetail.setOutOrderNumber(outMaterialDetailBaseDO.getOutOrderNumber()); + outMaterialDetail.setOrganizationId(outMaterialDetailBaseDO.getOrganizationId()); + outMaterialDetail.setOrganizationName(outMaterialDetailBaseDO.getOrganizationName()); + outMaterialDetail.setTopOrganizationId(outMaterialDetailBaseDO.getTopOrganizationId()); + }else { + BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail); + outMaterialDetail.setUpdateBy(loginUser.getUserid()); + outMaterialDetail.setUpdateByName(loginUser.getUsername()); + outMaterialDetail.setUpdateTime(new Date()); + materialDetailIdsByUpdate.add(outMaterialDetailDO.getMaterialDetailId()); + } + outMaterialDetailList.add(outMaterialDetail); + } + //需修改的物料明细id集合不为空 + if (!CollectionUtils.isEmpty(materialDetailIdsByUpdate)){ + List materialDetailIdsByDb = outMaterialDetailDbList.stream().map(ExecutionOutMaterialDetail::getMaterialDetailId).collect(Collectors.toList()); + //过滤需要修改的id集合 + materialDetailIdsByDb.removeAll(materialDetailIdsByUpdate); + //判断是否存在需要删除的物流明细 标记删除 + if (!CollectionUtils.isEmpty(materialDetailIdsByDb)){ + update(new UpdateWrapper().lambda() + .set(ExecutionOutMaterialDetail::getDelFlag, 2) + .set(ExecutionOutMaterialDetail::getUpdateBy, loginUser.getUserid()) + .set(ExecutionOutMaterialDetail::getUpdateByName, loginUser.getUsername()) + .set(ExecutionOutMaterialDetail::getUpdateTime, new Date()) + .in(ExecutionOutMaterialDetail::getMaterialDetailId, materialDetailIdsByDb)); + } + } + //保存物料明细信息 + return saveOrUpdateBatch(outMaterialDetailList); + } + + + /** + * 批量删除物料明细 + */ + @Override + public Boolean delete(Long[] materialDetailIds ) { + List list = new ArrayList<>(); + for (Long id : materialDetailIds) { + ExecutionOutMaterialDetail outMaterialDetail = new ExecutionOutMaterialDetail(); + outMaterialDetail.setMaterialDetailId(id); + outMaterialDetail.setDelFlag(2); + list.add(outMaterialDetail); + } + return this.updateBatchById(list); + } + + /** + * 修改物料明细 + */ + @Override + public ExecutionOutMaterialDetailPO getInfo(Long materialDetailId) { + ExecutionOutMaterialDetail outMaterialDetail = this.getById(materialDetailId); + ExecutionOutMaterialDetailPO outMaterialDetailPO = new ExecutionOutMaterialDetailPO(); + BeanUtils.copyProperties(outMaterialDetail, outMaterialDetailPO); + return outMaterialDetailPO; + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailPO.java new file mode 100644 index 000000000..b25fa0b57 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailPO.java @@ -0,0 +1,607 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +//import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ExecutionStockOutOrderBaseDO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderBaseDO; +import com.mhd.system.api.domain.MaterialMoreDetailPO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +@ApiModel(value = "物料明细对象", description = "物料明细响应对象") +public class ExecutionOutMaterialDetailPO extends ExecutionStockOutOrderBaseDO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("已分配数量") + @Excel(name = "已分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + @ApiModelProperty("本次分配数量") + @Excel(name = "本次分配数量") + @TableField(exist = false) + private BigDecimal nowAllocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("待复核数量") + @Excel(name = "待复核数量") + private BigDecimal waitCheckQuantity; + + @ApiModelProperty("复核数量输入框字段,默认等于待复核数量") + @TableField(exist = false) + private BigDecimal actualQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("物料库存id") + @Excel(name = "物料库存id") + private Long materialInventoryId; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("库存数量(仅展示)") + private BigDecimal inventoryQuantity; + + @ApiModelProperty("分配仓库id") + private Long warehouseId; + + @ApiModelProperty("分配仓库编码") + @Excel(name = "分配仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("分配库区id") + @Excel(name = "分配库区id") + private Long storageSectionId; + + @ApiModelProperty("分配库区编码") + @Excel(name = "分配库区编码") + private String storageCode; + + @ApiModelProperty("分配库区名称") + @Excel(name = "分配库区名称") + private String storageName; + + @ApiModelProperty("分配库位id") + @Excel(name = "分配库位id") + private Long storageLocationId; + + @ApiModelProperty("分配库位编码") + @Excel(name = "分配库位编码") + private String storageLocationCode; + + @ApiModelProperty("分配库位名称") + @Excel(name = "分配库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + @JsonSerialize(using = ToStringSerializer.class) + private Long parentUniqueId; + + @ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改") + @Excel(name = "是否允许修改: 1-是 2-否") + private Integer allowModify; + + @ApiModelProperty("是否生成拣货单: 1-是 2-否") + @Excel(name = "是否生成拣货单: 1-是 2-否") + private Integer genPickingOrder; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("物料明细") + private List children; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + + /** + * 商品名称 + */ + @ApiModelProperty("商品名称") + @Excel(name = "商品名称") + private String commodityName; + /** + * 商品编码 + */ + @ApiModelProperty("商品编码") + @Excel(name = "商品编码") + private String commodityNo; + /** + * 料号 + */ + @ApiModelProperty("料号") + @Excel(name = "料号") + private String materialNo; + /** + * 规格型号 + */ + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + /** + * 商品SKU码 + */ + @ApiModelProperty("商品SKU码") + @Excel(name = "商品SKU码") + private String skucode; + /** + * Invoice No + */ + @ApiModelProperty("Invoice No") + @Excel(name = "Invoice No") + private String invoiceNo; + /** + * 升 + */ + @ApiModelProperty("升") + @Excel(name = "升") + private String liter; + + /** + * 尺寸 + */ + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String size; + + /** + * 申报单位 + */ + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declareUnit; + + /** + * Batch Ref NO’s + */ + @ApiModelProperty("Batch Ref NO’s") + @Excel(name = "Batch Ref NO’s") + private String batchRefNo; + + /** + * Sheet Ref NO’s + */ + @ApiModelProperty("Sheet Ref NO’s") + @Excel(name = "Sheet Ref NO’s") + private String sheetRefNo; + + /** + * 原产国 + */ + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String countryOfOrigin; + + /** + * 箱号/卡板号 + */ + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + /** + * 币制 + */ + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + /** + * 申报数量 + */ + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declareQuantity; + + /** + * 箱数 + */ + @ApiModelProperty("箱数") + @Excel(name = "箱数") + private BigDecimal caseCount; + + /** + * 件数 + */ + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + /** + * 出库数量 + */ + @ApiModelProperty("出库数量") + @Excel(name = "出库数量") + private BigDecimal outboundQuantity; + + /** + * 总净重(KG) + */ + @ApiModelProperty("总净重(KG)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + /** + * 总毛重(KG) + */ + @ApiModelProperty("总毛重(KG)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + /** + * 总体积(CBM) + */ + @ApiModelProperty("总体积(CBM)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + /** + * 总面积(SQM) + */ + @ApiModelProperty("总面积(SQM)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + /** + * 总价 + */ + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal totalAmount; + + /** + * 单位 + */ + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("扩展字段1") + @Excel(name = "扩展字段1") + private String extAttr1; + + @ApiModelProperty("扩展字段2") + @Excel(name = "扩展字段2") + private String extAttr2; + + @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 productionDate; + + @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 expiryDate; + + @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 inventoryDate; + + @ApiModelProperty("ExtAttr3") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date extAttr3; + + @ApiModelProperty("ExtAttr4") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date extAttr4; + + @ApiModelProperty("更多属性明细列表") + @TableField(exist = false) + private List materialMoreDetailList; + + @ApiModelProperty("分配按钮显示类型:1-显示库存分配,2-显示取消分配") + @TableField(exist = false) + private Integer allocationButtonType; + + @ApiModelProperty("复核总净重(KG)") + @Excel(name = "复核总净重(KG)") + private BigDecimal checkNetWeight; + + @ApiModelProperty("复核总毛重(KG)") + @Excel(name = "复核总毛重(KG)") + private BigDecimal checkGrossWeight; + + @ApiModelProperty("复核总体积(CBM)") + @Excel(name = "复核总体积(CBM)") + private BigDecimal checkVolume; + + @ApiModelProperty("复核总面积(SQM)") + @Excel(name = "复核总面积(SQM)") + private BigDecimal checkArea; + + @ApiModelProperty("是否已分配") + @Excel(name = "是否已分配") + private String isAllocated; + + + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("库存单位") + @Excel(name = "库存单位") + private String stockUnit; + + @ApiModelProperty("库存数量") + @Excel(name = "库存数量") + private BigDecimal stockQuantity; + + @ApiModelProperty("出库异常明细:计划数量(复核异常场景=拣货数量)") + @TableField(exist = false) + private BigDecimal abnormalPlanQuantity; + + @ApiModelProperty("出库异常明细:作业数量(复核异常场景=实际复核数量)") + @TableField(exist = false) + private BigDecimal abnormalWorkQuantity; + + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; + private String inOrderNumberGw; + private String inLineNumGw; + private String khdm; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/OutMaterialCheckPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/OutMaterialCheckPO.java new file mode 100644 index 000000000..0d94f94e8 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/OutMaterialCheckPO.java @@ -0,0 +1,42 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author ZhouGY + * @title OutMaterialCheckPO + * @description: 出库复审信息统计 + * @date 2024/5/31 10:33 + **/ +@Data +public class OutMaterialCheckPO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("物料数") + private Integer count; + + @ApiModelProperty("总重量") + @Excel(name = "总重量") + private BigDecimal weightLimit; + + @ApiModelProperty("总体积") + @Excel(name = "总体积") + private BigDecimal volumeLimit; + + @ApiModelProperty("数量EA") + private BigDecimal number; + + @ApiModelProperty("需扫描数") + private BigDecimal wantNumber; + + @ApiModelProperty("已扫描数") + private BigDecimal alreadyNumber; + + @ApiModelProperty("未扫描数") + private BigDecimal notHaveNumber; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailBaseDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailBaseDO.java new file mode 100644 index 000000000..e6acc167e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailBaseDO.java @@ -0,0 +1,34 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.todo; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ZhouGY + * @title StockBaseDO + * @description: TODO + * @date 2024/5/23 20:30 + **/ +@Data +public class ExecutionOutMaterialDetailBaseDO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailDO.java new file mode 100644 index 000000000..4dc63437c --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailDO.java @@ -0,0 +1,550 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.todo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionOutMaterialDetailDO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("已分配数量") + @Excel(name = "已分配数量") + private BigDecimal alreadyAllocationQuantity; + + + @ApiModelProperty("本次分配数量") + @Excel(name = "本次分配数量") + @TableField(exist = false) + private BigDecimal nowAllocationQuantity; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("物料库存id") + @Excel(name = "物料库存id") + private Long materialInventoryId; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("分配时库存数量(仅展示)") + private BigDecimal inventoryQuantity; + + @ApiModelProperty("分配仓库id") + private Long warehouseId; + + @ApiModelProperty("分配仓库编码") + @Excel(name = "分配仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("分配库区id") + @Excel(name = "分配库区id") + private Long storageSectionId; + + @ApiModelProperty("分配库区编码") + @Excel(name = "分配库区编码") + private String storageCode; + + @ApiModelProperty("分配库区名称") + @Excel(name = "分配库区名称") + private String storageName; + + @ApiModelProperty("分配库位id") + @Excel(name = "分配库位id") + private Long storageLocationId; + + @ApiModelProperty("分配库位编码") + @Excel(name = "分配库位编码") + private String storageLocationCode; + + @ApiModelProperty("分配库位名称") + @Excel(name = "分配库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + private Long parentUniqueId; + + @ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改") + @Excel(name = "是否允许修改: 1-是 2-否") + private Integer allowModify; + + @ApiModelProperty("是否生成拣货单: 1-是 2-否") + @Excel(name = "是否生成拣货单: 1-是 2-否") + private Integer genPickingOrder; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("物料明细子集") + private List children; + +// @ApiModelProperty("序列号") +// private List materialDetailSerialNumberList; + + @ApiModelProperty("出单号集合") + @Excel(name = "出单号集合") + private List outOrderNumberList; + + @ApiModelProperty("取消分配数量") + @Excel(name = "取消分配数量") + private BigDecimal cancelAllocationQuantity; + + @ApiModelProperty("订单物料明细id") + private List materialDetailIds; + + @ApiModelProperty("作业数量(例如:分配数量 拣货数量 复核数量)") + @Excel(name = "作业数量(例如:分配数量 拣货数量 复核数量)") + private BigDecimal actualQuantity; + + + + /** + * 商品名称 + */ + @ApiModelProperty("商品名称") + @Excel(name = "商品名称") + private String commodityName; + /** + * 商品编码 + */ + @ApiModelProperty("商品编码") + @Excel(name = "商品编码") + private String commodityNo; + /** + * 料号 + */ + @ApiModelProperty("料号") + @Excel(name = "料号") + private String materialNo; + /** + * 规格型号 + */ + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + /** + * 商品SKU码 + */ + @ApiModelProperty("商品SKU码") + @Excel(name = "商品SKU码") + private String skucode; + /** + * Invoice No + */ + @ApiModelProperty("Invoice No") + @Excel(name = "Invoice No") + private String invoiceNo; + /** + * 升 + */ + @ApiModelProperty("升") + @Excel(name = "升") + private String liter; + + /** + * 尺寸 + */ + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String size; + + /** + * 申报单位 + */ + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declareUnit; + + /** + * Batch Ref NO’s + */ + @ApiModelProperty("Batch Ref NO’s") + @Excel(name = "Batch Ref NO’s") + private String batchRefNo; + + /** + * Sheet Ref NO’s + */ + @ApiModelProperty("Sheet Ref NO’s") + @Excel(name = "Sheet Ref NO’s") + private String sheetRefNo; + + /** + * 原产国 + */ + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String countryOfOrigin; + + /** + * 箱号/卡板号 + */ + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + /** + * 币制 + */ + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + /** + * 申报数量 + */ + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declareQuantity; + + /** + * 箱数 + */ + @ApiModelProperty("箱数") + @Excel(name = "箱数") + private BigDecimal caseCount; + + /** + * 件数 + */ + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + /** + * 出库数量 + */ + @ApiModelProperty("出库数量") + @Excel(name = "出库数量") + private BigDecimal outboundQuantity; + + /** + * 总净重(KG) + */ + @ApiModelProperty("总净重(KG)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + /** + * 总毛重(KG) + */ + @ApiModelProperty("总毛重(KG)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + /** + * 总体积(CBM) + */ + @ApiModelProperty("总体积(CBM)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + /** + * 总面积(SQM) + */ + @ApiModelProperty("总面积(SQM)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + /** + * 总价 + */ + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal totalAmount; + + /** + * 单位 + */ + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("复核总净重(KG)") + @Excel(name = "复核总净重(KG)") + private BigDecimal checkNetWeight; + + @ApiModelProperty("复核总毛重(KG)") + @Excel(name = "复核总毛重(KG)") + private BigDecimal checkGrossWeight; + + @ApiModelProperty("复核总体积(CBM)") + @Excel(name = "复核总体积(CBM)") + private BigDecimal checkVolume; + + @ApiModelProperty("复核总面积(SQM)") + @Excel(name = "复核总面积(SQM)") + private BigDecimal checkArea; + + @ApiModelProperty("是否已分配") + @Excel(name = "是否已分配") + private String isAllocated; + + + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("库存单位") + @Excel(name = "库存单位") + private String stockUnit; + + @ApiModelProperty("库存数量") + @Excel(name = "库存数量") + private BigDecimal stockQuantity; + + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; + private String inOrderNumberGw; + private String inLineNumGw; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailDTO.java new file mode 100644 index 000000000..d1d01f74c --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailDTO.java @@ -0,0 +1,541 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.repository.todo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + + +/** + * 物料明细对象 material_detail + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionOutMaterialDetailDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单物料明细id") + private Long materialDetailId; + + @ApiModelProperty("业务唯一id") + @JsonSerialize(using = ToStringSerializer.class) + private Long uniqueId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + + @ApiModelProperty("已分配数量") + @Excel(name = "已分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("作业数量(例如:分配数量 拣货数量 复核数量 取消数量)") + @Excel(name = "作业数量(例如:分配数量 拣货数量 复核数量 取消数量)") + private BigDecimal actualQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装详情id") + @Excel(name = "包装详情id") + private Long packDetailId; + + @ApiModelProperty("单位代码:EA IP CS PL OT") + @Excel(name = "单位代码:EA IP CS PL OT") + private String unitCode; + + @ApiModelProperty("单位名称") + @Excel(name = "单位名称") + private String unitName; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("物料仓库控制信息id") + @Excel(name = "物料仓库控制信息id") + private Long materialWarehouseControlId; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("物料库存id") + @Excel(name = "物料库存id") + private Long materialInventoryId; + + @ApiModelProperty("批次号") + @Excel(name = "批次号") + private String batchNumber; + + @ApiModelProperty("物料状态编码") + @Excel(name = "物料状态编码") + private String materialStatusCode; + + @ApiModelProperty("物料状态名称") + @Excel(name = "物料状态名称") + private String materialStatusName; + + @ApiModelProperty("物料明细子集") + private List children; + + @ApiModelProperty("容器id") + @Excel(name = "容器id") + private Long containerId; + + @ApiModelProperty("容器编码") + @Excel(name = "容器编码") + private String containerCode; + + @ApiModelProperty("容器类型 数据字典") + @Excel(name = "容器类型 数据字典") + private String containerType; + + @ApiModelProperty("容器类型名称 数据字典") + @Excel(name = "容器类型名称 数据字典") + private String containerTypeName; + + @ApiModelProperty("库存数量(仅展示)") + private BigDecimal inventoryQuantity; + + @ApiModelProperty("分配仓库id") + private Long warehouseId; + + @ApiModelProperty("分配仓库编码") + @Excel(name = "分配仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("分配库区id") + @Excel(name = "分配库区id") + private Long storageSectionId; + + @ApiModelProperty("分配库区编码") + @Excel(name = "分配库区编码") + private String storageCode; + + @ApiModelProperty("分配库区名称") + @Excel(name = "分配库区名称") + private String storageName; + + @ApiModelProperty("分配库位id") + @Excel(name = "分配库位id") + private Long storageLocationId; + + @ApiModelProperty("分配库位编码") + @Excel(name = "分配库位编码") + private String storageLocationCode; + + @ApiModelProperty("分配库位名称") + @Excel(name = "分配库位名称") + private String storageLocationName; + + @ApiModelProperty("层级深度,从一级开始递增") + private Integer level; + + @ApiModelProperty("父级唯一Id") + @JsonSerialize(using = ToStringSerializer.class) + private Long parentUniqueId; + + @ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改") + @Excel(name = "是否允许修改: 1-是 2-否") + private Integer allowModify; + + @ApiModelProperty("是否生成拣货单: 1-是 2-否") + @Excel(name = "是否生成拣货单: 1-是 2-否") + private Integer genPickingOrder; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("物料明细子集") + private List materialDetailList; + +// @ApiModelProperty("序列号") +// private List materialDetailSerialNumberList; + + @ApiModelProperty("出单号集合") + @Excel(name = "出单号集合") + private List outOrderNumberList; + + @ApiModelProperty("取消分配数量") + @Excel(name = "取消分配数量") + private BigDecimal cancelAllocationQuantity; + + + /** + * 商品名称 + */ + @ApiModelProperty("商品名称") + @Excel(name = "商品名称") + private String commodityName; + /** + * 商品编码 + */ + @ApiModelProperty("商品编码") + @Excel(name = "商品编码") + private String commodityNo; + /** + * 料号 + */ + @ApiModelProperty("料号") + @Excel(name = "料号") + private String materialNo; + /** + * 规格型号 + */ + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + /** + * 商品SKU码 + */ + @ApiModelProperty("商品SKU码") + @Excel(name = "商品SKU码") + private String skucode; + /** + * Invoice No + */ + @ApiModelProperty("Invoice No") + @Excel(name = "Invoice No") + private String invoiceNo; + /** + * 升 + */ + @ApiModelProperty("升") + @Excel(name = "升") + private String liter; + + @ApiModelProperty("单价") + @Excel(name = "单价") + private BigDecimal unitPrice; + + /** + * 尺寸 + */ + @ApiModelProperty("尺寸") + @Excel(name = "尺寸") + private String size; + + /** + * 申报单位 + */ + @ApiModelProperty("申报单位") + @Excel(name = "申报单位") + private String declareUnit; + + /** + * Batch Ref NO’s + */ + @ApiModelProperty("Batch Ref NO’s") + @Excel(name = "Batch Ref NO’s") + private String batchRefNo; + + /** + * Sheet Ref NO’s + */ + @ApiModelProperty("Sheet Ref NO’s") + @Excel(name = "Sheet Ref NO’s") + private String sheetRefNo; + + /** + * 原产国 + */ + @ApiModelProperty("原产国") + @Excel(name = "原产国") + private String countryOfOrigin; + + /** + * 箱号/卡板号 + */ + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + /** + * 币制 + */ + @ApiModelProperty("币制") + @Excel(name = "币制") + private String currency; + + /** + * 申报数量 + */ + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declareQuantity; + + /** + * 箱数 + */ + @ApiModelProperty("箱数") + @Excel(name = "箱数") + private BigDecimal caseCount; + + /** + * 件数 + */ + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + /** + * 出库数量 + */ + @ApiModelProperty("出库数量") + @Excel(name = "出库数量") + private BigDecimal outboundQuantity; + + /** + * 总净重(KG) + */ + @ApiModelProperty("总净重(KG)") + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + /** + * 总毛重(KG) + */ + @ApiModelProperty("总毛重(KG)") + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + /** + * 总体积(CBM) + */ + @ApiModelProperty("总体积(CBM)") + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + /** + * 总面积(SQM) + */ + @ApiModelProperty("总面积(SQM)") + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + /** + * 总价 + */ + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal totalAmount; + + /** + * 单位 + */ + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + + @ApiModelProperty("复核总净重(KG)") + @Excel(name = "复核总净重(KG)") + private BigDecimal checkNetWeight; + + @ApiModelProperty("复核总毛重(KG)") + @Excel(name = "复核总毛重(KG)") + private BigDecimal checkGrossWeight; + + @ApiModelProperty("复核总体积(CBM)") + @Excel(name = "复核总体积(CBM)") + private BigDecimal checkVolume; + + @ApiModelProperty("复核总面积(SQM)") + @Excel(name = "复核总面积(SQM)") + private BigDecimal checkArea; + + @ApiModelProperty("合同收费") + @Excel(name = "合同收费") + private BigDecimal contractFee; + + @ApiModelProperty("每月仓租") + @Excel(name = "每月仓租") + private BigDecimal monthlyWarehouseFee; + + @ApiModelProperty("半月仓租") + @Excel(name = "半月仓租") + private BigDecimal halfMonthWhFee; + + @ApiModelProperty("折扣(%)") + @Excel(name = "折扣(%)") + private BigDecimal discountRate; + + @ApiModelProperty("单体积(CBM)") + @Excel(name = "单体积(CBM)") + private BigDecimal singleVolume; + + @ApiModelProperty("单毛重(KG)") + @Excel(name = "单毛重(KG)") + private BigDecimal singleGrossWeight; + + @ApiModelProperty("lot编号") + @Excel(name = "lot编号") + private String lotNo; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("库存单位") + @Excel(name = "库存单位") + private String stockUnit; + + @ApiModelProperty("库存数量") + @Excel(name = "库存数量") + private BigDecimal stockQuantity; + + + @ApiModelProperty("调整前库存数量") + @Excel(name = "调整前库存数量") + private BigDecimal inventoryBeforeQuantity; + + @ApiModelProperty("调整前可用数量") + @Excel(name = "调整前可用数量") + private BigDecimal allocationBeforeQuantity; + + @ApiModelProperty("调整前冻结数量") + @Excel(name = "调整前冻结数量") + private BigDecimal freezeBeforeQuantity; + + @ApiModelProperty("调整后库存数量") + @Excel(name = "调整后库存数量") + private BigDecimal inventoryAfterQuantity; + + @ApiModelProperty("调整后可用数量") + @Excel(name = "调整后可用数量") + private BigDecimal allocationAfterQuantity; + + @ApiModelProperty("调整后冻结数量") + @Excel(name = "调整后冻结数量") + private BigDecimal freezeAfterQuantity; + + + @ApiModelProperty("调整前净重(KG)") + @Excel(name = "调整前净重(KG)") + private BigDecimal netWeight; + + @ApiModelProperty("调整前毛重(KG)") + @Excel(name = "调整前毛重(KG)") + private BigDecimal grossWeight; + + @ApiModelProperty("调整前体积") + @Excel(name = "调整前体积") + private BigDecimal volume; + + @ApiModelProperty("调整前面积") + @Excel(name = "调整前面积") + private BigDecimal area; + + @ApiModelProperty("调整后净重(KG)") + @Excel(name = "调整后净重(KG)") + private BigDecimal adjustedNetWeight; + + @ApiModelProperty("调整后毛重(KG)") + @Excel(name = "调整后毛重(KG)") + private BigDecimal adjustedGrossWeight; + + @ApiModelProperty("调整后体积") + @Excel(name = "调整后体积") + private BigDecimal adjustedVolume; + + @ApiModelProperty("调整后面积") + @Excel(name = "调整后面积") + private BigDecimal adjustedArea; + //订单行号 + private String lineNumGw; + //物料规格 + private String specGw; + //计量单位 + private String unitGw; + //数量 + private BigDecimal qtyGw; + //企业币制 + private String erpCurrGw; + //企业单价 + private BigDecimal erpPriceGw; + //申报总价 + private BigDecimal amountGw; + private String inOrderNumberGw; + private String inLineNumGw; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/service/ExecutionOutMaterialDetailDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/service/ExecutionOutMaterialDetailDomainService.java new file mode 100644 index 000000000..c4c97c20d --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/service/ExecutionOutMaterialDetailDomainService.java @@ -0,0 +1,67 @@ +package com.mhd.oms.domain.executionOutMaterialDetail.service; + +//import com.mhd.wms.domain.outMaterialDetail.repository.facade.IExecutionOutMaterialDetailService; +//import com.mhd.wms.domain.outMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +//import com.mhd.wms.domain.outMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.facade.IExecutionOutMaterialDetailService; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 物料明细 + * + * @author gen + * @date 2024-05-21 + */ +@Service +@Slf4j +public class ExecutionOutMaterialDetailDomainService { + + @Autowired + private IExecutionOutMaterialDetailService outMaterialDetailService; + + + /** + * 分页查询物料明细列表 + */ + public List queryList(ExecutionOutMaterialDetailDO outMaterialDetailDO) { + return outMaterialDetailService.queryList(outMaterialDetailDO); + } + + + /** + * 新增物料明细 + */ + public Boolean insert(ExecutionOutMaterialDetailDO outMaterialDetailDO) { + + return outMaterialDetailService.insert(outMaterialDetailDO); + } + + /** + * 修改物料明细 + */ + public Boolean update(ExecutionOutMaterialDetailDO outMaterialDetailDO) { + return outMaterialDetailService.update(outMaterialDetailDO); + } + + /** + * 批量删除物料明细 + */ + public Boolean delete(Long[] materialDetailIds) { + return outMaterialDetailService.delete(materialDetailIds); + } + + /** + * 获取物料明细详细信息 + */ + public ExecutionOutMaterialDetailPO getInfo(Long materialDetailId) + { + return outMaterialDetailService.getInfo(materialDetailId); + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java new file mode 100644 index 000000000..bd785b871 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java @@ -0,0 +1,459 @@ +package com.mhd.oms.domain.executionStockInOrder.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 入库单对象 stock_in_order + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionStockInOrder extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入库单id") + @TableId(type = IdType.AUTO) + private Long inOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("入库业务单号") + @Excel(name = "入库业务单号") + private String businessInOrderNumber; + + @ApiModelProperty("入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 6-已取消 7-已关闭") + @Excel(name = "入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 6-已取消 7-已关闭") + private Integer status; + + @ApiModelProperty("入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("入库单审核备注") + @Excel(name = "入库单审核备注") + private String auditRemark; + + @ApiModelProperty("入库单审核人") + @Excel(name = "入库单审核人") + private Long auditBy; + + @ApiModelProperty("入库单审核人姓名") + @Excel(name = "入库单审核人姓名") + private String auditByName; + + @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 auditTime; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String pictureUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("入库数量") + @Excel(name = "入库数量") + private BigDecimal inQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @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 cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @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 closeTime; + + @ApiModelProperty("入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + @Excel(name = "入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + private Integer orderSource; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("调度单号") + private String mobilizeCode; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + // ========== 报关相关字段 ========== + @ApiModelProperty("To") + @Excel(name = "To") + @TableField(value = "\"TO\"") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleInfo; + + @ApiModelProperty("委托编号NO") + @Excel(name = "委托编号NO") + private String consignmentNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSignature; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declarationArea; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsBrokerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddress; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String originDestinationCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportMethod; + + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionMethod; + + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private Integer customsInspection; + + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private Integer needCustomsDeclaration; + + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private Integer needTransport; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("完成时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date completionTime; + + @ApiModelProperty("下单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "下单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date orderDate; + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + + @ApiModelProperty("订单状态") + @Excel(name = "订单状态") + private String orderStatus; + + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + + @ApiModelProperty("订单来源") + private String reservationOrderSource; + + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("入库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date storageTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + + @ApiModelProperty("运输业务单号") + private String businessNumber; + + @ApiModelProperty("是否免费夫力费费") + private String isFreeManpowerFee; + + @ApiModelProperty("折扣") + private BigDecimal discount; + + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + @ApiModelProperty("夫力费") + private BigDecimal manpowerFee; + + @ApiModelProperty("总仓租") + private BigDecimal totalWarehouseRent; + + @ApiModelProperty("业务计价类型") + private String businessChargeType; + + @ApiModelProperty("业务计价方式") + private String businessPriceWay; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java new file mode 100644 index 000000000..d5f32c3f8 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java @@ -0,0 +1,69 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderPO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.DeliveryDataDTO; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.StockInDataDTO; +//import com.mhd.oms.domain.reservationInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 入库单Service接口 + * + * @author gen + * @date 2024-05-21 + */ +public interface IExecutionStockInOrderService extends IService +{ + /** + * 分页查询入库单列表 + */ + public List queryList(ExecutionStockInOrderDO stockInOrderDO); + + /** + * 新增入库单 + */ + public Boolean insert(ExecutionStockInOrderDO stockInOrderDO); + + /** + * 修改入库单 + */ + public Boolean update(ExecutionStockInOrderDO stockInOrderDO); + + /** + * 批量删除入库单 + */ + public Boolean delete(Long[] inOrderIds); + + + /** + * 查询入库单 + */ + public ExecutionStockInOrderPO getInfo(Long inOrderId); + + List queryNoticePrint(ExecutionStockInOrderDO stockInOrderDO); + List queryNoticePrintDetail(ExecutionStockInOrderDO stockInOrderDTO); + + /** + * 解析Excel文件并获取出库数据 + * @param file Excel文件 + * @param sheetName 工作表名称(出库导入/参考数据) + * @return 出库数据DTO + * @throws Exception 解析异常 + */ + DeliveryDataDTO parseExcelFile(MultipartFile file, String sheetName) throws Exception; + + /** + * 解析入库单Excel文件 + * @param file Excel文件 + * @param sheetName 工作表名称(默认:入库模版) + * @return 入库单完整数据(表头+明细) + * @throws Exception 解析异常 + */ + StockInDataDTO parseStockInExcel(MultipartFile file, String sheetName) throws Exception; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/listener/DynamicDeliveryExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/listener/DynamicDeliveryExcelListener.java new file mode 100644 index 000000000..ef86471e4 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/listener/DynamicDeliveryExcelListener.java @@ -0,0 +1,513 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.CustomerDeliveryDetail; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.DeliveryHeader; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.ProductDetail; +import org.apache.commons.lang3.time.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.util.*; +import java.util.regex.Pattern; + +/** + * 维他奶出库Excel解析监听器(最终完整版) + * 核心功能: + * 1. 正确解析多单元格数据(解决发票张数/纪录合共读取错误) + * 2. 支持动态行数的货品明细/客户配送明细解析 + * 3. 自动处理文本型数字转换(String→Integer/BigDecimal) + * 4. 完整的异常处理和日志记录 + */ +public class DynamicDeliveryExcelListener extends AnalysisEventListener> { + // 日志实例 + private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDeliveryExcelListener.class); + + // ---------------------- 常量定义(便于维护) ---------------------- + // 正则表达式:匹配整数(支持正负数) + private static final Pattern INTEGER_PATTERN = Pattern.compile("-?\\d+"); + // 正则表达式:匹配小数(支持正负数和整数形式) + private static final Pattern DECIMAL_PATTERN = Pattern.compile("-?\\d+(\\.\\d+)?"); + // 关键字定义(Excel标签匹配) + private static final String KEYWORD_DELIVERY_DATE = "送貨日期"; + private static final String KEYWORD_PRODUCT_DETAIL = "货品明细"; + private static final String KEYWORD_TOTAL_RECORD = "紀錄合共"; + private static final String KEYWORD_CUSTOMER_DETAIL = "客户配送明细"; + private static final String KEYWORD_INVOICE_COUNT = "發票張數"; + private static final String KEYWORD_TOTAL_COUNT = "總計"; + private static final String KEYWORD_SUBTOTAL = "小計"; + // 支持的日期格式(String转Date) + private static final String[] SUPPORTED_DATE_FORMATS = {"yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "yyyy-MM-dd HH:mm:ss"}; + + // ---------------------- 数据存储(解析结果) ---------------------- + private DeliveryHeader deliveryHeader = new DeliveryHeader(); + private List productDetailList = new ArrayList<>(); + private List customerDeliveryDetailList = new ArrayList<>(); + + // ---------------------- 解析状态管理(动态切换) ---------------------- + public enum ParseStatus { + IDLE, // 空闲状态(未进入任何表格) + PRODUCT_DETAIL,// 货品明细解析状态 + CUSTOMER_DETAIL// 客户配送明细解析状态 + } + private ParseStatus currentStatus = ParseStatus.IDLE; + + // ---------------------- 核心解析方法(EasyExcel回调) ---------------------- + @Override + public void invoke(Map data, AnalysisContext context) { + try { + int rowNum = context.readRowHolder().getRowIndex() + 1; + LOGGER.debug("第{}行:开始解析,所有单元格数据:{}", rowNum, data); + + // 1. 获取第一列数据(用于状态判断,标签通常在第一列) + String firstCellValue = getFirstCellValue(data); + LOGGER.debug("第{}行:第一列数据(状态判断依据):{}", rowNum, firstCellValue); + + // 2. 状态切换判断(传递完整data,支持多单元格解析) + if (isStatusSwitchTrigger(firstCellValue)) { + switchStatus(firstCellValue, rowNum, data); + return; + } + + // 3. 根据当前状态解析对应表格数据 + switch (currentStatus) { + case PRODUCT_DETAIL: + if (isValidProductDetailRow(data, firstCellValue)) { + parseProductDetail(data, rowNum); + } + break; + case CUSTOMER_DETAIL: + if (isValidCustomerDetailRow(data, firstCellValue)) { + parseCustomerDeliveryDetail(data, rowNum); + } + break; + case IDLE: + // 空闲状态:解析表头信息(送货日期行,多单元格数据) + if (firstCellValue.contains(KEYWORD_DELIVERY_DATE)) { + parseHeaderInfo(data, rowNum); + } + break; + } + + } catch (ExcelDataConvertException e) { + // Excel内置转换异常(如日期格式错误) + int rowNum = context.readRowHolder().getRowIndex() + 1; + LOGGER.error("第{}行:Excel数据转换异常,列号:{},列名:{}", + rowNum, e.getColumnIndex() + 1, getColumnNameByIndex(data, e.getColumnIndex()), e); + throw new RuntimeException("Excel数据转换异常(行:" + rowNum + ",列:" + (e.getColumnIndex() + 1) + ")", e); + } catch (Exception e) { + // 其他解析异常 + int rowNum = context.readRowHolder().getRowIndex() + 1; + LOGGER.error("第{}行:Excel解析异常,所有单元格数据:{}", rowNum, data, e); + throw new RuntimeException("Excel解析异常(行:" + rowNum + ")", e); + } + } + + // ---------------------- 解析完成回调 ---------------------- + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + LOGGER.info("Excel解析全部完成!最终统计结果:"); + LOGGER.info("1. 表头信息:送货日期={},发票张数={},总记录数={},小计金额={}", + deliveryHeader.getDeliveryDate(), + deliveryHeader.getInvoiceCount(), + deliveryHeader.getTotalRecordCount(), + deliveryHeader.getSubtotalAmount()); + LOGGER.info("2. 货品明细:共{}条记录", productDetailList.size()); + LOGGER.info("3. 客户配送明细:共{}条记录", customerDeliveryDetailList.size()); + } + + // ---------------------- 状态管理方法(传递完整data) ---------------------- + /** + * 判断是否触发状态切换(根据第一列标签关键字) + */ + private boolean isStatusSwitchTrigger(String firstCellValue) { + return firstCellValue.contains(KEYWORD_PRODUCT_DETAIL) + || firstCellValue.contains(KEYWORD_TOTAL_RECORD) + || firstCellValue.contains(KEYWORD_CUSTOMER_DETAIL) + || firstCellValue.contains(KEYWORD_INVOICE_COUNT); + } + + /** + * 切换解析状态(核心:传递完整data,支持多单元格解析) + */ + private void switchStatus(String firstCellValue, int rowNum, Map data) { + if (firstCellValue.contains(KEYWORD_PRODUCT_DETAIL)) { + currentStatus = ParseStatus.PRODUCT_DETAIL; + LOGGER.info("第{}行:检测到【{}】标签,切换到【货品明细】解析状态", rowNum, KEYWORD_PRODUCT_DETAIL); + } else if (firstCellValue.contains(KEYWORD_TOTAL_RECORD)) { + currentStatus = ParseStatus.IDLE; + parseTotalRecord(data, rowNum); // 解析纪录合共(多单元格) + LOGGER.info("第{}行:检测到【{}】标签,切换到【空闲】状态,已解析货品明细{}条", + rowNum, KEYWORD_TOTAL_RECORD, productDetailList.size()); + } else if (firstCellValue.contains(KEYWORD_CUSTOMER_DETAIL)) { + currentStatus = ParseStatus.CUSTOMER_DETAIL; + LOGGER.info("第{}行:检测到【{}】标签,切换到【客户配送明细】解析状态", rowNum, KEYWORD_CUSTOMER_DETAIL); + } else if (firstCellValue.contains(KEYWORD_INVOICE_COUNT)) { + currentStatus = ParseStatus.IDLE; + parseInvoiceCount(data, rowNum); // 解析发票张数(多单元格,核心修复) + LOGGER.info("第{}行:检测到【{}】标签,切换到【空闲】状态,已解析客户配送明细{}条", + rowNum, KEYWORD_INVOICE_COUNT, customerDeliveryDetailList.size()); + } + } + + // ---------------------- 数据有效性校验方法 ---------------------- + /** + * 校验货品明细行是否有效(排除表头和空行) + */ + private boolean isValidProductDetailRow(Map data, String firstCellValue) { + // 有效条件:1.货品编号(第一列)不为空 2.不是表头行(表头第一列是"貨品編號") + Object productCode = getValueSafely(data, 0); + return productCode != null + && !"貨品編號".equals(productCode.toString().trim()) + && !productCode.toString().trim().isEmpty(); + } + + /** + * 校验客户配送明细行是否有效(排除表头和空行) + */ + private boolean isValidCustomerDetailRow(Map data, String firstCellValue) { + // 有效条件:1.类别(第一列)不为空 2.不是表头行(表头第一列是"類别") + Object category = getValueSafely(data, 0); + return category != null + && !"類别".equals(category.toString().trim()) + && !category.toString().trim().isEmpty(); + } + + // ---------------------- 具体数据解析方法(全部支持多单元格) ---------------------- + /** + * 解析表头信息(送货日期、送货线号、车次) + * 列对应关系:0=送貨日期标签,1=送貨日期值,2=送貨線號标签,3=送貨線號值,4=車次标签,5=車次值 + */ + private void parseHeaderInfo(Map data, int rowNum) { + try { + // 读取多单元格数据(标签在左,数值在右) + Date deliveryDate = getValueSafely(data, 1, Date.class); // 第2列:送货日期值 + String deliveryLineNo = getValueSafely(data, 3, String.class); // 第4列:送货线号值 + Integer trainNumber = getValueSafely(data, 5, Integer.class); // 第6列:车次值 + + // 赋值(空值处理) + if (deliveryDate != null) { + deliveryHeader.setDeliveryDate(deliveryDate); + } + deliveryHeader.setDeliveryLineNo(deliveryLineNo); + deliveryHeader.setTrainNumber(getDefaultValue(trainNumber, 0)); + + LOGGER.debug("第{}行:解析表头信息完成,送货日期={},送货线号={},车次={}", + rowNum, deliveryHeader.getDeliveryDate(), + deliveryHeader.getDeliveryLineNo(), deliveryHeader.getTrainNumber()); + } catch (Exception e) { + LOGGER.error("第{}行:解析表头信息失败,所有单元格数据:{}", rowNum, data, e); + throw new RuntimeException("解析表头信息失败(行:" + rowNum + ")", e); + } + } + + /** + * 解析纪录合共(多单元格版) + * 列对应关系:0=紀錄合共标签,1=总记录数值,4=總計标签,5=总箱数值,6=总支数值 + */ + private void parseTotalRecord(Map data, int rowNum) { + try { + // 1. 验证是否为纪录合共行(第一列包含标签) + Object totalRecordLabel = getValueSafely(data, 0, String.class); + if (totalRecordLabel == null || !totalRecordLabel.toString().trim().contains(KEYWORD_TOTAL_RECORD)) { + LOGGER.warn("第{}行:不是纪录合共行,跳过解析,第一列内容:{}", rowNum, totalRecordLabel); + return; + } + + // 2. 读取多单元格数值(标签右侧对应列) + Integer totalRecordCount = getValueSafely(data, 1, Integer.class); // 第2列:总记录数 + Integer totalBoxCount = getValueSafely(data, 5, Integer.class); // 第6列:总箱数 + Integer totalPieceCount = getValueSafely(data, 6, Integer.class); // 第7列:总支数 + + // 3. 赋值与日志 + deliveryHeader.setTotalRecordCount(getDefaultValue(totalRecordCount, 0)); + deliveryHeader.setTotalBoxCount(getDefaultValue(totalBoxCount, 0)); + deliveryHeader.setTotalPieceCount(getDefaultValue(totalPieceCount, 0)); + + LOGGER.debug("第{}行:解析纪录合共完成,总记录数={},总箱数={},总支数={}", + rowNum, deliveryHeader.getTotalRecordCount(), + deliveryHeader.getTotalBoxCount(), deliveryHeader.getTotalPieceCount()); + } catch (Exception e) { + LOGGER.error("第{}行:解析纪录合共失败,所有单元格数据:{}", rowNum, data, e); + throw new RuntimeException("解析纪录合共失败(行:" + rowNum + ")", e); + } + } + + /** + * 核心修复:解析发票张数(多单元格版,正确读取右侧单元格) + * 列对应关系: + * - 0=發票張數标签列(A列),1=发票张数数值列(B列) + * - 4=小計标签列(E列),5=小计箱数列(F列),6=小计支数列(G列),7=小计金额列(H列) + */ + private void parseInvoiceCount(Map data, int rowNum) { + try { + // 1. 验证是否为发票张数行(第一列包含标签) + Object invoiceLabel = getValueSafely(data, 0, String.class); + if (invoiceLabel == null || !invoiceLabel.toString().trim().contains(KEYWORD_INVOICE_COUNT)) { + LOGGER.warn("第{}行:不是发票张数行,跳过解析,第一列内容:{}", rowNum, invoiceLabel); + return; + } + + // 2. 解析发票张数(标签右侧第1列:B列,索引1) + Integer invoiceCount = getValueSafely(data, 1, Integer.class); + deliveryHeader.setInvoiceCount(getDefaultValue(invoiceCount, 0)); + LOGGER.debug("第{}行:解析发票张数,标签列(A列):{},数值列(B列):{}", + rowNum, invoiceLabel, deliveryHeader.getInvoiceCount()); + + // 3. 解析小计信息(标签在E列,数值在F/G/H列) + Object subtotalLabel = getValueSafely(data, 3, String.class); // E列:小計标签 + if (subtotalLabel != null && subtotalLabel.toString().trim().contains(KEYWORD_SUBTOTAL)) { + Integer subtotalBoxCount = getValueSafely(data, 4, Integer.class); // F列:小计箱数 + Integer subtotalPieceCount = getValueSafely(data, 5, Integer.class); // G列:小计支数 + BigDecimal subtotalAmount = getValueSafely(data, 6, BigDecimal.class); // H列:小计金额 + + // 赋值(空值处理) + deliveryHeader.setSubtotalBoxCount(getDefaultValue(subtotalBoxCount, 0)); + deliveryHeader.setSubtotalPieceCount(getDefaultValue(subtotalPieceCount, 0)); + deliveryHeader.setSubtotalAmount(getDefaultValue(subtotalAmount, BigDecimal.ZERO)); + + LOGGER.debug("第{}行:解析小计信息,标签列(E列):{},箱数列(F列):{},支数列(G列):{},金额列(H列):{}", + rowNum, subtotalLabel, + deliveryHeader.getSubtotalBoxCount(), + deliveryHeader.getSubtotalPieceCount(), + deliveryHeader.getSubtotalAmount()); + } else { + LOGGER.warn("第{}行:未找到小计标签(E列),或标签内容不匹配,跳过小计解析", rowNum); + deliveryHeader.setSubtotalBoxCount(0); + deliveryHeader.setSubtotalPieceCount(0); + deliveryHeader.setSubtotalAmount(BigDecimal.ZERO); + } + + // 4. 解析完成日志 + LOGGER.debug("第{}行:解析发票张数行完成,最终结果:发票张数={},小计金额={}", + rowNum, deliveryHeader.getInvoiceCount(), deliveryHeader.getSubtotalAmount()); + } catch (Exception e) { + LOGGER.error("第{}行:解析发票张数失败,所有单元格数据:{}", rowNum, data, e); + throw new RuntimeException("解析发票张数失败(行:" + rowNum + "),请检查Excel列对应关系", e); + } + } + + /** + * 解析货品明细(多单元格,动态行数适配) + * 列对应关系:0=貨品編號,1=簡稱,4=箱,5=支 + */ + private void parseProductDetail(Map data, int rowNum) { + try { + ProductDetail productDetail = new ProductDetail(); + // 读取对应列的多单元格数据 + String productCode = getValueSafely(data, 0, String.class); // 第1列:货品编号 + String productName = getValueSafely(data, 1, String.class); // 第2列:货品简称 + Integer boxCount = getValueSafely(data, 4, Integer.class); // 第5列:箱数 + Integer pieceCount = getValueSafely(data, 5, Integer.class); // 第6列:支数 + + // 赋值(空值处理+去空格) + productDetail.setProductCode(getDefaultValue(productCode, "").trim()); + productDetail.setProductName(getDefaultValue(productName, "").trim()); + productDetail.setBoxCount(getDefaultValue(boxCount, 0)); + productDetail.setPieceCount(getDefaultValue(pieceCount, 0)); + + // 添加到列表 + productDetailList.add(productDetail); + LOGGER.debug("第{}行:解析货品明细完成,货品编号={},名称={},箱数={},支数={}", + rowNum, productDetail.getProductCode(), productDetail.getProductName(), + productDetail.getBoxCount(), productDetail.getPieceCount()); + } catch (Exception e) { + LOGGER.error("第{}行:解析货品明细失败,所有单元格数据:{}", rowNum, data, e); + throw new RuntimeException("解析货品明细失败(行:" + rowNum + ")", e); + } + } + + /** + * 解析客户配送明细(多单元格,动态行数适配) + * 列对应关系:0=類别,1=發票編號,2=客户編號,3=名稱,4=箱,5=包,6=金額 + */ + private void parseCustomerDeliveryDetail(Map data, int rowNum) { + try { + CustomerDeliveryDetail customerDetail = new CustomerDeliveryDetail(); + // 读取对应列的多单元格数据 + String category = getValueSafely(data, 0, String.class); // 第1列:类别 + String invoiceNo = getValueSafely(data, 1, String.class); // 第2列:发票编号 + String customerCode = getValueSafely(data, 2, String.class); // 第3列:客户编号 + String customerName = getValueSafely(data, 3, String.class); // 第4列:客户名称 + Integer boxCount = getValueSafely(data, 4, Integer.class); // 第5列:箱数 + Integer packageCount = getValueSafely(data, 5, Integer.class); // 第6列:包数 + BigDecimal amount = getValueSafely(data, 6, BigDecimal.class); // 第7列:金额 + + // 赋值(空值处理+去空格) + customerDetail.setCategory(getDefaultValue(category, "").trim()); + customerDetail.setInvoiceNo(getDefaultValue(invoiceNo, "").trim()); + customerDetail.setCustomerCode(getDefaultValue(customerCode, "").trim()); + customerDetail.setCustomerName(getDefaultValue(customerName, "").trim()); + customerDetail.setBoxCount(getDefaultValue(boxCount, 0)); + customerDetail.setPackageCount(getDefaultValue(packageCount, 0)); + customerDetail.setAmount(getDefaultValue(amount, BigDecimal.ZERO)); + + // 添加到列表 + customerDeliveryDetailList.add(customerDetail); + LOGGER.debug("第{}行:解析客户配送明细完成,客户编号={},名称={},金额={}", + rowNum, customerDetail.getCustomerCode(), customerDetail.getCustomerName(), + customerDetail.getAmount()); + } catch (Exception e) { + LOGGER.error("第{}行:解析客户配送明细失败,所有单元格数据:{}", rowNum, data, e); + throw new RuntimeException("解析客户配送明细失败(行:" + rowNum + ")", e); + } + } + + // ---------------------- 核心工具方法(支持多单元格+类型转换) ---------------------- + /** + * 获取第一列数据(用于状态判断) + */ + private String getFirstCellValue(Map data) { + if (data == null || data.isEmpty()) { + return ""; + } + Object firstValue = data.values().iterator().next(); + return firstValue != null ? firstValue.toString().trim() : ""; + } + + /** + * 根据列索引获取列名(用于异常定位) + */ + private String getColumnNameByIndex(Map data, int columnIndex) { + if (data == null || data.isEmpty()) { + return "未知列"; + } + int index = 0; + for (String key : data.keySet()) { + if (index == columnIndex) { + return key; + } + index++; + } + return "第" + (columnIndex + 1) + "列"; + } + + /** + * 按列索引安全获取原始值(不做类型转换) + */ + private Object getValueSafely(Map data, int columnIndex) { + if (data == null || data.isEmpty()) { + return null; + } + int index = 0; + for (Object value : data.values()) { + if (index == columnIndex) { + return value; + } + index++; + } + LOGGER.warn("列索引{}超出当前行单元格数量({}列),返回null", columnIndex, data.size()); + return null; + } + + /** + * 按列索引安全获取值(支持多类型转换,核心工具) + * 功能:1. 直接类型匹配 2. String转数字/日期 3. 数字类型间转换 + */ + private T getValueSafely(Map data, int columnIndex, Class expectedType) { + Object value = getValueSafely(data, columnIndex); + if (value == null) { + LOGGER.debug("列索引{}:单元格值为null,返回null", columnIndex); + return null; + } + + // 1. 直接类型匹配 + if (expectedType.isInstance(value)) { + return expectedType.cast(value); + } + + // 2. String类型转目标类型(核心:处理文本型数字) + if (value instanceof String) { + String strValue = ((String) value).trim(); + if (strValue.isEmpty()) { + LOGGER.debug("列索引{}:单元格值为空字符串,返回null", columnIndex); + return null; + } + + // String → Integer + if (expectedType == Integer.class) { + try { + return expectedType.cast(Integer.parseInt(strValue)); + } catch (NumberFormatException e) { + LOGGER.warn("列索引{}:String转Integer失败,原始值:{}", columnIndex, strValue, e); + return null; + } + } + + // String → Long + if (expectedType == Long.class) { + try { + return expectedType.cast(Long.parseLong(strValue)); + } catch (NumberFormatException e) { + LOGGER.warn("列索引{}:String转Long失败,原始值:{}", columnIndex, strValue, e); + return null; + } + } + + // String → BigDecimal(支持千分位符号,如"1,234.56") + if (expectedType == BigDecimal.class) { + try { + String cleanValue = strValue.replace(",", ""); // 去除千分位逗号 + return expectedType.cast(new BigDecimal(cleanValue)); + } catch (NumberFormatException e) { + LOGGER.warn("列索引{}:String转BigDecimal失败,原始值:{}", columnIndex, strValue, e); + return null; + } + } + + // String → Date(支持多种日期格式) + if (expectedType == Date.class) { + try { + return expectedType.cast(DateUtils.parseDate(strValue, SUPPORTED_DATE_FORMATS)); + } catch (ParseException e) { + LOGGER.warn("列索引{}:String转Date失败,原始值:{},支持格式:{}", + columnIndex, strValue, Arrays.toString(SUPPORTED_DATE_FORMATS), e); + return null; + } + } + } + + // 3. 数字类型间转换(如Double→Integer,Long→BigDecimal) + if (value instanceof Number) { + Number numValue = (Number) value; + if (expectedType == Integer.class) { + return expectedType.cast(numValue.intValue()); + } + if (expectedType == Long.class) { + return expectedType.cast(numValue.longValue()); + } + if (expectedType == BigDecimal.class) { + return expectedType.cast(new BigDecimal(numValue.toString())); + } + } + + // 4. 不支持的转换 + LOGGER.warn("列索引{}:不支持的类型转换,期望类型:{},实际类型:{},原始值:{}", + columnIndex, expectedType.getSimpleName(), value.getClass().getSimpleName(), value); + return null; + } + + /** + * 空值处理:返回默认值 + */ + private T getDefaultValue(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + // ---------------------- Getter方法(供Service层获取解析结果) ---------------------- + public DeliveryHeader getDeliveryHeader() { + return deliveryHeader; + } + + public List getProductDetailList() { + return productDetailList; + } + + public List getCustomerDeliveryDetailList() { + return customerDeliveryDetailList; + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/listener/StockInExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/listener/StockInExcelListener.java new file mode 100644 index 000000000..4b516caf0 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/listener/StockInExcelListener.java @@ -0,0 +1,259 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.StockInHeader; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.StockInProductDetail; +import org.apache.commons.lang3.time.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 入库单Excel解析监听器 + * 功能:1. 解析第一行表头数据 2. 解析第二行开始的产品明细 3. 支持文本型数字转换 + */ +public class StockInExcelListener extends AnalysisEventListener> { + private static final Logger LOGGER = LoggerFactory.getLogger(StockInExcelListener.class); + + // 存储解析结果 + private final StockInHeader stockInHeader = new StockInHeader(); + private final List productDetailList = new ArrayList<>(); + + // 支持的日期格式(用于String转Date) + private static final String[] SUPPORTED_DATE_FORMATS = { + "yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "yyyy-MM-dd HH:mm:ss" + }; + + // 行号标记(用于区分第一行和表格行) + private int currentRowNum = 0; + + @Override + public void invoke(Map data, AnalysisContext context) { + currentRowNum = context.readRowHolder().getRowIndex() + 1; // 行号从1开始 + try { + LOGGER.debug("第{}行解析开始,数据:{}", currentRowNum, data); + + // 1. 解析第一行:表头数据(入库日期、OrderNO) + if (currentRowNum == 1) { + parseHeaderData(data); + } + // 2. 解析第二行及以后:产品明细(跳过表头行:第2行是表格列名) + else if (currentRowNum >= 3) { + if (isValidProductRow(data)) { + StockInProductDetail detail = parseProductDetail(data); + productDetailList.add(detail); + } + } + + } catch (ExcelDataConvertException e) { + // Excel内置转换异常(如日期格式错误) + LOGGER.error("第{}行数据转换异常,列号:{},列名:{}", + currentRowNum, e.getColumnIndex() + 1, getColumnNameByIndex(data, e.getColumnIndex()), e); + throw new RuntimeException("第" + currentRowNum + "行列" + (e.getColumnIndex() + 1) + "数据格式错误", e); + } catch (Exception e) { + // 其他解析异常 + LOGGER.error("第{}行解析异常,数据:{}", currentRowNum, data, e); + throw new RuntimeException("第" + currentRowNum + "行数据解析失败", e); + } + } + + /** + * 解析第一行表头数据 + * 列对应关系:0=入库日期标签,1=入库日期值,2=OrderNO标签,3=OrderNO值 + */ + private void parseHeaderData(Map data) { + // 入库日期(第2列,索引1) + Object stockInDateObj = getValueSafely(data, 1); + if (stockInDateObj != null) { + Date stockInDate = convertToDate(stockInDateObj); + stockInHeader.setStockInDate(stockInDate); + LOGGER.debug("第1行:入库日期解析完成,值:{}", stockInDate); + } + + // OrderNO(第4列,索引3) + Object orderNoObj = getValueSafely(data, 3); + if (orderNoObj != null) { + String orderNo = orderNoObj.toString().trim(); + stockInHeader.setOrderNo(orderNo); + LOGGER.debug("第1行:OrderNO解析完成,值:{}", orderNo); + } + + // 校验表头数据完整性 + if (stockInHeader.getStockInDate() == null || stockInHeader.getOrderNo().isEmpty()) { + LOGGER.warn("第1行表头数据不完整,入库日期:{},OrderNO:{}", + stockInHeader.getStockInDate(), stockInHeader.getOrderNo()); + } + } + + /** + * 解析产品明细数据(一行对应一个产品) + */ + private StockInProductDetail parseProductDetail(Map data) { + StockInProductDetail detail = new StockInProductDetail(); + + // 产品编号(第1列,索引0)- 支持文本型数字转换 + detail.setProductCode(convertToString(getValueSafely(data, 0)).toString()); + // 产品名称(第2列,索引1) + detail.setProductName(convertToString(getValueSafely(data, 1))); + // 箱含量(第5列,索引4) + detail.setBoxCapacity(convertToInteger(getValueSafely(data, 4))); + // 件数(第6列,索引5) + detail.setPieceCount(convertToInteger(getValueSafely(data, 5))); + // 箱数(第7列,索引6) + detail.setBoxCount(convertToInteger(getValueSafely(data, 6))); + // 饮用日期(第8列,索引7) + detail.setDrinkDate(convertToDate(getValueSafely(data, 7))); + + LOGGER.debug("第{}行产品明细解析完成,产品编号:{},产品名称:{}", + currentRowNum, detail.getProductCode(), detail.getProductName()); + return detail; + } + + /** + * 校验产品行是否有效(排除空行和合计行) + */ + private boolean isValidProductRow(Map data) { + // 有效条件:产品编号不为空 + 不是合计行(合计行产品编号为null,且包含"Total") + Object productCodeObj = getValueSafely(data, 0); + Object productNameObj = getValueSafely(data, 1); + + // 排除合计行(如第7行:Total:68) + if (productNameObj != null && productNameObj.toString().contains("Total")) { + LOGGER.debug("第{}行是合计行,跳过解析", currentRowNum); + return false; + } + + // 排除空行(产品编号为空) + return productCodeObj != null && !productCodeObj.toString().trim().isEmpty(); + } + + /** + * 解析完成回调 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + LOGGER.info("Excel解析全部完成!解析结果:"); + LOGGER.info("1. 表头信息:入库日期={},OrderNO={}", + stockInHeader.getStockInDate(), stockInHeader.getOrderNo()); + LOGGER.info("2. 产品明细:共{}条记录", productDetailList.size()); + } + + // ---------------------- 工具方法(类型转换+安全取值) ---------------------- + /** + * 按列索引安全获取值(支持列索引越界处理) + */ + private Object getValueSafely(Map data, int columnIndex) { + if (data == null || data.isEmpty()) { + return null; + } + + int index = 0; + for (Object value : data.values()) { + if (index == columnIndex) { + return value; + } + index++; + } + + LOGGER.warn("第{}行列索引{}超出范围(当前行共{}列),返回null", + currentRowNum, columnIndex, data.size()); + return null; + } + + /** + * 根据列索引获取列名(用于异常定位) + */ + private String getColumnNameByIndex(Map data, int columnIndex) { + if (data == null || data.isEmpty()) { + return "未知列"; + } + + int index = 0; + for (String key : data.keySet()) { + if (index == columnIndex) { + return key; + } + index++; + } + + return "第" + (columnIndex + 1) + "列"; + } + + /** + * 通用转换:Object转String + */ + private String convertToString(Object value) { + if (value == null) { + return ""; + } + return value.toString().trim(); + } + + /** + * 通用转换:Object转Integer(支持文本型数字、Number类型) + */ + private Integer convertToInteger(Object value) { + if (value == null) { + return 0; + } + + try { + // 文本型数字(如String"1741") + if (value instanceof String) { + String strValue = ((String) value).trim(); + return strValue.isEmpty() ? 0 : Integer.parseInt(strValue); + } + // Number类型(如Double、Long) + if (value instanceof Number) { + return ((Number) value).intValue(); + } + } catch (NumberFormatException e) { + LOGGER.warn("值转换为Integer失败,值:{},返回0", value, e); + } + + return 0; + } + + /** + * 通用转换:Object转Date(支持Date类型、String类型) + */ + private Date convertToDate(Object value) { + if (value == null) { + return null; + } + + // 直接是Date类型 + if (value instanceof Date) { + return (Date) value; + } + + // String类型转Date(支持多种格式) + if (value instanceof String) { + String strValue = ((String) value).trim(); + try { + return DateUtils.parseDate(strValue, SUPPORTED_DATE_FORMATS); + } catch (ParseException e) { + LOGGER.warn("值转换为Date失败,值:{},支持格式:{}", + strValue, String.join(",", SUPPORTED_DATE_FORMATS), e); + } + } + + return null; + } + + // ---------------------- Getter方法(供Service层获取解析结果) ---------------------- + public StockInHeader getStockInHeader() { + return stockInHeader; + } + + public List getProductDetailList() { + return productDetailList; + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/mapper/ExecutionStockInOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/mapper/ExecutionStockInOrderMapper.java new file mode 100644 index 000000000..a83ad2a97 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/mapper/ExecutionStockInOrderMapper.java @@ -0,0 +1,71 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialGoodsRulePO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialWarehouseControlPO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderPO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +//import com.mhd.oms.domain.reservationInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 入库单Mapper接口 + * + * @author gen + * @date 2024-05-21 + */ +public interface ExecutionStockInOrderMapper extends BaseMapper +{ + /** + * 查询入库单列表 + */ + public List queryList(ExecutionStockInOrderDO stockInOrderDO); + + public MaterialBaseInfoPO getinfo(@Param("id") Long id); + + public MaterialBaseInfoPO getByName(@Param("name") String name); + + public MaterialBaseInfoPO getByCode(@Param("code") String code); + + public List getMaterialBaseInfoList(@Param("id") String id); + + public MaterialWarehouseControlPO getInfoByMaterialBaseInfoIds(@Param("id") Long id); + + public MaterialGoodsRulePO getGoodsInfoByMaterialBaseInfoIds(@Param("id") Long id); + + public String getUserNcCode(@Param("id") Long id); + + public void delWOrder(@Param("inOrderNumber") String inOrderNumber); + + public void delWOrderDetail(@Param("inOrderNumber") String inOrderNumber); + + public String getWShOrder(@Param("inOrderNumber") String inOrderNumber); + + public void delWShOrder(@Param("inOrderNumber") String inOrderNumber); + + public void delWShOrderDetail(@Param("receiptOrderNumber") String receiptOrderNumber); + + + List queryNoticePrint(ExecutionStockInOrderDO stockInOrderDO); + List queryNoticePrintDetail(ExecutionStockInOrderDO stockInOrderDO); + public void updateByTransportationNumber(@Param("transportationNumber") String transportationNumber); + + public void updateByOrderId(@Param("orderId") String orderId); + + public void updateWmsOut(@Param("orderNumber") String orderNumber, @Param("quantity") BigDecimal quantity); + + public String getIsCheckCredit(@Param("id") Long id); + + public BigDecimal getCreditAmount(@Param("id") Long id); + + public String getCustomerNcCode(@Param("id") Long id); + + String getNcUrl(@Param("interfaceType") String interfaceType,@Param("organizationName") String organizationName,@Param("organizationId") Long organizationId); + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java new file mode 100644 index 000000000..d7111a4f8 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java @@ -0,0 +1,583 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.persistence; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.enums.DictCode; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.OrderSequence; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.facade.IExecutionStockInOrderService; +import com.mhd.oms.domain.executionStockInOrder.repository.listener.DynamicDeliveryExcelListener; +import com.mhd.oms.domain.executionStockInOrder.repository.listener.StockInExcelListener; +import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderPO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.*; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.oms.domain.executionStockOutOrder.repository.mapper.ExecutionStockOutOrderMapper; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderApplicationService; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.repository.facade.IReservationDeliveryDetailsLinkService; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.UserServiceFeign; +import com.mhd.system.api.domain.SysDictData; +import com.mhd.system.api.domain.WarehouseFeignPO; +import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 入库单Service业务层处理 + * + * @author gen + * @date 2024-05-21 + */ +@Service +public class ExecutionStockInOrderImpl extends ServiceImpl implements IExecutionStockInOrderService { + @Autowired + private ExecutionStockInOrderMapper stockInOrderMapper; + @Autowired + private ExecutionStockOutOrderMapper stockOutOrderMapper; + @Autowired + private IReservationDeliveryDetailsLinkService reservationDeliveryDetailsLinkService; + @Autowired + private ExecutionStockOutOrderApplicationService reservationStockOutOrderApplicationService; + @Autowired + private UserServiceFeign userServiceFeign; + @Autowired + private SystemServiceFeign systemServiceFeign; + @Autowired + private IExecutionInMaterialDetailService materialDetailService; + + /** + * 查询入库单列表 + */ + @Override + public List queryList(ExecutionStockInOrderDO stockInOrderDO) + { + return stockInOrderMapper.queryList(stockInOrderDO); + } + + /** + * 新增入库单 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean insert(ExecutionStockInOrderDO stockInOrderDO) { + ExecutionStockInOrder stockInOrder = new ExecutionStockInOrder(); + BeanUtils.copyProperties(stockInOrderDO,stockInOrder); + return this.save(stockInOrder); + } + + /** + * 修改入库单 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean update(ExecutionStockInOrderDO stockInOrderDO) { + ExecutionStockInOrder stockInOrder = new ExecutionStockInOrder(); + BeanUtils.copyProperties(stockInOrderDO,stockInOrder); + return this.updateById(stockInOrder); + } + + /** + * 批量删除入库单 + */ + @Override + public Boolean delete(Long[] inOrderIds ) { + List list = new ArrayList<>(); + for (Long id : inOrderIds) { + ExecutionStockInOrder stockInOrder = new ExecutionStockInOrder(); + stockInOrder.setInOrderId(id); + stockInOrder.setDelFlag(2); + list.add(stockInOrder); + } + return this.updateBatchById(list); + } + + /** + * 修改入库单 + */ + @Override + public ExecutionStockInOrderPO getInfo(Long inOrderId) { + ExecutionStockInOrder stockInOrder = this.getById(inOrderId); + ExecutionStockInOrderPO stockInOrderPO = new ExecutionStockInOrderPO(); + BeanUtils.copyProperties(stockInOrder,stockInOrderPO); + return stockInOrderPO; + } + + @Override + public List queryNoticePrint(ExecutionStockInOrderDO stockInOrderDO) { + return stockInOrderMapper.queryNoticePrint(stockInOrderDO); + } + + @Override + public List queryNoticePrintDetail(ExecutionStockInOrderDO stockInOrderDO) { + return stockInOrderMapper.queryNoticePrintDetail(stockInOrderDO); + } + + @Override + public DeliveryDataDTO parseExcelFile(MultipartFile file, String sheetName) throws Exception { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 校验文件和工作表名称(逻辑不变) + if (file.isEmpty()) { + throw new IllegalArgumentException("上传的Excel文件不能为空"); + } + if (!"出库导入".equals(sheetName) && !"参考数据".equals(sheetName)) { + sheetName = "出库导入"; + } + + // 关键变更:使用动态行数监听器 + DynamicDeliveryExcelListener listener = new DynamicDeliveryExcelListener(); + try (InputStream inputStream = file.getInputStream()) { + EasyExcel.read(inputStream, listener) + .sheet(sheetName) + .headRowNumber(0) // 无固定表头,全部行交由监听器处理 + .doRead(); + } + + // 封装DTO(逻辑不变) + DeliveryDataDTO deliveryDataDTO = new DeliveryDataDTO(); + deliveryDataDTO.setDeliveryHeader(listener.getDeliveryHeader()); + deliveryDataDTO.setProductDetailList(listener.getProductDetailList()); + deliveryDataDTO.setCustomerDeliveryDetailList(listener.getCustomerDeliveryDetailList()); + List productDetailList = deliveryDataDTO.getProductDetailList(); + List> shipperIds = new ArrayList<>(); + Set processedShipperIds = new HashSet<>(); + for (ProductDetail productDetail : productDetailList) { + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode()); + if (materialBaseInfoPO != null && materialBaseInfoPO.getShipperId() != null) { + Long shipperId = materialBaseInfoPO.getShipperId(); + if (processedShipperIds.add(shipperId)) { + Map shipper = new HashMap<>(); + shipper.put("shipperId", shipperId); + shipper.put("shipperName", materialBaseInfoPO.getShipperName()); + shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); + shipperIds.add(shipper); + } + } + } + + + if (shipperIds.isEmpty()) { + throw new Exception("出库物料货主不存在!"); + } + if (shipperIds.size() > 1) { + throw new Exception("出库物料不是同一个货主!"); + } + + ExecutionStockOutOrderDO reservationStockOutOrderDO = new ExecutionStockOutOrderDO(); + reservationStockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); + reservationStockOutOrderDO.setShipperId((Long) shipperIds.get(0).get("shipperId")); + reservationStockOutOrderDO.setShipperName((String) shipperIds.get(0).get("shipperName")); + reservationStockOutOrderDO.setShipperCode((String) shipperIds.get(0).get("shipperCode")); + reservationStockOutOrderDO.setNeedTransportFlag("1"); + reservationStockOutOrderDO.setNeedDeclareFlag("1"); + reservationStockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + reservationStockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + reservationStockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + reservationStockOutOrderDO.setIssueStatus(0); + reservationStockOutOrderDO.setSalesmanId(loginUser.getUserPo().getUserId().toString()); + reservationStockOutOrderDO.setSalesmanName(loginUser.getUserPo().getUserName()); + reservationStockOutOrderDO.setCreateTime(new Date()); + reservationStockOutOrderDO.setDocumentDate(new Date()); + reservationStockOutOrderDO.setCreateBy(loginUser.getUserPo().getUserId()); + reservationStockOutOrderDO.setCreateByName(loginUser.getUserPo().getUserName()); + reservationStockOutOrderDO.setDelFlag(1); + reservationStockOutOrderDO.setDocumentCreator(loginUser.getUserPo().getUserId().toString()); + reservationStockOutOrderDO.setDocumentCreatorName(loginUser.getUserPo().getUserName()); + reservationStockOutOrderDO.setOrderTypeCode("pu_tong_chu_ku"); + reservationStockOutOrderDO.setBusinessType("pu_tong_chu_ku"); + reservationStockOutOrderDO.setOrderTypeName("普通出库"); + DeliveryHeader deliveryHeader = deliveryDataDTO.getDeliveryHeader(); + reservationStockOutOrderDO.setTotalAmount(deliveryHeader.getSubtotalAmount()); + reservationStockOutOrderDO.setRoute(deliveryHeader.getDeliveryLineNo()); + reservationStockOutOrderDO.setReservationOrderSource("数据导入"); + reservationStockOutOrderDO.setOutboundDate(deliveryHeader.getDeliveryDate()); + reservationStockOutOrderDO.setTrainNo(deliveryHeader.getTrainNumber()); + int index = 1; + List reservationOutMaterialDetailDOList = new ArrayList<>(); + for (ProductDetail productDetail : productDetailList) { + ExecutionOutMaterialDetailDO reservationOutMaterialDetailDO = new ExecutionOutMaterialDetailDO(); + reservationOutMaterialDetailDO.setOutOrderNumber(reservationStockOutOrderDO.getOutOrderNumber()); + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode()); + reservationOutMaterialDetailDO.setQuantity(new BigDecimal(productDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP)); + if (materialBaseInfoPO != null) { + reservationOutMaterialDetailDO.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId()); + reservationOutMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode()); + reservationOutMaterialDetailDO.setMaterialName(materialBaseInfoPO.getMaterialName()); + reservationOutMaterialDetailDO.setBarCode(materialBaseInfoPO.getBarCode()); + BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice(); + if (unitPrice != null) { + reservationOutMaterialDetailDO.setUnitPrice(unitPrice); + BigDecimal amount = unitPrice.multiply(reservationOutMaterialDetailDO.getQuantity()); + reservationOutMaterialDetailDO.setTotalAmount(amount); + } else { + reservationOutMaterialDetailDO.setUnitPrice(BigDecimal.ZERO); + reservationOutMaterialDetailDO.setTotalAmount(BigDecimal.ZERO); + } + } + + reservationOutMaterialDetailDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + reservationOutMaterialDetailDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + reservationOutMaterialDetailDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + reservationOutMaterialDetailDO.setCreateBy(loginUser.getUserPo().getUserId()); + reservationOutMaterialDetailDO.setCreateByName(loginUser.getUserPo().getUserName()); + String lot = generateDateSerialNumber(); + lot = lot+"-"+index; + index++; + reservationOutMaterialDetailDO.setLotNo(lot); + reservationOutMaterialDetailDOList.add(reservationOutMaterialDetailDO); + } + reservationStockOutOrderDO.setMaterialDetailList(reservationOutMaterialDetailDOList); + reservationStockOutOrderApplicationService.insert(reservationStockOutOrderDO); + + List customerDeliveryDetailList = deliveryDataDTO.getCustomerDeliveryDetailList(); + for (CustomerDeliveryDetail customerDeliveryDetail : customerDeliveryDetailList) { + ReservationDeliveryDetailsLink reservationDeliveryDetailsLink = new ReservationDeliveryDetailsLink(); + reservationDeliveryDetailsLink.setInvoiceNumber(customerDeliveryDetail.getInvoiceNo()); + reservationDeliveryDetailsLink.setAmount(customerDeliveryDetail.getAmount()); + reservationDeliveryDetailsLink.setCustomerNumber(customerDeliveryDetail.getCustomerCode()); + reservationDeliveryDetailsLink.setDeliveryName(customerDeliveryDetail.getCustomerName()); + reservationDeliveryDetailsLink.setBox(customerDeliveryDetail.getBoxCount()); + reservationDeliveryDetailsLink.setBag(customerDeliveryDetail.getPackageCount()); + reservationDeliveryDetailsLink.setCategory(customerDeliveryDetail.getCategory()); + reservationDeliveryDetailsLink.setOrderNumber(reservationStockOutOrderDO.getOutOrderNumber()); + List reservationStockOutOrderDOList = stockOutOrderMapper.selectList(new LambdaQueryWrapper().eq(ExecutionStockOutOrder::getOutOrderNumber, reservationStockOutOrderDO.getOutOrderNumber())); + if (reservationStockOutOrderDOList != null && !reservationStockOutOrderDOList.isEmpty() && reservationStockOutOrderDOList.get(0) != null) { + reservationDeliveryDetailsLink.setOrderId(reservationStockOutOrderDOList.get(0).getOutOrderId()); + } + reservationDeliveryDetailsLinkService.save(reservationDeliveryDetailsLink); + } + return deliveryDataDTO; + } + + public String generateDateSerialNumber() { + // 1. 获取当前时间,格式化为:yyMMdd (2位年+2位月+2位日) + SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); + String datePart = sdf.format(new Date()); + + // 2. 生成 000~999 的 3 位随机数(不足补零) + Random random = new Random(); + int randomNum = random.nextInt(1000); // 0~999 + String randomPart = String.format("%03d", randomNum); // 自动补前导零 + + // 3. 拼接结果 + return datePart + randomPart; + } + + private static final Logger LOGGER = LoggerFactory.getLogger(ExecutionStockInOrderImpl.class); + // 默认工作表名称(与Excel一致) + private static final String DEFAULT_SHEET_NAME = "入库模版"; + + @Override + public StockInDataDTO parseStockInExcel(MultipartFile file, String sheetName) throws Exception { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 1. 校验文件 + if (file.isEmpty()) { + LOGGER.error("上传的Excel文件为空"); + throw new IllegalArgumentException("Excel文件不能为空"); + } + + // 2. 校验工作表名称(默认使用"入库模版") + String targetSheetName = (sheetName == null || sheetName.trim().isEmpty()) + ? DEFAULT_SHEET_NAME : sheetName.trim(); + + // 3. 使用EasyExcel解析(指定监听器) + StockInExcelListener listener = new StockInExcelListener(); + try (InputStream inputStream = file.getInputStream()) { + EasyExcel.read(inputStream, listener) + .sheet(targetSheetName) // 指定工作表 + .headRowNumber(0) // 从第1行开始解析(不跳过任何行) + .doRead(); + } + + // 4. 封装DTO返回 + StockInDataDTO resultDTO = new StockInDataDTO(); + resultDTO.setStockInHeader(listener.getStockInHeader()); + resultDTO.setProductDetailList(listener.getProductDetailList()); + + LOGGER.info("Excel解析成功,工作表:{},产品明细数:{}", + targetSheetName, resultDTO.getProductDetailList().size()); + List productDetailList = resultDTO.getProductDetailList(); + List> shipperIds = new ArrayList<>(); + Set processedShipperIds = new HashSet<>(); + for (StockInProductDetail productDetail : productDetailList) { + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode()); + if (materialBaseInfoPO != null && materialBaseInfoPO.getShipperId() != null) { + Long shipperId = materialBaseInfoPO.getShipperId(); + if (processedShipperIds.add(shipperId)) { + Map shipper = new HashMap<>(); + shipper.put("shipperId", shipperId); + shipper.put("shipperName", materialBaseInfoPO.getShipperName()); + shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); + shipperIds.add(shipper); + } + } + } + ExecutionStockInOrderDO reservationStockInOrderDO = new ExecutionStockInOrderDO(); + reservationStockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK")); + reservationStockInOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + reservationStockInOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + reservationStockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + reservationStockInOrderDO.setCreateBy(loginUser.getUserPo().getUserId()); + reservationStockInOrderDO.setCreateByName(loginUser.getUserPo().getUserName()); + reservationStockInOrderDO.setCreateTime(new Date()); + reservationStockInOrderDO.setDelFlag(1); + reservationStockInOrderDO.setDocumentCreator(loginUser.getUserPo().getUserId().toString()); + reservationStockInOrderDO.setDocumentCreatorName(loginUser.getUserPo().getUserName()); + reservationStockInOrderDO.setDocumentDate(new Date()); + reservationStockInOrderDO.setOrderTypeCode("pu_tong_ru_ku"); + reservationStockInOrderDO.setOrderTypeName("普通入库"); + reservationStockInOrderDO.setIssueStatus(0); + reservationStockInOrderDO.setSalesmanId(loginUser.getUserPo().getUserId().toString()); + reservationStockInOrderDO.setSalesmanName(loginUser.getUserPo().getUserName()); + reservationStockInOrderDO.setShipperId((Long) shipperIds.get(0).get("shipperId")); + reservationStockInOrderDO.setShipperName((String) shipperIds.get(0).get("shipperName")); + reservationStockInOrderDO.setShipperCode((String) shipperIds.get(0).get("shipperCode")); + StockInHeader stockInHeader = resultDTO.getStockInHeader(); + reservationStockInOrderDO.setWarehouseDate(stockInHeader.getStockInDate()); + reservationStockInOrderDO.setStorageTime(stockInHeader.getStockInDate()); + reservationStockInOrderDO.setExpectTime(stockInHeader.getStockInDate()); + reservationStockInOrderDO.setBusinessOrderNo(stockInHeader.getOrderNo()); + reservationStockInOrderDO.setReservationOrderSource("数据导入"); + List reservationInMaterialDetailDOList = new ArrayList<>(); + int index = 1; + for (StockInProductDetail stockInProductDetail : productDetailList) { + ExecutionInMaterialDetailDO reservationInMaterialDetailDO = new ExecutionInMaterialDetailDO(); + reservationInMaterialDetailDO.setInOrderNumber(reservationStockInOrderDO.getInOrderNumber()); + reservationInMaterialDetailDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + reservationInMaterialDetailDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + reservationInMaterialDetailDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + reservationInMaterialDetailDO.setCreateBy(loginUser.getUserPo().getUserId()); + reservationInMaterialDetailDO.setCreateByName(loginUser.getUserPo().getUserName()); + reservationInMaterialDetailDO.setCreateTime(new Date()); + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(stockInProductDetail.getProductCode()); + reservationInMaterialDetailDO.setQuantity(new BigDecimal(stockInProductDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP)); + if (materialBaseInfoPO != null) { + reservationInMaterialDetailDO.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId()); + reservationInMaterialDetailDO.setMaterialName(materialBaseInfoPO.getMaterialName()); + reservationInMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode()); +// reservationInMaterialDetailDO.setQuantity(new BigDecimal(stockInProductDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP)); + BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice(); + if (unitPrice != null) { + reservationInMaterialDetailDO.setUnitPrice(unitPrice); + BigDecimal amount = unitPrice.multiply(reservationInMaterialDetailDO.getQuantity()); + reservationInMaterialDetailDO.setTotalPrice(amount); + } else { + reservationInMaterialDetailDO.setUnitPrice(BigDecimal.ZERO); + reservationInMaterialDetailDO.setTotalPrice(BigDecimal.ZERO); + } + } + + String lot = generateDateSerialNumber(); + lot = lot+"-"+index; + index++; + reservationInMaterialDetailDO.setLotNo(lot); + reservationInMaterialDetailDO.setDrinkDate(stockInProductDetail.getDrinkDate()); + reservationInMaterialDetailDOList.add(reservationInMaterialDetailDO); + } + reservationStockInOrderDO.setMaterialDetailList(reservationInMaterialDetailDOList); + insertApplication(reservationStockInOrderDO); + return resultDTO; + } + + public Boolean insertApplication(ExecutionStockInOrderDO stockInOrderDO) { +// 如果仓库ID为空,从当前登录用户的关联仓库中获取 + if (stockInOrderDO.getWarehouseId() == null) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("登录已失效,请重新登录"); + } + AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO == null || associationWarehouseCacheDO.getWarehouseId() == null) { + throw new ServiceException("当前用户未配置关联仓库,请先配置仓库"); + } + stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + //设置仓库 + setWarehouseInfo(stockInOrderDO); +// 设置货主信息 + shipperParam(stockInOrderDO); +// 设置供应商信息 + supplierParam(stockInOrderDO); +// 设置数据字典键值 + setDataDict(stockInOrderDO); + return insertDomain(stockInOrderDO); + } + + @Transactional(rollbackFor = Exception.class) + public Boolean insertDomain(ExecutionStockInOrderDO stockInOrderDO) { + if (stockInOrderDO.getInOrderNumber() == null) { + stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK")); + } +// //统计总计划数 + BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setQuantity(quantity); + BigDecimal amount = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setAmount(amount); + this.insert(stockInOrderDO); + return materialDetailService.batchInsert(stockInOrderDO.getInOrderNumber(), stockInOrderDO.getMaterialDetailList()); + } + + private void setWarehouseInfo(ExecutionStockInOrderDO stockInOrderDO) { + if (stockInOrderDO.getWarehouseId() == null) { + throw new ServiceException("仓库ID不能为空"); + } + AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockInOrderDO.getWarehouseId()); + if (ajaxResult == null) { + throw new ServiceException("获取仓库信息失败:返回结果为空,仓库ID:" + stockInOrderDO.getWarehouseId()); + } + Object codeObj = ajaxResult.get("code"); + if (codeObj == null || !"200".equals(String.valueOf(codeObj))) { + String errorMsg = ajaxResult.get("msg") != null ? String.valueOf(ajaxResult.get("msg")) : "未知错误"; + throw new ServiceException("获取仓库信息失败,仓库ID:" + stockInOrderDO.getWarehouseId() + ",错误信息:" + errorMsg); + } + Object dataObj = ajaxResult.get("data"); + if (dataObj == null) { + throw new ServiceException("获取仓库信息失败:返回数据为空,仓库ID:" + stockInOrderDO.getWarehouseId()); + } + WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(dataObj), WarehouseFeignPO.class); + if (warehouseFeignPO == null) { + throw new ServiceException("获取仓库信息失败:数据解析失败,仓库ID:" + stockInOrderDO.getWarehouseId()); + } + stockInOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); + stockInOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); + } + + /** + * @description 封装货主信息(改为与出库单相同的简洁逻辑,使用入库单的字段shipperName) + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockInOrderDO + */ + private void shipperParam(ExecutionStockInOrderDO stockInOrderDO){ + // 新增/编辑时前端可能只传 shipperId(下拉选中值),shipperName 为空。 + // 这里优先按 shipperId 回填货主编码/名称;其次再按 shipperName(名称或数字ID字符串)回填。 + + // 1) 优先按 shipperId 查询 + if (ObjectUtil.isNotNull(stockInOrderDO.getShipperId())) { + AjaxResult ajaxResult = userServiceFeign.getInfo(stockInOrderDO.getShipperId()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setShipperId(userPo.getUserId()); + stockInOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockInOrderDO.setShipperName(userPo.getUserName()); + return; + } + + // 2) shipperId 为空时,按 shipperName 兜底 + String shipperName = stockInOrderDO.getShipperName(); + if (StringUtils.isEmpty(shipperName)) { + return; + } + if (!shipperName.matches("\\d+")) { + // 按名称查询 + AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setShipperId(userPo.getUserId()); + stockInOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockInOrderDO.setShipperName(userPo.getUserName()); + } else { + // shipperName 是数字:按ID查询 + AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(shipperName)); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setShipperId(userPo.getUserId()); + stockInOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockInOrderDO.setShipperName(userPo.getUserName()); + } + } + + /** + * @description 封装供应商信息 + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockInOrderDO + */ + private void supplierParam(ExecutionStockInOrderDO stockInOrderDO){ + if (ObjectUtil.isNotNull(stockInOrderDO.getSupplierId())){ + AjaxResult ajaxResult = userServiceFeign.getInfo(stockInOrderDO.getSupplierId()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取供应商信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setSupplierName(userPo.getUserName()); + } + } + + /** + * @description 设置数据字典键值 + * @author ZhouGY + * @date 2024/4/7 14:33 + * @param stockInOrderDO + */ + private void setDataDict(ExecutionStockInOrderDO stockInOrderDO){ + //翻译单据类型 + if (StringUtils.isNotBlank(stockInOrderDO.getOrderTypeCode())){ + AjaxResult documentTypeResult = systemServiceFeign.selectListByDictType(DictCode.DOCUMENT_TYPE.getCode()); + if (!"200".equals(String.valueOf(documentTypeResult.get("code")))) { + throw new ServiceException("单据类型数据字典不存在"); + } + List documentTypeDataList = JSON.parseArray(JSONUtil.toJsonStr(documentTypeResult.get("data")), SysDictData.class); + + SysDictData documentTypeData = documentTypeDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockInOrderDO.getOrderTypeCode())).findAny().orElse(null); + if (null == documentTypeData) { + throw new ServiceException("单据类型【" + stockInOrderDO.getOrderTypeCode() + "】数据字典不存在 请联系管理员"); + } + stockInOrderDO.setOrderTypeName(documentTypeData.getDictLabel()); + } + + //翻译优先级别类型 + if (StringUtils.isNotBlank(stockInOrderDO.getPriorityLevelCode())){ + AjaxResult priorityLevelResult = systemServiceFeign.selectListByDictType(DictCode.PRIORITY_LEVEL.getCode()); + if (!"200".equals(String.valueOf(priorityLevelResult.get("code")))) { + throw new ServiceException("优先级别类型数据字典不存在"); + } + List priorityLevelDataList = JSON.parseArray(JSONUtil.toJsonStr(priorityLevelResult.get("data")), SysDictData.class); + + SysDictData priorityLevelData = priorityLevelDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockInOrderDO.getPriorityLevelCode())).findAny().orElse(null); + if (null == priorityLevelData) { + throw new ServiceException("优先级别类型【" + stockInOrderDO.getPriorityLevelCode() + "】数据字典不存在 请联系管理员"); + } + stockInOrderDO.setPriorityLevelName(priorityLevelData.getDictLabel()); + } + } + + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderBasePO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderBasePO.java new file mode 100644 index 000000000..ef2bb711d --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderBasePO.java @@ -0,0 +1,116 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author ZhouGY + * @title StockInOrderBasePO + * @description: TODO + * @date 2024/5/22 11:50 + **/ +@Data +public class ExecutionStockInOrderBasePO extends BaseVOEntity { + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主code") + @Excel(name = "货主code") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java new file mode 100644 index 000000000..c1bb6b105 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java @@ -0,0 +1,481 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; +//import com.mhd.oms.domain.reservationInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 入库单对象 stock_in_order + * + * @author gen + * @date 2024-05-21 + */ + +@Data +@ApiModel(value = "入库单对象", description = "入库单响应对象") +public class ExecutionStockInOrderPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入库单id") + private Long inOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer status; + + @ApiModelProperty("入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("入库单审核备注") + @Excel(name = "入库单审核备注") + private String auditRemark; + + @ApiModelProperty("入库单审核人") + @Excel(name = "入库单审核人") + private Long auditBy; + + @ApiModelProperty("入库单审核人姓名") + @Excel(name = "入库单审核人姓名") + private String auditByName; + + @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 auditTime; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量(原字段)") + @Excel(name = "计划数量(原字段)") + private BigDecimal quantity; + + @ApiModelProperty("入库数量") + @Excel(name = "入库数量") + private BigDecimal inQuantity; + + /** + * 计划入库数量:取入库单明细中的入库数量汇总 + */ + @ApiModelProperty("计划入库数量") + @Excel(name = "计划入库数量") + private BigDecimal planInQuantity; + + /** + * 收货数量:入库单对应的收货单实际收货数量汇总 + */ + @ApiModelProperty("收货数量") + @Excel(name = "收货数量") + private BigDecimal receiptQuantity; + + /** + * 上架数量:入库单对应的上架单实际上架数量汇总 + */ + @ApiModelProperty("上架数量") + @Excel(name = "上架数量") + private BigDecimal shelvesQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @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 cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @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 closeTime; + + @ApiModelProperty("入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + @Excel(name = "入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + private Integer orderSource; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("物料明细") + private List materialDetailList; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + // ========== 报关相关字段 ========== + @ApiModelProperty("To") + @Excel(name = "To") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleInfo; + + @ApiModelProperty("委托编号NO") + @Excel(name = "委托编号NO") + private String consignmentNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSignature; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declarationArea; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsBrokerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddress; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String originDestinationCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportMethod; + + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionMethod; + + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private Integer customsInspection; + + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private Integer needCustomsDeclaration; + + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private Integer needTransport; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("完成时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date completionTime; + + @ApiModelProperty("下单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "下单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date orderDate; + + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + + @ApiModelProperty("订单状态") + @Excel(name = "订单状态") + private String orderStatus; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + + @ApiModelProperty("业务单对象") + private List businessDocumentOrderDOList; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("入库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date storageTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String pictureUrl; + + @ApiModelProperty("NC客户编码") + private String customerNcCode; + @ApiModelProperty("运输业务单号") + private String businessNumber; + + @ApiModelProperty("是否免费夫力费费") + private String isFreeManpowerFee; + + @ApiModelProperty("折扣") + private BigDecimal discount; + + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + @ApiModelProperty("夫力费") + private BigDecimal manpowerFee; + + @ApiModelProperty("总仓租") + private BigDecimal totalWarehouseRent; + + @ApiModelProperty("业务计价类型") + private String businessChargeType; + + @ApiModelProperty("业务计价方式") + private String businessPriceWay; + private String khdm; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialBaseInfoPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialBaseInfoPO.java new file mode 100644 index 000000000..4ed06cbfd --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialBaseInfoPO.java @@ -0,0 +1,250 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.handler.ListTypeHandler; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + + +/** + * 物料基础信息对象 material_base_info + * + * @author gen + * @date 2024-05-07 + */ + +@Data +@ApiModel(value = "物料基础信息对象", description = "物料基础信息响应对象") +public class MaterialBaseInfoPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("物料编码") + @Excel(name = "物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + @Excel(name = "物料名称") + private String materialName; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("物料分类编码") + @TableField(typeHandler = ListTypeHandler.class) + private List materialClassifyCode; + + @ApiModelProperty("物料分类名称") + @TableField(typeHandler = ListTypeHandler.class) + private List materialClassifyName; + + @ApiModelProperty("物料分类编码(导出用,逗号分隔)") + @Excel(name = "物料分类编码") + private String materialClassifyCodeStr; + + @ApiModelProperty("物料分类名称(导出用,逗号分隔)") + @Excel(name = "物料分类名称") + private String materialClassifyNameStr; + + @ApiModelProperty("物料种类编码 数据字典") + @Excel(name = "物料种类编码 数据字典") + private String materialType; + + @ApiModelProperty("物料种类名称 数据字典") + @Excel(name = "物料种类名称 数据字典") + private String materialTypeName; + + @ApiModelProperty("包装规格id") + @Excel(name = "包装规格id") + private Long packId; + + @ApiModelProperty("包装规格编码") + @Excel(name = "包装规格编码") + private String packCode; + + @ApiModelProperty("包装规格名称") + @Excel(name = "包装规格名称") + private String packName; + + @ApiModelProperty("包装单位编码") + @Excel(name = "包装单位编码") + private String unitCode; + + @ApiModelProperty("包装单位名称") + @Excel(name = "包装单位名称") + private String unitName; + + @ApiModelProperty("品牌id") + @Excel(name = "品牌id") + private Long brandId; + + @ApiModelProperty("品牌编码") + @Excel(name = "品牌编码") + private String brandCode; + + @ApiModelProperty("品牌名称") + @Excel(name = "品牌名称") + private String brandName; + + @ApiModelProperty("保质期 单位:天") + @Excel(name = "保质期 单位:天") + private Long shelfLife; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("毛重 单位:千克") + @Excel(name = "毛重 单位:千克") + private BigDecimal grossWeight; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("商品形态编码 数据字典") + @Excel(name = "商品形态编码 数据字典") + private String materialShape; + + @ApiModelProperty("商品形态名称 数据字典") + @Excel(name = "商品形态名称 数据字典") + private String materialShapeName; + + @ApiModelProperty("物料大小 长*宽*高 单位:米") + @Excel(name = "物料大小 长*宽*高 单位:米") + private String materialSize; + + @ApiModelProperty("物料大小-长 单位:米") + @Excel(name = "物料大小-长 单位:米") + private BigDecimal materialLength; + + @ApiModelProperty("物料大小-宽 单位:米") + @Excel(name = "物料大小-宽 单位:米") + private BigDecimal materialWidth; + + @ApiModelProperty("物料大小-高 单位:米") + @Excel(name = "物料大小-高 单位:米") + private BigDecimal materialHeight; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("是否作废: 1-是 2-否") + @Excel(name = "是否作废: 1-是 2-否") + private Integer nullify; + + @ApiModelProperty("单位数量") + @Excel(name = "单位数量") + private BigDecimal unitNumber; + + @ApiModelProperty("商品规则") + private MaterialGoodsRulePO materialGoodsRule; +// +// @ApiModelProperty("公共信息") +// private MaterialCommonPO materialCommon; + + @ApiModelProperty("仓库控制信息") + private MaterialWarehouseControlPO materialWarehouseControl; +// +// @ApiModelProperty("库存预警信息") +// private List materialInventoryWarningList; + +// @ApiModelProperty("条码信息") +// private List materialBarCodeList; +// +// @ApiModelProperty("物料批次属性") +// private List materialMoreDetailList; + + @ApiModelProperty("是否公用: 1-是 2-否") + @Excel(name = "是否公用: 1-是 2-否") + private Integer common; + + + @ApiModelProperty("SKU码") + private String skuCode; + + @ApiModelProperty("单价") + private BigDecimal unitPrice; + + @ApiModelProperty("币制") + private String currency; + + @ApiModelProperty("原产国") + private String originCountry; + + @ApiModelProperty("HS码") + private String hsCode; + + @ApiModelProperty("货物类型:0-物料 1-半成品 2-成品") + @Excel(name = "货物类型:0-物料 1-半成品 2-成品") + private Integer goodsType; + + @ApiModelProperty("申报单位") + private String declarationUnit; + + @ApiModelProperty("法定单位") + private String statutoryUnit; + + @ApiModelProperty("法定第二单位") + private String statutorySecondUnit; + + @ApiModelProperty("规格型号") + private String specificationModel; + + @ApiModelProperty("批次ID") + @Excel(name = "批次ID") + private Long batchId; + + @ApiModelProperty("批次编码") + @Excel(name = "批次编码") + private String batchCode; + + @ApiModelProperty("批次名称") + @Excel(name = "批次名称") + private String batchName; + + @ApiModelProperty("库存预警数量") + @Excel(name = "库存预警数量") + private Integer inventoryWarningCount; + + @ApiModelProperty("临期预警数量") + @Excel(name = "临期预警数量") + private Integer expirationWarningCount; + //库存件数 + private BigDecimal stockQuantity; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialGoodsRulePO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialGoodsRulePO.java new file mode 100644 index 000000000..954dc1988 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialGoodsRulePO.java @@ -0,0 +1,131 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.po; + +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 物料商品规则对象 material_goods_rule + * + * @author gen + * @date 2024-05-07 + */ + +@Data +@ApiModel(value = "物料商品规则对象", description = "物料商品规则响应对象") +public class MaterialGoodsRulePO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品规则id") + private Long materialGoodsRuleId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("批次id") + @Excel(name = "批次id") + private Long batchId; + + @ApiModelProperty("批次编码") + @Excel(name = "批次编码") + private String batchCode; + + @ApiModelProperty("批次名称") + @Excel(name = "批次名称") + private String batchName; + + @ApiModelProperty("上架库区id") + @Excel(name = "上架库区id") + private Long storageSectionId; + + @ApiModelProperty("上架库区编码") + @Excel(name = "上架库区编码") + private String storageCode; + + @ApiModelProperty("上架库区名称") + @Excel(name = "上架库区名称") + private String storageName; + + @ApiModelProperty("上架库位id") + @Excel(name = "上架库位id") + private Long storageLocationId; + + @ApiModelProperty("上架库位编码") + @Excel(name = "上架库位编码") + private String storageLocationCode; + + @ApiModelProperty("上架库位名称") + @Excel(name = "上架库位名称") + private String storageLocationName; + + @ApiModelProperty("上架规则id") + @Excel(name = "上架规则id") + private Long ruleId; + + @ApiModelProperty("上架规则编码") + @Excel(name = "上架规则编码") + private String ruleCode; + + @ApiModelProperty("上架规则名称") + @Excel(name = "上架规则名称") + private String ruleName; + + @ApiModelProperty("上架库位指定规则id") + @Excel(name = "上架库位指定规则id") + private Long specifyRuleId; + + @ApiModelProperty("上架库位指定规则编码") + @Excel(name = "上架库位指定规则编码") + private String specifyRuleCode; + + @ApiModelProperty("上架库位指定规则名称") + @Excel(name = "上架库位指定规则名称") + private String specifyRuleName; + + @ApiModelProperty("周转规则id") + @Excel(name = "周转规则id") + private Long turnoverRuleId; + + @ApiModelProperty("周转规则编码") + @Excel(name = "周转规则编码") + private String turnoverRuleCode; + + @ApiModelProperty("周转规则名称") + @Excel(name = "周转规则名称") + private String turnoverRuleName; + + @ApiModelProperty("分配规则id") + @Excel(name = "分配规则id") + private Long distributeRuleId; + + @ApiModelProperty("分配规则编码") + @Excel(name = "分配规则编码") + private String distributeRuleCode; + + @ApiModelProperty("分配规则名称") + @Excel(name = "分配规则名称") + private String distributeRuleName; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialWarehouseControlPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialWarehouseControlPO.java new file mode 100644 index 000000000..f62f8b17e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/MaterialWarehouseControlPO.java @@ -0,0 +1,97 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.po; + +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + + +/** + * 仓库控制信息对象 material_warehouse_control + * + * @author gen + * @date 2024-05-07 + */ + +@Data +@ApiModel(value = "仓库控制信息对象", description = "仓库控制信息响应对象") +public class MaterialWarehouseControlPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品规则id") + private Long materialWarehouseControlId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("物料基础信息id") + @Excel(name = "物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("是否效期控制: 1-是 2-否") + @Excel(name = "是否效期控制: 1-是 2-否") + private Integer temperatureControl; + + @ApiModelProperty("周期类型: 1-生产日期 2-失效日期") + @Excel(name = "周期类型: 1-生产日期 2-失效日期") + private Integer cycleType; + + @ApiModelProperty("入库效期 单位:天") + @Excel(name = "入库效期 单位:天") + private Integer inValidityPeriod; + + @ApiModelProperty("入库效期 单位:天") + @Excel(name = "入库效期 单位:天") + private Integer outValidityPeriod; + + @ApiModelProperty("是否允许超收: 1-是 2-否") + @Excel(name = "是否允许超收: 1-是 2-否") + private Integer allowOvercharge; + + @ApiModelProperty("超收比例") + @Excel(name = "超收比例") + private BigDecimal overchargeRatio; + + @ApiModelProperty("ABC分类:A-A类 B-B类 C-C类") + @Excel(name = "ABC分类:A-A类 B-B类 C-C类") + private String classify; + + @ApiModelProperty("是否序列号管理: 1-是 2-否") + @Excel(name = "是否序列号管理: 1-是 2-否") + private Integer serialNumberManage; + + @ApiModelProperty("是否质检管理: 1-是 2-否") + @Excel(name = "是否质检管理: 1-是 2-否") + private Integer qualityInspectionManage; + + @ApiModelProperty("质检阶段: 1-收货前 2-收货后上架前") + @Excel(name = "质检阶段: 1-收货前 2-收货后上架前") + private Integer qualityInspectionStage; + + @ApiModelProperty("质检规则: 1-全检 2-抽检 ") + @Excel(name = "质检规则: 1-全检 2-抽检 ") + private Integer qualityInspectionRule; + + @ApiModelProperty("质检项: 1-包装 2-纯度") + @Excel(name = "质检项: 1-包装 2-纯度") + private Integer qualityInspectionTerm; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderBaseDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderBaseDO.java new file mode 100644 index 000000000..c93acae9e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderBaseDO.java @@ -0,0 +1,111 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author ZhouGY + * @title StockInOrderBasePO + * @description: TODO + * @date 2024/5/22 11:50 + **/ +@Data +public class ExecutionStockInOrderBaseDO extends BaseVOEntity { + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderBaseDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderBaseDTO.java new file mode 100644 index 000000000..3fa284319 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderBaseDTO.java @@ -0,0 +1,110 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author ZhouGY + * @title StockInOrderBasePO + * @description: TODO + * @date 2024/5/22 11:50 + **/ +@Data +public class ExecutionStockInOrderBaseDTO extends BaseVOEntity { + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + /** + * 兼容前端使用 userName 作为货主名称字段: + * 如果请求体中只传了 userName,将在组装器中自动回填到 shipperName。 + */ + @ApiModelProperty("货主名称(兼容字段:userName)") + private String userName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java new file mode 100644 index 000000000..8ca3ca25e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java @@ -0,0 +1,512 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 入库单对象 stock_in_order + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionStockInOrderDO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入库单id") + private Long inOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer status; + + @ApiModelProperty("入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("入库单审核备注") + @Excel(name = "入库单审核备注") + private String auditRemark; + + @ApiModelProperty("入库单审核人") + @Excel(name = "入库单审核人") + private Long auditBy; + + @ApiModelProperty("入库单审核人姓名") + @Excel(name = "入库单审核人姓名") + private String auditByName; + + @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 auditTime; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("入库数量") + @Excel(name = "入库数量") + private BigDecimal inQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @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 cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @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 closeTime; + + @ApiModelProperty("入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + @Excel(name = "入库单来源: 1-正常录入 2-通知单生成 3-无单收货4-数据导入") + private Integer orderSource; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("入库单id集合") + private List inOrderIds; + + @ApiModelProperty("物料明细") + private List materialDetailList; + + @ApiModelProperty("小于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "小于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer ltStatus; + + @ApiModelProperty("大于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "大于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer gtStatus; + + @ApiModelProperty("小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer ltAuditStatus; + + @ApiModelProperty("小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer gtAuditStatus; + + @ApiModelProperty("调度单号") + private String mobilizeCode; + + // ========== 报关相关字段 ========== + @ApiModelProperty("To") + @Excel(name = "To") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleInfo; + + @ApiModelProperty("委托编号NO") + @Excel(name = "委托编号NO") + private String consignmentNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSignature; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declarationArea; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsBrokerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddress; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String originDestinationCountry; + + @ApiModelProperty("承运商(先做成输入框,待定)") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号(数据字典:20尺/40尺)") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("运输方式(数据字典:公路运输/其他运输)") + @Excel(name = "运输方式") + private String transportMethod; + + @ApiModelProperty("监管方式(数据字典:一般贸易)") + @Excel(name = "监管方式") + private String supervisionMethod; + + @ApiModelProperty("海关是否查验货物(默认:否)") + @Excel(name = "海关是否查验货物") + private Integer customsInspection; + + @ApiModelProperty("是否需要报关(默认:是)") + @Excel(name = "是否需要报关") + private Integer needCustomsDeclaration; + + @ApiModelProperty("是否需要运输(默认:否)") + @Excel(name = "是否需要运输") + private Integer needTransport; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("完成时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date completionTime; + + @ApiModelProperty("下单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "下单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date orderDate; + + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + + @ApiModelProperty("订单状态") + @Excel(name = "订单状态") + private String orderStatus; + + @ApiModelProperty(name = "创建时间查询条件开始日期") + private String createTimeStart; + + @ApiModelProperty(name = "创建时间查询条件结束日期") + private String createTimeEnd; + + @ApiModelProperty(name = "入库时间查询条件开始日期") + private String storageTimeStart; + + @ApiModelProperty(name = "入库时间查询条件结束日期") + private String storageTimeEnd; + + @ApiModelProperty(name = "入库时间查询条件开始日期") + private String expectTimeStart; + + @ApiModelProperty(name = "入库时间查询条件结束日期") + private String expectTimeEnd; + + @ApiModelProperty("入库明细-物料名称(商品名称),模糊匹配") + private String materialName; + + @ApiModelProperty("入库明细-物料编码,模糊匹配") + private String materialCode; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("入库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date storageTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String pictureUrl; + + @ApiModelProperty("NC客户编码") + private String customerNcCode; + + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeTo; + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeTo; + + private String xfStatus; + @ApiModelProperty("运输业务单号") + private String businessNumber; + @ApiModelProperty("是否免费夫力费费") + private String isFreeManpowerFee; + + @ApiModelProperty("折扣") + private BigDecimal discount; + + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + @ApiModelProperty("夫力费") + private BigDecimal manpowerFee; + + @ApiModelProperty("总仓租") + private BigDecimal totalWarehouseRent; + + @ApiModelProperty("业务计价类型") + private String businessChargeType; + + @ApiModelProperty("业务计价方式") + private String businessPriceWay; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java new file mode 100644 index 000000000..767a0a245 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java @@ -0,0 +1,509 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +//import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.ReservationInMaterialDetailDTO; +//import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ExecutionStockInOrderBaseDTO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDTO; +import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.ReservationInMaterialDetailDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 入库单对象 stock_in_order + * + * @author gen + * @date 2024-05-21 + */ + +@Data +public class ExecutionStockInOrderDTO extends ExecutionStockInOrderBaseDTO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入库单id") + private Long inOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer status; + + @ApiModelProperty("入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("入库单审核备注") + @Excel(name = "入库单审核备注") + private String auditRemark; + + @ApiModelProperty("入库单审核人") + @Excel(name = "入库单审核人") + private Long auditBy; + + @ApiModelProperty("入库单审核人姓名") + @Excel(name = "入库单审核人姓名") + private String auditByName; + + @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 auditTime; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("入库数量") + @Excel(name = "入库数量") + private BigDecimal inQuantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @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 cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @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 closeTime; + + @ApiModelProperty("入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + @Excel(name = "入库单来源: 1-正常录入 2-通知单生成 3-无单收货") + private Integer orderSource; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("入库单id集合") + private List inOrderIds; + + @ApiModelProperty("物料明细") + private List materialDetailList; + + @ApiModelProperty("小于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "小于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer ltStatus; + + @ApiModelProperty("大于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + @Excel(name = "大于某个入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库") + private Integer gtStatus; + + @ApiModelProperty("小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer ltAuditStatus; + + @ApiModelProperty("小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "小于入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer gtAuditStatus; + + // ========== 报关相关字段 ========== + @ApiModelProperty("To") + @Excel(name = "To") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleInfo; + + @ApiModelProperty("委托编号NO") + @Excel(name = "委托编号NO") + private String consignmentNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSignature; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declarationArea; + + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsBrokerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddress; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String originDestinationCountry; + + @ApiModelProperty("承运商(先做成输入框,待定)") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号(数据字典:20尺/40尺)") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("运输方式(数据字典:公路运输/其他运输)") + @Excel(name = "运输方式") + private String transportMethod; + + @ApiModelProperty("监管方式(数据字典:一般贸易)") + @Excel(name = "监管方式") + private String supervisionMethod; + + @ApiModelProperty("海关是否查验货物(默认:否)") + @Excel(name = "海关是否查验货物") + private Integer customsInspection; + + @ApiModelProperty("是否需要报关(默认:是)") + @Excel(name = "是否需要报关") + private Integer needCustomsDeclaration; + + @ApiModelProperty("是否需要运输(默认:否)") + @Excel(name = "是否需要运输") + private Integer needTransport; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("完成时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date completionTime; + + @ApiModelProperty("下单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "下单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date orderDate; + + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + + @ApiModelProperty("订单状态") + @Excel(name = "订单状态") + private String orderStatus; + + @ApiModelProperty(name = "创建时间查询条件开始日期") + private String createTimeStart; + + @ApiModelProperty(name = "创建时间查询条件结束日期") + private String createTimeEnd; + + @ApiModelProperty("入库明细-物料名称(商品名称),模糊匹配,与前端参数 materialName 一致") + private String materialName; + + @ApiModelProperty("入库明细-物料编码,模糊匹配,与前端参数 materialCode 一致") + private String materialCode; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("入库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date storageTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String pictureUrl; + + @ApiModelProperty("NC客户编码") + private String customerNcCode; + + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeTo; + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeTo; + private String xfStatus; + @ApiModelProperty(name = "入库时间查询条件开始日期") + private String storageTimeStart; + + @ApiModelProperty(name = "入库时间查询条件结束日期") + private String storageTimeEnd; + + @ApiModelProperty(name = "入库时间查询条件开始日期") + private String expectTimeStart; + + @ApiModelProperty(name = "入库时间查询条件结束日期") + private String expectTimeEnd; + @ApiModelProperty("运输业务单号") + private String businessNumber; + @ApiModelProperty("是否免费夫力费费") + private String isFreeManpowerFee; + + @ApiModelProperty("折扣") + private BigDecimal discount; + + @ApiModelProperty("火险保费") + private BigDecimal fireInsureFee; + + @ApiModelProperty("夫力费") + private BigDecimal manpowerFee; + + @ApiModelProperty("总仓租") + private BigDecimal totalWarehouseRent; + + @ApiModelProperty("业务计价类型") + private String businessChargeType; + + @ApiModelProperty("业务计价方式") + private String businessPriceWay; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderImportRowDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderImportRowDTO.java new file mode 100644 index 000000000..c051f1855 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderImportRowDTO.java @@ -0,0 +1,211 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.todo; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 入库单导入行DTO(一个Excel行=一个明细行;表头字段可重复) + * + * 约定:以【委托编号NO】作为同一张入库单的分组键(同一个委托编号可导入多条物料明细) + */ +@Data +public class ExecutionStockInOrderImportRowDTO { + + // ====== 分组/表头基础字段(建议在Excel中每行重复填写) ====== + // @Excel(name = "仓库ID") + // private Long warehouseId; + + // @Excel(name = "货主ID") + // private Long shipperId; + + @Excel(name = "货主编号") + private String shipperCode; + + // @Excel(name = "供应商ID") + // private Long supplierId; + + // @Excel(name = "入库单据类型") + // private String orderTypeCode; + + @Excel(name = "委托编号NO") + private String consignmentNo; + + // ====== 表头报关字段(与页面一致) ====== + @Excel(name = "To") + private String to; + + @Excel(name = "联系人") + private String contactPerson; + + @Excel(name = "车型及车牌") + private String vehicleInfo; + + @Excel(name = "Tel") + private String tel; + + @Excel(name = "司机签名") + private String driverSignature; + + @Excel(name = "Fax") + private String fax; + + @Excel(name = "申报地关区") + private String declarationArea; + + @Excel(name = "生产商") + private String manufacturer; + + @Excel(name = "报关员姓名及联系方式") + private String customsBrokerInfo; + + @Excel(name = "送货地址") + private String deliveryAddress; + + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @Excel(name = "起运/运抵国(地区)") + private String originDestinationCountry; + + // 客户名称只在表头中,明细行不需要此字段(代码会从表头读取并应用到此字段) + @Excel(name = "客户名称") + private String shipperName; + + @Excel(name = "承运商") + private String carrier; + + @Excel(name = "柜号") + private String containerNo; + + @Excel(name = "运输方式") + private String transportMethod; + + @Excel(name = "监管方式") + private String supervisionMethod; + + @Excel(name = "海关是否查验货物") + private Integer customsInspection; + + @Excel(name = "是否需要报关") + private Integer needCustomsDeclaration; + + @Excel(name = "是否需要运输") + private Integer needTransport; + + @Excel(name = "入仓日期") + private String warehouseDate; // 导入先按字符串,后端可根据需要转Date(当前入库单服务未强制使用) + + @Excel(name = "完成时间") + private String completionTime; + + @Excel(name = "下单日期") + private String orderDate; + + @Excel(name = "备注") + private String remark; + + // ====== 明细字段(一个Excel行=一个明细) ====== + @Excel(name = "序号") + private Integer serialNumber; + + @Excel(name = "商品名称") + private String materialName; + + @Excel(name = "料号") + private String materialCode; + + // @Excel(name = "物料基础信息ID") + // private Long materialBaseInfoId; + + // 模板中没有此字段,注释掉 + // @Excel(name = "计划数量") + private BigDecimal quantity; + + @Excel(name = "仓库数量") + private BigDecimal warehouseQuantity; + + // 支持"入库数量"列名(与"仓库数量"映射到同一个字段) + @Excel(name = "入库数量") + private BigDecimal inboundQuantity; + + @Excel(name = "规格型号/ITEM") + private String specificationModel; + + @Excel(name = "商品SKU码") + private String skuCode; + + @Excel(name = "Invoice No.") + private String invoiceNo; + + @Excel(name = "申报数量") + private BigDecimal declaredQuantity; + + @Excel(name = "申报单位") + private String declarationUnit; + + @Excel(name = "升") + private BigDecimal liter; + + @Excel(name = "箱数") + private BigDecimal boxCount; + + @Excel(name = "件数") + private BigDecimal pieceCount; + + @Excel(name = "尺寸") + private String dimensions; + + // @Excel(name = "出库数量") + private BigDecimal outboundQuantity; + + @Excel(name = "单位") + private String unit; + + // 支持多种列名格式(处理换行符、空格、括号等) + @Excel(name = "总净重(KG)") + private BigDecimal totalNetWeight; + + @Excel(name = "总净重\n(KG)") + private BigDecimal totalNetWeight2; + + @Excel(name = "总毛重(KG)") + private BigDecimal totalGrossWeight; + + @Excel(name = "总毛重 (KG)") + private BigDecimal totalGrossWeight2; + + @Excel(name = "总体积(CBM)") + private BigDecimal totalVolume; + + @Excel(name = "总体积\n(CBM)") + private BigDecimal totalVolume2; + + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea; + + @Excel(name = "总面积(SQM)") + private BigDecimal totalArea2; + + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @Excel(name = "原产国") + private String originCountry; + + @Excel(name = "箱号/卡板号") + private String boxPalletNo; + + @Excel(name = "总价") + private BigDecimal totalPrice; + + @Excel(name = "币制") + private String currency; + + @Excel(name = "备注") + private String detailRemark; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/CustomerDeliveryDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/CustomerDeliveryDetail.java new file mode 100644 index 000000000..8f8c06c15 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/CustomerDeliveryDetail.java @@ -0,0 +1,26 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 客户配送明细实体类 + */ +@Data +public class CustomerDeliveryDetail { + // 类别 + private String category; + // 发票编号 + private String invoiceNo; + // 客户编号 + private String customerCode; + // 客户名称 + private String customerName; + // 箱数 + private Integer boxCount; + // 包数 + private Integer packageCount; + // 金额 + private BigDecimal amount; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/DeliveryDataDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/DeliveryDataDTO.java new file mode 100644 index 000000000..e25709953 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/DeliveryDataDTO.java @@ -0,0 +1,18 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; +import lombok.Data; + +import java.util.List; + +/** + * 出库数据DTO(包含表头、货品明细、客户配送明细) + */ +@Data +public class DeliveryDataDTO { + // 表头信息 + private DeliveryHeader deliveryHeader; + // 货品明细列表 + private List productDetailList; + // 客户配送明细列表 + private List customerDeliveryDetailList; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/DeliveryHeader.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/DeliveryHeader.java new file mode 100644 index 000000000..4140a7730 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/DeliveryHeader.java @@ -0,0 +1,33 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出库表头信息(包含送货日期、纪录合共、发票张数等) + */ +@Data +public class DeliveryHeader { + // 送货日期 + private Date deliveryDate; + // 送货线号 + private String deliveryLineNo; + // 车次 + private Integer trainNumber; + // 纪录合共-货品总数量 + private Integer totalRecordCount; + // 纪录合共-总箱数 + private Integer totalBoxCount; + // 纪录合共-总支数 + private Integer totalPieceCount; + // 发票张数 + private Integer invoiceCount; + // 小计-总箱数 + private Integer subtotalBoxCount; + // 小计-总支数 + private Integer subtotalPieceCount; + // 小计-总金额 + private BigDecimal subtotalAmount; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/GwInDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/GwInDetail.java new file mode 100644 index 000000000..34df9b57e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/GwInDetail.java @@ -0,0 +1,29 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class GwInDetail { + //订单号 + private String billNo; + //订单行号 + private String lineNum; + //物料号 + private String itemNo; + //物料名称 + private String itemName; + //物料规格 + private String spec; + //计量单位 + private String unit; + //数量 + private BigDecimal qty; + //企业币制 + private String erpCurr; + //企业单价 + private BigDecimal erpPrice; + //申报总价 + private BigDecimal amount; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/GwStockInOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/GwStockInOrder.java new file mode 100644 index 000000000..2a4ee3288 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/GwStockInOrder.java @@ -0,0 +1,21 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class GwStockInOrder { + //订单号 + private String billNo; + //进出标记 + private String ieFlag; + //下单日期 + private Date billDate; + //客户代码 + private String corpCode; + + private List orderList; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/ProductDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/ProductDetail.java new file mode 100644 index 000000000..372aa375d --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/ProductDetail.java @@ -0,0 +1,19 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; + +import lombok.Data; + +/** + * 货品明细实体类 + */ +@Data +public class ProductDetail { + // 货品编号 + private String productCode; + // 货品简称 + private String productName; + // 箱数 + private Integer boxCount; + // 支数 + private Integer pieceCount; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInDataDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInDataDTO.java new file mode 100644 index 000000000..ba1924a3c --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInDataDTO.java @@ -0,0 +1,33 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 入库单数据DTO(封装表头信息和产品明细列表,用于Controller层传输) + */ +@Data +public class StockInDataDTO { + // 入库表头信息 + private StockInHeader stockInHeader; + // 入库产品明细列表 + private List productDetailList; + + // Getter和Setter方法 + public StockInHeader getStockInHeader() { + return stockInHeader; + } + + public void setStockInHeader(StockInHeader stockInHeader) { + this.stockInHeader = stockInHeader; + } + + public List getProductDetailList() { + return productDetailList; + } + + public void setProductDetailList(List productDetailList) { + this.productDetailList = productDetailList; + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInHeader.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInHeader.java new file mode 100644 index 000000000..d55167f81 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInHeader.java @@ -0,0 +1,34 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * 入库单表头实体类(对应Excel第一行数据) + * 存储:入库日期、OrderNO + */ +@Data +public class StockInHeader { + // 入库日期(Excel第一行第2列) + private Date stockInDate; + // 订单编号(Excel第一行第4列) + private String orderNo; + + // Getter和Setter方法 + public Date getStockInDate() { + return stockInDate; + } + + public void setStockInDate(Date stockInDate) { + this.stockInDate = stockInDate; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInProductDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInProductDetail.java new file mode 100644 index 000000000..a187b93a0 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/vo/StockInProductDetail.java @@ -0,0 +1,73 @@ +package com.mhd.oms.domain.executionStockInOrder.repository.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * 入库产品明细实体类(对应Excel第二行开始的表格数据) + */ +@Data +public class StockInProductDetail { + // 产品编号(Excel第1列) + private String productCode; + // 产品名称(Excel第2列) + private String productName; + // 箱含量(Excel第5列) + private Integer boxCapacity; + // 件数(Excel第6列) + private Integer pieceCount; + // 箱数(Excel第7列:Qty(cases)) + private Integer boxCount; + // 饮用日期(Excel第8列) + private Date drinkDate; + + // Getter和Setter方法 + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public Integer getBoxCapacity() { + return boxCapacity; + } + + public void setBoxCapacity(Integer boxCapacity) { + this.boxCapacity = boxCapacity; + } + + public Integer getPieceCount() { + return pieceCount; + } + + public void setPieceCount(Integer pieceCount) { + this.pieceCount = pieceCount; + } + + public Integer getBoxCount() { + return boxCount; + } + + public void setBoxCount(Integer boxCount) { + this.boxCount = boxCount; + } + + public Date getDrinkDate() { + return drinkDate; + } + + public void setDrinkDate(Date drinkDate) { + this.drinkDate = drinkDate; + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java new file mode 100644 index 000000000..ae93c9855 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java @@ -0,0 +1,2286 @@ +package com.mhd.oms.domain.executionStockInOrder.service; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.enums.DictCode; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.mapper.ExecutionInMaterialDetailMapper; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderPO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDTO; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.GwInDetail; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.GwStockInOrder; +import com.mhd.oms.domain.gwLog.entity.GwLog; +import com.mhd.oms.domain.gwLog.repository.mapper.GwLogMapper; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.UserServiceFeign; +import com.mhd.system.api.domain.*; +import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.DateUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 入库单ApplicationService + * + * @author gen + * @date 2024-05-21 + */ +@Service +@Slf4j +public class ExecutionStockInOrderApplicationService { + @Autowired + private ExecutionStockInOrderDomainService stockInOrderDomainService; + @Autowired + private UserServiceFeign userServiceFeign; + @Autowired + private SystemServiceFeign systemServiceFeign; + @Resource + private GwLogMapper gwLogMapper; + @Autowired + private ExecutionStockInOrderMapper reservationStockInOrderMapper; + @Autowired + private ExecutionInMaterialDetailMapper reservationInMaterialDetailMapper; +// @Autowired +// private IMaterialBaseInfoService materialBaseInfoService; + private static final String PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData"; + private static final String API_NAME = "save_order_i"; + private static final String VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; + + /** + * 分页查询入库单列表 + */ + + public List queryList(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null){ + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = stockInOrderDO.getOrganizationId(); // 前端传递的 organizationId + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (userOrganizationId != null && userOrganizationId == 2827L) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + stockInOrderDO.setOrganizationId(frontendOrganizationId); + stockInOrderDO.setTopOrganizationId(null); // 明确设置为 null,避免使用 topOrganizationId 条件 + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + stockInOrderDO.setOrganizationId(null); + stockInOrderDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 如果前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId != null && userOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(userOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + stockInOrderDO.setOrganizationId(userOrganizationId); + } + // 如果前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (userOrganizationId != null) { + stockInOrderDO.setOrganizationId(userOrganizationId); + } + } + // 只有当 organizationId 为 null 时,才使用 topOrganizationId 作为查询条件 + // 如果 organizationId 不为 null,则优先使用 organizationId,不使用 topOrganizationId + if (stockInOrderDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + stockInOrderDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 对于非2827组织,必须设置 topOrganizationId=2827 + stockInOrderDO.setTopOrganizationId(2827L); + } + } + // 前端有传warehouseId则优先使用传参;未传时才使用"用户关联仓库"作为默认值 + if (stockInOrderDO.getWarehouseId() == null) { + AssociationWarehouseCacheDO associationWarehouseCacheDO = + SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null) { + stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + } + } + + // 库管角色过滤:不展示已创建(status=1)的入库单 + // 说明:部分场景下角色码可能不在 userPo.roleCode 中,而在 loginUser.roles/roleList 中。 +// if (loginUser != null) { +// String targetRoleCode = "KGY-001"; +// boolean isKuGuan = false; +// +// String roleCode = loginUser.getUserPo() != null ? loginUser.getUserPo().getRoleCode() : null; +// if (StringUtils.isNotBlank(roleCode) && roleCode.contains(targetRoleCode)) { +// isKuGuan = true; +// } +// +// if (!isKuGuan && loginUser.getRoleList() != null) { +// isKuGuan = loginUser.getRoleList().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (!isKuGuan && loginUser.getRoles() != null) { +// isKuGuan = loginUser.getRoles().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (isKuGuan) { +// Integer currentGtStatus = stockInOrderDO.getGtStatus(); +// if (currentGtStatus == null || currentGtStatus < 1) { +// stockInOrderDO.setGtStatus(1); // status > 1 +// } +// } +// } + return stockInOrderDomainService.queryList(stockInOrderDO); + } + + + /** + * 新增入库单 + */ + public Boolean insert(ExecutionStockInOrderDO stockInOrderDO) { +// 如果仓库ID为空,从当前登录用户的关联仓库中获取 + if (stockInOrderDO.getWarehouseId() == null) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("登录已失效,请重新登录"); + } + AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO == null || associationWarehouseCacheDO.getWarehouseId() == null) { + throw new ServiceException("当前用户未配置关联仓库,请先配置仓库"); + } + stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + //设置仓库 + setWarehouseInfo(stockInOrderDO); +// 设置货主信息 + shipperParam(stockInOrderDO); +// 设置供应商信息 + supplierParam(stockInOrderDO); +// 设置数据字典键值 + setDataDict(stockInOrderDO); + return stockInOrderDomainService.insert(stockInOrderDO); + } + + /** + * 修改入库单 + */ + public Boolean update(ExecutionStockInOrderDO stockInOrderDO) { + //设置仓库 + setWarehouseInfo(stockInOrderDO); + //设置货主信息 + shipperParam(stockInOrderDO); + //设置供应商信息 + supplierParam(stockInOrderDO); + //设置数据字典键值 + setDataDict(stockInOrderDO); + return stockInOrderDomainService.update(stockInOrderDO); + } + + /** + * 批量删除入库单 + * 只有已创建状态(status = 1)的入库单可以删除 + */ + public boolean delete(Long[] inOrderIds) { + if (inOrderIds == null || inOrderIds.length == 0) { + throw new ServiceException("删除的入库单ID不能为空"); + } + + // 查询入库单信息,检查状态 + for (Long inOrderId : inOrderIds) { + ExecutionStockInOrderPO stockInOrderPO = stockInOrderDomainService.getInfo(inOrderId); + if (stockInOrderPO == null) { + throw new ServiceException("入库单不存在,入库单ID:" + inOrderId); + } + // 只有已创建状态(status = 1)的入库单可以删除 + if (stockInOrderPO.getStatus() == null || !stockInOrderPO.getStatus().equals(1)) { + throw new ServiceException("只有已创建状态的入库单可以删除,入库单号:" + stockInOrderPO.getInOrderNumber() + ",当前状态:" + getStatusName(stockInOrderPO.getStatus())); + } + } + + return stockInOrderDomainService.delete(inOrderIds); + } + + /** + * 获取入库状态名称 + */ + private String getStatusName(Integer status) { + if (status == null) { + return "未知"; + } + switch (status) { + case 1: return "已创建"; + case 2: return "已审核"; + case 3: return "收货中"; + case 4: return "上架中"; + case 5: return "已入库"; + case 6: return "已取消"; + case 7: return "已关闭"; + default: return "未知"; + } + } + + /** + * 获取入库单详细信息 + */ + public ExecutionStockInOrderPO getInfo(Long inOrderId) + { + ExecutionStockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId); + String userNcCode = reservationStockInOrderMapper.getUserNcCode(info.getShipperId()); + info.setKhdm(userNcCode); + List materialDetailList = info.getMaterialDetailList(); + if (materialDetailList != null && !materialDetailList.isEmpty()) { + for (ExecutionInMaterialDetailPO materialDetail : materialDetailList) { + materialDetail.setKhdm(userNcCode); + } + info.setMaterialDetailList(materialDetailList); + } + return info; + } + + + + /** + * @description 审核入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + public Boolean auditState(ExecutionStockInOrderDO stockInOrderDO){ + Boolean b = stockInOrderDomainService.auditState(stockInOrderDO); +// List inOrderIds = stockInOrderDO.getInOrderIds(); +// if (inOrderIds != null && !inOrderIds.isEmpty()) { +// ExecutionStockInOrder stockInOrder = reservationStockInOrderMapper.selectById(inOrderIds.get(0)); +// Integer needCustomsDeclaration = stockInOrder.getNeedCustomsDeclaration(); +// Integer auditStatus = stockInOrder.getIssueStatus(); +// try { +// if (needCustomsDeclaration != null && needCustomsDeclaration == 1 && auditStatus != null && auditStatus == 2) { +// Long inOrderId = stockInOrder.getInOrderId(); +// List idList = new ArrayList<>(); +// idList.add(inOrderId); +// //batchPush(idList); +// } +// } catch (Exception e) { +// throw new ServiceException("推送关务系统失败!"); +// } +// } + return b; + } + + public Boolean cancelAuditState(ExecutionStockInOrderDO stockInOrderDO){ + Boolean b = stockInOrderDomainService.cancelAuditState(stockInOrderDO); + return b; + } + + /** + * @description 下发入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param + * @return Boolean + */ + public Boolean returnResult(String orderNumber, Long status, String type){ + return stockInOrderDomainService.returnResult(orderNumber, status, type); + } + + + /** + * @description 下发入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + public Boolean issueOrder(ExecutionStockInOrderDO stockInOrderDO){ + return stockInOrderDomainService.issueOrder(stockInOrderDO); + } + + /** + * @description 取消入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + public Boolean cancelOrder(ExecutionStockInOrderDO stockInOrderDO){ + return stockInOrderDomainService.cancelOrder(stockInOrderDO); + } + + + /** + * @description 关闭入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + public Boolean closeOrder(ExecutionStockInOrderDO stockInOrderDO){ + return stockInOrderDomainService.closeOrder(stockInOrderDO); + } + + public Boolean pushInOrder(StockInOrderTZPD stockInOrderDO){ + return stockInOrderDomainService.pushInOrder(stockInOrderDO); + } + + public Boolean pushInOrderDetail(InMaterialDetailTZPD inMaterialDetail){ + return stockInOrderDomainService.pushInOrderDetail(inMaterialDetail); + } + + /** + * 导入入库单(根据Excel模板:表头在第1-12行,明细表从第13行开始) + * Excel模板结构: + * - 第1-12行:表头信息(包含委托编号NO、客户名称等) + * - 第13行:明细表列名 + * - 第14行开始:明细数据 + */ +// public Boolean importData(MultipartFile file, Long warehouseId, String warehouseCode, String warehouseName) { +// if (file == null || file.isEmpty()) { +// throw new ServiceException("导入文件不能为空"); +// } +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// if (loginUser == null) { +// throw new ServiceException("登录已失效,请重新登录"); +// } +// +// try (InputStream is = file.getInputStream()) { +// // 明细表的列名在第13行(索引12),数据从第14行开始 +// int detailTitleRowIndex = 12; // 第13行(索引从0开始) +// +// // 先读取表头信息(第1-12行),提取所有表头字段 +// ExecutionStockInOrderImportRowDTO headerInfo = new ExecutionStockInOrderImportRowDTO(); +// try (InputStream isForHeader = file.getInputStream()) { +// Workbook wb = WorkbookFactory.create(isForHeader); +// Sheet sheet = wb.getSheetAt(0); +// +// // 从表头部分(第1-12行)读取所有字段信息 +// for (int rowIdx = 0; rowIdx < 12; rowIdx++) { +// Row row = sheet.getRow(rowIdx); +// if (row != null) { +// for (int colIdx = 0; colIdx < row.getPhysicalNumberOfCells(); colIdx++) { +// Cell labelCell = row.getCell(colIdx); +// if (labelCell != null) { +// String labelValue = getCellValueAsString(labelCell); +// if (StringUtils.isNotBlank(labelValue)) { +// // 调试日志:打印所有非空单元格内容 +// log.info("表头第{}行第{}列: {}", rowIdx + 1, colIdx + 1, labelValue); +// String value = null; +// +// // 先尝试从同一单元格提取值(如果包含冒号) +// String extractedFromSameCell = null; +// if (labelValue.contains(":")) { +// String[] parts = labelValue.split(":", 2); +// if (parts.length > 1) { +// extractedFromSameCell = parts[1].trim(); +// } +// } +// +// // 跳过空单元格,查找下一个非空单元格作为值(最多向后查找10列) +// String nextCellValue = null; +// for (int searchColIdx = colIdx + 1; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell valueCell = row.getCell(searchColIdx); +// if (valueCell != null) { +// String cellValue = getCellValueAsString(valueCell); +// if (StringUtils.isNotBlank(cellValue)) { +// nextCellValue = cellValue; +// log.info("表头第{}行,标签'{}'在第{}列,找到值'{}'在第{}列", rowIdx + 1, labelValue, colIdx + 1, nextCellValue, searchColIdx + 1); +// break; +// } +// } +// } +// +// // 优先使用下一个非空单元格的值(如果存在且不为空) +// // 如果下一个单元格为空,且同一单元格有冒号后的值,则使用冒号后的值 +// // 但如果冒号后的值是选项列表(如"3T、5T、8T、10T"),则应该使用下一个单元格的值 +// if (StringUtils.isNotBlank(nextCellValue)) { +// // 如果冒号后的值是选项列表(包含顿号、逗号等),优先使用下一个单元格的值 +// if (extractedFromSameCell != null && (extractedFromSameCell.contains("、") || extractedFromSameCell.contains(","))) { +// value = nextCellValue; +// } else { +// // 否则优先使用下一个单元格的值 +// value = nextCellValue; +// } +// } else if (StringUtils.isNotBlank(extractedFromSameCell)) { +// // 如果下一个单元格为空,使用同一单元格冒号后的值 +// value = extractedFromSameCell; +// } +// +// // 根据标签匹配字段 +// if (StringUtils.isNotBlank(value)) { +// // 委托编号NO(支持"委托编号NO"、"委托编号"等格式) +// if (labelValue.contains("委托编号") && StringUtils.isBlank(headerInfo.getConsignmentNo())) { +// // 排除标签本身和包含"NO"的标签文本 +// if (!value.contains("委托编号") && !value.contains("NO") && !value.equals("委托编号NO") && !value.equals("委托编号")) { +// headerInfo.setConsignmentNo(value); +// log.info("从表头第{}行读取到委托编号NO: {}", rowIdx + 1, value); +// } +// } +// // 客户名称 +// else if (labelValue.contains("客户名称") && StringUtils.isBlank(headerInfo.getShipperName())) { +// if (!value.contains("客户") && !value.equals("客户名称")) { +// headerInfo.setShipperName(value); +// log.info("从表头第{}行读取到客户名称: {}", rowIdx + 1, value); +// } +// } +// // To(需要精确匹配,避免误匹配) +// else if ((labelValue.equals("To") || labelValue.equals("To:") || labelValue.equals("To:") || labelValue.startsWith("To:") || labelValue.startsWith("To:")) && StringUtils.isBlank(headerInfo.getTo())) { +// // 如果值是"To"或"To:",说明可能是标签本身,继续查找下一个值 +// if (value.equals("To") || value.equals("To:") || value.equals("To:")) { +// // 继续向后查找,跳过标签(包含冒号的文本) +// boolean found = false; +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// // 跳过标签文本(包含冒号、等于"To"等,以及常见的标签关键词) +// if (StringUtils.isNotBlank(nextValue) && +// !nextValue.equals("To") && !nextValue.equals("To:") && !nextValue.equals("To:") && +// !nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("联系人") && !nextValue.contains("Tel") && !nextValue.contains("Fax") && +// !nextValue.contains("客户") && !nextValue.contains("地址") && !nextValue.contains("日期") && +// !nextValue.contains("方式") && !nextValue.contains("关区") && !nextValue.contains("关别")) { +// headerInfo.setTo(nextValue); +// log.info("从表头第{}行读取到To: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// // 如果没找到合适的值,尝试查找下一行的同一列 +// if (!found) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.equals("To") && !nextRowValue.equals("To:") && !nextRowValue.equals("To:")) { +// headerInfo.setTo(nextRowValue); +// log.info("从表头第{}行(下一行)读取到To: {}", rowIdx + 2, nextRowValue); +// } +// } +// } +// } +// } else if (!value.contains(":") && !value.contains(":") && +// !value.contains("联系人") && !value.contains("Tel") && !value.contains("Fax") && +// !value.contains("客户") && !value.contains("地址") && !value.contains("日期") && +// !value.contains("方式") && !value.contains("关区") && !value.contains("关别")) { +// // 值不是标签(不包含冒号和常见标签关键词),可以使用 +// headerInfo.setTo(value); +// log.info("从表头第{}行读取到To: {}", rowIdx + 1, value); +// } +// } else if (labelValue.contains("联系人") && StringUtils.isBlank(headerInfo.getContactPerson())) { +// headerInfo.setContactPerson(value); +// log.info("从表头第{}行读取到联系人: {}", rowIdx + 1, value); +// } else if ((labelValue.contains("车型") || labelValue.contains("车牌")) && StringUtils.isBlank(headerInfo.getVehicleInfo())) { +// // 过滤掉标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(value) && +// !value.contains(":") && !value.contains(":") && +// !value.contains("委托编号") && !value.contains("NO") && !value.contains("司机签名") && +// !value.contains("完成时间") && !value.contains("下单日期") && !value.contains("入仓日期") && +// !value.contains("联系人") && !value.contains("Tel") && !value.contains("Fax") && +// !value.contains("客户") && !value.contains("地址") && !value.contains("日期") && +// !value.contains("方式") && !value.contains("关区") && !value.contains("关别") && +// !value.contains("报关员") && !value.contains("生产商") && !value.contains("承运方") && +// !value.contains("柜号") && !value.contains("车型") && !value.contains("车牌")) { +// headerInfo.setVehicleInfo(value); +// log.info("从表头第{}行读取到车型及车牌: {}", rowIdx + 1, value); +// } else { +// // 如果找到的值是标签,继续向后查找 +// boolean found = false; +// boolean stopSearch = false; // 是否遇到下一个标签,需要停止搜索 +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// if (StringUtils.isNotBlank(nextValue)) { +// // 检查是否遇到下一个标签(如"委托编号NO"),如果遇到则停止搜索 +// if (nextValue.contains("委托编号") || (nextValue.contains("NO") && nextValue.contains(":")) || +// nextValue.contains("司机签名") || nextValue.contains("完成时间") || nextValue.contains("下单日期") || +// nextValue.contains("入仓日期") || nextValue.contains("联系人") || nextValue.contains("Tel") || +// nextValue.contains("Fax") || nextValue.contains("客户名称") || nextValue.contains("送货地址") || +// nextValue.contains("申报地关区") || nextValue.contains("进出境关别") || nextValue.contains("起运") || +// nextValue.contains("运抵国") || nextValue.contains("柜号") || nextValue.contains("运输方式") || +// nextValue.contains("监管方式") || nextValue.contains("海关是否查验货物") || nextValue.contains("报关员")) { +// // 遇到下一个标签,停止搜索 +// stopSearch = true; +// log.warn("表头第{}行,标签'{}'在第{}列,向后搜索到第{}列时遇到下一个标签'{}',停止搜索,车型及车牌字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, searchColIdx + 1, nextValue); +// break; +// } +// // 跳过标签文本(包含冒号、常见标签关键词等) +// if (!nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("委托编号") && !nextValue.contains("NO") && !nextValue.contains("司机签名") && +// !nextValue.contains("完成时间") && !nextValue.contains("下单日期") && !nextValue.contains("入仓日期") && +// !nextValue.contains("联系人") && !nextValue.contains("Tel") && !nextValue.contains("Fax") && +// !nextValue.contains("客户") && !nextValue.contains("地址") && !nextValue.contains("日期") && +// !nextValue.contains("方式") && !nextValue.contains("关区") && !nextValue.contains("关别") && +// !nextValue.contains("报关员") && !nextValue.contains("生产商") && !nextValue.contains("承运方") && +// !nextValue.contains("柜号") && !nextValue.contains("车型") && !nextValue.contains("车牌")) { +// headerInfo.setVehicleInfo(nextValue); +// log.info("从表头第{}行读取到车型及车牌: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// } +// // 如果没找到合适的值且未遇到下一个标签,尝试查找下一行的同一列 +// if (!found && !stopSearch) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.contains("委托编号") && !nextRowValue.contains("NO") && !nextRowValue.contains("司机签名") && +// !nextRowValue.contains("完成时间") && !nextRowValue.contains("下单日期") && !nextRowValue.contains("入仓日期") && +// !nextRowValue.contains("联系人") && !nextRowValue.contains("Tel") && !nextRowValue.contains("Fax") && +// !nextRowValue.contains("客户") && !nextRowValue.contains("地址") && !nextRowValue.contains("日期") && +// !nextRowValue.contains("方式") && !nextRowValue.contains("关区") && !nextRowValue.contains("关别") && +// !nextRowValue.contains("报关员") && !nextRowValue.contains("生产商") && !nextRowValue.contains("承运方") && +// !nextRowValue.contains("柜号") && !nextRowValue.contains("车型") && !nextRowValue.contains("车牌")) { +// headerInfo.setVehicleInfo(nextRowValue); +// log.info("从表头第{}行(下一行)读取到车型及车牌: {}", rowIdx + 2, nextRowValue); +// found = true; +// } +// } +// } +// } +// // 如果最终都没找到实际的值,不设置字段(保持为空) +// if (!found && !stopSearch) { +// log.warn("表头第{}行,标签'{}'在第{}列,找到的值是标签'{}',继续向后查找未找到实际值,车型及车牌字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, value); +// } +// } +// } else if ((labelValue.contains("承运方") || labelValue.contains("承运商")) && StringUtils.isBlank(headerInfo.getCarrier())) { +// headerInfo.setCarrier(value); +// log.info("从表头第{}行读取到承运方: {}", rowIdx + 1, value); +// } else if (labelValue.contains("Tel") && StringUtils.isBlank(headerInfo.getTel())) { +// headerInfo.setTel(value); +// log.info("从表头第{}行读取到Tel: {}", rowIdx + 1, value); +// } else if (labelValue.contains("司机签名") && StringUtils.isBlank(headerInfo.getDriverSignature())) { +// headerInfo.setDriverSignature(value); +// log.info("从表头第{}行读取到司机签名: {}", rowIdx + 1, value); +// } else if (labelValue.contains("入仓日期") && StringUtils.isBlank(headerInfo.getWarehouseDate())) { +// headerInfo.setWarehouseDate(value); +// log.info("从表头第{}行读取到入仓日期: {}", rowIdx + 1, value); +// } else if (labelValue.contains("Fax") && StringUtils.isBlank(headerInfo.getFax())) { +// headerInfo.setFax(value); +// log.info("从表头第{}行读取到Fax: {}", rowIdx + 1, value); +// } else if (labelValue.contains("申报地关区") && StringUtils.isBlank(headerInfo.getDeclarationArea())) { +// headerInfo.setDeclarationArea(value); +// log.info("从表头第{}行读取到申报地关区: {}", rowIdx + 1, value); +// } else if (labelValue.contains("生产商") && StringUtils.isBlank(headerInfo.getManufacturer())) { +// headerInfo.setManufacturer(value); +// log.info("从表头第{}行读取到生产商: {}", rowIdx + 1, value); +// } else if (labelValue.contains("报关员") && StringUtils.isBlank(headerInfo.getCustomsBrokerInfo())) { +// // 过滤掉标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(value) && +// !value.contains(":") && !value.contains(":") && +// !value.contains("完成时间") && !value.contains("下单日期") && !value.contains("入仓日期") && +// !value.contains("联系人") && !value.contains("Tel") && !value.contains("Fax") && +// !value.contains("客户") && !value.contains("地址") && !value.contains("日期") && +// !value.contains("方式") && !value.contains("关区") && !value.contains("关别") && +// !value.contains("报关员") && !value.contains("生产商") && !value.contains("承运方")) { +// headerInfo.setCustomsBrokerInfo(value); +// log.info("从表头第{}行读取到报关员姓名及联系方式: {}", rowIdx + 1, value); +// } else { +// // 如果找到的值是标签,继续向后查找 +// boolean found = false; +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// // 跳过标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(nextValue) && +// !nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("完成时间") && !nextValue.contains("下单日期") && !nextValue.contains("入仓日期") && +// !nextValue.contains("联系人") && !nextValue.contains("Tel") && !nextValue.contains("Fax") && +// !nextValue.contains("客户") && !nextValue.contains("地址") && !nextValue.contains("日期") && +// !nextValue.contains("方式") && !nextValue.contains("关区") && !nextValue.contains("关别") && +// !nextValue.contains("报关员") && !nextValue.contains("生产商") && !nextValue.contains("承运方")) { +// headerInfo.setCustomsBrokerInfo(nextValue); +// log.info("从表头第{}行读取到报关员姓名及联系方式: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// // 如果没找到合适的值,尝试查找下一行的同一列 +// if (!found) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.contains("完成时间") && !nextRowValue.contains("下单日期") && !nextRowValue.contains("入仓日期") && +// !nextRowValue.contains("联系人") && !nextRowValue.contains("Tel") && !nextRowValue.contains("Fax") && +// !nextRowValue.contains("客户") && !nextRowValue.contains("地址") && !nextRowValue.contains("日期") && +// !nextRowValue.contains("方式") && !nextRowValue.contains("关区") && !nextRowValue.contains("关别") && +// !nextRowValue.contains("报关员") && !nextRowValue.contains("生产商") && !nextRowValue.contains("承运方")) { +// headerInfo.setCustomsBrokerInfo(nextRowValue); +// log.info("从表头第{}行(下一行)读取到报关员姓名及联系方式: {}", rowIdx + 2, nextRowValue); +// found = true; +// } +// } +// } +// // 如果最终都没找到实际的值,不设置字段(保持为空) +// if (!found) { +// log.warn("表头第{}行,标签'{}'在第{}列,找到的值是标签'{}',继续向后查找未找到实际值,报关员姓名及联系方式字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, value); +// } +// } +// } +// } else if (labelValue.contains("送货地址") && StringUtils.isBlank(headerInfo.getDeliveryAddress())) { +// headerInfo.setDeliveryAddress(value); +// log.info("从表头第{}行读取到送货地址: {}", rowIdx + 1, value); +// } else if (labelValue.contains("进出境关别") && StringUtils.isBlank(headerInfo.getEntryExitCustoms())) { +// headerInfo.setEntryExitCustoms(value); +// log.info("从表头第{}行读取到进出境关别: {}", rowIdx + 1, value); +// } else if ((labelValue.contains("起运") || labelValue.contains("运抵国")) && StringUtils.isBlank(headerInfo.getOriginDestinationCountry())) { +// headerInfo.setOriginDestinationCountry(value); +// log.info("从表头第{}行读取到起运/运抵国(地区): {}", rowIdx + 1, value); +// } else if (labelValue.contains("柜号") && StringUtils.isBlank(headerInfo.getContainerNo())) { +// // 过滤掉标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(value) && +// !value.contains(":") && !value.contains(":") && +// !value.contains("司机签名") && !value.contains("委托编号") && !value.contains("NO") && +// !value.contains("完成时间") && !value.contains("下单日期") && !value.contains("入仓日期") && +// !value.contains("联系人") && !value.contains("Tel") && !value.contains("Fax") && +// !value.contains("客户") && !value.contains("地址") && !value.contains("日期") && +// !value.contains("方式") && !value.contains("关区") && !value.contains("关别") && +// !value.contains("报关员") && !value.contains("生产商") && !value.contains("承运方") && +// !value.contains("车型") && !value.contains("车牌")) { +// headerInfo.setContainerNo(value); +// log.info("从表头第{}行读取到柜号: {}", rowIdx + 1, value); +// } else { +// // 如果找到的值是标签,继续向后查找 +// boolean found = false; +// boolean stopSearch = false; // 是否遇到下一个标签,需要停止搜索 +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// if (StringUtils.isNotBlank(nextValue)) { +// // 检查是否遇到下一个标签(如"委托编号NO"、"司机签名"等),如果遇到则停止搜索 +// if (nextValue.contains("委托编号") || (nextValue.contains("NO") && nextValue.contains(":")) || +// nextValue.contains("司机签名") || nextValue.contains("完成时间") || nextValue.contains("下单日期") || +// nextValue.contains("入仓日期") || nextValue.contains("联系人") || nextValue.contains("Tel") || +// nextValue.contains("Fax") || nextValue.contains("客户名称") || nextValue.contains("送货地址") || +// nextValue.contains("申报地关区") || nextValue.contains("进出境关别") || nextValue.contains("起运") || +// nextValue.contains("运抵国") || nextValue.contains("运输方式") || nextValue.contains("监管方式") || +// nextValue.contains("海关是否查验货物") || nextValue.contains("报关员")) { +// // 遇到下一个标签,停止搜索 +// stopSearch = true; +// log.warn("表头第{}行,标签'{}'在第{}列,向后搜索到第{}列时遇到下一个标签'{}',停止搜索,柜号字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, searchColIdx + 1, nextValue); +// break; +// } +// // 跳过标签文本(包含冒号、常见标签关键词等) +// if (!nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("司机签名") && !nextValue.contains("委托编号") && !nextValue.contains("NO") && +// !nextValue.contains("完成时间") && !nextValue.contains("下单日期") && !nextValue.contains("入仓日期") && +// !nextValue.contains("联系人") && !nextValue.contains("Tel") && !nextValue.contains("Fax") && +// !nextValue.contains("客户") && !nextValue.contains("地址") && !nextValue.contains("日期") && +// !nextValue.contains("方式") && !nextValue.contains("关区") && !nextValue.contains("关别") && +// !nextValue.contains("报关员") && !nextValue.contains("生产商") && !nextValue.contains("承运方") && +// !nextValue.contains("车型") && !nextValue.contains("车牌")) { +// headerInfo.setContainerNo(nextValue); +// log.info("从表头第{}行读取到柜号: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// } +// // 如果没找到合适的值且未遇到下一个标签,尝试查找下一行的同一列 +// if (!found && !stopSearch) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.contains("司机签名") && !nextRowValue.contains("委托编号") && !nextRowValue.contains("NO") && +// !nextRowValue.contains("完成时间") && !nextRowValue.contains("下单日期") && !nextRowValue.contains("入仓日期") && +// !nextRowValue.contains("联系人") && !nextRowValue.contains("Tel") && !nextRowValue.contains("Fax") && +// !nextRowValue.contains("客户") && !nextRowValue.contains("地址") && !nextRowValue.contains("日期") && +// !nextRowValue.contains("方式") && !nextRowValue.contains("关区") && !nextRowValue.contains("关别") && +// !nextRowValue.contains("报关员") && !nextRowValue.contains("生产商") && !nextRowValue.contains("承运方") && +// !nextRowValue.contains("车型") && !nextRowValue.contains("车牌")) { +// headerInfo.setContainerNo(nextRowValue); +// log.info("从表头第{}行(下一行)读取到柜号: {}", rowIdx + 2, nextRowValue); +// found = true; +// } +// } +// } +// } +// // 如果最终都没找到实际的值,不设置字段(保持为空) +// if (!found && !stopSearch) { +// log.warn("表头第{}行,标签'{}'在第{}列,找到的值是标签'{}',继续向后查找未找到实际值,柜号字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, value); +// } +// } +// } else if (labelValue.contains("运输方式") && StringUtils.isBlank(headerInfo.getTransportMethod())) { +// headerInfo.setTransportMethod(value); +// log.info("从表头第{}行读取到运输方式: {}", rowIdx + 1, value); +// } else if (labelValue.contains("监管方式") && StringUtils.isBlank(headerInfo.getSupervisionMethod())) { +// headerInfo.setSupervisionMethod(value); +// log.info("从表头第{}行读取到监管方式: {}", rowIdx + 1, value); +// } else if (labelValue.contains("海关是否查验货物")) { +// // 过滤掉标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(value) && +// !value.contains(":") && !value.contains(":") && +// !value.contains("进出境关别") && !value.contains("委托编号") && !value.contains("NO") && +// !value.contains("司机签名") && !value.contains("完成时间") && !value.contains("下单日期") && +// !value.contains("入仓日期") && !value.contains("联系人") && !value.contains("Tel") && +// !value.contains("Fax") && !value.contains("客户") && !value.contains("地址") && +// !value.contains("日期") && !value.contains("方式") && !value.contains("关区") && +// !value.contains("报关员") && !value.contains("生产商") && !value.contains("承运方") && +// !value.contains("车型") && !value.contains("车牌") && !value.contains("柜号")) { +// if (value.contains("是") || value.equals("1")) { +// headerInfo.setCustomsInspection(1); +// } else if (value.contains("否") || value.equals("0")) { +// headerInfo.setCustomsInspection(0); +// } +// log.info("从表头第{}行读取到海关是否查验货物: {}", rowIdx + 1, value); +// } else { +// // 如果找到的值是标签,继续向后查找 +// boolean found = false; +// boolean stopSearch = false; // 是否遇到下一个标签,需要停止搜索 +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// if (StringUtils.isNotBlank(nextValue)) { +// // 检查是否遇到下一个标签(如"委托编号NO"、"进出境关别"等),如果遇到则停止搜索 +// if (nextValue.contains("委托编号") || (nextValue.contains("NO") && nextValue.contains(":")) || +// nextValue.contains("司机签名") || nextValue.contains("完成时间") || nextValue.contains("下单日期") || +// nextValue.contains("入仓日期") || nextValue.contains("联系人") || nextValue.contains("Tel") || +// nextValue.contains("Fax") || nextValue.contains("客户名称") || nextValue.contains("送货地址") || +// nextValue.contains("申报地关区") || nextValue.contains("进出境关别") || nextValue.contains("起运") || +// nextValue.contains("运抵国") || nextValue.contains("柜号") || nextValue.contains("运输方式") || +// nextValue.contains("监管方式") || nextValue.contains("报关员")) { +// // 遇到下一个标签,停止搜索 +// stopSearch = true; +// log.warn("表头第{}行,标签'{}'在第{}列,向后搜索到第{}列时遇到下一个标签'{}',停止搜索,海关是否查验货物字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, searchColIdx + 1, nextValue); +// break; +// } +// // 跳过标签文本(包含冒号、常见标签关键词等) +// if (!nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("进出境关别") && !nextValue.contains("委托编号") && !nextValue.contains("NO") && +// !nextValue.contains("司机签名") && !nextValue.contains("完成时间") && !nextValue.contains("下单日期") && +// !nextValue.contains("入仓日期") && !nextValue.contains("联系人") && !nextValue.contains("Tel") && +// !nextValue.contains("Fax") && !nextValue.contains("客户") && !nextValue.contains("地址") && +// !nextValue.contains("日期") && !nextValue.contains("方式") && !nextValue.contains("关区") && +// !nextValue.contains("报关员") && !nextValue.contains("生产商") && !nextValue.contains("承运方") && +// !nextValue.contains("车型") && !nextValue.contains("车牌") && !nextValue.contains("柜号")) { +// if (nextValue.contains("是") || nextValue.equals("1")) { +// headerInfo.setCustomsInspection(1); +// } else if (nextValue.contains("否") || nextValue.equals("0")) { +// headerInfo.setCustomsInspection(0); +// } +// log.info("从表头第{}行读取到海关是否查验货物: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// } +// // 如果没找到合适的值且未遇到下一个标签,尝试查找下一行的同一列 +// if (!found && !stopSearch) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.contains("进出境关别") && !nextRowValue.contains("委托编号") && !nextRowValue.contains("NO") && +// !nextRowValue.contains("司机签名") && !nextRowValue.contains("完成时间") && !nextRowValue.contains("下单日期") && +// !nextRowValue.contains("入仓日期") && !nextRowValue.contains("联系人") && !nextRowValue.contains("Tel") && +// !nextRowValue.contains("Fax") && !nextRowValue.contains("客户") && !nextRowValue.contains("地址") && +// !nextRowValue.contains("日期") && !nextRowValue.contains("方式") && !nextRowValue.contains("关区") && +// !nextRowValue.contains("报关员") && !nextRowValue.contains("生产商") && !nextRowValue.contains("承运方") && +// !nextRowValue.contains("车型") && !nextRowValue.contains("车牌") && !nextRowValue.contains("柜号")) { +// if (nextRowValue.contains("是") || nextRowValue.equals("1")) { +// headerInfo.setCustomsInspection(1); +// } else if (nextRowValue.contains("否") || nextRowValue.equals("0")) { +// headerInfo.setCustomsInspection(0); +// } +// log.info("从表头第{}行(下一行)读取到海关是否查验货物: {}", rowIdx + 2, nextRowValue); +// found = true; +// } +// } +// } +// } +// // 如果最终都没找到实际的值,不设置字段(保持为空) +// if (!found && !stopSearch) { +// log.warn("表头第{}行,标签'{}'在第{}列,找到的值是标签'{}',继续向后查找未找到实际值,海关是否查验货物字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, value); +// } +// } +// } else if (labelValue.contains("是否需要报关")) { +// if (value.contains("是") || value.equals("1")) { +// headerInfo.setNeedCustomsDeclaration(1); +// } else if (value.contains("否") || value.equals("0")) { +// headerInfo.setNeedCustomsDeclaration(0); +// } +// log.info("从表头第{}行读取到是否需要报关: {}", rowIdx + 1, value); +// } else if (labelValue.contains("是否需要运输")) { +// if (value.contains("是") || value.equals("1")) { +// headerInfo.setNeedTransport(1); +// } else if (value.contains("否") || value.equals("0")) { +// headerInfo.setNeedTransport(0); +// } +// log.info("从表头第{}行读取到是否需要运输: {}", rowIdx + 1, value); +// } else if (labelValue.contains("完成时间") && StringUtils.isBlank(headerInfo.getCompletionTime())) { +// // 过滤掉标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(value) && +// !value.contains(":") && !value.contains(":") && +// !value.contains("下单日期") && !value.contains("入仓日期") && +// !value.contains("起运") && !value.contains("运抵国") && !value.contains("地区") && +// !value.contains("联系人") && !value.contains("Tel") && !value.contains("Fax") && +// !value.contains("客户") && !value.contains("地址") && !value.contains("日期") && +// !value.contains("方式") && !value.contains("关区") && !value.contains("关别") && +// !value.contains("报关员") && !value.contains("生产商") && !value.contains("承运方")) { +// headerInfo.setCompletionTime(value); +// log.info("从表头第{}行读取到完成时间: {}", rowIdx + 1, value); +// } else { +// // 如果找到的值是标签,继续向后查找 +// boolean found = false; +// boolean stopSearch = false; // 是否遇到下一个标签,需要停止搜索 +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// if (StringUtils.isNotBlank(nextValue)) { +// // 检查是否遇到下一个标签(如"委托编号NO"、"下单日期"等),如果遇到则停止搜索 +// if (nextValue.contains("委托编号") || (nextValue.contains("NO") && nextValue.contains(":")) || +// nextValue.contains("司机签名") || nextValue.contains("下单日期") || +// nextValue.contains("入仓日期") || nextValue.contains("联系人") || nextValue.contains("Tel") || +// nextValue.contains("Fax") || nextValue.contains("客户名称") || nextValue.contains("送货地址") || +// nextValue.contains("申报地关区") || nextValue.contains("进出境关别") || nextValue.contains("起运") || +// nextValue.contains("运抵国") || nextValue.contains("柜号") || nextValue.contains("运输方式") || +// nextValue.contains("监管方式") || nextValue.contains("海关是否查验货物") || nextValue.contains("报关员")) { +// // 遇到下一个标签,停止搜索 +// stopSearch = true; +// log.warn("表头第{}行,标签'{}'在第{}列,向后搜索到第{}列时遇到下一个标签'{}',停止搜索,完成时间字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, searchColIdx + 1, nextValue); +// break; +// } +// // 跳过标签文本(包含冒号、常见标签关键词等) +// if (!nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("下单日期") && !nextValue.contains("入仓日期") && +// !nextValue.contains("起运") && !nextValue.contains("运抵国") && !nextValue.contains("地区") && +// !nextValue.contains("联系人") && !nextValue.contains("Tel") && !nextValue.contains("Fax") && +// !nextValue.contains("客户") && !nextValue.contains("地址") && !nextValue.contains("日期") && +// !nextValue.contains("方式") && !nextValue.contains("关区") && !nextValue.contains("关别") && +// !nextValue.contains("报关员") && !nextValue.contains("生产商") && !nextValue.contains("承运方")) { +// headerInfo.setCompletionTime(nextValue); +// log.info("从表头第{}行读取到完成时间: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// } +// // 如果没找到合适的值且未遇到下一个标签,尝试查找下一行的同一列 +// if (!found && !stopSearch) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.contains("下单日期") && !nextRowValue.contains("入仓日期") && +// !nextRowValue.contains("起运") && !nextRowValue.contains("运抵国") && !nextRowValue.contains("地区") && +// !nextRowValue.contains("联系人") && !nextRowValue.contains("Tel") && !nextRowValue.contains("Fax") && +// !nextRowValue.contains("客户") && !nextRowValue.contains("地址") && !nextRowValue.contains("日期") && +// !nextRowValue.contains("方式") && !nextRowValue.contains("关区") && !nextRowValue.contains("关别") && +// !nextRowValue.contains("报关员") && !nextRowValue.contains("生产商") && !nextRowValue.contains("承运方")) { +// headerInfo.setCompletionTime(nextRowValue); +// log.info("从表头第{}行(下一行)读取到完成时间: {}", rowIdx + 2, nextRowValue); +// found = true; +// } +// } +// } +// } +// // 如果最终都没找到实际的值,不设置字段(保持为空) +// if (!found && !stopSearch) { +// log.warn("表头第{}行,标签'{}'在第{}列,找到的值是标签'{}',继续向后查找未找到实际值,完成时间字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, value); +// } +// } +// } else if (labelValue.contains("下单日期") && StringUtils.isBlank(headerInfo.getOrderDate())) { +// // 过滤掉标签文本(包含冒号、常见标签关键词等) +// if (StringUtils.isNotBlank(value) && +// !value.contains(":") && !value.contains(":") && +// !value.contains("起运") && !value.contains("运抵国") && !value.contains("地区") && +// !value.contains("完成时间") && !value.contains("入仓日期") && +// !value.contains("联系人") && !value.contains("Tel") && !value.contains("Fax") && +// !value.contains("客户") && !value.contains("地址") && !value.contains("日期") && +// !value.contains("方式") && !value.contains("关区") && !value.contains("关别") && +// !value.contains("报关员") && !value.contains("生产商") && !value.contains("承运方")) { +// headerInfo.setOrderDate(value); +// log.info("从表头第{}行读取到下单日期: {}", rowIdx + 1, value); +// } else { +// // 如果找到的值是标签,继续向后查找 +// boolean found = false; +// boolean stopSearch = false; // 是否遇到下一个标签,需要停止搜索 +// for (int searchColIdx = colIdx + 2; searchColIdx < colIdx + 10 && searchColIdx < row.getPhysicalNumberOfCells(); searchColIdx++) { +// Cell nextValueCell = row.getCell(searchColIdx); +// if (nextValueCell != null) { +// String nextValue = getCellValueAsString(nextValueCell); +// if (StringUtils.isNotBlank(nextValue)) { +// // 检查是否遇到下一个标签(如"委托编号NO"、"起运/运抵国"等),如果遇到则停止搜索 +// if (nextValue.contains("委托编号") || (nextValue.contains("NO") && nextValue.contains(":")) || +// nextValue.contains("司机签名") || nextValue.contains("完成时间") || +// nextValue.contains("入仓日期") || nextValue.contains("联系人") || nextValue.contains("Tel") || +// nextValue.contains("Fax") || nextValue.contains("客户名称") || nextValue.contains("送货地址") || +// nextValue.contains("申报地关区") || nextValue.contains("进出境关别") || nextValue.contains("起运") || +// nextValue.contains("运抵国") || nextValue.contains("柜号") || nextValue.contains("运输方式") || +// nextValue.contains("监管方式") || nextValue.contains("海关是否查验货物") || nextValue.contains("报关员")) { +// // 遇到下一个标签,停止搜索 +// stopSearch = true; +// log.warn("表头第{}行,标签'{}'在第{}列,向后搜索到第{}列时遇到下一个标签'{}',停止搜索,下单日期字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, searchColIdx + 1, nextValue); +// break; +// } +// // 跳过标签文本(包含冒号、常见标签关键词等) +// if (!nextValue.contains(":") && !nextValue.contains(":") && +// !nextValue.contains("起运") && !nextValue.contains("运抵国") && !nextValue.contains("地区") && +// !nextValue.contains("完成时间") && !nextValue.contains("入仓日期") && +// !nextValue.contains("联系人") && !nextValue.contains("Tel") && !nextValue.contains("Fax") && +// !nextValue.contains("客户") && !nextValue.contains("地址") && !nextValue.contains("日期") && +// !nextValue.contains("方式") && !nextValue.contains("关区") && !nextValue.contains("关别") && +// !nextValue.contains("报关员") && !nextValue.contains("生产商") && !nextValue.contains("承运方")) { +// headerInfo.setOrderDate(nextValue); +// log.info("从表头第{}行读取到下单日期: {}", rowIdx + 1, nextValue); +// found = true; +// break; +// } +// } +// } +// } +// // 如果没找到合适的值且未遇到下一个标签,尝试查找下一行的同一列 +// if (!found && !stopSearch) { +// Row nextRow = sheet.getRow(rowIdx + 1); +// if (nextRow != null) { +// Cell nextRowCell = nextRow.getCell(colIdx); +// if (nextRowCell != null) { +// String nextRowValue = getCellValueAsString(nextRowCell); +// if (StringUtils.isNotBlank(nextRowValue) && +// !nextRowValue.contains(":") && !nextRowValue.contains(":") && +// !nextRowValue.contains("起运") && !nextRowValue.contains("运抵国") && !nextRowValue.contains("地区") && +// !nextRowValue.contains("完成时间") && !nextRowValue.contains("入仓日期") && +// !nextRowValue.contains("联系人") && !nextRowValue.contains("Tel") && !nextRowValue.contains("Fax") && +// !nextRowValue.contains("客户") && !nextRowValue.contains("地址") && !nextRowValue.contains("日期") && +// !nextRowValue.contains("方式") && !nextRowValue.contains("关区") && !nextRowValue.contains("关别") && +// !nextRowValue.contains("报关员") && !nextRowValue.contains("生产商") && !nextRowValue.contains("承运方")) { +// headerInfo.setOrderDate(nextRowValue); +// log.info("从表头第{}行(下一行)读取到下单日期: {}", rowIdx + 2, nextRowValue); +// found = true; +// } +// } +// } +// } +// // 如果最终都没找到实际的值,不设置字段(保持为空) +// if (!found && !stopSearch) { +// log.warn("表头第{}行,标签'{}'在第{}列,找到的值是标签'{}',继续向后查找未找到实际值,下单日期字段将保持为空", +// rowIdx + 1, labelValue, colIdx + 1, value); +// } +// } +// } else if (labelValue.contains("备注") && StringUtils.isBlank(headerInfo.getRemark())) { +// headerInfo.setRemark(value); +// log.info("从表头第{}行读取到备注: {}", rowIdx + 1, value); +// } +// } +// } +// } +// } +// } +// } +// log.info("表头信息读取完成 - 委托编号NO: {}, 客户名称: {}, To: {}, 联系人: {}, Tel: {}, Fax: {}, 送货地址: {}, 起运/运抵国: {}, 车型及车牌: {}, 承运方: {}, 司机签名: {}, 入仓日期: {}, 申报地关区: {}, 生产商: {}, 报关员: {}, 完成时间: {}, 进出境关别: {}, 下单日期: {}, 备注: {}", +// headerInfo.getConsignmentNo(), headerInfo.getShipperName(), headerInfo.getTo(), +// headerInfo.getContactPerson(), headerInfo.getTel(), headerInfo.getFax(), +// headerInfo.getDeliveryAddress(), headerInfo.getOriginDestinationCountry(), +// headerInfo.getVehicleInfo(), headerInfo.getCarrier(), headerInfo.getDriverSignature(), +// headerInfo.getWarehouseDate(), headerInfo.getDeclarationArea(), headerInfo.getManufacturer(), +// headerInfo.getCustomsBrokerInfo(), headerInfo.getCompletionTime(), headerInfo.getEntryExitCustoms(), +// headerInfo.getOrderDate(), headerInfo.getRemark()); +// } catch (Exception e) { +// log.error("读取Excel表头信息失败", e); +// // 不抛出异常,继续尝试从明细行读取 +// } +// +// // 为了兼容旧代码,保留这两个变量 +// String headerConsignmentNo = headerInfo.getConsignmentNo(); +// String headerCustomerName = headerInfo.getShipperName(); +// +// // 先读取Excel第13行的列名,用于调试 +// try (InputStream isForDebug = file.getInputStream()) { +// Workbook wbDebug = WorkbookFactory.create(isForDebug); +// Sheet sheetDebug = wbDebug.getSheetAt(0); +// Row headerRow = sheetDebug.getRow(detailTitleRowIndex); +// if (headerRow != null) { +// log.info("Excel第{}行(明细表列名行)的列名:", detailTitleRowIndex + 1); +// for (int colIdx = 0; colIdx < headerRow.getPhysicalNumberOfCells(); colIdx++) { +// Cell cell = headerRow.getCell(colIdx); +// if (cell != null) { +// String colName = getCellValueAsString(cell); +// if (StringUtils.isNotBlank(colName)) { +// // 打印列名及其长度、字符编码等信息,便于排查 +// log.info(" 第{}列: [{}] (长度: {}, 包含换行: {}, 包含空格: {})", +// colIdx + 1, colName, colName.length(), +// colName.contains("\n"), colName.contains(" ")); +// } +// } +// } +// } +// } catch (Exception e) { +// log.warn("读取Excel列名失败,继续导入", e); +// } +// +// ExcelUtil util = new ExcelUtil<>(ExecutionStockInOrderImportRowDTO.class); +// // 从第13行(索引12)读取明细数据 +// List rows = null; +// try { +// rows = util.importExcel(is, detailTitleRowIndex); +// log.info("成功读取 {} 行明细数据", rows != null ? rows.size() : 0); +// // 调试:打印第一行数据的关键字段 +// if (rows != null && !rows.isEmpty()) { +// ExecutionStockInOrderImportRowDTO firstRow = rows.get(0); +// log.info("第一行明细数据 - 规格型号: [{}], SKU码: [{}], 升: [{}], 箱数: [{}], 尺寸: [{}], 仓库数量: [{}], 入库数量: [{}], 单位: [{}], 总净重: [{}], 总净重2: [{}], 总毛重: [{}], 总毛重2: [{}], 总体积: [{}], 总体积2: [{}], 总面积: [{}], 总面积2: [{}], 原产国: [{}], 币制: [{}]", +// firstRow.getSpecificationModel(), firstRow.getSkuCode(), firstRow.getLiter(), +// firstRow.getBoxCount(), firstRow.getDimensions(), firstRow.getWarehouseQuantity(), +// firstRow.getInboundQuantity(), firstRow.getUnit(), +// firstRow.getTotalNetWeight(), firstRow.getTotalNetWeight2(), +// firstRow.getTotalGrossWeight(), firstRow.getTotalGrossWeight2(), +// firstRow.getTotalVolume(), firstRow.getTotalVolume2(), +// firstRow.getTotalArea(), firstRow.getTotalArea2(), +// firstRow.getOriginCountry(), firstRow.getCurrency()); +// } +// } catch (Exception e) { +// log.error("读取Excel明细数据失败", e); +// throw new ServiceException("读取Excel明细数据失败:" + e.getMessage() + "。请检查Excel第13行是否为明细表列名,第14行开始是否为数据行"); +// } +// if (rows == null || rows.isEmpty()) { +// throw new ServiceException("导入数据为空。请检查Excel第13行是否为明细表列名(包含'商品名称'列),第14行开始是否为数据行"); +// } +// log.info("成功读取 {} 行明细数据", rows.size()); +// +// // 将表头信息应用到每一行明细数据 +// for (ExecutionStockInOrderImportRowDTO row : rows) { +// if (row != null) { +// // 应用表头中的委托编号NO +// if (StringUtils.isBlank(row.getConsignmentNo()) && StringUtils.isNotBlank(headerInfo.getConsignmentNo())) { +// row.setConsignmentNo(headerInfo.getConsignmentNo()); +// } +// // 应用表头中的客户名称(表头有客户名称时,强制应用到所有明细行) +// if (StringUtils.isNotBlank(headerInfo.getShipperName())) { +// row.setShipperName(headerInfo.getShipperName()); +// } +// // 应用表头中的货主编号(表头有货主编号时,强制应用到所有明细行) +// if (StringUtils.isNotBlank(headerInfo.getShipperCode())) { +// row.setShipperCode(headerInfo.getShipperCode()); +// } +// // 应用其他表头字段(如果明细行为空,则使用表头值) +// if (StringUtils.isBlank(row.getTo()) && StringUtils.isNotBlank(headerInfo.getTo())) { +// row.setTo(headerInfo.getTo()); +// } +// if (StringUtils.isBlank(row.getContactPerson()) && StringUtils.isNotBlank(headerInfo.getContactPerson())) { +// row.setContactPerson(headerInfo.getContactPerson()); +// } +// if (StringUtils.isBlank(row.getVehicleInfo()) && StringUtils.isNotBlank(headerInfo.getVehicleInfo())) { +// row.setVehicleInfo(headerInfo.getVehicleInfo()); +// } +// if (StringUtils.isBlank(row.getCarrier()) && StringUtils.isNotBlank(headerInfo.getCarrier())) { +// row.setCarrier(headerInfo.getCarrier()); +// } +// if (StringUtils.isBlank(row.getTel()) && StringUtils.isNotBlank(headerInfo.getTel())) { +// row.setTel(headerInfo.getTel()); +// } +// if (StringUtils.isBlank(row.getDriverSignature()) && StringUtils.isNotBlank(headerInfo.getDriverSignature())) { +// row.setDriverSignature(headerInfo.getDriverSignature()); +// } +// if (StringUtils.isBlank(row.getFax()) && StringUtils.isNotBlank(headerInfo.getFax())) { +// row.setFax(headerInfo.getFax()); +// } +// if (StringUtils.isBlank(row.getDeclarationArea()) && StringUtils.isNotBlank(headerInfo.getDeclarationArea())) { +// row.setDeclarationArea(headerInfo.getDeclarationArea()); +// } +// if (StringUtils.isBlank(row.getManufacturer()) && StringUtils.isNotBlank(headerInfo.getManufacturer())) { +// row.setManufacturer(headerInfo.getManufacturer()); +// } +// if (StringUtils.isBlank(row.getCustomsBrokerInfo()) && StringUtils.isNotBlank(headerInfo.getCustomsBrokerInfo())) { +// row.setCustomsBrokerInfo(headerInfo.getCustomsBrokerInfo()); +// } +// if (StringUtils.isBlank(row.getDeliveryAddress()) && StringUtils.isNotBlank(headerInfo.getDeliveryAddress())) { +// row.setDeliveryAddress(headerInfo.getDeliveryAddress()); +// } +// if (StringUtils.isBlank(row.getEntryExitCustoms()) && StringUtils.isNotBlank(headerInfo.getEntryExitCustoms())) { +// row.setEntryExitCustoms(headerInfo.getEntryExitCustoms()); +// } +// if (StringUtils.isBlank(row.getOriginDestinationCountry()) && StringUtils.isNotBlank(headerInfo.getOriginDestinationCountry())) { +// row.setOriginDestinationCountry(headerInfo.getOriginDestinationCountry()); +// } +// if (StringUtils.isBlank(row.getContainerNo()) && StringUtils.isNotBlank(headerInfo.getContainerNo())) { +// row.setContainerNo(headerInfo.getContainerNo()); +// } +// if (StringUtils.isBlank(row.getTransportMethod()) && StringUtils.isNotBlank(headerInfo.getTransportMethod())) { +// row.setTransportMethod(headerInfo.getTransportMethod()); +// } +// if (StringUtils.isBlank(row.getSupervisionMethod()) && StringUtils.isNotBlank(headerInfo.getSupervisionMethod())) { +// row.setSupervisionMethod(headerInfo.getSupervisionMethod()); +// } +// if (row.getCustomsInspection() == null && headerInfo.getCustomsInspection() != null) { +// row.setCustomsInspection(headerInfo.getCustomsInspection()); +// } +// if (row.getNeedCustomsDeclaration() == null && headerInfo.getNeedCustomsDeclaration() != null) { +// row.setNeedCustomsDeclaration(headerInfo.getNeedCustomsDeclaration()); +// } +// if (row.getNeedTransport() == null && headerInfo.getNeedTransport() != null) { +// row.setNeedTransport(headerInfo.getNeedTransport()); +// } +// if (StringUtils.isBlank(row.getWarehouseDate()) && StringUtils.isNotBlank(headerInfo.getWarehouseDate())) { +// row.setWarehouseDate(headerInfo.getWarehouseDate()); +// } +// if (StringUtils.isBlank(row.getCompletionTime()) && StringUtils.isNotBlank(headerInfo.getCompletionTime())) { +// row.setCompletionTime(headerInfo.getCompletionTime()); +// } +// if (StringUtils.isBlank(row.getOrderDate()) && StringUtils.isNotBlank(headerInfo.getOrderDate())) { +// row.setOrderDate(headerInfo.getOrderDate()); +// } +// if (StringUtils.isBlank(row.getRemark()) && StringUtils.isNotBlank(headerInfo.getRemark())) { +// row.setRemark(headerInfo.getRemark()); +// } +// } +// } +// +// // 过滤掉关键字段都为空的空行(只需要商品名称不为空即可) +// List validRows = rows.stream() +// .filter(r -> r != null && StringUtils.isNotBlank(r.getMaterialName())) +// .collect(Collectors.toList()); +// if (validRows.isEmpty()) { +// String errorMsg = String.format("导入数据为空(可能全为空行)。共读取 %d 行数据,但商品名称都为空。\n" + +// "请检查Excel第13行是否为明细表列名(包含'商品名称'列),第14行开始是否为数据行。", rows.size()); +// throw new ServiceException(errorMsg); +// } +// +// // 以委托编号NO分组;若为空则归到同一组 +// Map> groupMap = validRows.stream() +// .collect(Collectors.groupingBy(r -> StringUtils.isBlank(r.getConsignmentNo()) ? "__EMPTY_CONSIGNMENT__" : r.getConsignmentNo())); +// +// List orderList = new ArrayList<>(); +// for (Map.Entry> entry : groupMap.entrySet()) { +// List groupRows = entry.getValue(); +// ExecutionStockInOrderImportRowDTO h = groupRows.get(0); +// +// // 使用传入的仓库信息(与出库单导入保持一致) +// if (warehouseId == null) { +// throw new ServiceException("导入失败:仓库ID不能为空"); +// } +// if (StringUtils.isBlank(warehouseCode)) { +// throw new ServiceException("导入失败:仓库编码不能为空"); +// } +// if (StringUtils.isBlank(warehouseName)) { +// throw new ServiceException("导入失败:仓库名称不能为空"); +// } +// +// // 客户名称应该从表头获取(优先使用表头,如果表头为空则使用明细行) +// String customerName = StringUtils.isNotBlank(headerInfo.getShipperName()) ? headerInfo.getShipperName() : h.getShipperName(); +// if (StringUtils.isBlank(customerName)) { +// throw new ServiceException("导入失败:客户名称不能为空(委托编号NO=" + h.getConsignmentNo() + ")。请确保Excel表头(第1-12行)中包含'客户名称'字段"); +// } +// // 如果明细行的客户名称为空,使用表头的客户名称 +// if (StringUtils.isBlank(h.getShipperName()) && StringUtils.isNotBlank(headerInfo.getShipperName())) { +// h.setShipperName(headerInfo.getShipperName()); +// } +// +// ExecutionStockInOrderDO order = new ExecutionStockInOrderDO(); +// // 组织/审计字段 +// order.setOrganizationId(loginUser.getUserPo().getOrganizationId()); +// order.setOrganizationName(loginUser.getUserPo().getOrganizationName()); +// order.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); +// order.setCreateBy(loginUser.getUserid()); +// // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) +// String userRealName = null; +// if (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null +// && !loginUser.getUserPo().getUserName().trim().isEmpty()) { +// // 优先使用UserPo中的userName(用户真实姓名) +// userRealName = loginUser.getUserPo().getUserName(); +// } else if (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) { +// // 其次使用realname +// userRealName = loginUser.getRealname(); +// } else { +// // 最后使用username(账号)作为兜底 +// userRealName = loginUser.getUsername(); +// } +// order.setCreateByName(userRealName); +// // 设置创建时间为当前时间 +// order.setCreateTime(new Date()); +// +// // 必填/基础字段(使用传入的仓库信息,与出库单导入保持一致) +// order.setWarehouseId(warehouseId); +// order.setWarehouseCode(warehouseCode); +// order.setWarehouseName(warehouseName); +// // 货主信息:优先使用表头,如果表头为空则使用明细行 +// String shipperName = StringUtils.isNotBlank(headerInfo.getShipperName()) ? headerInfo.getShipperName() : h.getShipperName(); +// String shipperCode = StringUtils.isNotBlank(headerInfo.getShipperCode()) ? headerInfo.getShipperCode() : h.getShipperCode(); +// // 提前获取货主ID,用于查询物料基础信息时过滤 +// Long shipperId = getShipperIdByNameOrCode(shipperName, shipperCode); +// // 货主ID先设置为获取到的值,后续在shipperParam方法中会再次确认 +// order.setShipperId(shipperId); +// if (StringUtils.isNotBlank(shipperName)) { +// order.setShipperName(shipperName); +// } +// if (StringUtils.isNotBlank(shipperCode)) { +// order.setShipperCode(shipperCode); +// } +//// order.setSupplierId(h.getSupplierId()); +//// order.setOrderTypeCode(h.getOrderTypeCode()); +// order.setConsignmentNo(h.getConsignmentNo()); +// order.setRemark(h.getRemark()); +// // 导入入库单时,如果入库单类型为空,默认设置为普通入库 +// if (StringUtils.isBlank(order.getOrderTypeCode())) { +// order.setOrderTypeCode("pu_tong_ru_ku"); +// } +// if (StringUtils.isBlank(order.getOrderTypeName())) { +// order.setOrderTypeName("普通入库单"); +// } +// +// // 报关表头字段(优先使用表头字段,如果表头为空则使用明细行字段) +// order.setTo(StringUtils.isNotBlank(headerInfo.getTo()) ? headerInfo.getTo() : h.getTo()); +// order.setContactPerson(StringUtils.isNotBlank(headerInfo.getContactPerson()) ? headerInfo.getContactPerson() : h.getContactPerson()); +// order.setVehicleInfo(StringUtils.isNotBlank(headerInfo.getVehicleInfo()) ? headerInfo.getVehicleInfo() : h.getVehicleInfo()); +// order.setTel(StringUtils.isNotBlank(headerInfo.getTel()) ? headerInfo.getTel() : h.getTel()); +// order.setDriverSignature(StringUtils.isNotBlank(headerInfo.getDriverSignature()) ? headerInfo.getDriverSignature() : h.getDriverSignature()); +// order.setFax(StringUtils.isNotBlank(headerInfo.getFax()) ? headerInfo.getFax() : h.getFax()); +// order.setDeclarationArea(StringUtils.isNotBlank(headerInfo.getDeclarationArea()) ? headerInfo.getDeclarationArea() : h.getDeclarationArea()); +// order.setManufacturer(StringUtils.isNotBlank(headerInfo.getManufacturer()) ? headerInfo.getManufacturer() : h.getManufacturer()); +// order.setCustomsBrokerInfo(StringUtils.isNotBlank(headerInfo.getCustomsBrokerInfo()) ? headerInfo.getCustomsBrokerInfo() : h.getCustomsBrokerInfo()); +// order.setDeliveryAddress(StringUtils.isNotBlank(headerInfo.getDeliveryAddress()) ? headerInfo.getDeliveryAddress() : h.getDeliveryAddress()); +// order.setEntryExitCustoms(StringUtils.isNotBlank(headerInfo.getEntryExitCustoms()) ? headerInfo.getEntryExitCustoms() : h.getEntryExitCustoms()); +// order.setOriginDestinationCountry(StringUtils.isNotBlank(headerInfo.getOriginDestinationCountry()) ? headerInfo.getOriginDestinationCountry() : h.getOriginDestinationCountry()); +// order.setCarrier(StringUtils.isNotBlank(headerInfo.getCarrier()) ? headerInfo.getCarrier() : h.getCarrier()); +// order.setContainerNo(StringUtils.isNotBlank(headerInfo.getContainerNo()) ? headerInfo.getContainerNo() : h.getContainerNo()); +// order.setTransportMethod(StringUtils.isNotBlank(headerInfo.getTransportMethod()) ? headerInfo.getTransportMethod() : h.getTransportMethod()); +// order.setSupervisionMethod(StringUtils.isNotBlank(headerInfo.getSupervisionMethod()) ? headerInfo.getSupervisionMethod() : h.getSupervisionMethod()); +// +// // 报关字段默认值(优先使用表头字段) +// Integer customsInspection = headerInfo.getCustomsInspection() != null ? headerInfo.getCustomsInspection() : h.getCustomsInspection(); +// if (customsInspection == null) { +// order.setCustomsInspection(0); // 默认:否 +// } else { +// order.setCustomsInspection(customsInspection); +// } +// Integer needCustomsDeclaration = headerInfo.getNeedCustomsDeclaration() != null ? headerInfo.getNeedCustomsDeclaration() : h.getNeedCustomsDeclaration(); +// if (needCustomsDeclaration == null) { +// order.setNeedCustomsDeclaration(1); // 默认:是 +// } else { +// order.setNeedCustomsDeclaration(needCustomsDeclaration); +// } +// Integer needTransport = headerInfo.getNeedTransport() != null ? headerInfo.getNeedTransport() : h.getNeedTransport(); +// if (needTransport == null) { +// order.setNeedTransport(0); // 默认:否 +// } else { +// order.setNeedTransport(needTransport); +// } +// +// // 日期字段(优先使用表头字段,如果表头为空则使用明细行字段) +// String warehouseDateStr = StringUtils.isNotBlank(headerInfo.getWarehouseDate()) ? headerInfo.getWarehouseDate() : h.getWarehouseDate(); +// if (StringUtils.isNotBlank(warehouseDateStr)) { +// Date warehouseDate = parseDateString(warehouseDateStr); +// if (warehouseDate != null) { +// order.setWarehouseDate(warehouseDate); +// log.info("设置入仓日期: {}", warehouseDate); +// } +// } +// +// String completionTimeStr = StringUtils.isNotBlank(headerInfo.getCompletionTime()) ? headerInfo.getCompletionTime() : h.getCompletionTime(); +// if (StringUtils.isNotBlank(completionTimeStr)) { +// Date completionTime = parseDateString(completionTimeStr); +// if (completionTime != null) { +// order.setCompletionTime(completionTime); +// log.info("设置完成时间: {}", completionTime); +// } +// } +// +// String orderDateStr = StringUtils.isNotBlank(headerInfo.getOrderDate()) ? headerInfo.getOrderDate() : h.getOrderDate(); +// if (StringUtils.isNotBlank(orderDateStr)) { +// Date orderDate = parseDateString(orderDateStr); +// if (orderDate != null) { +// order.setOrderDate(orderDate); +// log.info("设置下单日期: {}", orderDate); +// } +// } +// +// // 明细 +// List details = new ArrayList<>(); +// for (ExecutionStockInOrderImportRowDTO r : groupRows) { +// // 记录当前明细行的关键信息,用于调试 +// log.info("处理明细行 - 委托编号NO: {}, 商品名称: [{}], 料号: [{}], SKU码: [{}], 仓库数量: [{}], 入库数量: [{}]", +// h.getConsignmentNo(), r.getMaterialName(), r.getMaterialCode(), r.getSkuCode(), +// r.getWarehouseQuantity(), r.getInboundQuantity()); +// +// // 先检查数量,如果数量为空,直接跳过该明细行(不需要检查物料) +// BigDecimal quantity = r.getWarehouseQuantity(); +// if (quantity == null) { +// quantity = r.getInboundQuantity(); +// } +// if (quantity == null) { +// log.warn("跳过明细行:仓库数量或入库数量不能为空 - 委托编号NO: [{}], 商品名称: [{}], 料号: [{}], SKU码: [{}]", +// h.getConsignmentNo(), r.getMaterialName(), r.getMaterialCode(), r.getSkuCode()); +// continue; // 跳过该明细行,继续处理下一行 +// } +// +// // 检查是否为容器类型等非物料信息,如果是则跳过 +// String materialName = r.getMaterialName(); +// if (StringUtils.isNotBlank(materialName)) { +// String lowerName = materialName.trim(); +// // 常见的容器类型关键词(不区分大小写) +// if (lowerName.contains("尺柜") || lowerName.contains("尺集装箱") || +// lowerName.contains("Container") || lowerName.contains("container") || +// (lowerName.contains("柜") && (lowerName.contains("20") || lowerName.contains("40") || lowerName.contains("45")))) { +// log.info("跳过明细行:识别为容器类型信息,非实际物料 - 委托编号NO: [{}], 商品名称: [{}]", +// h.getConsignmentNo(), materialName); +// continue; // 跳过该明细行,继续处理下一行 +// } +// } +// +// // 导入文件中必须填写料号,根据料号获取商品信息,必须是货主下有的才可以匹配 +// // 如果没有填写,提示用户:请在导入文件中填写正确的料号 +// if (StringUtils.isBlank(r.getMaterialCode())) { +// String errorMsg = String.format("导入失败:请在导入文件中填写正确的料号", +// r.getMaterialName()); +// log.error(errorMsg); +// throw new ServiceException(errorMsg); +// } +// +// // 根据料号查询物料基础信息,必须是货主下有的才可以匹配 +// Long materialBaseInfoId = null; +// LoginUser currentLoginUser = SecurityUtils.getLoginUser(); +// Long topOrganizationId = currentLoginUser != null && currentLoginUser.getUserPo() != null +// ? currentLoginUser.getUserPo().getTopOrganizationId() : null; +// +// // 使用料号查询,必须加上货主ID条件,确保查询到的是该货主绑定的物料 +// MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO(); +// queryDO.setMaterialCode(r.getMaterialCode()); +// if (topOrganizationId != null) { +// queryDO.setTopOrganizationId(topOrganizationId); +// } +// // 加上货主ID条件,确保查询到的是该货主绑定的物料 +// if (shipperId != null) { +// queryDO.setShipperId(shipperId); +// } +// log.info("尝试通过料号查询物料基础信息,料号: [{}], topOrganizationId: {}, shipperId: {}", +// r.getMaterialCode(), topOrganizationId, shipperId); +// List materialList = materialBaseInfoService.queryList(queryDO); +// log.info("料号查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0); +// MaterialBaseInfoPO materialBaseInfoPO = null; +// if (materialList != null && !materialList.isEmpty()) { +// materialBaseInfoPO = materialList.get(0); +// materialBaseInfoId = materialBaseInfoPO.getMaterialBaseInfoId(); +// log.info("通过料号查询到物料基础信息,料号: {}, 物料ID: {}, 货主ID: {}", +// r.getMaterialCode(), materialBaseInfoId, shipperId); +// } else { +// // 如果提供了料号但查询不到(或不属于该货主),直接报错,不允许导入 +// String errorMsg = String.format("导入失败:该货主下不存在该料号(货主名称=%s,料号=%s)。请确保该料号已在物料管理中创建,且属于该货主", +// order.getShipperName(), r.getMaterialCode()); +// log.error(errorMsg); +// throw new ServiceException(errorMsg); +// } +// +// // 数量已在前面检查过,这里直接使用 +// log.info("数量字段检查 - 仓库数量: [{}], 入库数量: [{}], 使用数量: [{}]", +// r.getWarehouseQuantity(), r.getInboundQuantity(), quantity); +// +// InMaterialDetailDO d = new InMaterialDetailDO(); +// d.setMaterialBaseInfoId(materialBaseInfoId); +// if (materialBaseInfoId != null){ +// //从数据库获取名称 +// MaterialBaseInfo materialBaseInfo = materialBaseInfoService.getById(materialBaseInfoId); +// d.setMaterialName(materialBaseInfo.getMaterialName()); +// }else { +// // 设置商品名称和料号(从Excel读取) +// d.setMaterialName(r.getMaterialName()); +// } +// // 如果料号为空但物料ID有值,根据物料ID查询并补充料号 +// String materialCode = r.getMaterialCode(); +// if (StringUtils.isBlank(materialCode) && materialBaseInfoId != null) { +// try { +// MaterialBaseInfoPO materialBaseInfo = materialBaseInfoService.getInfo(materialBaseInfoId); +// if (materialBaseInfo != null && StringUtils.isNotBlank(materialBaseInfo.getMaterialCode())) { +// materialCode = materialBaseInfo.getMaterialCode(); +// log.info("根据物料ID自动补充料号,物料ID: {}, 料号: {}", materialBaseInfoId, materialCode); +// } +// } catch (Exception e) { +// log.warn("根据物料ID查询料号失败,物料ID: {}, 错误: {}", materialBaseInfoId, e.getMessage()); +// } +// } +// d.setMaterialCode(materialCode); +// d.setQuantity(quantity); +// d.setSpecificationModel(r.getSpecificationModel()); +// d.setSkuCode(r.getSkuCode()); +// d.setInvoiceNo(r.getInvoiceNo()); +// d.setDeclaredQuantity(r.getDeclaredQuantity()); +// d.setDeclarationUnit(r.getDeclarationUnit()); +// d.setLiter(r.getLiter()); +// d.setBoxCount(r.getBoxCount()); +// d.setPieceCount(r.getPieceCount()); +// d.setDimensions(r.getDimensions()); +// // 入库数量:优先使用入库数量,如果为空则使用仓库数量 +// BigDecimal inboundQuantity = r.getInboundQuantity(); +// if (inboundQuantity == null) { +// inboundQuantity = r.getWarehouseQuantity(); +// if (inboundQuantity != null) { +// log.info("入库数量为空,使用仓库数量作为入库数量: [{}]", inboundQuantity); +// } +// } +// d.setInboundQuantity(inboundQuantity); +// // 单位:优先使用Excel中的"单位"字段,如果为空则使用"申报单位",如果还为空则从物料主数据获取 +// String unit = StringUtils.isNotBlank(r.getUnit()) ? r.getUnit() : null; +// if (StringUtils.isBlank(unit) && StringUtils.isNotBlank(r.getDeclarationUnit())) { +// unit = r.getDeclarationUnit(); +// log.info("单位字段为空,使用申报单位: {}", unit); +// } +// // 如果Excel中单位仍为空,从物料主数据获取 +// if (StringUtils.isBlank(unit) && materialBaseInfoPO != null && StringUtils.isNotBlank(materialBaseInfoPO.getUnitName())) { +// unit = materialBaseInfoPO.getUnitName(); +// log.info("Excel中单位为空,从物料主数据自动填充单位: {}", unit); +// } +// d.setUnit(unit); +// // 总净重:优先使用主字段,如果为空则使用备用字段 +// d.setTotalNetWeight(r.getTotalNetWeight() != null ? r.getTotalNetWeight() : r.getTotalNetWeight2()); +// // 总毛重:优先使用主字段,如果为空则使用备用字段 +// d.setTotalGrossWeight(r.getTotalGrossWeight() != null ? r.getTotalGrossWeight() : r.getTotalGrossWeight2()); +// // 总体积:优先使用主字段,如果为空则使用备用字段 +// d.setTotalVolume(r.getTotalVolume() != null ? r.getTotalVolume() : r.getTotalVolume2()); +// // 总面积:优先使用主字段,如果为空则使用备用字段 +// d.setTotalArea(r.getTotalArea() != null ? r.getTotalArea() : r.getTotalArea2()); +// d.setBatchRefNo(r.getBatchRefNo()); +// d.setSheetRefNo(r.getSheetRefNo()); +// // 原产国:优先使用Excel中的数据,如果为空则从物料主数据获取 +// String originCountry = StringUtils.isNotBlank(r.getOriginCountry()) ? r.getOriginCountry() : null; +// if (StringUtils.isBlank(originCountry) && materialBaseInfoPO != null && StringUtils.isNotBlank(materialBaseInfoPO.getOriginCountry())) { +// originCountry = materialBaseInfoPO.getOriginCountry(); +// log.info("Excel中原产国为空,从物料主数据自动填充原产国: {}", originCountry); +// } +// d.setOriginCountry(originCountry); +// d.setBoxPalletNo(r.getBoxPalletNo()); +// d.setTotalPrice(r.getTotalPrice()); +// // 币制:优先使用Excel中的数据,如果为空则从物料主数据获取 +// String currency = StringUtils.isNotBlank(r.getCurrency()) ? r.getCurrency() : null; +// if (StringUtils.isBlank(currency) && materialBaseInfoPO != null && StringUtils.isNotBlank(materialBaseInfoPO.getCurrency())) { +// currency = materialBaseInfoPO.getCurrency(); +// log.info("Excel中币制为空,从物料主数据自动填充币制: {}", currency); +// } +// d.setCurrency(currency); +// d.setRemark(r.getDetailRemark()); +// +// // 记录即将保存的明细数据,用于调试 +// log.info("准备保存明细数据 - 商品名称: [{}], 料号: [{}], SKU码: [{}], 规格型号: [{}], 入库数量: [{}], 数量: [{}], 单位: [{}], 总净重: [{}], 总毛重: [{}], 总体积: [{}], 总面积: [{}], 原产国: [{}], 币制: [{}], 备注: [{}]", +// r.getMaterialName(), r.getMaterialCode(), r.getSkuCode(), r.getSpecificationModel(), +// r.getInboundQuantity(), quantity, unit, d.getTotalNetWeight(), d.getTotalGrossWeight(), +// d.getTotalVolume(), d.getTotalArea(), r.getOriginCountry(), r.getCurrency(), r.getDetailRemark()); +// +// details.add(d); +// } +// +// // 如果该订单的所有明细行都被跳过(details为空),跳过该订单 +// if (details.isEmpty()) { +// log.warn("跳过入库单:委托编号NO [{}] 的所有明细行都因数据不完整被跳过,该入库单将不会被导入", h.getConsignmentNo()); +// continue; // 跳过该订单,继续处理下一个订单 +// } +// +// order.setMaterialDetailList(details); +// +// // 导入入库单时,计划数量取所有明细行的入库数量之和 +// if (!CollectionUtils.isEmpty(details)) { +// BigDecimal totalInboundQuantity = details.stream() +// .map(detail -> detail.getInboundQuantity() != null ? detail.getInboundQuantity() : BigDecimal.ZERO) +// .reduce(BigDecimal.ZERO, BigDecimal::add); +// order.setQuantity(totalInboundQuantity); +// log.info("计算计划数量 - 委托编号NO: [{}], 明细行数: {}, 计划数量(入库数量之和): [{}]", +// h.getConsignmentNo(), details.size(), totalInboundQuantity); +// } +// +// // 在导入时,需要调用shipperParam、supplierParam和setDataDict方法,确保货主信息被正确填充 +// // 注意:这里只调用shipperParam,因为导入时只提供了货主名称,需要根据名称查找货主ID和编号 +// try { +// shipperParam(order); +// } catch (Exception e) { +// log.error("导入入库单时设置货主信息失败,委托编号NO:{},货主名称:{},错误:{}", +// h.getConsignmentNo(), order.getShipperName(), e.getMessage()); +// throw new ServiceException("导入失败:设置货主信息失败(委托编号NO=" + h.getConsignmentNo() + ",货主名称=" + order.getShipperName() + ")。" + e.getMessage()); +// } +// // 设置供应商信息(如果提供了供应商ID) +// supplierParam(order); +// // 设置数据字典键值 +// setDataDict(order); +// +// orderList.add(order); +// } +// +// // 如果所有订单都被跳过(orderList为空),抛出异常提示用户 +// if (orderList.isEmpty()) { +// throw new ServiceException("导入失败:所有入库单的明细行都因数据不完整(数量为空或物料基础信息缺失)被跳过,请检查Excel数据"); +// } +// +// return stockInOrderDomainService.batchInsert(orderList); +// } catch (ServiceException e) { +// throw e; +// } catch (Exception e) { +// log.error("导入入库单失败", e); +// throw new ServiceException("导入入库单失败:" + e.getMessage()); +// } +// } + + /** + * 解析日期字符串为Date对象 + * 支持多种日期格式:yyyy-MM-dd, yyyy/MM/dd, yyyy年MM月dd日, Date.toString()格式等 + */ + private Date parseDateString(String dateStr) { + if (StringUtils.isBlank(dateStr)) { + return null; + } + + // 如果已经是Date.toString()格式(如 "Sun Feb 01 00:00:00 CST 2026"),尝试直接解析 + if (dateStr.contains("CST") || dateStr.contains("GMT") || dateStr.contains("UTC")) { + try { + // 尝试解析标准Date.toString()格式 + SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); + return sdf.parse(dateStr); + } catch (ParseException e) { + log.warn("无法解析日期格式: {}", dateStr); + } + } + + // 尝试多种日期格式 + String[] datePatterns = { + "yyyy-MM-dd", + "yyyy/MM/dd", + "yyyy.MM.dd", + "yyyy年MM月dd日", + "yyyy-MM-dd HH:mm:ss", + "yyyy/MM/dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy/MM/dd HH:mm" + }; + + for (String pattern : datePatterns) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + sdf.setLenient(false); + return sdf.parse(dateStr.trim()); + } catch (ParseException e) { + // 继续尝试下一个格式 + } + } + + // 如果所有格式都失败,记录警告 + log.warn("无法解析日期字符串: {},尝试使用DateUtils.parseDate", dateStr); + try { + // 使用DateUtils的parseDate方法(支持多种格式) + return com.mhd.common.core.utils.DateUtils.parseDate(dateStr); + } catch (Exception e) { + log.error("解析日期失败: {}", dateStr, e); + return null; + } + } + + /** + * 获取Excel单元格的字符串值 + */ + private String getCellValueAsString(Cell cell) { + if (cell == null) { + return ""; + } + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + // 日期类型单元格,格式化为 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss + Date dateValue = cell.getDateCellValue(); + SimpleDateFormat sdf; + // 检查是否包含时间部分 + if (dateValue.getHours() == 0 && dateValue.getMinutes() == 0 && dateValue.getSeconds() == 0) { + sdf = new SimpleDateFormat("yyyy-MM-dd"); + } else { + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + return sdf.format(dateValue); + } else { + double numericValue = cell.getNumericCellValue(); + if (numericValue == (long) numericValue) { + return String.valueOf((long) numericValue); + } else { + return String.valueOf(numericValue); + } + } + case BOOLEAN: + return String.valueOf(cell.getBooleanCellValue()); + case FORMULA: + return cell.getCellFormula(); + default: + return ""; + } + } + + /** + * @description 设置仓库信息 + * @author ZhouGY + * @date 2024/4/7 10:01 + * @param stockInOrderDO + */ + private void setWarehouseInfo(ExecutionStockInOrderDO stockInOrderDO) { + if (stockInOrderDO.getWarehouseId() == null) { + throw new ServiceException("仓库ID不能为空"); + } + AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockInOrderDO.getWarehouseId()); + if (ajaxResult == null) { + throw new ServiceException("获取仓库信息失败:返回结果为空,仓库ID:" + stockInOrderDO.getWarehouseId()); + } + Object codeObj = ajaxResult.get("code"); + if (codeObj == null || !"200".equals(String.valueOf(codeObj))) { + String errorMsg = ajaxResult.get("msg") != null ? String.valueOf(ajaxResult.get("msg")) : "未知错误"; + throw new ServiceException("获取仓库信息失败,仓库ID:" + stockInOrderDO.getWarehouseId() + ",错误信息:" + errorMsg); + } + Object dataObj = ajaxResult.get("data"); + if (dataObj == null) { + throw new ServiceException("获取仓库信息失败:返回数据为空,仓库ID:" + stockInOrderDO.getWarehouseId()); + } + WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(dataObj), WarehouseFeignPO.class); + if (warehouseFeignPO == null) { + throw new ServiceException("获取仓库信息失败:数据解析失败,仓库ID:" + stockInOrderDO.getWarehouseId()); + } + stockInOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); + stockInOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); + } + + /** + * @description 根据货主名称或编号获取货主ID(用于导入时提前获取货主ID) + * @param shipperName 货主名称 + * @param shipperCode 货主编号 + * @return 货主ID,如果找不到则返回null + */ + private Long getShipperIdByNameOrCode(String shipperName, String shipperCode) { + if (StringUtils.isBlank(shipperName) && StringUtils.isBlank(shipperCode)) { + return null; + } + + Long shipperId = null; + + // 优先尝试:如果名称是纯数字,可能是误传的ID,直接按ID查询 + if (StringUtils.isNotEmpty(shipperName) && shipperName.matches("\\d+")) { + try { + Long possibleId = Long.valueOf(shipperName); + AjaxResult ajaxResult = userServiceFeign.getInfo(possibleId); + if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) { + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + if (userPo != null) { + shipperId = userPo.getUserId(); + log.info("根据货主名称(实际为ID)找到货主ID:{}", shipperId); + return shipperId; + } + } + } catch (Exception e) { + log.debug("尝试将货主名称作为ID查询失败,货主名称:{},错误:{}", shipperName, e.getMessage()); + } + } + + // 如果仍未找到,尝试根据名称查询 + if (shipperId == null && StringUtils.isNotEmpty(shipperName) && !shipperName.matches("\\d+")) { + try { + AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName); + String code = String.valueOf(ajaxResult.get("code")); + if ("200".equals(code) && ajaxResult.get("data") != null) { + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + if (userPo != null) { + shipperId = userPo.getUserId(); + log.info("根据货主名称找到货主ID,货主名称:{},货主ID:{}", shipperName, shipperId); + return shipperId; + } + } + } catch (Exception e) { + log.debug("根据货主名称查询失败,货主名称:{},错误:{}", shipperName, e.getMessage()); + } + } + + // 如果仍未找到,尝试从货主列表中根据编号或名称查找 + if (shipperId == null && (StringUtils.isNotEmpty(shipperName) || StringUtils.isNotEmpty(shipperCode))) { + try { + AjaxResult shipperListResult = userServiceFeign.userShipperListAll(); + if ("200".equals(String.valueOf(shipperListResult.get("code"))) && shipperListResult.get("data") != null) { + Object data = shipperListResult.get("data"); + List> shipperList = null; + if (data instanceof List) { + @SuppressWarnings("unchecked") + List rawList = (List) data; + shipperList = new ArrayList<>(); + for (Object item : rawList) { + if (item instanceof Map) { + @SuppressWarnings("unchecked") + Map mapItem = (Map) item; + shipperList.add(mapItem); + } else { + Map mapItem = JSON.parseObject(JSONObject.toJSONString(item), Map.class); + shipperList.add(mapItem); + } + } + } else { + String jsonStr = JSONObject.toJSONString(data); + shipperList = JSON.parseObject(jsonStr, new com.alibaba.fastjson.TypeReference>>(){}); + } + + if (shipperList != null && !shipperList.isEmpty()) { + String normalizedShipperName = shipperName != null ? shipperName.trim() : ""; + String normalizedShipperCode = shipperCode != null ? shipperCode.trim() : ""; + + for (Map shipper : shipperList) { + Object userId = shipper.get("userId"); + Object userName = shipper.get("userName"); + Object userCode = shipper.get("userCode"); + Object userMemberCode = shipper.get("userMemberCode"); + + if (userName == null) { + userName = shipper.get("name"); + } + if (userName == null) { + userName = shipper.get("shipperName"); + } + + boolean matched = false; + // 优先根据编号匹配 + if (StringUtils.isNotEmpty(normalizedShipperCode)) { + String normalizedUserCode = userCode != null ? String.valueOf(userCode).trim() : ""; + String normalizedUserMemberCode = userMemberCode != null ? String.valueOf(userMemberCode).trim() : ""; + if (normalizedShipperCode.equals(normalizedUserCode) || + normalizedShipperCode.equals(normalizedUserMemberCode)) { + matched = true; + } + } + // 如果编号不匹配,再根据名称匹配 + if (!matched && StringUtils.isNotEmpty(normalizedShipperName) && userName != null) { + String normalizedUserName = String.valueOf(userName).trim(); + if (normalizedShipperName.equals(normalizedUserName) || + normalizedUserName.contains(normalizedShipperName)) { + matched = true; + } + } + + if (matched && userId != null) { + shipperId = Long.valueOf(String.valueOf(userId)); + log.info("从货主列表中找到货主ID,货主名称:{},货主编号:{},货主ID:{}", + shipperName, shipperCode, shipperId); + return shipperId; + } + } + } + } + } catch (Exception e) { + log.debug("从货主列表中查找货主ID失败,货主名称:{},货主编号:{},错误:{}", + shipperName, shipperCode, e.getMessage()); + } + } + + if (shipperId == null) { + log.warn("未找到货主ID,货主名称:{},货主编号:{}", shipperName, shipperCode); + } + + return shipperId; + } + + /** + * @description 封装货主信息(改为与出库单相同的简洁逻辑,使用入库单的字段shipperName) + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockInOrderDO + */ + private void shipperParam(ExecutionStockInOrderDO stockInOrderDO){ + // 新增/编辑时前端可能只传 shipperId(下拉选中值),shipperName 为空。 + // 这里优先按 shipperId 回填货主编码/名称;其次再按 shipperName(名称或数字ID字符串)回填。 + + // 1) 优先按 shipperId 查询 + if (ObjectUtil.isNotNull(stockInOrderDO.getShipperId())) { + AjaxResult ajaxResult = userServiceFeign.getInfo(stockInOrderDO.getShipperId()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setShipperId(userPo.getUserId()); + stockInOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockInOrderDO.setShipperName(userPo.getUserName()); + String isCheckCredit = reservationStockInOrderMapper.getIsCheckCredit(userPo.getUserId()); + String customerNcCode = reservationStockInOrderMapper.getCustomerNcCode(userPo.getUserId()); + if(isCheckCredit != null&&"1".equals(isCheckCredit)){ + UserShipperFeignDTO userShipperFeignDTO = new UserShipperFeignDTO(); + List userShipperEntityFeigns = new ArrayList<>(); + UserShipperEntityFeign userShipperEntityFeign = new UserShipperEntityFeign(); + userShipperEntityFeign.setUserId(userPo.getUserId()); + userShipperEntityFeign.setCustomerNcCode(customerNcCode); + userShipperEntityFeigns.add(userShipperEntityFeign); + userShipperFeignDTO.setCustomerNcCodeList(userShipperEntityFeigns); + AjaxResult ajaxResult1 = userServiceFeign.querySaleCreditLimitFeign(userShipperFeignDTO); + if (!"200".equals(String.valueOf(ajaxResult1.get("code")))){ + throw new ServiceException("获取货主信用额度失败"); + } else { + BigDecimal creditAmount = reservationStockInOrderMapper.getCreditAmount(userPo.getUserId()); + if (creditAmount != null && creditAmount.compareTo(BigDecimal.ZERO) > 0) { + }else{ + throw new ServiceException("货主信用额度小于0,不允许下单!"); + } + } + } + return; + } + + // 2) shipperId 为空时,按 shipperName 兜底 + String shipperName = stockInOrderDO.getShipperName(); + if (StringUtils.isEmpty(shipperName)) { + return; + } + if (!shipperName.matches("\\d+")) { + // 按名称查询 + AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setShipperId(userPo.getUserId()); + stockInOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockInOrderDO.setShipperName(userPo.getUserName()); + } else { + // shipperName 是数字:按ID查询 + AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(shipperName)); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setShipperId(userPo.getUserId()); + stockInOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockInOrderDO.setShipperName(userPo.getUserName()); + } + } + + /** + * @description 封装供应商信息 + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockInOrderDO + */ + private void supplierParam(ExecutionStockInOrderDO stockInOrderDO){ + if (ObjectUtil.isNotNull(stockInOrderDO.getSupplierId())){ + AjaxResult ajaxResult = userServiceFeign.getInfo(stockInOrderDO.getSupplierId()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取供应商信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockInOrderDO.setSupplierName(userPo.getUserName()); + } + } + + /** + * @description 设置数据字典键值 + * @author ZhouGY + * @date 2024/4/7 14:33 + * @param stockInOrderDO + */ + private void setDataDict(ExecutionStockInOrderDO stockInOrderDO){ + //翻译单据类型 + if (StringUtils.isNotBlank(stockInOrderDO.getOrderTypeCode())){ + AjaxResult documentTypeResult = systemServiceFeign.selectListByDictType(DictCode.DOCUMENT_TYPE.getCode()); + if (!"200".equals(String.valueOf(documentTypeResult.get("code")))) { + throw new ServiceException("单据类型数据字典不存在"); + } + List documentTypeDataList = JSON.parseArray(JSONUtil.toJsonStr(documentTypeResult.get("data")), SysDictData.class); + + SysDictData documentTypeData = documentTypeDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockInOrderDO.getOrderTypeCode())).findAny().orElse(null); + if (null == documentTypeData) { + throw new ServiceException("单据类型【" + stockInOrderDO.getOrderTypeCode() + "】数据字典不存在 请联系管理员"); + } + stockInOrderDO.setOrderTypeName(documentTypeData.getDictLabel()); + } + + //翻译优先级别类型 + if (StringUtils.isNotBlank(stockInOrderDO.getPriorityLevelCode())){ + AjaxResult priorityLevelResult = systemServiceFeign.selectListByDictType(DictCode.PRIORITY_LEVEL.getCode()); + if (!"200".equals(String.valueOf(priorityLevelResult.get("code")))) { + throw new ServiceException("优先级别类型数据字典不存在"); + } + List priorityLevelDataList = JSON.parseArray(JSONUtil.toJsonStr(priorityLevelResult.get("data")), SysDictData.class); + + SysDictData priorityLevelData = priorityLevelDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockInOrderDO.getPriorityLevelCode())).findAny().orElse(null); + if (null == priorityLevelData) { + throw new ServiceException("优先级别类型【" + stockInOrderDO.getPriorityLevelCode() + "】数据字典不存在 请联系管理员"); + } + stockInOrderDO.setPriorityLevelName(priorityLevelData.getDictLabel()); + } + } + + public List queryNoticePrint(ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = new ExecutionStockInOrderDO(); + BeanUtils.copyProperties(stockInOrderDTO, stockInOrderDO); + return stockInOrderDomainService.queryNoticePrint(stockInOrderDO); + } + + public List queryNoticePrintDetail(ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = new ExecutionStockInOrderDO(); + BeanUtils.copyProperties(stockInOrderDTO, stockInOrderDO); + return stockInOrderDomainService.queryNoticePrintDetail(stockInOrderDO); + } + + + public AjaxResult batchPush(List idList) { + if (idList == null || idList.isEmpty()) { + return AjaxResult.error("没有数据需要推送"); + } + + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long pushBy = loginUser != null ? loginUser.getUserid() : null; + String pushByName = loginUser != null ? loginUser.getUserPo().getUserName() : null; + Long organizationId = loginUser != null ? loginUser.getUserPo().getOrganizationId() : null; + Long topOrganizationId = loginUser != null ? loginUser.getUserPo().getTopOrganizationId() : null; + String organizationName = loginUser != null ? loginUser.getUserPo().getOrganizationName() : null; + + int successCount = 0; + int failCount = 0; + StringBuilder failMsg = new StringBuilder(); + + for (Long id : idList) { + GwStockInOrder gwStockInOrder = new GwStockInOrder(); + ExecutionStockInOrder reservationStockInOrder = reservationStockInOrderMapper.selectById(id); + Long shipperId = reservationStockInOrder.getShipperId(); + String userNcCode = reservationStockInOrderMapper.getUserNcCode(shipperId); + gwStockInOrder.setBillNo(reservationStockInOrder.getInOrderNumber()); + gwStockInOrder.setBillDate(reservationStockInOrder.getDocumentDate()); + gwStockInOrder.setIeFlag("I"); + gwStockInOrder.setCorpCode(userNcCode); + + + List reservationInMaterialDetails = reservationInMaterialDetailMapper.selectList(new LambdaQueryWrapper().eq(ExecutionInMaterialDetail::getInOrderNumber, reservationStockInOrder.getInOrderNumber()).eq(ExecutionInMaterialDetail::getDelFlag, 1)); + List orderList = new LinkedList<>(); + for (ExecutionInMaterialDetail reservationInMaterialDetail : reservationInMaterialDetails) { + GwInDetail gwInDetail = new GwInDetail(); + Long materialBaseInfoId = reservationInMaterialDetail.getMaterialBaseInfoId(); + gwInDetail.setBillNo(gwStockInOrder.getBillNo()); + String lotNo = reservationInMaterialDetail.getLotNo(); + if (lotNo != null) { + String[] split = lotNo.split("-"); + if (split.length == 2) { + gwInDetail.setLineNum(split[1]); + reservationInMaterialDetail.setLineNumGw(split[1]); + } else { + gwInDetail.setLineNum("1"); + reservationInMaterialDetail.setLineNumGw("1"); + } + } else { + gwInDetail.setLineNum("1"); + reservationInMaterialDetail.setLineNumGw("1"); + } + gwInDetail.setItemName(reservationInMaterialDetail.getMaterialName()); + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(materialBaseInfoId); + gwInDetail.setItemNo(materialBaseInfoPO.getMaterialCode()); + gwInDetail.setSpec(materialBaseInfoPO.getSpecificationModel()); + gwInDetail.setUnit(materialBaseInfoPO.getDeclarationUnit()); + gwInDetail.setQty(reservationInMaterialDetail.getQuantity()); + gwInDetail.setErpCurr(materialBaseInfoPO.getCurrency()); + gwInDetail.setErpPrice(materialBaseInfoPO.getUnitPrice()); + BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice(); + BigDecimal quantity = reservationInMaterialDetail.getQuantity(); + if (unitPrice != null && quantity != null && unitPrice.compareTo(BigDecimal.ZERO) != 0&&quantity.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal Amount = unitPrice.multiply(quantity).setScale(2, BigDecimal.ROUND_HALF_UP); + gwInDetail.setAmount(Amount); + reservationInMaterialDetail.setAmountGw(Amount); + } + reservationInMaterialDetail.setQtyGw(quantity); + reservationInMaterialDetail.setSpecGw(materialBaseInfoPO.getSpecificationModel()); + reservationInMaterialDetail.setUnitGw(materialBaseInfoPO.getDeclarationUnit()); + reservationInMaterialDetail.setErpPriceGw(unitPrice); + reservationInMaterialDetail.setErpCurrGw(materialBaseInfoPO.getCurrency()); + reservationInMaterialDetailMapper.updateById(reservationInMaterialDetail); + orderList.add(gwInDetail); + + } + gwStockInOrder.setOrderList(orderList); + List list = new LinkedList<>(); + list.add(gwStockInOrder); + + GwLog gwLog = new GwLog(); + gwLog.setType("保税仓-进口订单"); + gwLog.setBusinessId(id); + gwLog.setRequestBody(com.alibaba.fastjson.JSONObject.toJSONString(list)); + gwLog.setResponseBody(""); + gwLog.setStatus(1); + gwLog.setSendTime(new Date()); + gwLog.setOrganizationId(organizationId); + gwLog.setTopOrganizationId(topOrganizationId); + gwLog.setOrganizationName(organizationName); + gwLog.setCreateBy(pushBy); +// gwLog.setPushByName(pushByName); + gwLog.setCreateTime(new Date()); + gwLog.setDelFlag(1); + gwLogMapper.insert(gwLog); + + updatePushStatus(id, 2, new Date(), pushBy,pushByName); + String ncUrl = reservationStockInOrderMapper.getNcUrl("gw", organizationName, organizationId); + CloseableHttpClient httpClient = HttpClients.createDefault(); + String url = ""; + if (ncUrl != null) { + url = ncUrl; + } else { + url = PUSH_API_URL; + } +// HttpPost customsHttpPost = new HttpPost(url); + HttpPost httpPost = new HttpPost(url); + StringEntity postingString = new StringEntity(com.alibaba.fastjson.JSONObject.toJSONString(list), "UTF-8"); + httpPost.setEntity(postingString); + httpPost.setHeader("Content-type", "application/json"); + httpPost.setHeader("apiName", API_NAME); + httpPost.setHeader("verify", VERIFY); + + try { + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + gwLog.setResponseBody(responseString); +// 直接转Map + Map map = JSON.parseObject(responseString); + Integer code = (Integer) map.get("code"); + if (response.getStatusLine().getStatusCode() == 200&&code == 200) { + gwLog.setStatus(2); + updatePushStatus(id, 3, new Date(), pushBy,pushByName); + successCount++; + } else { + gwLog.setStatus(3); + gwLog.setErrorMsg(responseString); + updatePushStatus(id, 4, new Date(), pushBy,pushByName); + failCount++; + failMsg.append("入库单id:").append(id).append("失败;"); + } + gwLogMapper.updateById(gwLog); + response.close(); + } catch (IOException e) { + gwLog.setStatus(3); + gwLog.setErrorMsg(e.getMessage()); + gwLog.setResponseBody("请求异常:" + e.getMessage()); + gwLogMapper.updateById(gwLog); + updatePushStatus(id, 4, new Date(), pushBy,pushByName); + failCount++; + failMsg.append("id:").append(id).append("异常:").append(e.getMessage()).append(";"); + log.error("进口订单推送异常: id={}, error={}", id, e.getMessage()); + } finally { + try { + httpClient.close(); + } catch (Exception e) { + log.error("关闭httpClient异常: {}", e.getMessage()); + } + } + } + + String resultMsg = "推送完成: 成功" + successCount + "条, 失败" + failCount + "条"; + if (failCount > 0) { + resultMsg += "[" + failMsg.toString() + "]"; + } + return AjaxResult.success(resultMsg); + } + + private void updatePushStatus(Long id, Integer pushStatus, Date pushTime, Long pushBy,String pushByName) { + ExecutionStockInOrder entity = new ExecutionStockInOrder(); + entity.setInOrderId(id); + entity.setPushStatus(pushStatus); + if (pushTime != null) { + entity.setPushTime(pushTime); + } + if (pushBy != null) { + entity.setPushBy(pushBy); + } + if (pushByName != null) { + entity.setPushByName(pushByName); + } + reservationStockInOrderMapper.updateById(entity); + } + + public List queryList1(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null){ + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = stockInOrderDO.getOrganizationId(); // 前端传递的 organizationId + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (userOrganizationId != null && userOrganizationId == 2827L) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + stockInOrderDO.setOrganizationId(frontendOrganizationId); + stockInOrderDO.setTopOrganizationId(null); // 明确设置为 null,避免使用 topOrganizationId 条件 + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + stockInOrderDO.setOrganizationId(null); + stockInOrderDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 如果前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId != null && userOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(userOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + stockInOrderDO.setOrganizationId(userOrganizationId); + } + // 如果前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (userOrganizationId != null) { + stockInOrderDO.setOrganizationId(userOrganizationId); + } + } + // 只有当 organizationId 为 null 时,才使用 topOrganizationId 作为查询条件 + // 如果 organizationId 不为 null,则优先使用 organizationId,不使用 topOrganizationId + if (stockInOrderDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + stockInOrderDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 对于非2827组织,必须设置 topOrganizationId=2827 + stockInOrderDO.setTopOrganizationId(2827L); + } + } + // 前端有传warehouseId则优先使用传参;未传时才使用"用户关联仓库"作为默认值 + if (stockInOrderDO.getWarehouseId() == null) { + AssociationWarehouseCacheDO associationWarehouseCacheDO = + SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null) { + stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + } + } + + // 库管角色过滤:不展示已创建(status=1)的入库单 + // 说明:部分场景下角色码可能不在 userPo.roleCode 中,而在 loginUser.roles/roleList 中。 +// if (loginUser != null) { +// String targetRoleCode = "KGY-001"; +// boolean isKuGuan = false; +// +// String roleCode = loginUser.getUserPo() != null ? loginUser.getUserPo().getRoleCode() : null; +// if (StringUtils.isNotBlank(roleCode) && roleCode.contains(targetRoleCode)) { +// isKuGuan = true; +// } +// +// if (!isKuGuan && loginUser.getRoleList() != null) { +// isKuGuan = loginUser.getRoleList().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (!isKuGuan && loginUser.getRoles() != null) { +// isKuGuan = loginUser.getRoles().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (isKuGuan) { +// Integer currentGtStatus = stockInOrderDO.getGtStatus(); +// if (currentGtStatus == null || currentGtStatus < 1) { +// stockInOrderDO.setGtStatus(1); // status > 1 +// } +// } +// } + // 查询订单列表 + List list = stockInOrderDomainService.queryList(stockInOrderDO); + +// ====== 批量查询NC客户编码 ====== + Set shipperIdSet = list.stream() + .map(ExecutionStockInOrderPO::getShipperId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + Map ncCodeMap = new HashMap<>(); + if (!shipperIdSet.isEmpty()) { + try { + + AjaxResult result = userServiceFeign.getCustomerNcCodeBatch(new ArrayList<>(shipperIdSet)); + if (result != null && "200".equals(String.valueOf(result.get("code")))) { + Map dataMap = (Map) result.get("data"); + if (dataMap != null) { + for (Map.Entry entry : dataMap.entrySet()) { + Long key = Long.valueOf(entry.getKey().toString()); + String value = entry.getValue() != null ? entry.getValue().toString() : null; + ncCodeMap.put(key, value); + } + } + } + } catch (Exception e) { + log.error("批量查询NC客户编码失败", e); + } + } + +// 前端传入的NC编码 + String filterNcCode = stockInOrderDO.getCustomerNcCode(); + +// 设置NC编码并过滤 + List filteredList = new ArrayList<>(); + for (ExecutionStockInOrderPO po : list) { + String ncCode = ncCodeMap.get(po.getShipperId()); + po.setCustomerNcCode(ncCode); + + // 如果前端传了NC编码,判断是否一致 + if (filterNcCode != null && !filterNcCode.equals(ncCode)) { + continue; + } + filteredList.add(po); + } + + return filteredList; + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderAssembler.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderAssembler.java new file mode 100644 index 000000000..b8150096d --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderAssembler.java @@ -0,0 +1,134 @@ +package com.mhd.oms.domain.executionStockInOrder.service; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +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.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDTO; +import com.mhd.system.api.model.LoginUser; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 入库单Assembler + * + * @author gen + * @date 2024-05-21 + */ +@Component +public class ExecutionStockInOrderAssembler { + + /** + * 转换实体 + */ + public ExecutionStockInOrderDO toDO(ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = new ExecutionStockInOrderDO(); + // 拷贝 + BeanUtils.copyProperties(stockInOrderDTO, stockInOrderDO, IgnoreNullUtil.getNullPropertyNames(stockInOrderDTO)); + // 确保查询条件字段被正确传递(查询条件字段需要明确传递,避免被IgnoreNullUtil忽略) + stockInOrderDO.setCreateTimeStart(stockInOrderDTO.getCreateTimeStart()); + stockInOrderDO.setCreateTimeEnd(stockInOrderDTO.getCreateTimeEnd()); + // 列表筛选:前端常传「名称 (编码)」展示串,库内多为纯名称,去掉末尾括号段再 LIKE + if (stockInOrderDTO.getMaterialName() != null && !stockInOrderDTO.getMaterialName().isEmpty()) { + String normalized = normalizeDetailMaterialNameForQuery(stockInOrderDTO.getMaterialName()); + stockInOrderDO.setMaterialName(normalized.isEmpty() + ? stockInOrderDTO.getMaterialName().trim() + : normalized); + } + return stockInOrderDO; + } + + /** + * 转换实体 + */ + public ExecutionStockInOrderDO toDOByEdit(ExecutionStockInOrderDTO stockInOrderDTO) { + // 兼容前端传 userName 作为货主名称字段的情况: + // 如果 shipperName 为空但 userName 有值,则优先回填到 shipperName, + // 以保证后续 shipperParam 能根据名称正确找到货主ID。 + if (ObjectUtil.isNull(stockInOrderDTO.getShipperId()) + && (stockInOrderDTO.getShipperName() == null || stockInOrderDTO.getShipperName().trim().length() == 0) + && stockInOrderDTO.getUserName() != null && stockInOrderDTO.getUserName().trim().length() > 0) { + stockInOrderDTO.setShipperName(stockInOrderDTO.getUserName().trim()); + } + + ExecutionStockInOrderDO stockInOrderDO = JSONUtil.toBean(JSONUtil.toJsonStr(stockInOrderDTO), ExecutionStockInOrderDO.class); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + // 获取登录人id + Long userId = loginUser.getUserid(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = null; + if (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) { + // 优先使用UserPo中的userName(用户真实姓名) + userRealName = loginUser.getUserPo().getUserName(); + } else if (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) { + // 其次使用realname + userRealName = loginUser.getRealname(); + } else { + // 最后使用username(账号)作为兜底 + userRealName = loginUser.getUsername(); + } + if(stockInOrderDTO.getInOrderId() != null){ + stockInOrderDO.setUpdateBy(userId); + stockInOrderDO.setUpdateByName(userRealName); + stockInOrderDO.setUpdateTime(new Date()); + }else { + stockInOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + stockInOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + stockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + stockInOrderDO.setCreateBy(userId); + // 强制设置创建人姓名为用户真实姓名,确保覆盖前端可能传递的账号 + stockInOrderDO.setCreateByName(userRealName); + stockInOrderDO.setCreateTime(new Date()); + stockInOrderDO.setDelFlag(1); + // 新增入库单时,如果入库单类型为空,默认设置为普通入库 + String orderTypeCode = stockInOrderDO.getOrderTypeCode(); + if (orderTypeCode == null || orderTypeCode.trim().length() == 0) { + stockInOrderDO.setOrderTypeCode("pu_tong_ru_ku"); + } + String orderTypeName = stockInOrderDO.getOrderTypeName(); + if (orderTypeName == null || orderTypeName.trim().length() == 0) { + stockInOrderDO.setOrderTypeName("普通入库单"); + } + // 新增入库单时,计划数量取所有明细行的入库数量之和 + if (!CollectionUtils.isEmpty(stockInOrderDO.getMaterialDetailList())) { + BigDecimal totalInboundQuantity = stockInOrderDO.getMaterialDetailList().stream() + .map(detail -> detail.getInboundQuantity() != null ? detail.getInboundQuantity() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setQuantity(totalInboundQuantity); + } + } + return stockInOrderDO; + } + + /** + * 去掉物料展示名末尾的「 (xxx) / (xxx)」等,便于与库内 material_name 模糊匹配。 + */ + private static String normalizeDetailMaterialNameForQuery(String raw) { + if (raw == null) { + return null; + } + String s = raw.trim(); + // 循环去掉末尾多组括号(兼容「名称 (编码)」或重复后缀) + String next; + do { + next = s.replaceFirst("[\\s\\u3000]*[((][^))]*[))]\\s*$", "").trim(); + if (next.equals(s)) { + break; + } + s = next; + } while (!s.isEmpty()); + return s; + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java new file mode 100644 index 000000000..044e7cc9c --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java @@ -0,0 +1,981 @@ +package com.mhd.oms.domain.executionStockInOrder.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.OrderSequence; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; +import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailBaseDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.InventoryAdjustmentRecordPO; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.facade.IExecutionStockInOrderService; +import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialGoodsRulePO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialWarehouseControlPO; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderPO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.WmsServiceFeign; +import com.mhd.system.api.domain.*; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 入库单 + * + * @author gen + * @date 2024-05-21 + */ +@Service +@Slf4j +public class ExecutionStockInOrderDomainService { + + @Autowired + private IExecutionStockInOrderService stockInOrderService; + @Autowired + private IExecutionInMaterialDetailService materialDetailService; + @Autowired + private IExecutionStockOutOrderService stockOutOrderService; +// @Autowired +// private ReservationStockReceiptOrderDomainService stockReceiptOrderDomainService; +// @Autowired +// private ReservationStockShelfOrderDomainService stockShelfOrderDomainService; +// @Autowired +// private IMaterialBaseInfoService materialBaseInfoService; +// @Autowired +// private IMaterialGoodsRuleService materialGoodsRuleService; +// @Autowired +// private IMaterialWarehouseControlService materialWarehouseControlService; + @Autowired + private SystemServiceFeign systemServiceFeign; + @Autowired + private WmsServiceFeign wmsServiceFeign; + @Autowired + private ExecutionStockInOrderMapper reservationStockInOrderMapper; + + @Autowired + private BusinessDocumentOrderMapper businessDocumentOrderMapper; +// @Autowired +// private IReceiptMaterialDetailService receiptMaterialDetailService; +// @Autowired +// private IShelfMaterialDetailService shelfMaterialDetailService; + + /** + * 分页查询入库单列表 + */ + public List queryList(ExecutionStockInOrderDO stockInOrderDO) { + return stockInOrderService.queryList(stockInOrderDO); + } + + + /** + * 新增入库单 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean insert(ExecutionStockInOrderDO stockInOrderDO) { + if (stockInOrderDO.getInOrderNumber() == null) { + stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK")); + } +// //设置默认值 +// setDefaultValues(stockInOrderDO); +// //设置物料信息 +// setMaterialDetailInfo(stockInOrderDO); +// //统计总物料种数 +// stockInOrderDO.setMaterialQuantity(stockInOrderDO.getMaterialDetailList().size()); +// //统计总计划数 + BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setQuantity(quantity); + + BigDecimal amount = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setAmount(amount); +// //统计总重量 +// BigDecimal weightLimit = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockInOrderDO.setWeightLimit(weightLimit); +// //统计总体积 +// BigDecimal volumeLimit = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockInOrderDO.setVolumeLimit(volumeLimit); + stockInOrderService.insert(stockInOrderDO); + return materialDetailService.batchInsert(stockInOrderDO.getInOrderNumber(), stockInOrderDO.getMaterialDetailList()); + } + + /** + * 批量新增入库单 + */ + public Boolean batchInsert(List stockInOrderDOList) { + for (ExecutionStockInOrderDO stockInOrderDO : stockInOrderDOList){ + if (StringUtils.isBlank(stockInOrderDO.getInOrderNumber())){ + stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK")); + } +// //设置物料信息 +// setMaterialDetailInfo(stockInOrderDO); +// //统计总物料种数 +// stockInOrderDO.setMaterialQuantity(stockInOrderDO.getMaterialDetailList().size()); +// //统计总计划数 +// BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockInOrderDO.setQuantity(quantity); +// //统计总重量 +// BigDecimal weightLimit = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockInOrderDO.setWeightLimit(weightLimit); +// //统计总体积 +// BigDecimal volumeLimit = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockInOrderDO.setVolumeLimit(volumeLimit); + stockInOrderService.insert(stockInOrderDO); + materialDetailService.batchInsert(stockInOrderDO.getInOrderNumber(), stockInOrderDO.getMaterialDetailList()); + } + return true; + } + + /** + * 修改入库单 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean update(ExecutionStockInOrderDO stockInOrderDO) { + ExecutionStockInOrderPO stockInOrderPO = stockInOrderService.getInfo(stockInOrderDO.getInOrderId()); + if (stockInOrderPO == null){ + throw new ServiceException("入库单信息不存在"); + } + //设置物料信息 + setMaterialDetailInfo(stockInOrderDO); + //统计总物料种数 + stockInOrderDO.setMaterialQuantity(stockInOrderDO.getMaterialDetailList().size()); + //统计总计划数 + BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderPO.setQuantity(quantity); + stockInOrderDO.setQuantity(quantity); + BigDecimal amount = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setAmount(amount); + //统计总重量 + BigDecimal weightLimit = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setWeightLimit(weightLimit); + //统计总体积 + BigDecimal volumeLimit = stockInOrderDO.getMaterialDetailList().stream().map(ExecutionInMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockInOrderDO.setVolumeLimit(volumeLimit); + stockInOrderService.update(stockInOrderDO); + ExecutionInMaterialDetailBaseDO inMaterialDetailBaseDO = new ExecutionInMaterialDetailBaseDO(); + BeanUtils.copyProperties(stockInOrderPO, inMaterialDetailBaseDO); + inMaterialDetailBaseDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); +// if (stockInOrderDO.getNeedTransport() ==0) { +// List businessDocumentOrders = businessDocumentOrderMapper.selectList(new LambdaQueryWrapper().eq(BusinessDocumentOrder::getInOrderNumber, stockInOrderDO.getInOrderNumber()).notIn(BusinessDocumentOrder::getOrderStatus, 4, 5)); +// if (businessDocumentOrders != null && businessDocumentOrders.size() > 0) { +// for (BusinessDocumentOrder businessDocumentOrder : businessDocumentOrders) { +// businessDocumentOrder.setOrderStatus(4L); +// String executeOrderNumber = businessDocumentOrder.getExecuteOrderNumber(); +// +// if (executeOrderNumber !=null){ +// throw new ServiceException("该业务单已生成执行单,取消失败"); +// } +// businessDocumentOrderMapper.updateById(businessDocumentOrder); +// } +// } +// } +// + + return materialDetailService.batchUpdate(stockInOrderDO.getMaterialDetailList(), inMaterialDetailBaseDO); + } + + /** + * 批量删除入库单 + */ + public Boolean delete(Long[] inOrderIds) { + return stockInOrderService.delete(inOrderIds); + } + + + /** + * 获取入库单详细信息 + */ + public ExecutionStockInOrderPO getInfo(Long inOrderId) + { + ExecutionStockInOrderPO stockInOrderPO = stockInOrderService.getInfo(inOrderId); + ExecutionInMaterialDetailDO inMaterialDetailDO = new ExecutionInMaterialDetailDO(); + String inOrderNumber = stockInOrderPO.getInOrderNumber(); + List businessDocumentOrders = businessDocumentOrderMapper.selectList(new LambdaQueryWrapper().eq(BusinessDocumentOrder::getInOrderNumber, inOrderNumber).notIn(BusinessDocumentOrder::getOrderStatus,4,5)); + stockInOrderPO.setBusinessDocumentOrderDOList(businessDocumentOrders); + inMaterialDetailDO.setInOrderNumber(inOrderNumber); + inMaterialDetailDO.setLevel(1); + List inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO); + + // 先通过入库单号查询收货单列表 +// StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO(); +// stockReceiptOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); +// List stockReceiptOrderPOList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDO); +// +// // 先通过入库单号查询上架单列表 +// StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); +// stockShelfOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); +// List stockShelfOrderPOList = stockShelfOrderDomainService.queryList(stockShelfOrderDO); +// + // 查询收货单明细,用于填充收货数量和更新毛重、净重、面积、体积 +// List receiptMaterialDetailPOList = new ArrayList<>(); +// if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) { +// List receiptOrderNumberList = stockReceiptOrderPOList.stream() +// .map(StockReceiptOrderPO::getReceiptOrderNumber) +// .filter(StringUtils::isNotBlank) +// .collect(Collectors.toList()); +// if (!CollectionUtils.isEmpty(receiptOrderNumberList)) { +// ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); +// receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList); +// receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO); +// } +// } + + // 查询上架单明细,用于填充上架数量 +// List shelfMaterialDetailPOList = new ArrayList<>(); +// if (!CollectionUtils.isEmpty(stockShelfOrderPOList)) { +// for (StockShelfOrderPO stockShelfOrderPO : stockShelfOrderPOList) { +// if (StringUtils.isNotBlank(stockShelfOrderPO.getShelfOrderNumber())) { +// ShelfMaterialDetailDO shelfMaterialDetailDO = new ShelfMaterialDetailDO(); +// shelfMaterialDetailDO.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); +// List shelfDetails = shelfMaterialDetailService.queryList(shelfMaterialDetailDO); +// if (!CollectionUtils.isEmpty(shelfDetails)) { +// shelfMaterialDetailPOList.addAll(shelfDetails); +// } +// } +// } +// } + + // 按 materialDetailId 分组汇总收货数量和上架数量,以及更新毛重、净重、面积、体积 + if (!CollectionUtils.isEmpty(inMaterialDetailPOList)) { + // 按 materialDetailId 分组汇总收货数量(实际收货数量)、毛重、净重、面积、体积 + // 收货数量:入库单对应的收货单实际收货数量汇总 +// Map receiptDetailMap = new HashMap<>(); +// if (!CollectionUtils.isEmpty(receiptMaterialDetailPOList)) { +// // 递归处理所有层级的收货单明细(包括子明细) +// for (ReceiptMaterialDetailPO receiptDetail : receiptMaterialDetailPOList) { +// processReceiptDetail(receiptDetail, receiptDetailMap); +// } +// } + + // 按 materialDetailId 分组汇总上架数量(实际上架数量) + // 上架数量:入库单对应的上架单实际上架数量汇总 +// Map shelfQuantityMap = new HashMap<>(); +// if (!CollectionUtils.isEmpty(shelfMaterialDetailPOList)) { +// for (ShelfMaterialDetailPO shelfDetail : shelfMaterialDetailPOList) { +// if (shelfDetail.getMaterialDetailId() != null && shelfDetail.getShelvesQuantity() != null) { +// Long materialDetailId = shelfDetail.getMaterialDetailId(); +// BigDecimal shelvesQuantity = shelfQuantityMap.getOrDefault(materialDetailId, BigDecimal.ZERO); +// shelfQuantityMap.put(materialDetailId, shelvesQuantity.add(shelfDetail.getShelvesQuantity())); +// } +// } +// } + + // 填充入库单明细的收货数量、上架数量;入库单明细 total* 保持计划值不因收货覆盖(原按收货汇总 total* 已注释保留) + for (ExecutionInMaterialDetailPO inMaterialDetail : inMaterialDetailPOList) { + Long materialDetailId = inMaterialDetail.getMaterialDetailId(); + if (materialDetailId != null) { + Long materialBaseInfoId = inMaterialDetail.getMaterialBaseInfoId(); + List inventoryAdjustmentRecordPOS = materialDetailService.getkctzjl(materialBaseInfoId, inOrderNumber, "入库"); + if (inventoryAdjustmentRecordPOS != null && inventoryAdjustmentRecordPOS.size()>0) { + InventoryAdjustmentRecordPO inventoryAdjustmentRecordPO = inventoryAdjustmentRecordPOS.get(0); + inMaterialDetail.setAllocationBeforeQuantity(inventoryAdjustmentRecordPO.getAllocationBeforeQuantity()); + inMaterialDetail.setAllocationAfterQuantity(inventoryAdjustmentRecordPO.getAllocationAfterQuantity()); + inMaterialDetail.setFreezeAfterQuantity(inventoryAdjustmentRecordPO.getFreezeAfterQuantity()); + inMaterialDetail.setFreezeBeforeQuantity(inventoryAdjustmentRecordPO.getFreezeBeforeQuantity()); + inMaterialDetail.setInventoryAfterQuantity(inventoryAdjustmentRecordPO.getInventoryAfterQuantity()); + inMaterialDetail.setInventoryBeforeQuantity(inventoryAdjustmentRecordPO.getInventoryBeforeQuantity()); + inMaterialDetail.setNetWeight(inventoryAdjustmentRecordPO.getNetWeight()); + inMaterialDetail.setGrossWeight(inventoryAdjustmentRecordPO.getGrossWeight()); + inMaterialDetail.setVolume(inventoryAdjustmentRecordPO.getVolume()); + inMaterialDetail.setArea(inventoryAdjustmentRecordPO.getArea()); + inMaterialDetail.setAdjustedNetWeight(inventoryAdjustmentRecordPO.getAdjustedNetWeight()); + inMaterialDetail.setAdjustedGrossWeight(inventoryAdjustmentRecordPO.getAdjustedGrossWeight()); + inMaterialDetail.setAdjustedVolume(inventoryAdjustmentRecordPO.getAdjustedVolume()); + inMaterialDetail.setAdjustedArea(inventoryAdjustmentRecordPO.getAdjustedArea()); + } + if(materialBaseInfoId != null){ + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(materialBaseInfoId); + if (materialBaseInfoPO != null &&materialBaseInfoPO.getUnitPrice() != null){ + inMaterialDetail.setUnitPrice(materialBaseInfoPO.getUnitPrice()); + } + } + // 填充收货数量(入库单对应的收货单实际收货数量) + //ReceiptMaterialDetailPO receiptDetail = receiptDetailMap.get(materialDetailId); +// if (receiptDetail != null) { + // 更新收货数量 +// if (receiptDetail.getReceiptQuantity() != null) { +// inMaterialDetail.setReceiptQuantity(receiptDetail.getReceiptQuantity()); +// } + + // 更新毛重、净重、面积、体积(根据收货时所填的明细行数据更新到入库单明细中) + // 将收货单明细中填写的数据汇总后更新到入库单明细 +// if (receiptDetail.getTotalGrossWeight() != null) { +// inMaterialDetail.setTotalGrossWeight(receiptDetail.getTotalGrossWeight()); +// } +// if (receiptDetail.getTotalNetWeight() != null) { +// inMaterialDetail.setTotalNetWeight(receiptDetail.getTotalNetWeight()); +// } +// if (receiptDetail.getTotalArea() != null) { +// inMaterialDetail.setTotalArea(receiptDetail.getTotalArea()); +// } +// if (receiptDetail.getTotalVolume() != null) { +// inMaterialDetail.setTotalVolume(receiptDetail.getTotalVolume()); +// } +// } + + // 填充上架数量(入库单对应的上架单实际上架数量) +// BigDecimal shelvesQuantity = shelfQuantityMap.get(materialDetailId); +// if (shelvesQuantity != null) { +// inMaterialDetail.setShelvesQuantity(shelvesQuantity); +// } + } + } + } + + stockInOrderPO.setMaterialDetailList(inMaterialDetailPOList); + return stockInOrderPO; + } + + /** + * 递归处理收货单明细,汇总收货数量;毛重/净重/面积/体积汇总已注释(入库单明细 total* 不因收货覆盖) + * @param receiptDetail 收货单明细 + * @param receiptDetailMap 收货单明细汇总Map + */ +// private void processReceiptDetail(ReceiptMaterialDetailPO receiptDetail, Map receiptDetailMap) { +// if (receiptDetail == null || receiptDetail.getMaterialDetailId() == null) { +// return; +// } +// +// Long materialDetailId = receiptDetail.getMaterialDetailId(); +// ReceiptMaterialDetailPO existing = receiptDetailMap.get(materialDetailId); +// +// if (existing == null) { +// // 如果不存在,直接放入Map +// receiptDetailMap.put(materialDetailId, receiptDetail); +// } else { +// // 如果已存在,汇总收货数量、毛重、净重、面积、体积 +// // 汇总收货数量(实际收货数量) +// BigDecimal receiptQuantity = existing.getReceiptQuantity() != null ? existing.getReceiptQuantity() : BigDecimal.ZERO; +// BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO; +// existing.setReceiptQuantity(receiptQuantity.add(newReceiptQuantity)); +// +// // 汇总毛重、净重、面积、体积(根据收货时填写的数据)— 入库单明细 total* 不因收货覆盖,已注释保留 +// // 累加所有收货单明细的毛重、净重、面积、体积 +//// BigDecimal existingGrossWeight = existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO; +//// BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO; +//// existing.setTotalGrossWeight(existingGrossWeight.add(newGrossWeight)); +//// +//// BigDecimal existingNetWeight = existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO; +//// BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO; +//// existing.setTotalNetWeight(existingNetWeight.add(newNetWeight)); +//// +//// BigDecimal existingArea = existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO; +//// BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO; +//// existing.setTotalArea(existingArea.add(newArea)); +//// +//// BigDecimal existingVolume = existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO; +//// BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO; +//// existing.setTotalVolume(existingVolume.add(newVolume)); +// } +// +// // 递归处理子明细 +// if (!CollectionUtils.isEmpty(receiptDetail.getChildren())) { +// for (ReceiptMaterialDetailPO child : receiptDetail.getChildren()) { +// processReceiptDetail(child, receiptDetailMap); +// } +// } +// } + + /** + * @description 审核入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + public Boolean auditState(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Integer auditStatus = stockInOrderDO.getIssueStatus(); + Integer issueStatus = 0; + issueStatus = auditStatus == 2 ? 2 : 3; + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + return stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getReservationAuditId, loginUser.getUserid()) + .set(ExecutionStockInOrder::getReservationAuditName, userRealName) + .set(ExecutionStockInOrder::getReservationAuditTime, new Date()) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, userRealName) + .set(ExecutionStockInOrder::getUpdateTime, new Date()) + .set(ExecutionStockInOrder::getIssueStatus, issueStatus) + .in(ExecutionStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + } + + @Transactional(rollbackFor = Exception.class) + public Boolean cancelAuditState(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Integer issueStatus = stockInOrderDO.getIssueStatus(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + + //逻辑删除w入库单信息 + List inOrderIds = stockInOrderDO.getInOrderIds(); + if (inOrderIds != null && !inOrderIds.isEmpty()) { + for (Long inOrderId : inOrderIds) { + ExecutionStockInOrder executionStockInOrder = reservationStockInOrderMapper.selectById(inOrderId); + if (executionStockInOrder != null) { + String inOrderNumber = executionStockInOrder.getInOrderNumber(); + reservationStockInOrderMapper.delWOrder(inOrderNumber); + reservationStockInOrderMapper.delWOrderDetail(inOrderNumber); + String wShOrder = reservationStockInOrderMapper.getWShOrder(inOrderNumber); + reservationStockInOrderMapper.delWShOrder(inOrderNumber); + reservationStockInOrderMapper.delWShOrderDetail(wShOrder); + } + } + } + + return stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getIssueId, null) + .set(ExecutionStockInOrder::getIssueName, null) + .set(ExecutionStockInOrder::getIssueTime, null) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, userRealName) + .set(ExecutionStockInOrder::getUpdateTime, new Date()) + .set(ExecutionStockInOrder::getIssueStatus, 0) + .in(ExecutionStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + } + + /** + * @description 审核入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + public Boolean issueOrder(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + boolean update = stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getIssueId, loginUser.getUserid()) + .set(ExecutionStockInOrder::getIssueName, userRealName) + .set(ExecutionStockInOrder::getIssueTime, new Date()) + //.set(ExecutionStockInOrder::getIssueStatus, 1) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, userRealName) + .set(ExecutionStockInOrder::getUpdateTime, new Date()) + .in(ExecutionStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + + //todo下发推送到wms + List inOrderIds = stockInOrderDO.getInOrderIds(); + for (Long inOrderId : inOrderIds) { + ExecutionStockInOrder byId = stockInOrderService.getById(inOrderId); + StockInOrder stockInOrder = new StockInOrder(); + BeanUtils.copyProperties(byId, stockInOrder,"inOrderId"); + stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); + wmsServiceFeign.omsInOrderAdd(stockInOrder); + String inOrderNumber = stockInOrder.getInOrderNumber(); + List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ExecutionInMaterialDetail::getInOrderNumber, inOrderNumber)); + List inMaterialDetailList = new ArrayList<>(); + for (ExecutionInMaterialDetail reservationInMaterialDetail : materialDetailList) { + InMaterialDetail inMaterialDetail = new InMaterialDetail(); + BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail,"materialDetailId"); + inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); + inMaterialDetailList.add(inMaterialDetail); + } + wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); + } + return update; + } + + /** + * @description 入库单返回结果 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param orderId + * @param status + * @param type + * @return Boolean + */ + public Boolean returnResult(String orderNumber, Long status, String type) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + if (type != null && type.equals("1")) { + return stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getStatus, status) + .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getUpdateByName, userRealName) + .set(ExecutionStockOutOrder::getUpdateTime, new Date()) + .in(ExecutionStockOutOrder::getOutOrderNumber, orderNumber)); + } else { + return stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getStatus, status) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, userRealName) + .set(ExecutionStockInOrder::getUpdateTime, new Date()) + .in(ExecutionStockInOrder::getInOrderNumber, orderNumber)); + } + } + + + /** + * @description 取消入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + public Boolean cancelOrder(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + return stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getCancelOrder, 2) + .set(ExecutionStockInOrder::getCancelRemark, stockInOrderDO.getCancelRemark()) + .set(ExecutionStockInOrder::getCancelBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getCancelByName, loginUser.getUsername()) + .set(ExecutionStockInOrder::getCancelTime, new Date()) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, loginUser.getUsername()) + .set(ExecutionStockInOrder::getUpdateTime, new Date()) + .in(ExecutionStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + } + + /** + * @description 关闭入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockInOrderDO + * @return Boolean + */ + public Boolean closeOrder(ExecutionStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + return stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getCloseOrder, 1) + .set(ExecutionStockInOrder::getStatus, 7) + .set(ExecutionStockInOrder::getCloseRemark, stockInOrderDO.getCloseRemark()) + .set(ExecutionStockInOrder::getCloseBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getCloseByName, loginUser.getUsername()) + .set(ExecutionStockInOrder::getCloseTime, new Date()) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, loginUser.getUsername()) + .set(ExecutionStockInOrder::getUpdateTime, new Date()) + .in(ExecutionStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + } + + public Boolean pushInOrder(StockInOrderTZPD stockInOrder) { + ExecutionStockInOrder reservationStockInOrder = new ExecutionStockInOrder(); + BeanUtils.copyProperties(stockInOrder, reservationStockInOrder); + reservationStockInOrder.setIssueStatus(4); + return stockInOrderService.save(reservationStockInOrder); + } + + public Boolean pushInOrderDetail(InMaterialDetailTZPD inMaterialDetail) { + ExecutionInMaterialDetail reservationInMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(inMaterialDetail, reservationInMaterialDetail); + return materialDetailService.save(reservationInMaterialDetail); + } + + /** + * @description 审核通过生成收货单 + * @author ZhouGY + * @date 2024/5/22 14:48 + * @param stockInOrderDO + * @return Boolean + */ +// public Boolean auditApprove(ExecutionStockInOrderDO stockInOrderDO){ +// ExecutionStockInOrderDO stockInOrderDOByQuery = new ExecutionStockInOrderDO(); +// stockInOrderDOByQuery.setInOrderIds(stockInOrderDO.getInOrderIds()); +// stockInOrderDOByQuery.setLtAuditStatus(3); +// List stockInOrderPOList = stockInOrderService.queryList(stockInOrderDOByQuery); +// if (CollectionUtils.isEmpty(stockInOrderPOList)){ +// throw new ServiceException("出库单不存在或已审核通过"); +// } +// List inOrderNumberList = stockInOrderPOList.stream().map(ExecutionStockInOrderPO::getInOrderNumber).collect(Collectors.toList()); +// ExecutionInMaterialDetailDO inMaterialDetailDO = new ExecutionInMaterialDetailDO(); +// inMaterialDetailDO.setInOrderNumberList(inOrderNumberList); +// List inMaterialDetailPOList = materialDetailService.queryListChildren(inMaterialDetailDO); +// Map> inMaterialDetailListMap = inMaterialDetailPOList.stream().collect(Collectors.groupingBy(ExecutionInMaterialDetailPO::getInOrderNumber)); +// +// List stockReceiptOrderDOList = new ArrayList<>(); +// stockInOrderPOList.forEach(p -> { +// StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO(); +// BeanUtils.copyProperties(p, stockReceiptOrderDO); +// stockReceiptOrderDO.setReceiptOrderNumber(OrderSequence.getOrderCode("SH")); +// List inMaterialDetailPOs = inMaterialDetailListMap.get(p.getInOrderNumber()); +// if (!CollectionUtils.isEmpty(inMaterialDetailPOs)){ +// List receiptMaterialDetailDOList = new ArrayList<>(); +// inMaterialDetailPOs.forEach(inMaterialDetailPO -> { +// ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); +// BeanUtils.copyProperties(inMaterialDetailPO, receiptMaterialDetailDO); +// receiptMaterialDetailDO.setInUniqueId(inMaterialDetailPO.getUniqueId()); +// +// // 复制特定字段:生产日期、过期日期、存货日期、批次参考号、单据参考号、箱号/卡板号、扩展属性1-4 +// // 这些字段可能使用驼峰命名或下划线命名,使用反射获取和设置 +// copySpecialFields(inMaterialDetailPO, receiptMaterialDetailDO); +// //收货计划数量赋值 +// receiptMaterialDetailDO.setQuantity(inMaterialDetailPO.getInboundQuantity()); +// receiptMaterialDetailDOList.add(receiptMaterialDetailDO); +// }); +// stockReceiptOrderDO.setMaterialDetailList(receiptMaterialDetailDOList); +// stockReceiptOrderDO.setMaterialQuantity(receiptMaterialDetailDOList.size()); +// // 重新计算计划数量:从物料明细中汇总quantity字段 +// BigDecimal quantity = receiptMaterialDetailDOList.stream() +// .map(ReceiptMaterialDetailDO::getQuantity) +// .filter(Objects::nonNull) +// .reduce(BigDecimal.ZERO, BigDecimal::add); +// stockReceiptOrderDO.setQuantity(quantity); +// } else { +// // 如果没有物料明细,将数量设置为0 +// stockReceiptOrderDO.setQuantity(BigDecimal.ZERO); +// } +// stockReceiptOrderDOList.add(stockReceiptOrderDO); +// }); +// //判断物流是否需要生成质检单 +// genQualityInspection(stockReceiptOrderDOList); +// //生成收货单 +// Boolean batchInsertResult = stockReceiptOrderDomainService.batchInsert(stockReceiptOrderDOList); +// if (!batchInsertResult) { +// throw new ServiceException("生成收货单失败"); +// } +// //生成收货任务:根据入库单号查询刚生成的收货单 +// List stockReceiptOrderPOList = new ArrayList<>(); +// for (String inOrderNumber : inOrderNumberList) { +// StockReceiptOrderDO stockReceiptOrderDOQuery = new StockReceiptOrderDO(); +// stockReceiptOrderDOQuery.setInOrderNumber(inOrderNumber); +// List receiptOrderList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDOQuery); +// if (!CollectionUtils.isEmpty(receiptOrderList)) { +// stockReceiptOrderPOList.addAll(receiptOrderList); +// } +// } +// if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) { +// stockReceiptOrderDomainService.genStockReceiptTaskOrder(stockReceiptOrderPOList); +// } +// return batchInsertResult; +// } + + + + /** + * @description 设置物料信息 + * @author ZhouGY + * @date 2024/5/23 14:03 + * @param stockInOrderDO + */ + private void setMaterialDetailInfo(ExecutionStockInOrderDO stockInOrderDO){ + List inMaterialDetailDOList = stockInOrderDO.getMaterialDetailList(); + inMaterialDetailDOList.forEach(inMaterialDetailDO -> { + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(inMaterialDetailDO.getMaterialBaseInfoId()); + //MaterialBaseInfoPO materialBaseInfoPO = materialBaseInfoService.getInfo(inMaterialDetailDO.getMaterialBaseInfoId()); + if (materialBaseInfoPO == null){ + throw new ServiceException("物料基础信息不存在"); + } + inMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode()); + inMaterialDetailDO.setMaterialName(materialBaseInfoPO.getMaterialName()); + inMaterialDetailDO.setBarCode(materialBaseInfoPO.getBarCode()); + inMaterialDetailDO.setPackId(materialBaseInfoPO.getPackId()); + inMaterialDetailDO.setPackCode(materialBaseInfoPO.getPackCode()); + inMaterialDetailDO.setPackName(materialBaseInfoPO.getPackName()); + + //获取包装详情 + AjaxResult packDetailResult = systemServiceFeign.getInfoByPackIdAndUnitCode(materialBaseInfoPO.getPackId(), "EA"); + if(!"200".equals(String.valueOf(packDetailResult.get("code")))){ + throw new ServiceException("获取物料单位EA信息失败"); + } + PackDetailFeignPO packDetailFeignPO = JSON.parseObject(JSONObject.toJSONString(packDetailResult.get("data")), PackDetailFeignPO.class); + inMaterialDetailDO.setPackDetailId(packDetailFeignPO.getPackDetailId()); + inMaterialDetailDO.setUnitCode(packDetailFeignPO.getUnitCode()); + inMaterialDetailDO.setUnitName(packDetailFeignPO.getName()); + inMaterialDetailDO.setUnitNumber(packDetailFeignPO.getNumber()); + inMaterialDetailDO.setWeightLimit(packDetailFeignPO.getWeight()); + inMaterialDetailDO.setVolumeLimit(packDetailFeignPO.getVolume()); + + //获取仓库控制信息 + MaterialWarehouseControlPO materialWarehouseControlPO = reservationStockInOrderMapper.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId()); + //MaterialWarehouseControlPO materialWarehouseControlPO = materialWarehouseControlService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId()); + if (materialWarehouseControlPO == null){ +// throw new ServiceException("物料仓库控制信息不存在"); + materialWarehouseControlPO = new MaterialWarehouseControlPO(); + } + inMaterialDetailDO.setMaterialWarehouseControlId(materialWarehouseControlPO.getMaterialWarehouseControlId()); + inMaterialDetailDO.setSerialNumberManage(materialWarehouseControlPO.getSerialNumberManage()); + inMaterialDetailDO.setQualityInspectionManage(materialWarehouseControlPO.getQualityInspectionManage()); + inMaterialDetailDO.setQualityInspectionStage(materialWarehouseControlPO.getQualityInspectionStage()); + inMaterialDetailDO.setQualityInspectionRule(materialWarehouseControlPO.getQualityInspectionRule()); + inMaterialDetailDO.setQualityInspectionTerm(materialWarehouseControlPO.getQualityInspectionTerm()); + inMaterialDetailDO.setAllowOvercharge(materialWarehouseControlPO.getAllowOvercharge()); + inMaterialDetailDO.setOverchargeRatio(materialWarehouseControlPO.getOverchargeRatio()); + + //获取商品规则信息 + MaterialGoodsRulePO materialGoodsRulePO = reservationStockInOrderMapper.getGoodsInfoByMaterialBaseInfoIds(inMaterialDetailDO.getMaterialBaseInfoId()); + //MaterialGoodsRulePO materialGoodsRulePO = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoPO.getMaterialBaseInfoId()); + if (materialGoodsRulePO == null){ +// throw new ServiceException("物料商品规则信息不存在"); + materialGoodsRulePO =new MaterialGoodsRulePO(); + } + inMaterialDetailDO.setDistributeRuleId(materialGoodsRulePO.getMaterialGoodsRuleId()); + inMaterialDetailDO.setDistributeRuleCode(materialGoodsRulePO.getRuleCode()); + inMaterialDetailDO.setDistributeRuleName(materialGoodsRulePO.getRuleName()); + + //自动填充规格型号和SKU码(如果物料基础信息中有相关字段且明细中未设置) + //规格型号:优先使用物料种类名称,如果为空则使用物料类型名称 + if (StringUtils.isBlank(inMaterialDetailDO.getSpecificationModel())) { + if (StringUtils.isNotBlank(materialBaseInfoPO.getMaterialTypeName())) { + inMaterialDetailDO.setSpecificationModel(materialBaseInfoPO.getMaterialTypeName()); + } + } + //SKU码:使用物料条形码 + if (StringUtils.isBlank(inMaterialDetailDO.getSkuCode())) { + if (StringUtils.isNotBlank(materialBaseInfoPO.getBarCode())) { + inMaterialDetailDO.setSkuCode(materialBaseInfoPO.getBarCode()); + } + } + }); + } + + /** + * @description 设置默认值 + * @author gen + * @date 2026/1/16 + * @param stockInOrderDO + */ + private void setDefaultValues(ExecutionStockInOrderDO stockInOrderDO) { + //海关是否查验货物(默认:0=否) + if (stockInOrderDO.getCustomsInspection() == null) { + stockInOrderDO.setCustomsInspection(0); + } + //是否需要报关(默认:1=是) + if (stockInOrderDO.getNeedCustomsDeclaration() == null) { + stockInOrderDO.setNeedCustomsDeclaration(1); + } + //是否需要运输(默认:0=否) + if (stockInOrderDO.getNeedTransport() == null) { + stockInOrderDO.setNeedTransport(0); + } + } + + /** + * @description 复制特定字段从入库单明细到收货明细 + * 包括:生产日期、过期日期、存货日期、批次参考号、单据参考号、箱号/卡板号、扩展属性1-4 + * @author gen + * @date 2026/1/29 + * @param source 源对象(ExecutionInMaterialDetailPO) + * @param target 目标对象(ReceiptMaterialDetailDO) + */ +// private void copySpecialFields(ExecutionInMaterialDetailPO source, ReceiptMaterialDetailDO target) { +// if (source == null || target == null) { +// return; +// } +// +// try { +// // 字段映射:源字段名 -> 目标字段名(支持驼峰和下划线两种命名方式) +// Map fieldMappings = new HashMap<>(); +// fieldMappings.put("productionDate", "productionDate"); +// fieldMappings.put("production_date", "productionDate"); +// fieldMappings.put("expiryDate", "expiryDate"); +// fieldMappings.put("expiry_date", "expiryDate"); +// fieldMappings.put("inventoryDate", "inventoryDate"); +// fieldMappings.put("inventory_date", "inventoryDate"); +// fieldMappings.put("batchRefNo", "batchRefNo"); +// fieldMappings.put("batch_ref_no", "batchRefNo"); +// fieldMappings.put("sheetRefNo", "sheetRefNo"); +// fieldMappings.put("sheet_ref_no", "sheetRefNo"); +// fieldMappings.put("boxPalletNo", "boxPalletNo"); +// fieldMappings.put("box_pallet_no", "boxPalletNo"); +// fieldMappings.put("extAttr1", "extAttr1"); +// fieldMappings.put("ext_attr_1", "extAttr1"); +// fieldMappings.put("extAttr2", "extAttr2"); +// fieldMappings.put("ext_attr_2", "extAttr2"); +// fieldMappings.put("extAttr3", "extAttr3"); +// fieldMappings.put("ext_attr_3", "extAttr3"); +// fieldMappings.put("extAttr4", "extAttr4"); +// fieldMappings.put("ext_attr_4", "extAttr4"); +// +// // 使用反射复制字段值 +// for (Map.Entry entry : fieldMappings.entrySet()) { +// String sourceFieldName = entry.getKey(); +// String targetFieldName = entry.getValue(); +// +// // 尝试从源对象获取字段值(支持驼峰和下划线命名) +// Object value = getFieldValue(source, sourceFieldName); +// if (value != null) { +// // 设置到目标对象(使用驼峰命名) +// setFieldValue(target, targetFieldName, value); +// log.info("复制字段成功:{} -> {},值:{}", sourceFieldName, targetFieldName, value); +// } else { +// log.debug("源对象字段 {} 的值为 null,跳过复制", sourceFieldName); +// } +// } +// } catch (Exception e) { +// log.warn("复制特定字段时发生异常,源对象:{},目标对象:{},错误:{}", +// source.getClass().getSimpleName(), target.getClass().getSimpleName(), e.getMessage()); +// } +// } + + /** + * @description 使用反射获取字段值(支持驼峰和下划线命名) + */ + private Object getFieldValue(Object obj, String fieldName) { + if (obj == null || StringUtils.isBlank(fieldName)) { + return null; + } + + try { + Class clazz = obj.getClass(); + Field field = null; + + // 先尝试直接获取字段(驼峰命名) + try { + field = clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + // 如果失败,尝试转换为驼峰命名(如果是下划线命名) + if (fieldName.contains("_")) { + String camelCaseName = snakeToCamel(fieldName); + try { + field = clazz.getDeclaredField(camelCaseName); + } catch (NoSuchFieldException ex) { + // 继续查找父类 + } + } + } + + // 如果当前类找不到,查找父类 + if (field == null) { + Class currentClass = clazz.getSuperclass(); + while (currentClass != null && field == null) { + try { + field = currentClass.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + if (fieldName.contains("_")) { + String camelCaseName = snakeToCamel(fieldName); + try { + field = currentClass.getDeclaredField(camelCaseName); + } catch (NoSuchFieldException ex) { + // 继续查找父类 + } + } + } + currentClass = currentClass.getSuperclass(); + } + } + + if (field != null) { + field.setAccessible(true); + return field.get(obj); + } + } catch (Exception e) { + log.debug("获取字段值失败,对象:{},字段名:{},错误:{}", + obj.getClass().getSimpleName(), fieldName, e.getMessage()); + } + + return null; + } + + /** + * @description 使用反射设置字段值 + */ + private void setFieldValue(Object obj, String fieldName, Object value) { + if (obj == null || StringUtils.isBlank(fieldName)) { + return; + } + + try { + Class clazz = obj.getClass(); + Field field = null; + + // 先尝试直接获取字段(驼峰命名) + try { + field = clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + // 如果失败,查找父类 + Class currentClass = clazz.getSuperclass(); + while (currentClass != null && field == null) { + try { + field = currentClass.getDeclaredField(fieldName); + } catch (NoSuchFieldException ex) { + // 继续查找父类 + } + currentClass = currentClass.getSuperclass(); + } + } + + if (field != null) { + field.setAccessible(true); + // 类型转换:如果值类型不匹配,尝试转换 + Class fieldType = field.getType(); + if (value != null && !fieldType.isAssignableFrom(value.getClass())) { + // 尝试类型转换 + if (fieldType == Date.class && value instanceof String) { + // 字符串转日期(简单处理,实际可能需要更复杂的解析) + value = null; // 暂时不转换,避免解析错误 + } else if (fieldType == String.class) { + value = String.valueOf(value); + } + } + if (value != null && fieldType.isAssignableFrom(value.getClass())) { + field.set(obj, value); + } + } + } catch (Exception e) { + log.debug("设置字段值失败,对象:{},字段名:{},值:{},错误:{}", + obj.getClass().getSimpleName(), fieldName, value, e.getMessage()); + } + } + + /** + * @description 下划线命名转驼峰命名 + */ + private String snakeToCamel(String snakeCase) { + if (StringUtils.isBlank(snakeCase)) { + return snakeCase; + } + + String[] parts = snakeCase.split("_"); + if (parts.length == 0) { + return snakeCase; + } + + StringBuilder camelCase = new StringBuilder(parts[0].toLowerCase()); + for (int i = 1; i < parts.length; i++) { + if (parts[i].length() > 0) { + camelCase.append(parts[i].substring(0, 1).toUpperCase()) + .append(parts[i].substring(1).toLowerCase()); + } + } + + return camelCase.toString(); + } + + public List queryNoticePrint(ExecutionStockInOrderDO stockInOrderDO) { + return stockInOrderService.queryNoticePrint(stockInOrderDO); + } + + public List queryNoticePrintDetail(ExecutionStockInOrderDO stockInOrderDO) { + return stockInOrderService.queryNoticePrintDetail(stockInOrderDO); + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/entity/ExecutionStockOutOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/entity/ExecutionStockOutOrder.java new file mode 100644 index 000000000..a664ff674 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/entity/ExecutionStockOutOrder.java @@ -0,0 +1,495 @@ +package com.mhd.oms.domain.executionStockOutOrder.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 出库单对象 reservation_stock_out_order + * + * @author gen + * @date 2024-05-28 + */ + +@Data +public class ExecutionStockOutOrder extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库单id") + @TableId(type = IdType.AUTO) + private Long outOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String businessOutOrderNumber; + + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核") + private Integer status; + + @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("出库单审核备注") + @Excel(name = "出库单审核备注") + private String auditRemark; + + @ApiModelProperty("出库单审核人") + @Excel(name = "出库单审核人") + private Long auditBy; + + @ApiModelProperty("出库单审核人姓名") + @Excel(name = "出库单审核人姓名") + private String auditByName; + + @ApiModelProperty("出库单审核时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date auditTime; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String orderTypeName; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @ApiModelProperty("预计出货时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + @Excel(name = "是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + @Excel(name = "是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + + @ApiModelProperty("已生成拣货单数量") + @Excel(name = "已生成拣货单分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @ApiModelProperty("取消订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @ApiModelProperty("关闭订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date closeTime; + + @ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核") + @Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核") + private Integer checkStatus; + + @ApiModelProperty("复核任务是否下发: 1-是 2-否") + @Excel(name = "复核任务是否下发: 1-是 2-否") + private Integer checkTaskDistribution; + + @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 checkTaskDistributionTime; + + @ApiModelProperty("复核作业人用户ID") + @Excel(name = "复核作业人用户ID") + private Long checkOperatorsBy; + + @ApiModelProperty("复核作业人姓名") + @Excel(name = "复核作业人姓名") + private String checkOperatorsName; + + @ApiModelProperty("调度单号") + @Excel(name = "调度单号") + private String mobilizeCode; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + @ApiModelProperty("to") + @Excel(name = "to") + @TableField(value = "\"TO\"") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号") + @Excel(name = "委托编号") + private String entrustNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSign; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declareCustoms; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddr; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("承运商名称") + @Excel(name = "承运商名称") + private String carrierName; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("柜") + @Excel(name = "柜") + private String containerNoName; + + @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") + private Date outboundDate; + @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 completeTime; + @ApiModelProperty("orderDate") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeCode; + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeName; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeCode; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeName; + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private String customsInspectionFlag; + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private String needTransportFlag; + @ApiModelProperty("app上传的图片") + private String pictureApp; + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("出库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date outboundTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty("总金额") + @Excel(name = "总金额") + private BigDecimal totalAmount; + @ApiModelProperty("路线") + private String route; + + @ApiModelProperty(value = "发票编号") + private String invoiceNumber; + + @ApiModelProperty(value = "客户编号") + private String customerNumber; + + @ApiModelProperty(value = "配送名称") + private String deliveryName; + + @ApiModelProperty(value = "退货入库单号") + private String returnOrderNumber; + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private BigDecimal returnQuantity; + + @ApiModelProperty("运输业务单号") + @Excel(name = "运输业务单号") + private String businessNumber; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + @ApiModelProperty("车次") + @Excel(name = "车次") + private Integer trainNo; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/facade/IExecutionStockOutOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/facade/IExecutionStockOutOrderService.java new file mode 100644 index 000000000..f6b99a4ba --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/facade/IExecutionStockOutOrderService.java @@ -0,0 +1,55 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; + +import java.util.List; + +/** + * 出库单Service接口 + * + * @author gen + * @date 2024-05-28 + */ +public interface IExecutionStockOutOrderService extends IService +{ + /** + * 分页查询出库单列表 + */ + public List queryList(ExecutionStockOutOrderDO stockOutOrderDO); + + /** + * 新增出库单 + */ + public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO); + + /** + * 修改出库单 + */ + public Boolean update(ExecutionStockOutOrderDO stockOutOrderDO); + + /** + * 批量删除出库单 + */ + public Boolean delete(Long[] outOrderIds); + + + /** + * 查询出库单 + */ + public ExecutionStockOutOrderPO getInfo(Long outOrderId); + + /** + * 出库单提货单打印-表头 + */ + List queryOutStockNoticePrint(ExecutionStockOutOrderDO stockOutOrderDO); + + /** + * 出库单提货单打印-明细 + */ + List queryOutStockNoticePrintDetail(ExecutionStockOutOrderDO stockOutOrderDO); + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/mapper/ExecutionStockOutOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/mapper/ExecutionStockOutOrderMapper.java new file mode 100644 index 000000000..95c0deb2f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/mapper/ExecutionStockOutOrderMapper.java @@ -0,0 +1,40 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import org.apache.ibatis.annotations.Param; +//import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; + +import java.util.List; + +/** + * 出库单Mapper接口 + * + * @author gen + * @date 2024-05-28 + */ +public interface ExecutionStockOutOrderMapper extends BaseMapper +{ + /** + * 查询出库单列表 + */ + public List queryList(ExecutionStockOutOrderDO stockOutOrderDO); + + /** + * 出库单提货单打印-表头 + */ + List queryOutStockNoticePrint(ExecutionStockOutOrderDO stockOutOrderDO); + + /** + * 出库单提货单打印-明细 + */ + List queryOutStockNoticePrintDetail(ExecutionStockOutOrderDO stockOutOrderDO); + + public void delWOrder(@Param("outOrderNumber") String outOrderNumber); + + public void delWOrderDetail(@Param("outOrderNumber") String outOrderNumber); + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/persistence/ExecutionStockOutOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/persistence/ExecutionStockOutOrderImpl.java new file mode 100644 index 000000000..34e567487 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/persistence/ExecutionStockOutOrderImpl.java @@ -0,0 +1,121 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.persistence; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.oms.domain.executionStockOutOrder.repository.mapper.ExecutionStockOutOrderMapper; +import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 出库单Service业务层处理 + * + * @author gen + * @date 2024-05-28 + */ +@Service +public class ExecutionStockOutOrderImpl extends ServiceImpl implements IExecutionStockOutOrderService { + @Autowired + private ExecutionStockOutOrderMapper reservationStockOutOrderMapper; + + /** + * 查询出库单列表 + */ + @Override + public List queryList(ExecutionStockOutOrderDO stockOutOrderDO) + { + return reservationStockOutOrderMapper.queryList(stockOutOrderDO); + } + + /** + * 新增出库单 + */ + @Override + public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) { + ExecutionStockOutOrder stockOutOrder = new ExecutionStockOutOrder(); + BeanUtils.copyProperties(stockOutOrderDO,stockOutOrder); + return this.save(stockOutOrder); + } + + /** + * 修改出库单 + */ + @Override + public Boolean update(ExecutionStockOutOrderDO stockOutOrderDO) { + ExecutionStockOutOrder stockOutOrder = new ExecutionStockOutOrder(); + BeanUtils.copyProperties(stockOutOrderDO,stockOutOrder); + return this.updateById(stockOutOrder); + } + + /** + * 批量删除出库单 + */ + @Override + public Boolean delete(Long[] outOrderIds ) { + List list = new ArrayList<>(); + for (Long id : outOrderIds) { + ExecutionStockOutOrder stockOutOrder = new ExecutionStockOutOrder(); + stockOutOrder.setOutOrderId(id); + stockOutOrder.setDelFlag(2); + list.add(stockOutOrder); + } + return this.updateBatchById(list); + } + + /** + * 修改出库单 + */ + @Override + public ExecutionStockOutOrderPO getInfo(Long outOrderId) { + ExecutionStockOutOrder stockOutOrder = this.getById(outOrderId); + ExecutionStockOutOrderPO stockOutOrderPO = new ExecutionStockOutOrderPO(); + BeanUtils.copyProperties(stockOutOrder,stockOutOrderPO); + return stockOutOrderPO; + } + + /** + * @description 更新订单任务下发状态 + * @author ZhouGY + * @date 2024/8/1 13:56 + * @param deliveTaskDO + * @return Boolean + */ +// @Override +// public Boolean handleDeliveTask(DeliveTaskDO deliveTaskDO) { +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// //标记收货单任务已下发 +// return update(null, new UpdateWrapper().lambda() +// .set(ExecutionStockOutOrder::getCheckOperatorsBy, deliveTaskDO.getOperatorsBy()) +// .set(ExecutionStockOutOrder::getCheckOperatorsName, deliveTaskDO.getOperatorsName()) +// .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) +// .set(ExecutionStockOutOrder::getUpdateByName, loginUser.getUsername()) +// .set(ExecutionStockOutOrder::getUpdateTime, new Date()) +// .eq(ExecutionStockOutOrder::getOutOrderNumber, deliveTaskDO.getTrackingNumber())); +// } + + + /** + * 出库单提货单打印-表头 + */ + @Override + public List queryOutStockNoticePrint(ExecutionStockOutOrderDO stockOutOrderDO) { + return reservationStockOutOrderMapper.queryOutStockNoticePrint(stockOutOrderDO); + } + + /** + * 出库单提货单打印-明细 + */ + @Override + public List queryOutStockNoticePrintDetail(ExecutionStockOutOrderDO stockOutOrderDO) { + return reservationStockOutOrderMapper.queryOutStockNoticePrintDetail(stockOutOrderDO); + } + + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderBasePO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderBasePO.java new file mode 100644 index 000000000..6cb953d88 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderBasePO.java @@ -0,0 +1,103 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author ZhouGY + * @title StockInOrderBasePO + * @description: TODO + * @date 2024/5/22 11:50 + **/ +@Data +public class ExecutionStockOutOrderBasePO extends BaseVOEntity { + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String orderTypeName; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + @Excel(name = "是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + @Excel(name = "是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java new file mode 100644 index 000000000..877d6eb18 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java @@ -0,0 +1,505 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 出库单对象 stock_out_order + * + * @author gen + * @date 2024-05-28 + */ + +@Data +@ApiModel(value = "出库单对象", description = "出库单响应对象") +public class ExecutionStockOutOrderPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库单id") + private Long outOrderId; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + private Integer status; + + @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("出库单审核备注") + @Excel(name = "出库单审核备注") + private String auditRemark; + + @ApiModelProperty("出库单审核人") + @Excel(name = "出库单审核人") + private Long auditBy; + + @ApiModelProperty("出库单审核人姓名") + @Excel(name = "出库单审核人姓名") + private String auditByName; + + @ApiModelProperty("出库单审核时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date auditTime; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String orderTypeName; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @ApiModelProperty("预计出货时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + @Excel(name = "是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + @Excel(name = "是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + + @ApiModelProperty("已生成拣货单数量") + @Excel(name = "已生成拣货单分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @ApiModelProperty("取消订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @ApiModelProperty("关闭订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date closeTime; + + @ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核") + @Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核") + private Integer checkStatus; + + @ApiModelProperty("复核任务是否下发: 1-是 2-否") + @Excel(name = "复核任务是否下发: 1-是 2-否") + private Integer checkTaskDistribution; + + @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 checkTaskDistributionTime; + + @ApiModelProperty("复核作业人用户ID") + @Excel(name = "复核作业人用户ID") + private Long checkOperatorsBy; + + @ApiModelProperty("复核作业人姓名") + @Excel(name = "复核作业人姓名") + private String checkOperatorsName; + + @ApiModelProperty("调度单号") + @Excel(name = "调度单号") + private String mobilizeCode; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("物料明细") + private List materialDetailList; +// +// @ApiModelProperty("出库单复核统计") +// private ReservationOutMaterialCheckPO outMaterialCheckPO; + + @ApiModelProperty("越库单id") + private Long overStockId; + + @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") + @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") + private Integer overStockStatus; + + @ApiModelProperty("越库类型:1-直接越库 2-分拨越库") + @Excel(name = "越库类型:1-直接越库 2-分拨越库") + private Long overStockType; + + + @ApiModelProperty("to") + @Excel(name = "to") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号") + @Excel(name = "委托编号") + private String entrustNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSign; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declareCustoms; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddr; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("柜") + @Excel(name = "柜") + private String containerNoName; + + @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") + private Date outboundDate; + @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 completeTime; + @ApiModelProperty("orderDate") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeCode; + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeName; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeCode; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeName; + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private String customsInspectionFlag; + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private String needTransportFlag; + + @ApiModelProperty("出库交接图片,PDA出库交接时上传的照片,多张图片以逗号隔开") + private String pictureApp; + + @ApiModelProperty("出库总数量") + private BigDecimal totalOutboundQuantity; + + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + @ApiModelProperty("承运商名称") + @Excel(name = "承运商名称") + private String carrierName; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("出库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date outboundTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty("总金额") + @Excel(name = "总金额") + private BigDecimal totalAmount; + @ApiModelProperty("路线") + private String route; + + + @ApiModelProperty(value = "发票编号") + private String invoiceNumber; + + @ApiModelProperty(value = "客户编号") + private String customerNumber; + + @ApiModelProperty(value = "配送名称") + private String deliveryName; + + @ApiModelProperty(value = "退货入库单号") + private String returnOrderNumber; + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private BigDecimal returnQuantity; + private List reservationDeliveryDetailsLinkList; + + @ApiModelProperty("运输业务单号") + @Excel(name = "运输业务单号") + private String businessNumber; + + @ApiModelProperty("NC客户编码") + private String customerNcCode; + @ApiModelProperty("车次") + @Excel(name = "车次") + private Integer trainNo; + private String khdm; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/AllocationByOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/AllocationByOrderDO.java new file mode 100644 index 000000000..e04f68420 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/AllocationByOrderDO.java @@ -0,0 +1,73 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.todo; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author ZhouGY + * @title AllocationSowingWallDO + * @description: 播种分货 + * @date 2024/6/5 14:29 + **/ +@Data +public class AllocationByOrderDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("物料编码/物料条码/序列号") + @Excel(name = "物料编码/物料条码/序列号") + private String materialNumber; + + @ApiModelProperty("是否单件扫描:1-是 2-否") + @Excel(name = "是否单件扫描:1-是 2-否") + private Integer singleScan; + + @ApiModelProperty("数量EA") + @Excel(name = "数量EA") + private BigDecimal quantity; + + @ApiModelProperty("集货仓库id") + @Excel(name = "集货仓库id") + private Long warehouseId; + + @ApiModelProperty("集货仓库编码") + @Excel(name = "集货仓库编码") + private String warehouseCode; + + @ApiModelProperty("集货仓库名称") + @Excel(name = "集货仓库名称") + private String warehouseName; + + @ApiModelProperty("集货库区id") + @Excel(name = "集货库区id") + private Long storageSectionId; + + @ApiModelProperty("集货库区编码") + @Excel(name = "集货库区编码") + private String storageCode; + + @ApiModelProperty("集货库区名称") + @Excel(name = "集货库区名称") + private String storageName; + + @ApiModelProperty("集货库位id") + @Excel(name = "集货库位id") + private Long storageLocationId; + + @ApiModelProperty("集货库位编码") + @Excel(name = "集货库位编码") + private String storageLocationCode; + + @ApiModelProperty("集货库位名称") + @Excel(name = "集货库位名称") + private String storageLocationName; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderBaseDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderBaseDO.java new file mode 100644 index 000000000..c3fb86cd0 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderBaseDO.java @@ -0,0 +1,109 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +//import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * @author ZhouGY + * @title StockInOrderBasePO + * @description: TODO + * @date 2024/5/22 11:50 + **/ +@Data +public class ExecutionStockOutOrderBaseDO extends BaseVOEntity { + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("物料明细") + private List materialDetailList; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderBaseDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderBaseDTO.java new file mode 100644 index 000000000..0c2363b1f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderBaseDTO.java @@ -0,0 +1,103 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author ZhouGY + * @title StockInOrderBasePO + * @description: TODO + * @date 2024/5/22 11:50 + **/ +@Data +public class ExecutionStockOutOrderBaseDTO extends BaseVOEntity { + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码") + @Excel(name = "入库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("入库单类型名称") + @Excel(name = "入库单类型名称") + private String orderTypeName; + + @ApiModelProperty("供应商id") + @Excel(name = "供应商id") + private Long supplierId; + + @ApiModelProperty("供应商编码") + @Excel(name = "供应商编码") + private String supplierCode; + + @ApiModelProperty("供应商名称") + @Excel(name = "供应商名称") + private String supplierName; + + @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 expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接入库: 1-是 2-否") + @Excel(name = "是否直接入库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java new file mode 100644 index 000000000..926cf3f5e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java @@ -0,0 +1,568 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; +//import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 出库单对象 stock_out_order + * + * @author gen + * @date 2024-05-28 + */ + +@Data +public class ExecutionStockOutOrderDO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库单id") + private Long outOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + private Integer status; + + @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("出库单审核备注") + @Excel(name = "出库单审核备注") + private String auditRemark; + + @ApiModelProperty("出库单审核人") + @Excel(name = "出库单审核人") + private Long auditBy; + + @ApiModelProperty("出库单审核人姓名") + @Excel(name = "出库单审核人姓名") + private String auditByName; + + @ApiModelProperty("出库单审核时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date auditTime; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String orderTypeName; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @ApiModelProperty("预计出货时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + @Excel(name = "是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + @Excel(name = "是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + + @ApiModelProperty("已生成拣货单数量") + @Excel(name = "已生成拣货单分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @ApiModelProperty("取消订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @ApiModelProperty("关闭订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date closeTime; + + @ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核") + @Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核") + private Integer checkStatus; + + @ApiModelProperty("复核任务是否下发: 1-是 2-否") + @Excel(name = "复核任务是否下发: 1-是 2-否") + private Integer checkTaskDistribution; + + @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 checkTaskDistributionTime; + + @ApiModelProperty("复核作业人用户ID") + @Excel(name = "复核作业人用户ID") + private Long checkOperatorsBy; + + @ApiModelProperty("复核作业人姓名") + @Excel(name = "复核作业人姓名") + private String checkOperatorsName; + + @ApiModelProperty("调度单号") + @Excel(name = "调度单号") + private String mobilizeCode; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("出库单id集合") + private List outOrderIds; + + @ApiModelProperty("物料明细") + private List materialDetailList; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("序列号") + @Excel(name = "序列号") + private String serialNumber; + + @ApiModelProperty("物料审核数量") + @Excel(name = "物料审核数量") + private BigDecimal actualQuantity; + + @ApiModelProperty("波次类型编码") + private String waveOrderTypeCode; + + @ApiModelProperty("出库状态大于某个状态") + private Integer gtStatus; + + @ApiModelProperty("出库状态小于某个状态") + private Integer ltStatus; + + @ApiModelProperty("大于复核状态: 1-未复核 2-复核中 3-已复核") + private Integer gtCheckStatus; + + @ApiModelProperty("小于复核状态: 1-未复核 2-复核中 3-已复核") + private Integer ltCheckStatus; + + @ApiModelProperty("PDA复核查询tab: 1-列表(待复核) 2-历史记录(已复核)") + private Integer tabType; + + @ApiModelProperty("to") + @Excel(name = "to") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号") + @Excel(name = "委托编号") + private String entrustNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSign; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declareCustoms; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddr; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("柜") + @Excel(name = "柜") + private String containerNoName; + + @ApiModelProperty("出仓日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date outboundDate; + + @ApiModelProperty(name = "出库时间查询条件开始日期") + private String outboundDateStart; + + @ApiModelProperty(name = "出库时间查询条件结束日期") + private String outboundDateEnd; + @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 completeTime; + @ApiModelProperty("orderDate") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeCode; + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeName; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeCode; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeName; + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private String customsInspectionFlag; + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private String needTransportFlag; + + @ApiModelProperty(name = "创建时间查询条件开始日期") + private String createTimeStart; + + @ApiModelProperty(name = "创建时间查询条件结束日期") + private String createTimeEnd; + + @ApiModelProperty(name = "审核时间查询条件开始日期") + private String auditTimeStart; + + @ApiModelProperty(name = "审核时间查询条件结束日期") + private String auditTimeEnd; + + @ApiModelProperty("出库明细-物料名称(商品名称),模糊匹配") + private String materialName; + + @ApiModelProperty("出库明细-物料编码,模糊匹配") + private String materialCode; + + @ApiModelProperty(name = "已分配数量总数量") + private BigDecimal alreadyAllocationQuantityAll; + + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + @ApiModelProperty("承运商名称") + @Excel(name = "承运商名称") + private String carrierName; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("出库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date outboundTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + + @ApiModelProperty("总金额") + @Excel(name = "总金额") + private BigDecimal totalAmount; + @ApiModelProperty("路线") + private String route; + + + @ApiModelProperty(value = "发票编号") + private String invoiceNumber; + + @ApiModelProperty(value = "客户编号") + private String customerNumber; + + @ApiModelProperty(value = "配送名称") + private String deliveryName; + + @ApiModelProperty(value = "退货入库单号") + private String returnOrderNumber; + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private BigDecimal returnQuantity; + private List reservationDeliveryDetailsLinkList; + + @ApiModelProperty("运输业务单号") + @Excel(name = "运输业务单号") + private String businessNumber; + + @ApiModelProperty("NC客户编码") + private String customerNcCode; + @ApiModelProperty("车次") + @Excel(name = "车次") + private Integer trainNo; + + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeTo; + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeTo; + private String xfStatus; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java new file mode 100644 index 000000000..f27a11fb9 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java @@ -0,0 +1,556 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDTO; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 出库单对象 stock_out_order + * + * @author gen + * @date 2024-05-28 + */ + +@Data +public class ExecutionStockOutOrderDTO extends ExecutionStockOutOrderBaseDTO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库单id") + private Long outOrderId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + @ApiModelProperty("总价") + @Excel(name = "总价") + private BigDecimal amount; + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("通知单号") + @Excel(name = "通知单号") + private String noticeNumber; + + @ApiModelProperty("出库单号") + @Excel(name = "出库单号") + private String outOrderNumber; + + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + private Integer status; + + @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer auditStatus; + + @ApiModelProperty("出库单审核备注") + @Excel(name = "出库单审核备注") + private String auditRemark; + + @ApiModelProperty("出库单审核人") + @Excel(name = "出库单审核人") + private Long auditBy; + + @ApiModelProperty("出库单审核人姓名") + @Excel(name = "出库单审核人姓名") + private String auditByName; + + @ApiModelProperty("出库单审核时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date auditTime; + + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + @Excel(name = "货主id") + private Long shipperId; + + @ApiModelProperty("货主编码") + @Excel(name = "货主编码") + private String shipperCode; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + @Excel(name = "出库单类型编码") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + @Excel(name = "出库单类型名称") + private String orderTypeName; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @ApiModelProperty("预计出货时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("供应链订单号") + @Excel(name = "供应链订单号") + private String supplyChainNumber; + + @ApiModelProperty("优先级别编码") + @Excel(name = "优先级别编码") + private String priorityLevelCode; + + @ApiModelProperty("优先级别名称") + @Excel(name = "优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + @Excel(name = "是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + @Excel(name = "是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("附件url") + @Excel(name = "附件url") + private String annexUrl; + + @ApiModelProperty("物料种数") + @Excel(name = "物料种数") + private Integer materialQuantity; + + @ApiModelProperty("计划数量") + @Excel(name = "计划数量") + private BigDecimal quantity; + + @ApiModelProperty("净重 单位:千克") + @Excel(name = "净重 单位:千克") + private BigDecimal weightLimit; + + @ApiModelProperty("体积 单位:立方米") + @Excel(name = "体积 单位:立方米") + private BigDecimal volumeLimit; + + @ApiModelProperty("分配数量") + @Excel(name = "分配数量") + private BigDecimal allocationQuantity; + + + @ApiModelProperty("已生成拣货单数量") + @Excel(name = "已生成拣货单分配数量") + private BigDecimal alreadyAllocationQuantity; + + @ApiModelProperty("拣货数量") + @Excel(name = "拣货数量") + private BigDecimal pickingQuantity; + + @ApiModelProperty("复核数量") + @Excel(name = "复核数量") + private BigDecimal checkQuantity; + + @ApiModelProperty("是否取消订单: 1-是 2-否") + @Excel(name = "是否取消订单: 1-是 2-否") + private Integer cancelOrder; + + @ApiModelProperty("取消订单备注") + @Excel(name = "取消订单备注") + private String cancelRemark; + + @ApiModelProperty("取消订单人") + @Excel(name = "取消订单人") + private Long cancelBy; + + @ApiModelProperty("取消订单人姓名") + @Excel(name = "取消订单人姓名") + private String cancelByName; + + @ApiModelProperty("取消订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date cancelTime; + + @ApiModelProperty("是否关闭订单: 1-是 2-否") + @Excel(name = "是否关闭订单: 1-是 2-否") + private Integer closeOrder; + + @ApiModelProperty("关闭订单备注") + @Excel(name = "关闭订单备注") + private String closeRemark; + + @ApiModelProperty("关闭订单人") + @Excel(name = "关闭订单人") + private Long closeBy; + + @ApiModelProperty("关闭订单人姓名") + @Excel(name = "关闭订单人姓名") + private String closeByName; + + @ApiModelProperty("关闭订单时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date closeTime; + + @ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核") + @Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核") + private Integer checkStatus; + + @ApiModelProperty("复核任务是否下发: 1-是 2-否") + @Excel(name = "复核任务是否下发: 1-是 2-否") + private Integer checkTaskDistribution; + + @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 checkTaskDistributionTime; + + @ApiModelProperty("复核作业人用户ID") + @Excel(name = "复核作业人用户ID") + @JsonAlias({"checkOperatorId", "operatorId"}) + private Long checkOperatorsBy; + + @ApiModelProperty("复核作业人姓名") + @Excel(name = "复核作业人姓名") + private String checkOperatorsName; + + @ApiModelProperty("调度单号") + @Excel(name = "调度单号") + private String mobilizeCode; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("出库单id集合") + private List outOrderIds; + + @ApiModelProperty("物料明细") + private List materialDetailList; + + @ApiModelProperty("物料条形码") + @Excel(name = "物料条形码") + private String barCode; + + @ApiModelProperty("物料审核数量") + @Excel(name = "物料审核数量") + private BigDecimal actualQuantity; + + @ApiModelProperty("波次类型编码") + private String waveOrderTypeCode; + + @ApiModelProperty("大于复核状态: 1-未复核 2-复核中 3-已复核") + private Integer gtCheckStatus; + + @ApiModelProperty("小于复核状态: 1-未复核 2-复核中 3-已复核") + private Integer ltCheckStatus; + + @ApiModelProperty("PDA复核查询tab: 1-列表(待复核) 2-历史记录(已复核)") + private Integer tabType; + + @ApiModelProperty("to") + @Excel(name = "to") + private String to; + + @ApiModelProperty("联系人") + @Excel(name = "联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + @Excel(name = "车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号") + @Excel(name = "委托编号") + private String entrustNo; + + @ApiModelProperty("Tel") + @Excel(name = "Tel") + private String tel; + + @ApiModelProperty("司机签名") + @Excel(name = "司机签名") + private String driverSign; + + @ApiModelProperty("Fax") + @Excel(name = "Fax") + private String fax; + + @ApiModelProperty("申报地关区") + @Excel(name = "申报地关区") + private String declareCustoms; + + @ApiModelProperty("生产商") + @Excel(name = "生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + @Excel(name = "报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + @Excel(name = "送货地址") + private String deliveryAddr; + + @ApiModelProperty("进出境关别") + @Excel(name = "进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + @Excel(name = "起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("承运商") + @Excel(name = "承运商") + private String carrier; + + @ApiModelProperty("柜号") + @Excel(name = "柜号") + private String containerNo; + + @ApiModelProperty("柜") + @Excel(name = "柜") + private String containerNoName; + + @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") + private Date outboundDate; + @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 completeTime; + @ApiModelProperty("orderDate") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeCode; + @ApiModelProperty("运输方式") + @Excel(name = "运输方式") + private String transportModeName; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeCode; + @ApiModelProperty("监管方式") + @Excel(name = "监管方式") + private String supervisionModeName; + @ApiModelProperty("海关是否查验货物") + @Excel(name = "海关是否查验货物") + private String customsInspectionFlag; + @ApiModelProperty("是否需要报关") + @Excel(name = "是否需要报关") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输") + @Excel(name = "是否需要运输") + private String needTransportFlag; + + @ApiModelProperty(name = "创建时间查询条件开始日期") + private String createTimeStart; + + @ApiModelProperty(name = "创建时间查询条件结束日期") + private String createTimeEnd; + + @ApiModelProperty(name = "审核时间查询条件开始日期") + private String auditTimeStart; + + @ApiModelProperty(name = "审核时间查询条件结束日期") + private String auditTimeEnd; + + @ApiModelProperty("出库明细-物料名称(商品名称),模糊匹配,与前端参数 materialName 一致") + private String materialName; + + @ApiModelProperty("出库明细-物料编码,模糊匹配,与前端参数 materialCode 一致") + private String materialCode; + + @ApiModelProperty("出库交接图片,PDA出库交接时上传的照片,多张图片以逗号隔开") + private String pictureApp; + + @ApiModelProperty("业务单号") + @Excel(name = "业务单号") + private String businessOrderNo; + + @ApiModelProperty("业务类型") + @Excel(name = "业务类型") + private String businessType; + + @ApiModelProperty("制单人") + @Excel(name = "制单人") + private String documentCreator; + + @ApiModelProperty("制单人名称") + @Excel(name = "制单人名称") + private String documentCreatorName; + + @ApiModelProperty("制单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date documentDate; + @ApiModelProperty("承运商名称") + @Excel(name = "承运商名称") + private String carrierName; + + @ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ") + private Integer issueStatus; + + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("下发人id") + private Long issueId; + + @ApiModelProperty("下发人") + private String issueName; + + @ApiModelProperty("预约审核人id") + private Long reservationAuditId; + + @ApiModelProperty("预约审核人id") + private String reservationAuditName; + + @ApiModelProperty("预约审核时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date reservationAuditTime; + @ApiModelProperty("结算币种") + private String settlementCurrency; + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("tms订单号") + private String tmsOrderNumber; + @ApiModelProperty("仓库负责人") + private String directorName; + + @ApiModelProperty("仓库负责人电话") + private String directorPhone; + + @ApiModelProperty("仓库负责人id") + private Long directorId; + @ApiModelProperty("订单来源") + private String reservationOrderSource; + @ApiModelProperty("出库时间") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date outboundTime; + + @ApiModelProperty("推送状态:1-未推送,2-推送中,3-推送成功,4-推送失败") + private Integer pushStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("推送时间") + private Date pushTime; + + @ApiModelProperty("推送人") + private Long pushBy; + + @ApiModelProperty("推送人姓名") + private String pushByName; + @ApiModelProperty("总金额") + @Excel(name = "总金额") + private BigDecimal totalAmount; + @ApiModelProperty("路线") + private String route; + + + @ApiModelProperty(value = "发票编号") + private String invoiceNumber; + + @ApiModelProperty(value = "客户编号") + private String customerNumber; + + @ApiModelProperty(value = "配送名称") + private String deliveryName; + + @ApiModelProperty(value = "退货入库单号") + private String returnOrderNumber; + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private BigDecimal returnQuantity; + private List reservationDeliveryDetailsLinkList; + + @ApiModelProperty("运输业务单号") + @Excel(name = "运输业务单号") + private String businessNumber; + + @ApiModelProperty("NC客户编码") + private String customerNcCode; + @ApiModelProperty("车次") + @Excel(name = "车次") + private Integer trainNo; + + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pushTimeTo; + @ApiModelProperty(value = "推送时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeFrom; + + @ApiModelProperty(value = "推送时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTimeTo; + @ApiModelProperty(name = "出库时间查询条件开始日期") + private String outboundDateStart; + + @ApiModelProperty(name = "出库时间查询条件结束日期") + private String outboundDateEnd; + + private String xfStatus; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/vo/GwOutDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/vo/GwOutDetail.java new file mode 100644 index 000000000..a65955ca8 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/vo/GwOutDetail.java @@ -0,0 +1,41 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class GwOutDetail { + //订单号 + private String bill_no; + //订单行号 + private Integer line_num; + //物料号 + private String item_no; + //物料名称 + private String item_name; + //物料规格 + private String spec; + //计量单位 + private String unit; + //数量 + private BigDecimal qty; + //企业币制 + private String erp_curr; + //企业单价 + private BigDecimal erp_price; + //申报总价 + private BigDecimal amount; + //入仓订单号 + private String order_i_no; + //入仓订单行号 + private Integer order_i_row; + //仓库 + private String warehouse; + //库位 + private String op_wh_loc; + //入库单编号 + private String bill_i; + //入库单行号 + private Integer bill_i_row; +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/vo/GwStockOutOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/vo/GwStockOutOrder.java new file mode 100644 index 000000000..82cb22df6 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/vo/GwStockOutOrder.java @@ -0,0 +1,21 @@ +package com.mhd.oms.domain.executionStockOutOrder.repository.vo; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class GwStockOutOrder { + //订单号 + private String bill_no; + //进出标记 + private String ie_flag; + //下单日期 + private Date bill_date; + //客户代码 + private String corp_code; + + private List orderList; + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java new file mode 100644 index 000000000..32832e0ac --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java @@ -0,0 +1,1713 @@ +package com.mhd.oms.domain.executionStockOutOrder.service; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.enums.DictCode; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.uuid.IdGenerator; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.InventoryAdjustmentRecordPO; +import com.mhd.oms.domain.executionOutMaterialDetail.entity.ExecutionOutMaterialDetail; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.facade.IExecutionOutMaterialDetailService; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.mapper.ExecutionOutMaterialDetailMapper; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.oms.domain.executionStockOutOrder.repository.mapper.ExecutionStockOutOrderMapper; +import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDTO; +import com.mhd.oms.domain.gwLog.entity.GwLog; +import com.mhd.oms.domain.gwLog.repository.mapper.GwLogMapper; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.repository.mapper.ReservationDeliveryDetailsLinkMapper; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.UserServiceFeign; +import com.mhd.system.api.domain.*; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.io.IOException; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 出库单ApplicationService + * + * @author gen + * @date 2024-05-28 + */ +@Service +@Slf4j +public class ExecutionStockOutOrderApplicationService { + @Autowired + private ExecutionStockOutOrderDomainService stockOutOrderDomainService; +// @Autowired +// private ExecutionOutMaterialDetailDomainService outMaterialDetailDomainService; +// @Autowired +// private MaterialInventoryDomainService materialInventoryDomainService; +// @Autowired +// private MaterialInventoryMapper materialInventoryMapper; + @Autowired + private UserServiceFeign userServiceFeign; + @Autowired + private SystemServiceFeign systemServiceFeign; + @Autowired + private IdGenerator idGenerator; + @Autowired + private IExecutionStockOutOrderService stockOutOrderService; + @Autowired + private IExecutionInMaterialDetailService reservationInMaterialDetailService; + @Autowired + private IExecutionOutMaterialDetailService outMaterialDetailService; +// @Autowired +// private IPickingMaterialDetailService pickingMaterialDetailService; + @Resource + private GwLogMapper gwLogMapper; + @Autowired + private ExecutionStockOutOrderMapper reservationStockOutOrderMapper; + @Autowired + private ExecutionOutMaterialDetailMapper reservationOutMaterialDetailMapper; + @Autowired + private ReservationDeliveryDetailsLinkMapper reservationDeliveryDetailsLinkMapper; + + @Autowired + private ExecutionStockInOrderMapper reservationStockInOrderMapper; + private static final String PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData"; + private static final String API_NAME = "save_order_e"; + private static final String VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; + + + /** + * 分页查询出库单列表 + */ + + public List queryList(ExecutionStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + + if (loginUser != null && loginUser.getUserPo() != null) { + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = stockOutOrderDO.getOrganizationId(); // 前端传递的 organizationId + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (userOrganizationId != null && userOrganizationId == 2827L) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + stockOutOrderDO.setOrganizationId(frontendOrganizationId); + stockOutOrderDO.setTopOrganizationId(null); // 明确设置为 null,避免使用 topOrganizationId 条件 + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + stockOutOrderDO.setOrganizationId(null); + stockOutOrderDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 如果前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId != null && userOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(userOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + stockOutOrderDO.setOrganizationId(userOrganizationId); + } + // 如果前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (userOrganizationId != null) { + stockOutOrderDO.setOrganizationId(userOrganizationId); + } + } + // 只有当 organizationId 为 null 时,才使用 topOrganizationId 作为查询条件 + // 如果 organizationId 不为 null,则优先使用 organizationId,不使用 topOrganizationId + if (stockOutOrderDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + stockOutOrderDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 对于非2827组织,必须设置 topOrganizationId=2827 + stockOutOrderDO.setTopOrganizationId(2827L); + } + } + } + + // 库管角色过滤:不展示已创建(status=1)的出库单 + // 出库状态: 1-已创建 ... +// if (loginUser != null) { +// String targetRoleCode = "KGY-001"; +// boolean isKuGuan = false; +// +// String roleCode = loginUser.getUserPo() != null ? loginUser.getUserPo().getRoleCode() : null; +// if (StringUtils.isNotBlank(roleCode) && roleCode.contains(targetRoleCode)) { +// isKuGuan = true; +// } +// +// if (!isKuGuan && loginUser.getRoleList() != null) { +// isKuGuan = loginUser.getRoleList().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (!isKuGuan && loginUser.getRoles() != null) { +// isKuGuan = loginUser.getRoles().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (isKuGuan) { +// Integer currentGtStatus = stockOutOrderDO.getGtStatus(); +// if (currentGtStatus == null || currentGtStatus < 1) { +// stockOutOrderDO.setGtStatus(1); // status > 1 +// } +// } +// } + + List stockOutOrderPOS = stockOutOrderDomainService.queryList(stockOutOrderDO); +// for (ExecutionStockOutOrderPO stockOutOrderPO : stockOutOrderPOS) { +// ExecutionStockOutOrderPO stockOutOrderPO1 = stockOutOrderDomainService.getInfoChildren(stockOutOrderPO.getOutOrderId()); +// List materialDetailList = stockOutOrderPO1 != null ? stockOutOrderPO1.getMaterialDetailList() : null; +// if (materialDetailList == null) { +// materialDetailList = Collections.emptyList(); +// } +// BigDecimal reduce = materialDetailList.stream().map(ExecutionOutMaterialDetailPO::getOutboundQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockOutOrderPO.setTotalOutboundQuantity(reduce); +// stockOutOrderPO.setAllocationQuantity(stockOutOrderPO1 != null ? stockOutOrderPO1.getAllocationQuantity() : null); +// String outOrderNumber = stockOutOrderPO.getOutOrderNumber(); +// // PDA复核物料总数量:使用实际下发时的拣货完成数量(picking_material_detail),拣货多少显示多少 +// // PDA端物料总数量取quantity字段、复核总数量取checkQuantity字段,需同时设置quantity和pickingQuantity +// BigDecimal actualPickingQty = pickingMaterialDetailService.sumPickingQuantityByOutOrderNumber(outOrderNumber); +// BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0 ? actualPickingQty : (stockOutOrderPO1 != null ? stockOutOrderPO1.getPickingQuantity() : BigDecimal.ZERO); +// stockOutOrderPO.setPickingQuantity(displayPickingQty); +// stockOutOrderPO.setQuantity(displayPickingQty); +// // 物料种类:优先从picking_material_detail统计,为0时从out_material_detail按料号去重 +// Integer materialTypeCount = pickingMaterialDetailService.countMaterialTypesByOutOrderNumber(outOrderNumber); +// if (materialTypeCount != null && materialTypeCount > 0) { +// stockOutOrderPO.setMaterialQuantity(materialTypeCount); +// } else { +// long count = materialDetailList.stream() +// .map(d -> d.getMaterialBaseInfoId() != null ? String.valueOf(d.getMaterialBaseInfoId()) : d.getMaterialCode()) +// .filter(Objects::nonNull) +// .distinct() +// .count(); +// stockOutOrderPO.setMaterialQuantity((int) count); +// } +// // 复核总数量:从out_material_detail汇总check_quantity +// BigDecimal checkSum = materialDetailList.stream().map(ExecutionOutMaterialDetailPO::getCheckQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockOutOrderPO.setCheckQuantity(checkSum); +// } + return stockOutOrderPOS; + } + + + /** + * 新增出库单 + */ + public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) { + //设置仓库 + //setWarehouseInfo(stockOutOrderDO); + //设置货主信息 + shipperParam(stockOutOrderDO); + //设置客户信息 + //customerParam(stockOutOrderDO); + stockOutOrderDO.setOrderTypeCode("pu_tong_chu_ku"); + stockOutOrderDO.setOrderTypeName("普通出库"); + //设置数据字典键值 + //setDataDict(stockOutOrderDO); + return stockOutOrderDomainService.insert(stockOutOrderDO); + } + + /** + * 修改出库单 + */ + public Boolean update(ExecutionStockOutOrderDO stockOutOrderDO) { + return stockOutOrderDomainService.update(stockOutOrderDO); + } + + /** + * 修改出库单 + */ + public Boolean close(ExecutionStockOutOrderDO stockOutOrderDO) { + return stockOutOrderDomainService.close(stockOutOrderDO); + } + + + public Boolean pushOutOrder(StockOutOrderTZPD stockOutOrderDO){ + return stockOutOrderDomainService.pushOutOrder(stockOutOrderDO); + } + + public Boolean pushOutOrderDetail(OutMaterialDetailTZPD outMaterialDetail){ + return stockOutOrderDomainService.pushOutOrderDetail(outMaterialDetail); + } + + /** + * 批量删除出库单 + */ + public boolean delete(Long[] outOrderIds) { + return stockOutOrderDomainService.delete(outOrderIds); + } + + /** + * 获取出库单详细信息(带批次属性) + */ + public ExecutionStockOutOrderPO getInfoChildren(Long outOrderId) + { + ExecutionStockOutOrderPO stockOutOrderPO = stockOutOrderDomainService.getInfoChildren(outOrderId); + String userNcCode = reservationStockInOrderMapper.getUserNcCode(stockOutOrderPO.getShipperId()); + if (stockOutOrderPO == null || CollectionUtils.isEmpty(stockOutOrderPO.getMaterialDetailList())) { + return stockOutOrderPO; + } + stockOutOrderPO.setKhdm(userNcCode); + List materialDetailList = stockOutOrderPO.getMaterialDetailList(); + if (CollectionUtils.isEmpty(materialDetailList)) { + for (ExecutionOutMaterialDetailPO reservationOutMaterialDetailPO : materialDetailList) { + reservationOutMaterialDetailPO.setKhdm(userNcCode); + } + stockOutOrderPO.setMaterialDetailList(materialDetailList); + } + List detailList = stockOutOrderPO.getMaterialDetailList(); + String outOrderNumber = stockOutOrderPO.getOutOrderNumber(); + for (ExecutionOutMaterialDetailPO reservationOutMaterialDetailPO : detailList) { + Long materialBaseInfoId = reservationOutMaterialDetailPO.getMaterialBaseInfoId(); + List inventoryAdjustmentRecordPOS = reservationInMaterialDetailService.getkctzjl(materialBaseInfoId, outOrderNumber, "出库"); + if (inventoryAdjustmentRecordPOS != null && inventoryAdjustmentRecordPOS.size() > 0) { + InventoryAdjustmentRecordPO inventoryAdjustmentRecordPO = inventoryAdjustmentRecordPOS.get(0); + reservationOutMaterialDetailPO.setAllocationBeforeQuantity(inventoryAdjustmentRecordPO.getAllocationBeforeQuantity()); + reservationOutMaterialDetailPO.setAllocationAfterQuantity(inventoryAdjustmentRecordPO.getAllocationAfterQuantity()); + reservationOutMaterialDetailPO.setFreezeAfterQuantity(inventoryAdjustmentRecordPO.getFreezeAfterQuantity()); + reservationOutMaterialDetailPO.setFreezeBeforeQuantity(inventoryAdjustmentRecordPO.getFreezeBeforeQuantity()); + reservationOutMaterialDetailPO.setInventoryAfterQuantity(inventoryAdjustmentRecordPO.getInventoryAfterQuantity()); + reservationOutMaterialDetailPO.setInventoryBeforeQuantity(inventoryAdjustmentRecordPO.getInventoryBeforeQuantity()); + reservationOutMaterialDetailPO.setNetWeight(inventoryAdjustmentRecordPO.getNetWeight()); + reservationOutMaterialDetailPO.setGrossWeight(inventoryAdjustmentRecordPO.getGrossWeight()); + reservationOutMaterialDetailPO.setVolume(inventoryAdjustmentRecordPO.getVolume()); + reservationOutMaterialDetailPO.setArea(inventoryAdjustmentRecordPO.getArea()); + reservationOutMaterialDetailPO.setAdjustedNetWeight(inventoryAdjustmentRecordPO.getAdjustedNetWeight()); + reservationOutMaterialDetailPO.setAdjustedGrossWeight(inventoryAdjustmentRecordPO.getAdjustedGrossWeight()); + reservationOutMaterialDetailPO.setAdjustedVolume(inventoryAdjustmentRecordPO.getAdjustedVolume()); + reservationOutMaterialDetailPO.setAdjustedArea(inventoryAdjustmentRecordPO.getAdjustedArea()); + } + if(materialBaseInfoId != null){ + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(materialBaseInfoId); + if(materialBaseInfoPO != null && materialBaseInfoPO.getUnitPrice() != null){ + reservationOutMaterialDetailPO.setUnitPrice(materialBaseInfoPO.getUnitPrice()); + } + } + } +// +// // 性能优化:批量获取批次属性,避免N+1查询问题 +// // 1. 收集所有唯一的materialBaseInfoId +// Set materialBaseInfoIdSet = detailList.stream() +// .map(ExecutionOutMaterialDetailPO::getMaterialBaseInfoId) +// .filter(Objects::nonNull) +// .collect(Collectors.toSet()); +// +// // 2. 批量查询批次属性(使用Map缓存,避免重复查询相同的materialBaseInfoId) +// Map> batchDetailMap = new HashMap<>(); +// for (Long materialBaseInfoId : materialBaseInfoIdSet) { +// try { +// AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId); +// if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { +// List batchDetailFeignPOList = JSON.parseArray( +// JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); +// if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) { +// // 过滤isDisplay=1的属性 +// List filteredList = batchDetailFeignPOList.stream() +// .filter(batchDetail -> batchDetail.getIsDisplay() != null && batchDetail.getIsDisplay() == 1) +// .collect(Collectors.toList()); +// batchDetailMap.put(materialBaseInfoId, filteredList); +// } +// } +// } catch (Exception e) { +// log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage()); +// } +// } + + // 3. 为每个物料明细设置更多属性(从物料明细表中获取值),递归处理所有层级 + //setMaterialMoreDetailListRecursively(detailList, batchDetailMap); + + // 4. 为每个物料明细设置分配按钮显示类型,递归处理所有层级 + //setAllocationButtonTypeRecursively(detailList); + + // 5. 出库交接场景(已出库/已复核):过滤 pickingQuantity 为 0 的明细,与交接详情一致 +// if (stockOutOrderPO.getStatus() != null && (stockOutOrderPO.getStatus() == 9 || stockOutOrderPO.getStatus() == 12)) { +// filterMaterialDetailByPickingQuantity(detailList, stockOutOrderPO.getReview(), stockOutOrderPO.getOutOrderNumber()); +// } + List reservationDeliveryDetailsLinks = reservationDeliveryDetailsLinkMapper.selectList(new LambdaQueryWrapper() + .eq(ReservationDeliveryDetailsLink::getOrderNumber, stockOutOrderPO.getOutOrderNumber())); + stockOutOrderPO.setReservationDeliveryDetailsLinkList(reservationDeliveryDetailsLinks); + return stockOutOrderPO; + } + + /** + * 出库交接场景:递归过滤 pickingQuantity 为 0 的明细(与交接详情一致) + * @param detailList 物料明细树 + * @param review 是否需要复核 1-是 2-否 + * @param outOrderNumber 出库单号(review=1 时用于 picking_material_detail 查询) + */ +// private void filterMaterialDetailByPickingQuantity(List detailList, Integer review, String outOrderNumber) { +// if (CollectionUtils.isEmpty(detailList)) { +// return; +// } +// for (int i = detailList.size() - 1; i >= 0; i--) { +// ExecutionOutMaterialDetailPO d = detailList.get(i); +// List children = d.getChildren(); +// if (!CollectionUtils.isEmpty(children)) { +// filterMaterialDetailByPickingQuantity(children, review, outOrderNumber); +// } +// BigDecimal pickQty; +// if (Integer.valueOf(1).equals(review) && d.getUniqueId() != null) { +// PickingMaterialDetailPO pickingSummary = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(d.getUniqueId()); +// pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO; +// } else { +// pickQty = d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO; +// } +// if (pickQty.compareTo(BigDecimal.ZERO) <= 0) { +// detailList.remove(i); +// } else if (Integer.valueOf(1).equals(review) && d.getUniqueId() != null) { +// // 需要复核时:用 picking_material_detail 的拣货数量覆盖展示,保证已拣货数量正确 +// d.setPickingQuantity(pickQty); +// } +// } +// } + + /** + * 递归为出库物料明细设置更多属性 + * 如果已分配库存(materialInventoryId不为空),则从库存表中获取批次属性值 + * 否则从物料明细表中获取值 + * @param outMaterialDetailPOList 出库物料明细列表 + * @param batchDetailMap 批次属性Map + */ +// private void setMaterialMoreDetailListRecursively(List outMaterialDetailPOList, +// Map> batchDetailMap) { +// if (CollectionUtils.isEmpty(outMaterialDetailPOList)) { +// return; +// } +// +// outMaterialDetailPOList.forEach(outMaterialDetailPO -> { +// Long materialBaseInfoId = outMaterialDetailPO.getMaterialBaseInfoId(); +// Long materialInventoryId = outMaterialDetailPO.getMaterialInventoryId(); +// +// // 创建新的materialMoreDetailList,只包含isDisplay=1的属性 +// List materialMoreDetailList = new ArrayList<>(); +// +// // 创建batchDetailId到MaterialMoreDetailPO的映射,用于快速查找已有的属性值 +// Map batchDetailIdToMaterialMoreDetailMap = new HashMap<>(); +// List existingList = outMaterialDetailPO.getMaterialMoreDetailList(); +// if (!CollectionUtils.isEmpty(existingList)) { +// for (MaterialMoreDetailPO existing : existingList) { +// if (existing.getBatchDetailId() != null) { +// batchDetailIdToMaterialMoreDetailMap.put(existing.getBatchDetailId(), existing); +// } +// } +// } +// +// // 如果已分配库存,从库存表中获取批次属性值 +// MaterialInventoryPO inventoryPO = null; +// if (materialInventoryId != null && materialInventoryId > 0) { +// try { +// inventoryPO = materialInventoryMapper.selectByIdWithBatchAttributes(materialInventoryId); +// log.info("从库存表获取批次属性,materialInventoryId={}", materialInventoryId); +// } catch (Exception e) { +// log.warn("从库存表获取批次属性失败,materialInventoryId={},错误:{}", materialInventoryId, e.getMessage()); +// } +// } +// +// // 只保留isDisplay=1的批次属性(从batchDetailMap中获取,已经过滤过了) +// if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { +// List batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId); +// // 用于跟踪已添加到列表中的batchDetailId +// Set addedBatchDetailIds = new HashSet<>(); +// +// for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) { +// MaterialMoreDetailPO materialMoreDetailPO = batchDetailIdToMaterialMoreDetailMap.get(batchDetailFeignPO.getBatchDetailId()); +// +// // 如果不存在,创建新的 +// if (materialMoreDetailPO == null) { +// materialMoreDetailPO = new MaterialMoreDetailPO(); +// materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId()); +// materialMoreDetailPO.setBatchDetailId(batchDetailFeignPO.getBatchDetailId()); +// materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels()); +// materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl()); +// materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat()); +// materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption()); +// materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark()); +// } else { +// // 如果已存在,更新属性(保留已有的attributeValue) +// materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId()); +// materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels()); +// materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl()); +// materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat()); +// materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption()); +// materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark()); +// } +// +// // 确保添加到列表中(使用batchDetailId来避免重复) +// Long batchDetailId = batchDetailFeignPO.getBatchDetailId(); +// if (batchDetailId != null && !addedBatchDetailIds.contains(batchDetailId)) { +// materialMoreDetailList.add(materialMoreDetailPO); +// addedBatchDetailIds.add(batchDetailId); +// } +// +// // 根据fieldName或batchLabels获取对应的字段值 +// String fieldValue = null; +// String usedFieldName = null; +// +// // 只有在已分配库存时,才从库存表获取值并设置到attributeValue +// if (inventoryPO != null) { +// // 优先使用fieldName(如果存在) +// if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { +// usedFieldName = batchDetailFeignPO.getFieldName(); +// fieldValue = getFieldValueByFieldName(inventoryPO, usedFieldName); +// log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", +// batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue); +// } +// // 如果fieldName为空,尝试根据batchLabels映射到字段名 +// else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { +// String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels()); +// if (StringUtils.isNotBlank(fieldNameByLabel)) { +// usedFieldName = fieldNameByLabel; +// fieldValue = getFieldValueByFieldName(inventoryPO, usedFieldName); +// log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", +// batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), +// usedFieldName, fieldValue); +// } +// } +// +// // 只有当获取到值时才更新attributeValue(已分配库存时) +// if (fieldValue != null) { +// materialMoreDetailPO.setAttributeValue(fieldValue); +// log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", +// materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), +// materialMoreDetailPO.getAttributeValue()); +// } +// } else { +// // 未分配库存时,attributeValue保持为空(不设置值) +// log.info("批次属性未分配库存,batchDetailId={}, batchLabels={}, attributeValue为空", +// materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels()); +// } +// } +// } +// outMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList); +// log.info("出库物料明细 uniqueId={}, materialBaseInfoId={}, materialInventoryId={}, materialMoreDetailList大小={}", +// outMaterialDetailPO.getUniqueId(), outMaterialDetailPO.getMaterialBaseInfoId(), +// outMaterialDetailPO.getMaterialInventoryId(), +// materialMoreDetailList != null ? materialMoreDetailList.size() : 0); +// +// // 递归处理子集 +// if (!CollectionUtils.isEmpty(outMaterialDetailPO.getChildren())) { +// setMaterialMoreDetailListRecursively(outMaterialDetailPO.getChildren(), batchDetailMap); +// } +// }); +// } + + /** + * 根据批次标签(batchLabels)映射到字段名 + * @param batchLabel 批次标签 + * @return 字段名,如果找不到映射则返回null + */ + private String getFieldNameByBatchLabel(String batchLabel) { + if (StringUtils.isBlank(batchLabel)) { + return null; + } + + // 批次标签到字段名的映射关系 + Map labelToFieldNameMap = new HashMap<>(); + labelToFieldNameMap.put("Invoice No.", "invoiceNo"); + labelToFieldNameMap.put("Invoice No", "invoiceNo"); + labelToFieldNameMap.put("发票号", "invoiceNo"); + labelToFieldNameMap.put("Batch Ref NO's", "batchRefNo"); + labelToFieldNameMap.put("Batch Ref NO", "batchRefNo"); + labelToFieldNameMap.put("批次参考号", "batchRefNo"); + labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo"); + labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo"); + labelToFieldNameMap.put("单据参考号", "sheetRefNo"); + labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo"); + labelToFieldNameMap.put("箱号", "boxPalletNo"); + labelToFieldNameMap.put("卡板号", "boxPalletNo"); + labelToFieldNameMap.put("申报数量", "declareQuantity"); + labelToFieldNameMap.put("申报单位", "declareUnit"); + labelToFieldNameMap.put("原产国", "countryOfOrigin"); + labelToFieldNameMap.put("币制", "currency"); + labelToFieldNameMap.put("单位", "unit"); + labelToFieldNameMap.put("升", "liter"); + labelToFieldNameMap.put("尺寸", "size"); + labelToFieldNameMap.put("箱数", "caseCount"); + labelToFieldNameMap.put("件数", "pieceCount"); + labelToFieldNameMap.put("出库数量", "outboundQuantity"); + labelToFieldNameMap.put("总净重", "totalNetWeight"); + labelToFieldNameMap.put("总毛重", "totalGrossWeight"); + labelToFieldNameMap.put("总体积", "totalVolume"); + labelToFieldNameMap.put("总面积", "totalArea"); + labelToFieldNameMap.put("总价", "totalAmount"); + + // 精确匹配 + String fieldName = labelToFieldNameMap.get(batchLabel.trim()); + if (StringUtils.isNotBlank(fieldName)) { + return fieldName; + } + + // 模糊匹配(包含关系) + for (Map.Entry entry : labelToFieldNameMap.entrySet()) { + if (batchLabel.contains(entry.getKey()) || entry.getKey().contains(batchLabel)) { + return entry.getValue(); + } + } + + // 如果找不到映射,尝试将批次标签转换为驼峰命名(简单处理) + return convertLabelToFieldName(batchLabel); + } + + /** + * 将批次标签转换为字段名(驼峰命名) + * @param label 批次标签 + * @return 字段名 + */ + private String convertLabelToFieldName(String label) { + if (StringUtils.isBlank(label)) { + return null; + } + + // 移除特殊字符,转换为小写,用空格或特殊字符分割 + String cleaned = label.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5\\s]", " ") + .trim() + .toLowerCase(); + + // 如果是中文,无法自动转换,返回null + if (cleaned.matches(".*[\\u4e00-\\u9fa5].*")) { + return null; + } + + // 将空格分割的单词转换为驼峰命名 + String[] words = cleaned.split("\\s+"); + if (words.length == 0) { + return null; + } + + StringBuilder fieldName = new StringBuilder(words[0]); + for (int i = 1; i < words.length; i++) { + if (words[i].length() > 0) { + fieldName.append(words[i].substring(0, 1).toUpperCase()) + .append(words[i].substring(1)); + } + } + + return fieldName.toString(); + } + + /** + * 根据字段名从对象中获取字段值(使用反射) + * @param obj 对象 + * @param fieldName 字段名 + * @return 字段值(转换为字符串) + */ + private String getFieldValueByFieldName(Object obj, String fieldName) { + if (obj == null || StringUtils.isBlank(fieldName)) { + return null; + } + + try { + // 兼容:如果传的是下划线命名(数据库列名风格),先转成驼峰字段名再取 + String normalizedFieldName = fieldName; + if (normalizedFieldName.contains("_")) { + normalizedFieldName = snakeToCamel(normalizedFieldName); + } + + // 获取对象的Class + Class clazz = obj.getClass(); + + // 尝试获取字段(包括父类字段) + Field field = null; + Class currentClass = clazz; + while (currentClass != null && field == null) { + try { + field = currentClass.getDeclaredField(normalizedFieldName); + } catch (NoSuchFieldException e) { + currentClass = currentClass.getSuperclass(); + } + } + + if (field == null) { + log.warn("字段不存在:{}(normalized:{}),对象类型:{}", fieldName, normalizedFieldName, clazz.getName()); + return null; + } + + // 设置可访问 + field.setAccessible(true); + + // 获取字段值 + Object value = field.get(obj); + + // 转换为字符串 + if (value == null) { + log.info("字段 {} 的值为 null,对象类型:{}", normalizedFieldName, clazz.getName()); + return null; + } + + String result; + // 处理日期类型字段 + if (value instanceof Date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + result = sdf.format((Date) value); + } else { + result = value.toString(); + } + + log.info("通过反射获取字段值成功,字段名:{}(原始:{}),值:{},对象类型:{}", + normalizedFieldName, fieldName, result, clazz.getName()); + return result; + } catch (Exception e) { + log.warn("通过反射获取字段值失败,字段名:{},对象类型:{},错误:{}", fieldName, obj.getClass().getName(), e.getMessage()); + return null; + } + } + + private String snakeToCamel(String snake) { + if (StringUtils.isBlank(snake)) { + return null; + } + String s = snake.trim().toLowerCase(); + StringBuilder sb = new StringBuilder(); + boolean upperNext = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == '_') { + upperNext = true; + continue; + } + if (upperNext) { + sb.append(Character.toUpperCase(c)); + upperNext = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 获取出库单详细信息(PDA复核页面:含批次属性、净重、毛重、面积、体积) + */ +// public ExecutionStockOutOrderPO getInfoByApp(Long outOrderId) { +// ExecutionStockOutOrderPO stockOutOrderPO = stockOutOrderDomainService.getInfoByApp(outOrderId); +// enrichExecutionStockOutOrderForPdaCheck(stockOutOrderPO); +// return stockOutOrderPO; +// } + + /** + * 为PDA复核页面填充批次属性(根据物料批次标签动态显示,有值显示)及净重、毛重、面积、体积 + */ +// private void enrichExecutionStockOutOrderForPdaCheck(ExecutionStockOutOrderPO stockOutOrderPO) { +// if (stockOutOrderPO == null || CollectionUtils.isEmpty(stockOutOrderPO.getMaterialDetailList())) { +// return; +// } +// List detailList = stockOutOrderPO.getMaterialDetailList(); +// Set materialBaseInfoIdSet = detailList.stream() +// .map(ExecutionOutMaterialDetailPO::getMaterialBaseInfoId) +// .filter(Objects::nonNull) +// .collect(Collectors.toSet()); +// Map> batchDetailMap = new HashMap<>(); +// for (Long materialBaseInfoId : materialBaseInfoIdSet) { +// try { +// AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId); +// if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { +// List batchDetailFeignPOList = JSON.parseArray( +// JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); +// if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) { +// List filteredList = batchDetailFeignPOList.stream() +// .filter(b -> b.getIsDisplay() != null && b.getIsDisplay() == 1) +// .collect(Collectors.toList()); +// batchDetailMap.put(materialBaseInfoId, filteredList); +// } +// } +// } catch (Exception e) { +// log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage()); +// } +// } +// setMaterialMoreDetailListRecursivelyForCheck(detailList, batchDetailMap); +// } + + /** + * 递归为PDA复核物料明细设置批次属性(有值显示),优先从库存取,否则从出库明细取 + */ +// private void setMaterialMoreDetailListRecursivelyForCheck(List outMaterialDetailPOList, +// Map> batchDetailMap) { +// if (CollectionUtils.isEmpty(outMaterialDetailPOList)) { +// return; +// } +// outMaterialDetailPOList.forEach(outMaterialDetailPO -> { +// Long materialBaseInfoId = outMaterialDetailPO.getMaterialBaseInfoId(); +// Long materialInventoryId = outMaterialDetailPO.getMaterialInventoryId(); +// List materialMoreDetailList = new ArrayList<>(); +// MaterialInventoryPO inventoryPO = null; +// if (materialInventoryId != null && materialInventoryId > 0) { +// try { +// inventoryPO = materialInventoryMapper.selectByIdWithBatchAttributes(materialInventoryId); +// } catch (Exception e) { +// log.warn("从库存表获取批次属性失败,materialInventoryId={},错误:{}", materialInventoryId, e.getMessage()); +// } +// } +// Object sourceObj = inventoryPO != null ? inventoryPO : outMaterialDetailPO; +// if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { +// for (BatchDetailFeignPO batchDetailFeignPO : batchDetailMap.get(materialBaseInfoId)) { +// MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO(); +// materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId()); +// materialMoreDetailPO.setBatchDetailId(batchDetailFeignPO.getBatchDetailId()); +// materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels()); +// materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl()); +// materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat()); +// materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption()); +// materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark()); +// String fieldValue = null; +// if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { +// fieldValue = getFieldValueByFieldName(sourceObj, batchDetailFeignPO.getFieldName()); +// } else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { +// String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels()); +// if (StringUtils.isNotBlank(fieldNameByLabel)) { +// fieldValue = getFieldValueByFieldName(sourceObj, fieldNameByLabel); +// } +// } +// if (fieldValue != null) { +// materialMoreDetailPO.setAttributeValue(fieldValue); +// materialMoreDetailList.add(materialMoreDetailPO); +// } +// } +// } +// outMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList); +// if (!CollectionUtils.isEmpty(outMaterialDetailPO.getChildren())) { +// setMaterialMoreDetailListRecursivelyForCheck(outMaterialDetailPO.getChildren(), batchDetailMap); +// } +// }); +// } + + /** + * @description 审核出库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockOutOrderDO + * @return Boolean + */ +// public Boolean auditState(ExecutionStockOutOrderDO stockOutOrderDO){ +// return stockOutOrderDomainService.auditState(stockOutOrderDO); +// } + + /** + * @description 审核入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param + * @return Boolean + */ + public Boolean auditState(ExecutionStockOutOrderDO stockOutOrderDO){ + return stockOutOrderDomainService.auditState(stockOutOrderDO); + } + + public Boolean cancelAuditState(ExecutionStockOutOrderDO stockOutOrderDO){ + return stockOutOrderDomainService.cancelAuditState(stockOutOrderDO); + } + + /** + * @description 下发入库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param + * @return Boolean + */ + public Boolean issueOrder(ExecutionStockOutOrderDO stockOutOrderDO){ + return stockOutOrderDomainService.issueOrder(stockOutOrderDO); + } + + + + + /** + * 获取出库单复核详细信息 + */ +// public ExecutionStockOutOrderPO getCheckInfo(ExecutionStockOutOrderDO stockOutOrderDO) { +// return stockOutOrderDomainService.getCheckInfo(stockOutOrderDO); +// } + + /** + * @description 设置仓库信息 + * @author ZhouGY + * @date 2024/4/7 10:01 + * @param stockOutOrderDO + */ + private void setWarehouseInfo(ExecutionStockOutOrderDO stockOutOrderDO) { + if (stockOutOrderDO.getWarehouseId() == null) { + throw new ServiceException("仓库ID不能为空"); + } + AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockOutOrderDO.getWarehouseId()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取仓库信息失败"); + } + WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + stockOutOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); + stockOutOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); + } + + /** + * @description 封装货主信息 + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockOutOrderDO + */ + private void shipperParam(ExecutionStockOutOrderDO stockOutOrderDO){ + Long shipperId = stockOutOrderDO.getShipperId(); + if (shipperId != null ) { + AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(shipperId)); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取货主信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockOutOrderDO.setShipperId(userPo.getUserId()); + stockOutOrderDO.setShipperCode(userPo.getUserMemberCode()); + stockOutOrderDO.setShipperName(userPo.getUserName()); +// stockOutOrderDO.setCustomerId(userPo.getUserId()); + stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode()); +// stockOutOrderDO.setCustomerName(userPo.getUserName()); + String isCheckCredit = reservationStockInOrderMapper.getIsCheckCredit(userPo.getUserId()); + String customerNcCode = reservationStockInOrderMapper.getCustomerNcCode(userPo.getUserId()); + if(isCheckCredit != null&&"1".equals(isCheckCredit)){ + UserShipperFeignDTO userShipperFeignDTO = new UserShipperFeignDTO(); + List userShipperEntityFeigns = new ArrayList<>(); + UserShipperEntityFeign userShipperEntityFeign = new UserShipperEntityFeign(); + userShipperEntityFeign.setUserId(userPo.getUserId()); + userShipperEntityFeign.setCustomerNcCode(customerNcCode); + userShipperEntityFeigns.add(userShipperEntityFeign); + userShipperFeignDTO.setCustomerNcCodeList(userShipperEntityFeigns); + AjaxResult ajaxResult1 = userServiceFeign.querySaleCreditLimitFeign(userShipperFeignDTO); + if (!"200".equals(String.valueOf(ajaxResult1.get("code")))){ + throw new ServiceException("获取货主信用额度失败"); + } else { + BigDecimal creditAmount = reservationStockInOrderMapper.getCreditAmount(userPo.getUserId()); + if (creditAmount != null && creditAmount.compareTo(BigDecimal.ZERO) > 0) { + }else{ + throw new ServiceException("货主信用额度小于0,不允许下单!"); + } + } + } + } + } + + /** + * @description 封装客户信息 + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockOutOrderDO + */ + private void customerParam(ExecutionStockOutOrderDO stockOutOrderDO){ + String customerName = stockOutOrderDO.getCustomerName(); + if (customerName == null || !customerName.matches("\\d+")) { + AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取客户信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockOutOrderDO.setCustomerId(userPo.getUserId()); + stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode()); + stockOutOrderDO.setCustomerName(userPo.getUserName()); + } else { + AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(customerName)); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取客户信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockOutOrderDO.setCustomerId(userPo.getUserId()); + stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode()); + stockOutOrderDO.setCustomerName(userPo.getUserName()); + } + } + + /** + * @description 设置数据字典键值 + * @author ZhouGY + * @date 2024/4/7 14:33 + * @param stockOutOrderDO + */ + private void setDataDict(ExecutionStockOutOrderDO stockOutOrderDO){ + //翻译单据类型 + AjaxResult documentTypeResult = systemServiceFeign.selectListByDictType(DictCode.OUT_DOCUMENT_TYPE.getCode()); + if (!"200".equals(String.valueOf(documentTypeResult.get("code")))) { + throw new ServiceException("单据类型数据字典不存在"); + } + List documentTypeDataList = JSON.parseArray(JSONUtil.toJsonStr(documentTypeResult.get("data")), SysDictData.class); + + SysDictData documentTypeData = documentTypeDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockOutOrderDO.getOrderTypeCode())).findAny().orElse(null); + if (null == documentTypeData) { + throw new ServiceException("单据类型【" + stockOutOrderDO.getOrderTypeCode() + "】数据字典不存在 请联系管理员"); + } + stockOutOrderDO.setOrderTypeName(documentTypeData.getDictLabel()); + + if (StringUtils.isNotBlank(stockOutOrderDO.getPriorityLevelCode())){ + //翻译优先级别类型 + AjaxResult priorityLevelResult = systemServiceFeign.selectListByDictType(DictCode.PRIORITY_LEVEL.getCode()); + if (!"200".equals(String.valueOf(priorityLevelResult.get("code")))) { + throw new ServiceException("优先级别类型数据字典不存在"); + } + List priorityLevelDataList = JSON.parseArray(JSONUtil.toJsonStr(priorityLevelResult.get("data")), SysDictData.class); + + SysDictData priorityLevelData = priorityLevelDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockOutOrderDO.getPriorityLevelCode())).findAny().orElse(null); + if (null == priorityLevelData) { + throw new ServiceException("优先级别类型【" + stockOutOrderDO.getPriorityLevelCode() + "】数据字典不存在 请联系管理员"); + } + stockOutOrderDO.setPriorityLevelName(priorityLevelData.getDictLabel()); + } + } + + /** + * @description 设置上架库位信息 + * @author ZhouGY + * @date 2024/5/23 14:03 + * @param outMaterialDetailDO + */ + private void setStorageLocationInfo(ExecutionOutMaterialDetailDO outMaterialDetailDO){ + AjaxResult storageLocationResult = systemServiceFeign.getStorageLocationInfoByStorageLocationId(outMaterialDetailDO.getStorageLocationId()); + if(!"200".equals(String.valueOf(storageLocationResult.get("code")))){ + throw new ServiceException("获取上架库位信息失败"); + } + StorageLocationFeignPO storageLocationFeignPO = JSON.parseObject(JSONObject.toJSONString(storageLocationResult.get("data")), StorageLocationFeignPO.class); + outMaterialDetailDO.setWarehouseId(storageLocationFeignPO.getWarehouseId()); + outMaterialDetailDO.setWarehouseCode(storageLocationFeignPO.getWarehouseCode()); + outMaterialDetailDO.setWarehouseName(storageLocationFeignPO.getWarehouseName()); + outMaterialDetailDO.setStorageSectionId(storageLocationFeignPO.getStorageSectionId()); + outMaterialDetailDO.setStorageCode(storageLocationFeignPO.getStorageCode()); + outMaterialDetailDO.setStorageName(storageLocationFeignPO.getStorageName()); + outMaterialDetailDO.setStorageLocationId(storageLocationFeignPO.getStorageLocationId()); + outMaterialDetailDO.setStorageLocationCode(storageLocationFeignPO.getStorageLocationCode()); + outMaterialDetailDO.setStorageLocationName(storageLocationFeignPO.getStorageLocationName()); + } + + /** + * @description 封装作业人员信息 + * @author ZhouGY + * @date 2024/5/9 20:43 + * @param stockOutOrderDO + */ + private void checkOperatorsParam(ExecutionStockOutOrderDO stockOutOrderDO){ + AjaxResult ajaxResult = userServiceFeign.getInfo(stockOutOrderDO.getCheckOperatorsBy()); + if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ + throw new ServiceException("获取作业人员信息失败"); + } + UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class); + stockOutOrderDO.setCheckOperatorsName(userPo.getUserName()); + } + + /** + * @description 设置库存信息 + * @author ZhouGY + * @date 2024/7/19 20:17 + * @param outMaterialDetailDO + */ +// private void setMaterialInventory(ExecutionOutMaterialDetailDO outMaterialDetailDO){ +// if (ObjectUtil.isNull(outMaterialDetailDO.getMaterialInventoryId()) || outMaterialDetailDO.getMaterialInventoryId() == 0){ +// return; +// } +// MaterialInventoryPO materialInventoryPO = materialInventoryDomainService.getInfo(outMaterialDetailDO.getMaterialInventoryId()); +// if (materialInventoryPO == null){ +// throw new ServiceException("物料库存信息不存在"); +// } +// outMaterialDetailDO.setBatchNumber(materialInventoryPO.getBatchNumber()); +// outMaterialDetailDO.setMaterialStatusCode(materialInventoryPO.getMaterialStatusCode()); +// outMaterialDetailDO.setMaterialStatusName(materialInventoryPO.getMaterialStatusName()); +// outMaterialDetailDO.setContainerId(materialInventoryPO.getContainerId()); +// outMaterialDetailDO.setContainerCode(materialInventoryPO.getContainerCode()); +// outMaterialDetailDO.setContainerType(materialInventoryPO.getContainerType()); +// outMaterialDetailDO.setContainerTypeName(materialInventoryPO.getContainerTypeName()); +// // 库存数量,仅用于前端展示 +// outMaterialDetailDO.setInventoryQuantity(materialInventoryPO.getInventoryQuantity()); +// } + + /** + * 递归为出库物料明细设置分配按钮显示类型 + * @param outMaterialDetailPOList 出库物料明细列表 + */ + private void setAllocationButtonTypeRecursively(List outMaterialDetailPOList) { + if (CollectionUtils.isEmpty(outMaterialDetailPOList)) { + return; + } + + outMaterialDetailPOList.forEach(outMaterialDetailPO -> { + BigDecimal quantity = outMaterialDetailPO.getQuantity(); // 计划数量 + BigDecimal alreadyAllocationQuantity = outMaterialDetailPO.getAlreadyAllocationQuantity(); // 已分配数量 + + // 判断按钮显示类型 + // 已分配数量 = 0:显示"库存分配"按钮(类型1) + // 已分配数量 = 计划数量:显示"取消分配"按钮(类型2) + if (alreadyAllocationQuantity == null || alreadyAllocationQuantity.compareTo(BigDecimal.ZERO) == 0) { + // 已分配数量为0或null,显示"库存分配"按钮 + outMaterialDetailPO.setAllocationButtonType(1); + } else if (quantity != null && alreadyAllocationQuantity.compareTo(quantity) == 0) { + // 已分配数量等于计划数量,显示"取消分配"按钮 + outMaterialDetailPO.setAllocationButtonType(2); + } else { + // 其他情况(已分配数量 > 0 但 < 计划数量),不显示按钮或显示其他状态 + outMaterialDetailPO.setAllocationButtonType(0); + } + + // 递归处理子级 + List children = outMaterialDetailPO.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + setAllocationButtonTypeRecursively(children); + } + }); + } + + /** + * 出库单提货单打印-表头 + */ + public List queryOutStockNoticePrint(ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = new ExecutionStockOutOrderDO(); + BeanUtils.copyProperties(stockOutOrderDTO, stockOutOrderDO); + return stockOutOrderDomainService.queryOutStockNoticePrint(stockOutOrderDO); + } + + /** + * 出库单提货单打印-明细 + */ + public List queryOutStockNoticePrintDetail(ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = new ExecutionStockOutOrderDO(); + BeanUtils.copyProperties(stockOutOrderDTO, stockOutOrderDO); + return stockOutOrderDomainService.queryOutStockNoticePrintDetail(stockOutOrderDO); + } + + public AjaxResult batchPushByNumber(List numberList) { + if (numberList == null || numberList.isEmpty() || numberList.size() < 1) { + return AjaxResult.error("没有数据需要推送"); + } + String s = numberList.get(0); + ExecutionStockOutOrder one = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(ExecutionStockOutOrder::getOutOrderNumber, s) + .eq(ExecutionStockOutOrder::getDelFlag, 1), false); + List idList = new ArrayList<>(); + idList.add(one.getOutOrderId()); + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long pushBy = loginUser != null ? loginUser.getUserid() : null; + String pushByName = loginUser != null ? loginUser.getUserPo().getUserName() : null; + Long organizationId = loginUser != null ? loginUser.getUserPo().getOrganizationId() : null; + Long topOrganizationId = loginUser != null ? loginUser.getUserPo().getTopOrganizationId() : null; + String organizationName = loginUser != null ? loginUser.getUserPo().getOrganizationName() : null; + + int successCount = 0; + int failCount = 0; + StringBuilder failMsg = new StringBuilder(); + + + for (Long id : idList) { + + +// 查询出库单 + ExecutionStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectById(id); + if (reservationStockOutOrder == null) { + failCount++; + failMsg.append("id:").append(id).append("不存在;"); + continue; + } + + // 获取货主NC编码 + Long shipperId = reservationStockOutOrder.getShipperId(); + String userNcCode = reservationStockInOrderMapper.getUserNcCode(shipperId); + + // 构建主单Map + Map order = new HashMap<>(); + order.put("billNo", reservationStockOutOrder.getOutOrderNumber()); + order.put("ieFlag", "E"); + order.put("billDate", reservationStockOutOrder.getDocumentDate()); + order.put("corpCode", userNcCode != null ? userNcCode : ""); + + // 查询出库物料明细 + List reservationOutMaterialDetails = + reservationOutMaterialDetailMapper.selectList( + new LambdaQueryWrapper() + .eq(ExecutionOutMaterialDetail::getOutOrderNumber, reservationStockOutOrder.getOutOrderNumber()) + .eq(ExecutionOutMaterialDetail::getDelFlag, 1) + ); + + if (reservationOutMaterialDetails == null || reservationOutMaterialDetails.isEmpty()) { + failCount++; + failMsg.append("id:").append(id).append("无物料明细;"); + continue; + } + + // 构建明细List + List> orderList = new ArrayList<>(); + for (ExecutionOutMaterialDetail detail : reservationOutMaterialDetails) { + Map item = new HashMap<>(); + item.put("billNo", reservationStockOutOrder.getOutOrderNumber()); + String lotNo = detail.getLotNo(); + if (lotNo != null) { + String[] split = lotNo.split("-"); + if (split.length == 2) { + item.put("lineNum", split[1]); + } else { + item.put("lineNum", 1); + } + } else { + item.put("lineNum", 1); + } + item.put("qty", detail.getQuantity()); + + // 获取物料详情 + if (detail.getMaterialBaseInfoId() != null) { + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(detail.getMaterialBaseInfoId()); + if (materialBaseInfoPO != null) { + item.put("erpCurr", materialBaseInfoPO.getCurrency() != null ? materialBaseInfoPO.getCurrency() : ""); + item.put("erpPrice", materialBaseInfoPO.getUnitPrice()); + item.put("itemNo", materialBaseInfoPO.getMaterialCode() != null ? materialBaseInfoPO.getMaterialCode() : ""); + item.put("itemName", materialBaseInfoPO.getMaterialName() != null ? materialBaseInfoPO.getMaterialName() : ""); + item.put("spec", materialBaseInfoPO.getSpecificationModel() != null ? materialBaseInfoPO.getSpecificationModel() : ""); + item.put("unit", materialBaseInfoPO.getDeclarationUnit() != null ? materialBaseInfoPO.getDeclarationUnit() : ""); + // 计算金额 + BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice(); + BigDecimal quantity = detail.getQuantity(); + if (unitPrice != null && quantity != null && unitPrice.compareTo(BigDecimal.ZERO) != 0 && quantity.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal amount = unitPrice.multiply(quantity).setScale(2, BigDecimal.ROUND_HALF_UP); + item.put("amount", amount); + } + } + } + + // 库存关联信息(实体默认值 + WMS覆盖) + Long kcId = reservationOutMaterialDetailMapper.getkcIdByUniqueId(detail.getUniqueId()); + if (kcId != null) { + String inOrderNumber = reservationOutMaterialDetailMapper.getInOrderNumber(kcId); + String warehouseCode = reservationOutMaterialDetailMapper.getWarehouse(kcId); + String opWhLoc = reservationOutMaterialDetailMapper.getOpWhLoc(kcId); + String inLotNo = reservationOutMaterialDetailMapper.getLotByKcId(kcId); + + if (inOrderNumber != null) { + item.put("orderINo", inOrderNumber); + } + if (warehouseCode != null) { + item.put("warehouse", warehouseCode); + } + if (opWhLoc != null) { + item.put("opWhLoc", opWhLoc); + } + // billI = 入库单号 + if (inOrderNumber != null) { + item.put("billI", inOrderNumber); + } + if (inLotNo != null && inLotNo.contains("-")) { + String[] split = inLotNo.split("-"); + if (split.length == 2) { + item.put("orderIRow", split[1]); + item.put("billIRow", split[1]); + } else { + item.put("orderIRow", 1); + item.put("billIRow", 1); + } + } else { + item.put("orderIRow", 1); + item.put("billIRow", 1); + } + } + orderList.add(item); + } + order.put("orderList", orderList); + + // 构建推送body + List> bodyList = new ArrayList<>(); + bodyList.add(order); + + GwLog gwLog = new GwLog(); + gwLog.setType("保税仓-出口订单"); + gwLog.setBusinessId(id); + gwLog.setRequestBody(com.alibaba.fastjson.JSONObject.toJSONString(bodyList)); + gwLog.setResponseBody(""); + gwLog.setStatus(1); + gwLog.setSendTime(new Date()); + gwLog.setOrganizationId(organizationId); + gwLog.setTopOrganizationId(topOrganizationId); + gwLog.setOrganizationName(organizationName); + gwLog.setCreateBy(pushBy); + gwLog.setCreateTime(new Date()); + gwLog.setDelFlag(1); + gwLogMapper.insert(gwLog); + + updatePushStatus(id, 2, new Date(), pushBy,pushByName); + + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(PUSH_API_URL); + StringEntity postingString = new StringEntity(com.alibaba.fastjson.JSONObject.toJSONString(bodyList), "UTF-8"); + httpPost.setEntity(postingString); + httpPost.setHeader("Content-type", "application/json"); + httpPost.setHeader("apiName", API_NAME); + httpPost.setHeader("verify", VERIFY); + + try { + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + gwLog.setResponseBody(responseString); + + if (response.getStatusLine().getStatusCode() == 200) { + gwLog.setStatus(2); + updatePushStatus(id, 3, new Date(), pushBy,pushByName); + successCount++; + } else { + gwLog.setStatus(3); + gwLog.setErrorMsg(responseString); + updatePushStatus(id, 4, new Date(), pushBy,pushByName); + failCount++; + failMsg.append("id:").append(id).append("失败;"); + } + gwLogMapper.updateById(gwLog); + response.close(); + } catch (IOException e) { + gwLog.setStatus(3); + gwLog.setErrorMsg(e.getMessage()); + gwLog.setResponseBody("请求异常:" + e.getMessage()); + gwLogMapper.updateById(gwLog); + updatePushStatus(id, 4, new Date(), pushBy,pushByName); + failCount++; + failMsg.append("id:").append(id).append("异常:").append(e.getMessage()).append(";"); + log.error("保税仓推送异常: id={}, error={}", id, e.getMessage()); + } finally { + try { + httpClient.close(); + } catch (Exception e) { + log.error("关闭httpClient异常: {}", e.getMessage()); + } + } + } + + String resultMsg = "推送完成: 成功" + successCount + "条, 失败" + failCount + "条"; + if (failCount > 0) { + resultMsg += "[" + failMsg.toString() + "]"; + } + return AjaxResult.success(resultMsg); + } + + public AjaxResult batchPush(List idList) { + if (idList == null || idList.isEmpty()) { + return AjaxResult.error("没有数据需要推送"); + } + + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long pushBy = loginUser != null ? loginUser.getUserid() : null; + String pushByName = loginUser != null ? loginUser.getUserPo().getUserName() : null; + Long organizationId = loginUser != null ? loginUser.getUserPo().getOrganizationId() : null; + Long topOrganizationId = loginUser != null ? loginUser.getUserPo().getTopOrganizationId() : null; + String organizationName = loginUser != null ? loginUser.getUserPo().getOrganizationName() : null; + String ncUrl = reservationStockInOrderMapper.getNcUrl("gw", organizationName, organizationId); + int successCount = 0; + int failCount = 0; + StringBuilder failMsg = new StringBuilder(); + + + for (Long id : idList) { + + +// 查询出库单 + ExecutionStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectById(id); + if (reservationStockOutOrder == null) { + failCount++; + failMsg.append("id:").append(id).append("不存在;"); + continue; + } + + // 获取货主NC编码 + Long shipperId = reservationStockOutOrder.getShipperId(); + String userNcCode = reservationStockInOrderMapper.getUserNcCode(shipperId); + + // 构建主单Map + Map order = new HashMap<>(); + order.put("billNo", reservationStockOutOrder.getOutOrderNumber()); + order.put("ieFlag", "E"); + order.put("billDate", reservationStockOutOrder.getDocumentDate()); + order.put("corpCode", userNcCode != null ? userNcCode : ""); + + // 查询出库物料明细 + List reservationOutMaterialDetails = + reservationOutMaterialDetailMapper.selectList( + new LambdaQueryWrapper() + .eq(ExecutionOutMaterialDetail::getOutOrderNumber, reservationStockOutOrder.getOutOrderNumber()) + .eq(ExecutionOutMaterialDetail::getDelFlag, 1) + ); + + if (reservationOutMaterialDetails == null || reservationOutMaterialDetails.isEmpty()) { + failCount++; + failMsg.append("id:").append(id).append("无物料明细;"); + continue; + } + + // 构建明细List + List> orderList = new ArrayList<>(); + for (ExecutionOutMaterialDetail detail : reservationOutMaterialDetails) { + Map item = new HashMap<>(); + item.put("billNo", reservationStockOutOrder.getOutOrderNumber()); + String lotNo = detail.getLotNo(); + if (lotNo != null) { + String[] split = lotNo.split("-"); + if (split.length == 2) { + item.put("lineNum", split[1]); + detail.setLineNumGw(split[1]); + } else { + item.put("lineNum", 1); + detail.setLineNumGw("1"); + } + } else { + item.put("lineNum", 1); + detail.setLineNumGw("1"); + } + item.put("qty", detail.getQuantity()); + + // 获取物料详情 + if (detail.getMaterialBaseInfoId() != null) { + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(detail.getMaterialBaseInfoId()); + if (materialBaseInfoPO != null) { + item.put("erpCurr", materialBaseInfoPO.getCurrency() != null ? materialBaseInfoPO.getCurrency() : ""); + item.put("erpPrice", materialBaseInfoPO.getUnitPrice()); + item.put("itemNo", materialBaseInfoPO.getMaterialCode() != null ? materialBaseInfoPO.getMaterialCode() : ""); + item.put("itemName", materialBaseInfoPO.getMaterialName() != null ? materialBaseInfoPO.getMaterialName() : ""); + item.put("spec", materialBaseInfoPO.getSpecificationModel() != null ? materialBaseInfoPO.getSpecificationModel() : ""); + item.put("unit", materialBaseInfoPO.getDeclarationUnit() != null ? materialBaseInfoPO.getDeclarationUnit() : ""); + // 计算金额 + BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice(); + BigDecimal quantity = detail.getQuantity(); + detail.setQtyGw(quantity); + detail.setErpPriceGw(unitPrice); + detail.setErpCurrGw(materialBaseInfoPO.getCurrency()); + detail.setUnitGw(materialBaseInfoPO.getDeclarationUnit()); + detail.setSpecGw(materialBaseInfoPO.getSpecificationModel()); + if (unitPrice != null && quantity != null && unitPrice.compareTo(BigDecimal.ZERO) != 0 && quantity.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal amount = unitPrice.multiply(quantity).setScale(2, BigDecimal.ROUND_HALF_UP); + item.put("amount", amount); + detail.setAmountGw(amount); + } + } + } + + // 库存关联信息(实体默认值 + WMS覆盖) + Long kcId = reservationOutMaterialDetailMapper.getkcIdByUniqueId(detail.getUniqueId()); + if (kcId != null) { + String inOrderNumber = reservationOutMaterialDetailMapper.getInOrderNumber(kcId); + String warehouseCode = reservationOutMaterialDetailMapper.getWarehouse(kcId); + String opWhLoc = reservationOutMaterialDetailMapper.getOpWhLoc(kcId); + String inLotNo = reservationOutMaterialDetailMapper.getLotByKcId(kcId); + + if (inOrderNumber != null) { + item.put("orderINo", inOrderNumber); + detail.setInOrderNumberGw(inOrderNumber); + } + if (warehouseCode != null) { + item.put("warehouse", warehouseCode); + detail.setWarehouseGw(warehouseCode); + } + if (opWhLoc != null) { + item.put("opWhLoc", opWhLoc); + detail.setOpWhLocGw(opWhLoc); + } + // billI = 入库单号 + if (inOrderNumber != null) { + item.put("billI", inOrderNumber); + } + if (inLotNo != null && inLotNo.contains("-")) { + String[] split = inLotNo.split("-"); + if (split.length == 2) { + item.put("orderIRow", split[1]); + item.put("billIRow", split[1]); + detail.setInLineNumGw(split[1]); + } else { + item.put("orderIRow", 1); + item.put("billIRow", 1); + detail.setInLineNumGw("1"); + } + } else { + item.put("orderIRow", 1); + item.put("billIRow", 1); + detail.setInLineNumGw("1"); + } + } + reservationOutMaterialDetailMapper.updateById(detail); + orderList.add(item); + } + order.put("orderList", orderList); + + // 构建推送body + List> bodyList = new ArrayList<>(); + bodyList.add(order); + + GwLog gwLog = new GwLog(); + gwLog.setType("保税仓-出口订单"); + gwLog.setBusinessId(id); + gwLog.setRequestBody(com.alibaba.fastjson.JSONObject.toJSONString(bodyList)); + gwLog.setResponseBody(""); + gwLog.setStatus(1); + gwLog.setSendTime(new Date()); + gwLog.setOrganizationId(organizationId); + gwLog.setTopOrganizationId(topOrganizationId); + gwLog.setOrganizationName(organizationName); + gwLog.setCreateBy(pushBy); + gwLog.setCreateTime(new Date()); + gwLog.setDelFlag(1); + gwLogMapper.insert(gwLog); + + updatePushStatus(id, 2, new Date(), pushBy,pushByName); + + CloseableHttpClient httpClient = HttpClients.createDefault(); + String url = ""; + if (ncUrl != null) { + url = ncUrl; + } else { + url = PUSH_API_URL; + } +// HttpPost customsHttpPost = new HttpPost(url); + HttpPost httpPost = new HttpPost(url); + StringEntity postingString = new StringEntity(com.alibaba.fastjson.JSONObject.toJSONString(bodyList), "UTF-8"); + httpPost.setEntity(postingString); + httpPost.setHeader("Content-type", "application/json"); + httpPost.setHeader("apiName", API_NAME); + httpPost.setHeader("verify", VERIFY); + + try { + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + gwLog.setResponseBody(responseString); + // 直接转Map + Map map = JSON.parseObject(responseString); + Integer code = (Integer) map.get("code"); + if (response.getStatusLine().getStatusCode() == 200&&code ==200) { + gwLog.setStatus(2); + updatePushStatus(id, 3, new Date(), pushBy,pushByName); + successCount++; + } else { + gwLog.setStatus(3); + gwLog.setErrorMsg(responseString); + updatePushStatus(id, 4, new Date(), pushBy,pushByName); + failCount++; + failMsg.append("id:").append(id).append("失败;"); + } + gwLogMapper.updateById(gwLog); + response.close(); + } catch (IOException e) { + gwLog.setStatus(3); + gwLog.setErrorMsg(e.getMessage()); + gwLog.setResponseBody("请求异常:" + e.getMessage()); + gwLogMapper.updateById(gwLog); + updatePushStatus(id, 4, new Date(), pushBy,pushByName); + failCount++; + failMsg.append("id:").append(id).append("异常:").append(e.getMessage()).append(";"); + log.error("保税仓推送异常: id={}, error={}", id, e.getMessage()); + } finally { + try { + httpClient.close(); + } catch (Exception e) { + log.error("关闭httpClient异常: {}", e.getMessage()); + } + } + } + + String resultMsg = "推送完成: 成功" + successCount + "条, 失败" + failCount + "条"; + if (failCount > 0) { + resultMsg += "[" + failMsg.toString() + "]"; + } + return AjaxResult.success(resultMsg); + } + + private void updatePushStatus(Long id, Integer pushStatus, Date pushTime, Long pushBy,String pushByName) { + ExecutionStockOutOrder entity = new ExecutionStockOutOrder(); + entity.setOutOrderId(id); + entity.setPushStatus(pushStatus); + if (pushTime != null) { + entity.setPushTime(pushTime); + } + if (pushBy != null) { + entity.setPushBy(pushBy); + } + if (pushByName != null) { + entity.setPushByName(pushByName); + } + reservationStockOutOrderMapper.updateById(entity); + } + + public void returnGoods(String invoiceNumber, String transportationNumber, String orderId,String pictureUrl) { + stockOutOrderDomainService.returnGoods(invoiceNumber, transportationNumber, orderId, pictureUrl); + } + + public List queryList1(ExecutionStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + + if (loginUser != null && loginUser.getUserPo() != null) { + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = stockOutOrderDO.getOrganizationId(); // 前端传递的 organizationId + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (userOrganizationId != null && userOrganizationId == 2827L) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + stockOutOrderDO.setOrganizationId(frontendOrganizationId); + stockOutOrderDO.setTopOrganizationId(null); // 明确设置为 null,避免使用 topOrganizationId 条件 + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + stockOutOrderDO.setOrganizationId(null); + stockOutOrderDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 如果前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId != null && userOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(userOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + stockOutOrderDO.setOrganizationId(userOrganizationId); + } + // 如果前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (userOrganizationId != null) { + stockOutOrderDO.setOrganizationId(userOrganizationId); + } + } + // 只有当 organizationId 为 null 时,才使用 topOrganizationId 作为查询条件 + // 如果 organizationId 不为 null,则优先使用 organizationId,不使用 topOrganizationId + if (stockOutOrderDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + stockOutOrderDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 对于非2827组织,必须设置 topOrganizationId=2827 + stockOutOrderDO.setTopOrganizationId(2827L); + } + } + } + + // 库管角色过滤:不展示已创建(status=1)的出库单 + // 出库状态: 1-已创建 ... +// if (loginUser != null) { +// String targetRoleCode = "KGY-001"; +// boolean isKuGuan = false; +// +// String roleCode = loginUser.getUserPo() != null ? loginUser.getUserPo().getRoleCode() : null; +// if (StringUtils.isNotBlank(roleCode) && roleCode.contains(targetRoleCode)) { +// isKuGuan = true; +// } +// +// if (!isKuGuan && loginUser.getRoleList() != null) { +// isKuGuan = loginUser.getRoleList().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (!isKuGuan && loginUser.getRoles() != null) { +// isKuGuan = loginUser.getRoles().stream() +// .anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode)); +// } +// +// if (isKuGuan) { +// Integer currentGtStatus = stockOutOrderDO.getGtStatus(); +// if (currentGtStatus == null || currentGtStatus < 1) { +// stockOutOrderDO.setGtStatus(1); // status > 1 +// } +// } +// } + + // 查询订单列表 + List list = stockOutOrderDomainService.queryList(stockOutOrderDO); + +// ====== 批量查询NC客户编码 ====== + Set shipperIdSet = list.stream() + .map(ExecutionStockOutOrderPO::getShipperId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + Map ncCodeMap = new HashMap<>(); + if (!shipperIdSet.isEmpty()) { + try { + AjaxResult result = userServiceFeign.getCustomerNcCodeBatch(new ArrayList<>(shipperIdSet)); + if (result != null && "200".equals(String.valueOf(result.get("code")))) { + Map dataMap = (Map) result.get("data"); + if (dataMap != null) { + for (Map.Entry entry : dataMap.entrySet()) { + Long key = Long.valueOf(entry.getKey().toString()); + String value = entry.getValue() != null ? entry.getValue().toString() : null; + ncCodeMap.put(key, value); + } + } + } + } catch (Exception e) { + log.error("批量查询NC客户编码失败", e); + } + } + +// 前端传入的NC编码 + String filterNcCode = stockOutOrderDO.getCustomerNcCode(); + +// 设置NC编码并过滤 + List filteredList = new ArrayList<>(); + for (ExecutionStockOutOrderPO po : list) { + String ncCode = ncCodeMap.get(po.getShipperId()); + po.setCustomerNcCode(ncCode); + + // 如果前端传了NC编码,判断是否一致 + if (filterNcCode != null && !filterNcCode.equals(ncCode)) { + continue; + } + filteredList.add(po); + } + + +// for (ExecutionStockOutOrderPO stockOutOrderPO : stockOutOrderPOS) { +// ExecutionStockOutOrderPO stockOutOrderPO1 = stockOutOrderDomainService.getInfoChildren(stockOutOrderPO.getOutOrderId()); +// List materialDetailList = stockOutOrderPO1 != null ? stockOutOrderPO1.getMaterialDetailList() : null; +// if (materialDetailList == null) { +// materialDetailList = Collections.emptyList(); +// } +// BigDecimal reduce = materialDetailList.stream().map(ExecutionOutMaterialDetailPO::getOutboundQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockOutOrderPO.setTotalOutboundQuantity(reduce); +// stockOutOrderPO.setAllocationQuantity(stockOutOrderPO1 != null ? stockOutOrderPO1.getAllocationQuantity() : null); +// String outOrderNumber = stockOutOrderPO.getOutOrderNumber(); +// // PDA复核物料总数量:使用实际下发时的拣货完成数量(picking_material_detail),拣货多少显示多少 +// // PDA端物料总数量取quantity字段、复核总数量取checkQuantity字段,需同时设置quantity和pickingQuantity +// BigDecimal actualPickingQty = pickingMaterialDetailService.sumPickingQuantityByOutOrderNumber(outOrderNumber); +// BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0 ? actualPickingQty : (stockOutOrderPO1 != null ? stockOutOrderPO1.getPickingQuantity() : BigDecimal.ZERO); +// stockOutOrderPO.setPickingQuantity(displayPickingQty); +// stockOutOrderPO.setQuantity(displayPickingQty); +// // 物料种类:优先从picking_material_detail统计,为0时从out_material_detail按料号去重 +// Integer materialTypeCount = pickingMaterialDetailService.countMaterialTypesByOutOrderNumber(outOrderNumber); +// if (materialTypeCount != null && materialTypeCount > 0) { +// stockOutOrderPO.setMaterialQuantity(materialTypeCount); +// } else { +// long count = materialDetailList.stream() +// .map(d -> d.getMaterialBaseInfoId() != null ? String.valueOf(d.getMaterialBaseInfoId()) : d.getMaterialCode()) +// .filter(Objects::nonNull) +// .distinct() +// .count(); +// stockOutOrderPO.setMaterialQuantity((int) count); +// } +// // 复核总数量:从out_material_detail汇总check_quantity +// BigDecimal checkSum = materialDetailList.stream().map(ExecutionOutMaterialDetailPO::getCheckQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); +// stockOutOrderPO.setCheckQuantity(checkSum); +// } + return filteredList; + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderAssembler.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderAssembler.java new file mode 100644 index 000000000..ff0db1566 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderAssembler.java @@ -0,0 +1,113 @@ +package com.mhd.oms.domain.executionStockOutOrder.service; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +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.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDTO; +import com.mhd.system.api.model.LoginUser; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 出库单Assembler + * + * @author gen + * @date 2024-05-28 + */ +@Component +public class ExecutionStockOutOrderAssembler { + + /** + * 转换实体 + */ + public ExecutionStockOutOrderDO toDO(ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = new ExecutionStockOutOrderDO(); + // 拷贝 + BeanUtils.copyProperties(stockOutOrderDTO, stockOutOrderDO, IgnoreNullUtil.getNullPropertyNames(stockOutOrderDTO)); + // 确保查询条件字段被正确传递(查询条件字段需要明确传递,避免被IgnoreNullUtil忽略) + stockOutOrderDO.setCreateTimeStart(stockOutOrderDTO.getCreateTimeStart()); + stockOutOrderDO.setCreateTimeEnd(stockOutOrderDTO.getCreateTimeEnd()); + stockOutOrderDO.setAuditTimeStart(stockOutOrderDTO.getAuditTimeStart()); + stockOutOrderDO.setAuditTimeEnd(stockOutOrderDTO.getAuditTimeEnd()); + stockOutOrderDO.setTabType(stockOutOrderDTO.getTabType()); + // 列表筛选:前端常传「名称 (编码)」展示串,库内多为纯名称,去掉末尾括号段再 LIKE + if (stockOutOrderDTO.getMaterialName() != null && !stockOutOrderDTO.getMaterialName().isEmpty()) { + String normalized = normalizeDetailMaterialNameForQuery(stockOutOrderDTO.getMaterialName()); + stockOutOrderDO.setMaterialName(normalized.isEmpty() + ? stockOutOrderDTO.getMaterialName().trim() + : normalized); + } + return stockOutOrderDO; + } + + /** + * 转换实体 + */ + public ExecutionStockOutOrderDO toDOByEdit(ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = JSONUtil.toBean(JSONUtil.toJsonStr(stockOutOrderDTO), ExecutionStockOutOrderDO.class); + // 拷贝 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + // 获取登录人id + Long userId = loginUser.getUserid(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = null; + if (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) { + // 优先使用UserPo中的userName(用户真实姓名) + userRealName = loginUser.getUserPo().getUserName(); + } else if (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) { + // 其次使用realname + userRealName = loginUser.getRealname(); + } else { + // 最后使用username(账号)作为兜底 + userRealName = loginUser.getUsername(); + } + if(stockOutOrderDTO.getOutOrderId() != null){ + stockOutOrderDO.setUpdateBy(userId); + stockOutOrderDO.setUpdateByName(userRealName); + stockOutOrderDO.setUpdateTime(new Date()); + }else { + stockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + stockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + stockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + stockOutOrderDO.setCreateBy(userId); + stockOutOrderDO.setCreateByName(userRealName); + stockOutOrderDO.setCreateTime(new Date()); + stockOutOrderDO.setUpdateBy(userId); + stockOutOrderDO.setUpdateByName(userRealName); + stockOutOrderDO.setUpdateTime(new Date()); + stockOutOrderDO.setDelFlag(1); + } + return stockOutOrderDO; + } + + /** + * 去掉物料展示名末尾的「 (xxx) / (xxx)」等,便于与库内 material_name 模糊匹配。 + */ + private static String normalizeDetailMaterialNameForQuery(String raw) { + if (raw == null) { + return null; + } + String s = raw.trim(); + // 循环去掉末尾多组括号(兼容「名称 (编码)」或重复后缀) + String next; + do { + next = s.replaceFirst("[\\s\\u3000]*[((][^))]*[))]\\s*$", "").trim(); + if (next.equals(s)) { + break; + } + s = next; + } while (!s.isEmpty()); + return s; + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java new file mode 100644 index 000000000..ed9c53e21 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java @@ -0,0 +1,934 @@ +package com.mhd.oms.domain.executionStockOutOrder.service; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.OrderSequence; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.businessDeliveryDetailsLink.entity.BusinessDeliveryDetailsLink; +import com.mhd.oms.domain.businessDeliveryDetailsLink.repository.facade.IBusinessDeliveryDetailsLinkService; +import com.mhd.oms.domain.businessDeliveryDetailsLink.repository.mapper.BusinessDeliveryDetailsLinkMapper; +import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; +import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import com.mhd.oms.domain.executeOrder.entity.ExecuteOrder; +import com.mhd.oms.domain.executeOrder.repository.mapper.ExecuteOrderMapper; +import com.mhd.oms.domain.executionOutMaterialDetail.entity.ExecutionOutMaterialDetail; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.facade.IExecutionOutMaterialDetailService; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailBaseDO; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailDO; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.facade.IExecutionStockInOrderService; +import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStockInOrderMapper; +import com.mhd.oms.domain.executionStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.oms.domain.executionStockOutOrder.repository.mapper.ExecutionStockOutOrderMapper; +import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; +import com.mhd.oms.domain.reservationDeliveryDetailsLink.repository.facade.IReservationDeliveryDetailsLinkService; +//import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO; +import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.entity.ReservationInventoryAdjustmentRecord; +import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.repository.mapper.ReservationInventoryAdjustmentRecordMapper; +import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory; +import com.mhd.oms.domain.reservationMaterialInventory.repository.mapper.ReservationMaterialInventoryMapper; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.WmsServiceFeign; +import com.mhd.system.api.domain.*; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 出库单 + * + * @author gen + * @date 2024-05-28 + */ +@Service +@Slf4j +public class ExecutionStockOutOrderDomainService { + + @Autowired + private IExecutionStockOutOrderService stockOutOrderService; + @Autowired + private IExecutionOutMaterialDetailService outMaterialDetailService; + @Autowired + private IReservationDeliveryDetailsLinkService deliveryDetailsLinkService; + @Autowired + private IExecutionStockInOrderService reservationStockInOrderService; + @Autowired + private ExecutionStockInOrderMapper reservationStockInOrderMapper; + @Autowired + private ExecutionStockOutOrderMapper executionStockOutOrderMapper; + @Autowired + private BusinessDocumentOrderMapper businessDocumentOrderMapper; + @Autowired + private ExecuteOrderMapper executeOrderMapper; + + @Resource + private SystemServiceFeign systemServiceFeign; + @Resource + private WmsServiceFeign wmsServiceFeign; + @Autowired + private IReservationDeliveryDetailsLinkService reservationDeliveryDetailsLinkService; + @Autowired + private IBusinessDeliveryDetailsLinkService businessDeliveryDetailsLinkService; + @Autowired + private BusinessDeliveryDetailsLinkMapper businessDeliveryDetailsLinkMapper; + @Autowired + private ReservationInventoryAdjustmentRecordMapper inventoryAdjustmentRecordMapper; + @Autowired + private ReservationMaterialInventoryMapper reservationMaterialInventoryMapper; + + /** + * 分页查询出库单列表 + */ + public List queryList(ExecutionStockOutOrderDO stockOutOrderDO) { + return stockOutOrderService.queryList(stockOutOrderDO); + } + + + /** + * 新增出库单 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) { + if (stockOutOrderDO.getOutOrderNumber() == null) { + stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); + } + // 与 update / batchInsert 一致:前端传计划数量为 quantity,非 outboundQuantity + setMaterialDetailInfo(stockOutOrderDO); + stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size()); + BigDecimal quantity = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setQuantity(quantity); + BigDecimal totalAmount = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getTotalAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setAmount(totalAmount); + BigDecimal weightLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setWeightLimit(weightLimit); + BigDecimal volumeLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setVolumeLimit(volumeLimit); + // 复核下发状态默认为否(2) + if (stockOutOrderDO.getCheckTaskDistribution() == null) { + stockOutOrderDO.setCheckTaskDistribution(2); + } + stockOutOrderService.insert(stockOutOrderDO); + List reservationDeliveryDetailsLinkList = stockOutOrderDO.getReservationDeliveryDetailsLinkList(); + if (reservationDeliveryDetailsLinkList != null && !reservationDeliveryDetailsLinkList.isEmpty()){ + reservationDeliveryDetailsLinkList.forEach(reservationDeliveryDetailsLink -> { + reservationDeliveryDetailsLink.setOrderNumber(stockOutOrderDO.getOutOrderNumber()); + reservationDeliveryDetailsLink.setOrderId(stockOutOrderDO.getOutOrderId()); + }); + if (!CollectionUtils.isEmpty(reservationDeliveryDetailsLinkList)) { + reservationDeliveryDetailsLinkService.saveBatch(reservationDeliveryDetailsLinkList); + } + } + return outMaterialDetailService.batchInsert(stockOutOrderDO.getOutOrderNumber(), stockOutOrderDO.getMaterialDetailList()); + } + + /** + * 批量新增出库单 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean batchInsert(List stockOutOrderDOList) { + for (ExecutionStockOutOrderDO stockOutOrderDO : stockOutOrderDOList){ + if (StringUtils.isBlank(stockOutOrderDO.getOutOrderNumber())){ + stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); + } + //设置物料信息 + setMaterialDetailInfo(stockOutOrderDO); + //统计种类 + stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size()); + //统计总数量 + BigDecimal quantity = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setQuantity(quantity); + //统计总重量 + BigDecimal weightLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setWeightLimit(weightLimit); + //统计总体积 + BigDecimal volumeLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setVolumeLimit(volumeLimit); + // 复核下发状态默认为否(2) + if (stockOutOrderDO.getCheckTaskDistribution() == null) { + stockOutOrderDO.setCheckTaskDistribution(2); + } + stockOutOrderService.insert(stockOutOrderDO); + outMaterialDetailService.batchInsert(stockOutOrderDO.getOutOrderNumber(), stockOutOrderDO.getMaterialDetailList()); + } + return true; + } + + /** + * 修改出库单 + */ + public Boolean update(ExecutionStockOutOrderDO stockOutOrderDO) { + ExecutionStockOutOrderPO stockInOrderPO = stockOutOrderService.getInfo(stockOutOrderDO.getOutOrderId()); + if (stockInOrderPO == null){ + throw new ServiceException("出库单信息不存在"); + } + //设置物料信息 + setMaterialDetailInfo(stockOutOrderDO); + //统计种类 + stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size()); + //统计总数量 + BigDecimal quantity = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setQuantity(quantity); + BigDecimal totalAmount = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getTotalAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setAmount(totalAmount); + //统计总重量 + BigDecimal weightLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setWeightLimit(weightLimit); + //统计总体积 + BigDecimal volumeLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ExecutionOutMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + stockOutOrderDO.setVolumeLimit(volumeLimit); + stockOutOrderService.update(stockOutOrderDO); + ExecutionOutMaterialDetailBaseDO outMaterialDetailBaseDO = new ExecutionOutMaterialDetailBaseDO(); + BeanUtils.copyProperties(stockOutOrderDO, outMaterialDetailBaseDO); + outMaterialDetailBaseDO.setOutOrderNumber(stockInOrderPO.getOutOrderNumber()); +// if (stockOutOrderDO.getNeedTransportFlag() .equals("0")) { +// List businessDocumentOrders = businessDocumentOrderMapper.selectList(new LambdaQueryWrapper().eq(BusinessDocumentOrder::getInOrderNumber, stockOutOrderDO.getOutOrderNumber()).notIn(BusinessDocumentOrder::getOrderStatus, 4, 5)); +// if (businessDocumentOrders != null && businessDocumentOrders.size() > 0) { +// for (BusinessDocumentOrder businessDocumentOrder : businessDocumentOrders) { +// businessDocumentOrder.setOrderStatus(4L); +// String executeOrderNumber = businessDocumentOrder.getExecuteOrderNumber(); +// +// if (executeOrderNumber !=null){ +// throw new ServiceException("该业务单已生成执行单,取消失败"); +// } +// businessDocumentOrderMapper.updateById(businessDocumentOrder); +// } +// } +// } + + List reservationDeliveryDetailsLinkList = stockOutOrderDO.getReservationDeliveryDetailsLinkList(); + List oldList = reservationDeliveryDetailsLinkService.list(new LambdaQueryWrapper().eq(ReservationDeliveryDetailsLink::getOrderId, stockOutOrderDO.getOutOrderId())); + // ====================== 核心:取差值 ====================== + // 第一步:把新列表的所有id存入Set(O(1)查找,效率最高) + if (reservationDeliveryDetailsLinkList != null && !reservationDeliveryDetailsLinkList.isEmpty() + && oldList != null && !oldList.isEmpty()) { + Set newIdSet = reservationDeliveryDetailsLinkList.stream() + .map(ReservationDeliveryDetailsLink::getId) + .filter(Objects::nonNull) // 过滤null id,避免空指针 + .collect(Collectors.toSet()); + // 第二步:筛选出旧列表中 不在新列表里的元素(就是要删除的差值) + List deleteList = oldList.stream() + .filter(oldItem -> !newIdSet.contains(oldItem.getId())) + .collect(Collectors.toList()); + // 第三步:执行删除(如果需要) + if (CollUtil.isNotEmpty(deleteList)) { + for (ReservationDeliveryDetailsLink reservationDeliveryDetailsLink : deleteList) { + reservationDeliveryDetailsLinkService.removeById(reservationDeliveryDetailsLink.getId()); + } +// reservationDeliveryDetailsLinkService.removeByIds(deleteList); + } + } + + + + + + if (!CollectionUtils.isEmpty(reservationDeliveryDetailsLinkList)) { + for (ReservationDeliveryDetailsLink reservationDeliveryDetailsLink : reservationDeliveryDetailsLinkList) { + reservationDeliveryDetailsLink.setOrderNumber(stockOutOrderDO.getOutOrderNumber()); + reservationDeliveryDetailsLink.setOrderId(stockOutOrderDO.getOutOrderId()); + reservationDeliveryDetailsLinkService.saveOrUpdate(reservationDeliveryDetailsLink); + } +// reservationDeliveryDetailsLinkService.updateBatchById(reservationDeliveryDetailsLinkList); + } + return outMaterialDetailService.batchUpdate(stockOutOrderDO.getMaterialDetailList(), outMaterialDetailBaseDO); + } + + public Boolean close(ExecutionStockOutOrderDO stockOutOrderDO) { + ExecutionStockOutOrderPO stockInOrderPO = stockOutOrderService.getInfo(stockOutOrderDO.getOutOrderId()); + if (stockInOrderPO == null){ + throw new ServiceException("出库单信息不存在"); + } + + if (stockInOrderPO.getStatus() != 1){ + throw new ServiceException("只有已创建状态下能允许关闭出库单"); + } + stockOutOrderDO.setStatus(11); + return stockOutOrderService.update(stockOutOrderDO); + } + + + public Boolean pushOutOrder(StockOutOrderTZPD stockOutOrder) { + ExecutionStockOutOrder reservationStockOutOrder = new ExecutionStockOutOrder(); + BeanUtils.copyProperties(stockOutOrder, reservationStockOutOrder); + reservationStockOutOrder.setIssueStatus(4); + return stockOutOrderService.save(reservationStockOutOrder); + } + + public Boolean pushOutOrderDetail(OutMaterialDetailTZPD outMaterialDetail) { + ExecutionOutMaterialDetail reservationOutMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(outMaterialDetail, reservationOutMaterialDetail); + return outMaterialDetailService.save(reservationOutMaterialDetail); + } + + + /** + * @description 审核出库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + public Boolean auditState(ExecutionStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Integer auditStatus = stockOutOrderDO.getIssueStatus(); + Integer issueStatus = 0; + issueStatus = auditStatus == 2 ? 2 : 3; + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + return stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getReservationAuditId, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getReservationAuditName, userRealName) + .set(ExecutionStockOutOrder::getReservationAuditTime, new Date()) + .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getUpdateByName, userRealName) + .set(ExecutionStockOutOrder::getUpdateTime, new Date()) + .set(ExecutionStockOutOrder::getIssueStatus, issueStatus) + .in(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + } + + @Transactional(rollbackFor = Exception.class) + public Boolean cancelAuditState(ExecutionStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Integer issueStatus = stockOutOrderDO.getIssueStatus(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + + List outOrderIds = stockOutOrderDO.getOutOrderIds(); + if (outOrderIds != null && outOrderIds.size() > 0) { + for (Long outOrderId : outOrderIds) { + ExecutionStockOutOrder executionStockOutOrder = stockOutOrderService.getById(outOrderId); + String outOrderNumber = executionStockOutOrder.getOutOrderNumber(); + StockOutOrder stockOutOrder = new StockOutOrder(); + stockOutOrder.setOutOrderNumber(outOrderNumber); + wmsServiceFeign.omsCancelExecutionOrder(stockOutOrder); + //还原oms库存及调整记录 + List reservationInventoryAdjustmentRecords = inventoryAdjustmentRecordMapper.selectList(new LambdaQueryWrapper() + .eq(ReservationInventoryAdjustmentRecord::getExecutionOrderNumber, outOrderNumber) + .eq(ReservationInventoryAdjustmentRecord::getDelFlag, 1)); + for (ReservationInventoryAdjustmentRecord reservationInventoryAdjustmentRecord : reservationInventoryAdjustmentRecords) { + Long materialInventoryId = reservationInventoryAdjustmentRecord.getMaterialInventoryId(); + ReservationMaterialInventory reservationMaterialInventory = reservationMaterialInventoryMapper.selectById(materialInventoryId); +// BigDecimal inventoryBeforeQuantity = reservationInventoryAdjustmentRecord.getInventoryBeforeQuantity(); +// BigDecimal inventoryAfterQuantity = reservationInventoryAdjustmentRecord.getInventoryAfterQuantity(); + BigDecimal allocationBeforeQuantity = reservationInventoryAdjustmentRecord.getAllocationBeforeQuantity(); + BigDecimal allocationAfterQuantity = reservationInventoryAdjustmentRecord.getAllocationAfterQuantity(); + BigDecimal allocation = allocationBeforeQuantity.subtract(allocationAfterQuantity); + BigDecimal freezeBeforeQuantity = reservationInventoryAdjustmentRecord.getFreezeBeforeQuantity(); + BigDecimal freezeAfterQuantity = reservationInventoryAdjustmentRecord.getFreezeAfterQuantity(); + BigDecimal freeze = freezeAfterQuantity.subtract(freezeBeforeQuantity); + BigDecimal allocationQuantity = reservationMaterialInventory.getAllocationQuantity(); + BigDecimal freezeQuantity = reservationMaterialInventory.getFreezeQuantity(); + allocationQuantity.add(allocation); + freezeQuantity.subtract(freeze); + reservationMaterialInventory.setAllocationQuantity(allocationQuantity); + reservationMaterialInventory.setFreezeQuantity(freezeQuantity); + reservationMaterialInventory.setUpdateTime(new Date()); + reservationMaterialInventory.setUpdateBy(loginUser.getUserid()); + reservationMaterialInventory.setUpdateByName(userRealName); + reservationMaterialInventoryMapper.updateById(reservationMaterialInventory); + reservationInventoryAdjustmentRecord.setDelFlag(2); + inventoryAdjustmentRecordMapper.updateById(reservationInventoryAdjustmentRecord); + } + } + } + + return stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getIssueId, null) + .set(ExecutionStockOutOrder::getIssueName, null) + .set(ExecutionStockOutOrder::getIssueTime, null) + .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getUpdateByName, userRealName) + .set(ExecutionStockOutOrder::getUpdateTime, new Date()) + .set(ExecutionStockOutOrder::getIssueStatus, 1) + .in(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + } + + /** + * @description 审核出库单 + * @author ZhouGY + * @date 2024/5/21 13:53 + * @param stockOutOrderDO + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + public Boolean issueOrder(ExecutionStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + boolean update = stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getIssueId, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getIssueName, userRealName) + .set(ExecutionStockOutOrder::getIssueTime, new Date()) + //.set(ExecutionStockOutOrder::getIssueStatus, 1) + .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getUpdateByName, userRealName) + .set(ExecutionStockOutOrder::getUpdateTime, new Date()) + .in(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + + //todo下发推送到wms + List inOrderIds = stockOutOrderDO.getOutOrderIds(); + for (Long inOrderId : inOrderIds) { + ExecutionStockOutOrder byId = stockOutOrderService.getById(inOrderId); + StockOutOrder stockOutOrder = new StockOutOrder(); + BeanUtils.copyProperties(byId, stockOutOrder,"outOrderId"); + wmsServiceFeign.omsOutOrderAdd(stockOutOrder); + + List list = deliveryDetailsLinkService.list(new QueryWrapper().lambda().eq(ReservationDeliveryDetailsLink::getOrderNumber, byId.getOutOrderNumber())); + List deliveryDetailsLinkList = new ArrayList<>(); + for (ReservationDeliveryDetailsLink reservationDeliveryDetailsLink : list) { + DeliveryDetailsLink deliveryDetailsLink = new DeliveryDetailsLink(); + BeanUtils.copyProperties(reservationDeliveryDetailsLink, deliveryDetailsLink,"id"); + deliveryDetailsLink.setOmsId(reservationDeliveryDetailsLink.getId()); + deliveryDetailsLinkList.add(deliveryDetailsLink); + } + wmsServiceFeign.omsOutOrderAddDeliveryDetailsLink(deliveryDetailsLinkList); + + + String inOrderNumber = stockOutOrder.getOutOrderNumber(); + List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ExecutionOutMaterialDetail::getOutOrderNumber, inOrderNumber)); + List outMaterialDetailList = new ArrayList<>(); + for (ExecutionOutMaterialDetail reservationOutMaterialDetail : materialDetailList) { + OutMaterialDetail outMaterialDetail = new OutMaterialDetail(); + BeanUtils.copyProperties(reservationOutMaterialDetail, outMaterialDetail,"materialDetailId"); + outMaterialDetailList.add(outMaterialDetail); + } + wmsServiceFeign.omsOutOrderAddDetail(outMaterialDetailList); + + String outOrderNumber = byId.getOutOrderNumber(); + com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO = new com.mhd.system.api.domain.StockOutOrderDTO(); + stockOutOrderDTO.setOutOrderNumber(outOrderNumber); + wmsServiceFeign.execution(stockOutOrderDTO); + + wmsServiceFeign.genPickingOrderByOms(stockOutOrderDTO); + } + return update; + } + + /** + * @description 修改出库单 + * @author ZhouGY + * @date 2024/8/8 16:18 + * @param stockOutOrderDb + * @param stockOutOrderPO + * @return Boolean + */ +// public Boolean updateExecutionStockOutOrderByAllocation(ExecutionStockOutOrder stockOutOrderDb, ExecutionStockOutOrderPO stockOutOrderPO, Integer type) { +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// int status = judgeAllocationQuantityByManualAssign(stockOutOrderPO.getAllocationQuantity(), stockOutOrderDb.getQuantity(),type); +// BigDecimal allocationQuantity = stockOutOrderDb.getAllocationQuantity(); +// BigDecimal alreadyAllocationQuantity = stockOutOrderDb.getAlreadyAllocationQuantity() != null +// ? stockOutOrderDb.getAlreadyAllocationQuantity() +// : BigDecimal.ZERO; +// if (type == 2){ +// //取消分配:stockOutOrderPO.getAllocationQuantity() 和 stockOutOrderPO.getAlreadyAllocationQuantity() 都是要取消的数量 +// //物料明细层面的验证已经在 batchCancelAssignUpdate 中完成,这里直接使用即可 +// BigDecimal cancelQuantity = stockOutOrderPO.getAllocationQuantity(); +// stockOutOrderService.update(null,new UpdateWrapper().lambda() +// .setSql("allocation_quantity = allocation_quantity - " + cancelQuantity)//取消分配减数量 +// .eq(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDb.getOutOrderId()) +// ); +// BigDecimal cancelAlreadyAllocationQuantity = stockOutOrderPO.getAlreadyAllocationQuantity() != null +// ? stockOutOrderPO.getAlreadyAllocationQuantity() +// : BigDecimal.ZERO; +// +// // 取消分配:减少已分配数量 +// // 注意:如果出库单的 alreadyAllocationQuantity 数据不一致(可能为0),使用 cancelAlreadyAllocationQuantity 作为参考 +// // 但为了数据一致性,我们仍然从当前值中减去取消的数量 +// if (alreadyAllocationQuantity.compareTo(cancelAlreadyAllocationQuantity) < 0) { +// // 如果出库单的已分配数量小于要取消的数量,说明数据不一致,使用要取消的数量作为基准 +// alreadyAllocationQuantity = cancelAlreadyAllocationQuantity; +// } +// alreadyAllocationQuantity = alreadyAllocationQuantity.subtract(cancelQuantity); +// // 确保不会变成负数 +// if (alreadyAllocationQuantity.compareTo(BigDecimal.ZERO) < 0) { +// alreadyAllocationQuantity = BigDecimal.ZERO; +// } +// BigDecimal subtract = stockOutOrderPO.getAlreadyAllocationQuantity().subtract(alreadyAllocationQuantity); +// if (subtract.compareTo(BigDecimal.ZERO) == 0) { +// status = 2; +// } else { +// status = 3; +// } +//// status = judgeAllocationQuantityByManualAssign(stockOutOrderPO.getAllocationQuantity(), stockOutOrderPO.getAlreadyAllocationQuantity(),type); +// +// }else { +// allocationQuantity = stockOutOrderPO.getAllocationQuantity();//直接使用返回的分配数量 +// alreadyAllocationQuantity = alreadyAllocationQuantity.add(stockOutOrderPO.getAlreadyAllocationQuantity() != null +// ? stockOutOrderPO.getAlreadyAllocationQuantity() +// : BigDecimal.ZERO); +// } +// LambdaUpdateWrapper wrapper = new UpdateWrapper().lambda() +// .set(ExecutionStockOutOrder::getStatus, status) +// .set(ExecutionStockOutOrder::getAlreadyAllocationQuantity, alreadyAllocationQuantity) +// .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) +// .set(ExecutionStockOutOrder::getUpdateByName, loginUser.getUsername()) +// .set(ExecutionStockOutOrder::getUpdateTime, new Date()) +// .eq(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDb.getOutOrderId()); +// if (type != 2){ +// wrapper.set(ExecutionStockOutOrder::getAllocationQuantity, allocationQuantity); +// } +// return stockOutOrderService.update(null, wrapper); +// } + + + /** + * 批量删除出库单 + */ + public Boolean delete(Long[] outOrderIds) { + return stockOutOrderService.delete(outOrderIds); + } + + /** + * 获取出库单详细信息 + */ + public ExecutionStockOutOrderPO getInfo(Long outOrderId) { + return stockOutOrderService.getInfo(outOrderId); + } + + /** + * 获取出库单详细信息 + */ + public ExecutionStockOutOrderPO getInfoChildren(Long outOrderId) { + ExecutionStockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(outOrderId); + ExecutionOutMaterialDetailDO outMaterialDetailDO = new ExecutionOutMaterialDetailDO(); + outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber()); + List materialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO); +// for (ExecutionOutMaterialDetailPO outMaterialDetailPO : materialDetailPOList) { +// String materialNo = outMaterialDetailPO.getMaterialNo(); +// List materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper().lambda().eq(MaterialBaseInfoPO::getMaterialCode, materialNo)); +// if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) { +// outMaterialDetailPO.setCommodityName(materialBaseInfos.get(0).getMaterialNamePO()); +// outMaterialDetailPO.setMaterialCode(materialBaseInfos.get(0).getMaterialCodePO()); +// outMaterialDetailPO.setMaterialName(materialBaseInfos.get(0).getMaterialNamePO()); +// } +// } + stockOutOrderPO.setMaterialDetailList(materialDetailPOList); + return stockOutOrderPO; + } + + /** + * 获取出库单详细信息(PDA复核管理查询详情) + * 复核场景下与PC端getCheckInfo保持一致,返回拣货下发时的完整数据(树形结构、拣货汇总、批次属性等) + */ +// public ExecutionStockOutOrderPO getInfoByApp(Long outOrderId) { +// ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getById(outOrderId); +// if (stockOutOrder == null) { +// throw new ServiceException("出库单不存在"); +// } +// // 复核场景:与PC端getCheckInfo保持一致,返回拣货下发的完整数据(含历史记录 status=9 已出库,与列表详情一致) +// if (stockOutOrder.getReview() != null && stockOutOrder.getReview() == 1 +// && stockOutOrder.getStatus() != null && (stockOutOrder.getStatus() == 7 || stockOutOrder.getStatus() == 8 || stockOutOrder.getStatus() == 9)) { +// ExecutionStockOutOrderDO stockOutOrderDO = new ExecutionStockOutOrderDO(); +// stockOutOrderDO.setOutOrderNumber(stockOutOrder.getOutOrderNumber()); +// ExecutionStockOutOrderPO stockOutOrderPO = getCheckInfo(stockOutOrderDO); +// // PDA端需扁平化树形结构,与PC端展开后的展示条数一致(父项+子项全部展开为独立行) +// List flattenedList = flattenMaterialDetailTree(stockOutOrderPO.getMaterialDetailList()); +// stockOutOrderPO.setMaterialDetailList(flattenedList); +// if (stockOutOrderPO.getOutMaterialCheckPO() != null) { +// stockOutOrderPO.getOutMaterialCheckPO().setCount(flattenedList.size()); +// } +// return stockOutOrderPO; +// } +// // 非复核场景:保持原有逻辑 +// ExecutionStockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(outOrderId); +// ExecutionOutMaterialDetailDO outMaterialDetailDO = new ExecutionOutMaterialDetailDO(); +// outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber()); +// List materialDetailPOList = outMaterialDetailService.queryList(outMaterialDetailDO); +// materialDetailPOList.forEach(d -> { +// if (d.getWaitCheckQuantity() != null) d.setActualQuantity(d.getWaitCheckQuantity()); +// }); +// stockOutOrderPO.setMaterialDetailList(materialDetailPOList); +// return stockOutOrderPO; +// } + +// @Autowired +// private IMaterialBarCodeService materialBarCodeService; + + /** + * 获取出库单复核详细信息 + */ +// public ExecutionStockOutOrderPO getCheckInfo(ExecutionStockOutOrderDO stockOutOrderDO) { +// String outOrderNumber = stockOutOrderDO.getOutOrderNumber(); +// ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() +// .eq(ExecutionStockOutOrder::getDelFlag, 1) +// .eq(ExecutionStockOutOrder::getOutOrderNumber, stockOutOrderDO.getOutOrderNumber())); +// if (stockOutOrder == null){ +// throw new ServiceException("出库单【" + stockOutOrderDO.getOutOrderNumber() + "】不存在"); +// } +// if (stockOutOrder.getReview() != 1){ +// throw new ServiceException("出库单【" + stockOutOrderDO.getOutOrderNumber() + "】不需要复核"); +// } +// if (stockOutOrder.getStatus() != 7 && stockOutOrder.getStatus() != 8){ +// throw new ServiceException("出库单【" + stockOutOrderDO.getOutOrderNumber() + "】状态不是拣货完成或复核中"); +// } +// ExecutionStockOutOrderPO stockOutOrderPO = new ExecutionStockOutOrderPO(); +// BeanUtils.copyProperties(stockOutOrder, stockOutOrderPO); +// ExecutionOutMaterialDetailDO outMaterialDetailDO = new ExecutionOutMaterialDetailDO(); +// outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber()); +// List outMaterialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO); +// for (ExecutionOutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList) {//获取物料条形码 +// List materialBarCodePOList = materialBarCodeService.getInfoByMaterialBaseInfoIds(outMaterialDetailPO.getMaterialBaseInfoId()); +// if (materialBarCodePOList != null && !materialBarCodePOList.isEmpty()) { +// Map collect = materialBarCodePOList.stream() +// .collect(Collectors.toMap( +// MaterialBarCodePO::getMaterialBaseInfoId, +// po -> po, +// (existing, replacement) -> existing +// )); +// MaterialBarCodePO materialBarCodePO = collect.get(outMaterialDetailPO.getMaterialBaseInfoId()); +// if (materialBarCodePO != null && materialBarCodePO.getBarCode() != null) { +// outMaterialDetailPO.setBarCode(materialBarCodePO.getBarCode()); +// } +// } +// } +// for (ExecutionOutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList) { +// outMaterialDetailPO.setMaterialCode(outMaterialDetailPO.getMaterialNo()); +// outMaterialDetailPO.setMaterialName(outMaterialDetailPO.getCommodityName()); +// Long uniqueId = outMaterialDetailPO.getUniqueId(); +// PickingMaterialDetailPO pickingMaterialDetailPO = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(uniqueId); +// if (ObjectUtils.isNotEmpty(pickingMaterialDetailPO)) { +// outMaterialDetailPO.setTotalArea(pickingMaterialDetailPO.getTotalArea()); +// outMaterialDetailPO.setTotalVolume(pickingMaterialDetailPO.getTotalVolume()); +// outMaterialDetailPO.setTotalNetWeight(pickingMaterialDetailPO.getTotalNetWeight()); +// outMaterialDetailPO.setTotalGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight()); +// outMaterialDetailPO.setCheckArea(pickingMaterialDetailPO.getTotalArea()); +// outMaterialDetailPO.setCheckVolume(pickingMaterialDetailPO.getTotalVolume()); +// outMaterialDetailPO.setCheckNetWeight(pickingMaterialDetailPO.getTotalNetWeight()); +// outMaterialDetailPO.setCheckGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight()); +// // 拣货数量:优先 picking_material_detail,否则 out_material_detail +// BigDecimal pickQty = (pickingMaterialDetailPO.getPickingQuantity() != null && pickingMaterialDetailPO.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0) +// ? pickingMaterialDetailPO.getPickingQuantity() : outMaterialDetailPO.getPickingQuantity(); +// BigDecimal checkQty = outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO; +// // 待复核数量 = 拣货数量 - 已复核数量(复核提交后应减少) +// BigDecimal waitQty = (pickQty != null ? pickQty : BigDecimal.ZERO).subtract(checkQty); +// if (waitQty.compareTo(BigDecimal.ZERO) < 0) { +// waitQty = BigDecimal.ZERO; +// } +// outMaterialDetailPO.setWaitCheckQuantity(waitQty); +// // quantity=PC下发时的拣货数量,actualQuantity:已复核则取checkQuantity,否则取待复核数量 +// if (pickQty != null) { +// outMaterialDetailPO.setQuantity(pickQty); +// } +// outMaterialDetailPO.setActualQuantity(checkQty.compareTo(BigDecimal.ZERO) > 0 ? checkQty : waitQty); +// } +// List children = outMaterialDetailPO.getChildren(); +// if (!CollectionUtils.isEmpty(children)) { +// for (ExecutionOutMaterialDetailPO outMaterialDetailPOChild : children) { +// outMaterialDetailPOChild.setMaterialCode(outMaterialDetailPOChild.getMaterialNo()); +// outMaterialDetailPOChild.setMaterialName(outMaterialDetailPOChild.getCommodityName()); +// Long uniqueIdChild = outMaterialDetailPOChild.getUniqueId(); +// PickingMaterialDetailPO pickingMaterialDetailPO1 = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(uniqueIdChild); +// if (ObjectUtils.isNotEmpty(pickingMaterialDetailPO1)) { +// outMaterialDetailPOChild.setTotalArea(pickingMaterialDetailPO1.getTotalArea()); +// outMaterialDetailPOChild.setTotalVolume(pickingMaterialDetailPO1.getTotalVolume()); +// outMaterialDetailPOChild.setTotalNetWeight(pickingMaterialDetailPO1.getTotalNetWeight()); +// outMaterialDetailPOChild.setTotalGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight()); +// outMaterialDetailPOChild.setCheckArea(pickingMaterialDetailPO1.getTotalArea()); +// outMaterialDetailPOChild.setCheckVolume(pickingMaterialDetailPO1.getTotalVolume()); +// outMaterialDetailPOChild.setCheckNetWeight(pickingMaterialDetailPO1.getTotalNetWeight()); +// outMaterialDetailPOChild.setCheckGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight()); +// // 拣货数量:优先 picking_material_detail,否则 out_material_detail +// BigDecimal pickQtyChild = (pickingMaterialDetailPO1.getPickingQuantity() != null && pickingMaterialDetailPO1.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0) +// ? pickingMaterialDetailPO1.getPickingQuantity() : outMaterialDetailPOChild.getPickingQuantity(); +// BigDecimal checkQtyChild = outMaterialDetailPOChild.getCheckQuantity() != null ? outMaterialDetailPOChild.getCheckQuantity() : BigDecimal.ZERO; +// // 待复核数量 = 拣货数量 - 已复核数量(复核提交后应减少) +// BigDecimal waitQtyChild = (pickQtyChild != null ? pickQtyChild : BigDecimal.ZERO).subtract(checkQtyChild); +// if (waitQtyChild.compareTo(BigDecimal.ZERO) < 0) { +// waitQtyChild = BigDecimal.ZERO; +// } +// outMaterialDetailPOChild.setWaitCheckQuantity(waitQtyChild); +// // quantity=PC下发时的拣货数量,actualQuantity:已复核则取checkQuantity,否则取待复核数量 +// if (pickQtyChild != null) { +// outMaterialDetailPOChild.setQuantity(pickQtyChild); +// } +// outMaterialDetailPOChild.setActualQuantity(checkQtyChild.compareTo(BigDecimal.ZERO) > 0 ? checkQtyChild : waitQtyChild); +// } +// } +// } +// } +// stockOutOrderPO.setMaterialDetailList(outMaterialDetailPOList); +// BigDecimal weightLimit = BigDecimal.ZERO; +// BigDecimal volumeLimit = BigDecimal.ZERO; +// BigDecimal wantNumber = BigDecimal.ZERO; +// BigDecimal alreadyNumber = BigDecimal.ZERO; +// for (ExecutionOutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList){ +// weightLimit = weightLimit.add(outMaterialDetailPO.getWeightLimit()); +// volumeLimit = volumeLimit.add(outMaterialDetailPO.getVolumeLimit()); +// // wantNumber=拣货数量总和,alreadyNumber=已复核总和,notHaveNumber=剩余待复核 +// BigDecimal pickQty = (outMaterialDetailPO.getQuantity() != null ? outMaterialDetailPO.getQuantity() : outMaterialDetailPO.getPickingQuantity()); +// wantNumber = wantNumber.add(pickQty != null ? pickQty : BigDecimal.ZERO); +// alreadyNumber = alreadyNumber.add(outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO); +// } +// OutMaterialCheckPO outMaterialCheckPO = new OutMaterialCheckPO(); +// outMaterialCheckPO.setCount(outMaterialDetailPOList.size()); +// outMaterialCheckPO.setWeightLimit(weightLimit); +// outMaterialCheckPO.setVolumeLimit(volumeLimit); +// outMaterialCheckPO.setAlreadyNumber(alreadyNumber); +// outMaterialCheckPO.setNotHaveNumber(wantNumber.subtract(alreadyNumber)); +// stockOutOrderPO.setOutMaterialCheckPO(outMaterialCheckPO); +// +// List materialDetailList = stockOutOrderPO.getMaterialDetailList(); +// // 性能优化:批量获取批次属性,避免N+1查询问题 +// // 1. 收集所有唯一的materialBaseInfoId +// Set materialBaseInfoIdSet = materialDetailList.stream() +// .map(ExecutionOutMaterialDetailPO::getMaterialBaseInfoId) +// .filter(Objects::nonNull) +// .collect(Collectors.toSet()); +// +// // 2. 批量查询批次属性(使用Map缓存,避免重复查询相同的materialBaseInfoId) +// Map> batchDetailMap = new HashMap<>(); +// for (Long materialBaseInfoId : materialBaseInfoIdSet) { +// try { +// AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId); +// if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { +// List batchDetailFeignPOList = JSON.parseArray( +// JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); +// if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) { +// // 过滤isDisplay=1的属性 +// List filteredList = batchDetailFeignPOList.stream() +// .filter(batchDetail -> batchDetail.getIsDisplay() != null && batchDetail.getIsDisplay() == 1) +// .collect(Collectors.toList()); +// batchDetailMap.put(materialBaseInfoId, filteredList); +// } +// } +// } catch (Exception e) { +// log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage()); +// } +// } +// +// // 3. 为每个物料明细设置更多属性(从库存表中获取值) +// setMaterialMoreDetailListFromInventory(materialDetailList, batchDetailMap); +// // 过滤无拣货数量的明细:pickingQuantity 或 waitCheckQuantity 任一 >= 1 则保留(waitCheckQuantity 来自 picking_material_detail 已拣货数量) +// materialDetailList.removeIf(detail -> { +// BigDecimal pickQty = detail.getPickingQuantity() != null ? detail.getPickingQuantity() : BigDecimal.ZERO; +// BigDecimal waitQty = detail.getWaitCheckQuantity() != null ? detail.getWaitCheckQuantity() : BigDecimal.ZERO; +// return pickQty.compareTo(BigDecimal.ONE) < 0 && waitQty.compareTo(BigDecimal.ONE) < 0; +// }); +// stockOutOrderPO.setMaterialDetailList(materialDetailList); +// return stockOutOrderPO; +// } + + + /** + * 将物料明细树形结构扁平化,PDA端展示与PC端条数一致(父项+子项全部展开为独立行) + */ + private List flattenMaterialDetailTree(List treeList) { + if (CollectionUtils.isEmpty(treeList)) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + for (ExecutionOutMaterialDetailPO item : treeList) { + result.add(item); + List children = item.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + List flattenedChildren = flattenMaterialDetailTree(children); + result.addAll(flattenedChildren); + item.setChildren(null); + } + } + return result; + } + + /** + * @description 修改出库单数据 + * @author ZhouGY + * @date 2024/7/19 22:52 + * @param stockOutOrderPO + * @param stockOutOrderDb + * @param type 1-分配 2-取消分配 + * @return Boolean + */ + @Transactional(rollbackFor = Exception.class) + public Boolean updateExecutionStockOutOrder(ExecutionStockOutOrderPO stockOutOrderPO, ExecutionStockOutOrder stockOutOrderDb, Integer type){ + LoginUser loginUser = SecurityUtils.getLoginUser(); + ExecutionStockOutOrder stockOutOrder = new ExecutionStockOutOrder(); + stockOutOrder.setOutOrderId(stockOutOrderDb.getOutOrderId()); + stockOutOrder.setStatus(8); + stockOutOrder.setCheckStatus(2); + if (type == 1){ + stockOutOrder.setCheckQuantity(stockOutOrderDb.getCheckQuantity().add(stockOutOrderPO.getCheckQuantity())); + }else { + stockOutOrder.setCheckQuantity(stockOutOrderDb.getCheckQuantity().subtract(stockOutOrderPO.getCheckQuantity())); + } + stockOutOrder.setUpdateBy(loginUser.getUserid()); + stockOutOrder.setUpdateByName(loginUser.getUsername()); + stockOutOrder.setUpdateTime(new Date()); + return stockOutOrderService.updateById(stockOutOrder); + } + + + /** + * @description 设置物料信息 + * @author ZhouGY + * @date 2024/5/23 14:03 + * @param stockOutOrderDO + */ + private void setMaterialDetailInfo(ExecutionStockOutOrderDO stockOutOrderDO){ + List outMaterialDetailDOList = stockOutOrderDO.getMaterialDetailList(); + outMaterialDetailDOList.forEach(outMaterialDetailDO -> { +// Long materialBaseInfoId = outMaterialDetailDO.getMaterialBaseInfoId(); + MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(outMaterialDetailDO.getMaterialBaseInfoId()); + if (materialBaseInfoPO == null){ + throw new ServiceException("物料基础信息不存在"); + } + outMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode()); + outMaterialDetailDO.setMaterialName(materialBaseInfoPO.getMaterialName()); + outMaterialDetailDO.setBarCode(materialBaseInfoPO.getBarCode()); + outMaterialDetailDO.setPackId(materialBaseInfoPO.getPackId()); + outMaterialDetailDO.setPackCode(materialBaseInfoPO.getPackCode()); + outMaterialDetailDO.setPackName(materialBaseInfoPO.getPackName()); + }); + + } + + + /** + * 出库单提货单打印-表头 + */ + public List queryOutStockNoticePrint(ExecutionStockOutOrderDO stockOutOrderDO) { + return stockOutOrderService.queryOutStockNoticePrint(stockOutOrderDO); + } + + /** + * 出库单提货单打印-明细 + */ + public List queryOutStockNoticePrintDetail(ExecutionStockOutOrderDO stockOutOrderDO) { + return stockOutOrderService.queryOutStockNoticePrintDetail(stockOutOrderDO); + } + + public void returnGoods(String invoiceNumber, String transportationNumber, String orderId,String pictureUrl) { + reservationStockInOrderMapper.updateByOrderId(orderId); + reservationStockInOrderMapper.updateByTransportationNumber(transportationNumber); + LoginUser loginUser = SecurityUtils.getLoginUser(); + BusinessDeliveryDetailsLink businessDeliveryDetailsLink = businessDeliveryDetailsLinkService.getOne(new QueryWrapper().lambda().eq(BusinessDeliveryDetailsLink::getInvoiceNumber, invoiceNumber), false); + if (businessDeliveryDetailsLink != null) { + businessDeliveryDetailsLink.setIsReturn(1); // 1表示已退货 + businessDeliveryDetailsLink.setUpdateBy(loginUser.getUserPo().getUserId()); + businessDeliveryDetailsLink.setUpdateByName(loginUser.getUserPo().getUserName()); + businessDeliveryDetailsLink.setUpdateTime(new Date()); + businessDeliveryDetailsLinkService.updateById(businessDeliveryDetailsLink); +// String invoiceNumber1 = businessDeliveryDetailsLink.getInvoiceNumber(); + List list = reservationDeliveryDetailsLinkService.list(new QueryWrapper().lambda().eq(ReservationDeliveryDetailsLink::getInvoiceNumber, invoiceNumber)); + if (list != null && !list.isEmpty() && list.size()>0) { + ReservationDeliveryDetailsLink reservationDeliveryDetailsLink = list.get(0); + String orderNumber = reservationDeliveryDetailsLink.getOrderNumber(); + Integer bag = reservationDeliveryDetailsLink.getBag(); + ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda().eq(ExecutionStockOutOrder::getOutOrderNumber, orderNumber), false); + if (stockOutOrder != null) { + ExecutionStockInOrder reservationStockInOrder = new ExecutionStockInOrder(); + reservationStockInOrder.setPictureUrl(pictureUrl); + reservationStockInOrder.setOrganizationId(stockOutOrder.getOrganizationId()); + reservationStockInOrder.setOrganizationName(stockOutOrder.getOrganizationName()); + reservationStockInOrder.setTopOrganizationId(stockOutOrder.getTopOrganizationId()); + reservationStockInOrder.setShipperId(stockOutOrder.getShipperId()); + reservationStockInOrder.setShipperName(stockOutOrder.getShipperName()); + reservationStockInOrder.setShipperCode(stockOutOrder.getShipperCode()); + reservationStockInOrder.setWarehouseId(stockOutOrder.getWarehouseId()); + reservationStockInOrder.setWarehouseName(stockOutOrder.getWarehouseName()); + reservationStockInOrder.setWarehouseCode(stockOutOrder.getWarehouseCode()); + reservationStockInOrder.setBusinessOrderNo(stockOutOrder.getOutOrderNumber()); + reservationStockInOrder.setIssueStatus(0); + reservationStockInOrder.setCreateTime(new Date()); + reservationStockInOrder.setCreateBy(loginUser.getUserPo().getUserId()); + reservationStockInOrder.setCreateByName(loginUser.getUserPo().getUserName()); + reservationStockInOrder.setStatus(1); + reservationStockInOrder.setAuditStatus(1); + reservationStockInOrder.setOrderTypeName("退货入库"); + reservationStockInOrder.setOrderTypeCode("tui_huo_ru_ku"); + reservationStockInOrder.setBusinessType("tui_huo_ru_ku"); + reservationStockInOrder.setReservationOrderSource("系统生成"); + reservationStockInOrder.setQuantity(new BigDecimal(bag)); +// reservationStockInOrder.setInQuantity(new BigDecimal(bag)); + reservationStockInOrder.setRemark("发票号: "+invoiceNumber); + reservationStockInOrder.setDirectWarehouse(1); + reservationStockInOrder.setCloseOrder(2); + reservationStockInOrder.setOrderSource(1); + reservationStockInOrder.setOrderStatus("新增"); + reservationStockInOrder.setSalesmanId(loginUser.getUserPo().getUserId().toString()); + reservationStockInOrder.setSalesmanName(loginUser.getUserPo().getUserName()); + Random random = new Random(); + int num = random.nextInt(1000); // 0~999 + String str = String.format("%03d", num); // 不足三位前面补零 + reservationStockInOrder.setInOrderNumber("退"+stockOutOrder.getOutOrderNumber()+str); + reservationStockInOrderMapper.insert(reservationStockInOrder); + reservationDeliveryDetailsLink.setReturnOrderNumber(reservationStockInOrder.getInOrderNumber()); + reservationDeliveryDetailsLinkService.updateById(reservationDeliveryDetailsLink); + reservationDeliveryDetailsLinkService.updateW(reservationStockInOrder.getInOrderNumber(), reservationDeliveryDetailsLink.getOrderNumber()); + String returnOrderNumber = stockOutOrder.getReturnOrderNumber(); + if (returnOrderNumber == null) { + stockOutOrder.setReturnOrderNumber(reservationStockInOrder.getInOrderNumber()); + } else { + stockOutOrder.setReturnOrderNumber(returnOrderNumber + "," + reservationStockInOrder.getInOrderNumber()); + } + String deliveryName = stockOutOrder.getDeliveryName(); + if (deliveryName == null) { + stockOutOrder.setDeliveryName(reservationDeliveryDetailsLink.getDeliveryName()); + } else { + stockOutOrder.setDeliveryName(deliveryName + "," + reservationDeliveryDetailsLink.getDeliveryName()); + } + String invoiceNumber1 = stockOutOrder.getInvoiceNumber(); + if (invoiceNumber1 == null) { + stockOutOrder.setInvoiceNumber(reservationDeliveryDetailsLink.getInvoiceNumber()); + } else { + stockOutOrder.setInvoiceNumber(invoiceNumber1 + "," + reservationDeliveryDetailsLink.getInvoiceNumber()); + } + String customerNumber = stockOutOrder.getCustomerNumber(); + if (customerNumber == null) { + stockOutOrder.setCustomerNumber(reservationDeliveryDetailsLink.getCustomerNumber()); + } else { + stockOutOrder.setCustomerNumber(customerNumber + "," + reservationDeliveryDetailsLink.getCustomerNumber()); + } + BigDecimal returnQuantity = stockOutOrder.getReturnQuantity(); + if (returnQuantity == null || returnQuantity.compareTo(BigDecimal.ZERO) == 0) { + stockOutOrder.setReturnQuantity(new BigDecimal(bag)); + } else { + stockOutOrder.setReturnQuantity(returnQuantity.add(new BigDecimal(bag))); + } + stockOutOrderService.updateById(stockOutOrder); + //退货数量同步w + reservationStockInOrderMapper.updateWmsOut(stockOutOrder.getOutOrderNumber(),stockOutOrder.getReturnQuantity()); + + String subOrderId = businessDeliveryDetailsLink.getSubOrderId(); + BusinessDocumentOrder businessDocumentOrder = businessDocumentOrderMapper.selectOne(new LambdaQueryWrapper().eq(BusinessDocumentOrder::getId, subOrderId)); + businessDocumentOrder.setOrderStatus(3L); + businessDocumentOrderMapper.updateById(businessDocumentOrder); + String executeOrderNumber = businessDocumentOrder.getExecuteOrderNumber(); + if (executeOrderNumber != null){ + ExecuteOrder executeOrder = executeOrderMapper.selectOne(new LambdaQueryWrapper().eq(ExecuteOrder::getGoodsNumber, executeOrderNumber)); + executeOrder.setInvoiceStatus(1); + executeOrder.setInvoiceDate(new Date()); + executeOrderMapper.updateById(executeOrder); +// pictureUrl="123"; + executeOrderMapper.updateTmsOrderImage(executeOrderNumber,pictureUrl); + } + } + } + } + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/entity/ReservationInventoryAdjustmentRecord.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/entity/ReservationInventoryAdjustmentRecord.java index b322cd6fa..2c90e06fc 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/entity/ReservationInventoryAdjustmentRecord.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/entity/ReservationInventoryAdjustmentRecord.java @@ -199,4 +199,8 @@ public class ReservationInventoryAdjustmentRecord extends BaseVOEntity { @Excel(name = "批次号") private String batchNumber; + @ApiModelProperty("执行单号") + @Excel(name = "执行单号") + private String executionOrderNumber; + } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/po/ReservationInventoryAdjustmentRecordPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/po/ReservationInventoryAdjustmentRecordPO.java index 8395484d6..00338b43f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/po/ReservationInventoryAdjustmentRecordPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/po/ReservationInventoryAdjustmentRecordPO.java @@ -255,4 +255,7 @@ public class ReservationInventoryAdjustmentRecordPO extends BaseVOEntity { @ApiModelProperty("批次号") @Excel(name = "批次号") private String batchNumber; + @ApiModelProperty("执行单号") + @Excel(name = "执行单号") + private String executionOrderNumber; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDO.java index 8ac097c2d..4a68a2ddb 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDO.java @@ -214,4 +214,7 @@ public class ReservationInventoryAdjustmentRecordDO extends BaseVOEntity { private String lotCode; private String expiryDate; private String productionDate; + @ApiModelProperty("执行单号") + @Excel(name = "执行单号") + private String executionOrderNumber; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDTO.java index 0a2734c2c..57c14bd21 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInventoryAdjustmentRecord/repository/todo/ReservationInventoryAdjustmentRecordDTO.java @@ -172,4 +172,7 @@ public class ReservationInventoryAdjustmentRecordDTO extends BaseVOEntity { @ApiModelProperty(name = "权限菜单ID") private Long permissionMenuId; + @ApiModelProperty("执行单号") + @Excel(name = "执行单号") + private String executionOrderNumber; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java index 0b5ca9081..edf99e0ec 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/persistence/ReservationMaterialInventoryImpl.java @@ -296,7 +296,10 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl queryNoticePrint(ReservationStockInOrderDO stockInOrderDO); List queryNoticePrintDetail(ReservationStockInOrderDO stockInOrderDO); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java index 8fd6cd193..a5dd3894e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java @@ -333,6 +333,14 @@ public class ReservationStockInOrderApplicationService { return stockInOrderDomainService.issueOrder(stockInOrderDO); } + public Boolean cancelIssueOrder(ReservationStockInOrderDO stockInOrderDO){ + return stockInOrderDomainService.cancelIssueOrder(stockInOrderDO); + } + + public Boolean executeAndIssue(ReservationStockInOrderDO stockInOrderDO){ + return stockInOrderDomainService.executeAndIssue(stockInOrderDO); + } + /** * @description 取消入库单 * @author ZhouGY diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index 42ca8c65c..eeead47c4 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -13,6 +13,12 @@ import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockInOrder.repository.facade.IExecutionStockInOrderService; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockInOrder.service.ExecutionStockInOrderApplicationService; import com.mhd.oms.domain.reservationInMaterialDetail.entity.ReservationInMaterialDetail; import com.mhd.oms.domain.reservationInMaterialDetail.repository.facade.IReservationInMaterialDetailService; import com.mhd.oms.domain.reservationInMaterialDetail.repository.po.ReservationInMaterialDetailPO; @@ -29,6 +35,8 @@ import com.mhd.oms.domain.reservationStockInOrder.repository.po.ReservationStock import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO; import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder; import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService; +import com.mhd.oms.domain.reserveInMaterialDetail.entity.ReserveInMaterialDetail; +import com.mhd.oms.domain.reserveStockInOrder.entity.ReserveStockInOrder; import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.WmsServiceFeign; import com.mhd.system.api.domain.*; @@ -43,6 +51,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.lang.reflect.Field; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -61,30 +70,21 @@ public class ReservationStockInOrderDomainService { @Autowired private IReservationInMaterialDetailService materialDetailService; @Autowired + private IExecutionStockInOrderService executionStockInOrderService; + @Autowired + private IExecutionInMaterialDetailService executionInMaterialDetailService; + @Autowired private IReservationStockOutOrderService stockOutOrderService; -// @Autowired -// private ReservationStockReceiptOrderDomainService stockReceiptOrderDomainService; -// @Autowired -// private ReservationStockShelfOrderDomainService stockShelfOrderDomainService; -// @Autowired -// private IMaterialBaseInfoService materialBaseInfoService; -// @Autowired -// private IMaterialGoodsRuleService materialGoodsRuleService; -// @Autowired -// private IMaterialWarehouseControlService materialWarehouseControlService; @Autowired private SystemServiceFeign systemServiceFeign; @Autowired private WmsServiceFeign wmsServiceFeign; @Autowired private ReservationStockInOrderMapper reservationStockInOrderMapper; - + @Autowired + private ExecutionStockInOrderApplicationService stockInOrderApplicationService; @Autowired private BusinessDocumentOrderMapper businessDocumentOrderMapper; -// @Autowired -// private IReceiptMaterialDetailService receiptMaterialDetailService; -// @Autowired -// private IShelfMaterialDetailService shelfMaterialDetailService; /** * 分页查询入库单列表 @@ -161,7 +161,9 @@ public class ReservationStockInOrderDomainService { throw new ServiceException("入库单信息不存在"); } //设置物料信息 - setMaterialDetailInfo(stockInOrderDO); + if ( stockInOrderDO.getMaterialDetailList() != null && stockInOrderDO.getMaterialDetailList().size() > 0&&!hasNullOrZeroMaterialBaseInfoId(stockInOrderDO.getMaterialDetailList())) { + setMaterialDetailInfo(stockInOrderDO); + } //统计总物料种数 stockInOrderDO.setMaterialQuantity(stockInOrderDO.getMaterialDetailList().size()); //统计总计划数 @@ -195,8 +197,29 @@ public class ReservationStockInOrderDomainService { // } // } // + List materialDetailList = stockInOrderDO.getMaterialDetailList(); +// if (hasNullOrZeroMaterialBaseInfoId(materialDetailList)) { +// throw new ServiceException("物料明细中存在未选择物料基础信息的数据,请检查"); +// } + if (materialDetailList != null && materialDetailList.size() > 0&&!hasNullOrZeroMaterialBaseInfoId(materialDetailList)) { + return materialDetailService.batchUpdate(materialDetailList, inMaterialDetailBaseDO); + } else { + return true; + } + } - return materialDetailService.batchUpdate(stockInOrderDO.getMaterialDetailList(), inMaterialDetailBaseDO); + /** + * 判断物料明细列表中是否存在materialBaseInfoId为null或等于0的情况 + * @param materialDetailList 物料明细列表 + * @return 存在null或0返回true,否则返回false + */ + private boolean hasNullOrZeroMaterialBaseInfoId(List materialDetailList) { + if (CollectionUtils.isEmpty(materialDetailList)) { + return false; + } + return materialDetailList.stream().anyMatch(detail -> + detail.getMaterialBaseInfoId() == null || detail.getMaterialBaseInfoId() == 0L + ); } /** @@ -455,27 +478,258 @@ public class ReservationStockInOrderDomainService { .in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); //todo下发推送到wms +// List inOrderIds = stockInOrderDO.getInOrderIds(); +// for (Long inOrderId : inOrderIds) { +// ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); +// StockInOrder stockInOrder = new StockInOrder(); +// BeanUtils.copyProperties(byId, stockInOrder,"inOrderId"); +// stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); +// wmsServiceFeign.omsInOrderAdd(stockInOrder); +// String inOrderNumber = stockInOrder.getInOrderNumber(); +// List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); +// List inMaterialDetailList = new ArrayList<>(); +// for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) { +// InMaterialDetail inMaterialDetail = new InMaterialDetail(); +// BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail,"materialDetailId"); +// inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); +// inMaterialDetailList.add(inMaterialDetail); +// } +// wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); +// } + //todo下发推送到入库业务单 + List inOrderIds = stockInOrderDO.getInOrderIds(); + for (Long inOrderId : inOrderIds) { +// Long inOrderId = stockInOrderDO.getInOrderId(); + ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); + String inOrderNumber = byId.getInOrderNumber(); + List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); + + // 按照 warehouseId 分组 + Map> materialDetailGroupByWarehouse = materialDetailList.stream() + .collect(Collectors.groupingBy(ReservationInMaterialDetail::getWarehouseId)); + materialDetailGroupByWarehouse.forEach((warehouseId, details) -> { + Long topOrgId = reservationStockInOrderMapper.getTopOrgId(warehouseId); + Long orgId = reservationStockInOrderMapper.getOrgId(warehouseId); + String orgName = reservationStockInOrderMapper.getOrgName(warehouseId); + String warehouseCode = reservationStockInOrderMapper.getWarehouseCode(warehouseId); + String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + + ExecutionStockInOrder reservationStockInOrder = new ExecutionStockInOrder(); + BeanUtils.copyProperties(byId, reservationStockInOrder,"inOrderId","issueStatus","issueTime","issueId","issueName","reservationAuditId","reservationAuditName","reservationAuditTime"); + reservationStockInOrder.setIssueStatus(0); + reservationStockInOrder.setOrderTypeCode("pu_tong_ru_ku"); + reservationStockInOrder.setOrderTypeName("普通入库"); + reservationStockInOrder.setReservationOrderSource("客户预约"); + reservationStockInOrder.setWarehouseId(warehouseId); +// reservationStockInOrder.setOrganizationId(orgId); +// reservationStockInOrder.setOrganizationName(orgName); +// reservationStockInOrder.setTopOrganizationId(topOrgId); + reservationStockInOrder.setWarehouseCode(warehouseCode); + reservationStockInOrder.setWarehouseName(warehouseName); + reservationStockInOrder.setBusinessInOrderNumber(inOrderNumber); + if (materialDetailGroupByWarehouse!=null&&materialDetailGroupByWarehouse.size()>1) { + reservationStockInOrder.setInOrderNumber(OrderSequence.getOrderCode("RK")); + } else { + reservationStockInOrder.setInOrderNumber(inOrderNumber); + } + + List inMaterialDetailList = new ArrayList<>(); + int index = 1; + for (ReservationInMaterialDetail reserveInMaterialDetail : details) { + ExecutionInMaterialDetail reservationInMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(reserveInMaterialDetail, reservationInMaterialDetail,"materialDetailId"); + reservationInMaterialDetail.setQuantity(reserveInMaterialDetail.getQuantity()); +// reservationInMaterialDetail.setOrganizationId(orgId); +// reservationInMaterialDetail.setOrganizationName(orgName); +// reservationInMaterialDetail.setTopOrganizationId(topOrgId); + reservationInMaterialDetail.setWarehouseCode(warehouseCode); + reservationInMaterialDetail.setWarehouseName(warehouseName); + reservationInMaterialDetail.setInOrderNumber(reservationStockInOrder.getInOrderNumber()); +// String lot = generateDateSerialNumber(); +// lot = lot+"-"+index; +// index++; +// reservationInMaterialDetail.setLotNo(lot); + inMaterialDetailList.add(reservationInMaterialDetail); + } + BigDecimal quantity = details.stream().map(ReservationInMaterialDetail::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + reservationStockInOrder.setQuantity(quantity); + executionStockInOrderService.save(reservationStockInOrder); + executionInMaterialDetailService.saveBatch(inMaterialDetailList); + }); + } + + + return update; + } + + @Transactional(rollbackFor = Exception.class) + public Boolean cancelIssueOrder(ReservationStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + boolean update = stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ReservationStockInOrder::getIssueId, null) + .set(ReservationStockInOrder::getIssueName, null) + .set(ReservationStockInOrder::getIssueTime, null) + .set(ReservationStockInOrder::getIssueStatus, 2) + .set(ReservationStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ReservationStockInOrder::getUpdateByName, userRealName) + .set(ReservationStockInOrder::getUpdateTime, new Date()) + .in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + + //todo下发推送到入库业务单 List inOrderIds = stockInOrderDO.getInOrderIds(); for (Long inOrderId : inOrderIds) { ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); - StockInOrder stockInOrder = new StockInOrder(); - BeanUtils.copyProperties(byId, stockInOrder,"inOrderId"); - stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); - wmsServiceFeign.omsInOrderAdd(stockInOrder); - String inOrderNumber = stockInOrder.getInOrderNumber(); - List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); - List inMaterialDetailList = new ArrayList<>(); - for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) { - InMaterialDetail inMaterialDetail = new InMaterialDetail(); - BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail,"materialDetailId"); - inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); - inMaterialDetailList.add(inMaterialDetail); + String inOrderNumber = byId.getInOrderNumber(); + List list = executionStockInOrderService.list(new QueryWrapper().lambda() + .eq(ExecutionStockInOrder::getBusinessInOrderNumber, inOrderNumber) + .eq(ExecutionStockInOrder::getDelFlag, 1)); + for (ExecutionStockInOrder executionStockInOrder : list) { + String inOrderNumber1 = executionStockInOrder.getInOrderNumber(); + List materialDetails = executionInMaterialDetailService.list(new QueryWrapper().lambda() + .eq(ExecutionInMaterialDetail::getInOrderNumber, inOrderNumber1) + .eq(ExecutionInMaterialDetail::getDelFlag, 1)); + materialDetails.forEach(materialDetail -> { + executionInMaterialDetailService.update(null, new UpdateWrapper().lambda() + .set(ExecutionInMaterialDetail::getDelFlag, 2) + .eq(ExecutionInMaterialDetail::getMaterialDetailId, materialDetail.getMaterialDetailId())); + }); + executionStockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getDelFlag, 2) + .eq(ExecutionStockInOrder::getInOrderId, executionStockInOrder.getInOrderId())); } - wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); + } return update; } + @Transactional(rollbackFor = Exception.class) + public Boolean executeAndIssue(ReservationStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + boolean update = stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ReservationStockInOrder::getIssueId, loginUser.getUserid()) + .set(ReservationStockInOrder::getIssueName, userRealName) + .set(ReservationStockInOrder::getIssueTime, new Date()) + //.set(ReservationStockInOrder::getIssueStatus, 1) + .set(ReservationStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ReservationStockInOrder::getUpdateByName, userRealName) + .set(ReservationStockInOrder::getUpdateTime, new Date()) + .in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + + //todo下发推送到wms +// List inOrderIds = stockInOrderDO.getInOrderIds(); +// for (Long inOrderId : inOrderIds) { +// ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); +// StockInOrder stockInOrder = new StockInOrder(); +// BeanUtils.copyProperties(byId, stockInOrder,"inOrderId"); +// stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); +// wmsServiceFeign.omsInOrderAdd(stockInOrder); +// String inOrderNumber = stockInOrder.getInOrderNumber(); +// List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); +// List inMaterialDetailList = new ArrayList<>(); +// for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) { +// InMaterialDetail inMaterialDetail = new InMaterialDetail(); +// BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail,"materialDetailId"); +// inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); +// inMaterialDetailList.add(inMaterialDetail); +// } +// wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); +// } + //todo下发推送到入库业务单 + List inOrderIds = stockInOrderDO.getInOrderIds(); + for (Long inOrderId : inOrderIds) { +// Long inOrderId = stockInOrderDO.getInOrderId(); + ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); + String inOrderNumber = byId.getInOrderNumber(); + List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); + + // 按照 warehouseId 分组 + Map> materialDetailGroupByWarehouse = materialDetailList.stream() + .collect(Collectors.groupingBy(ReservationInMaterialDetail::getWarehouseId)); + materialDetailGroupByWarehouse.forEach((warehouseId, details) -> { + Long topOrgId = reservationStockInOrderMapper.getTopOrgId(warehouseId); + Long orgId = reservationStockInOrderMapper.getOrgId(warehouseId); + String orgName = reservationStockInOrderMapper.getOrgName(warehouseId); + String warehouseCode = reservationStockInOrderMapper.getWarehouseCode(warehouseId); + String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + + ExecutionStockInOrder reservationStockInOrder = new ExecutionStockInOrder(); + BeanUtils.copyProperties(byId, reservationStockInOrder,"inOrderId","issueStatus","issueTime","issueId","issueName","reservationAuditId","reservationAuditName","reservationAuditTime"); + reservationStockInOrder.setIssueStatus(0); + reservationStockInOrder.setOrderTypeCode("pu_tong_ru_ku"); + reservationStockInOrder.setOrderTypeName("普通入库"); + reservationStockInOrder.setReservationOrderSource("客户预约"); + reservationStockInOrder.setWarehouseId(warehouseId); + reservationStockInOrder.setOrganizationId(orgId); + reservationStockInOrder.setOrganizationName(orgName); + reservationStockInOrder.setTopOrganizationId(topOrgId); + reservationStockInOrder.setWarehouseCode(warehouseCode); + reservationStockInOrder.setWarehouseName(warehouseName); + reservationStockInOrder.setBusinessInOrderNumber(inOrderNumber); + if (materialDetailGroupByWarehouse!=null&&materialDetailGroupByWarehouse.size()>1) { + reservationStockInOrder.setInOrderNumber(OrderSequence.getOrderCode("RK")); + } else { + reservationStockInOrder.setInOrderNumber(inOrderNumber); + } + + List inMaterialDetailList = new ArrayList<>(); + int index = 1; + for (ReservationInMaterialDetail reserveInMaterialDetail : details) { + ExecutionInMaterialDetail reservationInMaterialDetail = new ExecutionInMaterialDetail(); + BeanUtils.copyProperties(reserveInMaterialDetail, reservationInMaterialDetail,"materialDetailId"); + reservationInMaterialDetail.setQuantity(reserveInMaterialDetail.getQuantity()); + reservationInMaterialDetail.setOrganizationId(orgId); + reservationInMaterialDetail.setOrganizationName(orgName); + reservationInMaterialDetail.setTopOrganizationId(topOrgId); + reservationInMaterialDetail.setWarehouseCode(warehouseCode); + reservationInMaterialDetail.setWarehouseName(warehouseName); + reservationInMaterialDetail.setInOrderNumber(reservationStockInOrder.getInOrderNumber()); +// String lot = generateDateSerialNumber(); +// lot = lot+"-"+index; +// index++; +// reservationInMaterialDetail.setLotNo(lot); + inMaterialDetailList.add(reservationInMaterialDetail); + } + BigDecimal quantity = details.stream().map(ReservationInMaterialDetail::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + reservationStockInOrder.setQuantity(quantity); + executionStockInOrderService.save(reservationStockInOrder); + ExecutionStockInOrderDO param = new ExecutionStockInOrderDO(); + Long inOrderId1 = reservationStockInOrder.getInOrderId(); + List inOrderIdList1 = new ArrayList<>(); + inOrderIdList1.add(inOrderId1); + param.setInOrderIds(inOrderIdList1); + stockInOrderApplicationService.issueOrder(param); + executionInMaterialDetailService.saveBatch(inMaterialDetailList); + }); + } + + + return update; + } + + public String generateDateSerialNumber() { + // 1. 获取当前时间,格式化为:yyMMdd (2位年+2位月+2位日) + SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); + String datePart = sdf.format(new Date()); + + // 2. 生成 000~999 的 3 位随机数(不足补零) + Random random = new Random(); + int randomNum = random.nextInt(1000); // 0~999 + String randomPart = String.format("%03d", randomNum); // 自动补前导零 + + // 3. 拼接结果 + return datePart + randomPart; + } + /** * @description 入库单返回结果 * @author ZhouGY diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java index 2f6512c36..8cde20557 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java @@ -859,6 +859,13 @@ public class ReservationStockOutOrderApplicationService { public Boolean issueOrder(ReservationStockOutOrderDO stockOutOrderDO){ return stockOutOrderDomainService.issueOrder(stockOutOrderDO); } + public Boolean cancelIssueOrder(ReservationStockOutOrderDO stockOutOrderDO){ + return stockOutOrderDomainService.cancelIssueOrder(stockOutOrderDO); + } + + public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO){ + return stockOutOrderDomainService.executeAndIssue(stockOutOrderDO); + } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java index 7d7eb83cb..18ee27e12 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java @@ -20,6 +20,15 @@ import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; import com.mhd.oms.domain.executeOrder.entity.ExecuteOrder; import com.mhd.oms.domain.executeOrder.repository.mapper.ExecuteOrderMapper; +import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; +import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; +import com.mhd.oms.domain.executionOutMaterialDetail.entity.ExecutionOutMaterialDetail; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.facade.IExecutionOutMaterialDetailService; +import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderApplicationService; import com.mhd.oms.domain.reservationDeliveryDetailsLink.entity.ReservationDeliveryDetailsLink; import com.mhd.oms.domain.reservationDeliveryDetailsLink.repository.facade.IReservationDeliveryDetailsLinkService; import com.mhd.oms.domain.reservationInMaterialDetail.entity.ReservationInMaterialDetail; @@ -71,6 +80,10 @@ public class ReservationStockOutOrderDomainService { @Autowired private IReservationOutMaterialDetailService outMaterialDetailService; @Autowired + private IExecutionStockOutOrderService executionStockOutOrderService; + @Autowired + private IExecutionOutMaterialDetailService executionOutMaterialDetailService; + @Autowired private IReservationDeliveryDetailsLinkService deliveryDetailsLinkService; @Autowired private IReservationStockInOrderService reservationStockInOrderService; @@ -80,7 +93,8 @@ public class ReservationStockOutOrderDomainService { private BusinessDocumentOrderMapper businessDocumentOrderMapper; @Autowired private ExecuteOrderMapper executeOrderMapper; - + @Autowired + private ExecutionStockOutOrderApplicationService stockOutOrderApplicationService; @Resource private SystemServiceFeign systemServiceFeign; @Resource @@ -335,32 +349,187 @@ public class ReservationStockOutOrderDomainService { //todo下发推送到wms List inOrderIds = stockOutOrderDO.getOutOrderIds(); + for (Long inOrderId : inOrderIds) { ReservationStockOutOrder byId = stockOutOrderService.getById(inOrderId); - StockOutOrder stockOutOrder = new StockOutOrder(); - BeanUtils.copyProperties(byId, stockOutOrder,"outOrderId"); - wmsServiceFeign.omsOutOrderAdd(stockOutOrder); - - List list = deliveryDetailsLinkService.list(new QueryWrapper().lambda().eq(ReservationDeliveryDetailsLink::getOrderNumber, byId.getOutOrderNumber())); - List deliveryDetailsLinkList = new ArrayList<>(); - for (ReservationDeliveryDetailsLink reservationDeliveryDetailsLink : list) { - DeliveryDetailsLink deliveryDetailsLink = new DeliveryDetailsLink(); - BeanUtils.copyProperties(reservationDeliveryDetailsLink, deliveryDetailsLink,"id"); - deliveryDetailsLink.setOmsId(reservationDeliveryDetailsLink.getId()); - deliveryDetailsLinkList.add(deliveryDetailsLink); - } - wmsServiceFeign.omsOutOrderAddDeliveryDetailsLink(deliveryDetailsLinkList); - - - String inOrderNumber = stockOutOrder.getOutOrderNumber(); + String inOrderNumber = byId.getOutOrderNumber(); List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber)); - List outMaterialDetailList = new ArrayList<>(); - for (ReservationOutMaterialDetail reservationOutMaterialDetail : materialDetailList) { - OutMaterialDetail outMaterialDetail = new OutMaterialDetail(); - BeanUtils.copyProperties(reservationOutMaterialDetail, outMaterialDetail,"materialDetailId"); - outMaterialDetailList.add(outMaterialDetail); - } - wmsServiceFeign.omsOutOrderAddDetail(outMaterialDetailList); + + // 按照 warehouseId 分组 + Map> materialDetailGroupByWarehouse = materialDetailList.stream() + .collect(Collectors.groupingBy(ReservationOutMaterialDetail::getWarehouseId)); + materialDetailGroupByWarehouse.forEach((warehouseId, details) -> { + Long topOrgId = reservationStockInOrderMapper.getTopOrgId(warehouseId); + Long orgId = reservationStockInOrderMapper.getOrgId(warehouseId); + String orgName = reservationStockInOrderMapper.getOrgName(warehouseId); + String warehouseCode = reservationStockInOrderMapper.getWarehouseCode(warehouseId); + String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + + ExecutionStockOutOrder reservationStockInOrder = new ExecutionStockOutOrder(); + BeanUtils.copyProperties(byId, reservationStockInOrder,"outOrderId","issueStatus","issueTime","issueId","issueName","reservationAuditId","reservationAuditName","reservationAuditTime"); + reservationStockInOrder.setIssueStatus(0); + reservationStockInOrder.setOrderTypeCode("pu_tong_chu_ku"); + reservationStockInOrder.setOrderTypeName("普通出库"); + reservationStockInOrder.setReservationOrderSource("客户预约"); + reservationStockInOrder.setWarehouseId(warehouseId); +// reservationStockInOrder.setOrganizationId(orgId); +// reservationStockInOrder.setOrganizationName(orgName); +// reservationStockInOrder.setTopOrganizationId(topOrgId); + reservationStockInOrder.setWarehouseCode(warehouseCode); + reservationStockInOrder.setWarehouseName(warehouseName); + reservationStockInOrder.setBusinessOutOrderNumber(inOrderNumber); + if (materialDetailGroupByWarehouse!=null&&materialDetailGroupByWarehouse.size()>1) { + reservationStockInOrder.setOutOrderNumber(OrderSequence.getOrderCode("CK")); + } else { + reservationStockInOrder.setOutOrderNumber(inOrderNumber); + } + + List inMaterialDetailList = new ArrayList<>(); + for (ReservationOutMaterialDetail reservationOutMaterialDetail : details) { + ExecutionOutMaterialDetail reservationInMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(reservationOutMaterialDetail, reservationInMaterialDetail,"materialDetailId"); + reservationInMaterialDetail.setQuantity(reservationOutMaterialDetail.getQuantity()); +// reservationInMaterialDetail.setOrganizationId(orgId); +// reservationInMaterialDetail.setOrganizationName(orgName); +// reservationInMaterialDetail.setTopOrganizationId(topOrgId); + reservationInMaterialDetail.setWarehouseCode(warehouseCode); + reservationInMaterialDetail.setWarehouseName(warehouseName); + reservationInMaterialDetail.setOutOrderNumber(reservationStockInOrder.getOutOrderNumber()); + inMaterialDetailList.add(reservationInMaterialDetail); + } + BigDecimal quantity = details.stream().map(ReservationOutMaterialDetail::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + reservationStockInOrder.setQuantity(quantity); + executionStockOutOrderService.save(reservationStockInOrder); + executionOutMaterialDetailService.saveBatch(inMaterialDetailList); + }); + } + return update; + } + + @Transactional(rollbackFor = Exception.class) + public Boolean cancelIssueOrder(ReservationStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + boolean update = stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ReservationStockOutOrder::getIssueId, null) + .set(ReservationStockOutOrder::getIssueName, null) + .set(ReservationStockOutOrder::getIssueTime, null) + .set(ReservationStockOutOrder::getIssueStatus, 2) + .set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ReservationStockOutOrder::getUpdateByName, userRealName) + .set(ReservationStockOutOrder::getUpdateTime, new Date()) + .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + + //todo下发推送到wms + List inOrderIds = stockOutOrderDO.getOutOrderIds(); + + for (Long inOrderId : inOrderIds) { + ReservationStockOutOrder byId = stockOutOrderService.getById(inOrderId); + String inOrderNumber = byId.getOutOrderNumber(); + List list = executionStockOutOrderService.list(new QueryWrapper().lambda() + .eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, inOrderNumber) + .eq(ExecutionStockOutOrder::getDelFlag, 1)); + list.forEach(executionStockOutOrder -> { + String outOrderNumber = executionStockOutOrder.getOutOrderNumber(); + List materialDetails = executionOutMaterialDetailService.list(new QueryWrapper().lambda() + .eq(ExecutionOutMaterialDetail::getOutOrderNumber, outOrderNumber) + .eq(ExecutionOutMaterialDetail::getDelFlag, 1)); + materialDetails.forEach(executionOutMaterialDetail -> { + executionOutMaterialDetailService.update(null, new UpdateWrapper().lambda() + .set(ExecutionOutMaterialDetail::getDelFlag, 2) + .eq(ExecutionOutMaterialDetail::getMaterialDetailId, executionOutMaterialDetail.getMaterialDetailId())); + }); + executionStockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getDelFlag, 2) + .eq(ExecutionStockOutOrder::getOutOrderNumber, outOrderNumber)); + }); + } + return update; + } + + @Transactional(rollbackFor = Exception.class) + public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + boolean update = stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ReservationStockOutOrder::getIssueId, loginUser.getUserid()) + .set(ReservationStockOutOrder::getIssueName, userRealName) + .set(ReservationStockOutOrder::getIssueTime, new Date()) + //.set(ReservationStockOutOrder::getIssueStatus, 1) + .set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ReservationStockOutOrder::getUpdateByName, userRealName) + .set(ReservationStockOutOrder::getUpdateTime, new Date()) + .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + + //todo下发推送到wms + List inOrderIds = stockOutOrderDO.getOutOrderIds(); + + for (Long inOrderId : inOrderIds) { + ReservationStockOutOrder byId = stockOutOrderService.getById(inOrderId); + String inOrderNumber = byId.getOutOrderNumber(); + List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber)); + + // 按照 warehouseId 分组 + Map> materialDetailGroupByWarehouse = materialDetailList.stream() + .collect(Collectors.groupingBy(ReservationOutMaterialDetail::getWarehouseId)); + materialDetailGroupByWarehouse.forEach((warehouseId, details) -> { + Long topOrgId = reservationStockInOrderMapper.getTopOrgId(warehouseId); + Long orgId = reservationStockInOrderMapper.getOrgId(warehouseId); + String orgName = reservationStockInOrderMapper.getOrgName(warehouseId); + String warehouseCode = reservationStockInOrderMapper.getWarehouseCode(warehouseId); + String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + + ExecutionStockOutOrder reservationStockInOrder = new ExecutionStockOutOrder(); + BeanUtils.copyProperties(byId, reservationStockInOrder,"outOrderId","issueStatus","issueTime","issueId","issueName","reservationAuditId","reservationAuditName","reservationAuditTime"); + reservationStockInOrder.setIssueStatus(0); + reservationStockInOrder.setOrderTypeCode("pu_tong_chu_ku"); + reservationStockInOrder.setOrderTypeName("普通出库"); + reservationStockInOrder.setReservationOrderSource("客户预约"); + reservationStockInOrder.setWarehouseId(warehouseId); + reservationStockInOrder.setOrganizationId(orgId); + reservationStockInOrder.setOrganizationName(orgName); + reservationStockInOrder.setTopOrganizationId(topOrgId); + reservationStockInOrder.setWarehouseCode(warehouseCode); + reservationStockInOrder.setWarehouseName(warehouseName); + reservationStockInOrder.setBusinessOutOrderNumber(inOrderNumber); + if (materialDetailGroupByWarehouse!=null&&materialDetailGroupByWarehouse.size()>1) { + reservationStockInOrder.setOutOrderNumber(OrderSequence.getOrderCode("CK")); + } else { + reservationStockInOrder.setOutOrderNumber(inOrderNumber); + } + + List inMaterialDetailList = new ArrayList<>(); + for (ReservationOutMaterialDetail reservationOutMaterialDetail : details) { + ExecutionOutMaterialDetail reservationInMaterialDetail = new ExecutionOutMaterialDetail(); + BeanUtils.copyProperties(reservationOutMaterialDetail, reservationInMaterialDetail,"materialDetailId"); + reservationInMaterialDetail.setQuantity(reservationOutMaterialDetail.getQuantity()); + reservationInMaterialDetail.setOrganizationId(orgId); + reservationInMaterialDetail.setOrganizationName(orgName); + reservationInMaterialDetail.setTopOrganizationId(topOrgId); + reservationInMaterialDetail.setWarehouseCode(warehouseCode); + reservationInMaterialDetail.setWarehouseName(warehouseName); + reservationInMaterialDetail.setOutOrderNumber(reservationStockInOrder.getOutOrderNumber()); + inMaterialDetailList.add(reservationInMaterialDetail); + } + BigDecimal quantity = details.stream().map(ReservationOutMaterialDetail::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + reservationStockInOrder.setQuantity(quantity); + executionStockOutOrderService.save(reservationStockInOrder); + executionOutMaterialDetailService.saveBatch(inMaterialDetailList); + + //下发 + Long outOrderId = reservationStockInOrder.getOutOrderId(); + ExecutionStockOutOrderDO param = new ExecutionStockOutOrderDO(); + List ids = new ArrayList<>(); + ids.add(outOrderId); + param.setOutOrderIds(ids); + stockOutOrderApplicationService.issueOrder(param); + }); } return update; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/mapper/ReserveStockInOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/mapper/ReserveStockInOrderMapper.java index 956ec1063..92e0c7292 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/mapper/ReserveStockInOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/mapper/ReserveStockInOrderMapper.java @@ -43,4 +43,7 @@ public interface ReserveStockInOrderMapper extends BaseMapper queryNoticePrint(ReserveStockInOrderDO stockInOrderDO); - List queryNoticePrintDetail(ReserveStockInOrderDO stockInOrderDO);} \ No newline at end of file + List queryNoticePrintDetail(ReserveStockInOrderDO stockInOrderDO); + + public String getJsbz(@Param("id") Long id); +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java index cc5bb467e..79e937e65 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java @@ -451,6 +451,9 @@ public class ReserveStockInOrderDomainService { reservationStockInOrder.setOrderTypeCode("pu_tong_ru_ku"); reservationStockInOrder.setOrderTypeName("普通入库"); reservationStockInOrder.setReservationOrderSource("客户预约"); + Long shipperId = reservationStockInOrder.getShipperId(); + String jsbz = reservationStockInOrderMapper.getJsbz(shipperId); + reservationStockInOrder.setSettlementCurrency(jsbz); String inOrderNumber = reservationStockInOrder.getInOrderNumber(); List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReserveInMaterialDetail::getInOrderNumber, inOrderNumber)); List inMaterialDetailList = new ArrayList<>(); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java index a9e8de8ad..600cef7f2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java @@ -282,6 +282,9 @@ public class ReserveStockOutOrderDomainService { reservationStockOutOrder.setOrderTypeCode("pu_tong_chu_ku"); reservationStockOutOrder.setOrderTypeName("普通出库"); reservationStockOutOrder.setReservationOrderSource("客户预约"); + Long shipperId = reservationStockOutOrder.getShipperId(); + String jsbz = reservationStockInOrderMapper.getJsbz(shipperId); + reservationStockOutOrder.setSettlementCurrency(jsbz); reservationStockOutOrderService.save(reservationStockOutOrder); String outOrderNumber = reservationStockOutOrder.getOutOrderNumber(); List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReserveOutMaterialDetail::getOutOrderNumber, outOrderNumber)); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/entity/SysTableConfig.java b/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/entity/SysTableConfig.java index 57e390483..bdeefc1c3 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/entity/SysTableConfig.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/entity/SysTableConfig.java @@ -70,4 +70,8 @@ public class SysTableConfig extends BaseVOEntity { @ApiModelProperty(value = "配送明细") @Excel(name = "配送明细", width = 15) private String deliveryDetail; + /**是否多仓库*/ + @ApiModelProperty(value = "是否多仓库") + @Excel(name = "是否多仓库", width = 15) + private String isMultiWarehouse; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/repository/persistence/SysTableConfigServiceImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/repository/persistence/SysTableConfigServiceImpl.java index b415430c5..ee8d91240 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/repository/persistence/SysTableConfigServiceImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/sysTableConfig/repository/persistence/SysTableConfigServiceImpl.java @@ -100,6 +100,7 @@ public class SysTableConfigServiceImpl extends ServiceImpl list = inMaterialDetailApplicationService.queryList(inMaterialDetailDO); + return getDataTable(list); + } + + /** + * 编辑物料明细 + */ + @ApiOperation("编辑物料明细") + @PostMapping("/edit") + public AjaxResult edit(@RequestBody ExecutionInMaterialDetailDTO inMaterialDetailDTO) + { + //转换实体 + ExecutionInMaterialDetailDO inMaterialDetailDO = inMaterialDetailAssembler.toDOByEdit(inMaterialDetailDTO); + if(inMaterialDetailDTO.getMaterialDetailId() != null){ + return toAjax(inMaterialDetailApplicationService.update(inMaterialDetailDO)); + }else { + return toAjax(inMaterialDetailApplicationService.insert(inMaterialDetailDO)); + } + } + + /** + * 批量删除物料明细 + */ + @ApiOperation("批量删除物料明细") + @DeleteMapping("/deleteByIds/{materialDetailIds}") + public AjaxResult delete(@PathVariable Long[] materialDetailIds) + { + return toAjax(inMaterialDetailApplicationService.delete(materialDetailIds)); + } + + /** + * 获取物料明细详细信息 + */ + @ApiOperation("获取物料明细") + @GetMapping(value = "/getInfo/{materialDetailId}") + public AjaxResult getInfo(@PathVariable("materialDetailId") Long materialDetailId) + { + return AjaxResult.success(inMaterialDetailApplicationService.getInfo(materialDetailId)); + } + + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java new file mode 100644 index 000000000..6426b6b74 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java @@ -0,0 +1,271 @@ +package com.mhd.oms.interfaces.facade.executionStockInOrder; + +import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; +import com.mhd.oms.domain.executionStockInOrder.repository.facade.IExecutionStockInOrderService; +import com.mhd.oms.domain.executionStockInOrder.repository.po.ExecutionStockInOrderPO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDO; +import com.mhd.oms.domain.executionStockInOrder.repository.todo.ExecutionStockInOrderDTO; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.DeliveryDataDTO; +import com.mhd.oms.domain.executionStockInOrder.repository.vo.StockInDataDTO; +import com.mhd.oms.domain.executionStockInOrder.service.ExecutionStockInOrderApplicationService; +import com.mhd.oms.domain.executionStockInOrder.service.ExecutionStockInOrderAssembler; +import com.mhd.system.api.domain.InMaterialDetailTZPD; +import com.mhd.system.api.domain.StockInOrderTZPD; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 入库单Api + * + * @author gen + * @date 2024-05-21 + */ +@RestController +@RequestMapping("/executionStockInOrderApi") +public class ExecutionStockInOrderApi extends BaseController { + @Autowired + private ExecutionStockInOrderApplicationService stockInOrderApplicationService; + + @Resource + private ExecutionStockInOrderAssembler stockInOrderAssembler; + @Autowired + private IExecutionStockInOrderService reservationStockInOrderService; + + /** + * 分页查询入库单列表 + */ + @ApiOperation("查询入库单列表") + @GetMapping("/list") + public TableDataInfo list(ExecutionStockInOrderDTO stockInOrderDTO) + { + //转换实体 + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + startPage(); + List list = stockInOrderApplicationService.queryList(stockInOrderDO); + return getDataTable(list); + } + + /** + * 编辑入库单 + */ + @ApiOperation("编辑入库单") + @PostMapping("/edit") + public AjaxResult edit(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) + { + //转换实体 + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDOByEdit(stockInOrderDTO); + if(stockInOrderDTO.getInOrderId() != null){ + return toAjax(stockInOrderApplicationService.update(stockInOrderDO)); + }else { + return toAjax(stockInOrderApplicationService.insert(stockInOrderDO)); + } + } + + /** + * 批量删除入库单 + */ + @ApiOperation("批量删除入库单") + @DeleteMapping("/deleteByIds/{inOrderIds}") + public AjaxResult delete(@PathVariable Long[] inOrderIds) + { + return toAjax(stockInOrderApplicationService.delete(inOrderIds)); + } + + /** + * 获取入库单详细信息 + */ + @ApiOperation("获取入库单") + @GetMapping(value = "/getInfo/{inOrderId}") + public AjaxResult getInfo(@PathVariable("inOrderId") Long inOrderId) + { + return AjaxResult.success(stockInOrderApplicationService.getInfo(inOrderId)); + } + + /** + * 导入入库单 + */ +// @ApiOperation("导入入库单") +// @PostMapping(value = "/importData") +// public AjaxResult importData( +// @RequestParam("file") MultipartFile file, +// @RequestParam("warehouseId") Long warehouseId, +// @RequestParam("warehouseCode") String warehouseCode, +// @RequestParam("warehouseName") String warehouseName) +// { +// return AjaxResult.success(stockInOrderApplicationService.importData(file, warehouseId, warehouseCode, warehouseName)); +// } + + /** + * 审核入库单 + */ + @ApiOperation("审核入库单") + @PostMapping(value = "/auditState") + public AjaxResult auditState(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.auditState(stockInOrderDO)); + } + + /** + * 下发入库单 + */ + @ApiOperation("执行入库单") + @PostMapping(value = "/issueOrder") + public AjaxResult issueOrder(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.issueOrder(stockInOrderDO)); + } + + /** + * 审核入库单 + */ + @ApiOperation("取消执行入库单") + @PostMapping(value = "/cancelAuditState") + public AjaxResult cancelAuditState(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.cancelAuditState(stockInOrderDO)); + } + + + /** + * wms回传出入库结果 + */ + @ApiOperation("wms回传出入库结果") + @GetMapping(value = "/returnResult") + public AjaxResult returnResult(@RequestParam("orderNumber") String orderNumber, @RequestParam("status") Long status, @RequestParam("type") String type) { + + return AjaxResult.success(stockInOrderApplicationService.returnResult(orderNumber, status, type)); + } + + + /** + * 取消入库单 + */ + @ApiOperation("取消入库单") + @PostMapping(value = "/cancelOrder") + public AjaxResult cancelOrder(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.cancelOrder(stockInOrderDO)); + } + + + /** + * 关闭入库单 + */ + @ApiOperation("关闭入库单") + @PostMapping(value = "/closeOrder") + public AjaxResult closeOrder(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) { + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.closeOrder(stockInOrderDO)); + } + + @ApiOperation("wms推送入库单") + @PostMapping(value = "/pushInOrder") + public AjaxResult pushInOrder(@RequestBody StockInOrderTZPD stockInOrder) { + return AjaxResult.success(stockInOrderApplicationService.pushInOrder(stockInOrder)); + } + + @ApiOperation("wms推送入库单明细") + @PostMapping(value = "/pushInOrderDetail") + public AjaxResult pushInOrderDetail(@RequestBody InMaterialDetailTZPD inMaterialDetail) { + return AjaxResult.success(stockInOrderApplicationService.pushInOrderDetail(inMaterialDetail)); + } + + /** + * 入仓通知单打印查询 + */ + @ApiOperation("入仓通知单打印查询") + @PostMapping("/queryNoticePrint") + public AjaxResult queryNoticePrint(@RequestBody ExecutionStockInOrderDTO stockInOrderDTO) { + List headerList = stockInOrderApplicationService.queryNoticePrint(stockInOrderDTO); + List detailList = stockInOrderApplicationService.queryNoticePrintDetail(stockInOrderDTO); + Map result = new HashMap<>(); + if (!headerList.isEmpty()) { + result.put("header", headerList.get(0)); + } + result.put("detailList", detailList); + return AjaxResult.success(result); + } + + + /** + * 上传并解析Excel文件 + * @param file Excel文件 + * @param sheetName 工作表名称(出库导入/参考数据) + * @return 解析后的出库数据 + */ + @PostMapping("/parseExcel") + public ResponseEntity> parseExcel( + @RequestParam("file") MultipartFile file) { + try { + DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, ""); + Map result = new HashMap<>(); + result.put("result", deliveryDataDTO); + result.put("code",200); + return new ResponseEntity<>(result, HttpStatus.OK); + } catch (IllegalArgumentException e) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + /** + * 接口1:仅解析Excel文件(返回解析结果,不保存) + * 用途:预览Excel解析数据 + */ + @PostMapping("/parse-excel") + public ResponseEntity> parseStockInExcel( + @RequestParam("file") MultipartFile file, + @RequestParam(value = "sheetName", required = false) String sheetName) { + try { + StockInDataDTO resultDTO = reservationStockInOrderService.parseStockInExcel(file, sheetName); + Map result = new HashMap<>(); + result.put("result", resultDTO); + result.put("code",200); + return new ResponseEntity<>(result, HttpStatus.OK); + } catch (IllegalArgumentException e) { + // 参数错误(如文件为空) +// LOGGER.error("Excel解析参数错误:{}", e.getMessage()); + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } catch (Exception e) { + // 其他解析异常 +// LOGGER.error("Excel解析失败:{}", e.getMessage(), e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + @ApiOperation("批量推送") + @PostMapping("/batchPush") + public AjaxResult batchPush(@RequestBody List idList){ + if(idList == null || idList.isEmpty()){ + return AjaxResult.error("没有数据需要推送"); + } + return stockInOrderApplicationService.batchPush(idList); + + } + + @ApiOperation("查询入库单列表") + @GetMapping("/list1") + public TableDataInfo list1(ExecutionStockInOrderDTO stockInOrderDTO) + { + //转换实体 + ExecutionStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + startPage(); + List list = stockInOrderApplicationService.queryList1(stockInOrderDO); + return getDataTable(list); + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java new file mode 100644 index 000000000..271db670f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java @@ -0,0 +1,243 @@ +package com.mhd.oms.interfaces.facade.executionStockOutOrder; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailPO; +import com.mhd.oms.domain.executionStockOutOrder.entity.ExecutionStockOutOrder; +import com.mhd.oms.domain.executionStockOutOrder.repository.facade.IExecutionStockOutOrderService; +import com.mhd.oms.domain.executionStockOutOrder.repository.po.ExecutionStockOutOrderPO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDO; +import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDTO; +import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderApplicationService; +import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderAssembler; +import com.mhd.system.api.domain.OutMaterialDetailTZPD; +import com.mhd.system.api.domain.StockOutOrderTZPD; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 出库单Api + * + * @author gen + * @date 2024-05-28 + */ +@Slf4j +@RestController +@RequestMapping("/executionStockOutOrderApi") +public class ExecutionStockOutOrderApi extends BaseController { + @Autowired + private ExecutionStockOutOrderApplicationService stockOutOrderApplicationService; + + @Resource + private ExecutionStockOutOrderAssembler stockOutOrderAssembler; + + @Autowired + private IExecutionStockOutOrderService stockOutOrderService; + + /** + * 分页查询出库单列表 + */ + @ApiOperation("查询出库单列表") + @GetMapping("/list") + public TableDataInfo list(ExecutionStockOutOrderDTO stockOutOrderDTO) + { + //转换实体 + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO); + startPage(); + List list = stockOutOrderApplicationService.queryList(stockOutOrderDO); + return getDataTable(list); + } + + + /** + * 编辑出库单 + */ + @ApiOperation("编辑出库单") + @PostMapping("/edit") + public AjaxResult edit(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) + { + //转换实体 + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDOByEdit(stockOutOrderDTO); + if(stockOutOrderDTO.getOutOrderId() != null){ + return toAjax(stockOutOrderApplicationService.update(stockOutOrderDO)); + }else { + return toAjax(stockOutOrderApplicationService.insert(stockOutOrderDO)); + } + } + + /** + * 批量删除出库单 + */ + @ApiOperation("批量删除出库单") + @DeleteMapping("/deleteByIds/{outOrderIds}") + public AjaxResult delete(@PathVariable Long[] outOrderIds) + { + return toAjax(stockOutOrderApplicationService.delete(outOrderIds)); + } + + /** + * 获取出库单详细信息 + */ + @ApiOperation("获取出库单") + @GetMapping(value = "/getInfo/{outOrderId}") + public AjaxResult getInfo(@PathVariable("outOrderId") Long outOrderId) + { + return AjaxResult.success(stockOutOrderApplicationService.getInfoChildren(outOrderId)); + } + /** + * 根据出库单号获取出库单详细信息 + */ + @ApiOperation("获取出库单") + @GetMapping(value = "/getInfoOutOrderNumber") + public AjaxResult getInfoOutOrderNumber(String outOrderNumber) + { + // 根据出库单号查询出库单,再按出库单ID查询详情,保证与出库管理页面一致 + ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(ExecutionStockOutOrder::getOutOrderNumber, outOrderNumber)); + if (stockOutOrder == null) { + return AjaxResult.error("出库单不存在"); + } + return AjaxResult.success(stockOutOrderApplicationService.getInfoChildren(stockOutOrder.getOutOrderId())); + } + + /** + * 根据来源单号/出库单号(orderNumber)获取出库单详细信息 + * 方便交接作业单等场景直接用 orderNumber 调用,内部仍然通过 outOrderNumber 精确匹配出库单 + */ + @ApiOperation("根据orderNumber获取出库单详情") + @GetMapping("/getInfoByOrderNumber") + public AjaxResult getInfoByOrderNumber(@RequestParam("orderNumber") String orderNumber) { + if (orderNumber == null || orderNumber.trim().isEmpty()) { + return AjaxResult.error("orderNumber不能为空"); + } + ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(ExecutionStockOutOrder::getOutOrderNumber, orderNumber)); + if (stockOutOrder == null) { + return AjaxResult.error("出库单不存在"); + } + return AjaxResult.success(stockOutOrderApplicationService.getInfoChildren(stockOutOrder.getOutOrderId())); + } + + + /** + * 审核出库单 + */ + @ApiOperation("审核出库单") + @PostMapping(value = "/auditState") + public AjaxResult auditState(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO); + return AjaxResult.success(stockOutOrderApplicationService.auditState(stockOutOrderDO)); + } + + /** + * 下发出库单 + */ + @ApiOperation("下发出库单") + @PostMapping(value = "/issueOrder") + public AjaxResult issueOrder(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO); + return AjaxResult.success(stockOutOrderApplicationService.issueOrder(stockOutOrderDO)); + } + + /** + * 审核出库单 + */ + @ApiOperation("审核出库单") + @PostMapping(value = "/cancelAuditState") + public AjaxResult cancelAuditState(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) { + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO); + return AjaxResult.success(stockOutOrderApplicationService.cancelAuditState(stockOutOrderDO)); + } + + @ApiOperation("关闭出库单") + @PostMapping("/close") + public AjaxResult close(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) + { + //转换实体 + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDOByEdit(stockOutOrderDTO); + return toAjax(stockOutOrderApplicationService.close(stockOutOrderDO)); + } + + + @ApiOperation("wms推送入库单") + @PostMapping(value = "/pushOutOrder") + public AjaxResult pushOutOrder(@RequestBody StockOutOrderTZPD stockOutOrder) { + return AjaxResult.success(stockOutOrderApplicationService.pushOutOrder(stockOutOrder)); + } + + @ApiOperation("wms推送入库单明细") + @PostMapping(value = "/pushOutOrderDetail") + public AjaxResult pushOutOrderDetail(@RequestBody OutMaterialDetailTZPD outMaterialDetail) { + return AjaxResult.success(stockOutOrderApplicationService.pushOutOrderDetail(outMaterialDetail)); + } + + /** + * 出库单提货单打印 + */ + @ApiOperation("出库单提货单打印") + @PostMapping("/queryOutStockNoticePrint") + public AjaxResult queryOutStockNoticePrint(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) { + List headerList = stockOutOrderApplicationService.queryOutStockNoticePrint(stockOutOrderDTO); + List detailList = stockOutOrderApplicationService.queryOutStockNoticePrintDetail(stockOutOrderDTO); + Map result = new HashMap<>(); + if (!headerList.isEmpty()) { + result.put("header", headerList.get(0)); + } + result.put("detailList", detailList); + return AjaxResult.success(result); + } + + + @ApiOperation("批量推送") + @PostMapping("/batchPush") + public AjaxResult batchPush(@RequestBody List idList){ + if(idList == null || idList.isEmpty()){ + return AjaxResult.error("没有数据需要推送"); + } + return stockOutOrderApplicationService.batchPush(idList); + + } + + @ApiOperation("批量推送") + @PostMapping("/batchPushByNumber") + public AjaxResult batchPushByNumber(@RequestBody List numberList){ + if(numberList == null || numberList.isEmpty()){ + return AjaxResult.error("没有数据需要推送"); + } + return stockOutOrderApplicationService.batchPushByNumber(numberList); + + } + + + @ApiOperation("退货") + @GetMapping("/returnGoods") + public AjaxResult returnGoods(@RequestParam("invoiceNumber") String invoiceNumber, @RequestParam("transportationNumber") String transportationNumber, @RequestParam("orderId") String orderId, @RequestParam("pictureUrl") String pictureUrl) { + if (invoiceNumber == null || invoiceNumber.trim().isEmpty()) { + return AjaxResult.error("发票编号不能为空"); + } + stockOutOrderApplicationService.returnGoods(invoiceNumber, transportationNumber, orderId, pictureUrl); + return AjaxResult.success(); + } + + + @ApiOperation("查询出库单列表") + @GetMapping("/list1") + public TableDataInfo list1(ExecutionStockOutOrderDTO stockOutOrderDTO) + { + //转换实体 + ExecutionStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO); + startPage(); + List list = stockOutOrderApplicationService.queryList1(stockOutOrderDO); + return getDataTable(list); + } + +} \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java index 018e91052..9795e5dc6 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java @@ -122,6 +122,13 @@ public class ReservationStockInOrderApi extends BaseController { /** * 下发入库单 */ + @ApiOperation("取消下发入库单") + @PostMapping(value = "/cancelIssueOrder") + public AjaxResult cancelIssueOrder(@RequestBody ReservationStockInOrderDTO stockInOrderDTO) { + ReservationStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.cancelIssueOrder(stockInOrderDO)); + } + @ApiOperation("下发入库单") @PostMapping(value = "/issueOrder") public AjaxResult issueOrder(@RequestBody ReservationStockInOrderDTO stockInOrderDTO) { @@ -129,6 +136,16 @@ public class ReservationStockInOrderApi extends BaseController { return AjaxResult.success(stockInOrderApplicationService.issueOrder(stockInOrderDO)); } + /** + * 下发入库单 + */ + @ApiOperation("下发入库单") + @PostMapping(value = "/executeAndIssue") + public AjaxResult executeAndIssue(@RequestBody ReservationStockInOrderDTO stockInOrderDTO) { + ReservationStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.executeAndIssue(stockInOrderDO)); + } + /** * wms回传出入库结果 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java index 95219a996..6e455959e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reserveStockInOrder/ReserveStockInOrderApi.java @@ -91,6 +91,9 @@ public class ReserveStockInOrderApi extends BaseController { { //转换实体 ReserveStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDOByEdit(stockInOrderDTO); + stockInOrderDO.setOrganizationId(stockInOrderDTO.getOrganizationId()); + stockInOrderDO.setOrganizationName(stockInOrderDTO.getOrganizationName()); + stockInOrderDO.setTopOrganizationId(stockInOrderDTO.getTopOrganizationId()); if(stockInOrderDTO.getInOrderId() != null){ return toAjax(stockInOrderApplicationService.update(stockInOrderDO)); }else { diff --git a/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml new file mode 100644 index 000000000..7a0150499 --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a.contract_fee , + a.monthly_warehouse_fee , + a.half_month_wh_fee , + a.discount_rate , + a.single_volume , + a.single_gross_weight , + a.lot_no , + a.material_detail_id, a.organization_id, a.organization_name, a.top_organization_id, a.unique_id, a.in_order_number, a.material_base_info_id, + a.material_code, a.material_name, a.bar_code, a.quantity, a.receipt_quantity, a.shelves_quantity, + a.receipt_status, a.shelves_status, a.pack_id, a.pack_code, a.pack_name,a.drink_date,a.fire_insure_fee, + CASE + WHEN a.pack_detail_id IS NULL OR TRIM(a.pack_detail_id) = '' THEN NULL + ELSE CAST(a.pack_detail_id AS BIGINT) + END as pack_detail_id, a.unit_code, a.unit_name, a.material_warehouse_control_id, a.serial_number_manage, a.quality_inspection_manage, + a.quality_inspection_stage, a.quality_inspection_rule, a.quality_inspection_ratio, a.quality_inspection_term, a.quality_inspection_results, a.allow_overcharge, + a.overcharge_ratio, a.batch_number, a.material_status_code, a.material_status_name, a.distribute_rule_id, a.distribute_rule_code, + a.distribute_rule_name, a.container_id, a.container_code, a.container_type, a.container_type_name, + a.warehouse_id, a.warehouse_code, a.warehouse_name, a.storage_section_id, a.storage_code, a.storage_name, a.storage_location_id, a.storage_location_code, a.storage_location_name, + a.level, a.parent_unique_id, a.remark, a.create_time, a.create_by,a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type, + a.SPECIFICATION_MODEL, a.SKU_CODE, a.INVOICE_NO, a.LITER, a.DIMENSIONS, a.DECLARATION_UNIT, a.BATCH_REF_NO, a.SHEET_REF_NO, + a.ORIGIN_COUNTRY, a.BOX_PALLET_NO, a.CURRENCY, a.UNIT, a.DECLARED_QUANTITY, a.BOX_COUNT, a.PIECE_COUNT, a.INBOUND_QUANTITY, + a.TOTAL_NET_WEIGHT, a.TOTAL_GROSS_WEIGHT, a.TOTAL_VOLUME, a.TOTAL_AREA, a.TOTAL_PRICE, + a.line_num_gw, + a.spec_gw, + a.unit_gw, + a.qty_gw, + a.erp_curr_gw, + a.erp_price_gw, + a.amount_gw, + a.in_order_number_gw, + a.in_line_num_gw, + a.PRODUCTION_DATE, a.EXPIRY_DATE, a.INVENTORY_DATE, a.EXT_ATTR_1, a.EXT_ATTR_2, a.EXT_ATTR_3, a.EXT_ATTR_4 + ,CASE + WHEN (a.quantity - a.receipt_quantity) < 0 THEN 0 + ELSE (a.quantity - a.receipt_quantity) + END AS wait_receipt_quantity, + CASE + WHEN (a.receipt_quantity - a.shelves_quantity) < 0 THEN 0 + ELSE (a.receipt_quantity - a.shelves_quantity) + END AS wait_shelves_quantity + + + + + and a.organization_id = #{organizationId} + + + and a.organization_name like concat('%', #{organizationName}, '%') + + + and a.top_organization_id = #{topOrganizationId} + + + and a.in_order_number = #{inOrderNumber} + + + and a.material_base_info_id = #{materialBaseInfoId} + + + and a.material_code = #{materialCode} + + + and a.material_name like concat('%', #{materialName}, '%') + + + and a.bar_code = #{barCode} + + + and a.quantity = #{quantity} + + + and a.receipt_quantity = #{receiptQuantity} + + + and a.shelves_quantity = #{shelvesQuantity} + + + and a.pack_id = #{packId} + + + and a.pack_code = #{packCode} + + + and a.pack_name like concat('%', #{packName}, '%') + + + and a.pack_detail_id = #{packDetailId} + + + and a.unit_code = #{unitCode} + + + and a.unit_name like concat('%', #{unitName}, '%') + + + and a.material_warehouse_control_id = #{materialWarehouseControlId} + + + and a.serial_number_manage = #{serialNumberManage} + + + and a.quality_inspection_manage = #{qualityInspectionManage} + + + and a.quality_inspection_stage = #{qualityInspectionStage} + + + and a.quality_inspection_rule = #{qualityInspectionRule} + + + and a.quality_inspection_term = #{qualityInspectionTerm} + + + and a.quality_inspection_results = #{qualityInspectionResults} + + + and a.allow_overcharge = #{allowOvercharge} + + + and a.overcharge_ratio = #{overchargeRatio} + + + and a.batch_number = #{batchNumber} + + + and a.material_status_code = #{materialStatusCode} + + + and a.material_status_name like concat('%', #{materialStatusName}, '%') + + + and a.distribute_rule_id = #{distributeRuleId} + + + and a.distribute_rule_code = #{distributeRuleCode} + + + and a.distribute_rule_name like concat('%', #{distributeRuleName}, '%') + + + and a.container_id = #{containerId} + + + and a.container_code = #{containerCode} + + + and a.container_type = #{containerType} + + + and a.container_type_name like concat('%', #{containerTypeName}, '%') + + + and a.create_by_name like concat('%', #{createByName}, '%') + + + and a.update_by_name like concat('%', #{updateByName}, '%') + + + and a.in_order_number in + + #{item} + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + + + + + and a.organization_id = #{organizationId} + + + and a.organization_name like concat('%', #{organizationName}, '%') + + + and a.top_organization_id = #{topOrganizationId} + + + and a.over_stock_status = #{overStockStatus} + + + and a.material_base_info_id = #{materialBaseInfoId} + + + and a.material_base_info_id in + + #{item} + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + + + + + and b.out_order_number = #{outOrderNumber} + + + and b.warehouse_id = #{warehouseId} + + + and b.shipper_id = #{shipperId} + + + and b.shipper_id in + + #{item} + + + + and date_format(b.expect_time,'%y%m%d') >= date_format(#{inOrderExpectStartTime},'%y%m%d') + + + and date_format(b.expect_time,'%y%m%d') <= date_format(#{inOrderExpectEndTime},'%y%m%d') + + + and b.order_type_code = #{outOrderTypeCode} + + + + and b.status = #{inStatus} + + + and b.del_flag = #{delFlag} + and b.del_flag = 1 + + + + + + + + + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml new file mode 100644 index 000000000..ece1200c9 --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml @@ -0,0 +1,451 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a.contract_fee , + a.monthly_warehouse_fee , + a.half_month_wh_fee , + a.discount_rate , + a.single_volume , + a.single_gross_weight , + a.lot_no , + a.stock_quantity , + a.stock_unit ,a.in_order_number , + a.material_detail_id, a.organization_id, a.organization_name, a.top_organization_id, a.unique_id, a.out_order_number, a.material_base_info_id, a.line_number, a.material_code, a.material_name, a.bar_code, a.weight_limit, a.volume_limit, + a.quantity, a.already_allocation_quantity, a.allocation_quantity, a.picking_quantity, a.check_quantity, ROUND(GREATEST(0, IFNULL(a.quantity, 0) - IFNULL(a.check_quantity, 0), IFNULL(a.picking_quantity, 0) - IFNULL(a.check_quantity, 0)), 2) AS wait_check_quantity, + a.pack_id, a.pack_code, a.pack_name, a.pack_detail_id, a.unit_code, a.unit_name, a.material_warehouse_control_id, a.serial_number_manage, + a.warehouse_id, a.warehouse_code, a.warehouse_name, a.storage_section_id, a.storage_code, a.storage_name, a.storage_location_id, a.storage_location_code, a.storage_location_name, a.level, a.parent_unique_id, a.allow_modify, + a.material_inventory_id, a.batch_number, a.container_id, a.container_code, a.container_type, a.container_type_name, a.material_status_code, a.material_status_name, + a.remark, a.create_time, a.create_by,gen_picking_order, + a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type, + a.COMMODITY_NAME, + a.COMMODITY_NO, + a.MATERIAL_NO , + a.SPECIFICATION_MODEL, + a.SKUCODE , + a.INVOICE_NO, + a.LITER, + a.SIZE, + a.DECLARE_UNIT, + a.BATCH_REF_NO, + a.SHEET_REF_NO, + a.COUNTRY_OF_ORIGIN, + a.BOX_PALLET_NO, + a.CURRENCY, + a.DECLARE_QUANTITY, + a.CASE_COUNT, + a.PIECE_COUNT, + a.OUTBOUND_QUANTITY, + a.TOTAL_NET_WEIGHT, + a.TOTAL_GROSS_WEIGHT, + a.TOTAL_VOLUME, + a.TOTAL_AREA, + a.TOTAL_AMOUNT, + a.UNIT, + a.EXT_ATTR_1, + a.EXT_ATTR_2, + a.PRODUCTION_DATE, + a.EXPIRY_DATE, + a.INVENTORY_DATE, + a.EXT_ATTR_3, + a.EXT_ATTR_4, + a.INVENTORY_QUANTITY, + a.line_num_gw, + a.spec_gw, + a.unit_gw, + a.qty_gw, + a.erp_curr_gw, + a.erp_price_gw, + a.amount_gw, + a.in_order_number_gw, + a.in_line_num_gw + + + + + and a.organization_id = #{organizationId} + + + and a.organization_name like concat('%', #{organizationName}, '%') + + + and a.top_organization_id = #{topOrganizationId} + + + and a.out_order_number = #{outOrderNumber} + + + and a.material_base_info_id = #{materialBaseInfoId} + + + and a.material_code = #{materialCode} + + + and a.material_name like concat('%', #{materialName}, '%') + + + and a.bar_code = #{barCode} + + + and a.quantity = #{quantity} + + + and a.allocation_quantity = #{allocationQuantity} + + + and a.picking_quantity = #{pickingQuantity} + + + and a.check_quantity = #{checkQuantity} + + + and a.pack_id = #{packId} + + + and a.pack_code = #{packCode} + + + and a.pack_name like concat('%', #{packName}, '%') + + + and a.pack_detail_id = #{packDetailId} + + + and a.unit_code = #{unitCode} + + + and a.unit_name like concat('%', #{unitName}, '%') + + + and a.material_warehouse_control_id = #{materialWarehouseControlId} + + + and a.serial_number_manage = #{serialNumberManage} + + + and a.warehouse_id = #{warehouseId} + + + and a.warehouse_code = #{warehouseCode} + + + and a.warehouse_name like concat('%', #{warehouseName}, '%') + + + and a.storage_section_id = #{storageSectionId} + + + and a.storage_code = #{storageCode} + + + and a.storage_name like concat('%', #{storageName}, '%') + + + and a.storage_location_id = #{storageLocationId} + + + and a.storage_location_code = #{storageLocationCode} + + + and a.storage_location_name like concat('%', #{storageLocationName}, '%') + + + and a.level = #{level} + + + and a.gen_picking_order = #{genPickingOrder} + + + and a.parent_unique_id = #{parentUniqueId} + + + and a.create_by_name like concat('%', #{createByName}, '%') + + + and a.update_by_name like concat('%', #{updateByName}, '%') + + + and a.out_order_number in + + #{item} + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + + + + + and a.organization_id = #{organizationId} + + + and a.organization_name like concat('%', #{organizationName}, '%') + + + and a.top_organization_id = #{topOrganizationId} + + + and a.over_stock_status = #{overStockStatus} + + + and a.material_base_info_id = #{materialBaseInfoId} + + + and a.material_base_info_id in + + #{item} + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + + + + + and b.out_order_number = #{outOrderNumber} + + + and b.warehouse_id = #{warehouseId} + + + and b.shipper_id = #{shipperId} + + + and b.shipper_id in + + #{item} + + + + and date_format(b.expect_time,'%y%m%d') >= date_format(#{outOrderExpectStartTime},'%y%m%d') + + + and date_format(b.expect_time,'%y%m%d') <= date_format(#{outOrderExpectEndTime},'%y%m%d') + + + and b.order_type_code = #{outOrderTypeCode} + + + + and b.status = #{outStatus} + + + and b.del_flag = #{delFlag} + and b.del_flag = 1 + + + + + + + + + UPDATE execution_out_material_detail + + allocation_quantity = CASE material_detail_id + + WHEN #{item.materialDetailId} THEN allocation_quantity + #{item.allocationQuantity} + + END, + update_by = #{item.updateBy}, + update_by_name = #{item.updateByName}, + update_time = now() + + WHERE material_detail_id IN + + #{item.materialDetailId} + + + + + UPDATE execution_out_material_detail + + picking_quantity = CASE material_detail_id + + WHEN #{item.materialDetailId} THEN picking_quantity + #{item.pickingQuantity} + + END, + update_by = #{updateBy}, + update_by_name = #{updateByName}, + update_time = now() + + WHERE material_detail_id IN + + #{item.materialDetailId} + + + + + UPDATE execution_out_material_detail + + picking_quantity = CASE unique_id + + WHEN #{item.uniqueId} THEN picking_quantity + #{item.pickingQuantity} + + END, + + + WHEN #{item.uniqueId} THEN picking_quantity + #{item.pickingQuantity} + + + update_by = #{updateBy}, + update_by_name = #{updateByName}, + update_time = now() + + WHERE unique_id IN + + #{item.uniqueId} + + + + + + + + + + + + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml new file mode 100644 index 000000000..e7482a7c2 --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml @@ -0,0 +1,652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a.in_order_id, a.organization_id, a.organization_name, a.top_organization_id, a.notice_number, a.in_order_number, a.status, + a.audit_status, a.audit_remark, a.audit_by, a.audit_by_name, a.audit_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_code, + a.shipper_name, a.order_type_code, a.order_type_name, a.supplier_id, a.supplier_code, a.supplier_name, a.expect_time, a.supply_chain_number, + a.priority_level_code, a.priority_level_name, a.direct_warehouse, a.annex_url, a.material_quantity, a.quantity,a.business_order_no,a.amount, + a.business_price_way,a.business_charge_type,a.total_warehouse_rent,a.manpower_fee,a.fire_insure_fee,a.discount,a.is_free_manpower_fee, + -- 计划入库数量:入库明细表 in_material_detail 的 quantity 汇总 + + + + + + + + + + + + + + + + + + + a.weight_limit, a.volume_limit, a.cancel_order, a.cancel_remark, a.cancel_by,a.PICTURE_URL, + a.cancel_by_name, a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.remark, a.create_time, a.create_by, + a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type, + a."TO", a.CONTACT_PERSON, a.VEHICLE_INFO, a.CONSIGNMENT_NO, a.TEL, a.DRIVER_SIGNATURE, a.FAX, a.DECLARATION_AREA, a.MANUFACTURER, + a.CUSTOMS_BROKER_INFO, a.DELIVERY_ADDRESS, a.ENTRY_EXIT_CUSTOMS, a.ORIGIN_DESTINATION_COUNTRY, a.CARRIER, a.CONTAINER_NO, + a.TRANSPORT_METHOD, a.SUPERVISION_METHOD, a.CUSTOMS_INSPECTION, a.NEED_CUSTOMS_DECLARATION, a.NEED_TRANSPORT, + a.WAREHOUSE_DATE, a.COMPLETION_TIME, a.ORDER_DATE,a.reservation_audit_time,a.reservation_audit_name + ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.RESERVATION_ORDER_SOURCE,a.tms_order_number + ,a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.STORAGE_TIME,a.in_quantity, + a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME + + + + ,b.notice_number, b.warehouse_id, b.warehouse_code, b.warehouse_name, b.shipper_id, b.shipper_code, b.shipper_name, + b.order_type_code, b.order_type_name, b.supplier_id, b.supplier_code, b.supplier_name, b.expect_time, b.supply_chain_number, b.priority_level_code, + b.priority_level_name, b.direct_warehouse, b.annex_url, b.material_quantity as in_order_material_quantity, b.quantity as in_order_quantity + + + + + + and b.notice_number = #{noticeNumber} + + + and b.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and b.warehouse_id = #{warehouseId} + + + and b.warehouse_code = #{warehouseCode} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.shipper_id = #{shipperId} + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and b.order_type_code = #{orderTypeCode} + + + and b.order_type_name like concat('%', #{orderTypeName}, '%') + + + and b.supplier_id = #{supplierId} + + + and b.supplier_name like concat('%', #{supplierName}, '%') + + + and b.expect_time = #{expectTime} + + + and b.supply_chain_number = #{supplyChainNumber} + + + and b.priority_level_code = #{priorityLevelCode} + + + and b.priority_level_name like concat('%', #{priorityLevelName}, '%') + + + and b.direct_warehouse = #{directWarehouse} + + + and b.annex_url = #{annexUrl} + + + and b.quantity = #{quantity} + + + + + + and a.organization_id = #{organizationId} + + + and a.tms_order_number like concat('%', #{tmsOrderNumber}, '%') + + + and a.organization_name like concat('%', #{organizationName}, '%') + + + and a.top_organization_id = #{topOrganizationId} + + + and a.notice_number = #{noticeNumber} + + + and a.in_order_number = #{inOrderNumber} + + + and a.status = #{status} + + + and a.status < #{ltStatus} + + + and a.status > #{gtStatus} + + + and a.audit_status = #{auditStatus} + + + and a.audit_status < #{ltAuditStatus} + + + and a.audit_status > #{gtAuditStatus} + + + and a.audit_remark = #{auditRemark} + + + and a.audit_by = #{auditBy} + + + and a.audit_by_name like concat('%', #{auditByName}, '%') + + + and a.audit_time = #{auditTime} + + + and a.issue_status = #{issueStatus} + + + and a.warehouse_id = #{warehouseId} + + + and a.warehouse_code = #{warehouseCode} + + + and a.warehouse_name like concat('%', #{warehouseName}, '%') + + + and a.shipper_id = #{shipperId} + + + and a.shipper_name like concat('%', #{shipperName}, '%') + + + and a.order_type_code = #{orderTypeCode} + + + and (a.BUSINESS_TYPE like concat('%', #{orderTypeName}, '%') or a.ORDER_TYPE_CODE like concat('%', #{orderTypeName}, '%')) + + + and a.supplier_id = #{supplierId} + + + and a.supplier_name like concat('%', #{supplierName}, '%') + + + and a.expect_time = #{expectTime} + + + and a.supply_chain_number = #{supplyChainNumber} + + + and a.priority_level_code = #{priorityLevelCode} + + + and a.priority_level_name like concat('%', #{priorityLevelName}, '%') + + + and a.direct_warehouse = #{directWarehouse} + + + and a.annex_url = #{annexUrl} + + + and a.quantity = #{quantity} + + + and a.cancel_order = #{cancelOrder} + + + and a.cancel_remark = #{cancelRemark} + + + and a.cancel_by = #{cancelBy} + + + and a.cancel_by_name like concat('%', #{cancelByName}, '%') + + + and a.cancel_time = #{cancelTime} + + + and a.close_order = #{closeOrder} + + + and a.close_remark = #{closeRemark} + + + and a.close_by = #{closeBy} + + + and a.close_by_name like concat('%', #{closeByName}, '%') + + + and a.close_time = #{closeTime} + + + and a.create_by_name like concat('%', #{createByName}, '%') + + + and a.update_by_name like concat('%', #{updateByName}, '%') + + + and a.in_order_id in + + #{item} + + + + + and a."TO" like concat('%', #{to}, '%') + + + and a.CONTACT_PERSON like concat('%', #{contactPerson}, '%') + + + and a.VEHICLE_INFO like concat('%', #{vehicleInfo}, '%') + + + and a.CONSIGNMENT_NO like concat('%', #{consignmentNo}, '%') + + + and a.TEL like concat('%', #{tel}, '%') + + + and a.DRIVER_SIGNATURE like concat('%', #{driverSignature}, '%') + + + and a.FAX like concat('%', #{fax}, '%') + + + and a.DECLARATION_AREA like concat('%', #{declarationArea}, '%') + + + and a.MANUFACTURER like concat('%', #{manufacturer}, '%') + + + and a.CUSTOMS_BROKER_INFO like concat('%', #{customsBrokerInfo}, '%') + + + and a.DELIVERY_ADDRESS like concat('%', #{deliveryAddress}, '%') + + + and a.ENTRY_EXIT_CUSTOMS like concat('%', #{entryExitCustoms}, '%') + + + and a.ORIGIN_DESTINATION_COUNTRY like concat('%', #{originDestinationCountry}, '%') + + + and a.CARRIER like concat('%', #{carrier}, '%') + + + and a.CONTAINER_NO = #{containerNo} + + + and a.TRANSPORT_METHOD = #{transportMethod} + + + and a.SUPERVISION_METHOD = #{supervisionMethod} + + + and a.CUSTOMS_INSPECTION = #{customsInspection} + + + and a.NEED_CUSTOMS_DECLARATION = #{needCustomsDeclaration} + + + and a.NEED_TRANSPORT = #{needTransport} + + + and a.WAREHOUSE_DATE = #{warehouseDate} + + + and a.COMPLETION_TIME = #{completionTime} + + + and a.ORDER_DATE = #{orderDate} + + + and a.create_time >= #{createTimeStart} + + + and a.create_time DATEADD(DAY, 1, #{createTimeEnd}) + + + and a.PUSH_TIME =]]> #{pushTimeFrom} + + + and a.PUSH_TIME #{pushTimeTo} + + + and a.create_time =]]> #{createTimeFrom} + + + and a.create_time #{createTimeTo} + + + and a.PUSH_STATUS = #{pushStatus} + + + and a.BUSINESS_TYPE = #{businessType} + + + and a.RESERVATION_ORDER_SOURCE = #{reservationOrderSource} + + + and a.BUSINESS_NUMBER = #{businessNumber} + + + and a.create_by_name like concat('%', #{createByName}, '%') + + + and a.storage_time >= #{storageTimeStart} + + + and a.storage_time DATEADD(DAY, 1, #{storageTimeEnd}) + + + and a.expect_time >= #{expectTimeStart} + + + and a.expect_time DATEADD(DAY, 1, #{expectTimeEnd}) + + + and a.issue_time is not null + + + and a.issue_time is null + + + + and exists ( + select 1 from in_material_detail imd + left join material_base_info mb on imd.material_base_info_id = mb.material_base_info_id and mb.del_flag = 1 + where imd.in_order_number = a.in_order_number + and imd.del_flag = 1 + and (imd.level is null or imd.level = 1) + + and ( + imd.material_name like concat('%', #{materialName}, '%') + or mb.material_name like concat('%', #{materialName}, '%') + ) + + + and ( + imd.material_code like concat('%', #{materialCode}, '%') + or mb.material_code like concat('%', #{materialCode}, '%') + ) + + ) + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update "NGWL_TEST_WLHY".tms_order set ORDER_STATUS = 9 where ID = #{orderId} + + + + update "NGWL_TEST_WLHY".TMS_TRANSPORT_NOTE set WAYBILL_STATUS =12 where TRANSPORTATION_NUMBER = #{transportationNumber} + + + + update "NGWL_TEST_WMS".stock_out_order set return_quantity = #{quantity} where out_order_number = #{orderNumber} + + + + + + + + + + + update "NGWL_TEST_WMS".stock_in_order set DEL_FLAG = 2 where DEL_FLAG = 1 and in_order_number = #{inOrderNumber} + + + + update "NGWL_TEST_WMS".IN_MATERIAL_DETAIL set DEL_FLAG = 2 where DEL_FLAG = 1 and in_order_number = #{inOrderNumber} + + + + update "NGWL_TEST_WMS".STOCK_RECEIPT_ORDER set DEL_FLAG = 2 where DEL_FLAG = 1 and in_order_number = #{inOrderNumber} + + + + + + update "NGWL_TEST_WMS".RECEIPT_MATERIAL_DETAIL set DEL_FLAG = 2 where DEL_FLAG = 1 and RECEIPT_ORDER_NUMBER = #{receiptOrderNumber} + + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml new file mode 100644 index 000000000..fa08ade8e --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml @@ -0,0 +1,477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a.out_order_id, a.organization_id, a.organization_name, a.top_organization_id, a.receipt_notice_id, a.notice_number, a.out_order_number, a.status, + a.audit_status, a.audit_remark, a.audit_by, a.audit_by_name, a.audit_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_code, + a.shipper_name, a.order_type_code, a.order_type_name, a.customer_id, a.customer_code, a.customer_name, a.expect_time, a.supply_chain_number, a.priority_level_code, + a.priority_level_name, a.direct_warehouse, a.review, a.annex_url, a.material_quantity, a.quantity, a.weight_limit, a.volume_limit, a.check_quantity, a.cancel_order, a.cancel_remark, a.cancel_by, a.cancel_by_name, + a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.check_status,a.BUSINESS_ORDER_NO, + a.check_task_distribution, a.check_task_distribution_time, a.check_operators_by, a.check_operators_name, a.mobilize_code, + a.remark, a.create_time, a.create_by, a.create_by_name,a.business_number,a.train_no,a.amount, + a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type,a."TO", + a.CONTACT_PERSON,a.VEHICLE_MODEL_PLATE,a.ENTRUST_NO,a.TEL,a.DRIVER_SIGN,a.FAX,a.DECLARE_CUSTOMS,a.MANUFACTURER, + a.CUSTOMS_DECLARER_INFO,a.DELIVERY_ADDR,a.ENTRY_EXIT_CUSTOMS,a.DEPARTURE_ARRIVAL_COUNTRY,a.CARRIER,a.CONTAINER_NO,a.CONTAINER_NO_NAME,a.OUTBOUND_DATE, + a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME, + a.CUSTOMS_INSPECTION_FLAG,a.NEED_DECLARE_FLAG,a.NEED_TRANSPORT_FLAG,a.picture_app,a.reservation_audit_time,a.reservation_audit_name + ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number, + a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RETURN_QUANTITY,a.DELIVERY_NAME,a.CUSTOMER_NUMBER,a.INVOICE_NUMBER,a.RETURN_ORDER_NUMBER,a.TOTAL_AMOUNT, + a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME + + + + + ,b.notice_number, b.out_order_number, b.warehouse_id, b.warehouse_code, b.warehouse_name, b.shipper_id, b.shipper_code, + b.shipper_name, b.order_type_code, b.order_type_name, b.customer_id, b.customer_name, b.expect_time, b.supply_chain_number, b.priority_level_code, + b.priority_level_name, b.direct_warehouse, b.review, b.annex_url, b.quantity + + + + ,b.notice_number, b.out_order_number, b.warehouse_id, b.warehouse_code, b.warehouse_name, b.shipper_id, b.shipper_code, + b.shipper_name, b.order_type_code, b.order_type_name, b.customer_id, b.customer_name, b.expect_time, b.supply_chain_number, b.priority_level_code, + b.priority_level_name, b.direct_warehouse, b.review, b.annex_url + + + + + and a.out_order_id = #{outOrderId} + + + and a.tms_order_number like concat('%', #{tmsOrderNumber}, '%') + + + and a.organization_name like concat('%', #{organizationName}, '%') + + + and a.top_organization_id = #{topOrganizationId} + + + and a.notice_number = #{noticeNumber} + + + and a.out_order_number like concat('%', #{outOrderNumber}, '%') + + + + + + + and a.status IN (3, 4, 5, 6, 7, 8) + + + and a.status = #{status} + + + + + + and a.status > #{gtStatus} + + + and a.status < #{ltStatus} + + + and a.audit_status = #{auditStatus} + + + and a.audit_remark = #{auditRemark} + + + and a.check_task_distribution = #{checkTaskDistribution} + + + and a.issue_status = #{issueStatus} + + + and a.audit_by = #{auditBy} + + + and a.audit_by_name like concat('%', #{auditByName}, '%') + + + and a.audit_time = #{auditTime} + + + and a.warehouse_id = #{warehouseId} + + + and a.warehouse_code = #{warehouseCode} + + + and a.warehouse_name like concat('%', #{warehouseName}, '%') + + + and a.shipper_id = #{shipperId} + + + and a.shipper_name like concat('%', #{shipperName}, '%') + + + and a.order_type_code = #{orderTypeCode} + + + and a.customer_id = #{customerId} + + + and a.customer_name like concat('%', #{customerName}, '%') + + + and a.expect_time = #{expectTime} + + + and a.supply_chain_number = #{supplyChainNumber} + + + and a.priority_level_code = #{priorityLevelCode} + + + and a.priority_level_name like concat('%', #{priorityLevelName}, '%') + + + and a.direct_warehouse = #{directWarehouse} + + + and a.review = #{review} + + + and a.annex_url = #{annexUrl} + + + and a.quantity = #{quantity} + + + and a.cancel_order = #{cancelOrder} + + + and a.cancel_remark = #{cancelRemark} + + + and a.cancel_by = #{cancelBy} + + + and a.cancel_by_name like concat('%', #{cancelByName}, '%') + + + and a.cancel_time = #{cancelTime} + + + and a.close_order = #{closeOrder} + + + and a.close_remark = #{closeRemark} + + + and a.close_by = #{closeBy} + + + and a.close_by_name like concat('%', #{closeByName}, '%') + + + and a.close_time = #{closeTime} + + + and a.check_status = #{checkStatus} + + + and a.check_status > #{gtCheckStatus} + + + and a.check_status < #{ltCheckStatus} + + + and a.update_by_name like concat('%', #{updateByName}, '%') + + + and a.check_operators_by = #{checkOperatorsBy} + + + and a.out_order_id in + + #{item} + + + + and date_format(a.audit_time,'%Y-%m-%d') >= #{auditTimeStart} + + + and date_format(a.audit_time,'%Y-%m-%d') <= #{auditTimeEnd} + + + and a.NEED_DECLARE_FLAG = #{needDeclareFlag} + + + and a.PUSH_TIME =]]> #{pushTimeFrom} + + + and a.PUSH_TIME #{pushTimeTo} + + + and a.create_time =]]> #{createTimeFrom} + + + and a.create_time #{createTimeTo} + + + and a.PUSH_STATUS = #{pushStatus} + + + and a.BUSINESS_NUMBER = #{businessNumber} + + + and a.BUSINESS_TYPE = #{businessType} + + + and a.ISSUE_STATUS = #{issueStatus} + + + and a.RESERVATION_ORDER_SOURCE = #{reservationOrderSource} + + + and a.NEED_TRANSPORT_FLAG = #{needTransportFlag} + + + and a.create_by_name like concat('%', #{createByName}, '%') + + + and a.create_time >= #{createTimeStart} + + + and a.create_time DATEADD(DAY, 1, #{createTimeEnd}) + + + and a.outbound_date >= #{outboundDateStart} + + + and a.outbound_date DATEADD(DAY, 1, #{outboundDateEnd}) + + + and a.organization_id = #{organizationId} + + + and (a.BUSINESS_TYPE like concat('%', #{orderTypeName}, '%') or a.ORDER_TYPE_CODE like concat('%', #{orderTypeName}, '%')) + + + and a.issue_time is not null + + + and a.issue_time is null + + + + + + + + + + + + + + + + + + + + + + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update "NGWL_TEST_WMS".stock_out_order set DEL_FLAG = 2 where DEL_FLAG = 1 and out_order_number = #{outOrderNumber} + + + + update "NGWL_TEST_WMS".out_material_detail set DEL_FLAG = 2 where DEL_FLAG = 1 and out_order_number = #{outOrderNumber} + + + \ 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 1f315b9af..5d6171409 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -538,6 +538,23 @@ select CUSTOMER_NC_CODE from "NGWL_TEST_USER".USER_SHIPPER where 1 = 1 and DEL_FLAG = 1 and USER_ID = #{id} limit 1 + + + + + + + + SELECT + SETTLEMENT_CURRENCY + FROM NGWL_TEST_USER.USER_SHIPPER + WHERE del_flag = 1 + AND USER_ID = #{id} limit 1 + + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/sysTableConfig/SysTableConfigMapper.xml b/mhd_oms/src/main/resources/mapper/sysTableConfig/SysTableConfigMapper.xml index 17b2db70d..ae8714dba 100644 --- a/mhd_oms/src/main/resources/mapper/sysTableConfig/SysTableConfigMapper.xml +++ b/mhd_oms/src/main/resources/mapper/sysTableConfig/SysTableConfigMapper.xml @@ -55,7 +55,8 @@ a.organization_id AS organizationId, a.key AS key, a.value AS value, - a.remark AS remark + a.remark AS remark, + a.IS_MULTI_WAREHOUSE AS isMultiWarehouse FROM sys_table_config a WHERE 1=1 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 2046586fb..2c188f6a9 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 @@ -28,6 +28,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; @@ -93,8 +94,10 @@ public class AppMenuApplicationService { appMenuDO.setTopOrganizationId(SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId()); } List menuPos = appMenuDomainService.queryMenuListByApp(appMenuDO); - // 车队主管显示「订单调度」;业务主管显示「订单审核」 + // 获取用户角色 → 查角色APP菜单权限 → 取交集去重 List userRoles = userFeignService.selectUserRoles(appMenuDO.getUserId()); + menuPos = filterMenuByUserRole(menuPos, userRoles); + // 车队主管显示「订单调度」;业务主管显示「订单审核」 menuPos = filterMenuByRole(menuPos, userRoles); //判断控制推广码是否显示 if (menuPos != null){ @@ -108,6 +111,39 @@ public class AppMenuApplicationService { return menuPos; } + /** + * 在APP配置菜单基础上,根据用户角色取集合,去除重复菜单 + */ + private List filterMenuByUserRole(List appMenus, List userRoles) { + if (appMenus == null || appMenus.isEmpty() || userRoles == null || userRoles.isEmpty()) { + return appMenus != null ? appMenus : new ArrayList<>(); + } + // 获取用户所有角色ID + List roleIds = userRoles.stream() + .map(UserRoleMenuPO::getRoleId) + .filter(id -> id != null) + .distinct() + .collect(Collectors.toList()); + if (roleIds.isEmpty()) { + return appMenus; + } + // 查询角色对应的APP菜单权限(role_menu表中roleMenuClient=2的) + R> roleMenuR = userServiceFeign.roleAppMenuListByRoleIds(roleIds); + if (R.FAIL == roleMenuR.getCode() || roleMenuR.getData() == null || roleMenuR.getData().isEmpty()) { + return appMenus; + } + // 取角色菜单ID集合 + Set roleMenuIds = roleMenuR.getData().stream() + .map(UserRoleMenuPO::getMenuId) + .filter(id -> id != null) + .collect(Collectors.toSet()); + // 过滤:只保留APP配置菜单中也在角色权限中的菜单 + return appMenus.stream() + .filter(menu -> menu.getMenuId() != null && roleMenuIds.contains(menu.getMenuId())) + .distinct() + .collect(Collectors.toList()); + } + /** * 按角色过滤互斥菜单: * 车队主管隐藏「订单审核」;业务主管隐藏「订单调度」 diff --git a/mhd_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 5e935251b..521cfaa6f 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/src/main/resources/bootstrap.yml @@ -19,16 +19,17 @@ spring: nacos: 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.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.33.0.129:6010 + # 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.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_transport/src/main/resources/bootstrap.yml b/mhd_transport/src/main/resources/bootstrap.yml index ce83be4fa..f657b93be 100644 --- a/mhd_transport/src/main/resources/bootstrap.yml +++ b/mhd_transport/src/main/resources/bootstrap.yml @@ -20,8 +20,8 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置使用ip+端口号 - 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.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -33,14 +33,14 @@ spring: config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置使用ip+端口号 -# server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.31:6848 # username: nacos # password: manhuoda@2023 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 # server-addr: 10.102.192.105:6848 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java index e74ed185d..c30840c5f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialBaseInfo/MaterialBaseInfoApplicationService.java @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.mhd.common.core.domain.po.UserPo; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.enums.DictCode; @@ -54,13 +56,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -158,6 +154,8 @@ public class MaterialBaseInfoApplicationService { } } } + materialBaseInfoDO.setOrgId(String.valueOf(materialBaseInfoDO.getOrganizationId())); + materialBaseInfoDO.setOrganizationId(null); List materialBaseInfoPOS = materialBaseInfoDomainService.queryList(materialBaseInfoDO); for (MaterialBaseInfoPO materialBaseInfoPO : materialBaseInfoPOS) { //物料商品规则 @@ -251,6 +249,31 @@ public class MaterialBaseInfoApplicationService { } } } + Long shipperId = materialBaseInfoDO.getShipperId(); + String customerCodeNcJson = materialBaseInfoMapper.getCustomerCodeNcJson(shipperId.toString()); + if (customerCodeNcJson != null && !customerCodeNcJson.isEmpty()) { + ObjectMapper objectMapper = new ObjectMapper(); + List> listNc = null; + try { + listNc = objectMapper.readValue( + customerCodeNcJson, + new com.fasterxml.jackson.core.type.TypeReference>>() {} + ); + String codeStr = ""; + if (listNc != null && listNc.size() > 0) { + // 方式1:Stream拼接,逗号分隔 + codeStr = listNc.stream() + .map(map -> map.get("code")) + .filter(Objects::nonNull) // 过滤code为空 + .map(Object::toString) + .collect(Collectors.joining(",")); + materialBaseInfoDO.setOrgId(codeStr); + } + // codeStr 就是拼接好的字符串 + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } Long materialBaseInfoId = materialBaseInfoDomainService.insert(materialBaseInfoDO); materialBaseInfoDO.setMaterialBaseInfoId(materialBaseInfoId); //商品规则 @@ -282,6 +305,31 @@ public class MaterialBaseInfoApplicationService { * 修改物料基础信息 */ public Boolean update(MaterialBaseInfoDO materialBaseInfoDO) { + Long shipperId = materialBaseInfoDO.getShipperId(); + String customerCodeNcJson = materialBaseInfoMapper.getCustomerCodeNcJson(shipperId.toString()); + if (customerCodeNcJson != null && !customerCodeNcJson.isEmpty()) { + ObjectMapper objectMapper = new ObjectMapper(); + List> listNc = null; + try { + listNc = objectMapper.readValue( + customerCodeNcJson, + new com.fasterxml.jackson.core.type.TypeReference>>() {} + ); + String codeStr = ""; + if (listNc != null && listNc.size() > 0) { + // 方式1:Stream拼接,逗号分隔 + codeStr = listNc.stream() + .map(map -> map.get("code")) + .filter(Objects::nonNull) // 过滤code为空 + .map(Object::toString) + .collect(Collectors.joining(",")); + materialBaseInfoDO.setOrgId(codeStr); + } + // codeStr 就是拼接好的字符串 + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } materialBaseInfoDomainService.update(materialBaseInfoDO); Long materialBaseInfoId = materialBaseInfoDO.getMaterialBaseInfoId(); // 商品/公共/仓控 子表:Feign/前端常只带业务字段、未带子表主键,需按 material_base_info_id 补全后再 update,否则 WHERE xxx_id=? 为 null 导致 Updates: 0 @@ -557,6 +605,31 @@ public class MaterialBaseInfoApplicationService { MaterialBaseInfo matched = findExistingMaterialByShipper(row); if (matched != null) { row.setShipperId(matched.getShipperId()); + Long shipperId = matched.getShipperId(); + String customerCodeNcJson = materialBaseInfoMapper.getCustomerCodeNcJson(shipperId.toString()); + if (customerCodeNcJson != null && !customerCodeNcJson.isEmpty()) { + ObjectMapper objectMapper = new ObjectMapper(); + List> listNc = null; + try { + listNc = objectMapper.readValue( + customerCodeNcJson, + new com.fasterxml.jackson.core.type.TypeReference>>() {} + ); + String codeStr = ""; + if (listNc != null && listNc.size() > 0) { + // 方式1:Stream拼接,逗号分隔 + codeStr = listNc.stream() + .map(map -> map.get("code")) + .filter(Objects::nonNull) // 过滤code为空 + .map(Object::toString) + .collect(Collectors.joining(",")); + row.setOrgId(codeStr); + } + // codeStr 就是拼接好的字符串 + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } if (StringUtils.isBlank(row.getShipperCode())) { row.setShipperCode(matched.getShipperCode()); } @@ -798,6 +871,31 @@ public class MaterialBaseInfoApplicationService { return; } row.setShipperId(userPo.getUserId()); + Long shipperId = userPo.getUserId(); + String customerCodeNcJson = materialBaseInfoMapper.getCustomerCodeNcJson(shipperId.toString()); + if (customerCodeNcJson != null && !customerCodeNcJson.isEmpty()) { + ObjectMapper objectMapper = new ObjectMapper(); + List> listNc = null; + try { + listNc = objectMapper.readValue( + customerCodeNcJson, + new com.fasterxml.jackson.core.type.TypeReference>>() {} + ); + String codeStr = ""; + if (listNc != null && listNc.size() > 0) { + // 方式1:Stream拼接,逗号分隔 + codeStr = listNc.stream() + .map(map -> map.get("code")) + .filter(Objects::nonNull) // 过滤code为空 + .map(Object::toString) + .collect(Collectors.joining(",")); + row.setOrgId(codeStr); + } + // codeStr 就是拼接好的字符串 + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } if (!isValidOrgId(row.getOrganizationId()) && isValidOrgId(userPo.getOrganizationId())) { row.setOrganizationId(userPo.getOrganizationId()); } @@ -1266,4 +1364,4 @@ public class MaterialBaseInfoApplicationService { return tableDataInfo; } -} +} \ No newline at end of file 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 26b17212a..1dcf34741 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 @@ -842,6 +842,17 @@ public class StockOutOrderApplicationService { return stockOutOrderDomainService.auditState(stockOutOrderDO); } + public Boolean execution(String outOrderNumber){ + //Boolean execution = stockOutOrderDomainService.execution(outOrderNumber); + StockOutOrderDO stockOutOrderDO = new StockOutOrderDO(); +// stockOutOrderDO.setOutOrderNumber(outOrderNumber); + List numbers = new ArrayList<>(); + numbers.add(outOrderNumber); + stockOutOrderDO.setOutOrderNumbers(numbers); + Boolean b = omsAutoAssign(stockOutOrderDO); + return b; + } + /** * @description 手动分配 * @author ZhouGY @@ -934,6 +945,82 @@ public class StockOutOrderApplicationService { return result; } + + public Boolean omsAutoAssign(StockOutOrderDO stockOutOrderDO){ + List outOrderNumbers = stockOutOrderDO.getOutOrderNumbers(); + if (outOrderNumbers == null || outOrderNumbers.isEmpty()){ + throw new ServiceException("出库单ID不能为空"); + } + Boolean result = true; + for (String outOrderNumber : outOrderNumbers){ + StockOutOrderDO stockOutOrderD = new StockOutOrderDO(); + StockOutOrder stockOutOrderDb = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1), false); + if (stockOutOrderDb == null){ + throw new ServiceException("出库单不存在"); + } + BeanUtils.copyProperties(stockOutOrderDb, stockOutOrderD); + List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber())); + List materialDetailList = cn.hutool.core.bean.BeanUtil.copyToList(outMaterialDetailList, OutMaterialDetailDO.class); + List materialDetailList2 = new ArrayList<>(); + for (OutMaterialDetailDO detail : materialDetailList) { +// String batchRefNo = detail.getBatchRefNo(); +// String sheetRefNo = detail.getSheetRefNo(); +// String boxPalletNo = detail.getBoxPalletNo(); + Long materialBaseInfoId = detail.getMaterialBaseInfoId(); + Long warehouseId = detail.getWarehouseId(); + List materialInventories = materialInventoryMapper.selectList(new QueryWrapper().lambda() +// .eq(MaterialInventory::getBatchRefNo, batchRefNo) +// .eq(MaterialInventory::getSheetRefNo, sheetRefNo) +// .eq(MaterialInventory::getBoxPalletNo, boxPalletNo) + .eq(MaterialInventory::getWarehouseId, warehouseId) + .eq(MaterialInventory::getMaterialBaseInfoId, materialBaseInfoId)); +// if (materialInventories == null || materialInventories.isEmpty()) { +// throw new ServiceException("库存不存在:" + batchRefNo + " " + sheetRefNo + " " + boxPalletNo); +// } + + BigDecimal remainingQuantity = detail.getQuantity(); // 计划数量 + for (MaterialInventory materialInventory : materialInventories) { + if (remainingQuantity.compareTo(BigDecimal.ZERO) <= 0) { + break; + } + // 当前物料的可用库存 + BigDecimal availableStock = materialInventory.getAllocationQuantity(); + // 如果当前物料没有库存,跳过 + if (availableStock == null || availableStock.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + // 计算本次能扣减的数量:取 剩余计划 和 当前库存 的较小值 + BigDecimal deductQuantity = remainingQuantity.compareTo(availableStock) <= 0 + ? remainingQuantity // 剩余计划 <= 库存,扣剩余计划 + : availableStock; // 剩余计划 > 库存,扣全部库存 + + detail.setMaterialInventoryId(materialInventory.getMaterialInventoryId()); + detail.setStorageLocationId(materialInventory.getStorageLocationId()); + detail.setStorageLocationName(materialInventory.getStorageLocationName()); + detail.setStorageLocationCode(materialInventory.getStorageLocationCode()); + detail.setStorageSectionId(materialInventory.getStorageSectionId()); + detail.setStorageName(materialInventory.getStorageName()); + detail.setStorageCode(materialInventory.getStorageCode()); + detail.setInventoryQuantity(materialInventory.getInventoryQuantity()); + detail.setAllocationQuantity(deductQuantity); + materialDetailList2.add(detail); + // 更新剩余计划数量 + remainingQuantity = remainingQuantity.subtract(deductQuantity); + } + } + stockOutOrderD.setMaterialDetailList(materialDetailList2); + StockOutOrderDO assembleStockOutOrderDO = assembleParamByOutOrder(stockOutOrderD); + Boolean assignResult = stockOutOrderDomainService.autoAssign(assembleStockOutOrderDO); + if (!assignResult) { + result = false; + } + } + return result; + } + /*public Boolean autoAssign(StockOutOrderDO stockOutOrderDO){ StockOutOrderDO assembleStockOutOrderDO = assembleParamByOutOrder(stockOutOrderDO); return stockOutOrderDomainService.autoAssign(assembleStockOutOrderDO); @@ -1036,6 +1123,34 @@ public class StockOutOrderApplicationService { return b; } + public Boolean genPickingOrderByOms(StockOutOrderDO stockOutOrderDO){ + Boolean b = stockOutOrderDomainService.genPickingOrderByOms(stockOutOrderDO); +// List outOrderIds = stockOutOrderDO.getOutOrderIds(); +// if (outOrderIds != null && !outOrderIds.isEmpty()) { +// StockOutOrder order = stockOutOrderService.getById(outOrderIds.get(0)); +// String needDeclareFlag = order.getNeedDeclareFlag(); +// Long organizationId = order.getOrganizationId(); +// try { +// if (needDeclareFlag != null && "1".equals(needDeclareFlag) && organizationId != null) { +// if (organizationId == 2830) { +// Long outOrderId = order.getOutOrderId(); +// List ids = new ArrayList<>(); +// ids.add(outOrderId); +// //batchPush(ids); +// } else { +// String outOrderId = order.getOutOrderNumber(); +// List ids = new ArrayList<>(); +// ids.add(outOrderId); +// //omsServiceFeign.batchPushByNumber(ids); +// } +// } +// } catch (Exception e) { +// throw new ServiceException("生成报关单失败"); +// } +// } + return b; + } + /** * 获取出库单复核详细信息 */ @@ -1487,6 +1602,10 @@ public class StockOutOrderApplicationService { stockOutOrderDomainService.omsOrderAdd(stockOutOrder); } + public void cancelExecutionOrder(StockOutOrder stockOutOrder){ + stockOutOrderDomainService.cancelExecutionOrder(stockOutOrder); + } + public void omsOrderAddDetail(List outMaterialDetails){ stockOutOrderDomainService.omsOrderAddDetail(outMaterialDetails); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/facade/IHandoverTaskOrderService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/facade/IHandoverTaskOrderService.java index 7e44d5aec..1909f7ae8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/facade/IHandoverTaskOrderService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/facade/IHandoverTaskOrderService.java @@ -44,4 +44,10 @@ public interface IHandoverTaskOrderService extends IService boolean taskDistribution(HandoverTaskOrderDO handoverTaskOrderDO); public void updateOmsOrder(String orderNumber, Integer status); + + public void updateOmsExecutionOrder(String orderNumber, Integer status); + + public Integer getExecutionRkCount(String orderNumber); + + public String getBusinessOrdernumber(String orderNumber); } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/mapper/HandoverTaskOrderMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/mapper/HandoverTaskOrderMapper.java index 7f3ccd086..0af21184d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/mapper/HandoverTaskOrderMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/mapper/HandoverTaskOrderMapper.java @@ -23,4 +23,9 @@ public interface HandoverTaskOrderMapper extends BaseMapper public void updateOmsOrder(@Param("orderNumber") String orderNumber, @Param("status") Integer status); + public void updateOmsExecutionOrder(@Param("orderNumber") String orderNumber, @Param("status") Integer status); + + public Integer getExecutionRkCount(@Param("orderNumber") String orderNumber); + + public String getBusinessOrdernumber(@Param("orderNumber") String orderNumber); } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java index e379d06e9..58b9e34fe 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java @@ -94,6 +94,21 @@ public class HandoverTaskOrderImpl extends ServiceImpl 0) { + if (businessOrdernumber != null) handoverTaskOrderService.updateOmsOrder(businessOrdernumber,5); + } else { + if (businessOrdernumber != null) handoverTaskOrderService.updateOmsOrder(businessOrdernumber,4); + } } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java index 6610535ca..127ea97b2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/entity/MaterialBaseInfo.java @@ -237,4 +237,7 @@ public class MaterialBaseInfo extends BaseVOEntity { @ApiModelProperty(name = "单位") private String unit; + @ApiModelProperty(name = "组织(多个用,分开)") + private String orgId; + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/mapper/MaterialBaseInfoMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/mapper/MaterialBaseInfoMapper.java index 7a4ef0737..ea427d695 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/mapper/MaterialBaseInfoMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/mapper/MaterialBaseInfoMapper.java @@ -25,4 +25,5 @@ public interface MaterialBaseInfoMapper extends BaseMapper List selectBatchByIds(@Param("materialBaseInfoIds") List materialBaseInfoIds); -} + String getCustomerCodeNcJson(@Param("actualInvoiceCustomerId") String actualInvoiceCustomerId); +} \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java index 19953912e..a07dbd095 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/po/MaterialBaseInfoPO.java @@ -286,4 +286,7 @@ public class MaterialBaseInfoPO extends BaseVOEntity { @ApiModelProperty(name = "单位") private String unit; + + @ApiModelProperty(name = "组织(多个用,分开)") + private String orgId; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java index 941462c72..4f12be185 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/repository/todo/MaterialBaseInfoDO.java @@ -259,4 +259,7 @@ public class MaterialBaseInfoDO extends BaseVOEntity { @ApiModelProperty(name = "单位") private String unit; + + @ApiModelProperty(name = "组织(多个用,分开)") + private String orgId; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryQueryListDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryQueryListDO.java index b1213a20f..4b26a1140 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryQueryListDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryQueryListDO.java @@ -255,5 +255,7 @@ public class MaterialInventoryQueryListDO extends MaterialBaseDO { /** 为 true 时 SQL 排除库存数量为 0(含 null 视为 0) */ private Boolean excludeZeroInventoryQuantity; - + private String expiryDateStr; + private String productionDateStr; + private String updateTimeStr; } \ No newline at end of file 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 52af94400..1cbe42c5e 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 @@ -598,6 +598,7 @@ public class OutMaterialDetailImpl extends ServiceImpl outOrderIds; + @ApiModelProperty("出库单number集合") + private List outOrderNumbers; + @ApiModelProperty("物料明细") private List materialDetailList; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index 2186d7e09..bbf2a58b3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -26,6 +27,8 @@ import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrder import com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; +import com.mhd.wms.domain.inventoryAdjustmentRecord.entity.InventoryAdjustmentRecord; +import com.mhd.wms.domain.inventoryAdjustmentRecord.repository.facade.IInventoryAdjustmentRecordService; import com.mhd.wms.domain.inventoryStandingDetail.repository.facade.IInventoryStandingDetailService; import com.mhd.wms.domain.inventoryStandingDetail.repository.todo.InventoryStandingDetailDO; import com.mhd.wms.domain.materialBarCode.repository.facade.IMaterialBarCodeService; @@ -34,6 +37,7 @@ import com.mhd.wms.domain.materialBaseInfo.entity.MaterialBaseInfo; import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService; import com.mhd.wms.domain.materialBaseInfo.repository.mapper.MaterialBaseInfoMapper; import com.mhd.wms.domain.materialBaseInfo.repository.po.MaterialBaseInfoPO; +import com.mhd.wms.domain.materialInventory.entity.MaterialInventory; import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService; import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; @@ -53,9 +57,12 @@ import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBas import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService; import com.mhd.wms.domain.outOrderAbnormal.repository.todo.OutOrderAbnormalBaseDO; +import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO; +import com.mhd.wms.domain.pickingOrder.entity.PickingOrder; +import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService; import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO; import com.mhd.wms.domain.pickingOrder.service.PickingOrderDomainService; import com.mhd.wms.domain.pushSyncBms.PushSyncBmsDomainService; @@ -137,8 +144,11 @@ public class StockOutOrderDomainService { @Autowired private MaterialInventoryMapper materialInventoryMapper; @Autowired + private IInventoryAdjustmentRecordService inventoryAdjustmentRecordService; + @Autowired private IPickingMaterialDetailService pickingMaterialDetailService; - + @Autowired + private IPickingOrderService pickingOrderService; /** * 分页查询出库单列表 */ @@ -594,6 +604,23 @@ public class StockOutOrderDomainService { .in(StockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); } + @Transactional(rollbackFor = Exception.class) + public Boolean execution(String outOrderNumber) { + StockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1)); + if (stockOutOrder == null) { + throw new ServiceException("出库单不存在"); + } + StockOutOrderDO stockOutOrderDO = new StockOutOrderDO(); + Long outOrderId = stockOutOrder.getOutOrderId(); + List outOrderIds = Collections.singletonList(outOrderId); + stockOutOrderDO.setOutOrderIds(outOrderIds); + auditState(stockOutOrderDO); + + return true; + } + /** * @description 生成拣货单 @@ -740,6 +767,144 @@ public class StockOutOrderDomainService { return inserted; } + @Transactional(rollbackFor = Exception.class) + public Boolean genPickingOrderByOms(StockOutOrderDO stockOutOrderDO){ + List stockOutOrderList = stockOutOrderService.list(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag, 1) + .in(StockOutOrder::getStatus,3,4) + .eq(StockOutOrder::getOutOrderNumber, stockOutOrderDO.getOutOrderNumber())); + if (CollectionUtils.isEmpty(stockOutOrderList)){ + throw new ServiceException("只有已分配过的出库单才能生成拣货单"); + } + //修改出库单状态为拣货中 + List stockOutOrderId = stockOutOrderList.stream().map(StockOutOrder::getOutOrderId).collect(Collectors.toList()); + StockOutOrder stockOutOrder = new StockOutOrder(); + stockOutOrder.setStatus(6); + stockOutOrderService.update(stockOutOrder, new UpdateWrapper().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)); + if (CollectionUtils.isEmpty(list)){ + throw new ServiceException("不存在已分配且未生成拣货单的物料明细,无法生成拣货单!"); + } + List outOrderNumberList = stockOutOrderList.stream().map(StockOutOrder::getOutOrderNumber).collect(Collectors.toList()); + OutMaterialDetailDO outMaterialDetailDO = new OutMaterialDetailDO(); + outMaterialDetailDO.setOutOrderNumberList(outOrderNumberList); + List outMaterialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO); + Map> outMaterialDetailPOListMap = outMaterialDetailPOList.stream().collect(Collectors.groupingBy(OutMaterialDetailPO::getOutOrderNumber)); + List pickingOrderDOList = new ArrayList<>(); + stockOutOrderList.forEach(p -> { + PickingOrderDO pickingOrderDO = new PickingOrderDO(); + BeanUtils.copyProperties(p, pickingOrderDO); + pickingOrderDO.setOrderNumber(p.getOutOrderNumber()); + pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH")); + pickingOrderDO.setQuantity(p.getAllocationQuantity()); + if (pickingOrderDO.getWarehouseId() == null && p.getWarehouseId() != null) { + pickingOrderDO.setWarehouseId(p.getWarehouseId()); + pickingOrderDO.setWarehouseCode(p.getWarehouseCode()); + pickingOrderDO.setWarehouseName(p.getWarehouseName()); + } + List outMaterialDetailPOS = outMaterialDetailPOListMap.get(p.getOutOrderNumber()); + // 出库单头 warehouse_code 常为空,用已分配明细(含子行)第一条有仓库编码的行兜底 + OutMaterialDetailPO warehouseFromDetail = firstOutDetailWithWarehouse(outMaterialDetailPOS); + if (warehouseFromDetail != null) { + if (StringUtils.isBlank(pickingOrderDO.getWarehouseCode())) { + pickingOrderDO.setWarehouseCode(warehouseFromDetail.getWarehouseCode()); + } + if (StringUtils.isBlank(pickingOrderDO.getWarehouseName()) + && StringUtils.isNotBlank(warehouseFromDetail.getWarehouseName())) { + pickingOrderDO.setWarehouseName(warehouseFromDetail.getWarehouseName()); + } + if (pickingOrderDO.getWarehouseId() == null && warehouseFromDetail.getWarehouseId() != null) { + pickingOrderDO.setWarehouseId(warehouseFromDetail.getWarehouseId()); + } + } + List pickingMaterialDetailList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(outMaterialDetailPOS)){ + outMaterialDetailPOS.forEach(outMaterialDetailPO -> { + BigDecimal allocationQuantity = outMaterialDetailPO.getAllocationQuantity(); + if (allocationQuantity != null && allocationQuantity.compareTo(BigDecimal.ZERO) > 0) { + PickingMaterialDetailDO pickingMaterialDetailDO = new PickingMaterialDetailDO(); + BeanUtils.copyProperties(outMaterialDetailPO, pickingMaterialDetailDO); + pickingMaterialDetailDO.setPickingOrderNumber(pickingOrderDO.getPickingOrderNumber()); + pickingMaterialDetailDO.setQuantity(outMaterialDetailPO.getAllocationQuantity()); + //设置出库明细关联id + pickingMaterialDetailDO.setOutUniqueId(outMaterialDetailPO.getUniqueId()); + pickingMaterialDetailDO.setMaterialCode(outMaterialDetailPO.getMaterialNo()); + pickingMaterialDetailDO.setMaterialName(outMaterialDetailPO.getCommodityName()); + pickingMaterialDetailDO.setBarCode(outMaterialDetailPO.getBarCode()); + //设置批次属性字段(从出库单明细中获取) + pickingMaterialDetailDO.setBatchRefNo(outMaterialDetailPO.getBatchRefNo()); + pickingMaterialDetailDO.setSheetRefNo(outMaterialDetailPO.getSheetRefNo()); + pickingMaterialDetailDO.setBoxPalletNo(outMaterialDetailPO.getBoxPalletNo()); + pickingMaterialDetailDO.setExtAttr1(outMaterialDetailPO.getExtAttr1()); + pickingMaterialDetailDO.setExtAttr2(outMaterialDetailPO.getExtAttr2()); + pickingMaterialDetailDO.setProductionDate(outMaterialDetailPO.getProductionDate()); + pickingMaterialDetailDO.setExpiryDate(outMaterialDetailPO.getExpiryDate()); + pickingMaterialDetailDO.setInventoryDate(outMaterialDetailPO.getInventoryDate()); + pickingMaterialDetailDO.setExtAttr3(outMaterialDetailPO.getExtAttr3()); + pickingMaterialDetailDO.setExtAttr4(outMaterialDetailPO.getExtAttr4()); + // 毛重、净重、面积、体积从出库单明细自动带出 + pickingMaterialDetailDO.setTotalGrossWeight(outMaterialDetailPO.getTotalGrossWeight()); + //判断是否是抄码商品净重 + if (outMaterialDetailPO.getCopyTotalWeight() != null){ + pickingMaterialDetailDO.setTotalNetWeight(outMaterialDetailPO.getCopyTotalWeight()); + pickingMaterialDetailDO.setCopyCodeReferenceIds(outMaterialDetailPO.getCopyCodeReferenceIds()); + }else { + pickingMaterialDetailDO.setTotalNetWeight(outMaterialDetailPO.getTotalNetWeight()); + } + pickingMaterialDetailDO.setTotalArea(outMaterialDetailPO.getTotalArea()); + pickingMaterialDetailDO.setTotalVolume(outMaterialDetailPO.getTotalVolume()); + pickingMaterialDetailList.add(pickingMaterialDetailDO); + List outMaterialDetailPOListChildren = outMaterialDetailPO.getChildren(); + if (!CollectionUtils.isEmpty(outMaterialDetailPOListChildren)){ + outMaterialDetailPOListChildren.forEach(outMaterialDetailPOChildren -> { + PickingMaterialDetailDO pickingMaterialDetailDOChildren = new PickingMaterialDetailDO(); + BeanUtils.copyProperties(pickingMaterialDetailDO, pickingMaterialDetailDOChildren); + BeanUtils.copyProperties(outMaterialDetailPOChildren, pickingMaterialDetailDOChildren); + pickingMaterialDetailDOChildren.setPickingOrderNumber(pickingOrderDO.getPickingOrderNumber()); + pickingMaterialDetailDOChildren.setQuantity(outMaterialDetailPOChildren.getAllocationQuantity()); + //设置出库明细关联id + pickingMaterialDetailDOChildren.setOutUniqueId(outMaterialDetailPOChildren.getUniqueId()); + pickingMaterialDetailDOChildren.setMaterialCode(outMaterialDetailPOChildren.getMaterialNo()); + pickingMaterialDetailDOChildren.setMaterialName(outMaterialDetailPOChildren.getCommodityName()); + pickingMaterialDetailDOChildren.setBarCode(outMaterialDetailPOChildren.getBarCode()); + //设置批次属性字段(从出库单明细中获取) + pickingMaterialDetailDOChildren.setBatchRefNo(outMaterialDetailPOChildren.getBatchRefNo()); + pickingMaterialDetailDOChildren.setSheetRefNo(outMaterialDetailPOChildren.getSheetRefNo()); + pickingMaterialDetailDOChildren.setBoxPalletNo(outMaterialDetailPOChildren.getBoxPalletNo()); + pickingMaterialDetailDOChildren.setExtAttr1(outMaterialDetailPOChildren.getExtAttr1()); + pickingMaterialDetailDOChildren.setExtAttr2(outMaterialDetailPOChildren.getExtAttr2()); + pickingMaterialDetailDOChildren.setProductionDate(outMaterialDetailPOChildren.getProductionDate()); + pickingMaterialDetailDOChildren.setExpiryDate(outMaterialDetailPOChildren.getExpiryDate()); + pickingMaterialDetailDOChildren.setInventoryDate(outMaterialDetailPOChildren.getInventoryDate()); + pickingMaterialDetailDOChildren.setExtAttr3(outMaterialDetailPOChildren.getExtAttr3()); + pickingMaterialDetailDOChildren.setExtAttr4(outMaterialDetailPOChildren.getExtAttr4()); + // 毛重、净重、面积、体积从出库单明细子行自动带出 + pickingMaterialDetailDOChildren.setTotalGrossWeight(outMaterialDetailPOChildren.getTotalGrossWeight()); + pickingMaterialDetailDOChildren.setTotalNetWeight(outMaterialDetailPOChildren.getTotalNetWeight()); + pickingMaterialDetailDOChildren.setTotalArea(outMaterialDetailPOChildren.getTotalArea()); + pickingMaterialDetailDOChildren.setTotalVolume(outMaterialDetailPOChildren.getTotalVolume()); + pickingMaterialDetailList.add(pickingMaterialDetailDOChildren); + }); + } + } + }); + pickingOrderDO.setMaterialDetailList(pickingMaterialDetailList); + } + pickingOrderDOList.add(pickingOrderDO); + }); + Boolean inserted = pickingOrderDomainService.batchInsert(pickingOrderDOList); + if (Boolean.TRUE.equals(inserted)) { + List pickingOrderNumbers = pickingOrderDOList.stream() + .map(PickingOrderDO::getPickingOrderNumber) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + pickingOrderDomainService.autoTaskDistributionAfterGenPickingOrders(pickingOrderNumbers); + } + return inserted; + } + /** * 从出库明细树中取第一条带仓库编码的行(父行优先,再递归子行) */ @@ -1727,6 +1892,61 @@ public class StockOutOrderDomainService { stockOutOrderService.save(stockOutOrder); } + public void cancelExecutionOrder(StockOutOrder stockOutOrder) { + String outOrderNumber = stockOutOrder.getOutOrderNumber(); + StockOutOrder stockOutOrderDB = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1)); + if (stockOutOrderDB == null) { + throw new ServiceException("出库单不存在"); + } + List materialDetails = outMaterialDetailService.list(new LambdaQueryWrapper() + .eq(OutMaterialDetail::getOutOrderNumber, outOrderNumber) + .eq(OutMaterialDetail::getDelFlag, 1)); + if (CollectionUtils.isEmpty(materialDetails)) { + throw new ServiceException("出库单明细不存在"); + } + for (OutMaterialDetail materialDetail : materialDetails) { + //还原库存 + BigDecimal allocationQuantity = materialDetail.getAllocationQuantity(); + Long materialInventoryId = materialDetail.getMaterialInventoryId(); + MaterialInventory materialInventory = materialInventoryMapper.selectById(materialInventoryId); + if (materialInventory == null) { + throw new ServiceException("库存信息不存在"); + } + materialInventory.setAllocationQuantity(materialInventory.getAllocationQuantity().add(allocationQuantity)); + materialInventory.setFreezeQuantity(materialInventory.getFreezeQuantity().subtract(allocationQuantity)); + materialInventoryMapper.updateById(materialInventory); + //逻辑删除库存调整记录 + Long uniqueId = materialDetail.getUniqueId(); + String relateNo = outOrderNumber+"#"+uniqueId; + inventoryAdjustmentRecordService.update(new InventoryAdjustmentRecord(), new LambdaUpdateWrapper() + .set(InventoryAdjustmentRecord::getDelFlag, 2) + .eq(InventoryAdjustmentRecord::getRelateNo, relateNo)); + //逻辑删除出库单明细 + materialDetail.setDelFlag(2); + outMaterialDetailService.updateById(materialDetail); + } + //逻辑删除出库单 + stockOutOrder.setDelFlag(2); + stockOutOrderService.updateById(stockOutOrder); + + PickingOrder pickingOrder = pickingOrderService.getOne(new LambdaQueryWrapper() + .eq(PickingOrder::getDelFlag, 1) + .eq(PickingOrder::getOrderNumber, outOrderNumber)); + if (pickingOrder != null) { + String pickingOrderNumber = pickingOrder.getPickingOrderNumber(); + List list = pickingMaterialDetailService.list(new LambdaQueryWrapper() + .eq(PickingMaterialDetail::getPickingOrderNumber, pickingOrderNumber) + .eq(PickingMaterialDetail::getDelFlag, 1)); + for (PickingMaterialDetail pickingMaterialDetail : list) { + pickingMaterialDetail.setDelFlag(2); + pickingMaterialDetailService.updateById(pickingMaterialDetail); + } + pickingOrderService.updateById(pickingOrder); + } + } + @Transactional(rollbackFor = Exception.class) public void omsOrderAddDetail(List outMaterialDetails) { if (CollectionUtils.isEmpty(outMaterialDetails)) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/facade/IStockShelfOrderService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/facade/IStockShelfOrderService.java index 37680cb5a..94d73f025 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/facade/IStockShelfOrderService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/facade/IStockShelfOrderService.java @@ -49,9 +49,14 @@ public interface IStockShelfOrderService extends IService */ public StockShelfOrderPO getInfo(Long shelfOrderId); - public void updateOmsOrder(String orderNumber, Integer status, BigDecimal shelvesQuantity); + public Integer getExecutionCount(String orderNumber); + + public String getBusinessOrderNumber(String orderNumber); + + public void updateOmsExecutionOrder(String orderNumber, Integer status, BigDecimal shelvesQuantity); + public void updateOmsReserveOrder(String orderNumber, BigDecimal shelvesQuantity); public void updateOmsDocument(BigDecimal shelvesQuantity, BigDecimal totalNetWeight, String omsInMaterialDetail); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/mapper/StockShelfOrderMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/mapper/StockShelfOrderMapper.java index ae5c6912a..65337a867 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/mapper/StockShelfOrderMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/mapper/StockShelfOrderMapper.java @@ -24,6 +24,12 @@ public interface StockShelfOrderMapper extends BaseMapper public void updateOmsOrder(@Param("orderNumber") String orderNumber, @Param("status") Integer status, @Param("shelvesQuantity") BigDecimal shelvesQuantity); + public Integer getExecutionCount(@Param("orderNumber") String orderNumber); + + public String getBusinessOrderNumber(@Param("orderNumber") String orderNumber); + + public void updateOmsExecutionOrder(@Param("orderNumber") String orderNumber, @Param("status") Integer status, @Param("shelvesQuantity") BigDecimal shelvesQuantity); + public void updateOmsReserveOrder(@Param("orderNumber") String orderNumber, @Param("shelvesQuantity") BigDecimal shelvesQuantity); void updateOmsDocument(@Param("shelvesQuantity") BigDecimal shelvesQuantity, @Param("totalNetWeight") BigDecimal totalNetWeight, @Param("omsInMaterialDetail") String omsInMaterialDetail); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/persistence/StockShelfOrderImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/persistence/StockShelfOrderImpl.java index 7f4e73b5a..1d15b18dd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/persistence/StockShelfOrderImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/persistence/StockShelfOrderImpl.java @@ -115,6 +115,21 @@ public class StockShelfOrderImpl extends ServiceImpl 0) { + if (businessOrderNumber != null) stockShelfOrderService.updateOmsOrder(businessOrderNumber, 5, + shelvesQuantity == null ? null : shelvesQuantity); + } else { + if (businessOrderNumber != null) stockShelfOrderService.updateOmsOrder(businessOrderNumber, 4, + shelvesQuantity == null ? null : shelvesQuantity); + } + if (businessOrderNumber != null) stockShelfOrderService.updateOmsReserveOrder(businessOrderNumber, shelvesQuantity == null ? null : shelvesQuantity); return true; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java index 3a14c679e..94f769e21 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBaseInfo/MaterialBaseInfoDTO.java @@ -311,4 +311,7 @@ public class MaterialBaseInfoDTO extends BaseVOEntity { @ApiModelProperty(name = "单位") private String unit; + + @ApiModelProperty(name = "组织(多个用,分开)") + private String orgId; } \ No newline at end of file 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 3e945cdf9..2c5009552 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 @@ -190,6 +190,9 @@ public class MaterialInventoryDTO extends MaterialBaseDTO { private Boolean excludeZeroInventoryQuantity; private String expiryDate; private String productionDate; + private String expiryDateStr; + private String productionDateStr; + private String updateTimeStr; private String expiryDateStart; private String expiryDateEnd; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java index 8fd25d9b4..065eb2f42 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java @@ -188,4 +188,7 @@ public class MaterialInventoryQueryListDTO extends MaterialBaseDTO { /** 为 true 时排除库存数量为 0 的行;库存查询页不传或 false */ @ApiModelProperty(value = "是否排除库存数量为0", example = "false") private Boolean excludeZeroInventoryQuantity; -} + private String expiryDateStr; + private String productionDateStr; + private String updateTimeStr; +} \ No newline at end of file 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 dfaef004d..33ac2c412 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 @@ -217,6 +217,16 @@ public class StockOutOrderApi extends BaseController { return AjaxResult.success(stockOutOrderApplicationService.auditState(stockOutOrderDO)); } + /** + * 审核出库单 + */ + @ApiOperation("oms执行") + @PostMapping(value = "/execution") + public AjaxResult execution(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO) { + String outOrderNumber = stockOutOrderDTO.getOutOrderNumber(); + return AjaxResult.success(stockOutOrderApplicationService.execution(outOrderNumber)); + } + /** * 手动分配 */ @@ -242,6 +252,17 @@ public class StockOutOrderApi extends BaseController { return toAjax(stockOutOrderApplicationService.autoAssign(stockOutOrderDO)); } + /** + * 手动分配 + */ + @ApiOperation("oms执行单下发自动分配") + @PostMapping("/omsAutoAssign") + public AjaxResult omsAutoAssign(@RequestBody StockOutOrderDTO stockOutOrderDTO) { + StockOutOrderDO stockOutOrderDO = new StockOutOrderDO(); + BeanUtils.copyProperties(stockOutOrderDTO, stockOutOrderDO); + return toAjax(stockOutOrderApplicationService.omsAutoAssign(stockOutOrderDO)); + } + /** * 取消分配 */ @@ -305,6 +326,16 @@ public class StockOutOrderApi extends BaseController { return toAjax(stockOutOrderApplicationService.genPickingOrder(stockOutOrderDO)); } + /** + * 生成拣货单 + */ + @ApiOperation("生成拣货单") + @PostMapping("/genPickingOrderByOms") + public AjaxResult genPickingOrderByOms(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO) { + StockOutOrderDO stockOutOrderDO = JSONUtil.toBean(JSONUtil.toJsonStr(stockOutOrderDTO), StockOutOrderDO.class); + return toAjax(stockOutOrderApplicationService.genPickingOrderByOms(stockOutOrderDO)); + } + /** * 复核下发 */ @@ -422,6 +453,12 @@ public class StockOutOrderApi extends BaseController { stockOutOrderApplicationService.omsOrderAddDetail(outMaterialDetails); } + @ApiOperation("oms下发单保存") + @PostMapping(value = "/cancelExecutionOrder") + public void omsCancelExecutionOrder(@RequestBody StockOutOrder stockOutOrder) { + stockOutOrderApplicationService.cancelExecutionOrder(stockOutOrder); + } + /** * oms下发单配送明细保存 */ diff --git a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml index c614da81d..f73d0359a 100644 --- a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml @@ -361,7 +361,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from out_material_detail a - left join stock_out_order b on a.out_order_number = b.out_order_number + left join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 and a.del_flag = 1 diff --git a/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml b/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml index 4705ba9f3..f6c5ac19f 100644 --- a/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml @@ -151,6 +151,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update "NGWL_TEST_OMS".RESERVATION_STOCK_OUT_ORDER set ISSUE_STATUS = #{status},OUTBOUND_TIME = CURRENT_TIMESTAMP where OUT_ORDER_NUMBER = #{orderNumber} + update "NGWL_TEST_OMS".RESERVATION_STOCK_OUT_ORDER set ISSUE_STATUS = #{status},OUTBOUND_TIME = CURRENT_TIMESTAMP where OUT_ORDER_NUMBER = #{orderNumber} and DEL_FLAG = 1 + + + update "NGWL_TEST_OMS".EXECUTION_STOCK_OUT_ORDER set ISSUE_STATUS = #{status},OUTBOUND_TIME = CURRENT_TIMESTAMP where OUT_ORDER_NUMBER = #{orderNumber} and DEL_FLAG = 1 + + + + + \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml index 6cefc6155..cece22329 100644 --- a/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml @@ -348,7 +348,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from in_material_detail a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 diff --git a/mhd_wms/src/main/resources/mapper/inOrderAbnormal/InOrderAbnormalMapper.xml b/mhd_wms/src/main/resources/mapper/inOrderAbnormal/InOrderAbnormalMapper.xml index 228139f0d..13db39d74 100644 --- a/mhd_wms/src/main/resources/mapper/inOrderAbnormal/InOrderAbnormalMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inOrderAbnormal/InOrderAbnormalMapper.xml @@ -91,7 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from in_order_abnormal a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 diff --git a/mhd_wms/src/main/resources/mapper/inventoryStandingReport/InventoryStandingReportMapper.xml b/mhd_wms/src/main/resources/mapper/inventoryStandingReport/InventoryStandingReportMapper.xml index b5a015aa2..5dead0139 100644 --- a/mhd_wms/src/main/resources/mapper/inventoryStandingReport/InventoryStandingReportMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inventoryStandingReport/InventoryStandingReportMapper.xml @@ -67,7 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM receipt_material_detail rmd LEFT JOIN stock_receipt_order sro1 ON sro1.receipt_order_number = rmd.receipt_order_number - LEFT JOIN stock_in_order sio1 ON sro1.in_order_number = sio1.in_order_number + LEFT JOIN stock_in_order sio1 ON sro1.in_order_number = sio1.in_order_number and sio1.DEL_FLAG = 1 and sro1.DEL_FLAG = 1 WHERE rmd.receipt_status IN ( 1, 2 ) AND rmd.receipt_quantity > 0 @@ -95,7 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM shelf_material_detail smd LEFT JOIN stock_shelf_order sso ON sso.shelf_order_number = smd.shelf_order_number - LEFT JOIN stock_in_order sio2 ON sso.in_order_number = sio2.in_order_number + LEFT JOIN stock_in_order sio2 ON sso.in_order_number = sio2.in_order_number and sio1.DEL_FLAG = 1 and sso1.DEL_FLAG = 1 WHERE smd.shelves_status IN ( 1, 2 ) GROUP BY @@ -121,7 +121,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SUM( pmd.quantity ) AS material_quantity FROM picking_material_detail pmd - LEFT JOIN picking_order po ON po.picking_order_number = pmd.picking_order_number + LEFT JOIN picking_order po ON po.picking_order_number = pmd.picking_order_number and pmd.del_flag = 1 and po.del_flag=1 WHERE po.STATUS IN ( 1, 2 ) GROUP BY @@ -147,7 +147,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SUM( omd.quantity ) AS material_quantity FROM out_material_detail omd - LEFT JOIN stock_out_order soo ON soo.out_order_number = omd.out_order_number + LEFT JOIN stock_out_order soo ON soo.out_order_number = omd.out_order_number and omd.del_flag = 1 and soo.del_flag = 1 WHERE soo.STATUS IN ( 7, 8 ) GROUP BY @@ -220,7 +220,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM receipt_material_detail rmd LEFT JOIN stock_receipt_order sro ON sro.receipt_order_number = rmd.receipt_order_number - LEFT JOIN stock_in_order sio ON sro.in_order_number = sio.in_order_number + LEFT JOIN stock_in_order sio ON sro.in_order_number = sio.in_order_number and sio1.DEL_FLAG = 1 and sro1.DEL_FLAG = 1 WHERE sro.status IN ( 1, 2 ) @@ -248,7 +248,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM shelf_material_detail rmd LEFT JOIN stock_shelf_order sso ON sso.shelf_order_number = rmd.shelf_order_number - LEFT JOIN stock_in_order sio ON sso.in_order_number = sio.in_order_number + LEFT JOIN stock_in_order sio ON sso.in_order_number = sio.in_order_number and sio1.DEL_FLAG = 1 and sso1.DEL_FLAG = 1 WHERE sso.STATUS IN ( 1, @@ -266,7 +266,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sio.abnormal FROM picking_material_detail rmd - LEFT JOIN picking_order sio ON sio.picking_order_number = rmd.picking_order_number + LEFT JOIN picking_order sio ON sio.picking_order_number = rmd.picking_order_number and rmd.del_flag = 1 and sio.del_flag=1 WHERE sio.STATUS IN ( 1, 2 ) @@ -278,7 +278,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" rmd.check_quantity AS work_quantity FROM out_material_detail rmd - LEFT JOIN stock_out_order sio ON sio.out_order_number = rmd.out_order_number + LEFT JOIN stock_out_order sio ON sio.out_order_number = rmd.out_order_number and sio.del_flag = 1 and rmd.del_flag = 1 WHERE sio.STATUS IN ( 7, 8 ) diff --git a/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml b/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml index f4fd9e1e4..2333f93c2 100644 --- a/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialBaseInfo/MaterialBaseInfoMapper.xml @@ -106,7 +106,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - and a.organization_id = #{organizationId} + and a.organization_id like concat('%', #{organizationId}, '%') + + + and a.org_id like concat('%', #{orgId}, '%') and a.material_base_info_id = #{materialBaseInfoId} @@ -326,5 +329,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index 36b22272d..f6f32760c 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -795,7 +795,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" receipt_material_detail c LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 WHERE c.del_flag = 1 and d.STATUS = 3 AND e.warehouse_id = a.warehouse_id @@ -822,7 +822,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" shelf_material_detail c LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 WHERE c.del_flag = 1 and d.STATUS = 1 AND e.warehouse_id = a.warehouse_id @@ -837,8 +837,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sum( c.picking_quantity ) FROM picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 WHERE c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 AND d.warehouse_id = a.warehouse_id @@ -854,7 +854,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY FROM OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER WHERE d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) @@ -890,8 +890,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ( SELECT MAX(c.update_time) FROM picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 WHERE c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 AND d.warehouse_id = a.warehouse_id @@ -902,7 +902,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ( SELECT MAX(c.update_time) FROM OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and d.del_flag = 1 LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER WHERE d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) @@ -919,8 +919,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(( SELECT MAX(c.update_time) FROM picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 WHERE c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 AND d.warehouse_id = a.warehouse_id @@ -931,7 +931,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(( SELECT MAX(c.update_time) FROM OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and d.del_flag = 1 LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER WHERE d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) @@ -1003,7 +1003,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" receipt_material_detail c LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 WHERE c.del_flag = 1 and d.STATUS = 3 AND e.warehouse_id = a.warehouse_id @@ -1033,7 +1033,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" receipt_material_detail c LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 WHERE c.del_flag = 1 and d.STATUS = 3 AND e.warehouse_id = a.warehouse_id @@ -1063,7 +1063,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" shelf_material_detail c LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 WHERE c.del_flag = 1 AND e.warehouse_id = a.warehouse_id @@ -1083,7 +1083,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" shelf_material_detail c LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 WHERE c.del_flag = 1 AND e.warehouse_id = a.warehouse_id @@ -1101,8 +1101,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sum( c.picking_quantity ) FROM picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 WHERE c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 AND d.warehouse_id = a.warehouse_id @@ -1121,8 +1121,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sum( c.picking_quantity ) FROM picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 WHERE c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 AND d.warehouse_id = a.warehouse_id @@ -1148,7 +1148,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY FROM OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER WHERE d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) @@ -1172,7 +1172,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY FROM OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER WHERE d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) @@ -1220,8 +1220,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(( SELECT MAX(c.update_time) FROM picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 WHERE c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 AND d.warehouse_id = a.warehouse_id @@ -1232,7 +1232,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(( SELECT MAX(c.update_time) FROM OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER WHERE d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) diff --git a/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml b/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml index 1244b2790..0a3c003a5 100644 --- a/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml +++ b/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml @@ -112,7 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from out_order_abnormal a - left join stock_out_order b on a.out_order_number = b.out_order_number + left join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 diff --git a/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml index 6560adecd..51312da2e 100644 --- a/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml @@ -224,7 +224,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select from picking_material_detail a - left join out_material_detail omd on a.out_unique_id = omd.unique_id and omd.del_flag = 1 + left join out_material_detail omd on a.out_unique_id = omd.unique_id and omd.del_flag = 1 and a.del_flag = 1 @@ -248,7 +248,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -256,7 +256,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT DISTINCT pmd.OUT_UNIQUE_ID FROM picking_material_detail pmd - INNER JOIN out_material_detail omd ON pmd.OUT_UNIQUE_ID = omd.UNIQUE_ID AND omd.DEL_FLAG = 1 + INNER JOIN out_material_detail omd ON pmd.OUT_UNIQUE_ID = omd.UNIQUE_ID AND omd.DEL_FLAG = 1 and pmd.del_flag = 1 WHERE omd.OUT_ORDER_NUMBER = #{outOrderNumber} AND pmd.DEL_FLAG = 1 AND COALESCE(pmd.PICKING_QUANTITY, 0) > 0 diff --git a/mhd_wms/src/main/resources/mapper/pickingOrder/PickingOrderMapper.xml b/mhd_wms/src/main/resources/mapper/pickingOrder/PickingOrderMapper.xml index df72d453e..0bf8586fa 100644 --- a/mhd_wms/src/main/resources/mapper/pickingOrder/PickingOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/pickingOrder/PickingOrderMapper.xml @@ -51,7 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ,a.push_status,a.push_time,a.push_by,a.push_by_name, (SELECT m.goods_type FROM PICKING_MATERIAL_DETAIL d JOIN material_base_info m ON d.material_base_info_id = m.material_base_info_id - WHERE d.PICKING_ORDER_NUMBER = a.PICKING_ORDER_NUMBER + WHERE d.PICKING_ORDER_NUMBER = a.PICKING_ORDER_NUMBER and d.del_flag = 1 LIMIT 1) AS goods_type @@ -145,7 +145,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ,b.need_Declare_Flag from picking_order a - left join STOCK_OUT_ORDER b ON a.order_number = b.out_order_number + left join STOCK_OUT_ORDER b ON a.order_number = b.out_order_number and b.del_flag = 1 and a.del_flag = 1 @@ -157,7 +157,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from picking_order a - left join stock_out_order b on a.order_number = b.out_order_number + left join stock_out_order b on a.order_number = b.out_order_number and b.del_flag = 1 and a.del_flag = 1 WHERE a.picking_order_id = #{pickingOrderId} @@ -166,7 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from picking_order a - left join wave_order b on a.order_number = b.wave_order_number + left join wave_order b on a.order_number = b.wave_order_number and a.del_flag = 1 WHERE a.picking_order_id = #{pickingOrderId} @@ -175,7 +175,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from picking_order a - left join stock_out_order b on a.order_number = b.out_order_number + left join stock_out_order b on a.order_number = b.out_order_number and b.del_flag = 1 and a.del_flag = 1 WHERE a.order_number = #{orderNumber} @@ -184,7 +184,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from picking_order a - left join wave_order b on a.order_number = b.wave_order_number + left join wave_order b on a.order_number = b.wave_order_number and a.del_flag = 1 WHERE a.order_number = #{orderNumber} diff --git a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml index fa4dbc5b6..9509d5da5 100644 --- a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml @@ -152,7 +152,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from stock_receipt_order a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 diff --git a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml index 83f0b1861..c28664856 100644 --- a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml @@ -143,7 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from stock_shelf_order a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 @@ -151,34 +151,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY a.create_time DESC + + - update "NGWL_TEST_OMS".RESERVATION_STOCK_IN_ORDER set ISSUE_STATUS = #{status},in_quantity = #{shelvesQuantity},STORAGE_TIME = CURRENT_TIMESTAMP where IN_ORDER_NUMBER = #{orderNumber} + update "NGWL_TEST_OMS".RESERVATION_STOCK_IN_ORDER set ISSUE_STATUS = #{status},in_quantity = #{shelvesQuantity},STORAGE_TIME = CURRENT_TIMESTAMP where IN_ORDER_NUMBER = #{orderNumber} and DEL_FLAG = 1 + + + update "NGWL_TEST_OMS".EXECUTION_STOCK_IN_ORDER set ISSUE_STATUS = #{status},in_quantity = #{shelvesQuantity},STORAGE_TIME = CURRENT_TIMESTAMP where IN_ORDER_NUMBER = #{orderNumber} and DEL_FLAG = 1 - update "NGWL_TEST_OMS".RESERVE_STOCK_IN_ORDER set in_quantity = #{shelvesQuantity},STORAGE_TIME = CURRENT_TIMESTAMP where IN_ORDER_NUMBER = #{orderNumber} + update "NGWL_TEST_OMS".RESERVE_STOCK_IN_ORDER set in_quantity = #{shelvesQuantity},STORAGE_TIME = CURRENT_TIMESTAMP where IN_ORDER_NUMBER = #{orderNumber} and DEL_FLAG = 1 - update "NGWL_TEST_OMS".RESERVATION_IN_MATERIAL_DETAIL set INBOUND_ITEMS = #{shelvesQuantity}, TOTAL_NET_WEIGHT= #{totalNetWeight},STORAGE_TIME = CURRENT_TIMESTAMP where MATERIAL_DETAIL_ID = #{omsInMaterialDetail} + update "NGWL_TEST_OMS".RESERVATION_IN_MATERIAL_DETAIL set INBOUND_ITEMS = #{shelvesQuantity}, TOTAL_NET_WEIGHT= #{totalNetWeight},STORAGE_TIME = CURRENT_TIMESTAMP where MATERIAL_DETAIL_ID = #{omsInMaterialDetail} and DEL_FLAG = 1 update "NGWL_TEST_OMS".RESERVATION_OUT_MATERIAL_DETAIL set INBOUND_ITEMS = #{checkQuantity}, TOTAL_NET_WEIGHT= #{totalNetWeight} ,STORAGE_TIME = CURRENT_TIMESTAMP - where OUT_ORDER_NUMBER = #{outOrderNumber} and UNIQUE_ID = #{uniqueId} + where OUT_ORDER_NUMBER = #{outOrderNumber} and UNIQUE_ID = #{uniqueId} and DEL_FLAG = 1 update "NGWL_TEST_OMS".RESERVATION_IN_MATERIAL_DETAIL set INBOUND_ITEMS = #{shelvesQuantity}, TOTAL_NET_WEIGHT= #{totalNetWeight},STORAGE_TIME = CURRENT_TIMESTAMP - where LOT_NO = #{lotNumber} + where LOT_NO = #{lotNumber} and DEL_FLAG = 1 update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = #{quantity}, ALLOCATION_QUANTITY= #{quantity} - where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNumber} + where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNumber} and DEL_FLAG = 1 update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = INVENTORY_QUANTITY - #{checkQuantity}, ALLOCATION_QUANTITY= ALLOCATION_QUANTITY - #{checkQuantity} - where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNo} + where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNo} and DEL_FLAG = 1