自动化立体仓库 - WMS系统
skyouc
7 天以前 f01635b8145c99ca236f1f95af107a91cc2dd71d
no message
23个文件已添加
3个文件已修改
1589 ■■■■■ 已修改文件
src/main/java/com/zy/api/controller/HWmsApiController.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/HmesApiController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/params/PageRequestParams.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/BaseRequstParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/CallAgvParams.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/MatnrsParams.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/OrderItemsParam.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/OrderParams.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/OutOrderParams.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/PubOrderParams.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/ReportOrderParam.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/ReportOrderParams.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/StockAdjustParams.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/StockUpOrderParams.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/SyncMatParmas.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/entity/dto/XSR.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/LocAreaType.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/MatLocType.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/MatType.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/OrderType.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/enums/OrderWkType.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/HWmsApiService.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/HWmsApiServiceImpl.java 539 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Order.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/HWmsApiController.java
New file
@@ -0,0 +1,162 @@
package com.zy.api.controller;
import com.zy.api.controller.params.PageRequestParams;
import com.zy.api.entity.PubOrderParams;
import com.zy.api.entity.ReportOrderParam;
import com.zy.api.entity.StockAdjustParams;
import com.zy.api.entity.StockUpOrderParams;
import com.zy.api.entity.SyncMatParmas;
import com.zy.api.entity.dto.XSR;
import com.zy.api.service.HWmsApiService;
import com.zy.common.web.BaseController;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Objects;
@Slf4j
@RestController
@RequestMapping("/kopen")
public class HWmsApiController extends BaseController{
    @Autowired
    private HWmsApiService kopenApiService;
    /**
     * 上游下发派工单
     *
     * @author Ryan
     * @date 2025/11/24 15:18
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("上架派工单")
    @PostMapping("/sendInDispatch")
    public XSR receiveOrders(@RequestBody List<PubOrderParams> params) {
        if (Objects.isNull(params)) {
            return XSR.error("参数不能为空!!");
        }
//        if (Objects.isNull(params.getType())) {
//            return XSR.error("单据类型不能为空!");
//        }
        return kopenApiService.receiveOrders(params);
    }
    /**
     * 上游下发零件数据变更
     *
     * @author Ryan
     * @date 2025/11/24 15:19
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("零件信息数据更新")
    @PostMapping("/sendPartsMaster")
    public XSR basMatUpdate(@RequestBody List<SyncMatParmas> params) {
        if (Objects.isNull(params) || params.isEmpty()) {
            return XSR.error("参数不能为空!!");
        }
        return kopenApiService.basMatupdate(params);
    }
    /**
     * 上架派工单反馈
     * @author Ryan
     * @date 2025/11/24 15:20
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("上架派工单反馈")
    @PostMapping("/getInDispatchResult")
    public XSR getInDispatchResult(@RequestBody List<ReportOrderParam> params) {
        if (Objects.isNull(params)) {
            return XSR.error("参数不能为空!!");
        }
//        if (Objects.isNull(params.getKopen_id()) && Objects.isNull(params.getInv_no()) && Objects.isNull(params.getDispatch_no())) {
//            return XSR.error("取消条件不能为空!!");
//        }
        return kopenApiService.getInDispatchResult(params, null);
    }
    /**
     * 备货指示派工单下发
     * @author Ryan
     * @date 2025/11/24 15:21
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("备货指示派工单下发")
    @PostMapping("/sendOutDispatch")
    public XSR sendStockPrepareDispatch(@RequestBody List<PubOrderParams> params) {
        if (Objects.isNull(params)) {
            return XSR.error("参数不能为空!!");
        }
//        if (Objects.isNull(params.getDetails()) || params.getDetails().isEmpty()) {
//            return XSR.error("上报订单列表不能为空!!");
//        }
        return kopenApiService.sendOutDispatch(params);
    }
    //  /**
    //  * 备货指示派工单反馈
    //  * @author Ryan
    //  * @date 2025/11/24 15:22
    //  * @param params
    //  * @return com.core.common.R
    //  */
    // @ApiOperation("备货指示派工单反馈")
    // @PostMapping("/getOutDispatchResult")
    // public R getOutDispatchResult(@RequestBody ReportOrderParam params) {
    //     if (Objects.isNull(params)) {
    //         return R.error("参数不能为空!!");
    //     }
    //     if (Objects.isNull(params.getKopen_id()) && Objects.isNull(params.getInv_no()) && Objects.isNull(params.getDispatch_no())) {
    //         return R.error("取消条件不能为空!!");
    //     }
    //     return kopenApiService.getOutDispatchResult(params);
    // }
    /**
     * 备货单下发
     * @author Ryan
     * @date 2025/11/24 15:21
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("备货单下发")
    @PostMapping("/getOutDetails")
    public XSR getOutDetails(@RequestBody List<StockUpOrderParams> params) {
        if (Objects.isNull(params)) {
            return XSR.error("参数不能为空!!");
        }
        return kopenApiService.getOutDetails(params);
    }
    /**
     * 查询WMS库存信息
     * @author Ryan
     * @date 2025/11/24 15:22
     * @param params
     * @return com.core.common.R
     */
    @ApiOperation("查询WMS库存信息")
    @PostMapping("/getStockInfo")
    public XSR getStockInfo(@RequestBody PageRequestParams params) {
        return kopenApiService.getStockInfo(params);
    }
}
src/main/java/com/zy/api/controller/HmesApiController.java
New file
@@ -0,0 +1,14 @@
package com.zy.api.controller;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(value = "HMES对接")
@RestController
@RequestMapping("/api")
public class HmesApiController {
}
src/main/java/com/zy/api/controller/params/PageRequestParams.java
New file
@@ -0,0 +1,19 @@
package com.zy.api.controller.params;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel("分页请求参数")
public class PageRequestParams {
    private Integer curr = 1;
    private Integer limit = 50;
    private String pro_komcode;
    private String pro_id;
}
src/main/java/com/zy/api/entity/BaseRequstParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.api.entity;
import java.util.Map;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@ApiModel("基础请求参数")
@Accessors(chain = true)
public class BaseRequstParam {
    private Map<String, Object> root;
}
src/main/java/com/zy/api/entity/CallAgvParams.java
New file
@@ -0,0 +1,35 @@
package com.zy.api.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel(value = "CallAgvParams", description = "AGV搬运参数")
public class CallAgvParams implements Serializable {
    @ApiModelProperty("呼叫类型:出库:out, 入库:in")
    private String type;
    @ApiModelProperty("原库位")
    private String orgLoc;
    @ApiModelProperty("目标站点")
    private String tarSite;
    @ApiModelProperty("原站点")
    private String orgSite;
    @ApiModelProperty("目标库位")
    private String tarLoc;
    @ApiModelProperty("搬运状态")
    private String status;
    @ApiModelProperty("任务号")
    private String wrkNo;
}
src/main/java/com/zy/api/entity/MatnrsParams.java
New file
@@ -0,0 +1,43 @@
package com.zy.api.entity;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "MatnrsParams", description = "物料信息")
public class MatnrsParams {
    @ApiModelProperty("单据类型")
    private String pro_komcode;
    @ApiModelProperty("工单类型")
    private String pro_id;
    @ApiModelProperty("订单号")
    private String company_id;
    @ApiModelProperty("订单数量")
    private Double pro_name;
    @ApiModelProperty("操作人")
    private String pro_size;
    @ApiModelProperty("重量")
    private String pro_wet;
    @ApiModelProperty("零件类型")
    private String pro_type;
    @ApiModelProperty("更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String update_time;
}
src/main/java/com/zy/api/entity/OrderItemsParam.java
New file
@@ -0,0 +1,50 @@
package com.zy.api.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel(value = "OrderItemsParam", description = "订单明细参数")
public class OrderItemsParam implements Serializable {
    @ApiModelProperty("BS Code")
    private String total_serial;
    @ApiModelProperty("目标库区")
    private String target_location;
    @ApiModelProperty("零件类型")
    private String pro_type;
    @ApiModelProperty("零件代码")
    private String pro_komcode;
    @ApiModelProperty("供应商编码")
    private String pro_id;
    @ApiModelProperty("入库通知数量")
    private Double inv_qty;
    @ApiModelProperty("指示拣货订单数量")
    private Integer order_qty;
    @ApiModelProperty("原上架派工数量")
    private Integer old_qty;
    @ApiModelProperty("变更数量")
    private Integer new_qty;
    @ApiModelProperty("捆绑/叫料/数量数量")
    private Integer pick_qty;
    @ApiModelProperty("损溢数量")
    private Integer bsby_qty;
    @ApiModelProperty("托盘编号")
    private String location_no;
}
src/main/java/com/zy/api/entity/OrderParams.java
New file
@@ -0,0 +1,66 @@
package com.zy.api.entity;
import java.io.Serializable;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "OrderParams", description = "单据信息")
public class OrderParams implements Serializable {
    @ApiModelProperty("流水号(唯一)")
    private String kopen_id;
    @ApiModelProperty("派工单号")
    private String dispatch_no;
    @ApiModelProperty("公司ID")
    private String company_id;
    @ApiModelProperty("入库类型 1: 采购入库,2: 调拨入库,3: 销售退货入库,4: 套包入库, 5:SO, 6:EO, 7:出库")
    private String type;
    @ApiModelProperty("箱号")
    private String pm_tktid;
    @ApiModelProperty("入库通知单号")
    private String inv_no;
    @ApiModelProperty("目标库区")
    private String target_location;
    @ApiModelProperty("源库区")
    private String source_location;
    @ApiModelProperty("拣货单号")
    private String pick_no;
    @ApiModelProperty("订单号")
    private String order_no;
    @ApiModelProperty("客户ID")
    private String cus_id;
    @ApiModelProperty("客户地址")
    private String cus_address;
    @ApiModelProperty("WMS ID")
    private String wms_id;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String update_time;
}
src/main/java/com/zy/api/entity/OutOrderParams.java
New file
@@ -0,0 +1,34 @@
package com.zy.api.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
@ApiModel(value = "OutOrderParams", description = "备货订单参数")
public class OutOrderParams implements Serializable {
    @ApiModelProperty("明细备货单号")
    private String pick_no;
    @ApiModelProperty("订单号")
    private String order_no;
    @ApiModelProperty("客户")
    private String cus_id;
    @ApiModelProperty("客户地址")
    private String cus_address;
    @ApiModelProperty("业务类型")
    private String type;
    @ApiModelProperty("订单明细")
    private List<OrderItemsParam> partList;
}
src/main/java/com/zy/api/entity/PubOrderParams.java
New file
@@ -0,0 +1,17 @@
package com.zy.api.entity;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "PubOrderParams", description = "发布订单信息")
public class PubOrderParams extends OrderParams {
    @ApiModelProperty("入库物料列表")
    List<OrderItemsParam> details;
}
src/main/java/com/zy/api/entity/ReportOrderParam.java
New file
@@ -0,0 +1,18 @@
package com.zy.api.entity;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "ReportOrderParam", description = "上报订单信息")
public class ReportOrderParam extends OrderParams{
    @ApiModelProperty("上报订单列表")
    List<ReportOrderParams> details;
}
src/main/java/com/zy/api/entity/ReportOrderParams.java
New file
@@ -0,0 +1,55 @@
package com.zy.api.entity;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel("上报订单参数")
public class ReportOrderParams implements Serializable {
        @ApiModelProperty("BS Code")
        private String total_serial;
        @ApiModelProperty("产品类型")
        private String pro_type;
        @ApiModelProperty("零件代码")
        private String pro_komcode;
        @ApiModelProperty("供应商ID")
        private String pro_id;
        @ApiModelProperty("容器编码")
        private String location_no;
        @ApiModelProperty("货位类型")
        private String location_type;
        @ApiModelProperty("上架日期")
        private String sj_date;
        @ApiModelProperty("上架人")
        private String sj_emp;
        @ApiModelProperty("上架数量")
        private Integer pick_qty;
        @ApiModelProperty("破损数量")
        private Integer damage_qty;
        @ApiModelProperty("差异数量")
        private Integer diff_qty;
        @ApiModelProperty("原上架派工数量")
        private Integer old_qty;
        @ApiModelProperty("变更数量")
        private Integer new_qty;
}
src/main/java/com/zy/api/entity/StockAdjustParams.java
New file
@@ -0,0 +1,27 @@
package com.zy.api.entity;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "StockAdjustParams", description = "零件损溢单参数")
public class StockAdjustParams extends OrderParams {
    @ApiModelProperty("调整原因")
    private String reason;
    @ApiModelProperty("调整原因名称")
    private String reason_name;
    @ApiModelProperty("调整单编号")
    private String bsby_no;
    @ApiModelProperty("调整单明细列表")
    List<OrderItemsParam> details;
}
src/main/java/com/zy/api/entity/StockUpOrderParams.java
New file
@@ -0,0 +1,19 @@
package com.zy.api.entity;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "StockUpOrderParams", description = "备货订单参数")
public class StockUpOrderParams extends OrderParams{
    @ApiModelProperty("订单明细")
    private List<OutOrderParams> details;
}
src/main/java/com/zy/api/entity/SyncMatParmas.java
New file
@@ -0,0 +1,45 @@
package com.zy.api.entity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel(value = "SyncMatParmas", description = "物料同步参数")
public class SyncMatParmas implements Serializable {
    @ApiModelProperty("零件类型")
    private String pro_type;
    @ApiModelProperty("零件代码")
    private String pro_komcode;
    @ApiModelProperty("供应商编码")
    private String pro_id;
    @ApiModelProperty("入库通知数量")
    private Double inv_qty;
    @ApiModelProperty("公司ID")
    private String company_id;
    @ApiModelProperty("零件名称")
    private String pro_name;
    @ApiModelProperty("尺寸")
    private String pro_size;
    @ApiModelProperty("重量")
    private String pro_wet;
    @ApiModelProperty("更新时间")
    private String update_time;
}
src/main/java/com/zy/api/entity/dto/XSR.java
New file
@@ -0,0 +1,77 @@
package com.zy.api.entity.dto;
import java.sql.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@ApiModel(value = "XSR", description = "基础响应")
public class XSR<T> {
    private static final String SUCCESS_CODE = "200";
    private static final String FAIL_CODE = "500";
    private String code;
    private String message;
    private Boolean success;
    private String returnMessage;
    private T result;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date timestamp;
    public XSR() {
        this.timestamp = new Date(System.currentTimeMillis());
    }
    public static <T> XSR<T> ok() {
        return new XSR<T>()
                .setCode(SUCCESS_CODE)
                .setSuccess(true)
                .setMessage("操作成功")
                .setReturnMessage("操作成功");
    }
    public static <T> XSR<T> ok(T data) {
        return new XSR<T>()
                .setCode(SUCCESS_CODE)
                .setSuccess(true)
                .setMessage("操作成功")
                .setReturnMessage("操作成功")
                .setResult(data);
    }
    public static <T> XSR<T> ok(T data, String message) {
        return new XSR<T>()
                .setCode(SUCCESS_CODE)
                .setSuccess(true)
                .setMessage(message)
                .setReturnMessage(message)
                .setResult(data);
    }
    public static <T> XSR<T> error(String message) {
        return new XSR<T>()
                .setCode(FAIL_CODE)
                .setSuccess(false)
                .setMessage(message)
                .setReturnMessage(message);
    }
    public static <T> XSR<T> error(String code, String message) {
        return new XSR<T>()
                .setCode(code)
                .setSuccess(false)
                .setMessage(message)
                .setReturnMessage(message);
    }
}
src/main/java/com/zy/api/enums/LocAreaType.java
New file
@@ -0,0 +1,24 @@
package com.zy.api.enums;
/**
 * 库区类型
 */
