1.0.45 合同订单页面优化

dev
yinq 2 weeks ago
parent 927d6a350e
commit be8a69fc3a

@ -201,7 +201,7 @@
<el-tooltip content="合同模板" placement="top" v-if="scope.row.templateId != null"> <el-tooltip content="合同模板" placement="top" v-if="scope.row.templateId != null">
<el-button link type="info" icon="Download" @click="contractView(scope.row)"></el-button> <el-button link type="info" icon="Download" @click="contractView(scope.row)"></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="上传终版合同" placement="top" v-if="!scope.row.signatureAppendix && scope.row.contractStatus === '3'"> <el-tooltip content="上传终版合同" placement="top" v-if="showUploadButton(scope.row)">
<el-button <el-button
link link
type="success" type="success"
@ -594,6 +594,15 @@ const canActivateOrder = (row: ContractInfoVO) => {
return row.contractCategory === '2'; return row.contractCategory === '2';
}; };
/** 判断是否可以激活合同订单上传终版合同附件 */
const showUploadButton = (row: ContractInfoVO) => {
return (
!row.signatureAppendix &&
row.contractStatus === '3' &&
row.contractCategory === '1'
)
};
/** 订单激活按钮操作 */ /** 订单激活按钮操作 */
const handleOrderActivate = (row?: ContractInfoVO) => { const handleOrderActivate = (row?: ContractInfoVO) => {
const _contractId = row?.contractId; const _contractId = row?.contractId;

@ -6,7 +6,7 @@
@approvalVerifyOpen="approvalVerifyOpen" @approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord" @handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading" :buttonLoading="buttonLoading"
:id="form.contractId" :id="form.projectId"
:status="form.flowStatus" :status="form.flowStatus"
:pageType="routeParams.type" :pageType="routeParams.type"
:mode="false" :mode="false"
@ -14,13 +14,7 @@
</el-card> </el-card>
<el-card shadow="never" style="margin-top: 0"> <el-card shadow="never" style="margin-top: 0">
<el-form <el-form ref="projectInfoFormRef" :model="form" :rules="rules" label-width="120px">
ref="projectInfoFormRef"
:model="form"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
:rules="rules"
label-width="120px"
>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目编号" prop="projectCode"> <el-form-item label="项目编号" prop="projectCode">
@ -29,7 +23,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目名称" prop="projectName"> <el-form-item label="项目名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请输入项目名称" /> <el-input v-model="form.projectName" placeholder="请输入项目名称" :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -61,24 +55,25 @@
:props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }" :props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }"
placeholder="请选择项目类型" placeholder="请选择项目类型"
style="width: 100%" style="width: 100%"
:disabled="isFormDisabled"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12">--> <!-- <el-col :span="12">-->
<!-- <el-form-item label="付款方式" prop="paymentMethod">--> <!-- <el-form-item label="付款方式" prop="paymentMethod">-->
<!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式3-3-3-1" />--> <!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式3-3-3-1" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<!-- </el-col>--> <!-- </el-col>-->
<el-col :span="12"> <el-col :span="12">
<el-form-item label="部门" prop="deptId"> <el-form-item label="部门" prop="deptId">
<el-select v-model="form.deptId" placeholder="请选择部门"> <el-select v-model="form.deptId" placeholder="请选择部门" :disabled="isFormDisabled">
<el-option v-for="item in deptInfoList" :key="item.deptId" :label="item.deptName" :value="item.deptId" /> <el-option v-for="item in deptInfoList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目经理" prop="managerId"> <el-form-item label="项目经理" prop="managerId">
<el-select v-model="form.managerId" placeholder="请选择项目经理" clearable filterable> <el-select v-model="form.managerId" placeholder="请选择项目经理" :disabled="isFormDisabled" clearable filterable>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" /> <el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -99,7 +94,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合同编号" prop="contractCode"> <el-form-item label="合同编号" prop="contractCode">
<el-input v-model="form.contractCode" placeholder="请输入合同编号" :disabled="true"/> <el-input v-model="form.contractCode" placeholder="请输入合同编号" :disabled="true" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -109,7 +104,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="抄送人员" prop="peopleId"> <el-form-item label="抄送人员" prop="peopleId">
<el-select v-model="form.peopleId" placeholder="请选择抄送人员" clearable filterable multiple> <el-select v-model="form.peopleId" placeholder="请选择抄送人员" :disabled="isFormDisabled" clearable filterable multiple>
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" /> <el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -132,7 +127,7 @@
<el-form-item label="终版合同上传" prop="ossId"> <el-form-item label="终版合同上传" prop="ossId">
<FileUpload <FileUpload
v-model="ossIdString" v-model="ossIdString"
:limit="5" :limit="1"
:fileSize="20" :fileSize="20"
:fileType="['doc', 'docx', 'pdf', 'xls', 'xlsx']" :fileType="['doc', 'docx', 'pdf', 'xls', 'xlsx']"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'" :disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
@ -142,7 +137,7 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" /> <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" :disabled="isFormDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -154,9 +149,9 @@
<template #header> <template #header>
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="1.5"> <el-col :span="1.5">
<span class="card-title">项目阶段计划</span> <span class="card-title">回款阶段</span>
</el-col> </el-col>
<el-col :span="1.5" v-if="routeParams.type !== 'view' && routeParams.type !== 'approval'"> <el-col :span="1.5" v-if="isFormDisabled">
<el-button type="primary" icon="Plus" @click="handleAddPlanStage"></el-button> <el-button type="primary" icon="Plus" @click="handleAddPlanStage"></el-button>
</el-col> </el-col>
</el-row> </el-row>
@ -166,12 +161,7 @@
<el-table-column label="序号" type="index" width="60" align="center" /> <el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="项目阶段" width="150" align="center"> <el-table-column label="项目阶段" width="150" align="center">
<template #default="scope"> <template #default="scope">
<el-select <el-select v-model="scope.row.projectPhases" placeholder="请选择项目阶段" style="width: 100%" :disabled="!isFormDisabled">
v-model="scope.row.projectPhases"
placeholder="请选择项目阶段"
style="width: 100%"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
>
<el-option v-for="dict in project_phases" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in project_phases" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</template> </template>
@ -184,6 +174,7 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="选择日期" placeholder="选择日期"
style="width: 100%" style="width: 100%"
:disabled="!isFormDisabled"
/> />
</template> </template>
</el-table-column> </el-table-column>
@ -195,18 +186,14 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="选择日期" placeholder="选择日期"
style="width: 100%" style="width: 100%"
:disabled="!isFormDisabled"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="回款阶段" width="150" align="center"> <el-table-column label="回款阶段" width="150" align="center">
<template #default="scope"> <template #default="scope">
<el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%"> <el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%" :disabled="!isFormDisabled">
<el-option <el-option v-for="stage in paymentStageList" :key="stage.paymentStageId" :label="stage.stageName" :value="stage.collectionStage" />
v-for="stage in paymentStageList"
:key="stage.paymentStageId"
:label="stage.stageName"
:value="stage.collectionStage"
/>
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
@ -219,20 +206,22 @@
:precision="2" :precision="2"
controls-position="right" controls-position="right"
style="width: 100%" style="width: 100%"
:disabled="!isFormDisabled"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预计回款金额" width="150" align="center"> <!-- <el-table-column label="预计回款金额" width="150" align="center">-->
<template #default="scope"> <!-- <template #default="scope">-->
<el-input-number <!-- <el-input-number-->
v-model="scope.row.repaymentAmount" <!-- v-model="scope.row.repaymentAmount"-->
:min="0" <!-- :min="0"-->
:precision="2" <!-- :precision="2"-->
controls-position="right" <!-- controls-position="right"-->
style="width: 100%" <!-- style="width: 100%"-->
/> <!-- :disabled="!isFormDisabled"-->
</template> <!-- />-->
</el-table-column> <!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="预计回款时间" width="160" align="center"> <el-table-column label="预计回款时间" width="160" align="center">
<template #default="scope"> <template #default="scope">
<el-date-picker <el-date-picker
@ -241,46 +230,43 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="选择日期" placeholder="选择日期"
style="width: 100%" style="width: 100%"
:disabled="!isFormDisabled"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="回款延期天数" width="130" align="center"> <!-- <el-table-column label="回款延期天数" width="130" align="center">-->
<template #default="scope"> <!-- <template #default="scope">-->
<el-input-number <!-- <el-input-number v-model="scope.row.delayDay" :min="0" controls-position="right" style="width: 100%" :disabled="!isFormDisabled" />-->
v-model="scope.row.delayDay" <!-- </template>-->
:min="0" <!-- </el-table-column>-->
controls-position="right" <!-- <el-table-column label="应收款日期" width="160" align="center">-->
style="width: 100%" <!-- <template #default="scope">-->
/> <!-- <el-date-picker-->
</template> <!-- v-model="scope.row.receivableDate"-->
</el-table-column> <!-- type="date"-->
<el-table-column label="应收款日期" width="160" align="center"> <!-- value-format="YYYY-MM-DD"-->
<template #default="scope"> <!-- placeholder="选择日期"-->
<el-date-picker <!-- style="width: 100%"-->
v-model="scope.row.receivableDate" <!-- :disabled="!isFormDisabled"-->
type="date" <!-- />-->
value-format="YYYY-MM-DD" <!-- </template>-->
placeholder="选择日期" <!-- </el-table-column>-->
style="width: 100%" <!-- <el-table-column label="原因说明" min-width="200" align="center">-->
/> <!-- <template #default="scope">-->
</template> <!-- <el-input v-model="scope.row.reasonsExplanation" placeholder="请输入原因说明" :disabled="!isFormDisabled" />-->
</el-table-column> <!-- </template>-->
<el-table-column label="原因说明" min-width="200" align="center"> <!-- </el-table-column>-->
<template #default="scope"> <!-- <el-table-column label="进度备注" min-width="200" align="center">-->
<el-input v-model="scope.row.reasonsExplanation" placeholder="请输入原因说明" /> <!-- <template #default="scope">-->
</template> <!-- <el-input v-model="scope.row.scheduleRemark" placeholder="请输入进度备注" :disabled="!isFormDisabled" />-->
</el-table-column> <!-- </template>-->
<el-table-column label="进度备注" min-width="200" align="center"> <!-- </el-table-column>-->
<template #default="scope">
<el-input v-model="scope.row.scheduleRemark" placeholder="请输入进度备注" />
</template>
</el-table-column>
<el-table-column label="备注" min-width="150" align="center"> <el-table-column label="备注" min-width="150" align="center">
<template #default="scope"> <template #default="scope">
<el-input v-model="scope.row.remark" placeholder="请输入备注" /> <el-input v-model="scope.row.remark" placeholder="请输入备注" :disabled="!isFormDisabled" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="routeParams.type !== 'view' && routeParams.type !== 'approval'" label="操作" width="80" align="center" fixed="right"> <el-table-column v-if="isFormDisabled" label="操作" width="80" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button type="danger" link icon="Delete" @click="handleDeletePlanStage(scope.$index)"></el-button> <el-button type="danger" link icon="Delete" @click="handleDeletePlanStage(scope.$index)"></el-button>
</template> </template>
@ -288,7 +274,6 @@
</el-table> </el-table>
</el-card> </el-card>
<!-- 提交审批组件 --> <!-- 提交审批组件 -->
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" /> <submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<!-- 审批记录 --> <!-- 审批记录 -->
@ -297,7 +282,7 @@
</template> </template>
<script setup name="ProjectInfoEdit" lang="ts"> <script setup name="ProjectInfoEdit" lang="ts">
import { getProjectInfo } from '@/api/oa/erp/projectInfo'; import { getErpProjectInfoList, getProjectInfo, listProjectInfo } from '@/api/oa/erp/projectInfo';
import { saveContractOrder, updateContractOrder, submitContractOrderAndFlowStart } from '@/api/oa/erp/contractOrder'; import { saveContractOrder, updateContractOrder, submitContractOrderAndFlowStart } from '@/api/oa/erp/contractOrder';
import { ProjectInfoForm } from '@/api/oa/erp/projectInfo/types'; import { ProjectInfoForm } from '@/api/oa/erp/projectInfo/types';
import { getRuleGenerateCode } from '@/api/system/codeRule'; import { getRuleGenerateCode } from '@/api/system/codeRule';
@ -312,7 +297,7 @@ import { ProjectTypeVO } from '@/api/oa/erp/projectType/types';
import { listUser } from '@/api/system/user'; import { listUser } from '@/api/system/user';
import { UserQuery } from '@/api/system/user/types'; import { UserQuery } from '@/api/system/user/types';
import { CodeRuleEnum, FlowCodeEnum, ProjectCategoryEnum } from '@/enums/OAEnum'; import { CodeRuleEnum, FlowCodeEnum, ProjectCategoryEnum } from '@/enums/OAEnum';
import { listErpProjectPlanStage } from '@/api/oa/erp/erpProjectPlanStage'; import { getErpProjectPlanStageList, listErpProjectPlanStage } from '@/api/oa/erp/erpProjectPlanStage';
import { ErpProjectPlanStageForm, ErpProjectPlanStageQuery } from '@/api/oa/erp/erpProjectPlanStage/types'; import { ErpProjectPlanStageForm, ErpProjectPlanStageQuery } from '@/api/oa/erp/erpProjectPlanStage/types';
import { listContractInfo, getContractInfo } from '@/api/oa/erp/contractInfo'; import { listContractInfo, getContractInfo } from '@/api/oa/erp/contractInfo';
import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types'; import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types';
@ -438,12 +423,21 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
contractFlag: [{ required: true, message: '有无合同不能为空', trigger: 'change' }], contractFlag: [{ required: true, message: '有无合同不能为空', trigger: 'change' }],
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }], projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }], businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }],
projectCategory: [{ required: true, message: '项目类别不能为空', trigger: 'change' }] projectCategory: [{ required: true, message: '项目类别不能为空', trigger: 'change' }],
projectTypeId: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }],
ossId: [{ required: true, message: '请上传终版合同', trigger: 'change' }]
} }
}); });
const { form, rules } = toRefs(data); const { form, rules } = toRefs(data);
//
const isFormDisabled = computed(() => {
return routeParams.value.type === 'view' || routeParams.value.type === 'approval';
});
// IDFileUpload // IDFileUpload
const ossIdString = computed({ const ossIdString = computed({
get() { get() {
@ -455,23 +449,6 @@ const ossIdString = computed({
} }
}); });
//
const generateProjectCode = async () => {
if (isCodeGenerated.value) return;
try {
const codeRuleCode = form.value.projectCategory === ProjectCategoryEnum.RD ? CodeRuleEnum.PROJECT_RD : CodeRuleEnum.PROJECT;
const params = { codeRuleCode: codeRuleCode } as any;
const res = await getRuleGenerateCode(params);
form.value.projectCode = res.msg;
isCodeGenerated.value = true;
proxy?.$modal.msgSuccess('项目编号生成成功');
} catch (error) {
console.error('生成项目编号失败:', error);
proxy?.$modal.msgError('生成项目编号失败');
}
};
// //
const goBack = () => { const goBack = () => {
proxy.$tab.closePage(proxy.$route); proxy.$tab.closePage(proxy.$route);
@ -513,15 +490,15 @@ const submitForm = (status: string, mode: boolean) => {
submitData.variables = { submitData.variables = {
projectId: submitData.projectId, projectId: submitData.projectId,
projectCode: submitData.projectCode, projectCode: submitData.projectCode,
projectName: submitData.projectName projectName: submitData.projectName,
contractManagerId: submitData.peopleId
}; };
// //
submitData.bizExt = { submitData.bizExt = {
businessTitle: '合同订单激活', businessTitle: '合同订单激活'
businessCode: submitData.projectCode
}; };
submitData.projectStatus = '2'; submitData.projectStatus = '3';
submitData.flowStatus = 'waiting'; submitData.flowStatus = 'finish';
const res = await submitContractOrderAndFlowStart(submitData).finally(() => (buttonLoading.value = false)); const res = await submitContractOrderAndFlowStart(submitData).finally(() => (buttonLoading.value = false));
form.value = res.data; form.value = res.data;
buttonLoading.value = false; buttonLoading.value = false;
@ -550,7 +527,6 @@ const submitForm = (status: string, mode: boolean) => {
} }
}; };
// //
const loadSelectOptions = async () => { const loadSelectOptions = async () => {
await getUserList(); await getUserList();
@ -563,26 +539,50 @@ const loadContractInfo = async () => {
const contractId = routeParams.value.contractId as string | number; const contractId = routeParams.value.contractId as string | number;
if (contractId) { if (contractId) {
try { try {
const contractRes = await getContractInfo(contractId); // contractId
if (contractRes.data) { const projectRes = await getErpProjectInfoList({ contractId: contractId } as any);
const contractData = contractRes.data; if (projectRes.data && projectRes.data.length > 0) {
form.value.contractId = contractData.contractId; // form
form.value.projectName = contractData.contractName + "订单"; const projectData = projectRes.data[0];
form.value.businessDirection = contractData.businessDirection; if (projectData.flowStatus === 'finish') {
form.value.deptId = contractData.contractDeptId; routeParams.value.type = 'view';
form.value.contractCode = contractData.contractCode; }
form.value.contractName = contractData.contractName; Object.assign(form.value, projectData);
form.value.amount = contractData.totalPrice; //
if (form.value.peopleId && typeof form.value.peopleId === 'string') {
form.value.peopleId = (form.value.peopleId as string).split(',').map((id) => {
return String(id.trim());
}) as any;
}
//
await getPlanStageList();
} else {
//
const contractRes = await getContractInfo(contractId);
if (contractRes.data) {
const contractData = contractRes.data;
form.value.contractId = contractData.contractId;
form.value.projectName = contractData.contractName + '订单';
form.value.businessDirection = contractData.businessDirection;
form.value.deptId = contractData.contractDeptId;
form.value.contractCode = contractData.contractCode;
form.value.contractName = contractData.contractName;
form.value.amount = contractData.totalPrice;
// ID // ID
const deptInfo = deptInfoList.value.find((dept: any) => dept.deptId === contractData.contractDeptId); const deptInfo = deptInfoList.value.find((dept: any) => dept.deptId === contractData.contractDeptId);
form.value.chargeId = deptInfo.leader; if (deptInfo) {
form.value.deputyId = deptInfo.vicePresident; form.value.chargeId = deptInfo.leader;
// form.value.deputyId = deptInfo.vicePresident;
if (contractData.contractManagerId) { }
form.value.peopleId = String(contractData.contractManagerId).split(',').map((id) => { //
return String(id.trim()); if (contractData.contractManagerId) {
}) as any; form.value.peopleId = String(contractData.contractManagerId)
.split(',')
.map((id) => {
return String(id.trim());
}) as any;
}
} }
} }
} catch (error) { } catch (error) {
@ -651,13 +651,9 @@ const getPlanStageList = async () => {
} }
try { try {
const params: ErpProjectPlanStageQuery = { const params = { projectId: form.value.projectId };
projectId: form.value.projectId, const res = await getErpProjectPlanStageList(params);
pageNum: 1, planStageList.value = (res.data || []).map((item: any) => ({
pageSize: 9999
};
const res = await listErpProjectPlanStage(params);
planStageList.value = (res.rows || []).map((item: any) => ({
...item, ...item,
// //
projectPhases: item.projectPhases || '', projectPhases: item.projectPhases || '',

@ -298,6 +298,9 @@ const getEditPathByCategory = (projectCategory?: string) => {
} else if (projectCategory === '4') { } else if (projectCategory === '4') {
// //
return '/project/projectInfo/preEdit'; return '/project/projectInfo/preEdit';
} else if (projectCategory === '5') {
//
return '/contract/contractInfo/orderActivate';
} else { } else {
// //
return '/project/projectInfo/edit'; return '/project/projectInfo/edit';

Loading…
Cancel
Save