1.概述

在平台中,比较重要的一点是人员计算,需要根据配置的逻辑去找人。在平台中提供了一些默认的人员计算策略,通过这些策略基本上都可以满足客户的需求。因为平台提供了计算脚本一类的策略。实在复杂的话可以通过编写脚本来实现。

这个也是看实施情况,有些情况业务上一些固定的逻辑是可以通过界面做配置的,客户也不想使用代码实现,这个时候就需要我们开发自定义的策略。

2. 实现策略方法

平台中定义了一个接口,我们可以实现接口,然后在前端配置界面进行配置,实现用户特定的策略需求。

2.1 接口定义

  1. package com.redxun.bpm.activiti.user;
  2. import com.redxun.bpm.activiti.config.UserConfig;
  3. import com.redxun.dto.bpm.TaskExecutor;
  4. import java.util.Collection;
  5. import java.util.Map;
  6. /**
  7. * 流程人员计算策略接口。
  8. * @author csx
  9. */
  10. public interface ITaskExecutorCalc {
  11. ExecutorType getType();
  12. /**
  13. * 计算用的执行人接口
  14. * @param userConfig 当前节点的人员配置
  15. * @param vars 流程变量
  16. * @return
  17. */
  18. Collection<TaskExecutor> getExecutors(UserConfig userConfig, Map<String,Object> vars);
  19. }

2.2 接口实现(以用户为例)

  1. @Component
  2. public class UserExecutorCalc implements ITaskExecutorCalc {
  3. @Resource
  4. IOrgService orgService;
  5. @Override
  6. public ExecutorType getType() {
  7. return new ExecutorType("user","用户",1);
  8. }
  9. @Override
  10. public Collection<TaskExecutor> getExecutors(UserConfig userConfig, Map<String, Object> vars) {
  11. Set<TaskExecutor> taskExecutors=new LinkedHashSet<>();
  12. String userIds=userConfig.getConfig();
  13. if(StringUtils.isEmpty(userIds)){
  14. return taskExecutors;
  15. }
  16. List<OsUserDto> userDtoList = orgService.getUsersByIds(userIds);
  17. for(OsUserDto osUser:userDtoList){
  18. TaskExecutor userExecutor= TaskExecutor.getUser(osUser.getUserId(),osUser.getFullName(),osUser.getAccount());
  19. taskExecutors.add(userExecutor);
  20. }
  21. return taskExecutors;
  22. }
  23. }

这里使用 UserConfig 存放用户配置。

2.3 前端实现

在实现接口后,我们可以在前端做相关配置。

对于每一个策略我们需要开发一个对应的组件。组件的命名方式

策略类型 + Edit。

需要配置到:

src/components/bpmn/customModle/userConfig/js/calConfig.js

  1. import starterEdit from "../view/starterEdit";
  2. import userEdit from "../view/userEdit";
  3. export default {
  4. components:{
  5. starterEdit,
  6. userEdit,
  7. }
  8. }

我们以 userEdit为例。

  1. <component ref="compomentsValid"
  2. v-model="record"
  3. :processAttr="processAttr"
  4. :nodeAttr="nodeAttr"
  5. :nodeProps="nodeProps"
  6. @changeRecord="changeRecordValue"
  7. :is="record.currentComponet">
  8. </component>

其中 recod 就是一个用户配置对象。在后台对应的 的 java类为:

com.redxun.bpm.activiti.config.UserConfig

  1. public class UserConfig implements Serializable {
  2. public final static String CALC_NOT="no";
  3. public final static String CALC_YES="yes";
  4. public final static String CALC_DELAY="delay";
  5. public final static String LOGIC_NOT="no";
  6. public final static String LOGIC_AND="and";
  7. public final static String LOGIC_OR="or";
  8. //策略类型
  9. private String type;
  10. //配置
  11. private String config;
  12. //配置显示
  13. private String display="";
  14. //计算类型 计算,不计算,延迟
  15. private String calcType="";
  16. // 并,交集,排除
  17. private String logic="";
  18. }

userEdit 代码

  1. <template>
  2. <div>
  3. <rx-user-component :single="false" v-model="localData"></rx-user-component>
  4. </div>
  5. </template>
  6. <script>
  7. import {RxDialog, Dialog,RxUserComponent} from 'jpaas-common-lib';
  8. export default {
  9. name: "user-edit",
  10. components: {
  11. RxDialog,
  12. Dialog,
  13. RxUserComponent
  14. },
  15. props: {
  16. value: {
  17. type: Object,
  18. default: {}
  19. },
  20. index: {
  21. type: Number,
  22. default: 0
  23. }
  24. },
  25. data() {
  26. return {
  27. //[{id:"",name:""}]
  28. localData:[]
  29. };
  30. },
  31. created() {
  32. if(this.value.config){
  33. var ids=this.value.config.split(",");
  34. var names=this.value.display.split(",");
  35. for(var i=0;i<ids.length;i++){
  36. var obj={
  37. id:ids[i],
  38. name:names[i]
  39. };
  40. this.localData.push(obj);
  41. }
  42. }
  43. },
  44. methods: {
  45. changUpdataRecord(){
  46. this.$emit('update:value', this.value);
  47. },
  48. },
  49. watch: {
  50. localData:function(val){
  51. var ids=[];
  52. var names=[];
  53. for(var i=0;i<val.length;i++){
  54. ids.push(val[i].id);
  55. names.push(val[i].name);
  56. }
  57. this.value.config=ids.join(",");
  58. this.value.display=names.join(",");
  59. this.changUpdataRecord();
  60. }
  61. },
  62. }
  63. </script>
  64. <style scoped>
  65. .ant-table-row-indent {
  66. float: left;
  67. width: 50px;
  68. }
  69. </style>
文档更新时间: 2022-01-20 14:53   作者:zyg