Commit b6d90b2244fcf5e7f0b667d1880db415f5191117
1 parent
06d8ceb1
bpm:流程详情的转派审批人
Showing
4 changed files
with
111 additions
and
181 deletions
yudao-ui-admin-vue3/src/views/bpm/processInstance/detail.vue
| ... | ... | @@ -39,6 +39,18 @@ |
| 39 | 39 | title="通过" |
| 40 | 40 | @click="handleAudit(item, true)" |
| 41 | 41 | /> |
| 42 | + <XButton | |
| 43 | + pre-icon="ep:close" | |
| 44 | + type="danger" | |
| 45 | + title="不通过" | |
| 46 | + @click="handleAudit(item, false)" | |
| 47 | + /> | |
| 48 | + <XButton | |
| 49 | + pre-icon="ep:edit" | |
| 50 | + type="primary" | |
| 51 | + title="转办" | |
| 52 | + @click="handleUpdateAssignee(item)" | |
| 53 | + /> | |
| 42 | 54 | </div> |
| 43 | 55 | </el-col> |
| 44 | 56 | </el-card> |
| ... | ... | @@ -116,17 +128,56 @@ |
| 116 | 128 | </div> |
| 117 | 129 | </el-col> |
| 118 | 130 | </el-card> |
| 131 | + | |
| 132 | + <!-- 对话框(转派审批人) --> | |
| 133 | + <XModal v-model="updateAssigneeVisible" title="转派审批人" width="500"> | |
| 134 | + <el-form | |
| 135 | + ref="updateAssigneeFormRef" | |
| 136 | + :model="updateAssigneeForm" | |
| 137 | + :rules="updateAssigneeRules" | |
| 138 | + label-width="110px" | |
| 139 | + > | |
| 140 | + <el-form-item label="新审批人" prop="assigneeUserId"> | |
| 141 | + <el-select v-model="updateAssigneeForm.assigneeUserId" clearable style="width: 100%"> | |
| 142 | + <el-option | |
| 143 | + v-for="item in userOptions" | |
| 144 | + :key="parseInt(item.id)" | |
| 145 | + :label="item.nickname" | |
| 146 | + :value="parseInt(item.id)" | |
| 147 | + /> | |
| 148 | + </el-select> | |
| 149 | + </el-form-item> | |
| 150 | + </el-form> | |
| 151 | + <!-- 操作按钮 --> | |
| 152 | + <template #footer> | |
| 153 | + <!-- 按钮:保存 --> | |
| 154 | + <XButton | |
| 155 | + type="primary" | |
| 156 | + :title="t('action.save')" | |
| 157 | + :loading="updateAssigneeLoading" | |
| 158 | + @click="submitUpdateAssigneeForm" | |
| 159 | + /> | |
| 160 | + <!-- 按钮:关闭 --> | |
| 161 | + <XButton | |
| 162 | + :loading="updateAssigneeLoading" | |
| 163 | + :title="t('dialog.close')" | |
| 164 | + @click="updateAssigneeLoading = false" | |
| 165 | + /> | |
| 166 | + </template> | |
| 167 | + </XModal> | |
| 119 | 168 | </ContentWrap> |
| 120 | 169 | </template> |
| 121 | 170 | <script setup lang="ts"> |
| 122 | 171 | import { getCurrentInstance } from 'vue' |
| 123 | 172 | import dayjs from 'dayjs' |
| 173 | +import * as UserApi from '@/api/system/user' | |
| 124 | 174 | import * as ProcessInstanceApi from '@/api/bpm/processInstance' |
| 125 | 175 | import * as TaskApi from '@/api/bpm/task' |
| 126 | 176 | import { formatPast2 } from '@/utils/formatTime' |
| 127 | 177 | |
| 128 | 178 | const { query } = useRoute() // 查询参数 |
| 129 | 179 | const message = useMessage() // 消息弹窗 |
| 180 | +const { t } = useI18n() // 国际化 | |
| 130 | 181 | const { proxy } = getCurrentInstance() |
| 131 | 182 | |
| 132 | 183 | // ========== 审批信息 ========== |
| ... | ... | @@ -216,9 +267,66 @@ const getTimelineItemType = (item) => { |
| 216 | 267 | return '' |
| 217 | 268 | } |
| 218 | 269 | |
| 270 | +// ========== 审批记录 ========== | |
| 271 | +const updateAssigneeVisible = ref(false) | |
| 272 | +const updateAssigneeLoading = ref(false) | |
| 273 | +const updateAssigneeForm = ref({ | |
| 274 | + id: undefined, | |
| 275 | + assigneeUserId: undefined | |
| 276 | +}) | |
| 277 | +const updateAssigneeRules = ref({ | |
| 278 | + assigneeUserId: [{ required: true, message: '新审批人不能为空', trigger: 'change' }] | |
| 279 | +}) | |
| 280 | +const updateAssigneeFormRef = ref() | |
| 281 | +const userOptions = ref([]) | |
| 282 | + | |
| 283 | +// 处理转派审批人 | |
| 284 | +const handleUpdateAssignee = (task) => { | |
| 285 | + // 设置表单 | |
| 286 | + resetUpdateAssigneeForm() | |
| 287 | + updateAssigneeForm.value.id = task.id | |
| 288 | + // 设置为打开 | |
| 289 | + updateAssigneeVisible.value = true | |
| 290 | +} | |
| 291 | + | |
| 292 | +// 提交转派审批人 | |
| 293 | +const submitUpdateAssigneeForm = async () => { | |
| 294 | + // 1. 校验表单 | |
| 295 | + const elForm = unref(updateAssigneeFormRef) | |
| 296 | + if (!elForm) return | |
| 297 | + const valid = await elForm.validate() | |
| 298 | + if (!valid) return | |
| 299 | + | |
| 300 | + // 2.1 提交审批 | |
| 301 | + updateAssigneeLoading.value = true | |
| 302 | + try { | |
| 303 | + await TaskApi.updateTaskAssignee(updateAssigneeForm.value) | |
| 304 | + // 2.2 设置为隐藏 | |
| 305 | + updateAssigneeVisible.value = false | |
| 306 | + // 加载最新数据 | |
| 307 | + getDetail() | |
| 308 | + } finally { | |
| 309 | + updateAssigneeLoading.value = false | |
| 310 | + } | |
| 311 | +} | |
| 312 | + | |
| 313 | +// 重置转派审批人表单 | |
| 314 | +const resetUpdateAssigneeForm = () => { | |
| 315 | + updateAssigneeForm.value = { | |
| 316 | + id: undefined, | |
| 317 | + assigneeUserId: undefined | |
| 318 | + } | |
| 319 | + updateAssigneeFormRef.value?.resetFields() | |
| 320 | +} | |
| 321 | + | |
| 219 | 322 | // ========== 初始化 ========== |
| 220 | 323 | onMounted(() => { |
| 324 | + // 加载详情 | |
| 221 | 325 | getDetail() |
| 326 | + // 加载用户的列表 | |
| 327 | + UserApi.getListSimpleUsersApi().then((data) => { | |
| 328 | + userOptions.value.push(...data) | |
| 329 | + }) | |
| 222 | 330 | }) |
| 223 | 331 | |
| 224 | 332 | const getDetail = () => { | ... | ... |
yudao-ui-admin-vue3/src/views/bpm/processInstance/detail2.vue
| 1 | 1 | <template> |
| 2 | 2 | <div class="app-container"> |
| 3 | 3 | |
| 4 | - <el-button | |
| 5 | - icon="el-icon-circle-close" | |
| 6 | - type="danger" | |
| 7 | - size="mini" | |
| 8 | - @click="handleAudit(item, false)" | |
| 9 | - >不通过</el-button | |
| 10 | - > | |
| 11 | - <el-button | |
| 12 | - icon="el-icon-edit-outline" | |
| 13 | - type="primary" | |
| 14 | - size="mini" | |
| 15 | - @click="handleUpdateAssignee(item)" | |
| 16 | - >转办</el-button | |
| 17 | - > | |
| 4 | + | |
| 5 | + | |
| 18 | 6 | <el-button |
| 19 | 7 | icon="el-icon-edit-outline" |
| 20 | 8 | type="primary" |
| ... | ... | @@ -44,44 +32,10 @@ |
| 44 | 32 | :taskData="tasks" |
| 45 | 33 | /> |
| 46 | 34 | </el-card> |
| 47 | - | |
| 48 | - <!-- 对话框(转派审批人) --> | |
| 49 | - <el-dialog title="转派审批人" :visible.sync="updateAssignee.open" width="500px" append-to-body> | |
| 50 | - <el-form | |
| 51 | - ref="updateAssigneeForm" | |
| 52 | - :model="updateAssignee.form" | |
| 53 | - :rules="updateAssignee.rules" | |
| 54 | - label-width="110px" | |
| 55 | - > | |
| 56 | - <el-form-item label="新审批人" prop="assigneeUserId"> | |
| 57 | - <el-select v-model="updateAssignee.form.assigneeUserId" clearable style="width: 100%"> | |
| 58 | - <el-option | |
| 59 | - v-for="item in userOptions" | |
| 60 | - :key="parseInt(item.id)" | |
| 61 | - :label="item.nickname" | |
| 62 | - :value="parseInt(item.id)" | |
| 63 | - /> | |
| 64 | - </el-select> | |
| 65 | - </el-form-item> | |
| 66 | - </el-form> | |
| 67 | - <div slot="footer" class="dialog-footer"> | |
| 68 | - <el-button type="primary" @click="submitUpdateAssigneeForm">确 定</el-button> | |
| 69 | - <el-button @click="cancelUpdateAssigneeForm">取 消</el-button> | |
| 70 | - </div> | |
| 71 | - </el-dialog> | |
| 72 | 35 | </div> |
| 73 | 36 | </template> |
| 74 | 37 | |
| 75 | 38 | <script> |
| 76 | -import { getProcessDefinitionBpmnXML } from "@/api/bpm/definition" | |
| 77 | -import { DICT_TYPE, getDictOptions } from "@/utils/dict" | |
| 78 | -import store from "@/store" | |
| 79 | -import { decodeFields } from "@/utils/formGenerator" | |
| 80 | -import Parser from '@/components/parser/Parser' | |
| 81 | -import { getProcessInstanceApi } from "@/api/bpm/processInstance" | |
| 82 | -import { approveTask, getTaskListByProcessInstanceId, rejectTask, updateTaskAssignee } from "@/api/bpm/task" | |
| 83 | -import { getListSimpleUsersApi } from "@/api/system/user" | |
| 84 | -import { getActivityList } from "@/api/bpm/activity" | |
| 85 | 39 | |
| 86 | 40 | // 流程实例的详情页,可用于审批 |
| 87 | 41 | export default { |
| ... | ... | @@ -95,92 +49,10 @@ export default { |
| 95 | 49 | prefix: "flowable" |
| 96 | 50 | }, |
| 97 | 51 | activityList: [], |
| 98 | - | |
| 99 | - // 转派审批人 | |
| 100 | - userOptions: [], | |
| 101 | - updateAssignee: { | |
| 102 | - open: false, | |
| 103 | - form: { | |
| 104 | - assigneeUserId: undefined, | |
| 105 | - }, | |
| 106 | - rules: { | |
| 107 | - assigneeUserId: [{ required: true, message: "新审批人不能为空", trigger: "change" }], | |
| 108 | - } | |
| 109 | - }, | |
| 110 | - | |
| 111 | - // 数据字典 | |
| 112 | - categoryDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_CATEGORY), | |
| 113 | 52 | } |
| 114 | 53 | }, |
| 115 | - created () { | |
| 116 | - this.id = this.$route.query.id | |
| 117 | - if (!this.id) { | |
| 118 | - this.$message.error('未传递 id 参数,无法查看流程信息') | |
| 119 | - return | |
| 120 | - } | |
| 121 | - this.getDetail() | |
| 122 | - | |
| 123 | - // 获得用户列表 | |
| 124 | - this.userOptions = [] | |
| 125 | - getListSimpleUsersApi().then(response => { | |
| 126 | - this.userOptions.push(...response.data) | |
| 127 | - }) | |
| 128 | - }, | |
| 129 | - methods: { | |
| 130 | - /** 获得流程实例 */ | |
| 131 | - getDetail () { | |
| 132 | - // 获得流程实例相关 | |
| 133 | - this.processInstanceLoading = true | |
| 134 | - getProcessInstanceApi(this.id).then(response => { | |
| 135 | - // 加载流程图 | |
| 136 | - getProcessDefinitionBpmnXML(this.processInstance.processDefinition.id).then(response => { | |
| 137 | - this.bpmnXML = response.data | |
| 138 | - }) | |
| 139 | - | |
| 140 | - // 加载活动列表 | |
| 141 | - getActivityList({ | |
| 142 | - processInstanceId: this.processInstance.id | |
| 143 | - }).then(response => { | |
| 144 | - this.activityList = response.data | |
| 145 | - }) | |
| 146 | - }) | |
| 147 | - }, | |
| 148 | 54 | |
| 149 | 55 | |
| 150 | - /** 处理转派审批人 */ | |
| 151 | - handleUpdateAssignee (task) { | |
| 152 | - // 设置表单 | |
| 153 | - this.resetUpdateAssigneeForm() | |
| 154 | - this.updateAssignee.form.id = task.id | |
| 155 | - // 设置为打开 | |
| 156 | - this.updateAssignee.open = true | |
| 157 | - }, | |
| 158 | - /** 提交转派审批人 */ | |
| 159 | - submitUpdateAssigneeForm () { | |
| 160 | - this.$refs['updateAssigneeForm'].validate(valid => { | |
| 161 | - if (!valid) { | |
| 162 | - return | |
| 163 | - } | |
| 164 | - updateTaskAssignee(this.updateAssignee.form).then(response => { | |
| 165 | - this.$modal.msgSuccess("转派任务成功!") | |
| 166 | - this.updateAssignee.open = false | |
| 167 | - this.getDetail() // 获得最新详情 | |
| 168 | - }) | |
| 169 | - }) | |
| 170 | - }, | |
| 171 | - /** 取消转派审批人 */ | |
| 172 | - cancelUpdateAssigneeForm () { | |
| 173 | - this.updateAssignee.open = false | |
| 174 | - this.resetUpdateAssigneeForm() | |
| 175 | - }, | |
| 176 | - /** 重置转派审批人 */ | |
| 177 | - resetUpdateAssigneeForm () { | |
| 178 | - this.updateAssignee.form = { | |
| 179 | - id: undefined, | |
| 180 | - assigneeUserId: undefined, | |
| 181 | - } | |
| 182 | - this.resetForm("updateAssigneeForm") | |
| 183 | - }, | |
| 184 | 56 | /** 处理审批退回的操作 */ |
| 185 | 57 | handleDelegate (task) { |
| 186 | 58 | this.$modal.msgError("暂不支持【委派】功能,可以使用【转派】替代!") |
| ... | ... | @@ -201,14 +73,3 @@ export default { |
| 201 | 73 | } |
| 202 | 74 | }; |
| 203 | 75 | </script> |
| 204 | - | |
| 205 | -<style lang="scss"> | |
| 206 | -.my-process-designer { | |
| 207 | - height: calc(100vh - 200px); | |
| 208 | -} | |
| 209 | - | |
| 210 | -.box-card { | |
| 211 | - width: 100%; | |
| 212 | - margin-bottom: 20px; | |
| 213 | -} | |
| 214 | -</style> | ... | ... |
yudao-ui-admin-vue3/src/views/bpm/processInstance/process.detail.ts deleted
| 1 | -import { reactive } from 'vue' | |
| 2 | -// import { useI18n } from '@/hooks/web/useI18n' | |
| 3 | -import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | |
| 4 | -import { DICT_TYPE } from '@/utils/dict' | |
| 5 | -// const { t } = useI18n() // 国际化 | |
| 6 | - | |
| 7 | -// CrudSchema | |
| 8 | -const crudSchemas = reactive<VxeCrudSchema>({ | |
| 9 | - primaryKey: 'id', | |
| 10 | - primaryType: 'id', | |
| 11 | - primaryTitle: '流程名称', | |
| 12 | - action: true, | |
| 13 | - actionWidth: '200px', | |
| 14 | - columns: [ | |
| 15 | - { | |
| 16 | - title: '流程分类', | |
| 17 | - field: 'category', | |
| 18 | - dictType: DICT_TYPE.BPM_MODEL_CATEGORY, | |
| 19 | - dictClass: 'number' | |
| 20 | - }, | |
| 21 | - { | |
| 22 | - title: '流程版本', | |
| 23 | - field: 'processDefinition.version', | |
| 24 | - table: { | |
| 25 | - slots: { | |
| 26 | - default: 'version_default' | |
| 27 | - } | |
| 28 | - } | |
| 29 | - }, | |
| 30 | - { | |
| 31 | - title: '流程描述', | |
| 32 | - field: 'description' | |
| 33 | - } | |
| 34 | - ] | |
| 35 | -}) | |
| 36 | -export const { allSchemas } = useVxeCrudSchemas(crudSchemas) |
yudao-ui-admin/src/views/bpm/processInstance/detail.vue
| ... | ... | @@ -163,10 +163,7 @@ export default { |
| 163 | 163 | rules: { |
| 164 | 164 | assigneeUserId: [{ required: true, message: "新审批人不能为空", trigger: "change" }], |
| 165 | 165 | } |
| 166 | - }, | |
| 167 | - | |
| 168 | - // 数据字典 | |
| 169 | - categoryDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_CATEGORY), | |
| 166 | + } | |
| 170 | 167 | }; |
| 171 | 168 | }, |
| 172 | 169 | created() { | ... | ... |