|
|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
<template>
|
|
|
|
|
<div class="p-2">
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<!-- 审批按钮组件 -->
|
|
|
|
|
<approvalButton
|
|
|
|
|
@submitForm="submitForm"
|
|
|
|
|
@ -14,8 +14,8 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<el-card shadow="never" style="margin-top: 20px">
|
|
|
|
|
<el-form ref="projectInfoFormRef" :model="form" :disabled="routeParams.type === 'view'" :rules="rules" label-width="120px">
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<el-form ref="projectInfoFormRef" :model="form" :disabled="routeParams.type === 'view' || routeParams.type === 'approval'" :rules="rules" label-width="120px">
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="有无合同" prop="contractFlag">
|
|
|
|
|
@ -66,8 +66,6 @@
|
|
|
|
|
:options="projectTypeOptions"
|
|
|
|
|
:props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }"
|
|
|
|
|
placeholder="请选择项目类型"
|
|
|
|
|
clearable
|
|
|
|
|
filterable
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
@ -119,13 +117,13 @@
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目状态" prop="projectStatus">
|
|
|
|
|
<el-radio-group v-model="form.projectStatus" disabled>
|
|
|
|
|
<el-radio v-for="dict in project_status" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="12">-->
|
|
|
|
|
<!-- <el-form-item label="项目状态" prop="projectStatus">-->
|
|
|
|
|
<!-- <el-radio-group v-model="form.projectStatus" disabled>-->
|
|
|
|
|
<!-- <el-radio v-for="dict in project_status" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>-->
|
|
|
|
|
<!-- </el-radio-group>-->
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="备注" prop="remark">
|
|
|
|
|
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
|
|
|
|
|
@ -136,14 +134,14 @@
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 项目关联合同 -->
|
|
|
|
|
<el-card shadow="never" style="margin-top: 20px" v-if="form.projectId && routeParams.type !== 'add'">
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<template #header>
|
|
|
|
|
<el-row :gutter="10">
|
|
|
|
|
<el-col :span="1.5">
|
|
|
|
|
<span class="card-title">项目关联合同</span>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="1.5">
|
|
|
|
|
<el-button type="primary" plain icon="Plus" @click="handleAddContract" size="small" :disabled="routeParams.type === 'view'"
|
|
|
|
|
<el-button type="primary" plain icon="Plus" @click="handleAddContract" size="small" :disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
>新增关联
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-col>
|
|
|
|
|
@ -268,11 +266,12 @@ import { listProjectType } from '@/api/oa/erp/projectType';
|
|
|
|
|
import { ProjectTypeVO } from '@/api/oa/erp/projectType/types';
|
|
|
|
|
import { listUser } from '@/api/system/user';
|
|
|
|
|
import { UserQuery } from '@/api/system/user/types';
|
|
|
|
|
import { CodeRuleEnum, ProjectCategoryEnum } from '@/enums/OAEnum';
|
|
|
|
|
import { CodeRuleEnum, FlowCodeEnum, ProjectCategoryEnum } from '@/enums/OAEnum';
|
|
|
|
|
import { listProjectContracts, addProjectContracts, delProjectContracts, getErpProjectContractsList } from '@/api/oa/erp/projectContracts';
|
|
|
|
|
import { ProjectContractsForm, ProjectContractsQuery } from '@/api/oa/erp/projectContracts/types';
|
|
|
|
|
import { listContractInfo } from '@/api/oa/erp/contractInfo';
|
|
|
|
|
import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types';
|
|
|
|
|
import { getInfo } from '@/api/login';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
@ -294,7 +293,7 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
|
|
|
|
|
// 流程相关数据
|
|
|
|
|
const submitFormData = ref<StartProcessBo>({
|
|
|
|
|
businessId: '',
|
|
|
|
|
flowCode: 'OAP', // 项目流程编码
|
|
|
|
|
flowCode: '',
|
|
|
|
|
variables: {},
|
|
|
|
|
bizExt: {}
|
|
|
|
|
});
|
|
|
|
|
@ -323,11 +322,14 @@ const getUserList = async () => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const projectTypeOptions = ref<ProjectTypeVO[]>([]);
|
|
|
|
|
// 保存原始的项目类型列表(扁平结构),用于查找 parentId
|
|
|
|
|
const projectTypeList = ref<ProjectTypeVO[]>([]);
|
|
|
|
|
/** 查询项目类型列表 */
|
|
|
|
|
const getProjectTypeList = async () => {
|
|
|
|
|
const params = { spareFlag: form.value.spareFlag } as any;
|
|
|
|
|
console.log(params);
|
|
|
|
|
const res = await listProjectType(params);
|
|
|
|
|
// 保存原始数据用于查找
|
|
|
|
|
projectTypeList.value = res.data || [];
|
|
|
|
|
projectTypeOptions.value = proxy?.handleTree<ProjectTypeVO>(res.data, 'projectTypeId', 'parentId') || [];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -410,12 +412,26 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
// 设置后端发起和不等于草稿状态 直接走流程发起
|
|
|
|
|
if (status != 'draft') {
|
|
|
|
|
// 后端发起流程模式
|
|
|
|
|
submitData.flowCode = 'OAP';
|
|
|
|
|
submitData.flowCode = FlowCodeEnum.PROJECT_KEY;
|
|
|
|
|
|
|
|
|
|
// 根据 projectTypeId 查找对应的 parentId
|
|
|
|
|
let projectTypeParentId = undefined;
|
|
|
|
|
if (submitData.projectTypeId) {
|
|
|
|
|
const projectType = projectTypeList.value.find(
|
|
|
|
|
(item) => item.projectTypeId === submitData.projectTypeId
|
|
|
|
|
);
|
|
|
|
|
if (projectType) {
|
|
|
|
|
projectTypeParentId = projectType.parentId;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 流程变量
|
|
|
|
|
submitData.variables = {
|
|
|
|
|
projectId: submitData.projectId,
|
|
|
|
|
projectCode: submitData.projectCode,
|
|
|
|
|
projectName: submitData.projectName,
|
|
|
|
|
amount: submitData.amount,
|
|
|
|
|
projectCode: submitData.projectCode
|
|
|
|
|
contractFlag: Number(submitData.contractFlag),
|
|
|
|
|
projectTypeParentId: projectTypeParentId,
|
|
|
|
|
};
|
|
|
|
|
// 流程实例业务扩展字段
|
|
|
|
|
submitData.bizExt = {
|
|
|
|
|
@ -453,39 +469,40 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 提交申请
|
|
|
|
|
const handleStartWorkFlow = async (data: ProjectInfoForm) => {
|
|
|
|
|
try {
|
|
|
|
|
submitFormData.value.flowCode = 'OAP';
|
|
|
|
|
submitFormData.value.businessId = data.projectId;
|
|
|
|
|
|
|
|
|
|
// 流程变量
|
|
|
|
|
taskVariables.value = {
|
|
|
|
|
projectId: data.projectId,
|
|
|
|
|
projectName: data.projectName,
|
|
|
|
|
amount: data.amount,
|
|
|
|
|
projectCode: data.projectCode
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 流程实例业务扩展字段
|
|
|
|
|
flowInstanceBizExtBo.value = {
|
|
|
|
|
businessTitle: '项目审批',
|
|
|
|
|
businessCode: data.projectCode
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
submitFormData.value.variables = taskVariables.value;
|
|
|
|
|
submitFormData.value.bizExt = flowInstanceBizExtBo.value;
|
|
|
|
|
|
|
|
|
|
const resp = await startWorkFlow(submitFormData.value);
|
|
|
|
|
|
|
|
|
|
if (submitVerifyRef.value) {
|
|
|
|
|
buttonLoading.value = false;
|
|
|
|
|
await submitVerifyRef.value.openDialog(resp.data.taskId);
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
buttonLoading.value = false;
|
|
|
|
|
router.go(-1);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
// const handleStartWorkFlow = async (data: ProjectInfoForm) => {
|
|
|
|
|
// try {
|
|
|
|
|
// submitFormData.value.flowCode = 'OAP';
|
|
|
|
|
// submitFormData.value.businessId = data.projectId;
|
|
|
|
|
//
|
|
|
|
|
// // 流程变量
|
|
|
|
|
// taskVariables.value = {
|
|
|
|
|
// projectId: data.projectId,
|
|
|
|
|
// projectCode: data.projectCode,
|
|
|
|
|
// projectName: data.projectName,
|
|
|
|
|
// amount: data.amount,
|
|
|
|
|
// contractFlag: Number(data.contractFlag)
|
|
|
|
|
// };
|
|
|
|
|
//
|
|
|
|
|
// // 流程实例业务扩展字段
|
|
|
|
|
// flowInstanceBizExtBo.value = {
|
|
|
|
|
// businessTitle: '项目审批',
|
|
|
|
|
// businessCode: data.projectCode
|
|
|
|
|
// };
|
|
|
|
|
//
|
|
|
|
|
// submitFormData.value.variables = taskVariables.value;
|
|
|
|
|
// submitFormData.value.bizExt = flowInstanceBizExtBo.value;
|
|
|
|
|
//
|
|
|
|
|
// const resp = await startWorkFlow(submitFormData.value);
|
|
|
|
|
//
|
|
|
|
|
// if (submitVerifyRef.value) {
|
|
|
|
|
// buttonLoading.value = false;
|
|
|
|
|
// await submitVerifyRef.value.openDialog(resp.data.taskId);
|
|
|
|
|
// }
|
|
|
|
|
// } finally {
|
|
|
|
|
// buttonLoading.value = false;
|
|
|
|
|
// router.go(-1);
|
|
|
|
|
// }
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
//初始化调用
|
|
|
|
|
const loadSelectOptions = () => {
|
|
|
|
|
@ -497,22 +514,18 @@ onMounted(async () => {
|
|
|
|
|
nextTick(async () => {
|
|
|
|
|
// 获取路由参数
|
|
|
|
|
routeParams.value = route.query;
|
|
|
|
|
proxy?.$modal.loading('正在加载数据,请稍后...');
|
|
|
|
|
loadSelectOptions();
|
|
|
|
|
const id = routeParams.value.id as string | number;
|
|
|
|
|
if (id && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
|
|
|
|
|
proxy?.$modal.loading('正在加载数据,请稍后...');
|
|
|
|
|
const res = await getProjectInfo(id);
|
|
|
|
|
Object.assign(form.value, res.data);
|
|
|
|
|
|
|
|
|
|
// 将抄送人员字符串转换为数组,用于多选下拉框显示
|
|
|
|
|
if (form.value.peopleId && typeof form.value.peopleId === 'string') {
|
|
|
|
|
form.value.peopleId = (form.value.peopleId as string).split(',').map((id) => {
|
|
|
|
|
const numId = Number(id.trim());
|
|
|
|
|
return isNaN(numId) ? id.trim() : numId;
|
|
|
|
|
return String(id.trim());
|
|
|
|
|
}) as any;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proxy?.$modal.closeLoading();
|
|
|
|
|
// 编辑模式:如果已有项目编号,禁用生成按钮
|
|
|
|
|
if (form.value.projectCode) {
|
|
|
|
|
isCodeGenerated.value = true;
|
|
|
|
|
@ -521,6 +534,20 @@ onMounted(async () => {
|
|
|
|
|
// 加载项目关联的合同列表
|
|
|
|
|
await getProjectContractsList();
|
|
|
|
|
} else {
|
|
|
|
|
// 新增模式:获取登录用户信息并自动赋值
|
|
|
|
|
try {
|
|
|
|
|
const userInfoRes = await getInfo();
|
|
|
|
|
const userVO = userInfoRes.data.user;
|
|
|
|
|
if (userInfoRes.data?.user) {
|
|
|
|
|
form.value.deptId = userVO.deptId;
|
|
|
|
|
form.value.managerId = userVO.userId;
|
|
|
|
|
form.value.chargeId = userVO.chargeId;
|
|
|
|
|
form.value.deputyId = userVO.deputyId;
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('获取用户信息失败:', error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 新增模式:如果已有项目编号,禁用生成按钮
|
|
|
|
|
if (form.value.projectCode) {
|
|
|
|
|
isCodeGenerated.value = true;
|
|
|
|
|
@ -532,6 +559,7 @@ onMounted(async () => {
|
|
|
|
|
}
|
|
|
|
|
form.value.spareFlag = form.value.projectCategory === ProjectCategoryEnum.SALE_SPARE ? '1' : '0';
|
|
|
|
|
await getProjectTypeList();
|
|
|
|
|
proxy?.$modal.closeLoading();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -578,7 +606,7 @@ const getProjectContractsList = async () => {
|
|
|
|
|
const params = { projectId: form.value.projectId } as any;
|
|
|
|
|
const res = await getErpProjectContractsList(params);
|
|
|
|
|
// 后端已经通过left join返回了完整的合同信息
|
|
|
|
|
projectContractsList.value = res.rows || [];
|
|
|
|
|
projectContractsList.value = res.data || [];
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('查询项目关联合同失败:', error);
|
|
|
|
|
} finally {
|
|
|
|
|
|