From cd107604a9b75cfa3f4fbeb0a4a410c27547ad1a Mon Sep 17 00:00:00 2001 From: wintsa <770775984@qq.com> Date: Wed, 11 Mar 2026 19:15:28 +0800 Subject: [PATCH] 1 --- src/components/common/HourlyFeeGrid.vue | 2 +- src/components/common/HtFeeGrid.vue | 10 +- src/components/common/HtFeeMethodGrid.vue | 55 +++++---- .../InvestmentScalePricingPane.vue | 110 +++++++++--------- .../pricingView/LandScalePricingPane.vue | 4 +- .../views/pricingView/WorkloadPricingPane.vue | 3 +- src/layout/tab.vue | 53 ++++----- src/lib/pricingScaleFee.ts | 2 + tsconfig.tsbuildinfo | 2 +- 9 files changed, 124 insertions(+), 117 deletions(-) diff --git a/src/components/common/HourlyFeeGrid.vue b/src/components/common/HourlyFeeGrid.vue index 4d0b564..dba6d34 100644 --- a/src/components/common/HourlyFeeGrid.vue +++ b/src/components/common/HourlyFeeGrid.vue @@ -433,7 +433,7 @@ const sumNullableBy = (rows: T[], pick: (row: T) => unknown): number | null = }) return hasValid ? total : null } -const totalServiceBudget = computed(() => sumNullableBy(detailRows.value, row => calcServiceBudget(row))) +const totalServiceBudget = computed(() => sumNullableBy(detailRows.value.filter(e => e.serviceBudget !== null && e.serviceBudget !== undefined), row => calcServiceBudget(row))) const pinnedTopRowData = computed(() => [ { id: 'pinned-total-row', diff --git a/src/components/common/HtFeeGrid.vue b/src/components/common/HtFeeGrid.vue index 5f5c384..7b0783c 100644 --- a/src/components/common/HtFeeGrid.vue +++ b/src/components/common/HtFeeGrid.vue @@ -164,14 +164,18 @@ const formatReadonlyBudgetFee = (params: any) => { const syncComputedValuesToRows = () => { let totalBudgetFee = 0 + let hasValidRow = false for (const row of detailRows.value) { if (isSubtotalRow(row)) continue - if (row.quantity == null || row.unitPrice == null) { + const quantity = typeof row.quantity === 'number' && Number.isFinite(row.quantity) ? row.quantity : null + const unitPrice = typeof row.unitPrice === 'number' && Number.isFinite(row.unitPrice) ? row.unitPrice : null + if (quantity == null || unitPrice == null) { row.budgetFee = null continue } - row.budgetFee = roundTo(toDecimal(row.quantity).mul(row.unitPrice), 2) + row.budgetFee = roundTo(toDecimal(quantity).mul(unitPrice), 2) if (typeof row.budgetFee === 'number' && Number.isFinite(row.budgetFee)) { + hasValidRow = true totalBudgetFee = roundTo(toDecimal(totalBudgetFee).add(row.budgetFee), 2) } } @@ -181,7 +185,7 @@ const syncComputedValuesToRows = () => { subtotalRow.unit = '' subtotalRow.quantity = null subtotalRow.unitPrice = null - subtotalRow.budgetFee = totalBudgetFee + subtotalRow.budgetFee = hasValidRow ? totalBudgetFee : null subtotalRow.remark = '' } } diff --git a/src/components/common/HtFeeMethodGrid.vue b/src/components/common/HtFeeMethodGrid.vue index c90fea5..3b8549b 100644 --- a/src/components/common/HtFeeMethodGrid.vue +++ b/src/components/common/HtFeeMethodGrid.vue @@ -93,8 +93,24 @@ const isSummaryRow = (row: FeeMethodRow | null | undefined) => row?.id === SUMMA const toFinite = (value: number | null | undefined) => typeof value === 'number' && Number.isFinite(value) ? value : 0 const round3 = (value: number) => Number(value.toFixed(3)) -const getRowSubtotal = (row: FeeMethodRow | null | undefined) => - row ? round3(toFinite(row.rateFee) + toFinite(row.hourlyFee) + toFinite(row.quantityUnitPriceFee)) : null +const sumNullableField = (rows: FeeMethodRow[], pick: (row: FeeMethodRow) => number | null | undefined): number | null => { + let hasValid = false + let total = 0 + for (const row of rows) { + const value = pick(row) + if (typeof value !== 'number' || !Number.isFinite(value)) continue + total += value + hasValid = true + } + return hasValid ? round3(total) : null +} +const getRowSubtotal = (row: FeeMethodRow | null | undefined) => { + if (!row) return null + const values = [row.rateFee, row.hourlyFee, row.quantityUnitPriceFee] + const hasValid = values.some(value => typeof value === 'number' && Number.isFinite(value)) + if (!hasValid) return null + return round3(toFinite(row.rateFee) + toFinite(row.hourlyFee) + toFinite(row.quantityUnitPriceFee)) +} const toFiniteUnknown = (value: unknown): number | null => { const numeric = Number(value) return Number.isFinite(numeric) ? numeric : null @@ -117,11 +133,13 @@ const sumHourlyMethodFee = (state: MethodHourlyState | null): number | null => { if (rows.length === 0) return null let total = 0 + let hasValid = false for (const row of rows) { const rowBudget = toFiniteUnknown(row?.serviceBudget) if (rowBudget != null) { total += rowBudget + hasValid = true continue } const adopted = toFiniteUnknown(row?.adoptedBudgetUnitPrice) @@ -130,31 +148,32 @@ const sumHourlyMethodFee = (state: MethodHourlyState | null): number | null => { if (adopted == null || personnel == null || workday == null) continue total += adopted * personnel * workday + hasValid = true } - return round3(total) + return hasValid ? round3(total) : null } const sumQuantityMethodFee = (state: MethodQuantityState | null): number | null => { const rows = Array.isArray(state?.detailRows) ? state.detailRows : [] if (rows.length === 0) return null - const subtotalRow = rows.find(row => String(row?.id || '') === 'fee-subtotal-fixed') - const subtotalBudget = toFiniteUnknown(subtotalRow?.budgetFee) - if (subtotalBudget != null) return round3(subtotalBudget) let total = 0 + let hasValid = false for (const row of rows) { if (String(row?.id || '') === 'fee-subtotal-fixed') continue const budget = toFiniteUnknown(row?.budgetFee) if (budget != null) { total += budget + hasValid = true continue } const quantity = toFiniteUnknown(row?.quantity) const unitPrice = toFiniteUnknown(row?.unitPrice) if (quantity == null || unitPrice == null) continue total += quantity * unitPrice + hasValid = true } - return round3(total) + return hasValid ? round3(total) : null } const hydrateRowsFromMethodStores = async (rows: FeeMethodRow[]): Promise => { @@ -209,25 +228,15 @@ const detailRows = computed({ } }) const summaryRow = computed(() => { - const totals = detailRows.value.reduce( - (acc, row) => { - acc.rateFee += toFinite(row.rateFee) - acc.hourlyFee += toFinite(row.hourlyFee) - acc.quantityUnitPriceFee += toFinite(row.quantityUnitPriceFee) - return acc - }, - { - rateFee: 0, - hourlyFee: 0, - quantityUnitPriceFee: 0 - } - ) + const rateFee = sumNullableField(detailRows.value, row => row.rateFee) + const hourlyFee = sumNullableField(detailRows.value, row => row.hourlyFee) + const quantityUnitPriceFee = sumNullableField(detailRows.value, row => row.quantityUnitPriceFee) const result: FeeMethodRow = { id: SUMMARY_ROW_ID, name: '小计', - rateFee: round3(totals.rateFee), - hourlyFee: round3(totals.hourlyFee), - quantityUnitPriceFee: round3(totals.quantityUnitPriceFee) + rateFee, + hourlyFee, + quantityUnitPriceFee } result.subtotal = getRowSubtotal(result) return result diff --git a/src/components/views/pricingView/InvestmentScalePricingPane.vue b/src/components/views/pricingView/InvestmentScalePricingPane.vue index db53227..baea255 100644 --- a/src/components/views/pricingView/InvestmentScalePricingPane.vue +++ b/src/components/views/pricingView/InvestmentScalePricingPane.vue @@ -63,8 +63,8 @@ interface DetailRow { benchmarkBudgetOptional: number | null benchmarkBudgetBasicChecked: boolean benchmarkBudgetOptionalChecked: boolean - basicFormula: string | null - optionalFormula: string | null + basicFormula: string |null + optionalFormula: string |null consultCategoryFactor: number | null majorFactor: number | null workStageFactor: number | null @@ -535,7 +535,6 @@ const mergeWithDictRows = ( if (!fromDb) return row const hasConsultCategoryFactor = Object.prototype.hasOwnProperty.call(fromDb, 'consultCategoryFactor') const hasMajorFactor = Object.prototype.hasOwnProperty.call(fromDb, 'majorFactor') - return { ...row, amount: includeAmount && row.hasCost && typeof fromDb.amount === 'number' ? fromDb.amount : null, @@ -931,10 +930,10 @@ const autoGroupColumnDef: ColDef = { minWidth: 250, flex: 2, - // wrapText: true, - // cellStyle: { whiteSpace: 'normal', lineHeight: '1.5', padding: '2px' }, +// wrapText: true, + // cellStyle: { whiteSpace: 'normal', lineHeight: '1.5', padding: '2px' }, - // autoHeight: true, + // autoHeight: true, cellRendererParams: { suppressCount: true }, @@ -966,7 +965,6 @@ const autoGroupColumnDef: ColDef = { } -const totalAmount = computed(() => sumByNumber(detailRows.value, row => row.amount)) const sumNullableBy = (rows: T[], pick: (row: T) => unknown): number | null => { let hasValid = false @@ -981,7 +979,9 @@ const sumNullableBy = (rows: T[], pick: (row: T) => unknown): number | null = const totalBudgetFeeBasic = computed(() => sumNullableBy(detailRows.value, row => getBudgetFeeSplit(row)?.basic)) const totalBudgetFeeOptional = computed(() => sumNullableBy(detailRows.value, row => getBudgetFeeSplit(row)?.optional)) -const totalBudgetFee = computed(() => sumNullableBy(detailRows.value, row => getBudgetFee(row))) +const totalBudgetFee = computed(() => + sumNullableBy(detailRows.value.filter(e => e.budgetFee !== null && e.budgetFee !== undefined), row => getBudgetFee(row)) +) const pinnedTopRowData = computed(() => { return [ { @@ -1019,13 +1019,13 @@ const syncComputedValuesToDetailRows = () => { const benchmarkBudgetSplit = getCheckedBenchmarkBudgetSplitByAmount(row) const budgetFeeSplit = benchmarkBudgetSplit ? getScaleBudgetFeeSplit({ - benchmarkBudgetBasic: benchmarkBudgetSplit.basic, - benchmarkBudgetOptional: benchmarkBudgetSplit.optional, - majorFactor: row.majorFactor, - consultCategoryFactor: row.consultCategoryFactor, - workStageFactor: row.workStageFactor, - workRatio: row.workRatio - }) + benchmarkBudgetBasic: benchmarkBudgetSplit.basic, + benchmarkBudgetOptional: benchmarkBudgetSplit.optional, + majorFactor: row.majorFactor, + consultCategoryFactor: row.consultCategoryFactor, + workStageFactor: row.workStageFactor, + workRatio: row.workRatio + }) : null row.benchmarkBudget = benchmarkBudgetSplit?.total ?? null @@ -1087,15 +1087,15 @@ const buildRowsFromImportDefaultSource = async ( } return hasContractRows ? mergeWithDictRows(htData!.detailRows, { - includeFactorValues: true, - projectCount: targetProjectCount, - cloneFromProjectOne: true - }) + includeFactorValues: true, + projectCount: targetProjectCount, + cloneFromProjectOne: true + }) : buildDefaultRows(targetProjectCount).map(row => ({ - ...row, - consultCategoryFactor: getDefaultConsultCategoryFactor(), - majorFactor: getDefaultMajorFactorById(row.majorDictId || row.id) - })) + ...row, + consultCategoryFactor: getDefaultConsultCategoryFactor(), + majorFactor: getDefaultMajorFactorById(row.majorDictId || row.id) + })) } const applyProjectCountChange = async (nextValue: unknown) => { @@ -1166,15 +1166,15 @@ const loadFromIndexedDB = async () => { } else { detailRows.value = hasContractRows ? mergeWithDictRows(htData!.detailRows, { - includeFactorValues: true, - projectCount: targetProjectCount, - cloneFromProjectOne: true - }) + includeFactorValues: true, + projectCount: targetProjectCount, + cloneFromProjectOne: true + }) : buildDefaultRows(targetProjectCount).map(row => ({ - ...row, - consultCategoryFactor: getDefaultConsultCategoryFactor(), - majorFactor: getDefaultMajorFactorById(row.majorDictId || row.id) - })) + ...row, + consultCategoryFactor: getDefaultConsultCategoryFactor(), + majorFactor: getDefaultMajorFactorById(row.majorDictId || row.id) + })) } syncComputedValuesToDetailRows() } @@ -1191,13 +1191,13 @@ const loadFromIndexedDB = async () => { } detailRows.value = isOnlyCostScaleService.value ? buildOnlyCostScaleRows(data.detailRows as any, { - projectCount: getTargetProjectCount(), - cloneFromProjectOne: true - }) + projectCount: getTargetProjectCount(), + cloneFromProjectOne: true + }) : mergeWithDictRows(data.detailRows as any, { - projectCount: getTargetProjectCount(), - cloneFromProjectOne: true - }) + projectCount: getTargetProjectCount(), + cloneFromProjectOne: true + }) syncComputedValuesToDetailRows() return } @@ -1230,15 +1230,15 @@ const importContractData = async () => { } else { detailRows.value = hasContractRows ? mergeWithDictRows(htData!.detailRows, { - includeFactorValues: true, - projectCount: targetProjectCount, - cloneFromProjectOne: true - }) + includeFactorValues: true, + projectCount: targetProjectCount, + cloneFromProjectOne: true + }) : buildDefaultRows(targetProjectCount).map(row => ({ - ...row, - consultCategoryFactor: getDefaultConsultCategoryFactor(), - majorFactor: getDefaultMajorFactorById(row.majorDictId || row.id) - })) + ...row, + consultCategoryFactor: getDefaultConsultCategoryFactor(), + majorFactor: getDefaultMajorFactorById(row.majorDictId || row.id) + })) } await saveToIndexedDB() } catch (error) { @@ -1303,14 +1303,16 @@ const processCellFromClipboard = (params: any) => {

投资规模明细

项目数量 - - - - + @update:model-value="value => void applyProjectCountChange(value)" + > + - - + - + +
@@ -1321,8 +1323,7 @@ const processCellFromClipboard = (params: any) => { - + 确认清空当前明细 将清空当前投资规模明细,是否继续? @@ -1344,8 +1345,7 @@ const processCellFromClipboard = (params: any) => { - + 确认覆盖当前明细 将使用合同默认数据覆盖当前投资规模明细,是否继续? diff --git a/src/components/views/pricingView/LandScalePricingPane.vue b/src/components/views/pricingView/LandScalePricingPane.vue index a1d0c8e..0761337 100644 --- a/src/components/views/pricingView/LandScalePricingPane.vue +++ b/src/components/views/pricingView/LandScalePricingPane.vue @@ -835,7 +835,9 @@ const sumNullableBy = (rows: T[], pick: (row: T) => unknown): number | null = const totalBudgetFeeBasic = computed(() => sumNullableBy(detailRows.value, row => getBudgetFeeSplit(row)?.basic)) const totalBudgetFeeOptional = computed(() => sumNullableBy(detailRows.value, row => getBudgetFeeSplit(row)?.optional)) -const totalBudgetFee = computed(() => sumNullableBy(detailRows.value, row => getBudgetFee(row))) +const totalBudgetFee = computed(() => + sumNullableBy(detailRows.value.filter(e => e.budgetFee !== null && e.budgetFee !== undefined), row => getBudgetFee(row)) +) const pinnedTopRowData = computed(() => [ { id: 'pinned-total-row', diff --git a/src/components/views/pricingView/WorkloadPricingPane.vue b/src/components/views/pricingView/WorkloadPricingPane.vue index 4f080c0..fd9944a 100644 --- a/src/components/views/pricingView/WorkloadPricingPane.vue +++ b/src/components/views/pricingView/WorkloadPricingPane.vue @@ -399,7 +399,6 @@ const columnDefs: ColDef[] = [ const totalWorkload = computed(() => sumByNumber(detailRows.value, row => row.workload)) const totalBasicFee = computed(() => sumByNumber(detailRows.value, row => calcBasicFee(row))) - const sumNullableBy = (rows: T[], pick: (row: T) => unknown): number | null => { let hasValid = false const total = sumByNumber(rows, row => { @@ -411,7 +410,7 @@ const sumNullableBy = (rows: T[], pick: (row: T) => unknown): number | null = return hasValid ? total : null } -const totalServiceFee = computed(() => sumNullableBy(detailRows.value, row => calcServiceFee(row))) +const totalServiceFee = computed(() => sumNullableBy(detailRows.value.filter(e => e.basicFee !== null && e.basicFee !== undefined), row => calcServiceFee(row))) const pinnedTopRowData = computed(() => [ { id: 'pinned-total-row', diff --git a/src/layout/tab.vue b/src/layout/tab.vue index 313d84b..938f682 100644 --- a/src/layout/tab.vue +++ b/src/layout/tab.vue @@ -124,7 +124,7 @@ interface QuantityMethodRowLike { unit?: unknown quantity?: unknown unitPrice?: unknown - budgetFee?: unknown + budgetFee?: number|null remark?: unknown } @@ -286,12 +286,7 @@ interface ExportContract { reserve: ExportReserve | null } -interface ExportRichTextCode { - richText: Array<{ - text: string - font?: Record - }> -} + interface ExportMethod0 { coe: number @@ -314,8 +309,7 @@ interface ExportMethod5 { interface ExportAdditionalDetail { id: number - code: ExportRichTextCode - ref?: ExportRichTextCode + ref?: unknown name: string fee: number m0?: ExportMethod0 @@ -324,16 +318,14 @@ interface ExportAdditionalDetail { } interface ExportAdditional { - code: ExportRichTextCode - ref?: ExportRichTextCode + ref?: unknown name: string fee: number det: ExportAdditionalDetail[] } interface ExportReserve { - code: ExportRichTextCode - ref?: ExportRichTextCode + ref?: unknown name: string fee: number m0?: ExportMethod0 @@ -1032,7 +1024,7 @@ const buildMethod1 = (rows: ScaleMethodRowLike[] | undefined): ExportMethod1 | n const det = rows .map(row => { const major = toSafeInteger(row.id) - if (major == null || row.budgetFee ==null) return null + if (major == null || row.budgetFee == null) return null const cost = toFiniteNumber(row.amount) const basicFee = toFiniteNumber(row.budgetFee) if (basicFee != null) hasTotalValue = true @@ -1065,7 +1057,6 @@ const buildMethod1 = (rows: ScaleMethodRowLike[] | undefined): ExportMethod1 | n .filter((item): item is ExportMethod1Detail => Boolean(item)) if (det.length === 0 || !hasTotalValue) return null - console.log(det) return { cost: sumNumbers(det.map(item => item.cost)), basicFee: sumNumbers(det.map(item => item.basicFee)), @@ -1082,7 +1073,7 @@ const buildMethod2 = (rows: ScaleMethodRowLike[] | undefined): ExportMethod2 | n const det = rows .map(row => { const major = toSafeInteger(row.id) - if (major == null || row.budgetFee ==null) return null + if (major == null || row.budgetFee == null) return null const area = toFiniteNumber(row.landArea) const basicFee = toFiniteNumber(row.budgetFee) if (basicFee != null) hasTotalValue = true @@ -1131,7 +1122,7 @@ const buildMethod3 = (rows: WorkloadMethodRowLike[] | undefined): ExportMethod3 const det = rows .map(row => { const task = getTaskIdFromRowId(row.id) - if (task == null) return null + if (task == null || row.basicFee == null) return null const amount = toFiniteNumber(row.workload) const basicFee = toFiniteNumber(row.basicFee) const fee = toFiniteNumber(row.serviceFee) @@ -1165,7 +1156,7 @@ const buildMethod4 = (rows: HourlyMethodRowLike[] | undefined): ExportMethod4 | const det = rows .map(row => { const expert = getExpertIdFromRowId(row.id) - if (expert == null) return null + if (expert == null || row.serviceBudget == null) return null const personNum = toFiniteNumber(row.personnelCount) const workDay = toFiniteNumber(row.workdayCount) const fee = toFiniteNumber(row.serviceBudget) @@ -1214,7 +1205,7 @@ const buildServiceFee = ( ]) } -const createRichTextCode = (...parts: string[]): ExportRichTextCode => ({ +const createRichTextCode = (...parts: string[]): unknown => ({ richText: parts .map(item => String(item || '').trim()) .filter(Boolean) @@ -1232,10 +1223,11 @@ const buildMethod0 = (payload: RateMethodRowLike | null | undefined): ExportMeth } const buildMethod5 = (rows: QuantityMethodRowLike[] | undefined): ExportMethod5 | null => { + console.log(rows) if (!Array.isArray(rows) || rows.length === 0) return null const subtotalRow = rows.find(row => String(row?.id || '') === 'fee-subtotal-fixed') const subtotalFee = toFiniteNumber(subtotalRow?.budgetFee) - if (subtotalFee == null) return null + if (subtotalFee == null || subtotalRow?.budgetFee == null) return null const det = rows .filter(row => String(row?.id || '') !== 'fee-subtotal-fixed') .map(row => { @@ -1292,6 +1284,8 @@ const loadHtFeeMethodsByRow = async (mainStorageKey: string, rowId: string) => { zxFwPricingStore.loadHtFeeMethodState>(mainStorageKey, rowId, 'quantity-unit-price-fee') ]) const m0 = buildMethod0(rateState) + + const m4 = buildMethod4(Array.isArray(hourlyState?.detailRows) ? hourlyState?.detailRows : undefined) const m5 = buildMethod5(Array.isArray(quantityState?.detailRows) ? quantityState?.detailRows : undefined) if (!m0 && !m4 && !m5) return null @@ -1303,7 +1297,7 @@ const loadHtFeeMethodsByRow = async (mainStorageKey: string, rowId: string) => { } } -const buildAdditionalDetailCode = (index: number, name: string): ExportRichTextCode => { +const buildAdditionalDetailCode = (index: number, name: string): unknown => { const dictionaryIndex = additionalWorkList.findIndex(item => item === name) const useIndex = dictionaryIndex >= 0 ? dictionaryIndex : index const suffix = useIndex === 0 ? 'F' : useIndex === 1 ? 'X' : String(useIndex + 1) @@ -1323,11 +1317,11 @@ const buildAdditionalExport = async (contractId: string): Promise Boolean(item)) if (det.length === 0) return null - const addtionalCode = createRichTextCode('C', 'C') return { - code: addtionalCode, - ref: addtionalCode, + ref: { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: 'C' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: 'C' }] }, + name: '附加工作', fee: sumNumbers(det.map(item => item.fee)), det @@ -1357,11 +1350,9 @@ const buildReserveExport = async (contractId: string): Promise => { zxFwPricingStore.loadServicePricingMethodState(contractId, serviceIdText, 'workload'), zxFwPricingStore.loadServicePricingMethodState(contractId, serviceIdText, 'hourly') ]) + const method1Raw = method1State ? { detailRows: method1State.detailRows } : null const method2Raw = method2State ? { detailRows: method2State.detailRows } : null const method3Raw = method3State ? { detailRows: method3State.detailRows } : null const method4Raw = method4State ? { detailRows: method4State.detailRows } : null - const method1 = buildMethod1(method1Raw?.detailRows) const method2 = buildMethod2(method2Raw?.detailRows) const method3 = buildMethod3(method3Raw?.detailRows) @@ -1514,7 +1505,7 @@ const buildExportReportPayload = async (): Promise => { }) const contractServiceCoesRaw = buildProjectServiceCoes(htConsultCategoryFactorRaw?.detailRows) const contractMajorCoesRaw = buildProjectMajorCoes(htMajorFactorRaw?.detailRows) - + contracts.push({ name: isNonEmptyString(contract.name) ? contract.name : `合同段-${index + 1}`, diff --git a/src/lib/pricingScaleFee.ts b/src/lib/pricingScaleFee.ts index 075b90d..2ce99ed 100644 --- a/src/lib/pricingScaleFee.ts +++ b/src/lib/pricingScaleFee.ts @@ -17,7 +17,9 @@ export const getBenchmarkBudgetSplitByScale = ( mode: ScaleMode ): ScaleFeeSplitResult | null => { const scaleValue = toFiniteNumberOrNull(value) + const result = getBasicFeeFromScale(scaleValue, mode) + if (!result) return null const basic = roundTo(result.basic, 2) diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index e107a4c..9f017e6 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/main.ts","./src/sql.ts","./src/components/ui/button/index.ts","./src/components/ui/card/index.ts","./src/components/ui/scroll-area/index.ts","./src/components/ui/tooltip/index.ts","./src/lib/decimal.ts","./src/lib/diyaggridoptions.ts","./src/lib/number.ts","./src/lib/numberformat.ts","./src/lib/pricingmethodtotals.ts","./src/lib/pricingscalefee.ts","./src/lib/utils.ts","./src/lib/xmfactordefaults.ts","./src/lib/zwarchive.ts","./src/lib/zxfwpricingsync.ts","./src/pinia/htfeemethodreload.ts","./src/pinia/pricingpanereload.ts","./src/pinia/tab.ts","./src/app.vue","./src/components/common/hourlyfeegrid.vue","./src/components/common/htfeegrid.vue","./src/components/common/htfeemethodgrid.vue","./src/components/common/methodunavailablenotice.vue","./src/components/common/xmfactorgrid.vue","./src/components/common/xmcommonaggrid.vue","./src/components/ui/button/button.vue","./src/components/ui/card/card.vue","./src/components/ui/card/cardaction.vue","./src/components/ui/card/cardcontent.vue","./src/components/ui/card/carddescription.vue","./src/components/ui/card/cardfooter.vue","./src/components/ui/card/cardheader.vue","./src/components/ui/card/cardtitle.vue","./src/components/ui/scroll-area/scrollarea.vue","./src/components/ui/scroll-area/scrollbar.vue","./src/components/ui/tooltip/tooltipcontent.vue","./src/components/views/ht.vue","./src/components/views/htadditionalworkfee.vue","./src/components/views/htconsultcategoryfactor.vue","./src/components/views/htfeemethodtypelineview.vue","./src/components/views/htfeeratemethodform.vue","./src/components/views/htmajorfactor.vue","./src/components/views/htreservefee.vue","./src/components/views/servicecheckboxselector.vue","./src/components/views/xmconsultcategoryfactor.vue","./src/components/views/xmmajorfactor.vue","./src/components/views/zxfwview.vue","./src/components/views/htcard.vue","./src/components/views/htinfo.vue","./src/components/views/info.vue","./src/components/views/xmcard.vue","./src/components/views/xminfo.vue","./src/components/views/zxfw.vue","./src/components/views/pricingview/hourlypricingpane.vue","./src/components/views/pricingview/investmentscalepricingpane.vue","./src/components/views/pricingview/landscalepricingpane.vue","./src/components/views/pricingview/workloadpricingpane.vue","./src/layout/tab.vue","./src/layout/typeline.vue"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/main.ts","./src/sql.ts","./src/components/ui/button/index.ts","./src/components/ui/card/index.ts","./src/components/ui/scroll-area/index.ts","./src/components/ui/tooltip/index.ts","./src/lib/decimal.ts","./src/lib/diyaggridoptions.ts","./src/lib/number.ts","./src/lib/numberformat.ts","./src/lib/pricingmethodtotals.ts","./src/lib/pricingscalefee.ts","./src/lib/utils.ts","./src/lib/xmfactordefaults.ts","./src/lib/zwarchive.ts","./src/lib/zxfwpricingsync.ts","./src/pinia/kv.ts","./src/pinia/tab.ts","./src/pinia/zxfwpricing.ts","./src/pinia/plugin/indexdb.ts","./src/pinia/plugin/types.d.ts","./src/app.vue","./src/components/common/hourlyfeegrid.vue","./src/components/common/htfeegrid.vue","./src/components/common/htfeemethodgrid.vue","./src/components/common/methodunavailablenotice.vue","./src/components/common/xmfactorgrid.vue","./src/components/common/xmcommonaggrid.vue","./src/components/ui/button/button.vue","./src/components/ui/card/card.vue","./src/components/ui/card/cardaction.vue","./src/components/ui/card/cardcontent.vue","./src/components/ui/card/carddescription.vue","./src/components/ui/card/cardfooter.vue","./src/components/ui/card/cardheader.vue","./src/components/ui/card/cardtitle.vue","./src/components/ui/scroll-area/scrollarea.vue","./src/components/ui/scroll-area/scrollbar.vue","./src/components/ui/tooltip/tooltipcontent.vue","./src/components/views/ht.vue","./src/components/views/htadditionalworkfee.vue","./src/components/views/htconsultcategoryfactor.vue","./src/components/views/htfeemethodtypelineview.vue","./src/components/views/htfeeratemethodform.vue","./src/components/views/htmajorfactor.vue","./src/components/views/htreservefee.vue","./src/components/views/servicecheckboxselector.vue","./src/components/views/xmconsultcategoryfactor.vue","./src/components/views/xmmajorfactor.vue","./src/components/views/zxfwview.vue","./src/components/views/htcard.vue","./src/components/views/htinfo.vue","./src/components/views/info.vue","./src/components/views/xmcard.vue","./src/components/views/xminfo.vue","./src/components/views/zxfw.vue","./src/components/views/pricingview/hourlypricingpane.vue","./src/components/views/pricingview/investmentscalepricingpane.vue","./src/components/views/pricingview/landscalepricingpane.vue","./src/components/views/pricingview/workloadpricingpane.vue","./src/layout/tab.vue","./src/layout/typeline.vue"],"version":"5.9.3"} \ No newline at end of file