Browse Source

【华信科】【富勒WMS对接】【采购验收单对接】

wuyx 9 months ago
parent
commit
344666ac13
22 changed files with 568 additions and 224 deletions
  1. 19 0
      src/main/java/com/uas/eis/controller/ERPController.java
  2. 23 0
      src/main/java/com/uas/eis/entity/vwms/entity/EntryOrder.java
  3. 12 0
      src/main/java/com/uas/eis/entity/vwms/entity/EntryOrderCancel.java
  4. 18 0
      src/main/java/com/uas/eis/entity/vwms/entity/OrderLine.java
  5. 10 0
      src/main/java/com/uas/eis/entity/vwms/entity/OrderLines.java
  6. 28 0
      src/main/java/com/uas/eis/entity/vwms/entity/ProdInout.java
  7. 16 0
      src/main/java/com/uas/eis/entity/vwms/entity/Prodiodetail.java
  8. 18 0
      src/main/java/com/uas/eis/entity/vwms/req/BaseItemsReq.java
  9. 2 43
      src/main/java/com/uas/eis/entity/vwms/req/BaseReq.java
  10. 0 23
      src/main/java/com/uas/eis/entity/vwms/req/BaseVastItem.java
  11. 0 57
      src/main/java/com/uas/eis/entity/vwms/req/BaseVastReq.java
  12. 9 0
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrderAndDetRequest.java
  13. 9 0
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrderRequest.java
  14. 9 0
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrderVastRequest.java
  15. 10 0
      src/main/java/com/uas/eis/entity/vwms/req/EntryOrdersRequest.java
  16. 0 24
      src/main/java/com/uas/eis/entity/vwms/req/RequestWrapper.java
  17. 0 25
      src/main/java/com/uas/eis/entity/vwms/req/RequestWrapperVast.java
  18. 17 0
      src/main/java/com/uas/eis/entity/vwms/resp/BaseVastResp.java
  19. 4 0
      src/main/java/com/uas/eis/service/ERPService.java
  20. 315 45
      src/main/java/com/uas/eis/service/Impl/ERPServiceImpl.java
  21. 24 0
      src/main/java/com/uas/eis/utils/BaseUtil.java
  22. 25 7
      src/test/java/com/uas/eis/UasEisApplicationTests.java

+ 19 - 0
src/main/java/com/uas/eis/controller/ERPController.java

@@ -47,4 +47,23 @@ public class ERPController {
         return erpService.sendCust(master,ids,emCode,caller);
     }
 
+
+    /**
+     * 发送出入库信息
+     */
+    @RequestMapping(value="/erp/sendIO",method=RequestMethod.POST)
+    @ResponseBody
+    public Map<String, Object> sendIO(String master, String id,String emCode,String caller){
+        return erpService.sendIO(master,id,emCode,caller);
+    }
+
+    /**
+     * 取消出入库信息
+     */
+    @RequestMapping(value="/erp/cancelIO",method=RequestMethod.POST)
+    @ResponseBody
+    public Map<String, Object> cancelIO(String master, String id,String emCode,String caller,String op){
+        return erpService.cancelIO(master,id,emCode,caller,op);
+    }
+
 }

+ 23 - 0
src/main/java/com/uas/eis/entity/vwms/entity/EntryOrder.java

@@ -0,0 +1,23 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class EntryOrder {
+    private String outBizCode; // 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
+    private String entryOrderCode; // 入库单号
+    private String ownerCode; // 货主编码
+    private String warehouseCode; // 仓库编码
+    private String orderCreateTime; // 订单创建时间
+    private String orderType; // 入库单类型
+    private String supplierCode; // 供应商编码
+    private String supplierName; // 供应商名称
+    private String documentMaker; // 制单人
+    private String remark; // 备注
+
+    private String isRelease = "2";//释放状态  0=未释放,  1=已释放,  2=未控制, 默认:2(只传数字)
+//    private String userDefined1; // 自定义1
+//    private String userDefined2; // 自定义2
+//    private String userDefined3; // 自定义3
+//    private String userDefined4; // 自定义4
+}

+ 12 - 0
src/main/java/com/uas/eis/entity/vwms/entity/EntryOrderCancel.java

