TaskCCDialogForm.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <!-- TODO @kyle:需要在讨论下;可能直接选人更合适 -->
  2. <template>
  3. <Dialog v-model="dialogVisible" title="修改任务规则" width="600">
  4. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
  5. <el-form-item label="任务名称" prop="taskName">
  6. <el-input v-model="formData.taskName" disabled placeholder="请输入任务名称" />
  7. </el-form-item>
  8. <el-form-item label="任务标识" prop="taskKey">
  9. <el-input v-model="formData.taskKey" disabled placeholder="请输入任务标识" />
  10. </el-form-item>
  11. <el-form-item label="流程名称" prop="processInstanceName">
  12. <el-input v-model="formData.processInstanceName" disabled placeholder="请输入流程名称" />
  13. </el-form-item>
  14. <el-form-item label="流程标识" prop="processInstanceKey">
  15. <el-input v-model="formData.processInstanceKey" disabled placeholder="请输入流程标识" />
  16. </el-form-item>
  17. <el-form-item label="规则类型" prop="type">
  18. <el-select v-model="formData.type" clearable style="width: 100%">
  19. <el-option
  20. v-for="dict in getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)"
  21. :key="dict.value"
  22. :label="dict.label"
  23. :value="dict.value"
  24. />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item v-if="formData.type === 10" label="指定角色" prop="roleIds">
  28. <el-select v-model="formData.roleIds" clearable multiple style="width: 100%">
  29. <el-option
  30. v-for="item in roleOptions"
  31. :key="item.id"
  32. :label="item.name"
  33. :value="item.id"
  34. />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item
  38. v-if="formData.type === 20 || formData.type === 21"
  39. label="指定部门"
  40. prop="deptIds"
  41. span="24"
  42. >
  43. <el-tree-select
  44. ref="treeRef"
  45. v-model="formData.deptIds"
  46. :data="deptTreeOptions"
  47. :props="defaultProps"
  48. empty-text="加载中,请稍后"
  49. multiple
  50. node-key="id"
  51. show-checkbox
  52. />
  53. </el-form-item>
  54. <el-form-item v-if="formData.type === 22" label="指定岗位" prop="postIds" span="24">
  55. <el-select v-model="formData.postIds" clearable multiple style="width: 100%">
  56. <el-option
  57. v-for="item in postOptions"
  58. :key="parseInt(item.id)"
  59. :label="item.name"
  60. :value="parseInt(item.id)"
  61. />
  62. </el-select>
  63. </el-form-item>
  64. <el-form-item
  65. v-if="formData.type === 30 || formData.type === 31 || formData.type === 32"
  66. label="指定用户"
  67. prop="userIds"
  68. span="24"
  69. >
  70. <el-select v-model="formData.userIds" clearable multiple style="width: 100%">
  71. <el-option
  72. v-for="item in userOptions"
  73. :key="parseInt(item.id)"
  74. :label="item.nickname"
  75. :value="parseInt(item.id)"
  76. />
  77. </el-select>
  78. </el-form-item>
  79. <el-form-item v-if="formData.type === 40" label="指定用户组" prop="userGroupIds">
  80. <el-select v-model="formData.userGroupIds" clearable multiple style="width: 100%">
  81. <el-option
  82. v-for="item in userGroupOptions"
  83. :key="parseInt(item.id)"
  84. :label="item.name"
  85. :value="parseInt(item.id)"
  86. />
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item v-if="formData.type === 50" label="指定脚本" prop="scripts">
  90. <el-select v-model="formData.scripts" clearable multiple style="width: 100%">
  91. <el-option
  92. v-for="dict in taskAssignScriptDictDatas"
  93. :key="dict.value"
  94. :label="dict.label"
  95. :value="dict.value"
  96. />
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="抄送原因" prop="reason">
  100. <el-input v-model="formData.reason" placeholder="请输入抄送原因" type="textarea" />
  101. </el-form-item>
  102. </el-form>
  103. <!-- 操作按钮 -->
  104. <template #footer>
  105. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  106. <el-button @click="dialogVisible = false">取 消</el-button>
  107. </template>
  108. </Dialog>
  109. </template>
  110. <script lang="ts" setup>
  111. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  112. import { defaultProps, handleTree } from '@/utils/tree'
  113. import * as ProcessInstanceApi from '@/api/bpm/processInstance'
  114. import * as RoleApi from '@/api/system/role'
  115. import * as DeptApi from '@/api/system/dept'
  116. import * as PostApi from '@/api/system/post'
  117. import * as UserApi from '@/api/system/user'
  118. import * as UserGroupApi from '@/api/bpm/userGroup'
  119. const { t } = useI18n() // 国际化
  120. const message = useMessage() // 消息弹窗
  121. const dialogVisible = ref(false) // 弹窗的是否展示
  122. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  123. const formData = ref({
  124. type: Number(undefined),
  125. taskName: '',
  126. taskKey: '',
  127. processInstanceName: '',
  128. processInstanceKey: '',
  129. startUserId: '',
  130. options: [],
  131. roleIds: [],
  132. deptIds: [],
  133. postIds: [],
  134. userIds: [],
  135. userGroupIds: [],
  136. scripts: [],
  137. reason: ''
  138. })
  139. const formRules = reactive({
  140. type: [{ required: true, message: '规则类型不能为空', trigger: 'change' }],
  141. roleIds: [{ required: true, message: '指定角色不能为空', trigger: 'change' }],
  142. deptIds: [{ required: true, message: '指定部门不能为空', trigger: 'change' }],
  143. postIds: [{ required: true, message: '指定岗位不能为空', trigger: 'change' }],
  144. userIds: [{ required: true, message: '指定用户不能为空', trigger: 'change' }],
  145. userGroupIds: [{ required: true, message: '指定用户组不能为空', trigger: 'change' }],
  146. scripts: [{ required: true, message: '指定脚本不能为空', trigger: 'change' }],
  147. reason: [{ required: true, message: '抄送原因不能为空', trigger: 'change' }]
  148. })
  149. const formRef = ref() // 表单 Ref
  150. const roleOptions = ref<RoleApi.RoleVO[]>([]) // 角色列表
  151. const deptOptions = ref<DeptApi.DeptVO[]>([]) // 部门列表
  152. const deptTreeOptions = ref() // 部门树
  153. const postOptions = ref<PostApi.PostVO[]>([]) // 岗位列表
  154. const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
  155. const userGroupOptions = ref<UserGroupApi.UserGroupVO[]>([]) // 用户组列表
  156. const taskAssignScriptDictDatas = getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT)
  157. /** 打开弹窗 */
  158. const open = async (row) => {
  159. // 1. 先重置表单
  160. resetForm()
  161. // 2. 再设置表单
  162. if (row != null) {
  163. formData.value.type = undefined as unknown as number
  164. formData.value.taskName = row.name
  165. formData.value.taskKey = row.id
  166. formData.value.processInstanceName = row.processInstance.name
  167. formData.value.processInstanceKey = row.processInstance.id
  168. formData.value.startUserId = row.processInstance.startUserId
  169. }
  170. // 打开弹窗
  171. dialogVisible.value = true
  172. // 获得角色列表
  173. roleOptions.value = await RoleApi.listSimpleRolesApi()
  174. // 获得部门列表
  175. deptOptions.value = await DeptApi.getSimpleDeptList()
  176. deptTreeOptions.value = handleTree(deptOptions.value, 'id')
  177. // 获得岗位列表
  178. postOptions.value = await PostApi.listSimplePostsApi()
  179. // 获得用户列表
  180. userOptions.value = await UserApi.getSimpleUserList()
  181. // 获得用户组列表
  182. userGroupOptions.value = await UserGroupApi.listSimpleUserGroupsApi()
  183. }
  184. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  185. /** 提交表单 */
  186. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  187. const submitForm = async () => {
  188. // 校验表单
  189. if (!formRef) return
  190. const valid = await formRef.value.validate()
  191. if (!valid) return
  192. // 构建表单
  193. const form = {
  194. ...formData.value
  195. }
  196. // 将 roleIds 等选项赋值到 options 中
  197. if (form.type === 10) {
  198. form.options = form.roleIds
  199. } else if (form.type === 20 || form.type === 21) {
  200. form.options = form.deptIds
  201. } else if (form.type === 22) {
  202. form.options = form.postIds
  203. } else if (form.type === 30 || form.type === 31 || form.type === 32) {
  204. form.options = form.userIds
  205. } else if (form.type === 40) {
  206. form.options = form.userGroupIds
  207. } else if (form.type === 50) {
  208. form.options = form.scripts
  209. }
  210. form.roleIds = undefined
  211. form.deptIds = undefined
  212. form.postIds = undefined
  213. form.userIds = undefined
  214. form.userGroupIds = undefined
  215. form.scripts = undefined
  216. // 提交请求
  217. formLoading.value = true
  218. try {
  219. const data = form as unknown as ProcessInstanceApi.ProcessInstanceCCVO
  220. await ProcessInstanceApi.createProcessInstanceCC(data)
  221. console.log(data)
  222. message.success(t('common.createSuccess'))
  223. dialogVisible.value = false
  224. // 发送操作成功的事件
  225. emit('success')
  226. } finally {
  227. formLoading.value = false
  228. }
  229. }
  230. /** 重置表单 */
  231. const resetForm = () => {
  232. formRef.value?.resetFields()
  233. }
  234. </script>