Compare commits

..

1 Commits

10 changed files with 124 additions and 103 deletions

View File

@@ -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

View File

@@ -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,30 +300,36 @@
</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-select v-model="row.designPart" class="!w-1/1" placeholder="请选择"> <el-tooltip
<el-option :content="row.designPart"
v-for="item in DESIGN_PART_OPTIONS" :disabled="!hasValue(row.designPart)"
:key="String(item.value)" placement="top"
:label="item.label" >
:value="item.value" <el-select v-model="row.designPart" class="!w-1/1" placeholder="请选择">
/> <el-option
</el-select> v-for="item in DESIGN_PART_OPTIONS"
:key="String(item.value)"
:label="item.label"
:value="item.value"
/>
</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,55 +363,60 @@
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="楼栋/户型数" min-width="100">
<template #default="{ row }">
<el-input-number
v-model="row.buildingOrUnitCount"
:min="0"
:precision="0"
:controls="false"
class="!w-1/1"
/>
</template>
</el-table-column>
<!-- 3. 多级表头折叠系数配置 --> <!-- 3. 多级表头折叠系数配置 -->
<el-table-column label="调整系数配置" align="center"> <el-table-column label="调整系数配置" align="center">
<el-table-column align="center" label="套图" min-width="85"> <el-table-column align="center" label="楼栋/户型数" min-width="110">
<template #default="{ row }">
<el-input-number
v-model="row.buildingOrUnitCount"
:min="0"
:precision="0"
:controls="false"
class="!w-1/1"
/>
</template>
</el-table-column>
<el-table-column align="center" label="套图系数" min-width="100">
<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
} }
} }

View File

@@ -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>

View File

@@ -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"

View File

@@ -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()

View File

@@ -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: [

View File

@@ -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, [
'建筑工程', '建筑工程',
'精装工程', '精装工程',

View File

@@ -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="开始年度">

View File

@@ -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">
{{ {{

View File

@@ -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