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();
|
}
|
}
|