0509新功能优化
This commit is contained in:
2
.env
2
.env
@@ -1,5 +1,5 @@
|
|||||||
# 标题
|
# 标题
|
||||||
VITE_APP_TITLE=产值管理系统
|
VITE_APP_TITLE=项目产值管理系统
|
||||||
|
|
||||||
# 项目本地运行端口号
|
# 项目本地运行端口号
|
||||||
VITE_PORT=80
|
VITE_PORT=80
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta
|
<meta
|
||||||
name="keywords"
|
name="keywords"
|
||||||
content="产值管理系统"
|
content="项目产值管理系统"
|
||||||
/>
|
/>
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="产值管理系统"
|
content="项目产值管理系统"
|
||||||
/>
|
/>
|
||||||
<title>%VITE_APP_TITLE%</title>
|
<title>%VITE_APP_TITLE%</title>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -3,12 +3,18 @@ import request from '@/config/axios'
|
|||||||
export interface ProjectPlanningVO {
|
export interface ProjectPlanningVO {
|
||||||
id?: number
|
id?: number
|
||||||
projectId: number
|
projectId: number
|
||||||
|
sortNo?: number
|
||||||
ownershipType: string
|
ownershipType: string
|
||||||
calculationMethod: string
|
calculationMethod: string
|
||||||
planningContent: string
|
planningContent: string
|
||||||
planningAmount?: number
|
planningAmount?: number
|
||||||
|
contractValueQuantity?: number
|
||||||
|
contractValueUnitPrice?: number
|
||||||
managementFeeRate?: number
|
managementFeeRate?: number
|
||||||
managementFee?: number
|
managementFee?: number
|
||||||
|
vatRate?: number
|
||||||
|
vatAmount?: number
|
||||||
|
projectBudgetOutputValue?: number
|
||||||
implementationTeam?: string
|
implementationTeam?: string
|
||||||
planningStartYear?: number
|
planningStartYear?: number
|
||||||
planningArea?: number
|
planningArea?: number
|
||||||
@@ -44,7 +50,10 @@ export type ProjectPlanningSaveVO = Omit<
|
|||||||
ProjectPlanningVO,
|
ProjectPlanningVO,
|
||||||
| 'allocatedAmount'
|
| 'allocatedAmount'
|
||||||
| 'pendingAmount'
|
| 'pendingAmount'
|
||||||
|
| 'planningAmount'
|
||||||
| 'managementFee'
|
| 'managementFee'
|
||||||
|
| 'vatAmount'
|
||||||
|
| 'projectBudgetOutputValue'
|
||||||
| 'contractUnitPrice'
|
| 'contractUnitPrice'
|
||||||
| 'totalAdjustmentFactor'
|
| 'totalAdjustmentFactor'
|
||||||
| 'assessmentArea'
|
| 'assessmentArea'
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import request from '@/config/axios'
|
|||||||
export interface ProjectProfitVO {
|
export interface ProjectProfitVO {
|
||||||
projectId: number
|
projectId: number
|
||||||
projectName: string
|
projectName: string
|
||||||
|
sortNo?: number
|
||||||
contractSignedFlag: boolean
|
contractSignedFlag: boolean
|
||||||
contractAmount?: number
|
contractAmount?: number
|
||||||
finalSettlementAmount?: number
|
finalSettlementAmount?: number
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export interface ProjectRolePersonVO {
|
|||||||
export interface ProjectVO {
|
export interface ProjectVO {
|
||||||
id?: number
|
id?: number
|
||||||
projectName: string
|
projectName: string
|
||||||
|
sortNo?: number
|
||||||
contractSignedFlag: boolean
|
contractSignedFlag: boolean
|
||||||
contractAmount?: number
|
contractAmount?: number
|
||||||
totalConstructionArea?: number
|
totalConstructionArea?: number
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ export default {
|
|||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
welcome: '欢迎使用本系统',
|
welcome: '欢迎使用本系统',
|
||||||
message: '产值管理系统',
|
message: '项目产值管理系统',
|
||||||
tenantname: '租户名称',
|
tenantname: '租户名称',
|
||||||
username: '用户名',
|
username: '用户名',
|
||||||
password: '密码',
|
password: '密码',
|
||||||
@@ -374,7 +374,7 @@ export default {
|
|||||||
qrSignInFormTitle: '二维码登录',
|
qrSignInFormTitle: '二维码登录',
|
||||||
signUpFormTitle: '注册',
|
signUpFormTitle: '注册',
|
||||||
forgetFormTitle: '重置密码',
|
forgetFormTitle: '重置密码',
|
||||||
signInTitle: '产值管理系统',
|
signInTitle: '项目产值管理系统',
|
||||||
signInDesc: '输入您的个人详细信息开始使用!',
|
signInDesc: '输入您的个人详细信息开始使用!',
|
||||||
policy: '我同意xxx隐私政策',
|
policy: '我同意xxx隐私政策',
|
||||||
scanSign: `扫码后点击"确认",即可完成登录`,
|
scanSign: `扫码后点击"确认",即可完成登录`,
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -47,14 +47,21 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目ID" prop="id" width="88" />
|
<el-table-column
|
||||||
<el-table-column align="center" label="工程名称" min-width="220" prop="projectName" />
|
:index="getProjectRowIndex"
|
||||||
<el-table-column align="center" label="项目负责人" min-width="180">
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
|
<el-table-column align="center" label="项目名称" min-width="220" prop="projectName" />
|
||||||
|
<el-table-column align="center" label="工程负责人" min-width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getProjectLeadText(scope.row.projectManagerName, scope.row.engineeringPrincipalName) }}
|
{{ getProjectLeadText(scope.row.projectManagerName, scope.row.engineeringPrincipalName) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -77,7 +84,8 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="规划内容" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
||||||
@@ -89,6 +97,7 @@
|
|||||||
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -117,8 +126,8 @@
|
|||||||
|
|
||||||
<el-descriptions :column="2" border title="基础信息">
|
<el-descriptions :column="2" border title="基础信息">
|
||||||
<el-descriptions-item label="项目名称">{{ formData.projectName || '-' }}</el-descriptions-item>
|
<el-descriptions-item label="项目名称">{{ formData.projectName || '-' }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="规划内容">{{ formData.planningContent || '-' }}</el-descriptions-item>
|
<el-descriptions-item label="项目任务包">{{ formData.planningContent || '-' }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="项目负责人">
|
<el-descriptions-item label="工程负责人">
|
||||||
{{ getProjectLeadText(formData.projectManagerName, formData.engineeringLeaderName) }}
|
{{ getProjectLeadText(formData.projectManagerName, formData.engineeringLeaderName) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
@@ -288,7 +297,7 @@ interface QuarterYearRow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
|
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
|
||||||
{ label: '项目经理/项目负责人', value: 'project_lead' },
|
{ label: '项目经理/工程负责人', value: 'project_lead' },
|
||||||
{ label: '建筑专业', value: 'arch' },
|
{ label: '建筑专业', value: 'arch' },
|
||||||
{ label: '装修专业', value: 'decor' },
|
{ label: '装修专业', value: 'decor' },
|
||||||
{ label: '结构专业', value: 'struct' },
|
{ label: '结构专业', value: 'struct' },
|
||||||
@@ -325,6 +334,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
@@ -360,7 +372,7 @@ const buildProjectRows = (model?: OutputSplitApi.ProjectOutputSplitVO) => {
|
|||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
key: 'projectLeadRatio',
|
key: 'projectLeadRatio',
|
||||||
label: '项目经理/项目负责人',
|
label: '项目经理/工程负责人',
|
||||||
percentText: formatRatioText(model.projectLeadRatio),
|
percentText: formatRatioText(model.projectLeadRatio),
|
||||||
percent: toPercentValue(model.projectLeadRatio),
|
percent: toPercentValue(model.projectLeadRatio),
|
||||||
amount: model.projectLeadAmount
|
amount: model.projectLeadAmount
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="规划内容">
|
<el-form-item label="项目任务包">
|
||||||
<el-input :model-value="formData.planningContent" disabled />
|
<el-input :model-value="formData.planningContent" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -39,17 +39,53 @@
|
|||||||
|
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="规划金额(元)">
|
<el-form-item label="合同产值数量">
|
||||||
|
<el-input :model-value="formatQuantityText(formData.contractValueQuantity)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="合同产值单价">
|
||||||
|
<el-input :model-value="formatQuantityText(formData.contractValueUnitPrice)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="分项合同产值(元)">
|
||||||
<el-input :model-value="formatAmountText(formData.planningAmount)" disabled />
|
<el-input :model-value="formatAmountText(formData.planningAmount)" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="增值税率(%)">
|
||||||
|
<el-input :model-value="formatPercentText(formData.vatRate)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="增值税(元)">
|
||||||
|
<el-input :model-value="formatAmountText(formData.vatAmount)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="管理费率(%)">
|
<el-form-item label="管理费率(%)">
|
||||||
<el-input :model-value="formatPercentText(formData.managementFeeRate)" disabled />
|
<el-input :model-value="formatPercentText(formData.managementFeeRate)" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="实施团队">
|
<el-form-item label="管理费(元)">
|
||||||
|
<el-input :model-value="formatAmountText(formData.managementFee)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="项目预算产值(元)">
|
||||||
|
<el-input :model-value="formatAmountText(formData.projectBudgetOutputValue)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="意向实施团队">
|
||||||
<el-input :model-value="formData.implementationTeam || '-'" disabled />
|
<el-input :model-value="formData.implementationTeam || '-'" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -247,7 +283,6 @@
|
|||||||
<el-button plain type="primary" @click="addGuideDetailRow">
|
<el-button plain type="primary" @click="addGuideDetailRow">
|
||||||
<template #icon><i class="el-icon-plus"></i></template>新增明细
|
<template #icon><i class="el-icon-plus"></i></template>新增明细
|
||||||
</el-button>
|
</el-button>
|
||||||
<span class="text-12px text-gray-400">💡 提示:数字字段已隐藏加减箭头以优化显示,支持直接输入或复制粘贴</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table :data="guideDetails" border max-height="460" class="optimized-table">
|
<el-table :data="guideDetails" border max-height="460" class="optimized-table">
|
||||||
@@ -544,8 +579,13 @@ const createFormData = (): PlanningApi.ProjectPlanningVO => ({
|
|||||||
calculationMethod: '',
|
calculationMethod: '',
|
||||||
planningContent: '',
|
planningContent: '',
|
||||||
planningAmount: undefined,
|
planningAmount: undefined,
|
||||||
|
contractValueQuantity: undefined,
|
||||||
|
contractValueUnitPrice: undefined,
|
||||||
managementFeeRate: undefined,
|
managementFeeRate: undefined,
|
||||||
managementFee: undefined,
|
managementFee: undefined,
|
||||||
|
vatRate: undefined,
|
||||||
|
vatAmount: undefined,
|
||||||
|
projectBudgetOutputValue: undefined,
|
||||||
implementationTeam: '',
|
implementationTeam: '',
|
||||||
planningStartYear: undefined,
|
planningStartYear: undefined,
|
||||||
planningArea: undefined,
|
planningArea: undefined,
|
||||||
@@ -639,6 +679,9 @@ const normalizeFormData = (data: PlanningApi.ProjectPlanningVO): PlanningApi.Pro
|
|||||||
...data,
|
...data,
|
||||||
ownershipType: normalizeOwnershipType(data.ownershipType) || data.ownershipType || '',
|
ownershipType: normalizeOwnershipType(data.ownershipType) || data.ownershipType || '',
|
||||||
calculationMethod: normalizeCalculationMethod(data.calculationMethod) || data.calculationMethod || '',
|
calculationMethod: normalizeCalculationMethod(data.calculationMethod) || data.calculationMethod || '',
|
||||||
|
contractValueQuantity: data.contractValueQuantity ?? 1,
|
||||||
|
contractValueUnitPrice: data.contractValueUnitPrice ?? data.planningAmount,
|
||||||
|
vatRate: data.vatRate ?? 0.06,
|
||||||
designStage: normalizeDesignStage(data.designStage),
|
designStage: normalizeDesignStage(data.designStage),
|
||||||
virtualCalculationMethod: normalizeVirtualCalculationMethod(data.virtualCalculationMethod),
|
virtualCalculationMethod: normalizeVirtualCalculationMethod(data.virtualCalculationMethod),
|
||||||
reviewOutsourceFlag: data.reviewOutsourceFlag ?? false,
|
reviewOutsourceFlag: data.reviewOutsourceFlag ?? false,
|
||||||
@@ -785,6 +828,13 @@ const formatFactorText = (value?: number, digits = 4) => {
|
|||||||
return Number(value).toFixed(digits)
|
return Number(value).toFixed(digits)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const formatQuantityText = (value?: number, digits = 4) => {
|
||||||
|
if (value === undefined || value === null) {
|
||||||
|
return '-'
|
||||||
|
}
|
||||||
|
return Number(value).toFixed(digits)
|
||||||
|
}
|
||||||
|
|
||||||
const setGuideDetailPercentValue = (
|
const setGuideDetailPercentValue = (
|
||||||
row: GuideDetailRow,
|
row: GuideDetailRow,
|
||||||
field: 'complexityFactor' | 'designRatio',
|
field: 'complexityFactor' | 'designRatio',
|
||||||
@@ -940,8 +990,11 @@ const buildSavePayload = (): PlanningApi.ProjectPlanningSaveVO => ({
|
|||||||
ownershipType: formData.value.ownershipType,
|
ownershipType: formData.value.ownershipType,
|
||||||
calculationMethod: formData.value.calculationMethod,
|
calculationMethod: formData.value.calculationMethod,
|
||||||
planningContent: formData.value.planningContent,
|
planningContent: formData.value.planningContent,
|
||||||
planningAmount: formData.value.planningAmount,
|
sortNo: formData.value.sortNo,
|
||||||
|
contractValueQuantity: formData.value.contractValueQuantity,
|
||||||
|
contractValueUnitPrice: formData.value.contractValueUnitPrice,
|
||||||
managementFeeRate: formData.value.managementFeeRate,
|
managementFeeRate: formData.value.managementFeeRate,
|
||||||
|
vatRate: formData.value.vatRate,
|
||||||
implementationTeam: formData.value.implementationTeam,
|
implementationTeam: formData.value.implementationTeam,
|
||||||
planningStartYear: formData.value.planningStartYear,
|
planningStartYear: formData.value.planningStartYear,
|
||||||
planningArea: showGuideDetailSection.value
|
planningArea: showGuideDetailSection.value
|
||||||
@@ -1104,4 +1157,4 @@ const submitForm = async () => {
|
|||||||
:deep(.text-primary) {
|
:deep(.text-primary) {
|
||||||
color: var(--el-color-primary);
|
color: var(--el-color-primary);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -211,6 +211,9 @@ const open = async (id: number) => {
|
|||||||
const planning = await PlanningApi.getProjectPlanning(id)
|
const planning = await PlanningApi.getProjectPlanning(id)
|
||||||
formData.value = {
|
formData.value = {
|
||||||
...planning,
|
...planning,
|
||||||
|
contractValueQuantity: planning.contractValueQuantity ?? 1,
|
||||||
|
contractValueUnitPrice: planning.contractValueUnitPrice ?? planning.planningAmount,
|
||||||
|
vatRate: planning.vatRate ?? 0.06,
|
||||||
totalDistributionAmount: planning.totalDistributionAmount ?? 1,
|
totalDistributionAmount: planning.totalDistributionAmount ?? 1,
|
||||||
progressRemark: planning.progressRemark ?? ''
|
progressRemark: planning.progressRemark ?? ''
|
||||||
}
|
}
|
||||||
@@ -315,11 +318,14 @@ const submitForm = async () => {
|
|||||||
await PlanningApi.updateProjectPlanning({
|
await PlanningApi.updateProjectPlanning({
|
||||||
id: formData.value.id,
|
id: formData.value.id,
|
||||||
projectId: formData.value.projectId,
|
projectId: formData.value.projectId,
|
||||||
|
sortNo: formData.value.sortNo,
|
||||||
ownershipType: formData.value.ownershipType,
|
ownershipType: formData.value.ownershipType,
|
||||||
calculationMethod: formData.value.calculationMethod,
|
calculationMethod: formData.value.calculationMethod,
|
||||||
planningContent: formData.value.planningContent,
|
planningContent: formData.value.planningContent,
|
||||||
planningAmount: formData.value.planningAmount,
|
contractValueQuantity: formData.value.contractValueQuantity,
|
||||||
|
contractValueUnitPrice: formData.value.contractValueUnitPrice,
|
||||||
managementFeeRate: formData.value.managementFeeRate,
|
managementFeeRate: formData.value.managementFeeRate,
|
||||||
|
vatRate: formData.value.vatRate,
|
||||||
implementationTeam: formData.value.implementationTeam,
|
implementationTeam: formData.value.implementationTeam,
|
||||||
planningStartYear: formData.value.planningStartYear,
|
planningStartYear: formData.value.planningStartYear,
|
||||||
planningArea: formData.value.planningArea,
|
planningArea: formData.value.planningArea,
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -62,10 +62,16 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目 ID" prop="id" width="88" />
|
<el-table-column
|
||||||
|
:index="getProjectRowIndex"
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="工程名称"
|
label="项目名称"
|
||||||
min-width="220"
|
min-width="220"
|
||||||
prop="projectName"
|
prop="projectName"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
@@ -78,7 +84,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="项目开始年度" prop="projectStartYear" width="120" />
|
<el-table-column align="center" label="项目开始年度" prop="projectStartYear" width="120" />
|
||||||
<el-table-column align="center" label="合同金额(元)" width="130">
|
<el-table-column align="center" label="合同产值(元)" width="130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.contractAmount) }}
|
{{ formatAmountText(scope.row.contractAmount) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -95,6 +101,7 @@
|
|||||||
prop="createTime"
|
prop="createTime"
|
||||||
width="180"
|
width="180"
|
||||||
/>
|
/>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -120,9 +127,10 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="规划内容"
|
label="项目任务包"
|
||||||
min-width="170"
|
min-width="170"
|
||||||
prop="planningContent"
|
prop="planningContent"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
@@ -137,7 +145,7 @@
|
|||||||
{{ getCalculationMethodLabel(scope.row.calculationMethod) }}
|
{{ getCalculationMethodLabel(scope.row.calculationMethod) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="规划金额(元)" width="120">
|
<el-table-column align="center" label="分项合同产值(元)" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.planningAmount) }}
|
{{ formatAmountText(scope.row.planningAmount) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -152,6 +160,7 @@
|
|||||||
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -190,7 +199,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-descriptions :column="2" border title="测算参数">
|
<el-descriptions :column="2" border title="测算参数">
|
||||||
<el-descriptions-item label="规划金额(元)">
|
<el-descriptions-item label="分项合同产值(元)">
|
||||||
{{ formatAmountText(currentPlanning.planningAmount) }}
|
{{ formatAmountText(currentPlanning.planningAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="管理费费率">
|
<el-descriptions-item label="管理费费率">
|
||||||
@@ -199,7 +208,7 @@
|
|||||||
<el-descriptions-item label="管理费(元)">
|
<el-descriptions-item label="管理费(元)">
|
||||||
{{ formatAmountText(currentPlanning.managementFee) }}
|
{{ formatAmountText(currentPlanning.managementFee) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="实施团队">
|
<el-descriptions-item label="意向实施团队">
|
||||||
{{ currentPlanning.implementationTeam || '-' }}
|
{{ currentPlanning.implementationTeam || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="开始年度">
|
<el-descriptions-item label="开始年度">
|
||||||
@@ -429,6 +438,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -62,7 +62,14 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProfitChange"
|
@current-change="handleCurrentProfitChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="工程名称" min-width="220" prop="projectName" />
|
<el-table-column
|
||||||
|
:index="getProjectRowIndex"
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
|
<el-table-column align="center" label="项目名称" min-width="220" prop="projectName" />
|
||||||
<el-table-column align="center" label="是否签约" width="100">
|
<el-table-column align="center" label="是否签约" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag :type="scope.row.contractSignedFlag ? 'success' : 'info'">
|
<el-tag :type="scope.row.contractSignedFlag ? 'success' : 'info'">
|
||||||
@@ -71,7 +78,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="100" />
|
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="100" />
|
||||||
<el-table-column align="center" label="合同金额(元)" width="120">
|
<el-table-column align="center" label="合同产值(元)" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.contractAmount) }}
|
{{ formatAmountText(scope.row.contractAmount) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -130,6 +137,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -149,7 +157,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-descriptions :column="3" border>
|
<el-descriptions :column="3" border>
|
||||||
<el-descriptions-item label="合同金额(元)">
|
<el-descriptions-item label="合同产值(元)">
|
||||||
{{ formatAmountText(currentProfit.contractAmount) }}
|
{{ formatAmountText(currentProfit.contractAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="最终结算金额(元)">
|
<el-descriptions-item label="最终结算金额(元)">
|
||||||
@@ -295,6 +303,9 @@ const queryParams = reactive<ProfitApi.ProjectProfitPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<Dialog v-model="dialogVisible" :title="dialogTitle" width="920">
|
<Dialog v-model="dialogVisible" :title="dialogTitle" width="980">
|
||||||
<el-form
|
<el-form
|
||||||
ref="formRef"
|
ref="formRef"
|
||||||
v-loading="formLoading"
|
v-loading="formLoading"
|
||||||
@@ -26,11 +26,11 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="规划内容" prop="planningContent">
|
<el-form-item label="项目任务包" prop="planningContent">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.planningContent"
|
v-model="formData.planningContent"
|
||||||
maxlength="255"
|
maxlength="255"
|
||||||
placeholder="请输入规划内容"
|
placeholder="请输入项目任务包"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -38,17 +38,69 @@
|
|||||||
|
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="规划金额(元)" prop="planningAmount">
|
<el-form-item label="合同产值数量" prop="contractValueQuantity">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="formData.planningAmount"
|
v-model="formData.contractValueQuantity"
|
||||||
:min="0"
|
:min="0"
|
||||||
:precision="2"
|
:precision="4"
|
||||||
|
:step="1"
|
||||||
|
class="!w-1/1"
|
||||||
|
controls-position="right"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="合同产值单价" prop="contractValueUnitPrice">
|
||||||
|
<el-input-number
|
||||||
|
v-model="formData.contractValueUnitPrice"
|
||||||
|
:min="0"
|
||||||
|
:precision="4"
|
||||||
:step="1000"
|
:step="1000"
|
||||||
class="!w-1/1"
|
class="!w-1/1"
|
||||||
controls-position="right"
|
controls-position="right"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="分项合同产值(元)">
|
||||||
|
<el-input :model-value="planningAmountPreview" class="readonly-result" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="意向实施团队" prop="implementationTeam">
|
||||||
|
<el-input
|
||||||
|
v-model="formData.implementationTeam"
|
||||||
|
maxlength="100"
|
||||||
|
placeholder="请输入意向实施团队"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="增值税率(%)" prop="vatRate">
|
||||||
|
<el-input-number
|
||||||
|
v-model="vatRatePercent"
|
||||||
|
:min="0"
|
||||||
|
:precision="2"
|
||||||
|
:step="0.01"
|
||||||
|
class="!w-1/1"
|
||||||
|
controls-position="right"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="增值税(元)">
|
||||||
|
<el-input :model-value="vatAmountPreview" class="readonly-result" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="管理费率(%)" prop="managementFeeRate">
|
<el-form-item label="管理费率(%)" prop="managementFeeRate">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
@@ -61,20 +113,32 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="管理费(元)">
|
||||||
|
<el-input :model-value="managementFeePreview" class="readonly-result" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="管理费(元)">
|
<el-form-item label="项目预算产值(元)">
|
||||||
<el-input :model-value="managementFeePreview" disabled />
|
<el-input
|
||||||
|
:model-value="projectBudgetOutputValuePreview"
|
||||||
|
class="budget-result"
|
||||||
|
disabled
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="实施团队" prop="implementationTeam">
|
<el-form-item label="排序" prop="sortNo">
|
||||||
<el-input
|
<el-input-number
|
||||||
v-model="formData.implementationTeam"
|
v-model="formData.sortNo"
|
||||||
maxlength="100"
|
:min="0"
|
||||||
placeholder="请输入实施团队"
|
:precision="0"
|
||||||
|
:step="1"
|
||||||
|
class="!w-1/1"
|
||||||
|
controls-position="right"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -114,12 +178,18 @@ const createFormData = (
|
|||||||
planningAmount?: number
|
planningAmount?: number
|
||||||
): PlanningApi.ProjectPlanningVO => ({
|
): PlanningApi.ProjectPlanningVO => ({
|
||||||
projectId: projectId || 0,
|
projectId: projectId || 0,
|
||||||
|
sortNo: 0,
|
||||||
ownershipType: ownershipTypeOptions[0].value,
|
ownershipType: ownershipTypeOptions[0].value,
|
||||||
calculationMethod: '',
|
calculationMethod: '',
|
||||||
planningContent: '',
|
planningContent: '',
|
||||||
planningAmount,
|
planningAmount,
|
||||||
|
contractValueQuantity: 1,
|
||||||
|
contractValueUnitPrice: planningAmount,
|
||||||
managementFeeRate: undefined,
|
managementFeeRate: undefined,
|
||||||
implementationTeam: '',
|
implementationTeam: '',
|
||||||
|
vatRate: 0.06,
|
||||||
|
vatAmount: undefined,
|
||||||
|
projectBudgetOutputValue: undefined,
|
||||||
planningStartYear: undefined,
|
planningStartYear: undefined,
|
||||||
planningArea: undefined,
|
planningArea: undefined,
|
||||||
designStage: undefined,
|
designStage: undefined,
|
||||||
@@ -164,31 +234,69 @@ const managementFeeRatePercent = computed({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const managementFeePreview = computed(() => {
|
const vatRatePercent = computed({
|
||||||
const planningAmount = Number(formData.value.planningAmount || 0)
|
get: () => {
|
||||||
const managementFeeRate = Number(formData.value.managementFeeRate || 0)
|
if (formData.value.vatRate === undefined || formData.value.vatRate === null) {
|
||||||
return (planningAmount * managementFeeRate).toFixed(2)
|
return undefined
|
||||||
|
}
|
||||||
|
return Number((Number(formData.value.vatRate) * 100).toFixed(2))
|
||||||
|
},
|
||||||
|
set: (value?: number) => {
|
||||||
|
formData.value.vatRate =
|
||||||
|
value === undefined || value === null ? undefined : Number((value / 100).toFixed(4))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const planningAmountPreviewValue = computed(() => {
|
||||||
|
const quantity = Number(formData.value.contractValueQuantity || 0)
|
||||||
|
const unitPrice = Number(formData.value.contractValueUnitPrice || 0)
|
||||||
|
return Number((quantity * unitPrice).toFixed(2))
|
||||||
|
})
|
||||||
|
|
||||||
|
const planningAmountPreview = computed(() => planningAmountPreviewValue.value.toFixed(2))
|
||||||
|
|
||||||
|
const managementFeePreview = computed(() => {
|
||||||
|
const managementFeeRate = Number(formData.value.managementFeeRate || 0)
|
||||||
|
return (planningAmountPreviewValue.value * managementFeeRate).toFixed(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
const vatAmountPreview = computed(() => {
|
||||||
|
const vatRate = Number(formData.value.vatRate || 0)
|
||||||
|
return (planningAmountPreviewValue.value * vatRate).toFixed(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
const projectBudgetOutputValuePreview = computed(() =>
|
||||||
|
(
|
||||||
|
planningAmountPreviewValue.value -
|
||||||
|
Number(managementFeePreview.value || 0) -
|
||||||
|
Number(vatAmountPreview.value || 0)
|
||||||
|
).toFixed(2)
|
||||||
|
)
|
||||||
|
|
||||||
const normalizeOwnershipType = (value?: string) =>
|
const normalizeOwnershipType = (value?: string) =>
|
||||||
ownershipTypeOptions.find((item) => item.value === value)?.value || ownershipTypeOptions[0].value
|
ownershipTypeOptions.find((item) => item.value === value)?.value || ownershipTypeOptions[0].value
|
||||||
|
|
||||||
const formRules = reactive<FormRules>({
|
const formRules = reactive<FormRules>({
|
||||||
projectId: [{ required: true, message: '请选择所属项目', trigger: 'change' }],
|
projectId: [{ required: true, message: '请选择所属项目', trigger: 'change' }],
|
||||||
ownershipType: [{ required: true, message: '归属类型不能为空', trigger: 'change' }],
|
ownershipType: [{ required: true, message: '归属类型不能为空', trigger: 'change' }],
|
||||||
planningContent: [{ required: true, message: '规划内容不能为空', trigger: 'blur' }],
|
planningContent: [{ required: true, message: '项目任务包不能为空', trigger: 'blur' }],
|
||||||
planningAmount: [{ required: true, message: '规划金额不能为空', trigger: 'blur' }],
|
contractValueQuantity: [{ required: true, message: '合同产值数量不能为空', trigger: 'blur' }],
|
||||||
managementFeeRate: [{ required: true, message: '管理费率不能为空', trigger: 'blur' }]
|
contractValueUnitPrice: [{ required: true, message: '合同产值单价不能为空', trigger: 'blur' }],
|
||||||
|
managementFeeRate: [{ required: true, message: '管理费率不能为空', trigger: 'blur' }],
|
||||||
|
vatRate: [{ required: true, message: '增值税率不能为空', trigger: 'blur' }]
|
||||||
})
|
})
|
||||||
|
|
||||||
const buildSavePayload = (): PlanningApi.ProjectPlanningSaveVO => ({
|
const buildSavePayload = (): PlanningApi.ProjectPlanningSaveVO => ({
|
||||||
id: formData.value.id,
|
id: formData.value.id,
|
||||||
projectId: formData.value.projectId,
|
projectId: formData.value.projectId,
|
||||||
|
sortNo: formData.value.sortNo ?? 0,
|
||||||
ownershipType: formData.value.ownershipType,
|
ownershipType: formData.value.ownershipType,
|
||||||
calculationMethod: formData.value.calculationMethod,
|
calculationMethod: formData.value.calculationMethod,
|
||||||
planningContent: formData.value.planningContent,
|
planningContent: formData.value.planningContent,
|
||||||
planningAmount: formData.value.planningAmount,
|
contractValueQuantity: formData.value.contractValueQuantity,
|
||||||
|
contractValueUnitPrice: formData.value.contractValueUnitPrice,
|
||||||
managementFeeRate: formData.value.managementFeeRate,
|
managementFeeRate: formData.value.managementFeeRate,
|
||||||
|
vatRate: formData.value.vatRate,
|
||||||
implementationTeam: formData.value.implementationTeam,
|
implementationTeam: formData.value.implementationTeam,
|
||||||
planningStartYear: formData.value.planningStartYear,
|
planningStartYear: formData.value.planningStartYear,
|
||||||
planningArea: formData.value.planningArea,
|
planningArea: formData.value.planningArea,
|
||||||
@@ -233,7 +341,11 @@ const open = async (
|
|||||||
formData.value = {
|
formData.value = {
|
||||||
...createFormData(options.projectId, options.defaultPlanningAmount),
|
...createFormData(options.projectId, options.defaultPlanningAmount),
|
||||||
...planning,
|
...planning,
|
||||||
ownershipType: normalizeOwnershipType(planning.ownershipType)
|
ownershipType: normalizeOwnershipType(planning.ownershipType),
|
||||||
|
contractValueQuantity: planning.contractValueQuantity ?? 1,
|
||||||
|
contractValueUnitPrice:
|
||||||
|
planning.contractValueUnitPrice ?? planning.planningAmount ?? options.defaultPlanningAmount,
|
||||||
|
vatRate: planning.vatRate ?? 0.06
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
@@ -273,3 +385,19 @@ const resetForm = (projectId?: number, planningAmount?: number) => {
|
|||||||
formRef.value?.resetFields()
|
formRef.value?.resetFields()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.readonly-result :deep(.el-input__wrapper.is-disabled) {
|
||||||
|
background-color: var(--el-fill-color-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.budget-result :deep(.el-input__wrapper.is-disabled) {
|
||||||
|
background-color: var(--el-color-primary-light-9);
|
||||||
|
box-shadow: 0 0 0 1px var(--el-color-primary-light-5) inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.budget-result :deep(.el-input__inner) {
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -5,250 +5,264 @@
|
|||||||
v-loading="formLoading"
|
v-loading="formLoading"
|
||||||
:model="formData"
|
:model="formData"
|
||||||
:rules="formRules"
|
:rules="formRules"
|
||||||
label-width="120px"
|
label-width="130px"
|
||||||
>
|
>
|
||||||
<el-row :gutter="16">
|
<div class="form-section">
|
||||||
<el-col :span="12">
|
<div class="form-section-title">项目基础信息</div>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-row :gutter="16">
|
||||||
<el-input v-model="formData.projectName" maxlength="200" placeholder="请输入工程名称" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
</el-col>
|
<el-input v-model="formData.projectName" maxlength="200" placeholder="请输入项目名称" />
|
||||||
<el-col :span="12">
|
</el-form-item>
|
||||||
<el-form-item label="是否签订合同" prop="contractSignedFlag">
|
</el-col>
|
||||||
<el-switch
|
<el-col :span="12">
|
||||||
v-model="formData.contractSignedFlag"
|
<el-form-item label="工程总面积(㎡)" prop="totalConstructionArea">
|
||||||
active-text="已签订"
|
<el-input-number
|
||||||
inactive-text="未签订"
|
v-model="formData.totalConstructionArea"
|
||||||
/>
|
:min="0"
|
||||||
</el-form-item>
|
:precision="2"
|
||||||
</el-col>
|
:step="100"
|
||||||
</el-row>
|
class="!w-1/1"
|
||||||
|
controls-position="right"
|
||||||
<el-row :gutter="16">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="合同金额(元)" prop="contractAmount">
|
|
||||||
<el-input-number
|
|
||||||
v-model="formData.contractAmount"
|
|
||||||
:min="0"
|
|
||||||
:precision="2"
|
|
||||||
:step="1000"
|
|
||||||
class="!w-1/1"
|
|
||||||
controls-position="right"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="工程总面积(㎡)" prop="totalConstructionArea">
|
|
||||||
<el-input-number
|
|
||||||
v-model="formData.totalConstructionArea"
|
|
||||||
:min="0"
|
|
||||||
:precision="2"
|
|
||||||
:step="100"
|
|
||||||
class="!w-1/1"
|
|
||||||
controls-position="right"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row :gutter="16">
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="建设单位" prop="constructionUnitName">
|
|
||||||
<el-input
|
|
||||||
v-model="formData.constructionUnitName"
|
|
||||||
maxlength="200"
|
|
||||||
placeholder="请输入建设单位"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="工程类型" prop="projectType">
|
|
||||||
<el-select v-model="formData.projectType" class="!w-1/1" clearable placeholder="请选择">
|
|
||||||
<el-option
|
|
||||||
v-for="item in PROJECT_TYPE_OPTIONS"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="12">
|
||||||
<el-col :span="8">
|
<el-form-item label="建设单位" prop="constructionUnitName">
|
||||||
<el-form-item label="工程类别" prop="projectCategory">
|
<el-input
|
||||||
<el-select
|
v-model="formData.constructionUnitName"
|
||||||
v-model="formData.projectCategory"
|
maxlength="200"
|
||||||
class="!w-1/1"
|
placeholder="请输入建设单位"
|
||||||
clearable
|
|
||||||
placeholder="请选择"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in PROJECT_CATEGORY_OPTIONS"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="12">
|
||||||
</el-row>
|
<el-form-item label="工程类型" prop="projectType">
|
||||||
|
<el-select v-model="formData.projectType" class="!w-1/1" clearable placeholder="请选择">
|
||||||
<el-row :gutter="16">
|
<el-option
|
||||||
<el-col :span="12">
|
v-for="item in PROJECT_TYPE_OPTIONS"
|
||||||
<el-form-item label="联系人" prop="contactName">
|
:key="item.value"
|
||||||
<el-input v-model="formData.contactName" maxlength="64" placeholder="请输入联系人" />
|
:label="item.label"
|
||||||
</el-form-item>
|
:value="item.value"
|
||||||
</el-col>
|
/>
|
||||||
<el-col :span="12">
|
</el-select>
|
||||||
<el-form-item label="联系电话" prop="contactPhone">
|
</el-form-item>
|
||||||
<el-input v-model="formData.contactPhone" maxlength="32" placeholder="请输入联系电话" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="12">
|
||||||
</el-col>
|
<el-form-item label="工程类别" prop="projectCategory">
|
||||||
</el-row>
|
<el-select
|
||||||
|
v-model="formData.projectCategory"
|
||||||
<el-row :gutter="16">
|
class="!w-1/1"
|
||||||
<el-col :span="12">
|
clearable
|
||||||
<el-form-item label="合同签订日期" prop="contractSigningDate">
|
placeholder="请选择"
|
||||||
<el-date-picker
|
|
||||||
v-model="formData.contractSigningDate"
|
|
||||||
class="!w-1/1"
|
|
||||||
placeholder="请选择日期"
|
|
||||||
type="date"
|
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="项目开始年度" prop="projectStartYear">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="projectStartYearValue"
|
|
||||||
class="!w-1/1"
|
|
||||||
placeholder="请选择年度"
|
|
||||||
type="year"
|
|
||||||
value-format="YYYY"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row :gutter="16">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="项目状态" prop="projectStatus">
|
|
||||||
<el-select
|
|
||||||
v-model="formData.projectStatus"
|
|
||||||
class="!w-1/1"
|
|
||||||
clearable
|
|
||||||
placeholder="请选择项目状态"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in PROJECT_STATUS_OPTIONS"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item :label="statusReasonLabel" :prop="statusReasonProp">
|
|
||||||
<el-input
|
|
||||||
v-if="formData.projectStatus === '暂停'"
|
|
||||||
v-model="formData.pauseReason"
|
|
||||||
maxlength="255"
|
|
||||||
placeholder="请输入暂停原因"
|
|
||||||
/>
|
|
||||||
<el-input
|
|
||||||
v-else-if="formData.projectStatus === '中止'"
|
|
||||||
v-model="formData.terminateReason"
|
|
||||||
maxlength="255"
|
|
||||||
placeholder="请输入中止原因"
|
|
||||||
/>
|
|
||||||
<el-input v-else disabled placeholder="进行中或完成状态无需填写原因" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row :gutter="16">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="项目经理">
|
|
||||||
<div class="person-group">
|
|
||||||
<div
|
|
||||||
v-for="(item, index) in projectManagerPersons"
|
|
||||||
:key="`manager-${index}`"
|
|
||||||
class="person-row"
|
|
||||||
>
|
>
|
||||||
<el-select
|
<el-option
|
||||||
:model-value="item.employeeId"
|
v-for="item in PROJECT_CATEGORY_OPTIONS"
|
||||||
class="!w-1/1"
|
:key="item.value"
|
||||||
clearable
|
:label="item.label"
|
||||||
filterable
|
:value="item.value"
|
||||||
remote
|
/>
|
||||||
reserve-keyword
|
</el-select>
|
||||||
placeholder="请输入项目经理姓名搜索"
|
</el-form-item>
|
||||||
:remote-method="searchEmployees"
|
</el-col>
|
||||||
:loading="employeeLoading"
|
</el-row>
|
||||||
@change="(value) => handleEmployeeChange(item, value)"
|
</div>
|
||||||
|
|
||||||
|
<div class="form-section">
|
||||||
|
<div class="form-section-title">合同与财务信息</div>
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="合同状态" prop="contractSignedFlag" required>
|
||||||
|
<el-radio-group v-model="formData.contractSignedFlag">
|
||||||
|
<el-radio :value="true">已签订</el-radio>
|
||||||
|
<el-radio :value="false">未签订</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="合同产值(元)" prop="contractAmount">
|
||||||
|
<el-input-number
|
||||||
|
v-model="formData.contractAmount"
|
||||||
|
:min="0"
|
||||||
|
:precision="2"
|
||||||
|
:step="1000"
|
||||||
|
class="!w-1/1"
|
||||||
|
controls-position="right"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="签订日期" prop="contractSigningDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.contractSigningDate"
|
||||||
|
class="!w-1/1"
|
||||||
|
placeholder="请选择日期"
|
||||||
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-section">
|
||||||
|
<div class="form-section-title">状态与进度</div>
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="项目状态" prop="projectStatus">
|
||||||
|
<el-select
|
||||||
|
v-model="formData.projectStatus"
|
||||||
|
class="!w-1/1"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择项目状态"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in PROJECT_STATUS_OPTIONS"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="开始年度" prop="projectStartYear">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="projectStartYearValue"
|
||||||
|
class="!w-1/1"
|
||||||
|
placeholder="请选择年度"
|
||||||
|
type="year"
|
||||||
|
value-format="YYYY"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item :label="statusReasonLabel" :prop="statusReasonProp">
|
||||||
|
<el-input
|
||||||
|
v-if="formData.projectStatus === '暂停'"
|
||||||
|
v-model="formData.pauseReason"
|
||||||
|
maxlength="255"
|
||||||
|
placeholder="请输入暂停原因"
|
||||||
|
/>
|
||||||
|
<el-input
|
||||||
|
v-else-if="formData.projectStatus === '中止'"
|
||||||
|
v-model="formData.terminateReason"
|
||||||
|
maxlength="255"
|
||||||
|
placeholder="请输入中止原因"
|
||||||
|
/>
|
||||||
|
<el-input v-else disabled placeholder="进行中或完成状态无需填写原因" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="排序" prop="sortNo">
|
||||||
|
<el-input-number
|
||||||
|
v-model="formData.sortNo"
|
||||||
|
:min="0"
|
||||||
|
:precision="0"
|
||||||
|
:step="1"
|
||||||
|
class="!w-1/1"
|
||||||
|
controls-position="right"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-section">
|
||||||
|
<div class="form-section-title">人员与建设单位联系信息</div>
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="建设单位联系人" prop="contactName">
|
||||||
|
<el-input v-model="formData.contactName" maxlength="64" placeholder="请输入建设单位联系人" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="建设单位联系电话" prop="contactPhone">
|
||||||
|
<el-input v-model="formData.contactPhone" maxlength="32" placeholder="请输入建设单位联系电话" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="项目经理">
|
||||||
|
<div class="person-group">
|
||||||
|
<div
|
||||||
|
v-for="(item, index) in projectManagerPersons"
|
||||||
|
:key="`manager-${index}`"
|
||||||
|
class="person-row"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-select
|
||||||
v-for="employee in employeeOptions"
|
:model-value="item.employeeId"
|
||||||
:key="employee.id"
|
class="!w-1/1"
|
||||||
:label="employee.officeName ? `${employee.employeeName} / ${employee.officeName}` : employee.employeeName"
|
clearable
|
||||||
:value="employee.id"
|
filterable
|
||||||
/>
|
remote
|
||||||
</el-select>
|
reserve-keyword
|
||||||
<el-button text type="danger" @click="removeRolePerson(ROLE_PROJECT_MANAGER, index)">
|
placeholder="请输入项目经理姓名搜索"
|
||||||
删除
|
:remote-method="searchEmployees"
|
||||||
|
:loading="employeeLoading"
|
||||||
|
@change="(value) => handleEmployeeChange(item, value)"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="employee in employeeOptions"
|
||||||
|
:key="employee.id"
|
||||||
|
:label="employee.officeName ? `${employee.employeeName} / ${employee.officeName}` : employee.employeeName"
|
||||||
|
:value="employee.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<el-button text type="danger" @click="removeRolePerson(ROLE_PROJECT_MANAGER, index)">
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<el-button text type="primary" @click="addRolePerson(ROLE_PROJECT_MANAGER)">
|
||||||
|
<Icon class="mr-5px" icon="ep:plus" />
|
||||||
|
添加项目经理
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-button text type="primary" @click="addRolePerson(ROLE_PROJECT_MANAGER)">
|
</el-form-item>
|
||||||
<Icon class="mr-5px" icon="ep:plus" />
|
</el-col>
|
||||||
添加项目经理
|
<el-col :span="12">
|
||||||
</el-button>
|
<el-form-item label="工程负责人">
|
||||||
</div>
|
<div class="person-group">
|
||||||
</el-form-item>
|
<div
|
||||||
</el-col>
|
v-for="(item, index) in engineeringPrincipalPersons"
|
||||||
<el-col :span="12">
|
:key="`principal-${index}`"
|
||||||
<el-form-item label="项目负责人">
|
class="person-row"
|
||||||
<div class="person-group">
|
|
||||||
<div
|
|
||||||
v-for="(item, index) in engineeringPrincipalPersons"
|
|
||||||
:key="`principal-${index}`"
|
|
||||||
class="person-row"
|
|
||||||
>
|
|
||||||
<el-select
|
|
||||||
:model-value="item.employeeId"
|
|
||||||
class="!w-1/1"
|
|
||||||
clearable
|
|
||||||
filterable
|
|
||||||
remote
|
|
||||||
reserve-keyword
|
|
||||||
placeholder="请输入项目负责人姓名搜索"
|
|
||||||
:remote-method="searchEmployees"
|
|
||||||
:loading="employeeLoading"
|
|
||||||
@change="(value) => handleEmployeeChange(item, value)"
|
|
||||||
>
|
>
|
||||||
<el-option
|
<el-select
|
||||||
v-for="employee in employeeOptions"
|
:model-value="item.employeeId"
|
||||||
:key="employee.id"
|
class="!w-1/1"
|
||||||
:label="employee.officeName ? `${employee.employeeName} / ${employee.officeName}` : employee.employeeName"
|
clearable
|
||||||
:value="employee.id"
|
filterable
|
||||||
/>
|
remote
|
||||||
</el-select>
|
reserve-keyword
|
||||||
<el-button
|
placeholder="请输入工程负责人姓名搜索"
|
||||||
text
|
:remote-method="searchEmployees"
|
||||||
type="danger"
|
:loading="employeeLoading"
|
||||||
@click="removeRolePerson(ROLE_ENGINEERING_PRINCIPAL, index)"
|
@change="(value) => handleEmployeeChange(item, value)"
|
||||||
>
|
>
|
||||||
删除
|
<el-option
|
||||||
|
v-for="employee in employeeOptions"
|
||||||
|
:key="employee.id"
|
||||||
|
:label="employee.officeName ? `${employee.employeeName} / ${employee.officeName}` : employee.employeeName"
|
||||||
|
:value="employee.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<el-button
|
||||||
|
text
|
||||||
|
type="danger"
|
||||||
|
@click="removeRolePerson(ROLE_ENGINEERING_PRINCIPAL, index)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<el-button text type="primary" @click="addRolePerson(ROLE_ENGINEERING_PRINCIPAL)">
|
||||||
|
<Icon class="mr-5px" icon="ep:plus" />
|
||||||
|
添加工程负责人
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-button text type="primary" @click="addRolePerson(ROLE_ENGINEERING_PRINCIPAL)">
|
</el-form-item>
|
||||||
<Icon class="mr-5px" icon="ep:plus" />
|
</el-col>
|
||||||
添加项目负责人
|
</el-row>
|
||||||
</el-button>
|
</div>
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
@@ -315,6 +329,7 @@ const createRolePerson = (
|
|||||||
|
|
||||||
const createFormData = (): ProjectApi.ProjectVO => ({
|
const createFormData = (): ProjectApi.ProjectVO => ({
|
||||||
projectName: '',
|
projectName: '',
|
||||||
|
sortNo: 0,
|
||||||
contractSignedFlag: true,
|
contractSignedFlag: true,
|
||||||
contractAmount: undefined,
|
contractAmount: undefined,
|
||||||
totalConstructionArea: undefined,
|
totalConstructionArea: undefined,
|
||||||
@@ -443,8 +458,8 @@ watch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
const formRules = reactive<FormRules>({
|
const formRules = reactive<FormRules>({
|
||||||
projectName: [{ required: true, message: '工程名称不能为空', trigger: 'blur' }],
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
||||||
contractAmount: [{ required: true, message: '合同金额不能为空', trigger: 'blur' }],
|
contractAmount: [{ required: true, message: '合同产值不能为空', trigger: 'blur' }],
|
||||||
totalConstructionArea: [{ required: true, message: '工程总面积不能为空', trigger: 'blur' }],
|
totalConstructionArea: [{ required: true, message: '工程总面积不能为空', trigger: 'blur' }],
|
||||||
projectStartYear: [{ required: true, message: '项目开始年度不能为空', trigger: 'change' }],
|
projectStartYear: [{ required: true, message: '项目开始年度不能为空', trigger: 'change' }],
|
||||||
projectStatus: [{ required: true, message: '项目状态不能为空', trigger: 'change' }],
|
projectStatus: [{ required: true, message: '项目状态不能为空', trigger: 'change' }],
|
||||||
@@ -497,6 +512,7 @@ const emit = defineEmits(['success'])
|
|||||||
const buildSavePayload = (): ProjectApi.ProjectSaveVO => ({
|
const buildSavePayload = (): ProjectApi.ProjectSaveVO => ({
|
||||||
id: formData.value.id,
|
id: formData.value.id,
|
||||||
projectName: formData.value.projectName,
|
projectName: formData.value.projectName,
|
||||||
|
sortNo: formData.value.sortNo ?? 0,
|
||||||
contractSignedFlag: formData.value.contractSignedFlag,
|
contractSignedFlag: formData.value.contractSignedFlag,
|
||||||
contractAmount: formData.value.contractAmount,
|
contractAmount: formData.value.contractAmount,
|
||||||
totalConstructionArea: formData.value.totalConstructionArea,
|
totalConstructionArea: formData.value.totalConstructionArea,
|
||||||
@@ -556,6 +572,22 @@ const resetForm = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.form-section {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-section:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-section-title {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 22px;
|
||||||
|
color: var(--el-text-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
.person-group {
|
.person-group {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -97,12 +97,18 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目ID" prop="id" width="88" />
|
<el-table-column
|
||||||
<el-table-column align="center" label="工程名称" min-width="220" prop="projectName" />
|
:index="getProjectRowIndex"
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
|
<el-table-column align="center" label="项目名称" min-width="220" prop="projectName" />
|
||||||
<el-table-column align="center" label="项目经理" min-width="140" prop="projectManagerName" />
|
<el-table-column align="center" label="项目经理" min-width="140" prop="projectManagerName" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="项目负责人"
|
label="工程负责人"
|
||||||
min-width="140"
|
min-width="140"
|
||||||
prop="engineeringPrincipalName"
|
prop="engineeringPrincipalName"
|
||||||
/>
|
/>
|
||||||
@@ -124,6 +130,7 @@
|
|||||||
{{ formatDate(scope.row.createTime as any) }}
|
{{ formatDate(scope.row.createTime as any) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
<el-table-column align="center" fixed="right" label="操作" width="150">
|
<el-table-column align="center" fixed="right" label="操作" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
@@ -160,7 +167,7 @@
|
|||||||
<div class="mt-4px text-13px text-[var(--el-text-color-secondary)]">
|
<div class="mt-4px text-13px text-[var(--el-text-color-secondary)]">
|
||||||
建设单位:{{ currentProject.constructionUnitName || '-' }},项目经理:{{
|
建设单位:{{ currentProject.constructionUnitName || '-' }},项目经理:{{
|
||||||
currentProject.projectManagerName || '-'
|
currentProject.projectManagerName || '-'
|
||||||
}},项目负责人:{{ currentProject.engineeringPrincipalName || '-' }}
|
}},工程负责人:{{ currentProject.engineeringPrincipalName || '-' }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-button
|
<el-button
|
||||||
@@ -177,7 +184,7 @@
|
|||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-descriptions :column="1" border title="项目概况">
|
<el-descriptions :column="1" border title="项目概况">
|
||||||
<el-descriptions-item label="工程名称">{{ currentProject.projectName }}</el-descriptions-item>
|
<el-descriptions-item label="项目名称">{{ currentProject.projectName }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="工程类型">
|
<el-descriptions-item label="工程类型">
|
||||||
{{ getProjectTypeText(currentProject.projectType) }}
|
{{ getProjectTypeText(currentProject.projectType) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
@@ -187,10 +194,10 @@
|
|||||||
<el-descriptions-item label="合同签订日期">
|
<el-descriptions-item label="合同签订日期">
|
||||||
{{ currentProject.contractSigningDate || '-' }}
|
{{ currentProject.contractSigningDate || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="联系人">
|
<el-descriptions-item label="建设单位联系人">
|
||||||
{{ currentProject.contactName || '-' }}
|
{{ currentProject.contactName || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="联系电话">
|
<el-descriptions-item label="建设单位联系电话">
|
||||||
{{ currentProject.contactPhone || '-' }}
|
{{ currentProject.contactPhone || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="项目状态">
|
<el-descriptions-item label="项目状态">
|
||||||
@@ -211,7 +218,7 @@
|
|||||||
>
|
>
|
||||||
{{ currentProject.terminateReason || '-' }}
|
{{ currentProject.terminateReason || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="合同金额(元)">
|
<el-descriptions-item label="合同产值(元)">
|
||||||
{{ formatAmountText(currentProject.contractAmount) }}
|
{{ formatAmountText(currentProject.contractAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="工程总面积(m²)">
|
<el-descriptions-item label="工程总面积(m²)">
|
||||||
@@ -222,9 +229,10 @@
|
|||||||
|
|
||||||
<el-col :span="16">
|
<el-col :span="16">
|
||||||
<el-table v-loading="planningLoading" :data="planningList">
|
<el-table v-loading="planningLoading" :data="planningList">
|
||||||
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="规划内容"
|
label="项目任务包"
|
||||||
min-width="260"
|
min-width="260"
|
||||||
prop="planningContent"
|
prop="planningContent"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
@@ -234,7 +242,17 @@
|
|||||||
{{ getOwnershipTypeText(scope.row.ownershipType) }}
|
{{ getOwnershipTypeText(scope.row.ownershipType) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="规划金额(元)" width="130">
|
<el-table-column align="center" label="合同产值数量" width="130">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ scope.row.contractValueQuantity ?? '-' }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="合同产值单价" width="130">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ formatAmountText(scope.row.contractValueUnitPrice) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="分项合同产值(元)" width="130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.planningAmount) }}
|
{{ formatAmountText(scope.row.planningAmount) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -249,13 +267,29 @@
|
|||||||
{{ formatAmountText(scope.row.managementFee) }}
|
{{ formatAmountText(scope.row.managementFee) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="增值税率" width="100">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ formatPercentText(scope.row.vatRate) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="增值税(元)" width="120">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ formatAmountText(scope.row.vatAmount) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="项目预算产值(元)" width="140">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ formatAmountText(scope.row.projectBudgetOutputValue) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="实施团队"
|
label="意向实施团队"
|
||||||
min-width="140"
|
min-width="140"
|
||||||
prop="implementationTeam"
|
prop="implementationTeam"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
<el-table-column align="center" fixed="right" label="操作" width="140">
|
<el-table-column align="center" fixed="right" label="操作" width="140">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
@@ -373,6 +407,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
createTime: []
|
createTime: []
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
((queryParams.pageNo ?? 1) - 1) * (queryParams.pageSize ?? 10) + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -62,10 +62,16 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目ID" prop="id" width="88" />
|
<el-table-column
|
||||||
|
:index="getProjectRowIndex"
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="工程名称"
|
label="项目名称"
|
||||||
min-width="220"
|
min-width="220"
|
||||||
prop="projectName"
|
prop="projectName"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
@@ -80,12 +86,12 @@
|
|||||||
<el-table-column align="center" label="项目经理" min-width="120" prop="projectManagerName" />
|
<el-table-column align="center" label="项目经理" min-width="120" prop="projectManagerName" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="项目负责人"
|
label="工程负责人"
|
||||||
min-width="120"
|
min-width="120"
|
||||||
prop="engineeringPrincipalName"
|
prop="engineeringPrincipalName"
|
||||||
/>
|
/>
|
||||||
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
||||||
<el-table-column align="center" label="合同金额(元)" width="130">
|
<el-table-column align="center" label="合同产值(元)" width="130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.contractAmount) }}
|
{{ formatAmountText(scope.row.contractAmount) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -95,6 +101,7 @@
|
|||||||
{{ formatAreaText(scope.row.totalConstructionArea) }}
|
{{ formatAreaText(scope.row.totalConstructionArea) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -124,16 +131,16 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-descriptions :column="1" border title="项目信息">
|
<el-descriptions :column="1" border title="项目信息">
|
||||||
<el-descriptions-item label="工程名称">
|
<el-descriptions-item label="项目名称">
|
||||||
{{ currentProject.projectName || '-' }}
|
{{ currentProject.projectName || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="项目经理">
|
<el-descriptions-item label="项目经理">
|
||||||
{{ currentProject.projectManagerName || '-' }}
|
{{ currentProject.projectManagerName || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="项目负责人">
|
<el-descriptions-item label="工程负责人">
|
||||||
{{ currentProject.engineeringPrincipalName || '-' }}
|
{{ currentProject.engineeringPrincipalName || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="合同金额(元)">
|
<el-descriptions-item label="合同产值(元)">
|
||||||
{{ formatAmountText(currentProject.contractAmount) }}
|
{{ formatAmountText(currentProject.contractAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="工程总面积(㎡)">
|
<el-descriptions-item label="工程总面积(㎡)">
|
||||||
@@ -153,7 +160,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<div class="rounded-8px bg-[var(--el-fill-color-light)] px-12px py-12px">
|
<div class="rounded-8px bg-[var(--el-fill-color-light)] px-12px py-12px">
|
||||||
<div class="text-12px text-[var(--el-text-color-secondary)]">规划金额合计</div>
|
<div class="text-12px text-[var(--el-text-color-secondary)]">分项合同产值合计</div>
|
||||||
<div class="mt-6px text-18px font-600">{{ formatAmountText(totalPlanningAmount) }}</div>
|
<div class="mt-6px text-18px font-600">{{ formatAmountText(totalPlanningAmount) }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -182,7 +189,8 @@
|
|||||||
<el-button v-if="currentProject" size="small" @click="getPlanningList">刷新</el-button>
|
<el-button v-if="currentProject" size="small" @click="getPlanningList">刷新</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table v-loading="planningLoading" :data="planningList" border>
|
<el-table v-loading="planningLoading" :data="planningList" border>
|
||||||
<el-table-column align="center" label="规划内容" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" width="100">
|
<el-table-column align="center" label="归属类型" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
||||||
@@ -194,7 +202,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="开始年度" width="100" prop="planningStartYear" />
|
<el-table-column align="center" label="开始年度" width="100" prop="planningStartYear" />
|
||||||
<el-table-column align="center" label="规划金额(元)" width="130">
|
<el-table-column align="center" label="分项合同产值(元)" width="130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.planningAmount) }}
|
{{ formatAmountText(scope.row.planningAmount) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -204,6 +212,7 @@
|
|||||||
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -270,6 +279,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -47,14 +47,21 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目ID" prop="id" width="88" />
|
<el-table-column
|
||||||
<el-table-column align="center" label="工程名称" min-width="220" prop="projectName" />
|
:index="getProjectRowIndex"
|
||||||
<el-table-column align="center" label="项目负责人" min-width="180">
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
|
<el-table-column align="center" label="项目名称" min-width="220" prop="projectName" />
|
||||||
|
<el-table-column align="center" label="工程负责人" min-width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getProjectLeadText(scope.row.projectManagerName, scope.row.engineeringPrincipalName) }}
|
{{ getProjectLeadText(scope.row.projectManagerName, scope.row.engineeringPrincipalName) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -77,7 +84,8 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="规划内容" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
||||||
@@ -89,6 +97,7 @@
|
|||||||
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -118,15 +127,15 @@
|
|||||||
@click="handleExportProjectLeadQuarter"
|
@click="handleExportProjectLeadQuarter"
|
||||||
>
|
>
|
||||||
<Icon class="mr-5px" icon="ep:download" />
|
<Icon class="mr-5px" icon="ep:download" />
|
||||||
导出项目负责人计取表
|
导出工程负责人计取表
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-descriptions :column="2" border title="基础信息">
|
<el-descriptions :column="2" border title="基础信息">
|
||||||
<el-descriptions-item label="项目名称">{{ formData.projectName || '-' }}</el-descriptions-item>
|
<el-descriptions-item label="项目名称">{{ formData.projectName || '-' }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="规划内容">{{ formData.planningContent || '-' }}</el-descriptions-item>
|
<el-descriptions-item label="项目任务包">{{ formData.planningContent || '-' }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="项目负责人">
|
<el-descriptions-item label="工程负责人">
|
||||||
{{ getProjectLeadText(formData.projectManagerName, formData.engineeringLeaderName) }}
|
{{ getProjectLeadText(formData.projectManagerName, formData.engineeringLeaderName) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="考核产值(元)">
|
<el-descriptions-item label="考核产值(元)">
|
||||||
@@ -269,7 +278,7 @@ interface QuarterYearRow {
|
|||||||
type ExportDialogType = 'projectQuarter' | 'projectLeadQuarter'
|
type ExportDialogType = 'projectQuarter' | 'projectLeadQuarter'
|
||||||
|
|
||||||
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
|
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
|
||||||
{ label: '项目经理/项目负责人', value: 'project_lead' },
|
{ label: '项目经理/工程负责人', value: 'project_lead' },
|
||||||
{ label: '建筑专业', value: 'arch' },
|
{ label: '建筑专业', value: 'arch' },
|
||||||
{ label: '装修专业', value: 'decor' },
|
{ label: '装修专业', value: 'decor' },
|
||||||
{ label: '结构专业', value: 'struct' },
|
{ label: '结构专业', value: 'struct' },
|
||||||
@@ -309,6 +318,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
@@ -317,7 +329,7 @@ const queryProjectStartYearValue = computed({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const exportDialogTitle = computed(() =>
|
const exportDialogTitle = computed(() =>
|
||||||
exportDialogType.value === 'projectQuarter' ? '导出专业间年度季度计取表' : '导出项目负责人计取表'
|
exportDialogType.value === 'projectQuarter' ? '导出专业间年度季度计取表' : '导出工程负责人计取表'
|
||||||
)
|
)
|
||||||
|
|
||||||
const currentExportLoading = computed(() =>
|
const currentExportLoading = computed(() =>
|
||||||
@@ -361,7 +373,7 @@ const buildProjectRows = (model?: OutputSplitApi.ProjectOutputSplitVO) => {
|
|||||||
}
|
}
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '项目经理/项目负责人',
|
label: '项目经理/工程负责人',
|
||||||
percentText: formatRatioText(model.projectLeadRatio),
|
percentText: formatRatioText(model.projectLeadRatio),
|
||||||
amount: model.projectLeadAmount
|
amount: model.projectLeadAmount
|
||||||
},
|
},
|
||||||
@@ -664,7 +676,7 @@ const submitProjectLeadQuarterExport = async () => {
|
|||||||
})
|
})
|
||||||
download.excel(
|
download.excel(
|
||||||
data,
|
data,
|
||||||
`${currentProject.value?.projectName || '项目'}_${exportYear.value}_项目负责人年度季度计取表.xlsx`
|
`${currentProject.value?.projectName || '项目'}_${exportYear.value}_工程负责人年度季度计取表.xlsx`
|
||||||
)
|
)
|
||||||
exportDialogVisible.value = false
|
exportDialogVisible.value = false
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -47,16 +47,23 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目ID" prop="id" width="88" />
|
<el-table-column
|
||||||
<el-table-column align="center" label="工程名称" min-width="220" prop="projectName" />
|
:index="getProjectRowIndex"
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
|
<el-table-column align="center" label="项目名称" min-width="220" prop="projectName" />
|
||||||
<el-table-column align="center" label="项目经理" min-width="120" prop="projectManagerName" />
|
<el-table-column align="center" label="项目经理" min-width="120" prop="projectManagerName" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="项目负责人"
|
label="工程负责人"
|
||||||
min-width="120"
|
min-width="120"
|
||||||
prop="engineeringPrincipalName"
|
prop="engineeringPrincipalName"
|
||||||
/>
|
/>
|
||||||
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -79,7 +86,8 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="规划内容" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
||||||
@@ -91,6 +99,7 @@
|
|||||||
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -246,6 +255,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
label-width="88px"
|
label-width="88px"
|
||||||
>
|
>
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="项目名称" prop="projectName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.projectName"
|
v-model="queryParams.projectName"
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入工程名称"
|
placeholder="请输入项目名称"
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -47,16 +47,23 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentProjectChange"
|
@current-change="handleCurrentProjectChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="项目ID" prop="id" width="88" />
|
<el-table-column
|
||||||
<el-table-column align="center" label="工程名称" min-width="220" prop="projectName" />
|
:index="getProjectRowIndex"
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
type="index"
|
||||||
|
width="80"
|
||||||
|
/>
|
||||||
|
<el-table-column align="center" label="项目名称" min-width="220" prop="projectName" />
|
||||||
<el-table-column align="center" label="项目经理" min-width="120" prop="projectManagerName" />
|
<el-table-column align="center" label="项目经理" min-width="120" prop="projectManagerName" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="项目负责人"
|
label="工程负责人"
|
||||||
min-width="120"
|
min-width="120"
|
||||||
prop="engineeringPrincipalName"
|
prop="engineeringPrincipalName"
|
||||||
/>
|
/>
|
||||||
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
<el-table-column align="center" label="开始年度" prop="projectStartYear" width="120" />
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -79,7 +86,8 @@
|
|||||||
highlight-current-row
|
highlight-current-row
|
||||||
@current-change="handleCurrentPlanningChange"
|
@current-change="handleCurrentPlanningChange"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="规划内容" min-width="180" prop="planningContent" />
|
<el-table-column align="center" label="序号" type="index" width="70" />
|
||||||
|
<el-table-column align="center" label="项目任务包" min-width="180" prop="planningContent" />
|
||||||
<el-table-column align="center" label="归属类型" min-width="110">
|
<el-table-column align="center" label="归属类型" min-width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
|
||||||
@@ -91,6 +99,7 @@
|
|||||||
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
{{ formatAmountText(scope.row.assessmentOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="排序" prop="sortNo" width="80" />
|
||||||
</el-table>
|
</el-table>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -225,7 +234,7 @@
|
|||||||
<div v-if="!scope.row.persons?.length" class="person-empty">
|
<div v-if="!scope.row.persons?.length" class="person-empty">
|
||||||
{{
|
{{
|
||||||
isProjectLeadRow(scope.row)
|
isProjectLeadRow(scope.row)
|
||||||
? '暂无人员,请先到页面1维护项目经理或项目负责人'
|
? '暂无人员,请先到页面1维护项目经理或工程负责人'
|
||||||
: '暂无人员,请点击“添加人员”'
|
: '暂无人员,请点击“添加人员”'
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
@@ -364,6 +373,9 @@ const queryParams = reactive<ProjectApi.ProjectPageReqVO>({
|
|||||||
projectStartYear: undefined
|
projectStartYear: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getProjectRowIndex = (index: number) =>
|
||||||
|
(queryParams.pageNo - 1) * queryParams.pageSize + index + 1
|
||||||
|
|
||||||
const queryProjectStartYearValue = computed({
|
const queryProjectStartYearValue = computed({
|
||||||
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
|
||||||
set: (value?: string) => {
|
set: (value?: string) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user