package cn.lili.modules.order.aftersale.aop; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.security.AuthUser; 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.aftersale.entity.dos.AfterSaleLog; import cn.lili.modules.order.aftersale.service.AfterSaleLogService; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; 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 AfterSaleOperationLogAspect { @Autowired private AfterSaleLogService afterSaleLogService; @AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.order.aftersale.aop.AfterSaleLogPoint)") public void afterReturning(JoinPoint joinPoint, Object rvt) { try { AuthUser auth = UserContext.getCurrentUser(); //日志对象拼接 //默认操作人员,系统操作 String userName = "系统操作", id = "-1", role = UserEnums.SYSTEM.getRole(); if (auth != null) { //日志对象拼接 userName = UserContext.getCurrentUser().getUsername(); id = UserContext.getCurrentUser().getId(); role = UserContext.getCurrentUser().getRole().getRole(); } Map afterSaleLogPoints = spelFormat(joinPoint, rvt); AfterSaleLog afterSaleLog = new AfterSaleLog(afterSaleLogPoints.get("sn"), id, role, userName, afterSaleLogPoints.get("description")); //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveAfterSaleLogThread(afterSaleLog, afterSaleLogService)); } catch (Exception e) { log.error("售后日志错误",e); } } /** * 获取注解中对方法的描述信息 用于Controller层注解 * * @param joinPoint 切点 * @return 方法描述 */ public static Map spelFormat(JoinPoint joinPoint, Object rvt) { Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); AfterSaleLogPoint afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLogPoint.class); String description = SpelUtil.compileParams(joinPoint, rvt, afterSaleLogPoint.description()); String sn = SpelUtil.compileParams(joinPoint, rvt, afterSaleLogPoint.sn()); if (CharSequenceUtil.isNotEmpty(afterSaleLogPoint.serviceStatus())) { description += AfterSaleStatusEnum.valueOf(SpelUtil.compileParams(joinPoint, rvt, afterSaleLogPoint.serviceStatus())).description(); } result.put("description", description); result.put("sn", sn); return result; } /** * 保存日志 */ private static class SaveAfterSaleLogThread implements Runnable { private final AfterSaleLog afterSaleLog; private final AfterSaleLogService afterSaleLogService; public SaveAfterSaleLogThread(AfterSaleLog afterSaleLog, AfterSaleLogService afterSaleLogService) { this.afterSaleLog = afterSaleLog; this.afterSaleLogService = afterSaleLogService; } @Override public void run() { afterSaleLogService.save(afterSaleLog); } } }