售后日志架构

类关系图

说明
  1. AfterSaleLogPoint 注解切入点,描述信息包含 售后sn,以及详细操作内容,支持Spel语法(即类似:#order.sn)

  2. AfterSaleService 售后业务类,订单操作时,注解对应信息,即可。示例代码如下:

        @AfterSaleLogPoint(sn = "#rvt.sn", description = "'售后申请:售后编号['+#rvt.sn+']'")
        public AfterSale saveAfterSale(AfterSaleDTO afterSaleDTO) {
    
            //检查当前订单是否可申请售后
            this.checkAfterSaleType(afterSaleDTO);
    
            //添加售后
            return addAfterSale(afterSaleDTO);
        }
    
  3. AfterSaleLogService 订单日志服务类,数据增删改查

  4. AfterSaleOperationLogAspect 切入点拦截类,对订单操作后的数据进行处理。根据注解中的信息,调用OrderLogService进行数据存储。

    @AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.order.order.aop.AfterSaleLogPoint)")
    
  5. 在日志处理时,系统会另起一个线程进行处理,保证订单业务响应不受影响

        /**
         * 保存日志
         */
        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);
            }
        }
    
扩展说明

这是本系统推荐的一种日志机制,保证前端响应速度的同时,使得日志对整体架构的影响缩小到最小,在日后的其他文档中也会经常看到类似的文档。这里如果资源充沛,其实也可以使用MQ去实现。

流程图

日志流程描述

1、业务类操作,可能是系统,也可能是用户,在日志中会有对应的识别

2、业务类执行

4、切入点被执行,通常情况下执行与对应方法执行后,因为如果在其他位置执行,可能影响系统的正常流程。解析Spel语法,即类似#order.sn 这样的语法

5、线程池获取线程,传入要保存的数据

6、线程异步保存日志

results matching ""

    No results matching ""