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: