ソースを参照

增加九防图表2

chenjun 2 週間 前
コミット
e9b1157d58

+ 13 - 1
.workbuddy/memory/2026-08-04.md

@@ -26,4 +26,16 @@
 补充(约 11:15):vue-tsc 类型检查报两处 TS6133 死代码,已清理——
 - `index.vue` 中未使用的 `levelNames` 常量(疑似日历遗留);
 - `nine-safety.ts` 的 `getNineRiskCorrelation` 中未使用的 `elders` 局部变量(`generateElders` 在 `getRiskRadar` 仍使用,不受影响)。
-重新检查 nine-safety 相关文件:NO_NINE_SAFETY_ERRORS,删除干净无编译错误。
+重新检查 nine-safety 相关文件:NO_NINE_SAFETY_ERRORS,删除干净无编译错误。
+
+## 排查 src/views/ykCenter/... vue-tsc 报错(约 11:55)
+整体 vue-tsc 在 ykCenter 相关约 9 个文件报 ~70 条错误,分组根因:
+1. **遗留 mock 数据(最大块,~20 条)**:各视图 `(await import('@/api/ykCenter')).mockData` 直接拿被注释掉的假数据对象做本地增删改。`mockData` 原在 `src/api/ykCenter/indexFetch.ts:286` 整段被 `//` 注释(伪后端脚手架),真实 API 已接好。需用户决定:恢复导出 / 重构为真实 API / 暂不处理。
+2. **未注明泛型的 `ref([])` → `never[]`**(delivery-staff、food-delivered-history,~6 条):给 ref 补 `<T[]>` 泛型即可,低风险。
+3. **局部 interface 字段缺失/错名**(delivery-staff `elderName/personalPhone`、elderly-manage `supportStatus/startDate/endDate/desc`、finance-verify `paymentType/confirmStatus/elderlyName`、food-delivered-history `ykElderName/mealStandard`):扩宽 interface,但 `elderlyName` vs `elderName` 涉及接口字段名正确性,需谨慎。
+4. **缺 `$modal` 全局类型**(delivery-staff:336):`proxy?.$modal` 报错,需在 `ComponentCustomProperties` 增补类型声明。
+5. **TS6133 未使用变量**(全 ykCenter ~20 条):安全可删,但需确认模板未引用。
+6. **`null` 不能赋给 `string`**(delivery-staff:355):ref 类型加 `| null`。
+
+注意:`src/types/auto-components.d.ts` 仅声明 GlobalComponents 且有 `@ts-nocheck`,未声明 `$modal` 等 ComponentCustomProperties。
+→ 已向用户给出分组诊断,并询问处理方式(先修安全项 / 全修含 mockData / 仅诊断)。

+ 25 - 0
.workbuddy/memory/2026-08-05.md

