feat(oa): 添加出差申请和售后申请的抄送功能

- 在出差申请编辑页面添加抄送人员选择下拉框
- 实现抄送人员的自动填充逻辑,包括默认人员和部门负责人
- 在售后申请中添加项目管理角色用户作为抄送对象
dev
Yangk 7 days ago
parent 4a6fe1b747
commit 3338d4fd90

@ -263,6 +263,11 @@ export interface BusinessTripApplyForm extends BaseEntity {
*
*/
flowCode?: string;
/**
* ID
*/
copyUserIds?: string | string[];
}
export interface BusinessTripApplyQuery extends PageQuery {

@ -181,7 +181,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" v-if="!isFormDisabled">
<el-form-item label="下一步审批人" prop="variables.approverId">
<el-select
v-model="form.variables.approverId"
@ -189,13 +189,19 @@
filterable
clearable
style="width: 100%"
:disabled="isFormDisabled"
@change="handleApproverSelectChange"
>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="!isFormDisabled">
<el-form-item label="抄送人员" prop="copyUserIds">
<el-select v-model="form.copyUserIds" placeholder="请选择抄送人员" filterable clearable multiple style="width: 100%">
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="String(user.userId)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
@ -227,6 +233,7 @@ import ProjectSelect from '@/components/ProjectSelect/index.vue';
import { CodeRuleEnum, FlowCodeEnum } from '@/enums/OAEnum';
import { getInfo } from '@/api/login';
import { listUser } from '@/api/system/user'; // API
import { allListDept } from '@/api/system/dept'; // API
import { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
import dayjs from 'dayjs';
@ -248,6 +255,10 @@ const projectSelectRef = ref<InstanceType<typeof ProjectSelect>>();
// const userSelectRef = ref<InstanceType<typeof UserSelect>>(); // ref
const userList = ref<any[]>([]); //
const deptInfoList = ref<any[]>([]); //
//
const defaultCopyUserNames = ['米兰', '于洋', '张兰艳', '张东辉', '冯俊杰'];
//
const submitFormData = ref<StartProcessBo>({
@ -283,7 +294,8 @@ const initFormData: BusinessTripApplyForm = {
flowStatus: 'draft',
remark: undefined,
ossId: undefined,
variables: {} // variables
variables: {}, // variables
copyUserIds: [] as string[] // ID
};
const data = reactive({
@ -327,15 +339,40 @@ onMounted(async () => {
routeParams.value = route.query;
const id = routeParams.value.id;
// ()
const userRes = await listUser({ pageNum: 1, pageSize: 1000 });
userList.value = userRes.rows;
// ()
const deptRes = await allListDept({ deptCategory: '03' } as any);
deptInfoList.value = deptRes.data || [];
//
if (!id) {
try {
const userRes = await getInfo();
if (userRes.data?.user) {
form.value.applicantId = userRes.data.user.userId;
form.value.applicantName = userRes.data.user.nickName;
form.value.deptId = userRes.data.user.deptId;
form.value.deptName = userRes.data.user.deptName;
const infoRes = await getInfo();
if (infoRes.data?.user) {
form.value.applicantId = infoRes.data.user.userId;
form.value.applicantName = infoRes.data.user.nickName;
form.value.deptId = infoRes.data.user.deptId;
form.value.deptName = infoRes.data.user.deptName;
// ID
const deptInfo = deptInfoList.value.find((d: any) => d.deptId === infoRes.data.user.deptId);
if (deptInfo) {
const deptLeaderId = deptInfo.leader;
const vicePresidentId = deptInfo.vicePresident;
//
const deptCopyIds: string[] = [];
if (deptLeaderId) deptCopyIds.push(String(deptLeaderId));
if (vicePresidentId) deptCopyIds.push(String(vicePresidentId));
//
const defaultCopyIds = userList.value.filter((u: any) => defaultCopyUserNames.includes(u.nickName)).map((u: any) => String(u.userId));
// /()
form.value.copyUserIds = [...new Set([...defaultCopyIds, ...deptCopyIds])];
}
}
} catch (e) {
console.error('获取用户信息失败', e);
@ -346,14 +383,13 @@ onMounted(async () => {
}
}
// ()
listUser({ pageNum: 1, pageSize: 1000 }).then((res: any) => {
userList.value = res.rows;
});
if (id && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
const res = await getBusinessTripApply(id);
Object.assign(form.value, res.data);
//
if (form.value.copyUserIds && typeof form.value.copyUserIds === 'string') {
form.value.copyUserIds = (form.value.copyUserIds as string).split(',').filter((id) => id);
}
}
});
});
@ -426,9 +462,12 @@ const executeSubmit = async (status: string, mode: boolean) => {
//
form.value.tripStatus = '2'; //
form.value.flowStatus = 'waiting';
// ID
const copyUserIdsStr = Array.isArray(form.value.copyUserIds) ? form.value.copyUserIds.join(',') : form.value.copyUserIds || '';
form.value.variables = {
...form.value.variables,
tripType: form.value.tripType
tripType: form.value.tripType,
businessTripCopyUsers: copyUserIdsStr
};
form.value.bizExt = {
businessTitle: '出差申请',

@ -461,6 +461,9 @@ const editingIndex = ref<number>(-1); // 材料表编辑索引 (-1 为新增)
const checkedLabor = ref<any[]>([]); //
const checkedMaterial = ref<any[]>([]); //
//
const projectMgrUserNames = ['于洋'];
//
const submitFormData = ref<StartProcessBo>({ businessId: '', flowCode: '', variables: {}, bizExt: {} });
const taskVariables = ref<Record<string, any>>({});
@ -929,10 +932,13 @@ const executeSubmit = async (status: string, mode: boolean) => {
if (status !== 'draft') {
// --- ---
submitData.flowCode = FlowCodeEnum.AFTER_SALES_KEY;
//
const copyUserIds = userList.value.filter((u: any) => projectMgrUserNames.includes(u.nickName)).map((u: any) => String(u.userId));
submitData.variables = {
afterSalesId: submitData.afterSalesId,
totalCost: submitData.totalCost || 0,
startUserId: useUserStore().userId
startUserId: useUserStore().userId,
afterSalesCopyUsers: copyUserIds.join(',')
};
submitData.bizExt = {
businessTitle: `售后申请:${submitData.afterSalesSubject}`,

Loading…
Cancel
Save