@@ -0,0 +1,12 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class EntryOrderCancel {
+    private String warehouseCode; // 仓库编码
+    private String ownerCode; // 货主编码
+    private String orderCode; // 单据编码:ERP单号
+    private String cancelReason; // 取消原因
+    private String cancelType; // 取消类型  例如: in=入库订单、out=出库订单、sale=销售订单、moving=erp转移单、process=加工单、purchase=采购订单,transfer=转移单,move=移库单
+}

+ 18 - 0
src/main/java/com/uas/eis/entity/vwms/entity/OrderLine.java

@@ -0,0 +1,18 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class OrderLine {
+    private String lineNo; // 行号
+    private String ownerCode; // 货主编码
+    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; // 账套
+}

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

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

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

@@ -0,0 +1,28 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class ProdInout {
+    private Long piId;
+    private String piInoutno;
+    private String piClass;
+    private String piType;
+    private String piDate;
+    private String piCardCode;
+    private String piTitle;
+    private String piRecordman;
+    private String piRecordDate;
+    private String piRemark;
+    private List<Prodiodetail> details = new ArrayList<>();
+
+    private String piOrderType;
+    private Integer piSendwmsflag;
+    private String piWmsInType;
+
+
+
+}

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

@@ -0,0 +1,16 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class Prodiodetail {
+    private Long pdId;
+    private String pdPdno;
+    private String pdProdcode;
+    private String pdProdname;
+    private Float pdQty;
+    private String pdWhcode;
+    private String pdWhname;
+    private String pdInBatch;
+    private String pdBrandName;
+}

+ 18 - 0
src/main/java/com/uas/eis/entity/vwms/req/BaseItemsReq.java

@@ -0,0 +1,18 @@
+package com.uas.eis.entity.vwms.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BaseItemsReq<T> {
+    private String actionType;
+    private String warehouseCode;
+    private String ownerCode;
+    private String outBizCode;
+    private BaseItems<T> items;
+    @Data
+    public class BaseItems<T> {
+        private List<T> item;
+    }
+}

+ 2 - 43
src/main/java/com/uas/eis/entity/vwms/req/BaseReq.java

@@ -4,46 +4,5 @@ import lombok.Data;
 
 @Data
 public class BaseReq<T> {
-    private String actionType;
-    private String warehouseCode;
-    private String ownerCode;
-    private T item;
-
-    // 省略getter/setter方法
-
-    public static class Builder<T> {
-        private String actionType;
-        private String warehouseCode;
-        private String ownerCode;
-        private T item;
-
-        public Builder<T> actionType(String actionType) {
-            this.actionType = actionType;
-            return this;
-        }
-
-        public Builder<T> warehouseCode(String warehouseCode) {
-            this.warehouseCode = warehouseCode;
-            return this;
-        }
-
-        public Builder<T> ownerCode(String ownerCode) {
-            this.ownerCode = ownerCode;
-            return this;
-        }
-
-        public Builder<T> item(T item) {
-            this.item = item;
-            return this;
-        }
-
-        public BaseReq<T> build() {
-            BaseReq<T> baseReq = new BaseReq<>();
-            baseReq.actionType = this.actionType;
-            baseReq.warehouseCode = this.warehouseCode;
-            baseReq.ownerCode = this.ownerCode;
-            baseReq.item = this.item;
-            return baseReq;
-        }
-    }
-}
+    T request;
+}

+ 0 - 23
src/main/java/com/uas/eis/entity/vwms/req/BaseVastItem.java

@@ -1,23 +0,0 @@
-package com.uas.eis.entity.vwms.req;
-
-import lombok.Data;
-
-import java.util.List;
-@Data
-public class BaseVastItem<T> {
-    private List<T> item;
-
-    public static class Builder<T> {
-        private List<T> item;
-        public BaseVastItem.Builder<T> item(List<T> item) {
-            this.item = item;
-            return this;
-        }
-
-        public BaseVastItem<T> build() {
-            BaseVastItem<T> baseVastItem = new BaseVastItem<>();
-            baseVastItem.item = this.item;
-            return baseVastItem;
-        }
-    }
-}

+ 0 - 57
src/main/java/com/uas/eis/entity/vwms/req/BaseVastReq.java

