¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog v-model="dialog.visible" :title="dialog.title" width="50%" draggable :before-close="cancel" center :close-on-click-modal="false"> |
| | | <el-form v-loading="loading" :model="form" label-width="120px"> |
| | | <el-form-item label="æ¶æ¯æé"> |
| | | <el-checkbox-group v-model="form.messageType"> |
| | | <el-checkbox label="1" name="type" disabled>ç«å
ä¿¡</el-checkbox> |
| | | <el-checkbox label="2" name="type">é®ä»¶</el-checkbox> |
| | | <el-checkbox label="3" name="type">çä¿¡</el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | <el-form-item label="éä»¶" v-if="task.businessStatus === 'waiting'"> |
| | | <fileUpload v-model="form.fileId" :fileType="['doc', 'xls', 'ppt', 'txt', 'pdf', 'xlsx', 'docx', 'zip']" :fileSize="'20'"/> |
| | | </el-form-item> |
| | | <el-form-item label="æé"> |
| | | <el-button type="primary" @click="openUserSelectCopy" icon="Plus" circle /> |
| | | <el-tag v-for="user in selectCopyUserList" :key="user.userId" closable style="margin: 2px" @close="handleCopyCloseTag(user)"> |
| | | {{ user.userName }} |
| | | </el-tag> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§" v-if="task.businessStatus === 'waiting'"> |
| | | <el-input v-model="form.message" type="textarea" resize="none" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button v-loading="buttonLoading" type="primary" @click="handleCompleteTask"> æäº¤ </el-button> |
| | | <el-button v-if="task.businessStatus === 'waiting'" v-loading="buttonLoading" type="primary" @click="openDelegateTask"> å§æ </el-button> |
| | | <el-button v-if="task.businessStatus === 'waiting'" v-loading="buttonLoading" type="primary" @click="openTransferTask"> 转å </el-button> |
| | | <el-button v-if="task.businessStatus === 'waiting' && task.multiInstance" v-loading="buttonLoading" type="primary" @click="addMultiInstanceUser"> å ç¾ </el-button> |
| | | <el-button v-if="task.businessStatus === 'waiting' && task.multiInstance" v-loading="buttonLoading" type="primary" @click="deleteMultiInstanceUser"> åç¾ </el-button> |
| | | <el-button v-if="task.businessStatus === 'waiting'" v-loading="buttonLoading" type="danger" @click="handleTerminationTask"> ç»æ¢ </el-button> |
| | | <el-button v-if="task.businessStatus === 'waiting'" v-loading="buttonLoading" type="danger" @click="handleBackProcessOpen"> éå </el-button> |
| | | <el-button v-loading="buttonLoading" @click="cancel">åæ¶</el-button> |
| | | </span> |
| | | </template> |
| | | <!-- æé --> |
| | | <UserSelect ref="userSelectCopyRef" :multiple="true" :data="selectCopyUserIds" @confirm-call-back="userSelectCopyCallBack"></UserSelect> |
| | | <!-- 转å --> |
| | | <UserSelect ref="transferTaskRef" :multiple="false" @confirm-call-back="handleTransferTask"></UserSelect> |
| | | <!-- å§æ --> |
| | | <UserSelect ref="delegateTaskRef" :multiple="false" @confirm-call-back="handleDelegateTask"></UserSelect> |
| | | <!-- å ç¾ç»ä»¶ --> |
| | | <multiInstanceUser ref="multiInstanceUserRef" :title="title" @submit-callback='closeDialog' /> |
| | | |
| | | <!-- 驳åå¼å§ --> |
| | | <el-dialog v-model="backVisible" draggable title="驳å" width="40%" :close-on-click-modal="false"> |
| | | <el-form v-loading="backLoading" :model="backForm" label-width="120px" v-if="task.businessStatus === 'waiting'"> |
| | | <el-form-item label="驳åèç¹"> |
| | | <el-select clearable placeholder="è¯·éæ©" v-model="backForm.targetActivityId" style="width: 300px"> |
| | | <el-option |
| | | v-for="item in taskNodeList" |
| | | :key="item.nodeId" |
| | | :label="item.nodeName" |
| | | :value="item.nodeId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶æ¯æé"> |
| | | <el-checkbox-group v-model="backForm.messageType"> |
| | | <el-checkbox label="1" name="type" disabled>ç«å
ä¿¡</el-checkbox> |
| | | <el-checkbox label="2" name="type">é®ä»¶</el-checkbox> |
| | | <el-checkbox label="3" name="type">çä¿¡</el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§"> |
| | | <el-input v-model="backForm.message" type="textarea" resize="none" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer" style="float: right;padding-bottom: 20px;"> |
| | | <el-button type="primary" v-loading="backLoading" @click="handleBackProcess">确认</el-button> |
| | | <el-button v-loading="backLoading" @click="backVisible = false">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- 驳åç»æ --> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { ref } from 'vue'; |
| | | import { ComponentInternalInstance } from 'vue'; |
| | | import { ElForm } from 'element-plus'; |
| | | import { completeTask, backProcess, getTaskById,transferTask,terminationTask,getTaskNodeList,delegateTask } from '@/api/workflow/task'; |
| | | import UserSelect from '@/components/UserSelect'; |
| | | import MultiInstanceUser from '@/components/Process/multiInstanceUser.vue'; |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | import { UserVO } from '@/api/system/user/types'; |
| | | import { TaskVO } from '@/api/workflow/task/types'; |
| | | const userSelectCopyRef = ref<InstanceType<typeof UserSelect>>(); |
| | | const transferTaskRef = ref<InstanceType<typeof UserSelect>>(); |
| | | const delegateTaskRef = ref<InstanceType<typeof UserSelect>>(); |
| | | |
| | | //å ç¾ç»ä»¶ |
| | | const multiInstanceUserRef = ref<InstanceType<typeof MultiInstanceUser>>(); |
| | | |
| | | const props = defineProps({ |
| | | taskVariables: { |
| | | type: Object as () => Record<string, any>, |
| | | default: {} |
| | | } |
| | | }); |
| | | //é®ç½©å± |
| | | const loading = ref(true); |
| | | //æé® |
| | | const buttonLoading = ref(true); |
| | | //ä»»å¡id |
| | | const taskId = ref<string>(''); |
| | | //æé人 |
| | | const selectCopyUserList = ref<UserVO[]>([]); |
| | | //æé人id |
| | | const selectCopyUserIds = ref<string>(undefined); |
| | | // 驳忝妿¾ç¤º |
| | | const backVisible = ref(false); |
| | | const backLoading = ref(true); |
| | | // å¯é©³åå¾ä»»å¡èç¹ |
| | | const taskNodeList = ref([]); |
| | | //ä»»å¡ |
| | | const task = ref<TaskVO>({ |
| | | id: undefined, |
| | | name: undefined, |
| | | description: undefined, |
| | | priority: undefined, |
| | | owner: undefined, |
| | | assignee: undefined, |
| | | assigneeName: undefined, |
| | | processInstanceId: undefined, |
| | | executionId: undefined, |
| | | taskDefinitionId: undefined, |
| | | processDefinitionId: undefined, |
| | | endTime: undefined, |
| | | taskDefinitionKey: undefined, |
| | | dueDate: undefined, |
| | | category: undefined, |
| | | parentTaskId: undefined, |
| | | tenantId: undefined, |
| | | claimTime: undefined, |
| | | businessStatus: undefined, |
| | | businessStatusName: undefined, |
| | | processDefinitionName: undefined, |
| | | processDefinitionKey: undefined, |
| | | participantVo: undefined, |
| | | multiInstance: undefined, |
| | | businessKey: undefined, |
| | | wfNodeConfigVo: undefined |
| | | }); |
| | | //å ç¾ åç¾æ é¢ |
| | | const title = ref(''); |
| | | const dialog = reactive<DialogOption>({ |
| | | visible: false, |
| | | title: 'æç¤º' |
| | | }); |
| | | |
| | | const form = ref<Record<string, any>>({ |
| | | taskId: undefined, |
| | | message: undefined, |
| | | variables: {}, |
| | | messageType: ['1'], |
| | | wfCopyList: [] |
| | | }); |
| | | const backForm = ref<Record<string, any>>({ |
| | | taskId: undefined, |
| | | targetActivityId: undefined, |
| | | message: undefined, |
| | | variables: {}, |
| | | messageType: ['1'] |
| | | }); |
| | | const closeDialog = () => { |
| | | dialog.visible = false |
| | | } |
| | | //æå¼å¼¹çª |
| | | const openDialog = (id?: string) => { |
| | | selectCopyUserIds.value = undefined |
| | | selectCopyUserList.value = [] |
| | | form.value.fileId = undefined |
| | | taskId.value = id; |
| | | form.value.message = undefined; |
| | | dialog.visible = true; |
| | | loading.value = true; |
| | | buttonLoading.value = true; |
| | | nextTick(() => { |
| | | getTaskById(taskId.value).then((response) => { |
| | | task.value = response.data; |
| | | loading.value = false; |
| | | buttonLoading.value = false; |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => {}); |
| | | const emits = defineEmits(['submitCallback', 'cancelCallback']); |
| | | |
| | | /** åçæµç¨ */ |
| | | const handleCompleteTask = async () => { |
| | | form.value.taskId = taskId.value; |
| | | form.value.taskVariables = props.taskVariables; |
| | | if(selectCopyUserList && selectCopyUserList.value.length > 0){ |
| | | let wfCopyList = [] |
| | | selectCopyUserList.value.forEach( e=> { |
| | | let copyUser = { |
| | | userId: e.userId, |
| | | userName: e.nickName |
| | | } |
| | | wfCopyList.push(copyUser) |
| | | }) |
| | | form.value.wfCopyList = wfCopyList |
| | | } |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤æäº¤ï¼'); |
| | | loading.value = true; |
| | | buttonLoading.value = true; |
| | | try { |
| | | await completeTask(form.value); |
| | | dialog.visible = false; |
| | | emits('submitCallback'); |
| | | proxy?.$modal.msgSuccess('æä½æå'); |
| | | } finally { |
| | | loading.value = false |
| | | buttonLoading.value = false |
| | | } |
| | | }; |
| | | |
| | | /** 驳åå¼¹çªæå¼ */ |
| | | const handleBackProcessOpen = async () => { |
| | | backForm.value = {} |
| | | backForm.value.messageType = ['1'] |
| | | backVisible.value = true |
| | | backLoading.value = true |
| | | let data = await getTaskNodeList(task.value.processInstanceId) |
| | | taskNodeList.value = data.data |
| | | backLoading.value = false |
| | | backForm.value.targetActivityId = taskNodeList.value[0].nodeId |
| | | } |
| | | /** é©³åæµç¨ */ |
| | | const handleBackProcess = async () => { |
| | | backForm.value.taskId = taskId.value; |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤é©³åå°ç³è¯·äººï¼'); |
| | | loading.value = true; |
| | | backLoading.value = true; |
| | | await backProcess(backForm.value).finally(() => (loading.value = false)); |
| | | dialog.visible = false; |
| | | backLoading.value = false |
| | | emits('submitCallback'); |
| | | proxy?.$modal.msgSuccess('æä½æå'); |
| | | }; |
| | | //åæ¶ |
| | | const cancel = async () => { |
| | | dialog.visible = false; |
| | | buttonLoading.value = false; |
| | | emits('cancelCallback'); |
| | | }; |
| | | //æå¼æé人å |
| | | const openUserSelectCopy = () => { |
| | | userSelectCopyRef.value.open(); |
| | | }; |
| | | //确认æé人å |
| | | const userSelectCopyCallBack = (data: UserVO[]) => { |
| | | if(data && data.length > 0){ |
| | | selectCopyUserList.value = data |
| | | selectCopyUserIds.value = selectCopyUserList.value.map((item) => item.userId).join(','); |
| | | } |
| | | } |
| | | //å 餿é人å |
| | | const handleCopyCloseTag = (user: UserVO) => { |
| | | const userId = user.userId; |
| | | // 使ç¨splitå é¤ç¨æ· |
| | | const index = selectCopyUserList.value.findIndex((item) => item.userId === userId); |
| | | selectCopyUserList.value.splice(index, 1); |
| | | selectCopyUserIds.value = selectCopyUserList.value.map((item) => item.userId).join(','); |
| | | }; |
| | | //å ç¾ |
| | | const addMultiInstanceUser = () => { |
| | | if (multiInstanceUserRef.value) { |
| | | title.value = 'å ç¾äººå'; |
| | | multiInstanceUserRef.value.getAddMultiInstanceList(taskId.value, []); |
| | | } |
| | | }; |
| | | //åç¾ |
| | | const deleteMultiInstanceUser = () => { |
| | | if (multiInstanceUserRef.value) { |
| | | title.value = 'åç¾äººå'; |
| | | multiInstanceUserRef.value.getDeleteMultiInstanceList(taskId.value); |
| | | } |
| | | }; |
| | | //æå¼è½¬å |
| | | const openTransferTask = () => { |
| | | transferTaskRef.value.open(); |
| | | }; |
| | | //转å |
| | | const handleTransferTask = async (data) => { |
| | | if(data && data.length > 0){ |
| | | let params = { |
| | | taskId: taskId.value, |
| | | userId: data[0].userId, |
| | | comment: form.value.message |
| | | } |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤æäº¤ï¼'); |
| | | loading.value = true; |
| | | buttonLoading.value = true; |
| | | await transferTask(params).finally(() => (loading.value = false)); |
| | | dialog.visible = false; |
| | | emits('submitCallback'); |
| | | proxy?.$modal.msgSuccess('æä½æå'); |
| | | }else{ |
| | | proxy?.$modal.msgWarning('è¯·éæ©ç¨æ·ï¼'); |
| | | } |
| | | } |
| | | |
| | | //æå¼å§æ |
| | | const openDelegateTask = () => { |
| | | delegateTaskRef.value.open(); |
| | | }; |
| | | //å§æ |
| | | const handleDelegateTask = async (data) => { |
| | | if(data && data.length > 0){ |
| | | let params = { |
| | | taskId: taskId.value, |
| | | userId: data[0].userId, |
| | | nickName: data[0].nickName |
| | | } |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤æäº¤ï¼'); |
| | | loading.value = true; |
| | | buttonLoading.value = true; |
| | | await delegateTask(params).finally(() => (loading.value = false)); |
| | | dialog.visible = false; |
| | | emits('submitCallback'); |
| | | proxy?.$modal.msgSuccess('æä½æå'); |
| | | }else{ |
| | | proxy?.$modal.msgWarning('è¯·éæ©ç¨æ·ï¼'); |
| | | } |
| | | } |
| | | //ç»æ¢ä»»å¡ |
| | | const handleTerminationTask = async (data) => { |
| | | let params = { |
| | | taskId: taskId.value, |
| | | comment: form.value.message |
| | | } |
| | | await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤ç»æ¢ï¼'); |
| | | loading.value = true; |
| | | buttonLoading.value = true; |
| | | await terminationTask(params).finally(() => (loading.value = false)); |
| | | dialog.visible = false; |
| | | emits('submitCallback'); |
| | | proxy?.$modal.msgSuccess('æä½æå'); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 坹夿´é²åç»ä»¶æ¹æ³ |
| | | */ |
| | | defineExpose({ |
| | | openDialog |
| | | }); |
| | | </script> |