From e6d788eef335aa02ac306e984c44affa68ab971c Mon Sep 17 00:00:00 2001 From: zhangherong <571457620@qq.com> Date: 星期三, 30 七月 2025 20:45:03 +0800 Subject: [PATCH] art: 新增系统第三方集成调用日志表,切面服务实现 --- db/双林新火炬MES数据库设计.pdma.json | 450 ++++++++++++++++++++++++ src/main/java/org/jeecg/common/constant/ApiLogCategoryEnum.java | 21 + src/main/java/org/jeecg/modules/system/mapper/SysApiLogMapper.java | 17 src/main/java/org/jeecg/modules/system/entity/SysApiLog.java | 86 ++++ src/main/java/org/jeecg/modules/system/service/ISysApiLogService.java | 14 src/main/java/org/jeecg/modules/system/mapper/xml/SysApiLogMapper.xml | 5 src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java | 4 src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java | 174 +++++---- src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java | 10 src/main/java/org/jeecg/modules/system/controller/SysApiLogController.java | 58 +++ src/main/java/org/jeecg/common/aspect/ApiLogAspect.java | 152 ++++++++ src/main/java/org/jeecg/codegenerate/JeecgOneUtil.java | 8 src/main/java/org/jeecg/common/aspect/annotation/ApiLog.java | 22 + src/main/java/org/jeecg/modules/system/service/impl/SysApiLogServiceImpl.java | 19 + 14 files changed, 953 insertions(+), 87 deletions(-) diff --git "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" index 42ffab3..eef16dd 100644 --- "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" +++ "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" @@ -2,9 +2,9 @@ "name": "鍙屾灄鏂扮伀鐐琈ES鏁版嵁搴撹璁�", "describe": "鎻忚堪鍙岃柂鏂扮伀鐐琈ES鏁版嵁搴撹璁¤鎯�", "avatar": "", - "version": "4.9.4", + "version": "4.9.2", "createdTime": "2025-3-10 16:38:19", - "updatedTime": "2025-7-28 20:46:22", + "updatedTime": "2025-7-30 14:19:17", "dbConns": [], "profile": { "default": { @@ -68299,6 +68299,449 @@ "correlations": [], "indexes": [], "type": "P" + }, + { + "id": "8C08DDB8-C3E9-4FBF-B4CE-EAB9BCFE1E38", + "env": { + "base": { + "nameSpace": "", + "codeRoot": "" + } + }, + "defKey": "sys_api_log", + "defName": "绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�", + "comment": "", + "properties": { + "partitioned by": "(date string)", + "row format delimited": "", + "fields terminated by ','": "", + "collection items terminated by '-'": "", + "map keys terminated by ':'": "", + "store as textfile;": "" + }, + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "notes": {}, + "headers": [ + { + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "refKey": "defKey", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "defName", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "primaryKey", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "notNull", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "autoIncrement", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "domain", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "type", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "len", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "scale", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "comment", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "refDict", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "defaultValue", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "isStandard", + "freeze": false, + "hideInGraph": false + }, + { + "refKey": "uiHint", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "extProps", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr1", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr2", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr3", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr4", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr5", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr6", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr7", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr8", + "freeze": false, + "hideInGraph": true + }, + { + "refKey": "attr9", + "freeze": false, + "hideInGraph": true + } + ], + "fields": [ + { + "defKey": "id", + "defName": "涓婚敭", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "id": "493A6ADA-F893-45D2-AC93-D3090DC02B0D" + }, + { + "defKey": "create_by", + "defName": "鍒涘缓浜�", + "comment": "", + "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "C9EFA288-7FAB-408E-87FB-91A4C08BDF73", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64" + }, + { + "defKey": "create_time", + "defName": "鍒涘缓鏃堕棿", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "E239E79C-CBF1-42DA-907E-2FCADECD2C67", + "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098" + }, + { + "defKey": "api_category", + "defName": "API鍒嗙被", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "id": "F49D357B-7349-4B9D-9907-191F2F94DA3B" + }, + { + "defKey": "api_name", + "defName": "鎺ュ彛鍚嶇О", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "id": "66F55A69-EE62-442E-926D-97695E82BE19" + }, + { + "defKey": "request_time", + "defName": "璇锋眰鏃堕棿", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "extProps": {}, + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "id": "42B46C10-65A4-410E-A238-3A3F86018945" + }, + { + "defKey": "response_time", + "defName": "鍝嶅簲鏃堕棿", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "extProps": {}, + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "id": "628E5760-93A0-4779-85A9-C0231AD79EBC" + }, + { + "defKey": "request_method", + "defName": "璇锋眰鏂瑰紡", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "id": "AF639452-207A-474B-9C76-266BDD0F6BA5" + }, + { + "defKey": "request_url", + "defName": "璇锋眰URL", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "extProps": {}, + "domain": "13DE7063-440C-426F-B1DF-25EC824C6DB8", + "id": "A3AD6177-3EAE-4ADC-BC22-1B29AC035DD1" + }, + { + "defKey": "request_headers", + "defName": "璇锋眰澶�", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "extProps": {}, + "domain": "13DE7063-440C-426F-B1DF-25EC824C6DB8", + "id": "2BA704F8-36C4-4B4D-BF63-C721376D4B7E" + }, + { + "defKey": "request_body", + "defName": "璇锋眰浣�", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "extProps": {}, + "domain": "13DE7063-440C-426F-B1DF-25EC824C6DB8", + "id": "4DBE1100-12B3-4CFD-B0B1-4AFE5A9033AB" + }, + { + "defKey": "response_code", + "defName": "鍝嶅簲缂栫爜", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6", + "id": "4CD23738-EE0F-4029-9465-9CDF3E7CD461" + }, + { + "defKey": "response_message", + "defName": "鍝嶅簲娑堟伅", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "id": "E872F6CA-7D7A-40F1-959D-FD35447BB5A1" + }, + { + "defKey": "response_body", + "defName": "鍝嶅簲浣�", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "extProps": {}, + "domain": "13DE7063-440C-426F-B1DF-25EC824C6DB8", + "id": "AC48A8A8-E320-4E79-AFA7-4FDB1059961F" + }, + { + "defKey": "request_status", + "defName": "鐘舵��", + "comment": "鎴愬姛銆佸け璐�", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "extProps": {}, + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "id": "4CCFBCCD-0681-4B6F-BAE8-624063397C72" + }, + { + "defKey": "method", + "defName": "璋冪敤鏂规硶", + "comment": "", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "id": "112770C9-963A-40F4-BCDF-289177A84824" + } + ], + "correlations": [], + "indexes": [], + "type": "P" } ], "views": [], @@ -69073,7 +69516,8 @@ "ED18EDD7-96F9-4CCA-93F0-633567955063", "ADF40C7F-5C97-4196-BCA7-E780FCC8E2FB", "27A01955-9C87-4E63-9A2A-8B489835879F", - "D36AAD93-CF06-45C1-8058-430304D98601" + "D36AAD93-CF06-45C1-8058-430304D98601", + "8C08DDB8-C3E9-4FBF-B4CE-EAB9BCFE1E38" ], "refViews": [], "refDiagrams": [], diff --git a/src/main/java/org/jeecg/codegenerate/JeecgOneUtil.java b/src/main/java/org/jeecg/codegenerate/JeecgOneUtil.java index 3fe39ee..d20e656 100644 --- a/src/main/java/org/jeecg/codegenerate/JeecgOneUtil.java +++ b/src/main/java/org/jeecg/codegenerate/JeecgOneUtil.java @@ -6,10 +6,10 @@ public class JeecgOneUtil { public static void main(String[] args) throws Exception { TableVo tableVo = new TableVo(); - tableVo.setTableName("lsw_material"); - tableVo.setEntityName("LswMaterial"); - tableVo.setEntityPackage("lsw"); - tableVo.setFtlDescription("绾胯竟搴撶墿鏂欎俊鎭�"); + tableVo.setTableName("sys_api_log"); + tableVo.setEntityName("SysApiLog"); + tableVo.setEntityPackage("system"); + tableVo.setFtlDescription("绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�"); new CodeGenerateOne(tableVo).generateCodeFile(null); } } diff --git a/src/main/java/org/jeecg/common/aspect/ApiLogAspect.java b/src/main/java/org/jeecg/common/aspect/ApiLogAspect.java new file mode 100644 index 0000000..9da336c --- /dev/null +++ b/src/main/java/org/jeecg/common/aspect/ApiLogAspect.java @@ -0,0 +1,152 @@ +package org.jeecg.common.aspect; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sap.conn.jco.*; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.jeecg.common.aspect.annotation.ApiLog; +import org.jeecg.common.constant.ApiLogCategoryEnum; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.modules.mdc.util.ThrowableUtil; +import org.jeecg.modules.system.entity.SysApiLog; +import org.jeecg.modules.system.service.ISysApiLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Aspect +@Component +public class ApiLogAspect { + @Autowired + private ISysApiLogService apiLogService; + @Autowired + private ObjectMapper objectMapper; + + @Pointcut("@annotation(org.jeecg.common.aspect.annotation.ApiLog)") + public void logPointCut() { + + } + + @Around("logPointCut()") + public Object around(ProceedingJoinPoint point) { + SysApiLog dto = new SysApiLog(); + dto.setRequestTime(new Date()); + //鎵ц鏂规硶 + Object result = null; + try { + result = point.proceed(); + //鎵ц鏃堕暱(姣) + dto.setResponseTime(new Date()); + //淇濆瓨鏃ュ織 + saveApiLog(dto, point, result); + } catch (Throwable e) { + //鎵ц鏃堕暱(姣) + dto.setResponseTime(new Date()); + //淇濆瓨鏃ュ織 + saveErrorLog(dto, point, e); + } + return result; + } + + private void saveApiLog(SysApiLog dto, ProceedingJoinPoint joinPoint, Object result) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + ApiLog syslog = method.getAnnotation(ApiLog.class); + if (syslog != null) { + String apiName = syslog.apiName(); + ApiLogCategoryEnum apiCategory = syslog.apiCategory(); + //娉ㄨВ涓婄殑鎻忚堪,鎿嶄綔鏃ュ織鍐呭 + dto.setApiName(apiName); + dto.setApiCategory(apiCategory.name()); + switch (apiCategory) { + case SAP: + dto.setRequestMethod("RFC"); + if (result instanceof Map) { + Map<String, Object> map = (Map<String, Object>) result; + dto.setResponseCode(map.get("ztype").toString()); + dto.setResponseMessage(map.get("zmess").toString()); + dto.setRequestBody(map.get("importParameters").toString()); + dto.setResponseBody(parseSAPResponseResult(map.get("result"))); + } + break; + case WMS: + dto.setRequestMethod("Webservice"); + break; + case FEI_SHU: + dto.setRequestMethod("Http"); + break; + } + } + + //璇锋眰鐨勬柟娉曞悕 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = signature.getName(); + dto.setMethod(className + "." + methodName + "()"); + dto.setRequestStatus(0); + apiLogService.save(dto); + } + + private void saveErrorLog(SysApiLog dto, ProceedingJoinPoint joinPoint, Throwable e) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + ApiLog syslog = method.getAnnotation(ApiLog.class); + if (syslog != null) { + String apiName = syslog.apiName(); + ApiLogCategoryEnum apiCategory = syslog.apiCategory(); + //娉ㄨВ涓婄殑鎻忚堪,鎿嶄綔鏃ュ織鍐呭 + dto.setApiName(apiName); + dto.setApiCategory(apiCategory.name()); + switch (apiCategory) { + case SAP: + dto.setRequestMethod("RFC"); + break; + case WMS: + dto.setRequestMethod("Webservice"); + break; + case FEI_SHU: + dto.setRequestMethod("Http"); + break; + } + } + + //璇锋眰鐨勬柟娉曞悕 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = signature.getName(); + dto.setMethod(className + "." + methodName + "()"); + dto.setRequestStatus(-1); + dto.setResponseCode("-1"); + dto.setResponseMessage("璇锋眰寮傚父锛岃鏌ョ湅鍝嶅簲浣擄紒"); + dto.setResponseBody(ThrowableUtil.getStackTrace(e)); + apiLogService.save(dto); + } + + private String parseSAPResponseResult(Object result) { + List<JSONObject> items = new ArrayList<>(); + if (result instanceof List) { + List<Object> list = (List<Object>) result; + try { + for (Object obj : list) { + String json = objectMapper.writeValueAsString(obj); + JSONObject item = JSONObject.parseObject(json, Feature.OrderedField); + items.add(item); + } + } catch (JsonProcessingException e) { + throw new JeecgBootException(e); + } + } + return items.toString(); + } +} diff --git a/src/main/java/org/jeecg/common/aspect/annotation/ApiLog.java b/src/main/java/org/jeecg/common/aspect/annotation/ApiLog.java new file mode 100644 index 0000000..c809029 --- /dev/null +++ b/src/main/java/org/jeecg/common/aspect/annotation/ApiLog.java @@ -0,0 +1,22 @@ +package org.jeecg.common.aspect.annotation; + +import org.jeecg.common.constant.ApiLogCategoryEnum; + +import java.lang.annotation.*; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ApiLog { + /** + * API鍚嶇О + * @return + */ + String apiName() default ""; + + /** + * API鍒嗙被 + * @return + */ + ApiLogCategoryEnum apiCategory() default ApiLogCategoryEnum.SAP; +} diff --git a/src/main/java/org/jeecg/common/constant/ApiLogCategoryEnum.java b/src/main/java/org/jeecg/common/constant/ApiLogCategoryEnum.java new file mode 100644 index 0000000..28fa6ef --- /dev/null +++ b/src/main/java/org/jeecg/common/constant/ApiLogCategoryEnum.java @@ -0,0 +1,21 @@ +package org.jeecg.common.constant; + +/** + * 绗笁鏂归泦鎴愭帴鍙e鎺ョ被鍨� + */ +public enum ApiLogCategoryEnum { + SAP, //SAP鎺ュ彛瀵规帴 + WMS, //WMS鎺ュ彛瀵规帴 + FEI_SHU, //椋炰功鎺ュ彛瀵规帴 + ; + + public static ApiLogCategoryEnum getInstance(String code) { + ApiLogCategoryEnum[] values = ApiLogCategoryEnum.values(); + for (ApiLogCategoryEnum value : values) { + if (value.name().equals(code)) { + return value; + } + } + return null; + } +} diff --git a/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java b/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java index c51bd9c..b1a4451 100644 --- a/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java +++ b/src/main/java/org/jeecg/modules/sap/controller/SAPTestController.java @@ -11,6 +11,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + @Api(tags = "SAP闆嗘垚娴嬭瘯") @RestController @RequestMapping("/sap/client") @@ -28,10 +30,10 @@ return Result.ok(test); } - @ApiOperation(value = "SAP闆嗘垚娴嬭瘯-娴嬭瘯鎺ュ彛", notes = "SAP闆嗘垚娴嬭瘯-娴嬭瘯鎺ュ彛") + @ApiOperation(value = "SAP闆嗘垚娴嬭瘯-鐢熶骇璁㈠崟鍚屾鎺ュ彛", notes = "SAP闆嗘垚娴嬭瘯-鐢熶骇璁㈠崟鍚屾鎺ュ彛") @GetMapping("/syncProductionOrder") - public Result<?> syncProductionOrder() { - productionOrderSync.syncProductionOrder(); - return Result.ok(); + public Result<?> syncProductionOrder() throws Exception { + Map<String, Object> resultMap = productionOrderSync.syncProductionOrder(); + return Result.ok(resultMap); } } diff --git a/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java b/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java index 8373a02..7cb68da 100644 --- a/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java +++ b/src/main/java/org/jeecg/modules/sap/service/ProductionOrderSync.java @@ -1,8 +1,10 @@ package org.jeecg.modules.sap.service; +import java.util.Map; + public interface ProductionOrderSync { /** * 鍚屾鐢熸垚璁㈠崟 */ - void syncProductionOrder(); + Map<String, Object> syncProductionOrder() throws Exception; } diff --git a/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java b/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java index ed2c10b..9cb836b 100644 --- a/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java +++ b/src/main/java/org/jeecg/modules/sap/service/impl/ProductionOrderSyncImpl.java @@ -1,7 +1,13 @@ package org.jeecg.modules.sap.service.impl; -import com.sap.conn.jco.*; +import com.alibaba.fastjson.JSONObject; +import com.sap.conn.jco.JCoDestination; +import com.sap.conn.jco.JCoFunction; +import com.sap.conn.jco.JCoRepository; +import com.sap.conn.jco.JCoTable; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.aspect.annotation.ApiLog; +import org.jeecg.common.constant.ApiLogCategoryEnum; import org.jeecg.config.sap.SapRfcConnectionManager; import org.jeecg.modules.sap.FunctionConst; import org.jeecg.modules.sap.dto.ProductionOrderDTO; @@ -10,7 +16,9 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 鐢熸垚璁㈠崟鍚屾鏈嶅姟 @@ -35,81 +43,97 @@ @Override - public void syncProductionOrder() { + @ApiLog(apiName = "鐢熶骇璁㈠崟鍚屾鎺ュ彛(ZPPF_033_1)", apiCategory = ApiLogCategoryEnum.SAP) + public Map<String, Object> syncProductionOrder() throws Exception { + Map<String, Object> resultMap = new HashMap<>(); JCoDestination destination = connectionManager.getDestination(); - try { - JCoRepository repository = destination.getRepository(); - JCoFunction function = repository.getFunction(FunctionConst.ZPPF_033_1); - if (function == null) { - throw new RuntimeException("RFC 鍑芥暟 ZPPF_033_1 鏈壘鍒帮紒"); - } - // 璁剧疆杈撳叆鍙傛暟 - //璁㈠崟鍙锋煡璇㈡潯浠� -// JCoTable AUFNRTable = function.getTableParameterList().getTable("ZTAB_AUFNR"); - //璁㈠崟绫诲瀷 鏍囧噯鐢熶骇璁㈠崟 - JCoTable AUARTTable = function.getTableParameterList().getTable("ZTAB_AUART"); - AUARTTable.appendRow(); - AUARTTable.setValue("AUART", orderTypeCode1); - //鍏垎鍘傝皟搴� - JCoTable FEVORTable = function.getTableParameterList().getTable("ZTAB_FEVOR"); - FEVORTable.appendRow(); - FEVORTable.setValue("FEVOR", productionManager); - //鏂扮伀鐐� - JCoTable WERKSTable = function.getTableParameterList().getTable("ZTAB_WERKS"); - WERKSTable.appendRow(); - WERKSTable.setValue("WERKS", factoryCode); - //璁㈠崟鐘舵�� - JCoTable TXT04Table = function.getTableParameterList().getTable("ZTAB_TXT04"); - TXT04Table.appendRow(); - TXT04Table.setValue("TXT04", orderStatus); - // 鎵ц璋冪敤 - function.execute(destination); - //鑾峰彇杩斿洖缁撴灉 - String zmess = function.getExportParameterList().getValue("ZMESS").toString(); - String ztype = function.getExportParameterList().getValue("ZTYPE").toString();//S 鏍囪瘑 鎴愬姛 - if(!"S".equals(ztype)){ - log.error("鑾峰彇璁㈠崟淇℃伅澶辫触锛孼TYPE={}, ZMESS={}", ztype, zmess); - return; - } - // 鑾峰彇杈撳嚭鍙傛暟 - JCoTable outputTable = function.getTableParameterList().getTable("ZTAB_OUT"); - int numRows = outputTable.getNumRows(); - List<ProductionOrderDTO> resultList = new ArrayList<>(); - ProductionOrderDTO dto; - for (int i = 0; i < numRows; i++) { - outputTable.setRow(i); - dto = new ProductionOrderDTO(); - dto.setKDPOS(outputTable.getString("KDPOS")); - dto.setCHARG(outputTable.getString("CHARG")); - dto.setMAKTX(outputTable.getString("MAKTX")); - dto.setMATNR(outputTable.getString("MATNR")); - dto.setKDAUF(outputTable.getString("KDAUF")); - dto.setAUFNR(outputTable.getString("AUFNR")); - dto.setDAUAT(outputTable.getString("DAUAT")); - dto.setGAMNG(outputTable.getString("GAMNG")); - dto.setGMEIN(outputTable.getString("GMEIN")); - dto.setAPRIO(outputTable.getString("APRIO")); - dto.setAUFPL(outputTable.getString("AUFPL")); - dto.setSTLNR(outputTable.getString("STLNR")); - dto.setDWERK(outputTable.getString("DWERK")); - dto.setNAME1(outputTable.getString("NAME1")); - dto.setFEVOR(outputTable.getString("FEVOR")); - dto.setTXT(outputTable.getString("TXT")); - dto.setUSNAM(outputTable.getString("USNAM")); - dto.setUDATE(outputTable.getString("UDATE")); - dto.setLAEDA(outputTable.getString("LAEDA")); - dto.setTIMES(outputTable.getString("TIMES")); - dto.setTXT04(outputTable.getString("TXT04")); - dto.setTXT30(outputTable.getString("TXT30")); - dto.setGSTRP(outputTable.getString("GSTRP")); - dto.setGLTRP(outputTable.getString("GLTRP")); - - //娣诲姞缁撴灉闆� - resultList.add(dto); - log.info(dto.toString()); - } - } catch (JCoException e) { - log.error(e.getMessage(), e); + JCoRepository repository = destination.getRepository(); + JCoFunction function = repository.getFunction(FunctionConst.ZPPF_033_1); + if (function == null) { + throw new RuntimeException("RFC 鍑芥暟 ZPPF_033_1 鏈壘鍒帮紒"); } + // 璁剧疆杈撳叆鍙傛暟 + //璁㈠崟鍙锋煡璇㈡潯浠� +// JCoTable AUFNRTable = function.getTableParameterList().getTable("ZTAB_AUFNR"); + List<JSONObject> items = new ArrayList<>(); + //璁㈠崟绫诲瀷 鏍囧噯鐢熶骇璁㈠崟 + JCoTable AUARTTable = function.getTableParameterList().getTable("ZTAB_AUART"); + AUARTTable.appendRow(); + AUARTTable.setValue("AUART", orderTypeCode1); + //缁勮璇锋眰鍙傛暟 + JSONObject item1 = new JSONObject(); + item1.put("AUART", orderTypeCode1); + items.add(item1); + //鍏垎鍘傝皟搴� + JCoTable FEVORTable = function.getTableParameterList().getTable("ZTAB_FEVOR"); + FEVORTable.appendRow(); + FEVORTable.setValue("FEVOR", productionManager); + //缁勮璇锋眰鍙傛暟 + JSONObject item2 = new JSONObject(); + item2.put("FEVOR", productionManager); + items.add(item2); + //鏂扮伀鐐� + JCoTable WERKSTable = function.getTableParameterList().getTable("ZTAB_WERKS"); + WERKSTable.appendRow(); + WERKSTable.setValue("WERKS", factoryCode); + //缁勮璇锋眰鍙傛暟 + JSONObject item3 = new JSONObject(); + item3.put("WERKS", factoryCode); + items.add(item3); + //璁㈠崟鐘舵�� + JCoTable TXT04Table = function.getTableParameterList().getTable("ZTAB_TXT04"); + TXT04Table.appendRow(); + TXT04Table.setValue("TXT04", orderStatus); + //缁勮璇锋眰鍙傛暟 + JSONObject item4 = new JSONObject(); + item4.put("TXT04", orderStatus); + items.add(item4); + // 鎵ц璋冪敤 + function.execute(destination); + //鑾峰彇杩斿洖缁撴灉 + String zmess = function.getExportParameterList().getValue("ZMESS").toString(); + String ztype = function.getExportParameterList().getValue("ZTYPE").toString();//S 鏍囪瘑 鎴愬姛 + // 鑾峰彇杈撳嚭鍙傛暟 + JCoTable outputTable = function.getTableParameterList().getTable("ZTAB_OUT"); + int numRows = outputTable.getNumRows(); + List<ProductionOrderDTO> resultList = new ArrayList<>(); + ProductionOrderDTO dto; + for (int i = 0; i < numRows; i++) { + outputTable.setRow(i); + dto = new ProductionOrderDTO(); + dto.setKDPOS(outputTable.getString("KDPOS")); + dto.setCHARG(outputTable.getString("CHARG")); + dto.setMAKTX(outputTable.getString("MAKTX")); + dto.setMATNR(outputTable.getString("MATNR")); + dto.setKDAUF(outputTable.getString("KDAUF")); + dto.setAUFNR(outputTable.getString("AUFNR")); + dto.setDAUAT(outputTable.getString("DAUAT")); + dto.setGAMNG(outputTable.getString("GAMNG")); + dto.setGMEIN(outputTable.getString("GMEIN")); + dto.setAPRIO(outputTable.getString("APRIO")); + dto.setAUFPL(outputTable.getString("AUFPL")); + dto.setSTLNR(outputTable.getString("STLNR")); + dto.setDWERK(outputTable.getString("DWERK")); + dto.setNAME1(outputTable.getString("NAME1")); + dto.setFEVOR(outputTable.getString("FEVOR")); + dto.setTXT(outputTable.getString("TXT")); + dto.setUSNAM(outputTable.getString("USNAM")); + dto.setUDATE(outputTable.getString("UDATE")); + dto.setLAEDA(outputTable.getString("LAEDA")); + dto.setTIMES(outputTable.getString("TIMES")); + dto.setTXT04(outputTable.getString("TXT04")); + dto.setTXT30(outputTable.getString("TXT30")); + dto.setGSTRP(outputTable.getString("GSTRP")); + dto.setGLTRP(outputTable.getString("GLTRP")); + + //娣诲姞缁撴灉闆� + resultList.add(dto); + log.info(dto.toString()); + } + resultMap.put("zmess", zmess); + resultMap.put("ztype", ztype); + resultMap.put("importParameters", items); + resultMap.put("result", resultList); + return resultMap; } } diff --git a/src/main/java/org/jeecg/modules/system/controller/SysApiLogController.java b/src/main/java/org/jeecg/modules/system/controller/SysApiLogController.java new file mode 100644 index 0000000..588d41d --- /dev/null +++ b/src/main/java/org/jeecg/modules/system/controller/SysApiLogController.java @@ -0,0 +1,58 @@ +package org.jeecg.modules.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.system.entity.SysApiLog; +import org.jeecg.modules.system.service.ISysApiLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + + /** + * @Description: 绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇� + * @Author: jeecg-boot + * @Date: 2025-07-30 + * @Version: V1.0 + */ +@Slf4j +@Api(tags="绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�") +@RestController +@RequestMapping("/system/sysApiLog") +public class SysApiLogController extends JeecgController<SysApiLog, ISysApiLogService> { + @Autowired + private ISysApiLogService sysApiLogService; + + /** + * 鍒嗛〉鍒楄〃鏌ヨ + * + * @param sysApiLog + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�-鍒嗛〉鍒楄〃鏌ヨ") + @ApiOperation(value="绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�-鍒嗛〉鍒楄〃鏌ヨ", notes="绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�-鍒嗛〉鍒楄〃鏌ヨ") + @GetMapping(value = "/list") + public Result<?> queryPageList(SysApiLog sysApiLog, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<SysApiLog> queryWrapper = QueryGenerator.initQueryWrapper(sysApiLog, req.getParameterMap()); + Page<SysApiLog> page = new Page<SysApiLog>(pageNo, pageSize); + IPage<SysApiLog> pageList = sysApiLogService.page(page, queryWrapper); + return Result.OK(pageList); + } +} diff --git a/src/main/java/org/jeecg/modules/system/entity/SysApiLog.java b/src/main/java/org/jeecg/modules/system/entity/SysApiLog.java new file mode 100644 index 0000000..ca78486 --- /dev/null +++ b/src/main/java/org/jeecg/modules/system/entity/SysApiLog.java @@ -0,0 +1,86 @@ +package org.jeecg.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecg.common.aspect.annotation.Dict; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +/** + * @Description: 绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇� + * @Author: jeecg-boot + * @Date: 2025-07-30 + * @Version: V1.0 + */ +@Data +@TableName("sys_api_log") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="sys_api_log瀵硅薄", description="绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇�") +public class SysApiLog implements Serializable { + + /**涓婚敭*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "涓婚敭") + private String id; + /**鍒涘缓浜�*/ + @ApiModelProperty(value = "鍒涘缓浜�") + private String createBy; + /**鍒涘缓鏃堕棿*/ + @ApiModelProperty(value = "鍒涘缓鏃堕棿") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /**API鍒嗙被*/ + @ApiModelProperty(value = "API鍒嗙被") + @Dict(dicCode = "api_log_category") + private String apiCategory; + /**鎺ュ彛鍚嶇О*/ + @ApiModelProperty(value = "鎺ュ彛鍚嶇О") + private String apiName; + /**璇锋眰鏃堕棿*/ + @ApiModelProperty(value = "璇锋眰鏃堕棿") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date requestTime; + /**鍝嶅簲鏃堕棿*/ + @ApiModelProperty(value = "鍝嶅簲鏃堕棿") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date responseTime; + /**璇锋眰鏂瑰紡*/ + @ApiModelProperty(value = "璇锋眰鏂瑰紡") + private String requestMethod; + /**璇锋眰瀹屾垚URL*/ + @ApiModelProperty(value = "璇锋眰URL") + private String requestUrl; + /**璇锋眰澶�*/ + @ApiModelProperty(value = "璇锋眰澶�") + private String requestHeaders; + /**璇锋眰浣�*/ + @ApiModelProperty(value = "璇锋眰浣�") + private String requestBody; + /**鍝嶅簲缂栫爜*/ + @ApiModelProperty(value = "鍝嶅簲缂栫爜") + private String responseCode; + /**鍝嶅簲娑堟伅*/ + @ApiModelProperty(value = "鍝嶅簲娑堟伅") + private String responseMessage; + /**鍝嶅簲浣�*/ + @ApiModelProperty(value = "鍝嶅簲浣�") + private String responseBody; + /**鐘舵��;鎴愬姛銆佸け璐�*/ + @ApiModelProperty(value = "鐘舵��;鎴愬姛銆佸け璐�") + private Integer requestStatus; + /**璋冪敤鏂规硶*/ + @ApiModelProperty(value = "璋冪敤鏂规硶") + private String method; +} diff --git a/src/main/java/org/jeecg/modules/system/mapper/SysApiLogMapper.java b/src/main/java/org/jeecg/modules/system/mapper/SysApiLogMapper.java new file mode 100644 index 0000000..460c32d --- /dev/null +++ b/src/main/java/org/jeecg/modules/system/mapper/SysApiLogMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysApiLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇� + * @Author: jeecg-boot + * @Date: 2025-07-30 + * @Version: V1.0 + */ +public interface SysApiLogMapper extends BaseMapper<SysApiLog> { + +} diff --git a/src/main/java/org/jeecg/modules/system/mapper/xml/SysApiLogMapper.xml b/src/main/java/org/jeecg/modules/system/mapper/xml/SysApiLogMapper.xml new file mode 100644 index 0000000..7fb8f4d --- /dev/null +++ b/src/main/java/org/jeecg/modules/system/mapper/xml/SysApiLogMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysApiLogMapper"> + +</mapper> \ No newline at end of file diff --git a/src/main/java/org/jeecg/modules/system/service/ISysApiLogService.java b/src/main/java/org/jeecg/modules/system/service/ISysApiLogService.java new file mode 100644 index 0000000..3905d43 --- /dev/null +++ b/src/main/java/org/jeecg/modules/system/service/ISysApiLogService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysApiLog; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇� + * @Author: jeecg-boot + * @Date: 2025-07-30 + * @Version: V1.0 + */ +public interface ISysApiLogService extends IService<SysApiLog> { + +} diff --git a/src/main/java/org/jeecg/modules/system/service/impl/SysApiLogServiceImpl.java b/src/main/java/org/jeecg/modules/system/service/impl/SysApiLogServiceImpl.java new file mode 100644 index 0000000..ddef969 --- /dev/null +++ b/src/main/java/org/jeecg/modules/system/service/impl/SysApiLogServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysApiLog; +import org.jeecg.modules.system.mapper.SysApiLogMapper; +import org.jeecg.modules.system.service.ISysApiLogService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 绯荤粺绗笁鏂归泦鎴愭帴鍙f棩蹇� + * @Author: jeecg-boot + * @Date: 2025-07-30 + * @Version: V1.0 + */ +@Service +public class SysApiLogServiceImpl extends ServiceImpl<SysApiLogMapper, SysApiLog> implements ISysApiLogService { + +} -- Gitblit v1.9.3