@@ -1,57 +0,0 @@
-package com.uas.eis.entity.vwms.req;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class BaseVastReq<T> {
-    private String actionType;
-    private String warehouseCode;
-    private String ownerCode;
-    private String outBizCode;
-    private BaseVastItem<T> items;
-
-    public static class Builder<T> {
-        private String actionType;
-        private String warehouseCode;
-        private String ownerCode;
-        private String outBizCode;
-        private BaseVastItem<T> items;
-
-        public Builder<T> actionType(String actionType) {
-            this.actionType = actionType;
-            return this;
-        }
-
-        public Builder<T> warehouseCode(String warehouseCode) {
-            this.warehouseCode = warehouseCode;
-            return this;
-        }
-
-        public Builder<T> ownerCode(String ownerCode) {
-            this.ownerCode = ownerCode;
-            return this;
-        }
-
-        public Builder<T> outBizCode(String outBizCode) {
-            this.outBizCode = outBizCode;
-            return this;
-        }
-
-        public Builder<T> items(BaseVastItem<T> items) {
-            this.items = items;
-            return this;
-        }
-
-        public BaseVastReq<T> build() {
-            BaseVastReq<T> baseReq = new BaseVastReq<>();
-            baseReq.actionType = this.actionType;
-            baseReq.warehouseCode = this.warehouseCode;
-            baseReq.ownerCode = this.ownerCode;
-            baseReq.outBizCode = this.outBizCode;
-            baseReq.items = this.items;
-            return baseReq;
-        }
-    }
-}

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

@@ -0,0 +1,9 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.uas.eis.entity.vwms.entity.OrderLines;
+import lombok.Data;
+
+@Data
+public class EntryOrderAndDetRequest extends EntryOrderRequest {
+    OrderLines orderLines;
+}

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

@@ -0,0 +1,9 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.uas.eis.entity.vwms.entity.EntryOrder;
+import lombok.Data;
+
+@Data
+public class EntryOrderRequest {
+    EntryOrder entryOrder;
+}

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

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

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

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

+ 0 - 24
src/main/java/com/uas/eis/entity/vwms/req/RequestWrapper.java

@@ -1,24 +0,0 @@
-package com.uas.eis.entity.vwms.req;
-
-import lombok.Data;
-@Data
-public class RequestWrapper<T> {
-    private BaseReq<T> request;
-
-    // 省略getter/setter方法
-
-    public static class Builder<T> {
-        private BaseReq<T> request;
-
-        public Builder<T> request(BaseReq<T> request) {
-            this.request = request;
-            return this;
-        }
-
-        public RequestWrapper<T> build() {
-            RequestWrapper<T> wrapper = new RequestWrapper<>();
-            wrapper.request = this.request;
-            return wrapper;
-        }
-    }
-}

+ 0 - 25
src/main/java/com/uas/eis/entity/vwms/req/RequestWrapperVast.java

@@ -1,25 +0,0 @@
-package com.uas.eis.entity.vwms.req;
-
-import lombok.Data;
-
-@Data
-public class RequestWrapperVast<T> {
-    private BaseVastReq<T> request;
-
-    // 省略getter/setter方法
-
-    public static class Builder<T> {
-        private BaseVastReq<T> request;
-
-        public Builder<T> request(BaseVastReq<T> request) {
-            this.request = request;
-            return this;
-        }
-
-        public RequestWrapperVast<T> build() {
-            RequestWrapperVast<T> wrapper = new RequestWrapperVast<>();
-            wrapper.request = this.request;
-            return wrapper;
-        }
-    }
-}

+ 17 - 0
src/main/java/com/uas/eis/entity/vwms/resp/BaseVastResp.java

@@ -12,7 +12,9 @@ public class BaseVastResp {
         private String flag;
         private String code;
         private String message;
+        private String entryOrderId;
         private Items items;
+        private Orders orders;  // 新增字段,用于第一种格式
     }
 
     @Data
@@ -25,4 +27,19 @@ public class BaseVastResp {
         private String itemCode;
         private String message;
     }
+
+    @Data
+    public static class Orders {
+        private List<Order> order;
+    }
+
+    @Data
+    public static class Order {
+        private String cancelType;
+        private String entryOrderId;
+        private String entryOrderCode;
+        private String message;
+        private String orderCode;
+        private String orderId;
+    }
 }

