index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. <template>
  2. <ContentWrap>
  3. <!-- 列表 -->
  4. <XTable @register="registerTable">
  5. <template #options_default="{ row }">
  6. <el-tag :key="option" v-for="option in row.options">
  7. {{ getAssignRuleOptionName(row.type, option) }}
  8. </el-tag>
  9. </template>
  10. <!-- 操作 -->
  11. <template #actionbtns_default="{ row }" v-if="modelId">
  12. <vxe-button
  13. type="text"
  14. status="primary"
  15. content="修改"
  16. icon="vxe-icon-edit"
  17. @click="handleUpdate(row)"
  18. />
  19. </template>
  20. </XTable>
  21. <!-- 添加/修改弹窗 -->
  22. <XModal v-model="openVisible" title="修改任务规则" width="800" height="35%" resize>
  23. <el-form
  24. ref="xForm"
  25. :model="formData"
  26. :rules="formRules"
  27. label-width="120px"
  28. class="demo-ruleForm"
  29. size="default"
  30. status-icon
  31. >
  32. <el-form-item label="任务名称" prop="taskDefinitionName">
  33. <el-input -model="formData.taskDefinitionName" placeholder="请输入流标标识" disabled />
  34. </el-form-item>
  35. <el-form-item label="任务标识" prop="taskDefinitionKey">
  36. <el-input v-model="formData.taskDefinitionKey" placeholder="请输入任务标识" disabled />
  37. </el-form-item>
  38. <el-form-item label="规则类型" prop="type">
  39. <el-select v-model="formData.type" clearable style="width: 100%">
  40. <el-option
  41. v-for="dict in taskAssignRuleTypeDictDatas"
  42. :key="parseInt(dict.value)"
  43. :label="dict.label"
  44. :value="parseInt(dict.value)"
  45. />
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item v-if="formData.type === 10" label="指定角色" prop="roleIds">
  49. <el-select v-model="formData.roleIds" multiple clearable style="width: 100%">
  50. <el-option
  51. v-for="item in roleOptions"
  52. :key="parseInt(item.id)"
  53. :label="item.name"
  54. :value="parseInt(item.id)"
  55. />
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item
  59. label="指定部门"
  60. prop="deptIds"
  61. span="24"
  62. v-if="formData.type === 20 || formData.type === 21"
  63. >
  64. <treeselect
  65. v-model="formData.deptIds"
  66. :options="deptTreeOptions"
  67. multiple
  68. flat
  69. :defaultExpandLevel="3"
  70. placeholder="请选择指定部门"
  71. :normalizer="normalizer"
  72. />
  73. </el-form-item>
  74. <el-form-item label="指定岗位" prop="postIds" span="24" v-if="formData.type === 22">
  75. <el-select v-model="formData.postIds" multiple clearable style="width: 100%">
  76. <el-option
  77. v-for="item in postOptions"
  78. :key="parseInt(item.id)"
  79. :label="item.name"
  80. :value="parseInt(item.id)"
  81. />
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item
  85. label="指定用户"
  86. prop="userIds"
  87. span="24"
  88. v-if="formData.type === 30 || formData.type === 31 || formData.type === 32"
  89. >
  90. <el-select v-model="formData.userIds" multiple clearable style="width: 100%">
  91. <el-option
  92. v-for="item in userOptions"
  93. :key="parseInt(item.id)"
  94. :label="item.nickname"
  95. :value="parseInt(item.id)"
  96. />
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="指定用户组" prop="userGroupIds" v-if="formData.type === 40">
  100. <el-select v-model="formData.userGroupIds" multiple clearable style="width: 100%">
  101. <el-option
  102. v-for="item in userGroupOptions"
  103. :key="parseInt(item.id)"
  104. :label="item.name"
  105. :value="parseInt(item.id)"
  106. />
  107. </el-select>
  108. </el-form-item>
  109. <el-form-item label="指定脚本" prop="scripts" v-if="formData.type === 50">
  110. <el-select v-model="formData.scripts" multiple clearable style="width: 100%">
  111. <el-option
  112. v-for="dict in taskAssignScriptDictDatas"
  113. :key="parseInt(dict.value)"
  114. :label="dict.label"
  115. :value="parseInt(dict.value)"
  116. />
  117. </el-select>
  118. </el-form-item>
  119. </el-form>
  120. <template #footer>
  121. <XButton type="primary" title="保存" :loading="loading" @click="submitEvent(xForm)" />
  122. <XButton title="关闭" @click="resetEvent(xForm)" />
  123. </template>
  124. </XModal>
  125. </ContentWrap>
  126. </template>
  127. <script setup lang="ts" name="TaskAssignRule">
  128. // 全局相关的 import
  129. import { onMounted, reactive, ref } from 'vue'
  130. import { ElInput, ElTag, ElOption, ElSelect, ElForm, ElFormItem } from 'element-plus'
  131. import type { FormInstance } from 'element-plus'
  132. // 业务相关的 import
  133. import Treeselect from 'vue3-treeselect'
  134. import 'vue3-treeselect/dist/vue3-treeselect.css'
  135. import { useXTable } from '@/hooks/web/useXTable'
  136. import { allSchemas } from './taskAssignRule.data'
  137. import * as TaskAssignRuleApi from '@/api/bpm/taskAssignRule'
  138. import { listSimpleRolesApi } from '@/api/system/role'
  139. import { handleTree } from '@/utils/tree'
  140. import { listSimplePostsApi } from '@/api/system/post'
  141. import { getListSimpleUsersApi } from '@/api/system/user'
  142. import { listSimpleUserGroupsApi } from '@/api/bpm/userGroup'
  143. import { listSimpleDeptApi } from '@/api/system/dept'
  144. import { DICT_TYPE, getDictOptions } from '@/utils/dict'
  145. // import {useI18n} from "@/hooks/web/useI18n";
  146. // import {useMessage} from "@/hooks/web/useMessage";
  147. import { useRoute } from 'vue-router'
  148. // const { t } = useI18n() // 国际化
  149. // const message = useMessage() // 消息弹窗
  150. // const router = useRouter() // 路由
  151. const { query } = useRoute()
  152. // ========== 列表相关 ==========
  153. // 流程模型的编号。如果 modelId 非空,则用于流程模型的查看与配置
  154. const modelId = query.modelId
  155. // 流程定义的编号。如果 processDefinitionId 非空,则用于流程定义的查看,不支持配置
  156. const processDefinitionId = query.processDefinitionId
  157. // 查询参数
  158. const queryParams = reactive({
  159. modelId: modelId,
  160. processDefinitionId: processDefinitionId
  161. })
  162. const [registerTable] = useXTable({
  163. allSchemas: allSchemas,
  164. params: queryParams,
  165. getListApi: TaskAssignRuleApi.getTaskAssignRuleList,
  166. isList: false // TODO 如果 isList 改成 true 时,进入页面不会加载数据
  167. })
  168. // 修改任务责任表单
  169. const xForm = ref<FormInstance>()
  170. const formData = ref()
  171. const formRules = reactive({
  172. type: [{ required: true, message: '规则类型不能为空', trigger: 'change' }],
  173. roleIds: [{ required: true, message: '指定角色不能为空', trigger: 'change' }],
  174. deptIds: [{ required: true, message: '指定部门不能为空', trigger: 'change' }],
  175. postIds: [{ required: true, message: '指定岗位不能为空', trigger: 'change' }],
  176. userIds: [{ required: true, message: '指定用户不能为空', trigger: 'change' }],
  177. userGroupIds: [{ required: true, message: '指定用户组不能为空', trigger: 'change' }],
  178. scripts: [{ required: true, message: '指定脚本不能为空', trigger: 'change' }]
  179. })
  180. const loading = ref(false)
  181. const roleOptions = ref() // 角色列表
  182. const deptOptions = ref() // 部门列表
  183. const deptTreeOptions = ref()
  184. const postOptions = ref() // 岗位列表
  185. const userOptions = ref() // 用户列表
  186. const userGroupOptions = ref() // 用户组列表
  187. const taskAssignScriptDictDatas = getDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT)
  188. const taskAssignRuleTypeDictDatas = getDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)
  189. // 修改任务分配规则
  190. const openVisible = ref(false)
  191. // 添加修改弹窗提交修改
  192. const submitEvent = async (formEl: FormInstance | undefined) => {
  193. console.log('确认')
  194. if (!formEl) return
  195. loading.value = true
  196. await formEl.validate((valid, fields) => {
  197. if (valid) {
  198. console.log('submit!')
  199. loading.value = false
  200. openVisible.value = false
  201. } else {
  202. console.log('error submit!', fields)
  203. loading.value = false
  204. }
  205. })
  206. }
  207. const resetEvent = (formEl: FormInstance | undefined) => {
  208. if (!formEl) return
  209. formEl.resetFields()
  210. openVisible.value = false
  211. }
  212. // 修改任务分配规则
  213. const handleUpdate = (row) => {
  214. console.log(row, '修改i数据')
  215. openVisible.value = true
  216. formData.value = { ...row }
  217. }
  218. // 类型字典
  219. const getAssignRuleOptionName = (type, option) => {
  220. if (type === 10) {
  221. for (const roleOption of roleOptions.value) {
  222. if (roleOption.id === option) {
  223. return roleOption.name
  224. }
  225. }
  226. } else if (type === 20 || type === 21) {
  227. for (const deptOption of deptOptions.value) {
  228. if (deptOption.id === option) {
  229. return deptOption.name
  230. }
  231. }
  232. } else if (type === 22) {
  233. for (const postOption of postOptions.value) {
  234. if (postOption.id === option) {
  235. return postOption.name
  236. }
  237. }
  238. } else if (type === 30 || type === 31 || type === 32) {
  239. for (const userOption of userOptions.value) {
  240. if (userOption.id === option) {
  241. return userOption.nickname
  242. }
  243. }
  244. } else if (type === 40) {
  245. for (const userGroupOption of userGroupOptions.value) {
  246. if (userGroupOption.id === option) {
  247. return userGroupOption.name
  248. }
  249. }
  250. } else if (type === 50) {
  251. option = option + '' // 转换成 string
  252. for (const dictData of taskAssignScriptDictDatas) {
  253. if (dictData.value === option) {
  254. return dictData.label
  255. }
  256. }
  257. }
  258. return '未知(' + option + ')'
  259. }
  260. // 格式化部门的下拉框
  261. const normalizer = (node) => {
  262. return {
  263. id: node.id,
  264. label: node.name,
  265. children: node.children
  266. }
  267. }
  268. // ========== 初始化 ==========
  269. onMounted(() => {
  270. // 获得角色列表
  271. roleOptions.value = []
  272. listSimpleRolesApi().then((data) => {
  273. roleOptions.value.push(...data)
  274. })
  275. // 获得部门列表
  276. deptOptions.value = []
  277. deptTreeOptions.value = []
  278. listSimpleDeptApi().then((data) => {
  279. deptOptions.value.push(...data)
  280. deptTreeOptions.value.push(...handleTree(data, 'id'))
  281. })
  282. // 获得岗位列表
  283. postOptions.value = []
  284. listSimplePostsApi().then((data) => {
  285. postOptions.value.push(...data)
  286. })
  287. // 获得用户列表
  288. userOptions.value = []
  289. getListSimpleUsersApi().then((data) => {
  290. userOptions.value.push(...data)
  291. })
  292. // 获得用户组列表
  293. userGroupOptions.value = []
  294. listSimpleUserGroupsApi().then((data) => {
  295. userGroupOptions.value.push(...data)
  296. })
  297. })
  298. </script>