diff --git a/src/components/views/pricingView/WorkloadPricingPane.vue b/src/components/views/pricingView/WorkloadPricingPane.vue
index d8f3bba..b693a71 100644
--- a/src/components/views/pricingView/WorkloadPricingPane.vue
+++ b/src/components/views/pricingView/WorkloadPricingPane.vue
@@ -43,6 +43,7 @@ const props = defineProps<{
serviceId: string | number
}>()
const DB_KEY = computed(() => `gzlF-${props.contractId}-${props.serviceId}`)
+const HT_CONSULT_FACTOR_KEY = computed(() => `ht-consult-category-factor-v1-${props.contractId}`)
const PRICING_CLEAR_SKIP_PREFIX = 'pricing-clear-skip:'
const PRICING_FORCE_DEFAULT_PREFIX = 'pricing-force-default:'
const pricingPaneReloadStore = usePricingPaneReloadStore()
@@ -55,7 +56,7 @@ const getDefaultConsultCategoryFactor = () =>
const ensureFactorDefaultsLoaded = async () => {
if (factorDefaultsLoaded) return
- consultCategoryFactorMap.value = await loadConsultCategoryFactorMap()
+ consultCategoryFactorMap.value = await loadConsultCategoryFactorMap(HT_CONSULT_FACTOR_KEY.value)
factorDefaultsLoaded = true
}
@@ -481,7 +482,7 @@ const handleCellValueChanged = () => {
if (gridPersistTimer) clearTimeout(gridPersistTimer)
gridPersistTimer = setTimeout(() => {
void saveToIndexedDB()
- }, 1000)
+ }, 300)
}
onMounted(async () => {
diff --git a/src/components/views/zxFw.vue b/src/components/views/zxFw.vue
index 0222914..afc0735 100644
--- a/src/components/views/zxFw.vue
+++ b/src/components/views/zxFw.vue
@@ -9,7 +9,7 @@ import { AG_GRID_LOCALE_CN } from '@ag-grid-community/locale'
import { addNumbers } from '@/lib/decimal'
import { parseNumberOrNull } from '@/lib/number'
import { formatThousands, formatThousandsFlexible } from '@/lib/numberFormat'
-import { getPricingMethodTotalsForServices } from '@/lib/pricingMethodTotals'
+import { getPricingMethodTotalsForService, getPricingMethodTotalsForServices } from '@/lib/pricingMethodTotals'
import { ZXFW_RELOAD_SERVICE_KEY } from '@/lib/zxFwPricingSync'
import { Pencil, Eraser, Trash2 } from 'lucide-vue-next'
import {
@@ -311,19 +311,19 @@ const clearRowValues = async (row: DetailRow) => {
// 若该服务编辑页已打开,先关闭,避免子页面卸载时把旧数据写回缓? tabStore.removeTab(`zxfw-edit-${props.contractId}-${row.id}`)
await nextTick()
await clearPricingPaneValues(row.id)
- // const totals = await getPricingMethodTotalsForService({
- // contractId: props.contractId,
- // serviceId: row.id
- // })
+ const totals = await getPricingMethodTotalsForService({
+ contractId: props.contractId,
+ serviceId: row.id
+ })
const clearedRows = detailRows.value.map(item =>
item.id !== row.id
? item
: {
...item,
- investScale: null,
- landScale: null,
- workload: null,
- hourly: null
+ investScale: totals.investScale,
+ landScale: totals.landScale,
+ workload: totals.workload,
+ hourly: totals.hourly
}
)
const nextInvestScale = getMethodTotalFromRows(clearedRows, 'investScale')
@@ -384,7 +384,7 @@ const ActionCellRenderer = defineComponent({
]),
h('button', { class: 'zxfw-action-btn', 'data-action': 'clear', type: 'button' }, [
h(Eraser, { size: 13, 'aria-hidden': 'true' }),
- h('span', '清空')
+ h('span', '恢复默认')
]),
h('button', { class: 'zxfw-action-btn zxfw-action-btn--danger', 'data-action': 'delete', type: 'button' }, [
h(Trash2, { size: 13, 'aria-hidden': 'true' }),
@@ -527,17 +527,47 @@ const detailGridOptions: GridOptions
= {
}
}
-const fillPricingTotalsForSelectedRows = async () => {
- const serviceRows = detailRows.value.filter(row => !isFixedRow(row))
- if (serviceRows.length === 0) return
+const applyFixedRowTotals = (rows: DetailRow[]) => {
+ const nextInvestScale = getMethodTotalFromRows(rows, 'investScale')
+ const nextLandScale = getMethodTotalFromRows(rows, 'landScale')
+ const nextWorkload = getMethodTotalFromRows(rows, 'workload')
+ const nextHourly = getMethodTotalFromRows(rows, 'hourly')
+ return rows.map(row =>
+ isFixedRow(row)
+ ? {
+ ...row,
+ investScale: nextInvestScale,
+ landScale: nextLandScale,
+ workload: nextWorkload,
+ hourly: nextHourly,
+ subtotal: addNumbers(nextInvestScale, nextLandScale, nextWorkload, nextHourly)
+ }
+ : row
+ )
+}
+
+const fillPricingTotalsForServiceIds = async (serviceIds: string[]) => {
+ const targetIds = Array.from(
+ new Set(
+ serviceIds.filter(id =>
+ detailRows.value.some(row => !isFixedRow(row) && String(row.id) === String(id))
+ )
+ )
+ )
+
+ if (targetIds.length === 0) {
+ detailRows.value = applyFixedRowTotals(detailRows.value)
+ return
+ }
const totalsByServiceId = await getPricingMethodTotalsForServices({
contractId: props.contractId,
- serviceIds: serviceRows.map(row => row.id)
+ serviceIds: targetIds
})
- detailRows.value = detailRows.value.map(row => {
- if (isFixedRow(row)) return row
+ const targetSet = new Set(targetIds.map(id => String(id)))
+ const nextRows = detailRows.value.map(row => {
+ if (isFixedRow(row) || !targetSet.has(String(row.id))) return row
const totals = totalsByServiceId.get(String(row.id))
if (!totals) return row
return {
@@ -548,6 +578,8 @@ const fillPricingTotalsForSelectedRows = async () => {
hourly: totals.hourly
}
})
+
+ detailRows.value = applyFixedRowTotals(nextRows)
}
const applySelection = (codes: string[]) => {
@@ -601,7 +633,11 @@ const applySelection = (codes: string[]) => {
}
const handleServiceSelectionChange = async (ids: string[]) => {
+ const prevIds = [...selectedIds.value]
applySelection(ids)
+ const nextSelectedSet = new Set(selectedIds.value)
+ const addedIds = selectedIds.value.filter(id => !prevIds.includes(id) && nextSelectedSet.has(id))
+ await fillPricingTotalsForServiceIds(addedIds)
await saveToIndexedDB()
}
@@ -776,12 +812,7 @@ const loadFromIndexedDB = async () => {
hourly: typeof old.hourly === 'number' ? old.hourly : null
}
})
-
- try {
- // await fillPricingTotalsForSelectedRows()
- } catch (error) {
- console.error('fillPricingTotalsForSelectedRows failed:', error)
- }
+ detailRows.value = applyFixedRowTotals(detailRows.value)
} catch (error) {
console.error('loadFromIndexedDB failed:', error)
selectedIds.value = []
@@ -802,7 +833,7 @@ const handleCellValueChanged = () => {
if (gridPersistTimer) clearTimeout(gridPersistTimer)
gridPersistTimer = setTimeout(() => {
void saveToIndexedDB()
- }, 1000)
+ }, 300)
}
onMounted(async () => {
@@ -849,16 +880,16 @@ onBeforeUnmount(() => {
- 确认清空服务数据
+ 确认恢复默认数据
- 将清空“{{ pendingClearServiceName }}”的计价数据是否继续?
+ 会使用合同卡片里面最新填写的规模信息以及系数,自动计算默认数据,覆盖“{{ pendingClearServiceName }}”当前数据,是否继续?
diff --git a/src/lib/diyAgGridOptions.ts b/src/lib/diyAgGridOptions.ts
index 95fb6b0..6706486 100644
--- a/src/lib/diyAgGridOptions.ts
+++ b/src/lib/diyAgGridOptions.ts
@@ -9,6 +9,7 @@ const borderConfig = {
export const myTheme = themeQuartz.withParams({
wrapperBorder: false,
+ wrapperBorderRadius: 0,
headerBackgroundColor: '#f0f2f3',
headerTextColor: '#374151',
headerFontSize: 15,
@@ -25,6 +26,7 @@ export const gridOptions: GridOptions = {
tooltipShowMode: 'whenTruncated',
suppressAggFuncInHeader: true,
singleClickEdit: true,
+ stopEditingWhenCellsLoseFocus: true,
suppressClickEdit: false,
suppressContextMenu: false,
groupDefaultExpanded: -1,
diff --git a/src/lib/pricingMethodTotals.ts b/src/lib/pricingMethodTotals.ts
index 210f425..3a82bad 100644
--- a/src/lib/pricingMethodTotals.ts
+++ b/src/lib/pricingMethodTotals.ts
@@ -14,6 +14,14 @@ interface StoredDetailRowsState {
detailRows?: T[]
}
+interface StoredFactorState {
+ detailRows?: Array<{
+ id: string
+ standardFactor?: number | null
+ budgetValue?: number | null
+ }>
+}
+
type MaybeNumber = number | null | undefined
interface ScaleRow {
@@ -22,6 +30,8 @@ interface ScaleRow {
landArea: number | null
consultCategoryFactor: number | null
majorFactor: number | null
+ workStageFactor: number | null
+ workRatio: number | null
}
interface WorkloadRow {
@@ -92,25 +102,74 @@ const getDefaultMajorFactorById = (id: string) => {
return toFiniteNumberOrNull(major?.defCoe)
}
+const resolveFactorValue = (
+ row: { budgetValue?: number | null; standardFactor?: number | null } | undefined,
+ fallback: number | null
+) => {
+ if (!row) return fallback
+ const budgetValue = toFiniteNumberOrNull(row.budgetValue)
+ if (budgetValue != null) return budgetValue
+ const standardFactor = toFiniteNumberOrNull(row.standardFactor)
+ if (standardFactor != null) return standardFactor
+ return fallback
+}
+
+const buildConsultCategoryFactorMap = (state: StoredFactorState | null) => {
+ const map = new Map()
+ const serviceDict = getServiceDictById() as Record
+ for (const [id, item] of Object.entries(serviceDict)) {
+ map.set(String(id), toFiniteNumberOrNull(item?.defCoe))
+ }
+ for (const row of state?.detailRows || []) {
+ if (!row?.id) continue
+ const id = String(row.id)
+ map.set(id, resolveFactorValue(row, map.get(id) ?? null))
+ }
+ return map
+}
+
+const buildMajorFactorMap = (state: StoredFactorState | null) => {
+ const map = new Map()
+ for (const [id, item] of majorById.entries()) {
+ map.set(String(id), toFiniteNumberOrNull(item?.defCoe))
+ }
+ for (const row of state?.detailRows || []) {
+ if (!row?.id) continue
+ const rowId = String(row.id)
+ const id = map.has(rowId) ? rowId : majorIdAliasMap.get(rowId) || rowId
+ map.set(id, resolveFactorValue(row, map.get(id) ?? null))
+ }
+ return map
+}
+
const getMajorLeafIds = () =>
getMajorDictEntries()
.filter(({ item }) => Boolean(item?.code && String(item.code).includes('-')))
.map(({ id }) => id)
-const buildDefaultScaleRows = (serviceId: string | number): ScaleRow[] => {
- const defaultConsultCategoryFactor = getDefaultConsultCategoryFactor(serviceId)
+const buildDefaultScaleRows = (
+ serviceId: string | number,
+ consultCategoryFactorMap?: Map,
+ majorFactorMap?: Map
+): ScaleRow[] => {
+ const defaultConsultCategoryFactor =
+ consultCategoryFactorMap?.get(String(serviceId)) ?? getDefaultConsultCategoryFactor(serviceId)
return getMajorLeafIds().map(id => ({
id,
amount: null,
landArea: null,
consultCategoryFactor: defaultConsultCategoryFactor,
- majorFactor: getDefaultMajorFactorById(id)
+ majorFactor: majorFactorMap?.get(id) ?? getDefaultMajorFactorById(id),
+ workStageFactor: 1,
+ workRatio: 100
}))
}
const mergeScaleRows = (
serviceId: string | number,
- rowsFromDb: Array & Pick> | undefined
+ rowsFromDb: Array & Pick> | undefined,
+ consultCategoryFactorMap?: Map,
+ majorFactorMap?: Map
): ScaleRow[] => {
const dbValueMap = toRowMap(rowsFromDb)
for (const row of rowsFromDb || []) {
@@ -121,13 +180,16 @@ const mergeScaleRows = (
}
}
- const defaultConsultCategoryFactor = getDefaultConsultCategoryFactor(serviceId)
- return buildDefaultScaleRows(serviceId).map(row => {
+ const defaultConsultCategoryFactor =
+ consultCategoryFactorMap?.get(String(serviceId)) ?? getDefaultConsultCategoryFactor(serviceId)
+ return buildDefaultScaleRows(serviceId, consultCategoryFactorMap, majorFactorMap).map(row => {
const fromDb = dbValueMap.get(row.id)
if (!fromDb) return row
const hasConsultCategoryFactor = hasOwn(fromDb, 'consultCategoryFactor')
const hasMajorFactor = hasOwn(fromDb, 'majorFactor')
+ const hasWorkStageFactor = hasOwn(fromDb, 'workStageFactor')
+ const hasWorkRatio = hasOwn(fromDb, 'workRatio')
return {
...row,
@@ -138,7 +200,13 @@ const mergeScaleRows = (
(hasConsultCategoryFactor ? null : defaultConsultCategoryFactor),
majorFactor:
toFiniteNumberOrNull(fromDb.majorFactor) ??
- (hasMajorFactor ? null : getDefaultMajorFactorById(row.id))
+ (hasMajorFactor ? null : (majorFactorMap?.get(row.id) ?? getDefaultMajorFactorById(row.id))),
+ workStageFactor:
+ toFiniteNumberOrNull((fromDb as Partial).workStageFactor) ??
+ (hasWorkStageFactor ? null : row.workStageFactor),
+ workRatio:
+ toFiniteNumberOrNull((fromDb as Partial).workRatio) ??
+ (hasWorkRatio ? null : row.workRatio)
}
})
}
@@ -153,7 +221,9 @@ const getInvestmentBudgetFee = (row: ScaleRow) => {
return getScaleBudgetFee({
benchmarkBudget: getBenchmarkBudgetByAmount(row.amount),
majorFactor: row.majorFactor,
- consultCategoryFactor: row.consultCategoryFactor
+ consultCategoryFactor: row.consultCategoryFactor,
+ workStageFactor: row.workStageFactor,
+ workRatio: row.workRatio
})
}
@@ -161,7 +231,9 @@ const getLandBudgetFee = (row: ScaleRow) => {
return getScaleBudgetFee({
benchmarkBudget: getBenchmarkBudgetByLandArea(row.landArea),
majorFactor: row.majorFactor,
- consultCategoryFactor: row.consultCategoryFactor
+ consultCategoryFactor: row.consultCategoryFactor,
+ workStageFactor: row.workStageFactor,
+ workRatio: row.workRatio
})
}
@@ -170,8 +242,12 @@ const getTaskEntriesByServiceId = (serviceId: string | number) =>
.sort((a, b) => Number(a[0]) - Number(b[0]))
.filter(([, task]) => Number(task.serviceID) === Number(serviceId))
-const buildDefaultWorkloadRows = (serviceId: string | number): WorkloadRow[] => {
- const defaultConsultCategoryFactor = getDefaultConsultCategoryFactor(serviceId)
+const buildDefaultWorkloadRows = (
+ serviceId: string | number,
+ consultCategoryFactorMap?: Map
+): WorkloadRow[] => {
+ const defaultConsultCategoryFactor =
+ consultCategoryFactorMap?.get(String(serviceId)) ?? getDefaultConsultCategoryFactor(serviceId)
return getTaskEntriesByServiceId(serviceId).map(([taskId, task], order) => ({
id: `task-${taskId}-${order}`,
conversion: toFiniteNumberOrNull(task.conversion),
@@ -184,11 +260,12 @@ const buildDefaultWorkloadRows = (serviceId: string | number): WorkloadRow[] =>
const mergeWorkloadRows = (
serviceId: string | number,
- rowsFromDb: Array & Pick> | undefined
+ rowsFromDb: Array & Pick> | undefined,
+ consultCategoryFactorMap?: Map
): WorkloadRow[] => {
const dbValueMap = toRowMap(rowsFromDb)
- return buildDefaultWorkloadRows(serviceId).map(row => {
+ return buildDefaultWorkloadRows(serviceId, consultCategoryFactorMap).map(row => {
const fromDb = dbValueMap.get(row.id)
if (!fromDb) return row
@@ -270,15 +347,27 @@ const calcHourlyServiceBudget = (row: HourlyRow) => {
const resolveScaleRows = (
serviceId: string,
pricingData: StoredDetailRowsState | null,
- htData: StoredDetailRowsState | null
+ htData: StoredDetailRowsState | null,
+ consultCategoryFactorMap?: Map,
+ majorFactorMap?: Map
) => {
if (pricingData?.detailRows != null) {
- return mergeScaleRows(serviceId, pricingData.detailRows as any)
+ return mergeScaleRows(
+ serviceId,
+ pricingData.detailRows as any,
+ consultCategoryFactorMap,
+ majorFactorMap
+ )
}
if (htData?.detailRows != null) {
- return mergeScaleRows(serviceId, htData.detailRows as any)
+ return mergeScaleRows(
+ serviceId,
+ htData.detailRows as any,
+ consultCategoryFactorMap,
+ majorFactorMap
+ )
}
- return buildDefaultScaleRows(serviceId)
+ return buildDefaultScaleRows(serviceId, consultCategoryFactorMap, majorFactorMap)
}
export const getPricingMethodTotalsForService = async (params: {
@@ -287,33 +376,52 @@ export const getPricingMethodTotalsForService = async (params: {
}): Promise => {
const serviceId = String(params.serviceId)
const htDbKey = `ht-info-v3-${params.contractId}`
+ const consultFactorDbKey = `ht-consult-category-factor-v1-${params.contractId}`
+ const majorFactorDbKey = `ht-major-factor-v1-${params.contractId}`
const investDbKey = `tzGMF-${params.contractId}-${serviceId}`
const landDbKey = `ydGMF-${params.contractId}-${serviceId}`
const workloadDbKey = `gzlF-${params.contractId}-${serviceId}`
const hourlyDbKey = `hourlyPricing-${params.contractId}-${serviceId}`
- const [investData, landData, workloadData, hourlyData, htData] = await Promise.all([
+ const [investData, landData, workloadData, hourlyData, htData, consultFactorData, majorFactorData] = await Promise.all([
localforage.getItem(investDbKey),
localforage.getItem(landDbKey),
localforage.getItem(workloadDbKey),
localforage.getItem(hourlyDbKey),
- localforage.getItem(htDbKey)
+ localforage.getItem(htDbKey),
+ localforage.getItem(consultFactorDbKey),
+ localforage.getItem(majorFactorDbKey)
])
+ const consultCategoryFactorMap = buildConsultCategoryFactorMap(consultFactorData)
+ const majorFactorMap = buildMajorFactorMap(majorFactorData)
+
// 优先使用对应计费页的数据;不存在时回退合同段规模信息,再回退默认字典行。
- const investRows = resolveScaleRows(serviceId, investData, htData)
+ const investRows = resolveScaleRows(
+ serviceId,
+ investData,
+ htData,
+ consultCategoryFactorMap,
+ majorFactorMap
+ )
const investScale = sumByNumber(investRows, row => getInvestmentBudgetFee(row))
- const landRows = resolveScaleRows(serviceId, landData, htData)
+ const landRows = resolveScaleRows(
+ serviceId,
+ landData,
+ htData,
+ consultCategoryFactorMap,
+ majorFactorMap
+ )
const landScale = sumByNumber(landRows, row => getLandBudgetFee(row))
- const defaultWorkloadRows = buildDefaultWorkloadRows(serviceId)
+ const defaultWorkloadRows = buildDefaultWorkloadRows(serviceId, consultCategoryFactorMap)
const workload =
defaultWorkloadRows.length === 0
? null
: sumByNumber(
workloadData?.detailRows != null
- ? mergeWorkloadRows(serviceId, workloadData.detailRows as any)
+ ? mergeWorkloadRows(serviceId, workloadData.detailRows as any, consultCategoryFactorMap)
: defaultWorkloadRows,
row => calcWorkloadServiceFee(row)
)
diff --git a/src/lib/pricingScaleFee.ts b/src/lib/pricingScaleFee.ts
index 198376e..075b90d 100644
--- a/src/lib/pricingScaleFee.ts
+++ b/src/lib/pricingScaleFee.ts
@@ -43,28 +43,42 @@ export const getScaleBudgetFeeSplit = (params: {
benchmarkBudgetOptional: unknown
majorFactor: unknown
consultCategoryFactor: unknown
+ workStageFactor?: unknown
+ workRatio?: unknown
}): ScaleFeeSplitResult | null => {
+ const hasWorkStageFactor = Object.prototype.hasOwnProperty.call(params, 'workStageFactor')
+ const hasWorkRatio = Object.prototype.hasOwnProperty.call(params, 'workRatio')
const benchmarkBudgetBasic = toFiniteNumberOrNull(params.benchmarkBudgetBasic)
const benchmarkBudgetOptional = toFiniteNumberOrNull(params.benchmarkBudgetOptional)
const majorFactor = toFiniteNumberOrNull(params.majorFactor)
const consultCategoryFactor = toFiniteNumberOrNull(params.consultCategoryFactor)
+ const workStageFactor = hasWorkStageFactor ? toFiniteNumberOrNull(params.workStageFactor) : 1
+ const workRatio = hasWorkRatio ? toFiniteNumberOrNull(params.workRatio) : 100
if (
benchmarkBudgetBasic == null ||
benchmarkBudgetOptional == null ||
majorFactor == null ||
- consultCategoryFactor == null
+ consultCategoryFactor == null ||
+ workStageFactor == null ||
+ workRatio == null
) {
return null
}
- const basic = roundTo(toDecimal(benchmarkBudgetBasic).mul(majorFactor).mul(consultCategoryFactor), 2)
- const optional = roundTo(toDecimal(benchmarkBudgetOptional).mul(majorFactor).mul(consultCategoryFactor), 2)
+ const multiplier = toDecimal(consultCategoryFactor)
+ .mul(majorFactor)
+ .mul(workStageFactor)
+ .mul(workRatio)
+ .div(100)
+ const roundedBenchmarkBudget = roundTo(addNumbers(benchmarkBudgetBasic, benchmarkBudgetOptional), 2)
+ const basic = roundTo(toDecimal(benchmarkBudgetBasic).mul(multiplier), 2)
+ const optional = roundTo(toDecimal(benchmarkBudgetOptional).mul(multiplier), 2)
return {
basic,
optional,
- total: roundTo(addNumbers(basic, optional), 2),
+ total: roundTo(toDecimal(roundedBenchmarkBudget).mul(multiplier), 2),
basicFormula: '',
optionalFormula: ''
}
@@ -74,14 +88,32 @@ export const getScaleBudgetFee = (params: {
benchmarkBudget: unknown
majorFactor: unknown
consultCategoryFactor: unknown
+ workStageFactor?: unknown
+ workRatio?: unknown
}) => {
+ const hasWorkStageFactor = Object.prototype.hasOwnProperty.call(params, 'workStageFactor')
+ const hasWorkRatio = Object.prototype.hasOwnProperty.call(params, 'workRatio')
const benchmarkBudget = toFiniteNumberOrNull(params.benchmarkBudget)
const majorFactor = toFiniteNumberOrNull(params.majorFactor)
const consultCategoryFactor = toFiniteNumberOrNull(params.consultCategoryFactor)
+ const workStageFactor = hasWorkStageFactor ? toFiniteNumberOrNull(params.workStageFactor) : 1
+ const workRatio = hasWorkRatio ? toFiniteNumberOrNull(params.workRatio) : 100
- if (benchmarkBudget == null || majorFactor == null || consultCategoryFactor == null) {
+ if (
+ benchmarkBudget == null ||
+ majorFactor == null ||
+ consultCategoryFactor == null ||
+ workStageFactor == null ||
+ workRatio == null
+ ) {
return null
}
- return roundTo(toDecimal(benchmarkBudget).mul(majorFactor).mul(consultCategoryFactor), 2)
+ const roundedBenchmarkBudget = roundTo(benchmarkBudget, 2)
+ const multiplier = toDecimal(consultCategoryFactor)
+ .mul(majorFactor)
+ .mul(workStageFactor)
+ .mul(workRatio)
+ .div(100)
+ return roundTo(toDecimal(roundedBenchmarkBudget).mul(multiplier), 2)
}
diff --git a/src/lib/xmFactorDefaults.ts b/src/lib/xmFactorDefaults.ts
index c6d0b5a..452e687 100644
--- a/src/lib/xmFactorDefaults.ts
+++ b/src/lib/xmFactorDefaults.ts
@@ -57,8 +57,8 @@ const loadFactorMap = async (
return map
}
-export const loadConsultCategoryFactorMap = async () =>
- loadFactorMap(CONSULT_CATEGORY_FACTOR_KEY, getServiceDictById() as FactorDict)
+export const loadConsultCategoryFactorMap = async (storageKey = CONSULT_CATEGORY_FACTOR_KEY) =>
+ loadFactorMap(storageKey, getServiceDictById() as FactorDict)
-export const loadMajorFactorMap = async () =>
- loadFactorMap(MAJOR_FACTOR_KEY, getMajorDictById() as FactorDict, getMajorIdAliasMap())
+export const loadMajorFactorMap = async (storageKey = MAJOR_FACTOR_KEY) =>
+ loadFactorMap(storageKey, getMajorDictById() as FactorDict, getMajorIdAliasMap())
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
index 7c43f72..6ad81c6 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/pricingpanereload.ts","./src/pinia/tab.ts","./src/app.vue","./src/components/common/commonaggrid.vue","./src/components/common/methodunavailablenotice.vue","./src/components/common/xmfactorgrid.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/contractdetailview.vue","./src/components/views/ht.vue","./src/components/views/servicecheckboxselector.vue","./src/components/views/xm.vue","./src/components/views/xmconsultcategoryfactor.vue","./src/components/views/xmmajorfactor.vue","./src/components/views/zxfwview.vue","./src/components/views/htinfo.vue","./src/components/views/info.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/pricingpanereload.ts","./src/pinia/tab.ts","./src/app.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/htconsultcategoryfactor.vue","./src/components/views/htmajorfactor.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
diff --git a/vite.config.ts b/vite.config.ts
index 3b2e37b..fe84e69 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -5,7 +5,7 @@ import vue from '@vitejs/plugin-vue'
export default defineConfig({
- plugins: [vue(),tailwindcss()],
+ plugins: [vue(), tailwindcss()],
// 路径别名(和 tsconfig 保持一致)
resolve: {
alias: {
@@ -20,7 +20,10 @@ export default defineConfig({
assetsDir: 'static',
// 3. 生成的静态资源文件名是否包含哈希(用于缓存控制)
assetsInlineLimit: 4096, // 小于4kb的资源内联,不生成文件
- rollupOptions: {
+ rolldownOptions: {
+ checks: {
+ pluginTimings: false
+ },
// 4. 自定义入口/出口(进阶,一般无需修改)
output: {
// 自定义 chunk 文件名(拆分公共代码)
@@ -53,7 +56,7 @@ export default defineConfig({
}
}
},
- chunkSizeWarningLimit: 800,
+ chunkSizeWarningLimit: 1800,
// 5. 生产环境是否生成 sourcemap(默认 false,关闭可减小包体积)
sourcemap: false,
// 6. 清空输出目录(默认 true)