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