taskAssignRuleDialog.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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 v-slot="scope">
  10. <dict-tag :type="DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE" :value="scope.row.type" />
  11. </template>
  12. </el-table-column>
  13. <el-table-column label="规则范围" align="center" prop="options" width="440px">
  14. <template v-slot="scope">
  15. <el-tag size="medium" v-if="scope.row.options" :key="option" 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 v-if="modelId" label="操作" align="center" width="80" fixed="right">
  21. <template v-slot="scope">
  22. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdateTaskAssignRule(scope.row)"
  23. v-hasPermi="['bpm:task-assign-rule:update']">修改</el-button>
  24. </template>
  25. </el-table-column>
  26. </el-table>
  27. </el-dialog>
  28. <!-- 添加/修改弹窗 -->
  29. <el-dialog title="修改任务规则" :visible.sync="open" width="500px" append-to-body>
  30. <el-form ref="taskAssignRuleForm" :model="form" :rules="rules" label-width="110px">
  31. <el-form-item label="任务名称" prop="taskDefinitionName">
  32. <el-input v-model="form.taskDefinitionName" disabled />
  33. </el-form-item>
  34. <el-form-item label="任务标识" prop="taskDefinitionKey">
  35. <el-input v-model="form.taskDefinitionKey" disabled />
  36. </el-form-item>
  37. <el-form-item label="规则类型" prop="type">
  38. <el-select v-model="form.type" clearable style="width: 100%">
  39. <el-option v-for="dict in taskAssignRuleTypeDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item v-if="form.type === 10" label="指定角色" prop="roleIds">
  43. <el-select v-model="form.roleIds" multiple clearable style="width: 100%">
  44. <el-option v-for="item in roleOptions" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)" />
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item v-if="form.type === 20 || form.type === 21" label="指定部门" prop="deptIds">
  48. <treeselect v-model="form.deptIds" :options="deptTreeOptions" multiple flat :defaultExpandLevel="3"
  49. placeholder="请选择指定部门" :normalizer="normalizer"/>
  50. </el-form-item>
  51. <el-form-item v-if="form.type === 22" label="指定岗位" prop="postIds">
  52. <el-select v-model="form.postIds" multiple clearable style="width: 100%">
  53. <el-option v-for="item in postOptions" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)" />
  54. </el-select>
  55. </el-form-item>
  56. <el-form-item v-if="form.type === 30 || form.type === 31 || form.type === 32" label="指定用户" prop="userIds">
  57. <el-select v-model="form.userIds" multiple clearable style="width: 100%">
  58. <el-option v-for="item in userOptions" :key="parseInt(item.id)" :label="item.nickname" :value="parseInt(item.id)" />
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item v-if="form.type === 40" label="指定用户组" prop="userGroupIds">
  62. <el-select v-model="form.userGroupIds" multiple clearable style="width: 100%">
  63. <el-option v-for="item in userGroupOptions" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)" />
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item v-if="form.type === 50" label="指定脚本" prop="scripts">
  67. <el-select v-model="form.scripts" multiple clearable style="width: 100%">
  68. <el-option v-for="dict in taskAssignScriptDictDatas" :key="parseInt(dict.value)"
  69. :label="dict.label" :value="parseInt(dict.value)"/>
  70. </el-select>
  71. </el-form-item>
  72. </el-form>
  73. <div slot="footer" class="dialog-footer">
  74. <el-button type="primary" @click="submitAssignRuleForm">确 定</el-button>
  75. <el-button @click="cancelAssignRuleForm">取 消</el-button>
  76. </div>
  77. </el-dialog>
  78. </div>
  79. </template>
  80. <script>
  81. import {DICT_TYPE, getDictDatas} from "@/utils/dict";
  82. import {createTaskAssignRule, getTaskAssignRuleList, updateTaskAssignRule} from "@/api/bpm/taskAssignRule";
  83. import {listSimpleRoles} from "@/api/system/role";
  84. import {listSimpleDepts} from "@/api/system/dept";
  85. import Treeselect from "@riophae/vue-treeselect";
  86. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  87. import {listSimplePosts} from "@/api/system/post";
  88. import {listSimpleUsers} from "@/api/system/user";
  89. import {listSimpleUserGroups} from "@/api/bpm/userGroup";
  90. export default {
  91. name: "BpmTaskAssignRule",
  92. components: {
  93. Treeselect
  94. },
  95. data() {
  96. return {
  97. // 如下参数,可传递
  98. modelId: undefined, // 流程模型的编号。如果 modelId 非空,则用于流程模型的查看与配置
  99. processDefinitionId: undefined, // 流程定义的编号。如果 processDefinitionId 非空,则用于流程定义的查看,不支持配置
  100. visible: false,
  101. // 任务分配规则表单
  102. row: undefined, // 选中的流程模型
  103. list: [], // 选中流程模型的任务分配规则们
  104. loading: false, // 加载中
  105. open: false, // 是否打开
  106. form: {}, // 表单
  107. rules: { // 表单校验规则
  108. type: [{ required: true, message: "规则类型不能为空", trigger: "change" }],
  109. roleIds: [{required: true, message: "指定角色不能为空", trigger: "change" }],
  110. deptIds: [{required: true, message: "指定部门不能为空", trigger: "change" }],
  111. postIds: [{required: true, message: "指定岗位不能为空", trigger: "change"}],
  112. userIds: [{required: true, message: "指定用户不能为空", trigger: "change"}],
  113. userGroupIds: [{required: true, message: "指定用户组不能为空", trigger: "change"}],
  114. scripts: [{required: true, message: "指定脚本不能为空", trigger: "change"}],
  115. },
  116. // 各种下拉框
  117. roleOptions: [],
  118. deptOptions: [],
  119. deptTreeOptions: [],
  120. postOptions: [],
  121. userOptions: [],
  122. userGroupOptions: [],
  123. // 数据字典
  124. modelFormTypeDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_FORM_TYPE),
  125. taskAssignRuleTypeDictDatas: getDictDatas(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE),
  126. taskAssignScriptDictDatas: getDictDatas(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT),
  127. };
  128. },
  129. methods: {
  130. initModel(modelId) {
  131. this.modelId = modelId;
  132. this.processDefinitionId = undefined;
  133. // 初始化所有下拉框
  134. this.init0();
  135. },
  136. initProcessDefinition(processDefinitionId) {
  137. this.modelId = undefined;
  138. this.processDefinitionId = processDefinitionId;
  139. // 初始化所有下拉框
  140. this.init0();
  141. },
  142. /** 初始化 */
  143. init0() {
  144. // 设置可见
  145. this.visible = true;
  146. // 获得列表
  147. this.getList();
  148. // 获得角色列表
  149. this.roleOptions = [];
  150. listSimpleRoles().then(response => {
  151. this.roleOptions.push(...response.data);
  152. });
  153. // 获得部门列表
  154. this.deptOptions = [];
  155. this.deptTreeOptions = [];
  156. listSimpleDepts().then(response => {
  157. this.deptOptions.push(...response.data);
  158. this.deptTreeOptions.push(...this.handleTree(response.data, "id"));
  159. });
  160. // 获得岗位列表
  161. this.postOptions = [];
  162. listSimplePosts().then(response => {
  163. this.postOptions.push(...response.data);
  164. });
  165. // 获得用户列表
  166. this.userOptions = [];
  167. listSimpleUsers().then(response => {
  168. this.userOptions.push(...response.data);
  169. });
  170. // 获得用户组列表
  171. this.userGroupOptions = [];
  172. listSimpleUserGroups().then(response => {
  173. this.userGroupOptions.push(...response.data);
  174. });
  175. },
  176. /** 获得任务分配规则列表 */
  177. getList() {
  178. this.loading = true;
  179. getTaskAssignRuleList({
  180. modelId: this.modelId,
  181. processDefinitionId: this.processDefinitionId,
  182. }).then(response => {
  183. this.loading = false;
  184. this.list = response.data;
  185. })
  186. },
  187. /** 处理修改任务分配规则的按钮操作 */
  188. handleUpdateTaskAssignRule(row) {
  189. // 先重置标识
  190. this.resetAssignRuleForm();
  191. // 设置表单
  192. this.form = {
  193. ...row,
  194. options: [],
  195. roleIds: [],
  196. deptIds: [],
  197. postIds: [],
  198. userIds: [],
  199. userGroupIds: [],
  200. scripts: [],
  201. };
  202. // 将 options 赋值到对应的 roleIds 等选项
  203. if (row.type === 10) {
  204. this.form.roleIds.push(...row.options);
  205. } else if (row.type === 20 || row.type === 21) {
  206. this.form.deptIds.push(...row.options);
  207. } else if (row.type === 22) {
  208. this.form.postIds.push(...row.options);
  209. } else if (row.type === 30 || row.type === 31 || row.type === 32) {
  210. this.form.userIds.push(...row.options);
  211. } else if (row.type === 40) {
  212. this.form.userGroupIds.push(...row.options);
  213. } else if (row.type === 50) {
  214. this.form.scripts.push(...row.options);
  215. }
  216. this.open = true;
  217. },
  218. /** 提交任务分配规则的表单 */
  219. submitAssignRuleForm() {
  220. this.$refs["taskAssignRuleForm"].validate(valid => {
  221. if (valid) {
  222. // 构建表单
  223. let form = {
  224. ...this.form,
  225. taskDefinitionName: undefined,
  226. };
  227. // 将 roleIds 等选项赋值到 options 中
  228. if (form.type === 10) {
  229. form.options = form.roleIds;
  230. } else if (form.type === 20 || form.type === 21) {
  231. form.options = form.deptIds;
  232. } else if (form.type === 22) {
  233. form.options = form.postIds;
  234. } else if (form.type === 30 || form.type === 31 || form.type === 32) {
  235. form.options = form.userIds;
  236. } else if (form.type === 40) {
  237. form.options = form.userGroupIds;
  238. } else if (form.type === 50) {
  239. form.options = form.scripts;
  240. }
  241. form.roleIds = undefined;
  242. form.deptIds = undefined;
  243. form.postIds = undefined;
  244. form.userIds = undefined;
  245. form.userGroupIds = undefined;
  246. form.scripts = undefined;
  247. // 新增
  248. if (!form.id) {
  249. form.modelId = this.modelId; // 模型编号
  250. createTaskAssignRule(form).then(response => {
  251. this.$modal.msgSuccess("修改成功");
  252. this.open = false;
  253. this.getList();
  254. });
  255. // 修改
  256. } else {
  257. form.taskDefinitionKey = undefined; // 无法修改
  258. updateTaskAssignRule(form).then(response => {
  259. this.$modal.msgSuccess("修改成功");
  260. this.open = false;
  261. this.getList();
  262. });
  263. }
  264. }
  265. });
  266. },
  267. /** 取消任务分配规则的表单 */
  268. cancelAssignRuleForm() {
  269. this.open = false;
  270. this.resetAssignRuleForm();
  271. },
  272. /** 表单重置 */
  273. resetAssignRuleForm() {
  274. this.form = {};
  275. this.resetForm("taskAssignRuleForm");
  276. },
  277. getAssignRuleOptionName(type, option) {
  278. if (type === 10) {
  279. for (const roleOption of this.roleOptions) {
  280. if (roleOption.id === option) {
  281. return roleOption.name;
  282. }
  283. }
  284. } else if (type === 20 || type === 21) {
  285. for (const deptOption of this.deptOptions) {
  286. if (deptOption.id === option) {
  287. return deptOption.name;
  288. }
  289. }
  290. } else if (type === 22) {
  291. for (const postOption of this.postOptions) {
  292. if (postOption.id === option) {
  293. return postOption.name;
  294. }
  295. }
  296. } else if (type === 30 || type === 31 || type === 32) {
  297. for (const userOption of this.userOptions) {
  298. if (userOption.id === option) {
  299. return userOption.nickname;
  300. }
  301. }
  302. } else if (type === 40) {
  303. for (const userGroupOption of this.userGroupOptions) {
  304. if (userGroupOption.id === option) {
  305. return userGroupOption.name;
  306. }
  307. }
  308. } else if (type === 50) {
  309. option = option + ''; // 转换成 string
  310. for (const dictData of this.taskAssignScriptDictDatas) {
  311. if (dictData.value === option) {
  312. return dictData.label;
  313. }
  314. }
  315. }
  316. return '未知(' + option + ')';
  317. },
  318. // 格式化部门的下拉框
  319. normalizer(node) {
  320. return {
  321. id: node.id,
  322. label: node.name,
  323. children: node.children
  324. }
  325. }
  326. }
  327. };
  328. </script>