潘志宝
8 天以前 f3de04db06bae67537d093017e28863ee685f8a3
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.operatelog.core.service;
H 2
3 import com.iailab.framework.common.util.monitor.TracerUtils;
4 import com.iailab.framework.common.util.servlet.ServletUtils;
5 import com.iailab.framework.security.core.LoginUser;
6 import com.iailab.framework.security.core.util.SecurityFrameworkUtils;
7 import com.iailab.module.system.api.logger.OperateLogApi;
8 import com.iailab.module.system.api.logger.dto.OperateLogCreateReqDTO;
9 import com.mzt.logapi.beans.LogRecord;
10 import com.mzt.logapi.service.ILogRecordService;
11 import lombok.extern.slf4j.Slf4j;
12
13 import javax.annotation.Resource;
14 import javax.servlet.http.HttpServletRequest;
15 import java.util.List;
16
17 /**
18  * 操作日志 ILogRecordService 实现类
19  *
20  * 基于 {@link OperateLogApi} 实现,记录操作日志
21  *
22  * @author HUIHUI
23  */
24 @Slf4j
25 public class LogRecordServiceImpl implements ILogRecordService {
26
27     @Resource
28     private OperateLogApi operateLogApi;
29
30     @Override
31     public void record(LogRecord logRecord) {
32         // 1. 补全通用字段
33         OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO();
34         reqDTO.setTraceId(TracerUtils.getTraceId());
35         // 补充用户信息
36         fillUserFields(reqDTO);
37         // 补全模块信息
38         fillModuleFields(reqDTO, logRecord);
39         // 补全请求信息
40         fillRequestFields(reqDTO);
41
42         // 2. 异步记录日志
43         operateLogApi.createOperateLog(reqDTO);
44     }
45
46     private static void fillUserFields(OperateLogCreateReqDTO reqDTO) {
47         // 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
48         LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
49         if (loginUser == null) {
50             return;
51         }
52         reqDTO.setUserId(loginUser.getId());
53         reqDTO.setUserType(loginUser.getUserType());
54     }
55
56     public static void fillModuleFields(OperateLogCreateReqDTO reqDTO, LogRecord logRecord) {
57         reqDTO.setType(logRecord.getType()); // 大模块类型,例如:CRM 客户
58         reqDTO.setSubType(logRecord.getSubType());// 操作名称,例如:转移客户
59         reqDTO.setBizId(Long.parseLong(logRecord.getBizNo())); // 业务编号,例如:客户编号
60         reqDTO.setAction(logRecord.getAction());// 操作内容,例如:修改编号为 1 的用户信息,将性别从男改成女,将姓名从平台改成源码。
61         reqDTO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"}
62     }
63
64     private static void fillRequestFields(OperateLogCreateReqDTO reqDTO) {
65         // 获得 Request 对象
66         HttpServletRequest request = ServletUtils.getRequest();
67         if (request == null) {
68             return;
69         }
70         // 补全请求信息
71         reqDTO.setRequestMethod(request.getMethod());
72         reqDTO.setRequestUrl(request.getRequestURI());
73         reqDTO.setUserIp(ServletUtils.getClientIP(request));
74         reqDTO.setUserAgent(ServletUtils.getUserAgent(request));
75     }
76
77     @Override
78     public List<LogRecord> queryLog(String bizNo, String type) {
79         throw new UnsupportedOperationException("使用 OperateLogApi 进行操作日志的查询");
80     }
81
82     @Override
83     public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) {
84         throw new UnsupportedOperationException("使用 OperateLogApi 进行操作日志的查询");
85     }
86
87 }