Browse Source

【华信科】【富勒WMS对接】【库存同步】

wuyx 7 months ago
parent
commit
8a5eb3f66b

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

@@ -66,4 +66,10 @@ public class ERPController {
         return erpService.cancelIO(master,id,emCode,caller,op);
     }
 
+    @RequestMapping(value="/erp/sendStockData",method=RequestMethod.POST)
+    @ResponseBody
+    public Map<String, Object> sendStockData(String master, String emCode){
+        return erpService.sendStockData(master,emCode);
+    }
+
 }

+ 19 - 0
src/main/java/com/uas/eis/entity/vwms/entity/StockData.java

@@ -0,0 +1,19 @@
+package com.uas.eis.entity.vwms.entity;
+
+import lombok.Data;
+
+@Data
+public class StockData {
+    private String itemCode; // 货品代码
+    private Integer quantity; // 库存数量
+    private String stockinDate; // 入库日期 YYYY-MM-DD
+    private String productDate; // 生产日期 YYYY-MM-DD
+    private String expireDate; // 失效日期 YYYY-MM-DD
+    private String batchCode; // 批次号
+    private String virtualWarehouse; // 虚拟仓库
+    private String inventoryType = "ZP"; // 质量状态 默认ZP
+    private String userDefined1; // 自定义批次1
+    private String userDefined2; // 自定义批次2
+    private String userDefined3; // 自定义批次3
+    private String userDefined4; // 自定义批次4
+}

+ 20 - 0
src/main/java/com/uas/eis/entity/vwms/req/InventorySyncReq.java

@@ -0,0 +1,20 @@
+package com.uas.eis.entity.vwms.req;
+
+import com.uas.eis.entity.vwms.entity.StockData;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InventorySyncReq {
+    String dataNo	;//string (50)	Y	数据编号 可以重复, 重复的库存会合并处理
+    String warehouseCode	;//string (50)	Y	仓库代码
+    String ownerCode	;//string (50)	Y	货主代码
+    String outBizCode	;//string (50)	Y	外部业务代码,  消息ID,  用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
+    StockDataItems items;
+
+    @Data
+    public static class StockDataItems{
+        List<StockData> item;
+    }
+}

+ 1 - 0
src/main/java/com/uas/eis/service/DocCommonService.java

@@ -16,4 +16,5 @@ public interface DocCommonService {
     String sendOMoveToWms(ProdInout prodInOut, String masterName);
     String sendOutToWms(ProdInout prodInOut, String masterName);
     String sendInToWms(ProdInout prodInOut, String masterName);
+    String sendToWms(String json,String method);
 }

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

@@ -17,4 +17,6 @@ public interface ERPService {
     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);
+
+    Map<String, Object> sendStockData(String master, String emCode);
 }

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

@@ -453,4 +453,41 @@ public class DocCommonServiceImpl implements DocCommonService {
         }
         return eMsg;
     }
