基于若依分离版框架业务数据与操作日志的数据做个关联
入库表
/*入库业务表 */
CREATE TABLE [BS_In](
[Id] int IDENTITY(1,1) NOT NULL, /*主键Id,采集Id */
[WhId] int NOT NULL, /*仓库Id */
[BatchCode] [nvarchar](30) NULL, /*批次号 */
[InOrder] [nvarchar](30) NULL, /*入库单据 */
[InType] [nvarchar](30) NOT NULL, /*入库类型 */
[InTime] datetime NOT NULL, /*入库时间 */
[Operator] [nvarchar](30) NOT NULL, /*入库人 */
[Notes] [nvarchar](100) NULL, /*备注 */
[LogId] int NOT NULL, /*操作日志Id */
CONSTRAINT [PK_BS_In] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];
其中LogId是取的是操作日志的Id,对应sys_oper_log表的oper_id
操作日志表(若依框架自带)
/*操作日志表 */
CREATE TABLE [sys_oper_log](
[oper_id] bigint IDENTITY(1,1) NOT NULL, --日志主键
[title] varchar(50) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --模块标题
[business_type] int DEFAULT 0 NULL, --业务类型(0其它 1新增 2修改 3删除)
[method] varchar(100) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --方法名称
[request_method] varchar(10) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --请求方式
[operator_type] int DEFAULT 0 NULL, --操作类别(0其它 1后台用户 2手机端用户)
[oper_name] varchar(50) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, -- 操作人员
[dept_name] varchar(50) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --部门名称
[oper_url] varchar(255) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --请求URL
[oper_ip] varchar(128) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --主机地址
[oper_location] varchar(255) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --操作地点
[oper_param] varchar(2000) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --请求参数
[json_result] varchar(2000) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --返回参数
[status] int DEFAULT 0 NULL, --操作状态(0正常 1异常)
[error_msg] varchar(2000) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL, --错误消息
[oper_time] datetime NULL,
CONSTRAINT [PK_sys_oper_log] PRIMARY KEY CLUSTERED
(
[oper_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];
其中oper_id是操作日志的Id,对应BS_In表的logId
怎么新建入库任务表同时插入操作日志表再关联插入操作日志表的oper_id?
若依自带的操作日志可以通过@Log注解插入操作日志表
在需要被记录日志的controller方法上添加@Log注解,使用方法如下:
其中最核心的是LogAspect.java
类,它处于com.ruoyi.framework.aspectj
包下;
在处理完请求后执行和拦截异常操作后都会执行handleLog
方法,handleLog
方法最主要的就是处理
SysOperLog
数据库日志对象参数并执行插入数据操作。重点就是这一段代码。
sys_oper_log
表的oper_id
oper_id
设置到请求上下文或线程局部变量中,以便后续的操作使用@Log
注解,插入入库表BS_In
,插入成功后取出Id,oper_id
和入库表的Id,根据Id去更新BS_In
的logId
1.修改SysOperLogMapper.xml
文件中的insert
标签的内容,主要修改内容是可以新增后返回operId
<insert id="insertOperlog" parameterType="SysOperLog" useGeneratedKeys="true" keyProperty="operId">
insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, getdate())
</insert>
加了useGeneratedKeys=“true” keyProperty=“operId”
2.将oper_id
设置到请求上下文或线程局部变量中,修改LogAspect.java
类
protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
{
try
{
// 获取当前的用户
LoginUser loginUser = SecurityUtils.getLoginUser();
// *========数据库日志=========*//
SysOperLog operLog = new SysOperLog();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 请求的地址
String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
operLog.setOperIp(ip);
operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
if (loginUser != null)
{
operLog.setOperName(loginUser.getUsername());
}
if (e != null)
{
operLog.setStatus(BusinessStatus.FAIL.ordinal());
operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
}
// 设置方法名称
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
operLog.setMethod(className + "." + methodName + "()");
// 设置请求方式
operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// 保存数据库
operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
//AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
RequestContextHolder.currentRequestAttributes().setAttribute("logId", operLog.getOperId(), RequestAttributes.SCOPE_REQUEST);
}
catch (Exception exp)
{
// 记录本地异常日志
log.error("==前置通知异常==");
log.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
}
}
修改了保存数据库下代码
3.插入入库业务表,取出新增成功后的主键Id,使用@Log
主键插入操作日志表
@Log(title = "产品入库", businessType = BusinessType.INSERT)
@Override
public int toolin(Map map) throws Exception {
int insertIn = collectMapper.insertIn(in);
if(insertIn==0) throw new Exception("插入入库业务表失败");
int MId = Integer.parseInt(in.get("MId").toString());
return MId;
}
<insert id="insertIn" useGeneratedKeys="true" keyProperty="MId">
insert into BS_In values (#{WhId},#{BatchCode},#{InOrder},#{InType},getdate(),#{Operator},#{Notes},null)
</insert>
4.取出MId
和logId
更新日志
public AjaxResult toolin(@RequestBody Map map){
try {
int MId = collectService.toolin(map);
Long logId = (Long) RequestContextHolder.currentRequestAttributes().getAttribute("logId", RequestAttributes.SCOPE_REQUEST);
//执行成功根据主表id更新日志表id
int i = collectService.updateInLog(MId, logId);
}catch (Exception e){
return AjaxResult.error(e.getMessage());
}
return AjaxResult.success();
}
<update id="updateInLog">
update BS_In set LogId=#{logId} where Id=#{MId}
</update>
效果:
如果需要查询出关联信息可以使用inner join
内连接查询
select *
from BS_In b inner join sys_oper_log s
on b.LogId=s.oper_id