结合业务查询-分布式

来源:互联网 发布:dubstep软件 编辑:程序博客网 时间:2024/06/18 16:50

阅读原文

场景描述

BPS工作流默认客户端界面中包括"待办任务列表"、"已办任务列表"等纯流程信息,而为了业务操作人员更全面了解任务相关的业务信息,往往需要在任务列表中显示工作任务相关的业务属性信息。

本场景适用业务表和流程表不在同一个数据源的部署模式,解决不同数据源情况下流程表和业务表联合查询的问题,基本原理是BPS引擎运行时会将业务表的数据保存到流程库的冗余表中用来实现结合业务查询。

案例简介

业务场景描述:

在报销流程中,审批人登录系统后能结合工作项和报销业务表查询到待审批的报销单信息,查询条件为报销人,如下图所示:

场景实现(关键步骤描述)

  1. 报销业务表
    ?
    create table EXPENSEINFO
    (
      EXPID          NUMERIC(18) notnull,
      PROCESSINSTID  NUMERIC(18) notnull,
      EXPNAME        VARCHAR(20) notnull,
      EXPMONEY       NUMBER notnull,
      REASON         VARCHAR(255),
      ISBUDGETITEM   CHAR(1),
      AUDITOR        VARCHAR(20)
     );
    alter table EXPENSEINFO  add constraint P_EXP primary key (EXPID);
    -- Add comments to the columns
    comment on column EXPENSEINFO.EXPID
      is'报销单编号';
    comment on column EXPENSEINFO.PROCESSINSTID
      is'流程实例ID';
    comment on column EXPENSEINFO.EXPNAME
      is'报销人';
    comment on column EXPENSEINFO.EXPMONEY
      is'报销金额';
    comment on column EXPENSEINFO.REASON
      is'报销原因';
    comment on column EXPENSEINFO.ISBUDGETITEM
      is'是否是预算内项目';
    comment on column EXPENSEINFO.AUDITOR
      is'财务审阅人';
  2. 配置映射关系WFBizMapping,流程表同业务表在不同的数据源时,需要将业务数据同步冗余到流程库中的冗余表,首先要手工配置业务表与BPS冗余表之间的字段映射,如下图所示:
  3. 插入业务数据,创建流程实例时需要输入业务数据。引擎会根据映射关系将业务数据写到WFBizInfo冗余表中,关键代码如下:
    ?
    String tableName="EXPENSEINFO";
                Map <String, Object> bizInfo =new HashMap <String, Object>();
                bizInfo.put("EXPNAME", expenseInfoForm.getExpname());
                bizInfo.put("EXPMONEY", expenseInfoForm.getExpmoney());
        mng.startProcessInstanceWithBizInfo(processInstID,false, newObject[0], tableName, bizInfo);
  4. 结合业务查询关键代码
    ?
    public List<WFWorkItem> getUserTasksbizInfo(User user,ExpenseInfoForm expenseInfoForm, PageCond pageCond)
                throwsWFServiceException {
                    List<WFWorkItem> tasklist =null;
            List<String> bizBindList =new ArrayList<String>();
            bizBindList.add(expenseInfoForm.getExpname());
                    List<String> wiBindList =new ArrayList<String>();
                    //为Expmoney这一项字段的查询设置一个条件,如:插入的Expmoney为200,则在这里分别设置199和201
                    bizBindList.add(expenseInfoForm.getExpmoney-1);
                    bizBindList.add(expenseInfoForm.getExpmoney+1);
            //获取工作列表查询器接口
                      IBPSServiceClient client = BPSServiceClientFactory. getDefaultClient();
            IWFWorklistQueryManager workListMng = client.getWorklistQueryManager();
     
            tasklist = workListMng.queryPersonWorkItemsWithBizInfo(user.getUserId(),"ALL","ALL", "EXPENSEINFO",null,
     " EXPNAME=? and EXPMONEY between ? and ?", wiBindList, bizBindList, pageCond);
            returntasklist;
        }