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 map = (Map) 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 items = new ArrayList<>(); if (result instanceof List) { List list = (List) 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); } } else { try { String json = objectMapper.writeValueAsString(result); JSONObject item = JSONObject.parseObject(json, Feature.OrderedField); items.add(item); } catch (JsonProcessingException e) { throw new JeecgBootException(e); } } return items.toString(); } }