|
|
|
|
@ -145,6 +145,13 @@
|
|
|
|
|
<el-input v-model="form.meetingName" placeholder="请输入" :disabled="isFormDisabled" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="业务方向" prop="businessDirection">
|
|
|
|
|
<el-select v-model="form.businessDirection" placeholder="选择业务方向" :disabled="isFormDisabled">
|
|
|
|
|
<el-option v-for="dict in business_direction" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<!-- 动态字段:其他 (Type 4),以及Type 1的部分复用字段 -->
|
|
|
|
|
@ -216,20 +223,20 @@
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
|
|
|
|
|
<!-- <el-col :span="24">-->
|
|
|
|
|
<!-- <el-form-item label="出差申请附件">-->
|
|
|
|
|
<!-- <file-upload-->
|
|
|
|
|
<!-- v-model="form.ossId"-->
|
|
|
|
|
<!-- :limit="5"-->
|
|
|
|
|
<!-- :fileSize="20"-->
|
|
|
|
|
<!-- :fileType="['rar', 'zip', 'doc', 'docx', 'pdf', 'jpg', 'jpeg', 'png']"-->
|
|
|
|
|
<!-- :isShowTip="true"-->
|
|
|
|
|
<!-- :disabled="isFormDisabled"-->
|
|
|
|
|
<!-- />-->
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
<!-- <el-col :span="24">-->
|
|
|
|
|
<!-- <el-form-item label="出差申请附件">-->
|
|
|
|
|
<!-- <file-upload-->
|
|
|
|
|
<!-- v-model="form.ossId"-->
|
|
|
|
|
<!-- :limit="5"-->
|
|
|
|
|
<!-- :fileSize="20"-->
|
|
|
|
|
<!-- :fileType="['rar', 'zip', 'doc', 'docx', 'pdf', 'jpg', 'jpeg', 'png']"-->
|
|
|
|
|
<!-- :isShowTip="true"-->
|
|
|
|
|
<!-- :disabled="isFormDisabled"-->
|
|
|
|
|
<!-- />-->
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
|
|
|
|
|
<el-col :span="12" v-if="!isFormDisabled">
|
|
|
|
|
<el-col :span="12" v-if="!isFormDisabled && form.tripType !== '1' && form.tripType !== '2' && form.tripType !== '3'">
|
|
|
|
|
<el-form-item label="下一步审批人" prop="variables.approverId">
|
|
|
|
|
<el-select
|
|
|
|
|
v-model="form.variables.approverId"
|
|
|
|
|
@ -307,9 +314,6 @@ const userList = ref<any[]>([]); // 用户列表
|
|
|
|
|
const deptInfoList = ref<any[]>([]); // 部门列表
|
|
|
|
|
const customerList = ref<any[]>([]); // 客户列表
|
|
|
|
|
|
|
|
|
|
// 默认抄送人员的昵称列表
|
|
|
|
|
const defaultCopyUserNames = ['米兰', '于洋', '张兰艳', '张东辉', '冯俊杰'];
|
|
|
|
|
|
|
|
|
|
// 流程相关数据
|
|
|
|
|
const submitFormData = ref<StartProcessBo>({
|
|
|
|
|
businessId: '',
|
|
|
|
|
@ -366,7 +370,19 @@ const data = reactive({
|
|
|
|
|
exchangeProcess: [{ required: true, message: '交流过程简述不能为空', trigger: 'blur' }],
|
|
|
|
|
feedback: [{ required: true, message: '结果反馈不能为空', trigger: 'blur' }],
|
|
|
|
|
meetingName: [{ required: true, message: '会议/展会名称不能为空', trigger: 'blur' }],
|
|
|
|
|
'variables.approverId': [{ required: true, message: '请选择下一步审批人', trigger: 'change' }]
|
|
|
|
|
'variables.approverId': [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
|
|
if ((form.value.tripType === '1' || form.value.tripType === '4') && !value) {
|
|
|
|
|
callback(new Error('请选择下一步审批人'));
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
trigger: 'change'
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -385,6 +401,43 @@ const computedRules = computed(() => {
|
|
|
|
|
return baseRules;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 设置默认抄送人员逻辑
|
|
|
|
|
const setDefaultCopyUsers = () => {
|
|
|
|
|
let targetNames: string[] = [];
|
|
|
|
|
let includeDeptLeader = false;
|
|
|
|
|
|
|
|
|
|
if (form.value.tripType === '1') {
|
|
|
|
|
// 安装调试:于洋、米兰、张兰艳、部门经理
|
|
|
|
|
targetNames = ['于洋', '米兰', '张兰艳'];
|
|
|
|
|
includeDeptLeader = true;
|
|
|
|
|
} else if (form.value.tripType === '2' || form.value.tripType === '3') {
|
|
|
|
|
// 市场交流 / 展会/会议:张东辉、米兰、张兰艳、陈海军
|
|
|
|
|
targetNames = ['张东辉', '米兰', '张兰艳', '陈海军'];
|
|
|
|
|
} else {
|
|
|
|
|
// 其他类型:默认名单 + 部门负责人/副总
|
|
|
|
|
targetNames = ['米兰', '于洋', '张兰艳', '张东辉', '冯俊杰'];
|
|
|
|
|
includeDeptLeader = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据名字查找ID
|
|
|
|
|
const copyIds = userList.value
|
|
|
|
|
.filter((u: any) => targetNames.includes(u.nickName))
|
|
|
|
|
.map((u: any) => String(u.userId));
|
|
|
|
|
|
|
|
|
|
// 如果包含部门经理
|
|
|
|
|
if (includeDeptLeader) {
|
|
|
|
|
const deptInfo = deptInfoList.value.find((d: any) => d.deptId === form.value.deptId);
|
|
|
|
|
if (deptInfo) {
|
|
|
|
|
if (deptInfo.leader) copyIds.push(String(deptInfo.leader));
|
|
|
|
|
if (form.value.tripType !== '1' && deptInfo.vicePresident) {
|
|
|
|
|
copyIds.push(String(deptInfo.vicePresident));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
form.value.copyUserIds = [...new Set(copyIds)];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
nextTick(async () => {
|
|
|
|
|
routeParams.value = route.query;
|
|
|
|
|
@ -411,23 +464,6 @@ onMounted(async () => {
|
|
|
|
|
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);
|
|
|
|
|
@ -436,6 +472,8 @@ onMounted(async () => {
|
|
|
|
|
if (routeParams.value.tripType) {
|
|
|
|
|
form.value.tripType = routeParams.value.tripType;
|
|
|
|
|
}
|
|
|
|
|
// 必须在 tripType 赋值后,再计算默认抄送人
|
|
|
|
|
setDefaultCopyUsers();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (id && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
|
|
|
|
|
@ -448,22 +486,7 @@ onMounted(async () => {
|
|
|
|
|
|
|
|
|
|
// 编辑模式下,如果抄送人员为空,重新设置默认抄送人员
|
|
|
|
|
if (routeParams.value.type === 'update' && (!form.value.copyUserIds || form.value.copyUserIds.length === 0)) {
|
|
|
|
|
// 根据部门ID获取部门负责人和分管副总
|
|
|
|
|
const deptInfo = deptInfoList.value.find((d: any) => d.deptId === form.value.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])];
|
|
|
|
|
}
|
|
|
|
|
setDefaultCopyUsers();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 确保 variables 对象存在
|
|
|
|
|
@ -500,9 +523,20 @@ const openProjectSelect = () => {
|
|
|
|
|
// 项目选择回调
|
|
|
|
|
const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => {
|
|
|
|
|
if (data && data.length > 0) {
|
|
|
|
|
form.value.projectId = data[0].projectId;
|
|
|
|
|
form.value.projectName = data[0].projectName;
|
|
|
|
|
form.value.projectCode = data[0].projectCode;
|
|
|
|
|
const selectedProject = data[0];
|
|
|
|
|
form.value.projectId = selectedProject.projectId;
|
|
|
|
|
form.value.projectName = selectedProject.projectName;
|
|
|
|
|
form.value.projectCode = selectedProject.projectCode;
|
|
|
|
|
|
|
|
|
|
// 安装调试的出差申请时,自动带入项目经理作为下一步审批人
|
|
|
|
|
if (form.value.tripType === '1' && selectedProject.managerId) {
|
|
|
|
|
if (!form.value.variables) {
|
|
|
|
|
form.value.variables = {};
|
|
|
|
|
}
|
|
|
|
|
form.value.variables.approverId = String(selectedProject.managerId);
|
|
|
|
|
handleApproverSelectChange(String(selectedProject.managerId));
|
|
|
|
|
proxy?.$modal.msgSuccess('已关联项目经理作为下一步审批人');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -547,6 +581,7 @@ const executeSubmit = async (status: string, mode: boolean) => {
|
|
|
|
|
form.value.variables = {
|
|
|
|
|
...form.value.variables,
|
|
|
|
|
tripType: form.value.tripType,
|
|
|
|
|
businessDirection: Number(form.value.businessDirection),
|
|
|
|
|
businessTripCopyUsers: copyUserIdsStr
|
|
|
|
|
};
|
|
|
|
|
form.value.bizExt = {
|
|
|
|
|
|