src/views/elderly/assess/synthetic-ability/Form.vue
disabled,不可编辑:
selectElder 的 @elder 事件(即 getElderInfoById)回填,保持数据来自长者信息。src/views/elderly/assess/synthetic-ability/Print.vue
getElderInfoById。open(id) 时,先拉取评估记录,再用 res.elderId 调用长者信息接口。res.elder 仅作为兜底。vue-tsc --noEmit 全量类型检查:本次改动的两个文件区域无新增报错;synthetic-ability 目录下的历史 {}/never 类型报错为既有问题,与本次改动无关。用户指出 v-show="scope.status == 0 && scope.questionnaireType != 2" 仅控制「评估」按钮(仅未评估 status==0 可见),评估后无法再改;要求补充「修改」入口并排查隐患。
src/views/elderly/assess/synthetic-ability/index.vue
Table2 新增 :show-edit-condition="() => false",屏蔽内置「编辑」按钮(其 emit('edit') 无 @edit 处理,是死按钮)。#pre 插槽新增「修改」按钮:v-show="scope.status != 0 && scope.questionnaireType != 2",@click="openForm(scope)",权限复用 synthetic-ability:audit。src/views/elderly/assess/synthetic-ability/Form.vue(修两个隐藏 bug)
open(id) 加载记录时,evaluatorDate 改为 保留原评估日期(原 new Date()... 每次编辑都被重置为今天)。submitForm('1') 保存时 obj.status = dataForm.value.status || 1(原硬写 obj.status = 1,会把已签字 status=2 误改回 1)。Form.open(id) 已能按 id 加载记录,submitForm 走 elderlySyntheticAbility/addOrUpdate(upsert),修改链路本来就通,缺的只是列表入口。status 语义:0=未评估(显示「评估」),1=已评估,2=已签字;questionnaireType==2 两类按钮都不显示(保持原行为)。openForm/Form,基础信息字段此前已 disabled(取自长者信息),修改时仍只读,仅评估内容可改。Form.vue 的 open(id) 编辑流程中:
dataForm.value.syntheticAbilityInfoList 被 JSON.parse(res.syntheticAbilityInfoList) 正确解析为数组。res.syntheticAbilityInfoList,它仍是后端返回的 JSON 字符串(不是数组)。.map 方法,执行到 res.syntheticAbilityInfoList.map(...) 时抛出异常,整个 try 块直接跳到 finally,导致第四步模板的答案回填逻辑被跳过,表单显示为空白模板。src/views/elderly/assess/synthetic-ability/Form.vue
open(id) 内新增 parseArr 通用解析函数:兼容 null / 数组 / JSON 字符串 / 对象。syntheticAbilityInfoList 与 processSequenceList,并显式写入 dataForm.value。item.template 存在性保护,避免空指针。parseArr 替代 medicationSituation、absenceOfTeeth、dentureWearingCondition、dysphagia 等字段的原 JSON.parse,避免后端若返回数组时崩溃。上一轮修复后,用户反馈第四步已保存的选项仍未选中。深入排查发现:
res.processSequenceList 本身虽是数组,但内部每个 item.template 字段在后端落库/返回时被二次 JSON 序列化成字符串(或极少数场景下是数组)。item.template.templateName 做匹配:当 item.template 是字符串时,templateName 为 undefined,匹配永远失败,templateProperties 不会被替换成已保存的 evaluationContent,FCForm 只能渲染空模板。item.template.templateName,但保存时 evaluationName 取的是顶层 processSequenceList[index].templateName,存在名字不一致导致匹配失败的风险。src/views/elderly/assess/synthetic-ability/Form.vue
open(id) 中解析 processSequenceList 时,对每个 item.template 做标准化:
JSON.parse 为对象;undefined,避免后续空指针。item.templateName(顶层),兜底 item.template.templateName,与保存时的 evaluationName 来源一致。processSequenceList ref 声明(模板直接使用 dataForm.processSequenceList)。vue-tsc --noEmit:src/views/elderly/assess/synthetic-ability/Form.vue 改动区域无新增类型错误;synthetic-ability/components/FCForm.vue 与 evaluation-process/* 的历史类型报错为既有问题,与本次改动无关。Result.vue 渲染,其中的 推荐护理等级 下拉框绑定的是 Result.vue 自己的 nursingLevel ref,初始值为空字符串。Form.vue 虽然把 res.recommendedNursingLevel 回填到了 dataForm.recommendedNursingLevel(第四步也有同名字段),但从未把这个值传给 Result.vue。submitForm)又只取 resultRef.value.nursingLevel,所以新增时只要第五步选了就能保存;但编辑时第五步的下拉框因为没收到 prop,始终保持为空。src/views/elderly/assess/synthetic-ability/components/Result.vue
recommendedNursingLevel(String,默认空)。watch(() => props.recommendedNursingLevel, ...),在 prop 变化或初始化时同步到 nursingLevel ref,实现回填。src/views/elderly/assess/synthetic-ability/Form.vue
<Result> 组件调用处新增 :recommendedNursingLevel="dataForm.recommendedNursingLevel"。vue-tsc --noEmit:本次改动文件无新增类型错误。recommendedNursingLevel 传给了 Result.vue,但后端返回的是字符串 "13",而 nurseLevelList 中 option 的 :value="n.id" 是数字 13(或相反)。el-select 对 v-model 与 el-option :value 做严格等值比较,类型不一致时匹配失败,组件直接显示原始值(如 13)而不是中文 label。src/views/elderly/assess/synthetic-ability/components/Result.vue
recommendedNursingLevel 类型改为 [String, Number]。watch 中按 String(n.id) === String(val) 查找匹配项,把 nursingLevel 设为匹配项的 id(与 option value 保持同类型),保证 el-select 能正确显示中文 label。nursingLevel ref 类型改为 string | number。vue-tsc --noEmit:本次改动文件无新增类型错误。Result.vue(351) Property 'id' does not exist on type '{}'(props.nurseLevelList 元素类型推断为 {}),改用 (props.nurseLevelList as any[]).find(...) 并 matched as any 断言解决。vue-tsc 通过 node ./node_modules/vue-tsc/bin/vue-tsc.js --noEmit 运行;Git Bash 环境下 grep/head 常缺失,过滤需用绝对路径的 python/node 读 tsc_out.txt(/tmp 在 Windows 不存在,输出应写到项目目录下)。