This commit is contained in:
zwgczx committed 2026-03-06 17:40:08 +08:00
1 parent 626513bc21
commit c482faacbf
9 files changed
+198 -47

No files matched your search

+47 -41
View File
@@ -28,18 +28,7 @@ interface DictGroup {
children: DictLeaf[]
}
interface DetailRow {
id: string
groupCode: string
groupName: string
majorCode: string
majorName: string
hasCost: boolean
hasArea: boolean
amount: number | null
landArea: number | null
path: string[]
}
interface XmScaleState {
detailRows?: DetailRow[]
@@ -151,60 +140,75 @@ const mergeWithDictRows = (rowsFromDb: DetailRow[] | undefined): DetailRow[] =>
}
const loadFromIndexedDB = async (gridApi: any) => {
const applyPinnedTotalAmount = (
api: GridApi<DetailRow> | null | undefined,
totalAmount: number | null | undefined
) => {
const normalized = typeof totalAmount === 'number' && Number.isFinite(totalAmount)
? roundTo(totalAmount, 2)
: null
pinnedTopRowData.value[0].amount = normalized
const pinnedTopNode = api?.getPinnedTopRow(0)
if (pinnedTopNode) {
pinnedTopNode.setDataValue('amount', normalized)
}
}
const loadFromIndexedDB = async (api: GridApi<DetailRow>) => {
try {
const [baseInfo, contractData] = await Promise.all([
localforage.getItem<XmBaseInfoState>(BASE_INFO_KEY),
localforage.getItem<XmScaleState>(props.dbKey)
])
const baseInfo = await localforage.getItem<XmBaseInfoState>(BASE_INFO_KEY)
activeIndustryId.value =
typeof baseInfo?.projectIndustry === 'string' ? baseInfo.projectIndustry.trim() : ''
if (!activeIndustryId.value) {
detailDict.value = []
return
}
const filteredEntries = majorEntries.filter(([id]) => isMajorIdInIndustryScope(id, activeIndustryId.value))
detailDict.value = buildDetailDict(filteredEntries)
if (!activeIndustryId.value) {
detailRows.value = []
roughCalcEnabled.value = false
applyPinnedTotalAmount(api, null)
return
}
const data = await localforage.getItem<XmScaleState>(props.dbKey)
const filteredEntries = majorEntries.filter(([id]) =>
isMajorIdInIndustryScope(id, activeIndustryId.value)
)
detailDict.value = buildDetailDict(filteredEntries)
roughCalcEnabled.value = data?.roughCalcEnabled || false
const pinnedTopNode = gridApi.getPinnedTopRow(0)
if (pinnedTopNode) {
pinnedTopNode.setDataValue('amount', data?.totalAmount || null)
}
//
if (data?.detailRows) {
detailRows.value = mergeWithDictRows(data.detailRows)
roughCalcEnabled.value = Boolean(contractData?.roughCalcEnabled)
applyPinnedTotalAmount(api, contractData?.totalAmount)
if (contractData?.detailRows) {
detailRows.value = mergeWithDictRows(contractData.detailRows)
return
}
if (props.xmInfoKey) {
// 首次创建合同段时,默认继承项目规模信息(同一套专业字典,按 id 对齐)
const xmData =
(await localforage.getItem<XmScaleState>(props.xmInfoKey))
roughCalcEnabled.value = xmData?.roughCalcEnabled || false
if (pinnedTopNode) {
pinnedTopNode.setDataValue('amount', xmData?.totalAmount || null)
}
const xmData = await localforage.getItem<XmScaleState>(props.xmInfoKey)
roughCalcEnabled.value = Boolean(xmData?.roughCalcEnabled)
applyPinnedTotalAmount(api, xmData?.totalAmount)
if (xmData?.detailRows) {
detailRows.value = mergeWithDictRows(xmData.detailRows)
detailRows.value = mergeWithDictRows(xmData.detailRows.map(e => ({...e,
amount: null,
landArea: null
})))
return
}
}
detailRows.value = buildDefaultRows()
saveToIndexedDB()
void saveToIndexedDB()
} catch (error) {
console.error('loadFromIndexedDB failed:', error)
activeIndustryId.value = ''
detailRows.value = []
roughCalcEnabled.value = false
applyPinnedTotalAmount(api, null)
}
}
@@ -406,17 +410,19 @@ const setDetailRowsHidden = (hidden: boolean) => {
}
}
let oldValue:number|null
const onRoughCalcSwitch = (checked: boolean) => {
gridApi.value?.stopEditing(true)
roughCalcEnabled.value = checked
setDetailRowsHidden(checked)
if (!checked) {
oldValue=pinnedTopRowData.value[0].amount
syncPinnedTotalForNormalMode()
} else {
pinnedTopRowData.value[0].amount = null
pinnedTopRowData.value[0].amount = oldValue
const pinnedTopNode = gridApi.value?.getPinnedTopRow(0)
if (pinnedTopNode) {
pinnedTopNode.setDataValue('amount', null)
pinnedTopNode.setDataValue('amount', oldValue)
}
}
schedulePersist()