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 * ID
*/ */
businessKey: ID; businessId: ID;
/** /**
* flowCode * flowCode
*/ */

View File

@ -8,6 +8,8 @@ import { cloneDeep } from 'lodash-es';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { completeTask } from '#/api/workflow/task'; import { completeTask } from '#/api/workflow/task';
import { CopyComponent } from '.';
interface Emits { interface Emits {
/** /**
* 完成 * 完成
@ -71,9 +73,14 @@ async function handleSubmit() {
const { messageType, flowCopyList } = cloneDeep(await formApi.getValues()); const { messageType, flowCopyList } = cloneDeep(await formApi.getValues());
const { taskId, taskVariables, variables } = const { taskId, taskVariables, variables } =
modalApi.getData() as ModalProps; modalApi.getData() as ModalProps;
//
const flowCCList = (flowCopyList as Array<any>).map((item) => ({
userId: item.userId,
userName: item.nickName,
}));
const data = { const data = {
messageType, messageType,
flowCopyList, flowCopyList: flowCCList,
taskId, taskId,
taskVariables, taskVariables,
variables, variables,
@ -92,8 +99,8 @@ async function handleSubmit() {
<template> <template>
<BasicModal> <BasicModal>
<BasicForm> <BasicForm>
<template #flowCopyList> <template #flowCopyList="slotProps">
<div>TODO: 等待组件开发</div> <CopyComponent v-model:user-list="slotProps.modelValue" />
</template> </template>
</BasicForm> </BasicForm>
</BasicModal> </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 approvalRejectionModal } from './approval-rejection-modal.vue';
export { default as ApprovalTimeline } from './approval-timeline.vue'; export { default as ApprovalTimeline } from './approval-timeline.vue';
/**
*
*/
export { default as CopyComponent } from './copy-component.vue';
/** /**
* modal * modal
*/ */
export { default as flowInfoModal } from './flow-info-modal.vue'; 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"> <script setup lang="ts">
import type { User } from '#/api'; import type { User } from '#/api';
@ -27,6 +28,16 @@ const [BasicModal, modalApi] = useVbenModal({
class: 'w-[1000px]', class: 'w-[1000px]',
fullscreenButton: false, fullscreenButton: false,
onConfirm: handleSubmit, 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', wrapperClass: 'grid-cols-2',
handleReset: async () => { handleReset: async () => {
selectDeptId.value = []; selectDeptId.value = [];
// eslint-disable-next-line no-use-before-define
const { formApi, reload } = tableApi; const { formApi, reload } = tableApi;
await formApi.resetForm(); await formApi.resetForm();
const formValues = formApi.form.values; const formValues = formApi.form.values;
formApi.setLatestSubmissionValues(formValues); formApi.setLatestSubmissionValues(formValues);
// eslint-disable-next-line no-use-before-define
await rightTableApi.grid.loadData([]); await rightTableApi.grid.loadData([]);
await reload(formValues); await reload(formValues);
}, },
@ -144,8 +153,6 @@ function checkBoxEvent() {
} }
// //
const records = tableApi.grid.getCheckboxRecords(); const records = tableApi.grid.getCheckboxRecords();
console.log(records);
// eslint-disable-next-line no-use-before-define
rightTableApi.grid.loadData(records); rightTableApi.grid.loadData(records);
} }
@ -155,7 +162,6 @@ function radioEvent() {
} }
// //
const records = tableApi.grid.getRadioRecord(); const records = tableApi.grid.getRadioRecord();
// eslint-disable-next-line no-use-before-define
rightTableApi.grid.loadData([records]); rightTableApi.grid.loadData([records]);
} }
@ -234,7 +240,6 @@ async function handleDeptQuery() {
function handleSubmit() { function handleSubmit() {
const records = rightTableApi.grid.getData(); const records = rightTableApi.grid.getData();
console.log(records);
emit('finish', records); emit('finish', records);
modalApi.close(); modalApi.close();
} }

View File

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

View File

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