+ 4 - 0
src/main/java/com/uas/eis/service/ERPService.java

@@ -13,4 +13,8 @@ public interface ERPService {
     Map<String, Object> sendProd(String master, String ids,String emCode,String caller);
     Map<String, Object> sendVend(String master, String ids,String emCode,String caller);
     Map<String, Object> sendCust(String master, String ids, String emCode,String caller);
+
+    Map<String, Object> sendIO(String master, String id, String emCode, String caller);
+
+    Map<String, Object> cancelIO(String master, String id, String emCode, String caller,String op);
 }

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

@@ -4,10 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.uas.eis.config.VwmsConfig;
 import com.uas.eis.dao.*;
-import com.uas.eis.entity.vwms.entity.Customer;
-import com.uas.eis.entity.vwms.entity.CustomerAddress;
-import com.uas.eis.entity.vwms.entity.VendorContact;
-import com.uas.eis.entity.vwms.entity.Vendor;
+import com.uas.eis.entity.vwms.entity.*;
 import com.uas.eis.entity.vwms.req.*;
 import com.uas.eis.entity.vwms.resp.BaseVastResp;
 import com.uas.eis.service.ERPService;
@@ -17,6 +14,7 @@ import com.uas.eis.utils.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -88,7 +86,7 @@ public class ERPServiceImpl implements ERPService {
         return retMap;
     }
     private Map<String, Object> sendProdSigle(String master,String actionType,List<Map<String, Object>> list){
-        List<ProductReq> productReqList = new ArrayList<>();
+        List<ProductReq> prodList = new ArrayList<>();
         List<Object> docCodes = new ArrayList<>();
         String prCodes = "";
         StringBuffer errMsg = new StringBuffer();
@@ -117,26 +115,28 @@ public class ERPServiceImpl implements ERPService {
                         setKey1(StringUtil.nvl(map.get("pr_zxbzs"),"0.0"));
                     }})
                     .build();
-            productReqList.add(productReq);
+            prodList.add(productReq);
         }
         prCodes = "'"+docCodes.stream()
                 .map(String::valueOf)
                 .collect(Collectors.joining("','"))+"'";
         // 创建BaseReq对象
-        BaseVastReq<ProductReq> baseVastReq = new BaseVastReq.Builder<ProductReq>()
-                .actionType(actionType)
-                .warehouseCode(vwmsConfig.getWarehouseCode())
-                .ownerCode(vwmsConfig.getOwnerCode())
-                .outBizCode("sendProd-"+System.currentTimeMillis())
-                .items(new BaseVastItem.Builder<ProductReq>().item(productReqList).build())
-                .build();
+        BaseItemsReq<ProductReq> prodBaseItemsReq = new BaseItemsReq();
+        prodBaseItemsReq.setActionType(actionType);
+        prodBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
+        prodBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
+        prodBaseItemsReq.setOutBizCode("sendProd-"+System.currentTimeMillis());
+        // 创建BaseVastItem对象
+        BaseItemsReq.BaseItems prodBaseItems = new BaseItemsReq<ProductReq>().new BaseItems<ProductReq>();
+        // 设置BaseVastItem的item属性
+        prodBaseItems.setItem(prodList);
+        prodBaseItemsReq.setItems(prodBaseItems);
         // 创建RequestWrapper对象
-        RequestWrapperVast<ProductReq> wrapper = new RequestWrapperVast.Builder<ProductReq>()
-                .request(baseVastReq)
-                .build();
+        BaseReq<BaseItemsReq<ProductReq>> prodBaseReq = new BaseReq();
+        prodBaseReq.setRequest(prodBaseItemsReq);
         try {
             // 将wrapper对象转换为JSON字符串
-            String json = objectMapper.writeValueAsString(wrapper);
+            String json = objectMapper.writeValueAsString(prodBaseReq);
             logger.info("Request JSON: {}", json);
             //{{testapiurl}}?method=openapi.singleitem.synchronize&timestamp=2025-03-04 15:45:00
             // &format={{format}}&app_key={{app_key}}&v=2.0&sign=B21FFFE48507569E72D573359856B19B
@@ -207,7 +207,7 @@ public class ERPServiceImpl implements ERPService {
         } catch (Exception e) {
             e.printStackTrace();
             eMsg = StringUtil.nvl(e.getMessage(),"无");
-            baseDao.execute("update "+master+".product set pr_sendwmsstatus='同步失败' pr_sendwmserr='操作:"+actionType+":"+eMsg+"' where pr_code in ("+prCodes+")");
+            baseDao.execute("update "+master+".product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:"+actionType+":"+eMsg+"' where pr_code in ("+prCodes+")");
             throw new RuntimeException(e);
         }
     }
