1.0.45 合同订单页面优化

dev
yinq 4 days ago
parent 927d6a350e
commit be8a69fc3a

@ -201,7 +201,7 @@
<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-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
link
type="success"
@ -594,6 +594,15 @@ const canActivateOrder = (row: ContractInfoVO) => {
return row.contractCategory === '2';
};
/** 判断是否可以激活合同订单上传终版合同附件 */
const showUploadButton = (row: ContractInfoVO) => {
return (
!row.signatureAppendix &&
row.contractStatus === '3' &&
row.contractCategory === '1'
)
};
/** 订单激活按钮操作 */
const handleOrderActivate = (row?: ContractInfoVO) => {
const _contractId = row?.contractId;

@ -6,7 +6,7 @@
@approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading"
:id="form.contractId"
:id="form.projectId"
:status="form.flowStatus"
:pageType="routeParams.type"
:mode="false"
@ -14,13 +14,7 @@
</el-card>
<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-form ref="projectInfoFormRef" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="项目编号" prop="projectCode">
@ -29,7 +23,7 @@
</el-col>
<el-col :span="12">
<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-col>
<el-col :span="12">
@ -61,24 +55,25 @@
:props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }"
placeholder="请选择项目类型"
style="width: 100%"
:disabled="isFormDisabled"
/>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="付款方式" prop="paymentMethod">-->
<!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式3-3-3-1" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="付款方式" prop="paymentMethod">-->
<!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式3-3-3-1" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<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-select>
</el-form-item>
</el-col>
<el-col :span="12">
<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-select>
</el-form-item>
@ -99,7 +94,7 @@
</el-col>
<el-col :span="12">
<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-col>
<el-col :span="12">
@ -109,7 +104,7 @@
</el-col>
<el-col :span="12">
<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-select>
</el-form-item>
@ -132,7 +127,7 @@
<el-form-item label="终版合同上传" prop="ossId">
<FileUpload
v-model="ossIdString"
:limit="5"
:limit="1"
:fileSize="20"
:fileType="['doc', 'docx', 'pdf', 'xls', 'xlsx']"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
@ -142,7 +137,7 @@
</el-col>
<el-col :span="24">
<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-col>
</el-row>
@ -154,9 +149,9 @@
<template #header>
<el-row :gutter="10">
<el-col :span="1.5">
<span class="card-title">项目阶段计划</span>
<span class="card-title">回款阶段</span>
</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-col>
</el-row>
@ -166,12 +161,7 @@
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="项目阶段" width="150" align="center">
<template #default="scope">
<el-select
v-model="scope.row.projectPhases"
placeholder="请选择项目阶段"
style="width: 100%"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
>
<el-select v-model="scope.row.projectPhases" placeholder="请选择项目阶段" style="width: 100%" :disabled="!isFormDisabled">
<el-option v-for="dict in project_phases" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</template>
@ -184,6 +174,7 @@
value-format="YYYY-MM-DD"
placeholder="选择日期"
style="width: 100%"
:disabled="!isFormDisabled"
/>
</template>
</el-table-column>
@ -195,18 +186,14 @@
value-format="YYYY-MM-DD"
placeholder="选择日期"
style="width: 100%"
:disabled="!isFormDisabled"
/>
</template>
</el-table-column>
<el-table-column label="回款阶段" width="150" align="center">
<template #default="scope">
<el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%">
<el-option
v-for="stage in paymentStageList"
:key="stage.paymentStageId"
:label="stage.stageName"
:value="stage.collectionStage"
/>
<el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%" :disabled="!isFormDisabled">
<el-option v-for="stage in paymentStageList" :key="stage.paymentStageId" :label="stage.stageName" :value="stage.collectionStage" />
</el-select>
</template>
</el-table-column>
@ -219,20 +206,22 @@
:precision="2"
controls-position="right"
style="width: 100%"
:disabled="!isFormDisabled"
/>
</template>
</el-table-column>
<el-table-column label="预计回款金额" width="150" align="center">
<template #default="scope">
<el-input-number
v-model="scope.row.repaymentAmount"
:min="0"
:precision="2"
controls-position="right"
style="width: 100%"
/>
</template>
</el-table-column>
<!-- <el-table-column label="预计回款金额" width="150" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-input-number-->
<!-- v-model="scope.row.repaymentAmount"-->
<!-- :min="0"-->
<!-- :precision="2"-->
<!-- controls-position="right"-->
<!-- style="width: 100%"-->
<!-- :disabled="!isFormDisabled"-->
<!-- />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="预计回款时间" width="160" align="center">
<template #default="scope">
<el-date-picker
@ -241,46 +230,43 @@
value-format="YYYY-MM-DD"
placeholder="选择日期"
style="width: 100%"
:disabled="!isFormDisabled"
/>
</template>
</el-table-column>
<el-table-column label="回款延期天数" width="130" align="center">
<template #default="scope">
<el-input-number
v-model="scope.row.delayDay"
:min="0"
controls-position="right"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column label="应收款日期" width="160" align="center">
<template #default="scope">
<el-date-picker
v-model="scope.row.receivableDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择日期"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column label="原因说明" min-width="200" align="center">
<template #default="scope">
<el-input v-model="scope.row.reasonsExplanation" placeholder="请输入原因说明" />
</template>
</el-table-column>
<el-table-column label="进度备注" min-width="200" align="center">
<template #default="scope">
<el-input v-model="scope.row.scheduleRemark" placeholder="请输入进度备注" />
</template>
</el-table-column>
<!-- <el-table-column label="回款延期天数" width="130" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-input-number v-model="scope.row.delayDay" :min="0" controls-position="right" style="width: 100%" :disabled="!isFormDisabled" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="应收款日期" width="160" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-date-picker-->
<!-- v-model="scope.row.receivableDate"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="选择日期"-->
<!-- style="width: 100%"-->
<!-- :disabled="!isFormDisabled"-->
<!-- />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="原因说明" min-width="200" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-input v-model="scope.row.reasonsExplanation" placeholder="请输入原因说明" :disabled="!isFormDisabled" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="进度备注" min-width="200" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-input v-model="scope.row.scheduleRemark" placeholder="请输入进度备注" :disabled="!isFormDisabled" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="备注" min-width="150" align="center">
<template #default="scope">
<el-input v-model="scope.row.remark" placeholder="请输入备注" />
<el-input v-model="scope.row.remark" placeholder="请输入备注" :disabled="!isFormDisabled" />
</template>
</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">
<el-button type="danger" link icon="Delete" @click="handleDeletePlanStage(scope.$index)"></el-button>
</template>
@ -288,7 +274,6 @@
</el-table>
</el-card>
<!-- 提交审批组件 -->
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<!-- 审批记录 -->
@ -297,7 +282,7 @@
</template>
<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 { ProjectInfoForm } from '@/api/oa/erp/projectInfo/types';
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 { UserQuery } from '@/api/system/user/types';
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 { listContractInfo, getContractInfo } from '@/api/oa/erp/contractInfo';
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' }],
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
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 isFormDisabled = computed(() => {
return routeParams.value.type === 'view' || routeParams.value.type === 'approval';
});
// IDFileUpload
const ossIdString = computed({
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 = () => {
proxy.$tab.closePage(proxy.$route);
@ -513,15 +490,15 @@ const submitForm = (status: string, mode: boolean) => {
submitData.variables = {
projectId: submitData.projectId,
projectCode: submitData.projectCode,
projectName: submitData.projectName
projectName: submitData.projectName,
contractManagerId: submitData.peopleId
};
//
submitData.bizExt = {
businessTitle: '合同订单激活',
businessCode: submitData.projectCode
businessTitle: '合同订单激活'
};
submitData.projectStatus = '2';
submitData.flowStatus = 'waiting';
submitData.projectStatus = '3';
submitData.flowStatus = 'finish';
const res = await submitContractOrderAndFlowStart(submitData).finally(() => (buttonLoading.value = false));
form.value = res.data;
buttonLoading.value = false;
@ -550,7 +527,6 @@ const submitForm = (status: string, mode: boolean) => {
}
};
//
const loadSelectOptions = async () => {
await getUserList();
@ -563,26 +539,50 @@ const loadContractInfo = async () => {
const contractId = routeParams.value.contractId as string | number;
if (contractId) {
try {
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;
// contractId
const projectRes = await getErpProjectInfoList({ contractId: contractId } as any);
if (projectRes.data && projectRes.data.length > 0) {
// form
const projectData = projectRes.data[0];
if (projectData.flowStatus === 'finish') {
routeParams.value.type = 'view';
}
Object.assign(form.value, projectData);
//
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
const deptInfo = deptInfoList.value.find((dept: any) => dept.deptId === contractData.contractDeptId);
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());
}) as any;
if (deptInfo) {
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());
}) as any;
}
}
}
} catch (error) {
@ -651,13 +651,9 @@ const getPlanStageList = async () => {
}
try {
const params: ErpProjectPlanStageQuery = {
projectId: form.value.projectId,
pageNum: 1,
pageSize: 9999
};
const res = await listErpProjectPlanStage(params);
planStageList.value = (res.rows || []).map((item: any) => ({
const params = { projectId: form.value.projectId };
const res = await getErpProjectPlanStageList(params);
planStageList.value = (res.data || []).map((item: any) => ({
...item,
//
projectPhases: item.projectPhases || '',

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

Loading…
Cancel
Save