package com.meeno.inner.oa.extend.operaterecord.aop;
import com.alibaba.fastjson.JSONArray;
import com.google.common.collect.Lists;
import com.meeno.inner.oa.common.utils.AopUtils;
import com.meeno.inner.oa.extend.operaterecord.enums.OperateRecordTypeEnum;
import com.meeno.inner.oa.extend.operaterecord.repository.OperateRecordRepository;
import com.meeno.inner.oa.extend.operaterecord.service.OperateRecordService;
import com.meeno.inner.oa.extend.operaterecord.service.model.OperateRecordModel;
import com.meeno.inner.oa.extend.project.module.controller.form.ModuleModel;
import com.meeno.inner.oa.extend.project.module.entity.Module;
import com.meeno.inner.oa.extend.project.module.enums.ModuleTypeEnum;
import com.meenoframework.common.filter.ThreadLocalClient;
import lombok.NoArgsConstructor;
import lombok.extern.java.Log;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
/**
* @description: 切面类
* @author: Wzq
* @create: 2020-03-30 11:20
*/
@Aspect
@Component
@Log
public class ModuleAspect {
@Autowired
private OperateRecordService operateRecordService;
@Pointcut("execution(public * com.meeno.inner.oa.extend.project.module.service.ModuleService.*(..))")
public void cutPoint(){}
/**
* AfterReturning遇到异常不执行
* @param joinPoint
* @param retrunObj 方法返回值
*/
@AfterReturning(returning="retrunObj",pointcut = "cutPoint()")
public void before(JoinPoint joinPoint,Object retrunObj){
//获取方法名称
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
log.info("aop->MethodName:"+method.getName());
//方法中的值
Object[] args = joinPoint.getArgs();
/*Object target = joinPoint.getTarget();
Object aThis = joinPoint.getThis();
String classType = joinPoint.getTarget().getClass().getName();*/
//方法名称
String methodName = joinPoint.getSignature().getName();
MethodNameEnum methodNameEnum = MethodNameEnum.get(methodName);
HashMap<String, Object> fieldsMap = AopUtils.getFieldsName(method, args);
//获取操作记录的Model
List<OperateRecordModel> operationRecordList = null;
if(methodNameEnum != null){
operationRecordList = this.getOperationRecord(methodNameEnum, fieldsMap,retrunObj);
}
this.operateRecordService.addAll(operationRecordList);
}
public List<OperateRecordModel> getOperationRecord(MethodNameEnum methodNameEnum, HashMap<String, Object> fieldsMap,Object retrunObj){
//操作记录Model
List<OperateRecordModel> recordModelList = Lists.newArrayList();
Long loginUserId = ThreadLocalClient.get().getId();
//操作日志类型
OperateRecordTypeEnum type = OperateRecordTypeEnum.MODULE;
//模块
Module module = null;
//操作日志内容
StringBuffer content = new StringBuffer();
ModuleModel model = null;
OperateRecordModel recordModel = null;
switch (methodNameEnum){
case ADD:
content.append("创建了->");
String moduleTypeStr = null;
model = (ModuleModel) fieldsMap.get("model");
//项目id
Long projectId = model.getProjectId();
//获取模块层级
this.moduleModelLevelToString(model,content);
//获取功能点数组字符串
moduleTypeStr = model.getModuleTypeStr();
//判断是否是多个type
if(moduleTypeStr != null && !moduleTypeStr.isEmpty()){
//生成多条记录
JSONArray jsonArray = JSONArray.parseArray(moduleTypeStr);
if(jsonArray != null && !jsonArray.isEmpty()){
for (int i = 0; i < jsonArray.size(); i++) {
Integer moduleTypeCode = jsonArray.getInteger(i);
ModuleTypeEnum typeEnum = ModuleTypeEnum.getModuleTypeEnum(moduleTypeCode);
switch (typeEnum){
case WEB:
content.append(" 类型:web");
break;
case IOS:
content.append(" 类型:ios");
break;
case ANDROID:
content.append(" 类型:android");
break;
case SERVER:
content.append(" 类型:server");
break;
}
//每个type创建一条操作记录
OperateRecordModel tempRecordModel = new OperateRecordModel();
tempRecordModel.setProjectId(projectId);
tempRecordModel.setUserId(loginUserId);
tempRecordModel.setContent(content.toString());
tempRecordModel.setType(type);
//加入到集合中
recordModelList.add(tempRecordModel);
}
}
}else{
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(projectId);
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
}
break;
case EDIT:
content.append("编辑了->");
//方法中的参数
model = (ModuleModel) fieldsMap.get("model");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleModelLevelToString(model,content);
content.append(" 预计投入修改为: " + model.getPredictInput());
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case DELETE:
content.append("删除了->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case EDIT_STATUS:
content.append("修改模块状态->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
//获取模块的状态
this.moduleStatusToString(module,content);
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case EDIT_REAL_INPUT:
content.append("修改模块实际投入->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
content.append(" 修改实际投入为: " + module.getRealInput());
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case EDIT_PREDICT_INPUT:
content.append("修改模块预计投入->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
content.append(" 修改预计投入为: " + module.getRealInput());
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
/*case SET_WEIGHT:
break;*/
default:
break;
}
return recordModelList;
}
/**
* 修改模块的状态ToString
* @param module
* @param content
*/
private void moduleStatusToString(Module module,StringBuffer content){
if(module != null){
switch (module.getStatus()){
case NOT_INITIATED:
//未开始
content.append(" 修改状态为:未开始");
break;
case PROCESSING:
//进行中
content.append(" 修改状态为:进行中");
break;
case OVER:
//结束
content.append(" 修改状态为:结束");
break;
}
}
}
/**
* 模块ModelToString
* @param model
* @param content
*/
private void moduleLevelToString(Module model,StringBuffer content){
if(model != null){
switch (model.getLevel()){
case one:
//一级模块
content.append("一级模块名称:" + model.getName());
break;
case two:
//二级模块
content.append("二级模块名称:" + model.getName());
break;
case three:
//三级模块
content.append("功能点名称:" + model.getName());
break;
}
}
}
/**
* 模块ModelLevelToString
* @param model
* @param content
*/
private void moduleModelLevelToString(ModuleModel model,StringBuffer content){
if(model != null){
switch (model.getLevel()){
case one:
//一级模块
content.append("一级模块名称:" + model.getModuleName());
break;
case two:
//二级模块
content.append("二级模块名称:" + model.getModuleName());
break;
case three:
//三级模块
content.append("功能点名称:" + model.getModuleName());
break;
}
}
}
@NoArgsConstructor
private enum MethodNameEnum{
ADD("add"),
EDIT("edit"),
DELETE("delete"),
EDIT_STATUS("editStatus"),
EDIT_REAL_INPUT("editRealInput"),
EDIT_PREDICT_INPUT("editPredictInput"),
SET_WEIGHT("setWeight")
;
private String methodName;
MethodNameEnum(String methodName) {
this.methodName = methodName;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public static MethodNameEnum get(String methodName){
MethodNameEnum[] values = MethodNameEnum.values();
for (MethodNameEnum value : values) {
if (value.methodName.equals(methodName)) {
return value;
}
}
return null;
}
}
}
SpringBoot-AOP记录操作日志
最新推荐文章于 2024-07-02 10:38:04 发布
本文介绍了如何使用Spring AOP实现对`com.meeno.inner.oa.extend.project.module.service`模块服务的方法进行操作记录,包括新增、编辑、删除等,并将操作日志持久化到OperateRecord表中。
摘要由CSDN通过智能技术生成