From ed4d6111a5fdc4389878d9caf5c9c5199a414470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 26 Jun 2026 10:52:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=8F=8A=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=89=A7=E8=A1=8C;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mhd/system/api/WmsServiceFeign.java | 12 + .../system/api/domain/StockOutOrderDTO.java | 486 ++++++++++++++++++ .../mapper/ExecutionStockInOrderMapper.java | 4 + ...ecutionStockInOrderApplicationService.java | 5 + .../ExecutionStockInOrderDomainService.java | 33 ++ .../mapper/ExecutionStockOutOrderMapper.java | 6 + ...cutionStockOutOrderApplicationService.java | 4 + .../ExecutionStockOutOrderDomainService.java | 40 ++ .../mapper/ReservationStockInOrderMapper.java | 9 + .../ReservationStockInOrderDomainService.java | 107 +++- .../ExecutionStockInOrderApi.java | 12 +- .../ExecutionStockOutOrderApi.java | 10 + .../ExecutionStockInOrderMapper.xml | 8 + .../ExecutionStockOutOrderMapper.xml | 8 + .../ReservationStockInOrderMapper.xml | 17 + .../StockOutOrderApplicationService.java | 88 ++++ .../repository/todo/StockOutOrderDO.java | 3 + .../service/StockOutOrderDomainService.java | 63 +++ .../stockOutOrder/StockOutOrderApi.java | 27 + 19 files changed, 928 insertions(+), 14 deletions(-) create mode 100644 mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrderDTO.java 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..a7a1f26fc 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 @@ -97,6 +97,18 @@ public interface WmsServiceFeign { @PostMapping(value = "/stockInOrderApi/omsInOrderAdd") public void omsInOrderAdd(@RequestBody StockInOrder stockInOrder); + @ApiOperation("oms取消下发单保存") + @PostMapping(value = "/stockOutOrderApi/cancelExecutionOrder") + public void cancelExecutionOrder(@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下发单明细保存 */ 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_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 index a0262c1e6..572ff4904 100644 --- 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 @@ -41,6 +41,10 @@ public interface ExecutionStockInOrderMapper extends BaseMapper queryNoticePrint(ExecutionStockInOrderDO stockInOrderDO); List queryNoticePrintDetail(ExecutionStockInOrderDO stockInOrderDO); 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 index 16b9d4aeb..ae93c9855 100644 --- 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 @@ -306,6 +306,11 @@ public class ExecutionStockInOrderApplicationService { return b; } + public Boolean cancelAuditState(ExecutionStockInOrderDO stockInOrderDO){ + Boolean b = stockInOrderDomainService.cancelAuditState(stockInOrderDO); + return b; + } + /** * @description 下发入库单 * @author ZhouGY 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 index ba7cdecb5..5415bfce5 100644 --- 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 @@ -429,6 +429,39 @@ public class ExecutionStockInOrderDomainService { .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); + } + } + } + + 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, issueStatus) + .in(ExecutionStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); + } + /** * @description 审核入库单 * @author ZhouGY 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 index 5355fee7f..95c0deb2f 100644 --- 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 @@ -5,6 +5,7 @@ import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutM 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; @@ -31,4 +32,9 @@ public interface ExecutionStockOutOrderMapper extends BaseMapper 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/service/ExecutionStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java index 0ff593beb..72009f0e7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java @@ -826,6 +826,10 @@ public class ExecutionStockOutOrderApplicationService { return stockOutOrderDomainService.auditState(stockOutOrderDO); } + public Boolean cancelAuditState(ExecutionStockOutOrderDO stockOutOrderDO){ + return stockOutOrderDomainService.auditState(stockOutOrderDO); + } + /** * @description 下发入库单 * @author ZhouGY diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java index a1b757600..fcd39242e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java @@ -27,6 +27,7 @@ import com.mhd.oms.domain.executionStockInOrder.repository.mapper.ExecutionStock 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; @@ -68,6 +69,8 @@ public class ExecutionStockOutOrderDomainService { @Autowired private ExecutionStockInOrderMapper reservationStockInOrderMapper; @Autowired + private ExecutionStockOutOrderMapper executionStockOutOrderMapper; + @Autowired private BusinessDocumentOrderMapper businessDocumentOrderMapper; @Autowired private ExecuteOrderMapper executeOrderMapper; @@ -296,6 +299,38 @@ public class ExecutionStockOutOrderDomainService { .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.cancelExecutionOrder(stockOutOrder); + //还原oms库存及调整记录 + } + } + + return stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getIssueId, null) + .set(ExecutionStockOutOrder::getIssueName, userRealName) + .set(ExecutionStockOutOrder::getIssueTime, 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())); + } + /** * @description 审核出库单 * @author ZhouGY @@ -348,6 +383,11 @@ public class ExecutionStockOutOrderDomainService { 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); } return update; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java index a6196e0d2..746d43266 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java @@ -40,6 +40,15 @@ public interface ReservationStockInOrderMapper extends BaseMapper queryNoticePrint(ReservationStockInOrderDO stockInOrderDO); List queryNoticePrintDetail(ReservationStockInOrderDO stockInOrderDO); 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..01b9b4552 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,10 @@ 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.reservationInMaterialDetail.entity.ReservationInMaterialDetail; import com.mhd.oms.domain.reservationInMaterialDetail.repository.facade.IReservationInMaterialDetailService; import com.mhd.oms.domain.reservationInMaterialDetail.repository.po.ReservationInMaterialDetailPO; @@ -29,6 +33,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 +49,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,6 +68,10 @@ public class ReservationStockInOrderDomainService { @Autowired private IReservationInMaterialDetailService materialDetailService; @Autowired + private IExecutionStockInOrderService executionStockInOrderService; + @Autowired + private IExecutionInMaterialDetailService executionInMaterialDetailService; + @Autowired private IReservationStockOutOrderService stockOutOrderService; // @Autowired // private ReservationStockReceiptOrderDomainService stockReceiptOrderDomainService; @@ -455,27 +466,97 @@ 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); - StockInOrder stockInOrder = new StockInOrder(); - BeanUtils.copyProperties(byId, stockInOrder,"inOrderId"); - stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); - wmsServiceFeign.omsInOrderAdd(stockInOrder); - String inOrderNumber = stockInOrder.getInOrderNumber(); + String inOrderNumber = byId.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); + + // 按照 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); + + 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); +// 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; } + 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/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java index 03ead7184..6426b6b74 100644 --- 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 @@ -120,13 +120,23 @@ public class ExecutionStockInOrderApi extends BaseController { /** * 下发入库单 */ - @ApiOperation("下发入库单") + @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回传出入库结果 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java index bcaa431e9..164014156 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java @@ -148,6 +148,16 @@ public class ExecutionStockOutOrderApi extends BaseController { 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.auditState(stockOutOrderDO)); + } + @ApiOperation("关闭出库单") @PostMapping("/close") public AjaxResult close(@RequestBody ExecutionStockOutOrderDTO stockOutOrderDTO) diff --git a/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml index a0545ebe4..efb63a5bc 100644 --- a/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml @@ -629,4 +629,12 @@ and organization_name = #{organizationName} and interface_type = #{interfaceType} limit 1 + + + 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} + \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml index d1c42d16c..fa08ade8e 100644 --- a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml @@ -466,4 +466,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + 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 + + + + + + +