@@ -344,20 +344,22 @@ public class ERPServiceImpl implements ERPService {
                 .map(String::valueOf)
                 .collect(Collectors.joining("','"))+"'";
         // 创建BaseReq对象
-        BaseVastReq<PartnersReq> baseVastReq = new BaseVastReq.Builder<PartnersReq>()
-                .actionType(actionType)
-                .warehouseCode(vwmsConfig.getWarehouseCode())
-                .ownerCode(vwmsConfig.getOwnerCode())
-                .outBizCode("sendVend"+System.currentTimeMillis())
-                .items(new BaseVastItem.Builder<PartnersReq>().item(regList).build())
-                .build();
-        // 创建RequestWrapper对象
-        RequestWrapperVast<PartnersReq> wrapper = new RequestWrapperVast.Builder<PartnersReq>()
-                .request(baseVastReq)
-                .build();
+        BaseItemsReq<PartnersReq> vendBaseItemsReq = new BaseItemsReq();
+        vendBaseItemsReq.setActionType(actionType);
+        vendBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
+        vendBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
+        vendBaseItemsReq.setOutBizCode("sendVend-"+System.currentTimeMillis());
+        // 创建BaseVastItem对象
+        BaseItemsReq.BaseItems vendBaseItems = new BaseItemsReq<PartnersReq>().new BaseItems<PartnersReq>();
+        // 设置BaseVastItem的item属性
+        vendBaseItems.setItem(regList);
+        vendBaseItemsReq.setItems(vendBaseItems);
+        // 创建BaseReq对象
+        BaseReq<BaseItemsReq<PartnersReq>> vendBaseReq = new BaseReq();
+        vendBaseReq.setRequest(vendBaseItemsReq);
         try {
             // 将wrapper对象转换为JSON字符串
-            String json = objectMapper.writeValueAsString(wrapper);
+            String json = objectMapper.writeValueAsString(vendBaseReq);
             logger.info("Request JSON: {}", json);
             HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.partners.batchcreate", json,vwmsConfig);
             if(!String.valueOf(response.getStatusCode()).startsWith("2")){
@@ -508,7 +510,7 @@ public class ERPServiceImpl implements ERPService {
     }
 
     private Map<String, Object> sendCustSigle(String master,String actionType,List<Customer> list){
-        List<PartnersReq> regList = new ArrayList<>();
+        List<PartnersReq> custList = new ArrayList<>();
         List<Object> docCodes = new ArrayList<>();
         String codes = "";
         StringBuffer errMsg = new StringBuffer();
@@ -548,26 +550,28 @@ public class ERPServiceImpl implements ERPService {
                                     .collect(Collectors.toList()))
                             .build())
                     .build();
-            regList.add(req);
+            custList.add(req);
         }
         codes = "'"+docCodes.stream()
                 .map(String::valueOf)
                 .collect(Collectors.joining("','"))+"'";
         // 创建BaseReq对象
-        BaseVastReq<PartnersReq> baseVastReq = new BaseVastReq.Builder<PartnersReq>()
-                .actionType(actionType)
-                .warehouseCode(vwmsConfig.getWarehouseCode())
-                .ownerCode(vwmsConfig.getOwnerCode())
-                .outBizCode("sendCust-"+System.currentTimeMillis())
-                .items(new BaseVastItem.Builder<PartnersReq>().item(regList).build())
-                .build();
-        // 创建RequestWrapper对象
-        RequestWrapperVast<PartnersReq> wrapper = new RequestWrapperVast.Builder<PartnersReq>()
-                .request(baseVastReq)
-                .build();
+        BaseItemsReq<PartnersReq> custBaseItemsReq = new BaseItemsReq();
+        custBaseItemsReq.setActionType(actionType);
+        custBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
+        custBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
+        custBaseItemsReq.setOutBizCode("sendCust-"+System.currentTimeMillis());
+        // 创建BaseVastItem对象
+        BaseItemsReq.BaseItems custBaseItems = new BaseItemsReq<PartnersReq>().new BaseItems<PartnersReq>();
+        // 设置BaseVastItem的item属性
+        custBaseItems.setItem(custList);
+        custBaseItemsReq.setItems(custBaseItems);
+        // 创建BaseReq对象
+        BaseReq<BaseItemsReq<PartnersReq>> custBaseReq = new BaseReq();
+        custBaseReq.setRequest(custBaseItemsReq);
         try {
             // 将wrapper对象转换为JSON字符串
-            String json = objectMapper.writeValueAsString(wrapper);
+            String json = objectMapper.writeValueAsString(custBaseReq);
             logger.info("Request JSON: {}", json);
             HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.partners.batchcreate", json,vwmsConfig);
             if(!String.valueOf(response.getStatusCode()).startsWith("2")){
@@ -633,8 +637,274 @@ public class ERPServiceImpl implements ERPService {
         } catch (Exception e) {
             e.printStackTrace();
             eMsg = StringUtil.nvl(e.getMessage(),"无");
-            baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败' cu_sendwmserr='操作:"+actionType+":"+eMsg+"' where cu_code in ("+codes+")");
+            baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败' ,cu_sendwmserr='操作:"+actionType+":"+eMsg+"' where cu_code in ("+codes+")");
             throw new RuntimeException(e);
         }
     }
+
+    @Override
+    public Map<String, Object> sendIO(String master, String id, String emCode, String caller) {
+        Map<String,Object> retMap = new HashMap<>();
+        retMap.put("success",true);
+        logger.info("sendIO-Begin:master {}  id {}",master,id);
+        // 执行查询
+        if(!baseDao.checkIf(master+".prodiodetail left join "+master+".product on pr_code = pd_prodcode left join "+master+".productbrand on pb_name = pr_brand "
+                ,"pd_piid = "+id+" and pb_sendwms = -1")){
+            logger.info("sendIO-End:master {} id {} res {}",master,id,"没有需要对接的明细。");
+            retMap.put("success",false);
+            retMap.put("message","没有需要对接的明细。");
+            return retMap;
+        }
+        ProdInout prodInOut = getIO(master,id,false);
+        if(CollectionUtil.isEmpty(prodInOut.getDetails())){
+            retMap.put("success",false);
+            retMap.put("message","没有需要同步的明细。");
+            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();
+        EntryOrder entryOrder = new EntryOrder();
+        OrderLines orderLines = new OrderLines();
+        entryOrder.setOutBizCode(prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
+        entryOrder.setEntryOrderCode(prodInOut.getPiInoutno());// 入库单号
+        entryOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
+        entryOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码
+        entryOrder.setOrderCreateTime(prodInOut.getPiRecordDate());// 订单创建时间
+        entryOrder.setOrderType(prodInOut.getPiOrderType());// 订单类型
+        entryOrder.setSupplierCode(prodInOut.getPiCardCode());// 供应商编码
+        entryOrder.setSupplierName(prodInOut.getPiTitle());// 供应商名称
+        entryOrder.setDocumentMaker(prodInOut.getPiRecordman());// 制单人
+        entryOrder.setRemark(prodInOut.getPiRemark());// 备注
+        List<OrderLine> orderLineList = getOrderLines(prodInOut,masterName);
+        orderLines.setOrderLine(orderLineList);
+        EntryOrderAndDetRequest entryOrderAndDetRequest = new EntryOrderAndDetRequest();
+        entryOrderAndDetRequest.setEntryOrder(entryOrder);
+        entryOrderAndDetRequest.setOrderLines(orderLines);
+        String errMsg = null;
+        String docOp = "创建";
+        if(prodInOut.getPiSendwmsflag() == 0){
+            errMsg = createIoToWms(piId,master,entryOrderAndDetRequest);
+        }else {
+            docOp = "更新";
+            errMsg = updateIoToWms(piId,master,entryOrderAndDetRequest);
+        }
+        if(errMsg!=null){
+            errMsg = docOp+"失败:"+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);
+        }
+        return retMap;
+    }
+    private String createIoToWms(Long piId,String master,EntryOrderAndDetRequest entryOrderAndDetRequest){
+        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);
+            if(!String.valueOf(response.getStatusCode()).startsWith("2")){
+                eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"未知").replaceAll("'","''");
+            }else {
+                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-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());
+                        }
+                        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);
+                    }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());
+                        }
+                        eMsg += StringUtil.nvl(errorMessage, "未知").replaceAll("'", "''");
+                    }
+                }else {
+                    eMsg = "RespJSON转换失败:"+response.getStatusCode()+":"+response.getResponseText();
+                }
+            }
+        } catch (JsonProcessingException e) {
+            eMsg = "JSON转换失败";
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+            eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''");
+        }
+        return eMsg;
+    }
+
+    @Override
+    public Map<String, Object> cancelIO(String master, String id, String emCode, String caller,String cancelReason) {
+        Map<String,Object> retMap = new HashMap<>();
+        String docOp = "对接操作:取消:";
+        retMap.put("success",true);
+        String eMsg = null;
+        logger.info("sendIO-cancel-Begin:master {}  id {} cancelReason {}",master,id,cancelReason);
+        // 执行查询
+        if(!baseDao.checkIf(master+".prodinout","pi_id = "+id+" and nvl(pi_sendwmsflag,0) = -1")){
+            logger.info("sendIO-cancel-End:master {} id {} res {}",master,id,"单据不存在或尚未同步到WMS。");
+            retMap.put("success",false);
+            retMap.put("message","单据不存在或尚未同步到WMS。");
+            return retMap;
+        }
+        ProdInout prodInOut = getIO(master,id,true);
+        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);
+        try {
+            //转换为JSON字符串
+            String json = objectMapper.writeValueAsString(iobaseReq);
+            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")){
+                eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"无").replaceAll("'","''");
+            }else {
+                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-cancel-response-success code: {} message: {}", baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
+                        baseDao.execute("update  "+master+".prodinout set pi_sendwmsstatus='取消成功' ,pi_sendwmserr=null,pi_sendwmsflag=0,PI_WMSORDERCODE=null where pi_id = "+piId);
+                    }else {
+//                        logger.info("sendIO-cancel-response-failure {}", response.getResponseText());
+                        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());
+                        }
+                        eMsg += StringUtil.nvl(errorMessage, "未知").replaceAll("'", "''");
+                    }
+                }else {
+                    eMsg = "RespJSON转换失败:"+response.getStatusCode()+":"+response.getResponseText();
+                }
+            }
+        } catch (JsonProcessingException e) {
+            eMsg = "JSON转换失败";
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+            eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''");
+        }
+        if(eMsg!=null){
+            eMsg = docOp+"失败:"+eMsg.replaceAll("'","''");
+            logger.info("sendIO-cancel-End-failure master {} piid {} errorTip {}",master,piId,eMsg);
+            baseDao.execute("update "+master+".prodinout set pi_sendwmsstatus='取消失败',pi_sendwmserr=UNISTR('"+eMsg+"') where pi_id = "+piId);
+            retMap.put("success",false);
+            retMap.put("message",eMsg);
+        }else {
+            logger.info("sendIO-cancel-End-success master {} piid {} ",master,piId);
+        }
+        return retMap;
+    }
+
+
+    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 " +
+                        " from "+master+".prodinout where pi_id = "+id,
+                new BeanPropertyRowMapper<ProdInout>(ProdInout.class));
+        ProdInout prodInOut = prodInOuts.get(0);
+        if(!onlyMain){
+            List<Prodiodetail> details = baseDao.getJdbcTemplate().query(
+                    "select min(pd_id) pdId,min(pd_pdno) pdPdno,pd_prodcode pdProdcode,pr_detail pdProdname,pr_brand pdBrandName" +
+                            ",sum(nvl(pd_inqty,0)+nvl(pd_outqty,0)) pdQty" +
+                            ",pd_whcode pdWhcode,wh_description pdWhname,pd_description pdInBatch" +
+                            " from "+master+".prodiodetail LEFT JOIN "+master+".product on pr_code = pd_prodcode left join  "+master+".productbrand on pb_name = pr_brand " +
+                            " left join "+master+".warehouse on wh_Code = pd_whcode " +
+                            " where pd_piid = ? and pb_sendwms = -1 " +
+                            " group by pd_prodcode,pr_detail,pr_brand,pd_whcode,wh_description,pd_description" +
+                            " order by MIN(pd_pdno) ",
+                    new BeanPropertyRowMapper<Prodiodetail>(Prodiodetail.class), prodInOut.getPiId());
+            prodInOut.setDetails(details);
+        }
+        return prodInOut;
+    }
+
+    private List<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.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);//账套
+            orderLineList.add(orderLine);
+        }
+        return orderLineList;
+    }
 }

