1.概述
在平台中,比较重要的一点是人员计算,需要根据配置的逻辑去找人。在平台中提供了一些默认的人员计算策略,通过这些策略基本上都可以满足客户的需求。因为平台提供了计算脚本一类的策略。实在复杂的话可以通过编写脚本来实现。
这个也是看实施情况,有些情况业务上一些固定的逻辑是可以通过界面做配置的,客户也不想使用代码实现,这个时候就需要我们开发自定义的策略。
2. 实现策略方法
平台中定义了一个接口,我们可以实现接口,然后在前端配置界面进行配置,实现用户特定的策略需求。
2.1 接口定义
package com.redxun.bpm.activiti.user;import com.redxun.bpm.activiti.config.UserConfig;import com.redxun.dto.bpm.TaskExecutor;import java.util.Collection;import java.util.Map;/*** 流程人员计算策略接口。* @author csx*/public interface ITaskExecutorCalc {ExecutorType getType();/*** 计算用的执行人接口* @param userConfig 当前节点的人员配置* @param vars 流程变量* @return*/Collection<TaskExecutor> getExecutors(UserConfig userConfig, Map<String,Object> vars);}
2.2 接口实现(以用户为例)
@Componentpublic class UserExecutorCalc implements ITaskExecutorCalc {@ResourceIOrgService orgService;@Overridepublic ExecutorType getType() {return new ExecutorType("user","用户",1);}@Overridepublic Collection<TaskExecutor> getExecutors(UserConfig userConfig, Map<String, Object> vars) {Set<TaskExecutor> taskExecutors=new LinkedHashSet<>();String userIds=userConfig.getConfig();if(StringUtils.isEmpty(userIds)){return taskExecutors;}List<OsUserDto> userDtoList = orgService.getUsersByIds(userIds);for(OsUserDto osUser:userDtoList){TaskExecutor userExecutor= TaskExecutor.getUser(osUser.getUserId(),osUser.getFullName(),osUser.getAccount());taskExecutors.add(userExecutor);}return taskExecutors;}}
这里使用 UserConfig 存放用户配置。
2.3 前端实现
在实现接口后,我们可以在前端做相关配置。
对于每一个策略我们需要开发一个对应的组件。组件的命名方式
策略类型 + Edit。
需要配置到:
src/components/bpmn/customModle/userConfig/js/calConfig.js
import starterEdit from "../view/starterEdit";import userEdit from "../view/userEdit";export default {components:{starterEdit,userEdit,}}
我们以 userEdit为例。
<component ref="compomentsValid"v-model="record":processAttr="processAttr":nodeAttr="nodeAttr":nodeProps="nodeProps"@changeRecord="changeRecordValue":is="record.currentComponet"></component>
其中 recod 就是一个用户配置对象。在后台对应的 的 java类为:
com.redxun.bpm.activiti.config.UserConfig
public class UserConfig implements Serializable {public final static String CALC_NOT="no";public final static String CALC_YES="yes";public final static String CALC_DELAY="delay";public final static String LOGIC_NOT="no";public final static String LOGIC_AND="and";public final static String LOGIC_OR="or";//策略类型private String type;//配置private String config;//配置显示private String display="";//计算类型 计算,不计算,延迟private String calcType="";// 并,交集,排除private String logic="";}
userEdit 代码
<template><div><rx-user-component :single="false" v-model="localData"></rx-user-component></div></template><script>import {RxDialog, Dialog,RxUserComponent} from 'jpaas-common-lib';export default {name: "user-edit",components: {RxDialog,Dialog,RxUserComponent},props: {value: {type: Object,default: {}},index: {type: Number,default: 0}},data() {return {//[{id:"",name:""}]localData:[]};},created() {if(this.value.config){var ids=this.value.config.split(",");var names=this.value.display.split(",");for(var i=0;i<ids.length;i++){var obj={id:ids[i],name:names[i]};this.localData.push(obj);}}},methods: {changUpdataRecord(){this.$emit('update:value', this.value);},},watch: {localData:function(val){var ids=[];var names=[];for(var i=0;i<val.length;i++){ids.push(val[i].id);names.push(val[i].name);}this.value.config=ids.join(",");this.value.display=names.join(",");this.changUpdataRecord();}},}</script><style scoped>.ant-table-row-indent {float: left;width: 50px;}</style>
文档更新时间: 2022-01-20 14:53 作者:zyg