Browse Source

【华信科】【富勒WMS对接】【库存转移确认】

wuyx 8 months ago
parent
commit
e0da31d25b

+ 199 - 0
src/main/java/com/uas/eis/entity/vwms/req/AdjustConfirm.java

@@ -0,0 +1,199 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.uas.eis.utils.StringUtil;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AdjustConfirm {
+    private AdjustmentOrder adjustmentOrder;
+    private OrderLines orderLines;
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class AdjustmentOrder {
+        /** 转移单号(ERP单号) 长度:50 */
+        private String adjustmentOrderCode;
+        /** 仓储系统转移单号 长度:50 */
+        private String adjustmentOrderId;
+        /** 转移单类型 长度:50 例如: ZCTZ=转仓调整单, KCYK=库存移库 */
+        private String adjustmentOrderType;
+        /** 仓库代码 长度:50 */
+        private String warehouseCode;
+        /** 货主代码 长度:50 */
+        private String ownerCode;
+        /** 外部业务代码 长度:50 消息ID, 用于去重 */
+        private String outBizCode;
+        /** 订单完成时间 长度:19 YYYY-MM-DD HH:MM:SS */
+        private String orderConfirmTime;
+        /** 操作人 长度:20 */
+        private String updateCode;
+        /** 备注 长度:500 */
+        private String remark;
+    }
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class OrderLines {
+        private List<OrderLine> orderLine;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class OrderLine {
+            /** 货品代码 长度:50 */
+            private String itemCode;
+            /** 仓储系统货品代码 长度:50 */
+            private String itemId;
+            /** 货品名称 长度:200 */
+            private String itemName;
+            /** 计划数量 */
+            private Integer planQty;
+            /** 实际数量 */
+            private Integer actualQty;
+            /** 行号 */
+            private Integer lineNo;
+            /** 序列号,多个序列号用英文逗号隔开 */
+            private String serialNo;
+            /** 原信息 */
+            private Source source;
+            /** 目标信息 */
+            private Target target;
+
+            @Data
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class Source {
+                /** 原质量状态 长度:50 ZP=正品, CC=残次, 默认为ZP */
+                private String inventoryType;
+                /** 原虚拟仓库 长度:50 */
+                private String virtualWarehouse;
+                /** 原生产日期 长度:10 YYYY-MM-DD */
+                private String productDate;
+                /** 原失效日期 长度:10 YYYY-MM-DD */
+                private String expireDate;
+                /** 原批次号 长度:50 */
+                private String batchCode;
+                /** 原入库日期 长度:10 YYYY-MM-DD */
+                private String stockinDate;
+                /** 原自定义批次1 长度:50 */
+                private String userDefined1;
+                /** 原自定义批次2 长度:50 */
+                private String userDefined2;
+                /** 原自定义批次3 长度:50 */
+                private String userDefined3;
+                /** 原自定义批次4 长度:50 */
+                private String userDefined4;
+            }
+
+            @Data
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class Target {
+                /** 目标质量状态 长度:50 ZP=正品, CC=残次, 默认为ZP */
+                private String inventoryType;
+                /** 目标虚拟仓库 长度:50 */
+                private String virtualWarehouse;
+                /** 目标生产日期 长度:10 YYYY-MM-DD */
+                private String productDate;
+                /** 目标失效日期 长度:10 YYYY-MM-DD */
+                private String expireDate;
+                /** 目标批次号 长度:50 */
+                private String batchCode;
+                /** 目标入库日期 长度:10 YYYY-MM-DD */
+                private String stockinDate;
+                /** 目标自定义批次1 长度:50 */
+                private String userDefined1;
+                /** 目标自定义批次2 长度:50 */
+                private String userDefined2;
+                /** 目标自定义批次3 长度:50 */
+                private String userDefined3;
+                /** 目标自定义批次4 长度:50 */
+                private String userDefined4;
+            }
+        }
+    }
+
+    public String getMasterName() {
+        if (orderLines.getOrderLine() != null) {//账套名称
+            return orderLines.getOrderLine().get(0).getSource().getUserDefined1();
+        } else {
+            return null;
+        }
+    }
+
+    public String getGenerateMainSql() {
+        StringBuilder sql = new StringBuilder("MERGE INTO @MASTERCODE.prodiowms wmsl USING (")
+                .append("SELECT ")
+                .append("@PIID").append(" PIID, ")
+                .append("'").append("@INOUTNO").append("' PIINOUTNO, ")
+                .append("'").append(StringUtil.nvl(adjustmentOrder.getOwnerCode(), "")).append("' OWNERCODE, ")
+                .append("'").append(StringUtil.nvl(adjustmentOrder.getWarehouseCode(), "")).append("' WAREHOUSECODE, ")
+                .append("'").append(StringUtil.nvl(adjustmentOrder.getAdjustmentOrderCode(), "")).append("' WMSORDERID, ")
+                .append("'").append(StringUtil.nvl(adjustmentOrder.getAdjustmentOrderType(), "")).append("' WMSORDERTYPE, ")
+                .append("'").append(StringUtil.nvl(adjustmentOrder.getOutBizCode(), "")).append("' OUTBIZCODE, ")
+                .append((StringUtil.hasText(adjustmentOrder.getOrderConfirmTime()) ? "to_date('" + adjustmentOrder.getOrderConfirmTime() + "','yyyy-mm-dd hh24:mi:ss')" : "null")).append(" deliveryTime, ")
+                .append("FROM dual) doc ON (wmsl.PIID = doc.PIID AND wmsl.PIINOUTNO = doc.PIINOUTNO) ")
+                .append("WHEN MATCHED THEN UPDATE SET ")
+                .append("wmsl.OWNERCODE = doc.OWNERCODE, ")
+                .append("wmsl.WAREHOUSECODE = doc.WAREHOUSECODE, ")
+                .append("wmsl.WMSORDERID = doc.WMSORDERID, ")
+                .append("wmsl.WMSORDERTYPE = doc.WMSORDERTYPE, ")
+                .append("wmsl.OUTBIZCODE = doc.OUTBIZCODE, ")
+                .append("wmsl.deliveryTime = doc.deliveryTime, ")
+                .append("wmsl.UTIME = SYSDATE ")
+                .append("WHEN NOT MATCHED THEN INSERT (ITIME,PIID, PIINOUTNO, OWNERCODE, WAREHOUSECODE, WMSORDERID, WMSORDERTYPE, OUTBIZCODE, deliveryTime) ")
+                .append("VALUES (SYSDATE,doc.PIID, doc.PIINOUTNO, doc.OWNERCODE, doc.WAREHOUSECODE, doc.WMSORDERID, doc.WMSORDERTYPE, doc.OUTBIZCODE, doc.deliveryTime)");
+        return sql.toString();
+    }
+
+    public List<String> getGenerateLinesSql() {
+        List<String> sqls = new ArrayList<>();
+        for (AdjustConfirm.OrderLines.OrderLine line : orderLines.getOrderLine()) {
+            sqls.add(getGenerateLinesSql(line));
+        }
+        return sqls;
+    }
+
+    public String getGenerateLinesSql(AdjustConfirm.OrderLines.OrderLine line) {
+        StringBuilder sql = new StringBuilder();
+        sql.append("MERGE INTO ").append("@MASTERCODE").append(".prodiowms_Lines wmsl USING (")
+                .append("SELECT ")
+                .append("@PIID").append(" PIID, ")
+                .append(line.getLineNo()).append(" LINENO, ")
+                .append("'").append(line.getItemCode()).append("' ITEMCODE, ")
+                .append("'").append(StringUtil.nvl(line.getPlanQty(), "")).append("' PLANQTY, ")
+                .append(StringUtil.nvl(line.getActualQty(), "0")).append(" ACTUALQTY, ")
+                .append("'").append(StringUtil.nvl(line.getSerialNo(), "")).append("' SERIALNO, ")
+
+                .append("'").append(StringUtil.nvl(line.getSource().getVirtualWarehouse(), "")).append("' S_VIRTUALWAREHOUSE, ")
+                .append("'").append(StringUtil.nvl(line.getSource().getUserDefined1(), "")).append("' S_USERDEFINED1, ")
+                .append("'").append(StringUtil.nvl(line.getSource().getUserDefined3(), "")).append("' S_USERDEFINED3, ")
+                .append("'").append(StringUtil.nvl(line.getSource().getUserDefined4(), "")).append("' S_USERDEFINED4, ")
+
+                .append("'").append(StringUtil.nvl(line.getTarget().getVirtualWarehouse(), "")).append("' T_VIRTUALWAREHOUSE, ")
+                .append("'").append(StringUtil.nvl(line.getTarget().getUserDefined1(), "")).append("' T_USERDEFINED1, ")
+                .append("'").append(StringUtil.nvl(line.getTarget().getUserDefined3(), "")).append("' T_USERDEFINED3, ")
+                .append("'").append(StringUtil.nvl(line.getTarget().getUserDefined4(), "")).append("' T_USERDEFINED4 ")
+                .append("FROM dual) doc ON (wmsl.PL_PIID = doc.PIID AND wmsl.LINENO = doc.LINENO AND wmsl.ITEMCODE = doc.ITEMCODE) ")
+                .append("WHEN MATCHED THEN UPDATE SET ")
+                .append("wmsl.ACTUALQTY = doc.ACTUALQTY, ")
+                .append("wmsl.SERIALNO = doc.SERIALNO, ")
+                .append("wmsl.S_VIRTUALWAREHOUSE = doc.S_VIRTUALWAREHOUSE, ")
+                .append("wmsl.S_USERDEFINED1 = doc.S_USERDEFINED1, ")
+                .append("wmsl.S_USERDEFINED3 = doc.S_USERDEFINED3, ")
+                .append("wmsl.S_USERDEFINED4 = doc.S_USERDEFINED4, ")
+                .append("wmsl.T_VIRTUALWAREHOUSE = doc.T_VIRTUALWAREHOUSE, ")
+                .append("wmsl.T_USERDEFINED1 = doc.T_USERDEFINED1, ")
+                .append("wmsl.T_USERDEFINED3 = doc.T_USERDEFINED3, ")
+                .append("wmsl.T_USERDEFINED4 = doc.T_USERDEFINED4, ")
+                .append("wmsl.UTIME = SYSDATE ")
+                .append("WHEN NOT MATCHED THEN INSERT (ITIME,PL_PIID, LINENO, ITEMCODE, PLANQTY, ACTUALQTY, ACTUALPACKUOMQTY, SERIALNO ")
+                .append(",S_VIRTUALWAREHOUSE,S_USERDEFINED1,S_USERDEFINED3,S_USERDEFINED4,T_VIRTUALWAREHOUSE,T_USERDEFINED1,T_USERDEFINED3,T_USERDEFINED4) ")
+                .append("VALUES (SYSDATE,doc.PIID, doc.LINENO, doc.ITEMCODE, doc.PLANQTY, doc.ACTUALQTY,doc.ACTUALPACKUOMQTY,doc.SERIALNO")
+                .append(" ")
+                .append(",S_VIRTUALWAREHOUSE,S_USERDEFINED1,S_USERDEFINED3,S_USERDEFINED4,T_VIRTUALWAREHOUSE,T_USERDEFINED1,T_USERDEFINED3,T_USERDEFINED4)");
+        return sql.toString();
+    }
+}