+ 24 - 0
src/main/java/com/uas/eis/utils/BaseUtil.java

@@ -14,6 +14,7 @@ import net.sf.json.util.JSONUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.eis.exception.SystemException;
+import org.springframework.beans.BeanUtils;
 
 
 public class BaseUtil {
@@ -177,5 +178,28 @@ public class BaseUtil {
 	public static String parseGridStore2Str(List<Map<String, Object>> list) {
 		return JacksonUtil.toJsonArray(list);
 	}
+
+	/**
+	 * 对象属性复制
+	 *
+	 * @param source
+	 * @param targetCls
+	 * @param <T>
+	 * @return
+	 */
+	public static <T> T copyObj(Object source, Class<T> targetCls) {
+		if (null == source) {
+			return null;
+		}
+		try {
+			Object target = targetCls.newInstance();
+			// TODO 考虑dozer工具
+			BeanUtils.copyProperties(source, target);
+			return (T) target;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
 	
 }

+ 25 - 7
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -21,7 +21,7 @@ public class UasEisApplicationTests {
 	public void testSendProd(){
 		// 设置测试数据
 		String master = "HUAXK";
-		String id = "100059570";
+		String id = "100059574";
 		String emCode = "test";
 		String caller = "test";
 		// 调用待测方法
@@ -30,31 +30,49 @@ public class UasEisApplicationTests {
 	}
 	@Test
 	public void testTransfer(){
-		String str = "\u8d27\u54c1\u4ee3\u7801\u6216\u6761\u7801\u957f\u5ea6\u4e0d\u6ee1\u8db3";
-		System.out.println(str);
+//		String str = "\u8d27\u54c1\u4ee3\u7801\u6216\u6761\u7801\u957f\u5ea6\u4e0d\u6ee1\u8db3";
+//		System.out.println(str);
+		System.out.println("l:"+"".length());
 	}
 
 	@Test
 	public void testSendVend(){
-		// 设置测试数据
 		String master = "HUAXK";
 		String id = "103917";
 		String emCode = "test";
 		String caller = "test";
-		// 调用待测方法
 		Map<String, Object> result = erpService.sendVend(master, id, emCode,caller);
 		System.out.println("result:"+result.toString());
 	}
 
 	@Test
 	public void testSendCustomer(){
-		// 设置测试数据
 		String master = "HUAXK";
 		String id = "70779";
 		String emCode = "test";
 		String caller = "test";
-		// 调用待测方法
 		Map<String, Object> result = erpService.sendCust(master, id, emCode,caller);
 		System.out.println("result:"+result.toString());
 	}
+
+	@Test
+	public void testSendAddCGYS(){
+		// 设置测试数据
+		String master = "HUAXK";
+		String id = "50735621";
+		String emCode = "test";
+		String caller = "ProdInOut!PurcCheckin";
+		Map<String, Object> result = erpService.sendIO(master, id, emCode,caller);
+		System.out.println("result:"+result.toString());
+	}
+	@Test
+	public void testSendCancelCGYS(){
+		// 设置测试数据
+		String master = "HUAXK";
+		String id = "50735621";
+		String emCode = "test";
+		String caller = "ProdInOut!PurcCheckin";
+		Map<String, Object> result = erpService.cancelIO(master, id, emCode,caller,"反审核");
+		System.out.println("result:"+result.toString());
+	}
 }