Browse Source

【华信科】【富勒WMS对接】【出库单创建】

wuyx 8 months ago
parent
commit
0aa1cfc17c

+ 281 - 171
src/main/java/com/uas/eis/entity/vwms/req/INConfirm.java

@@ -5,7 +5,9 @@ import lombok.Data;
 
 import java.util.ArrayList;
 import java.util.List;
+
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class INConfirm {
@@ -16,45 +18,79 @@ public class INConfirm {
     @Data
     @JsonIgnoreProperties(ignoreUnknown = true)
     public static class EntryOrder {
-        /** 入库单号 */
+        /**
+         * 入库单号
+         */
         private String entryOrderCode;
-        /** 货主代码 */
+        /**
+         * 货主代码
+         */
         private String ownerCode;
-        /** 仓库代码 */
+        /**
+         * 仓库代码
+         */
         private String warehouseCode;
-        /** 仓储系统入库单ID */
+        /**
+         * 仓储系统入库单ID
+         */
         private String entryOrderId;
-        /** 入库单类型 例如: CGRK=采购入库、DBRK=调拨入库 、THRK=退货入库, QTRK=其他入库等(只传英文代码) */
+        /**
+         * 入库单类型 例如: CGRK=采购入库、DBRK=调拨入库 、THRK=退货入库, QTRK=其他入库等(只传英文代码)
+         */
         private String entryOrderType;
-        /** 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理。一单需要多次确认时条件必填 */
+        /**
+         * 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理。一单需要多次确认时条件必填
+         */
         private String outBizCode;
-        /** 支持入库单多次收货 多次收货后确认时 0=入库单最终状态确认, 1=入库单中间状态确认, 每次入库传入的数量为增量, 特殊情况, 同一入库单, 如果先收到0, 后又收到1, 允许修改收货的数量 */
+        /**
+         * 支持入库单多次收货 多次收货后确认时 0=入库单最终状态确认, 1=入库单中间状态确认, 每次入库传入的数量为增量, 特殊情况, 同一入库单, 如果先收到0, 后又收到1, 允许修改收货的数量
+         */
         private Integer confirmType;
-        /** 入库单状态 , PARTFULFILLED=部分收货完成, FULFILLED=收货完成(只传英文代码) */
+        /**
+         * 入库单状态 , PARTFULFILLED=部分收货完成, FULFILLED=收货完成(只传英文代码)
+         */
         private String status;
-        /** 订单完成时间 YYYY-MM-DD HH:MM:SS */
+        /**
+         * 订单完成时间 YYYY-MM-DD HH:MM:SS
+         */
         private String orderFinishedTime;
-        /** 收货人 */
+        /**
+         * 收货人
+         */
         private String receiver;
-        /** 备注 */
+        /**
+         * 备注
+         */
         private String remark;
-        /** 用户自定义1 */
+        /**
+         * 用户自定义1
+         */
         private String userDefined1;
-        /** 用户自定义2 */
+        /**
+         * 用户自定义2
+         */
         private String userDefined2;
-        /** 用户自定义3 */
+        /**
+         * 用户自定义3
+         */
         private String userDefined3;
-        /** 用户自定义4 */
+        /**
+         * 用户自定义4
+         */
         private String userDefined4;
-        /** 文件信息 */
+        /**
+         * 文件信息
+         */
         private Files files;
 
     }
+
     @Data
     @JsonIgnoreProperties(ignoreUnknown = true)
     public static class Files {
         private List<String> file;
     }
+
     @Data
     @JsonIgnoreProperties(ignoreUnknown = true)
     public static class OrderLines {
@@ -63,53 +99,99 @@ public class INConfirm {
         @Data
         @JsonIgnoreProperties(ignoreUnknown = true)
         public static class OrderLine {
-            /** 行号 */
+            /**
+             * 行号
+             */
             private Integer lineNo;
-            /** 货品代码 */
+            /**
+             * 货品代码
+             */
             private String itemCode;
-            /** 仓储系统商品ID */
+            /**
+             * 仓储系统商品ID
+             */
             private String itemId;
-            /** 包装单位 */
+            /**
+             * 包装单位
+             */
             private String packUom;
-            /** 应收货品数量 */
+            /**
+             * 应收货品数量
+             */
             private Double planQty;
-            /** 实收数量 */
+            /**
+             * 实收数量
+             */
             private Double actualQty;
-            /** 实收包装数量 */
+            /**
+             * 实收包装数量
+             */
             private Double actualPackUomQty;
-            /** 虚拟仓库 条件必填, 条件为使用虚拟仓库 */
+            /**
+             * 虚拟仓库 条件必填, 条件为使用虚拟仓库
+             */
             private String virtualWarehouse;
             private String documentMaker;
-            /** 拒收数量 */
+            /**
+             * 拒收数量
+             */
             private Double rejectQty;
-            /** 拒收原因 */
+            /**
+             * 拒收原因
+             */
             private String rejectReason;
-            /** 序列号,多个序列号用英文逗号隔开 */
+            /**
+             * 序列号,多个序列号用英文逗号隔开
+             */
             private String serialno;
             private Batchs batchs;
-            /** 自定义批次1 入库批次 */
+            /**
+             * 自定义批次1 入库批次
+             */
             private String userDefined1;
-            /** 自定义批次2 */
+            /**
+             * 自定义批次2
+             */
             private String userDefined2;
-            /** 自定义批次3 品牌*/
+            /**
+             * 自定义批次3 品牌
+             */
             private String userDefined3;
-            /** 自定义批次4 账套*/
+            /**
+             * 自定义批次4 账套
+             */
             private String userDefined4;
-            /** 自定义字段1 */
+            /**
+             * 自定义字段1
+             */
             private String customField1;
-            /** 自定义字段2 */
+            /**
+             * 自定义字段2
+             */
             private String customField2;
-            /** 自定义字段3 */
+            /**
+             * 自定义字段3
+             */
             private String customField3;
-            /** 自定义字段4 */
+            /**
+             * 自定义字段4
+             */
             private String customField4;
-            /** 自定义字段5 */
+            /**
+             * 自定义字段5
+             */
             private String customField5;
-            /** 自定义字段6 */
+            /**
+             * 自定义字段6
+             */
             private String customField6;
-            /** 自定义字段7 */
+            /**
+             * 自定义字段7
+             */
             private String customField7;
-            /** 自定义字段8 */
+            /**
+             * 自定义字段8
+             */
             private String customField8;
 
             @Data
@@ -120,31 +202,57 @@ public class INConfirm {
                 @Data
                 @JsonIgnoreProperties(ignoreUnknown = true)
                 public static class Batch {
-                    /** 实收数量 */
+                    /**
+                     * 实收数量
+                     */
                     private Double actualQty;
-                    /** 实收包装数量 */
+                    /**
+                     * 实收包装数量
+                     */
                     private Double actualPackUomQty;
-                    /** 质量状态 ZP=正品, CC=残次, 默认为ZP */
+                    /**
+                     * 质量状态 ZP=正品, CC=残次, 默认为ZP
+                     */
                     private String inventoryType;
-                    /** 虚拟仓库 条件必填, 条件为使用虚拟仓库 */
+                    /**
+                     * 虚拟仓库 条件必填, 条件为使用虚拟仓库
+                     */
                     private String virtualWarehouse;
-                    /** 生产日期 YYYY-MM-DD */
+                    /**
+                     * 生产日期 YYYY-MM-DD
+                     */
                     private String productDate;
-                    /** 失效日期 YYYY-MM-DD */
+                    /**
+                     * 失效日期 YYYY-MM-DD
+                     */
                     private String expireDate;
-                    /** 批次号 */
+                    /**
+                     * 批次号
+                     */
                     private String batchCode;
-                    /** 入库日期 YYYY-MM-DD */
+                    /**
+                     * 入库日期 YYYY-MM-DD
+                     */
                     private String stockinDate;
-                    /** 自定义批次1 入库批次 */
+                    /**
+                     * 自定义批次1 入库批次
+                     */
                     private String userDefined1;
-                    /** 自定义批次2 */
+                    /**
+                     * 自定义批次2
+                     */
                     private String userDefined2;
-                    /** 自定义批次3 品牌*/
+                    /**
+                     * 自定义批次3 品牌
+                     */
                     private String userDefined3;
-                    /** 自定义批次4 账套*/
+                    /**
+                     * 自定义批次4 账套
+                     */
                     private String userDefined4;
-                    /** 容器号 */
+                    /**
+                     * 容器号
+                     */
                     private String lpn;
                 }
             }
@@ -163,133 +271,135 @@ public class INConfirm {
             private String epc;
         }
     }
+
     public String getMasterName() {
-        if(orderLines.getOrderLine() !=null){//账套名称
-            if(StringUtil.hasText(orderLines.getOrderLine().get(0).getUserDefined4())){
+        if (orderLines.getOrderLine() != null) {//账套名称
+            if (StringUtil.hasText(orderLines.getOrderLine().get(0).getUserDefined4())) {
                 return orderLines.getOrderLine().get(0).getUserDefined4();
-            }else {
+            } else {
                 return orderLines.getOrderLine().get(0).getBatchs().getBatch().get(0).getUserDefined4();
             }
-        }else {
+        } 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(entryOrder.getEntryOrderCode(), "")).append("' ENTRYORDERCODE, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getOwnerCode(), "")).append("' OWNERCODE, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getWarehouseCode(), "")).append("' WAREHOUSECODE, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getEntryOrderId(), "")).append("' ENTRYORDERID, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getEntryOrderType(), "")).append("' ENTRYORDERTYPE, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getOutBizCode(), "")).append("' OUTBIZCODE, ")
-            .append(StringUtil.nvl(entryOrder.getConfirmType(), "0")).append(" CONFIRMTYPE, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getStatus(), "")).append("' STATUS, ")
-            .append((StringUtil.hasText(entryOrder.getOrderFinishedTime()) ? "to_date('" + entryOrder.getOrderFinishedTime() + "','yyyy-mm-dd hh24:mi:ss')" : "null")).append(" ORDERFINISHEDTIME, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getReceiver(), "")).append("' RECEIVER, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getRemark(), "")).append("' REMARK, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getUserDefined1(), "")).append("' USERDEFINED1, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getUserDefined2(), "")).append("' USERDEFINED2, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getUserDefined3(), "")).append("' USERDEFINED3, ")
-            .append("'").append(StringUtil.nvl(entryOrder.getUserDefined4(), "")).append("' USERDEFINED4 ")
-            .append("FROM dual) doc ON (wmsl.PIID = doc.PIID AND wmsl.PIINOUTNO = doc.PIINOUTNO) ")
-            .append("WHEN MATCHED THEN UPDATE SET ")
-            .append("wmsl.ENTRYORDERCODE = doc.ENTRYORDERCODE, ")
-            .append("wmsl.OWNERCODE = doc.OWNERCODE, ")
-            .append("wmsl.WAREHOUSECODE = doc.WAREHOUSECODE, ")
-            .append("wmsl.ENTRYORDERID = doc.ENTRYORDERID, ")
-            .append("wmsl.ENTRYORDERTYPE = doc.ENTRYORDERTYPE, ")
-            .append("wmsl.OUTBIZCODE = doc.OUTBIZCODE, ")
-            .append("wmsl.CONFIRMTYPE = doc.CONFIRMTYPE, ")
-            .append("wmsl.STATUS = doc.STATUS, ")
-            .append("wmsl.ORDERFINISHEDTIME = doc.ORDERFINISHEDTIME, ")
-            .append("wmsl.RECEIVER = doc.RECEIVER, ")
-            .append("wmsl.REMARK = doc.REMARK, ")
-            .append("wmsl.USERDEFINED1 = doc.USERDEFINED1, ")
-            .append("wmsl.USERDEFINED2 = doc.USERDEFINED2, ")
-            .append("wmsl.USERDEFINED3 = doc.USERDEFINED3, ")
-            .append("wmsl.USERDEFINED4 = doc.USERDEFINED4, ")
-            .append("wmsl.UTIME = SYSDATE ")
-            .append("WHEN NOT MATCHED THEN INSERT (ITIME,PIID, PIINOUTNO, ENTRYORDERCODE, OWNERCODE, WAREHOUSECODE, ENTRYORDERID, ENTRYORDERTYPE, OUTBIZCODE, CONFIRMTYPE, STATUS, ORDERFINISHEDTIME, RECEIVER, REMARK, USERDEFINED1, USERDEFINED2, USERDEFINED3, USERDEFINED4) ")
-            .append("VALUES (SYSDATE,doc.PIID, doc.PIINOUTNO, doc.ENTRYORDERCODE, doc.OWNERCODE, doc.WAREHOUSECODE, doc.ENTRYORDERID, doc.ENTRYORDERTYPE, doc.OUTBIZCODE, doc.CONFIRMTYPE, doc.STATUS, doc.ORDERFINISHEDTIME, doc.RECEIVER, doc.REMARK, doc.USERDEFINED1, doc.USERDEFINED2, doc.USERDEFINED3, doc.USERDEFINED4)");
-    return sql.toString();
-}
 
-public List<String> getGenerateLinesSql() {
-    List<String> sqls = new ArrayList<>();
-    for (OrderLines.OrderLine line : orderLines.getOrderLine()) {
-        sqls.add(getGenerateLinesSql(line));
-        for (int i = 0; i < line.getBatchs().getBatch().size(); i++) {
-            OrderLines.OrderLine.Batchs.Batch batch = line.getBatchs().getBatch().get(i);
-            sqls.add(getGenerateBatchsSql(line.getLineNo(),(i+1),batch));
+    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(entryOrder.getEntryOrderCode(), "")).append("' ENTRYORDERCODE, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getOwnerCode(), "")).append("' OWNERCODE, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getWarehouseCode(), "")).append("' WAREHOUSECODE, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getEntryOrderId(), "")).append("' ENTRYORDERID, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getEntryOrderType(), "")).append("' ENTRYORDERTYPE, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getOutBizCode(), "")).append("' OUTBIZCODE, ")
+                .append(StringUtil.nvl(entryOrder.getConfirmType(), "0")).append(" CONFIRMTYPE, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getStatus(), "")).append("' STATUS, ")
+                .append((StringUtil.hasText(entryOrder.getOrderFinishedTime()) ? "to_date('" + entryOrder.getOrderFinishedTime() + "','yyyy-mm-dd hh24:mi:ss')" : "null")).append(" ORDERFINISHEDTIME, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getReceiver(), "")).append("' RECEIVER, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getRemark(), "")).append("' REMARK, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getUserDefined1(), "")).append("' USERDEFINED1, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getUserDefined2(), "")).append("' USERDEFINED2, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getUserDefined3(), "")).append("' USERDEFINED3, ")
+                .append("'").append(StringUtil.nvl(entryOrder.getUserDefined4(), "")).append("' USERDEFINED4 ")
+                .append("FROM dual) doc ON (wmsl.PIID = doc.PIID AND wmsl.PIINOUTNO = doc.PIINOUTNO) ")
+                .append("WHEN MATCHED THEN UPDATE SET ")
+                .append("wmsl.ENTRYORDERCODE = doc.ENTRYORDERCODE, ")
+                .append("wmsl.OWNERCODE = doc.OWNERCODE, ")
+                .append("wmsl.WAREHOUSECODE = doc.WAREHOUSECODE, ")
+                .append("wmsl.ENTRYORDERID = doc.ENTRYORDERID, ")
+                .append("wmsl.ENTRYORDERTYPE = doc.ENTRYORDERTYPE, ")
+                .append("wmsl.OUTBIZCODE = doc.OUTBIZCODE, ")
+                .append("wmsl.CONFIRMTYPE = doc.CONFIRMTYPE, ")
+                .append("wmsl.STATUS = doc.STATUS, ")
+                .append("wmsl.ORDERFINISHEDTIME = doc.ORDERFINISHEDTIME, ")
+                .append("wmsl.RECEIVER = doc.RECEIVER, ")
+                .append("wmsl.REMARK = doc.REMARK, ")
+                .append("wmsl.USERDEFINED1 = doc.USERDEFINED1, ")
+                .append("wmsl.USERDEFINED2 = doc.USERDEFINED2, ")
+                .append("wmsl.USERDEFINED3 = doc.USERDEFINED3, ")
+                .append("wmsl.USERDEFINED4 = doc.USERDEFINED4, ")
+                .append("wmsl.UTIME = SYSDATE ")
+                .append("WHEN NOT MATCHED THEN INSERT (ITIME,PIID, PIINOUTNO, ENTRYORDERCODE, OWNERCODE, WAREHOUSECODE, ENTRYORDERID, ENTRYORDERTYPE, OUTBIZCODE, CONFIRMTYPE, STATUS, ORDERFINISHEDTIME, RECEIVER, REMARK, USERDEFINED1, USERDEFINED2, USERDEFINED3, USERDEFINED4) ")
+                .append("VALUES (SYSDATE,doc.PIID, doc.PIINOUTNO, doc.ENTRYORDERCODE, doc.OWNERCODE, doc.WAREHOUSECODE, doc.ENTRYORDERID, doc.ENTRYORDERTYPE, doc.OUTBIZCODE, doc.CONFIRMTYPE, doc.STATUS, doc.ORDERFINISHEDTIME, doc.RECEIVER, doc.REMARK, doc.USERDEFINED1, doc.USERDEFINED2, doc.USERDEFINED3, doc.USERDEFINED4)");
+        return sql.toString();
+    }
+
+    public List<String> getGenerateLinesSql() {
+        List<String> sqls = new ArrayList<>();
+        for (OrderLines.OrderLine line : orderLines.getOrderLine()) {
+            sqls.add(getGenerateLinesSql(line));
+            for (int i = 0; i < line.getBatchs().getBatch().size(); i++) {
+                OrderLines.OrderLine.Batchs.Batch batch = line.getBatchs().getBatch().get(i);
+                sqls.add(getGenerateBatchsSql(line.getLineNo(), (i + 1), batch));
+            }
         }
+        return sqls;
     }
-    return sqls;
-}
 
-public String getGenerateLinesSql(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(line.getItemId()).append("' ITEMID, ")
-            .append("'").append(StringUtil.nvl(line.getPackUom(),"")).append("' PACKUOM, ")
-            .append("'").append(StringUtil.nvl(line.getPlanQty(),"")).append("' PLANQTY, ")
-            .append(StringUtil.nvl(line.getActualQty(),"0")).append(" ACTUALQTY, ")
-            .append(StringUtil.nvl(line.getActualPackUomQty(),"0")).append(" ACTUALPACKUOMQTY, ")
-            .append("'").append(StringUtil.nvl(line.getVirtualWarehouse(),"")).append("' virtualWarehouse, ")
-            .append(StringUtil.nvl(line.getRejectQty(),"0")).append(" REJECTQTY, ")
-            .append("'").append(StringUtil.nvl(line.getRejectReason(),"")).append("' REJECTREASON, ")
-            .append("'").append(StringUtil.nvl(line.getSerialno(),"")).append("' SERIALNO, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField1(),"")).append("' CUSTOMFIELD1, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField2(),"")).append("' CUSTOMFIELD2, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField3(),"")).append("' CUSTOMFIELD3, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField4(),"")).append("' CUSTOMFIELD4, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField5(),"")).append("' CUSTOMFIELD5, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField6(),"")).append("' CUSTOMFIELD6, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField7(),"")).append("' CUSTOMFIELD7, ")
-            .append("'").append(StringUtil.nvl(line.getCustomField8(),"")).append("' CUSTOMFIELD8, ")
-            .append("'").append(StringUtil.nvl(line.getUserDefined1(),"")).append("' USERDEFINED1, ")
-            .append("'").append(StringUtil.nvl(line.getUserDefined2(),"")).append("' USERDEFINED2, ")
-            .append("'").append(StringUtil.nvl(line.getUserDefined3(),"")).append("' USERDEFINED3, ")
-            .append("'").append(StringUtil.nvl(line.getUserDefined4(),"")).append("' 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.ACTUALPACKUOMQTY = doc.ACTUALPACKUOMQTY, ")
-            .append("wmsl.virtualWarehouse = doc.virtualWarehouse, ")
-            .append("wmsl.REJECTQTY = doc.REJECTQTY, ")
-            .append("wmsl.REJECTREASON = doc.REJECTREASON, ")
-            .append("wmsl.SERIALNO = doc.SERIALNO, ")
-            .append("wmsl.CUSTOMFIELD1 = doc.CUSTOMFIELD1, ")
-            .append("wmsl.CUSTOMFIELD2 = doc.CUSTOMFIELD2, ")
-            .append("wmsl.CUSTOMFIELD3 = doc.CUSTOMFIELD3, ")
-            .append("wmsl.CUSTOMFIELD4 = doc.CUSTOMFIELD4, ")
-            .append("wmsl.CUSTOMFIELD5 = doc.CUSTOMFIELD5, ")
-            .append("wmsl.CUSTOMFIELD6 = doc.CUSTOMFIELD6, ")
-            .append("wmsl.CUSTOMFIELD7 = doc.CUSTOMFIELD7, ")
-            .append("wmsl.CUSTOMFIELD8 = doc.CUSTOMFIELD8, ")
-            .append("wmsl.USERDEFINED1 = doc.USERDEFINED1, ")
-            .append("wmsl.USERDEFINED2 = doc.USERDEFINED2, ")
-            .append("wmsl.USERDEFINED3 = doc.USERDEFINED3, ")
-            .append("wmsl.USERDEFINED4 = doc.USERDEFINED4, ")
-            .append("wmsl.UTIME = SYSDATE ")
-            .append("WHEN NOT MATCHED THEN INSERT (ITIME,PL_PIID, LINENO, ITEMCODE, ITEMID, PACKUOM, PLANQTY, ACTUALQTY, ACTUALPACKUOMQTY,virtualWarehouse, REJECTQTY, REJECTREASON, SERIALNO, ")
-            .append("CUSTOMFIELD1, CUSTOMFIELD2, CUSTOMFIELD3, CUSTOMFIELD4, CUSTOMFIELD5, CUSTOMFIELD6, CUSTOMFIELD7, CUSTOMFIELD8,USERDEFINED1,USERDEFINED2,USERDEFINED3,USERDEFINED4) ")
-            .append("VALUES (SYSDATE,doc.PIID, doc.LINENO, doc.ITEMCODE, doc.ITEMID, doc.PACKUOM, doc.PLANQTY, doc.ACTUALQTY,doc.virtualWarehouse, doc.ACTUALPACKUOMQTY, ")
-            .append("doc.REJECTQTY, doc.REJECTREASON, doc.SERIALNO, doc.CUSTOMFIELD1, doc.CUSTOMFIELD2, doc.CUSTOMFIELD3, doc.CUSTOMFIELD4, doc.CUSTOMFIELD5, ")
-            .append("doc.CUSTOMFIELD6, doc.CUSTOMFIELD7, doc.CUSTOMFIELD8, doc.USERDEFINED1, doc.USERDEFINED2, doc.USERDEFINED3, doc.USERDEFINED4)");
-    return sql.toString();
-}
+    public String getGenerateLinesSql(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(line.getItemId()).append("' ITEMID, ")
+                .append("'").append(StringUtil.nvl(line.getPackUom(), "")).append("' PACKUOM, ")
+                .append("'").append(StringUtil.nvl(line.getPlanQty(), "")).append("' PLANQTY, ")
+                .append(StringUtil.nvl(line.getActualQty(), "0")).append(" ACTUALQTY, ")
+                .append(StringUtil.nvl(line.getActualPackUomQty(), "0")).append(" ACTUALPACKUOMQTY, ")
+                .append("'").append(StringUtil.nvl(line.getVirtualWarehouse(), "")).append("' virtualWarehouse, ")
+                .append(StringUtil.nvl(line.getRejectQty(), "0")).append(" REJECTQTY, ")
+                .append("'").append(StringUtil.nvl(line.getRejectReason(), "")).append("' REJECTREASON, ")
+                .append("'").append(StringUtil.nvl(line.getSerialno(), "")).append("' SERIALNO, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField1(), "")).append("' CUSTOMFIELD1, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField2(), "")).append("' CUSTOMFIELD2, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField3(), "")).append("' CUSTOMFIELD3, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField4(), "")).append("' CUSTOMFIELD4, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField5(), "")).append("' CUSTOMFIELD5, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField6(), "")).append("' CUSTOMFIELD6, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField7(), "")).append("' CUSTOMFIELD7, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField8(), "")).append("' CUSTOMFIELD8, ")
+                .append("'").append(StringUtil.nvl(line.getUserDefined1(), "")).append("' USERDEFINED1, ")
+                .append("'").append(StringUtil.nvl(line.getUserDefined2(), "")).append("' USERDEFINED2, ")
+                .append("'").append(StringUtil.nvl(line.getUserDefined3(), "")).append("' USERDEFINED3, ")
+                .append("'").append(StringUtil.nvl(line.getUserDefined4(), "")).append("' 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.ACTUALPACKUOMQTY = doc.ACTUALPACKUOMQTY, ")
+                .append("wmsl.virtualWarehouse = doc.virtualWarehouse, ")
+                .append("wmsl.REJECTQTY = doc.REJECTQTY, ")
+                .append("wmsl.REJECTREASON = doc.REJECTREASON, ")
+                .append("wmsl.SERIALNO = doc.SERIALNO, ")
+                .append("wmsl.CUSTOMFIELD1 = doc.CUSTOMFIELD1, ")
+                .append("wmsl.CUSTOMFIELD2 = doc.CUSTOMFIELD2, ")
+                .append("wmsl.CUSTOMFIELD3 = doc.CUSTOMFIELD3, ")
+                .append("wmsl.CUSTOMFIELD4 = doc.CUSTOMFIELD4, ")
+                .append("wmsl.CUSTOMFIELD5 = doc.CUSTOMFIELD5, ")
+                .append("wmsl.CUSTOMFIELD6 = doc.CUSTOMFIELD6, ")
+                .append("wmsl.CUSTOMFIELD7 = doc.CUSTOMFIELD7, ")
+                .append("wmsl.CUSTOMFIELD8 = doc.CUSTOMFIELD8, ")
+                .append("wmsl.USERDEFINED1 = doc.USERDEFINED1, ")
+                .append("wmsl.USERDEFINED2 = doc.USERDEFINED2, ")
+                .append("wmsl.USERDEFINED3 = doc.USERDEFINED3, ")
+                .append("wmsl.USERDEFINED4 = doc.USERDEFINED4, ")
+                .append("wmsl.UTIME = SYSDATE ")
+                .append("WHEN NOT MATCHED THEN INSERT (ITIME,PL_PIID, LINENO, ITEMCODE, ITEMID, PACKUOM, PLANQTY, ACTUALQTY, ACTUALPACKUOMQTY,virtualWarehouse, REJECTQTY, REJECTREASON, SERIALNO, ")
+                .append("CUSTOMFIELD1, CUSTOMFIELD2, CUSTOMFIELD3, CUSTOMFIELD4, CUSTOMFIELD5, CUSTOMFIELD6, CUSTOMFIELD7, CUSTOMFIELD8,USERDEFINED1,USERDEFINED2,USERDEFINED3,USERDEFINED4) ")
+                .append("VALUES (SYSDATE,doc.PIID, doc.LINENO, doc.ITEMCODE, doc.ITEMID, doc.PACKUOM, doc.PLANQTY, doc.ACTUALQTY,doc.virtualWarehouse, doc.ACTUALPACKUOMQTY, ")
+                .append("doc.REJECTQTY, doc.REJECTREASON, doc.SERIALNO, doc.CUSTOMFIELD1, doc.CUSTOMFIELD2, doc.CUSTOMFIELD3, doc.CUSTOMFIELD4, doc.CUSTOMFIELD5, ")
+                .append("doc.CUSTOMFIELD6, doc.CUSTOMFIELD7, doc.CUSTOMFIELD8, doc.USERDEFINED1, doc.USERDEFINED2, doc.USERDEFINED3, doc.USERDEFINED4)");
+        return sql.toString();
+    }
 
-public String getGenerateBatchsSql(Integer lineNo,Integer detno,OrderLines.OrderLine.Batchs.Batch batch) {
+    public String getGenerateBatchsSql(Integer lineNo, Integer detno, OrderLines.OrderLine.Batchs.Batch batch) {
         StringBuilder sql = new StringBuilder();
         sql.append("INSERT INTO ").append("@MASTERCODE")
-        .append(".prodiowms_batchs(ITIME,PB_PIID, PD_DETNO, LINENO, ACTUALQTY, ACTUALPACKUOMQTY, INVENTORYTYPE, VIRTUALWAREHOUSE, PRODUCTDATE, EXPIREDATE, BATCHCODE, STOCKINDATE, USERDEFINED1, USERDEFINED2, USERDEFINED3, USERDEFINED4, LPN) VALUES(");
+                .append(".prodiowms_batchs(ITIME,PB_PIID, PD_DETNO, LINENO, ACTUALQTY, ACTUALPACKUOMQTY, INVENTORYTYPE, VIRTUALWAREHOUSE, PRODUCTDATE, EXPIREDATE, BATCHCODE, STOCKINDATE, USERDEFINED1, USERDEFINED2, USERDEFINED3, USERDEFINED4, LPN) VALUES(");
         // 添加字段值
         sql.append("SYSDATE, ");
         sql.append("@PIID").append(", ");
@@ -299,20 +409,20 @@ public String getGenerateBatchsSql(Integer lineNo,Integer detno,OrderLines.Order
         sql.append(StringUtil.nvl(batch.getActualPackUomQty(), "0")).append(", ");
         sql.append("'").append(StringUtil.nvl(batch.getInventoryType(), "")).append("', ");
         sql.append("'").append(StringUtil.nvl(batch.getVirtualWarehouse(), "")).append("', ");
-        if(StringUtil.hasText(batch.getProductDate())){
+        if (StringUtil.hasText(batch.getProductDate())) {
             sql.append("to_date('").append(batch.getProductDate()).append("','yyyy-mm-dd hh24:mi:ss'), ");
-        }else {
+        } else {
             sql.append("null, ");
         }
-        if(StringUtil.hasText(batch.getExpireDate())){
+        if (StringUtil.hasText(batch.getExpireDate())) {
             sql.append("to_date('").append(batch.getExpireDate()).append("','yyyy-mm-dd hh24:mi:ss'), ");
-        }else {
+        } else {
             sql.append("null, ");
         }
         sql.append("'").append(StringUtil.nvl(batch.getBatchCode(), "")).append("', ");
-        if(StringUtil.hasText(batch.getStockinDate())){
+        if (StringUtil.hasText(batch.getStockinDate())) {
             sql.append("to_date('").append(batch.getStockinDate()).append("','yyyy-mm-dd hh24:mi:ss'), ");
-        }else {
+        } else {
             sql.append("null, ");
         }
         sql.append("'").append(StringUtil.nvl(batch.getUserDefined1(), "")).append("', ");

+ 193 - 35
src/main/java/com/uas/eis/entity/vwms/req/OUTConfirm.java

@@ -196,45 +196,46 @@ public class OUTConfirm {
             private String customField8;
             /** 批次信息 */
             private Batchs batchs;
+            @Data
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class Batchs {
+                private List<Batch> batch;
+
+                @Data
+                @JsonIgnoreProperties(ignoreUnknown = true)
+                public static class Batch {
+                    /** 实发货品数量 类型:float */
+                    private Float actualQty;
+                    /** 实收包装数量 类型:float */
+                    private Float actualPackUomQty;
+                    /** 库存类型 长度: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;
+                    /** 拣货容器号 长度:50 */
+                    private String lpn;
+                }
+            }
         }
     }
 
-    @Data
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class Batchs {
-        private List<Batch> batch;
 
-        @Data
-        @JsonIgnoreProperties(ignoreUnknown = true)
-        public static class Batch {
-            /** 实发货品数量 类型:float */
-            private Float actualQty;
-            /** 实收包装数量 类型:float */
-            private Float actualPackUomQty;
-            /** 库存类型 长度: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;
-            /** 拣货容器号 长度:50 */
-            private String lpn;
-        }
-    }
 
     @Data
     @JsonIgnoreProperties(ignoreUnknown = true)
@@ -250,4 +251,161 @@ public class OUTConfirm {
             private String epc;
         }
     }
+    public String getMasterName() {
+        if (orderLines.getOrderLine() != null) {//账套名称
+            return orderLines.getOrderLine().get(0).getBatchs().getBatch().get(0).getUserDefined4();
+        } 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(deliveryOrder.getDeliveryOrderCode(), "")).append("' ENTRYORDERCODE, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getOwnerCode(), "")).append("' OWNERCODE, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getWarehouseCode(), "")).append("' WAREHOUSECODE, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getDeliveryOrderId(), "")).append("' ENTRYORDERID, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getOrderType(), "")).append("' ENTRYORDERTYPE, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getOutBizCode(), "")).append("' OUTBIZCODE, ")
+                .append(StringUtil.nvl(deliveryOrder.getConfirmType(), "0")).append(" CONFIRMTYPE, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getStatus(), "")).append("' STATUS, ")
+//                .append((StringUtil.hasText(deliveryOrder.getOrderFinishedTime()) ? "to_date('" + deliveryOrder.getOrderFinishedTime() + "','yyyy-mm-dd hh24:mi:ss')" : "null")).append(" ORDERFINISHEDTIME, ")
+//                .append("'").append(StringUtil.nvl(deliveryOrder.getReceiver(), "")).append("' RECEIVER, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getRemark(), "")).append("' REMARK, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getUserDefined1(), "")).append("' USERDEFINED1, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getUserDefined2(), "")).append("' USERDEFINED2, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getUserDefined3(), "")).append("' USERDEFINED3, ")
+                .append("'").append(StringUtil.nvl(deliveryOrder.getUserDefined4(), "")).append("' USERDEFINED4 ")
+                .append("FROM dual) doc ON (wmsl.PIID = doc.PIID AND wmsl.PIINOUTNO = doc.PIINOUTNO) ")
+                .append("WHEN MATCHED THEN UPDATE SET ")
+                .append("wmsl.ENTRYORDERCODE = doc.ENTRYORDERCODE, ")
+                .append("wmsl.OWNERCODE = doc.OWNERCODE, ")
+                .append("wmsl.WAREHOUSECODE = doc.WAREHOUSECODE, ")
+                .append("wmsl.ENTRYORDERID = doc.ENTRYORDERID, ")
+                .append("wmsl.ENTRYORDERTYPE = doc.ENTRYORDERTYPE, ")
+                .append("wmsl.OUTBIZCODE = doc.OUTBIZCODE, ")
+                .append("wmsl.CONFIRMTYPE = doc.CONFIRMTYPE, ")
+                .append("wmsl.STATUS = doc.STATUS, ")
+                .append("wmsl.ORDERFINISHEDTIME = doc.ORDERFINISHEDTIME, ")
+                .append("wmsl.RECEIVER = doc.RECEIVER, ")
+                .append("wmsl.REMARK = doc.REMARK, ")
+                .append("wmsl.USERDEFINED1 = doc.USERDEFINED1, ")
+                .append("wmsl.USERDEFINED2 = doc.USERDEFINED2, ")
+                .append("wmsl.USERDEFINED3 = doc.USERDEFINED3, ")
+                .append("wmsl.USERDEFINED4 = doc.USERDEFINED4, ")
+                .append("wmsl.UTIME = SYSDATE ")
+                .append("WHEN NOT MATCHED THEN INSERT (ITIME,PIID, PIINOUTNO, ENTRYORDERCODE, OWNERCODE, WAREHOUSECODE, ENTRYORDERID, ENTRYORDERTYPE, OUTBIZCODE, CONFIRMTYPE, STATUS, ORDERFINISHEDTIME, RECEIVER, REMARK, USERDEFINED1, USERDEFINED2, USERDEFINED3, USERDEFINED4) ")
+                .append("VALUES (SYSDATE,doc.PIID, doc.PIINOUTNO, doc.ENTRYORDERCODE, doc.OWNERCODE, doc.WAREHOUSECODE, doc.ENTRYORDERID, doc.ENTRYORDERTYPE, doc.OUTBIZCODE, doc.CONFIRMTYPE, doc.STATUS, doc.ORDERFINISHEDTIME, doc.RECEIVER, doc.REMARK, doc.USERDEFINED1, doc.USERDEFINED2, doc.USERDEFINED3, doc.USERDEFINED4)");
+        return sql.toString();
+    }
+
+    public List<String> getGenerateLinesSql() {
+        List<String> sqls = new ArrayList<>();
+        for (OUTConfirm.OrderLines.OrderLine line : orderLines.getOrderLine()) {
+            sqls.add(getGenerateLinesSql(line));
+            for (int i = 0; i < line.getBatchs().getBatch().size(); i++) {
+                OUTConfirm.OrderLines.OrderLine.Batchs.Batch batch = line.getBatchs().getBatch().get(i);
+                sqls.add(getGenerateBatchsSql(line.getLineNo(), (i + 1), batch));
+            }
+        }
+        return sqls;
+    }
+
+    public String getGenerateLinesSql(OUTConfirm.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(line.getItemId()).append("' ITEMID, ")
+                .append("'").append(StringUtil.nvl(line.getPackUom(), "")).append("' PACKUOM, ")
+                .append("'").append(StringUtil.nvl(line.getPlanQty(), "")).append("' PLANQTY, ")
+                .append(StringUtil.nvl(line.getActualQty(), "0")).append(" ACTUALQTY, ")
+                .append(StringUtil.nvl(line.getActualPackUomQty(), "0")).append(" ACTUALPACKUOMQTY, ")
+//                .append("'").append(StringUtil.nvl(line.getVirtualWarehouse(), "")).append("' virtualWarehouse, ")
+//                .append(StringUtil.nvl(line.getRejectQty(), "0")).append(" REJECTQTY, ")
+//                .append("'").append(StringUtil.nvl(line.getRejectReason(), "")).append("' REJECTREASON, ")
+//                .append("'").append(StringUtil.nvl(line.getSerialno(), "")).append("' SERIALNO, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField1(), "")).append("' CUSTOMFIELD1, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField2(), "")).append("' CUSTOMFIELD2, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField3(), "")).append("' CUSTOMFIELD3, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField4(), "")).append("' CUSTOMFIELD4, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField5(), "")).append("' CUSTOMFIELD5, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField6(), "")).append("' CUSTOMFIELD6, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField7(), "")).append("' CUSTOMFIELD7, ")
+                .append("'").append(StringUtil.nvl(line.getCustomField8(), "")).append("' CUSTOMFIELD8, ")
+//                .append("'").append(StringUtil.nvl(line.getUserDefined1(), "")).append("' USERDEFINED1, ")
+//                .append("'").append(StringUtil.nvl(line.getUserDefined2(), "")).append("' USERDEFINED2, ")
+//                .append("'").append(StringUtil.nvl(line.getUserDefined3(), "")).append("' USERDEFINED3, ")
+//                .append("'").append(StringUtil.nvl(line.getUserDefined4(), "")).append("' 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.ACTUALPACKUOMQTY = doc.ACTUALPACKUOMQTY, ")
+                .append("wmsl.virtualWarehouse = doc.virtualWarehouse, ")
+                .append("wmsl.REJECTQTY = doc.REJECTQTY, ")
+                .append("wmsl.REJECTREASON = doc.REJECTREASON, ")
+                .append("wmsl.SERIALNO = doc.SERIALNO, ")
+                .append("wmsl.CUSTOMFIELD1 = doc.CUSTOMFIELD1, ")
+                .append("wmsl.CUSTOMFIELD2 = doc.CUSTOMFIELD2, ")
+                .append("wmsl.CUSTOMFIELD3 = doc.CUSTOMFIELD3, ")
+                .append("wmsl.CUSTOMFIELD4 = doc.CUSTOMFIELD4, ")
+                .append("wmsl.CUSTOMFIELD5 = doc.CUSTOMFIELD5, ")
+                .append("wmsl.CUSTOMFIELD6 = doc.CUSTOMFIELD6, ")
+                .append("wmsl.CUSTOMFIELD7 = doc.CUSTOMFIELD7, ")
+                .append("wmsl.CUSTOMFIELD8 = doc.CUSTOMFIELD8, ")
+//                .append("wmsl.USERDEFINED1 = doc.USERDEFINED1, ")
+//                .append("wmsl.USERDEFINED2 = doc.USERDEFINED2, ")
+//                .append("wmsl.USERDEFINED3 = doc.USERDEFINED3, ")
+//                .append("wmsl.USERDEFINED4 = doc.USERDEFINED4, ")
+                .append("wmsl.UTIME = SYSDATE ")
+                .append("WHEN NOT MATCHED THEN INSERT (ITIME,PL_PIID, LINENO, ITEMCODE, ITEMID, PACKUOM, PLANQTY, ACTUALQTY, ACTUALPACKUOMQTY,virtualWarehouse, REJECTQTY, REJECTREASON, SERIALNO, ")
+                .append("CUSTOMFIELD1, CUSTOMFIELD2, CUSTOMFIELD3, CUSTOMFIELD4, CUSTOMFIELD5, CUSTOMFIELD6, CUSTOMFIELD7, CUSTOMFIELD8,USERDEFINED1,USERDEFINED2,USERDEFINED3,USERDEFINED4) ")
+                .append("VALUES (SYSDATE,doc.PIID, doc.LINENO, doc.ITEMCODE, doc.ITEMID, doc.PACKUOM, doc.PLANQTY, doc.ACTUALQTY,doc.virtualWarehouse, doc.ACTUALPACKUOMQTY, ")
+                .append("doc.REJECTQTY, doc.REJECTREASON, doc.SERIALNO, doc.CUSTOMFIELD1, doc.CUSTOMFIELD2, doc.CUSTOMFIELD3, doc.CUSTOMFIELD4, doc.CUSTOMFIELD5, ")
+                .append("doc.CUSTOMFIELD6, doc.CUSTOMFIELD7, doc.CUSTOMFIELD8, doc.USERDEFINED1, doc.USERDEFINED2, doc.USERDEFINED3, doc.USERDEFINED4)");
+        return sql.toString();
+    }
+
+    public String getGenerateBatchsSql(Integer lineNo, Integer detno, OUTConfirm.OrderLines.OrderLine.Batchs.Batch batch) {
+        StringBuilder sql = new StringBuilder();
+        sql.append("INSERT INTO ").append("@MASTERCODE")
+                .append(".prodiowms_batchs(ITIME,PB_PIID, PD_DETNO, LINENO, ACTUALQTY, ACTUALPACKUOMQTY, INVENTORYTYPE, VIRTUALWAREHOUSE, PRODUCTDATE, EXPIREDATE, BATCHCODE, STOCKINDATE, USERDEFINED1, USERDEFINED2, USERDEFINED3, USERDEFINED4, LPN) VALUES(");
+        // 添加字段值
+        sql.append("SYSDATE, ");
+        sql.append("@PIID").append(", ");
+        sql.append(detno).append(", "); // PD_DETNO
+        sql.append(lineNo).append(", "); // LINENO
+        sql.append(StringUtil.nvl(batch.getActualQty(), "0")).append(", ");
+        sql.append(StringUtil.nvl(batch.getActualPackUomQty(), "0")).append(", ");
+        sql.append("'").append(StringUtil.nvl(batch.getInventoryType(), "")).append("', ");
+        sql.append("'").append(StringUtil.nvl(batch.getVirtualWarehouse(), "")).append("', ");
+        if (StringUtil.hasText(batch.getProductDate())) {
+            sql.append("to_date('").append(batch.getProductDate()).append("','yyyy-mm-dd hh24:mi:ss'), ");
+        } else {
+            sql.append("null, ");
+        }
+        if (StringUtil.hasText(batch.getExpireDate())) {
+            sql.append("to_date('").append(batch.getExpireDate()).append("','yyyy-mm-dd hh24:mi:ss'), ");
+        } else {
+            sql.append("null, ");
+        }
+        sql.append("'").append(StringUtil.nvl(batch.getBatchCode(), "")).append("', ");
+        if (StringUtil.hasText(batch.getStockinDate())) {
+            sql.append("to_date('").append(batch.getStockinDate()).append("','yyyy-mm-dd hh24:mi:ss'), ");
+        } else {
+            sql.append("null, ");
+        }
+        sql.append("'").append(StringUtil.nvl(batch.getUserDefined1(), "")).append("', ");
+        sql.append("'").append(StringUtil.nvl(batch.getUserDefined2(), "")).append("', ");
+        sql.append("'").append(StringUtil.nvl(batch.getUserDefined3(), "")).append("', ");
+        sql.append("'").append(StringUtil.nvl(batch.getUserDefined4(), "")).append("', ");
+        sql.append("'").append(StringUtil.nvl(batch.getLpn(), "")).append("'");
+        sql.append(")");
+        return sql.toString();
+    }
 }