فهرست منبع

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

wuyx 1 سال پیش
والد
کامیت
a68846c876
22فایلهای تغییر یافته به همراه767 افزوده شده و 239 حذف شده
  1. 2 11
      src/main/java/com/uas/eis/controller/ERPWMSController.java
  2. 105 0
      src/main/java/com/uas/eis/entity/vwms/entity/DeliveryOrder.java
  3. 1 1
      src/main/java/com/uas/eis/entity/vwms/entity/OrderCancel.java
  4. 20 1
      src/main/java/com/uas/eis/entity/vwms/entity/OrderLine.java
  5. 8 0
      src/main/java/com/uas/eis/entity/vwms/entity/OrderLineIn.java
  6. 7 0
      src/main/java/com/uas/eis/entity/vwms/entity/OrderLineOut.java
  7. 0 10
      src/main/java/com/uas/eis/entity/vwms/entity/OrderLines.java
  8. 4 0
      src/main/java/com/uas/eis/entity/vwms/entity/ProdInout.java
  9. 1 1
      src/main/java/com/uas/eis/entity/vwms/entity/Prodiodetail.java
  10. 9 2
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrderAndDetRequest.java
  11. 0 9
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrderVastRequest.java
  12. 0 10
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrdersRequest.java
  13. 68 70
      src/main/java/com/uas/eis/entity/vwms/req/INConfirm.java
  14. 253 0
      src/main/java/com/uas/eis/entity/vwms/req/OUTConfirm.java
  15. 16 0
      src/main/java/com/uas/eis/entity/vwms/req/OrderVastRequest.java
  16. 17 0
      src/main/java/com/uas/eis/entity/vwms/req/StockOutAndDetRequest.java
  17. 11 0
      src/main/java/com/uas/eis/entity/vwms/req/StockOutRequest.java
  18. 6 1
      src/main/java/com/uas/eis/entity/vwms/resp/BaseVastResp.java
  19. 3 8
      src/main/java/com/uas/eis/service/ERPWMSService.java
  20. 51 17
      src/main/java/com/uas/eis/service/Impl/ERPSWMServiceImpl.java
  21. 174 98
      src/main/java/com/uas/eis/service/Impl/ERPServiceImpl.java
  22. 11 0
      src/test/java/com/uas/eis/UasEisApplicationTests.java

+ 2 - 11
src/main/java/com/uas/eis/controller/ERPWMSController.java

@@ -1,15 +1,11 @@
 package com.uas.eis.controller;
 
-import com.uas.eis.entity.vwms.req.BaseReq;
-import com.uas.eis.entity.vwms.req.IOConfirm;
-import com.uas.eis.sdk.entity.WMSApiResult;
 import com.uas.eis.sdk.entity.WMSApiResultResp;
 import com.uas.eis.service.ERPWMSService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import com.fasterxml.jackson.databind.ObjectMapper;
 
 import java.io.IOException;
 
