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 接口实现(以用户为例)
@Component
public class UserExecutorCalc implements ITaskExecutorCalc {
@Resource
IOrgService orgService;
@Override
public ExecutorType getType() {
return new ExecutorType("user","用户",1);
}
@Override
public 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