• jxTMS设计思想之兴趣点


    jxTMS是以低成本快速定制为核心诉求的、SaaS模式的二次开发平台,详见:jxTMS简介。本文是讲述jxTMS平台中兴趣点部分是如何设计的,整个系列请访问:jxTMS设计思想

    在企业运转过程中,总是一事毕、一事起的。如果两件事都在jxTMS中,那这么衔接都会有办法,但有时却需要人来衔接的。

    如报销流程中,总经理审批后,就需要展开相关的财务作业。但一般的财务作业都是在独立的财务软件中执行的,也未必会提供接口供jxTMS进行勾连。所以在总经理审批后,就需要提供相应的机制通知相应的工作人员。

    最简单的解决办法,就是在总经理审批之后,增加一个流程节点,指派给相应的财务人员。这当然是可以,但从流程的意义上来说,总经理已经审批过了,审批流程就应该结束了,现在由于这个业务衔接的环节,不但在总经理同意后流程没有结束,还在理论上存在着否定总经理审批结果的可能。

    所以这个解决办法当然也是可以,但绝不是一个好的解决办法。针对类似的需求,jxTMS提供了称为兴趣点的工具,在不同的业务过程之间提供人为的衔接

    兴趣点的工作原理

    和大家看了上述阐释后的想象不同,兴趣点不是一种消息通知机制,而是一个通用的、做了特殊标记的各类数据对象的列表查询机制。用一句话来概括就是:将符合条件的各种数据对象标记后由指定的成员进行统一的规范化查询

    那么,要实现这样的列表查询,需要我们做什么呢?!

    • 设置检测条件,在合适的时候进行检测,检测通过则给相应的数据对象做特殊标记

    • 要给相应的成员增加一个快捷栏中的入口以提高工作效率,即没有兴趣的就没必要来查看了

    • 列表只能显示基本信息,但业务操作需要更详细的信息支持,所以需要在通用的兴趣点列表查询中为不同的事务显示列表信息和查看详情的入口提供一致的解决机制

    • 为了提高工作效率,最好应提供一个已读与否的标志,便于工作人员快速识别

    现在,jxTMS已经实现上述兴趣点的主体功能,开发者只要定义自己的兴趣检测条件和相应的信息转换函数就可以简单的完成兴趣点的开发了。

    兴趣点的检测条件

    兴趣点和简易流程、业务规则一样,都是定义在capa函数的doc中的辅助部件,可以随时修改,然后通过热机刷新即会生效。如:

    # 谁对什么样的订单感兴趣就通知他
    #第一个参数【specialOrder】是兴趣点的类型
    #第二个参数【特殊订单】是显示到快捷栏中的入口名字
    @myModule.interest('specialOrder','特殊订单'.decode('utf-8'))
    def interest_specialOrder():
        '''
        role 财务稽核 when field.Type=='特殊订单'
        '''
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    兴趣点的定义其实就包括两块:

    • role:指定感兴趣的角色,本例中是【财务稽核】

    • when:后跟的就是触发条件。和规则表中的条件部分是相同的

    其实就是定义:谁,对什么感兴趣。然后jxTMS对符合条件的数据对象打一个特殊的标记,给指定的角色增加一个快捷栏中的相应【示例中就会是:兴趣点->特殊订单】的入口。

    同时,还需要重载一个interestType的函数,以指示本capa感兴趣的兴趣点类型。

    兴趣点的信息转换

    上面说了,兴趣点本质上就是一个特殊的列表查询,所以和前述的列表查询中的dispAffairInfo函数是一样的,兴趣点所在capa需要重载transForInterest函数。如:

    # 因为关注点是通用的,所以需要为关注点的查看准备数据
    def transForInterest(self,ctx,json,jo):
        json.set('affairName',jo.Name)
        json.set('affairCategory',jo.Special)
        json.set('creator',jo.Info.get('creator'))
        json.set('CreateTime',jo.CreateTime)
        json.set('affairState',jo.State)
        json.set("readed", jo.getReadStr(ctx.getCaller().id()))
        json.set('op',self.getViewA(self.getFullName(),self.viewWebInterface(),
        jo.Name,jo.ID))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中的viewWebInterface就是每个capa中重载了以指示查看详情的界面名:

    def viewWebInterface(self):
        return 查看详情的界面名
    
    • 1
    • 2

    兴趣点是所有兴趣点都通用的列表查询,所以上面的信息都必须从jo中获取后送入,而由于大多数兴趣点的信息都是这样的,所以jxTMS提供了一个基础性的transForInterest函数。如果无法满足可自行补充:

    # 因为关注点是通用的,所以需要为关注点的查看准备数据
    def transForInterest(self,ctx,json,jo):
        super.transForInterest(ctx,json.jo)
        json.set('affairCategory',jo.Special)
        json.set('affairState',jo.State)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    或者继承下面这两个函数就不必再重载transForInterest来设置状态和流水号了:

    def getState(self,jo):
        return jo.State
    
    def getSN(self,jo):
        return jo.Special
    
    • 1
    • 2
    • 3
    • 4
    • 5

    即默认的transForInterest函数会分别调用这两个函数为状态和流水号赋值。

    也就是说,一般的兴趣点开发,主要是用interest修饰符定义感兴趣的角色和筛选条件,然后再重载四个cpap中的成员函数就好。这四个成员函数分别用来:

    • viewWebInterface指示查看详情的界面

    • interestType返回兴趣点类型

    • getState返回数据对象状态

    • getSN返回数据对象流水号

    兴趣点的使用

    目前,在流程执行完毕时,jxTMS会缺省调用interest函数来做一次兴趣点的触发检测。用户当然也可以手动执行interest函数在需要处触发兴趣点的检测:

    self.interest(db,ctx,currentJO)
    
    • 1

    则会用当前的数据对象、本capa所指定的interestType执行兴趣点检测,如果检测成功则会分发给相应的角色。如果未指定数据对象或未重载interestType、或未定义相应interestType的兴趣点,则interest函数不做任何动作。

    回头看一下开始所描述的例子,有人可能要问:那相关的财务人员通过兴趣点看到了这个报销流程的实例,那后继该如何呢?!

    嗯,这和兴趣点没有关系,一般是给查看该流程详情界面增加一个工具条指定只能由该角色来执行,如导出流程数据到一个excel中之类。

    目前jxTMS已经开放个人注册试用,欢迎大家注册试用:

    注册到jxTMS

    下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

    如何用jxTMS开发一个功能

    下面的系列文章讲述了jxTMS的一些基本功能:

    jxTMS的HelloWorld

  • 相关阅读:
    C#:实现 Van Eck‘s sequence范·艾克序列算法(附完整源码)
    数据库实验一 数据表的创建与修改管理
    去中心化的速度:零知识证明的进步
    JVM阶段(1)-运行时数据区
    Maya v2024(3D动画制作软件)
    JVM常用排查命令
    多线程高频考点(如何解决死锁,谈谈HashMap HashTable ConcurrentHashMap的区别)
    【20221103】【每日一题】二叉搜索树中的众数
    Qt图像处理技术十二:QImage实现边缘检测(sobel算法)
    【leetcode】有效的回文
  • 原文地址:https://blog.csdn.net/jxandrew/article/details/126405529