新火炬后端单体项目初始化代码
zhangherong
9 天以前 e6d788eef335aa02ac306e984c44affa68ab971c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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();
    }
}