|
|
@@ -0,0 +1,216 @@
|
|
|
+package com.lc.ibps.aop;
|
|
|
+
|
|
|
+import cn.hutool.core.date.StopWatch;
|
|
|
+import cn.hutool.json.JSONArray;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.lc.ibps.base.core.util.BeanUtils;
|
|
|
+import com.lc.ibps.base.framework.table.ICommonDao;
|
|
|
+import com.lc.ibps.base.web.context.ContextUtil;
|
|
|
+import com.lc.ibps.cloud.utils.RequestUtil;
|
|
|
+import com.lc.ibps.sysdata.dao.UpdateDataTableDao;
|
|
|
+import com.lc.ibps.untils.LogAopUtil;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.aspectj.lang.ProceedingJoinPoint;
|
|
|
+import org.aspectj.lang.annotation.Around;
|
|
|
+import org.aspectj.lang.annotation.Aspect;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.context.request.RequestContextHolder;
|
|
|
+import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Aspect
|
|
|
+@Component
|
|
|
+public class EquipmentDBLogAspect {
|
|
|
+ private static final String TABLE_NAME = "t_business_log";
|
|
|
+ private static final String REMOVE_METHOD = "remove";
|
|
|
+ private static final String SAVE_METHOD = "save";
|
|
|
+ // 创建路径到表名的映射
|
|
|
+ private static final Map<String, String> PATH_TO_TABLE_MAP = new HashMap<>();
|
|
|
+
|
|
|
+ static {
|
|
|
+ // 初始化映射关系
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/accessoriesDevice", "T_FSSBJPJB");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/calibrateResultRecord", "T_JYXTXZJGYZHQRJLB");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/calibrationCheckRecord", "T_MJSBJDXZJHZB");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/equipmentCard", "T_SBDJ");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/maintenanceItem", "T_WHZQJXM");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/maintenanceRecord", "T_MJSBWHBYJLBY");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/repairRecord", "T_SBWXJLB");
|
|
|
+ PATH_TO_TABLE_MAP.put("equipment/scrappedRecord", "T_SBTYBFJLB");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ICommonDao commonDao;
|
|
|
+ @Autowired
|
|
|
+ private UpdateDataTableDao updateDataTableDao;
|
|
|
+
|
|
|
+ // 声明环绕通知 定义切点 流程涉及到的接口
|
|
|
+ @Around("execution(* com.lc.ibps.components.equipment.api.*.*(..))")
|
|
|
+ public Object around(ProceedingJoinPoint point) throws Throwable {
|
|
|
+ HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
|
|
+ String tableName = getTableNameByURL(request.getRequestURI());
|
|
|
+ StopWatch stopWatch = new StopWatch();
|
|
|
+ stopWatch.start();
|
|
|
+
|
|
|
+ Object result = null;
|
|
|
+ String methodName = point.getSignature().getName();
|
|
|
+ Boolean exceptionFlag = false ;
|
|
|
+ String oldData = "";
|
|
|
+ try {
|
|
|
+ // 在方法执行前保存原始数据
|
|
|
+ if (ifAddLog(methodName) && StringUtils.isNotEmpty(tableName)) {//匹配到了
|
|
|
+ oldData = saveOriginalData(point, methodName,tableName);
|
|
|
+ }
|
|
|
+
|
|
|
+ result = point.proceed();
|
|
|
+
|
|
|
+ } catch (Throwable throwable) {
|
|
|
+ exceptionFlag = true;
|
|
|
+ // 发生异常时记录错误日志
|
|
|
+ Map<String, Object> logData = LogAopUtil.logError(request, point, throwable);
|
|
|
+ updateDataTableDao.insertLog(logData);
|
|
|
+ throw throwable;
|
|
|
+
|
|
|
+ } finally {
|
|
|
+ stopWatch.stop();
|
|
|
+ // 在清理前记录正常日志
|
|
|
+ if (!exceptionFlag && ifAddLog(methodName) && StringUtils.isNotEmpty(tableName)) {
|
|
|
+ Map<String, Object> logData = log(request, point, result, stopWatch,oldData,tableName);
|
|
|
+ updateDataTableDao.insertLog(logData);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ private String saveOriginalData(ProceedingJoinPoint point, String methodName,String tableName) {
|
|
|
+ String oldData ="";
|
|
|
+ String columnName ="id_";
|
|
|
+ StringBuilder whereBuilder = new StringBuilder();
|
|
|
+ if (REMOVE_METHOD.equals(methodName)) {//设备删除传入的参数是id的数组
|
|
|
+ String params = LogAopUtil.filterParam(point.getArgs());
|
|
|
+ JSONArray jsonArray = JSONUtil.parseArray(params);
|
|
|
+ //String tableName ="t_sbdj";
|
|
|
+
|
|
|
+ // 处理空数组的情况
|
|
|
+ if (jsonArray == null || jsonArray.size() == 0) {
|
|
|
+ columnName = columnName + " IN ('')"; // 或者返回空字符串或其他默认值
|
|
|
+ whereBuilder.append(columnName);
|
|
|
+ }
|
|
|
+ // 构建 IN 条件
|
|
|
+ whereBuilder.append(columnName).append(" IN (");
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
+ if (i > 0) {
|
|
|
+ whereBuilder.append(",");
|
|
|
+ }
|
|
|
+ // 添加单引号包裹的值
|
|
|
+ whereBuilder.append("'").append(jsonArray.getStr(i)).append("'");
|
|
|
+ }
|
|
|
+ whereBuilder.append(")");
|
|
|
+ String WhereStr = whereBuilder.toString();
|
|
|
+ String zbWhereStr = WhereStr.replace("id_", "parent_id_");
|
|
|
+ String query = String.format("SELECT * FROM %s WHERE %s", tableName,WhereStr);
|
|
|
+ List<Map<String,Object>> masterList = commonDao.query(query);
|
|
|
+ //获取子表的数据
|
|
|
+ getChildData(tableName, zbWhereStr,masterList);
|
|
|
+ //拼接主子表的数据
|
|
|
+ if(BeanUtils.isNotEmpty(masterList)){
|
|
|
+ // 使用 JSONArray 并设置日期格式防止时间被转换为毫秒
|
|
|
+ JSONArray jsonArrayResult = new JSONArray(masterList);
|
|
|
+ jsonArrayResult.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ oldData = jsonArrayResult.toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (SAVE_METHOD.equals(methodName)) {
|
|
|
+ String params = LogAopUtil.filterParam(point.getArgs());
|
|
|
+ Map<String,Object> map = JSONUtil.parseObj(params);
|
|
|
+ Object id = map.get("id");
|
|
|
+
|
|
|
+ if(BeanUtils.isNotEmpty(id)){
|
|
|
+ // 构建条件
|
|
|
+ String zbWhereStr = " parent_id_ = '"+id+"'";
|
|
|
+ String query = String.format("SELECT * FROM %s WHERE id_ = '"+id+"' ", tableName);
|
|
|
+ List<Map<String,Object>> masterList = commonDao.query(query);
|
|
|
+ //获取子表的数据
|
|
|
+ getChildData(tableName, zbWhereStr, masterList);
|
|
|
+ if(BeanUtils.isNotEmpty(masterList)){
|
|
|
+ // 使用 JSONArray 并设置日期格式防止时间被转换为毫秒
|
|
|
+ JSONArray jsonArrayResult = new JSONArray(masterList);
|
|
|
+ jsonArrayResult.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ oldData = jsonArrayResult.toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return oldData;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void getChildData(String tableName, String whereStr, List<Map<String, Object>> masterList) {
|
|
|
+ if("T_SBDJ".equals(tableName)){
|
|
|
+ //ids.replace("id_","parent_id_");
|
|
|
+ if(BeanUtils.isNotEmpty(masterList)){
|
|
|
+ for (Map<String, Object> map : masterList) {
|
|
|
+ map.put("table_name", "T_SBDJ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String query = String.format("SELECT * FROM T_FSSBJPJB WHERE %s",whereStr);
|
|
|
+ List<Map<String,Object>> list = commonDao.query(query);
|
|
|
+ if(BeanUtils.isNotEmpty(list)){
|
|
|
+ for (Map<String, Object> map : list) {
|
|
|
+ map.put("table_name", "T_FSSBJPJB");
|
|
|
+ }
|
|
|
+ masterList.addAll(list);
|
|
|
+ }
|
|
|
+ String query2 = String.format("SELECT * FROM T_WHZQJXM WHERE %s",whereStr);
|
|
|
+ List<Map<String,Object>> list2 = commonDao.query(query2);
|
|
|
+ if(BeanUtils.isNotEmpty(list2)){
|
|
|
+ for (Map<String, Object> map : list2) {
|
|
|
+ map.put("table_name", "T_WHZQJXM");
|
|
|
+ }
|
|
|
+ masterList.addAll(list2);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否需要添加日志
|
|
|
+ */
|
|
|
+ public boolean ifAddLog(String methodName) {
|
|
|
+ String[] names = {REMOVE_METHOD, SAVE_METHOD};
|
|
|
+ return Arrays.asList(names).contains(methodName);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static String getTableNameByURL(String request) {
|
|
|
+ if (request == null || request.trim().isEmpty()) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历映射表,检查请求地址是否包含关键路径
|
|
|
+ for (Map.Entry<String, String> entry : PATH_TO_TABLE_MAP.entrySet()) {
|
|
|
+ if (request.contains(entry.getKey())) {
|
|
|
+ return entry.getValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return ""; // 未找到匹配项
|
|
|
+ }
|
|
|
+ public static Map<String,Object> log(HttpServletRequest request, ProceedingJoinPoint point,Object result, StopWatch stopWatch,String oldData,String tableName) {
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ map.put("method_", point.getSignature().getName());
|
|
|
+ map.put("params_", LogAopUtil.filterParam(point.getArgs()));
|
|
|
+ map.put("user_id_", ContextUtil.getCurrentUser().getUserId());
|
|
|
+ map.put("user_name_", ContextUtil.getCurrentUser().getFullname());
|
|
|
+ map.put("time_", stopWatch.getTotalTimeMillis());
|
|
|
+ map.put("ip_", RequestUtil.getIpAddr(request));
|
|
|
+ map.put("response_", JSONUtil.toJsonStr(result));
|
|
|
+ map.put("uri_", request.getRequestURI());
|
|
|
+ map.put("type_", "正常日志");
|
|
|
+ map.put("data_", oldData);
|
|
|
+ map.put("table_name", tableName);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+}
|