This commit is contained in:
zwgczx committed 2026-02-25 17:59:10 +08:00
1 parent 5734cfa534
commit 1609f19b9c
14 files changed
+2481 -433

No files matched your search

+58 -64
View File
@@ -3,6 +3,7 @@ import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import { AgGridVue } from 'ag-grid-vue3'
import type { ColDef, GridOptions } from 'ag-grid-community'
import localforage from 'localforage'
import { majorList } from '@/sql'
import 'ag-grid-enterprise'
import {
@@ -37,11 +38,13 @@ const myTheme = themeQuartz.withParams({
dataBackgroundColor: "#fefefe"
});
interface DictLeaf {
id: string
code: string
name: string
}
interface DictGroup {
id: string
code: string
name: string
children: DictLeaf[]
@@ -68,67 +71,59 @@ const DEFAULT_PROJECT_NAME = 'xxx造价咨询服务'
const projectName = ref(DEFAULT_PROJECT_NAME)
const detailRows = ref<DetailRow[]>([])
type MajorLite = { code: string; name: string }
const majorEntries = Object.entries(majorList as Record<string, MajorLite>)
.sort((a, b) => Number(a[0]) - Number(b[0]))
.filter((entry): entry is [string, MajorLite] => {
const item = entry[1]
return Boolean(item?.code && item?.name)
})
const detailDict: DictGroup[] = [
{
code: 'E1',
name: '交通运输工程通用专业',
children: [
{ code: 'E1-1', name: '征地(用海)补偿' },
{ code: 'E1-2', name: '拆迁补偿' },
{ code: 'E1-3', name: '迁改工程' },
{ code: 'E1-4', name: '工程建设其他费' }
]
},
{
code: 'E2',
name: '公路工程专业',
children: [
{ code: 'E2-1', name: '临时工程' },
{ code: 'E2-2', name: '路基工程' },
{ code: 'E2-3', name: '路面工程' },
{ code: 'E2-4', name: '桥涵工程' },
{ code: 'E2-5', name: '隧道工程' },
{ code: 'E2-6', name: '交叉工程' },
{ code: 'E2-7', name: '机电工程' },
{ code: 'E2-8', name: '交通安全设施工程' },
{ code: 'E2-9', name: '绿化及环境保护工程' },
{ code: 'E2-10', name: '房建工程' }
]
},
{
code: 'E3',
name: '铁路工程专业',
children: [
{ code: 'E3-1', name: '大型临时设施和过渡工程' },
{ code: 'E3-2', name: '路基工程' },
{ code: 'E3-3', name: '桥涵工程' },
{ code: 'E3-4', name: '隧道及明洞工程' },
{ code: 'E3-5', name: '轨道工程' },
{ code: 'E3-6', name: '通信、信号、信息及灾害监测工程' },
{ code: 'E3-7', name: '电力及电力牵引供电工程' },
{ code: 'E3-8', name: '房建工程(房屋建筑及附属工程)' },
{ code: 'E3-9', name: '装饰装修工程' }
]
},
{
code: 'E4',
name: '水运工程专业',
children: [
{ code: 'E4-1', name: '临时工程' },
{ code: 'E4-2', name: '土建工程' },
{ code: 'E4-3', name: '机电与金属结构工程' },
{ code: 'E4-4', name: '设备工程' },
{ code: 'E4-5', name: '附属房建工程(房屋建筑及附属工程)' }
]
const detailDict: DictGroup[] = (() => {
const groupMap = new Map<string, DictGroup>()
const groupOrder: string[] = []
const codeLookup = new Map(majorEntries.map(([key, item]) => [item.code, { id: key, ...item }]))
for (const [key, item] of majorEntries) {
const isGroup = !item.code.includes('-')
if (isGroup) {
if (!groupMap.has(item.code)) groupOrder.push(item.code)
groupMap.set(item.code, {
id: key,
code: item.code,
name: item.name,
children: []
})
continue
}
const parentCode = item.code.split('-')[0]
if (!groupMap.has(parentCode)) {
const parent = codeLookup.get(parentCode)
if (!groupOrder.includes(parentCode)) groupOrder.push(parentCode)
groupMap.set(parentCode, {
id: parent?.id || `group-${parentCode}`,
code: parentCode,
name: parent?.name || parentCode,
children: []
})
}
groupMap.get(parentCode)!.children.push({
id: key,
code: item.code,
name: item.name
})
}
]
const codeNameMap = new Map<string, string>()
return groupOrder.map(code => groupMap.get(code)).filter((group): group is DictGroup => Boolean(group))
})()
const idLabelMap = new Map<string, string>()
for (const group of detailDict) {
codeNameMap.set(group.code, group.name)
idLabelMap.set(group.id, `${group.code} ${group.name}`)
for (const child of group.children) {
codeNameMap.set(child.code, child.name)
idLabelMap.set(child.id, `${child.code} ${child.name}`)
}
}
@@ -137,14 +132,14 @@ const buildDefaultRows = (): DetailRow[] => {
for (const group of detailDict) {
for (const child of group.children) {
rows.push({
id: `row-${child.code}`,
id: child.id,
groupCode: group.code,
groupName: group.name,
majorCode: child.code,
majorName: child.name,
amount: null,
landArea: null,
path: [group.code, child.code]
path: [group.id, child.id]
})
}
}
@@ -154,11 +149,11 @@ const buildDefaultRows = (): DetailRow[] => {
const mergeWithDictRows = (rowsFromDb: DetailRow[] | undefined): DetailRow[] => {
const dbValueMap = new Map<string, DetailRow>()
for (const row of rowsFromDb || []) {
dbValueMap.set(row.majorCode, row)
dbValueMap.set(row.id, row)
}
return buildDefaultRows().map(row => {
const fromDb = dbValueMap.get(row.majorCode)
const fromDb = dbValueMap.get(row.id)
if (!fromDb) return row
return {
@@ -238,9 +233,8 @@ const autoGroupColumnDef: ColDef = {
if (params.node?.rowPinned) {
return '总合计'
}
const code = String(params.value || '')
const name = codeNameMap.get(code) || ''
return name ? `${code} ${name}` : code
const nodeId = String(params.value || '')
return idLabelMap.get(nodeId) || nodeId
}
}
@@ -289,6 +283,7 @@ const saveToIndexedDB = async () => {
projectName: projectName.value,
detailRows: JSON.parse(JSON.stringify(detailRows.value))
}
console.log(payload)
await localforage.setItem(DB_KEY, payload)
} catch (error) {
console.error('saveToIndexedDB failed:', error)
@@ -298,7 +293,6 @@ const saveToIndexedDB = async () => {
const loadFromIndexedDB = async () => {
try {
const data = await localforage.getItem<XmInfoState>(DB_KEY)
console.log(data)
if (data) {
projectName.value = data.projectName || DEFAULT_PROJECT_NAME
detailRows.value = mergeWithDictRows(data.detailRows)