|
|
@@ -0,0 +1,392 @@
|
|
|
+const fs = require('fs')
|
|
|
+const path = require('path')
|
|
|
+const { execSync } = require('child_process')
|
|
|
+
|
|
|
+const baseDir = path.resolve(__dirname, '../src/views/elderly/apply/nine-precautions')
|
|
|
+
|
|
|
+const configs = [
|
|
|
+ {
|
|
|
+ dir: 'MMSE',
|
|
|
+ pageApi: 'mmseGetPage',
|
|
|
+ title: 'MMSE认知评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'info'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'anti-entertainment',
|
|
|
+ pageApi: 'entertainmentPage',
|
|
|
+ title: '防文娱活动意外评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'asphyxiation-by-choking',
|
|
|
+ pageApi: 'asphyxiationPage',
|
|
|
+ title: '防噎食评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'attack',
|
|
|
+ pageApi: 'attackRiskPage',
|
|
|
+ title: '攻击风险评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'info'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'commit-suicide',
|
|
|
+ pageApi: 'ngasrPage',
|
|
|
+ title: '自伤自杀风险评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'info'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'communication',
|
|
|
+ pageApi: 'perceptionPage',
|
|
|
+ title: '感知沟通评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'info'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'daily-life',
|
|
|
+ pageApi: 'dailyLifePage',
|
|
|
+ title: '日常生活活动能力评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '结果等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'result'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'empyrosis',
|
|
|
+ pageApi: 'burnPreventionPage',
|
|
|
+ title: '防烫伤评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'equilibrium',
|
|
|
+ pageApi: 'equilibriumPage',
|
|
|
+ title: '平衡能力评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'fall-down',
|
|
|
+ pageApi: 'fallDownPage',
|
|
|
+ title: '跌倒风险评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'fall-prevention-measures',
|
|
|
+ pageApi: 'fallPreventionPage',
|
|
|
+ title: '防坠床评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'pressure-sores',
|
|
|
+ pageApi: 'pressureSoresPage',
|
|
|
+ title: '防压疮评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'nutritional-risk',
|
|
|
+ pageApi: 'nutritionalRiskPage',
|
|
|
+ title: '营养风险评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '量表总分' },
|
|
|
+ { key: 'riskLevelText', title: '评估结果' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'result'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dir: 'wander-away',
|
|
|
+ pageApi: 'wanderAwayPage',
|
|
|
+ title: '防走失风险评估',
|
|
|
+ columns: [
|
|
|
+ { key: 'orgName', title: '机构名称' },
|
|
|
+ { key: 'elderName', title: '长者姓名' },
|
|
|
+ { key: 'assessor', title: '评估人' },
|
|
|
+ { key: 'assessDate', title: '记录日期' },
|
|
|
+ { key: 'assessScore', title: '评估总得分' },
|
|
|
+ { key: 'riskLevelText', title: '风险等级' },
|
|
|
+ { key: 'creator', title: '记录人' }
|
|
|
+ ],
|
|
|
+ riskMode: 'text'
|
|
|
+ }
|
|
|
+]
|
|
|
+
|
|
|
+function buildExportFunction(config) {
|
|
|
+ const { pageApi, title, columns, riskMode } = config
|
|
|
+ const headersStr = JSON.stringify(columns, null, 6)
|
|
|
+ .replace(/"/g, "'")
|
|
|
+ .replace(/\n /g, '\n ')
|
|
|
+
|
|
|
+ let riskLevelProcess = ''
|
|
|
+ if (riskMode === 'info') {
|
|
|
+ riskLevelProcess = `const riskInfo = getRiskLevelInfo(item.assessData)
|
|
|
+ row.riskLevelText = riskInfo.text || '-'`
|
|
|
+ } else if (riskMode === 'text') {
|
|
|
+ riskLevelProcess = `row.riskLevelText = getRiskLevelText(item.riskLevel) || '-'`
|
|
|
+ } else if (riskMode === 'result') {
|
|
|
+ riskLevelProcess = `row.riskLevelText = getResultLevelText(item.riskLevel) || '-'`
|
|
|
+ }
|
|
|
+
|
|
|
+ return `// 打开导出弹窗
|
|
|
+const handleImportCard = async () => {
|
|
|
+ exportLoading.value = true
|
|
|
+ try {
|
|
|
+ const queryP = {
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 9999,
|
|
|
+ elderName: queryParams.elderName,
|
|
|
+ assessor: queryParams.assessor,
|
|
|
+ assessDate: queryParams.assessDate,
|
|
|
+ tenantIds: queryParams.tenantIds
|
|
|
+ }
|
|
|
+ const data = await ${pageApi}(queryP)
|
|
|
+ const exportData = data.list || []
|
|
|
+
|
|
|
+ if (exportData.length === 0) {
|
|
|
+ message.warning('暂无数据可导出')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const processedData = exportData.map((item) => {
|
|
|
+ const row: any = {
|
|
|
+ orgName: findLabelById(userStore.getOrgTenant.options, item.tenantId) || '',
|
|
|
+ elderName: item.elderName || '',
|
|
|
+ assessor: item.assessor || '',
|
|
|
+ assessDate: item.assessDate || '',
|
|
|
+ assessScore: item.assessScore ?? '',
|
|
|
+ creator: item.creator || ''
|
|
|
+ }
|
|
|
+ ${riskLevelProcess}
|
|
|
+ return row
|
|
|
+ })
|
|
|
+
|
|
|
+ const headers = ${headersStr}
|
|
|
+
|
|
|
+ exportWithExpandedObjectArrays(processedData, headers, \`${title}_\${new Date().getTime()}.xlsx\`, '${title}')
|
|
|
+ message.success('导出成功')
|
|
|
+ } catch (error) {
|
|
|
+ console.error('导出失败:', error)
|
|
|
+ message.error('导出失败,请重试')
|
|
|
+ } finally {
|
|
|
+ exportLoading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+`
|
|
|
+}
|
|
|
+
|
|
|
+// 从 git 读取原始文件
|
|
|
+function readOriginal(relativePath) {
|
|
|
+ return execSync(`git show HEAD:${relativePath}`, {
|
|
|
+ cwd: path.resolve(__dirname, '..'),
|
|
|
+ encoding: 'utf-8'
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function removeBlockByRegex(content, regex) {
|
|
|
+ const match = content.match(regex)
|
|
|
+ if (!match) return content
|
|
|
+ const start = match.index
|
|
|
+ let depth = 0
|
|
|
+ let end = start
|
|
|
+ for (let i = start; i < content.length; i++) {
|
|
|
+ if (content[i] === '{') depth++
|
|
|
+ if (content[i] === '}') {
|
|
|
+ depth--
|
|
|
+ if (depth === 0) {
|
|
|
+ end = i + 1
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let before = content.slice(0, start)
|
|
|
+ let after = content.slice(end)
|
|
|
+ // 去掉后面多余的换行
|
|
|
+ if (after.startsWith('\n')) after = after.slice(1)
|
|
|
+ if (after.startsWith('\n')) after = after.slice(1)
|
|
|
+ return before + after
|
|
|
+}
|
|
|
+
|
|
|
+function processFile(config) {
|
|
|
+ const relativePath = `src/views/elderly/apply/nine-precautions/${config.dir}/index.vue`
|
|
|
+ const filePath = path.resolve(__dirname, '..', relativePath)
|
|
|
+ let content = readOriginal(relativePath)
|
|
|
+
|
|
|
+ // 1. 添加 ButtonImport 导入
|
|
|
+ const buttonAddImport = "import ButtonAdd from '@/components/ButtonAdd/src/ButtonAdd.vue'"
|
|
|
+ if (content.includes(buttonAddImport)) {
|
|
|
+ content = content.replace(
|
|
|
+ buttonAddImport,
|
|
|
+ `${buttonAddImport}\nimport ButtonImport from '@/components/ButtonImport/src/ButtonImport.vue'`
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ // nutritional-risk 没有 ButtonAdd import,ButtonAdd 是全局注册的
|
|
|
+ content = content.replace(
|
|
|
+ '<script setup lang="ts">',
|
|
|
+ '<script setup lang="ts">\nimport ButtonImport from \'@/components/ButtonImport/src/ButtonImport.vue\''
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 添加 exportWithExpandedObjectArrays 导入
|
|
|
+ const apiImportMatch = content.match(/import \{[^}]+\} from '@\/api\/social-work'/)
|
|
|
+ if (apiImportMatch) {
|
|
|
+ const insertPos = apiImportMatch.index + apiImportMatch[0].length
|
|
|
+ content = content.slice(0, insertPos) + "\nimport { exportWithExpandedObjectArrays } from '@/utils/excel-export'" + content.slice(insertPos)
|
|
|
+ } else {
|
|
|
+ content = content.replace(
|
|
|
+ '<script setup lang="ts">',
|
|
|
+ '<script setup lang="ts">\nimport { exportWithExpandedObjectArrays } from \'@/utils/excel-export\''
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 添加导出按钮
|
|
|
+ content = content.replace(
|
|
|
+ /<ButtonAdd @click="openForm\(undefined\)"\s*\/>/g,
|
|
|
+ '<ButtonAdd @click="openForm(undefined)" />\n <ButtonImport @click="handleImportCard" />'
|
|
|
+ )
|
|
|
+ // 移除旧的注释导入按钮
|
|
|
+ content = content.replace(/\s*<!--\s*<ButtonImport[^>]*>\s*-->\s*/g, '\n')
|
|
|
+
|
|
|
+ // 4. 移除 BatchExportDialog
|
|
|
+ content = content.replace(
|
|
|
+ /\s*<!-- 通用批量导出弹窗 -->\s*<BatchExportDialog[\s\S]*?<\/BatchExportDialog>/,
|
|
|
+ ''
|
|
|
+ )
|
|
|
+
|
|
|
+ // 5. 移除旧的 handleImportCard / handleBatchExport / handleExport 空壳函数
|
|
|
+ content = removeBlockByRegex(
|
|
|
+ content,
|
|
|
+ /\/\/ 打开导出弹窗\s*const handleImportCard = async \(\) => \{/
|
|
|
+ )
|
|
|
+ content = removeBlockByRegex(
|
|
|
+ content,
|
|
|
+ /\/\/ 处理批量导出\s*const handleBatchExport = async \(batch: number, count: number\) => \{/
|
|
|
+ )
|
|
|
+ content = removeBlockByRegex(
|
|
|
+ content,
|
|
|
+ /const handleExport = \(\) => \{/
|
|
|
+ )
|
|
|
+
|
|
|
+ // 6. 精简状态管理为只保留 exportLoading
|
|
|
+ content = content.replace(
|
|
|
+ /\n\/\/ 状态管理\s*const showBatchExport = ref\(false\)\s*const exportConfig = ref\(\{[\s\S]*?description: \[\] as string\[\]\s*\}\)\s*const exportLoading = ref\(false\)\s*/,
|
|
|
+ '\nconst exportLoading = ref(false)\n'
|
|
|
+ )
|
|
|
+
|
|
|
+ // 7. 插入新的 handleImportCard 函数
|
|
|
+ const exportFunc = buildExportFunction(config)
|
|
|
+ const queryFormRefPattern = /const queryFormRef = ref\(\)\s*\/\/ 搜索的表单/
|
|
|
+ if (queryFormRefPattern.test(content)) {
|
|
|
+ content = content.replace(queryFormRefPattern, `const queryFormRef = ref() // 搜索的表单\n\n${exportFunc}`)
|
|
|
+ } else {
|
|
|
+ content = content.replace(
|
|
|
+ /const queryFormRef = ref\(\)\s*$/m,
|
|
|
+ `const queryFormRef = ref()\n\n${exportFunc}`
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ fs.writeFileSync(filePath, content, 'utf-8')
|
|
|
+ console.log(`已处理:${filePath}`)
|
|
|
+}
|
|
|
+
|
|
|
+configs.forEach(processFile)
|