Browse Source
新增数据修改记录日志Mapper 新增数据修改记录日志Mapper.XML 新增数据修改记录日志Service接口 新增数据修改记录日志ServiceImpl实现类 新增 通用模块BusinessKeysConstants 修改数据记录日志业务模块常量类,用于记录业务模块数据,方便程序的维护,同时也能提高可读性 新增 系统模块 SysFieldDifferent 字段差异实体类,用于记录修改的字段名称,修改前值,修改后值,方便后续使用 新增自定义注解类:FieldCompare,采用和excel导出一样的模式,增加@FieldCompare注解,后续只需要在对应实体类上的成员变量增加@FieldCompare(chinesename="")就可使用 新增 通用模块字段对比工具类FieldCompareUtil,新增compare字段对比方法,采用反射的思想,自动获取带有FieldCompare注解的成员变量,然后对比拥有该注解的实体类,新值和旧的值进行对比,把相同实体类的成员变量修改前和修改后不同的值采用 [{fieldName,before,after},{},{}]的形式进行存储 新增 SysDiffLogVo 修改记录Vo类,用于前端列表展示修改的字段、修改前的值、修改后的值、修改时间、修改人 新增 数据修改记录日志Controller,用于后续统一处理所有模块的修改记录的展示,只需要传递相同且必要的值,就可使用,减少重复性代码 自定义常量BusinessKeysConstants类:新增 产品型号管理作为测试数据 SysFieldDifferent 字段差异实体类 新增 包含(fieldName、before、after)有参构造构造方法和无参构造方法,修改toString方法去掉 {}外面的SysFieldDifferent,用于存储[{fieldName,before,after},{},{}]这种形式,方便后面进行json数据的反序列化 前端新增修改记录通用列表展示页面diffLog.html,按照万材要求展示:修改字段、修改前的值、修改后的值、修改人、上次修改时间 SysDiffLogController层新增查询数据修改记录日志列表后端接口、新增打开数据修改记录前端页面后端接口 ISysDiffLogService层新增diff_data 把 数据通过JSON 序列化和反序列化 后端方法parseDiffData();新增 展示数据修改记录日志后端方法getDiffLogList() SysDiffLogMapper层新增查询数据修改记录日志列表 后端方法selectSysDiffLogByBusiness() SysDiffLogServiceImpl层新增 解析单个条目后端方法parseSingleEntry() 前端通用模块ry-ui.js新增双击某格触发的事件前端方法 测试通用修改记录日志: SysProductModel实体类成员变量上加入@FieldCompare()注解 SysProductModelController层新增打开日志记录前端页面的后端接口,新增展示产品型号管理日志记录后端接口 修改SysProductModelServiceImpl新增产品型号管理后端方法:新增的同时新增一条修改记录日志数据;修改 修改操作方法,修改产品型号管理数据的同时:根据产品型号管理的唯一属性关联修改记录日志表,按照规定的格式里面存入修改的字段、修改前的值、修改后的值、修改时间、修改人数据 修改产品型号管理前端列表页面新增 onDblClickCell方法:按照万材要求:只有双击修改时间字段才会触发该事件,打开修改记录数据 去掉SysProductModelController层的新增有关修改记录日志的方法:提高通用性,把方法集中放在SysDiffLogController中; 修改 SysDiffLogController层的getDiffDataList方法,新增businessKey参数,提高通用性; 修改 onDblClickCell方法,现在只需要按照通用格式从前端传入businessId、businessKey参数就可全局通用dev
liuxiaoxu
1 month ago
17 changed files with 1049 additions and 1 deletions
@ -0,0 +1,60 @@ |
|||||
|
package com.ruoyi.system.controller; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
import com.ruoyi.system.domain.Vo.SysDiffLogVo; |
||||
|
import org.apache.shiro.authz.annotation.RequiresPermissions; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Controller; |
||||
|
import org.springframework.ui.ModelMap; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
import com.ruoyi.common.annotation.Log; |
||||
|
import com.ruoyi.common.enums.BusinessType; |
||||
|
import com.ruoyi.system.domain.SysDiffLog; |
||||
|
import com.ruoyi.system.service.ISysDiffLogService; |
||||
|
import com.ruoyi.common.core.controller.BaseController; |
||||
|
import com.ruoyi.common.core.domain.AjaxResult; |
||||
|
import com.ruoyi.common.utils.poi.ExcelUtil; |
||||
|
import com.ruoyi.common.core.page.TableDataInfo; |
||||
|
|
||||
|
/** |
||||
|
* 数据修改记录日志Controller |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
@Controller |
||||
|
@RequestMapping("/system/diffLog") |
||||
|
public class SysDiffLogController extends BaseController |
||||
|
{ |
||||
|
private String prefix = "system/diffLog"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ISysDiffLogService sysDiffLogService; |
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
*/ |
||||
|
@PostMapping("/list") |
||||
|
@ResponseBody |
||||
|
public TableDataInfo list( |
||||
|
@RequestParam Long businessId, |
||||
|
@RequestParam String businessKey |
||||
|
) { |
||||
|
startPage(); |
||||
|
List<SysDiffLogVo> list = sysDiffLogService.getDiffLogList(businessId,businessKey); |
||||
|
return getDataTable(list); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 打开数据修改记录前端页面 |
||||
|
* */ |
||||
|
@GetMapping("/getDiffDataList/{businessId}/{businessKey}") |
||||
|
public String getDiffDataList(@PathVariable Long businessId, @PathVariable String businessKey,ModelMap mmap){ |
||||
|
mmap.put("businessId", businessId); |
||||
|
mmap.put("businessKey", businessKey); |
||||
|
return prefix + "/diffLog"; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,84 @@ |
|||||
|
package com.ruoyi.system.domain; |
||||
|
|
||||
|
import org.apache.commons.lang3.builder.ToStringBuilder; |
||||
|
import org.apache.commons.lang3.builder.ToStringStyle; |
||||
|
import com.ruoyi.common.annotation.Excel; |
||||
|
import com.ruoyi.common.core.domain.BaseEntity; |
||||
|
|
||||
|
/** |
||||
|
* 数据修改记录日志对象 sys_diff_log |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
public class SysDiffLog extends BaseEntity |
||||
|
{ |
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
/** 日志主键 */ |
||||
|
private Long diffId; |
||||
|
|
||||
|
/** 业务id */ |
||||
|
@Excel(name = "业务id") |
||||
|
private Long businessId; |
||||
|
|
||||
|
/** 业务名称 */ |
||||
|
@Excel(name = "业务名称") |
||||
|
private String businessKey; |
||||
|
|
||||
|
/** 业务更改数据 */ |
||||
|
@Excel(name = "业务更改数据") |
||||
|
private String diffData; |
||||
|
|
||||
|
public void setDiffId(Long diffId) |
||||
|
{ |
||||
|
this.diffId = diffId; |
||||
|
} |
||||
|
|
||||
|
public Long getDiffId() |
||||
|
{ |
||||
|
return diffId; |
||||
|
} |
||||
|
|
||||
|
public Long getBusinessId() { |
||||
|
return businessId; |
||||
|
} |
||||
|
|
||||
|
public void setBusinessId(Long businessId) { |
||||
|
this.businessId = businessId; |
||||
|
} |
||||
|
|
||||
|
public void setBusinessKey(String businessKey) |
||||
|
{ |
||||
|
this.businessKey = businessKey; |
||||
|
} |
||||
|
|
||||
|
public String getBusinessKey() |
||||
|
{ |
||||
|
return businessKey; |
||||
|
} |
||||
|
public void setDiffData(String diffData) |
||||
|
{ |
||||
|
this.diffData = diffData; |
||||
|
} |
||||
|
|
||||
|
public String getDiffData() |
||||
|
{ |
||||
|
return diffData; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
||||
|
.append("diffId", getDiffId()) |
||||
|
.append("businessId", getBusinessId()) |
||||
|
.append("businessKey", getBusinessKey()) |
||||
|
.append("diffData", getDiffData()) |
||||
|
.append("createBy", getCreateBy()) |
||||
|
.append("createTime", getCreateTime()) |
||||
|
.append("updateBy", getUpdateBy()) |
||||
|
.append("updateTime", getUpdateTime()) |
||||
|
.append("remark", getRemark()) |
||||
|
.toString(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
package com.ruoyi.system.domain.Vo; |
||||
|
|
||||
|
import com.ruoyi.common.core.domain.BaseEntity; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 用于展示修改记录日志 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-16 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class SysDiffLogVo{ |
||||
|
|
||||
|
|
||||
|
//修改的字段
|
||||
|
private String fieldName; |
||||
|
|
||||
|
//修改前
|
||||
|
private String before; |
||||
|
|
||||
|
//修改后
|
||||
|
private String after; |
||||
|
|
||||
|
//修改的时间
|
||||
|
private Date updateTime; |
||||
|
|
||||
|
//修改的人
|
||||
|
private String updateBy; |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
package com.ruoyi.system.mapper; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import com.ruoyi.system.domain.SysDiffLog; |
||||
|
|
||||
|
/** |
||||
|
* 数据修改记录日志Mapper接口 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
public interface SysDiffLogMapper |
||||
|
{ |
||||
|
/** |
||||
|
* 查询数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 数据修改记录日志 |
||||
|
*/ |
||||
|
public SysDiffLog selectSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 数据修改记录日志集合 |
||||
|
*/ |
||||
|
public List<SysDiffLog> selectSysDiffLogList(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 数据修改记录日志集合 |
||||
|
*/ |
||||
|
public SysDiffLog selectSysDiffLogByBusiness(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
/** |
||||
|
* 新增数据修改记录日志 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int insertSysDiffLog(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
/** |
||||
|
* 修改数据修改记录日志 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int updateSysDiffLog(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
/** |
||||
|
* 删除数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int deleteSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* 批量删除数据修改记录日志 |
||||
|
* |
||||
|
* @param diffIds 需要删除的数据ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int deleteSysDiffLogByIds(String[] diffIds); |
||||
|
|
||||
|
/** |
||||
|
* 作废数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int cancelSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* 恢复数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int restoreSysDiffLogById(Long diffId); |
||||
|
} |
@ -0,0 +1,104 @@ |
|||||
|
package com.ruoyi.system.service; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
import com.ruoyi.common.core.domain.entity.SysFieldDifferent; |
||||
|
import com.ruoyi.system.domain.SysDiffLog; |
||||
|
import com.ruoyi.system.domain.Vo.SysDiffLogVo; |
||||
|
|
||||
|
/** |
||||
|
* 数据修改记录日志Service接口 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
public interface ISysDiffLogService |
||||
|
{ |
||||
|
/** |
||||
|
* 查询数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 数据修改记录日志 |
||||
|
*/ |
||||
|
public SysDiffLog selectSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 数据修改记录日志集合 |
||||
|
*/ |
||||
|
public List<SysDiffLog> selectSysDiffLogList(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 数据修改记录日志集合 |
||||
|
*/ |
||||
|
public SysDiffLog selectSysDiffLogByBusiness(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
/** |
||||
|
* 新增数据修改记录日志 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int insertSysDiffLog(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
/** |
||||
|
* 修改数据修改记录日志 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int updateSysDiffLog(SysDiffLog sysDiffLog); |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 修改数据修改记录日志通过其他模块 |
||||
|
* |
||||
|
*/ |
||||
|
public int updateSysDiffLogByBusiness(Long businessId, String businessKey, List<SysFieldDifferent> changes); |
||||
|
|
||||
|
/** |
||||
|
* 批量删除数据修改记录日志 |
||||
|
* |
||||
|
* @param ids 需要删除的数据ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int deleteSysDiffLogByIds(String ids); |
||||
|
|
||||
|
/** |
||||
|
* 删除数据修改记录日志信息 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
public int deleteSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* 作废数据修改记录日志 |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return |
||||
|
*/ |
||||
|
int cancelSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* 恢复数据修改记录日志 |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return |
||||
|
*/ |
||||
|
int restoreSysDiffLogById(Long diffId); |
||||
|
|
||||
|
/** |
||||
|
* diff_data 把 数据通过JSON 序列化和反序列化 |
||||
|
* */ |
||||
|
public List<SysFieldDifferent> parseDiffData(String diffData); |
||||
|
|
||||
|
/** |
||||
|
* 展示数据修改记录日志 |
||||
|
* */ |
||||
|
List<SysDiffLogVo> getDiffLogList(Long businessId,String businessKey); |
||||
|
} |
@ -0,0 +1,272 @@ |
|||||
|
package com.ruoyi.system.service.impl; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
import java.util.regex.Matcher; |
||||
|
import java.util.regex.Pattern; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import com.alibaba.fastjson.TypeReference; |
||||
|
import com.ruoyi.common.constant.BusinessKeysConstants; |
||||
|
import com.ruoyi.common.core.domain.entity.SysFieldDifferent; |
||||
|
import com.ruoyi.common.utils.DateUtils; |
||||
|
import com.ruoyi.common.utils.ShiroUtils; |
||||
|
import com.ruoyi.system.domain.Vo.SysDiffLogVo; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import com.ruoyi.system.mapper.SysDiffLogMapper; |
||||
|
import com.ruoyi.system.domain.SysDiffLog; |
||||
|
import com.ruoyi.system.service.ISysDiffLogService; |
||||
|
import com.ruoyi.common.core.text.Convert; |
||||
|
|
||||
|
/** |
||||
|
* 数据修改记录日志Service业务层处理 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
@Service |
||||
|
public class SysDiffLogServiceImpl implements ISysDiffLogService |
||||
|
{ |
||||
|
@Autowired |
||||
|
private SysDiffLogMapper sysDiffLogMapper; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 数据修改记录日志 |
||||
|
*/ |
||||
|
@Override |
||||
|
public SysDiffLog selectSysDiffLogById(Long diffId) |
||||
|
{ |
||||
|
return sysDiffLogMapper.selectSysDiffLogById(diffId); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 数据修改记录日志 |
||||
|
*/ |
||||
|
@Override |
||||
|
public List<SysDiffLog> selectSysDiffLogList(SysDiffLog sysDiffLog) |
||||
|
{ |
||||
|
return sysDiffLogMapper.selectSysDiffLogList(sysDiffLog); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 查询数据修改记录日志列表 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 数据修改记录日志集合 |
||||
|
*/ |
||||
|
@Override |
||||
|
public SysDiffLog selectSysDiffLogByBusiness(SysDiffLog sysDiffLog){ |
||||
|
return sysDiffLogMapper.selectSysDiffLogByBusiness(sysDiffLog); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 新增数据修改记录日志 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int insertSysDiffLog(SysDiffLog sysDiffLog) |
||||
|
{ |
||||
|
String loginName = ShiroUtils.getLoginName(); |
||||
|
sysDiffLog.setCreateBy(loginName); |
||||
|
sysDiffLog.setCreateTime(DateUtils.getNowDate()); |
||||
|
return sysDiffLogMapper.insertSysDiffLog(sysDiffLog); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 修改数据修改记录日志 |
||||
|
* |
||||
|
* @param sysDiffLog 数据修改记录日志 |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int updateSysDiffLog(SysDiffLog sysDiffLog) |
||||
|
{ |
||||
|
String loginName = ShiroUtils.getLoginName(); |
||||
|
sysDiffLog.setUpdateBy(loginName); |
||||
|
sysDiffLog.setUpdateTime(DateUtils.getNowDate()); |
||||
|
return sysDiffLogMapper.updateSysDiffLog(sysDiffLog); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 修改数据修改记录日志 |
||||
|
* |
||||
|
* @param businessId 业务ID |
||||
|
* @param businessKey 业务键 |
||||
|
* @param changes 字段变化列表 |
||||
|
* @return 更新行数 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int updateSysDiffLogByBusiness(Long businessId, String businessKey, List<SysFieldDifferent> changes) { |
||||
|
SysDiffLog sysDiffLog = new SysDiffLog(); |
||||
|
sysDiffLog.setBusinessId(businessId); |
||||
|
sysDiffLog.setBusinessKey(businessKey); |
||||
|
SysDiffLog existingLog = sysDiffLogMapper.selectSysDiffLogByBusiness(sysDiffLog); |
||||
|
|
||||
|
if (existingLog != null) { |
||||
|
existingLog.setDiffData(changesToString(changes)); |
||||
|
existingLog.setUpdateBy(ShiroUtils.getLoginName()); |
||||
|
existingLog.setUpdateTime(DateUtils.getNowDate()); |
||||
|
return sysDiffLogMapper.updateSysDiffLog(existingLog); |
||||
|
} else { |
||||
|
sysDiffLog.setDiffData(changesToString(changes)); |
||||
|
sysDiffLog.setCreateBy(ShiroUtils.getLoginName()); |
||||
|
sysDiffLog.setCreateTime(DateUtils.getNowDate()); |
||||
|
sysDiffLog.setUpdateBy(ShiroUtils.getLoginName()); |
||||
|
sysDiffLog.setUpdateTime(DateUtils.getNowDate()); |
||||
|
return sysDiffLogMapper.insertSysDiffLog(sysDiffLog); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private String changesToString(List<SysFieldDifferent> changes) { |
||||
|
return changes.stream() |
||||
|
.map(Object::toString) |
||||
|
.collect(Collectors.joining(", ")); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 删除数据修改记录日志对象 |
||||
|
* |
||||
|
* @param ids 需要删除的数据ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int deleteSysDiffLogByIds(String ids) |
||||
|
{ |
||||
|
return sysDiffLogMapper.deleteSysDiffLogByIds(Convert.toStrArray(ids)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 删除数据修改记录日志信息 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int deleteSysDiffLogById(Long diffId) |
||||
|
{ |
||||
|
return sysDiffLogMapper.deleteSysDiffLogById(diffId); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 作废数据修改记录日志 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int cancelSysDiffLogById(Long diffId) |
||||
|
{ |
||||
|
return sysDiffLogMapper.cancelSysDiffLogById(diffId); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 恢复数据修改记录日志信息 |
||||
|
* |
||||
|
* @param diffId 数据修改记录日志ID |
||||
|
* @return 结果 |
||||
|
*/ |
||||
|
@Override |
||||
|
public int restoreSysDiffLogById(Long diffId) |
||||
|
{ |
||||
|
return sysDiffLogMapper.restoreSysDiffLogById(diffId); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* diff_data 把 数据通过JSON 序列化和反序列化 |
||||
|
* */ |
||||
|
public List<SysFieldDifferent> parseDiffData(String diffData) { |
||||
|
if (diffData == null || diffData.trim().isEmpty()) { |
||||
|
return new ArrayList<>(); |
||||
|
} |
||||
|
|
||||
|
List<SysFieldDifferent> sysFieldDifferents = new ArrayList<>(); |
||||
|
Pattern pattern = Pattern.compile("\\{(.*?)\\}"); |
||||
|
Matcher matcher = pattern.matcher(diffData); |
||||
|
|
||||
|
while (matcher.find()) { |
||||
|
String entry = matcher.group(1); |
||||
|
SysFieldDifferent sysFieldDifferent = parseSingleEntry(entry); |
||||
|
if (sysFieldDifferent != null) { |
||||
|
sysFieldDifferents.add(sysFieldDifferent); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return sysFieldDifferents; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// 解析单个条目
|
||||
|
private static SysFieldDifferent parseSingleEntry(String entryStr) { |
||||
|
SysFieldDifferent sysFieldDifferent = new SysFieldDifferent(); |
||||
|
String[] parts = entryStr.split(", "); |
||||
|
for (String part : parts) { |
||||
|
String[] keyValue = part.split("="); |
||||
|
if (keyValue.length == 2) { |
||||
|
String key = keyValue[0].trim(); |
||||
|
String value = keyValue[1].trim(); |
||||
|
value = value.replaceAll("^'|'$", ""); // 去掉首尾的单引号
|
||||
|
switch (key) { |
||||
|
case "fieldName": |
||||
|
sysFieldDifferent.setFieldName(value); |
||||
|
break; |
||||
|
case "before": |
||||
|
sysFieldDifferent.setBefore(value); |
||||
|
break; |
||||
|
case "after": |
||||
|
sysFieldDifferent.setAfter(value); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return sysFieldDifferent; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 展示数据修改记录日志 |
||||
|
* */ |
||||
|
@Override |
||||
|
public List<SysDiffLogVo> getDiffLogList(Long businessId,String businessKey) { |
||||
|
|
||||
|
List<SysDiffLogVo> sysDiffLogVos = new ArrayList<>(); |
||||
|
SysDiffLog sysDiffLog = new SysDiffLog(); |
||||
|
sysDiffLog.setBusinessId(businessId); |
||||
|
sysDiffLog.setBusinessKey(businessKey); |
||||
|
SysDiffLog tempDiffLog = sysDiffLogMapper.selectSysDiffLogByBusiness(sysDiffLog); |
||||
|
// 检查查询结果是否为空
|
||||
|
if (tempDiffLog == null || tempDiffLog.getDiffData() == null) { |
||||
|
return sysDiffLogVos; // 直接返回空列表
|
||||
|
} |
||||
|
List<SysFieldDifferent> sysFieldDifferents = parseDiffData(tempDiffLog.getDiffData()); |
||||
|
|
||||
|
sysFieldDifferents.forEach(sysFieldDifferent -> { |
||||
|
SysDiffLogVo sysDiffLogVo = new SysDiffLogVo(); |
||||
|
sysDiffLogVo.setFieldName(sysFieldDifferent.getFieldName()); |
||||
|
sysDiffLogVo.setBefore(sysFieldDifferent.getBefore()); |
||||
|
sysDiffLogVo.setAfter(sysFieldDifferent.getAfter()); |
||||
|
sysDiffLogVo.setUpdateTime(tempDiffLog.getUpdateTime()); |
||||
|
sysDiffLogVo.setUpdateBy(tempDiffLog.getUpdateBy()); |
||||
|
|
||||
|
sysDiffLogVos.add(sysDiffLogVo); |
||||
|
}); |
||||
|
return sysDiffLogVos; |
||||
|
} |
||||
|
} |
@ -0,0 +1,100 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
<mapper namespace="com.ruoyi.system.mapper.SysDiffLogMapper"> |
||||
|
|
||||
|
<resultMap type="SysDiffLog" id="SysDiffLogResult"> |
||||
|
<result property="diffId" column="diff_id" /> |
||||
|
<result property="businessId" column="business_id" /> |
||||
|
<result property="businessKey" column="business_key" /> |
||||
|
<result property="diffData" column="diff_data" /> |
||||
|
<result property="createBy" column="create_by" /> |
||||
|
<result property="createTime" column="create_time" /> |
||||
|
<result property="updateBy" column="update_by" /> |
||||
|
<result property="updateTime" column="update_time" /> |
||||
|
<result property="remark" column="remark" /> |
||||
|
</resultMap> |
||||
|
|
||||
|
<sql id="selectSysDiffLogVo"> |
||||
|
select diff_id, business_id, business_key, diff_data, create_by, create_time, update_by, update_time, remark from sys_diff_log |
||||
|
</sql> |
||||
|
|
||||
|
<select id="selectSysDiffLogList" parameterType="SysDiffLog" resultMap="SysDiffLogResult"> |
||||
|
<include refid="selectSysDiffLogVo"/> |
||||
|
<where> |
||||
|
<if test="businessId != null "> and business_id = #{businessId}</if> |
||||
|
<if test="businessKey != null and businessKey != ''"> and business_key = #{businessKey}</if> |
||||
|
</where> |
||||
|
</select> |
||||
|
|
||||
|
<select id="selectSysDiffLogById" parameterType="Long" resultMap="SysDiffLogResult"> |
||||
|
<include refid="selectSysDiffLogVo"/> |
||||
|
where diff_id = #{diffId} |
||||
|
</select> |
||||
|
|
||||
|
<select id="selectSysDiffLogByBusiness" parameterType="SysDiffLog" resultMap="SysDiffLogResult"> |
||||
|
<include refid="selectSysDiffLogVo"/> |
||||
|
where business_id = #{businessId} |
||||
|
and business_key = #{businessKey} |
||||
|
</select> |
||||
|
|
||||
|
<insert id="insertSysDiffLog" parameterType="SysDiffLog" useGeneratedKeys="true" keyProperty="diffId"> |
||||
|
insert into sys_diff_log |
||||
|
<trim prefix="(" suffix=")" suffixOverrides=","> |
||||
|
<if test="businessId != null">business_id,</if> |
||||
|
<if test="businessKey != null">business_key,</if> |
||||
|
<if test="diffData != null">diff_data,</if> |
||||
|
<if test="createBy != null">create_by,</if> |
||||
|
<if test="createTime != null">create_time,</if> |
||||
|
<if test="updateBy != null">update_by,</if> |
||||
|
<if test="updateTime != null">update_time,</if> |
||||
|
<if test="remark != null">remark,</if> |
||||
|
</trim> |
||||
|
<trim prefix="values (" suffix=")" suffixOverrides=","> |
||||
|
<if test="businessId != null">#{businessId},</if> |
||||
|
<if test="businessKey != null">#{businessKey},</if> |
||||
|
<if test="diffData != null">#{diffData},</if> |
||||
|
<if test="createBy != null">#{createBy},</if> |
||||
|
<if test="createTime != null">#{createTime},</if> |
||||
|
<if test="updateBy != null">#{updateBy},</if> |
||||
|
<if test="updateTime != null">#{updateTime},</if> |
||||
|
<if test="remark != null">#{remark},</if> |
||||
|
</trim> |
||||
|
</insert> |
||||
|
|
||||
|
<update id="updateSysDiffLog" parameterType="SysDiffLog"> |
||||
|
update sys_diff_log |
||||
|
<trim prefix="SET" suffixOverrides=","> |
||||
|
<if test="businessId != null">business_id = #{businessId},</if> |
||||
|
<if test="businessKey != null">business_key = #{businessKey},</if> |
||||
|
<if test="diffData != null">diff_data = #{diffData},</if> |
||||
|
<if test="createBy != null">create_by = #{createBy},</if> |
||||
|
<if test="createTime != null">create_time = #{createTime},</if> |
||||
|
<if test="updateBy != null">update_by = #{updateBy},</if> |
||||
|
<if test="updateTime != null">update_time = #{updateTime},</if> |
||||
|
<if test="remark != null">remark = #{remark},</if> |
||||
|
</trim> |
||||
|
where diff_id = #{diffId} |
||||
|
</update> |
||||
|
|
||||
|
<delete id="deleteSysDiffLogById" parameterType="Long"> |
||||
|
delete from sys_diff_log where diff_id = #{diffId} |
||||
|
</delete> |
||||
|
|
||||
|
<delete id="deleteSysDiffLogByIds" parameterType="String"> |
||||
|
delete from sys_diff_log where diff_id in |
||||
|
<foreach item="diffId" collection="array" open="(" separator="," close=")"> |
||||
|
#{diffId} |
||||
|
</foreach> |
||||
|
</delete> |
||||
|
|
||||
|
<update id="cancelSysDiffLogById" parameterType="Long"> |
||||
|
update sys_diff_log set del_flag = '1' where diff_id = #{diffId} |
||||
|
</update> |
||||
|
|
||||
|
<update id="restoreSysDiffLogById" parameterType="Long"> |
||||
|
update sys_diff_log set del_flag = '0' where diff_id = #{diffId} |
||||
|
</update> |
||||
|
|
||||
|
</mapper> |
@ -0,0 +1,59 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> |
||||
|
<head> |
||||
|
<th:block th:include="include :: header('数据修改记录日志列表')" /> |
||||
|
</head> |
||||
|
<body class="gray-bg"> |
||||
|
<div class="container-div"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 select-table table-striped"> |
||||
|
<table id="bootstrap-table"></table> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<th:block th:include="include :: footer" /> |
||||
|
<script th:inline="javascript"> |
||||
|
var prefix = ctx + "system/diffLog"; |
||||
|
|
||||
|
var businessId = [[${businessId}]]; |
||||
|
|
||||
|
var businessKey = [[${businessKey}]]; |
||||
|
$(function() { |
||||
|
var options = { |
||||
|
url: prefix + "/list", |
||||
|
showColumns: false, |
||||
|
showToggle: false, |
||||
|
showRefresh:false, |
||||
|
showSearch:false, |
||||
|
modalName: "数据修改记录日志", |
||||
|
queryParams : { |
||||
|
businessId: businessId, |
||||
|
businessKey: businessKey |
||||
|
}, |
||||
|
columns: [ |
||||
|
{ |
||||
|
title: '修改字段', |
||||
|
field: 'fieldName', |
||||
|
}, |
||||
|
{ |
||||
|
title: '修改前的值', |
||||
|
field: 'before', |
||||
|
}, |
||||
|
{ |
||||
|
title: '修改后的值', |
||||
|
field: 'after', |
||||
|
}, |
||||
|
{ |
||||
|
title: '更新人', |
||||
|
field: 'updateBy', |
||||
|
}, |
||||
|
{ |
||||
|
title: '上次更新时间', |
||||
|
field: 'updateTime', |
||||
|
},] |
||||
|
}; |
||||
|
$.table.init(options); |
||||
|
}); |
||||
|
</script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,25 @@ |
|||||
|
package com.ruoyi.common.annotation; |
||||
|
|
||||
|
|
||||
|
import java.lang.annotation.*; |
||||
|
|
||||
|
/** |
||||
|
* 自定义注解:字段对比 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-16 |
||||
|
* */ |
||||
|
@Target({ElementType.FIELD}) |
||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||
|
@Inherited |
||||
|
@Documented |
||||
|
public @interface FieldCompare { |
||||
|
/** 字段对应的中文 */ |
||||
|
String chineseName(); |
||||
|
|
||||
|
/** |
||||
|
* 类型映射 |
||||
|
* 使用方式 1:男,0:女 |
||||
|
*/ |
||||
|
String properties() default ""; |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
package com.ruoyi.common.constant; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 修改数据记录日志业务模块常量 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
public class BusinessKeysConstants { |
||||
|
|
||||
|
|
||||
|
/** 测试产品型号管理 */ |
||||
|
public static final String PRODUCT_MODEL = "1"; |
||||
|
} |
@ -0,0 +1,62 @@ |
|||||
|
package com.ruoyi.common.core.domain.entity; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 字段差异实体类 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-15 |
||||
|
*/ |
||||
|
public class SysFieldDifferent { |
||||
|
//差异字段名称
|
||||
|
private String fieldName; |
||||
|
|
||||
|
//修改前
|
||||
|
private String before; |
||||
|
|
||||
|
//修改后
|
||||
|
private String after; |
||||
|
|
||||
|
public SysFieldDifferent() { |
||||
|
} |
||||
|
|
||||
|
public SysFieldDifferent(String fieldName, String before, String after) { |
||||
|
this.fieldName = fieldName; |
||||
|
this.before = before; |
||||
|
this.after = after; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public String getFieldName() { |
||||
|
return fieldName; |
||||
|
} |
||||
|
|
||||
|
public void setFieldName(String fieldName) { |
||||
|
this.fieldName = fieldName; |
||||
|
} |
||||
|
|
||||
|
public String getBefore() { |
||||
|
return before; |
||||
|
} |
||||
|
|
||||
|
public void setBefore(String before) { |
||||
|
this.before = before; |
||||
|
} |
||||
|
|
||||
|
public String getAfter() { |
||||
|
return after; |
||||
|
} |
||||
|
|
||||
|
public void setAfter(String after) { |
||||
|
this.after = after; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "{" + |
||||
|
"fieldName='" + fieldName + '\'' + |
||||
|
", before='" + before + '\'' + |
||||
|
", after='" + after + '\'' + |
||||
|
'}'; |
||||
|
} |
||||
|
} |
@ -0,0 +1,92 @@ |
|||||
|
package com.ruoyi.common.utils; |
||||
|
|
||||
|
import com.ruoyi.common.annotation.FieldCompare; |
||||
|
import com.ruoyi.common.core.domain.entity.SysFieldDifferent; |
||||
|
import com.ruoyi.common.exception.BusinessException; |
||||
|
|
||||
|
import java.beans.IntrospectionException; |
||||
|
import java.beans.PropertyDescriptor; |
||||
|
import java.lang.reflect.Field; |
||||
|
import java.lang.reflect.Method; |
||||
|
import java.math.BigDecimal; |
||||
|
import java.util.*; |
||||
|
|
||||
|
/** |
||||
|
* 字段对比工具类 |
||||
|
* |
||||
|
* @author 刘晓旭 |
||||
|
* @date 2024-10-16 |
||||
|
* */ |
||||
|
public class FieldCompareUtil { |
||||
|
|
||||
|
public static <T> List<SysFieldDifferent> compare(Class<T> type, T newObject, T oldObject) throws Exception { |
||||
|
// 变更的记录列表
|
||||
|
List<SysFieldDifferent> changeLogFields = new ArrayList<>(); |
||||
|
|
||||
|
Class<?> newObj = newObject.getClass(); |
||||
|
Field[] newFields = type.getDeclaredFields(); |
||||
|
for (int i = 0; i < newFields.length; i++) { |
||||
|
FieldCompare newAnnotation = newFields[i].getAnnotation(FieldCompare.class); |
||||
|
if (null != newAnnotation) { |
||||
|
PropertyDescriptor newPd = new PropertyDescriptor(newFields[i].getName(), newObj); |
||||
|
Method getMethodNew = newPd.getReadMethod(); |
||||
|
Object oldVal = getMethodNew.invoke(oldObject); |
||||
|
Object newVal = getMethodNew.invoke(newObject); |
||||
|
boolean eq = false; |
||||
|
if (oldVal instanceof String) { |
||||
|
String s1 = String.valueOf(oldVal).trim(); |
||||
|
String s2 = String.valueOf(newVal).trim(); |
||||
|
eq = !s1.equals(s2); |
||||
|
} else if (oldVal instanceof Integer) { |
||||
|
int i1 = (Integer) oldVal; |
||||
|
int i2 = (Integer) newVal; |
||||
|
eq = i1 != i2; |
||||
|
} else if (oldVal instanceof Double) { |
||||
|
double d1 = (Double) oldVal; |
||||
|
double d2 = (Double) newVal; |
||||
|
eq = d1 != d2; |
||||
|
} else if (oldVal instanceof BigDecimal) { |
||||
|
BigDecimal b1 = (BigDecimal) oldVal; |
||||
|
BigDecimal b2 = (BigDecimal) newVal; |
||||
|
eq = b1.compareTo(b2) != 0; |
||||
|
} else if (oldVal instanceof Long) { |
||||
|
long l1 = (Long) oldVal; |
||||
|
long l2 = (Long) newVal; |
||||
|
eq = l1 != l2; |
||||
|
} else { |
||||
|
eq = !oldVal.equals(newVal); |
||||
|
} |
||||
|
String s1 = oldVal == null ? "" : oldVal.toString().trim(); |
||||
|
String s2 = newVal == null ? "" : newVal.toString().trim(); |
||||
|
if (eq) { |
||||
|
Map<String, String> map = codeToNameMap(newAnnotation); |
||||
|
if (map.size() > 0) { |
||||
|
changeLogFields.add(new SysFieldDifferent(newAnnotation.chineseName(), map.get(s1), map.get(s2))); |
||||
|
} else { |
||||
|
changeLogFields.add(new SysFieldDifferent(newAnnotation.chineseName(), s1, s2)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return changeLogFields; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 字典映射 使用方式: |
||||
|
* @param newAnnotation |
||||
|
* @return |
||||
|
*/ |
||||
|
private static Map<String, String> codeToNameMap(FieldCompare newAnnotation) { |
||||
|
Map<String, String> map = new HashMap<>(); |
||||
|
String properties = newAnnotation.properties(); |
||||
|
if (properties != null && properties.length() > 0) { |
||||
|
String[] propertiesArr = properties.split(","); |
||||
|
for (String propertie : propertiesArr) { |
||||
|
String[] split = propertie.split(":"); |
||||
|
map.put(split[0], split[1]); |
||||
|
} |
||||
|
} |
||||
|
return map; |
||||
|
} |
||||
|
|
||||
|
} |
Loading…
Reference in new issue