+ 5 - 5
src/main/java/com/uas/eis/service/Impl/DocCommonServiceImpl.java

@@ -84,7 +84,7 @@ public class DocCommonServiceImpl implements DocCommonService {
                     .append("where pd_piid = ").append(prodInOut.getPiId()).append(" and pb_sendwms = -1 ")
                     .append("group by pd_piid,pd_prodcode,pr_detail,pr_brand,pd_whcode,wh_description,pd_description,")
                     .append("pd_custprodcode,pd_custprodcode1_user,pd_pocode order by MIN(pd_pdno)");
-        } else if ("move".equals(prodInOut.getPiWmsInType())) {
+        } else if ("transfer".equals(prodInOut.getPiWmsInType())) {
             String orderType = prodInOut.getPiOrderType();
             //NBZK 内部转库(出货单) QTCK 其他出库(其它出库单) NBZKZF: 内部转库-直发(其它出库单、出货单、采购验退单)
             if("NBZK".equals(orderType)||"QTCK".equals(orderType)||"NBZKZF".equals(orderType)){
@@ -182,15 +182,15 @@ public class DocCommonServiceImpl implements DocCommonService {
                     .append(master).append("',pdCustprodcode,pdCustprodcode1,pdPocode from (").append(detSql).append(")")
                     .toString();
             baseDao.execute(insertDetailSql);
-        } else if ("move".equals(prodInOut.getPiWmsInType())) {
+        } else if ("transfer".equals(prodInOut.getPiWmsInType())) {
             //NBZK 内部转库(出货单) QTCK 其他出库(其它出库单) NBZKZF: 内部转库-直发(其它出库单、出货单、采购验退单)
             //BCCK: 拨出、拨入单 BCCKZF: 库存转移-直发(拨出、拨入)
             //XHTZ: 型号调整(其它出库单) XHTZZF: 型号调整-直发(其它出库单)
             String insertDetailSql = new StringBuilder()
                     .append("INSERT INTO ").append(master).append(".prodiowms_Lines(ITIME,PL_PIID,LINENO, ITEMCODE, PLANQTY,virtualWarehouse")
-                    .append(" ,targetItemCode,s_userdefined1,s_userdefined3,s_userdefined4,t_userdefined1,t_userdefined3,t_userdefined4)")
+                    .append(" ,targetItemCode,s_virtualwarehouse,s_userdefined1,s_userdefined3,s_userdefined4,t_virtualwarehouse,t_userdefined1,t_userdefined3,t_userdefined4)")
                     .append("select sysdate,pdPiid,pdPdno,pdProdcode,pdQty,pdWhname")
-                    .append("   ,pdProdcodeTo,pdInBatch,pdBrandName,'").append(master).append("',pdInBatch,pdBrandNameTo,postMasterCode")
+                    .append("   ,pdProdcodeTo,pdWhname,pdInBatch,pdBrandName,'").append(master).append("',pdWhnameTo,pdInBatch,pdBrandNameTo,postMasterCode")
                     .append(" from (").append(detSql).append(")")
                     .toString();
             baseDao.execute(insertDetailSql);
@@ -241,7 +241,7 @@ public class DocCommonServiceImpl implements DocCommonService {
             orderLine.setItemCode(detail.getPdProdcode());// 商品编码
             orderLine.setItemName(detail.getPdProdname());// 商品名称
             orderLine.setPlanQty(detail.getPdQty());// 数量
-            if (!"move".equals(prodInOut.getPiWmsInType())) {
+            if (!"transfer".equals(prodInOut.getPiWmsInType())) {
                 orderLine.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
                 orderLine.setVirtualWarehouse(detail.getPdWhname());// 虚拟仓库编号
                 orderLine.setUserDefined1(detail.getPdInBatch());// 入库批次

+ 14 - 0
src/main/java/com/uas/eis/service/Impl/ERPSWMServiceImpl.java

@@ -3,6 +3,7 @@ package com.uas.eis.service.Impl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.uas.eis.dao.BaseDao;
 import com.uas.eis.dao.SqlRowList;
+import com.uas.eis.entity.vwms.req.AdjustConfirm;
 import com.uas.eis.entity.vwms.req.BaseReq;
 import com.uas.eis.entity.vwms.req.INConfirm;
 import com.uas.eis.entity.vwms.req.OUTConfirm;
@@ -59,6 +60,14 @@ public class ERPSWMServiceImpl implements ERPWMSService {
             masterName = outConfirm.getMasterName();
             orderCode = order.getDeliveryOrderCode();
         }
+        if("openapi.adjustmentorder.confirm".equals(method)){
+            req = objectMapper.readValue(confirmBody,
+                    objectMapper.getTypeFactory().constructParametricType(BaseReq.class, AdjustConfirm.class));
+            AdjustConfirm adjustConfirm = (AdjustConfirm) req.getRequest();
+            AdjustConfirm.AdjustmentOrder order = adjustConfirm.getAdjustmentOrder();
+            masterName = adjustConfirm.getMasterName();
+            orderCode = order.getAdjustmentOrderCode();
+        }
         if(orderCode == null || orderCode.equals("")){
             wmsApiResult.setFlag("failure");
             wmsApiResult.setCode("400");
@@ -109,6 +118,11 @@ public class ERPSWMServiceImpl implements ERPWMSService {
             sqls.add(outf.getGenerateMainSql());
             sqls.addAll(outf.getGenerateLinesSql());
         }
+        if("openapi.adjustmentorder.confirm".equals(method)){
+            AdjustConfirm adjustf = (AdjustConfirm) req.getRequest();
+            sqls.add(adjustf.getGenerateMainSql());
+            sqls.addAll(adjustf.getGenerateLinesSql());
+        }
         // 使用循环遍历并替换每个SQL语句中的占位符
         for (int i = 0; i < sqls.size(); i++) {
             sqls.set(i, sqls.get(i).replace("@MASTERCODE", masterCode));

+ 2 - 2
src/main/java/com/uas/eis/service/Impl/ERPServiceImpl.java

@@ -676,7 +676,7 @@ public class ERPServiceImpl implements ERPService {
                 || (StringUtil.hasText(prodInOut.getPiWmsInType())
                 && !prodInOut.getPiWmsInType().equals("in")
                 && !prodInOut.getPiWmsInType().equals("out")
-                && !prodInOut.getPiWmsInType().equals("move")
+                && !prodInOut.getPiWmsInType().equals("transfer")
         )) {
             retMap.put("success",false);
             retMap.put("message","WMS单据类型为空或异常,不允许同步。");
@@ -692,7 +692,7 @@ public class ERPServiceImpl implements ERPService {
         if("out".equals(prodInOut.getPiWmsInType())){
             errMsg = docCommonService.sendOutToWms(prodInOut,masterName);
         }
-        if("move".equals(prodInOut.getPiWmsInType())){
+        if("transfer".equals(prodInOut.getPiWmsInType())){
             errMsg = docCommonService.sendOMoveToWms(prodInOut,masterName);
         }
         if(errMsg!=null){