@@ -32,13 +28,8 @@ public class ERPWMSController {
     @RequestMapping(value="/wms",method=RequestMethod.POST)
     @ResponseBody
     public WMSApiResultResp IOConfirm(String method, HttpServletRequest request) throws IOException {
-        // 从request属性中获取缓存的请求体
-        String cachedBody = (String) request.getAttribute("cachedRequestBody");
-        // 使用Jackson将JSON字符串转换为BaseReq<IOConfirm>对象
-        ObjectMapper objectMapper = new ObjectMapper();
-        BaseReq<IOConfirm> ioConfirmBaseReq = objectMapper.readValue(cachedBody,
-                objectMapper.getTypeFactory().constructParametricType(BaseReq.class, IOConfirm.class));
-        return erpwmsService.IOConfirm(method, ioConfirmBaseReq);
+        ;
+        return erpwmsService.IOConfirm(method, request);
     }
 
 

+ 105 - 0
src/main/java/com/uas/eis/entity/vwms/entity/DeliveryOrder.java

@@ -0,0 +1,105 @@
+package com.uas.eis.entity.vwms.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.uas.api.b2c_erp.seller.model.Invoice;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class DeliveryOrder {
+    private String isRelease = "0";//释放状态  0=未释放,  1=已释放,  2=未控制, 默认:2(只传数字)
+    private String outBizCode; // 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
+    private String deliveryOrderCode; // 出库单号(ERP分配)
+    private String warehouseCode; // 仓库代码
+    private String ownerCode; // 货主代码
+    private String createTime; // 出库单创建时间 YYYY-MM-DD HH:MM:SS, 为空时WMS自动生成
+    private String orderType; // 出库单类型 例如: XSDD=销售订单、DBCK=调拨出库、THCK=退货出库、QTCK=其他出库(只传英文编码)
+    private String placedAt; // 下单时间 YYYY-MM-DD HH:MM:SS, 为空时WMS自动生成
+//    private String payTime; // 付款时间 YYYY-MM-DD HH:MM:SS
+//    private String datePlanned; // 预计到达时间 YYYY-MM-DD HH:MM:SS
+//    private String sourcePlatformCode; // 订单来源平台编码 TB=淘宝、TM=天猫、JD=京东、DD=当当、PP=拍拍、YX=易讯、EBAY=ebay、QQ=QQ网购、AMAZON=亚马逊、SN=苏宁、GM=国美、WPH=唯品会、JM=聚美、LF=乐蜂、MGJ=蘑菇街、JS=聚尚、PX=拍鞋、YT=银泰、YHD=1号店、VANCL=凡客、YL=邮乐、YG=优购、1688=阿里巴巴、POS=POS门店、MIA=蜜芽、GW=商家官网、CT=村淘、OTHER=其他(只传英文编码), 条件必填, 条件为B2C订单
+//    private String logisticsCode; // 物流公司编码 SF=顺丰、EMS=标准快递、EYB=经济快件、ZJS=宅急送、YTO=圆通、ZTO=中通、HTKY=百世汇通、UC=优速、STO=申通、TTKDEX=天天快递、QFKD=全峰、FAST=快捷、POSTB=邮政小包、GTO=国通、YUNDA=韵达、JD=京东配送、DD=当当宅配、AMAZON=亚马逊物流、OTHER=其他(只传英文编码), 条件必填, 条件为B2C订单
+//    private String expressCode; // 运单号
+//    private String printData; // 打印数据
+//    private String shopNick; // 店铺名称,条件必填,条件为B2C订单
+//    private String entryOrderCode; // 出库单对应的申请单号
+//    private String carryRoute; // 发货路线
+//    private String carrryCompany; // 承运商
+    private String customerCode; // 客户编码 标准发货通知单、VMI发货通知单取客户编码, 标准退货通知单取供应商编码, 分销调拨发货通知单取调出方编码、其他出库取公司编码
+    private String customer; // 客户名称 标准发货通知单、VMI发货通知单取客户名称, 标准退货通知单取供应商名称, 分销调拨发货通知单取调出方名称、其他出库取公司名称
+    private String documentMaker; // 制单人
+//    private String buyerMessage; // 买家留言
+//    private String sellerMessage; // 卖家留言
+//    private String invoiceFlag; // 发票标记 Y=需要发票, 默认为N,N=不需要发票
+//    private List<OutInvoice> invoices;//发票信息
+//    private SenderInfo senderInfo;//发货信息
+    private ReceiverInfo receiverInfo;//收货信息
+//    private String customJson; //自定义json
+    private String remark; //备注
+    private String userDefined1; //自定义1
+    private String userDefined2;
+    private String userDefined3;
+    private String userDefined4;
+//    private String sourceOrderCode; //交易平台订单号
+//    private List<File> files;
+
+  /*  @Data
+    public static class OutInvoice {
+        private String type;
+        private String header;
+        private Float amount;
+        private String content;
+        private String taxNumber;
+        private List<OutInvoiceItem> detail;
+    }
+
+    @Data
+    public static class OutInvoiceItem {
+        private String itemName;
+        private String unit;
+        private Float price;
+        private Float quantity;
+        private Float amount;
+    }*/
+
+    @Data
+    public static class SenderInfo {
+        private String name; // 姓名 条件必填, 条件为B2C订单
+        private String mobile; // 移动电话 条件必填, 条件为B2C订单
+        private String province; // 省份 条件必填, 条件为B2C订单
+        private String city; // 城市 条件必填, 条件为B2C订单
+        private String area; // 区域
+        private String town; // 村镇
+        private String detailAddress; // 详细地址 条件必填, 条件为B2C订单
+        private String company; // 公司名称
+        private String zipCode; // 邮编
+        private String countryCode; // 国家二字码
+    }
+
+    @Data
+    public static class ReceiverInfo {
+        private String name; // 姓名
+//        private String tel; // 固定电话
+        private String mobile; // 移动电话 条件必填, 条件为B2C订单
+//        private String province; // 省份 条件必填, 条件为B2C订单
+//        private String city; // 城市 条件必填, 条件为B2C订单
+//        private String area; // 区域
+//        private String town; // 村镇
+        private String detailAddress; // 详细地址
+//        private String email; // 电子邮箱
+//        private String company; // 公司名称
+//        private String zipCode; // 邮编
+//        private String countryCode; // 国家二字码
+//        private String oaid; // 收件人销售平台ID
+    }
+
+ /*   @Data
+    public static class File {
+        private String name;
+        private String url;
+    }*/
+
+}
+

+ 1 - 1
src/main/java/com/uas/eis/entity/vwms/entity/EntryOrderCancel.java → src/main/java/com/uas/eis/entity/vwms/entity/OrderCancel.java

@@ -3,7 +3,7 @@ package com.uas.eis.entity.vwms.entity;
 import lombok.Data;
 
 @Data
-public class EntryOrderCancel {
+public class OrderCancel {
     private String warehouseCode; // 仓库编码
     private String ownerCode; // 货主编码
     private String orderCode; // 单据编码:ERP单号

+ 20 - 1
src/main/java/com/uas/eis/entity/vwms/entity/OrderLine.java

@@ -1,18 +1,37 @@
 package com.uas.eis.entity.vwms.entity;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
 
 @Data
+@JsonIgnoreProperties(ignoreUnknown = true)
 public class OrderLine {
     private String lineNo; // 行号
     private String ownerCode; // 货主编码
+//    private String itemId;
     private String itemCode; // 商品编码
     private String itemName; // 商品名称
     private Float planQty; // 应收商品数量
     private String virtualWarehouse; // 虚拟仓库编号
-    private String stockinDate; // 入库日期
+
     private String userDefined1; // 入库批次
     private String userDefined2;
     private String userDefined3; // 品牌
     private String userDefined4; // 账套
+   /* private String packUom;
+    private String actualPrice;
+    private String inventoryType;
+    private String productDate;
+    private String expireDate;
+    private String batchCode;
+
+    private String customJson;
+    private String customField1;
+    private String customField2;
+    private String customField3;
+    private String customField4;
+    private String customField5;
+    private String customField6;
+    private String customField7;
+    private String customField8;*/
 }

+ 8 - 0
src/main/java/com/uas/eis/entity/vwms/entity/OrderLineIn.java

@@ -0,0 +1,8 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class OrderLineIn extends OrderLine {
+    private String stockinDate; // 入库日期
+}

+ 7 - 0
src/main/java/com/uas/eis/entity/vwms/entity/OrderLineOut.java

@@ -0,0 +1,7 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class OrderLineOut extends OrderLine {
+}

+ 0 - 10
src/main/java/com/uas/eis/entity/vwms/entity/OrderLines.java

@@ -1,10 +0,0 @@
-package com.uas.eis.entity.vwms.entity;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class OrderLines {
-    List<OrderLine> orderLine;
-}

+ 4 - 0
src/main/java/com/uas/eis/entity/vwms/entity/ProdInout.java

@@ -23,6 +23,10 @@ public class ProdInout {
     private Integer piSendwmsflag;
     private String piWmsInType;
     private String piWmsstatus;
+    private String piInvoStatusCode;//审核状态:ENTERING、COMMITED、AUDITED
+    private String piLxr;//收货人
+    private String piLxdh;//收货电话
+    private String piKhdz;//收货地址
 
 
 

+ 1 - 1
src/main/java/com/uas/eis/entity/vwms/entity/Prodiodetail.java

@@ -6,7 +6,7 @@ import lombok.Data;
 public class Prodiodetail {
     private Long pdId;
     private Long pdPiid;
-    private String pdPdno;
+    private Integer pdPdno;
     private String pdProdcode;
     private String pdProdname;
     private Float pdQty;

+ 9 - 2
src/main/java/com/uas/eis/entity/vwms/req/EntryOrderAndDetRequest.java

@@ -1,9 +1,16 @@
 package com.uas.eis.entity.vwms.req;
 
-import com.uas.eis.entity.vwms.entity.OrderLines;
+import com.uas.eis.entity.vwms.entity.OrderLineIn;
+import com.uas.eis.entity.vwms.entity.OrderLineOut;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class EntryOrderAndDetRequest extends EntryOrderRequest {
-    OrderLines orderLines;
+    InOrderLines orderLines;
+    @Data
+    public static class InOrderLines{
+        List<OrderLineIn> orderLine;
+    }
 }

+ 0 - 9
src/main/java/com/uas/eis/entity/vwms/req/EntryOrderVastRequest.java

@@ -1,9 +0,0 @@
-package com.uas.eis.entity.vwms.req;
-
-import lombok.Data;
-
-@Data
-public class EntryOrderVastRequest<T> {
-    String outBizCode;
-    EntryOrdersRequest<T> orders;
-}

+ 0 - 10
src/main/java/com/uas/eis/entity/vwms/req/EntryOrdersRequest.java

@@ -1,10 +0,0 @@
-package com.uas.eis.entity.vwms.req;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class EntryOrdersRequest<T> {
-    List<T> order;
-}

+ 68 - 70
src/main/java/com/uas/eis/entity/vwms/req/IOConfirm.java → src/main/java/com/uas/eis/entity/vwms/req/INConfirm.java

@@ -8,7 +8,7 @@ import java.util.List;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 @Data
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class IOConfirm {
+public class INConfirm {
     private EntryOrder entryOrder;
     private OrderLines orderLines;
     private OrderDetails orderDetails;
@@ -174,14 +174,11 @@ public class IOConfirm {
             return null;
         }
     }
-public String getGenerateMainSql(String masterCode,Long piid,String inoutno) {
-    if (piid == null||inoutno==null){
-        return null;
-    }
-    StringBuilder sql = new StringBuilder("MERGE INTO ").append(masterCode).append(".prodiowms wmsl USING (")
+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("@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, ")
@@ -220,81 +217,82 @@ public String getGenerateMainSql(String masterCode,Long piid,String inoutno) {
     return sql.toString();
 }
 
-public List<String> getGenerateLinesSql(String masterCode,Long piId) {
+public List<String> getGenerateLinesSql() {
     List<String> sqls = new ArrayList<>();
     for (OrderLines.OrderLine line : orderLines.getOrderLine()) {
-        sqls.add(getGenerateLinesSql(masterCode,piId,line));
+        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(masterCode,piId,line.getLineNo(),(i+1),batch));
+            sqls.add(getGenerateBatchsSql(line.getLineNo(),(i+1),batch));
         }
     }
     return sqls;
 }
-    public String getGenerateLinesSql(String masterCode,Long piid,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(String masterCode,Long piid,Integer lineNo,Integer detno,OrderLines.OrderLine.Batchs.Batch batch) {
+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) {
         StringBuilder sql = new StringBuilder();
-        sql.append("INSERT INTO ").append(masterCode)
+        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("@PIID").append(", ");
         sql.append(detno).append(", "); // PD_DETNO
         sql.append(lineNo).append(", "); // LINENO
         sql.append(StringUtil.nvl(batch.getActualQty(), "0")).append(", ");

+ 253 - 0
src/main/java/com/uas/eis/entity/vwms/req/OUTConfirm.java

@@ -0,0 +1,253 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.uas.eis.utils.StringUtil;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OUTConfirm {
+    private DeliveryOrder deliveryOrder;
+    private Packages packages;
+    private OrderLines orderLines;
+    private OrderDetails orderDetails;
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class DeliveryOrder {
+        /** 出库单号 长度:50 */
+        private String deliveryOrderCode;
+        /** 仓储系统出库单号 长度:50 条件必填 */
+        private String deliveryOrderId;
+        /** 仓库代码 长度:50 */
+        private String warehouseCode;
+        /** 货主代码 长度:50 */
+        private String ownerCode;
+        /** 出库单类型 长度:50 例如: XSDD=销售订单, DBCK=调拨出库、CGTH=采购退货, QTCK=其他出库 */
+        private String orderType;
+        /** 出库单状态 长度:50 NEW-未开始处理, ACCEPT=仓库接单, PARTDELIVERED=部分发货完成, DELIVERED=发货完成, CANCELED=取消, CLOSED=关闭, CANCELEDFAIL=取消失败(只传英文编码) */
+        private String status;
+        /** 外部业务编码 长度:50 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理 */
+        private String outBizCode;
+        /** 支持出库单多次发货 多次发货确认时 0=发货单最终状态确认: 1=发货单中间状态确认 */
+        private String confirmType;
+        /** 物流公司编码 长度:50 SF=顺丰、EMS=标准快递、EYB=经济快件、ZJS=宅急送、YTO=圆通、ZTO=中通、HTKY=百世汇通、UC=优速、STO=申通、TTKDEX=天天快递、QFKD=全峰、FAST=快捷、POSTB=邮政小包、GTO=国通、YUNDA=韵达、JD=京东配送、DD=当当宅配、AMAZON=亚马逊物流、OTHER=其他(只传英文编码) */
+        private String logisticsCode;
+        /** 运单号 长度:50 */
+        private String expressCode;
+        /** 制单人 长度:50 */
+        private String documentMaker;
+        /** 发货人 长度:50 */
+        private String shipper;
+        /** 收货人 长度:50 */
+        private String receiverName;
+        /** 订单发运时间 长度:19 YYYY-MM-DD HH:MM:SS */
+        private String deliveryTime;
+        /** 用户自定义1 长度:50 */
+        private String userDefined1;
+        /** 用户自定义2 长度:50 */
+        private String userDefined2;
+        /** 用户自定义3 长度:50 */
+        private String userDefined3;
+        /** 用户自定义4 长度:50 */
+        private String userDefined4;
+        /** 客户 长度:50 */
+        private String customer;
+        /** 序列号 长度:50 */
+        private String serialNos;
+        /** 序列号数量 长度:50 */
+        private String serialNoQty;
+        /** 订单来源平台代码 长度:50 */
+        private String sourcePlatformCode;
+        /** 备注 长度:100 */
+        private String remark;
+        /** 文件信息 */
+        private Files files;
+    }
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Files {
+        private List<File> file;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class File {
+            /** 文件url,仅出库单关闭状态时回传,文件url有效时间24小时内*/
+            private String url;
+        }
+    }
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Packages {
+        @JsonProperty("package")
+        private List<Pkg> pkg;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class Pkg {
+            /** 物流公司编码 长度:50 SF=顺丰、EMS=标准快递、EYB=经济快件、ZJS=宅急送、YTO=圆通、ZTO=中通、HTKY=百世汇通、UC=优速、STO=申通、TTKDEX=天天快递、QFKD=全峰、FAST=快捷、POSTB=邮政小包、GTO=国通、YUNDA=韵达、JD=京东配送、DD=当当宅配、AMAZON=亚马逊物流、OTHER=其他(只传英文编码) */
+            private String logisticsCode;
+            /** 运单号 长度:50 */
+            private String expressCode;
+            /** 箱号 长度:50 */
+            private String packageCode;
+            /** 商品信息 */
+            private Items items;
+            /** 耗材信息 */
+            private ConsumableDetails consumableDetails;
+            /** 箱重量 类型:double(18,3) */
+            private Double weight;
+            /** 箱体积 类型:double(18,3) */
+            private Double volume;
+            /** 耗材体积 类型:double(18,3) */
+            private Double consumableVolume;
+            /** 耗材代码 长度:50 */
+            private String consumableCode;
+            /** 货品体积 double (18,3)*/
+            private String productVolume;
+            /** 货品重量 */
+            private String productWeight;
+            /** 箱自定义1 */
+            private String userDefined1;
+            /** 箱自定义2 */
+            private String userDefined2;
+            /** 箱自定义3 */
+            private String userDefined3;
+            /** 箱自定义4 */
+            private String userDefined4;
+        }
+    }
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Items {
+        private List<Item> item;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class Item {
+            /** 货品代码  */
+            private String itemCode;
+            /** 箱内该货品的数量 */
+            private String quantity;
+        }
+    }
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class ConsumableDetails {
+        private List<ConsumableDetail> consumableDetail;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class ConsumableDetail {
+            /** 耗材代码  */
+            private String consumableCode;
+            /** 箱内该耗材的数量 */
+            private String quantity;
+        }
+    }
+
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class OrderLines {
+        private List<OrderLine> orderLine;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class OrderLine {
+            /** 行号 */
+            private Integer lineNo;
+            /** 货品代码 长度:50 */
+            private String itemCode;
+            /** 包装单位 长度:50 */
+            private String packUom;
+            /** 预期货品数量 类型:float */
+            private Float planQty;
+            /** 实发货品数量 类型:float */
+            private Float actualQty;
+            /** 实发包装数量 类型:float */
+            private Float actualPackUomQty;
+            /** 质量状态 长度:50 ZP=正品, CC=残次, 默认为ZP */
+            private String inventoryType;
+            /** 序列号,多个序列号用英文逗号隔开 长度:500 */
+            private String serialNo;
+            /** 自定义字段1 长度:50 */
+            private String customField1;
+            /** 自定义字段2 长度:50 */
+            private String customField2;
+            /** 自定义字段3 长度:50 */
+            private String customField3;
+            /** 自定义字段4 长度:50 */
+            private String customField4;
+            /** 自定义字段5 长度:50 */
+            private String customField5;
+            /** 自定义字段6 长度:50 */
+            private String customField6;
+            /** 自定义字段7 长度:50 */
+            private String customField7;
+            /** 自定义字段8 长度:50 */
+            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 OrderDetails {
+        private List<Detail> detail;
+
+        @Data
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class Detail {
+            /** 容器号 */
+            private String boxNo;
+            /** epc码  RFID场景适用 */
+            private String epc;
+        }
+    }
+}

+ 16 - 0
src/main/java/com/uas/eis/entity/vwms/req/OrderVastRequest.java

@@ -0,0 +1,16 @@
+package com.uas.eis.entity.vwms.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OrderVastRequest<T> {
+    String outBizCode;
+    OrdersRequest<T> orders;
+
+    @Data
+    public static class OrdersRequest<T> {
+        List<T> order;
+    }
+}

+ 17 - 0
src/main/java/com/uas/eis/entity/vwms/req/StockOutAndDetRequest.java

@@ -0,0 +1,17 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.uas.eis.entity.vwms.entity.OrderLineOut;
+import lombok.Data;
+
+import java.util.List;
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class StockOutAndDetRequest extends StockOutRequest{
+    OutOrderLines orderLines;
+    @Data
+    public static class OutOrderLines{
+        List<OrderLineOut> orderLine;
+    }
+
+}

+ 11 - 0
src/main/java/com/uas/eis/entity/vwms/req/StockOutRequest.java

@@ -0,0 +1,11 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.uas.eis.entity.vwms.entity.DeliveryOrder;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class StockOutRequest {
+    DeliveryOrder deliveryOrder;
+}

+ 6 - 1
src/main/java/com/uas/eis/entity/vwms/resp/BaseVastResp.java

@@ -1,18 +1,23 @@
 package com.uas.eis.entity.vwms.resp;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
 
 import java.util.List;
 @Data
+@JsonIgnoreProperties(ignoreUnknown = true)
 public class BaseVastResp {
     private Response response;
 
     @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
     public static class Response {
         private String flag;
         private String code;
         private String message;
-        private String entryOrderId;
+        private String entryOrderId;//入库单仓储系统代码
+        private String deliveryOrderId;//出库单仓储系统代码
+        private String createTime; //订单创建时间  YYYY-MM-DD HH:MM:SS
         private Items items;
         private Orders orders;  // 新增字段,用于第一种格式
     }

+ 3 - 8
src/main/java/com/uas/eis/service/ERPWMSService.java

@@ -1,18 +1,13 @@
 package com.uas.eis.service;
 
-
-
-import com.uas.eis.entity.vwms.req.BaseReq;
-import com.uas.eis.entity.vwms.req.IOConfirm;
-import com.uas.eis.sdk.entity.WMSApiResult;
 import com.uas.eis.sdk.entity.WMSApiResultResp;
-
-import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
 
 /**
  * @author wuyx
  * @email wuyx@usoftchina.com
  */
 public interface ERPWMSService {
-    WMSApiResultResp IOConfirm(String method, BaseReq<IOConfirm> ioConfirmBaseReq);
+    WMSApiResultResp IOConfirm(String method,HttpServletRequest request) throws IOException;
 }

+ 51 - 17
src/main/java/com/uas/eis/service/Impl/ERPSWMServiceImpl.java

@@ -1,20 +1,20 @@
 package com.uas.eis.service.Impl;
 
-import com.alibaba.fastjson.JSON;
+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.BaseReq;
-import com.uas.eis.entity.vwms.req.IOConfirm;
+import com.uas.eis.entity.vwms.req.INConfirm;
 import com.uas.eis.sdk.entity.WMSApiResult;
 import com.uas.eis.sdk.entity.WMSApiResultResp;
 import com.uas.eis.service.ERPWMSService;
-import com.uas.eis.utils.BaseUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
 import java.util.*;
 
 /**
@@ -29,12 +29,43 @@ public class ERPSWMServiceImpl implements ERPWMSService {
     private BaseDao baseDao;
 
     @Override
-    public WMSApiResultResp IOConfirm(String method, BaseReq<IOConfirm> ioConfirmBaseReq) {
+    public WMSApiResultResp  IOConfirm(String method,  HttpServletRequest request) throws IOException {
         WMSApiResultResp resp = new WMSApiResultResp();
         WMSApiResult wmsApiResult = new WMSApiResult();
-        IOConfirm ioConfirm = ioConfirmBaseReq.getRequest();
-        IOConfirm.EntryOrder entryOrder = ioConfirm.getEntryOrder();
-        String masterName = ioConfirm.getMasterName();
+        String masterName = "";
+        String orderCode = "";
+        List<String> sqls = new ArrayList<>();
+        // 从request属性中获取缓存的请求体
+        String confirmBody = (String) request.getAttribute("cachedRequestBody");
+        // 使用Jackson将JSON字符串转换为BaseReq<IOConfirm>对象
+        ObjectMapper objectMapper = new ObjectMapper();
+        //入库确认 openapi.entryorder.confirm
+        if("openapi.entryorder.confirm".equals(method)){
+            BaseReq<INConfirm> inConfirmBaseReq = objectMapper.readValue(confirmBody,
+                    objectMapper.getTypeFactory().constructParametricType(BaseReq.class, INConfirm.class));
+            INConfirm inConfirm = inConfirmBaseReq.getRequest();
+            INConfirm.EntryOrder entryOrder = inConfirm.getEntryOrder();
+            masterName = inConfirm.getMasterName();
+            orderCode = entryOrder.getEntryOrderCode();
+            sqls.add(inConfirm.getGenerateMainSql());
+            sqls.addAll(inConfirm.getGenerateLinesSql());
+        }
+        //出库确认 openapi.stockout.confirm
+
+        if(orderCode == null || orderCode.equals("")){
+            wmsApiResult.setFlag("failure");
+            wmsApiResult.setCode("400");
+            wmsApiResult.setMessage("没有找到对应的单据");
+            resp.setResponse(wmsApiResult);
+            return resp;
+        }
+        if(masterName == null || masterName.equals("")){
+            wmsApiResult.setFlag("failure");
+            wmsApiResult.setCode("400");
+            wmsApiResult.setMessage("没有找到对应的账套");
+            resp.setResponse(wmsApiResult);
+            return resp;
+        }
         String masterCode = baseDao.queryForObject("SELECT max(MA_USER) FROM DATACENTER_P.MASTER WHERE MA_ENABLE = 1 and MA_FUNCTION = ?",String.class,masterName);
         if(masterCode == null){
             wmsApiResult.setFlag("failure");
@@ -43,12 +74,12 @@ public class ERPSWMServiceImpl implements ERPWMSService {
             resp.setResponse(wmsApiResult);
             return resp;
         }
-        logger.info("IOConfirm-Begin:method {} inoutno {}",method, entryOrder.getEntryOrderCode());
-        SqlRowList piMsg = baseDao.queryForRowSet("select pi_id,pi_inoutno from "+masterCode+".PRODINOUT WHERE PI_INOUTNO = '"+entryOrder.getEntryOrderCode()+"'");
+        logger.info("IOConfirm-Begin:method {} inoutno {}",method, orderCode);
+        SqlRowList piMsg = baseDao.queryForRowSet("select pi_id,pi_inoutno from "+masterCode+".PRODINOUT WHERE PI_INOUTNO = '"+orderCode+"'");
         if(!piMsg.next()){
             wmsApiResult.setFlag("failure");
             wmsApiResult.setCode("404");
-            wmsApiResult.setMessage("没有找到对应的入库单");
+            wmsApiResult.setMessage("没有找到对应的单");
             resp.setResponse(wmsApiResult);
             return resp;
         }
@@ -57,25 +88,28 @@ public class ERPSWMServiceImpl implements ERPWMSService {
         if(piId == null){
             wmsApiResult.setFlag("failure");
             wmsApiResult.setCode("404");
-            wmsApiResult.setMessage("没有找到对应的入库单");
+            wmsApiResult.setMessage("没有找到对应的单");
             resp.setResponse(wmsApiResult);
             return resp;
         }
-        List<String> sqls = new ArrayList<>();
-        sqls.add(ioConfirm.getGenerateMainSql(masterCode,piId,inoutno));
-        sqls.addAll(ioConfirm.getGenerateLinesSql(masterCode,piId));
+        // 使用循环遍历并替换每个SQL语句中的占位符
+        for (int i = 0; i < sqls.size(); i++) {
+            sqls.set(i, sqls.get(i).replace("@MASRERCODE", masterCode));
+            sqls.set(i, sqls.get(i).replace("@PIID", piId.toString()));
+            sqls.set(i, sqls.get(i).replace("@INOUTNO", inoutno));
+        }
         baseDao.execute(sqls);
         //根据下载采集数据分配采集数并自动过账
         String res = baseDao.callProcedure(masterCode+".DOCWMS_IO_CONFIRM",new Object[] { piId,null });
         if (res != null && !res.trim().equals("")) {
-            logger.info("IOConfirm-Err: {}",res);
+            logger.info("InConfirm-Err: {}",res);
             wmsApiResult.setFlag("failure");
             wmsApiResult.setCode("403");
             wmsApiResult.setMessage(res);
             resp.setResponse(wmsApiResult);
             return resp;
         }
-        logger.info("IOConfirm-End:method {} inoutno {}",method, entryOrder.getEntryOrderCode());
+        logger.info("InConfirm-End:method {} inoutno {}",method, orderCode);
         resp.setResponse(wmsApiResult);
         return resp;
     }

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

@@ -668,11 +668,111 @@ public class ERPServiceImpl implements ERPService {
             retMap.put("message","单据已确认采集,不允许重复同步。");
             return retMap;
         }
+        if (!StringUtil.hasText(prodInOut.getPiWmsInType())
+                || (StringUtil.hasText(prodInOut.getPiWmsInType())
+                && !prodInOut.getPiWmsInType().equals("in")
+                && !prodInOut.getPiWmsInType().equals("out")
+                && !prodInOut.getPiWmsInType().equals("move")
+        )) {
+            retMap.put("success",false);
+            retMap.put("message","WMS单据类型为空或异常,不允许同步。");
+            return retMap;
+        }
         //构建请求主体
         String masterName = baseDao.queryForObject("select max(ma_function) masterName from DATACENTER_P.master where ma_user = '"+master+"' ",String.class);
         Long piId = prodInOut.getPiId();
+        String errMsg = null;
+        if("in".equals(prodInOut.getPiWmsInType())){
+            errMsg = sendInToWms(prodInOut,masterName);
+        }
+        if("out".equals(prodInOut.getPiWmsInType())){
+            errMsg = sendOutToWms(prodInOut,masterName);
+        }
+        if(errMsg!=null){
+            if(errMsg.startsWith("OrderId:")){
+                retMap.put("OrderId",errMsg.replaceAll("OrderId:",""));
+                logger.info("sendIO-End-Sucess master {} piid {} OrderId {}",master,piId,errMsg.replaceAll("EntryOrderId:",""));
+            }else {
+                errMsg =  errMsg.replaceAll("'","''");
+                logger.info("sendIO-End-failure master {} piid {} errorTip {}",master,piId,errMsg);
+                retMap.put("success",false);
+                retMap.put("message",errMsg);
+            }
+        }else {
+            logger.info("sendIO-End-success master {} piid {} ",master,piId);
+        }
+        return retMap;
+    }
+
+    private String sendOutToWms(ProdInout prodInOut, String masterName) {
+        StockOutAndDetRequest stockOutAndDetRequest = new StockOutAndDetRequest();
+        DeliveryOrder deliveryOrder = new DeliveryOrder();
+        deliveryOrder.setOutBizCode(prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
+        deliveryOrder.setDeliveryOrderCode(prodInOut.getPiInoutno());// 出库单号
+        deliveryOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
+        deliveryOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码
+        deliveryOrder.setPlacedAt(prodInOut.getPiDate());// 订单创建时间
+        deliveryOrder.setOrderType(prodInOut.getPiOrderType());// 订单类型
+        deliveryOrder.setCustomerCode(prodInOut.getPiCardCode());// 客户编码
+        deliveryOrder.setCustomer(prodInOut.getPiTitle());// 客户名称
+        /*
+         * 提交对接创建-> 0=未释放
+         * 审核 -> 1=已释放
+         * prodInOut.getPiInvoStatusCode().equals("COMMITED") &&
+         *  */
+        if(prodInOut.getPiSendwmsflag()>0){
+            deliveryOrder.setIsRelease("1");
+        }else {
+            deliveryOrder.setIsRelease("0");
+        }
+        deliveryOrder.setDocumentMaker(prodInOut.getPiRecordman());// 制单人
+        deliveryOrder.setCreateTime(prodInOut.getPiRecordDate());
+        deliveryOrder.setRemark(prodInOut.getPiRemark());// 备注
+        DeliveryOrder.ReceiverInfo receiverInfo = new DeliveryOrder.ReceiverInfo();
+        receiverInfo.setName(prodInOut.getPiLxr());
+        receiverInfo.setMobile(prodInOut.getPiLxdh());
+        receiverInfo.setDetailAddress(prodInOut.getPiKhdz());
+        deliveryOrder.setReceiverInfo(receiverInfo);
+        //写入明细表
+        List<OrderLineOut> orderLineOuts = (List<OrderLineOut>) getOrderLines(prodInOut, masterName);
+        stockOutAndDetRequest.setDeliveryOrder(deliveryOrder);
+        StockOutAndDetRequest.OutOrderLines orderLines = new StockOutAndDetRequest.OutOrderLines();
+        orderLines.setOrderLine(orderLineOuts);
+        stockOutAndDetRequest.setOrderLines(orderLines);
+        //转换为JSON字符串
+        String json = null;
+        String method = null;
+        if(prodInOut.getPiSendwmsflag() == 0){
+            BaseReq<StockOutAndDetRequest> req = new BaseReq();
+            req.setRequest(stockOutAndDetRequest);
+            method = "openapi.stockout.create";
+            try {
+                json = objectMapper.writeValueAsString(req);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+                return "JSON转换失败";
+            }
+        }else {
+            method = "openapi.stockout.batchupdate";
+            BaseReq<OrderVastRequest<StockOutAndDetRequest>> req = new BaseReq();
+            OrderVastRequest<StockOutAndDetRequest> vastReq = new OrderVastRequest();
+            OrderVastRequest.OrdersRequest<StockOutAndDetRequest> orders = new OrderVastRequest.OrdersRequest<StockOutAndDetRequest>();
+            orders.setOrder(Arrays.asList(stockOutAndDetRequest));
+            vastReq.setOutBizCode(stockOutAndDetRequest.getDeliveryOrder().getOutBizCode());
+            vastReq.setOrders(orders);
+            req.setRequest(vastReq);
+            try {
+                json = objectMapper.writeValueAsString(req);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+                return "JSON转换失败";
+            }
+        }
+        return doSendOrderToWms(json,method);
+    }
+
+    private String sendInToWms(ProdInout prodInOut,String masterName){
         EntryOrder entryOrder = new EntryOrder();
-        OrderLines orderLines = new OrderLines();
         entryOrder.setOutBizCode(prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
         entryOrder.setEntryOrderCode(prodInOut.getPiInoutno());// 入库单号
         entryOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
@@ -683,44 +783,49 @@ public class ERPServiceImpl implements ERPService {
         entryOrder.setSupplierName(prodInOut.getPiTitle());// 供应商名称
         entryOrder.setDocumentMaker(prodInOut.getPiRecordman());// 制单人
         entryOrder.setRemark(prodInOut.getPiRemark());// 备注
-        List<OrderLine> orderLineList = getOrderLines(prodInOut,masterName);
-        orderLines.setOrderLine(orderLineList);
+        List<OrderLineIn> orderList = (List<OrderLineIn>) getOrderLines(prodInOut, masterName);
         EntryOrderAndDetRequest entryOrderAndDetRequest = new EntryOrderAndDetRequest();
+        EntryOrderAndDetRequest.InOrderLines orderLineIns = new EntryOrderAndDetRequest.InOrderLines();
+        orderLineIns.setOrderLine(orderList);
         entryOrderAndDetRequest.setEntryOrder(entryOrder);
-        entryOrderAndDetRequest.setOrderLines(orderLines);
-        String errMsg = null;
-        String docOp = "创建";
+        entryOrderAndDetRequest.setOrderLines(orderLineIns);
+        //转换为JSON字符串
+        String json = null;
+        String method = null;
         if(prodInOut.getPiSendwmsflag() == 0){
-            errMsg = createIoToWms(piId,master,entryOrderAndDetRequest);
-            if(errMsg.startsWith("EntryOrderId:")){
-                retMap.put("EntryOrderId",errMsg.replaceAll("EntryOrderId:",""));
-                errMsg = null;
+            method = "openapi.entryorder.create";
+            BaseReq<EntryOrderAndDetRequest> req = new BaseReq();
+            req.setRequest(entryOrderAndDetRequest);
+            try {
+                json = objectMapper.writeValueAsString(req);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+                return "JSON转换失败";
             }
             //TODO 写入表:WMS_IO_RECORD_SEQ
         }else {
-            docOp = "更新";
-            errMsg = updateIoToWms(piId,master,entryOrderAndDetRequest);
-        }
-        if(errMsg!=null){
-            errMsg =  errMsg.replaceAll("'","''");
-            logger.info("sendIO-End-failure master {} piid {} errorTip {}",master,piId,errMsg);
-//            baseDao.execute("update "+master+".prodinout set pi_sendwmsstatus='"+docOp+"失败',pi_sendwmserr=UNISTR('"+errMsg+"') where pi_id = "+piId);
-            retMap.put("success",false);
-            retMap.put("message",errMsg);
-        }else {
-            logger.info("sendIO-End-success master {} piid {} ",master,piId);
+            method = "openapi.entryorder.batchupdate";
+            BaseReq<OrderVastRequest<EntryOrderAndDetRequest>> req = new BaseReq();
+            OrderVastRequest<EntryOrderAndDetRequest> vastReq = new OrderVastRequest();
+            OrderVastRequest.OrdersRequest<EntryOrderAndDetRequest> orders = new OrderVastRequest.OrdersRequest<EntryOrderAndDetRequest>();
+            orders.setOrder(Arrays.asList(entryOrderAndDetRequest));
+            vastReq.setOutBizCode(entryOrderAndDetRequest.getEntryOrder().getOutBizCode());
+            vastReq.setOrders(orders);
+            req.setRequest(vastReq);
+            try {
+                json = objectMapper.writeValueAsString(req);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+                return "JSON转换失败";
+            }
         }
-        return retMap;
+        return doSendOrderToWms(json,method);
     }
-    private String createIoToWms(Long piId,String master,EntryOrderAndDetRequest entryOrderAndDetRequest){
+    private String doSendOrderToWms(String json,String method){
         String eMsg = null;
-        BaseReq<EntryOrderAndDetRequest> entryOrderReq = new BaseReq();
-        entryOrderReq.setRequest(entryOrderAndDetRequest);
         try {
-            //转换为JSON字符串
-            String json = objectMapper.writeValueAsString(entryOrderReq);
-            logger.info("sendIO-add-Request: {}", json);
-            HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.entryorder.create", json,vwmsConfig);
+            logger.info("doSendInOrderToWms method:{} json: {}",method, json);
+            HttpUtil.Response response = HttpUtil.doPostToVWMS(method, json,vwmsConfig);
             if(!String.valueOf(response.getStatusCode()).startsWith("2")){
                 eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"未知").replaceAll("'","''");
             }else {
@@ -728,56 +833,16 @@ public class ERPServiceImpl implements ERPService {
                 BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse();
                 if(baseVastRespResponse!=null){
                     if("success".equals(baseVastRespResponse.getFlag())){
-                        eMsg = "EntryOrderId:"+baseVastRespResponse.getEntryOrderId();
-                        logger.info("sendIO-add-response-success code: {} entryOrderId {} message: {}", baseVastRespResponse.getCode(),baseVastRespResponse.getEntryOrderId(),baseVastRespResponse.getMessage());
-//                        baseDao.execute("update  "+master+".prodinout set pi_wmsordercode='"+baseVastRespResponse.getEntryOrderId()+"',pi_sendwmsstatus='同步成功' ,pi_sendwmserr=null,pi_sendwmsflag=-1 where pi_id = "+piId);
-                    }else {
-                        eMsg = "(" + baseVastRespResponse.getCode() + ")";
-                        String errorMessage = baseVastRespResponse.getMessage();
-                        if (baseVastRespResponse.getOrders() != null &&
-                                !CollectionUtil.isEmpty(baseVastRespResponse.getOrders().getOrder())) {
-                            errorMessage = StringUtil.nvl(baseVastRespResponse.getOrders().getOrder().get(0).getMessage(),baseVastRespResponse.getMessage());
+                        String orderId = "";
+                        if("openapi.entryorder.create".equals(method)){
+                            orderId = baseVastRespResponse.getEntryOrderId();
+                            eMsg = "OrderId:"+orderId;
                         }
-                        eMsg += StringUtil.nvl(errorMessage, "未知").replaceAll("'", "''");
-                    }
-                }else {
-                    eMsg = "RespJSON转换失败:"+response.getStatusCode()+":"+response.getResponseText();
-                }
-            }
-        } catch (JsonProcessingException e) {
-            e.printStackTrace();
-            eMsg = "JSON转换失败";
-        } catch (Exception e) {
-            e.printStackTrace();
-            eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''");
-        }
-        return eMsg;
-    }
-
-    private String updateIoToWms(Long piId,String master,EntryOrderAndDetRequest entryOrderAndDetRequest){
-        String eMsg = "";
-        BaseReq<EntryOrderVastRequest<EntryOrderAndDetRequest>> baseEntryOrderReq = new BaseReq();
-        EntryOrderVastRequest<EntryOrderAndDetRequest> entryOrderVastRequest = new EntryOrderVastRequest();
-        EntryOrdersRequest<EntryOrderAndDetRequest> ordersRequest = new EntryOrdersRequest();
-        ordersRequest.setOrder(Arrays.asList(entryOrderAndDetRequest));
-        entryOrderVastRequest.setOutBizCode(entryOrderAndDetRequest.getEntryOrder().getOutBizCode());
-        entryOrderVastRequest.setOrders(ordersRequest);
-        baseEntryOrderReq.setRequest(entryOrderVastRequest);
-        try {
-            //转换为JSON字符串
-            String json = objectMapper.writeValueAsString(baseEntryOrderReq);
-            logger.info("sendIO-update-Request: {}", json);
-            HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.entryorder.batchupdate", json,vwmsConfig);
-            if(!String.valueOf(response.getStatusCode()).startsWith("2")){
-                eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"无").replaceAll("'","''");
-            }else {
-                logger.info("sendIO-update-Response: {}", response.getResponseText());
-                BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class);
-                BaseVastResp.Response baseVastRespResponse = baseVastResp.getResponse();
-                if(baseVastRespResponse!=null){
-                    if("success".equals(baseVastRespResponse.getFlag())){
-                        logger.info("sendIO-update-response-success code: {} message: {}", baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
-//                        baseDao.execute("update  "+master+".prodinout set pi_sendwmsstatus='更新成功',pi_sendwmserr=null where pi_id = "+piId);
+                        if("openapi.stockout.create".equals(method)){
+                            orderId = baseVastRespResponse.getDeliveryOrderId();
+                            eMsg = "OrderId:"+orderId;
+                        }
+                        logger.info("doSendInOrderToWms-resp-s code: {} method {} OrderId {} message: {}", baseVastRespResponse.getCode(),method,orderId,baseVastRespResponse.getMessage());
                     }else {
                         eMsg = "(" + baseVastRespResponse.getCode() + ")";
                         String errorMessage = baseVastRespResponse.getMessage();
@@ -792,8 +857,8 @@ public class ERPServiceImpl implements ERPService {
                 }
             }
         } catch (JsonProcessingException e) {
-            eMsg = "JSON转换失败";
             e.printStackTrace();
+            eMsg = "JSON转换失败";
         } catch (Exception e) {
             e.printStackTrace();
             eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''");
@@ -822,22 +887,15 @@ public class ERPServiceImpl implements ERPService {
             return retMap;
         }
         Long piId = prodInOut.getPiId();
-        EntryOrderVastRequest<EntryOrderCancel> cancelIOSRequest = new EntryOrderVastRequest();
-        EntryOrdersRequest<EntryOrderCancel> orders = new EntryOrdersRequest();
-        cancelIOSRequest.setOutBizCode("sendIO-cancel-"+prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
-        EntryOrderCancel cancelOrder = new EntryOrderCancel();
-        cancelOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码
-        cancelOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
-        cancelOrder.setOrderCode(prodInOut.getPiInoutno());// 入库单号
-        cancelOrder.setCancelReason(cancelReason);
-        cancelOrder.setCancelType(prodInOut.getPiWmsInType());
-        orders.setOrder(Arrays.asList(cancelOrder));
-        cancelIOSRequest.setOrders(orders);
-        BaseReq<EntryOrderVastRequest<EntryOrderCancel>> iobaseReq = new BaseReq();
-        iobaseReq.setRequest(cancelIOSRequest);
+        BaseReq<OrderVastRequest<OrderCancel>> req = new BaseReq();
+        OrderVastRequest<OrderCancel> cancelReq = new OrderVastRequest();
+        cancelReq.setOutBizCode("sendIO-cancel-"+prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
+        OrderVastRequest.OrdersRequest<OrderCancel> orders = getOrderCancelOrdersRequest(cancelReason, prodInOut);
+        cancelReq.setOrders(orders);
+        req.setRequest(cancelReq);
         try {
             //转换为JSON字符串
-            String json = objectMapper.writeValueAsString(iobaseReq);
+            String json = objectMapper.writeValueAsString(req);
             logger.info("sendIO-cancel-Request JSON: {}", json);
             HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.order.batchcancel.v2", json,vwmsConfig);
             if(!String.valueOf(response.getStatusCode()).startsWith("2")){
@@ -883,12 +941,24 @@ public class ERPServiceImpl implements ERPService {
         return retMap;
     }
 
+    private OrderVastRequest.OrdersRequest<OrderCancel> getOrderCancelOrdersRequest(String cancelReason, ProdInout prodInOut) {
+        OrderVastRequest.OrdersRequest<OrderCancel> orders = new OrderVastRequest.OrdersRequest<OrderCancel>();
+        OrderCancel cancelOrder = new OrderCancel();
+        cancelOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码
+        cancelOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
+        cancelOrder.setOrderCode(prodInOut.getPiInoutno());// 入库单号
+        cancelOrder.setCancelReason(cancelReason);
+        cancelOrder.setCancelType(prodInOut.getPiWmsInType());
+        orders.setOrder(Arrays.asList(cancelOrder));
+        return orders;
+    }
 
     private ProdInout getIO(String master,String id,boolean onlyMain){
         List<ProdInout> prodInOuts = baseDao.getJdbcTemplate().query(
                 "select pi_Wmsordertype piOrderType,pi_id piId,pi_inoutno piInoutno,pi_class piClass,pi_type piType,to_char(pi_recorddate,'yyyy-mm-dd hh24:mi:ss') piDate" +
                         ",pi_Cardcode piCardcode,pi_Title piTitle,pi_Recordman piRecordman,to_char(pi_recorddate,'yyyy-mm-dd hh24:mi:ss') piRecorddate,pi_Remark piRemark" +
-                        ",abs(nvl(pi_sendwmsflag,0)) piSendwmsflag,nvl(pi_WmsInType,'in') piWmsInType,pi_wmsstatus piWmsstatus " +
+                        ",abs(nvl(pi_sendwmsflag,0)) piSendwmsflag,nvl(pi_WmsInType,'in') piWmsInType,pi_wmsstatus piWmsstatus" +
+                        ",pi_invostatuscode piInvoStatusCode,pi_lxr_user piLxr,pi_lxdh_user piLxdh,pi_khdz_user piKhdz " +
                         " from "+master+".prodinout where pi_id = "+id,
                 new BeanPropertyRowMapper<ProdInout>(ProdInout.class));
         ProdInout prodInOut = prodInOuts.get(0);
@@ -920,17 +990,23 @@ public class ERPServiceImpl implements ERPService {
         return prodInOut;
     }
 
-    private List<OrderLine> getOrderLines(ProdInout prodInOut,String masterName) {
+    private List<? extends OrderLine> getOrderLines(ProdInout prodInOut,String masterName) {
         List<OrderLine> orderLineList = new ArrayList<>();
         for (Prodiodetail detail : prodInOut.getDetails()) {
-            OrderLine orderLine = new OrderLine();
-            orderLine.setLineNo(detail.getPdPdno());// 行号
+            OrderLine orderLine;
+            if ("in".equals(prodInOut.getPiWmsInType())) {
+                orderLine = new OrderLineIn(); // 创建入库订单行对象
+                ((OrderLineIn) orderLine).setStockinDate(prodInOut.getPiDate()); // 设置入库日期
+            } else {
+                orderLine = new OrderLine(); // 创建普通订单行对象
+            }
+            // 设置通用属性
+            orderLine.setLineNo(String.valueOf(detail.getPdPdno()));// 行号
             orderLine.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
             orderLine.setItemCode(detail.getPdProdcode());// 商品编码
             orderLine.setItemName(detail.getPdProdname());// 商品名称
             orderLine.setPlanQty(detail.getPdQty());// 数量
             orderLine.setVirtualWarehouse(detail.getPdWhname());// 虚拟仓库编号
-            orderLine.setStockinDate(prodInOut.getPiDate());// 入库日期
             orderLine.setUserDefined1(detail.getPdInBatch());// 入库批次
             orderLine.setUserDefined3(detail.getPdBrandName());// 品牌
             orderLine.setUserDefined4(masterName);//账套

+ 11 - 0
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -75,4 +75,15 @@ public class UasEisApplicationTests {
 		Map<String, Object> result = erpService.cancelIO(master, id, emCode,caller,"反审核");
 		System.out.println("result:"+result.toString());
 	}
+
+	@Test
+	public void testSendAddXSCH(){
+		// 设置测试数据
+		String master = "HUAXK";
+		String id = "50735826";
+		String emCode = "test";
+		String caller = "ProdInOut!Sale";
+		Map<String, Object> result = erpService.sendIO(master, id, emCode,caller);
+		System.out.println("result:"+result.toString());
+	}
 }