feat: 抄送选择

This commit is contained in:
dap 2024-12-18 09:32:53 +08:00
parent b641b0eb15
commit 3de8104e44
7 changed files with 93 additions and 16 deletions

View File

@ -42,7 +42,7 @@ export interface StartWorkFlowReqData {
/**
* ID
*/
businessKey: ID;
businessId: ID;
/**
* flowCode
*/

View File

@ -8,6 +8,8 @@ import { cloneDeep } from 'lodash-es';
import { useVbenForm } from '#/adapter/form';
import { completeTask } from '#/api/workflow/task';
import { CopyComponent } from '.';
interface Emits {
/**
* 完成
@ -71,9 +73,14 @@ async function handleSubmit() {
const { messageType, flowCopyList } = cloneDeep(await formApi.getValues());
const { taskId, taskVariables, variables } =
modalApi.getData() as ModalProps;
//
const flowCCList = (flowCopyList as Array<any>).map((item) => ({
userId: item.userId,
userName: item.nickName,
}));
const data = {
messageType,
flowCopyList,
flowCopyList: flowCCList,
taskId,
taskVariables,
variables,
@ -92,8 +99,8 @@ async function handleSubmit() {
<template>
<BasicModal>
<BasicForm>
<template #flowCopyList>
<div>TODO: 等待组件开发</div>
<template #flowCopyList="slotProps">
<CopyComponent v-model:user-list="slotProps.modelValue" />
</template>
</BasicForm>
</BasicModal>

View File

@ -1,4 +1,60 @@
<!--抄送组件-->
<script setup lang="ts"></script>
<script setup lang="ts">
import type { User } from '#/api/core/user';
<template>dsadsa</template>
import type { PropType } from 'vue';
import { useVbenModal, VbenAvatar } from '@vben/common-ui';
import { AvatarGroup, Tooltip } from 'ant-design-vue';
import { userSelectModal } from '.';
defineOptions({
name: 'CopyComponent',
inheritAttrs: false,
});
const [UserSelectModal, modalApi] = useVbenModal({
connectedComponent: userSelectModal,
});
const userListModel = defineModel('userList', {
type: Array as PropType<User[]>,
default: () => [],
});
function handleOpen() {
modalApi.setData({ userList: userListModel.value });
modalApi.open();
}
function handleFinish(userList: User[]) {
// []
userListModel.value.splice(0, userListModel.value.length);
userListModel.value.push(...userList);
}
</script>
<template>
<div class="flex items-center gap-2">
<AvatarGroup v-if="userListModel.length > 0">
<Tooltip
v-for="user in userListModel"
:key="user.userId"
:title="user.nickName"
placement="top"
>
<div>
<VbenAvatar
:alt="user.nickName"
class="bg-primary size-[36px] rounded-full border text-white"
src=""
/>
</div>
</Tooltip>
</AvatarGroup>
<a-button size="small" @click="handleOpen">选择人员</a-button>
<UserSelectModal @finish="handleFinish" />
</div>
</template>

View File

@ -10,12 +10,16 @@ export { default as ApprovalPanel } from './approval-panel.vue';
*/
export { default as approvalRejectionModal } from './approval-rejection-modal.vue';
export { default as ApprovalTimeline } from './approval-timeline.vue';
/**
*
*/
export { default as CopyComponent } from './copy-component.vue';
/**
* modal
*/
export { default as flowInfoModal } from './flow-info-modal.vue';
/**
* /
*/
export { default as UserSelectModal } from './user-select-modal.vue';
export { default as userSelectModal } from './user-select-modal.vue';

View File

@ -1,3 +1,4 @@
<!-- eslint-disable no-use-before-define -->
<script setup lang="ts">
import type { User } from '#/api';
@ -27,6 +28,16 @@ const [BasicModal, modalApi] = useVbenModal({
class: 'w-[1000px]',
fullscreenButton: false,
onConfirm: handleSubmit,
async onOpened() {
const { userList } = modalApi.getData() as { userList: User[] };
//
if (props.mode === 'multiple') {
//
await tableApi.grid.setCheckboxRow(userList, true);
//
await rightTableApi.grid.loadData(userList);
}
},
});
//
@ -52,12 +63,10 @@ const formOptions: VbenFormProps = {
wrapperClass: 'grid-cols-2',
handleReset: async () => {
selectDeptId.value = [];
// eslint-disable-next-line no-use-before-define
const { formApi, reload } = tableApi;
await formApi.resetForm();
const formValues = formApi.form.values;
formApi.setLatestSubmissionValues(formValues);
// eslint-disable-next-line no-use-before-define
await rightTableApi.grid.loadData([]);
await reload(formValues);
},
@ -144,8 +153,6 @@ function checkBoxEvent() {
}
//
const records = tableApi.grid.getCheckboxRecords();
console.log(records);
// eslint-disable-next-line no-use-before-define
rightTableApi.grid.loadData(records);
}
@ -155,7 +162,6 @@ function radioEvent() {
}
//
const records = tableApi.grid.getRadioRecord();
// eslint-disable-next-line no-use-before-define
rightTableApi.grid.loadData([records]);
}
@ -234,7 +240,6 @@ async function handleDeptQuery() {
function handleSubmit() {
const records = rightTableApi.grid.getData();
console.log(records);
emit('finish', records);
modalApi.close();
}

View File

@ -16,7 +16,7 @@ import {
import { cancelProcessApply } from '#/api/workflow/instance';
import { commonDownloadExcel } from '#/utils/file/download';
import { flowInfoModal } from '../components';
import { applyModal, flowInfoModal } from '../components';
import userSelectModal from '../components/user-select-modal.vue';
import { leaveExport, leaveList, leaveRemove } from './api';
import { columns, querySchema } from './data';
@ -129,6 +129,9 @@ const [UserSelectModal, testApi] = useVbenModal({
function handleTest() {
testApi.open();
}
const [ApplyModal, applyModalApi] = useVbenModal({
connectedComponent: applyModal,
});
</script>
<template>
@ -137,6 +140,7 @@ function handleTest() {
<template #toolbar-tools>
<Space>
<a-button @click="handleTest">test选人</a-button>
<a-button @click="() => applyModalApi.open()">test抄送</a-button>
<a-button
v-access:code="['workflow:leave:export']"
@click="handleDownloadExcel"
@ -205,5 +209,6 @@ function handleTest() {
</BasicTable>
<UserSelectModal mode="single" />
<FlowInfoModal />
<ApplyModal />
</Page>
</template>

View File

@ -116,7 +116,7 @@ async function handleStartWorkFlow() {
const formValues = await formApi.getValues();
const flowCode = formValues?.flowType ?? 'leave1';
const startWorkFlowData: StartWorkFlowReqData = {
businessKey: leaveResp!.id,
businessId: leaveResp!.id,
flowCode,
variables: taskVariables,
};