Commit 8992f64eb4b785fa83bb32215f49c73a94fbb963
1 parent
051f4b85
bpm:完善流程分配任务的弹窗
Showing
5 changed files
with
159 additions
and
91 deletions
yudao-ui-admin-vue3/src/api/bpm/taskAssignRule/index.ts
| 1 | 1 | import request from '@/config/axios' |
| 2 | -import { TaskAssignVO } from './types' | |
| 2 | + | |
| 3 | +export type TaskAssignVO = { | |
| 4 | + id: number | |
| 5 | + modelId: string | |
| 6 | + processDefinitionId: string | |
| 7 | + taskDefinitionKey: string | |
| 8 | + taskDefinitionName: string | |
| 9 | + options: string[] | |
| 10 | + type: number | |
| 11 | +} | |
| 3 | 12 | |
| 4 | 13 | export const getTaskAssignRuleList = async (params) => { |
| 5 | 14 | return await request.get({ url: '/bpm/task-assign-rule/list', params }) | ... | ... |
yudao-ui-admin-vue3/src/api/bpm/taskAssignRule/types.ts deleted
yudao-ui-admin-vue3/src/views/bpm/group/index.vue
| ... | ... | @@ -77,7 +77,7 @@ |
| 77 | 77 | type="primary" |
| 78 | 78 | :title="t('action.save')" |
| 79 | 79 | :loading="actionLoading" |
| 80 | - @click="submitForm()" | |
| 80 | + @click="submitForm" | |
| 81 | 81 | /> |
| 82 | 82 | <!-- 按钮:关闭 --> |
| 83 | 83 | <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" /> |
| ... | ... | @@ -90,7 +90,7 @@ import { onMounted, ref } from 'vue' |
| 90 | 90 | // 业务相关的 import |
| 91 | 91 | import * as UserGroupApi from '@/api/bpm/userGroup' |
| 92 | 92 | import { getListSimpleUsersApi, UserVO } from '@/api/system/user' |
| 93 | -import { allSchemas } from './group.data' | |
| 93 | +import { allSchemas, rules } from './group.data' | |
| 94 | 94 | import { FormExpose } from '@/components/Form' |
| 95 | 95 | |
| 96 | 96 | const { t } = useI18n() // 国际化 | ... | ... |
yudao-ui-admin-vue3/src/views/bpm/taskAssignRule/index.vue
| ... | ... | @@ -9,29 +9,28 @@ |
| 9 | 9 | </template> |
| 10 | 10 | <!-- 操作 --> |
| 11 | 11 | <template #actionbtns_default="{ row }" v-if="modelId"> |
| 12 | - <vxe-button | |
| 13 | - type="text" | |
| 14 | - status="primary" | |
| 15 | - content="修改" | |
| 16 | - icon="vxe-icon-edit" | |
| 12 | + <!-- 操作:修改 --> | |
| 13 | + <XTextButton | |
| 14 | + preIcon="ep:edit" | |
| 15 | + :title="t('action.edit')" | |
| 16 | + v-hasPermi="['bpm:task-assign-rule:update']" | |
| 17 | 17 | @click="handleUpdate(row)" |
| 18 | 18 | /> |
| 19 | 19 | </template> |
| 20 | 20 | </XTable> |
| 21 | 21 | |
| 22 | 22 | <!-- 添加/修改弹窗 --> |
| 23 | - <XModal v-model="openVisible" title="修改任务规则" width="800" height="35%" resize> | |
| 23 | + <XModal v-model="dialogVisible" title="修改任务规则" width="800" height="35%"> | |
| 24 | 24 | <el-form |
| 25 | - ref="xForm" | |
| 25 | + ref="formRef" | |
| 26 | 26 | :model="formData" |
| 27 | - :rules="formRules" | |
| 27 | + :rules="rules" | |
| 28 | 28 | label-width="120px" |
| 29 | - class="demo-ruleForm" | |
| 30 | 29 | size="default" |
| 31 | 30 | status-icon |
| 32 | 31 | > |
| 33 | 32 | <el-form-item label="任务名称" prop="taskDefinitionName"> |
| 34 | - <el-input -model="formData.taskDefinitionName" placeholder="请输入流标标识" disabled /> | |
| 33 | + <el-input v-model="formData.taskDefinitionName" placeholder="请输入流标标识" disabled /> | |
| 35 | 34 | </el-form-item> |
| 36 | 35 | <el-form-item label="任务标识" prop="taskDefinitionKey"> |
| 37 | 36 | <el-input v-model="formData.taskDefinitionKey" placeholder="请输入任务标识" disabled /> |
| ... | ... | @@ -39,7 +38,7 @@ |
| 39 | 38 | <el-form-item label="规则类型" prop="type"> |
| 40 | 39 | <el-select v-model="formData.type" clearable style="width: 100%"> |
| 41 | 40 | <el-option |
| 42 | - v-for="dict in taskAssignRuleTypeDictDatas" | |
| 41 | + v-for="dict in getDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)" | |
| 43 | 42 | :key="parseInt(dict.value)" |
| 44 | 43 | :label="dict.label" |
| 45 | 44 | :value="parseInt(dict.value)" |
| ... | ... | @@ -118,9 +117,21 @@ |
| 118 | 117 | </el-select> |
| 119 | 118 | </el-form-item> |
| 120 | 119 | </el-form> |
| 120 | + <!-- 操作按钮 --> | |
| 121 | 121 | <template #footer> |
| 122 | - <XButton type="primary" title="保存" :loading="loading" @click="submitEvent(xForm)" /> | |
| 123 | - <XButton title="关闭" @click="resetEvent(xForm)" /> | |
| 122 | + <!-- 按钮:保存 --> | |
| 123 | + <XButton | |
| 124 | + type="primary" | |
| 125 | + :title="t('action.save')" | |
| 126 | + :loading="actionLoading" | |
| 127 | + @click="submitForm" | |
| 128 | + /> | |
| 129 | + <!-- 按钮:关闭 --> | |
| 130 | + <XButton | |
| 131 | + :loading="actionLoading" | |
| 132 | + :title="t('dialog.close')" | |
| 133 | + @click="dialogVisible = false" | |
| 134 | + /> | |
| 124 | 135 | </template> |
| 125 | 136 | </XModal> |
| 126 | 137 | </ContentWrap> |
| ... | ... | @@ -128,28 +139,31 @@ |
| 128 | 139 | <script setup lang="ts" name="TaskAssignRule"> |
| 129 | 140 | // 全局相关的 import |
| 130 | 141 | import type { FormInstance } from 'element-plus' |
| 131 | - | |
| 132 | 142 | // 业务相关的 import |
| 133 | -import { allSchemas } from './taskAssignRule.data' | |
| 134 | 143 | import * as TaskAssignRuleApi from '@/api/bpm/taskAssignRule' |
| 135 | 144 | import { listSimpleRolesApi } from '@/api/system/role' |
| 136 | -import { handleTree, defaultProps } from '@/utils/tree' | |
| 137 | 145 | import { listSimplePostsApi } from '@/api/system/post' |
| 138 | 146 | import { getListSimpleUsersApi } from '@/api/system/user' |
| 139 | 147 | import { listSimpleUserGroupsApi } from '@/api/bpm/userGroup' |
| 140 | 148 | import { listSimpleDeptApi } from '@/api/system/dept' |
| 141 | 149 | import { DICT_TYPE, getDictOptions } from '@/utils/dict' |
| 142 | -// import {useI18n} from "@/hooks/web/useI18n"; | |
| 143 | -// import {useMessage} from "@/hooks/web/useMessage"; | |
| 144 | -import { useRoute } from 'vue-router' | |
| 150 | +import { handleTree, defaultProps } from '@/utils/tree' | |
| 151 | +import { allSchemas, rules } from './taskAssignRule.data' | |
| 145 | 152 | |
| 146 | -// const { t } = useI18n() // 国际化 | |
| 147 | -// const message = useMessage() // 消息弹窗 | |
| 148 | -// const router = useRouter() // 路由 | |
| 153 | +const { t } = useI18n() // 国际化 | |
| 154 | +const message = useMessage() // 消息弹窗 | |
| 149 | 155 | const { query } = useRoute() |
| 150 | 156 | |
| 151 | 157 | // ========== 列表相关 ========== |
| 152 | 158 | |
| 159 | +const roleOptions = ref() // 角色列表 | |
| 160 | +const deptOptions = ref() // 部门列表 | |
| 161 | +const deptTreeOptions = ref() | |
| 162 | +const postOptions = ref() // 岗位列表 | |
| 163 | +const userOptions = ref() // 用户列表 | |
| 164 | +const userGroupOptions = ref() // 用户组列表 | |
| 165 | +const taskAssignScriptDictDatas = getDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT) | |
| 166 | + | |
| 153 | 167 | // 流程模型的编号。如果 modelId 非空,则用于流程模型的查看与配置 |
| 154 | 168 | const modelId = query.modelId |
| 155 | 169 | // 流程定义的编号。如果 processDefinitionId 非空,则用于流程定义的查看,不支持配置 |
| ... | ... | @@ -159,68 +173,14 @@ const queryParams = reactive({ |
| 159 | 173 | modelId: modelId, |
| 160 | 174 | processDefinitionId: processDefinitionId |
| 161 | 175 | }) |
| 162 | -const [registerTable] = useXTable({ | |
| 176 | +const [registerTable, { reload }] = useXTable({ | |
| 163 | 177 | allSchemas: allSchemas, |
| 164 | 178 | params: queryParams, |
| 165 | 179 | getListApi: TaskAssignRuleApi.getTaskAssignRuleList, |
| 166 | 180 | isList: true |
| 167 | 181 | }) |
| 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 | - | |
| 182 | -const roleOptions = ref() // 角色列表 | |
| 183 | -const deptOptions = ref() // 部门列表 | |
| 184 | -const deptTreeOptions = ref() | |
| 185 | -const postOptions = ref() // 岗位列表 | |
| 186 | -const userOptions = ref() // 用户列表 | |
| 187 | -const userGroupOptions = ref() // 用户组列表 | |
| 188 | -const taskAssignScriptDictDatas = getDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT) | |
| 189 | -const taskAssignRuleTypeDictDatas = getDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE) | |
| 190 | - | |
| 191 | -// 修改任务分配规则 | |
| 192 | -const openVisible = ref(false) | |
| 193 | - | |
| 194 | -// 添加修改弹窗提交修改 | |
| 195 | -const submitEvent = async (formEl: FormInstance | undefined) => { | |
| 196 | - console.log('确认') | |
| 197 | - if (!formEl) return | |
| 198 | - loading.value = true | |
| 199 | - await formEl.validate((valid, fields) => { | |
| 200 | - if (valid) { | |
| 201 | - console.log('submit!') | |
| 202 | - loading.value = false | |
| 203 | - openVisible.value = false | |
| 204 | - } else { | |
| 205 | - console.log('error submit!', fields) | |
| 206 | - loading.value = false | |
| 207 | - } | |
| 208 | - }) | |
| 209 | -} | |
| 210 | 182 | |
| 211 | -const resetEvent = (formEl: FormInstance | undefined) => { | |
| 212 | - if (!formEl) return | |
| 213 | - formEl.resetFields() | |
| 214 | - openVisible.value = false | |
| 215 | -} | |
| 216 | - | |
| 217 | -// 修改任务分配规则 | |
| 218 | -const handleUpdate = (row) => { | |
| 219 | - console.log(row, '修改i数据') | |
| 220 | - openVisible.value = true | |
| 221 | - formData.value = { ...row } | |
| 222 | -} | |
| 223 | -// 类型字典 | |
| 183 | +// 翻译规则范围 | |
| 224 | 184 | const getAssignRuleOptionName = (type, option) => { |
| 225 | 185 | if (type === 10) { |
| 226 | 186 | for (const roleOption of roleOptions.value) { |
| ... | ... | @@ -263,6 +223,103 @@ const getAssignRuleOptionName = (type, option) => { |
| 263 | 223 | return '未知(' + option + ')' |
| 264 | 224 | } |
| 265 | 225 | |
| 226 | +// ========== 修改相关 ========== | |
| 227 | + | |
| 228 | +// 修改任务责任表单 | |
| 229 | +const actionLoading = ref(false) // 遮罩层 | |
| 230 | +const dialogVisible = ref(false) // 是否显示弹出层 | |
| 231 | +const formRef = ref<FormInstance>() | |
| 232 | +const formData = ref() // 表单数据 | |
| 233 | + | |
| 234 | +// 提交按钮 | |
| 235 | +const submitForm = async () => { | |
| 236 | + const elForm = unref(formRef)?.getElFormRef() | |
| 237 | + if (!elForm) return | |
| 238 | + elForm.validate(async (valid) => { | |
| 239 | + if (valid) { | |
| 240 | + // 构建表单 | |
| 241 | + let form = { | |
| 242 | + ...formData.value, | |
| 243 | + taskDefinitionName: undefined | |
| 244 | + } | |
| 245 | + // 将 roleIds 等选项赋值到 options 中 | |
| 246 | + if (form.type === 10) { | |
| 247 | + form.options = form.roleIds | |
| 248 | + } else if (form.type === 20 || form.type === 21) { | |
| 249 | + form.options = form.deptIds | |
| 250 | + } else if (form.type === 22) { | |
| 251 | + form.options = form.postIds | |
| 252 | + } else if (form.type === 30 || form.type === 31 || form.type === 32) { | |
| 253 | + form.options = form.userIds | |
| 254 | + } else if (form.type === 40) { | |
| 255 | + form.options = form.userGroupIds | |
| 256 | + } else if (form.type === 50) { | |
| 257 | + form.options = form.scripts | |
| 258 | + } | |
| 259 | + form.roleIds = undefined | |
| 260 | + form.deptIds = undefined | |
| 261 | + form.postIds = undefined | |
| 262 | + form.userIds = undefined | |
| 263 | + form.userGroupIds = undefined | |
| 264 | + form.scripts = undefined | |
| 265 | + // 设置提交中 | |
| 266 | + actionLoading.value = true | |
| 267 | + // 提交请求 | |
| 268 | + try { | |
| 269 | + const data = form as TaskAssignRuleApi.TaskAssignVO | |
| 270 | + // 新增 | |
| 271 | + if (!data.id) { | |
| 272 | + await TaskAssignRuleApi.createTaskAssignRule(data) | |
| 273 | + message.success(t('common.createSuccess')) | |
| 274 | + // 修改 | |
| 275 | + } else { | |
| 276 | + await TaskAssignRuleApi.updateTaskAssignRule(data) | |
| 277 | + message.success(t('common.updateSuccess')) | |
| 278 | + } | |
| 279 | + dialogVisible.value = false | |
| 280 | + } finally { | |
| 281 | + actionLoading.value = false | |
| 282 | + // 刷新列表 | |
| 283 | + await reload() | |
| 284 | + } | |
| 285 | + } | |
| 286 | + }) | |
| 287 | +} | |
| 288 | + | |
| 289 | +// 修改任务分配规则 | |
| 290 | +const handleUpdate = (row) => { | |
| 291 | + // 1. 先重置表单 | |
| 292 | + formData.value = {} | |
| 293 | + // 2. 再设置表单 | |
| 294 | + formData.value = { | |
| 295 | + ...row, | |
| 296 | + options: [], | |
| 297 | + roleIds: [], | |
| 298 | + deptIds: [], | |
| 299 | + postIds: [], | |
| 300 | + userIds: [], | |
| 301 | + userGroupIds: [], | |
| 302 | + scripts: [] | |
| 303 | + } | |
| 304 | + // 将 options 赋值到对应的 roleIds 等选项 | |
| 305 | + if (row.type === 10) { | |
| 306 | + formData.value.roleIds.push(...row.options) | |
| 307 | + } else if (row.type === 20 || row.type === 21) { | |
| 308 | + formData.value.deptIds.push(...row.options) | |
| 309 | + } else if (row.type === 22) { | |
| 310 | + formData.value.postIds.push(...row.options) | |
| 311 | + } else if (row.type === 30 || row.type === 31 || row.type === 32) { | |
| 312 | + formData.value.userIds.push(...row.options) | |
| 313 | + } else if (row.type === 40) { | |
| 314 | + formData.value.userGroupIds.push(...row.options) | |
| 315 | + } else if (row.type === 50) { | |
| 316 | + formData.value.scripts.push(...row.options) | |
| 317 | + } | |
| 318 | + // 打开弹窗 | |
| 319 | + dialogVisible.value = true | |
| 320 | + actionLoading.value = false | |
| 321 | +} | |
| 322 | + | |
| 266 | 323 | // ========== 初始化 ========== |
| 267 | 324 | onMounted(() => { |
| 268 | 325 | // 获得角色列表 | ... | ... |
yudao-ui-admin-vue3/src/views/bpm/taskAssignRule/taskAssignRule.data.ts
| 1 | 1 | import { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas' |
| 2 | 2 | |
| 3 | +// 表单校验 | |
| 4 | +export const rules = reactive({ | |
| 5 | + type: [{ required: true, message: '规则类型不能为空', trigger: 'change' }], | |
| 6 | + roleIds: [{ required: true, message: '指定角色不能为空', trigger: 'change' }], | |
| 7 | + deptIds: [{ required: true, message: '指定部门不能为空', trigger: 'change' }], | |
| 8 | + postIds: [{ required: true, message: '指定岗位不能为空', trigger: 'change' }], | |
| 9 | + userIds: [{ required: true, message: '指定用户不能为空', trigger: 'change' }], | |
| 10 | + userGroupIds: [{ required: true, message: '指定用户组不能为空', trigger: 'change' }], | |
| 11 | + scripts: [{ required: true, message: '指定脚本不能为空', trigger: 'change' }] | |
| 12 | +}) | |
| 13 | + | |
| 3 | 14 | // CrudSchema |
| 4 | 15 | const crudSchemas = reactive<VxeCrudSchema>({ |
| 5 | 16 | primaryKey: 'id', |
| ... | ... | @@ -17,7 +28,7 @@ const crudSchemas = reactive<VxeCrudSchema>({ |
| 17 | 28 | }, |
| 18 | 29 | { |
| 19 | 30 | title: '规则类型', |
| 20 | - field: 'category', | |
| 31 | + field: 'type', | |
| 21 | 32 | dictType: DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE, |
| 22 | 33 | dictClass: 'number' |
| 23 | 34 | }, | ... | ... |