diff --git a/src/api/tjt/report/index.ts b/src/api/tjt/report/index.ts index 7e2a4d6..548bd1c 100644 --- a/src/api/tjt/report/index.ts +++ b/src/api/tjt/report/index.ts @@ -79,6 +79,59 @@ export interface ProjectBudgetExportReqVO { year?: number } +export interface ProjectBudgetPreviewRespVO { + year?: number + projectCode?: string + projectName?: string + remark?: string + budgetRows?: ProjectBudgetPreviewBudgetRow[] + quarterBudgetRows?: ProjectBudgetPreviewQuarterRow[] +} + +export interface ProjectBudgetPreviewBudgetRow { + rowType?: string + planningId?: number + planningContent?: string + displayDesignPart?: string + displayBuildingType?: string + internalGuidanceUnitPrice?: number + designArea?: number + buildingOrUnitCount?: number + drawingSetFactor?: number + scaleFactor?: number + modificationFactor?: number + complexityFactor?: number + subtotalArea?: number + currentDesignStageRatio?: number + assessmentOutputValueWan?: number +} + +export interface ProjectBudgetPreviewQuarterRow { + serialNo?: number + totalRow?: boolean + outputType?: string + designContent?: string + budgetYear?: number + totalDesignArea?: number + totalAssessmentArea?: number + totalAssessmentOutputWan?: number + designStageRatio?: number + designStageOutputWan?: number + historicalIssuedRatio?: number + quarterOneRatio?: number + quarterTwoRatio?: number + quarterThreeRatio?: number + quarterFourRatio?: number + currentYearRatio?: number + pendingRatio?: number + quarterOneAmountWan?: number + quarterTwoAmountWan?: number + quarterThreeAmountWan?: number + quarterFourAmountWan?: number + yearTotalAmountWan?: number + ratioRemark?: string +} + export interface ProjectQuarterOutputExportReqVO { planningId: number year?: number @@ -158,6 +211,13 @@ export const exportProjectBudget = (params: ProjectBudgetExportReqVO) => { return request.download({ url: '/tjt/report/project-budget/export-excel', params }) } +export const getProjectBudgetPreview = (params: ProjectBudgetExportReqVO) => { + return request.get({ + url: '/tjt/report/project-budget/preview', + params: { ...params, _t: Date.now() } + }) +} + export const exportProjectQuarterOutput = (params: ProjectQuarterOutputExportReqVO) => { return request.download({ url: '/tjt/report/project-quarter-output/export-excel', diff --git a/src/views/tjt/report-budget/index.vue b/src/views/tjt/report-budget/index.vue index e666098..300d943 100644 --- a/src/views/tjt/report-budget/index.vue +++ b/src/views/tjt/report-budget/index.vue @@ -161,7 +161,9 @@
分项合同产值合计
-
{{ formatAmountText(totalPlanningAmount) }}
+
{{ + formatAmountText(totalPlanningAmount) + }}
@@ -189,7 +191,12 @@ 刷新 - + + +
+
+
考核产值预算表预览
+
+ {{ budgetPreview?.projectName || currentProject.projectName }} +
+
+
+ 年度 + + 刷新 +
+
+ + + + + + +
+ @@ -261,12 +515,15 @@ const currentYear = new Date().getFullYear() const loading = ref(false) const planningLoading = ref(false) +const budgetPreviewLoading = ref(false) const exportLoading = ref(false) const exportDialogVisible = ref(false) +const previewYear = ref() const exportYear = ref() const total = ref(0) const projectList = ref([]) const planningList = ref([]) +const budgetPreview = ref() const currentProject = ref() const queryFormRef = ref() const projectTableRef = ref() @@ -280,7 +537,7 @@ const queryParams = reactive({ }) const getProjectRowIndex = (index: number) => - (queryParams.pageNo - 1) * queryParams.pageSize + index + 1 + ((queryParams.pageNo || 1) - 1) * (queryParams.pageSize || 10) + index + 1 const queryProjectStartYearValue = computed({ get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined), @@ -296,6 +553,13 @@ const exportYearValue = computed({ } }) +const previewYearValue = computed({ + get: () => (previewYear.value ? String(previewYear.value) : undefined), + set: (value?: string) => { + previewYear.value = value ? Number(value) : undefined + } +}) + const totalPlanningAmount = computed(() => planningList.value.reduce((sum, item) => sum + Number(item.planningAmount || 0), 0) ) @@ -303,6 +567,48 @@ const totalAssessmentOutputValue = computed(() => planningList.value.reduce((sum, item) => sum + Number(item.assessmentOutputValue || 0), 0) ) +const budgetPreviewEmptyText = computed(() => + previewYear.value ? '暂无预算表数据' : '请先选择年度' +) + +const formatNullableAmount = (value?: number | string | null) => { + if (value === undefined || value === null || value === '') { + return '' + } + return formatAmountText(value) +} + +const formatFactor = (value?: number | string | null) => { + if (value === undefined || value === null || value === '') { + return '' + } + const numericValue = Number(value) + if (Number.isNaN(numericValue)) { + return '' + } + return numericValue.toFixed(2) +} + +const formatNullablePercent = (value?: number | string | null) => { + if (value === undefined || value === null || value === '') { + return '' + } + const numericValue = Number(value) + if (Number.isNaN(numericValue)) { + return '' + } + return `${(numericValue * 100).toFixed(2)}%` +} + +const getBudgetPreviewRowClassName = ({ row }: { row: ReportApi.ProjectBudgetPreviewBudgetRow }) => + row?.rowType === 'PART_SUBTOTAL' || row?.rowType === 'PLANNING_TOTAL' ? 'budget-total-row' : '' + +const getQuarterPreviewRowClassName = ({ + row +}: { + row: ReportApi.ProjectBudgetPreviewQuarterRow +}) => (row?.totalRow ? 'budget-total-row' : '') + const getProjectList = async () => { loading.value = true try { @@ -312,6 +618,7 @@ const getProjectList = async () => { if (!projectList.value.length) { currentProject.value = undefined planningList.value = [] + budgetPreview.value = undefined return } const targetProjectId = currentProject.value?.id || projectList.value[0].id @@ -331,12 +638,30 @@ const getPlanningList = async () => { } planningLoading.value = true try { - planningList.value = await PlanningApi.getProjectPlanningListByProjectId(currentProject.value.id) + planningList.value = await PlanningApi.getProjectPlanningListByProjectId( + currentProject.value.id + ) } finally { planningLoading.value = false } } +const getProjectBudgetPreview = async () => { + if (!currentProject.value?.id || !previewYear.value) { + budgetPreview.value = undefined + return + } + budgetPreviewLoading.value = true + try { + budgetPreview.value = await ReportApi.getProjectBudgetPreview({ + projectId: currentProject.value.id, + year: previewYear.value + }) + } finally { + budgetPreviewLoading.value = false + } +} + const handleQuery = () => { queryParams.pageNo = 1 getProjectList() @@ -349,7 +674,8 @@ const resetQuery = () => { const handleCurrentProjectChange = async (row?: ProjectApi.ProjectVO) => { currentProject.value = row || undefined - await getPlanningList() + previewYear.value = row?.projectStartYear || currentYear + await Promise.all([getPlanningList(), getProjectBudgetPreview()]) } const handleExportProjectBudget = async () => { @@ -377,7 +703,10 @@ const submitProjectBudgetExport = async () => { projectId: currentProject.value.id, year: exportYear.value }) - download.excel(data, `${currentProject.value.projectName}_${exportYear.value}_项目考核产值预算表.xlsx`) + download.excel( + data, + `${currentProject.value.projectName}_${exportYear.value}_项目考核产值预算表.xlsx` + ) exportDialogVisible.value = false } finally { exportLoading.value = false @@ -399,3 +728,14 @@ onActivated(() => { getProjectList() }) + +