public enum LocAreaType {
    /** 大库区 */
     AUTOMATED("1", "立库"),
    /** 中库区 */
    SO_HOLDING("2", "SO等待区"),
    /** 小件库区 */
    EO_HOLDING("3", "EO等待区");
    public String type;
    public String desc;
    LocAreaType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}
src/main/java/com/zy/api/enums/MatLocType.java
New file
@@ -0,0 +1,65 @@
package com.zy.api.enums;
/**
 * 物料所属库位类型
 * @author Ryan
 * @date 2025/12/6 10:41
 * @return null
 */
public enum MatLocType {
    /** 小件 */
    AUTOMATED("12", "小件"),
    /** 中件 */
    SO_HOLDING("13", "中件"),
    /** 大件 */
    EO_HOLDING("14", "滤芯");
    public String type;
    public String desc;
    MatLocType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public static String getTagName(String type) {
        if (type.equals(MatLocType.AUTOMATED.type)) {
            return MatLocType.AUTOMATED.desc;
        } else if (type.equals(MatLocType.SO_HOLDING.type)) {
            return MatLocType.SO_HOLDING.desc;
        } else if (type.equals(MatLocType.EO_HOLDING.type)) {
            return MatLocType.EO_HOLDING.desc;
        } else {
            return null;
        }
    }
    public static Long getTag(String type) {
        if (type.equals(MatType.LARGE.type)) {
            return Long.parseLong(MatLocType.AUTOMATED.type);
        } else if (type.equals(MatType.MIDDEL.type)) {
            return Long.parseLong(MatLocType.SO_HOLDING.type);
        } else if (type.equals(MatType.SMALL.type)) {
            return Long.parseLong(MatLocType.EO_HOLDING.type);
        } else {
            return null;
        }
    }
    public static String getMatTag(String type) {
        if (type.equals(MatLocType.AUTOMATED.type)) {
            return MatType.LARGE.type;
        } else if (type.equals(MatLocType.SO_HOLDING.type)) {
            return MatType.MIDDEL.type;
        } else if (type.equals(MatLocType.EO_HOLDING.type)) {
            return MatType.SMALL.type;
        } else {
            return null;
        }
    }
}
src/main/java/com/zy/api/enums/MatType.java
New file
@@ -0,0 +1,36 @@
package com.zy.api.enums;
/**
 * 物料类型
 */
