package cn.lili.modules.order.order.aop; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.SpelUtil; import cn.lili.common.utils.ThreadPoolUtil; import cn.lili.modules.order.trade.entity.dos.OrderLog; import cn.lili.modules.order.trade.service.OrderLogService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * 订单操作日志 * * @author Chopper * @since 2020/11/17 7:22 下午 */ @Slf4j @Aspect @Component public class OrderOperationLogAspect { @Autowired private OrderLogService orderLogService; @After("@annotation(cn.lili.modules.order.order.aop.OrderLogPoint)") public void doAfter(JoinPoint joinPoint) { try { //日志对象拼接 //默认操作人员,系统操作 String userName = "系统操作", id = "-1", role = UserEnums.SYSTEM.getRole(); if (UserContext.getCurrentUser() != null) { //日志对象拼接 userName = UserContext.getCurrentUser().getUsername(); id = UserContext.getCurrentUser().getId(); role = UserContext.getCurrentUser().getRole().getRole(); } Map orderLogPoints = spelFormat(joinPoint); OrderLog orderLog = new OrderLog(orderLogPoints.get("orderSn"), id, role, userName, orderLogPoints.get("description")); //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveOrderLogThread(orderLog, orderLogService)); } catch (Exception e) { log.error("订单日志错误",e); } } /** * 获取注解中对方法的描述信息 用于Controller层注解 * * @param joinPoint 切点 * @return 方法描述 * @throws Exception */ private static Map spelFormat(JoinPoint joinPoint) throws Exception { Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); OrderLogPoint orderLogPoint = signature.getMethod().getAnnotation(OrderLogPoint.class); String description = SpelUtil.compileParams(joinPoint, orderLogPoint.description()); String orderSn = SpelUtil.compileParams(joinPoint, orderLogPoint.orderSn()); result.put("description", description); result.put("orderSn", orderSn); return result; } /** * 保存日志 */ private static class SaveOrderLogThread implements Runnable { private final OrderLog orderLog; private final OrderLogService orderLogService; public SaveOrderLogThread(OrderLog orderLog, OrderLogService orderLogService) { this.orderLog = orderLog; this.orderLogService = orderLogService; } @Override public void run() { orderLogService.save(orderLog); } } }