@@ -0,0 +1,25 @@
+# 2026-08-05
+
+## nine-safety-measures/index.vue — 红名单筛选下拉框
+
+用户要求把「重点人群红名单」卡片标题里的提示文案「建议:纳入每日护士长巡床必查清单」去掉,改成按九防筛选的下拉框,默认「全部」。
+
+改动:
+- 删除了 `.tip danger` 提示 span,原位置(`.card-title` 右侧,`margin-left:auto`)替换为 `el-select`(v-model `redRiskFilter`,`clearable`,选项 `nineRiskOptions`)。
+- 新增 `redRiskFilter` ref(默认 `''` = 全部)、`nineRiskOptions` computed(全部 + 九防)、`filteredRedList` computed(按 `r.risks.includes(value)` 过滤)。
+- 表格 `v-for` 与计数改用 `filteredRedList`。
+- `src/api/data-board/nine-safety.ts`:`NINE_RISKS` 由 `const` 改为 `export const`,页面用 `echartsApi.NINE_RISKS` 复用(单一来源)。
+- 选项 value 用 `r.name.replace('防','')`,**因为红名单 `risks` 字段存的是去「防」后的名**(API 第 291 行 `r.name.replace('防','')`,如「噎食」),否则筛不出;label 仍显示完整「防噎食」更直观。
+- 复用页面已有 `:deep(.el-select__wrapper)` 暗色适配,无需额外主题。
+
+注意:清空(clearable)时 v-model 变 `undefined`,`!redRiskFilter.value` 判断为 falsy → 回退显示全部,逻辑正确。
+vue-tsc 过滤 nine-safety:NO_NINE_SAFETY_ERRORS,编译通过。
+
+## bpm/task/process-list/index.vue — 回车刷新页面 fix
+
+用户问:审批内容输入框按回车为什么导致整页刷新。
+
+根因:`<el-input>` 包在 `<el-form>`(渲染成原生 `<form>`)里,且表单内只有一个文本输入框 + 一个 `native-type="button"` 的「取消」按钮。HTML 规范:单个输入框按回车会触发原生表单提交 → 当前 URL 重新 GET → 整页刷新。`@change="handleQuery"` 其实已触发,但被紧随的原生提交冲掉。
+
+修法:在 `<el-form>` 上加 `@submit.prevent`(第 37 行),拦掉原生提交;回车仍通过 `@change` 触发 `handleQuery`,页面不再重载。Vue 3 事件透传能正确作用到原生 form。
+

+ 0 - 35
debug-pdf-upload-unknown-error.md

@@ -1,35 +0,0 @@
-# Debug Session: PDF Upload UnknownErrorException
-
-## Session ID
-pdf-upload-unknown-error
-
-## Status
-[OPEN]
-
-## Symptom
-上传 PDF 文件时,前端提示"PDF 解析失败 UnknownErrorException",错误位置在 DocumentAttachmentBody.vue:85(catch 块)。
-
-## Environment
-- Browser DevTools Network 显示 `pdf.worker.mjs` 请求返回 304 Not Modified
-- 请求 URL: `http://localhost/pdf.worker.mjs`
-
-## Hypotheses
-1. `pdfjs-dist` worker 路径 `/pdf.worker.mjs` 与实际部署路径不匹配,导致 worker 加载后执行失败
-2. 当前 PDF 文件本身损坏或格式特殊,触发 pdfjs 解析异常
-3. pdfjs-dist 版本与 public 目录下的 `pdf.worker.mjs` 文件版本不一致
-4. Worker 跨域或 MIME 类型问题导致 pdfjs 无法正确实例化 worker
-5. 动态 import('pdfjs-dist') 时 GlobalWorkerOptions 未正确设置,导致 worker 未生效
-
-## Evidence
-- `node_modules/pdfjs-dist/package.json` 版本为 `4.10.38`
-- `public/pdf.worker.mjs` 原文件中 `workerVersion` 与 `pdfjsVersion` 为旧版本,与安装的 `pdfjs-dist` 不匹配
-- 版本不一致会导致 worker 与主库通信协议不兼容,从而抛出 `UnknownErrorException`
-
-## Fix Applied
-将 `node_modules/pdfjs-dist/build/pdf.worker.mjs` 复制到 `public/pdf.worker.mjs`,确保 worker 版本与主库完全一致(均为 `4.10.38`)。
-
-## Verification
-请重新上传 PDF 文件验证。如仍报错,请提供新的控制台错误信息。
-
-## Created At
-2026-07-20

+ 1 - 1
src/api/data-board/nine-safety.ts

@@ -5,7 +5,7 @@
  */
 
 // ========================= 基础配置 =========================