+
+    @Override
+    public String sendToWms(String json,String method){
+        String eMsg = null;
+        try {
+            logger.info("sendToWms 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 {
+                BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class);
+                BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse();
+                if(baseVastRespResponse!=null){
+                    if("success".equals(baseVastRespResponse.getFlag())){
+                        logger.info("sendToWms-resp-s code: {} method {} message: {}", baseVastRespResponse.getCode(),method,baseVastRespResponse.getMessage());
+                    }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;
+    }
 }

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

@@ -9,9 +9,7 @@ import com.uas.eis.entity.vwms.req.*;
 import com.uas.eis.entity.vwms.resp.BaseVastResp;
 import com.uas.eis.service.DocCommonService;
 import com.uas.eis.service.ERPService;
-import com.uas.eis.utils.CollectionUtil;
-import com.uas.eis.utils.HttpUtil;
-import com.uas.eis.utils.StringUtil;
+import com.uas.eis.utils.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -788,6 +786,69 @@ public class ERPServiceImpl implements ERPService {
         return retMap;
     }
 
+    @Override
+    public Map<String, Object> sendStockData(String master, String emCode) {
+        Map<String, Object> resMap = new HashMap<>();
+        resMap.put("sucess",true);
+        logger.info("sendStockData-Begin master {} emCode {} ",master,emCode);
+        List<StockData> stockDataList = baseDao.getJdbcTemplate().query("SELECT * FROM "+master+".SCM_KCZLB_WMS_VIEW ",
+                new BeanPropertyRowMapper<>(StockData.class));
+        String dataNo = "";
+        if(!CollectionUtil.isEmpty(stockDataList)){
+            // 每1000条分批处理
+            int batchSize = 1000;
+            int totalSize = stockDataList.size();
+            int batchCount = (totalSize + batchSize - 1) / batchSize;
+
+            for (int i = 0; i < batchCount; i++) {
+                int fromIndex = i * batchSize;
+                int toIndex = Math.min((i + 1) * batchSize, totalSize);
+                String outBizCode = "erpStockData-"+ DateUtil.currentDateString(Constant.YMD_HMS);
+                if(!StringUtil.hasText(dataNo)){
+                    dataNo = outBizCode;
+                }
+                // 获取当前批次数据
+                InventorySyncReq inventorySyncReq = new InventorySyncReq();
+                inventorySyncReq.setDataNo(dataNo);
+                inventorySyncReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
+                inventorySyncReq.setOwnerCode(vwmsConfig.getOwnerCode());
+                inventorySyncReq.setOutBizCode(outBizCode);
+                InventorySyncReq.StockDataItems items = new InventorySyncReq.StockDataItems();
+                items.setItem(stockDataList.subList(fromIndex, toIndex));
+                inventorySyncReq.setItems(items);
+                BaseReq<InventorySyncReq> req = new BaseReq();
+                req.setRequest(inventorySyncReq);
+                try {
+                    String json = objectMapper.writeValueAsString(req);
+                    // 处理当前批次数据
+                    String errTip = docCommonService.sendToWms(json, "openapi.inventory.foreign.synchronize");
+                    if (errTip!=null) {
+                        resMap.put("success", false);
+                        resMap.put("message", "同步第" + (fromIndex) + "~"+toIndex+"行数据失败:" + errTip);
+                        break;
+                    }
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                    resMap.put("success", false);
+                    resMap.put("message", "同步第" + (fromIndex) + "~"+toIndex+"行数据失败:JSON转换失败" );
+                    break;
+                }
+            }
+            resMap.put("message", "库存数据同步成功,共处理" + totalSize + "条数据");
+        }
+        if("JOB".equals(emCode)){
+            //记录日志
+            baseDao.execute("Insert into " + master + ".MESSAGELOG (ML_ID,ML_DATE,ML_MAN,ML_CONTENT,ML_RESULT,ML_SEARCH,CODE) " +
+                    "values (" + master + ".MESSAGELOG_seq.nextval,sysdate,'定时任务','同步库存至WMS(自动)','同步"
+                    +("true".equals(resMap.get("success")) ? "成功:":"失败")+": "+resMap.get("message")
+                    +"','InventoryToWms|emCode=" + emCode + "','" + emCode + "')");
+        }
+        logger.info("sendStockData-End-success master {} emCode {} ",master,emCode);
+        return resMap;
+    }
+
+
+
     private OrderVastRequest.OrdersRequest<OrderCancel> getOrderCancelOrdersRequest(String cancelReason, ProdInout prodInOut) {
         OrderVastRequest.OrdersRequest<OrderCancel> orders = new OrderVastRequest.OrdersRequest<OrderCancel>();
         OrderCancel cancelOrder = new OrderCancel();

+ 17 - 0
src/main/java/com/uas/eis/task/BatchZhanglingSyncTask.java

@@ -0,0 +1,17 @@
+package com.uas.eis.task;
+
+import com.uas.eis.service.ERPService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class BatchZhanglingSyncTask {
+    @Autowired
+    private ERPService erpService;
+
+    @Scheduled(cron = "0 0 7 * * ?")
+    private void syncBatchZhangling(){
+        erpService.sendStockData("HUAXK","JOB");
+    }
+}

+ 21 - 1
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -99,10 +99,30 @@ public class UasEisApplicationTests {
 	public void testSendAddBCCK(){
 		// 设置测试数据
 		String master = "HUAXK";
-		String id = "50735998";
+		String id = "50736049";
 		String emCode = "test";
 		String caller = "ProdInOut!AppropriationOut";
 		Map<String, Object> result = erpService.sendIO(master, id, emCode,caller);
 		System.out.println("result:"+result.toString());
 	}
+
+	@Test
+	public void testSendAddQTCKZF(){
+		// 设置测试数据
+		String master = "HUAXK";
+		String id = "50736053";
+		String emCode = "test";
+		String caller = "ProdInOut!OtherOut";
+		Map<String, Object> result = erpService.sendIO(master, id, emCode,caller);
+		System.out.println("result:"+result.toString());
+	}
+
+	@Test
+	public void testSendStockData(){
+		// 设置测试数据
+		String master = "HUAXK";
+		String emCode = "test";
+		Map<String, Object> result = erpService.sendStockData(master, emCode);
+		System.out.println("result:"+result.toString());
+	}
 }