Compare commits
1 Commits
5cb913cb0a
...
master-lzm
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a0ff37963 |
@@ -10,6 +10,8 @@ export interface ProjectProfitVO {
|
|||||||
effectiveSettlementAmount?: number
|
effectiveSettlementAmount?: number
|
||||||
comprehensivePlanningAmount?: number
|
comprehensivePlanningAmount?: number
|
||||||
subcontractPlanningAmount?: number
|
subcontractPlanningAmount?: number
|
||||||
|
specialSubcontractPlanningAmount?: number
|
||||||
|
sourceCoopSubcontractPlanningAmount?: number
|
||||||
majorOutputValue?: number
|
majorOutputValue?: number
|
||||||
majorExpectedPerformance?: number
|
majorExpectedPerformance?: number
|
||||||
innovationOutputRate?: number
|
innovationOutputRate?: number
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="工程总面积(m²)" prop="planningArea">
|
<el-form-item label="建筑面积(m²)" prop="planningArea">
|
||||||
<el-input
|
<el-input
|
||||||
v-if="showGuideDetailSection"
|
v-if="showGuideDetailSection"
|
||||||
:model-value="formatAmountText(guideDetailSummary.designArea)"
|
:model-value="formatAmountText(guideDetailSummary.designArea)"
|
||||||
@@ -300,6 +300,11 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="设计部位" min-width="120" fixed="left">
|
<el-table-column align="center" label="设计部位" min-width="120" fixed="left">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
|
<el-tooltip
|
||||||
|
:content="row.designPart"
|
||||||
|
:disabled="!hasValue(row.designPart)"
|
||||||
|
placement="top"
|
||||||
|
>
|
||||||
<el-select v-model="row.designPart" class="!w-1/1" placeholder="请选择">
|
<el-select v-model="row.designPart" class="!w-1/1" placeholder="请选择">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in DESIGN_PART_OPTIONS"
|
v-for="item in DESIGN_PART_OPTIONS"
|
||||||
@@ -308,22 +313,23 @@
|
|||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="建筑类型" min-width="140" fixed="left">
|
<el-table-column align="center" label="设计内容/设计类型" min-width="210" fixed="left">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
:content="row.buildingType"
|
:content="row.buildingType"
|
||||||
:disabled="!hasValue(row.buildingType)"
|
:disabled="!hasValue(row.buildingType)"
|
||||||
placement="top"
|
placement="top"
|
||||||
>
|
>
|
||||||
<el-input v-model="row.buildingType" maxlength="100" placeholder="建筑类型" />
|
<el-input v-model="row.buildingType" maxlength="100" placeholder="请输入设计内容/设计类型" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<!-- 2. 取消 controls 的核心数值列 -->
|
<!-- 2. 取消 controls 的核心数值列 -->
|
||||||
<el-table-column align="center" label="指导单价(元)" min-width="110">
|
<el-table-column align="center" label="内部指导单价(元/m²)" min-width="150">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
:content="formatAmountText(row.internalGuidanceUnitPrice)"
|
:content="formatAmountText(row.internalGuidanceUnitPrice)"
|
||||||
@@ -357,7 +363,9 @@
|
|||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="楼栋/户型数" min-width="100">
|
<!-- 3. 多级表头折叠系数配置 -->
|
||||||
|
<el-table-column label="调整系数配置" align="center">
|
||||||
|
<el-table-column align="center" label="楼栋/户型数" min-width="110">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="row.buildingOrUnitCount"
|
v-model="row.buildingOrUnitCount"
|
||||||
@@ -368,44 +376,47 @@
|
|||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="套图系数" min-width="100">
|
||||||
<!-- 3. 多级表头折叠系数配置 -->
|
|
||||||
<el-table-column label="调整系数配置" align="center">
|
|
||||||
<el-table-column align="center" label="套图" min-width="85">
|
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number v-model="row.drawingSetFactor" :min="0" :precision="2" :controls="false" class="!w-1/1" />
|
<el-input-number v-model="row.drawingSetFactor" :min="0" :precision="2" :controls="false" class="!w-1/1" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="规模" min-width="85">
|
<el-table-column align="center" label="规模系数" min-width="100">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number v-model="row.scaleFactor" :min="0" :precision="2" :controls="false" class="!w-1/1" />
|
<el-input-number v-model="row.scaleFactor" :min="0" :precision="2" :controls="false" class="!w-1/1" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="修改" min-width="85">
|
<el-table-column align="center" label="修改系数" min-width="100">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number v-model="row.modificationFactor" :min="0" :precision="2" :controls="false" class="!w-1/1" />
|
<el-input-number v-model="row.modificationFactor" :min="0" :precision="2" :controls="false" class="!w-1/1" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="复杂(%)" min-width="90">
|
<el-table-column align="center" label="复杂系数/复杂等级" min-width="150">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
:model-value="toPercentValue(row.complexityFactor)"
|
v-model="row.complexityFactor"
|
||||||
:min="0"
|
:min="0"
|
||||||
:precision="2"
|
:precision="2"
|
||||||
:controls="false"
|
:controls="false"
|
||||||
class="!w-1/1"
|
class="!w-1/1"
|
||||||
@update:model-value="setGuideDetailPercentValue(row, 'complexityFactor', $event)"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="合计" min-width="80">
|
<el-table-column align="center" label="小计" min-width="80">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<span class="text-gray-500">{{ formatFactorText(getGuideDetailTotalAdjustmentFactor(row)) }}</span>
|
<span class="text-gray-500">{{ formatFactorText(getGuideDetailTotalAdjustmentFactor(row)) }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column align="center" label="设计占比(%)" min-width="100">
|
<!-- 4. 结果列靠右显示,用浅色背景区分 -->
|
||||||
|
<el-table-column align="right" label="考核产值面积小计(m²)" min-width="150" class-name="bg-gray-50">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<span class="font-bold">{{ formatAmountText(getGuideDetailAssessmentArea(row)) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column align="center" label="设计阶段占比(%)" min-width="120">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
:model-value="toPercentValue(row.designRatio)"
|
:model-value="toPercentValue(row.designRatio)"
|
||||||
@@ -418,13 +429,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<!-- 4. 结果列靠右显示,用浅色背景区分 -->
|
<el-table-column align="right" label="考核产值小计(元)" min-width="130" class-name="bg-gray-50">
|
||||||
<el-table-column align="right" label="考核面积(m²)" min-width="110" class-name="bg-gray-50">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<span class="font-bold">{{ formatAmountText(getGuideDetailAssessmentArea(row)) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column align="right" label="考核产值(元)" min-width="120" class-name="bg-gray-50">
|
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<span class="font-bold text-primary">{{ formatAmountText(getGuideDetailAssessmentOutputValue(row)) }}</span>
|
<span class="font-bold text-primary">{{ formatAmountText(getGuideDetailAssessmentOutputValue(row)) }}</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -469,17 +474,17 @@
|
|||||||
|
|
||||||
<el-row :gutter="16" class="mt-16px">
|
<el-row :gutter="16" class="mt-16px">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="汇总设计面积(m²)">
|
<el-form-item label="设计面积总计(m²)">
|
||||||
<el-input :model-value="formatAmountText(guideDetailSummary.designArea)" disabled />
|
<el-input :model-value="formatAmountText(guideDetailSummary.designArea)" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="汇总考核面积(m²)">
|
<el-form-item label="考核产值面积总计(m²)">
|
||||||
<el-input :model-value="formatAmountText(guideDetailSummary.assessmentArea)" disabled />
|
<el-input :model-value="formatAmountText(guideDetailSummary.assessmentArea)" disabled />
|
||||||
</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
|
<el-input
|
||||||
:model-value="formatAmountText(guideDetailSummary.assessmentOutputValue)"
|
:model-value="formatAmountText(guideDetailSummary.assessmentOutputValue)"
|
||||||
disabled
|
disabled
|
||||||
@@ -578,7 +583,7 @@
|
|||||||
<el-descriptions-item label="设计部位">
|
<el-descriptions-item label="设计部位">
|
||||||
{{ activeRemarkRow.designPart || '-' }}
|
{{ activeRemarkRow.designPart || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="建筑类型">
|
<el-descriptions-item label="设计内容/设计类型">
|
||||||
{{ activeRemarkRow.buildingType || '-' }}
|
{{ activeRemarkRow.buildingType || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="考核产值(元)">
|
<el-descriptions-item label="考核产值(元)">
|
||||||
@@ -934,7 +939,7 @@ const formatQuantityText = (value?: number, digits = 4) => {
|
|||||||
|
|
||||||
const setGuideDetailPercentValue = (
|
const setGuideDetailPercentValue = (
|
||||||
row: GuideDetailRow,
|
row: GuideDetailRow,
|
||||||
field: 'complexityFactor' | 'designRatio',
|
field: 'designRatio',
|
||||||
value?: number | string | null
|
value?: number | string | null
|
||||||
) => {
|
) => {
|
||||||
row[field] = fromPercentValue(value, 4)
|
row[field] = fromPercentValue(value, 4)
|
||||||
@@ -953,7 +958,7 @@ const formRules = reactive<FormRules>({
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!hasValue(value)) {
|
if (!hasValue(value)) {
|
||||||
callback(new Error('工程总面积不能为空'))
|
callback(new Error('建筑面积不能为空'))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
callback()
|
callback()
|
||||||
@@ -1153,7 +1158,7 @@ const validateGuideDetails = () => {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (!row.buildingType) {
|
if (!row.buildingType) {
|
||||||
message.warning(`${rowText}建筑类型不能为空`)
|
message.warning(`${rowText}设计内容/设计类型不能为空`)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (!hasValue(row.designArea)) {
|
if (!hasValue(row.designArea)) {
|
||||||
@@ -1177,11 +1182,11 @@ const validateGuideDetails = () => {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (!hasValue(row.complexityFactor)) {
|
if (!hasValue(row.complexityFactor)) {
|
||||||
message.warning(`${rowText}复杂系数不能为空`)
|
message.warning(`${rowText}复杂系数/复杂等级不能为空`)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (!hasValue(row.designRatio)) {
|
if (!hasValue(row.designRatio)) {
|
||||||
message.warning(`${rowText}设计占比不能为空`)
|
message.warning(`${rowText}设计阶段占比不能为空`)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,12 +84,12 @@
|
|||||||
</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>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="工程总面积(㎡)" width="140">
|
<el-table-column align="center" label="建筑面积(㎡)" width="140">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAreaText(scope.row.totalConstructionArea) }}
|
{{ formatAreaText(scope.row.totalConstructionArea) }}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -78,21 +78,21 @@
|
|||||||
</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>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="最终结算金额(元)" width="140">
|
<el-table-column align="center" label="结算合同总产值(元)" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.finalSettlementAmount) }}
|
{{ formatAmountText(scope.row.finalSettlementAmount) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="测算采用金额(元)" width="140">
|
<el-table-column align="center" label="项目预算产值总计(元)" width="160">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
v-if="isUsingContractAmount(scope.row)"
|
v-if="isUsingContractAmount(scope.row)"
|
||||||
content="最终结算金额未填写,当前暂按合同产值测算"
|
content="结算合同总产值未填写,当前暂按合同总产值测算"
|
||||||
placement="top"
|
placement="top"
|
||||||
>
|
>
|
||||||
<span>{{ formatAmountText(scope.row.effectiveSettlementAmount) }}</span>
|
<span>{{ formatAmountText(scope.row.effectiveSettlementAmount) }}</span>
|
||||||
@@ -100,22 +100,27 @@
|
|||||||
<span v-else>{{ formatAmountText(scope.row.effectiveSettlementAmount) }}</span>
|
<span v-else>{{ formatAmountText(scope.row.effectiveSettlementAmount) }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="综合所协作金额(元)" width="150">
|
<el-table-column align="center" label="综合所人工成本(元)" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.comprehensivePlanningAmount) }}
|
{{ formatAmountText(scope.row.comprehensivePlanningAmount) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="专业分包金额(元)" width="150">
|
<el-table-column align="center" label="专项分包人工成本(元)" width="170">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.subcontractPlanningAmount) }}
|
{{ formatAmountText(scope.row.specialSubcontractPlanningAmount) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="专业所产值(元)" width="130">
|
<el-table-column align="center" label="源头合作分包人工成本(元)" width="200">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ formatAmountText(scope.row.sourceCoopSubcontractPlanningAmount) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="专业所考核产值(元)" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.majorOutputValue) }}
|
{{ formatAmountText(scope.row.majorOutputValue) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="专业所预计绩效(元)" width="150">
|
<el-table-column align="center" label="专业所人工成本(元)" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAmountText(scope.row.majorExpectedPerformance) }}
|
{{ formatAmountText(scope.row.majorExpectedPerformance) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -135,14 +140,14 @@
|
|||||||
{{ formatAmountText(scope.row.otherCost) }}
|
{{ formatAmountText(scope.row.otherCost) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="盈亏值(元)" width="120">
|
<el-table-column align="center" label="预算盈亏值(元)" width="130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span :class="profitLossClass(scope.row.profitLossValue)">
|
<span :class="profitLossClass(scope.row.profitLossValue)">
|
||||||
{{ formatAmountText(scope.row.profitLossValue) }}
|
{{ formatAmountText(scope.row.profitLossValue) }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="盈亏百分比" width="120">
|
<el-table-column align="center" label="预算盈亏百分比" width="140">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span :class="profitLossClass(scope.row.profitLossValue)">
|
<span :class="profitLossClass(scope.row.profitLossValue)">
|
||||||
{{ formatPercentText(scope.row.profitLossRate) }}
|
{{ formatPercentText(scope.row.profitLossRate) }}
|
||||||
@@ -166,21 +171,21 @@
|
|||||||
<div class="text-16px font-600">{{ currentProfit.projectName }}</div>
|
<div class="text-16px font-600">{{ currentProfit.projectName }}</div>
|
||||||
<el-button plain type="primary" @click="openProfitEditDialog">
|
<el-button plain type="primary" @click="openProfitEditDialog">
|
||||||
<Icon class="mr-5px" icon="ep:edit" />
|
<Icon class="mr-5px" icon="ep:edit" />
|
||||||
编辑盈亏参数
|
编辑项目成本参数
|
||||||
</el-button>
|
</el-button>
|
||||||
</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="结算合同总产值(元)">
|
||||||
{{ formatAmountText(currentProfit.finalSettlementAmount) }}
|
{{ formatAmountText(currentProfit.finalSettlementAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="测算采用金额(元)">
|
<el-descriptions-item label="项目预算产值总计(元)">
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
v-if="isUsingContractAmount(currentProfit)"
|
v-if="isUsingContractAmount(currentProfit)"
|
||||||
content="最终结算金额未填写,当前暂按合同产值测算"
|
content="结算合同总产值未填写,当前暂按合同总产值测算"
|
||||||
placement="top"
|
placement="top"
|
||||||
>
|
>
|
||||||
<span>{{ formatAmountText(currentProfit.effectiveSettlementAmount) }}</span>
|
<span>{{ formatAmountText(currentProfit.effectiveSettlementAmount) }}</span>
|
||||||
@@ -190,16 +195,19 @@
|
|||||||
<el-descriptions-item label="项目开始年度">
|
<el-descriptions-item label="项目开始年度">
|
||||||
{{ currentProfit.projectStartYear || '-' }}
|
{{ currentProfit.projectStartYear || '-' }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="综合所协作金额(元)">
|
<el-descriptions-item label="综合所人工成本(元)">
|
||||||
{{ formatAmountText(currentProfit.comprehensivePlanningAmount) }}
|
{{ formatAmountText(currentProfit.comprehensivePlanningAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="专业分包金额(元)">
|
<el-descriptions-item label="专项分包人工成本(元)">
|
||||||
{{ formatAmountText(currentProfit.subcontractPlanningAmount) }}
|
{{ formatAmountText(currentProfit.specialSubcontractPlanningAmount) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="专业所产值(元)">
|
<el-descriptions-item label="源头合作分包人工成本(元)">
|
||||||
|
{{ formatAmountText(currentProfit.sourceCoopSubcontractPlanningAmount) }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="专业所考核产值(元)">
|
||||||
{{ formatAmountText(currentProfit.majorOutputValue) }}
|
{{ formatAmountText(currentProfit.majorOutputValue) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="专业所预计绩效(元)">
|
<el-descriptions-item label="专业所人工成本(元)">
|
||||||
{{ formatAmountText(currentProfit.majorExpectedPerformance) }}
|
{{ formatAmountText(currentProfit.majorExpectedPerformance) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="科创产值比例">
|
<el-descriptions-item label="科创产值比例">
|
||||||
@@ -211,12 +219,12 @@
|
|||||||
<el-descriptions-item label="其他成本(元)">
|
<el-descriptions-item label="其他成本(元)">
|
||||||
{{ formatAmountText(currentProfit.otherCost) }}
|
{{ formatAmountText(currentProfit.otherCost) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="盈亏值(元)">
|
<el-descriptions-item label="预算盈亏值(元)">
|
||||||
<span :class="profitLossClass(currentProfit.profitLossValue)">
|
<span :class="profitLossClass(currentProfit.profitLossValue)">
|
||||||
{{ formatAmountText(currentProfit.profitLossValue) }}
|
{{ formatAmountText(currentProfit.profitLossValue) }}
|
||||||
</span>
|
</span>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="盈亏百分比">
|
<el-descriptions-item label="预算盈亏百分比">
|
||||||
<span :class="profitLossClass(currentProfit.profitLossValue)">
|
<span :class="profitLossClass(currentProfit.profitLossValue)">
|
||||||
{{ formatPercentText(currentProfit.profitLossRate) }}
|
{{ formatPercentText(currentProfit.profitLossRate) }}
|
||||||
</span>
|
</span>
|
||||||
@@ -224,13 +232,13 @@
|
|||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-empty v-else-if="!detailLoading" description="请选择项目后查看盈亏详情" />
|
<el-empty v-else-if="!detailLoading" description="请选择项目后查看项目成本详情" />
|
||||||
</div>
|
</div>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<Dialog v-model="dialogVisible" title="编辑盈亏参数" width="520">
|
<Dialog v-model="dialogVisible" title="编辑项目成本参数" width="520">
|
||||||
<el-form ref="formRef" v-loading="dialogLoading" :model="formData" label-width="140px">
|
<el-form ref="formRef" v-loading="dialogLoading" :model="formData" label-width="140px">
|
||||||
<el-form-item label="最终结算金额(元)" prop="finalSettlementAmount">
|
<el-form-item label="结算合同总产值(元)" prop="finalSettlementAmount">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="formData.finalSettlementAmount"
|
v-model="formData.finalSettlementAmount"
|
||||||
:min="0"
|
:min="0"
|
||||||
|
|||||||
@@ -158,11 +158,7 @@ import { OWNERSHIP_TYPE_OPTIONS } from '@/views/tjt/shared/planning'
|
|||||||
|
|
||||||
defineOptions({ name: 'TjtPlanningForm' })
|
defineOptions({ name: 'TjtPlanningForm' })
|
||||||
|
|
||||||
const OWNERSHIP_TYPE_LABELS = ['专业所', '综合所', '专业分包']
|
const ownershipTypeOptions = OWNERSHIP_TYPE_OPTIONS
|
||||||
const ownershipTypeOptions = OWNERSHIP_TYPE_OPTIONS.map((item, index) => ({
|
|
||||||
label: OWNERSHIP_TYPE_LABELS[index] || item.label,
|
|
||||||
value: item.value
|
|
||||||
}))
|
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="工程总面积(㎡)" prop="totalConstructionArea">
|
<el-form-item label="建筑面积(㎡)" prop="totalConstructionArea">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="formData.totalConstructionArea"
|
v-model="formData.totalConstructionArea"
|
||||||
:min="0"
|
:min="0"
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="工程类别" prop="projectCategory">
|
<el-form-item label="设计类型" prop="projectCategory">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="formData.projectCategory"
|
v-model="formData.projectCategory"
|
||||||
class="!w-1/1"
|
class="!w-1/1"
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="合同产值(元)" prop="contractAmount">
|
<el-form-item label="合同总产值(元)" prop="contractAmount">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="formData.contractAmount"
|
v-model="formData.contractAmount"
|
||||||
:min="0"
|
:min="0"
|
||||||
@@ -459,8 +459,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' }],
|
||||||
pauseReason: [
|
pauseReason: [
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
<el-descriptions-item label="工程类型">
|
<el-descriptions-item label="工程类型">
|
||||||
{{ getProjectTypeText(currentProject.projectType) }}
|
{{ getProjectTypeText(currentProject.projectType) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="工程类别">
|
<el-descriptions-item label="设计类型">
|
||||||
{{ getProjectCategoryText(currentProject.projectCategory) }}
|
{{ getProjectCategoryText(currentProject.projectCategory) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="合同签订日期">
|
<el-descriptions-item label="合同签订日期">
|
||||||
@@ -218,10 +218,10 @@
|
|||||||
>
|
>
|
||||||
{{ 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²)">
|
||||||
{{ formatAreaText(currentProject.totalConstructionArea) }}
|
{{ formatAreaText(currentProject.totalConstructionArea) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
@@ -353,7 +353,7 @@ const cleanOptionLabels = <T,>(options: Array<{ label: string; value: T }>, labe
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
const contractSignOptions = cleanOptionLabels(CONTRACT_SIGN_OPTIONS, ['已签约', '未签约'])
|
const contractSignOptions = cleanOptionLabels(CONTRACT_SIGN_OPTIONS, ['已签约', '未签约'])
|
||||||
const ownershipTypeOptions = cleanOptionLabels(OWNERSHIP_TYPE_OPTIONS, ['专业所', '综合所', '专业分包'])
|
const ownershipTypeOptions = OWNERSHIP_TYPE_OPTIONS
|
||||||
const projectTypeOptions = cleanOptionLabels(PROJECT_TYPE_OPTIONS, [
|
const projectTypeOptions = cleanOptionLabels(PROJECT_TYPE_OPTIONS, [
|
||||||
'建筑工程',
|
'建筑工程',
|
||||||
'精装工程',
|
'精装工程',
|
||||||
|
|||||||
@@ -91,12 +91,12 @@
|
|||||||
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>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="工程总面积(㎡)" width="140">
|
<el-table-column align="center" label="建筑面积(㎡)" width="140">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatAreaText(scope.row.totalConstructionArea) }}
|
{{ formatAreaText(scope.row.totalConstructionArea) }}
|
||||||
</template>
|
</template>
|
||||||
@@ -140,10 +140,10 @@
|
|||||||
<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="建筑面积(㎡)">
|
||||||
{{ formatAreaText(currentProject.totalConstructionArea) }}
|
{{ formatAreaText(currentProject.totalConstructionArea) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="开始年度">
|
<el-descriptions-item label="开始年度">
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="text-16px font-600">{{ currentPlanning.planningContent }}</div>
|
<div class="text-16px font-600">{{ currentPlanning.planningContent }}</div>
|
||||||
<div class="mt-6px text-12px text-[var(--el-text-color-secondary)]">
|
<div class="mt-6px text-12px text-[var(--el-text-color-secondary)]">
|
||||||
按当前年度和专业预览专业内人员计取结果
|
按当前合约规划、年度和专业预览专业内人员计取结果
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-10px">
|
<div class="flex items-center gap-10px">
|
||||||
@@ -160,10 +160,9 @@
|
|||||||
<div class="text-12px text-[var(--el-text-color-secondary)]">季度金额单位:万元</div>
|
<div class="text-12px text-[var(--el-text-color-secondary)]">季度金额单位:万元</div>
|
||||||
</div>
|
</div>
|
||||||
<el-table
|
<el-table
|
||||||
v-loading="previewLoading"
|
|
||||||
:data="currentGroupDisplayRows"
|
:data="currentGroupDisplayRows"
|
||||||
border
|
border
|
||||||
empty-text="当前年度暂无可预览的专业人员计取数据"
|
empty-text="当前年度暂无可预览的专业人员考核产值计取数据"
|
||||||
:span-method="spanRoleColumns"
|
:span-method="spanRoleColumns"
|
||||||
>
|
>
|
||||||
<el-table-column align="center" label="角色" min-width="110" prop="roleName" />
|
<el-table-column align="center" label="角色" min-width="110" prop="roleName" />
|
||||||
@@ -205,7 +204,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="季度计取明细(年度预览:比例 / 金额 万元)">
|
<el-table-column align="center" label="季度计取明细(合约规划年度预览:比例 / 金额 万元)">
|
||||||
<el-table-column align="center" label="一季度" min-width="150">
|
<el-table-column align="center" label="一季度" min-width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{
|
{{
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ export type Option<T = string> = {
|
|||||||
export const OWNERSHIP_TYPE = {
|
export const OWNERSHIP_TYPE = {
|
||||||
major: '专业所',
|
major: '专业所',
|
||||||
comprehensive: '综合所',
|
comprehensive: '综合所',
|
||||||
subcontract: '专业分包'
|
specialSubcontract: '专项分包',
|
||||||
|
sourceCoopSubcontract: '源头合作分包'
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
export const CALCULATION_METHOD = {
|
export const CALCULATION_METHOD = {
|
||||||
@@ -29,7 +30,8 @@ export const DESIGN_STAGE = {
|
|||||||
|
|
||||||
export const DESIGN_PART = {
|
export const DESIGN_PART = {
|
||||||
realEstate: '地上部分',
|
realEstate: '地上部分',
|
||||||
underground: '地下部分'
|
underground: '地下部分',
|
||||||
|
other: '其他'
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
export const PROJECT_TYPE = {
|
export const PROJECT_TYPE = {
|
||||||
@@ -100,7 +102,11 @@ export const normalizeProjectStatus = (value?: string) =>
|
|||||||
export const OWNERSHIP_TYPE_OPTIONS: Option[] = [
|
export const OWNERSHIP_TYPE_OPTIONS: Option[] = [
|
||||||
{ label: OWNERSHIP_TYPE.major, value: OWNERSHIP_TYPE.major },
|
{ label: OWNERSHIP_TYPE.major, value: OWNERSHIP_TYPE.major },
|
||||||
{ label: OWNERSHIP_TYPE.comprehensive, value: OWNERSHIP_TYPE.comprehensive },
|
{ label: OWNERSHIP_TYPE.comprehensive, value: OWNERSHIP_TYPE.comprehensive },
|
||||||
{ label: OWNERSHIP_TYPE.subcontract, value: OWNERSHIP_TYPE.subcontract }
|
{ label: OWNERSHIP_TYPE.specialSubcontract, value: OWNERSHIP_TYPE.specialSubcontract },
|
||||||
|
{
|
||||||
|
label: OWNERSHIP_TYPE.sourceCoopSubcontract,
|
||||||
|
value: OWNERSHIP_TYPE.sourceCoopSubcontract
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
export const CALCULATION_METHOD_OPTIONS: Option[] = [
|
export const CALCULATION_METHOD_OPTIONS: Option[] = [
|
||||||
@@ -132,7 +138,8 @@ export const DESIGN_STAGE_OPTIONS: Option[] = [
|
|||||||
|
|
||||||
export const DESIGN_PART_OPTIONS: Option[] = [
|
export const DESIGN_PART_OPTIONS: Option[] = [
|
||||||
{ label: DESIGN_PART.realEstate, value: DESIGN_PART.realEstate },
|
{ label: DESIGN_PART.realEstate, value: DESIGN_PART.realEstate },
|
||||||
{ label: DESIGN_PART.underground, value: DESIGN_PART.underground }
|
{ label: DESIGN_PART.underground, value: DESIGN_PART.underground },
|
||||||
|
{ label: DESIGN_PART.other, value: DESIGN_PART.other }
|
||||||
]
|
]
|
||||||
|
|
||||||
export const CONTRACT_SIGN_OPTIONS: Option<boolean>[] = [
|
export const CONTRACT_SIGN_OPTIONS: Option<boolean>[] = [
|
||||||
@@ -221,8 +228,12 @@ export const isMajorOwnership = (value?: string) =>
|
|||||||
normalizeOwnershipType(value) === OWNERSHIP_TYPE.major
|
normalizeOwnershipType(value) === OWNERSHIP_TYPE.major
|
||||||
export const isComprehensiveOwnership = (value?: string) =>
|
export const isComprehensiveOwnership = (value?: string) =>
|
||||||
normalizeOwnershipType(value) === OWNERSHIP_TYPE.comprehensive
|
normalizeOwnershipType(value) === OWNERSHIP_TYPE.comprehensive
|
||||||
|
export const isSpecialSubcontractOwnership = (value?: string) =>
|
||||||
|
normalizeOwnershipType(value) === OWNERSHIP_TYPE.specialSubcontract
|
||||||
|
export const isSourceCoopSubcontractOwnership = (value?: string) =>
|
||||||
|
normalizeOwnershipType(value) === OWNERSHIP_TYPE.sourceCoopSubcontract
|
||||||
export const isSubcontractOwnership = (value?: string) =>
|
export const isSubcontractOwnership = (value?: string) =>
|
||||||
normalizeOwnershipType(value) === OWNERSHIP_TYPE.subcontract
|
isSpecialSubcontractOwnership(value) || isSourceCoopSubcontractOwnership(value)
|
||||||
|
|
||||||
export const isGuidancePriceMethod = (value?: string) =>
|
export const isGuidancePriceMethod = (value?: string) =>
|
||||||
normalizeCalculationMethod(value) === CALCULATION_METHOD.guidancePrice
|
normalizeCalculationMethod(value) === CALCULATION_METHOD.guidancePrice
|
||||||
|
|||||||
Reference in New Issue
Block a user