Commit 842cb6bd6b2ab53bedde440c68e6ee4e981189ba

Authored by YunaiV
1 parent 5efb4c26

BPM 模型重构 7:将任务分配规则,分装成前端组件

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java
@@ -16,6 +16,7 @@ public enum BpmTaskAssignRuleTypeEnum { @@ -16,6 +16,7 @@ public enum BpmTaskAssignRuleTypeEnum {
16 16
17 DEPT_MEMBER(20, "部门的成员"), // 包括负责人 17 DEPT_MEMBER(20, "部门的成员"), // 包括负责人
18 DEPT_LEADER(21, "部门的负责人"), 18 DEPT_LEADER(21, "部门的负责人"),
  19 + POST(22, "岗位"),
19 20
20 USER(30, "用户"), 21 USER(30, "用户"),
21 22
yudao-admin-ui/src/views/bpm/model/index.vue
@@ -200,61 +200,7 @@ @@ -200,61 +200,7 @@
200 </el-dialog> 200 </el-dialog>
201 201
202 <!-- ========== 流程任务分配规则 ========== --> 202 <!-- ========== 流程任务分配规则 ========== -->
203 - <!-- 列表弹窗 -->  
204 - <el-dialog title="任务分配规则" :visible.sync="taskAssignRule.listOpen" width="800px" append-to-body>  
205 - <el-table v-loading="taskAssignRule.loading" :data="taskAssignRule.list">  
206 - <el-table-column label="任务名" align="center" prop="taskDefinitionName" width="120" fixed />  
207 - <el-table-column label="任务标识" align="center" prop="taskDefinitionKey" width="120" show-tooltip-when-overflow />  
208 - <el-table-column label="规则类型" align="center" prop="type" width="120">  
209 - <template slot-scope="scope">  
210 - <span>{{ getDictDataLabel(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE, scope.row.type) }}</span>  
211 - </template>  
212 - </el-table-column>  
213 - <el-table-column label="规则范围" align="center" prop="options" width="300px">  
214 - <template slot-scope="scope">  
215 - <el-tag size="medium" v-if="scope.row.options" v-for="option in scope.row.options">  
216 - {{ getAssignRuleOptionName(scope.row.type, option) }}  
217 - </el-tag>  
218 - </template>  
219 - </el-table-column>  
220 - <el-table-column label="操作" align="center" width="80" fixed="right">  
221 - <template slot-scope="scope">  
222 - <!-- TODO 权限 -->  
223 - <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdateTaskAssignRule(scope.row)"  
224 - v-hasPermi="['bpm:model:update']">修改</el-button>  
225 - </template>  
226 - </el-table-column>  
227 - </el-table>  
228 - </el-dialog>  
229 - <!-- 添加/修改弹窗 -->  
230 - <el-dialog title="修改任务规则" :visible.sync="taskAssignRule.open" width="500px" append-to-body>  
231 - <el-form ref="taskAssignRuleForm" :model="taskAssignRule.form" :rules="taskAssignRule.rules" label-width="110px">  
232 - <el-form-item label="任务名称" prop="taskDefinitionName">  
233 - <el-input v-model="taskAssignRule.form.taskDefinitionName" disabled />  
234 - </el-form-item>  
235 - <el-form-item label="任务标识" prop="taskDefinitionKey">  
236 - <el-input v-model="taskAssignRule.form.taskDefinitionKey" disabled />  
237 - </el-form-item>  
238 - <el-form-item label="规则类型" prop="type">  
239 - <el-select v-model="taskAssignRule.form.type" clearable style="width: 100%">  
240 - <el-option v-for="dict in taskAssignRuleDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>  
241 - </el-select>  
242 - </el-form-item>  
243 - <el-form-item v-if="taskAssignRule.form.type === 10" label="指定角色" prop="roleIds">  
244 - <el-select v-model="taskAssignRule.form.roleIds" multiple clearable style="width: 100%">  
245 - <el-option v-for="item in taskAssignRule.roleOptions" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)" />  
246 - </el-select>  
247 - </el-form-item>  
248 - <el-form-item v-if="taskAssignRule.form.type === 20 || taskAssignRule.form.type === 21" label="指定部门" prop="deptIds">  
249 - <treeselect v-model="taskAssignRule.form.deptIds" :options="taskAssignRule.deptTreeOptions" multiple flat :defaultExpandLevel="3"  
250 - placeholder="请选择指定部门" :normalizer="normalizer"/>  
251 - </el-form-item>  
252 - </el-form>  
253 - <div slot="footer" class="dialog-footer">  
254 - <el-button type="primary" @click="submitAssignRuleForm">确 定</el-button>  
255 - <el-button @click="cancelAssignRuleForm">取 消</el-button>  
256 - </div>  
257 - </el-dialog> 203 + <taskAssignRuleDialog ref="taskAssignRuleDialog" />
258 </div> 204 </div>
259 </template> 205 </template>
260 206
@@ -273,9 +219,7 @@ import {getForm, getSimpleForms} from &quot;@/api/bpm/form&quot;; @@ -273,9 +219,7 @@ import {getForm, getSimpleForms} from &quot;@/api/bpm/form&quot;;
273 import {decodeFields} from "@/utils/formGenerator"; 219 import {decodeFields} from "@/utils/formGenerator";
274 import Parser from '@/components/parser/Parser' 220 import Parser from '@/components/parser/Parser'
275 import {getBaseHeader} from "@/utils/request"; 221 import {getBaseHeader} from "@/utils/request";
276 -import {createTaskAssignRule, getTaskAssignRuleList, updateTaskAssignRule} from "@/api/bpm/taskAssignRule";  
277 -import {listSimpleRoles} from "@/api/system/role";  
278 -import {listSimpleDepts} from "@/api/system/dept"; 222 +import taskAssignRuleDialog from "../taskAssignRule/taskAssignRuleDialog";
279 223
280 import Treeselect from "@riophae/vue-treeselect"; 224 import Treeselect from "@riophae/vue-treeselect";
281 import "@riophae/vue-treeselect/dist/vue-treeselect.css"; 225 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
@@ -284,7 +228,8 @@ export default { @@ -284,7 +228,8 @@ export default {
284 name: "model", 228 name: "model",
285 components: { 229 components: {
286 Parser, 230 Parser,
287 - Treeselect 231 + Treeselect,
  232 + taskAssignRuleDialog
288 }, 233 },
289 data() { 234 data() {
290 return { 235 return {
@@ -329,25 +274,6 @@ export default { @@ -329,25 +274,6 @@ export default {
329 formCustomViewPath: [{ required: true, message: "表单查看路由不能为空", trigger: "blur" }], 274 formCustomViewPath: [{ required: true, message: "表单查看路由不能为空", trigger: "blur" }],
330 }, 275 },
331 276
332 - // 任务分配规则表单  
333 - taskAssignRule: {  
334 - row: undefined, // 选中的流程模型  
335 - list: [], // 选中流程模型的任务分配规则们  
336 - listOpen: false, // 列表是否打开  
337 - loading: false, // 加载中  
338 - open: false, // 是否打开  
339 - form: {}, // 表单  
340 - rules: { // 表单校验规则  
341 - type: [{ required: true, message: "规则类型不能为空", trigger: "change" }],  
342 - roleIds: [{required: true, message: "指定角色不能为空", trigger: "change" }],  
343 - deptIds: [{required: true, message: "指定部门不能为空", trigger: "change" }],  
344 - },  
345 - // 各种下拉框  
346 - roleOptions: [],  
347 - deptOptions: [],  
348 - deptTreeOptions: [],  
349 - },  
350 -  
351 // 流程导入参数 277 // 流程导入参数
352 upload: { 278 upload: {
353 // 是否显示弹出层(用户导入) 279 // 是否显示弹出层(用户导入)
@@ -600,125 +526,10 @@ export default { @@ -600,125 +526,10 @@ export default {
600 this.$refs.upload.submit(); 526 this.$refs.upload.submit();
601 }) 527 })
602 }, 528 },
603 - // ========== ==========  
604 - doGetTaskAssignRuleList() {  
605 - this.taskAssignRule.loading = true;  
606 - getTaskAssignRuleList({  
607 - modelId: this.taskAssignRule.row.id  
608 - }).then(response => {  
609 - this.taskAssignRule.loading = false;  
610 - this.taskAssignRule.list = response.data;  
611 - })  
612 - },  
613 /** 处理任务分配规则列表的按钮操作 */ 529 /** 处理任务分配规则列表的按钮操作 */
614 handleAssignRule(row) { 530 handleAssignRule(row) {
615 - this.taskAssignRule.row = row;  
616 - this.taskAssignRule.listOpen = true;  
617 - this.doGetTaskAssignRuleList();  
618 - // 获得角色列表  
619 - this.taskAssignRule.roleOptions = [];  
620 - listSimpleRoles().then(response => {  
621 - this.taskAssignRule.roleOptions.push(...response.data);  
622 - });  
623 - // 获得部门列表  
624 - this.taskAssignRule.deptOptions = [];  
625 - this.taskAssignRule.deptTreeOptions = [];  
626 - listSimpleDepts().then(response => {  
627 - // 处理 roleOptions 参数  
628 - this.taskAssignRule.deptOptions.push(...response.data);  
629 - this.taskAssignRule.deptTreeOptions.push(...this.handleTree(response.data, "id"));  
630 - });  
631 - },  
632 - /** 处理修改任务分配规则的按钮操作 */  
633 - handleUpdateTaskAssignRule(row) {  
634 - // 先重置标识  
635 - this.resetAssignRuleForm();  
636 - // 设置表单  
637 - this.taskAssignRule.form = {  
638 - ...row,  
639 - options: [],  
640 - roleIds: [],  
641 - deptIds: [],  
642 - };  
643 - // 将 options 赋值到对应的 roleIds 等选项  
644 - if (row.type === 10) {  
645 - this.taskAssignRule.form.roleIds.push(...row.options);  
646 - } else if (row.type === 20 || row.type === 21) {  
647 - this.taskAssignRule.form.deptIds.push(...row.options);  
648 - }  
649 - this.taskAssignRule.open = true;  
650 - },  
651 - /** 提交任务分配规则的表单 */  
652 - submitAssignRuleForm() {  
653 - this.$refs["taskAssignRuleForm"].validate(valid => {  
654 - if (valid) {  
655 - // 构建表单  
656 - let form = {  
657 - ...this.taskAssignRule.form,  
658 - taskDefinitionName: undefined,  
659 - };  
660 - // 将 roleIds 等选项赋值到 options 中  
661 - if (form.type === 10) {  
662 - form.options = form.roleIds;  
663 - } else if (form.type === 20 || form.type === 21) {  
664 - form.options = form.deptIds;  
665 - }  
666 - form.roleIds = undefined;  
667 - form.deptIds = undefined;  
668 - // 新增  
669 - if (!form.id) {  
670 - form.modelId = this.taskAssignRule.row.id // 模型编号  
671 - createTaskAssignRule(form).then(response => {  
672 - this.msgSuccess("修改成功");  
673 - this.taskAssignRule.open = false;  
674 - this.doGetTaskAssignRuleList();  
675 - });  
676 - // 修改  
677 - } else {  
678 - form.taskDefinitionKey = undefined; // 无法修改  
679 - updateTaskAssignRule(form).then(response => {  
680 - this.msgSuccess("修改成功");  
681 - this.taskAssignRule.open = false;  
682 - this.doGetTaskAssignRuleList();  
683 - });  
684 - }  
685 - }  
686 - });  
687 - },  
688 - /** 取消任务分配规则的表单 */  
689 - cancelAssignRuleForm() {  
690 - this.taskAssignRule.open = false;  
691 - this.resetAssignRuleForm();  
692 - },  
693 - /** 表单重置 */  
694 - resetAssignRuleForm() {  
695 - this.taskAssignRule.form = {};  
696 - this.resetForm("taskAssignRuleForm"); 531 + this.$refs['taskAssignRuleDialog'].initModel(row.id);
697 }, 532 },
698 - getAssignRuleOptionName(type, option) {  
699 - if (type === 10) {  
700 - for (const roleOption of this.taskAssignRule.roleOptions) {  
701 - if (roleOption.id === option) {  
702 - return roleOption.name;  
703 - }  
704 - }  
705 - } else if (type === 20 || type === 21) {  
706 - for (const deptOption of this.taskAssignRule.deptOptions) {  
707 - if (deptOption.id === option) {  
708 - return deptOption.name;  
709 - }  
710 - }  
711 - }  
712 - return '未知(' + option + ')';  
713 - },  
714 - // 格式化部门的下拉框  
715 - normalizer(node) {  
716 - return {  
717 - id: node.id,  
718 - label: node.name,  
719 - children: node.children  
720 - }  
721 - }  
722 } 533 }
723 }; 534 };
724 </script> 535 </script>
yudao-admin-ui/src/views/bpm/taskAssignRule/taskAssignRuleDialog.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <!-- 列表弹窗 -->
  4 + <el-dialog title="任务分配规则" :visible.sync="visible" width="800px" append-to-body>
  5 + <el-table v-loading="loading" :data="list">
  6 + <el-table-column label="任务名" align="center" prop="taskDefinitionName" width="120" fixed />
  7 + <el-table-column label="任务标识" align="center" prop="taskDefinitionKey" width="120" show-tooltip-when-overflow />
  8 + <el-table-column label="规则类型" align="center" prop="type" width="120">
  9 + <template slot-scope="scope">
  10 + <span>{{ getDictDataLabel(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE, scope.row.type) }}</span>
  11 + </template>
  12 + </el-table-column>
  13 + <el-table-column label="规则范围" align="center" prop="options" width="300px">
  14 + <template slot-scope="scope">
  15 + <el-tag size="medium" v-if="scope.row.options" v-for="option in scope.row.options">
  16 + {{ getAssignRuleOptionName(scope.row.type, option) }}
  17 + </el-tag>
  18 + </template>
  19 + </el-table-column>
  20 + <el-table-column label="操作" align="center" width="80" fixed="right">
  21 + <template slot-scope="scope">
  22 + <!-- TODO 权限 -->
  23 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdateTaskAssignRule(scope.row)"
  24 + v-hasPermi="['bpm:model:update']">修改</el-button>
  25 + </template>
  26 + </el-table-column>
  27 + </el-table>
  28 + </el-dialog>
  29 + <!-- 添加/修改弹窗 -->
  30 + <el-dialog title="修改任务规则" :visible.sync="open" width="500px" append-to-body>
  31 + <el-form ref="taskAssignRuleForm" :model="form" :rules="rules" label-width="110px">
  32 + <el-form-item label="任务名称" prop="taskDefinitionName">
  33 + <el-input v-model="form.taskDefinitionName" disabled />
  34 + </el-form-item>
  35 + <el-form-item label="任务标识" prop="taskDefinitionKey">
  36 + <el-input v-model="form.taskDefinitionKey" disabled />
  37 + </el-form-item>
  38 + <el-form-item label="规则类型" prop="type">
  39 + <el-select v-model="form.type" clearable style="width: 100%">
  40 + <el-option v-for="dict in taskAssignRuleDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
  41 + </el-select>
  42 + </el-form-item>
  43 + <el-form-item v-if="form.type === 10" label="指定角色" prop="roleIds">
  44 + <el-select v-model="form.roleIds" multiple clearable style="width: 100%">
  45 + <el-option v-for="item in roleOptions" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)" />
  46 + </el-select>
  47 + </el-form-item>
  48 + <el-form-item v-if="form.type === 20 || form.type === 21" label="指定部门" prop="deptIds">
  49 + <treeselect v-model="form.deptIds" :options="deptTreeOptions" multiple flat :defaultExpandLevel="3"
  50 + placeholder="请选择指定部门" :normalizer="normalizer"/>
  51 + </el-form-item>
  52 + </el-form>
  53 + <div slot="footer" class="dialog-footer">
  54 + <el-button type="primary" @click="submitAssignRuleForm">确 定</el-button>
  55 + <el-button @click="cancelAssignRuleForm">取 消</el-button>
  56 + </div>
  57 + </el-dialog>
  58 + </div>
  59 +</template>
  60 +
  61 +<script>
  62 +import {DICT_TYPE, getDictDatas} from "@/utils/dict";
  63 +import {createTaskAssignRule, getTaskAssignRuleList, updateTaskAssignRule} from "@/api/bpm/taskAssignRule";
  64 +import {listSimpleRoles} from "@/api/system/role";
  65 +import {listSimpleDepts} from "@/api/system/dept";
  66 +
  67 +import Treeselect from "@riophae/vue-treeselect";
  68 +import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  69 +
  70 +export default {
  71 + name: "taskAssignRuleDialog",
  72 + components: {
  73 + Treeselect
  74 + },
  75 + data() {
  76 + return {
  77 + // 如下参数,可传递
  78 + modelId: undefined, // 流程模型的编号。如果 modelId 非空,则用于流程模型的查看与配置
  79 + processDefinitionId: undefined, // 流程定义的编号。如果 processDefinitionId 非空,则用于流程定义的查看,不支持配置
  80 + visible: false,
  81 +
  82 + // 任务分配规则表单
  83 + row: undefined, // 选中的流程模型
  84 + list: [], // 选中流程模型的任务分配规则们
  85 + loading: false, // 加载中
  86 + open: false, // 是否打开
  87 + form: {}, // 表单
  88 + rules: { // 表单校验规则
  89 + type: [{ required: true, message: "规则类型不能为空", trigger: "change" }],
  90 + roleIds: [{required: true, message: "指定角色不能为空", trigger: "change" }],
  91 + deptIds: [{required: true, message: "指定部门不能为空", trigger: "change" }],
  92 + },
  93 +
  94 + // 各种下拉框
  95 + roleOptions: [],
  96 + deptOptions: [],
  97 + deptTreeOptions: [],
  98 +
  99 + // 数据字典
  100 + modelFormTypeDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_FORM_TYPE),
  101 + taskAssignRuleDictDatas: getDictDatas(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE),
  102 + };
  103 + },
  104 + methods: {
  105 + initModel(modelId) {
  106 + this.modelId = modelId;
  107 + this.processDefinitionId = undefined;
  108 +
  109 + // 初始化所有下拉框
  110 + this.init0();
  111 + },
  112 + initProcessDefinition(processDefinitionId) {
  113 + this.modelId = undefined;
  114 + this.processDefinitionId = processDefinitionId;
  115 +
  116 + // 初始化所有下拉框
  117 + this.init0();
  118 + },
  119 + /** 初始化 */
  120 + init0() {
  121 + // 设置可见
  122 + this.visible = true;
  123 + // 获得列表
  124 + this.getList();
  125 +
  126 + // 获得角色列表
  127 + this.roleOptions = [];
  128 + listSimpleRoles().then(response => {
  129 + this.roleOptions.push(...response.data);
  130 + });
  131 + // 获得部门列表
  132 + this.deptOptions = [];
  133 + this.deptTreeOptions = [];
  134 + listSimpleDepts().then(response => {
  135 + // 处理 roleOptions 参数
  136 + this.deptOptions.push(...response.data);
  137 + this.deptTreeOptions.push(...this.handleTree(response.data, "id"));
  138 + });
  139 + },
  140 + /** 获得任务分配规则列表 */
  141 + getList() {
  142 + this.loading = true;
  143 + getTaskAssignRuleList({
  144 + modelId: this.modelId,
  145 + }).then(response => {
  146 + this.loading = false;
  147 + this.list = response.data;
  148 + })
  149 + },
  150 + /** 处理修改任务分配规则的按钮操作 */
  151 + handleUpdateTaskAssignRule(row) {
  152 + // 先重置标识
  153 + this.resetAssignRuleForm();
  154 + // 设置表单
  155 + this.form = {
  156 + ...row,
  157 + options: [],
  158 + roleIds: [],
  159 + deptIds: [],
  160 + };
  161 + // 将 options 赋值到对应的 roleIds 等选项
  162 + if (row.type === 10) {
  163 + this.form.roleIds.push(...row.options);
  164 + } else if (row.type === 20 || row.type === 21) {
  165 + this.form.deptIds.push(...row.options);
  166 + }
  167 + this.open = true;
  168 + },
  169 + /** 提交任务分配规则的表单 */
  170 + submitAssignRuleForm() {
  171 + this.$refs["taskAssignRuleForm"].validate(valid => {
  172 + if (valid) {
  173 + // 构建表单
  174 + let form = {
  175 + ...this.form,
  176 + taskDefinitionName: undefined,
  177 + };
  178 + // 将 roleIds 等选项赋值到 options 中
  179 + if (form.type === 10) {
  180 + form.options = form.roleIds;
  181 + } else if (form.type === 20 || form.type === 21) {
  182 + form.options = form.deptIds;
  183 + }
  184 + form.roleIds = undefined;
  185 + form.deptIds = undefined;
  186 + // 新增
  187 + if (!form.id) {
  188 + form.modelId = this.modelId; // 模型编号
  189 + createTaskAssignRule(form).then(response => {
  190 + this.msgSuccess("修改成功");
  191 + this.open = false;
  192 + this.getList();
  193 + });
  194 + // 修改
  195 + } else {
  196 + form.taskDefinitionKey = undefined; // 无法修改
  197 + updateTaskAssignRule(form).then(response => {
  198 + this.msgSuccess("修改成功");
  199 + this.open = false;
  200 + this.getList();
  201 + });
  202 + }
  203 + }
  204 + });
  205 + },
  206 + /** 取消任务分配规则的表单 */
  207 + cancelAssignRuleForm() {
  208 + this.open = false;
  209 + this.resetAssignRuleForm();
  210 + },
  211 + /** 表单重置 */
  212 + resetAssignRuleForm() {
  213 + this.form = {};
  214 + this.resetForm("taskAssignRuleForm");
  215 + },
  216 + getAssignRuleOptionName(type, option) {
  217 + if (type === 10) {
  218 + for (const roleOption of this.roleOptions) {
  219 + if (roleOption.id === option) {
  220 + return roleOption.name;
  221 + }
  222 + }
  223 + } else if (type === 20 || type === 21) {
  224 + for (const deptOption of this.deptOptions) {
  225 + if (deptOption.id === option) {
  226 + return deptOption.name;
  227 + }
  228 + }
  229 + }
  230 + return '未知(' + option + ')';
  231 + },
  232 + // 格式化部门的下拉框
  233 + normalizer(node) {
  234 + return {
  235 + id: node.id,
  236 + label: node.name,
  237 + children: node.children
  238 + }
  239 + }
  240 + }
  241 +};
  242 +</script>