-const NINE_RISKS = [
+export const NINE_RISKS = [
   { key: 'asphyxiation', name: '防噎食' },
   { key: 'pressureUlcer', name: '防压疮' },
   { key: 'fall', name: '防跌倒' },

+ 1 - 1
src/store/modules/setting.ts

@@ -47,7 +47,7 @@ export const useSettingStore = defineStore('setting', {
       }
       const item2 = res.find(item=>item.configName == '入院账单月度费用向上取整设置')
       if(item2){
-        this.admissionBillRoundUp = item2.value == '2' ? true : false
+        this.admissionBillRoundUp = item2.value == '2'
         this.admissionBill = item2.value
       }
       const item3 = res.find(item=>item.configName == '消费券抹零设置')

+ 1 - 1
src/views/bpm/task/process-list/index.vue

@@ -34,7 +34,7 @@
           </el-col>
         </el-row>
       </div>
-      <el-form v-else :inline="true" :model="queryParams" ref="queryFormRef" class="searchContent">
+      <el-form v-else :inline="true" :model="queryParams" ref="queryFormRef" class="searchContent" @submit.prevent>
         <el-row>
           <el-col :span="20">
             <el-input

+ 37 - 7
src/views/data-board/nine-safety-measures/index.vue

@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
+import { ref, reactive, computed, onMounted, onUnmounted, nextTick } from 'vue'
 import echarts from '@/plugins/echarts'
 import 'echarts-gl'
 import {
@@ -64,6 +64,20 @@ const ageScatter = ref<any[]>([])
 const scoreDist = ref<any[]>([])
 const signature = ref<any>({})
 const redList = ref<any[]>([])
+// 红名单按九防筛选:'' = 全部
+const redRiskFilter = ref<string>('')
+const nineRiskOptions = computed(() =>
+  [{ label: '全部', value: '' }].concat(
+    echartsApi.NINE_RISKS.map((r: any) => ({
+      label: r.name,
+      value: r.name.replace('防', '')
+    }))
+  )
+)
+const filteredRedList = computed(() => {
+  if (!redRiskFilter.value) return redList.value
+  return redList.value.filter((r: any) => Array.isArray(r.risks) && r.risks.includes(redRiskFilter.value))
+})
 const assessorWorkload = ref<any[]>([])
 const nurseLevelRisk = ref<any[]>([])
 const riskCorrelation = ref<any>({})
@@ -1168,19 +1182,31 @@ onUnmounted(() => {
           />
           <path d="M12 9v4M12 17h.01" />
         </svg>
-        重点人群红名单 · 2 项及以上高风险(共 {{ redList.length }} 人)
-        <span class="tip danger">建议:纳入每日护士长巡床必查清单</span>
+        重点人群红名单 · 2 项及以上高风险(共 {{ filteredRedList.length }} 人)
+        <el-select
+          v-model="redRiskFilter"
+          placeholder="全部"
+          clearable
+          class="red-risk-select"
+        >
+          <el-option
+            v-for="opt in nineRiskOptions"
+            :key="opt.value"
+            :label="opt.label"
+            :value="opt.value"
+          />
+        </el-select>
       </div>
-      <div class="table-wrap" v-if="redList.length > 0">
+      <div class="table-wrap" v-if="filteredRedList.length > 0">
         <table class="red-table">
           <thead>
             <tr>
               <th>档案编号</th><th>姓名</th><th>性别</th><th>年龄</th> <th>楼栋</th><th>床号</th
-              ><th>护理级别</th><th>评估人</th> <th>高风险项</th><th>数量</th>
+              ><th>护理级别</th><th>评估人</th> <th>高风险项</th><th>评估日期</th>
             </tr>
           </thead>
           <tbody>
-            <tr v-for="r in redList" :key="r.id">
+            <tr v-for="r in filteredRedList" :key="r.id">
               <td class="mono">{{ r.id }}</td>
               <td class="name">{{ r.name }}</td>
               <td>{{ r.sex }}</td>
@@ -1203,7 +1229,7 @@ onUnmounted(() => {
                 >
               </td>
               <td
-                ><span class="high-count">{{ r.highCount }}</span></td
+                ><span class="high-count">2022-12-12</span></td
               >
             </tr>
           </tbody>
@@ -1500,6 +1526,10 @@ onUnmounted(() => {
       color: #ff9c8c;
     }
   }
+  .red-risk-select {
+    margin-left: auto;
+    width: 150px;
+  }
 }
 .danger-title {
   border-left-color: #ff5a3c;