【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】

若依框架业务表和操作日志表关联

  • 需求:
  • 分析:
  • 思路:
  • 实现:

需求:

基于若依分离版框架业务数据与操作日志的数据做个关联

入库表


/*入库业务表																															*/
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注解,使用方法如下:
【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】_第1张图片
【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】_第2张图片
其中最核心的是LogAspect.java类,它处于com.ruoyi.framework.aspectj包下;
在处理完请求后执行和拦截异常操作后都会执行handleLog方法,handleLog方法最主要的就是处理
SysOperLog数据库日志对象参数并执行插入数据操作。重点就是这一段代码。【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】_第3张图片

思路:

  • 取出插入日志表sys_oper_log表的oper_id
  • oper_id设置到请求上下文或线程局部变量中,以便后续的操作使用
  • 在实现类上新增@Log注解,插入入库表BS_In,插入成功后取出Id,
  • 在方法中取出oper_id和入库表的Id,根据Id去更新BS_InlogId

实现:

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.取出MIdlogId更新日志

    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>

效果:
【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】_第4张图片
【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】_第5张图片
如果需要查询出关联信息可以使用inner join内连接查询

  select *
  from BS_In b inner join sys_oper_log s
  on b.LogId=s.oper_id

你可能感兴趣的:(数据库,java,服务器)