diff --git a/apps/web-antd/src/api/workflow/task/index.ts b/apps/web-antd/src/api/workflow/task/index.ts index d38006e7..dd80c256 100644 --- a/apps/web-antd/src/api/workflow/task/index.ts +++ b/apps/web-antd/src/api/workflow/task/index.ts @@ -2,6 +2,8 @@ import type { CompleteTaskReqData, StartWorkFlowReqData, TaskInfo, + TaskOperationData, + TaskOperationType, } from './model'; import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; @@ -88,7 +90,7 @@ export function pageByTaskCopy(params?: PageQuery) { * @returns info */ export function getTaskByTaskId(taskId: string) { - return requestClient.get(`/workflow/task/${taskId}`); + return requestClient.get(`/workflow/task/getTask/${taskId}`); } /** @@ -107,11 +109,14 @@ export function terminationTask(data: { taskId: string }) { * @param taskOperationData 参数 * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature */ -export function taskOperation(taskOperationData: any, taskOperation: string) { - return requestClient.postWithMsg('/workflow/task/taskOperation', { - ...taskOperationData, - taskOperation, - }); +export function taskOperation( + taskOperationData: TaskOperationData, + taskOperation: TaskOperationType, +) { + return requestClient.postWithMsg( + `/workflow/task/taskOperation/${taskOperation}`, + taskOperationData, + ); } /** diff --git a/apps/web-antd/src/api/workflow/task/model.d.ts b/apps/web-antd/src/api/workflow/task/model.d.ts index cbbb6b19..894f601a 100644 --- a/apps/web-antd/src/api/workflow/task/model.d.ts +++ b/apps/web-antd/src/api/workflow/task/model.d.ts @@ -23,7 +23,7 @@ export interface TaskInfo { assigneeNames: string; processedBy: string; type: string; - nodeRatio?: any; + nodeRatio?: string; createBy: string; createByName: string; } @@ -52,3 +52,21 @@ export interface StartWorkFlowReqData { */ variables: Record; } + +export interface TaskOperationData { + message?: string; + taskId: ID; + // 单个操作人 + userId?: ID; + // 多个操作人 + userIds?: IDS; +} + +/** + * 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ +export type TaskOperationType = + | 'addSignature' + | 'delegateTask' + | 'reductionSignature' + | 'transferTask'; diff --git a/apps/web-antd/src/views/system/user/dept-tree.vue b/apps/web-antd/src/views/system/user/dept-tree.vue index ad7ba42a..00d06c8b 100644 --- a/apps/web-antd/src/views/system/user/dept-tree.vue +++ b/apps/web-antd/src/views/system/user/dept-tree.vue @@ -10,6 +10,8 @@ import { getDeptTree } from '#/api/system/user'; defineOptions({ inheritAttrs: false }); +withDefaults(defineProps<{ showSearch?: boolean }>(), { showSearch: true }); + const emit = defineEmits<{ /** * 点击刷新按钮的事件 @@ -68,7 +70,10 @@ onMounted(loadTree); class="bg-background flex h-full flex-col overflow-y-auto rounded-lg" > -
+
+import type { User } from '#/api/core/user'; import type { FlowInfoResponse } from '#/api/workflow/instance/model'; import type { TaskInfo } from '#/api/workflow/task/model'; @@ -6,11 +7,15 @@ import { computed, onUnmounted, ref, watch } from 'vue'; import { Fallback, useVbenModal, VbenAvatar } from '@vben/common-ui'; import { DictEnum } from '@vben/constants'; +import { getPopupContainer } from '@vben/utils'; import { useEventListener } from '@vueuse/core'; import { Card, Divider, + Dropdown, + Menu, + MenuItem, Modal, Popconfirm, Skeleton, @@ -20,10 +25,15 @@ import { } from 'ant-design-vue'; import { flowInfo } from '#/api/workflow/instance'; -import { terminationTask } from '#/api/workflow/task'; +import { + getTaskByTaskId, + taskOperation, + terminationTask, +} from '#/api/workflow/task'; import { renderDict } from '#/utils/render'; import { approvalModal, approvalRejectionModal, ApprovalTimeline } from '.'; +import userSelectModal from './user-select-modal.vue'; defineOptions({ name: 'ApprovalPanel', @@ -33,6 +43,20 @@ defineOptions({ // eslint-disable-next-line no-use-before-define const props = defineProps<{ task?: TaskInfo; type: ApprovalType }>(); +const currentTask = ref(); +/** + * 是否显示 加签/减签操作 + */ +const showMultiActions = computed(() => { + if (!currentTask.value) { + return false; + } + if (Number(currentTask.value.nodeRatio) > 0) { + return true; + } + return false; +}); + /** * myself 我发起的 * readonly 只读 只用于查看 @@ -75,6 +99,9 @@ async function handleLoadInfo(task: TaskInfo | undefined) { iframeLoaded.value = false; const resp = await flowInfo(task.businessId); currentFlowInfo.value = resp; + + const taskResp = await getTaskByTaskId(props.task!.id); + currentTask.value = taskResp; } catch (error) { console.error(error); } finally { @@ -129,6 +156,89 @@ function handleApproval() { approvalModalApi.setData({ taskId: props.task?.id }); approvalModalApi.open(); } + +/** + * TODO: 1提取公共函数 2原版是可以填写意见的(message参数) + */ + +/** + * 委托 + */ +const [DelegationModal, delegationModalApi] = useVbenModal({ + connectedComponent: userSelectModal, +}); +function handleDelegation(userList: User[]) { + if (userList.length === 0) return; + const current = userList[0]; + Modal.confirm({ + title: '委托', + content: `确定委托给${current?.nickName}吗?`, + centered: true, + onOk: async () => { + await taskOperation( + { taskId: props.task!.id, userId: current!.userId }, + 'delegateTask', + ); + }, + }); +} + +/** + * 转办 + */ +const [TransferModal, transferModalApi] = useVbenModal({ + connectedComponent: userSelectModal, +}); +function handleTransfer(userList: User[]) { + if (userList.length === 0) return; + const current = userList[0]; + Modal.confirm({ + title: '转办', + content: `确定转办给${current?.nickName}吗?`, + centered: true, + onOk: async () => { + await taskOperation( + { taskId: props.task!.id, userId: current!.userId }, + 'transferTask', + ); + }, + }); +} + +const [AddSignatureModal, addSignatureModalApi] = useVbenModal({ + connectedComponent: userSelectModal, +}); +function handleAddSignature(userList: User[]) { + if (userList.length === 0) return; + const userIds = userList.map((user) => user.userId); + Modal.confirm({ + title: '提示', + content: '确认加签吗?', + centered: true, + onOk: async () => { + await taskOperation({ taskId: props.task!.id, userIds }, 'addSignature'); + }, + }); +} + +const [ReductionSignatureModal, reductionSignatureModalApi] = useVbenModal({ + connectedComponent: userSelectModal, +}); +function handleReductionSignature(userList: User[]) { + if (userList.length === 0) return; + const userIds = userList.map((user) => user.userId); + Modal.confirm({ + title: '提示', + content: '确认加签吗?', + centered: true, + onOk: async () => { + await taskOperation( + { taskId: props.task!.id, userIds }, + 'reductionSignature', + ); + }, + }); +} - +