| package com.zy.asrs.wms.common.aspect;  | 
|   | 
| import com.alibaba.fastjson.JSON;  | 
| import com.zy.asrs.common.utils.IpTools;  | 
| import com.zy.asrs.framework.common.Cools;  | 
| import com.zy.asrs.wms.common.annotation.OperationLog;  | 
| import com.zy.asrs.wms.system.entity.OperationRecord;  | 
| import com.zy.asrs.wms.system.entity.User;  | 
| import com.zy.asrs.wms.system.service.OperationRecordService;  | 
| import com.zy.asrs.wms.utils.Utils;  | 
| import org.aspectj.lang.JoinPoint;  | 
| import org.aspectj.lang.annotation.*;  | 
| import org.aspectj.lang.reflect.MethodSignature;  | 
| import org.springframework.security.core.Authentication;  | 
| import org.springframework.security.core.context.SecurityContextHolder;  | 
| import org.springframework.stereotype.Component;  | 
| import org.springframework.web.context.request.RequestContextHolder;  | 
| import org.springframework.web.context.request.ServletRequestAttributes;  | 
| import org.springframework.web.multipart.MultipartFile;  | 
|   | 
| import javax.annotation.Resource;  | 
| import javax.servlet.http.HttpServletRequest;  | 
| import javax.servlet.http.HttpServletResponse;  | 
| import java.lang.reflect.Method;  | 
| import java.util.Collections;  | 
| import java.util.Date;  | 
| import java.util.HashMap;  | 
| import java.util.Map;  | 
|   | 
| /**  | 
|  * 操作日志记录  | 
|  *  | 
|  * @author vincent  | 
|  * @since 2020-03-21 16:58:16:05  | 
|  */  | 
| @Aspect  | 
| @Component  | 
| public class OperationLogAspect {  | 
|   | 
|     @Resource  | 
|     private OperationRecordService operationRecordService;  | 
|     // 参数、返回结果、错误信息等最大保存长度  | 
|     private static final int MAX_LENGTH = 1000;  | 
|     // 用于记录请求耗时  | 
|     private final ThreadLocal<Long> startTime = new ThreadLocal<>();  | 
|   | 
|     @Pointcut("@annotation(com.zy.asrs.wms.common.annotation.OperationLog)")  | 
|     public void operationLog() {  | 
|     }  | 
|   | 
|     @Before("operationLog()")  | 
|     public void doBefore(JoinPoint joinPoint) throws Throwable {  | 
|         startTime.set(System.currentTimeMillis());  | 
|     }  | 
|   | 
|     @AfterReturning(pointcut = "operationLog()", returning = "result")  | 
|     public void doAfterReturning(JoinPoint joinPoint, Object result) {  | 
|         saveLog(joinPoint, result, null);  | 
|     }  | 
|   | 
|     @AfterThrowing(value = "operationLog()", throwing = "e")  | 
|     public void doAfterThrowing(JoinPoint joinPoint, Exception e) {  | 
|         saveLog(joinPoint, null, e);  | 
|     }  | 
|   | 
|     /**  | 
|      * 保存操作记录  | 
|      */  | 
|     private void saveLog(JoinPoint joinPoint, Object result, Exception e) {  | 
|         // 记录模块名、操作功能、请求方法、请求参数、返回结果  | 
|         MethodSignature signature = (MethodSignature) joinPoint.getSignature();  | 
|         Method method = signature.getMethod();  | 
|         if (null == method) {  | 
|             return;  | 
|         }  | 
|         OperationLog ol = method.getAnnotation(OperationLog.class);  | 
|         if (null == ol) {  | 
|             return;  | 
|         }  | 
|         String desc = getDescription(method, ol);  | 
|         if (Cools.isEmpty(desc)) {  | 
|             return;  | 
|         }  | 
|         OperationRecord record = new OperationRecord();  | 
|         Long endTime = startTime.get();  | 
|         record.setCreateTime(new Date());  | 
|         // 记录操作耗时  | 
|         if (endTime != null) {  | 
|             record.setSpendTime((int) (System.currentTimeMillis() - endTime));  | 
|         }  | 
|         record.setTimestamp(String.valueOf(endTime));  | 
|         // 记录当前登录用户id、租户id  | 
|         User user = getLoginUser();  | 
|         if (user != null) {  | 
|             record.setUserId(user.getId());  | 
|             record.setHostId(user.getHostId());  | 
|         }  | 
|         // 记录请求地址、请求方式、ip  | 
|         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();  | 
|         HttpServletRequest request = (attributes == null ? null : attributes.getRequest());  | 
|         if (request != null) {  | 
|             record.setUrl(request.getRequestURI());  | 
|             record.setClientIp(IpTools.gainRealIp(request));  | 
|         }  | 
|         // 记录异常信息  | 
|         if (e != null) {  | 
|             record.setResult(0);  | 
|             record.setErr(Utils.sub(e.toString(), MAX_LENGTH));  | 
|         } else {  | 
|             record.setResult(1);  | 
|         }  | 
|         // 记录操作功能  | 
|         record.setNamespace(desc);  | 
|         // 记录备注  | 
|         if (!Cools.isEmpty(ol.comments())) {  | 
|             record.setMemo(ol.comments());  | 
|         }  | 
|         // 记录请求参数  | 
|         if (ol.param() && request != null) {  | 
|             record.setRequest(Utils.sub(getParams(joinPoint, request), MAX_LENGTH));  | 
|         }  | 
|         // 记录请求结果  | 
|         if (ol.result() && result != null) {  | 
|             record.setResponse(Utils.sub(JSON.toJSONString(result), MAX_LENGTH));  | 
|         }  | 
|         operationRecordService.saveAsync(record);  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取当前登录用户  | 
|      */  | 
|     private User getLoginUser() {  | 
|         Authentication subject = SecurityContextHolder.getContext().getAuthentication();  | 
|         if (subject != null) {  | 
|             Object object = subject.getPrincipal();  | 
|             if (object instanceof User) {  | 
|                 return (User) object;  | 
|             }  | 
|         }  | 
|         return null;  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取请求参数  | 
|      *  | 
|      * @param joinPoint JoinPoint  | 
|      * @param request   HttpServletRequest  | 
|      * @return String  | 
|      */  | 
|     private String getParams(JoinPoint joinPoint, HttpServletRequest request) {  | 
|         String params;  | 
|   | 
|         Map<String, String> paramsMap = new HashMap<>();  | 
|   | 
|         Map<String, String[]> map = Collections.unmodifiableMap(request.getParameterMap());  | 
|         for (Map.Entry<String, String[]> entry : map.entrySet()) {  | 
|             paramsMap.put(entry.getKey(), Utils.join(entry.getValue(), ","));  | 
|         }  | 
|   | 
|         if (paramsMap.keySet().size() > 0) {  | 
|             params = JSON.toJSONString(paramsMap);  | 
|         } else {  | 
|             StringBuilder sb = new StringBuilder();  | 
|             for (Object arg : joinPoint.getArgs()) {  | 
|                 if (null == arg  | 
|                         || arg instanceof MultipartFile  | 
|                         || arg instanceof HttpServletRequest  | 
|                         || arg instanceof HttpServletResponse) {  | 
|                     continue;  | 
|                 }  | 
|                 sb.append(JSON.toJSONString(arg)).append(" ");  | 
|             }  | 
|             params = sb.toString();  | 
|         }  | 
|         return params;  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取操作功能  | 
|      *  | 
|      * @param method Method  | 
|      * @param ol     OperationLog  | 
|      * @return String  | 
|      */  | 
|     private String getDescription(Method method, OperationLog ol) {  | 
|         if (!Cools.isEmpty(ol.value())) {  | 
|             return ol.value();  | 
|         }  | 
|         return null;  | 
|     }  | 
|   | 
| }  |