fix
This commit is contained in:
1 parent
626513bc21
commit
c482faacbf
9 files changed
+198
-47
No files matched your search
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user