public enum MatType {
    /** 滤芯 */
    LARGE("1", "滤芯"),
    /** 中件 */
    MIDDEL("2", "中件"),
    /** 小件 */
    SMALL("3", "小件");
    public String type;
    public String desc;
    MatType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public static Long getTag(String type) {
        if (type.equals(MatType.LARGE.type)) {
            return Long.parseLong(MatLocType.AUTOMATED.type);
        } else if (type.equals(MatType.MIDDEL.type)) {
            return Long.parseLong(MatLocType.SO_HOLDING.type);
        } else if (type.equals(MatType.SMALL.type)) {
            return Long.parseLong(MatLocType.EO_HOLDING.type);
        } else {
            return null;
        }
    }
}
src/main/java/com/zy/api/enums/OrderType.java
New file
@@ -0,0 +1,57 @@
package com.zy.api.enums;
/**
 * @author Ryan
 * @version 1.0
 * @title PurchaseType
 * @description
 * @create 2025/3/5 15:54
 */
public enum OrderType {
    //订单类型
    ORDER_OUT("out", "出库单"),
    ORDER_IN("in", "入库单"),
    ORDER_TRANSFER("transfer", "调拔单"),
    ORDER_REVISE("revise", "库存调整"),
    ORDER_CHECK("check", "盘点单");
    OrderType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public String type;
    public String desc;
    public static String getTypeVal(String desc) {
        if (desc.equals(OrderType.ORDER_IN.desc)) {
            return OrderType.ORDER_IN.type;
        } else if (desc.equals(OrderType.ORDER_OUT.desc)) {
            return OrderType.ORDER_OUT.type;
        } else if (desc.equals(OrderType.ORDER_CHECK.desc)) {
            return OrderType.ORDER_CHECK.type;
        } else if (desc.equals(OrderType.ORDER_TRANSFER.desc)) {
            return OrderType.ORDER_TRANSFER.type;
        } else if (desc.equals(OrderType.ORDER_REVISE.desc)) {
            return OrderType.ORDER_REVISE.type;
        }
        return null;
    }
    public static String getValType(String type) {
        if (type.equals(OrderType.ORDER_IN.type)) {
            return OrderType.ORDER_IN.desc;
        } else if (type.equals(OrderType.ORDER_OUT.type)) {
            return OrderType.ORDER_OUT.desc;
        } else if (type.equals(OrderType.ORDER_CHECK.type)) {
            return OrderType.ORDER_CHECK.desc;
        } else if (type.equals(OrderType.ORDER_TRANSFER.type)) {
            return OrderType.ORDER_TRANSFER.desc;
        } else if (type.equals(OrderType.ORDER_REVISE.type)) {
            return OrderType.ORDER_REVISE.desc;
        }
        return null;
    }
}
src/main/java/com/zy/api/enums/OrderWkType.java
New file
@@ -0,0 +1,45 @@
package com.zy.api.enums;
public enum OrderWkType {
    // 订单类型
    ORDER_WK_PUR_IN("0", "采购入库"),
    ORDER_WK_TRANSFER_IN("1", "调拔入库"),
    ORDER_WK_SALE_IN("2", "客户退货"),
    ORDER_WK_BAG_IN("5", "索赔入库"),
    ORDER_WK_SUPLUS_IN("7", "报溢入库"),
    ORDER_WK_PRO_UPDATE_IN("8", "件号变更入库"),
    ORDER_WK_MEGER_IN("K", "组合拆零入库"),
    ORDER_WK_ORDER_OUT_EO("11", "备货指示派工单(EO)"),
    ORDER_WK_ORDER_OUT_SO("12", "备货指示派工单(SO)"),
    ORDER_WK_ORDER_OUT("13", "备货单");
    OrderWkType(String val, String desc) {
        this.val = val;
        this.desc = desc;
    }
    public String val;
    public String desc;
    public static String getTypeVal(String val) {
        if (val.equals(OrderWkType.ORDER_WK_PUR_IN.val)
                || val.equals(OrderWkType.ORDER_WK_SUPLUS_IN.val)
                || val.equals(OrderWkType.ORDER_WK_MEGER_IN.val)
                || val.equals(OrderWkType.ORDER_WK_PRO_UPDATE_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_TRANSFER_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_SALE_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_BAG_IN.val)) {
            return OrderType.ORDER_IN.type;
        } else if (val.equals(OrderWkType.ORDER_WK_ORDER_OUT_EO.val)  || val.equals(OrderWkType.ORDER_WK_ORDER_OUT_SO.val)  || val.equals(OrderWkType.ORDER_WK_ORDER_OUT.val)) {
            return OrderType.ORDER_OUT.type;
        } else {
            return null;
        }
    }
}
src/main/java/com/zy/api/service/HWmsApiService.java
New file
@@ -0,0 +1,78 @@
package com.zy.api.service;
import java.util.List;
import com.zy.api.controller.params.PageRequestParams;
import com.zy.api.entity.PubOrderParams;
import com.zy.api.entity.ReportOrderParam;
import com.zy.api.entity.StockAdjustParams;
import com.zy.api.entity.StockUpOrderParams;
import com.zy.api.entity.SyncMatParmas;
import com.zy.api.entity.dto.XSR;
import com.zy.asrs.entity.Order;
public interface HWmsApiService {
    /**
     * 上架派工单下发
     * @author Ryan
     * @date 2025/11/24 14:42
     * @param params
     * @return com.core.common.R
     */
    XSR receiveOrders(List<PubOrderParams> params);
    /**
     * 基础零件变更
     * @author Ryan
     * @date 2025/11/24 15:04
     * @param matnrs
     * @return com.core.common.R
     */
    XSR basMatupdate(List<SyncMatParmas> matnrs);
    /**
     * 新增或修改单据信息
     * @author Ryan
     * @date 2025/11/24 15:33
     */
    void addOrUpdateOrders(PubOrderParams params, String type) ;
    /**
     * 上架派工单反馈
     *
     * @param params
     * @param order
     * @return
     */
    XSR getInDispatchResult(List<ReportOrderParam> params, Order order);
    /**
     * 备货指示派工单下发
     * @param params
     * @return
     */
    XSR sendOutDispatch(List<PubOrderParams> params);
    /**
     * 备货单下发
     * @author Ryan
     * @date 2025/11/24 15:40
     * @param params
     * @return com.core.common.R
     */
    XSR getOutDetails(List<StockUpOrderParams> params);
    /**
     * 查询WMS库存信息
     * @author Ryan
     * @date 2025/11/24 15:22
     * @param params
     * @return com.core.common.R
     */
    XSR getStockInfo(PageRequestParams params);
}
src/main/java/com/zy/api/service/impl/HWmsApiServiceImpl.java
New file
@@ -0,0 +1,539 @@
package com.zy.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.api.controller.params.PageRequestParams;
import com.zy.api.entity.OrderItemsParam;
import com.zy.api.entity.OrderParams;
import com.zy.api.entity.OutOrderParams;
import com.zy.api.entity.PubOrderParams;
import com.zy.api.entity.ReportOrderParam;
import com.zy.api.entity.StockUpOrderParams;
import com.zy.api.entity.SyncMatParmas;
import com.zy.api.entity.dto.XSR;
import com.zy.api.enums.MatLocType;
import com.zy.api.enums.OrderType;
import com.zy.api.enums.OrderWkType;
import com.zy.api.service.HWmsApiService;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.enums.CommonEnum;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Slf4j
@Service("kopenApiServiceImpl")
public class HWmsApiServiceImpl implements HWmsApiService {
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private MatService matService;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
//    @Value("${kopen.url}")
    private String url;
//    @Value("${kopen.port}")
    private String port;
//    @Value("${kopen.prefix}")
    private String prefix;
    /**
     * 接收下发订单信息
     *
     * @param orderParams
     * @return com.core.common.R
     * @author Ryan
     * @date 2025/11/24 14:49
     */
    @Override
    public XSR receiveOrders(List<PubOrderParams> orderParams) {
        orderParams.forEach(params -> {
            if (params.getType().equals(OrderWkType.getTypeVal(params.getType()))) {
                throw new CoolException("当前类型不是上架派工单!!");
            }
            addOrUpdateOrders(params, "add");
        });
        return XSR.ok("单据下发成功!!");
    }
    /**
     * 上架派工单反馈
     *
     * @author Ryan
     * @date 2025/11/24 15:33
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public XSR getInDispatchResult(List<ReportOrderParam> params, Order order) {
        if (Objects.isNull(params)) {
            return XSR.error("参数不能为空!!");
        }
        String response = null;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url + ":" + port)
                    .setPath(prefix + "/getInDispatchResult")
                    .setJson(JSONObject.toJSONString(params))
                    .build()
                    .doPost();
            if (Objects.isNull(response) || response.trim().isEmpty()) {
                return XSR.error("外网接口无响应!!");
            }
            JSONObject jsonObject = JSONObject.parseObject(response);
            Integer code = jsonObject.getInteger("code");
            if (!Objects.isNull(code) && code.equals(200)) {
                if (!Objects.isNull(order)) {
                    order.setReportOnce(5);
                    orderService.updateById(order);
                }
                return XSR.ok("入库单上报完成!!");
            } else {
                if (!Objects.isNull(order)) {
                    int reportOnce = order.getReportOnce();
                    reportOnce ++;
                    order.setReportOnce(reportOnce);
                    orderService.updateById(order);
                }
                String msg = jsonObject.getString("message");
                return XSR.error(Objects.isNull(msg) ? "上报失败!!" : msg);
            }
        } catch (Exception e) {
            if (!Objects.isNull(order)) {
                int reportOnce = order.getReportOnce();
                reportOnce ++;
                order.setReportOnce(reportOnce);
                orderService.updateById(order);
            }
            log.error(e.getMessage(), e);
            return XSR.error(e.getMessage());
        }
    }
    /**
     * 获取自定义请求头
     * @author Ryan
     * @date 2025/12/29 9:11
     * @return java.util.Map<java.lang.String,java.lang.Object>
     */
    private Map<String, Object> getHeaderParam() {
        Map<String, Object> headerParam = new HashMap<>();
//        headerParam.put("accept", "*/*");
//        headerParam.put("connection", "Keep-Alive");
        //设置请求连接的Token
        headerParam.put("api_key", "WMS");
        headerParam.put("charset", "UTF-8");
        headerParam.put("timestamp", new Date());
        headerParam.put("format", "xml");
        headerParam.put("signature", "c56ced444ed772098ffeb59537bbfa59");
        return headerParam;
    }
    /* */
    /**
     * 备货指示派工单下发
     *
     * @param pubOrderParams
     * @return com.core.common.R
     * @author Ryan
     * @date 2025/11/24 15:21
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public XSR sendOutDispatch(List<PubOrderParams> pubOrderParams) {
        if (Objects.isNull(pubOrderParams) || pubOrderParams.isEmpty()) {
            return XSR.error("参数不能为空!!");
        }
        pubOrderParams.forEach(params -> {
            // 校验参数
            if (Objects.isNull(params.getDispatch_no())) {
                throw new CoolException("派工单编号不能为空!!");
            }
            if (Objects.isNull(params.getKopen_id())) {
                throw new CoolException("流水号不能为空!!");
            }
            if (Objects.isNull(params.getCompany_id())) {
                throw new CoolException("公司ID不能为空!!");
            }
            addOrUpdateOrders(params, "add");
        });
        return XSR.ok("备货指示派工单下发成功!!");
    }
    // /**
    // * 备货指示派工单
    // *
    // * @author Ryan
    // * @date 2025/12/16 9:15
    // * @param params
    // */
    // private void outOrderAddAndUpdate(PubOrderParams params, String type) {
    // if (Objects.isNull(params)) {
    // throw new CoolException("参数不能为空!!");
    // }
    // if (Objects.isNull(params.getType())) {
    // throw new CoolException("订单类型不能为空!!");
    // }
    // OrderParams orderParams =
    // JSONObject.parseObject(JSONObject.toJSONString(params), OrderParams.class);
    // Order order = orderService.selectOne(new
    // EntityWrapper<Order>().eq("order_no", orderParams.getInv_no()));
    // if (type.equals("add") && !Objects.isNull(order)) {
    // throw new CoolException("单据已存在, 不可重复添加!!");
    // }
    // // 判断订单是否存在
    // if (Objects.isNull(order)) {
    // /** 不存在,新增订单 */
    // generateOrders(params);
    // } else {
    // /** 存在,删除老订单,更新插入新订单 */
    // // 删除旧订单明细
    // if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id",
    // order.getId()))) {
    // throw new CoolException("订单明细删除失败!!");
    // }
    // ;
    // if (!orderService.deleteById(order.getId())) {
    // throw new CoolException("原单据删除失败!!");
    // }
    // generateOrders(params);
    // }
    // }
    /**
     * 基础零件变更
     *
     * @param params
     * @return com.core.common.R
     * @author Ryan
     * @date 2025/11/24 15:05
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public synchronized XSR basMatupdate(List<SyncMatParmas> params) {
        if (Objects.isNull(params) || params.isEmpty()) {
            return XSR.error("参数不能为空!!");
        }
        params.forEach(mats -> {
            if (Objects.isNull(mats)) {
                throw new CoolException("物料编码不能为空!!");
            }
            if (Objects.isNull(mats.getPro_type())) {
                throw new CoolException("零件类型不能为空!!");
            }
            Mat matnr = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", mats.getPro_komcode()));
            if (!Objects.isNull(matnr)) {
                // 订单时间
                if (Utils.isValidFormat(mats.getUpdate_time(), "yyyy-MM-dd HH:mm:ss")) {
                    Date date1 = Utils.getFormateDate(mats.getUpdate_time());
                    matnr.setUpdateTime(date1);
                }
                matnr.setMaktx(mats.getPro_name());
                matnr.setSpecs(mats.getPro_size());
                matnr.setWeight(Objects.isNull(mats.getPro_wet()) ? 0.0 : Double.parseDouble(mats.getPro_wet()));
                matnr.setSuppCode(mats.getPro_id());
                matnr.setTagId(MatLocType.getTag(mats.getPro_type()));
                matnr.setLocType(MatLocType.getTag(mats.getPro_type()));
                matnr.setManu(mats.getCompany_id());
                if (!matService.updateById(matnr)) {
                    throw new CoolException("物料更新失败或无需更新!!");
                }
            } else {
                if (Objects.isNull(matnr)) {
                    matnr = new Mat();
                }
                // 订单时间
                if (Utils.isValidFormat(mats.getUpdate_time(), "yyyy-MM-dd HH:mm:ss")) {
                    Date date1 = Utils.getFormateDate(mats.getUpdate_time());
                    matnr.setUpdateTime(date1);
                }
                matnr.setMaktx(mats.getPro_name());
                matnr.setMatnr(mats.getPro_komcode());
                matnr.setSpecs(mats.getPro_size());
                matnr.setWeight(Double.parseDouble(mats.getPro_wet()));
                matnr.setSuppCode(mats.getPro_id());
                matnr.setTagId(MatLocType.getTag(mats.getPro_type()));
                matnr.setLocType(MatLocType.getTag(mats.getPro_type()));
                matnr.setManu(mats.getCompany_id());
                if (!matService.insert(matnr)) {
                    throw new CoolException("物料更新失败!!");
                }
            }
        });
        return XSR.ok("保存成功!!");
    }
    /**
     * 新增或修改订单信息
     *
     * @author Ryan
     * @date 2025/11/24 15:32
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addOrUpdateOrders(PubOrderParams params, String type) {
        if (Objects.isNull(params)) {
            throw new CoolException("参数不能为空!!");
        }
        if (Objects.isNull(params.getType())) {
            throw new CoolException("订单类型不能为空!!");
        }
        OrderParams orderParams = JSONObject.parseObject(JSONObject.toJSONString(params), OrderParams.class);
        // Order order = orderService.selectOne(new
        // EntityWrapper<Order>().eq("order_no", orderParams.getDispatch_no()));
        Order order = null;
        if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) {
            // 入库
            order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no",
                    orderParams.getDispatch_no()));
        } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) {
            // 出库
            if (OrderWkType.ORDER_WK_ORDER_OUT.val.equals(params.getType())) {
                // 备货单出库
                order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no",
                        orderParams.getPick_no()));
            } else if (OrderWkType.ORDER_WK_ORDER_OUT_EO.val.equals(params.getType())
                    || OrderWkType.ORDER_WK_ORDER_OUT_SO.val.equals(params.getType())) {
                // 备货指示派工单(EO/SO)出库
                order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no",
                        orderParams.getDispatch_no()));
            } else {
                throw new CoolException("单据类型不存在,不支持添加!!");
            }
        } else {
            throw new CoolException("单据类型不存在,不支持添加!!");
        }
        // 出库
        if (type.equals("add") && !Objects.isNull(order)) {
            throw new CoolException("单据已存在, 不可重复添加!!");
        }
        // 判断订单是否存在
        if (Objects.isNull(order)) {
            /** 不存在,新增订单 */
            generateOrders(params);
        } else {
            /** 存在,删除老订单,更新插入新订单 */
            // 删除旧订单明细
            if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) {
                throw new CoolException("订单明细删除失败!!");
            }
            if (!orderService.deleteById(order.getId())) {
                throw new CoolException("原单据删除失败!!");
            }
            generateOrders(params);
        }
    }
    public static String generateUUID(OrderParams params) {
        return UUID.randomUUID().toString();
    }
    /**
     * 生成订单信息
     *
     * @param params
     */
    @Transactional(rollbackFor = Exception.class)
    public void generateOrders(PubOrderParams params) {
        // 将数据当新订单插入
        Order newOrder = new Order();
        // 派工单号
        newOrder.setOrderNo(params.getDispatch_no());
        if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) {
            // 入库
            newOrder.setPakinPakoutStatus(1);
//            Integer docType = OrderWkType.getDocType(params.getType());
//            newOrder.setDocType(Long.parseLong(docType + ""));
            newOrder.setNumber(params.getInv_no());
        } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) {
            // 出库
            if (OrderWkType.ORDER_WK_ORDER_OUT.val.equals(params.getType())) {
                // 备货单出库
                newOrder.setOrderNo(params.getPick_no());
                newOrder.setNumber(params.getDispatch_no());
                newOrder.setShipCode(params.getOrder_no());
                newOrder.setCstmrName(params.getCus_id());
                newOrder.setTel(params.getCus_address());
//                newOrder.setDocType(Long.parseLong(OrderTypeEnum.STOCK.type + ""));
            } else if (OrderWkType.ORDER_WK_ORDER_OUT_EO.val.equals(params.getType())
                    || OrderWkType.ORDER_WK_ORDER_OUT_SO.val.equals(params.getType())) {
                // 备货指示派工单(EO/SO)出库
//                newOrder.setDocType(Long.parseLong(OrderTypeEnum.TRANSFER.type + ""));
            }
            newOrder.setPakinPakoutStatus(2);
        }
        newOrder.setUuid(generateUUID(params));
        // 流水号(唯一)
        newOrder.setDefNumber(params.getKopen_id());
