From 92c5071fab75fdcbc20cf3252ce8c6e70470fb14 Mon Sep 17 00:00:00 2001
From: lzm <2316711944@qq.com>
Date: Fri, 8 May 2026 17:38:50 +0800
Subject: [PATCH] =?UTF-8?q?0509=E6=96=B0=E5=8A=9F=E8=83=BD=E4=BC=98?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env | 2 +-
index.html | 4 +-
src/api/tjt/planning/index.ts | 9 +
src/api/tjt/profit/index.ts | 1 +
src/api/tjt/project/index.ts | 1 +
src/locales/zh-CN.ts | 4 +-
src/views/tjt/output-split/index.vue | 32 +-
src/views/tjt/output/PlanningOutputForm.vue | 65 ++-
.../tjt/output/QuarterDistributionForm.vue | 8 +-
src/views/tjt/output/index.vue | 30 +-
src/views/tjt/profit/index.vue | 21 +-
src/views/tjt/project/PlanningForm.vue | 172 +++++-
src/views/tjt/project/ProjectForm.vue | 504 ++++++++++--------
src/views/tjt/project/index.vue | 63 ++-
src/views/tjt/report-budget/index.vue | 36 +-
.../tjt/report-project-quarter/index.vue | 38 +-
.../tjt/report-specialty-person/index.vue | 24 +-
src/views/tjt/staff-assignment/index.vue | 26 +-
18 files changed, 695 insertions(+), 345 deletions(-)
diff --git a/.env b/.env
index 87dd35d..6de2b25 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,5 @@
# 标题
-VITE_APP_TITLE=产值管理系统
+VITE_APP_TITLE=项目产值管理系统
# 项目本地运行端口号
VITE_PORT=80
diff --git a/index.html b/index.html
index 5d9d876..4cfe533 100644
--- a/index.html
+++ b/index.html
@@ -7,11 +7,11 @@
%VITE_APP_TITLE%
diff --git a/src/api/tjt/planning/index.ts b/src/api/tjt/planning/index.ts
index 529fec3..a02d1e3 100644
--- a/src/api/tjt/planning/index.ts
+++ b/src/api/tjt/planning/index.ts
@@ -3,12 +3,18 @@ import request from '@/config/axios'
export interface ProjectPlanningVO {
id?: number
projectId: number
+ sortNo?: number
ownershipType: string
calculationMethod: string
planningContent: string
planningAmount?: number
+ contractValueQuantity?: number
+ contractValueUnitPrice?: number
managementFeeRate?: number
managementFee?: number
+ vatRate?: number
+ vatAmount?: number
+ projectBudgetOutputValue?: number
implementationTeam?: string
planningStartYear?: number
planningArea?: number
@@ -44,7 +50,10 @@ export type ProjectPlanningSaveVO = Omit<
ProjectPlanningVO,
| 'allocatedAmount'
| 'pendingAmount'
+ | 'planningAmount'
| 'managementFee'
+ | 'vatAmount'
+ | 'projectBudgetOutputValue'
| 'contractUnitPrice'
| 'totalAdjustmentFactor'
| 'assessmentArea'
diff --git a/src/api/tjt/profit/index.ts b/src/api/tjt/profit/index.ts
index 529be50..1bc30dc 100644
--- a/src/api/tjt/profit/index.ts
+++ b/src/api/tjt/profit/index.ts
@@ -3,6 +3,7 @@ import request from '@/config/axios'
export interface ProjectProfitVO {
projectId: number
projectName: string
+ sortNo?: number
contractSignedFlag: boolean
contractAmount?: number
finalSettlementAmount?: number
diff --git a/src/api/tjt/project/index.ts b/src/api/tjt/project/index.ts
index 1468c96..358113c 100644
--- a/src/api/tjt/project/index.ts
+++ b/src/api/tjt/project/index.ts
@@ -13,6 +13,7 @@ export interface ProjectRolePersonVO {
export interface ProjectVO {
id?: number
projectName: string
+ sortNo?: number
contractSignedFlag: boolean
contractAmount?: number
totalConstructionArea?: number
diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts
index 8383a69..007b36e 100644
--- a/src/locales/zh-CN.ts
+++ b/src/locales/zh-CN.ts
@@ -115,7 +115,7 @@ export default {
},
login: {
welcome: '欢迎使用本系统',
- message: '产值管理系统',
+ message: '项目产值管理系统',
tenantname: '租户名称',
username: '用户名',
password: '密码',
@@ -374,7 +374,7 @@ export default {
qrSignInFormTitle: '二维码登录',
signUpFormTitle: '注册',
forgetFormTitle: '重置密码',
- signInTitle: '产值管理系统',
+ signInTitle: '项目产值管理系统',
signInDesc: '输入您的个人详细信息开始使用!',
policy: '我同意xxx隐私政策',
scanSign: `扫码后点击"确认",即可完成登录`,
diff --git a/src/views/tjt/output-split/index.vue b/src/views/tjt/output-split/index.vue
index 5dc7737..ea4e8b8 100644
--- a/src/views/tjt/output-split/index.vue
+++ b/src/views/tjt/output-split/index.vue
@@ -7,12 +7,12 @@
class="-mb-15px"
label-width="88px"
>
-
+
@@ -47,14 +47,21 @@
highlight-current-row
@current-change="handleCurrentProjectChange"
>
-
-
-
+
+
+
{{ getProjectLeadText(scope.row.projectManagerName, scope.row.engineeringPrincipalName) }}
+
-
+
+
{{ getOwnershipTypeLabel(scope.row.ownershipType) }}
@@ -89,6 +97,7 @@
{{ formatAmountText(scope.row.assessmentOutputValue) }}
+
@@ -117,8 +126,8 @@
{{ formData.projectName || '-' }}
- {{ formData.planningContent || '-' }}
-
+ {{ formData.planningContent || '-' }}
+
{{ getProjectLeadText(formData.projectManagerName, formData.engineeringLeaderName) }}
@@ -288,7 +297,7 @@ interface QuarterYearRow {
}
const annualCategoryOptions: { label: string; value: AnnualCategoryKey }[] = [
- { label: '项目经理/项目负责人', value: 'project_lead' },
+ { label: '项目经理/工程负责人', value: 'project_lead' },
{ label: '建筑专业', value: 'arch' },
{ label: '装修专业', value: 'decor' },
{ label: '结构专业', value: 'struct' },
@@ -325,6 +334,9 @@ const queryParams = reactive({
projectStartYear: undefined
})
+const getProjectRowIndex = (index: number) =>
+ (queryParams.pageNo - 1) * queryParams.pageSize + index + 1
+
const queryProjectStartYearValue = computed({
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
set: (value?: string) => {
@@ -360,7 +372,7 @@ const buildProjectRows = (model?: OutputSplitApi.ProjectOutputSplitVO) => {
return [
{
key: 'projectLeadRatio',
- label: '项目经理/项目负责人',
+ label: '项目经理/工程负责人',
percentText: formatRatioText(model.projectLeadRatio),
percent: toPercentValue(model.projectLeadRatio),
amount: model.projectLeadAmount
diff --git a/src/views/tjt/output/PlanningOutputForm.vue b/src/views/tjt/output/PlanningOutputForm.vue
index cee37df..c796a92 100644
--- a/src/views/tjt/output/PlanningOutputForm.vue
+++ b/src/views/tjt/output/PlanningOutputForm.vue
@@ -31,7 +31,7 @@
-
+
@@ -39,17 +39,53 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
@@ -247,7 +283,6 @@
新增明细
- 💡 提示:数字字段已隐藏加减箭头以优化显示,支持直接输入或复制粘贴
@@ -544,8 +579,13 @@ const createFormData = (): PlanningApi.ProjectPlanningVO => ({
calculationMethod: '',
planningContent: '',
planningAmount: undefined,
+ contractValueQuantity: undefined,
+ contractValueUnitPrice: undefined,
managementFeeRate: undefined,
managementFee: undefined,
+ vatRate: undefined,
+ vatAmount: undefined,
+ projectBudgetOutputValue: undefined,
implementationTeam: '',
planningStartYear: undefined,
planningArea: undefined,
@@ -639,6 +679,9 @@ const normalizeFormData = (data: PlanningApi.ProjectPlanningVO): PlanningApi.Pro
...data,
ownershipType: normalizeOwnershipType(data.ownershipType) || data.ownershipType || '',
calculationMethod: normalizeCalculationMethod(data.calculationMethod) || data.calculationMethod || '',
+ contractValueQuantity: data.contractValueQuantity ?? 1,
+ contractValueUnitPrice: data.contractValueUnitPrice ?? data.planningAmount,
+ vatRate: data.vatRate ?? 0.06,
designStage: normalizeDesignStage(data.designStage),
virtualCalculationMethod: normalizeVirtualCalculationMethod(data.virtualCalculationMethod),
reviewOutsourceFlag: data.reviewOutsourceFlag ?? false,
@@ -785,6 +828,13 @@ const formatFactorText = (value?: number, digits = 4) => {
return Number(value).toFixed(digits)
}
+const formatQuantityText = (value?: number, digits = 4) => {
+ if (value === undefined || value === null) {
+ return '-'
+ }
+ return Number(value).toFixed(digits)
+}
+
const setGuideDetailPercentValue = (
row: GuideDetailRow,
field: 'complexityFactor' | 'designRatio',
@@ -940,8 +990,11 @@ const buildSavePayload = (): PlanningApi.ProjectPlanningSaveVO => ({
ownershipType: formData.value.ownershipType,
calculationMethod: formData.value.calculationMethod,
planningContent: formData.value.planningContent,
- planningAmount: formData.value.planningAmount,
+ sortNo: formData.value.sortNo,
+ contractValueQuantity: formData.value.contractValueQuantity,
+ contractValueUnitPrice: formData.value.contractValueUnitPrice,
managementFeeRate: formData.value.managementFeeRate,
+ vatRate: formData.value.vatRate,
implementationTeam: formData.value.implementationTeam,
planningStartYear: formData.value.planningStartYear,
planningArea: showGuideDetailSection.value
@@ -1104,4 +1157,4 @@ const submitForm = async () => {
:deep(.text-primary) {
color: var(--el-color-primary);
}
-
\ No newline at end of file
+
diff --git a/src/views/tjt/output/QuarterDistributionForm.vue b/src/views/tjt/output/QuarterDistributionForm.vue
index 48e0a6a..6f234ad 100644
--- a/src/views/tjt/output/QuarterDistributionForm.vue
+++ b/src/views/tjt/output/QuarterDistributionForm.vue
@@ -211,6 +211,9 @@ const open = async (id: number) => {
const planning = await PlanningApi.getProjectPlanning(id)
formData.value = {
...planning,
+ contractValueQuantity: planning.contractValueQuantity ?? 1,
+ contractValueUnitPrice: planning.contractValueUnitPrice ?? planning.planningAmount,
+ vatRate: planning.vatRate ?? 0.06,
totalDistributionAmount: planning.totalDistributionAmount ?? 1,
progressRemark: planning.progressRemark ?? ''
}
@@ -315,11 +318,14 @@ const submitForm = async () => {
await PlanningApi.updateProjectPlanning({
id: formData.value.id,
projectId: formData.value.projectId,
+ sortNo: formData.value.sortNo,
ownershipType: formData.value.ownershipType,
calculationMethod: formData.value.calculationMethod,
planningContent: formData.value.planningContent,
- planningAmount: formData.value.planningAmount,
+ contractValueQuantity: formData.value.contractValueQuantity,
+ contractValueUnitPrice: formData.value.contractValueUnitPrice,
managementFeeRate: formData.value.managementFeeRate,
+ vatRate: formData.value.vatRate,
implementationTeam: formData.value.implementationTeam,
planningStartYear: formData.value.planningStartYear,
planningArea: formData.value.planningArea,
diff --git a/src/views/tjt/output/index.vue b/src/views/tjt/output/index.vue
index 6879dd1..cc9ea6a 100644
--- a/src/views/tjt/output/index.vue
+++ b/src/views/tjt/output/index.vue
@@ -7,12 +7,12 @@
class="-mb-15px"
label-width="88px"
>
-
+
@@ -62,10 +62,16 @@
highlight-current-row
@current-change="handleCurrentProjectChange"
>
-
+
-
+
{{ formatAmountText(scope.row.contractAmount) }}
@@ -95,6 +101,7 @@
prop="createTime"
width="180"
/>
+
+
-
+
{{ formatAmountText(scope.row.planningAmount) }}
@@ -152,6 +160,7 @@
{{ formatAmountText(scope.row.assessmentOutputValue) }}
+
@@ -190,7 +199,7 @@
-
+
{{ formatAmountText(currentPlanning.planningAmount) }}
@@ -199,7 +208,7 @@
{{ formatAmountText(currentPlanning.managementFee) }}
-
+
{{ currentPlanning.implementationTeam || '-' }}
@@ -429,6 +438,9 @@ const queryParams = reactive({
projectStartYear: undefined
})
+const getProjectRowIndex = (index: number) =>
+ (queryParams.pageNo - 1) * queryParams.pageSize + index + 1
+
const queryProjectStartYearValue = computed({
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
set: (value?: string) => {
diff --git a/src/views/tjt/profit/index.vue b/src/views/tjt/profit/index.vue
index fdf814f..ecf0e0d 100644
--- a/src/views/tjt/profit/index.vue
+++ b/src/views/tjt/profit/index.vue
@@ -7,12 +7,12 @@
class="-mb-15px"
label-width="88px"
>
-
+
@@ -62,7 +62,14 @@
highlight-current-row
@current-change="handleCurrentProfitChange"
>
-
+
+
@@ -71,7 +78,7 @@
-
+
{{ formatAmountText(scope.row.contractAmount) }}
@@ -130,6 +137,7 @@
+
-
+
{{ formatAmountText(currentProfit.contractAmount) }}
@@ -295,6 +303,9 @@ const queryParams = reactive({
projectStartYear: undefined
})
+const getProjectRowIndex = (index: number) =>
+ (queryParams.pageNo - 1) * queryParams.pageSize + index + 1
+
const queryProjectStartYearValue = computed({
get: () => (queryParams.projectStartYear ? String(queryParams.projectStartYear) : undefined),
set: (value?: string) => {
diff --git a/src/views/tjt/project/PlanningForm.vue b/src/views/tjt/project/PlanningForm.vue
index 33a3387..7d3aa39 100644
--- a/src/views/tjt/project/PlanningForm.vue
+++ b/src/views/tjt/project/PlanningForm.vue
@@ -1,5 +1,5 @@
-