From 1f2ab3faafd2c0e06d4aceb4bf5a815235a32608 Mon Sep 17 00:00:00 2001
From: lbq <1065079612@qq.com>
Date: 星期二, 13 一月 2026 16:33:40 +0800
Subject: [PATCH] 实现mes和erp推送数据功能,mes已初测,erp待测试

---
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/MESController.java          |   43 +++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/PlatformProperties.java              |   22 +
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java          |   30 ++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/PhyzMesConstant.java        |   20 +
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/ErpReportService.java          |   13 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Station.java                    |    8 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportOne.java               |   32 ++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportList.java              |   54 +++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/MesReportServiceImpl.java |  296 +++++++++++++++++++++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Pallet.java                     |    7 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/TaskResult.java                 |    7 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java |  184 +++++++++++++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/ErpReportParams.java            |  105 +++++++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/MesReportService.java          |   12 
 14 files changed, 831 insertions(+), 2 deletions(-)

diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/PlatformProperties.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/PlatformProperties.java
index c732e7d..f8c3c27 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/PlatformProperties.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/PlatformProperties.java
@@ -1,6 +1,7 @@
 package com.vincent.rsf.openApi.config;
 
 import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 
@@ -63,6 +64,9 @@
         /**rcs璋冪敤绔彛**/
         private String port;
 
+        public String getErpUrl() {
+            return host + (StringUtils.isBlank(port) ? "" : ":" + port + "/");
+        }
     }
 
 
@@ -95,5 +99,23 @@
 
     }
 
+    @Data
+    @Configuration
+    @ConfigurationProperties(prefix = "platform.mes")
+    public class MesApi {
+        /**
+         * mes璋冪敤璺緞
+         */
+        private String host;
+
+        /**mes璋冪敤绔彛**/
+        private String port;
+
+        public String getMesUrl() {
+            return host + (StringUtils.isBlank(port) ? "" : ":" + port + "/");
+        }
+    }
+
+
 
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
index b1c826e..685a076 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
@@ -6,6 +6,7 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.openApi.entity.dto.CommonResponse;
 import com.vincent.rsf.openApi.entity.phyz.*;
+import com.vincent.rsf.openApi.service.phyz.ErpReportService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -15,6 +16,7 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.Objects;
 
@@ -25,6 +27,10 @@
 @Api("閾跺骇鏂板伐鍘傦紙浜旀湡锛塃RP鎺ュ彛")
 @Slf4j
 public class ERPController {
+
+    @Resource
+    private ErpReportService erpReportService;
+
 
     @ApiOperation("浠撳簱淇℃伅鍚屾")
     @PostMapping("/wareHouse/sync")
@@ -281,4 +287,28 @@
         return new JSONArray();
     }
 
+    // region 娴嬭瘯鎺ㄩ�佸姛鑳�
+    @ApiOperation("鐧诲綍")
+    @PostMapping("/loginBySign")
+    public CommonResponse loginBySign(@RequestBody Object objParams) {
+        try {
+            erpReportService.loginBySign();
+        } catch (Exception e) {
+            log.error("erp, loginBySign", e);
+        }
+        return CommonResponse.ok();
+    }
+
+    @ApiOperation("鍏�/鍑哄簱浠诲姟鍥炶皟")
+    @PostMapping("/reportInOrOutBound")
+    public CommonResponse reportInOrOutBound(@RequestBody Object objParams) {
+        try {
+            erpReportService.reportInOrOutBound(objParams);
+        } catch (Exception e) {
+            log.error("erp, reportInOrOutBound", e);
+        }
+        return CommonResponse.ok();
+    }
+    // endregion
+
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/MESController.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/MESController.java
index 734a128..7114a1e 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/MESController.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/MESController.java
@@ -5,23 +5,31 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.openApi.entity.dto.CommonResponse;
 import com.vincent.rsf.openApi.entity.phyz.*;
+import com.vincent.rsf.openApi.service.phyz.MesReportService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.Objects;
 
 import static com.vincent.rsf.openApi.controller.AuthController.SIMULATED_DATA_ENABLE;
 import static com.vincent.rsf.openApi.controller.phyz.ERPController.paramsFormat;
 
+@Slf4j
 @RestController
 @RequestMapping("/mes")
 @Api("閾跺骇鏂板伐鍘傦紙浜旀湡锛塎ES鎺ュ彛")
 public class MESController {
+
+    @Resource
+    private MesReportService mesReportService;
+
 
     @ApiOperation("澶囨枡閫氱煡")
     @PostMapping("/callMaterial")
@@ -91,4 +99,39 @@
         return CommonResponse.ok();
     }
 