//        newOrder.setTargetLocation(params.getTarget_location());
        // 箱号
        newOrder.setItemName(params.getPm_tktid());
//        newOrder.setSettle(OrderSettle.ORDER_SETTLE_HOLDING.type);
        newOrder.setStatus(CommonEnum.COMMON_ENUM_Y.type);
        // 订单时间
        if (Utils.isValidFormat(params.getUpdate_time(), "yyyy-MM-dd HH:mm:ss")) {
            newOrder.setOrderTime(params.getUpdate_time());
        }
        // 公司ID
        newOrder.setCstmrName(params.getCompany_id());
        newOrder.setCreateTime(new Date());
        newOrder.setUpdateTime(new Date());
        if (!orderService.insert(newOrder)) {
            throw new RuntimeException("新增订单失败!!");
        }
        if (!Objects.isNull(params.getDetails()) && !params.getDetails().isEmpty()) {
            params.getDetails().forEach(item -> {
                Mat matnr = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", item.getPro_komcode()));
                if (Objects.isNull(matnr)) {
                    throw new CoolException("物料编码不存在!!");
                }
                OrderDetl orderItem = new OrderDetl();
                BeanUtils.copyProperties(matnr, orderItem);
                orderItem.setOrderId(newOrder.getId());
                orderItem.setOrderNo(newOrder.getOrderNo());
                if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) {
                    // 入库
                    orderItem.setAnfme(Math.round(item.getInv_qty() * 10000) / 10000.0);
                } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) {
                    // 出库
                    if (OrderWkType.ORDER_WK_ORDER_OUT.val.equals(params.getType())) {
                        // 备货单出库
                        orderItem.setAnfme(Math.round(item.getPick_qty() * 10000) / 10000.0);
                    } else if (OrderWkType.ORDER_WK_ORDER_OUT_EO.val.equals(params.getType())
                            || OrderWkType.ORDER_WK_ORDER_OUT_SO.val.equals(params.getType())) {
                        // 备货指示派工单(EO/SO)出库
                        orderItem.setAnfme(Math.round(item.getOrder_qty() * 10000) / 10000.0);
                    }
                }
                orderItem.setMatnr(matnr.getMatnr());
                orderItem.setMaktx(matnr.getMaktx());
                orderItem.setBrand(matnr.getBrand());
                orderItem.setBatch(1 + "");
                orderItem.setStandby1(item.getPro_id());
                // 关联上加派工单号+零件代码+供应商代码
                orderItem.setThreeCode(item.getTotal_serial());
                // 供应商代码
                orderItem.setSuppCode(item.getPro_id());
                orderItem.setCreateTime(new Date());
                orderItem.setUpdateTime(new Date());
                if (!orderDetlService.insert(orderItem)) {
                    throw new CoolException("订单明细新增失败!!");
                }
            });
        }
    }
    /**
     * 备货单下发
     *
     * @param stockUpParams
     * @return com.core.common.R
     * @author Ryan
     * @date 2025/11/24 15:40
     */
    @Override
    public XSR getOutDetails(List<StockUpOrderParams> stockUpParams) {
        if (Objects.isNull(stockUpParams)) {
            return XSR.error("参数不能为空!!");
        }
        stockUpParams.forEach(params -> {
            if (Objects.isNull(params.getDispatch_no())) {
                throw new CoolException("派工单编号不能为空!!");
            }
            if (Objects.isNull(params.getKopen_id())) {
                throw new CoolException("流水号不能为空!!");
            }
            if (Objects.isNull(params.getCompany_id())) {
                throw new CoolException("公司ID不能为空!!");
            }
            if (Objects.isNull(params.getDetails()) || params.getDetails().isEmpty()) {
                throw new CoolException("订单明细不能为空!!");
            }
            List<OrderItemsParam> items = new ArrayList<>();
            if (params.getDetails() != null) {
                for (OutOrderParams detail : params.getDetails()) {
                    if (detail.getPartList() != null) {
                        items.addAll(detail.getPartList());
                    }
                }
            }
            params.getDetails().forEach(item -> {
                PubOrderParams pubOrderParams = new PubOrderParams();
                BeanUtils.copyProperties(params, pubOrderParams);
                pubOrderParams.setType(item.getType())
                        .setPick_no(item.getPick_no())
                        .setCus_address(item.getCus_address())
                        .setOrder_no(item.getOrder_no())
                        .setUpdate_time(params.getUpdate_time())
                        .setCus_id(item.getCus_id());
                pubOrderParams.setDetails(item.getPartList());
                addOrUpdateOrders(pubOrderParams, "add");
            });
        });
        return XSR.ok("备货单下发成功!!");
    }
    /**
     * 查询WMS库存信息
     *
     * @param params
     * @return com.core.common.R
     */
    @Override
    public XSR getStockInfo(PageRequestParams params) {
        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
        if (!Objects.isNull(params.getPro_id())) {
            wrapper.eq("supp_code", params.getPro_id());
        }
        if (!Objects.isNull(params.getPro_komcode())) {
            wrapper.eq("matnr", params.getPro_komcode());
        }
        Page<LocDetl> locDetls = locDetlService.selectPage(new Page<>(params.getCurr(), params.getLimit()),  wrapper);
        return XSR.ok(locDetls.getRecords());
    }
    private String kopen() {
        return url + ":" + port + prefix;
    }
}
src/main/java/com/zy/asrs/entity/Order.java
@@ -262,6 +262,9 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    @ApiModelProperty("上报次数")
    private Integer reportOnce;
    /**
     * 状态 1: 进行中  0: 初始  2:已完成
     */
src/main/java/com/zy/asrs/utils/Utils.java
@@ -16,10 +16,13 @@
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
 * Created by vincent on 2020/8/27
@@ -47,6 +50,26 @@
            }
            return msgBuilder.toString();
        }
    }
    public static boolean isValidFormat(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(false); // 严格模式,必须完全匹配格式
        try {
            sdf.parse(dateStr);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }
    public static Date getFormateDate(String datestr) {
        //字符串转日期
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime parse = LocalDateTime.parse(datestr, dateTimeFormatter);
        Instant instant = parse.atZone(ZoneId.systemDefault()).toInstant();
        Date date = Date.from(instant);
        return date;
    }
    /**
@@ -631,4 +654,15 @@
        return result;
    }
    /**
     * 日期转换为字符串
     * @param date 日期
     * @param format 格式
     * @return 字符串
     */
    public static String dateToStr(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }
}
src/main/resources/application-dev.yml
@@ -11,8 +11,8 @@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    username: sa
    password: Skyouc#23
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jsxswms
    password: sa@123
    url: jdbc:sqlserver://192.168.4.15:1433;databasename=jxhcwms
  mvc:
    static-path-pattern: /**
  redis: