`
阅读更多


本文分享在BPM-Table上配置操作日志的经验.最终效果图如下:

 

需求背景:

系统中已有表RV_XIANGMU(P1项目表),并已有相应视图.

 

 步骤1:新增日志表,表名为LOG_RV_XIANGMU.如下图:


 

 

步骤2:新增log_table函数.

 
 函数内容如下:

//入参0:视图自动KEY(用于查找翻译信息)
//入参1:旧VO(无值表示新增)
//入参2:新VO(无值表示删除)

import com.riversoft.platform.po.VwUrl;
import com.riversoft.core.db.SequenceService;
import java.util.*;

//获取视图
VwUrl url = orm.findByPk(VwUrl.class.getName(),args[0]);
if(url==null){
  throw new Exception("找不到视图["+args[0]+"],请联系管理员.");
}


//查找实际视图
Map map = null;

if("dyn".equals(url.getViewClass())){
  //主表视图
  map = orm.findByPk("VwDynTable",args[0]);
}else if("sub".equals(url.getViewClass())){
  //子表视图
  map = orm.findByPk("VwSubTable",args[0]);
}else{
  //错误视图
  throw new Exception("视图配置出错,无法登记日志.");
}

String targetTable = map.get("name");
String logTable = "LOG_"+targetTable;
Integer mode ;
if(args[1]==null){
  mode = 1;//新增
}else if(args[2]==null){
  mode = 3;//删除
}else{
  mode = 2;//修改
}

//获取业务表主键
List keys = new ArrayList();
for(Map column:map.get("columns")){
  if(column.get("updatePri")==null){//主键
    keys.add(column.get("name"));
  }
}

StringBuffer sql = new StringBuffer();
sql.append("insert into ").append(logTable).append(" (");
//业务主键
if(true){
  StringBuffer buff = new StringBuffer();
  for(Object field:keys){
    buff.append(",").append(field);
  }
  sql.append(buff.substring(1));
}

sql.append(",OPR_MODE,OPR_USER,OPR_TIME,FIELD_VAL,FIELD_NAME,OLD_VAL,OLD_NAME,NEW_VAL,NEW_NAME,BATCH_ID) values (");
//业务主键
if(true){
  StringBuffer buff = new StringBuffer();
  for(Object field:keys){
    buff.append(",").append("?");
  }
  sql.append(buff.substring(1));
}
sql.append(",?,?,?,?,?,?,?,?,?,?)");

Long batchId = SequenceService.getInstance().next("LOG");
Map oldVO = args[1];
Map newVO = args[2];

//循环设值
for(Map column:map.get("columns")){
  String name = column.get("name");
  
  if(mode==1&&newVO.get(name)==null){
    continue;
  }else if(mode==3&&oldVO.get(name)==null){
    continue;
  }else if(mode==2){
    log.debug("["+name+"]-->");
    if(oldVO.get(name)==newVO.get(name)){
      continue;
    }
  }

  Map vo = (newVO!=null?newVO:oldVO);
  List objs = new ArrayList();
  for(String field:keys){//设置业务主键
    objs.add(vo.get(field));
  }
  
  //OPR_MODE
  objs.add(mode);
  //OPR_USER
  objs.add(session.get("USER").getUid());
  //OPR_TIME
  objs.add(new Date());
  //FIELD_VAL
  objs.add(name);
  //FIELD_NAME
  objs.add(column.get("busiName"));
  //OLD
  if(oldVO==null||oldVO.get(name)==null){
    objs.add(null);
    objs.add(null);
  }else{
    objs.add(oldVO.get(name));
    objs.add(cm.widget(column.get("widget"),oldVO.get(name)));
  }
  //NEW
  if(newVO==null||newVO.get(name)==null){
    objs.add(null);
    objs.add(null);
  }else{
    objs.add(newVO.get(name));
    objs.add(cm.widget(column.get("widget"),newVO.get(name)));
  }
  //BATCH_ID
  objs.add(batchId);
  
  db.exec(sql.toString(),objs.toArray());
}

 

 步骤3:编辑P1项目表视图,在触发器中调用log_table函数.如下图:


 

前置处理器中代码: 

if(mode==2){//保存旧VO,方便登记日志
  variable.put("old_vo",db.findByPk(vo));
}else if(mode==3){
  variable.put("old_vo",vo);
}

 

 

后置处理器中代码: 

if(mode==3){
  //删除主表时,联动删除所有子表数据
 db.exec("delete from RV_MINGXI where MX_XIANGMU_ID = ?",vo.get("XM_ID")); 
}

Object oldVO = (mode==1?null:variable.get("old_vo"));//新增时旧值为空
Object newVO = (mode==3?null:vo);//删除时新值为空

cm.invoke("log_table","hoHoybJfa2X",oldVO,newVO);

 

 至此日志登记功能已经完成.可以在"动态表管理"菜单里面,选择"预览数据",即可查看每次被登记的日志详细信息.

接下来,将新增一个日志表界面,并作为tab标签关联到P1项目表界面中.

 

 步骤4:新增LOG_RV_XIANGMU表界面.


  


 


 


 

步骤5:最后,在P1主表的"子表信息"里,将已设置的日志视图关联进来.


 

最终效果可以查看本文开头的效果图.

 

(完)

 

 需要获取创河软件或Rivev软件(Platform或SDK)的相关资料,请联系riversoft(at)126.com.

 

  • 描述: 效果图
  • 大小: 137.7 KB
  • 大小: 42.7 KB
  • 大小: 20.3 KB
  • 大小: 116.6 KB
  • 大小: 38.3 KB
  • 大小: 55.1 KB
  • 大小: 46.4 KB
  • 大小: 38.2 KB
  • 大小: 29.6 KB
分享到:
评论

相关推荐

    操作日志系统设计.zip

    本资料"操作日志系统设计"将探讨设计这样一个系统的各个方面,帮助开发者理解和构建自己的操作日志系统。 首先,我们需要理解操作日志的类型。操作日志通常分为两类:用户操作日志和系统操作日志。用户操作日志记录...

    真正通用的操作日志系统设计.zip

    在IT行业中,操作日志系统的设计是至关重要的,它能够帮助我们记录并分析系统的操作行为,为故障排查、性能优化、安全审计等提供关键数据。本文将深入探讨如何设计一个真正通用的操作日志系统,使其具备高效性、可...

    真正通用的操作日志系统设计

    ### 真正通用的操作日志系统设计 #### 一、引言 操作日志系统在现代软件开发中扮演着至关重要的角色。它不仅能够帮助开发者追踪系统的操作历史,还能在出现问题时提供宝贵的信息以便进行故障排查。然而,传统的日志...

    用户操作日志.zip

    java aop 用户操作日志 在每个action\controller 上加上注解 就可以了 例如 @Log(“添加用户”) 日志包含(请求时间,请求ip,请求类名 ,请求方法,请求参数,请求异常)

    在MVC中记录操作日志类

    在MVC(Model-View-Controller)架构中,记录操作日志是一项重要的功能,它能够帮助开发者追踪系统的行为,诊断问题,以及满足审计和合规需求。以下是对这一主题的详细阐述: 1. **MVC架构简介** MVC是一种设计...

    SpringMVC 写操作日志

    在本例中,关注点就是“操作日志”。AOP通过定义切点(Pointcut)来标识需要拦截的方法,然后创建一个通知(Advice),在切点方法执行前后插入额外的操作,如记录日志。Spring提供了两种主要的通知类型:前置通知...

    后台操作日志.zip

    其中,后台操作日志是监控系统运行、维护数据安全、追踪异常行为的关键组成部分。本篇将深入探讨“后台管理插件”,特别关注“后台操作日志.zip”这一主题,旨在为开发者提供详尽的理论知识与实践指南。 一、后台...

    操作日志队列

    "操作日志队列"是一个专门用于处理日志记录的技术概念,尤其在高并发和大数据量的场景下显得尤为重要。这篇博客可能详细阐述了如何使用队列来实现高效的操作日志管理。 首先,队列是一种先进先出(FIFO)的数据结构...

    日志管理系统mysql数据库设计

    该系统应用于一个大型企业的日志管理,包括日志记录、日志类型管理和日志与类型的关联关系管理。 场景: 该企业拥有多个业务系统,每天会产生大量的日志数据。由于日志数据量庞大,人工处理和管理这些数据非常困难...

    系统日志操作类(C#)

    在提供的`系统日志操作类.chm`帮助文档中,很可能包含了关于如何设计和实现这样一个日志操作类的详细信息,包括具体的代码示例和使用指南。这将是你理解和使用C#系统日志操作的一个宝贵资源。 总的来说,掌握C#的...

    labview操作logger,日志记录

    6. **日志显示**:除了将日志写入文件,你还可以设计一个用户界面(UI)来实时显示日志信息,便于监控程序状态。 7. **日志库和工具**:有一些社区开发的LabVIEW工具,如LVLogger,提供了更高级的日志功能,如网络...

    eventlog日志设计文档

    《eventlog日志设计文档》主要探讨了在IT系统中如何设计和实现高效且可靠的日志模块,以满足开发人员的诊断和调试需求。以下是该文档的关键知识点: 1. **日志模块的目的**:日志模块的主要目标是为开发人员提供...

    Java组件设计-日志组件

    日志是程序运行过程中的事件记录,包括但不限于错误信息、警告消息、调试信息、用户操作记录等。这些信息有助于在出现问题时快速定位故障源,从而提高系统的可维护性和稳定性。 Java中常见的日志框架有Log4j、...

    sql server误操作日志还原工具

    "SQL Server误操作日志还原工具"就是为了解决这类问题而设计的。它允许用户在出现误操作后,通过日志回滚来恢复到误操作前的状态,以最大程度地减少数据损失。 SQL Server的日志记录了所有事务的详细历史,包括对...

    C++编写的写日志操作程序源代码

    压缩包内的"写日志操作"文件可能是这个C++日志操作程序的源代码,可以查看并学习其中的设计思路和实现细节。通过阅读源代码,可以更深入地理解上述知识点,并能根据实际项目需求进行定制和优化。

    PHP实现工厂模式设计日志记录器

    首先,`Logger.php`是日志记录器的接口,定义了日志记录的基本操作,如`writeLog()`。这个接口是所有具体日志记录器(例如`FileLog.php`和`DatabaseLog.php`)需要实现的,确保它们都有相同的行为,即记录日志。 `...

    动态代理设计模式 日志和源码

    这有助于调试和性能分析,同时也能提供操作日志供日后参考。 **Spring AOP**: 在Spring框架中,动态代理用于实现AOP,它是一种编程范式,旨在将关注点分离,比如日志、事务管理等横切关注点。Spring支持JDK动态...

    C++日志操作

    在IT行业中,日志操作是软件开发中必不可少的一部分,它帮助开发者追踪程序运行的状态,调试错误,以及进行性能分析。本项目聚焦于C++的日志处理,提供了在Xcode和Visual Studio(VC)环境下使用的日志产生类。下面...

    微软企业库5.0操作日志和缓存模块

    在本案例中,我们将关注的是"操作日志"和"缓存模块"。 操作日志模块: 操作日志是软件系统中一个至关重要的组件,它记录了应用程序运行过程中的各种操作和事件,包括但不限于错误、警告、信息和调试消息。通过使用...

Global site tag (gtag.js) - Google Analytics