+    // region 娴嬭瘯鎺ㄩ�佸姛鑳�
+    @ApiOperation("鎵樼洏淇℃伅鍚屾")
+    @PostMapping("/syncPalletInfo")
+    public CommonResponse syncPalletInfo(@RequestBody Object objParams) {
+        try {
+            return mesReportService.syncPalletInfo(objParams);
+        } catch (Exception e) {
+            log.error("mes, syncPalletInfo", e);
+        }
+        return CommonResponse.ok();
+    }
+
+    @ApiOperation("绔欑偣淇℃伅鍚屾")
+    @PostMapping("/syncStationInfo")
+    public CommonResponse syncStationInfo(@RequestBody Object objParams) {
+        try {
+            return mesReportService.syncStationInfo(objParams);
+        } catch (Exception e) {
+            log.error("mes, syncStationInfo", e);
+        }
+        return CommonResponse.ok();
+    }
+
+    @ApiOperation("AGV浠诲姟鍥炶皟")
+    @PostMapping("/reportTaskExecute")
+    public CommonResponse reportTaskExecute(@RequestBody Object objParams) {
+        try {
+            return mesReportService.reportTaskExecute(objParams);
+        } catch (Exception e) {
+            log.error("mes, reportTaskExecute", e);
+        }
+        return CommonResponse.ok();
+    }
+    // endregion
+
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/PhyzMesConstant.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/PhyzMesConstant.java
new file mode 100644
index 0000000..5ded3a0
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/PhyzMesConstant.java
@@ -0,0 +1,20 @@
+package com.vincent.rsf.openApi.entity.constant;
+
+public class PhyzMesConstant {
+
+    // 鑾峰彇token
+    public static final String TOKEN = "/sit-auth/OAuth/Token";
+    // token鐧诲綍鐢ㄦ埛
+    public static final String TOKEN_USER = "thirdparty";
+    // token鐧诲綍瀵嗙爜
+    public static final String TOKEN_PASSWORD = "thirdparty";
+
+    // 鎵樼洏淇℃伅鍚屾
+    public static final String PALLET_SYN = "/sit-svc/GINZA/Application/BasicDataApp/odata/API_PalletSyncCmd";
+
+    // 绔欑偣淇℃伅鍚屾
+    public static final String STATION_SYN = "/sit-svc/GINZA/Application/LogisticsApp/odata/API_ConnPortSyncCmd";
+
+    // 浠诲姟涓婃姤
+    public static final String TASK_EXECUTE_REPORT = "/sit-svc/GINZA/Application/LogisticsApp/odata/API_PalletStatus";
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/ErpReportParams.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/ErpReportParams.java
new file mode 100644
index 0000000..6770300
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/ErpReportParams.java
@@ -0,0 +1,105 @@
+package com.vincent.rsf.openApi.entity.phyz;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "ErpReportParams", description = "Erp鍏�/鍑哄簱涓婃姤")
+public class ErpReportParams {
+
+//    // 琛ㄥ崟id
+//    @JsonProperty("formid")
+//    private String formid = "ke3d5adc0bbe64eceafd5891400adf40e";
+//
+//    // 琛ㄥ崟鏁版嵁鍖�
+//    @JsonProperty("Model")
+//    private List<Object> Model;
+
+    // 鏃ユ湡
+    @JsonProperty("FDate")
+    private String FDate;
+
+    // 鍗曟嵁绫诲瀷锛�
+    // "A"锛氱敓浜ч鏂欏崟
+    //鈥淏鈥�:鐢熶骇琛ユ枡鍗�
+    //鈥淐鈥�:鐢熶骇閫�鏂欏崟
+    //鈥淒鈥濈敓浜у叆搴撳崟
+    @JsonProperty("F_OHDL_BillnoType")
+    private String F_OHDL_BillnoType;
+
+    // 搴撳瓨缁勭粐{"FNumber": "100"}
+    @JsonProperty("FStockOrgId")
+    private Object FStockOrgId;
+
+    // 鐢熶骇缁勭粐{"FNumber": "200"}
+    @JsonProperty("FPrdOrgId")
+    private Object FPrdOrgId;
+
+    // 鐢熶骇璁″垝鍙�
+    @JsonProperty("F_OHDL_ProPlan")
+    private String F_OHDL_ProPlan;
+
+    // 鍗曟嵁浣撴槑缁嗘暟鎹寘
+    @JsonProperty("FEntity")
+    private List<FEntityItem> FEntity;
+
+    // 鍗曟嵁浣撴槑缁�
+    public static class FEntityItem {
+
+        // 鐗╂枡淇℃伅{"FNumber": ""}
+        @JsonProperty("FMaterialId")
+        private Object FMaterialId;
+
+        // 璁¢噺鍗曚綅淇℃伅{"FNumber": "PCS"}
+        @JsonProperty("FUnitID")
+        private Object FUnitID;
+
+        // 鐢宠鏁伴噺
+        @JsonProperty("FAppQty")
+        private Double FAppQty;
+
+        // 瀹為檯鏁伴噺
+        @JsonProperty("FActualQty")
+        private Double FActualQty;
+
+        // 浠撳簱淇℃伅{"FNumber": ""}
+        @JsonProperty("FStockId")
+        private Object FStockId;
+
+        // 杞﹂棿{"FNumber": ""}
+        @JsonProperty("F_OHDL_BworkShop")
+        private Object F_OHDL_BworkShop;
+
+        // 鎵樼洏
+        @JsonProperty("F_OHDL_Pallet")
+        private String F_OHDL_Pallet;
+
+        // 鎺ラ┏鐐逛綅
+        @JsonProperty("F_OHDL_ConPoint")
+        private String F_OHDL_ConPoint;
+
+        // 璁″垝璺熻釜鍙�
+        @JsonProperty("F_OHDL_PlanNo")
+        private String F_OHDL_PlanNo;
+
+        // 鐢熶骇璁㈠崟缂栧彿
+        @JsonProperty("F_OHDL_MONo")
+        private String F_OHDL_MONo;
+
+        // 鐢熶骇璁㈠崟ID
+        @JsonProperty("F_OHDL_MOId")
+        private String F_OHDL_MOId;
+
+        // 鐢熶骇璁㈠崟琛屽彿
+        @JsonProperty("F_OHDL_MOLine")
+        private String F_OHDL_MOLine;
+
+        // 鐢熶骇璁㈠崟琛孖D
+        @JsonProperty("F_OHDL_MOLineId")
+        private String F_OHDL_MOLineId;
+    }
+
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportList.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportList.java
new file mode 100644
index 0000000..9ac67a5
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportList.java
@@ -0,0 +1,54 @@
+package com.vincent.rsf.openApi.entity.phyz;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 鎵樼洏淇℃伅鍚屾璇锋眰
+ * @author System
+ * @date 2026-01-10
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Accessors(chain = true)
+@ApiModel(value = "MesReportList", description = "淇℃伅鍚屾")
+public class MesReportList<T> {
+
+    /**
+     * 鍛戒护瀵硅薄锛屽寘鍚墭鐩樻暟鎹垪琛�
+     */
+    @NotNull(message = "command涓嶈兘涓虹┖")
+    @Valid
+    @JsonProperty("command")
+    @ApiModelProperty(value = "鍛戒护瀵硅薄", required = true)
+    private CommandData<T> command;
+
+    /**
+     * 鍛戒护鏁版嵁瀵硅薄
+     */
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    @Accessors(chain = true)
+    @ApiModel(value = "CommandData", description = "鍛戒护鏁版嵁")
+    public static class CommandData<T> {
+
+        /**
+         * 鏁版嵁鍒楄〃
+         */
+        @NotNull(message = "DataList涓嶈兘涓虹┖")
+        @Valid
+        @JsonProperty("DataList")
+        @JSONField(name = "DataList")
+        @ApiModelProperty(value = "鏁版嵁鍒楄〃", required = true)
+        private List<T> dataList;
+    }
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportOne.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportOne.java
new file mode 100644
index 0000000..9d25f98
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/MesReportOne.java
@@ -0,0 +1,32 @@
+package com.vincent.rsf.openApi.entity.phyz;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 鎵樼洏淇℃伅鍚屾璇锋眰
+ * @author System
+ * @date 2026-01-10
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Accessors(chain = true)
+@ApiModel(value = "MesReportOne", description = "淇℃伅鍚屾璇锋眰")
+public class MesReportOne<T> {
+
+    /**
+     * 鍛戒护瀵硅薄
+     */
+    @NotNull(message = "command涓嶈兘涓虹┖")
+    @Valid
+    @JsonProperty("command")
+    @ApiModelProperty(value = "鍛戒护瀵硅薄", required = true)
+    private T command;
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Pallet.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Pallet.java
index 784146f..4e0a1a7 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Pallet.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Pallet.java
@@ -1,5 +1,6 @@
 package com.vincent.rsf.openApi.entity.phyz;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
@@ -17,20 +18,26 @@
     // 鎵樼洏鏉$爜
     @NotNull
     @JsonProperty("BarCode")
+    @JSONField(name = "BarCode")
     private String barCode;
     // 鎵樼洏缂栫爜
     @JsonProperty("PalletCode")
+    @JSONField(name = "PalletCode")
     private String palletCode;
     // 鎵樼洏鍚嶇О
     @JsonProperty("PalletName")
+    @JSONField(name = "PalletName")
     private String palletName;
     // 鎵樼洏绫诲瀷缂栫爜
     @JsonProperty("PalletTypeCode")
+    @JSONField(name = "PalletTypeCode")
     private String palletTypeCode;
     // 鎵樼洏绫诲瀷
     @JsonProperty("PalletTypeName")
+    @JSONField(name = "palletTypeName")
     private String palletTypeName;
     // 鍒涘缓浜�
     @JsonProperty("CreatedBy")
+    @JSONField(name = "CreatedBy")
     private String createdBy;
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Station.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Station.java
index bd23ac7..c418d03 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Station.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/Station.java
@@ -1,5 +1,6 @@
 package com.vincent.rsf.openApi.entity.phyz;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
@@ -17,23 +18,30 @@
     // 鎺ラ┏鍙g紪鐮�
     @NotNull
     @JsonProperty("ConnPortCode")
+    @JSONField(name = "ConnPortCode")
     private String connPortCode;
     // 鎺ラ┏鍙e悕绉�
     @JsonProperty("ConnPortName")
+    @JSONField(name = "ConnPortName")
     private String connPortName;
     // 杞﹂棿缂栫爜
     @JsonProperty("WorkshopCode")
+    @JSONField(name = "WorkshopCode")
     private String workshopCode;
     // 杞﹂棿
     @JsonProperty("WorkshopName")
+    @JSONField(name = "WorkshopName")
     private String workshopName;
     // 浠撳簱缂栫爜
     @JsonProperty("ProductionLineCode")
+    @JSONField(name = "ProductionLineCode")
     private String productionLineCode;
     // 浠撳簱
     @JsonProperty("ProductionLineName")
+    @JSONField(name = "ProductionLineName")
     private String productionLineName;
     // 鍒涘缓浜�
     @JsonProperty("CreatedBy")
+    @JSONField(name = "CreatedBy")
     private String createdBy;
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/TaskResult.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/TaskResult.java
index e7fdd67..84f1aa2 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/TaskResult.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/TaskResult.java
@@ -1,5 +1,6 @@
 package com.vincent.rsf.openApi.entity.phyz;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
@@ -17,8 +18,10 @@
     // 浠诲姟鍙凤紝鍞竴鏍囪瘑
     @NotNull
     @JsonProperty("TaskNo")
+    @JSONField(name = "TaskNo")
     private String taskNo;
-    // 鐘舵��
+    // 鐘舵�� //1鎼 2瀹屾垚 9鍙栨秷
     @JsonProperty("Status")
-    private String status;
+    @JSONField(name = "Status")
+    private Integer status;
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/ErpReportService.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/ErpReportService.java
new file mode 100644
index 0000000..11f5d31
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/ErpReportService.java
@@ -0,0 +1,13 @@
+package com.vincent.rsf.openApi.service.phyz;
+
+import com.vincent.rsf.openApi.entity.dto.CommonResponse;
+
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+
+public interface ErpReportService {
+
+    void loginBySign() throws UnsupportedEncodingException, NoSuchAlgorithmException;
+
+    CommonResponse reportInOrOutBound(Object params);
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/MesReportService.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/MesReportService.java
new file mode 100644
index 0000000..004cb4c
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/MesReportService.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.openApi.service.phyz;
+
+import com.vincent.rsf.openApi.entity.dto.CommonResponse;
+
+public interface MesReportService {
+
+    CommonResponse syncPalletInfo(Object params);
+
+    CommonResponse syncStationInfo(Object params);
+
+    CommonResponse reportTaskExecute(Object params);
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java
new file mode 100644
index 0000000..353aaef
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java
@@ -0,0 +1,184 @@
+package com.vincent.rsf.openApi.service.phyz.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.cfg.CoercionAction;
+import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
+import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.openApi.config.PlatformProperties;
+import com.vincent.rsf.openApi.entity.dto.CommonResponse;
+import com.vincent.rsf.openApi.entity.phyz.ErpReportParams;
+import com.vincent.rsf.openApi.service.phyz.ErpReportService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class ErpReportServiceImpl implements ErpReportService {
+
+    private static String ERP_REPORT_URL;
+
+    @Resource
+    private PlatformProperties.ErpApi erpApi;
+    @Resource
+    private RestTemplate restTemplate;
+
+
+    @PostConstruct
+    public void init() {
+        ERP_REPORT_URL = erpApi.getErpUrl();
+    }
+
+
+
+    // 鐧诲綍鍙傛暟渚濇涓鸿处濂桰D銆佺敤鎴峰悕銆佸簲鐢↖D銆佹椂闂存埑銆佺鍚嶄俊鎭�佽瑷�ID
+    public void loginBySign() throws UnsupportedEncodingException, NoSuchAlgorithmException {
+        String url = ERP_REPORT_URL + "/Kingdee.BOS.WebApi.ServicesStub.AuthService.LoginBySign.common.kdsvc";
+        JSONObject params = new JSONObject();
+        params.put("parameters", loginParams());
+        JSONObject result = postRequest(url, params, false);
+    }
+
+
+    // 鍏�/鍑哄簱浠诲姟瀹屾垚涓婃姤
+    public CommonResponse reportInOrOutBound(Object params) {
+        if (Objects.isNull(params)) {
+            throw new CoolException("鍏�/鍑哄簱浠诲姟淇℃伅鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        // TODO锛氬弬鏁拌浆鎹�
+        ErpReportParams erpReportParams = new ErpReportParams();
+        erpReportParams = (ErpReportParams) params;
+
+        String erpUrl = ERP_REPORT_URL + "/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc";
+        log.info("Erp鍏�/鍑哄簱浠诲姟瀹屾垚涓婃姤锛� {}锛� 璇锋眰鍙傛暟锛� {}", erpUrl, JSONObject.toJSONString(erpReportParams));
+        try {
+            JSONObject jsonObject = postRequest(erpUrl, erpReportParams, true);
+            boolean sendSuccess = jsonObject.getJSONObject("Result").getJSONObject("ResponseStatus").getBoolean("IsSuccess");
+
+            // TODO:杞崲鍚庤繑鍥�
+            if (sendSuccess) {
+                return CommonResponse.ok();
+            } else {
+                JSONArray errors = jsonObject.getJSONObject("Result").getJSONObject("ResponseStatus").getJSONArray("Errors");
+                String errorMsg = "";
+                for (int i = 0; i < errors.size(); i++) {
+                    errorMsg += errors.getJSONObject(i).getString("Message") + " ";
+                }
+                return CommonResponse.error(errorMsg);
+            }
+        } catch (Exception e) {
+            log.error("Erp鍏�/鍑哄簱浠诲姟涓婃姤鍝嶅簲澶辫触", e);
+            throw new CoolException("Erp瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+    }
+
+
+    // 鍏朵粬鍏�/鍑哄簱涓诲姩涓婃姤
+
+
+    // 鐩樼偣缁撴灉涓婃姤
+
+
+
+
+
+
+    private Object[] loginParams() throws UnsupportedEncodingException, NoSuchAlgorithmException {
+        //鏃堕棿鎴�
+        long timestamp = System.currentTimeMillis() / 1000;
+        //鏁版嵁涓績ID
+        String dbId = "69368c1051a322";
+        //鐢ㄦ埛鍚嶇О
+        String userName = "妤煎潥浼�";
+        //绗笁鏂圭郴缁熷簲鐢↖d
+        String appId = "330678_w2eBwdkp0oCW2XxuW16D4w/NRhTaTPKp";
+        //绗笁鏂圭郴缁熷簲鐢ㄧ閽�
+        String appSecret = "31c9e5da6472456193e0c8a7dd2160d9";
+        //灏嗚处濂桰D銆佺敤鎴峰悕銆佸簲鐢↖D銆佸簲鐢ㄧ閽ャ�佹椂闂存埑 鏀惧埌鏁扮粍閲岄潰
+        String[] arr = new String[] { dbId, userName, appId, appSecret, String.valueOf(timestamp) };
+        //鐢熸垚绛惧悕淇℃伅
+        String sign = getSha256(arr);
+
+        return new Object[] { dbId, userName, appId, String.valueOf(timestamp), sign,  2052};
+    }
+
+    public static String getSha256(String[] input) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchAlgorithmException {
+        Arrays.sort(input);
+        //SHA1鍔犲瘑鐨勮瘽鏀规垚MessageDigest.getInstance("SHA-1");
+        MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
+        for (String str : input) {
+            sha256.update(str.getBytes("UTF-8"));
+        }
+        byte[] hashBytes = sha256.digest();
+        StringBuilder hashString = new StringBuilder();
+        for (byte b : hashBytes) {
+            String hex = Integer.toHexString(0xff & b);
+            if (hex.length() == 1) {
+                hashString.append('0');
+            }
+            hashString.append(hex);
+        }
+        return hashString.toString();
+    }
+
+    /**
+     * 閫氱敤HTTP POST璇锋眰鏂规硶
+     *
+     * @param url 璇锋眰URL
+     * @param params 璇锋眰鍙傛暟
+     * @param needToken 鏄惁闇�瑕乼oken璁よ瘉
+     * @return 鍝嶅簲缁撴灉
+     */
+    public JSONObject postRequest(String url, Object params, boolean needToken) {
+        if (StringUtils.isBlank(url)) {
+            throw new CoolException("璇锋眰URL涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(params)) {
+            throw new CoolException("璇锋眰鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        log.info("Erp POST璇锋眰锛� {}锛� 璇锋眰鍙傛暟锛� {}", url, JSONObject.toJSONString(params));
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type", "application/json;charset=utf-8");
+
+        if (needToken) {
+//            String token = getToken();
+//            headers.add("Authorization", "Bearer " + token);
+        }
+
+        HttpEntity<Object> httpEntity = new HttpEntity<>(params, headers);
+        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
+        log.info("Erp POST璇锋眰鍝嶅簲缁撴灉锛� {}", exchange);
+
+        if (Objects.isNull(exchange.getBody())) {
+            throw new CoolException("璇锋眰澶辫触锛侊紒");
+        }
+
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty);
+            return objectMapper.readValue(exchange.getBody(), JSONObject.class);
+        } catch (JsonProcessingException e) {
+            log.error("Erp瑙f瀽鍝嶅簲澶辫触", e);
+            throw new CoolException("Erp瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+    }
+}
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/MesReportServiceImpl.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/MesReportServiceImpl.java
new file mode 100644
index 0000000..a0d5fce
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/MesReportServiceImpl.java
@@ -0,0 +1,296 @@
+package com.vincent.rsf.openApi.service.phyz.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.cfg.CoercionAction;
+import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
+import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.openApi.config.PlatformProperties;
+import com.vincent.rsf.openApi.entity.constant.PhyzMesConstant;
+import com.vincent.rsf.openApi.entity.dto.CommonResponse;
+import com.vincent.rsf.openApi.entity.phyz.*;
+import com.vincent.rsf.openApi.service.phyz.MesReportService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.http.client.ClientHttpResponse;
+import java.util.Objects;
+
+@Service
+@Slf4j
+public class MesReportServiceImpl implements MesReportService {
+
+    private static String MES_REPORT_URL;
+
+    @Resource
+    private PlatformProperties.MesApi mesApi;
+    @Resource
+    private RestTemplate restTemplate;
+
+    @PostConstruct
+    public void init() {
+        MES_REPORT_URL = mesApi.getMesUrl();
+    }
+
+    /**
+     * 鑾峰彇token
+     *
+     * @return token瀛楃涓�
+     */
+    private String getToken() {
+        String mesUrl = MES_REPORT_URL + PhyzMesConstant.TOKEN;
+        try {
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("Content-Type", "application/x-www-form-urlencoded");
+
+            // 鍑嗗琛ㄥ崟鏁版嵁
+            MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
+            map.add("grant_type", "password");
+            map.add("username", PhyzMesConstant.TOKEN_USER);
+            map.add("password", PhyzMesConstant.TOKEN_PASSWORD);
+            map.add("client_id", "global");
+            map.add("client_secret", "cs");
+
+            HttpEntity<Object> httpEntity = new HttpEntity<>(map, headers);
+            ResponseEntity<String> exchange = restTemplate.exchange(mesUrl, HttpMethod.POST, httpEntity, String.class);
+            if (Objects.isNull(exchange.getBody())) {
+                throw new CoolException("璇锋眰澶辫触锛侊紒");
+            }
+
+            try {
+                ObjectMapper objectMapper = new ObjectMapper();
+                objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty);
+                JSONObject jsonObject = objectMapper.readValue(exchange.getBody(), JSONObject.class);
+                return jsonObject.getString("access_token");
+            } catch (JsonProcessingException e) {
+                log.error("Mes瑙f瀽鍝嶅簲澶辫触", e);
+                throw new CoolException("Mes瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+            }
+        } catch (Exception e) {
+            log.error("Mes瑙f瀽token鍝嶅簲澶辫触", e);
+            return StringUtils.EMPTY;
+        }
+    }
+
+    /**
+     * 鎵樼洏淇℃伅鍚屾
+     *
+     * @param params 鎵樼洏淇℃伅鍙傛暟
+     * @return 鍝嶅簲缁撴灉
+     */
+    public CommonResponse syncPalletInfo(Object params) {
+        if (Objects.isNull(params)) {
+            throw new CoolException("鎵樼洏淇℃伅鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        // TODO: 鍙傛暟杞崲
+        List<Pallet> pallets = new ArrayList<>();
+        // 灏嗕紶鍏ョ殑 params 杞崲涓� Pallet 瀵硅薄鍒楄〃
+        if (params instanceof List) {
+            for (Object obj : (List<?>) params) {
+                if (obj instanceof Map) {
+                    Map<String, Object> map = (Map<String, Object>) obj;
+                    Pallet pallet = new Pallet();
+                    pallet.setBarCode((String) map.get("BarCode"));
+                    pallet.setPalletCode((String) map.get("PalletCode"));
+                    pallet.setPalletName((String) map.get("PalletName"));
+                    pallet.setPalletTypeCode((String) map.get("PalletTypeCode"));
+                    pallet.setPalletTypeName((String) map.get("PalletTypeName"));
+                    pallet.setCreatedBy((String) map.get("CreatedBy"));
+                    pallets.add(pallet);
+                } else if (obj instanceof Pallet) {
+                    pallets.add((Pallet) obj);
+                }
+            }
+        }
+        
+        MesReportList<Pallet> reportList = new MesReportList<>();
+        reportList.setCommand(new MesReportList.CommandData<Pallet>().setDataList(pallets));
+        
+        String mesUrl = MES_REPORT_URL + PhyzMesConstant.PALLET_SYN;
+        log.info("Mes鎵樼洏淇℃伅鍚屾锛� {}锛� 璇锋眰鍙傛暟锛� {}", mesUrl, JSONObject.toJSONString(reportList));
+        try {
+            JSONObject jsonObject = postRequest(mesUrl, reportList, getToken());
+            boolean sendSuccess = jsonObject.getBoolean("Succeeded");
+
+            if (sendSuccess) {
+                return CommonResponse.ok();
+            } else {
+                // TODO锛氬け璐ュ悗璁板綍閲嶅彂
+                return CommonResponse.error(jsonObject.getJSONObject("Error").getString("ErrorMessage"));
+            }
+        } catch (Exception e) {
+            log.error("Mes瑙f瀽鎵樼洏淇℃伅鍚屾鍝嶅簲澶辫触", e);
+            throw new CoolException("Mes瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鎺ラ┏鍙d俊鎭悓姝ワ紙绔欑偣淇℃伅鍚屾锛�
+     *
+     * @param params 绔欑偣淇℃伅鍙傛暟
+     * @return 鍝嶅簲缁撴灉
+     */
+    public CommonResponse syncStationInfo(Object params) {
+        if (Objects.isNull(params)) {
+            throw new CoolException("绔欑偣淇℃伅鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        // TODO锛氬弬鏁拌浆鎹�
+        List<Station> stations = new ArrayList<>();
+        if (params instanceof List) {
+            for (Object obj : (List<?>) params) {
+                if (obj instanceof Map) {
+                    Map<String, Object> map = (Map<String, Object>) obj;
+                    Station station = new Station();
+                    station.setConnPortCode((String) map.get("ConnPortCode"));
+                    station.setConnPortName((String) map.get("ConnPortName"));
+                    station.setWorkshopCode((String) map.get("WorkshopCode"));
+                    station.setWorkshopName((String) map.get("WorkshopName"));
+                    station.setProductionLineCode((String) map.get("ProductionLineCode"));
+                    station.setProductionLineName((String) map.get("ProductionLineName"));
+                    station.setCreatedBy((String) map.get("CreatedBy"));
+                    stations.add(station);
+                } else if (obj instanceof Station) {
+                    stations.add((Station) obj);
+                }
+            }
+        }
+
+        MesReportList<Station> reportList = new MesReportList<>();
+        reportList.setCommand(new MesReportList.CommandData<Station>().setDataList(stations));
+
+        String mesUrl = MES_REPORT_URL + PhyzMesConstant.STATION_SYN;
+        log.info("Mes绔欑偣淇℃伅鍚屾锛� {}锛� 璇锋眰鍙傛暟锛� {}", mesUrl, JSONObject.toJSONString(reportList));
+        try {
+            JSONObject jsonObject = postRequest(mesUrl, reportList, getToken());
+            boolean sendSuccess = jsonObject.getBoolean("Succeeded");
+
+            if (sendSuccess) {
+                return CommonResponse.ok();
+            } else {
+                // TODO锛氬け璐ュ悗璁板綍閲嶅彂
+                return CommonResponse.error(jsonObject.getJSONObject("Error").getString("ErrorMessage"));
+            }
+        } catch (Exception e) {
+            log.error("Mes瑙f瀽绔欑偣淇℃伅鍚屾鍝嶅簲澶辫触", e);
+            throw new CoolException("Mes瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鎵樼洏浠诲姟鍥炶皟锛堜换鍔℃墽琛屼笂鎶ワ級
+     *
+     * @param params 浠诲姟鎵ц鍙傛暟
+     * @return 鍝嶅簲缁撴灉
+     */
+    public CommonResponse reportTaskExecute(Object params) {
+        if (Objects.isNull(params)) {
+            throw new CoolException("浠诲姟鎵ц鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        // TODO锛氬弬鏁拌浆鎹�
+        TaskResult taskResult = new TaskResult();
+        if (params instanceof TaskResult) {
+            TaskResult task = (TaskResult) params;
+            taskResult.setTaskNo(task.getTaskNo());
+            taskResult.setStatus(task.getStatus());
+        } else if (params instanceof Map) {
+            Map<String, Object> map = (Map<String, Object>) params;
+            taskResult.setTaskNo((String) map.get("TaskNo"));
+            taskResult.setStatus((Integer) map.get("Status"));
+        }
+
+        MesReportOne<TaskResult> reportOne = new MesReportOne<>();
+        reportOne.setCommand(taskResult);
+        
+        String mesUrl = MES_REPORT_URL + PhyzMesConstant.TASK_EXECUTE_REPORT;
+        log.info("Mes浠诲姟鎵ц涓婃姤锛� {}锛� 璇锋眰鍙傛暟锛� {}", mesUrl, JSONObject.toJSONString(reportOne));
+        try {
+            JSONObject jsonObject = postRequest(mesUrl, reportOne, getToken());
+            boolean sendSuccess = jsonObject.getBoolean("Succeeded");
+
+            if (sendSuccess) {
+                return CommonResponse.ok();
+            } else {
+                // TODO锛氬け璐ュ悗璁板綍閲嶅彂
+                return CommonResponse.error(jsonObject.getJSONObject("Error").getString("ErrorMessage"));
+            }
+        } catch (Exception e) {
+            log.error("Mes瑙f瀽浠诲姟鎵ц涓婃姤鍝嶅簲澶辫触", e);
+            throw new CoolException("Mes瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 閫氱敤HTTP POST璇锋眰鏂规硶
+     *
+     * @param url 璇锋眰URL
+     * @param params 璇锋眰鍙傛暟
+     * @param token token
+     * @return 鍝嶅簲缁撴灉
+     */
+    public JSONObject postRequest(String url, Object params, String token) {
+        if (StringUtils.isBlank(url)) {
+            throw new CoolException("璇锋眰URL涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(params)) {
+            throw new CoolException("璇锋眰鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        
+        log.info("Mes POST璇锋眰锛� {}锛� 璇锋眰鍙傛暟锛� {}", url, JSONObject.toJSONString(params));
+        
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type", "application/json;charset=utf-8");    //
+        headers.add("Authorization", "Bearer " + token);
+        
+        HttpEntity<Object> httpEntity = new HttpEntity<>(params, headers);
+        
+        try {
+            // 鍒涘缓鑷畾涔夌殑ResponseErrorHandler鏉ュ鐞嗛潪200鐘舵�佺爜
+            RestTemplate customRestTemplate = new RestTemplate();
+            customRestTemplate.setRequestFactory(restTemplate.getRequestFactory());
+            
+            // 璁剧疆閿欒澶勭悊鍣紝涓嶆姏鍑哄紓甯革紝鑰屾槸杩斿洖鍝嶅簲浣�
+            customRestTemplate.setErrorHandler(new org.springframework.web.client.DefaultResponseErrorHandler() {
+                @Override
+                public boolean hasError(ClientHttpResponse response) throws IOException {
+                    // 涓嶇鐘舵�佺爜濡備綍锛岄兘涓嶈涓洪敊璇�
+                    return false;
+                }
+            });
+            
+            ResponseEntity<String> exchange = customRestTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
+            log.info("Mes POST璇锋眰鍝嶅簲缁撴灉锛� {}", exchange);
+
+            if (Objects.isNull(exchange.getBody()) || exchange.getBody().isEmpty()) {
+                throw new CoolException("璇锋眰澶辫触锛侊紒");
+            }
+
+            ObjectMapper objectMapper = new ObjectMapper();
+            objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty);
+            return objectMapper.readValue(exchange.getBody(), JSONObject.class);
+        } catch (Exception e) { //JsonProcessingException
+            log.error("Mes瑙f瀽鍝嶅簲澶辫触", e);
+            throw new CoolException("Mes瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+    }
+
+}

--
Gitblit v1.9.1