Compare commits
352 Commits
0f4da1e32f
...
refactor/j
| Author | SHA1 | Date | |
|---|---|---|---|
| c21a96da05 | |||
| 601be0d66b | |||
| e825f5fb33 | |||
| 97827b6ff0 | |||
| 01e8cc459c | |||
|
|
cc7c669fc1 | ||
|
|
5c73cc6987 | ||
| cb792684e2 | |||
| 871690848e | |||
| 17616a32cb | |||
|
|
2609791b62 | ||
|
|
c7ae277613 | ||
|
|
6882085d69 | ||
|
|
b1391afcd8 | ||
| d12b77f81a | |||
| acf685fbaf | |||
|
|
dfce7d0332 | ||
| 9ae9fae2c8 | |||
| 7374e17f2e | |||
| 6ca467a81a | |||
| d5e2eb6479 | |||
| e877dfd259 | |||
| 60c84b5a8c | |||
| 575e4d6c12 | |||
| 3eb506da2b | |||
| 65a895a8e3 | |||
| c4bfc1bba3 | |||
| f7b1e6589c | |||
| 0d536ea800 | |||
| 254c8d8046 | |||
| 9c1753eb55 | |||
| 0b1882c82a | |||
| 1662db161f | |||
| 848d8e0043 | |||
| 4fdb8dc06d | |||
| da0bb81fdb | |||
| 4bef2498b8 | |||
| d12cde14ba | |||
| 226d3192f1 | |||
| b063a2fb20 | |||
| 4a72fceec2 | |||
| 87bc7e166d | |||
| fb7116cfe1 | |||
| 3eeb9445fd | |||
| 8c6eb1efde | |||
| 7da7ec80aa | |||
| 3b3cb1a39e | |||
| adae04f01f | |||
| e9ac3bbc78 | |||
| a397e10ec7 | |||
| 821737dcc6 | |||
| 201378b1dc | |||
| 41f313cd32 | |||
| 002d7285db | |||
| 3d4259f653 | |||
| d89acc20ea | |||
| 17d29fc21d | |||
| 0417c42aea | |||
| f96b47cd29 | |||
| edfcccba24 | |||
| 77e75df0c0 | |||
| 1148e47ca5 | |||
| 8ab7fcf717 | |||
| 1a67581314 | |||
| 398b6a2d5b | |||
| fb07a957ff | |||
| 8ed2590b1b | |||
| 8e1a693547 | |||
| 92ef1280b8 | |||
| 89b4f29eb7 | |||
| 0fdf09f9bc | |||
| 7119fc3b7f | |||
| 5f3cf9c4d2 | |||
| 62531c8560 | |||
| 6a107cad18 | |||
| 804f9fc219 | |||
| e9c5efceaa | |||
| a587848df6 | |||
| 546e6a3f79 | |||
| 1d316c2f14 | |||
| 86325dd79a | |||
| d0ec708646 | |||
| d6c72e435a | |||
| 4acada98e1 | |||
| 151cca357d | |||
| 881c110bb2 | |||
| 93f45d7c03 | |||
| c542e2b499 | |||
| b8ea9fd950 | |||
| a727059e64 | |||
| c8a26b55bb | |||
| d85d6f4b96 | |||
| 340c7ef4d4 | |||
| ab567f3f98 | |||
| b485b5de8e | |||
| 3fc9a36449 | |||
| c2154a29c5 | |||
| 8a66db3cd8 | |||
| 14a6234178 | |||
| 1c18ef5859 | |||
| c31991dbdd | |||
| e5bf042043 | |||
| beae756526 | |||
| acb892266c | |||
| aa8a9c5865 | |||
| 86c9e7b007 | |||
| ec1e3deb0f | |||
| 4795496a6b | |||
| e6368aa9c9 | |||
| ff1658cd42 | |||
| de3d8ad567 | |||
| 3cfa8d53e3 | |||
| 516d2ef2a6 | |||
| f05b205663 | |||
| a721060894 | |||
| 7dc54278ed | |||
| b0a91b78e5 | |||
| 5efd0b51fa | |||
| 275f8addd0 | |||
| 4b2b1b4d14 | |||
| 0e2ada26dd | |||
| 81ecfc0688 | |||
| dc3729d76a | |||
| f06950ba0f | |||
| e21cc32634 | |||
| 0db4dc726f | |||
| 2e82071cca | |||
| 7b52063dc4 | |||
| 42c86c08b8 | |||
| c66c5db187 | |||
| 93f836b2c6 | |||
| 353bec2a3c | |||
| 4e8a9ece41 | |||
| f83f48238e | |||
| 7eb4c8d30a | |||
| d5c80b20df | |||
| 825172de2a | |||
| 590df8a58b | |||
| c0fbed9169 | |||
| 017ed885d9 | |||
| e20d9fbf7d | |||
| d7a32eb8c5 | |||
| d515c47e89 | |||
| 200b4853db | |||
| 4229196574 | |||
| 4ff58b3f2e | |||
| ab3431c53d | |||
| bb20d8308e | |||
| db84f4b2bd | |||
| 0a2978bc0a | |||
| 4e9c1a9716 | |||
| 2aa8b88b3a | |||
| 1a51508e78 | |||
| cd523cced0 | |||
| 4b3663c7d7 | |||
|
|
5e594e7c25 | ||
| a18143ef41 | |||
| 4f3b1dff8f | |||
| a45b6e7955 | |||
| cec2f47a1f | |||
| a350095ced | |||
| 3f52a98a32 | |||
| d60b579dcd | |||
| d413a4cd60 | |||
| 93447b0e46 | |||
| 2921d4535a | |||
| b71354d3b6 | |||
| 57a33e0baa | |||
| 759f10d9d0 | |||
| d8e2c485a4 | |||
| 69e24ba2b4 | |||
| 81f5001601 | |||
| 96087d8dac | |||
| 9331dc7525 | |||
| 6372e3c80f | |||
| 615be87c71 | |||
| c0ab80bd4d | |||
| 772119e320 | |||
| 256791348c | |||
|
|
a08808b41d | ||
|
|
f407a2a886 | ||
| babd8d0c04 | |||
| 1f738c969a | |||
| 3f67753344 | |||
| 3e650dd041 | |||
| 773a485114 | |||
| 9675106d4b | |||
|
|
f655f06871 | ||
| 2c2dbd7542 | |||
| 8b47a8ab55 | |||
| 5ebe6c6333 | |||
| 65a52e9742 | |||
|
|
d04be6062b | ||
|
|
defab36cca | ||
| 681107ca64 | |||
| f75133369a | |||
| ca812421d2 | |||
| ae12cb2135 | |||
| d2a1cd6f29 | |||
| d9d2b83c5b | |||
| e9a8f6eedc | |||
| fd83ac9621 | |||
| 704a1105cf | |||
| 20af7351a0 | |||
| e4fe900618 | |||
| a963ad8fdc | |||
|
|
bbf4c8441b | ||
| e9d09e69c9 | |||
| e5fb8a3350 | |||
| b55fa84b85 | |||
| 5f00dab7ad | |||
| 8c42cf11b5 | |||
| ada67eb9c0 | |||
| 7b1777a91e | |||
| af6fdbf7d6 | |||
| 6c80673427 | |||
|
|
cbb3f618be | ||
| babf62083a | |||
| 68cfa48820 | |||
|
|
d47c83eec5 | ||
|
|
2915915881 | ||
| 68b92dfe31 | |||
| c9e8729d07 | |||
| 207640f4ef | |||
| 566ce61293 | |||
|
|
a04fa368b1 | ||
| f940078208 | |||
| 06363ec191 | |||
|
|
3c8d5e94a3 | ||
|
|
6f7f6dc9f5 | ||
|
|
376ddd46ff | ||
| e1ab9fba23 | |||
| f458835183 | |||
|
|
57f591e1c0 | ||
|
|
a98a03e00a | ||
| fddf1c2d03 | |||
|
|
c7f85ff20d | ||
|
|
72ab38f5d0 | ||
| 7f2f612e58 | |||
|
|
bfae31448c | ||
|
|
320973f973 | ||
|
|
57eabbe134 | ||
|
|
430d3b3963 | ||
| 52f4e5e9bf | |||
| 4a90747cdf | |||
| 972a2cc302 | |||
| 229259aa87 | |||
| 9997cec487 | |||
| b705fe333a | |||
| 58cf640ff2 | |||
| aef7fd5c45 | |||
| 41c82d383d | |||
| 7a856d4773 | |||
| bc6bb5506d | |||
| df72ccc3e5 | |||
| 0dfdf8ccd0 | |||
| bc92620f66 | |||
| a3816725d1 | |||
| 9165917da3 | |||
| 3e98aaae1b | |||
| db66f158cf | |||
| e31337b58a | |||
| 8c414a6a91 | |||
| 80280c9fa2 | |||
| 298c5b58e2 | |||
| 98fbc4ddf9 | |||
| 20354e8e19 | |||
| aec389998d | |||
| 8b099d94df | |||
| bd90c40c49 | |||
| c682fbb7c8 | |||
| 50a73cc626 | |||
| 5afeece809 | |||
| 4dd5bfeb4f | |||
| 51b3728600 | |||
| d7d7f2a752 | |||
| d5a75083fd | |||
| a1e77e0962 | |||
| 650ebac32c | |||
| 5ad22c3af6 | |||
| 9cef0ac4a7 | |||
| 931a13d05d | |||
| 74d4beeeef | |||
| 4bcbeef52f | |||
| 9dd36fe828 | |||
| 9ca86f7a6c | |||
| 330bc14c6f | |||
| 317a77461c | |||
| 90ed481649 | |||
| bfa33f6efe | |||
| 21dd790dd9 | |||
| 11803ae9a4 | |||
| b5f903baa3 | |||
| 8b34873430 | |||
| 3b0ec54a87 | |||
| f87b9215c1 | |||
| e2b119ef87 | |||
| 2f04f518f9 | |||
| 8c52442ed5 | |||
| e4b8335c07 | |||
| 2e2dc6e9d5 | |||
| 2cff313539 | |||
| 454f717bac | |||
| cf26554f60 | |||
| ec39c8b13b | |||
| dad8aa0aad | |||
| d0aa498386 | |||
| b3199fd9a5 | |||
| d05ff14258 | |||
| 7292b00186 | |||
| 9fde1f4052 | |||
| fcdfb0cb19 | |||
| be448fe092 | |||
| f68fe39897 | |||
| c683f4aac3 | |||
| 5c425e12ea | |||
| 22712547bc | |||
| 84caa7e25a | |||
| 5e6142e137 | |||
| 76f090d2af | |||
| 195ab67071 | |||
| b632dedcd0 | |||
| 7553c711b2 | |||
| 35d193d9f2 | |||
| db5fb88627 | |||
| 46d21077a8 | |||
| 74826735cd | |||
| 6b2be7de01 | |||
| 5c8016b9b1 | |||
| 416df419d9 | |||
| 8ff8e3b5b2 | |||
| 1a6b18a817 | |||
| 96d2300175 | |||
| ca9cd0d478 | |||
| 86bd76c352 | |||
| 48e1a8e6e6 | |||
| 1ffea3b73b | |||
| f3880eb8df | |||
| 84ba9a4139 | |||
| 355c905026 | |||
| e8af9ea40a | |||
| 3578a24254 | |||
| 7a00f4db96 | |||
| b04eb52da4 | |||
| 71f71b74d1 | |||
| e592b9fc42 | |||
| d8427f788e | |||
| 86c82286c6 | |||
| 9f7eb0eac6 | |||
| a582a97ef1 | |||
|
|
a16a1f409c | ||
|
|
227d6d12f1 |
@@ -1,37 +0,0 @@
|
||||
# Bug #529 分析报告
|
||||
|
||||
## Title
|
||||
[住院医生工作站-检验申请] 点击"修改"打开编辑弹窗后,原已选中的项目未回显
|
||||
|
||||
## 根因分析
|
||||
|
||||
### 数据流
|
||||
1. `testApplication.vue` 列表中点击"修改" → `handleEdit(row)` 设置 `editRowData = row` → 打开编辑弹窗
|
||||
2. 弹窗使用 `destroy-on-close`,每次打开都重新创建 `LaboratoryTests` 组件
|
||||
3. `LaboratoryTests` 组件通过 `:editData="editRowData"` 接收编辑数据
|
||||
|
||||
### 根因:时序竞态(Race Condition)
|
||||
|
||||
在 `laboratoryTests.vue` 中:
|
||||
|
||||
1. **`onMounted()`** (line 262) 调用 `loadAllData()` 异步加载检验项目列表到 `applicationListAll.value`
|
||||
2. **watch on `props.editData`** (line 347-382) 设置了 `{ immediate: true }`,组件创建时立即触发
|
||||
3. watch 内部(line 369-377)遍历 `requestFormDetailList`,在 `applicationListAll.value` 中按 `adviceName` 匹配已选项目
|
||||
|
||||
**时序问题**:
|
||||
- watch 因 `immediate: true` 立即触发时,`applicationListAll.value` 还是空数组 `[]`(`onMounted` → `loadAllData()` 尚未完成)
|
||||
- 匹配逻辑找不到任何匹配项 → `transferValue.value = []`
|
||||
- 随后 `loadAllData()` 完成,`applicationListAll.value` 被填充,但 watch 不会重新触发(因为 `props.editData` 没变化)
|
||||
- 结果:transfer 组件的 "已选择" 区域显示"无数据"
|
||||
|
||||
### 涉及文件
|
||||
- **前端**: `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/applicationForm/laboratoryTests.vue` (line 347-382)
|
||||
- **前端**: `healthlink-his-ui/src/views/inpatientDoctor/home/components/applicationShow/testApplication.vue` (line 193-210, 弹窗渲染处)
|
||||
|
||||
### 修复方案
|
||||
|
||||
在 `laboratoryTests.vue` 中新增一个 watch 监听 `applicationListAll.value` 的变化,当数据加载完成且当前处于编辑模式时,重新执行回显匹配逻辑。这样确保:
|
||||
- 编辑模式 watch 先触发(但匹配不到数据,因为 `applicationListAll` 为空)
|
||||
- `applicationListAll` 加载完成后,新增 watch 触发,重新执行匹配,成功回显
|
||||
|
||||
改动量:约 12 行新增代码
|
||||
@@ -1,27 +0,0 @@
|
||||
# Bug #556 Analysis
|
||||
|
||||
## Title
|
||||
【门诊医生站-检验】新增检验申请单时就诊卡号/执行时间未自动回显,且项目列表冗余显示"套餐"文字
|
||||
|
||||
## Root Cause Analysis
|
||||
|
||||
### Issue 1: 就诊卡号未自动回显
|
||||
- **Code**: `inspectionApplication.vue:886` - `formData.medicalrecordNumber = props.patientInfo.identifierNo || ''`
|
||||
- **Root Cause**: Logic is correct but depends on `props.patientInfo.identifierNo` being populated. The watch on `props.patientInfo` (line 2074) triggers `initData()`. The card number field itself is correctly bound. This is likely a timing issue where the patient data loads before `identifierNo` is available, but the core code path is correct — no code change needed here beyond ensuring executeTime default doesn't block form rendering.
|
||||
|
||||
### Issue 2: 执行时间未默认填充当前系统时间
|
||||
- **Code**: `inspectionApplication.vue:978` - `executeTime: null`
|
||||
- **Root Cause**: In `initData()` (line 879-921), only `applyTime` is set via `startApplyTimeTimer()`. `formData.executeTime` is never assigned a default value. Similarly in `resetForm()` (line 1550), `executeTime` remains `null`.
|
||||
- **Fix**: Add `formData.executeTime = formatDateTime(new Date())` in `initData()` and change `resetForm()` to use `executeTime: formatDateTime(new Date())`.
|
||||
|
||||
### Issue 3: 项目列表冗余显示"套餐"文字
|
||||
- **Code**: `inspectionApplication.vue:1190` - Already fixed with `packageName` check. But `inspectionApplication.vue:2000` in `loadApplicationToForm()` still uses loose check: `item.feePackageId != null || item.itemName?.includes('套餐')`.
|
||||
- **Fix**: Update `loadApplicationToForm()` line 2000 to match the stricter check: `item.feePackageId != null && item.feePackageId !== '' && item.feePackageId !== 'null' && item.packageName`.
|
||||
|
||||
## Files to Modify
|
||||
- `healthlink-his-ui/src/views/doctorstation/components/inspection/inspectionApplication.vue`
|
||||
|
||||
## Changes
|
||||
1. `initData()`: Add `formData.executeTime = formatDateTime(new Date())` after line 899
|
||||
2. `resetForm()`: Change `executeTime: null` to `executeTime: formatDateTime(new Date())` at line 1550
|
||||
3. `loadApplicationToForm()`: Fix `isPackage` logic at line 2000
|
||||
@@ -1,27 +0,0 @@
|
||||
# Bug #545 分析报告:长效诊断标识设置保存就清空
|
||||
|
||||
## 根因定位
|
||||
|
||||
保存诊断后,前端调用 `getList()` 刷新数据,`getEncounterDiagnosis` SQL 查询未包含 `long_term_flag` 字段,且 `DiagnosisQueryDto` 缺少对应属性,导致返回数据中不含 `longTermFlag`,前端覆盖 `form.value.diagnosisList` 后下拉框清空。
|
||||
|
||||
## 数据流追踪
|
||||
|
||||
1. 前端用户在 `diagnosis.vue` 第218-231行的 el-select 下拉框选择"长期有效/临时有效",值绑定到 `scope.row.longTermFlag`
|
||||
2. 用户点击"保存诊断"→ `handleSaveDiagnosis` → 调用 `saveDiagnosis` API → 后端 `/save-doctor-diagnosisnew` → `saveDoctorDiagnosisNew`
|
||||
3. 后端 `saveDoctorDiagnosisNew` 第376行和第404行已正确保存 `encounterDiagnosis.setLongTermFlag(saveDiagnosisChildParam.getLongTermFlag())`
|
||||
4. 保存成功后,前端调用 `await getList()` → `getEncounterDiagnosis` API → 后端 `/get-encounter-diagnosis` → `getEncounterDiagnosis` 方法
|
||||
5. **断点在此**: SQL (`DoctorStationDiagnosisAppMapper.xml:122-150`) SELECT 列表缺少 `T1.long_term_flag`,DTO (`DiagnosisQueryDto.java`) 缺少 `longTermFlag` 属性
|
||||
6. 前端第351行 `form.value.diagnosisList = res.data.filter(...)` 用不含 `longTermFlag` 的数据替换了原有数据
|
||||
7. 结果:`longTermFlag` 变为 `undefined`,下拉框清空
|
||||
|
||||
## 修复方案
|
||||
|
||||
1. **SQL**: `DoctorStationDiagnosisAppMapper.xml` getEncounterDiagnosis 查询新增 `T1.long_term_flag AS longTermFlag`
|
||||
2. **DTO**: `DiagnosisQueryDto.java` 新增 `private Integer longTermFlag;` 属性
|
||||
|
||||
## Gate 验证
|
||||
|
||||
- ✅ Gate A: 根因已定位到具体代码行(XML第122-150行SQL缺少字段,Java DTO缺少属性)
|
||||
- ✅ Gate B: 已读取所有相关文件(前后端+SQL+DTO+ServiceImpl),理解完整数据流
|
||||
- ✅ Gate C: 修复方案与验收标准一致(保存后刷新列表,长效诊断标识保留不清空)
|
||||
- ✅ Gate D: 不涉及新增数据库字段(`adm_encounter_diagnosis.long_term_flag` 已存在,Entity 第89行已有定义)
|
||||
@@ -1,53 +0,0 @@
|
||||
# Bug #556 分析报告
|
||||
|
||||
## 问题描述
|
||||
【门诊医生站-检验】新增检验申请单时:
|
||||
1. 就诊卡号字段为空,未自动带出患者就诊卡号
|
||||
2. 执行时间字段未自动填充,仅显示占位提示
|
||||
3. 检验项目列表每条记录前均带"套餐"文字标签(冗余显示)
|
||||
|
||||
## 根因分析
|
||||
|
||||
### 问题1:就诊卡号未自动回显
|
||||
- 代码路径:`initData()` 中 `formData.medicalrecordNumber = props.patientInfo.identifierNo || ''`
|
||||
- 数据绑定:`v-model="formData.medicalrecordNumber"`
|
||||
- `props.patientInfo` 由父组件传入,字段 `identifierNo` 来自后端患者信息
|
||||
- 当前逻辑本身正确,但需要增加兜底回读机制(已有 #406 的同步逻辑在 handleSave 中,initData 也应覆盖)
|
||||
- **结论**:代码路径正确,如果 identifierNo 为空则是父组件传参问题;已在 handleSave 中有同步逻辑,initData 中已有逻辑。无需额外修复。
|
||||
|
||||
### 问题2:执行时间未自动填充
|
||||
- 根因:`formData.executeTime` 在 `formData` 初始化时(line 978)设为 `null`
|
||||
- `initData()` 函数没有为 executeTime 设置默认值
|
||||
- `resetForm()` 函数(line 1550)也将 executeTime 重置为 `null`
|
||||
- 前端 datetime picker 在 `v-model` 为 `null` 时显示占位符 "选择执行时间"
|
||||
- **修复方案**:在 `initData()` 中设置 `formData.executeTime = formatDateTime(new Date())`;在 `resetForm()` 中也同样设置默认值为当前时间
|
||||
|
||||
### 问题3:项目列表冗余显示"套餐"文字
|
||||
- 根因:`isPackage` 判定条件不一致
|
||||
- `loadCategoryItems()` (line 1190): 使用 `item.feePackageId != null && ... && item.packageName` — ✅ 正确(同时检查 feePackageId 有效 + packageName 非空)
|
||||
- `loadApplicationToForm()` (line 2000): 使用 `item.feePackageId != null || item.itemName?.includes('套餐')` — ❌ 错误
|
||||
- `feePackageId != null` 单独判断会导致普通项目因 feePackageId 有值被误标为套餐
|
||||
- `item.itemName?.includes('套餐')` 更是直接按名称文字判断,极不准确
|
||||
- 影响位置:
|
||||
- 检验项目选择区(line 566):`<el-tag v-if="item.isPackage">套餐</el-tag>`
|
||||
- 已选项目列表(line 617):`<el-tag v-if="item.isPackage">套餐</el-tag>`
|
||||
- 检验信息详情表格(line 448):`<el-tag v-if="scope.row.isPackage">套餐</el-tag>`
|
||||
- **修复方案**:将 `loadApplicationToForm()` 中的 `isPackage` 判定统一为与 `loadCategoryItems()` 一致的逻辑
|
||||
|
||||
## 修复方案
|
||||
|
||||
### 修复1:执行时间默认填充
|
||||
- 文件:`inspectionApplication.vue`
|
||||
- 位置:`initData()` 函数,在已有患者信息赋值后添加 `formData.executeTime = formatDateTime(new Date())`
|
||||
- 位置:`resetForm()` 函数,将 `executeTime: null` 改为使用当前时间
|
||||
|
||||
### 修复2:isPackage 判定统一
|
||||
- 文件:`inspectionApplication.vue`
|
||||
- 位置:`loadApplicationToForm()` 函数 line 2000
|
||||
- 旧代码:`const isPackage = item.feePackageId != null || item.itemName?.includes('套餐')`
|
||||
- 新代码:`const isPackage = item.feePackageId != null && item.feePackageId !== '' && item.feePackageId !== 'null' && item.packageName`
|
||||
|
||||
## 验收标准
|
||||
1. 新增检验申请单时,执行时间字段自动填充当前系统时间(YYYY-MM-DD HH:mm:ss 格式)
|
||||
2. 检验项目列表中,只有真正的套餐项目前显示"套餐"标签,普通项目不显示
|
||||
3. 就诊卡号在有患者信息时正常显示
|
||||
493
.aider.conf.yml
Normal file
493
.aider.conf.yml
Normal file
@@ -0,0 +1,493 @@
|
||||
# Aider configuration for HealthLink-HIS
|
||||
# Aider 自动读取此文件获取开发规范
|
||||
|
||||
instructions: |
|
||||
# HealthLink-HIS — AI 开发规范(自动加载)
|
||||
|
||||
> 🤖 **本文件供所有 AI 编码工具自动读取**。进入本项目后必须遵守以下规范。
|
||||
>
|
||||
> **模型决定上限,Harness 决定底线。**
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概览
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| 项目名 | HealthLink-HIS(医院信息系统) |
|
||||
| 后端路径 | `healthlink-his-server/` |
|
||||
| 前端路径 | `healthlink-his-ui/` |
|
||||
| 文档路径 | `MD/` |
|
||||
| JDK | 25 (OpenJDK) |
|
||||
| Spring Boot | 4.0.6 |
|
||||
| MyBatis-Plus | 3.5.16 |
|
||||
| Vue | 3.x + Vite + Element Plus |
|
||||
| 数据库 | PostgreSQL 15+ |
|
||||
| 包名 | `com.healthlink.his` |
|
||||
| 后端端口 | 18082 |
|
||||
| 前端端口 | 81 |
|
||||
|
||||
---
|
||||
|
||||
## 二、铁律(必须遵守,违反即失败)
|
||||
|
||||
### 🔴 P0 铁律 — 不可违反
|
||||
|
||||
**铁律1: 修改完必须测试**
|
||||
```
|
||||
后端: mvn clean compile -DskipTests → mvn install -DskipTests → mvn test
|
||||
前端: npm run build:dev → npm run lint
|
||||
```
|
||||
- 白盒:编译通过,无 ERROR
|
||||
- 黑盒:关键接口返回 `{code:200, data:...}`,验证业务逻辑
|
||||
- 冒烟:应用正常启动,核心流程通畅
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
- 编译 + 测试全部通过后才能 git commit
|
||||
- 不提交未完成的功能、调试代码、临时文件
|
||||
|
||||
**铁律4: 前后端API路径对齐**
|
||||
- 后端前缀:`/healthlink-his/api/v1/`
|
||||
- 前端 `request.js` 的 baseURL 必须与后端匹配
|
||||
|
||||
**铁律5: 状态值一致性(Bug #574 教训)**
|
||||
- 修改任何状态值前,必须先列出完整的状态流转链路
|
||||
- 检查项:枚举定义 → Service 设置 → 查询映射 → 前端 STATUS_CLASS_MAP → 前端 v-if → 统计SQL
|
||||
- 禁止:只改一端不检查其他端
|
||||
|
||||
**铁律6: 禁止删除源文件(Bug #574 教训)**
|
||||
- 绝对禁止删除项目中已有的 Java/Vue/SQL 源文件
|
||||
- 编译错误 → 修复错误;重复文件 → 重构合并
|
||||
- 唯一例外:明确由人类确认删除的文件
|
||||
|
||||
**铁律7: 禁止修改已有公开方法签名**
|
||||
- 不能删除/重命名已有的 public 方法,不能修改参数列表
|
||||
- 需要新功能 → 添加重载方法;需要改行为 → 修改内部实现
|
||||
|
||||
**铁律8: 验证后才宣称完成(Verification Before Completion)**
|
||||
- **没有跑过验证命令,就不能说"完成了""通过了""没问题"**
|
||||
- 禁止使用"应该可以""大概没问题""看起来正确"
|
||||
- 必须:运行命令 → 读取输出 → 确认结果 → 才能宣称
|
||||
- 这是诚实原则,不是效率问题
|
||||
|
||||
|
||||
**铁律9: 开发前必须审核原有代码(P0 — 铁律)**
|
||||
- **任何新功能开发前,必须先搜索项目中是否已有相关代码**
|
||||
- 搜索路径:Controller / AppService / Service / Mapper / Entity / 前端页面 / API接口
|
||||
- 如果已有部分功能 → 在原有代码基础上**升级优化完善**,禁止另起炉灶
|
||||
- 如果已有接口但前端缺失 → 只补前端,不重复建后端
|
||||
- 如果已有前端但后端缺失 → 只补后端,不重写前端
|
||||
- 搜索命令:`rg -l "关键词" healthlink-his-server/ healthlink-his-ui/src/`
|
||||
- 禁止:不看代码就新建模块、重复实现已有功能、废弃原有代码另写一套
|
||||
|
||||
|
||||
**铁律12: 设计文档确认后自主开发(铁律)**
|
||||
- 设计文档(如 `MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md`)一旦确认,后续开发**必须按文档自主执行**
|
||||
- **禁止反复询问"是否继续""下一步做什么""是否开始"**——直接按计划推进
|
||||
- 每完成一个 Sprint,自动提交推送,然后立即开始下一个 Sprint
|
||||
- 只在遇到**无法解决的阻塞**(如技术选型冲突、需求不明确、第三方依赖不可用)时才暂停询问
|
||||
- 设计文档是"**已签合同**",不是"参考意见"。铁律执行优先级:设计文档 > 人类临时指令 > AI 自行判断
|
||||
|
||||
|
||||
### 🟡 P1 铁律 — 强烈建议
|
||||
|
||||
**铁律9: 先分解再行动**
|
||||
- 修改超过3个文件、涉及多模块、数据库变更,必须先制定计划
|
||||
|
||||
**铁律10: 验证后信**
|
||||
- 每次修改后必须验证编译通过,不信记忆
|
||||
|
||||
**铁律13: 文档统一管理**
|
||||
- 所有文档存储在 `MD/` 目录
|
||||
- 文件名:大写英文+下划线(如 `BACKEND_CHECKLIST.md`)
|
||||
- 文档头部必须包含元数据块(文档类型、版本、日期)
|
||||
|
||||
---
|
||||
|
||||
|
||||
**铁律14: 设计文档必须包含UI设计和调用流程**
|
||||
- 所有新模块/页面的设计文档必须包含:UI布局描述、交互效果清单、前后端调用流程
|
||||
- 没有明确UI设计的模块,禁止直接编码
|
||||
- 详见
|
||||
- 设计文档必须写清楚:系统调用关系、方法函数调用关系、完整业务流程
|
||||
- 设计文档中每个用户操作必须对应:前端事件 → API调用 → 后端处理链路 → 返回数据 → UI渲染
|
||||
|
||||
---
|
||||
|
||||
## 三、Karpathy 编码准则
|
||||
|
||||
> 减少 LLM 常见编码错误。偏向谨慎而非速度。
|
||||
|
||||
### 3.1 先想再写
|
||||
- 明确陈述假设,不确定就问
|
||||
- 多种解读时都列出来,不要默默选一种
|
||||
- 有更简单的方案就说出来,该推回就推回
|
||||
- 不清楚的地方停下来,说清楚哪里不清楚
|
||||
|
||||
### 3.2 简洁优先
|
||||
- 不做没要求的功能,不做一次性代码的抽象
|
||||
- 不加没要求的"灵活性"和"可配置性"
|
||||
- 200 行能 50 行搞定就重写
|
||||
- 自问:"高级工程师会不会觉得这过度设计?"
|
||||
|
||||
### 3.3 精准修改
|
||||
- 只改必须改的,不"顺手改进"相邻代码
|
||||
- 匹配现有代码风格,即使你有不同的偏好
|
||||
- 每行改动都能追溯到用户的请求
|
||||
- 只清理你自己改动产生的无用代码
|
||||
|
||||
### 3.4 目标驱动
|
||||
- 把任务转化为可验证目标
|
||||
- 多步任务声明计划:`[步骤] → 验证: [检查]`
|
||||
- 强验收标准让 Agent 能独立循环,弱标准需要持续澄清
|
||||
|
||||
---
|
||||
|
||||
## 四、全链路 6 环分析
|
||||
|
||||
> ⚠️ **涉及数据库字段的 Bug / 需求,必须走完整链路。**
|
||||
|
||||
```
|
||||
前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块
|
||||
①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动
|
||||
```
|
||||
|
||||
| 环 | 检查内容 |
|
||||
|----|---------|
|
||||
| ① 录入 | 前端有无输入入口(弹窗、表格行编辑、表单) |
|
||||
| ② 验证 | Controller 参数校验、@Valid、权限控制 |
|
||||
| ③ 业务 | Service 业务逻辑、事务边界、多个 Service 实现类入口 |
|
||||
| ④ 持久化 | Mapper XML、DTO 字段映射、类型转换 |
|
||||
| ⑤ 存储 | 数据库表结构、索引、NOT NULL 约束 |
|
||||
| ⑥ 联动 | 上游(医嘱→护士站)、下游(打印、计费、报表)是否同步 |
|
||||
|
||||
**修复后的验证顺序**:
|
||||
1. 数据库:确认状态值已正确写入
|
||||
2. 后端接口:确认返回的状态映射正确
|
||||
3. 前端显示:确认页面显示正确状态文本
|
||||
4. 前端交互:确认按钮/操作基于正确状态启用/禁用
|
||||
5. 统计数据:确认池/报表统计包含新状态
|
||||
|
||||
---
|
||||
|
||||
## 五、Harness Engineering 方法论
|
||||
|
||||
> Harness = 约束 + 反馈 + 控制平面 + 持久执行
|
||||
|
||||
### 5.1 四层约束金字塔
|
||||
|
||||
| 层级 | 内容 | 落地方式 |
|
||||
|------|------|---------|
|
||||
| **L1 架构约束** | 接口合约、包结构、命名规范、禁止模式 | 本文件铁律 |
|
||||
| **L2 代码质量** | 圈复杂度、代码风格、类型提示 | 编译门禁 + ESLint |
|
||||
| **L3 安全约束** | 敏感信息检测、权限检查、输入验证 | 配置不可硬编码 |
|
||||
| **L4 业务规则** | 领域逻辑、数据一致性、事务边界 | 全链路 6 环验证 |
|
||||
|
||||
**约束设计原则**:
|
||||
- **可验证**:每条约束必须能被自动化检查("覆盖率>90%"✅ "质量要高"❌)
|
||||
- **无歧义**:"每函数不超过50行"✅ "函数不要太长"❌
|
||||
- **优先级**:安全(1) > 架构(2) > 业务(3) > 质量(4) > 性能(5)
|
||||
- **渐进增强**:L1编译通过 → L2+命名规范 → L3+测试覆盖 → L4+安全扫描
|
||||
|
||||
### 5.2 三层反馈系统
|
||||
|
||||
| 层级 | 速度 | 覆盖范围 | 失败处理 |
|
||||
|------|------|---------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、签名 | 立即阻断,自行修复 |
|
||||
| **L2 数据流验证** | <5分钟 | 全链路字段、Mapper XML、DTO | 修复后上报 |
|
||||
| **L3 人工审查** | 10-30分钟 | 架构、设计、业务正确性 | 驳回/指导/批准 |
|
||||
|
||||
**反馈铁律**:
|
||||
- 反馈必须可行动(文件 + 行号 + 错误类型 + 修复方向)
|
||||
- 失败后先回滚到最近检查点,再重试
|
||||
- 持续失败3次 → 上报人类
|
||||
|
||||
### 5.3 控制平面
|
||||
|
||||
```
|
||||
战略层(人类) → 设定目标、审批决策、异常升级
|
||||
战术层(Agent) → 任务分解、update_plan、依赖协调、检查点保存
|
||||
执行层(Agent) → 代码生成、测试执行、错误恢复、幂等重试
|
||||
```
|
||||
|
||||
### 5.4 持久执行
|
||||
|
||||
- 每个关键步骤保存检查点(`update_plan` 进度)
|
||||
- 失败后从最新检查点恢复,不从头开始
|
||||
- 幂等设计:同一操作重复执行结果一致
|
||||
- **三层状态管理**:系统层(工作流ID/超时/重试) → 执行层(当前活动/进度) → 业务层(已完成工作/中间产物)
|
||||
|
||||
---
|
||||
|
||||
## 六、五层质量门禁
|
||||
|
||||
| 门禁 | 时间 | 范围 | 失败处理 |
|
||||
|------|------|------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、导入 | Agent 自行修复 |
|
||||
| **L2 静态分析** | <2分钟 | 代码风格、复杂度、安全 | Agent 修复 |
|
||||
| **L3 单元测试** | <5分钟 | 功能正确性、边界条件 | 自动修复或上报 |
|
||||
| **L4 集成测试** | <15分钟 | 模块间交互、数据流 | 上报人工 |
|
||||
| **L5 生产验证** | 持续 | 监控、告警、性能 | 自动回滚 |
|
||||
|
||||
**提交铁律**:L1-L2 必须通过才能 commit,L3(如有DB变更)必须通过才能 push
|
||||
|
||||
---
|
||||
|
||||
## 七、系统化调试(Systematic Debugging)
|
||||
|
||||
> **铁律:没有根因调查,不能提出修复方案。**
|
||||
|
||||
### 四阶段流程
|
||||
|
||||
**阶段1:根因调查**(修复前必须完成)
|
||||
1. 仔细阅读错误信息(堆栈、行号、错误码)
|
||||
2. 稳定复现(能否可靠触发?步骤?每次?)
|
||||
3. 检查最近变更(git diff、新依赖、配置变更)
|
||||
4. 多组件系统:在每个组件边界加诊断日志,定位哪一层断裂
|
||||
5. 追踪数据流:坏值从哪里来?谁调用的?一直追溯到源头
|
||||
|
||||
**阶段2:模式分析**
|
||||
- 找到同代码库中类似的正常工作代码
|
||||
- 逐项对比差异
|
||||
- 理解依赖关系
|
||||
|
||||
**阶段3:假设与测试**
|
||||
- 形成单一假设:"我认为X是根因,因为Y"
|
||||
- 做最小改动测试
|
||||
- 有效 → 阶段4;无效 → 新假设
|
||||
|
||||
**阶段4:实施**
|
||||
- 创建失败测试用例
|
||||
- 修复根因(不是症状)
|
||||
- 验证修复
|
||||
|
||||
---
|
||||
|
||||
## 八、后端开发规范
|
||||
|
||||
### 分层架构
|
||||
```
|
||||
Controller → AppService → Service → Mapper → Entity
|
||||
```
|
||||
|
||||
### 命名规范
|
||||
| 类型 | 规则 | 示例 |
|
||||
|------|------|------|
|
||||
| Controller | `XxxController` | `RegistrationController` |
|
||||
| AppService | `IXxxAppService` / `XxxAppServiceImpl` | `IRegistrationAppService` |
|
||||
| Service | `IXxxService` / `XxxServiceImpl` | `IRegistrationService` |
|
||||
| Mapper | `XxxMapper` | `RegistrationMapper` |
|
||||
| Entity | `Xxx` | `Registration` |
|
||||
| DTO | `XxxDto` / `XxxQueryDto` | `RegistrationDto` |
|
||||
|
||||
### 包结构
|
||||
```
|
||||
com.healthlink.his.web.{module}.controller
|
||||
com.healthlink.his.web.{module}.appservice
|
||||
com.healthlink.his.web.{module}.service
|
||||
com.healthlink.his.web.{module}.mapper
|
||||
com.healthlink.his.web.{module}.dto
|
||||
com.healthlink.his.domain.{module}
|
||||
com.healthlink.his.common.enums
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- 所有查询使用 `LambdaQueryWrapper`,禁止字符串拼接 SQL
|
||||
- `@Transactional(rollbackFor = Exception.class)` 管理事务
|
||||
- 所有接口标注 `@PreAuthorize` 权限控制
|
||||
- 患者敏感信息在日志中脱敏
|
||||
- **扩展功能不修改原有函数签名**
|
||||
|
||||
---
|
||||
|
||||
## 九、前端开发规范
|
||||
|
||||
### 技术栈
|
||||
- Vue 3 + Vite + Element Plus + Pinia + Axios(基于 RuoYi-Vue3)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
src/api/{module}/ # API接口
|
||||
src/views/{module}/ # 页面组件
|
||||
src/store/modules/ # Pinia状态管理
|
||||
src/components/ # 公共组件
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- API前缀:`/healthlink-his/api/v1/`
|
||||
- 路由懒加载:`() => import('@/views/xxx/index.vue')`
|
||||
- 页面使用 `<script setup>` 语法
|
||||
- 按钮权限使用 `v-hasPermi` 指令
|
||||
- `onMounted` 中注册的事件在 `onUnmounted` 中移除
|
||||
|
||||
---
|
||||
|
||||
## 十、Agent 体系
|
||||
|
||||
### 角色与路由
|
||||
|
||||
| 代号 | 名称 | 角色 | 路由关键词 |
|
||||
|------|------|------|-----------|
|
||||
| liubei | 刘备 | 项目经理 | 协调、分派、异常升级 |
|
||||
| zhugeliang | 诸葛亮 | 架构师 | 分析、路由、设计 |
|
||||
| guanyu | 关羽 | 后端开发 | java, api, spring, service, controller |
|
||||
| zhaoyun | 赵云 | 前端开发 | vue, 界面, 显示, 弹窗, 按钮 |
|
||||
| xunyu | 荀彧 | DBA | 数据库, sql, 迁移, mapper xml |
|
||||
| zhangfei | 张飞 | 测试 | 测试, QA, 回归 |
|
||||
| huatuo | 华佗 | 验收 | 需求验收、质量确认 |
|
||||
| chenlin | 陈琳 | 文档 | 文档、归档、Git提交 |
|
||||
|
||||
### 协作流水线
|
||||
|
||||
```
|
||||
刘备(协调) → 诸葛亮(分析路由) → {关羽|赵云}(修复) → 荀彧(DB审查) → 张飞(测试) → 华佗(验收) → 陈琳(归档)
|
||||
```
|
||||
|
||||
### Bug 修复完整管线(BDT 方法论)
|
||||
|
||||
```
|
||||
获取Bug → 设计测试用例 → 基线测试(应失败) → 全链路修复 → 回归测试(应通过) → 扩展测试(无回归) → 提交
|
||||
```
|
||||
|
||||
### Bug 状态管理铁律
|
||||
- 人类提的 Bug:只加备注,不改状态,不改分配
|
||||
- 智能体提的 Bug:可以改分配和加备注
|
||||
- 已关闭/已解决的 Bug 不再处理
|
||||
|
||||
---
|
||||
|
||||
## 十一、审查与审计
|
||||
|
||||
### 三层审查体系
|
||||
|
||||
| 层级 | 内容 | 时机 |
|
||||
|------|------|------|
|
||||
| **L1 自审** | Agent 对照约束逐条检查 | 每次提交前 |
|
||||
| **L2 配对审查** | Agent 生成变更摘要,人类终审 | PR/提交时 |
|
||||
| **L3 合规审查** | 审计追踪,记录所有 AI 操作 | 持续 |
|
||||
|
||||
### L1 自审清单
|
||||
```yaml
|
||||
self_review:
|
||||
- "所有修改能通过编译?"
|
||||
- "遵守命名规范?"
|
||||
- "测试覆盖达标?"
|
||||
- "没有遗漏的 TODO / DEBUG?"
|
||||
- "变更范围没超出任务边界?"
|
||||
```
|
||||
|
||||
### 评审评分维度
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 正确性 | 行为是否符合目标功能? |
|
||||
| 验证 | 检查是否真的跑过并留下证据? |
|
||||
| 范围纪律 | 是否保持在选定功能范围内? |
|
||||
| 可靠性 | 结果能否在重启后继续工作? |
|
||||
| 可维护性 | 代码和文档是否清楚到可交接? |
|
||||
|
||||
---
|
||||
|
||||
## 十二、标准工作循环
|
||||
|
||||
```
|
||||
开始会话
|
||||
├→ 1. Init — 读 AGENTS.md + PROGRESS.md + git log
|
||||
├→ 2. Select — 只选一个未完成功能
|
||||
├→ 3. Implement — 一次只做一个,不扩大范围
|
||||
├→ 4. Verify — 运行验证命令,有证据才标记完成
|
||||
└→ 5. Cleanup — 更新进度 + clean-state-checklist + git commit
|
||||
```
|
||||
|
||||
### 会话结束前必须运行 Clean State Checklist
|
||||
```
|
||||
□ 标准启动路径仍然可用
|
||||
□ 标准验证路径仍然可运行
|
||||
□ 当前进度已记录到进度日志
|
||||
□ 无半成品步骤处于未记录状态
|
||||
□ 下一轮会话无需人工修复即可继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十三、开发流程
|
||||
|
||||
```
|
||||
收到任务
|
||||
├→ ① 分析需求 → 读相关文档(MD/)、读全链路6环
|
||||
├→ ② 制定计划 → update_plan (3-6个阶段)
|
||||
├→ ③ 后端开发 → Controller → AppService → Service → Mapper → Entity → Flyway
|
||||
├→ ④ 后端测试 → mvn test → 接口测试(业务逻辑验证)
|
||||
├→ ⑤ 前端开发 → API接口 → 页面组件 → 路由配置
|
||||
├→ ⑥ 前端测试 → npm run build:dev → 功能验证
|
||||
├→ ⑦ 质量门禁 → L1编译 → L2测试 → L3DB审查 → L4验收 → L5归档
|
||||
└→ ⑧ 提交代码 → git commit(规范格式) → git push → 文档更新
|
||||
```
|
||||
|
||||
### Git Commit 格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
type: feat|fix|docs|refactor|test|chore
|
||||
scope: 模块名(如 registration, billing, pharmacy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十四、快速参考命令
|
||||
|
||||
```bash
|
||||
# === 后端 ===
|
||||
export JAVA_HOME=/opt/jdk-25
|
||||
mvn clean compile -DskipTests # 编译
|
||||
mvn install -DskipTests # 构建
|
||||
mvn test -pl healthlink-his-application -Dtest="XxxTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
|
||||
# === 前端 ===
|
||||
cd healthlink-his-ui
|
||||
npm run dev && npm run build:dev && npm run lint && npm run test:run
|
||||
|
||||
# === Git ===
|
||||
git status && git add -A && git commit -m "feat(module): desc" && git push origin develop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十五、详细规范文档索引
|
||||
|
||||
| 文档 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 执行铁律 | `MD/specs/IRON_RULES.md` | 铁律完整版 |
|
||||
| 后端规范 | `MD/specs/BACKEND_DEVELOPMENT_STANDARD.md` | 后端编码标准 |
|
||||
| 前端规范 | `MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md` | 前端编码标准 |
|
||||
| Harness方法论 | `MD/specs/HARNESS_ENGINEERING.md` | 完整Harness+Agent方法论 |
|
||||
| 文档规范 | `MD/DOCUMENTATION_STANDARD.md` | 文档管理标准 |
|
||||
| 后端清单 | `MD/specs/BACKEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 前端清单 | `MD/specs/FRONTEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 三甲标准 | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲医院达标标准 |
|
||||
| Flyway指南 | `MD/guides/FLYWAY_USAGE_GUIDE.md` | 数据库迁移指南 |
|
||||
|
||||
---
|
||||
|
||||
## 十六、过往教训
|
||||
|
||||
| 教训 | 内容 |
|
||||
|------|------|
|
||||
| 状态链路断裂 | Bug#574: 签到设 BOOKED(1) 而非 CHECKED_IN(3),前端映射缺失 → 必须走完整状态链路 |
|
||||
| 盲删源文件 | AI 看到编译错误直接删文件,没检查 baseline → 必须先确认文件来源 |
|
||||
| 修复方向偏差 | 多次 fallback 改的是错误的 Service → 必须用 rg 搜索所有相关代码路径 |
|
||||
| bug_reports 缺列 | INSERT 静默失败 → 必须检查表结构 |
|
||||
| 禅道 comment API | API 不存在,用 resolve+activate workaround |
|
||||
| SQLite WAL 并发 | 多进程并发写需要 checkpoint |
|
||||
| UTF-8 切片 | 多字节字符不能用 byte index 切片 |
|
||||
| 上下文焦虑 | Agent 感觉上下文快满时会匆忙结束,跳过验证 → 注意 context 40% 阈值 |
|
||||
| 过早宣告胜利 | 自评≠验证,分开"干活"和"检查" |
|
||||
| 覆盖率幻觉 | 覆盖率达标但逻辑没测 → 引入变异测试 |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ 本文件是 AI 开发规范的唯一信源。各工具配置文件由 `bash scripts/sync-ai-rules.sh` 同步。
|
||||
509
.clinerules
Normal file
509
.clinerules
Normal file
@@ -0,0 +1,509 @@
|
||||
# HealthLink-HIS — AI 开发规范 (Cline)
|
||||
|
||||
> 🤖 Cline 打开本项目时自动加载此文件。
|
||||
|
||||
---
|
||||
|
||||
# HealthLink-HIS — AI 开发规范(自动加载)
|
||||
|
||||
> 🤖 **本文件供所有 AI 编码工具自动读取**。进入本项目后必须遵守以下规范。
|
||||
>
|
||||
> **模型决定上限,Harness 决定底线。**
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概览
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| 项目名 | HealthLink-HIS(医院信息系统) |
|
||||
| 后端路径 | `healthlink-his-server/` |
|
||||
| 前端路径 | `healthlink-his-ui/` |
|
||||
| 文档路径 | `MD/` |
|
||||
| JDK | 25 (OpenJDK) |
|
||||
| Spring Boot | 4.0.6 |
|
||||
| MyBatis-Plus | 3.5.16 |
|
||||
| Vue | 3.x + Vite + Element Plus |
|
||||
| 数据库 | PostgreSQL 15+ |
|
||||
| 包名 | `com.healthlink.his` |
|
||||
| 后端端口 | 18082 |
|
||||
| 前端端口 | 81 |
|
||||
|
||||
---
|
||||
|
||||
## 二、铁律(必须遵守,违反即失败)
|
||||
|
||||
### 🔴 P0 铁律 — 不可违反
|
||||
|
||||
**铁律1: 修改完必须测试**
|
||||
```
|
||||
后端: mvn clean compile -DskipTests → mvn install -DskipTests → mvn test
|
||||
前端: npm run build:dev → npm run lint
|
||||
```
|
||||
- 白盒:编译通过,无 ERROR
|
||||
- 黑盒:关键接口返回 `{code:200, data:...}`,验证业务逻辑
|
||||
- 冒烟:应用正常启动,核心流程通畅
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
- 编译 + 测试全部通过后才能 git commit
|
||||
- 不提交未完成的功能、调试代码、临时文件
|
||||
|
||||
**铁律4: 前后端API路径对齐**
|
||||
- 后端前缀:`/healthlink-his/api/v1/`
|
||||
- 前端 `request.js` 的 baseURL 必须与后端匹配
|
||||
|
||||
**铁律5: 状态值一致性(Bug #574 教训)**
|
||||
- 修改任何状态值前,必须先列出完整的状态流转链路
|
||||
- 检查项:枚举定义 → Service 设置 → 查询映射 → 前端 STATUS_CLASS_MAP → 前端 v-if → 统计SQL
|
||||
- 禁止:只改一端不检查其他端
|
||||
|
||||
**铁律6: 禁止删除源文件(Bug #574 教训)**
|
||||
- 绝对禁止删除项目中已有的 Java/Vue/SQL 源文件
|
||||
- 编译错误 → 修复错误;重复文件 → 重构合并
|
||||
- 唯一例外:明确由人类确认删除的文件
|
||||
|
||||
**铁律7: 禁止修改已有公开方法签名**
|
||||
- 不能删除/重命名已有的 public 方法,不能修改参数列表
|
||||
- 需要新功能 → 添加重载方法;需要改行为 → 修改内部实现
|
||||
|
||||
**铁律8: 验证后才宣称完成(Verification Before Completion)**
|
||||
- **没有跑过验证命令,就不能说"完成了""通过了""没问题"**
|
||||
- 禁止使用"应该可以""大概没问题""看起来正确"
|
||||
- 必须:运行命令 → 读取输出 → 确认结果 → 才能宣称
|
||||
- 这是诚实原则,不是效率问题
|
||||
|
||||
|
||||
**铁律9: 开发前必须审核原有代码(P0 — 铁律)**
|
||||
- **任何新功能开发前,必须先搜索项目中是否已有相关代码**
|
||||
- 搜索路径:Controller / AppService / Service / Mapper / Entity / 前端页面 / API接口
|
||||
- 如果已有部分功能 → 在原有代码基础上**升级优化完善**,禁止另起炉灶
|
||||
- 如果已有接口但前端缺失 → 只补前端,不重复建后端
|
||||
- 如果已有前端但后端缺失 → 只补后端,不重写前端
|
||||
- 搜索命令:`rg -l "关键词" healthlink-his-server/ healthlink-his-ui/src/`
|
||||
- 禁止:不看代码就新建模块、重复实现已有功能、废弃原有代码另写一套
|
||||
|
||||
|
||||
**铁律12: 设计文档确认后自主开发(铁律)**
|
||||
- 设计文档(如 `MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md`)一旦确认,后续开发**必须按文档自主执行**
|
||||
- **禁止反复询问"是否继续""下一步做什么""是否开始"**——直接按计划推进
|
||||
- 每完成一个 Sprint,自动提交推送,然后立即开始下一个 Sprint
|
||||
- 只在遇到**无法解决的阻塞**(如技术选型冲突、需求不明确、第三方依赖不可用)时才暂停询问
|
||||
- 设计文档是"**已签合同**",不是"参考意见"。铁律执行优先级:设计文档 > 人类临时指令 > AI 自行判断
|
||||
|
||||
**铁律18: 禁止破坏原有功能(P0绝对铁律)**
|
||||
- **完善增加功能和流程时,绝对不能破坏或者让原有功能不能用**
|
||||
- 修改已有实体前必须对比原始文件(`git show HEAD~N:./file.java`),保留所有原有字段和方法
|
||||
- 新增字段只能追加,不能删除或重命名已有字段
|
||||
- SQL迁移只允许 `ALTER TABLE ADD COLUMN`,不允许 `DROP COLUMN` 或 `RENAME COLUMN`
|
||||
- Controller新端点不能修改已有端点的路径或参数
|
||||
- 前端新页面不能修改已有页面的组件结构
|
||||
- 每次修改后必须 `mvn clean compile -DskipTests` 验证
|
||||
- **违规判定**: 因修改导致原有代码编译失败或运行报错,视为违反铁律18,必须立即回滚修复
|
||||
|
||||
|
||||
### 🟡 P1 铁律 — 强烈建议
|
||||
|
||||
**铁律9: 先分解再行动**
|
||||
- 修改超过3个文件、涉及多模块、数据库变更,必须先制定计划
|
||||
|
||||
**铁律10: 验证后信**
|
||||
- 每次修改后必须验证编译通过,不信记忆
|
||||
|
||||
**铁律13: 文档统一管理**
|
||||
- 所有文档存储在 `MD/` 目录
|
||||
- 文件名:大写英文+下划线(如 `BACKEND_CHECKLIST.md`)
|
||||
- 文档头部必须包含元数据块(文档类型、版本、日期)
|
||||
|
||||
---
|
||||
|
||||
|
||||
**铁律14: 设计文档必须包含UI设计和调用流程**
|
||||
- 所有新模块/页面的设计文档必须包含:UI布局描述、交互效果清单、前后端调用流程
|
||||
- 没有明确UI设计的模块,禁止直接编码
|
||||
- 详见
|
||||
- 设计文档必须写清楚:系统调用关系、方法函数调用关系、完整业务流程
|
||||
- 设计文档中每个用户操作必须对应:前端事件 → API调用 → 后端处理链路 → 返回数据 → UI渲染
|
||||
|
||||
---
|
||||
|
||||
## 三、Karpathy 编码准则
|
||||
|
||||
> 减少 LLM 常见编码错误。偏向谨慎而非速度。
|
||||
|
||||
### 3.1 先想再写
|
||||
- 明确陈述假设,不确定就问
|
||||
- 多种解读时都列出来,不要默默选一种
|
||||
- 有更简单的方案就说出来,该推回就推回
|
||||
- 不清楚的地方停下来,说清楚哪里不清楚
|
||||
|
||||
### 3.2 简洁优先
|
||||
- 不做没要求的功能,不做一次性代码的抽象
|
||||
- 不加没要求的"灵活性"和"可配置性"
|
||||
- 200 行能 50 行搞定就重写
|
||||
- 自问:"高级工程师会不会觉得这过度设计?"
|
||||
|
||||
### 3.3 精准修改
|
||||
- 只改必须改的,不"顺手改进"相邻代码
|
||||
- 匹配现有代码风格,即使你有不同的偏好
|
||||
- 每行改动都能追溯到用户的请求
|
||||
- 只清理你自己改动产生的无用代码
|
||||
|
||||
### 3.4 目标驱动
|
||||
- 把任务转化为可验证目标
|
||||
- 多步任务声明计划:`[步骤] → 验证: [检查]`
|
||||
- 强验收标准让 Agent 能独立循环,弱标准需要持续澄清
|
||||
|
||||
---
|
||||
|
||||
## 四、全链路 6 环分析
|
||||
|
||||
> ⚠️ **涉及数据库字段的 Bug / 需求,必须走完整链路。**
|
||||
|
||||
```
|
||||
前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块
|
||||
①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动
|
||||
```
|
||||
|
||||
| 环 | 检查内容 |
|
||||
|----|---------|
|
||||
| ① 录入 | 前端有无输入入口(弹窗、表格行编辑、表单) |
|
||||
| ② 验证 | Controller 参数校验、@Valid、权限控制 |
|
||||
| ③ 业务 | Service 业务逻辑、事务边界、多个 Service 实现类入口 |
|
||||
| ④ 持久化 | Mapper XML、DTO 字段映射、类型转换 |
|
||||
| ⑤ 存储 | 数据库表结构、索引、NOT NULL 约束 |
|
||||
| ⑥ 联动 | 上游(医嘱→护士站)、下游(打印、计费、报表)是否同步 |
|
||||
|
||||
**修复后的验证顺序**:
|
||||
1. 数据库:确认状态值已正确写入
|
||||
2. 后端接口:确认返回的状态映射正确
|
||||
3. 前端显示:确认页面显示正确状态文本
|
||||
4. 前端交互:确认按钮/操作基于正确状态启用/禁用
|
||||
5. 统计数据:确认池/报表统计包含新状态
|
||||
|
||||
---
|
||||
|
||||
## 五、Harness Engineering 方法论
|
||||
|
||||
> Harness = 约束 + 反馈 + 控制平面 + 持久执行
|
||||
|
||||
### 5.1 四层约束金字塔
|
||||
|
||||
| 层级 | 内容 | 落地方式 |
|
||||
|------|------|---------|
|
||||
| **L1 架构约束** | 接口合约、包结构、命名规范、禁止模式 | 本文件铁律 |
|
||||
| **L2 代码质量** | 圈复杂度、代码风格、类型提示 | 编译门禁 + ESLint |
|
||||
| **L3 安全约束** | 敏感信息检测、权限检查、输入验证 | 配置不可硬编码 |
|
||||
| **L4 业务规则** | 领域逻辑、数据一致性、事务边界 | 全链路 6 环验证 |
|
||||
|
||||
**约束设计原则**:
|
||||
- **可验证**:每条约束必须能被自动化检查("覆盖率>90%"✅ "质量要高"❌)
|
||||
- **无歧义**:"每函数不超过50行"✅ "函数不要太长"❌
|
||||
- **优先级**:安全(1) > 架构(2) > 业务(3) > 质量(4) > 性能(5)
|
||||
- **渐进增强**:L1编译通过 → L2+命名规范 → L3+测试覆盖 → L4+安全扫描
|
||||
|
||||
### 5.2 三层反馈系统
|
||||
|
||||
| 层级 | 速度 | 覆盖范围 | 失败处理 |
|
||||
|------|------|---------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、签名 | 立即阻断,自行修复 |
|
||||
| **L2 数据流验证** | <5分钟 | 全链路字段、Mapper XML、DTO | 修复后上报 |
|
||||
| **L3 人工审查** | 10-30分钟 | 架构、设计、业务正确性 | 驳回/指导/批准 |
|
||||
|
||||
**反馈铁律**:
|
||||
- 反馈必须可行动(文件 + 行号 + 错误类型 + 修复方向)
|
||||
- 失败后先回滚到最近检查点,再重试
|
||||
- 持续失败3次 → 上报人类
|
||||
|
||||
### 5.3 控制平面
|
||||
|
||||
```
|
||||
战略层(人类) → 设定目标、审批决策、异常升级
|
||||
战术层(Agent) → 任务分解、update_plan、依赖协调、检查点保存
|
||||
执行层(Agent) → 代码生成、测试执行、错误恢复、幂等重试
|
||||
```
|
||||
|
||||
### 5.4 持久执行
|
||||
|
||||
- 每个关键步骤保存检查点(`update_plan` 进度)
|
||||
- 失败后从最新检查点恢复,不从头开始
|
||||
- 幂等设计:同一操作重复执行结果一致
|
||||
- **三层状态管理**:系统层(工作流ID/超时/重试) → 执行层(当前活动/进度) → 业务层(已完成工作/中间产物)
|
||||
|
||||
---
|
||||
|
||||
## 六、五层质量门禁
|
||||
|
||||
| 门禁 | 时间 | 范围 | 失败处理 |
|
||||
|------|------|------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、导入 | Agent 自行修复 |
|
||||
| **L2 静态分析** | <2分钟 | 代码风格、复杂度、安全 | Agent 修复 |
|
||||
| **L3 单元测试** | <5分钟 | 功能正确性、边界条件 | 自动修复或上报 |
|
||||
| **L4 集成测试** | <15分钟 | 模块间交互、数据流 | 上报人工 |
|
||||
| **L5 生产验证** | 持续 | 监控、告警、性能 | 自动回滚 |
|
||||
|
||||
**提交铁律**:L1-L2 必须通过才能 commit,L3(如有DB变更)必须通过才能 push
|
||||
|
||||
---
|
||||
|
||||
## 七、系统化调试(Systematic Debugging)
|
||||
|
||||
> **铁律:没有根因调查,不能提出修复方案。**
|
||||
|
||||
### 四阶段流程
|
||||
|
||||
**阶段1:根因调查**(修复前必须完成)
|
||||
1. 仔细阅读错误信息(堆栈、行号、错误码)
|
||||
2. 稳定复现(能否可靠触发?步骤?每次?)
|
||||
3. 检查最近变更(git diff、新依赖、配置变更)
|
||||
4. 多组件系统:在每个组件边界加诊断日志,定位哪一层断裂
|
||||
5. 追踪数据流:坏值从哪里来?谁调用的?一直追溯到源头
|
||||
|
||||
**阶段2:模式分析**
|
||||
- 找到同代码库中类似的正常工作代码
|
||||
- 逐项对比差异
|
||||
- 理解依赖关系
|
||||
|
||||
**阶段3:假设与测试**
|
||||
- 形成单一假设:"我认为X是根因,因为Y"
|
||||
- 做最小改动测试
|
||||
- 有效 → 阶段4;无效 → 新假设
|
||||
|
||||
**阶段4:实施**
|
||||
- 创建失败测试用例
|
||||
- 修复根因(不是症状)
|
||||
- 验证修复
|
||||
|
||||
---
|
||||
|
||||
## 八、后端开发规范
|
||||
|
||||
### 分层架构
|
||||
```
|
||||
Controller → AppService → Service → Mapper → Entity
|
||||
```
|
||||
|
||||
### 命名规范
|
||||
| 类型 | 规则 | 示例 |
|
||||
|------|------|------|
|
||||
| Controller | `XxxController` | `RegistrationController` |
|
||||
| AppService | `IXxxAppService` / `XxxAppServiceImpl` | `IRegistrationAppService` |
|
||||
| Service | `IXxxService` / `XxxServiceImpl` | `IRegistrationService` |
|
||||
| Mapper | `XxxMapper` | `RegistrationMapper` |
|
||||
| Entity | `Xxx` | `Registration` |
|
||||
| DTO | `XxxDto` / `XxxQueryDto` | `RegistrationDto` |
|
||||
|
||||
### 包结构
|
||||
```
|
||||
com.healthlink.his.web.{module}.controller
|
||||
com.healthlink.his.web.{module}.appservice
|
||||
com.healthlink.his.web.{module}.service
|
||||
com.healthlink.his.web.{module}.mapper
|
||||
com.healthlink.his.web.{module}.dto
|
||||
com.healthlink.his.domain.{module}
|
||||
com.healthlink.his.common.enums
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- 所有查询使用 `LambdaQueryWrapper`,禁止字符串拼接 SQL
|
||||
- `@Transactional(rollbackFor = Exception.class)` 管理事务
|
||||
- 所有接口标注 `@PreAuthorize` 权限控制
|
||||
- 患者敏感信息在日志中脱敏
|
||||
- **扩展功能不修改原有函数签名**
|
||||
|
||||
---
|
||||
|
||||
## 九、前端开发规范
|
||||
|
||||
### 技术栈
|
||||
- Vue 3 + Vite + Element Plus + Pinia + Axios(基于 RuoYi-Vue3)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
src/api/{module}/ # API接口
|
||||
src/views/{module}/ # 页面组件
|
||||
src/store/modules/ # Pinia状态管理
|
||||
src/components/ # 公共组件
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- API前缀:`/healthlink-his/api/v1/`
|
||||
- 路由懒加载:`() => import('@/views/xxx/index.vue')`
|
||||
- 页面使用 `<script setup>` 语法
|
||||
- 按钮权限使用 `v-hasPermi` 指令
|
||||
- `onMounted` 中注册的事件在 `onUnmounted` 中移除
|
||||
|
||||
---
|
||||
|
||||
## 十、Agent 体系
|
||||
|
||||
### 角色与路由
|
||||
|
||||
| 代号 | 名称 | 角色 | 路由关键词 |
|
||||
|------|------|------|-----------|
|
||||
| liubei | 刘备 | 项目经理 | 协调、分派、异常升级 |
|
||||
| zhugeliang | 诸葛亮 | 架构师 | 分析、路由、设计 |
|
||||
| guanyu | 关羽 | 后端开发 | java, api, spring, service, controller |
|
||||
| zhaoyun | 赵云 | 前端开发 | vue, 界面, 显示, 弹窗, 按钮 |
|
||||
| xunyu | 荀彧 | DBA | 数据库, sql, 迁移, mapper xml |
|
||||
| zhangfei | 张飞 | 测试 | 测试, QA, 回归 |
|
||||
| huatuo | 华佗 | 验收 | 需求验收、质量确认 |
|
||||
| chenlin | 陈琳 | 文档 | 文档、归档、Git提交 |
|
||||
|
||||
### 协作流水线
|
||||
|
||||
```
|
||||
刘备(协调) → 诸葛亮(分析路由) → {关羽|赵云}(修复) → 荀彧(DB审查) → 张飞(测试) → 华佗(验收) → 陈琳(归档)
|
||||
```
|
||||
|
||||
### Bug 修复完整管线(BDT 方法论)
|
||||
|
||||
```
|
||||
获取Bug → 设计测试用例 → 基线测试(应失败) → 全链路修复 → 回归测试(应通过) → 扩展测试(无回归) → 提交
|
||||
```
|
||||
|
||||
### Bug 状态管理铁律
|
||||
- 人类提的 Bug:只加备注,不改状态,不改分配
|
||||
- 智能体提的 Bug:可以改分配和加备注
|
||||
- 已关闭/已解决的 Bug 不再处理
|
||||
|
||||
---
|
||||
|
||||
## 十一、审查与审计
|
||||
|
||||
### 三层审查体系
|
||||
|
||||
| 层级 | 内容 | 时机 |
|
||||
|------|------|------|
|
||||
| **L1 自审** | Agent 对照约束逐条检查 | 每次提交前 |
|
||||
| **L2 配对审查** | Agent 生成变更摘要,人类终审 | PR/提交时 |
|
||||
| **L3 合规审查** | 审计追踪,记录所有 AI 操作 | 持续 |
|
||||
|
||||
### L1 自审清单
|
||||
```yaml
|
||||
self_review:
|
||||
- "所有修改能通过编译?"
|
||||
- "遵守命名规范?"
|
||||
- "测试覆盖达标?"
|
||||
- "没有遗漏的 TODO / DEBUG?"
|
||||
- "变更范围没超出任务边界?"
|
||||
```
|
||||
|
||||
### 评审评分维度
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 正确性 | 行为是否符合目标功能? |
|
||||
| 验证 | 检查是否真的跑过并留下证据? |
|
||||
| 范围纪律 | 是否保持在选定功能范围内? |
|
||||
| 可靠性 | 结果能否在重启后继续工作? |
|
||||
| 可维护性 | 代码和文档是否清楚到可交接? |
|
||||
|
||||
---
|
||||
|
||||
## 十二、标准工作循环
|
||||
|
||||
```
|
||||
开始会话
|
||||
├→ 1. Init — 读 AGENTS.md + PROGRESS.md + git log
|
||||
├→ 2. Select — 只选一个未完成功能
|
||||
├→ 3. Implement — 一次只做一个,不扩大范围
|
||||
├→ 4. Verify — 运行验证命令,有证据才标记完成
|
||||
└→ 5. Cleanup — 更新进度 + clean-state-checklist + git commit
|
||||
```
|
||||
|
||||
### 会话结束前必须运行 Clean State Checklist
|
||||
```
|
||||
□ 标准启动路径仍然可用
|
||||
□ 标准验证路径仍然可运行
|
||||
□ 当前进度已记录到进度日志
|
||||
□ 无半成品步骤处于未记录状态
|
||||
□ 下一轮会话无需人工修复即可继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十三、开发流程
|
||||
|
||||
```
|
||||
收到任务
|
||||
├→ ① 分析需求 → 读相关文档(MD/)、读全链路6环
|
||||
├→ ② 制定计划 → update_plan (3-6个阶段)
|
||||
├→ ③ 后端开发 → Controller → AppService → Service → Mapper → Entity → Flyway
|
||||
├→ ④ 后端测试 → mvn test → 接口测试(业务逻辑验证)
|
||||
├→ ⑤ 前端开发 → API接口 → 页面组件 → 路由配置
|
||||
├→ ⑥ 前端测试 → npm run build:dev → 功能验证
|
||||
├→ ⑦ 质量门禁 → L1编译 → L2测试 → L3DB审查 → L4验收 → L5归档
|
||||
└→ ⑧ 提交代码 → git commit(规范格式) → git push → 文档更新
|
||||
```
|
||||
|
||||
### Git Commit 格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
type: feat|fix|docs|refactor|test|chore
|
||||
scope: 模块名(如 registration, billing, pharmacy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十四、快速参考命令
|
||||
|
||||
```bash
|
||||
# === 后端 ===
|
||||
export JAVA_HOME=/opt/jdk-25
|
||||
mvn clean compile -DskipTests # 编译
|
||||
mvn install -DskipTests # 构建
|
||||
mvn test -pl healthlink-his-application -Dtest="XxxTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
|
||||
# === 前端 ===
|
||||
cd healthlink-his-ui
|
||||
npm run dev && npm run build:dev && npm run lint && npm run test:run
|
||||
|
||||
# === Git ===
|
||||
git status && git add -A && git commit -m "feat(module): desc" && git push origin develop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十五、详细规范文档索引
|
||||
|
||||
| 文档 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 执行铁律 | `MD/specs/IRON_RULES.md` | 铁律完整版 |
|
||||
| 后端规范 | `MD/specs/BACKEND_DEVELOPMENT_STANDARD.md` | 后端编码标准 |
|
||||
| 前端规范 | `MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md` | 前端编码标准 |
|
||||
| Harness方法论 | `MD/specs/HARNESS_ENGINEERING.md` | 完整Harness+Agent方法论 |
|
||||
| 文档规范 | `MD/DOCUMENTATION_STANDARD.md` | 文档管理标准 |
|
||||
| 后端清单 | `MD/specs/BACKEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 前端清单 | `MD/specs/FRONTEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 三甲标准 | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲医院达标标准 |
|
||||
| Flyway指南 | `MD/guides/FLYWAY_USAGE_GUIDE.md` | 数据库迁移指南 |
|
||||
|
||||
---
|
||||
|
||||
## 十六、过往教训
|
||||
|
||||
| 教训 | 内容 |
|
||||
|------|------|
|
||||
| 状态链路断裂 | Bug#574: 签到设 BOOKED(1) 而非 CHECKED_IN(3),前端映射缺失 → 必须走完整状态链路 |
|
||||
| 盲删源文件 | AI 看到编译错误直接删文件,没检查 baseline → 必须先确认文件来源 |
|
||||
| 修复方向偏差 | 多次 fallback 改的是错误的 Service → 必须用 rg 搜索所有相关代码路径 |
|
||||
| bug_reports 缺列 | INSERT 静默失败 → 必须检查表结构 |
|
||||
| 禅道 comment API | API 不存在,用 resolve+activate workaround |
|
||||
| SQLite WAL 并发 | 多进程并发写需要 checkpoint |
|
||||
| UTF-8 切片 | 多字节字符不能用 byte index 切片 |
|
||||
| 上下文焦虑 | Agent 感觉上下文快满时会匆忙结束,跳过验证 → 注意 context 40% 阈值 |
|
||||
| 过早宣告胜利 | 自评≠验证,分开"干活"和"检查" |
|
||||
| 覆盖率幻觉 | 覆盖率达标但逻辑没测 → 引入变异测试 |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ 本文件是 AI 开发规范的唯一信源。各工具配置文件由 `bash scripts/sync-ai-rules.sh` 同步。
|
||||
|
||||
---
|
||||
|
||||
> 📅 最后同步: 2026-06-06 15:09 | 源文件: RULES.md | 重新同步: `bash scripts/sync-ai-rules.sh`
|
||||
@@ -1,5 +0,0 @@
|
||||
ZENTAO_URL=https://zentao.gentronhealth.com/
|
||||
ZENTAO_ACCOUNT=guanyu
|
||||
ZENTAO_PASSWORD=Gentron@2025
|
||||
ZENTAO_TOKEN=49c270495806afdcf095c46959483326
|
||||
ZENTAO_REAL_ACCOUNT=guanyu
|
||||
509
.cursorrules
Normal file
509
.cursorrules
Normal file
@@ -0,0 +1,509 @@
|
||||
# HealthLink-HIS — AI 开发规范 (Cursor)
|
||||
|
||||
> 🤖 Cursor IDE 打开本项目时自动加载此文件。
|
||||
|
||||
---
|
||||
|
||||
# HealthLink-HIS — AI 开发规范(自动加载)
|
||||
|
||||
> 🤖 **本文件供所有 AI 编码工具自动读取**。进入本项目后必须遵守以下规范。
|
||||
>
|
||||
> **模型决定上限,Harness 决定底线。**
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概览
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| 项目名 | HealthLink-HIS(医院信息系统) |
|
||||
| 后端路径 | `healthlink-his-server/` |
|
||||
| 前端路径 | `healthlink-his-ui/` |
|
||||
| 文档路径 | `MD/` |
|
||||
| JDK | 25 (OpenJDK) |
|
||||
| Spring Boot | 4.0.6 |
|
||||
| MyBatis-Plus | 3.5.16 |
|
||||
| Vue | 3.x + Vite + Element Plus |
|
||||
| 数据库 | PostgreSQL 15+ |
|
||||
| 包名 | `com.healthlink.his` |
|
||||
| 后端端口 | 18082 |
|
||||
| 前端端口 | 81 |
|
||||
|
||||
---
|
||||
|
||||
## 二、铁律(必须遵守,违反即失败)
|
||||
|
||||
### 🔴 P0 铁律 — 不可违反
|
||||
|
||||
**铁律1: 修改完必须测试**
|
||||
```
|
||||
后端: mvn clean compile -DskipTests → mvn install -DskipTests → mvn test
|
||||
前端: npm run build:dev → npm run lint
|
||||
```
|
||||
- 白盒:编译通过,无 ERROR
|
||||
- 黑盒:关键接口返回 `{code:200, data:...}`,验证业务逻辑
|
||||
- 冒烟:应用正常启动,核心流程通畅
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
- 编译 + 测试全部通过后才能 git commit
|
||||
- 不提交未完成的功能、调试代码、临时文件
|
||||
|
||||
**铁律4: 前后端API路径对齐**
|
||||
- 后端前缀:`/healthlink-his/api/v1/`
|
||||
- 前端 `request.js` 的 baseURL 必须与后端匹配
|
||||
|
||||
**铁律5: 状态值一致性(Bug #574 教训)**
|
||||
- 修改任何状态值前,必须先列出完整的状态流转链路
|
||||
- 检查项:枚举定义 → Service 设置 → 查询映射 → 前端 STATUS_CLASS_MAP → 前端 v-if → 统计SQL
|
||||
- 禁止:只改一端不检查其他端
|
||||
|
||||
**铁律6: 禁止删除源文件(Bug #574 教训)**
|
||||
- 绝对禁止删除项目中已有的 Java/Vue/SQL 源文件
|
||||
- 编译错误 → 修复错误;重复文件 → 重构合并
|
||||
- 唯一例外:明确由人类确认删除的文件
|
||||
|
||||
**铁律7: 禁止修改已有公开方法签名**
|
||||
- 不能删除/重命名已有的 public 方法,不能修改参数列表
|
||||
- 需要新功能 → 添加重载方法;需要改行为 → 修改内部实现
|
||||
|
||||
**铁律8: 验证后才宣称完成(Verification Before Completion)**
|
||||
- **没有跑过验证命令,就不能说"完成了""通过了""没问题"**
|
||||
- 禁止使用"应该可以""大概没问题""看起来正确"
|
||||
- 必须:运行命令 → 读取输出 → 确认结果 → 才能宣称
|
||||
- 这是诚实原则,不是效率问题
|
||||
|
||||
|
||||
**铁律9: 开发前必须审核原有代码(P0 — 铁律)**
|
||||
- **任何新功能开发前,必须先搜索项目中是否已有相关代码**
|
||||
- 搜索路径:Controller / AppService / Service / Mapper / Entity / 前端页面 / API接口
|
||||
- 如果已有部分功能 → 在原有代码基础上**升级优化完善**,禁止另起炉灶
|
||||
- 如果已有接口但前端缺失 → 只补前端,不重复建后端
|
||||
- 如果已有前端但后端缺失 → 只补后端,不重写前端
|
||||
- 搜索命令:`rg -l "关键词" healthlink-his-server/ healthlink-his-ui/src/`
|
||||
- 禁止:不看代码就新建模块、重复实现已有功能、废弃原有代码另写一套
|
||||
|
||||
|
||||
**铁律12: 设计文档确认后自主开发(铁律)**
|
||||
- 设计文档(如 `MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md`)一旦确认,后续开发**必须按文档自主执行**
|
||||
- **禁止反复询问"是否继续""下一步做什么""是否开始"**——直接按计划推进
|
||||
- 每完成一个 Sprint,自动提交推送,然后立即开始下一个 Sprint
|
||||
- 只在遇到**无法解决的阻塞**(如技术选型冲突、需求不明确、第三方依赖不可用)时才暂停询问
|
||||
- 设计文档是"**已签合同**",不是"参考意见"。铁律执行优先级:设计文档 > 人类临时指令 > AI 自行判断
|
||||
|
||||
**铁律18: 禁止破坏原有功能(P0绝对铁律)**
|
||||
- **完善增加功能和流程时,绝对不能破坏或者让原有功能不能用**
|
||||
- 修改已有实体前必须对比原始文件(`git show HEAD~N:./file.java`),保留所有原有字段和方法
|
||||
- 新增字段只能追加,不能删除或重命名已有字段
|
||||
- SQL迁移只允许 `ALTER TABLE ADD COLUMN`,不允许 `DROP COLUMN` 或 `RENAME COLUMN`
|
||||
- Controller新端点不能修改已有端点的路径或参数
|
||||
- 前端新页面不能修改已有页面的组件结构
|
||||
- 每次修改后必须 `mvn clean compile -DskipTests` 验证
|
||||
- **违规判定**: 因修改导致原有代码编译失败或运行报错,视为违反铁律18,必须立即回滚修复
|
||||
|
||||
|
||||
### 🟡 P1 铁律 — 强烈建议
|
||||
|
||||
**铁律9: 先分解再行动**
|
||||
- 修改超过3个文件、涉及多模块、数据库变更,必须先制定计划
|
||||
|
||||
**铁律10: 验证后信**
|
||||
- 每次修改后必须验证编译通过,不信记忆
|
||||
|
||||
**铁律13: 文档统一管理**
|
||||
- 所有文档存储在 `MD/` 目录
|
||||
- 文件名:大写英文+下划线(如 `BACKEND_CHECKLIST.md`)
|
||||
- 文档头部必须包含元数据块(文档类型、版本、日期)
|
||||
|
||||
---
|
||||
|
||||
|
||||
**铁律14: 设计文档必须包含UI设计和调用流程**
|
||||
- 所有新模块/页面的设计文档必须包含:UI布局描述、交互效果清单、前后端调用流程
|
||||
- 没有明确UI设计的模块,禁止直接编码
|
||||
- 详见
|
||||
- 设计文档必须写清楚:系统调用关系、方法函数调用关系、完整业务流程
|
||||
- 设计文档中每个用户操作必须对应:前端事件 → API调用 → 后端处理链路 → 返回数据 → UI渲染
|
||||
|
||||
---
|
||||
|
||||
## 三、Karpathy 编码准则
|
||||
|
||||
> 减少 LLM 常见编码错误。偏向谨慎而非速度。
|
||||
|
||||
### 3.1 先想再写
|
||||
- 明确陈述假设,不确定就问
|
||||
- 多种解读时都列出来,不要默默选一种
|
||||
- 有更简单的方案就说出来,该推回就推回
|
||||
- 不清楚的地方停下来,说清楚哪里不清楚
|
||||
|
||||
### 3.2 简洁优先
|
||||
- 不做没要求的功能,不做一次性代码的抽象
|
||||
- 不加没要求的"灵活性"和"可配置性"
|
||||
- 200 行能 50 行搞定就重写
|
||||
- 自问:"高级工程师会不会觉得这过度设计?"
|
||||
|
||||
### 3.3 精准修改
|
||||
- 只改必须改的,不"顺手改进"相邻代码
|
||||
- 匹配现有代码风格,即使你有不同的偏好
|
||||
- 每行改动都能追溯到用户的请求
|
||||
- 只清理你自己改动产生的无用代码
|
||||
|
||||
### 3.4 目标驱动
|
||||
- 把任务转化为可验证目标
|
||||
- 多步任务声明计划:`[步骤] → 验证: [检查]`
|
||||
- 强验收标准让 Agent 能独立循环,弱标准需要持续澄清
|
||||
|
||||
---
|
||||
|
||||
## 四、全链路 6 环分析
|
||||
|
||||
> ⚠️ **涉及数据库字段的 Bug / 需求,必须走完整链路。**
|
||||
|
||||
```
|
||||
前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块
|
||||
①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动
|
||||
```
|
||||
|
||||
| 环 | 检查内容 |
|
||||
|----|---------|
|
||||
| ① 录入 | 前端有无输入入口(弹窗、表格行编辑、表单) |
|
||||
| ② 验证 | Controller 参数校验、@Valid、权限控制 |
|
||||
| ③ 业务 | Service 业务逻辑、事务边界、多个 Service 实现类入口 |
|
||||
| ④ 持久化 | Mapper XML、DTO 字段映射、类型转换 |
|
||||
| ⑤ 存储 | 数据库表结构、索引、NOT NULL 约束 |
|
||||
| ⑥ 联动 | 上游(医嘱→护士站)、下游(打印、计费、报表)是否同步 |
|
||||
|
||||
**修复后的验证顺序**:
|
||||
1. 数据库:确认状态值已正确写入
|
||||
2. 后端接口:确认返回的状态映射正确
|
||||
3. 前端显示:确认页面显示正确状态文本
|
||||
4. 前端交互:确认按钮/操作基于正确状态启用/禁用
|
||||
5. 统计数据:确认池/报表统计包含新状态
|
||||
|
||||
---
|
||||
|
||||
## 五、Harness Engineering 方法论
|
||||
|
||||
> Harness = 约束 + 反馈 + 控制平面 + 持久执行
|
||||
|
||||
### 5.1 四层约束金字塔
|
||||
|
||||
| 层级 | 内容 | 落地方式 |
|
||||
|------|------|---------|
|
||||
| **L1 架构约束** | 接口合约、包结构、命名规范、禁止模式 | 本文件铁律 |
|
||||
| **L2 代码质量** | 圈复杂度、代码风格、类型提示 | 编译门禁 + ESLint |
|
||||
| **L3 安全约束** | 敏感信息检测、权限检查、输入验证 | 配置不可硬编码 |
|
||||
| **L4 业务规则** | 领域逻辑、数据一致性、事务边界 | 全链路 6 环验证 |
|
||||
|
||||
**约束设计原则**:
|
||||
- **可验证**:每条约束必须能被自动化检查("覆盖率>90%"✅ "质量要高"❌)
|
||||
- **无歧义**:"每函数不超过50行"✅ "函数不要太长"❌
|
||||
- **优先级**:安全(1) > 架构(2) > 业务(3) > 质量(4) > 性能(5)
|
||||
- **渐进增强**:L1编译通过 → L2+命名规范 → L3+测试覆盖 → L4+安全扫描
|
||||
|
||||
### 5.2 三层反馈系统
|
||||
|
||||
| 层级 | 速度 | 覆盖范围 | 失败处理 |
|
||||
|------|------|---------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、签名 | 立即阻断,自行修复 |
|
||||
| **L2 数据流验证** | <5分钟 | 全链路字段、Mapper XML、DTO | 修复后上报 |
|
||||
| **L3 人工审查** | 10-30分钟 | 架构、设计、业务正确性 | 驳回/指导/批准 |
|
||||
|
||||
**反馈铁律**:
|
||||
- 反馈必须可行动(文件 + 行号 + 错误类型 + 修复方向)
|
||||
- 失败后先回滚到最近检查点,再重试
|
||||
- 持续失败3次 → 上报人类
|
||||
|
||||
### 5.3 控制平面
|
||||
|
||||
```
|
||||
战略层(人类) → 设定目标、审批决策、异常升级
|
||||
战术层(Agent) → 任务分解、update_plan、依赖协调、检查点保存
|
||||
执行层(Agent) → 代码生成、测试执行、错误恢复、幂等重试
|
||||
```
|
||||
|
||||
### 5.4 持久执行
|
||||
|
||||
- 每个关键步骤保存检查点(`update_plan` 进度)
|
||||
- 失败后从最新检查点恢复,不从头开始
|
||||
- 幂等设计:同一操作重复执行结果一致
|
||||
- **三层状态管理**:系统层(工作流ID/超时/重试) → 执行层(当前活动/进度) → 业务层(已完成工作/中间产物)
|
||||
|
||||
---
|
||||
|
||||
## 六、五层质量门禁
|
||||
|
||||
| 门禁 | 时间 | 范围 | 失败处理 |
|
||||
|------|------|------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、导入 | Agent 自行修复 |
|
||||
| **L2 静态分析** | <2分钟 | 代码风格、复杂度、安全 | Agent 修复 |
|
||||
| **L3 单元测试** | <5分钟 | 功能正确性、边界条件 | 自动修复或上报 |
|
||||
| **L4 集成测试** | <15分钟 | 模块间交互、数据流 | 上报人工 |
|
||||
| **L5 生产验证** | 持续 | 监控、告警、性能 | 自动回滚 |
|
||||
|
||||
**提交铁律**:L1-L2 必须通过才能 commit,L3(如有DB变更)必须通过才能 push
|
||||
|
||||
---
|
||||
|
||||
## 七、系统化调试(Systematic Debugging)
|
||||
|
||||
> **铁律:没有根因调查,不能提出修复方案。**
|
||||
|
||||
### 四阶段流程
|
||||
|
||||
**阶段1:根因调查**(修复前必须完成)
|
||||
1. 仔细阅读错误信息(堆栈、行号、错误码)
|
||||
2. 稳定复现(能否可靠触发?步骤?每次?)
|
||||
3. 检查最近变更(git diff、新依赖、配置变更)
|
||||
4. 多组件系统:在每个组件边界加诊断日志,定位哪一层断裂
|
||||
5. 追踪数据流:坏值从哪里来?谁调用的?一直追溯到源头
|
||||
|
||||
**阶段2:模式分析**
|
||||
- 找到同代码库中类似的正常工作代码
|
||||
- 逐项对比差异
|
||||
- 理解依赖关系
|
||||
|
||||
**阶段3:假设与测试**
|
||||
- 形成单一假设:"我认为X是根因,因为Y"
|
||||
- 做最小改动测试
|
||||
- 有效 → 阶段4;无效 → 新假设
|
||||
|
||||
**阶段4:实施**
|
||||
- 创建失败测试用例
|
||||
- 修复根因(不是症状)
|
||||
- 验证修复
|
||||
|
||||
---
|
||||
|
||||
## 八、后端开发规范
|
||||
|
||||
### 分层架构
|
||||
```
|
||||
Controller → AppService → Service → Mapper → Entity
|
||||
```
|
||||
|
||||
### 命名规范
|
||||
| 类型 | 规则 | 示例 |
|
||||
|------|------|------|
|
||||
| Controller | `XxxController` | `RegistrationController` |
|
||||
| AppService | `IXxxAppService` / `XxxAppServiceImpl` | `IRegistrationAppService` |
|
||||
| Service | `IXxxService` / `XxxServiceImpl` | `IRegistrationService` |
|
||||
| Mapper | `XxxMapper` | `RegistrationMapper` |
|
||||
| Entity | `Xxx` | `Registration` |
|
||||
| DTO | `XxxDto` / `XxxQueryDto` | `RegistrationDto` |
|
||||
|
||||
### 包结构
|
||||
```
|
||||
com.healthlink.his.web.{module}.controller
|
||||
com.healthlink.his.web.{module}.appservice
|
||||
com.healthlink.his.web.{module}.service
|
||||
com.healthlink.his.web.{module}.mapper
|
||||
com.healthlink.his.web.{module}.dto
|
||||
com.healthlink.his.domain.{module}
|
||||
com.healthlink.his.common.enums
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- 所有查询使用 `LambdaQueryWrapper`,禁止字符串拼接 SQL
|
||||
- `@Transactional(rollbackFor = Exception.class)` 管理事务
|
||||
- 所有接口标注 `@PreAuthorize` 权限控制
|
||||
- 患者敏感信息在日志中脱敏
|
||||
- **扩展功能不修改原有函数签名**
|
||||
|
||||
---
|
||||
|
||||
## 九、前端开发规范
|
||||
|
||||
### 技术栈
|
||||
- Vue 3 + Vite + Element Plus + Pinia + Axios(基于 RuoYi-Vue3)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
src/api/{module}/ # API接口
|
||||
src/views/{module}/ # 页面组件
|
||||
src/store/modules/ # Pinia状态管理
|
||||
src/components/ # 公共组件
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- API前缀:`/healthlink-his/api/v1/`
|
||||
- 路由懒加载:`() => import('@/views/xxx/index.vue')`
|
||||
- 页面使用 `<script setup>` 语法
|
||||
- 按钮权限使用 `v-hasPermi` 指令
|
||||
- `onMounted` 中注册的事件在 `onUnmounted` 中移除
|
||||
|
||||
---
|
||||
|
||||
## 十、Agent 体系
|
||||
|
||||
### 角色与路由
|
||||
|
||||
| 代号 | 名称 | 角色 | 路由关键词 |
|
||||
|------|------|------|-----------|
|
||||
| liubei | 刘备 | 项目经理 | 协调、分派、异常升级 |
|
||||
| zhugeliang | 诸葛亮 | 架构师 | 分析、路由、设计 |
|
||||
| guanyu | 关羽 | 后端开发 | java, api, spring, service, controller |
|
||||
| zhaoyun | 赵云 | 前端开发 | vue, 界面, 显示, 弹窗, 按钮 |
|
||||
| xunyu | 荀彧 | DBA | 数据库, sql, 迁移, mapper xml |
|
||||
| zhangfei | 张飞 | 测试 | 测试, QA, 回归 |
|
||||
| huatuo | 华佗 | 验收 | 需求验收、质量确认 |
|
||||
| chenlin | 陈琳 | 文档 | 文档、归档、Git提交 |
|
||||
|
||||
### 协作流水线
|
||||
|
||||
```
|
||||
刘备(协调) → 诸葛亮(分析路由) → {关羽|赵云}(修复) → 荀彧(DB审查) → 张飞(测试) → 华佗(验收) → 陈琳(归档)
|
||||
```
|
||||
|
||||
### Bug 修复完整管线(BDT 方法论)
|
||||
|
||||
```
|
||||
获取Bug → 设计测试用例 → 基线测试(应失败) → 全链路修复 → 回归测试(应通过) → 扩展测试(无回归) → 提交
|
||||
```
|
||||
|
||||
### Bug 状态管理铁律
|
||||
- 人类提的 Bug:只加备注,不改状态,不改分配
|
||||
- 智能体提的 Bug:可以改分配和加备注
|
||||
- 已关闭/已解决的 Bug 不再处理
|
||||
|
||||
---
|
||||
|
||||
## 十一、审查与审计
|
||||
|
||||
### 三层审查体系
|
||||
|
||||
| 层级 | 内容 | 时机 |
|
||||
|------|------|------|
|
||||
| **L1 自审** | Agent 对照约束逐条检查 | 每次提交前 |
|
||||
| **L2 配对审查** | Agent 生成变更摘要,人类终审 | PR/提交时 |
|
||||
| **L3 合规审查** | 审计追踪,记录所有 AI 操作 | 持续 |
|
||||
|
||||
### L1 自审清单
|
||||
```yaml
|
||||
self_review:
|
||||
- "所有修改能通过编译?"
|
||||
- "遵守命名规范?"
|
||||
- "测试覆盖达标?"
|
||||
- "没有遗漏的 TODO / DEBUG?"
|
||||
- "变更范围没超出任务边界?"
|
||||
```
|
||||
|
||||
### 评审评分维度
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 正确性 | 行为是否符合目标功能? |
|
||||
| 验证 | 检查是否真的跑过并留下证据? |
|
||||
| 范围纪律 | 是否保持在选定功能范围内? |
|
||||
| 可靠性 | 结果能否在重启后继续工作? |
|
||||
| 可维护性 | 代码和文档是否清楚到可交接? |
|
||||
|
||||
---
|
||||
|
||||
## 十二、标准工作循环
|
||||
|
||||
```
|
||||
开始会话
|
||||
├→ 1. Init — 读 AGENTS.md + PROGRESS.md + git log
|
||||
├→ 2. Select — 只选一个未完成功能
|
||||
├→ 3. Implement — 一次只做一个,不扩大范围
|
||||
├→ 4. Verify — 运行验证命令,有证据才标记完成
|
||||
└→ 5. Cleanup — 更新进度 + clean-state-checklist + git commit
|
||||
```
|
||||
|
||||
### 会话结束前必须运行 Clean State Checklist
|
||||
```
|
||||
□ 标准启动路径仍然可用
|
||||
□ 标准验证路径仍然可运行
|
||||
□ 当前进度已记录到进度日志
|
||||
□ 无半成品步骤处于未记录状态
|
||||
□ 下一轮会话无需人工修复即可继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十三、开发流程
|
||||
|
||||
```
|
||||
收到任务
|
||||
├→ ① 分析需求 → 读相关文档(MD/)、读全链路6环
|
||||
├→ ② 制定计划 → update_plan (3-6个阶段)
|
||||
├→ ③ 后端开发 → Controller → AppService → Service → Mapper → Entity → Flyway
|
||||
├→ ④ 后端测试 → mvn test → 接口测试(业务逻辑验证)
|
||||
├→ ⑤ 前端开发 → API接口 → 页面组件 → 路由配置
|
||||
├→ ⑥ 前端测试 → npm run build:dev → 功能验证
|
||||
├→ ⑦ 质量门禁 → L1编译 → L2测试 → L3DB审查 → L4验收 → L5归档
|
||||
└→ ⑧ 提交代码 → git commit(规范格式) → git push → 文档更新
|
||||
```
|
||||
|
||||
### Git Commit 格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
type: feat|fix|docs|refactor|test|chore
|
||||
scope: 模块名(如 registration, billing, pharmacy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十四、快速参考命令
|
||||
|
||||
```bash
|
||||
# === 后端 ===
|
||||
export JAVA_HOME=/opt/jdk-25
|
||||
mvn clean compile -DskipTests # 编译
|
||||
mvn install -DskipTests # 构建
|
||||
mvn test -pl healthlink-his-application -Dtest="XxxTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
|
||||
# === 前端 ===
|
||||
cd healthlink-his-ui
|
||||
npm run dev && npm run build:dev && npm run lint && npm run test:run
|
||||
|
||||
# === Git ===
|
||||
git status && git add -A && git commit -m "feat(module): desc" && git push origin develop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十五、详细规范文档索引
|
||||
|
||||
| 文档 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 执行铁律 | `MD/specs/IRON_RULES.md` | 铁律完整版 |
|
||||
| 后端规范 | `MD/specs/BACKEND_DEVELOPMENT_STANDARD.md` | 后端编码标准 |
|
||||
| 前端规范 | `MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md` | 前端编码标准 |
|
||||
| Harness方法论 | `MD/specs/HARNESS_ENGINEERING.md` | 完整Harness+Agent方法论 |
|
||||
| 文档规范 | `MD/DOCUMENTATION_STANDARD.md` | 文档管理标准 |
|
||||
| 后端清单 | `MD/specs/BACKEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 前端清单 | `MD/specs/FRONTEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 三甲标准 | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲医院达标标准 |
|
||||
| Flyway指南 | `MD/guides/FLYWAY_USAGE_GUIDE.md` | 数据库迁移指南 |
|
||||
|
||||
---
|
||||
|
||||
## 十六、过往教训
|
||||
|
||||
| 教训 | 内容 |
|
||||
|------|------|
|
||||
| 状态链路断裂 | Bug#574: 签到设 BOOKED(1) 而非 CHECKED_IN(3),前端映射缺失 → 必须走完整状态链路 |
|
||||
| 盲删源文件 | AI 看到编译错误直接删文件,没检查 baseline → 必须先确认文件来源 |
|
||||
| 修复方向偏差 | 多次 fallback 改的是错误的 Service → 必须用 rg 搜索所有相关代码路径 |
|
||||
| bug_reports 缺列 | INSERT 静默失败 → 必须检查表结构 |
|
||||
| 禅道 comment API | API 不存在,用 resolve+activate workaround |
|
||||
| SQLite WAL 并发 | 多进程并发写需要 checkpoint |
|
||||
| UTF-8 切片 | 多字节字符不能用 byte index 切片 |
|
||||
| 上下文焦虑 | Agent 感觉上下文快满时会匆忙结束,跳过验证 → 注意 context 40% 阈值 |
|
||||
| 过早宣告胜利 | 自评≠验证,分开"干活"和"检查" |
|
||||
| 覆盖率幻觉 | 覆盖率达标但逻辑没测 → 引入变异测试 |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ 本文件是 AI 开发规范的唯一信源。各工具配置文件由 `bash scripts/sync-ai-rules.sh` 同步。
|
||||
|
||||
---
|
||||
|
||||
> 📅 最后同步: 2026-06-06 15:09 | 源文件: RULES.md | 重新同步: `bash scripts/sync-ai-rules.sh`
|
||||
499
.github/copilot-instructions.md
vendored
Normal file
499
.github/copilot-instructions.md
vendored
Normal file
@@ -0,0 +1,499 @@
|
||||
# HealthLink-HIS — AI 开发规范 (GitHub Copilot)
|
||||
|
||||
> 🤖 GitHub Copilot 打开本项目时自动加载此文件。
|
||||
|
||||
---
|
||||
|
||||
# HealthLink-HIS — AI 开发规范(自动加载)
|
||||
|
||||
> 🤖 **本文件供所有 AI 编码工具自动读取**。进入本项目后必须遵守以下规范。
|
||||
>
|
||||
> **模型决定上限,Harness 决定底线。**
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概览
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| 项目名 | HealthLink-HIS(医院信息系统) |
|
||||
| 后端路径 | `healthlink-his-server/` |
|
||||
| 前端路径 | `healthlink-his-ui/` |
|
||||
| 文档路径 | `MD/` |
|
||||
| JDK | 25 (OpenJDK) |
|
||||
| Spring Boot | 4.0.6 |
|
||||
| MyBatis-Plus | 3.5.16 |
|
||||
| Vue | 3.x + Vite + Element Plus |
|
||||
| 数据库 | PostgreSQL 15+ |
|
||||
| 包名 | `com.healthlink.his` |
|
||||
| 后端端口 | 18082 |
|
||||
| 前端端口 | 81 |
|
||||
|
||||
---
|
||||
|
||||
## 二、铁律(必须遵守,违反即失败)
|
||||
|
||||
### 🔴 P0 铁律 — 不可违反
|
||||
|
||||
**铁律1: 修改完必须测试**
|
||||
```
|
||||
后端: mvn clean compile -DskipTests → mvn install -DskipTests → mvn test
|
||||
前端: npm run build:dev → npm run lint
|
||||
```
|
||||
- 白盒:编译通过,无 ERROR
|
||||
- 黑盒:关键接口返回 `{code:200, data:...}`,验证业务逻辑
|
||||
- 冒烟:应用正常启动,核心流程通畅
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
- 编译 + 测试全部通过后才能 git commit
|
||||
- 不提交未完成的功能、调试代码、临时文件
|
||||
|
||||
**铁律4: 前后端API路径对齐**
|
||||
- 后端前缀:`/healthlink-his/api/v1/`
|
||||
- 前端 `request.js` 的 baseURL 必须与后端匹配
|
||||
|
||||
**铁律5: 状态值一致性(Bug #574 教训)**
|
||||
- 修改任何状态值前,必须先列出完整的状态流转链路
|
||||
- 检查项:枚举定义 → Service 设置 → 查询映射 → 前端 STATUS_CLASS_MAP → 前端 v-if → 统计SQL
|
||||
- 禁止:只改一端不检查其他端
|
||||
|
||||
**铁律6: 禁止删除源文件(Bug #574 教训)**
|
||||
- 绝对禁止删除项目中已有的 Java/Vue/SQL 源文件
|
||||
- 编译错误 → 修复错误;重复文件 → 重构合并
|
||||
- 唯一例外:明确由人类确认删除的文件
|
||||
|
||||
**铁律7: 禁止修改已有公开方法签名**
|
||||
- 不能删除/重命名已有的 public 方法,不能修改参数列表
|
||||
- 需要新功能 → 添加重载方法;需要改行为 → 修改内部实现
|
||||
|
||||
**铁律8: 验证后才宣称完成(Verification Before Completion)**
|
||||
- **没有跑过验证命令,就不能说"完成了""通过了""没问题"**
|
||||
- 禁止使用"应该可以""大概没问题""看起来正确"
|
||||
- 必须:运行命令 → 读取输出 → 确认结果 → 才能宣称
|
||||
- 这是诚实原则,不是效率问题
|
||||
|
||||
|
||||
**铁律9: 开发前必须审核原有代码(P0 — 铁律)**
|
||||
- **任何新功能开发前,必须先搜索项目中是否已有相关代码**
|
||||
- 搜索路径:Controller / AppService / Service / Mapper / Entity / 前端页面 / API接口
|
||||
- 如果已有部分功能 → 在原有代码基础上**升级优化完善**,禁止另起炉灶
|
||||
- 如果已有接口但前端缺失 → 只补前端,不重复建后端
|
||||
- 如果已有前端但后端缺失 → 只补后端,不重写前端
|
||||
- 搜索命令:`rg -l "关键词" healthlink-his-server/ healthlink-his-ui/src/`
|
||||
- 禁止:不看代码就新建模块、重复实现已有功能、废弃原有代码另写一套
|
||||
|
||||
|
||||
**铁律12: 设计文档确认后自主开发(铁律)**
|
||||
- 设计文档(如 `MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md`)一旦确认,后续开发**必须按文档自主执行**
|
||||
- **禁止反复询问"是否继续""下一步做什么""是否开始"**——直接按计划推进
|
||||
- 每完成一个 Sprint,自动提交推送,然后立即开始下一个 Sprint
|
||||
- 只在遇到**无法解决的阻塞**(如技术选型冲突、需求不明确、第三方依赖不可用)时才暂停询问
|
||||
- 设计文档是"**已签合同**",不是"参考意见"。铁律执行优先级:设计文档 > 人类临时指令 > AI 自行判断
|
||||
|
||||
|
||||
### 🟡 P1 铁律 — 强烈建议
|
||||
|
||||
**铁律9: 先分解再行动**
|
||||
- 修改超过3个文件、涉及多模块、数据库变更,必须先制定计划
|
||||
|
||||
**铁律10: 验证后信**
|
||||
- 每次修改后必须验证编译通过,不信记忆
|
||||
|
||||
**铁律13: 文档统一管理**
|
||||
- 所有文档存储在 `MD/` 目录
|
||||
- 文件名:大写英文+下划线(如 `BACKEND_CHECKLIST.md`)
|
||||
- 文档头部必须包含元数据块(文档类型、版本、日期)
|
||||
|
||||
---
|
||||
|
||||
|
||||
**铁律14: 设计文档必须包含UI设计和调用流程**
|
||||
- 所有新模块/页面的设计文档必须包含:UI布局描述、交互效果清单、前后端调用流程
|
||||
- 没有明确UI设计的模块,禁止直接编码
|
||||
- 详见
|
||||
- 设计文档必须写清楚:系统调用关系、方法函数调用关系、完整业务流程
|
||||
- 设计文档中每个用户操作必须对应:前端事件 → API调用 → 后端处理链路 → 返回数据 → UI渲染
|
||||
|
||||
---
|
||||
|
||||
## 三、Karpathy 编码准则
|
||||
|
||||
> 减少 LLM 常见编码错误。偏向谨慎而非速度。
|
||||
|
||||
### 3.1 先想再写
|
||||
- 明确陈述假设,不确定就问
|
||||
- 多种解读时都列出来,不要默默选一种
|
||||
- 有更简单的方案就说出来,该推回就推回
|
||||
- 不清楚的地方停下来,说清楚哪里不清楚
|
||||
|
||||
### 3.2 简洁优先
|
||||
- 不做没要求的功能,不做一次性代码的抽象
|
||||
- 不加没要求的"灵活性"和"可配置性"
|
||||
- 200 行能 50 行搞定就重写
|
||||
- 自问:"高级工程师会不会觉得这过度设计?"
|
||||
|
||||
### 3.3 精准修改
|
||||
- 只改必须改的,不"顺手改进"相邻代码
|
||||
- 匹配现有代码风格,即使你有不同的偏好
|
||||
- 每行改动都能追溯到用户的请求
|
||||
- 只清理你自己改动产生的无用代码
|
||||
|
||||
### 3.4 目标驱动
|
||||
- 把任务转化为可验证目标
|
||||
- 多步任务声明计划:`[步骤] → 验证: [检查]`
|
||||
- 强验收标准让 Agent 能独立循环,弱标准需要持续澄清
|
||||
|
||||
---
|
||||
|
||||
## 四、全链路 6 环分析
|
||||
|
||||
> ⚠️ **涉及数据库字段的 Bug / 需求,必须走完整链路。**
|
||||
|
||||
```
|
||||
前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块
|
||||
①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动
|
||||
```
|
||||
|
||||
| 环 | 检查内容 |
|
||||
|----|---------|
|
||||
| ① 录入 | 前端有无输入入口(弹窗、表格行编辑、表单) |
|
||||
| ② 验证 | Controller 参数校验、@Valid、权限控制 |
|
||||
| ③ 业务 | Service 业务逻辑、事务边界、多个 Service 实现类入口 |
|
||||
| ④ 持久化 | Mapper XML、DTO 字段映射、类型转换 |
|
||||
| ⑤ 存储 | 数据库表结构、索引、NOT NULL 约束 |
|
||||
| ⑥ 联动 | 上游(医嘱→护士站)、下游(打印、计费、报表)是否同步 |
|
||||
|
||||
**修复后的验证顺序**:
|
||||
1. 数据库:确认状态值已正确写入
|
||||
2. 后端接口:确认返回的状态映射正确
|
||||
3. 前端显示:确认页面显示正确状态文本
|
||||
4. 前端交互:确认按钮/操作基于正确状态启用/禁用
|
||||
5. 统计数据:确认池/报表统计包含新状态
|
||||
|
||||
---
|
||||
|
||||
## 五、Harness Engineering 方法论
|
||||
|
||||
> Harness = 约束 + 反馈 + 控制平面 + 持久执行
|
||||
|
||||
### 5.1 四层约束金字塔
|
||||
|
||||
| 层级 | 内容 | 落地方式 |
|
||||
|------|------|---------|
|
||||
| **L1 架构约束** | 接口合约、包结构、命名规范、禁止模式 | 本文件铁律 |
|
||||
| **L2 代码质量** | 圈复杂度、代码风格、类型提示 | 编译门禁 + ESLint |
|
||||
| **L3 安全约束** | 敏感信息检测、权限检查、输入验证 | 配置不可硬编码 |
|
||||
| **L4 业务规则** | 领域逻辑、数据一致性、事务边界 | 全链路 6 环验证 |
|
||||
|
||||
**约束设计原则**:
|
||||
- **可验证**:每条约束必须能被自动化检查("覆盖率>90%"✅ "质量要高"❌)
|
||||
- **无歧义**:"每函数不超过50行"✅ "函数不要太长"❌
|
||||
- **优先级**:安全(1) > 架构(2) > 业务(3) > 质量(4) > 性能(5)
|
||||
- **渐进增强**:L1编译通过 → L2+命名规范 → L3+测试覆盖 → L4+安全扫描
|
||||
|
||||
### 5.2 三层反馈系统
|
||||
|
||||
| 层级 | 速度 | 覆盖范围 | 失败处理 |
|
||||
|------|------|---------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、签名 | 立即阻断,自行修复 |
|
||||
| **L2 数据流验证** | <5分钟 | 全链路字段、Mapper XML、DTO | 修复后上报 |
|
||||
| **L3 人工审查** | 10-30分钟 | 架构、设计、业务正确性 | 驳回/指导/批准 |
|
||||
|
||||
**反馈铁律**:
|
||||
- 反馈必须可行动(文件 + 行号 + 错误类型 + 修复方向)
|
||||
- 失败后先回滚到最近检查点,再重试
|
||||
- 持续失败3次 → 上报人类
|
||||
|
||||
### 5.3 控制平面
|
||||
|
||||
```
|
||||
战略层(人类) → 设定目标、审批决策、异常升级
|
||||
战术层(Agent) → 任务分解、update_plan、依赖协调、检查点保存
|
||||
执行层(Agent) → 代码生成、测试执行、错误恢复、幂等重试
|
||||
```
|
||||
|
||||
### 5.4 持久执行
|
||||
|
||||
- 每个关键步骤保存检查点(`update_plan` 进度)
|
||||
- 失败后从最新检查点恢复,不从头开始
|
||||
- 幂等设计:同一操作重复执行结果一致
|
||||
- **三层状态管理**:系统层(工作流ID/超时/重试) → 执行层(当前活动/进度) → 业务层(已完成工作/中间产物)
|
||||
|
||||
---
|
||||
|
||||
## 六、五层质量门禁
|
||||
|
||||
| 门禁 | 时间 | 范围 | 失败处理 |
|
||||
|------|------|------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、导入 | Agent 自行修复 |
|
||||
| **L2 静态分析** | <2分钟 | 代码风格、复杂度、安全 | Agent 修复 |
|
||||
| **L3 单元测试** | <5分钟 | 功能正确性、边界条件 | 自动修复或上报 |
|
||||
| **L4 集成测试** | <15分钟 | 模块间交互、数据流 | 上报人工 |
|
||||
| **L5 生产验证** | 持续 | 监控、告警、性能 | 自动回滚 |
|
||||
|
||||
**提交铁律**:L1-L2 必须通过才能 commit,L3(如有DB变更)必须通过才能 push
|
||||
|
||||
---
|
||||
|
||||
## 七、系统化调试(Systematic Debugging)
|
||||
|
||||
> **铁律:没有根因调查,不能提出修复方案。**
|
||||
|
||||
### 四阶段流程
|
||||
|
||||
**阶段1:根因调查**(修复前必须完成)
|
||||
1. 仔细阅读错误信息(堆栈、行号、错误码)
|
||||
2. 稳定复现(能否可靠触发?步骤?每次?)
|
||||
3. 检查最近变更(git diff、新依赖、配置变更)
|
||||
4. 多组件系统:在每个组件边界加诊断日志,定位哪一层断裂
|
||||
5. 追踪数据流:坏值从哪里来?谁调用的?一直追溯到源头
|
||||
|
||||
**阶段2:模式分析**
|
||||
- 找到同代码库中类似的正常工作代码
|
||||
- 逐项对比差异
|
||||
- 理解依赖关系
|
||||
|
||||
**阶段3:假设与测试**
|
||||
- 形成单一假设:"我认为X是根因,因为Y"
|
||||
- 做最小改动测试
|
||||
- 有效 → 阶段4;无效 → 新假设
|
||||
|
||||
**阶段4:实施**
|
||||
- 创建失败测试用例
|
||||
- 修复根因(不是症状)
|
||||
- 验证修复
|
||||
|
||||
---
|
||||
|
||||
## 八、后端开发规范
|
||||
|
||||
### 分层架构
|
||||
```
|
||||
Controller → AppService → Service → Mapper → Entity
|
||||
```
|
||||
|
||||
### 命名规范
|
||||
| 类型 | 规则 | 示例 |
|
||||
|------|------|------|
|
||||
| Controller | `XxxController` | `RegistrationController` |
|
||||
| AppService | `IXxxAppService` / `XxxAppServiceImpl` | `IRegistrationAppService` |
|
||||
| Service | `IXxxService` / `XxxServiceImpl` | `IRegistrationService` |
|
||||
| Mapper | `XxxMapper` | `RegistrationMapper` |
|
||||
| Entity | `Xxx` | `Registration` |
|
||||
| DTO | `XxxDto` / `XxxQueryDto` | `RegistrationDto` |
|
||||
|
||||
### 包结构
|
||||
```
|
||||
com.healthlink.his.web.{module}.controller
|
||||
com.healthlink.his.web.{module}.appservice
|
||||
com.healthlink.his.web.{module}.service
|
||||
com.healthlink.his.web.{module}.mapper
|
||||
com.healthlink.his.web.{module}.dto
|
||||
com.healthlink.his.domain.{module}
|
||||
com.healthlink.his.common.enums
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- 所有查询使用 `LambdaQueryWrapper`,禁止字符串拼接 SQL
|
||||
- `@Transactional(rollbackFor = Exception.class)` 管理事务
|
||||
- 所有接口标注 `@PreAuthorize` 权限控制
|
||||
- 患者敏感信息在日志中脱敏
|
||||
- **扩展功能不修改原有函数签名**
|
||||
|
||||
---
|
||||
|
||||
## 九、前端开发规范
|
||||
|
||||
### 技术栈
|
||||
- Vue 3 + Vite + Element Plus + Pinia + Axios(基于 RuoYi-Vue3)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
src/api/{module}/ # API接口
|
||||
src/views/{module}/ # 页面组件
|
||||
src/store/modules/ # Pinia状态管理
|
||||
src/components/ # 公共组件
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- API前缀:`/healthlink-his/api/v1/`
|
||||
- 路由懒加载:`() => import('@/views/xxx/index.vue')`
|
||||
- 页面使用 `<script setup>` 语法
|
||||
- 按钮权限使用 `v-hasPermi` 指令
|
||||
- `onMounted` 中注册的事件在 `onUnmounted` 中移除
|
||||
|
||||
---
|
||||
|
||||
## 十、Agent 体系
|
||||
|
||||
### 角色与路由
|
||||
|
||||
| 代号 | 名称 | 角色 | 路由关键词 |
|
||||
|------|------|------|-----------|
|
||||
| liubei | 刘备 | 项目经理 | 协调、分派、异常升级 |
|
||||
| zhugeliang | 诸葛亮 | 架构师 | 分析、路由、设计 |
|
||||
| guanyu | 关羽 | 后端开发 | java, api, spring, service, controller |
|
||||
| zhaoyun | 赵云 | 前端开发 | vue, 界面, 显示, 弹窗, 按钮 |
|
||||
| xunyu | 荀彧 | DBA | 数据库, sql, 迁移, mapper xml |
|
||||
| zhangfei | 张飞 | 测试 | 测试, QA, 回归 |
|
||||
| huatuo | 华佗 | 验收 | 需求验收、质量确认 |
|
||||
| chenlin | 陈琳 | 文档 | 文档、归档、Git提交 |
|
||||
|
||||
### 协作流水线
|
||||
|
||||
```
|
||||
刘备(协调) → 诸葛亮(分析路由) → {关羽|赵云}(修复) → 荀彧(DB审查) → 张飞(测试) → 华佗(验收) → 陈琳(归档)
|
||||
```
|
||||
|
||||
### Bug 修复完整管线(BDT 方法论)
|
||||
|
||||
```
|
||||
获取Bug → 设计测试用例 → 基线测试(应失败) → 全链路修复 → 回归测试(应通过) → 扩展测试(无回归) → 提交
|
||||
```
|
||||
|
||||
### Bug 状态管理铁律
|
||||
- 人类提的 Bug:只加备注,不改状态,不改分配
|
||||
- 智能体提的 Bug:可以改分配和加备注
|
||||
- 已关闭/已解决的 Bug 不再处理
|
||||
|
||||
---
|
||||
|
||||
## 十一、审查与审计
|
||||
|
||||
### 三层审查体系
|
||||
|
||||
| 层级 | 内容 | 时机 |
|
||||
|------|------|------|
|
||||
| **L1 自审** | Agent 对照约束逐条检查 | 每次提交前 |
|
||||
| **L2 配对审查** | Agent 生成变更摘要,人类终审 | PR/提交时 |
|
||||
| **L3 合规审查** | 审计追踪,记录所有 AI 操作 | 持续 |
|
||||
|
||||
### L1 自审清单
|
||||
```yaml
|
||||
self_review:
|
||||
- "所有修改能通过编译?"
|
||||
- "遵守命名规范?"
|
||||
- "测试覆盖达标?"
|
||||
- "没有遗漏的 TODO / DEBUG?"
|
||||
- "变更范围没超出任务边界?"
|
||||
```
|
||||
|
||||
### 评审评分维度
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 正确性 | 行为是否符合目标功能? |
|
||||
| 验证 | 检查是否真的跑过并留下证据? |
|
||||
| 范围纪律 | 是否保持在选定功能范围内? |
|
||||
| 可靠性 | 结果能否在重启后继续工作? |
|
||||
| 可维护性 | 代码和文档是否清楚到可交接? |
|
||||
|
||||
---
|
||||
|
||||
## 十二、标准工作循环
|
||||
|
||||
```
|
||||
开始会话
|
||||
├→ 1. Init — 读 AGENTS.md + PROGRESS.md + git log
|
||||
├→ 2. Select — 只选一个未完成功能
|
||||
├→ 3. Implement — 一次只做一个,不扩大范围
|
||||
├→ 4. Verify — 运行验证命令,有证据才标记完成
|
||||
└→ 5. Cleanup — 更新进度 + clean-state-checklist + git commit
|
||||
```
|
||||
|
||||
### 会话结束前必须运行 Clean State Checklist
|
||||
```
|
||||
□ 标准启动路径仍然可用
|
||||
□ 标准验证路径仍然可运行
|
||||
□ 当前进度已记录到进度日志
|
||||
□ 无半成品步骤处于未记录状态
|
||||
□ 下一轮会话无需人工修复即可继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十三、开发流程
|
||||
|
||||
```
|
||||
收到任务
|
||||
├→ ① 分析需求 → 读相关文档(MD/)、读全链路6环
|
||||
├→ ② 制定计划 → update_plan (3-6个阶段)
|
||||
├→ ③ 后端开发 → Controller → AppService → Service → Mapper → Entity → Flyway
|
||||
├→ ④ 后端测试 → mvn test → 接口测试(业务逻辑验证)
|
||||
├→ ⑤ 前端开发 → API接口 → 页面组件 → 路由配置
|
||||
├→ ⑥ 前端测试 → npm run build:dev → 功能验证
|
||||
├→ ⑦ 质量门禁 → L1编译 → L2测试 → L3DB审查 → L4验收 → L5归档
|
||||
└→ ⑧ 提交代码 → git commit(规范格式) → git push → 文档更新
|
||||
```
|
||||
|
||||
### Git Commit 格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
type: feat|fix|docs|refactor|test|chore
|
||||
scope: 模块名(如 registration, billing, pharmacy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十四、快速参考命令
|
||||
|
||||
```bash
|
||||
# === 后端 ===
|
||||
export JAVA_HOME=/opt/jdk-25
|
||||
mvn clean compile -DskipTests # 编译
|
||||
mvn install -DskipTests # 构建
|
||||
mvn test -pl healthlink-his-application -Dtest="XxxTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
|
||||
# === 前端 ===
|
||||
cd healthlink-his-ui
|
||||
npm run dev && npm run build:dev && npm run lint && npm run test:run
|
||||
|
||||
# === Git ===
|
||||
git status && git add -A && git commit -m "feat(module): desc" && git push origin develop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十五、详细规范文档索引
|
||||
|
||||
| 文档 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 执行铁律 | `MD/specs/IRON_RULES.md` | 铁律完整版 |
|
||||
| 后端规范 | `MD/specs/BACKEND_DEVELOPMENT_STANDARD.md` | 后端编码标准 |
|
||||
| 前端规范 | `MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md` | 前端编码标准 |
|
||||
| Harness方法论 | `MD/specs/HARNESS_ENGINEERING.md` | 完整Harness+Agent方法论 |
|
||||
| 文档规范 | `MD/DOCUMENTATION_STANDARD.md` | 文档管理标准 |
|
||||
| 后端清单 | `MD/specs/BACKEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 前端清单 | `MD/specs/FRONTEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 三甲标准 | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲医院达标标准 |
|
||||
| Flyway指南 | `MD/guides/FLYWAY_USAGE_GUIDE.md` | 数据库迁移指南 |
|
||||
|
||||
---
|
||||
|
||||
## 十六、过往教训
|
||||
|
||||
| 教训 | 内容 |
|
||||
|------|------|
|
||||
| 状态链路断裂 | Bug#574: 签到设 BOOKED(1) 而非 CHECKED_IN(3),前端映射缺失 → 必须走完整状态链路 |
|
||||
| 盲删源文件 | AI 看到编译错误直接删文件,没检查 baseline → 必须先确认文件来源 |
|
||||
| 修复方向偏差 | 多次 fallback 改的是错误的 Service → 必须用 rg 搜索所有相关代码路径 |
|
||||
| bug_reports 缺列 | INSERT 静默失败 → 必须检查表结构 |
|
||||
| 禅道 comment API | API 不存在,用 resolve+activate workaround |
|
||||
| SQLite WAL 并发 | 多进程并发写需要 checkpoint |
|
||||
| UTF-8 切片 | 多字节字符不能用 byte index 切片 |
|
||||
| 上下文焦虑 | Agent 感觉上下文快满时会匆忙结束,跳过验证 → 注意 context 40% 阈值 |
|
||||
| 过早宣告胜利 | 自评≠验证,分开"干活"和"检查" |
|
||||
| 覆盖率幻觉 | 覆盖率达标但逻辑没测 → 引入变异测试 |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ 本文件是 AI 开发规范的唯一信源。各工具配置文件由 `bash scripts/sync-ai-rules.sh` 同步。
|
||||
|
||||
---
|
||||
|
||||
> 📅 最后同步: 2026-06-06 15:09 | 源文件: RULES.md | 重新同步: `bash scripts/sync-ai-rules.sh`
|
||||
436
.gitignore
vendored
Normal file
436
.gitignore
vendored
Normal file
@@ -0,0 +1,436 @@
|
||||
/.vscode/mcp.json
|
||||
/.vscode/settings.json
|
||||
/.qwen/settings.json.orig
|
||||
/.playwright-mcp/console-2026-03-31T08-27-30-883Z.log
|
||||
/.playwright-mcp/console-2026-05-19T03-10-43-600Z.log
|
||||
/.playwright-mcp/console-2026-05-19T03-18-23-396Z.log
|
||||
/.playwright-mcp/console-2026-05-19T03-18-51-946Z.log
|
||||
/.playwright-mcp/page-2026-05-11T02-56-22-027Z.yml
|
||||
/.playwright-mcp/page-2026-05-11T02-56-30-095Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-10-44-171Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-11-20-520Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-11-40-168Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-12-10-968Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-18-23-610Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-18-52-634Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-19-19-472Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-19-36-669Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-20-04-342Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-21-08-820Z.yml
|
||||
/.playwright-mcp/page-2026-05-19T03-21-43-735Z.yml
|
||||
/.idea/compiler.xml
|
||||
/.idea/encodings.xml
|
||||
/.idea/jarRepositories.xml
|
||||
/.idea/misc.xml
|
||||
/.idea/vcs.xml
|
||||
/.idea/workspace.xml
|
||||
/node_modules/.bin/husky
|
||||
/node_modules/.bin/husky.cmd
|
||||
/node_modules/.bin/husky.ps1
|
||||
/node_modules/asynckit/lib/abort.js
|
||||
/node_modules/asynckit/lib/async.js
|
||||
/node_modules/asynckit/lib/defer.js
|
||||
/node_modules/asynckit/lib/iterate.js
|
||||
/node_modules/asynckit/lib/readable_asynckit.js
|
||||
/node_modules/asynckit/lib/readable_parallel.js
|
||||
/node_modules/asynckit/lib/readable_serial.js
|
||||
/node_modules/asynckit/lib/readable_serial_ordered.js
|
||||
/node_modules/asynckit/lib/state.js
|
||||
/node_modules/asynckit/lib/streamify.js
|
||||
/node_modules/asynckit/lib/terminator.js
|
||||
/node_modules/asynckit/bench.js
|
||||
/node_modules/asynckit/index.js
|
||||
/node_modules/asynckit/LICENSE
|
||||
/node_modules/asynckit/package.json
|
||||
/node_modules/asynckit/parallel.js
|
||||
/node_modules/asynckit/README.md
|
||||
/node_modules/asynckit/serial.js
|
||||
/node_modules/asynckit/serialOrdered.js
|
||||
/node_modules/asynckit/stream.js
|
||||
/node_modules/axios/dist/browser/axios.cjs
|
||||
/node_modules/axios/dist/esm/axios.js
|
||||
/node_modules/axios/dist/esm/axios.min.js
|
||||
/node_modules/axios/dist/esm/axios.min.js.map
|
||||
/node_modules/axios/dist/node/axios.cjs
|
||||
/node_modules/axios/dist/axios.js
|
||||
/node_modules/axios/dist/axios.min.js
|
||||
/node_modules/axios/dist/axios.min.js.map
|
||||
/node_modules/axios/lib/adapters/adapters.js
|
||||
/node_modules/axios/lib/adapters/fetch.js
|
||||
/node_modules/axios/lib/adapters/http.js
|
||||
/node_modules/axios/lib/adapters/README.md
|
||||
/node_modules/axios/lib/adapters/xhr.js
|
||||
/node_modules/axios/lib/cancel/CanceledError.js
|
||||
/node_modules/axios/lib/cancel/CancelToken.js
|
||||
/node_modules/axios/lib/cancel/isCancel.js
|
||||
/node_modules/axios/lib/core/Axios.js
|
||||
/node_modules/axios/lib/core/AxiosError.js
|
||||
/node_modules/axios/lib/core/AxiosHeaders.js
|
||||
/node_modules/axios/lib/core/buildFullPath.js
|
||||
/node_modules/axios/lib/core/dispatchRequest.js
|
||||
/node_modules/axios/lib/core/InterceptorManager.js
|
||||
/node_modules/axios/lib/core/mergeConfig.js
|
||||
/node_modules/axios/lib/core/README.md
|
||||
/node_modules/axios/lib/core/settle.js
|
||||
/node_modules/axios/lib/core/transformData.js
|
||||
/node_modules/axios/lib/defaults/index.js
|
||||
/node_modules/axios/lib/defaults/transitional.js
|
||||
/node_modules/axios/lib/env/classes/FormData.js
|
||||
/node_modules/axios/lib/env/data.js
|
||||
/node_modules/axios/lib/env/README.md
|
||||
/node_modules/axios/lib/helpers/AxiosTransformStream.js
|
||||
/node_modules/axios/lib/helpers/AxiosURLSearchParams.js
|
||||
/node_modules/axios/lib/helpers/bind.js
|
||||
/node_modules/axios/lib/helpers/buildURL.js
|
||||
/node_modules/axios/lib/helpers/callbackify.js
|
||||
/node_modules/axios/lib/helpers/combineURLs.js
|
||||
/node_modules/axios/lib/helpers/composeSignals.js
|
||||
/node_modules/axios/lib/helpers/cookies.js
|
||||
/node_modules/axios/lib/helpers/deprecatedMethod.js
|
||||
/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js
|
||||
/node_modules/axios/lib/helpers/formDataToJSON.js
|
||||
/node_modules/axios/lib/helpers/formDataToStream.js
|
||||
/node_modules/axios/lib/helpers/fromDataURI.js
|
||||
/node_modules/axios/lib/helpers/HttpStatusCode.js
|
||||
/node_modules/axios/lib/helpers/isAbsoluteURL.js
|
||||
/node_modules/axios/lib/helpers/isAxiosError.js
|
||||
/node_modules/axios/lib/helpers/isURLSameOrigin.js
|
||||
/node_modules/axios/lib/helpers/null.js
|
||||
/node_modules/axios/lib/helpers/parseHeaders.js
|
||||
/node_modules/axios/lib/helpers/parseProtocol.js
|
||||
/node_modules/axios/lib/helpers/progressEventReducer.js
|
||||
/node_modules/axios/lib/helpers/readBlob.js
|
||||
/node_modules/axios/lib/helpers/README.md
|
||||
/node_modules/axios/lib/helpers/resolveConfig.js
|
||||
/node_modules/axios/lib/helpers/speedometer.js
|
||||
/node_modules/axios/lib/helpers/spread.js
|
||||
/node_modules/axios/lib/helpers/throttle.js
|
||||
/node_modules/axios/lib/helpers/toFormData.js
|
||||
/node_modules/axios/lib/helpers/toURLEncodedForm.js
|
||||
/node_modules/axios/lib/helpers/trackStream.js
|
||||
/node_modules/axios/lib/helpers/validator.js
|
||||
/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js
|
||||
/node_modules/axios/lib/platform/browser/classes/Blob.js
|
||||
/node_modules/axios/lib/platform/browser/classes/FormData.js
|
||||
/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js
|
||||
/node_modules/axios/lib/platform/browser/index.js
|
||||
/node_modules/axios/lib/platform/common/utils.js
|
||||
/node_modules/axios/lib/platform/node/classes/FormData.js
|
||||
/node_modules/axios/lib/platform/node/classes/URLSearchParams.js
|
||||
/node_modules/axios/lib/platform/node/index.js
|
||||
/node_modules/axios/lib/platform/index.js
|
||||
/node_modules/axios/lib/axios.js
|
||||
/node_modules/axios/lib/utils.js
|
||||
/node_modules/axios/CHANGELOG.md
|
||||
/node_modules/axios/index.d.cts
|
||||
/node_modules/axios/index.d.ts
|
||||
/node_modules/axios/index.js
|
||||
/node_modules/axios/LICENSE
|
||||
/node_modules/axios/MIGRATION_GUIDE.md
|
||||
/node_modules/axios/package.json
|
||||
/node_modules/axios/README.md
|
||||
/node_modules/bignumber.js/doc/API.html
|
||||
/node_modules/bignumber.js/bignumber.d.mts
|
||||
/node_modules/bignumber.js/bignumber.d.ts
|
||||
/node_modules/bignumber.js/bignumber.js
|
||||
/node_modules/bignumber.js/bignumber.mjs
|
||||
/node_modules/bignumber.js/CHANGELOG.md
|
||||
/node_modules/bignumber.js/LICENCE.md
|
||||
/node_modules/bignumber.js/package.json
|
||||
/node_modules/bignumber.js/README.md
|
||||
/node_modules/bignumber.js/types.d.ts
|
||||
/node_modules/call-bind-apply-helpers/.github/FUNDING.yml
|
||||
/node_modules/call-bind-apply-helpers/test/index.js
|
||||
/node_modules/call-bind-apply-helpers/.eslintrc
|
||||
/node_modules/call-bind-apply-helpers/.nycrc
|
||||
/node_modules/call-bind-apply-helpers/actualApply.d.ts
|
||||
/node_modules/call-bind-apply-helpers/actualApply.js
|
||||
/node_modules/call-bind-apply-helpers/applyBind.d.ts
|
||||
/node_modules/call-bind-apply-helpers/applyBind.js
|
||||
/node_modules/call-bind-apply-helpers/CHANGELOG.md
|
||||
/node_modules/call-bind-apply-helpers/functionApply.d.ts
|
||||
/node_modules/call-bind-apply-helpers/functionApply.js
|
||||
/node_modules/call-bind-apply-helpers/functionCall.d.ts
|
||||
/node_modules/call-bind-apply-helpers/functionCall.js
|
||||
/node_modules/call-bind-apply-helpers/index.d.ts
|
||||
/node_modules/call-bind-apply-helpers/index.js
|
||||
/node_modules/call-bind-apply-helpers/LICENSE
|
||||
/node_modules/call-bind-apply-helpers/package.json
|
||||
/node_modules/call-bind-apply-helpers/README.md
|
||||
/node_modules/call-bind-apply-helpers/reflectApply.d.ts
|
||||
/node_modules/call-bind-apply-helpers/reflectApply.js
|
||||
/node_modules/call-bind-apply-helpers/tsconfig.json
|
||||
/node_modules/combined-stream/lib/combined_stream.js
|
||||
/node_modules/combined-stream/License
|
||||
/node_modules/combined-stream/package.json
|
||||
/node_modules/combined-stream/Readme.md
|
||||
/node_modules/combined-stream/yarn.lock
|
||||
/node_modules/delayed-stream/lib/delayed_stream.js
|
||||
/node_modules/delayed-stream/.npmignore
|
||||
/node_modules/delayed-stream/License
|
||||
/node_modules/delayed-stream/Makefile
|
||||
/node_modules/delayed-stream/package.json
|
||||
/node_modules/delayed-stream/Readme.md
|
||||
/node_modules/dunder-proto/.github/FUNDING.yml
|
||||
/node_modules/dunder-proto/test/get.js
|
||||
/node_modules/dunder-proto/test/index.js
|
||||
/node_modules/dunder-proto/test/set.js
|
||||
/node_modules/dunder-proto/.eslintrc
|
||||
/node_modules/dunder-proto/.nycrc
|
||||
/node_modules/dunder-proto/CHANGELOG.md
|
||||
/node_modules/dunder-proto/get.d.ts
|
||||
/node_modules/dunder-proto/get.js
|
||||
/node_modules/dunder-proto/LICENSE
|
||||
/node_modules/dunder-proto/package.json
|
||||
/node_modules/dunder-proto/README.md
|
||||
/node_modules/dunder-proto/set.d.ts
|
||||
/node_modules/dunder-proto/set.js
|
||||
/node_modules/dunder-proto/tsconfig.json
|
||||
/node_modules/es-define-property/.github/FUNDING.yml
|
||||
/node_modules/es-define-property/test/index.js
|
||||
/node_modules/es-define-property/.eslintrc
|
||||
/node_modules/es-define-property/.nycrc
|
||||
/node_modules/es-define-property/CHANGELOG.md
|
||||
/node_modules/es-define-property/index.d.ts
|
||||
/node_modules/es-define-property/index.js
|
||||
/node_modules/es-define-property/LICENSE
|
||||
/node_modules/es-define-property/package.json
|
||||
/node_modules/es-define-property/README.md
|
||||
/node_modules/es-define-property/tsconfig.json
|
||||
/node_modules/es-errors/.github/FUNDING.yml
|
||||
/node_modules/es-errors/test/index.js
|
||||
/node_modules/es-errors/.eslintrc
|
||||
/node_modules/es-errors/CHANGELOG.md
|
||||
/node_modules/es-errors/eval.d.ts
|
||||
/node_modules/es-errors/eval.js
|
||||
/node_modules/es-errors/index.d.ts
|
||||
/node_modules/es-errors/index.js
|
||||
/node_modules/es-errors/LICENSE
|
||||
/node_modules/es-errors/package.json
|
||||
/node_modules/es-errors/range.d.ts
|
||||
/node_modules/es-errors/range.js
|
||||
/node_modules/es-errors/README.md
|
||||
/node_modules/es-errors/ref.d.ts
|
||||
/node_modules/es-errors/ref.js
|
||||
/node_modules/es-errors/syntax.d.ts
|
||||
/node_modules/es-errors/syntax.js
|
||||
/node_modules/es-errors/tsconfig.json
|
||||
/node_modules/es-errors/type.d.ts
|
||||
/node_modules/es-errors/type.js
|
||||
/node_modules/es-errors/uri.d.ts
|
||||
/node_modules/es-errors/uri.js
|
||||
/node_modules/es-object-atoms/.github/FUNDING.yml
|
||||
/node_modules/es-object-atoms/test/index.js
|
||||
/node_modules/es-object-atoms/.eslintrc
|
||||
/node_modules/es-object-atoms/CHANGELOG.md
|
||||
/node_modules/es-object-atoms/index.d.ts
|
||||
/node_modules/es-object-atoms/index.js
|
||||
/node_modules/es-object-atoms/isObject.d.ts
|
||||
/node_modules/es-object-atoms/isObject.js
|
||||
/node_modules/es-object-atoms/LICENSE
|
||||
/node_modules/es-object-atoms/package.json
|
||||
/node_modules/es-object-atoms/README.md
|
||||
/node_modules/es-object-atoms/RequireObjectCoercible.d.ts
|
||||
/node_modules/es-object-atoms/RequireObjectCoercible.js
|
||||
/node_modules/es-object-atoms/ToObject.d.ts
|
||||
/node_modules/es-object-atoms/ToObject.js
|
||||
/node_modules/es-object-atoms/tsconfig.json
|
||||
/node_modules/es-set-tostringtag/test/index.js
|
||||
/node_modules/es-set-tostringtag/.eslintrc
|
||||
/node_modules/es-set-tostringtag/.nycrc
|
||||
/node_modules/es-set-tostringtag/CHANGELOG.md
|
||||
/node_modules/es-set-tostringtag/index.d.ts
|
||||
/node_modules/es-set-tostringtag/index.js
|
||||
/node_modules/es-set-tostringtag/LICENSE
|
||||
/node_modules/es-set-tostringtag/package.json
|
||||
/node_modules/es-set-tostringtag/README.md
|
||||
/node_modules/es-set-tostringtag/tsconfig.json
|
||||
/node_modules/follow-redirects/debug.js
|
||||
/node_modules/follow-redirects/http.js
|
||||
/node_modules/follow-redirects/https.js
|
||||
/node_modules/follow-redirects/index.js
|
||||
/node_modules/follow-redirects/LICENSE
|
||||
/node_modules/follow-redirects/package.json
|
||||
/node_modules/follow-redirects/README.md
|
||||
/node_modules/form-data/lib/browser.js
|
||||
/node_modules/form-data/lib/form_data.js
|
||||
/node_modules/form-data/lib/populate.js
|
||||
/node_modules/form-data/CHANGELOG.md
|
||||
/node_modules/form-data/index.d.ts
|
||||
/node_modules/form-data/License
|
||||
/node_modules/form-data/package.json
|
||||
/node_modules/form-data/README.md
|
||||
/node_modules/function-bind/.github/FUNDING.yml
|
||||
/node_modules/function-bind/.github/SECURITY.md
|
||||
/node_modules/function-bind/test/.eslintrc
|
||||
/node_modules/function-bind/test/index.js
|
||||
/node_modules/function-bind/.eslintrc
|
||||
/node_modules/function-bind/.nycrc
|
||||
/node_modules/function-bind/CHANGELOG.md
|
||||
/node_modules/function-bind/implementation.js
|
||||
/node_modules/function-bind/index.js
|
||||
/node_modules/function-bind/LICENSE
|
||||
/node_modules/function-bind/package.json
|
||||
/node_modules/function-bind/README.md
|
||||
/node_modules/get-intrinsic/.github/FUNDING.yml
|
||||
/node_modules/get-intrinsic/test/GetIntrinsic.js
|
||||
/node_modules/get-intrinsic/.eslintrc
|
||||
/node_modules/get-intrinsic/.nycrc
|
||||
/node_modules/get-intrinsic/CHANGELOG.md
|
||||
/node_modules/get-intrinsic/index.js
|
||||
/node_modules/get-intrinsic/LICENSE
|
||||
/node_modules/get-intrinsic/package.json
|
||||
/node_modules/get-intrinsic/README.md
|
||||
/node_modules/get-proto/.github/FUNDING.yml
|
||||
/node_modules/get-proto/test/index.js
|
||||
/node_modules/get-proto/.eslintrc
|
||||
/node_modules/get-proto/.nycrc
|
||||
/node_modules/get-proto/CHANGELOG.md
|
||||
/node_modules/get-proto/index.d.ts
|
||||
/node_modules/get-proto/index.js
|
||||
/node_modules/get-proto/LICENSE
|
||||
/node_modules/get-proto/Object.getPrototypeOf.d.ts
|
||||
/node_modules/get-proto/Object.getPrototypeOf.js
|
||||
/node_modules/get-proto/package.json
|
||||
/node_modules/get-proto/README.md
|
||||
/node_modules/get-proto/Reflect.getPrototypeOf.d.ts
|
||||
/node_modules/get-proto/Reflect.getPrototypeOf.js
|
||||
/node_modules/get-proto/tsconfig.json
|
||||
/node_modules/gopd/.github/FUNDING.yml
|
||||
/node_modules/gopd/test/index.js
|
||||
/node_modules/gopd/.eslintrc
|
||||
/node_modules/gopd/CHANGELOG.md
|
||||
/node_modules/gopd/gOPD.d.ts
|
||||
/node_modules/gopd/gOPD.js
|
||||
/node_modules/gopd/index.d.ts
|
||||
/node_modules/gopd/index.js
|
||||
/node_modules/gopd/LICENSE
|
||||
/node_modules/gopd/package.json
|
||||
/node_modules/gopd/README.md
|
||||
/node_modules/gopd/tsconfig.json
|
||||
/node_modules/has-symbols/.github/FUNDING.yml
|
||||
/node_modules/has-symbols/test/shams/core-js.js
|
||||
/node_modules/has-symbols/test/shams/get-own-property-symbols.js
|
||||
/node_modules/has-symbols/test/index.js
|
||||
/node_modules/has-symbols/test/tests.js
|
||||
/node_modules/has-symbols/.eslintrc
|
||||
/node_modules/has-symbols/.nycrc
|
||||
/node_modules/has-symbols/CHANGELOG.md
|
||||
/node_modules/has-symbols/index.d.ts
|
||||
/node_modules/has-symbols/index.js
|
||||
/node_modules/has-symbols/LICENSE
|
||||
/node_modules/has-symbols/package.json
|
||||
/node_modules/has-symbols/README.md
|
||||
/node_modules/has-symbols/shams.d.ts
|
||||
/node_modules/has-symbols/shams.js
|
||||
/node_modules/has-symbols/tsconfig.json
|
||||
/node_modules/has-tostringtag/.github/FUNDING.yml
|
||||
/node_modules/has-tostringtag/test/shams/core-js.js
|
||||
/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js
|
||||
/node_modules/has-tostringtag/test/index.js
|
||||
/node_modules/has-tostringtag/test/tests.js
|
||||
/node_modules/has-tostringtag/.eslintrc
|
||||
/node_modules/has-tostringtag/.nycrc
|
||||
/node_modules/has-tostringtag/CHANGELOG.md
|
||||
/node_modules/has-tostringtag/index.d.ts
|
||||
/node_modules/has-tostringtag/index.js
|
||||
/node_modules/has-tostringtag/LICENSE
|
||||
/node_modules/has-tostringtag/package.json
|
||||
/node_modules/has-tostringtag/README.md
|
||||
/node_modules/has-tostringtag/shams.d.ts
|
||||
/node_modules/has-tostringtag/shams.js
|
||||
/node_modules/has-tostringtag/tsconfig.json
|
||||
/node_modules/hasown/.github/FUNDING.yml
|
||||
/node_modules/hasown/.nycrc
|
||||
/node_modules/hasown/CHANGELOG.md
|
||||
/node_modules/hasown/index.d.ts
|
||||
/node_modules/hasown/index.js
|
||||
/node_modules/hasown/LICENSE
|
||||
/node_modules/hasown/package.json
|
||||
/node_modules/hasown/README.md
|
||||
/node_modules/hasown/tsconfig.json
|
||||
/node_modules/husky/bin.js
|
||||
/node_modules/husky/husky
|
||||
/node_modules/husky/index.d.ts
|
||||
/node_modules/husky/index.js
|
||||
/node_modules/husky/LICENSE
|
||||
/node_modules/husky/package.json
|
||||
/node_modules/husky/README.md
|
||||
/node_modules/json-bigint/lib/parse.js
|
||||
/node_modules/json-bigint/lib/stringify.js
|
||||
/node_modules/json-bigint/index.js
|
||||
/node_modules/json-bigint/LICENSE
|
||||
/node_modules/json-bigint/package.json
|
||||
/node_modules/json-bigint/README.md
|
||||
/node_modules/math-intrinsics/.github/FUNDING.yml
|
||||
/node_modules/math-intrinsics/constants/maxArrayLength.d.ts
|
||||
/node_modules/math-intrinsics/constants/maxArrayLength.js
|
||||
/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts
|
||||
/node_modules/math-intrinsics/constants/maxSafeInteger.js
|
||||
/node_modules/math-intrinsics/constants/maxValue.d.ts
|
||||
/node_modules/math-intrinsics/constants/maxValue.js
|
||||
/node_modules/math-intrinsics/test/index.js
|
||||
/node_modules/math-intrinsics/.eslintrc
|
||||
/node_modules/math-intrinsics/abs.d.ts
|
||||
/node_modules/math-intrinsics/abs.js
|
||||
/node_modules/math-intrinsics/CHANGELOG.md
|
||||
/node_modules/math-intrinsics/floor.d.ts
|
||||
/node_modules/math-intrinsics/floor.js
|
||||
/node_modules/math-intrinsics/isFinite.d.ts
|
||||
/node_modules/math-intrinsics/isFinite.js
|
||||
/node_modules/math-intrinsics/isInteger.d.ts
|
||||
/node_modules/math-intrinsics/isInteger.js
|
||||
/node_modules/math-intrinsics/isNaN.d.ts
|
||||
/node_modules/math-intrinsics/isNaN.js
|
||||
/node_modules/math-intrinsics/isNegativeZero.d.ts
|
||||
/node_modules/math-intrinsics/isNegativeZero.js
|
||||
/node_modules/math-intrinsics/LICENSE
|
||||
/node_modules/math-intrinsics/max.d.ts
|
||||
/node_modules/math-intrinsics/max.js
|
||||
/node_modules/math-intrinsics/min.d.ts
|
||||
/node_modules/math-intrinsics/min.js
|
||||
/node_modules/math-intrinsics/mod.d.ts
|
||||
/node_modules/math-intrinsics/mod.js
|
||||
/node_modules/math-intrinsics/package.json
|
||||
/node_modules/math-intrinsics/pow.d.ts
|
||||
/node_modules/math-intrinsics/pow.js
|
||||
/node_modules/math-intrinsics/README.md
|
||||
/node_modules/math-intrinsics/round.d.ts
|
||||
/node_modules/math-intrinsics/round.js
|
||||
/node_modules/math-intrinsics/sign.d.ts
|
||||
/node_modules/math-intrinsics/sign.js
|
||||
/node_modules/math-intrinsics/tsconfig.json
|
||||
/node_modules/mime-db/db.json
|
||||
/node_modules/mime-db/HISTORY.md
|
||||
/node_modules/mime-db/index.js
|
||||
/node_modules/mime-db/LICENSE
|
||||
/node_modules/mime-db/package.json
|
||||
/node_modules/mime-db/README.md
|
||||
/node_modules/mime-types/HISTORY.md
|
||||
/node_modules/mime-types/index.js
|
||||
/node_modules/mime-types/LICENSE
|
||||
/node_modules/mime-types/package.json
|
||||
/node_modules/mime-types/README.md
|
||||
/node_modules/proxy-from-env/index.js
|
||||
/node_modules/proxy-from-env/LICENSE
|
||||
/node_modules/proxy-from-env/package.json
|
||||
/node_modules/proxy-from-env/README.md
|
||||
/node_modules/.package-lock.json
|
||||
/.idea/shelf/在进行更新之前于_2026_6_5_16_37_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_07_53_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_07_58_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_09_03_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_09_07_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_09_17_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/_2026_6_5_16_37____.xml
|
||||
/.idea/shelf/_2026_6_6_07_53____.xml
|
||||
/.idea/shelf/_2026_6_6_07_58____.xml
|
||||
/.idea/shelf/_2026_6_6_09_03____.xml
|
||||
/.idea/shelf/_2026_6_6_09_07____.xml
|
||||
/.idea/shelf/_2026_6_6_09_17____.xml
|
||||
/.idea/shelf/在进行更新之前于_2026_6_5_16_37_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_07_53_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_07_58_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_09_03_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_09_07_取消提交了更改_[更改]/shelved.patch
|
||||
/.idea/shelf/在进行更新之前于_2026_6_6_09_17_取消提交了更改_[更改]/shelved.patch
|
||||
499
.qwenrules
Normal file
499
.qwenrules
Normal file
@@ -0,0 +1,499 @@
|
||||
# HealthLink-HIS — AI 开发规范 (Qwen Coder)
|
||||
|
||||
> 🤖 通义灵码 / Qwen Coder 打开本项目时自动加载此文件。
|
||||
|
||||
---
|
||||
|
||||
# HealthLink-HIS — AI 开发规范(自动加载)
|
||||
|
||||
> 🤖 **本文件供所有 AI 编码工具自动读取**。进入本项目后必须遵守以下规范。
|
||||
>
|
||||
> **模型决定上限,Harness 决定底线。**
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概览
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| 项目名 | HealthLink-HIS(医院信息系统) |
|
||||
| 后端路径 | `healthlink-his-server/` |
|
||||
| 前端路径 | `healthlink-his-ui/` |
|
||||
| 文档路径 | `MD/` |
|
||||
| JDK | 25 (OpenJDK) |
|
||||
| Spring Boot | 4.0.6 |
|
||||
| MyBatis-Plus | 3.5.16 |
|
||||
| Vue | 3.x + Vite + Element Plus |
|
||||
| 数据库 | PostgreSQL 15+ |
|
||||
| 包名 | `com.healthlink.his` |
|
||||
| 后端端口 | 18082 |
|
||||
| 前端端口 | 81 |
|
||||
|
||||
---
|
||||
|
||||
## 二、铁律(必须遵守,违反即失败)
|
||||
|
||||
### 🔴 P0 铁律 — 不可违反
|
||||
|
||||
**铁律1: 修改完必须测试**
|
||||
```
|
||||
后端: mvn clean compile -DskipTests → mvn install -DskipTests → mvn test
|
||||
前端: npm run build:dev → npm run lint
|
||||
```
|
||||
- 白盒:编译通过,无 ERROR
|
||||
- 黑盒:关键接口返回 `{code:200, data:...}`,验证业务逻辑
|
||||
- 冒烟:应用正常启动,核心流程通畅
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
- 编译 + 测试全部通过后才能 git commit
|
||||
- 不提交未完成的功能、调试代码、临时文件
|
||||
|
||||
**铁律4: 前后端API路径对齐**
|
||||
- 后端前缀:`/healthlink-his/api/v1/`
|
||||
- 前端 `request.js` 的 baseURL 必须与后端匹配
|
||||
|
||||
**铁律5: 状态值一致性(Bug #574 教训)**
|
||||
- 修改任何状态值前,必须先列出完整的状态流转链路
|
||||
- 检查项:枚举定义 → Service 设置 → 查询映射 → 前端 STATUS_CLASS_MAP → 前端 v-if → 统计SQL
|
||||
- 禁止:只改一端不检查其他端
|
||||
|
||||
**铁律6: 禁止删除源文件(Bug #574 教训)**
|
||||
- 绝对禁止删除项目中已有的 Java/Vue/SQL 源文件
|
||||
- 编译错误 → 修复错误;重复文件 → 重构合并
|
||||
- 唯一例外:明确由人类确认删除的文件
|
||||
|
||||
**铁律7: 禁止修改已有公开方法签名**
|
||||
- 不能删除/重命名已有的 public 方法,不能修改参数列表
|
||||
- 需要新功能 → 添加重载方法;需要改行为 → 修改内部实现
|
||||
|
||||
**铁律8: 验证后才宣称完成(Verification Before Completion)**
|
||||
- **没有跑过验证命令,就不能说"完成了""通过了""没问题"**
|
||||
- 禁止使用"应该可以""大概没问题""看起来正确"
|
||||
- 必须:运行命令 → 读取输出 → 确认结果 → 才能宣称
|
||||
- 这是诚实原则,不是效率问题
|
||||
|
||||
|
||||
**铁律9: 开发前必须审核原有代码(P0 — 铁律)**
|
||||
- **任何新功能开发前,必须先搜索项目中是否已有相关代码**
|
||||
- 搜索路径:Controller / AppService / Service / Mapper / Entity / 前端页面 / API接口
|
||||
- 如果已有部分功能 → 在原有代码基础上**升级优化完善**,禁止另起炉灶
|
||||
- 如果已有接口但前端缺失 → 只补前端,不重复建后端
|
||||
- 如果已有前端但后端缺失 → 只补后端,不重写前端
|
||||
- 搜索命令:`rg -l "关键词" healthlink-his-server/ healthlink-his-ui/src/`
|
||||
- 禁止:不看代码就新建模块、重复实现已有功能、废弃原有代码另写一套
|
||||
|
||||
|
||||
**铁律12: 设计文档确认后自主开发(铁律)**
|
||||
- 设计文档(如 `MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md`)一旦确认,后续开发**必须按文档自主执行**
|
||||
- **禁止反复询问"是否继续""下一步做什么""是否开始"**——直接按计划推进
|
||||
- 每完成一个 Sprint,自动提交推送,然后立即开始下一个 Sprint
|
||||
- 只在遇到**无法解决的阻塞**(如技术选型冲突、需求不明确、第三方依赖不可用)时才暂停询问
|
||||
- 设计文档是"**已签合同**",不是"参考意见"。铁律执行优先级:设计文档 > 人类临时指令 > AI 自行判断
|
||||
|
||||
|
||||
### 🟡 P1 铁律 — 强烈建议
|
||||
|
||||
**铁律9: 先分解再行动**
|
||||
- 修改超过3个文件、涉及多模块、数据库变更,必须先制定计划
|
||||
|
||||
**铁律10: 验证后信**
|
||||
- 每次修改后必须验证编译通过,不信记忆
|
||||
|
||||
**铁律13: 文档统一管理**
|
||||
- 所有文档存储在 `MD/` 目录
|
||||
- 文件名:大写英文+下划线(如 `BACKEND_CHECKLIST.md`)
|
||||
- 文档头部必须包含元数据块(文档类型、版本、日期)
|
||||
|
||||
---
|
||||
|
||||
|
||||
**铁律14: 设计文档必须包含UI设计和调用流程**
|
||||
- 所有新模块/页面的设计文档必须包含:UI布局描述、交互效果清单、前后端调用流程
|
||||
- 没有明确UI设计的模块,禁止直接编码
|
||||
- 详见
|
||||
- 设计文档必须写清楚:系统调用关系、方法函数调用关系、完整业务流程
|
||||
- 设计文档中每个用户操作必须对应:前端事件 → API调用 → 后端处理链路 → 返回数据 → UI渲染
|
||||
|
||||
---
|
||||
|
||||
## 三、Karpathy 编码准则
|
||||
|
||||
> 减少 LLM 常见编码错误。偏向谨慎而非速度。
|
||||
|
||||
### 3.1 先想再写
|
||||
- 明确陈述假设,不确定就问
|
||||
- 多种解读时都列出来,不要默默选一种
|
||||
- 有更简单的方案就说出来,该推回就推回
|
||||
- 不清楚的地方停下来,说清楚哪里不清楚
|
||||
|
||||
### 3.2 简洁优先
|
||||
- 不做没要求的功能,不做一次性代码的抽象
|
||||
- 不加没要求的"灵活性"和"可配置性"
|
||||
- 200 行能 50 行搞定就重写
|
||||
- 自问:"高级工程师会不会觉得这过度设计?"
|
||||
|
||||
### 3.3 精准修改
|
||||
- 只改必须改的,不"顺手改进"相邻代码
|
||||
- 匹配现有代码风格,即使你有不同的偏好
|
||||
- 每行改动都能追溯到用户的请求
|
||||
- 只清理你自己改动产生的无用代码
|
||||
|
||||
### 3.4 目标驱动
|
||||
- 把任务转化为可验证目标
|
||||
- 多步任务声明计划:`[步骤] → 验证: [检查]`
|
||||
- 强验收标准让 Agent 能独立循环,弱标准需要持续澄清
|
||||
|
||||
---
|
||||
|
||||
## 四、全链路 6 环分析
|
||||
|
||||
> ⚠️ **涉及数据库字段的 Bug / 需求,必须走完整链路。**
|
||||
|
||||
```
|
||||
前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块
|
||||
①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动
|
||||
```
|
||||
|
||||
| 环 | 检查内容 |
|
||||
|----|---------|
|
||||
| ① 录入 | 前端有无输入入口(弹窗、表格行编辑、表单) |
|
||||
| ② 验证 | Controller 参数校验、@Valid、权限控制 |
|
||||
| ③ 业务 | Service 业务逻辑、事务边界、多个 Service 实现类入口 |
|
||||
| ④ 持久化 | Mapper XML、DTO 字段映射、类型转换 |
|
||||
| ⑤ 存储 | 数据库表结构、索引、NOT NULL 约束 |
|
||||
| ⑥ 联动 | 上游(医嘱→护士站)、下游(打印、计费、报表)是否同步 |
|
||||
|
||||
**修复后的验证顺序**:
|
||||
1. 数据库:确认状态值已正确写入
|
||||
2. 后端接口:确认返回的状态映射正确
|
||||
3. 前端显示:确认页面显示正确状态文本
|
||||
4. 前端交互:确认按钮/操作基于正确状态启用/禁用
|
||||
5. 统计数据:确认池/报表统计包含新状态
|
||||
|
||||
---
|
||||
|
||||
## 五、Harness Engineering 方法论
|
||||
|
||||
> Harness = 约束 + 反馈 + 控制平面 + 持久执行
|
||||
|
||||
### 5.1 四层约束金字塔
|
||||
|
||||
| 层级 | 内容 | 落地方式 |
|
||||
|------|------|---------|
|
||||
| **L1 架构约束** | 接口合约、包结构、命名规范、禁止模式 | 本文件铁律 |
|
||||
| **L2 代码质量** | 圈复杂度、代码风格、类型提示 | 编译门禁 + ESLint |
|
||||
| **L3 安全约束** | 敏感信息检测、权限检查、输入验证 | 配置不可硬编码 |
|
||||
| **L4 业务规则** | 领域逻辑、数据一致性、事务边界 | 全链路 6 环验证 |
|
||||
|
||||
**约束设计原则**:
|
||||
- **可验证**:每条约束必须能被自动化检查("覆盖率>90%"✅ "质量要高"❌)
|
||||
- **无歧义**:"每函数不超过50行"✅ "函数不要太长"❌
|
||||
- **优先级**:安全(1) > 架构(2) > 业务(3) > 质量(4) > 性能(5)
|
||||
- **渐进增强**:L1编译通过 → L2+命名规范 → L3+测试覆盖 → L4+安全扫描
|
||||
|
||||
### 5.2 三层反馈系统
|
||||
|
||||
| 层级 | 速度 | 覆盖范围 | 失败处理 |
|
||||
|------|------|---------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、签名 | 立即阻断,自行修复 |
|
||||
| **L2 数据流验证** | <5分钟 | 全链路字段、Mapper XML、DTO | 修复后上报 |
|
||||
| **L3 人工审查** | 10-30分钟 | 架构、设计、业务正确性 | 驳回/指导/批准 |
|
||||
|
||||
**反馈铁律**:
|
||||
- 反馈必须可行动(文件 + 行号 + 错误类型 + 修复方向)
|
||||
- 失败后先回滚到最近检查点,再重试
|
||||
- 持续失败3次 → 上报人类
|
||||
|
||||
### 5.3 控制平面
|
||||
|
||||
```
|
||||
战略层(人类) → 设定目标、审批决策、异常升级
|
||||
战术层(Agent) → 任务分解、update_plan、依赖协调、检查点保存
|
||||
执行层(Agent) → 代码生成、测试执行、错误恢复、幂等重试
|
||||
```
|
||||
|
||||
### 5.4 持久执行
|
||||
|
||||
- 每个关键步骤保存检查点(`update_plan` 进度)
|
||||
- 失败后从最新检查点恢复,不从头开始
|
||||
- 幂等设计:同一操作重复执行结果一致
|
||||
- **三层状态管理**:系统层(工作流ID/超时/重试) → 执行层(当前活动/进度) → 业务层(已完成工作/中间产物)
|
||||
|
||||
---
|
||||
|
||||
## 六、五层质量门禁
|
||||
|
||||
| 门禁 | 时间 | 范围 | 失败处理 |
|
||||
|------|------|------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、导入 | Agent 自行修复 |
|
||||
| **L2 静态分析** | <2分钟 | 代码风格、复杂度、安全 | Agent 修复 |
|
||||
| **L3 单元测试** | <5分钟 | 功能正确性、边界条件 | 自动修复或上报 |
|
||||
| **L4 集成测试** | <15分钟 | 模块间交互、数据流 | 上报人工 |
|
||||
| **L5 生产验证** | 持续 | 监控、告警、性能 | 自动回滚 |
|
||||
|
||||
**提交铁律**:L1-L2 必须通过才能 commit,L3(如有DB变更)必须通过才能 push
|
||||
|
||||
---
|
||||
|
||||
## 七、系统化调试(Systematic Debugging)
|
||||
|
||||
> **铁律:没有根因调查,不能提出修复方案。**
|
||||
|
||||
### 四阶段流程
|
||||
|
||||
**阶段1:根因调查**(修复前必须完成)
|
||||
1. 仔细阅读错误信息(堆栈、行号、错误码)
|
||||
2. 稳定复现(能否可靠触发?步骤?每次?)
|
||||
3. 检查最近变更(git diff、新依赖、配置变更)
|
||||
4. 多组件系统:在每个组件边界加诊断日志,定位哪一层断裂
|
||||
5. 追踪数据流:坏值从哪里来?谁调用的?一直追溯到源头
|
||||
|
||||
**阶段2:模式分析**
|
||||
- 找到同代码库中类似的正常工作代码
|
||||
- 逐项对比差异
|
||||
- 理解依赖关系
|
||||
|
||||
**阶段3:假设与测试**
|
||||
- 形成单一假设:"我认为X是根因,因为Y"
|
||||
- 做最小改动测试
|
||||
- 有效 → 阶段4;无效 → 新假设
|
||||
|
||||
**阶段4:实施**
|
||||
- 创建失败测试用例
|
||||
- 修复根因(不是症状)
|
||||
- 验证修复
|
||||
|
||||
---
|
||||
|
||||
## 八、后端开发规范
|
||||
|
||||
### 分层架构
|
||||
```
|
||||
Controller → AppService → Service → Mapper → Entity
|
||||
```
|
||||
|
||||
### 命名规范
|
||||
| 类型 | 规则 | 示例 |
|
||||
|------|------|------|
|
||||
| Controller | `XxxController` | `RegistrationController` |
|
||||
| AppService | `IXxxAppService` / `XxxAppServiceImpl` | `IRegistrationAppService` |
|
||||
| Service | `IXxxService` / `XxxServiceImpl` | `IRegistrationService` |
|
||||
| Mapper | `XxxMapper` | `RegistrationMapper` |
|
||||
| Entity | `Xxx` | `Registration` |
|
||||
| DTO | `XxxDto` / `XxxQueryDto` | `RegistrationDto` |
|
||||
|
||||
### 包结构
|
||||
```
|
||||
com.healthlink.his.web.{module}.controller
|
||||
com.healthlink.his.web.{module}.appservice
|
||||
com.healthlink.his.web.{module}.service
|
||||
com.healthlink.his.web.{module}.mapper
|
||||
com.healthlink.his.web.{module}.dto
|
||||
com.healthlink.his.domain.{module}
|
||||
com.healthlink.his.common.enums
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- 所有查询使用 `LambdaQueryWrapper`,禁止字符串拼接 SQL
|
||||
- `@Transactional(rollbackFor = Exception.class)` 管理事务
|
||||
- 所有接口标注 `@PreAuthorize` 权限控制
|
||||
- 患者敏感信息在日志中脱敏
|
||||
- **扩展功能不修改原有函数签名**
|
||||
|
||||
---
|
||||
|
||||
## 九、前端开发规范
|
||||
|
||||
### 技术栈
|
||||
- Vue 3 + Vite + Element Plus + Pinia + Axios(基于 RuoYi-Vue3)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
src/api/{module}/ # API接口
|
||||
src/views/{module}/ # 页面组件
|
||||
src/store/modules/ # Pinia状态管理
|
||||
src/components/ # 公共组件
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- API前缀:`/healthlink-his/api/v1/`
|
||||
- 路由懒加载:`() => import('@/views/xxx/index.vue')`
|
||||
- 页面使用 `<script setup>` 语法
|
||||
- 按钮权限使用 `v-hasPermi` 指令
|
||||
- `onMounted` 中注册的事件在 `onUnmounted` 中移除
|
||||
|
||||
---
|
||||
|
||||
## 十、Agent 体系
|
||||
|
||||
### 角色与路由
|
||||
|
||||
| 代号 | 名称 | 角色 | 路由关键词 |
|
||||
|------|------|------|-----------|
|
||||
| liubei | 刘备 | 项目经理 | 协调、分派、异常升级 |
|
||||
| zhugeliang | 诸葛亮 | 架构师 | 分析、路由、设计 |
|
||||
| guanyu | 关羽 | 后端开发 | java, api, spring, service, controller |
|
||||
| zhaoyun | 赵云 | 前端开发 | vue, 界面, 显示, 弹窗, 按钮 |
|
||||
| xunyu | 荀彧 | DBA | 数据库, sql, 迁移, mapper xml |
|
||||
| zhangfei | 张飞 | 测试 | 测试, QA, 回归 |
|
||||
| huatuo | 华佗 | 验收 | 需求验收、质量确认 |
|
||||
| chenlin | 陈琳 | 文档 | 文档、归档、Git提交 |
|
||||
|
||||
### 协作流水线
|
||||
|
||||
```
|
||||
刘备(协调) → 诸葛亮(分析路由) → {关羽|赵云}(修复) → 荀彧(DB审查) → 张飞(测试) → 华佗(验收) → 陈琳(归档)
|
||||
```
|
||||
|
||||
### Bug 修复完整管线(BDT 方法论)
|
||||
|
||||
```
|
||||
获取Bug → 设计测试用例 → 基线测试(应失败) → 全链路修复 → 回归测试(应通过) → 扩展测试(无回归) → 提交
|
||||
```
|
||||
|
||||
### Bug 状态管理铁律
|
||||
- 人类提的 Bug:只加备注,不改状态,不改分配
|
||||
- 智能体提的 Bug:可以改分配和加备注
|
||||
- 已关闭/已解决的 Bug 不再处理
|
||||
|
||||
---
|
||||
|
||||
## 十一、审查与审计
|
||||
|
||||
### 三层审查体系
|
||||
|
||||
| 层级 | 内容 | 时机 |
|
||||
|------|------|------|
|
||||
| **L1 自审** | Agent 对照约束逐条检查 | 每次提交前 |
|
||||
| **L2 配对审查** | Agent 生成变更摘要,人类终审 | PR/提交时 |
|
||||
| **L3 合规审查** | 审计追踪,记录所有 AI 操作 | 持续 |
|
||||
|
||||
### L1 自审清单
|
||||
```yaml
|
||||
self_review:
|
||||
- "所有修改能通过编译?"
|
||||
- "遵守命名规范?"
|
||||
- "测试覆盖达标?"
|
||||
- "没有遗漏的 TODO / DEBUG?"
|
||||
- "变更范围没超出任务边界?"
|
||||
```
|
||||
|
||||
### 评审评分维度
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 正确性 | 行为是否符合目标功能? |
|
||||
| 验证 | 检查是否真的跑过并留下证据? |
|
||||
| 范围纪律 | 是否保持在选定功能范围内? |
|
||||
| 可靠性 | 结果能否在重启后继续工作? |
|
||||
| 可维护性 | 代码和文档是否清楚到可交接? |
|
||||
|
||||
---
|
||||
|
||||
## 十二、标准工作循环
|
||||
|
||||
```
|
||||
开始会话
|
||||
├→ 1. Init — 读 AGENTS.md + PROGRESS.md + git log
|
||||
├→ 2. Select — 只选一个未完成功能
|
||||
├→ 3. Implement — 一次只做一个,不扩大范围
|
||||
├→ 4. Verify — 运行验证命令,有证据才标记完成
|
||||
└→ 5. Cleanup — 更新进度 + clean-state-checklist + git commit
|
||||
```
|
||||
|
||||
### 会话结束前必须运行 Clean State Checklist
|
||||
```
|
||||
□ 标准启动路径仍然可用
|
||||
□ 标准验证路径仍然可运行
|
||||
□ 当前进度已记录到进度日志
|
||||
□ 无半成品步骤处于未记录状态
|
||||
□ 下一轮会话无需人工修复即可继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十三、开发流程
|
||||
|
||||
```
|
||||
收到任务
|
||||
├→ ① 分析需求 → 读相关文档(MD/)、读全链路6环
|
||||
├→ ② 制定计划 → update_plan (3-6个阶段)
|
||||
├→ ③ 后端开发 → Controller → AppService → Service → Mapper → Entity → Flyway
|
||||
├→ ④ 后端测试 → mvn test → 接口测试(业务逻辑验证)
|
||||
├→ ⑤ 前端开发 → API接口 → 页面组件 → 路由配置
|
||||
├→ ⑥ 前端测试 → npm run build:dev → 功能验证
|
||||
├→ ⑦ 质量门禁 → L1编译 → L2测试 → L3DB审查 → L4验收 → L5归档
|
||||
└→ ⑧ 提交代码 → git commit(规范格式) → git push → 文档更新
|
||||
```
|
||||
|
||||
### Git Commit 格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
type: feat|fix|docs|refactor|test|chore
|
||||
scope: 模块名(如 registration, billing, pharmacy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十四、快速参考命令
|
||||
|
||||
```bash
|
||||
# === 后端 ===
|
||||
export JAVA_HOME=/opt/jdk-25
|
||||
mvn clean compile -DskipTests # 编译
|
||||
mvn install -DskipTests # 构建
|
||||
mvn test -pl healthlink-his-application -Dtest="XxxTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
|
||||
# === 前端 ===
|
||||
cd healthlink-his-ui
|
||||
npm run dev && npm run build:dev && npm run lint && npm run test:run
|
||||
|
||||
# === Git ===
|
||||
git status && git add -A && git commit -m "feat(module): desc" && git push origin develop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十五、详细规范文档索引
|
||||
|
||||
| 文档 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 执行铁律 | `MD/specs/IRON_RULES.md` | 铁律完整版 |
|
||||
| 后端规范 | `MD/specs/BACKEND_DEVELOPMENT_STANDARD.md` | 后端编码标准 |
|
||||
| 前端规范 | `MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md` | 前端编码标准 |
|
||||
| Harness方法论 | `MD/specs/HARNESS_ENGINEERING.md` | 完整Harness+Agent方法论 |
|
||||
| 文档规范 | `MD/DOCUMENTATION_STANDARD.md` | 文档管理标准 |
|
||||
| 后端清单 | `MD/specs/BACKEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 前端清单 | `MD/specs/FRONTEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 三甲标准 | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲医院达标标准 |
|
||||
| Flyway指南 | `MD/guides/FLYWAY_USAGE_GUIDE.md` | 数据库迁移指南 |
|
||||
|
||||
---
|
||||
|
||||
## 十六、过往教训
|
||||
|
||||
| 教训 | 内容 |
|
||||
|------|------|
|
||||
| 状态链路断裂 | Bug#574: 签到设 BOOKED(1) 而非 CHECKED_IN(3),前端映射缺失 → 必须走完整状态链路 |
|
||||
| 盲删源文件 | AI 看到编译错误直接删文件,没检查 baseline → 必须先确认文件来源 |
|
||||
| 修复方向偏差 | 多次 fallback 改的是错误的 Service → 必须用 rg 搜索所有相关代码路径 |
|
||||
| bug_reports 缺列 | INSERT 静默失败 → 必须检查表结构 |
|
||||
| 禅道 comment API | API 不存在,用 resolve+activate workaround |
|
||||
| SQLite WAL 并发 | 多进程并发写需要 checkpoint |
|
||||
| UTF-8 切片 | 多字节字符不能用 byte index 切片 |
|
||||
| 上下文焦虑 | Agent 感觉上下文快满时会匆忙结束,跳过验证 → 注意 context 40% 阈值 |
|
||||
| 过早宣告胜利 | 自评≠验证,分开"干活"和"检查" |
|
||||
| 覆盖率幻觉 | 覆盖率达标但逻辑没测 → 引入变异测试 |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ 本文件是 AI 开发规范的唯一信源。各工具配置文件由 `bash scripts/sync-ai-rules.sh` 同步。
|
||||
|
||||
---
|
||||
|
||||
> 📅 最后同步: 2026-06-06 15:09 | 源文件: RULES.md | 重新同步: `bash scripts/sync-ai-rules.sh`
|
||||
509
.windsurfrules
Normal file
509
.windsurfrules
Normal file
@@ -0,0 +1,509 @@
|
||||
# HealthLink-HIS — AI 开发规范 (Windsurf)
|
||||
|
||||
> 🤖 Windsurf 打开本项目时自动加载此文件。
|
||||
|
||||
---
|
||||
|
||||
# HealthLink-HIS — AI 开发规范(自动加载)
|
||||
|
||||
> 🤖 **本文件供所有 AI 编码工具自动读取**。进入本项目后必须遵守以下规范。
|
||||
>
|
||||
> **模型决定上限,Harness 决定底线。**
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概览
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| 项目名 | HealthLink-HIS(医院信息系统) |
|
||||
| 后端路径 | `healthlink-his-server/` |
|
||||
| 前端路径 | `healthlink-his-ui/` |
|
||||
| 文档路径 | `MD/` |
|
||||
| JDK | 25 (OpenJDK) |
|
||||
| Spring Boot | 4.0.6 |
|
||||
| MyBatis-Plus | 3.5.16 |
|
||||
| Vue | 3.x + Vite + Element Plus |
|
||||
| 数据库 | PostgreSQL 15+ |
|
||||
| 包名 | `com.healthlink.his` |
|
||||
| 后端端口 | 18082 |
|
||||
| 前端端口 | 81 |
|
||||
|
||||
---
|
||||
|
||||
## 二、铁律(必须遵守,违反即失败)
|
||||
|
||||
### 🔴 P0 铁律 — 不可违反
|
||||
|
||||
**铁律1: 修改完必须测试**
|
||||
```
|
||||
后端: mvn clean compile -DskipTests → mvn install -DskipTests → mvn test
|
||||
前端: npm run build:dev → npm run lint
|
||||
```
|
||||
- 白盒:编译通过,无 ERROR
|
||||
- 黑盒:关键接口返回 `{code:200, data:...}`,验证业务逻辑
|
||||
- 冒烟:应用正常启动,核心流程通畅
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
- 编译 + 测试全部通过后才能 git commit
|
||||
- 不提交未完成的功能、调试代码、临时文件
|
||||
|
||||
**铁律4: 前后端API路径对齐**
|
||||
- 后端前缀:`/healthlink-his/api/v1/`
|
||||
- 前端 `request.js` 的 baseURL 必须与后端匹配
|
||||
|
||||
**铁律5: 状态值一致性(Bug #574 教训)**
|
||||
- 修改任何状态值前,必须先列出完整的状态流转链路
|
||||
- 检查项:枚举定义 → Service 设置 → 查询映射 → 前端 STATUS_CLASS_MAP → 前端 v-if → 统计SQL
|
||||
- 禁止:只改一端不检查其他端
|
||||
|
||||
**铁律6: 禁止删除源文件(Bug #574 教训)**
|
||||
- 绝对禁止删除项目中已有的 Java/Vue/SQL 源文件
|
||||
- 编译错误 → 修复错误;重复文件 → 重构合并
|
||||
- 唯一例外:明确由人类确认删除的文件
|
||||
|
||||
**铁律7: 禁止修改已有公开方法签名**
|
||||
- 不能删除/重命名已有的 public 方法,不能修改参数列表
|
||||
- 需要新功能 → 添加重载方法;需要改行为 → 修改内部实现
|
||||
|
||||
**铁律8: 验证后才宣称完成(Verification Before Completion)**
|
||||
- **没有跑过验证命令,就不能说"完成了""通过了""没问题"**
|
||||
- 禁止使用"应该可以""大概没问题""看起来正确"
|
||||
- 必须:运行命令 → 读取输出 → 确认结果 → 才能宣称
|
||||
- 这是诚实原则,不是效率问题
|
||||
|
||||
|
||||
**铁律9: 开发前必须审核原有代码(P0 — 铁律)**
|
||||
- **任何新功能开发前,必须先搜索项目中是否已有相关代码**
|
||||
- 搜索路径:Controller / AppService / Service / Mapper / Entity / 前端页面 / API接口
|
||||
- 如果已有部分功能 → 在原有代码基础上**升级优化完善**,禁止另起炉灶
|
||||
- 如果已有接口但前端缺失 → 只补前端,不重复建后端
|
||||
- 如果已有前端但后端缺失 → 只补后端,不重写前端
|
||||
- 搜索命令:`rg -l "关键词" healthlink-his-server/ healthlink-his-ui/src/`
|
||||
- 禁止:不看代码就新建模块、重复实现已有功能、废弃原有代码另写一套
|
||||
|
||||
|
||||
**铁律12: 设计文档确认后自主开发(铁律)**
|
||||
- 设计文档(如 `MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md`)一旦确认,后续开发**必须按文档自主执行**
|
||||
- **禁止反复询问"是否继续""下一步做什么""是否开始"**——直接按计划推进
|
||||
- 每完成一个 Sprint,自动提交推送,然后立即开始下一个 Sprint
|
||||
- 只在遇到**无法解决的阻塞**(如技术选型冲突、需求不明确、第三方依赖不可用)时才暂停询问
|
||||
- 设计文档是"**已签合同**",不是"参考意见"。铁律执行优先级:设计文档 > 人类临时指令 > AI 自行判断
|
||||
|
||||
**铁律18: 禁止破坏原有功能(P0绝对铁律)**
|
||||
- **完善增加功能和流程时,绝对不能破坏或者让原有功能不能用**
|
||||
- 修改已有实体前必须对比原始文件(`git show HEAD~N:./file.java`),保留所有原有字段和方法
|
||||
- 新增字段只能追加,不能删除或重命名已有字段
|
||||
- SQL迁移只允许 `ALTER TABLE ADD COLUMN`,不允许 `DROP COLUMN` 或 `RENAME COLUMN`
|
||||
- Controller新端点不能修改已有端点的路径或参数
|
||||
- 前端新页面不能修改已有页面的组件结构
|
||||
- 每次修改后必须 `mvn clean compile -DskipTests` 验证
|
||||
- **违规判定**: 因修改导致原有代码编译失败或运行报错,视为违反铁律18,必须立即回滚修复
|
||||
|
||||
|
||||
### 🟡 P1 铁律 — 强烈建议
|
||||
|
||||
**铁律9: 先分解再行动**
|
||||
- 修改超过3个文件、涉及多模块、数据库变更,必须先制定计划
|
||||
|
||||
**铁律10: 验证后信**
|
||||
- 每次修改后必须验证编译通过,不信记忆
|
||||
|
||||
**铁律13: 文档统一管理**
|
||||
- 所有文档存储在 `MD/` 目录
|
||||
- 文件名:大写英文+下划线(如 `BACKEND_CHECKLIST.md`)
|
||||
- 文档头部必须包含元数据块(文档类型、版本、日期)
|
||||
|
||||
---
|
||||
|
||||
|
||||
**铁律14: 设计文档必须包含UI设计和调用流程**
|
||||
- 所有新模块/页面的设计文档必须包含:UI布局描述、交互效果清单、前后端调用流程
|
||||
- 没有明确UI设计的模块,禁止直接编码
|
||||
- 详见
|
||||
- 设计文档必须写清楚:系统调用关系、方法函数调用关系、完整业务流程
|
||||
- 设计文档中每个用户操作必须对应:前端事件 → API调用 → 后端处理链路 → 返回数据 → UI渲染
|
||||
|
||||
---
|
||||
|
||||
## 三、Karpathy 编码准则
|
||||
|
||||
> 减少 LLM 常见编码错误。偏向谨慎而非速度。
|
||||
|
||||
### 3.1 先想再写
|
||||
- 明确陈述假设,不确定就问
|
||||
- 多种解读时都列出来,不要默默选一种
|
||||
- 有更简单的方案就说出来,该推回就推回
|
||||
- 不清楚的地方停下来,说清楚哪里不清楚
|
||||
|
||||
### 3.2 简洁优先
|
||||
- 不做没要求的功能,不做一次性代码的抽象
|
||||
- 不加没要求的"灵活性"和"可配置性"
|
||||
- 200 行能 50 行搞定就重写
|
||||
- 自问:"高级工程师会不会觉得这过度设计?"
|
||||
|
||||
### 3.3 精准修改
|
||||
- 只改必须改的,不"顺手改进"相邻代码
|
||||
- 匹配现有代码风格,即使你有不同的偏好
|
||||
- 每行改动都能追溯到用户的请求
|
||||
- 只清理你自己改动产生的无用代码
|
||||
|
||||
### 3.4 目标驱动
|
||||
- 把任务转化为可验证目标
|
||||
- 多步任务声明计划:`[步骤] → 验证: [检查]`
|
||||
- 强验收标准让 Agent 能独立循环,弱标准需要持续澄清
|
||||
|
||||
---
|
||||
|
||||
## 四、全链路 6 环分析
|
||||
|
||||
> ⚠️ **涉及数据库字段的 Bug / 需求,必须走完整链路。**
|
||||
|
||||
```
|
||||
前端/页面 → Controller → Service → Mapper → DB/SQL → 关联模块
|
||||
①录入 ②验证 ③业务 ④持久化 ⑤存储 ⑥联动
|
||||
```
|
||||
|
||||
| 环 | 检查内容 |
|
||||
|----|---------|
|
||||
| ① 录入 | 前端有无输入入口(弹窗、表格行编辑、表单) |
|
||||
| ② 验证 | Controller 参数校验、@Valid、权限控制 |
|
||||
| ③ 业务 | Service 业务逻辑、事务边界、多个 Service 实现类入口 |
|
||||
| ④ 持久化 | Mapper XML、DTO 字段映射、类型转换 |
|
||||
| ⑤ 存储 | 数据库表结构、索引、NOT NULL 约束 |
|
||||
| ⑥ 联动 | 上游(医嘱→护士站)、下游(打印、计费、报表)是否同步 |
|
||||
|
||||
**修复后的验证顺序**:
|
||||
1. 数据库:确认状态值已正确写入
|
||||
2. 后端接口:确认返回的状态映射正确
|
||||
3. 前端显示:确认页面显示正确状态文本
|
||||
4. 前端交互:确认按钮/操作基于正确状态启用/禁用
|
||||
5. 统计数据:确认池/报表统计包含新状态
|
||||
|
||||
---
|
||||
|
||||
## 五、Harness Engineering 方法论
|
||||
|
||||
> Harness = 约束 + 反馈 + 控制平面 + 持久执行
|
||||
|
||||
### 5.1 四层约束金字塔
|
||||
|
||||
| 层级 | 内容 | 落地方式 |
|
||||
|------|------|---------|
|
||||
| **L1 架构约束** | 接口合约、包结构、命名规范、禁止模式 | 本文件铁律 |
|
||||
| **L2 代码质量** | 圈复杂度、代码风格、类型提示 | 编译门禁 + ESLint |
|
||||
| **L3 安全约束** | 敏感信息检测、权限检查、输入验证 | 配置不可硬编码 |
|
||||
| **L4 业务规则** | 领域逻辑、数据一致性、事务边界 | 全链路 6 环验证 |
|
||||
|
||||
**约束设计原则**:
|
||||
- **可验证**:每条约束必须能被自动化检查("覆盖率>90%"✅ "质量要高"❌)
|
||||
- **无歧义**:"每函数不超过50行"✅ "函数不要太长"❌
|
||||
- **优先级**:安全(1) > 架构(2) > 业务(3) > 质量(4) > 性能(5)
|
||||
- **渐进增强**:L1编译通过 → L2+命名规范 → L3+测试覆盖 → L4+安全扫描
|
||||
|
||||
### 5.2 三层反馈系统
|
||||
|
||||
| 层级 | 速度 | 覆盖范围 | 失败处理 |
|
||||
|------|------|---------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、签名 | 立即阻断,自行修复 |
|
||||
| **L2 数据流验证** | <5分钟 | 全链路字段、Mapper XML、DTO | 修复后上报 |
|
||||
| **L3 人工审查** | 10-30分钟 | 架构、设计、业务正确性 | 驳回/指导/批准 |
|
||||
|
||||
**反馈铁律**:
|
||||
- 反馈必须可行动(文件 + 行号 + 错误类型 + 修复方向)
|
||||
- 失败后先回滚到最近检查点,再重试
|
||||
- 持续失败3次 → 上报人类
|
||||
|
||||
### 5.3 控制平面
|
||||
|
||||
```
|
||||
战略层(人类) → 设定目标、审批决策、异常升级
|
||||
战术层(Agent) → 任务分解、update_plan、依赖协调、检查点保存
|
||||
执行层(Agent) → 代码生成、测试执行、错误恢复、幂等重试
|
||||
```
|
||||
|
||||
### 5.4 持久执行
|
||||
|
||||
- 每个关键步骤保存检查点(`update_plan` 进度)
|
||||
- 失败后从最新检查点恢复,不从头开始
|
||||
- 幂等设计:同一操作重复执行结果一致
|
||||
- **三层状态管理**:系统层(工作流ID/超时/重试) → 执行层(当前活动/进度) → 业务层(已完成工作/中间产物)
|
||||
|
||||
---
|
||||
|
||||
## 六、五层质量门禁
|
||||
|
||||
| 门禁 | 时间 | 范围 | 失败处理 |
|
||||
|------|------|------|---------|
|
||||
| **L1 编译检查** | <30秒 | 语法、类型、导入 | Agent 自行修复 |
|
||||
| **L2 静态分析** | <2分钟 | 代码风格、复杂度、安全 | Agent 修复 |
|
||||
| **L3 单元测试** | <5分钟 | 功能正确性、边界条件 | 自动修复或上报 |
|
||||
| **L4 集成测试** | <15分钟 | 模块间交互、数据流 | 上报人工 |
|
||||
| **L5 生产验证** | 持续 | 监控、告警、性能 | 自动回滚 |
|
||||
|
||||
**提交铁律**:L1-L2 必须通过才能 commit,L3(如有DB变更)必须通过才能 push
|
||||
|
||||
---
|
||||
|
||||
## 七、系统化调试(Systematic Debugging)
|
||||
|
||||
> **铁律:没有根因调查,不能提出修复方案。**
|
||||
|
||||
### 四阶段流程
|
||||
|
||||
**阶段1:根因调查**(修复前必须完成)
|
||||
1. 仔细阅读错误信息(堆栈、行号、错误码)
|
||||
2. 稳定复现(能否可靠触发?步骤?每次?)
|
||||
3. 检查最近变更(git diff、新依赖、配置变更)
|
||||
4. 多组件系统:在每个组件边界加诊断日志,定位哪一层断裂
|
||||
5. 追踪数据流:坏值从哪里来?谁调用的?一直追溯到源头
|
||||
|
||||
**阶段2:模式分析**
|
||||
- 找到同代码库中类似的正常工作代码
|
||||
- 逐项对比差异
|
||||
- 理解依赖关系
|
||||
|
||||
**阶段3:假设与测试**
|
||||
- 形成单一假设:"我认为X是根因,因为Y"
|
||||
- 做最小改动测试
|
||||
- 有效 → 阶段4;无效 → 新假设
|
||||
|
||||
**阶段4:实施**
|
||||
- 创建失败测试用例
|
||||
- 修复根因(不是症状)
|
||||
- 验证修复
|
||||
|
||||
---
|
||||
|
||||
## 八、后端开发规范
|
||||
|
||||
### 分层架构
|
||||
```
|
||||
Controller → AppService → Service → Mapper → Entity
|
||||
```
|
||||
|
||||
### 命名规范
|
||||
| 类型 | 规则 | 示例 |
|
||||
|------|------|------|
|
||||
| Controller | `XxxController` | `RegistrationController` |
|
||||
| AppService | `IXxxAppService` / `XxxAppServiceImpl` | `IRegistrationAppService` |
|
||||
| Service | `IXxxService` / `XxxServiceImpl` | `IRegistrationService` |
|
||||
| Mapper | `XxxMapper` | `RegistrationMapper` |
|
||||
| Entity | `Xxx` | `Registration` |
|
||||
| DTO | `XxxDto` / `XxxQueryDto` | `RegistrationDto` |
|
||||
|
||||
### 包结构
|
||||
```
|
||||
com.healthlink.his.web.{module}.controller
|
||||
com.healthlink.his.web.{module}.appservice
|
||||
com.healthlink.his.web.{module}.service
|
||||
com.healthlink.his.web.{module}.mapper
|
||||
com.healthlink.his.web.{module}.dto
|
||||
com.healthlink.his.domain.{module}
|
||||
com.healthlink.his.common.enums
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- 所有查询使用 `LambdaQueryWrapper`,禁止字符串拼接 SQL
|
||||
- `@Transactional(rollbackFor = Exception.class)` 管理事务
|
||||
- 所有接口标注 `@PreAuthorize` 权限控制
|
||||
- 患者敏感信息在日志中脱敏
|
||||
- **扩展功能不修改原有函数签名**
|
||||
|
||||
---
|
||||
|
||||
## 九、前端开发规范
|
||||
|
||||
### 技术栈
|
||||
- Vue 3 + Vite + Element Plus + Pinia + Axios(基于 RuoYi-Vue3)
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
src/api/{module}/ # API接口
|
||||
src/views/{module}/ # 页面组件
|
||||
src/store/modules/ # Pinia状态管理
|
||||
src/components/ # 公共组件
|
||||
```
|
||||
|
||||
### 关键约束
|
||||
- API前缀:`/healthlink-his/api/v1/`
|
||||
- 路由懒加载:`() => import('@/views/xxx/index.vue')`
|
||||
- 页面使用 `<script setup>` 语法
|
||||
- 按钮权限使用 `v-hasPermi` 指令
|
||||
- `onMounted` 中注册的事件在 `onUnmounted` 中移除
|
||||
|
||||
---
|
||||
|
||||
## 十、Agent 体系
|
||||
|
||||
### 角色与路由
|
||||
|
||||
| 代号 | 名称 | 角色 | 路由关键词 |
|
||||
|------|------|------|-----------|
|
||||
| liubei | 刘备 | 项目经理 | 协调、分派、异常升级 |
|
||||
| zhugeliang | 诸葛亮 | 架构师 | 分析、路由、设计 |
|
||||
| guanyu | 关羽 | 后端开发 | java, api, spring, service, controller |
|
||||
| zhaoyun | 赵云 | 前端开发 | vue, 界面, 显示, 弹窗, 按钮 |
|
||||
| xunyu | 荀彧 | DBA | 数据库, sql, 迁移, mapper xml |
|
||||
| zhangfei | 张飞 | 测试 | 测试, QA, 回归 |
|
||||
| huatuo | 华佗 | 验收 | 需求验收、质量确认 |
|
||||
| chenlin | 陈琳 | 文档 | 文档、归档、Git提交 |
|
||||
|
||||
### 协作流水线
|
||||
|
||||
```
|
||||
刘备(协调) → 诸葛亮(分析路由) → {关羽|赵云}(修复) → 荀彧(DB审查) → 张飞(测试) → 华佗(验收) → 陈琳(归档)
|
||||
```
|
||||
|
||||
### Bug 修复完整管线(BDT 方法论)
|
||||
|
||||
```
|
||||
获取Bug → 设计测试用例 → 基线测试(应失败) → 全链路修复 → 回归测试(应通过) → 扩展测试(无回归) → 提交
|
||||
```
|
||||
|
||||
### Bug 状态管理铁律
|
||||
- 人类提的 Bug:只加备注,不改状态,不改分配
|
||||
- 智能体提的 Bug:可以改分配和加备注
|
||||
- 已关闭/已解决的 Bug 不再处理
|
||||
|
||||
---
|
||||
|
||||
## 十一、审查与审计
|
||||
|
||||
### 三层审查体系
|
||||
|
||||
| 层级 | 内容 | 时机 |
|
||||
|------|------|------|
|
||||
| **L1 自审** | Agent 对照约束逐条检查 | 每次提交前 |
|
||||
| **L2 配对审查** | Agent 生成变更摘要,人类终审 | PR/提交时 |
|
||||
| **L3 合规审查** | 审计追踪,记录所有 AI 操作 | 持续 |
|
||||
|
||||
### L1 自审清单
|
||||
```yaml
|
||||
self_review:
|
||||
- "所有修改能通过编译?"
|
||||
- "遵守命名规范?"
|
||||
- "测试覆盖达标?"
|
||||
- "没有遗漏的 TODO / DEBUG?"
|
||||
- "变更范围没超出任务边界?"
|
||||
```
|
||||
|
||||
### 评审评分维度
|
||||
| 维度 | 问题 |
|
||||
|------|------|
|
||||
| 正确性 | 行为是否符合目标功能? |
|
||||
| 验证 | 检查是否真的跑过并留下证据? |
|
||||
| 范围纪律 | 是否保持在选定功能范围内? |
|
||||
| 可靠性 | 结果能否在重启后继续工作? |
|
||||
| 可维护性 | 代码和文档是否清楚到可交接? |
|
||||
|
||||
---
|
||||
|
||||
## 十二、标准工作循环
|
||||
|
||||
```
|
||||
开始会话
|
||||
├→ 1. Init — 读 AGENTS.md + PROGRESS.md + git log
|
||||
├→ 2. Select — 只选一个未完成功能
|
||||
├→ 3. Implement — 一次只做一个,不扩大范围
|
||||
├→ 4. Verify — 运行验证命令,有证据才标记完成
|
||||
└→ 5. Cleanup — 更新进度 + clean-state-checklist + git commit
|
||||
```
|
||||
|
||||
### 会话结束前必须运行 Clean State Checklist
|
||||
```
|
||||
□ 标准启动路径仍然可用
|
||||
□ 标准验证路径仍然可运行
|
||||
□ 当前进度已记录到进度日志
|
||||
□ 无半成品步骤处于未记录状态
|
||||
□ 下一轮会话无需人工修复即可继续
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十三、开发流程
|
||||
|
||||
```
|
||||
收到任务
|
||||
├→ ① 分析需求 → 读相关文档(MD/)、读全链路6环
|
||||
├→ ② 制定计划 → update_plan (3-6个阶段)
|
||||
├→ ③ 后端开发 → Controller → AppService → Service → Mapper → Entity → Flyway
|
||||
├→ ④ 后端测试 → mvn test → 接口测试(业务逻辑验证)
|
||||
├→ ⑤ 前端开发 → API接口 → 页面组件 → 路由配置
|
||||
├→ ⑥ 前端测试 → npm run build:dev → 功能验证
|
||||
├→ ⑦ 质量门禁 → L1编译 → L2测试 → L3DB审查 → L4验收 → L5归档
|
||||
└→ ⑧ 提交代码 → git commit(规范格式) → git push → 文档更新
|
||||
```
|
||||
|
||||
### Git Commit 格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
type: feat|fix|docs|refactor|test|chore
|
||||
scope: 模块名(如 registration, billing, pharmacy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十四、快速参考命令
|
||||
|
||||
```bash
|
||||
# === 后端 ===
|
||||
export JAVA_HOME=/opt/jdk-25
|
||||
mvn clean compile -DskipTests # 编译
|
||||
mvn install -DskipTests # 构建
|
||||
mvn test -pl healthlink-his-application -Dtest="XxxTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
|
||||
# === 前端 ===
|
||||
cd healthlink-his-ui
|
||||
npm run dev && npm run build:dev && npm run lint && npm run test:run
|
||||
|
||||
# === Git ===
|
||||
git status && git add -A && git commit -m "feat(module): desc" && git push origin develop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十五、详细规范文档索引
|
||||
|
||||
| 文档 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 执行铁律 | `MD/specs/IRON_RULES.md` | 铁律完整版 |
|
||||
| 后端规范 | `MD/specs/BACKEND_DEVELOPMENT_STANDARD.md` | 后端编码标准 |
|
||||
| 前端规范 | `MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md` | 前端编码标准 |
|
||||
| Harness方法论 | `MD/specs/HARNESS_ENGINEERING.md` | 完整Harness+Agent方法论 |
|
||||
| 文档规范 | `MD/DOCUMENTATION_STANDARD.md` | 文档管理标准 |
|
||||
| 后端清单 | `MD/specs/BACKEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 前端清单 | `MD/specs/FRONTEND_CHECKLIST.md` | 发布前检查 |
|
||||
| 三甲标准 | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲医院达标标准 |
|
||||
| Flyway指南 | `MD/guides/FLYWAY_USAGE_GUIDE.md` | 数据库迁移指南 |
|
||||
|
||||
---
|
||||
|
||||
## 十六、过往教训
|
||||
|
||||
| 教训 | 内容 |
|
||||
|------|------|
|
||||
| 状态链路断裂 | Bug#574: 签到设 BOOKED(1) 而非 CHECKED_IN(3),前端映射缺失 → 必须走完整状态链路 |
|
||||
| 盲删源文件 | AI 看到编译错误直接删文件,没检查 baseline → 必须先确认文件来源 |
|
||||
| 修复方向偏差 | 多次 fallback 改的是错误的 Service → 必须用 rg 搜索所有相关代码路径 |
|
||||
| bug_reports 缺列 | INSERT 静默失败 → 必须检查表结构 |
|
||||
| 禅道 comment API | API 不存在,用 resolve+activate workaround |
|
||||
| SQLite WAL 并发 | 多进程并发写需要 checkpoint |
|
||||
| UTF-8 切片 | 多字节字符不能用 byte index 切片 |
|
||||
| 上下文焦虑 | Agent 感觉上下文快满时会匆忙结束,跳过验证 → 注意 context 40% 阈值 |
|
||||
| 过早宣告胜利 | 自评≠验证,分开"干活"和"检查" |
|
||||
| 覆盖率幻觉 | 覆盖率达标但逻辑没测 → 引入变异测试 |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ 本文件是 AI 开发规范的唯一信源。各工具配置文件由 `bash scripts/sync-ai-rules.sh` 同步。
|
||||
|
||||
---
|
||||
|
||||
> 📅 最后同步: 2026-06-06 15:09 | 源文件: RULES.md | 重新同步: `bash scripts/sync-ai-rules.sh`
|
||||
192
MD/DOCUMENTATION_STANDARD.md
Normal file
192
MD/DOCUMENTATION_STANDARD.md
Normal file
@@ -0,0 +1,192 @@
|
||||
# HealthLink HIS 文档管理规范
|
||||
|
||||
> **文档类型**: 技术规范
|
||||
> **适用范围**: 项目所有文档(Markdown格式)
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
## 一、目录结构规范
|
||||
|
||||
```
|
||||
MD/
|
||||
├── DOCUMENTATION_STANDARD.md # 本文档(规范)
|
||||
├── architecture/ # 架构设计
|
||||
├── development/ # 开发计划与记录
|
||||
├── standards/ # 国家/行业标准
|
||||
├── specs/ # 技术规范与流程
|
||||
├── bugs/ # Bug分析与修复记录
|
||||
├── guides/ # 使用指南
|
||||
└── upgrade/ # 升级记录
|
||||
```
|
||||
|
||||
### 1.1 目录说明
|
||||
|
||||
| 目录 | 用途 | 示例文件 |
|
||||
|---|---|---|
|
||||
| `architecture/` | 系统架构、模块设计、数据库设计 | `GRADE3A_DETAILED_DESIGN.md` |
|
||||
| `development/` | 开发计划、进度记录、功能分析 | `DEVELOPMENT_PLAN_V2.md` |
|
||||
| `standards/` | 国家/行业标准规范、政策文件 | `GRADE3A_HIS_STANDARD.md` |
|
||||
| `specs/` | 技术规范、流程定义、检查清单 | `BACKEND_CHECKLIST.md` |
|
||||
| `bugs/` | Bug分析、修复记录、问题追踪 | `BUG_632_ANALYSIS.md` |
|
||||
| `guides/` | 使用指南、操作手册 | `FLYWAY_USAGE_GUIDE.md` |
|
||||
| `upgrade/` | 升级计划、升级日志 | `SPRINGBOOT_UPGRADE_LOG.md` |
|
||||
|
||||
---
|
||||
|
||||
## 二、文件命名规范
|
||||
|
||||
### 2.1 命名规则
|
||||
|
||||
```
|
||||
<类别>_<子类别>_<简短描述>.md
|
||||
```
|
||||
|
||||
### 2.2 命名格式
|
||||
|
||||
| 类别 | 格式 | 示例 |
|
||||
|---|---|---|
|
||||
| **架构设计** | `ARCH_<模块>_<描述>` | `ARCH_DATABASE_DESIGN.md` |
|
||||
| **开发计划** | `PLAN_<类型>_<版本>` | `PLAN_DEVELOPMENT_V2.md` |
|
||||
| **国家标准** | `STD_<标准名称>` | `STD_GRADE3A_HIS.md` |
|
||||
| **技术规范** | `SPEC_<类型>_<描述>` | `SPEC_BACKEND_CHECKLIST.md` |
|
||||
| **Bug修复** | `BUG_<编号>_<描述>` | `BUG_632_ANALYSIS.md` |
|
||||
| **使用指南** | `GUIDE_<主题>` | `GUIDE_FLYWAY.md` |
|
||||
| **升级记录** | `UPGRADE_<组件>_<类型>` | `UPGRADE_SPRINGBOOT_LOG.md` |
|
||||
|
||||
### 2.3 命名规则详解
|
||||
|
||||
1. **全部大写** — 文件名使用大写字母和下划线
|
||||
2. **英文命名** — 所有文件名使用英文(描述内容可用中文)
|
||||
3. **下划线分隔** — 单词之间用下划线连接
|
||||
4. **版本号** — 在文件名末尾标注版本(如 `_V2`)
|
||||
5. **日期标注** — 不在文件名中使用日期(使用文件内元数据)
|
||||
|
||||
### 2.4 禁止事项
|
||||
|
||||
- ❌ 使用中文作为文件名
|
||||
- ❌ 使用空格分隔单词
|
||||
- ❌ 使用特殊字符(`!@#$%^&*`)
|
||||
- ❌ 文件名超过50个字符
|
||||
- ❌ 使用大驼峰命名(`MyDocument.md`)
|
||||
|
||||
---
|
||||
|
||||
## 三、文档格式规范
|
||||
|
||||
### 3.1 文档头部元数据
|
||||
|
||||
每个文档必须包含以下元数据:
|
||||
|
||||
```markdown
|
||||
# 文档标题
|
||||
|
||||
> **文档类型**: [架构设计|开发计划|技术规范|Bug修复|使用指南|升级记录]
|
||||
> **适用范围**: [描述适用的模块或场景]
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: YYYY-MM-DD
|
||||
> **最后更新**: YYYY-MM-DD
|
||||
> **编制人**: [姓名/角色]
|
||||
```
|
||||
|
||||
### 3.2 文档结构模板
|
||||
|
||||
```markdown
|
||||
# 文档标题
|
||||
|
||||
> 元数据块
|
||||
|
||||
---
|
||||
|
||||
## 一、概述
|
||||
<!-- 简要描述文档目的和内容 -->
|
||||
|
||||
## 二、详细内容
|
||||
<!-- 主体内容 -->
|
||||
|
||||
## 三、实施计划
|
||||
<!-- 如果适用 -->
|
||||
|
||||
## 四、注意事项
|
||||
<!-- 关键约束和注意事项 -->
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**: v1.0
|
||||
> **最后更新**: YYYY-MM-DD
|
||||
```
|
||||
|
||||
### 3.3 格式要求
|
||||
|
||||
| 要求 | 说明 |
|
||||
|---|---|
|
||||
| **标题层级** | 使用 `#` `##` `###`,不超过4级 |
|
||||
| **表格** | 使用标准Markdown表格格式 |
|
||||
| **代码块** | 使用 ``` 包裹,标注语言类型 |
|
||||
| **列表** | 使用 `-` 或 `1.` 统一格式 |
|
||||
| **链接** | 使用相对路径引用其他文档 |
|
||||
| **图片** | 使用相对路径,存储在 `assets/` 目录 |
|
||||
|
||||
---
|
||||
|
||||
## 四、文件分类映射表
|
||||
|
||||
### 4.1 现有文件映射
|
||||
|
||||
| 原文件路径 | 新文件路径 | 说明 |
|
||||
|---|---|---|
|
||||
| `docs/三甲医院HIS系统标准规范汇编.md` | `MD/standards/GRADE3A_HIS_STANDARD.md` | 三甲标准规范 |
|
||||
| `docs/GRADE3A_DETAILED_DESIGN.md` | `MD/architecture/GRADE3A_DETAILED_DESIGN.md` | 三甲详细设计 |
|
||||
| `docs/GRADE3A_DEVELOPMENT_PLAN.md` | `MD/development/GRADE3A_DEVELOPMENT_PLAN.md` | 三甲开发计划 |
|
||||
| `docs/GRADE3A_HIS_DESIGN.md` | `MD/architecture/GRADE3A_HIS_DESIGN.md` | 三甲HIS设计 |
|
||||
| `docs/DEVELOPMENT_PLAN_V2.md` | `MD/development/DEVELOPMENT_PLAN_V2.md` | 开发计划V2 |
|
||||
| `docs/BACKEND_UPGRADE_PLAN.md` | `MD/upgrade/BACKEND_UPGRADE_PLAN.md` | 后端升级计划 |
|
||||
| `docs/UPGRADE_PLAN_v2.0.md` | `MD/upgrade/UPGRADE_PLAN_V2.md` | 升级计划V2 |
|
||||
| `docs/UPGRADE_LOG.md` | `MD/upgrade/UPGRADE_LOG.md` | 升级日志 |
|
||||
| `docs/MYBATIS_PLUS_UPGRADE_PLAN.md` | `MD/upgrade/MYBATIS_PLUS_UPGRADE.md` | MyBatis升级 |
|
||||
| `docs/RUOYI_392_UPGRADE_CHECKLIST.md` | `MD/upgrade/RUOYI_UPGRADE_CHECKLIST.md` | 若依升级清单 |
|
||||
| `docs/FLYWAY_USAGE_GUIDE.md` | `MD/guides/FLYWAY_USAGE_GUIDE.md` | Flyway使用指南 |
|
||||
| `docs/MENU_FUNCTION_ANALYSIS.md` | `MD/development/MENU_FUNCTION_ANALYSIS.md` | 菜单功能分析 |
|
||||
| `docs/HIS项目Bug修复记录-v1.0.md` | `MD/bugs/BUG_FIX_RECORD.md` | Bug修复记录 |
|
||||
| `docs/bug439_analysis.md` | `MD/bugs/BUG_439_ANALYSIS.md` | Bug 439分析 |
|
||||
| `docs/bug462_analysis.md` | `MD/bugs/BUG_462_ANALYSIS.md` | Bug 462分析 |
|
||||
| `docs/bug494_analysis.md` | `MD/bugs/BUG_494_ANALYSIS.md` | Bug 494分析 |
|
||||
| `docs/bug498_analysis.md` | `MD/bugs/BUG_498_ANALYSIS.md` | Bug 498分析 |
|
||||
| `docs/bug-fixes/bug-632.md` | `MD/bugs/BUG_632_ANALYSIS.md` | Bug 632分析 |
|
||||
| `docs/bug-fixes/bug-634.md` | `MD/bugs/BUG_634_ANALYSIS.md` | Bug 634分析 |
|
||||
| `docs/bug-fixes/bug-644.md` | `MD/bugs/BUG_644_ANALYSIS.md` | Bug 644分析 |
|
||||
| `docs/specs/backend-checklist.md` | `MD/specs/BACKEND_CHECKLIST.md` | 后端检查清单 |
|
||||
| `docs/specs/frontend-checklist.md` | `MD/specs/FRONTEND_CHECKLIST.md` | 前端检查清单 |
|
||||
| `docs/specs/cicd-gatekeeper.md` | `MD/specs/CICD_GATEKEEPER.md` | CI/CD门禁 |
|
||||
| `docs/specs/commit-template.md` | `MD/specs/COMMIT_TEMPLATE.md` | 提交模板 |
|
||||
| `docs/specs/his-release-checklist-v1.0.md` | `MD/specs/RELEASE_CHECKLIST.md` | 发布清单 |
|
||||
| `docs/specs/playwright-e2e-testing-plan.md` | `MD/specs/PLAYWRIGHT_TESTING_PLAN.md` | E2E测试计划 |
|
||||
|
||||
---
|
||||
|
||||
## 五、铁律
|
||||
|
||||
1. **文档统一存储** — 所有文档必须存储在 `MD/` 目录中
|
||||
2. **命名规范** — 所有文件名必须遵循命名规范
|
||||
3. **格式规范** — 所有文档必须包含元数据块
|
||||
4. **版本管理** — 重大修改必须更新版本号
|
||||
5. **及时更新** — 代码变更后必须同步更新相关文档
|
||||
|
||||
---
|
||||
|
||||
## 六、检查清单
|
||||
|
||||
- [ ] 文件名是否使用大写英文+下划线?
|
||||
- [ ] 文件是否存储在正确的子目录中?
|
||||
- [ ] 文档头部是否包含元数据块?
|
||||
- [ ] 文档结构是否符合模板?
|
||||
- [ ] 代码块是否标注语言类型?
|
||||
- [ ] 表格是否使用标准格式?
|
||||
- [ ] 链接是否使用相对路径?
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**: v1.0
|
||||
> **最后更新**: 2026-06-06
|
||||
425
MD/MODULE_INDEX.md
Normal file
425
MD/MODULE_INDEX.md
Normal file
@@ -0,0 +1,425 @@
|
||||
# HealthLink-HIS 代码模块索引
|
||||
|
||||
> 供 LLM 快速定位代码。每个模块列出 Controller → Service → Mapper 关键文件。
|
||||
> 最后更新: 2026-06-15 12:00 (300 个 Controller)
|
||||
|
||||
## 关键词 → 模块速查
|
||||
|
||||
| 关键词 | 后端模块 | 前端目录 |
|
||||
|---|---|---|
|
||||
| 门诊医生站/门诊医嘱/门诊处方/诊断/检查申请 | `doctorstation` | `doctorstation` |
|
||||
| 住院医生站/住院医嘱/临床医嘱/签发/停嘱 | `regdoctorstation` | `inpatientDoctor` |
|
||||
| 住院护士站/医嘱校对/医嘱执行/护理/换床 | `inhospitalnursestation` | `inpatientNurse` |
|
||||
| 挂号/门诊收费/门诊结算 | `chargemanage` | `charge` |
|
||||
| 住院收费/住院结算/预交金 | `inhospitalcharge` | `inHospitalManagement` |
|
||||
| 收费管理/计费/退费 | `paymentmanage` | `outpatientFinance` |
|
||||
| 药品/药房/药库/发药/取药 | `pharmacymanage` | `pharmacymanagement` |
|
||||
| 药房发药/门诊发药 | `pharmacyDispensarymanage` | `drug` |
|
||||
| 药库管理/库存 | `pharmacyWarehousemanage` | `medicineStorage` |
|
||||
| 库存管理/盘点/出入库 | `inventorymanage` | `medicineStorage` |
|
||||
| 物资管理/耗材 | `materialmanage` | `` |
|
||||
| 字典/数据字典/诊疗目录/基础数据 | `datadictionary` | `datadictionary` |
|
||||
| 部门/科室管理 | `departmentmanage` | `system` |
|
||||
| 卡管理/就诊卡 | `cardmanagement` | `cardmanagement` |
|
||||
| 检验/化验/标本 | `lab` | `inspection` |
|
||||
| 检查/影像/放射 | `Inspection` | `inspection` |
|
||||
| 手术/手术安排/手术申请 | `surgicalschedule` | `surgerymanage` |
|
||||
| 病历/电子病历/EMR | `emr` | `emr` |
|
||||
| 护理记录/护理评估 | `nursing` | `nursing` |
|
||||
| 分诊/排队/叫号 | `triageandqueuemanage` | `triageandqueuemanage` |
|
||||
| 医保/医保对码/医保目录 | `ybmanage` | `ybmanagement` |
|
||||
| 会诊/会诊申请 | `consultation` | `consultationmanagement` |
|
||||
| 院感/感染上报 | `infection` | `infection` |
|
||||
| 合理用药/处方审核 | `rationaldrug` | `rationaldrug` |
|
||||
| 中医/中医处方 | `tcm` | `tcm` |
|
||||
| 患者管理/患者信息 | `patientmanage` | `patientmanagement` |
|
||||
| 预约/挂号预约 | `appointmentmanage` | `appoinmentmanage` |
|
||||
| 报告/报告管理 | `reportmanage` | `` |
|
||||
| 质控/质量 | `quality` | `quality` |
|
||||
| 系统管理/用户/角色/权限 | `basicmanage` | `system` |
|
||||
| 门诊管理/门诊工作站 | `outpatientmanage` | `doctorstation` |
|
||||
| 前置手术/术前管理 | `preopmanage` | `preopmanage` |
|
||||
| 危急值 | `criticalvalue` | `criticalvalue` |
|
||||
| 抗菌药 | `antibiotic` | `antibiotic` |
|
||||
| 随访 | `followup` | `followup` |
|
||||
| request.js/请求拦截/响应拦截 | `common` | `crossmodule` |
|
||||
|
||||
## 后端模块详情
|
||||
|
||||
### `Inspection` (40 files)
|
||||
- **Controller**: `Inspection/controller/SampleCollectController.java` `Inspection/controller/ObservationDefController.java` `Inspection/controller/LabReferenceRangeController.java`
|
||||
- **AppService**: `Inspection/appservice/ISampleCollectAppManageAppService.java` `Inspection/appservice/ILisConfigManageAppService.java` `Inspection/appservice/IInstrumentManageAppService.java`
|
||||
- **ServiceImpl**: `Inspection/appservice/impl/LisConfigManageAppServiceImpl.java` `Inspection/appservice/impl/ObservationManageAppServiceImpl.java` `Inspection/appservice/impl/SpecimenManageAppServiceImpl.java`
|
||||
- **Mapper**: `Inspection/mapper/SampleCollectMapper.java` `Inspection/mapper/LisReportMapper.java` `Inspection/mapper/GroupRecMapper.java`
|
||||
- **DTO**: `Inspection/dto/SampleCollectManageDto.java` `Inspection/dto/SpecimenDefManageDto.java` `Inspection/dto/InstrumentManageDto.java` `Inspection/dto/LisConfigManageDto.java` `Inspection/dto/InstrumentSelParam.java`
|
||||
|
||||
### `adjustprice` (10 files)
|
||||
- **Controller**: `adjustprice/controller/ChangePriceController.java` `adjustprice/controller/ChangePriceDataListPageController.java`
|
||||
- **ServiceImpl**: `adjustprice/appservice/impl/AdjustPriceServiceImpl.java`
|
||||
- **Mapper**: `adjustprice/mapper/AdjustPriceMapper.java`
|
||||
- **DTO**: `adjustprice/dto/ChangePriceDataDto.java` `adjustprice/dto/AdjustPriceManagerSearchParam.java` `adjustprice/dto/ChangePricePageDto.java`
|
||||
|
||||
### `anesthesia` (4 files)
|
||||
- **Controller**: `anesthesia/controller/AnesthesiaController.java` `anesthesia/controller/AnesthesiaEnhancedController.java`
|
||||
- **AppService**: `anesthesia/appservice/IAnesthesiaAppService.java`
|
||||
- **ServiceImpl**: `anesthesia/appservice/impl/AnesthesiaAppServiceImpl.java`
|
||||
|
||||
### `antibiotic` (3 files)
|
||||
- **Controller**: `antibiotic/controller/AntibioticController.java`
|
||||
- **AppService**: `antibiotic/appservice/IAntibioticAppService.java`
|
||||
- **ServiceImpl**: `antibiotic/appservice/impl/AntibioticAppServiceImpl.java`
|
||||
|
||||
### `appointmentmanage` (29 files)
|
||||
- **Controller**: `appointmentmanage/controller/ScheduleSlotController.java` `appointmentmanage/controller/DeptAppthoursController.java` `appointmentmanage/controller/SchedulePoolController.java`
|
||||
- **AppService**: `appointmentmanage/appservice/IDeptAppService.java` `appointmentmanage/appservice/IDoctorScheduleAppService.java` `appointmentmanage/appservice/IClinicRoomAppService.java`
|
||||
- **ServiceImpl**: `appointmentmanage/appservice/impl/DoctorScheduleAppServiceImpl.java` `appointmentmanage/appservice/impl/DeptAppointmentHoursAppServiceImpl.java` `appointmentmanage/appservice/impl/TicketAppServiceImpl.java`
|
||||
- **Mapper**: `appointmentmanage/mapper/DoctorScheduleAppMapper.java` `appointmentmanage/mapper/SchedulePoolAppMapper.java` `appointmentmanage/mapper/DeptAppMapper.java`
|
||||
- **DTO**: `appointmentmanage/dto/TicketDto.java` `appointmentmanage/dto/SchedulePoolDto.java`
|
||||
|
||||
### `basedatamanage` (44 files)
|
||||
- **Controller**: `basedatamanage/controller/OrganizationLocationController.java` `basedatamanage/controller/BodyStructureController.java` `basedatamanage/controller/OperatingRoomController.java`
|
||||
- **AppService**: `basedatamanage/appservice/IOrganizationAppService.java` `basedatamanage/appservice/IBodyStructureAppService.java` `basedatamanage/appservice/ILocationAppService.java`
|
||||
- **ServiceImpl**: `basedatamanage/appservice/impl/PractitionerAppServiceImpl.java` `basedatamanage/appservice/impl/BodyStructureAppServiceImpl.java` `basedatamanage/appservice/impl/OrganizationAppServiceImpl.java`
|
||||
- **Mapper**: `basedatamanage/mapper/PractitionerAppAppMapper.java`
|
||||
- **DTO**: `basedatamanage/dto/SelectableOrgDto.java` `basedatamanage/dto/PractitionerOrgAndLocationDto.java` `basedatamanage/dto/OrganizationInitDto.java` `basedatamanage/dto/OperatingRoomDto.java` `basedatamanage/dto/LocationInitDto.java`
|
||||
|
||||
### `basicmanage` (5 files)
|
||||
- **Controller**: `basicmanage/controller/BedController.java` `basicmanage/controller/InvoiceController.java` `basicmanage/controller/InvoiceSegmentController.java`
|
||||
|
||||
### `basicservice` (7 files)
|
||||
- **Controller**: `basicservice/controller/HealthcareServiceController.java`
|
||||
- **Mapper**: `basicservice/mapper/HealthcareServiceBizMapper.java`
|
||||
- **DTO**: `basicservice/dto/HealthcareServiceAddOrUpdateParam.java` `basicservice/dto/HealthcareServiceDto.java` `basicservice/dto/HealthcareServiceInitDto.java`
|
||||
|
||||
### `ca` (3 files)
|
||||
- **Controller**: `ca/controller/CaSignatureController.java`
|
||||
- **AppService**: `ca/appservice/ICaSignatureAppService.java`
|
||||
- **ServiceImpl**: `ca/appservice/impl/CaSignatureAppServiceImpl.java`
|
||||
|
||||
### `cardmanagement` (17 files)
|
||||
- **Controller**: `cardmanagement/controller/CardManageController.java`
|
||||
- **AppService**: `cardmanagement/appservice/ICardManageAppService.java`
|
||||
- **ServiceImpl**: `cardmanagement/appservice/impl/CardManageAppServiceImpl.java`
|
||||
- **Mapper**: `cardmanagement/mapper/InfectiousAuditMapper.java` `cardmanagement/mapper/InfectiousCardMapper.java`
|
||||
- **DTO**: `cardmanagement/dto/InfectiousCardDto.java` `cardmanagement/dto/DoctorCardQueryDto.java` `cardmanagement/dto/DoctorCardListDto.java` `cardmanagement/dto/SingleReturnDto.java` `cardmanagement/dto/CardStatisticsDto.java`
|
||||
|
||||
### `catalogmanage` (4 files)
|
||||
- **Controller**: `catalogmanage/controller/CatalogController.java`
|
||||
- **ServiceImpl**: `catalogmanage/appservice/impl/CatalogServiceImpl.java`
|
||||
- **Mapper**: `catalogmanage/mapper/CatalogMapper.java`
|
||||
|
||||
### `charge` (4 files)
|
||||
- **Controller**: `charge/patientcardrenewal/PatientCardRenewalController.java`
|
||||
- **ServiceImpl**: `charge/patientcardrenewal/PatientCardRenewalServiceImpl.java`
|
||||
|
||||
### `chargemanage` (46 files)
|
||||
- **Controller**: `chargemanage/controller/OutpatientRegistrationController.java` `chargemanage/controller/OutpatientPricingController.java` `chargemanage/controller/InpatientChargeController.java`
|
||||
- **AppService**: `chargemanage/appservice/IInpatientChargeAppService.java` `chargemanage/appservice/IOutpatientRegistrationAppService.java` `chargemanage/appservice/IOutpatientRefundAppService.java`
|
||||
- **ServiceImpl**: `chargemanage/appservice/impl/OutpatientChargeAppServiceImpl.java` `chargemanage/appservice/impl/InpatientChargeAppServiceImpl.java` `chargemanage/appservice/impl/OutpatientRefundAppServiceImpl.java`
|
||||
- **Mapper**: `chargemanage/mapper/OutpatientRefundAppMapper.java` `chargemanage/mapper/OutpatientRegistrationAppMapper.java` `chargemanage/mapper/OutpatientChargeAppMapper.java`
|
||||
- **DTO**: `chargemanage/dto/ReprintRegistrationDto.java` `chargemanage/dto/EncounterPatientRefundDto.java` `chargemanage/dto/OutpatientPricingPriceDto.java` `chargemanage/dto/OutpatientPricingInventoryDto.java` `chargemanage/dto/RefundItemParam.java`
|
||||
|
||||
### `check` (27 files)
|
||||
- **Controller**: `check/controller/CheckMethodController.java` `check/controller/SpecimenBarcodeController.java` `check/controller/RadiologyEnhancedController.java`
|
||||
- **AppService**: `check/appservice/ILisGroupInfoAppService.java` `check/appservice/ICheckPartAppService.java` `check/appservice/ICheckMethodAppService.java`
|
||||
- **ServiceImpl**: `check/appservice/impl/CheckMethodAppServiceImpl.java` `check/appservice/impl/CheckPartAppServiceImpl.java` `check/appservice/impl/CheckPackageAppServiceImpl.java`
|
||||
- **Mapper**: `check/mapper/LisGroupInfoAppMapper.java` `check/mapper/CheckMethodAppMapper.java` `check/mapper/CheckPartAppMapper.java`
|
||||
- **DTO**: `check/dto/CheckPackageDetailDto.java` `check/dto/ExamApplyDto.java` `check/dto/ExamApplyItemDto.java` `check/dto/CheckPackageDto.java` `check/dto/CheckMethodDto.java`
|
||||
|
||||
### `clinical` (2 files)
|
||||
- **Controller**: `clinical/controller/KnowledgeBaseController.java` `clinical/controller/ClinicalPathwayController.java`
|
||||
|
||||
### `clinicalmanage` (11 files)
|
||||
- **Controller**: `clinicalmanage/controller/SurgicalScheduleController.java` `clinicalmanage/controller/SurgeryController.java`
|
||||
- **AppService**: `clinicalmanage/appservice/ISurgicalScheduleAppService.java` `clinicalmanage/appservice/ISurgeryAppService.java`
|
||||
- **ServiceImpl**: `clinicalmanage/appservice/impl/SurgicalScheduleAppServiceImpl.java` `clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java`
|
||||
- **Mapper**: `clinicalmanage/mapper/SurgicalScheduleAppMapper.java` `clinicalmanage/mapper/SurgeryAppMapper.java`
|
||||
- **DTO**: `clinicalmanage/dto/SurgeryDto.java` `clinicalmanage/dto/OpScheduleDto.java` `clinicalmanage/dto/OpCreateScheduleDto.java`
|
||||
|
||||
### `common` (17 files)
|
||||
- **Controller**: `common/controller/CommonAppController.java`
|
||||
- **ServiceImpl**: `common/appservice/impl/CommonServiceImpl.java`
|
||||
- **Mapper**: `common/mapper/CommonAppMapper.java`
|
||||
- **DTO**: `common/dto/ActivityDefinitionDto.java` `common/dto/PerformInfoDto.java` `common/dto/PractitionerInfoDto.java` `common/dto/LocationInventoryDto.java` `common/dto/PerformRecordDto.java`
|
||||
|
||||
### `consultation` (19 files)
|
||||
- **Controller**: `consultation/controller/ConsultationController.java`
|
||||
- **AppService**: `consultation/appservice/IConsultationAppService.java`
|
||||
- **ServiceImpl**: `consultation/appservice/impl/ConsultationAppServiceImpl.java`
|
||||
- **Mapper**: `consultation/mapper/ConsultationInvitedMapper.java` `consultation/mapper/ConsultationConfirmationMapper.java` `consultation/mapper/ConsultationRequestMapper.java`
|
||||
- **DTO**: `consultation/dto/PhysicianNodeDto.java` `consultation/dto/InvitedObjectDto.java` `consultation/dto/ConsultationActivityDto.java` `consultation/dto/DepartmentTreeDto.java` `consultation/dto/ConsultationRequestDto.java`
|
||||
|
||||
### `controller` (2 files)
|
||||
- **Controller**: `controller/WorkflowController.java` `controller/HomeStatisticsController.java`
|
||||
|
||||
### `criticalvalue` (3 files)
|
||||
- **Controller**: `criticalvalue/controller/CriticalValueController.java`
|
||||
- **AppService**: `criticalvalue/appservice/ICriticalValueAppService.java`
|
||||
- **ServiceImpl**: `criticalvalue/appservice/impl/CriticalValueAppServiceImpl.java`
|
||||
|
||||
### `crossmodule` (3 files)
|
||||
- **Controller**: `crossmodule/controller/CrossModuleController.java` `crossmodule/controller/EnhancementController.java` `crossmodule/controller/IntegrationController.java`
|
||||
|
||||
### `datadictionary` (65 files)
|
||||
- **Controller**: `datadictionary/controller/DiagnosisTreatmentController.java` `datadictionary/controller/MedicationManageController.java` `datadictionary/controller/DiseaseManageController.java`
|
||||
- **AppService**: `datadictionary/appservice/IDeviceManageAppService.java` `datadictionary/appservice/IDiagTreatMAppService.java` `datadictionary/appservice/ItemDefinitionAppService.java`
|
||||
- **ServiceImpl**: `datadictionary/appservice/impl/DiagTreatMAppServiceImpl.java` `datadictionary/appservice/impl/SupplierManagementAppServiceImpl.java` `datadictionary/appservice/impl/ItemDefinitionAppServiceImpl.java`
|
||||
- **Mapper**: `datadictionary/mapper/MedicationManageSearchMapper.java` `datadictionary/mapper/ICDCodeMapper.java` `datadictionary/mapper/ActivityDefinitionManageMapper.java`
|
||||
- **DTO**: `datadictionary/dto/DeviceManageUpDto.java` `datadictionary/dto/ChargeItemOptionDto.java` `datadictionary/dto/SupplierDto.java` `datadictionary/dto/DiagnosisTreatmentInitDto.java` `datadictionary/dto/DiagnosisTreatmentSelParam.java`
|
||||
|
||||
### `departmentmanage` (42 files)
|
||||
- **Controller**: `departmentmanage/controller/DepartmentTransferOutOrderController.java` `departmentmanage/controller/DepartmentReturnToWarehouseOrderController.java` `departmentmanage/controller/DepartmentStocktakingOrderController.java`
|
||||
- **ServiceImpl**: `departmentmanage/appservice/impl/DepartmentReceiptApprovalServiceImpl.java` `departmentmanage/appservice/impl/DepartmentStockInOrderServiceImpl.java` `departmentmanage/appservice/impl/DepartmentCommonServiceImpl.java`
|
||||
- **Mapper**: `departmentmanage/mapper/DepartmentTransferInOrderMapper.java` `departmentmanage/mapper/DepartmentStocktakingOrderMapper.java` `departmentmanage/mapper/DepartmentTransferOutOrderMapper.java`
|
||||
- **DTO**: `departmentmanage/dto/DepartmentDeviceInfoDto.java` `departmentmanage/dto/DepartmentDetailDto.java` `departmentmanage/dto/DepartmentInitDto.java` `departmentmanage/dto/DepartmentSearchParam.java` `departmentmanage/dto/DepartmentDto.java`
|
||||
|
||||
### `doctorstation` (91 files)
|
||||
- **Controller**: `doctorstation/controller/DoctorStationDiagnosisController.java` `doctorstation/controller/DoctorStationInspectionLabApplyController.java` `doctorstation/controller/DoctorStationChineseMedicalController.java`
|
||||
- **AppService**: `doctorstation/appservice/IDoctorPhraseAppService.java` `doctorstation/appservice/IDoctorStationEmrAppService.java` `doctorstation/appservice/IDoctorStationMainAppService.java`
|
||||
- **ServiceImpl**: `doctorstation/appservice/impl/DoctorStationPtDetailsAppServiceImpl.java` `doctorstation/appservice/impl/DoctorStationElepPrescriptionServiceImpl.java` `doctorstation/appservice/impl/DoctorPhraseAppServiceImpl.java`
|
||||
- **Mapper**: `doctorstation/mapper/DoctorStationAdviceAppMapper.java` `doctorstation/mapper/DoctorStationEmrAppMapper.java` `doctorstation/mapper/DoctorStationDiagnosisAppMapper.java`
|
||||
- **DTO**: `doctorstation/dto/EncounterContractDto.java` `doctorstation/dto/AdviceInventoryDto.java` `doctorstation/dto/ActivityChildrenJsonParams.java` `doctorstation/dto/DoctorStationLabApplyItemDto.java` `doctorstation/dto/DoctorStationInitDto.java`
|
||||
|
||||
### `document` (47 files)
|
||||
- **Controller**: `document/controller/DocRecordController.java` `document/controller/DocDefinitionController.java` `document/controller/InformedConsentController.java`
|
||||
- **AppService**: `document/appservice/IDocStatisticsAppService.java` `document/appservice/IDocRecordAppService.java` `document/appservice/IDocTemplateAppService.java`
|
||||
- **ServiceImpl**: `document/appservice/impl/DocStatisticsDefinitionAppServiceImpl.java` `document/appservice/impl/DocRecordAppServiceImpl.java` `document/appservice/impl/DocStatisticsAppServiceImpl.java`
|
||||
- **Mapper**: `document/mapper/DocRecordAppMapper.java` `document/mapper/DocStatisticsDefinitionAppMapper.java` `document/mapper/DocDefinitionAppMapper.java`
|
||||
- **DTO**: `document/dto/DocStatisticsDefinitionDto.java` `document/dto/DocRecordPatientQueryParam.java` `document/dto/DocDefinitionOrganizationDto.java` `document/dto/DocRecordDto.java` `document/dto/DocTemplateDto.java`
|
||||
|
||||
### `empi` (5 files)
|
||||
- **Controller**: `empi/controller/EmpiController.java` `empi/controller/EmpiIdVerificationController.java` `empi/controller/EmpiEnhancedController.java`
|
||||
- **AppService**: `empi/appservice/IEmpiAppService.java`
|
||||
- **ServiceImpl**: `empi/appservice/impl/EmpiAppServiceImpl.java`
|
||||
|
||||
### `emr` (6 files)
|
||||
- **Controller**: `emr/controller/EmrArchiveController.java` `emr/controller/StructuredEmrController.java` `emr/controller/EmrRevisionController.java`
|
||||
- **AppService**: `emr/appservice/IStructuredEmrAppService.java`
|
||||
- **ServiceImpl**: `emr/appservice/impl/StructuredEmrAppServiceImpl.java`
|
||||
|
||||
### `epidemic` (3 files)
|
||||
- **Controller**: `epidemic/controller/EpidemicController.java`
|
||||
- **AppService**: `epidemic/appservice/IEpidemicAppService.java`
|
||||
- **ServiceImpl**: `epidemic/appservice/impl/EpidemicAppServiceImpl.java`
|
||||
|
||||
### `esbmanage` (4 files)
|
||||
- **Controller**: `esbmanage/controller/EsbReliabilityController.java` `esbmanage/controller/EsbMessageController.java` `esbmanage/controller/EsbServiceRegistryController.java`
|
||||
|
||||
### `externalintegration` (18 files)
|
||||
- **Controller**: `externalintegration/controller/FoodborneAcquisitionAppController.java`
|
||||
- **AppService**: `externalintegration/appservice/IBankPosCloudAppService.java` `externalintegration/appservice/IFoodborneAcquisitionAppService.java`
|
||||
- **ServiceImpl**: `externalintegration/appservice/impl/FoodborneAcquisitionAppServiceImpl.java` `externalintegration/appservice/impl/BankPosCloudAppServiceImpl.java`
|
||||
- **Mapper**: `externalintegration/mapper/FoodborneAcquisitionAppMapper.java`
|
||||
- **DTO**: `externalintegration/dto/BpcTransactionResponseDto.java` `externalintegration/dto/BpcPaymentScanNotifyDto.java` `externalintegration/dto/FaSimplediseaseAddNopwParam.java` `externalintegration/dto/BpcTransactionRequestDto.java` `externalintegration/dto/BpcDataElementDto.java`
|
||||
|
||||
### `infection` (4 files)
|
||||
- **Controller**: `infection/controller/InfectionEnhancedController.java` `infection/controller/InfectionController.java`
|
||||
- **AppService**: `infection/appservice/IInfectionAppService.java`
|
||||
- **ServiceImpl**: `infection/appservice/impl/InfectionAppServiceImpl.java`
|
||||
|
||||
### `inhospitalcharge` (17 files)
|
||||
- **Controller**: `inhospitalcharge/controller/AdvancePaymentManageController.java` `inhospitalcharge/controller/InHospitalRegisterController.java`
|
||||
- **AppService**: `inhospitalcharge/appservice/IInHospitalRegisterAppService.java` `inhospitalcharge/appservice/IAdvancePaymentManageAppService.java`
|
||||
- **ServiceImpl**: `inhospitalcharge/appservice/impl/AdvancePaymentManageAppServiceImpl.java` `inhospitalcharge/appservice/impl/InHospitalRegisterAppServiceImpl.java`
|
||||
- **Mapper**: `inhospitalcharge/mapper/InHospitalRegisterAppMapper.java` `inhospitalcharge/mapper/AdvancePaymentManageAppMapper.java`
|
||||
- **DTO**: `inhospitalcharge/dto/AdvancePaymentInAndOutDto.java` `inhospitalcharge/dto/PatientUpdateDto.java` `inhospitalcharge/dto/NoFilesRegisterDto.java` `inhospitalcharge/dto/InHospitalPatientInfoDto.java` `inhospitalcharge/dto/InHospitalRegisterQueryDto.java`
|
||||
|
||||
### `inhospitalnursestation` (52 files)
|
||||
- **Controller**: `inhospitalnursestation/controller/AdviceProcessController.java` `inhospitalnursestation/controller/NurseBillingController.java` `inhospitalnursestation/controller/EncounterAutoRollAppController.java`
|
||||
- **AppService**: `inhospitalnursestation/appservice/IOrgDeviceStockTakeAppService.java` `inhospitalnursestation/appservice/IAdviceProcessAppService.java` `inhospitalnursestation/appservice/INurseBillingAppService.java`
|
||||
- **ServiceImpl**: `inhospitalnursestation/appservice/impl/OrgDeviceStockTakeAppServiceImpl.java` `inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java` `inhospitalnursestation/appservice/impl/EncounterAutoRollAppServiceImpl.java`
|
||||
- **Mapper**: `inhospitalnursestation/mapper/ATDManageAppMapper.java` `inhospitalnursestation/mapper/EncounterAutoRollAppMapper.java` `inhospitalnursestation/mapper/MedicineSummaryAppMapper.java`
|
||||
- **DTO**: `inhospitalnursestation/dto/AdmissionBedPageDto.java` `inhospitalnursestation/dto/AdviceExecuteParam.java` `inhospitalnursestation/dto/InpatientAdviceParam.java` `inhospitalnursestation/dto/DispenseFormSearchParam.java` `inhospitalnursestation/dto/AutoRollNursingDto.java`
|
||||
|
||||
### `inpatientmanage` (40 files)
|
||||
- **Controller**: `inpatientmanage/controller/NursingVitalSignsChartController.java` `inpatientmanage/controller/VitalSignsController.java` `inpatientmanage/controller/PatientHomeController.java`
|
||||
- **AppService**: `inpatientmanage/appservice/IPatientHomeAppService.java` `inpatientmanage/appservice/IDepositAppService.java` `inpatientmanage/appservice/INursingRecordAppService.java`
|
||||
- **ServiceImpl**: `inpatientmanage/appservice/impl/DepositAppServiceImpl.java` `inpatientmanage/appservice/impl/NursingRecordAppServiceImpl.java` `inpatientmanage/appservice/impl/PatientHomeAppServiceImpl.java`
|
||||
- **Mapper**: `inpatientmanage/mapper/VitalSignsAppMapper.java` `inpatientmanage/mapper/DepositMapper.java` `inpatientmanage/mapper/NursingRecordAppMapper.java`
|
||||
- **DTO**: `inpatientmanage/dto/DepositDetailDto.java` `inpatientmanage/dto/VitalSignsChartSmallDto.java` `inpatientmanage/dto/VitalSignsSaveDto.java` `inpatientmanage/dto/PatientHomeSearchParam.java` `inpatientmanage/dto/PatientHomeEmptyBedDto.java`
|
||||
|
||||
### `inventorymanage` (107 files)
|
||||
- **Controller**: `inventorymanage/controller/PurchaseReturnController.java` `inventorymanage/controller/InventorySettlementController.java` `inventorymanage/controller/ReturnIssueController.java`
|
||||
- **AppService**: `inventorymanage/appservice/IProductStocktakingAppService.java` `inventorymanage/appservice/IInventoryDetailsAppService.java` `inventorymanage/appservice/IReturnIssueAppService.java`
|
||||
- **ServiceImpl**: `inventorymanage/appservice/impl/InventoryDetailsAppServiceImpl.java` `inventorymanage/appservice/impl/ProductTransferAppServiceImpl.java` `inventorymanage/appservice/impl/ReceiptApprovalAppServiceImpl.java`
|
||||
- **Mapper**: `inventorymanage/mapper/ProductDetailAppMapper.java` `inventorymanage/mapper/RequisitionIssueMapper.java` `inventorymanage/mapper/PurchaseReturnMapper.java`
|
||||
- **DTO**: `inventorymanage/dto/ProductTransferPageDto.java` `inventorymanage/dto/PurchaseInventoryDto.java` `inventorymanage/dto/ReceiptDetailDto.java` `inventorymanage/dto/RequisitionOutDetailDto.java` `inventorymanage/dto/InventoryReceiptDetailDto.java`
|
||||
|
||||
### `jlau` (5 files)
|
||||
- **Controller**: `jlau/controller/ReviewPrescriptionRecordsController.java`
|
||||
- **AppService**: `jlau/appservice/IReviewPrescriptionRecordsAppService.java`
|
||||
- **ServiceImpl**: `jlau/appservice/impl/ReviewPrescriptionRecordsAppServiceImpl.java`
|
||||
- **Mapper**: `jlau/mapper/ReviewPrescriptionRecordsAppMapper.java`
|
||||
- **DTO**: `jlau/dto/ReviewPrescriptionRecordsDto.java`
|
||||
|
||||
### `lab` (7 files)
|
||||
- **Controller**: `lab/controller/LabActivityDefinitionController.java` `lab/controller/LabHistoryController.java` `lab/controller/LabEnhancedController.java`
|
||||
- **AppService**: `lab/appservice/ILabActivityDefinitionAppService.java`
|
||||
- **ServiceImpl**: `lab/appservice/impl/LabActivityDefinitionAppServiceImpl.java`
|
||||
|
||||
### `materialmanage` (46 files)
|
||||
- **Controller**: `materialmanage/controller/MaterialReturnOrderController.java` `materialmanage/controller/MaterialTransferInOrderController.java` `materialmanage/controller/MaterialTransferOutOrderController.java`
|
||||
- **ServiceImpl**: `materialmanage/appservice/impl/MaterialPurchaseOrderServiceImpl.java` `materialmanage/appservice/impl/MaterialTransferOutOrderServiceImpl.java` `materialmanage/appservice/impl/MaterialReturnToWarehouseOrderServiceImpl.java`
|
||||
- **Mapper**: `materialmanage/mapper/MaterialCommonMapper.java` `materialmanage/mapper/MaterialProfitLossOrderMapper.java` `materialmanage/mapper/MaterialTransferOutOrderMapper.java`
|
||||
- **DTO**: `materialmanage/dto/MaterialInitDto.java` `materialmanage/dto/MaterialSearchParam.java` `materialmanage/dto/MaterialDto.java` `materialmanage/dto/MaterialDetailDto.java` `materialmanage/dto/MaterialDeviceInfoDto.java`
|
||||
|
||||
### `mrhomepage` (6 files)
|
||||
- **Controller**: `mrhomepage/controller/DrgAnalysisController.java` `mrhomepage/controller/MrManagementController.java` `mrhomepage/controller/MrHomepageController.java`
|
||||
- **AppService**: `mrhomepage/appservice/IMrHomepageAppService.java`
|
||||
- **ServiceImpl**: `mrhomepage/appservice/impl/MrHomepageAppServiceImpl.java`
|
||||
|
||||
### `nenu` (22 files)
|
||||
- **Controller**: `nenu/controller/GfRatioApplicationRecordController.java` `nenu/controller/GfStudentListController.java` `nenu/controller/GfRatioManageController.java`
|
||||
- **AppService**: `nenu/appservice/IGfRatioManageAppService.java` `nenu/appservice/IGfRatioApplicationRecordAppService.java` `nenu/appservice/IGfStudentListAppService.java`
|
||||
- **ServiceImpl**: `nenu/appservice/impl/GfRatioApplicationRecordAppServiceImpl.java` `nenu/appservice/impl/GfRatioManageAppServiceImpl.java` `nenu/appservice/impl/GfStudentListAppServiceImpl.java`
|
||||
- **Mapper**: `nenu/mapper/GfStudentListAppMapper.java` `nenu/mapper/GfRatioManageAppMapper.java` `nenu/mapper/GfRatioApplicationRecordAppMapper.java`
|
||||
- **DTO**: `nenu/dto/GfIndividualRatioDto.java` `nenu/dto/GfRatioApplicationRecordDto.java` `nenu/dto/GfStudentListImportDto.java` `nenu/dto/GfRatioApplicationProcessDto.java` `nenu/dto/GfStudentPeisDto.java`
|
||||
|
||||
### `nursing` (8 files)
|
||||
- **Controller**: `nursing/controller/NursingExecutionController.java` `nursing/controller/NursingAssessmentEnhancedController.java` `nursing/controller/NursingEnhancedController.java`
|
||||
- **AppService**: `nursing/appservice/INursingAppService.java`
|
||||
- **ServiceImpl**: `nursing/appservice/impl/NursingAppServiceImpl.java`
|
||||
|
||||
### `orderclosedloop` (3 files)
|
||||
- **Controller**: `orderclosedloop/controller/OrderClosedLoopController.java`
|
||||
- **AppService**: `orderclosedloop/appservice/IOrderClosedLoopAppService.java`
|
||||
- **ServiceImpl**: `orderclosedloop/appservice/impl/OrderClosedLoopAppServiceImpl.java`
|
||||
|
||||
### `outpatientmanage` (22 files)
|
||||
- **Controller**: `outpatientmanage/controller/OutpatientTreatmentController.java` `outpatientmanage/controller/OutpatientSkinTestAppController.java` `outpatientmanage/controller/OutpatientInfusionController.java`
|
||||
- **AppService**: `outpatientmanage/appservice/IOutpatientTreatmentAppService.java` `outpatientmanage/appservice/IOutpatientInfusionAppService.java` `outpatientmanage/appservice/IOutpatientSkinTestAppService.java`
|
||||
- **ServiceImpl**: `outpatientmanage/appservice/impl/OutpatientTreatmentAppServiceImpl.java` `outpatientmanage/appservice/impl/OutpatientSkinTestAppServiceImpl.java` `outpatientmanage/appservice/impl/OutpatientInfusionAppServiceImpl.java`
|
||||
- **Mapper**: `outpatientmanage/mapper/OutpatientTreatmentAppMapper.java` `outpatientmanage/mapper/OutpatientInfusionAppMapper.java` `outpatientmanage/mapper/OutpatientSkinTestAppMapper.java`
|
||||
- **DTO**: `outpatientmanage/dto/SkinTestMedLotNumberDto.java` `outpatientmanage/dto/OutpatientInfusionRecordDto.java` `outpatientmanage/dto/SkinTestSaveDto.java` `outpatientmanage/dto/OutpatientTreatmentInfoDto.java` `outpatientmanage/dto/OutpatientStationInitDto.java`
|
||||
|
||||
### `patientmanage` (13 files)
|
||||
- **Controller**: `patientmanage/controller/PatientInformationController.java` `patientmanage/controller/OutpatientRecordController.java`
|
||||
- **ServiceImpl**: `patientmanage/appservice/impl/OutpatientRecordServiceImpl.java` `patientmanage/appservice/impl/PatientInformationServiceImpl.java`
|
||||
- **Mapper**: `patientmanage/mapper/PatientManageMapper.java`
|
||||
- **DTO**: `patientmanage/dto/PatientInfoInitDto.java` `patientmanage/dto/PatientIdInfoDto.java` `patientmanage/dto/OutpatientRecordSearchParam.java` `patientmanage/dto/PatientBaseInfoDto.java` `patientmanage/dto/OutpatientRecordDto.java`
|
||||
|
||||
### `paymentmanage` (57 files)
|
||||
- **Controller**: `paymentmanage/controller/EleInvoiceController.java` `paymentmanage/controller/ChargeBillController.java` `paymentmanage/controller/PaymentContractController.java`
|
||||
- **ServiceImpl**: `paymentmanage/appservice/impl/PaymentRecServiceImpl.java` `paymentmanage/appservice/impl/IChargeBillServiceImpl.java` `paymentmanage/appservice/impl/EleInvoiceServiceImpl.java`
|
||||
- **Mapper**: `paymentmanage/mapper/EleInvoiceMapper.java` `paymentmanage/mapper/ThreePartPayMapper.java` `paymentmanage/mapper/ChangePriceMapper.java`
|
||||
- **DTO**: `paymentmanage/dto/NenuBpcPayDto.java` `paymentmanage/dto/EleInvoiceResultDto.java` `paymentmanage/dto/ChargeSummaryDto.java` `paymentmanage/dto/EleInvoicePaymentInfoDto.java` `paymentmanage/dto/Clinic2207OrderResultInfoDto.java`
|
||||
|
||||
### `personalization` (22 files)
|
||||
- **Controller**: `personalization/controller/ActivityDeviceController.java` `personalization/controller/OrdersGroupPackageController.java` `personalization/controller/OrderGroupController.java`
|
||||
- **AppService**: `personalization/appservice/IOrderGroupAppService.java` `personalization/appservice/IOrdersGroupPackageAppService.java` `personalization/appservice/IActivityDeviceAppService.java`
|
||||
- **ServiceImpl**: `personalization/appservice/impl/OrdersGroupPackageAppServiceImpl.java` `personalization/appservice/impl/ActivityDeviceAppServiceImpl.java` `personalization/appservice/impl/IOrderGroupAppServiceImpl.java`
|
||||
- **Mapper**: `personalization/mapper/OrdersGroupPackageAppMapper.java` `personalization/mapper/OrderGroupAppMapper.java` `personalization/mapper/ActivityDeviceAppMapper.java`
|
||||
- **DTO**: `personalization/dto/OrdersGroupPackageDetailSaveDto.java` `personalization/dto/OrderGroupDto.java` `personalization/dto/OrdersGroupPackageDto.java` `personalization/dto/OrderGroupInitDto.java` `personalization/dto/OrdersGroupPackageDetailQueryDto.java`
|
||||
|
||||
### `pharmacyDispensarymanage` (42 files)
|
||||
- **Controller**: `pharmacyDispensarymanage/controller/PharmacyDispensaryTransferOutOrderController.java` `pharmacyDispensarymanage/controller/PharmacyDispensaryDispensingOrderController.java` `pharmacyDispensarymanage/controller/PharmacyDispensaryStocktakingOrderController.java`
|
||||
- **ServiceImpl**: `pharmacyDispensarymanage/appservice/impl/PharmacyDispensaryStocktakingOrderServiceImpl.java` `pharmacyDispensarymanage/appservice/impl/PharmacyDispensaryTransferInOrderServiceImpl.java` `pharmacyDispensarymanage/appservice/impl/PharmacyDispensaryStockInOrderServiceImpl.java`
|
||||
- **Mapper**: `pharmacyDispensarymanage/mapper/PharmacyDispensaryReturnToWarehouseOrderMapper.java` `pharmacyDispensarymanage/mapper/PharmacyDispensaryTransferOutOrderMapper.java` `pharmacyDispensarymanage/mapper/PharmacyDispensaryRequisitionOrderMapper.java`
|
||||
- **DTO**: `pharmacyDispensarymanage/dto/PharmacyDispensaryDto.java` `pharmacyDispensarymanage/dto/PharmacyDispensaryDetailDto.java` `pharmacyDispensarymanage/dto/PharmacyDispensarySearchParam.java` `pharmacyDispensarymanage/dto/PharmacyDispensaryMedicationInfoDto.java` `pharmacyDispensarymanage/dto/PharmacyDispensaryInitDto.java`
|
||||
|
||||
### `pharmacyWarehousemanage` (42 files)
|
||||
- **Controller**: `pharmacyWarehousemanage/controller/PharmacyWarehouseProfitLossOrderController.java` `pharmacyWarehousemanage/controller/PharmacyWarehouseReturnToWarehouseOrderController.java` `pharmacyWarehousemanage/controller/PharmacyWarehouseStockOutOrderController.java`
|
||||
- **ServiceImpl**: `pharmacyWarehousemanage/appservice/impl/PharmacyWarehousePurchaseOrderServiceImpl.java` `pharmacyWarehousemanage/appservice/impl/PharmacyWarehouseDocumentManagementServiceImpl.java` `pharmacyWarehousemanage/appservice/impl/PharmacyWarehouseProfitLossOrderServiceImpl.java`
|
||||
- **Mapper**: `pharmacyWarehousemanage/mapper/PharmacyWarehousePurchaseOrderMapper.java` `pharmacyWarehousemanage/mapper/PharmacyWarehouseDocumentManagementMapper.java` `pharmacyWarehousemanage/mapper/PharmacyWarehouseStockInOrderMapper.java`
|
||||
- **DTO**: `pharmacyWarehousemanage/dto/PharmacyWarehouseDto.java` `pharmacyWarehousemanage/dto/PharmacyWarehouseDetailDto.java` `pharmacyWarehousemanage/dto/PharmacyWarehouseMedicationInfoDto.java` `pharmacyWarehousemanage/dto/PharmacyWarehouseInitDto.java` `pharmacyWarehousemanage/dto/PharmacyWarehouseSearchParam.java`
|
||||
|
||||
### `pharmacymanage` (53 files)
|
||||
- **Controller**: `pharmacymanage/controller/InHospitalReturnMedicineController.java` `pharmacymanage/controller/PharmacyStockAlertController.java` `pharmacymanage/controller/MedicationDetailsController.java`
|
||||
- **AppService**: `pharmacymanage/appservice/ISummaryDispenseMedicineAppService.java` `pharmacymanage/appservice/IPendingMedicationDetailsAppService.java` `pharmacymanage/appservice/IInHospitalReturnMedicineAppService.java`
|
||||
- **ServiceImpl**: `pharmacymanage/appservice/impl/ReturnMedicineAppServiceImpl.java` `pharmacymanage/appservice/impl/MedicationDetailsAppServiceImpl.java` `pharmacymanage/appservice/impl/WesternMedicineDispenseAppServiceImpl.java`
|
||||
- **Mapper**: `pharmacymanage/mapper/PendingMedicationDetailsMapper.java` `pharmacymanage/mapper/MedicalDeviceDispenseMapper.java` `pharmacymanage/mapper/SummaryDispenseMedicineMapper.java`
|
||||
- **DTO**: `pharmacymanage/dto/MedDetailsInitDto.java` `pharmacymanage/dto/EncounterInfoSearchParam.java` `pharmacymanage/dto/ItemDispenseOrderDto.java` `pharmacymanage/dto/MedicineSummaryDto.java` `pharmacymanage/dto/MedicineSummarySearchParam.java`
|
||||
|
||||
### `quality` (5 files)
|
||||
- **Controller**: `quality/controller/BusinessAnalyticsController.java` `quality/controller/QualityEnhancedController.java` `quality/controller/EmrQualityController.java`
|
||||
- **AppService**: `quality/appservice/IEmrQualityAppService.java`
|
||||
- **ServiceImpl**: `quality/appservice/impl/EmrQualityAppServiceImpl.java`
|
||||
|
||||
### `rationaldrug` (3 files)
|
||||
- **Controller**: `rationaldrug/controller/RationalDrugController.java`
|
||||
- **AppService**: `rationaldrug/appservice/IRationalDrugAppService.java`
|
||||
- **ServiceImpl**: `rationaldrug/appservice/impl/RationalDrugAppServiceImpl.java`
|
||||
|
||||
### `regdoctorstation` (38 files)
|
||||
- **Controller**: `regdoctorstation/controller/NurseManageController.java` `regdoctorstation/controller/AdviceManageController.java` `regdoctorstation/controller/SpecialAdviceController.java`
|
||||
- **AppService**: `regdoctorstation/appservice/IAdviceManageAppService.java` `regdoctorstation/appservice/IRequestFormManageAppService.java` `regdoctorstation/appservice/ISpecialAdviceAppService.java`
|
||||
- **ServiceImpl**: `regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.java` `regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java` `regdoctorstation/appservice/impl/NurseManageServiceImpl.java`
|
||||
- **Mapper**: `regdoctorstation/mapper/RequestFormManageAppMapper.java` `regdoctorstation/mapper/AdviceManageAppMapper.java` `regdoctorstation/mapper/SpecialAdviceAppMapper.java`
|
||||
- **DTO**: `regdoctorstation/dto/RegPatientMainInfoDto.java` `regdoctorstation/dto/NursingOrdersDetailDto.java` `regdoctorstation/dto/LeaveHospitalParam.java` `regdoctorstation/dto/NursingOrdersSaveDto.java` `regdoctorstation/dto/NursingOrdersEncounterDto.java`
|
||||
|
||||
### `reportManagement` (11 files)
|
||||
- **Controller**: `reportManagement/controller/reportManagementController.java`
|
||||
- **AppService**: `reportManagement/appservice/IInfectiousCardAppService.java`
|
||||
- **ServiceImpl**: `reportManagement/appservice/impl/InfectiousCardAppServiceImpl.java`
|
||||
- **Mapper**: `reportManagement/mapper/ReportManageCardMapper.java`
|
||||
- **DTO**: `reportManagement/dto/InfectiousCardDto.java` `reportManagement/dto/InfectiousCardParam.java`
|
||||
|
||||
### `reportmanage` (164 files)
|
||||
- **Controller**: `reportmanage/controller/AmbAdviceStatisticsAppController.java` `reportmanage/controller/MonthlySettlementController.java` `reportmanage/controller/PurchaseReturnReportController.java`
|
||||
- **AppService**: `reportmanage/appservice/PurchaseReturnReportAppService.java` `reportmanage/appservice/IDrugDosageSettlementAppService.java` `reportmanage/appservice/IDepartmentRevenueStatisticsAppService.java`
|
||||
- **ServiceImpl**: `reportmanage/appservice/impl/InboundReportAppServiceImpl.java` `reportmanage/appservice/impl/MedicationInboundReportAppServiceImpl.java` `reportmanage/appservice/impl/ReportStatisticsAppServiceImpl.java`
|
||||
- **Mapper**: `reportmanage/mapper/PrintReportMapper.java` `reportmanage/mapper/ReportStatisticsMapper.java` `reportmanage/mapper/LossReportMapper.java`
|
||||
- **DTO**: `reportmanage/dto/ReportDiseaseDetailsDto.java` `reportmanage/dto/InboundReportSearchParam.java` `reportmanage/dto/InpatientMedicalRecordHomePageCollectionDto.java` `reportmanage/dto/ZyCostDetailParam.java` `reportmanage/dto/BottleLabelDto.java`
|
||||
|
||||
### `review` (3 files)
|
||||
- **Controller**: `review/controller/ReviewController.java`
|
||||
- **AppService**: `review/appservice/IReviewAppService.java`
|
||||
- **ServiceImpl**: `review/appservice/impl/ReviewAppServiceImpl.java`
|
||||
|
||||
### `service` (2 files)
|
||||
- **ServiceImpl**: `service/impl/HomeStatisticsServiceImpl.java`
|
||||
|
||||
### `system` (5 files)
|
||||
- **Controller**: `system/controller/ApiAuthController.java` `system/controller/DashboardController.java` `system/controller/SysAuditLogController.java`
|
||||
|
||||
### `tcm` (3 files)
|
||||
- **Controller**: `tcm/controller/TcmController.java`
|
||||
- **AppService**: `tcm/appservice/ITcmAppService.java`
|
||||
- **ServiceImpl**: `tcm/appservice/impl/TcmAppServiceImpl.java`
|
||||
|
||||
### `tencentJH` (13 files)
|
||||
- **Controller**: `tencentJH/controller/TencentController.java`
|
||||
- **AppService**: `tencentJH/appservice/ITencentAppService.java`
|
||||
- **ServiceImpl**: `tencentJH/appservice/impl/TencentAppServiceImpl.java`
|
||||
- **Mapper**: `tencentJH/mapper/TencentAppMapper.java`
|
||||
- **DTO**: `tencentJH/dto/PatientInfoTencentDto.java` `tencentJH/dto/CurrentDayEncounterTencentDto.java`
|
||||
|
||||
### `triageandqueuemanage` (13 files)
|
||||
- **Controller**: `triageandqueuemanage/controller/CallNumberVoiceConfigController.java` `triageandqueuemanage/controller/TriageQueueController.java`
|
||||
- **AppService**: `triageandqueuemanage/appservice/CallNumberVoiceConfigAppService.java` `triageandqueuemanage/appservice/TriageQueueAppService.java`
|
||||
- **ServiceImpl**: `triageandqueuemanage/appservice/impl/CallNumberVoiceConfigAppServiceImpl.java` `triageandqueuemanage/appservice/impl/TriageQueueAppServiceImpl.java`
|
||||
- **Mapper**: `triageandqueuemanage/mapper/CallNumberVoiceConfigAppMapper.java`
|
||||
|
||||
### `ybmanage` (55 files)
|
||||
- **Controller**: `ybmanage/controller/YbInpatientController.java` `ybmanage/controller/YbElepController.java` `ybmanage/controller/YbController.java`
|
||||
- **ServiceImpl**: `ybmanage/service/impl/YbEleHttpServiceImpl.java` `ybmanage/service/impl/YbServiceImpl.java` `ybmanage/service/impl/YbElepBaseServiceImpl.java`
|
||||
- **Mapper**: `ybmanage/mapper/YbElepMapper.java` `ybmanage/mapper/YbMapper.java`
|
||||
- **DTO**: `ybmanage/dto/FinancialHand3203AWebParam.java` `ybmanage/dto/FinancialHand3201WebParam.java` `ybmanage/dto/Financial13203WebParam.java` `ybmanage/dto/VeriPrescriptionInfoDto.java` `ybmanage/dto/YbInHospitalRegisterQueryDto.java`
|
||||
|
||||
## 前端关键文件
|
||||
|
||||
| 目录 | 说明 |
|
||||
|---|---|
|
||||
| `src/utils/request.js` | Axios 请求/响应拦截器 |
|
||||
| `src/api/` | API 接口定义 |
|
||||
| `src/components/` | 公共组件 |
|
||||
| `src/views/doctorstation/` | 门诊医生站 |
|
||||
| `src/views/inpatientDoctor/` | 住院医生站 |
|
||||
| `src/views/inpatientNurse/` | 住院护士站 |
|
||||
| `src/views/charge/` | 收费工作站 |
|
||||
| `src/views/datadictionary/` | 数据字典 |
|
||||
| `src/views/system/` | 系统管理 |
|
||||
|
||||
## 公共/通用文件
|
||||
|
||||
- `com.core.common.core.domain.R` — 统一响应封装
|
||||
- `com.core.common.core.domain.entity.SysDictData` — 字典数据实体
|
||||
- `com.core.common.utils.SecurityUtils` — 安全工具(获取当前用户)
|
||||
- `com.core.common.enums.*` — 枚举定义
|
||||
- `com.healthlink.his.common.constant.CommonConstants` — 公共常量
|
||||
- `com.healthlink.his.common.utils.HisQueryUtils` — 查询工具
|
||||
- `com.healthlink.his.common.utils.HisPageUtils` — 分页工具
|
||||
- `com.healthlink.his.web.doctorstation.utils.AdviceUtils` — 医嘱工具类
|
||||
|
||||
|
||||
=== 已生成 421 行索引 ===
|
||||
197
MD/architecture/BUSINESS_LOGIC_ANALYSIS.md
Normal file
197
MD/architecture/BUSINESS_LOGIC_ANALYSIS.md
Normal file
@@ -0,0 +1,197 @@
|
||||
# HealthLink-HIS 整体业务逻辑分析
|
||||
|
||||
> **文档类型**: 业务架构分析
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **依据**: 三级医院评审标准 + 电子病历评级4级 + 互联互通四级甲等
|
||||
|
||||
---
|
||||
|
||||
## 一、HIS核心业务流程全景图
|
||||
|
||||
```
|
||||
患者就医全流程:
|
||||
|
||||
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
|
||||
│ 预约挂号 │───→│ 候诊排队 │───→│ 医生诊疗 │───→│ 检验检查 │
|
||||
└─────────┘ └─────────┘ └─────────┘ └─────────┘
|
||||
│ │ │
|
||||
│ ▼ ▼
|
||||
│ ┌─────────┐ ┌─────────┐
|
||||
│ │ 处方开具 │ │ 报告查看 │
|
||||
│ └─────────┘ └─────────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
┌─────────┐ ┌─────────┐ ┌─────────┐
|
||||
│ 门诊收费 │───→│ 药房发药 │───→│ 治疗执行 │
|
||||
└─────────┘ └─────────┘ └─────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
|
||||
│ 入院登记 │───→│ 医嘱管理 │───→│ 护理执行 │───→│ 出院结算 │
|
||||
└─────────┘ └─────────┘ └─────────┘ └─────────┘
|
||||
│ │ │ │
|
||||
│ ▼ ▼ ▼
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐
|
||||
│ │ 合理用药 │ │ 危急值 │ │ 病案管理 │
|
||||
│ └─────────┘ └─────────┘ └─────────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
┌─────────┐ ┌─────────┐
|
||||
│ 手术管理 │ │ 院感监控 │
|
||||
└─────────┘ └─────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────┐ ┌─────────┐ ┌─────────┐
|
||||
│ 医保结算 │───→│ ESB集成 │───→│ 统计报表 │
|
||||
└─────────┘ └─────────┘ └─────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、各模块在业务流中的定位与作用
|
||||
|
||||
### 2.1 门诊业务链
|
||||
|
||||
| 模块 | 业务位置 | 上游 | 下游 | 核心作用 |
|
||||
|------|---------|------|------|---------|
|
||||
| **预约挂号** | 入口 | 患者 | 候诊排队 | 分配号源、建立就诊记录 |
|
||||
| **候诊排队** | 排队 | 预约挂号 | 医生诊疗 | 实时叫号、优先级排序 |
|
||||
| **医生诊疗** | 核心 | 候诊排队 | 处方/检验检查 | 病历书写、诊断、开方 |
|
||||
| **门诊收费** | 结算 | 医生诊疗 | 药房发药 | 费用计算、医保结算 |
|
||||
| **药房发药** | 执行 | 门诊收费 | 患者取药 | 配药、核对、发药 |
|
||||
|
||||
### 2.2 住院业务链
|
||||
|
||||
| 模块 | 业务位置 | 上游 | 下游 | 核心作用 |
|
||||
|------|---------|------|------|---------|
|
||||
| **入院登记** | 入口 | 门诊转住院 | 医嘱管理 | 建立住院记录、分配床位 |
|
||||
| **医嘱管理** | 核心 | 入院登记 | 护理执行/药房 | 开具/签发/停止医嘱 |
|
||||
| **护理执行** | 执行 | 医嘱管理 | 体征记录 | 执行医嘱、记录护理数据 |
|
||||
| **出院结算** | 出口 | 护理执行 | 病案管理 | 费用结算、医保报销 |
|
||||
|
||||
### 2.3 质量安全链(三甲核心)
|
||||
|
||||
| 模块 | 业务位置 | 上游 | 下游 | 核心作用 |
|
||||
|------|---------|------|------|---------|
|
||||
| **合理用药** | 前置拦截 | 医生诊疗/医嘱管理 | 处方审核 | 药品相互作用/过敏/剂量检查 |
|
||||
| **抗菌药物** | 分级管控 | 合理用药 | 处方点评 | 分级管理、权限控制 |
|
||||
| **危急值管理** | 紧急响应 | 检验检查 | 医生/护士 | 自动识别→通知→确认→处置→闭环 |
|
||||
| **病历质控** | 质量监控 | 电子病历 | 医务部 | 病历完整性、及时性检查 |
|
||||
| **院感管理** | 感染防控 | 护理执行/手术 | 院感科 | 感染监测、上报、干预 |
|
||||
|
||||
### 2.4 手术业务链
|
||||
|
||||
| 模块 | 业务位置 | 上游 | 下游 | 核心作用 |
|
||||
|------|---------|------|------|---------|
|
||||
| **手术管理** | 手术全流程 | 医嘱管理 | 术后跟踪 | 申请→审批→安排→执行→完成 |
|
||||
| **麻醉记录** | 术中记录 | 手术管理 | 病案管理 | 麻醉方案、术中监测、用药记录 |
|
||||
|
||||
### 2.5 数据集成链
|
||||
|
||||
| 模块 | 业务位置 | 上游 | 下游 | 核心作用 |
|
||||
|------|---------|------|------|---------|
|
||||
| **EMPI** | 主索引 | 所有模块 | 所有模块 | 统一患者身份标识 |
|
||||
| **ESB集成** | 消息总线 | 所有模块 | 外部系统 | HL7/FHIR消息路由、系统互联 |
|
||||
| **医保对接** | 外部交互 | 门诊/住院收费 | 医保局 | 门诊/住院医保结算、对账 |
|
||||
|
||||
---
|
||||
|
||||
## 三、新增/优化模块的促进作用分析
|
||||
|
||||
### 3.1 手术管理增强
|
||||
|
||||
| 优化项 | 优化前 | 优化后 | 对上下游的促进 |
|
||||
|--------|--------|--------|---------------|
|
||||
| **手术室冲突校验** | 无校验,可能撞车 | 自动检测同一手术室同一时间冲突 | ↓ 减少手术室调度纠纷,↓ 提升手术室利用率 |
|
||||
| **手术统计分析** | 无统计 | 按时间段统计各级手术数量 | ↑ 为科室绩效考核提供数据支撑 |
|
||||
| **手术分级权限** | 无权限控制 | 按医生级别限制手术申请 | ↑ 符合三甲评审手术分级管理要求 |
|
||||
| **状态机完善** | 简单状态 | 8状态完整生命周期 | ↑ 全流程可追溯,↓ 减少信息断点 |
|
||||
|
||||
### 3.2 医嘱管理增强
|
||||
|
||||
| 优化项 | 优化前 | 优化后 | 对上下游的促进 |
|
||||
|--------|--------|--------|---------------|
|
||||
| **用药审核联动** | 医嘱与合理用药独立 | 签发医嘱时自动触发合理用药审核 | ↑ 处方审核率100%(三甲硬性) |
|
||||
| **停止时限校验** | 无时限控制 | 长期医嘱停止必须在执行前2小时 | ↑ 护士有充足时间调整执行计划 |
|
||||
| **医嘱修改限制** | 已签发可修改 | 已签发只能停止后新开 | ↑ 医嘱不可篡改,符合病历规范 |
|
||||
|
||||
### 3.3 床位管理增强
|
||||
|
||||
| 优化项 | 优化前 | 优化后 | 对上下游的促进 |
|
||||
|--------|--------|--------|---------------|
|
||||
| **分配校验** | 无校验 | 检查状态+科室匹配 | ↓ 避免分配已占用/不匹配的床位 |
|
||||
| **出院自动清洁** | 手动改状态 | 出院后自动标记清洁中 | ↑ 缩短床位周转时间,↑ 使用率 |
|
||||
| **使用率统计** | 无统计 | 实时计算科室/全院使用率 | ↑ 为三甲评审床位使用率指标提供数据 |
|
||||
|
||||
### 3.4 ESB集成平台
|
||||
|
||||
| 优化项 | 优化前 | 优化后 | 对上下游的促进 |
|
||||
|--------|--------|--------|---------------|
|
||||
| **消息路由校验** | 无校验 | 发送前检查目标系统注册状态 | ↓ 减少无效消息投递 |
|
||||
| **消息轨迹追踪** | 无追踪 | 按messageId查询完整轨迹 | ↑ 问题排查效率,↑ 互联互通测评 |
|
||||
| **死信队列处理** | 失败消息丢失 | 失败消息可重置重发 | ↑ 消息可靠性,↑ 数据一致性 |
|
||||
| **服务注册中心** | 无服务发现 | 统一注册/管理外部系统接口 | ↑ 系统集成标准化 |
|
||||
|
||||
---
|
||||
|
||||
## 四、模块间数据流转关系
|
||||
|
||||
```
|
||||
挂号 ──→ 就诊记录(Encounter)
|
||||
│
|
||||
├──→ 医嘱(Advice) ──→ 护理执行 ──→ 体征记录
|
||||
│ │
|
||||
│ ├──→ 合理用药审核 ──→ 处方(Prescription)
|
||||
│ │ │
|
||||
│ │ ├──→ 药房发药 ──→ 库存扣减
|
||||
│ │ └──→ 费用记录 ──→ 收费
|
||||
│ │
|
||||
│ └──→ 手术申请 ──→ 麻醉记录 ──→ 手术记录 ──→ 病案
|
||||
│
|
||||
├──→ 检验申请 ──→ LIS ──→ 检验报告 ──→ 危急值 ──→ 通知
|
||||
│
|
||||
├──→ 检查申请 ──→ PACS ──→ 检查报告
|
||||
│
|
||||
├──→ 入院登记 ──→ 床位分配 ──→ 住院医嘱
|
||||
│
|
||||
└──→ 出院结算 ──→ 医保结算 ──→ ESB上报
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、三甲评审关键指标与模块对应
|
||||
|
||||
| 评审指标 | 要求 | 对应模块 | 当前状态 |
|
||||
|---------|------|---------|---------|
|
||||
| 处方审核率 | ≥100% | 合理用药 + 医嘱管理 | ✅ 已实现 |
|
||||
| 抗菌药物使用率 | ≤60% | 抗菌药物管控 | ✅ 已实现 |
|
||||
| 危急值处理及时率 | ≥95% | 危急值管理 | ✅ 已实现 |
|
||||
| 电子病历评级 | ≥4级 | 电子病历结构化+EMR质控 | ✅ 已实现 |
|
||||
| 互联互通成熟度 | ≥四级 | ESB集成+EMPI | ⚠️ ESB基础框架已建 |
|
||||
| 床位使用率 | ≥85% | 床位管理 | ✅ 已实现统计 |
|
||||
| 术前讨论率 | 100%(三四级) | 手术管理 | ⚠️ 待完善校验 |
|
||||
| 病案首页质量 | 达标 | 病案首页管理 | ✅ 已实现 |
|
||||
|
||||
---
|
||||
|
||||
## 六、后续优化建议
|
||||
|
||||
### 6.1 高优先级(影响三甲评审)
|
||||
|
||||
| 序号 | 模块 | 优化内容 | 业务价值 |
|
||||
|------|------|---------|---------|
|
||||
| 1 | 医嘱管理 | 完善用药审核联动(OR-002) | 处方审核率100% |
|
||||
| 2 | 手术管理 | 完善术前讨论校验(SR-002) | 术前讨论率100% |
|
||||
| 3 | ESB集成 | 完善HL7/FHIR消息转换 | 互联互通测评 |
|
||||
| 4 | 电子病历 | 完善结构化模板引擎 | 电子病历评级4级 |
|
||||
|
||||
### 6.2 中优先级(提升运营效率)
|
||||
|
||||
| 序号 | 模块 | 优化内容 | 业务价值 |
|
||||
|------|------|---------|---------|
|
||||
| 5 | 床位管理 | 智能分配算法(按病情/科室/距离) | 提升床位周转率 |
|
||||
| 6 | 手术管理 | 手术室智能排程 | 提升手术室利用率 |
|
||||
| 7 | 合理用药 | 药品库存联动预警 | 减少缺药事件 |
|
||||
| 8 | 统计报表 | 经营分析仪表盘 | 辅助管理决策 |
|
||||
|
||||
383
MD/architecture/CROSS_MODULE_BUSINESS_ANALYSIS.md
Normal file
383
MD/architecture/CROSS_MODULE_BUSINESS_ANALYSIS.md
Normal file
@@ -0,0 +1,383 @@
|
||||
# HealthLink-HIS 三甲医院交叉业务流程分析与系统不足诊断
|
||||
|
||||
> **文档类型**: 业务分析+系统诊断
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-07
|
||||
> **依据**: 《三级医院评审标准(2022版)》+ 广西实施细则 + 电子病历4级 + 互联互通四级甲等
|
||||
|
||||
---
|
||||
|
||||
## 一、三甲医院核心业务流程全景
|
||||
|
||||
### 1.1 十大核心流程
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 三甲医院业务全景 │
|
||||
├─────────────────────────────────────────────────────────────────────┤
|
||||
│ 门诊流程: 挂号→候诊→就诊→检查检验→处方→收费→取药→随访 │
|
||||
│ 住院流程: 入院→医嘱→护理→检查检验→手术→用药→出院→结算→病案 │
|
||||
│ 急诊流程: 急诊挂号→分诊→抢救→留观→会诊→住院/出院 │
|
||||
│ 手术流程: 术前讨论→手术申请→麻醉评估→手术→术后恢复→病理 │
|
||||
│ 护理流程: 入院评估→护理计划→医嘱执行→体征→护理记录→交接班 │
|
||||
│ 药品流程: 采购→验收→入库→处方→调配→发药→退药→库存→盘点 │
|
||||
│ 检验流程: 申请→采集→送检→检验→审核→报告→危急值→随访 │
|
||||
│ 检查流程: 申请→预约→排队→检查→报告→审核→3D重建→图文报告 │
|
||||
│ 病案流程: 归档→质控→借阅→封存→统计→DRG→上报 │
|
||||
│ 院感流程: 监测→预警→上报→抗菌药物→消毒供应→统计 │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、交叉业务流程深度分析
|
||||
|
||||
### 2.1 门诊全流程交叉分析
|
||||
|
||||
```
|
||||
患者到达
|
||||
↓
|
||||
[挂号模块] ←→ [排班模块] ←→ [预约模块]
|
||||
↓ (分配诊室+队列)
|
||||
[候诊叫号模块] ←→ [分诊模块]
|
||||
↓ (叫号)
|
||||
[医生工作站] ←→ [电子病历] ←→ [处方模块]
|
||||
↓ (开检查/检验/处方)
|
||||
[检查模块] ←→ [检验模块] ←→ [药房模块]
|
||||
↓ (检查/检验完成)
|
||||
[报告模块] ←→ [医生工作站] (查看结果)
|
||||
↓ (开处方)
|
||||
[合理用药模块] ←→ [处方审核]
|
||||
↓ (处方通过)
|
||||
[收费模块] ←→ [医保模块] ←→ [发票模块]
|
||||
↓ (缴费完成)
|
||||
[药房发药模块] ←→ [药品库存模块]
|
||||
↓ (取药完成)
|
||||
[随访模块] ←→ [患者管理模块]
|
||||
```
|
||||
|
||||
**🔍 已有模块**: 挂号✅ 候诊✅ 医生站✅ 处方✅ 收费✅ 药房✅ 检查✅ 检验✅ 报告✅
|
||||
**🔍 随访模块**: ❌ 缺失 — 门诊患者随访是三甲评审必查项
|
||||
|
||||
### 2.2 住院全流程交叉分析
|
||||
|
||||
```
|
||||
门诊/急诊 → 入院
|
||||
↓
|
||||
[入院登记模块] ←→ [床位管理模块] ←→ [护士站]
|
||||
↓
|
||||
[住院医嘱模块] ←→ [护士执行模块] ←→ [药房模块]
|
||||
↓ (长期/临时医嘱)
|
||||
[检查申请] ←→ [检验申请] ←→ [手术申请]
|
||||
↓
|
||||
[检查报告] ←→ [检验报告] ←→ [手术记录]
|
||||
↓
|
||||
[护理评估] ←→ [护理计划] ←→ [护理记录]
|
||||
↓
|
||||
[病程记录模块] ←→ [知情同意模块]
|
||||
↓
|
||||
[出院医嘱] ←→ [出院结算] ←→ [出院小结]
|
||||
↓
|
||||
[病案归档] ←→ [DRG分组] ←→ [统计上报]
|
||||
```
|
||||
|
||||
**🔍 已有模块**: 入院✅ 床位✅ 医嘱✅ 护理✅ 检查✅ 检验✅ 手术✅ 病程✅ 知情同意✅ 出院✅ 结算✅ 病案✅ DRG✅
|
||||
**🔍 交叉验证**: 各模块间数据流转基本完整
|
||||
|
||||
### 2.3 手术全流程交叉分析
|
||||
|
||||
```
|
||||
[住院医嘱] → 手术申请
|
||||
↓
|
||||
[术前讨论模块] ←→ [手术分级管理]
|
||||
↓
|
||||
[麻醉评估模块] ←→ [麻醉前核查]
|
||||
↓
|
||||
[手术安全核查(WS/T 313)] ←→ [器械追溯(CSSD)]
|
||||
↓
|
||||
[手术执行模块] ←→ [麻醉记录模块]
|
||||
↓
|
||||
[术后恢复模块] ←→ [术后访视]
|
||||
↓
|
||||
[病理送检模块] ←→ [病理报告模块]
|
||||
↓
|
||||
[护理记录] ←→ [病程记录]
|
||||
```
|
||||
|
||||
**🔍 已有模块**: 术前讨论✅ 手术申请✅ 麻醉✅ 安核查✅ CSSD✅ 手术记录✅
|
||||
**🔍 病理模块**: ❌ 缺失 — 病理送检+病理报告是手术闭环的关键环节
|
||||
|
||||
### 2.4 药品全流程交叉分析
|
||||
|
||||
```
|
||||
[采购申请] ←→ [采购订单]
|
||||
↓
|
||||
[验收入库] ←→ [库存管理]
|
||||
↓
|
||||
[处方开具] ←→ [处方审核(合理用药)]
|
||||
↓
|
||||
[药房调配] ←→ [发药/退药]
|
||||
↓
|
||||
[库存预警] ←→ [效期管理]
|
||||
↓
|
||||
[药品追溯(毒麻)] ←→ [抗菌药物管理]
|
||||
↓
|
||||
[处方点评] ←→ [合理用药统计]
|
||||
```
|
||||
|
||||
**🔍 已有模块**: 采购✅ 库存✅ 处方✅ 审核✅ 发药✅ 抗菌✅ 点评✅
|
||||
**🔍 效期管理**: ⚠️ 基础 — 药品效期预警+近效期自动提醒功能待完善
|
||||
|
||||
### 2.5 检验全流程交叉分析
|
||||
|
||||
```
|
||||
[检验申请] ←→ [医嘱模块]
|
||||
↓
|
||||
[条码打印] ←→ [标本采集] ←→ [扫码确认]
|
||||
↓
|
||||
[标本接收] ←→ [标本拒收]
|
||||
↓
|
||||
[LIS检验] ←→ [仪器对接]
|
||||
↓
|
||||
[危急值判定] ←→ [危急值报告] ←→ [危急值处理]
|
||||
↓
|
||||
[审核发布] ←→ [报告查询]
|
||||
↓
|
||||
[参考范围] ←→ [结果解读]
|
||||
```
|
||||
|
||||
**🔍 已有模块**: 申请✅ 条码✅ 采集✅ 危急值✅ 审核✅ 报告✅ 参考范围✅
|
||||
**🔍 闭环完整**: 检验全流程已基本完整
|
||||
|
||||
---
|
||||
|
||||
## 三、系统不足诊断
|
||||
|
||||
### 3.1 缺失模块 (❌ 从未实现)
|
||||
|
||||
| # | 模块名称 | 业务价值 | 三甲依据 | 优先级 |
|
||||
|---|---------|---------|---------|--------|
|
||||
| 1 | **门诊随访管理** | 慢病管理/出院随访/满意度调查 | 评审标准: 患者服务 | 🔴 P0 |
|
||||
| 2 | **病理管理** | 病理送检→取材→制片→诊断→报告 | 手术闭环/肿瘤诊疗 | 🔴 P0 |
|
||||
| 3 | **急诊分诊+抢救** | 急诊分级(1-4级)/抢救记录/绿色通道 | 急诊医学科评审 | 🔴 P0 |
|
||||
| 4 | **患者满意度调查** | 门诊/住院满意度/投诉管理 | 评审标准: 患者服务 | 🟡 P1 |
|
||||
| 5 | **处方点评统计** | 科室排名/医生排名/合理率趋势 | 合理用药评审 | 🟡 P1 |
|
||||
| 6 | **药品效期管理** | 近效期预警/自动停售/效期报表 | 药品管理规范 | 🟡 P1 |
|
||||
| 7 | **护理交接班统计** | 交接班完成率/重点患者统计 | 护理质量指标 | 🟡 P1 |
|
||||
| 8 | **DRG绩效考核** | 科室DRG绩效/费用控制/时间效率 | 医保支付改革 | 🟡 P1 |
|
||||
| 9 | **会诊时限监控** | 会诊超时预警/完成率统计 | 会诊制度 | 🟡 P1 |
|
||||
| 10 | **病案首页质量** | 首页数据校验/编码正确率 | 病案管理规范 | 🟡 P1 |
|
||||
|
||||
### 3.2 待完善模块 (⚠️ 功能不足)
|
||||
|
||||
| # | 模块名称 | 当前状态 | 缺失功能 | 优先级 |
|
||||
|---|---------|---------|---------|--------|
|
||||
| 1 | **预约管理** | 基础预约 | 诊间预约/复诊预约/预约规则配置 | 🟡 P1 |
|
||||
| 2 | **排班管理** | 基础排班 | 弹性排班/节假日排班/停诊管理 | 🟡 P1 |
|
||||
| 3 | **住院押金** | 基础功能 | 押金不足预警/催缴通知/医保预结算 | 🟡 P1 |
|
||||
| 4 | **护理评估** | 已实现5种量表 | 跌倒/压疮动态评估+干预效果追踪 | ⚠️ 可优化 |
|
||||
| 5 | **知情同意** | 已实现 | 电子签名+版本管理+患者确认流程 | ⚠️ 可优化 |
|
||||
| 6 | **DRG分组** | 已实现基础 | 分组结果校验+费用异常预警+绩效分析 | ⚠️ 可优化 |
|
||||
|
||||
### 3.3 交叉业务断裂点
|
||||
|
||||
| # | 断裂点 | 涉及模块 | 影响 | 优先级 |
|
||||
|---|--------|---------|------|--------|
|
||||
| 1 | **门诊→住院转科** | 门诊/住院/床位 | 转科时患者信息丢失 | 🔴 P0 |
|
||||
| 2 | **手术→病理送检** | 手术/病理/检验 | 手术后标本无法自动送检 | 🔴 P0 |
|
||||
| 3 | **检验→临床决策** | 检验/合理用药 | 检验结果未联动用药调整 | 🟡 P1 |
|
||||
| 4 | **检查→报告→医嘱** | 检查/报告/医嘱 | 报告完成后未自动回写医嘱状态 | 🟡 P1 |
|
||||
| 5 | **护理→医嘱→执行** | 护理/医嘱/执行 | 护士执行后未自动更新医嘱完成状态 | ⚠️ 可优化 |
|
||||
| 6 | **药品→库存→预警** | 药品/库存/效期 | 库存不足时未联动处方拦截 | ⚠️ 可优化 |
|
||||
|
||||
---
|
||||
|
||||
## 四、深度详细设计 — 缺失模块
|
||||
|
||||
### 4.1 门诊随访管理模块
|
||||
|
||||
#### 4.1.1 业务流程
|
||||
```
|
||||
出院/门诊结束
|
||||
↓
|
||||
[随访计划生成] ←→ [患者分类(慢病/手术/肿瘤/普通)]
|
||||
↓
|
||||
[随访任务分配] ←→ [责任医生/护士]
|
||||
↓
|
||||
[电话/短信/微信随访] ←→ [随访记录]
|
||||
↓
|
||||
[随访结果录入] ←→ [异常处理(再入院/转诊)]
|
||||
↓
|
||||
[满意度调查] ←→ [投诉管理]
|
||||
↓
|
||||
[随访统计] ←→ [质控指标]
|
||||
```
|
||||
|
||||
#### 4.1.2 数据模型
|
||||
- **FollowupPlan** (随访计划): plan_id, patient_id, disease_type, followup_type, frequency, responsible_doctor
|
||||
- **FollowupTask** (随访任务): task_id, plan_id, scheduled_date, actual_date, contact_method, result
|
||||
- **FollowupRecord** (随访记录): record_id, task_id, contact_content, patient_condition, abnormal_flag
|
||||
- **SatisfactionSurvey** (满意度): survey_id, patient_id, survey_type, score, suggestions
|
||||
- **ComplaintRecord** (投诉): complaint_id, patient_id, complaint_type, content,处理状态
|
||||
|
||||
#### 4.1.3 接口设计
|
||||
| API | 方法 | 说明 |
|
||||
|-----|------|------|
|
||||
| /followup/plan/page | GET | 随访计划列表 |
|
||||
| /followup/plan/add | POST | 新建随访计划 |
|
||||
| /followup/task/page | GET | 随访任务列表(按责任人) |
|
||||
| /followup/task/complete/{id} | PUT | 完成随访任务 |
|
||||
| /followup/record/add | POST | 录入随访记录 |
|
||||
| /followup/survey/add | POST | 提交满意度 |
|
||||
| /followup/complaint/page | GET | 投诉列表 |
|
||||
| /followup/stats | GET | 随访统计(完成率/满意度) |
|
||||
|
||||
### 4.2 病理管理模块
|
||||
|
||||
#### 4.2.1 业务流程
|
||||
```
|
||||
[手术/活检] → 病理申请
|
||||
↓
|
||||
[标本接收] ←→ [标本核对(条码)]
|
||||
↓
|
||||
[取材] ←→ [组织处理(固定/脱水/包埋)]
|
||||
↓
|
||||
[切片] ←→ [染色(HE/免疫组化)]
|
||||
↓
|
||||
[阅片] ←→ [病理诊断]
|
||||
↓
|
||||
[报告编写] ←→ [报告审核(三级审核)]
|
||||
↓
|
||||
[报告发布] ←→ [临床科室]
|
||||
↓
|
||||
[病理随访] ←→ [肿瘤登记]
|
||||
```
|
||||
|
||||
#### 4.2.2 数据模型
|
||||
- **PathologyOrder** (病理申请): order_id, patient_id, specimen_type, clinical_diagnosis
|
||||
- **PathologySpecimen** (病理标本): specimen_id, order_id, barcode, collection_site, fixative
|
||||
- **PathologyProcess** (病理处理): process_id, specimen_id, process_type, operator, time
|
||||
- **PathologyDiagnosis** (病理诊断): diagnosis_id, specimen_id, diagnosis_type, result
|
||||
- **PathologyReport** (病理报告): report_id, order_id, findings, diagnosis, report_doctor, verify_doctor
|
||||
|
||||
#### 4.2.3 接口设计
|
||||
| API | 方法 | 说明 |
|
||||
|-----|------|------|
|
||||
| /pathology/order/page | GET | 病理申请列表 |
|
||||
| /pathology/order/add | POST | 新建病理申请 |
|
||||
| /pathology/specimen/scan | POST | 标本扫码接收 |
|
||||
| /pathology/process/record | POST | 记录处理过程 |
|
||||
| /pathology/diagnosis/add | POST | 录入诊断 |
|
||||
| /pathology/report/page | GET | 病理报告列表 |
|
||||
| /pathology/report/verify/{id} | PUT | 审核报告(三级) |
|
||||
|
||||
### 4.3 急诊分诊+抢救模块
|
||||
|
||||
#### 4.3.1 业务流程
|
||||
```
|
||||
患者到达急诊
|
||||
↓
|
||||
[预检分诊] ←→ [生命体征采集]
|
||||
↓ (按病情分级)
|
||||
┌─Ⅰ级(濒死)→ 抢救室 → 绿色通道
|
||||
├─Ⅱ级(危重)→ 抢救室 → 优先处理
|
||||
├─Ⅲ级(急症)→ 急诊诊室 → 按序就诊
|
||||
└─Ⅳ级(非急)→ 普通门诊 → 引导转诊
|
||||
↓
|
||||
[抢救记录] ←→ [抢救医嘱]
|
||||
↓
|
||||
[会诊申请] ←→ [住院转科/留观/出院]
|
||||
↓
|
||||
[急诊病历] ←→ [急诊统计]
|
||||
```
|
||||
|
||||
#### 4.3.2 数据模型
|
||||
- **EmergencyTriage** (急诊分诊): triage_id, patient_id, triage_level(1-4), vital_signs, triage_nurse
|
||||
- **EmergencyRescue** (抢救记录): rescue_id, patient_id, rescue_start, rescue_end, result
|
||||
- **EmergencyObservation** (留观记录): observation_id, patient_id, observation_start, bed_no
|
||||
- **Emergency绿色通道**: green_channel_id, patient_id, disease_type, door_to_treatment_time
|
||||
|
||||
#### 4.3.3 接口设计
|
||||
| API | 方法 | 说明 |
|
||||
|-----|------|------|
|
||||
| /emergency/triage/add | POST | 急诊分诊 |
|
||||
| /emergency/triage/queue | GET | 分诊队列(按级别) |
|
||||
| /emergency/rescue/add | POST | 开始抢救 |
|
||||
| /emergency/rescue/complete/{id} | PUT | 抢救完成 |
|
||||
| /emergency/observation/add | POST | 留观登记 |
|
||||
| /emergency/green-channel | POST | 绿色通道启动 |
|
||||
| /emergency/stats | GET | 急诊统计(分级/抢救率/等候时间) |
|
||||
|
||||
### 4.4 药品效期管理模块
|
||||
|
||||
#### 4.4.1 业务流程
|
||||
```
|
||||
[入库验收] → 记录效期
|
||||
↓
|
||||
[效期监控] ←→ [每日扫描]
|
||||
↓ (近效期预警)
|
||||
┌─ 6个月内 → 近效期提醒 → 优先使用
|
||||
├─ 3个月内 → 紧急预警 → 限制开方
|
||||
└─ 过期 → 自动停售 → 退回供应商
|
||||
↓
|
||||
[效期报表] ←→ [过期药品销毁]
|
||||
```
|
||||
|
||||
#### 4.4.2 数据模型
|
||||
- **DrugExpiryAlert** (效期预警): alert_id, drug_code, drug_name, batch_no, expiry_date, alert_level
|
||||
- **DrugExpiryStats** (效期统计): 按月统计近效期/过期/销毁金额
|
||||
|
||||
### 4.5 处方点评统计模块
|
||||
|
||||
#### 4.5.1 业务流程
|
||||
```
|
||||
[处方数据] → 自动筛选
|
||||
↓ (不合理处方)
|
||||
[系统点评] ←→ [人工点评]
|
||||
↓
|
||||
[点评结果] ←→ [医生反馈]
|
||||
↓
|
||||
[科室排名] ←→ [医生排名]
|
||||
↓
|
||||
[合理率趋势] ←→ [改进措施]
|
||||
```
|
||||
|
||||
#### 4.5.2 数据模型
|
||||
- **PrescriptionReviewStats** (点评统计): 按科室/医生/月份统计合理率
|
||||
- **PrescriptionReviewRanking** (排名): 科室排名/医生排名
|
||||
|
||||
---
|
||||
|
||||
## 五、实施优先级排序
|
||||
|
||||
### Phase A: 缺失核心模块 (P0 — 立即开发)
|
||||
1. **门诊随访管理** — 三甲评审必查
|
||||
2. **病理管理** — 手术闭环关键
|
||||
3. **急诊分诊+抢救** — 急诊评审必查
|
||||
|
||||
### Phase B: 待完善功能 (P1 — 尽快开发)
|
||||
4. **药品效期管理** — 药品安全
|
||||
5. **处方点评统计** — 合理用药
|
||||
6. **患者满意度** — 评审指标
|
||||
7. **DRG绩效考核** — 医保改革
|
||||
8. **护理交接班统计** — 护理质量
|
||||
9. **会诊时限监控** — 会诊制度
|
||||
10. **病案首页质量** — 数据质量
|
||||
|
||||
### Phase C: 交叉业务修复 (P1 — 尽快修复)
|
||||
11. **门诊→住院转科** — 信息连续性
|
||||
12. **手术→病理送检** — 标本追溯
|
||||
13. **检验→临床决策** — 检验联动
|
||||
14. **检查→报告→医嘱** — 状态联动
|
||||
|
||||
---
|
||||
|
||||
## 六、文档产出清单
|
||||
|
||||
| 文档 | 内容 | 用途 |
|
||||
|------|------|------|
|
||||
| CROSS_MODULE_BUSINESS_ANALYSIS.md | 本文档 | 业务分析+系统诊断 |
|
||||
| PHASE_A_FOLLOWUP_DESIGN.md | 门诊随访深度设计 | 开发依据 |
|
||||
| PHASE_A_PATHOLOGY_DESIGN.md | 病理管理深度设计 | 开发依据 |
|
||||
| PHASE_A_EMERGENCY_DESIGN.md | 急诊分诊抢救深度设计 | 开发依据 |
|
||||
| PHASE_B_*.md | 各P1模块深度设计 | 开发依据 |
|
||||
939
MD/architecture/GRADE3A_DETAILED_DESIGN.md
Normal file
939
MD/architecture/GRADE3A_DETAILED_DESIGN.md
Normal file
@@ -0,0 +1,939 @@
|
||||
# HealthLink HIS 三甲医院达标详细设计方案
|
||||
|
||||
> **文档类型**: 架构设计
|
||||
> **适用范围**: 三甲达标架构
|
||||
> **版本**: v1.0
|
||||
|
||||
> **目标**: 完全符合三级甲等综合医院信息化评审标准
|
||||
> **依据**: 国家卫健委三甲评审标准(2022)、电子病历评级≥4级、互联互通≥四级甲等
|
||||
> **编制日期**: 2026-06-06
|
||||
> **核心原则**:
|
||||
> 1. 不修改原有函数签名,扩展功能通过新建Service/AppService实现
|
||||
> 2. 新建表和字段通过Flyway框架管理
|
||||
> 3. 每个模块开发完成后必须通过完整测试
|
||||
|
||||
---
|
||||
|
||||
## 一、现状能力与差距分析
|
||||
|
||||
### 1.1 已有能力(✅ 可用,无需大改)
|
||||
|
||||
| 模块 | 状态 | 已有Controller/Service | 说明 |
|
||||
|---|---|---|---|
|
||||
| 门诊挂号 | ✅ 完整 | RegistrationController | 预约/当日/退号/多身份 |
|
||||
| 门诊收费 | ✅ 完整 | ChargeController | 收费/退费/日结 |
|
||||
| 门诊医生站 | ✅ 完整 | DoctorStationAdviceController | 处方/检验检查申请/病历 |
|
||||
| 护士工作站 | ✅ 基础 | NursingRecordController | 医嘱执行/生命体征/护理记录 |
|
||||
| 药品管理 | ✅ 完整 | pharmacymanage/* | 药库/药房/发药/退药 |
|
||||
| 住院管理 | ✅ 完整 | PatientHomeController | 入院/床位/转科/出院/押金 |
|
||||
| 检验检查 | ✅ 完整 | check/*, lab/* | LIS配置/检查类型/项目管理 |
|
||||
| 统计报表 | ✅ 完整 | reportmanage/* | 20+报表接口 |
|
||||
| DRG/DIP | ✅ 基础 | ybmanage/* | 基础框架已有 |
|
||||
| 手术排程 | ✅ 基础 | SurgicalScheduleController | 手术申请/排程/查询 |
|
||||
| 手术管理 | ✅ 基础 | SurgeryController | 手术信息CRUD |
|
||||
|
||||
### 1.2 关键差距(❌ 需开发)
|
||||
|
||||
| 差距模块 | 三甲要求 | 当前状态 | 优先级 | 预估工期 |
|
||||
|---|---|---|---|---|
|
||||
| **合理用药系统** | 处方100%审核 | 仅有基础处方点评框架 | 🔴 P0 | 5天 |
|
||||
| **麻醉记录系统** | 互联互通必测项I-13 | 仅有手术排程,无麻醉记录 | 🔴 P0 | 5天 |
|
||||
| **电子签名/CA** | 三甲硬性要求 | 仅有密码验证框架 | 🔴 P0 | 3天 |
|
||||
| **院感管理** | 评审必查 | 完全缺失 | 🔴 P0 | 5天 |
|
||||
| **病案首页管理** | 病案首页数据质量 | 仅有基础统计 | 🔴 P0 | 5天 |
|
||||
| **护理评估体系** | 多种量表评估 | 仅基础护理记录 | 🟡 P1 | 5天 |
|
||||
| **医嘱闭环管理** | 开立→审核→执行→完成 | 部分实现 | 🟡 P1 | 3天 |
|
||||
| **危急值管理** | 检验危急值闭环 | 完全缺失 | 🟡 P1 | 3天 |
|
||||
| **电子病历结构化** | 结构化+模板+留痕 | 基础模板已有 | 🟡 P1 | 5天 |
|
||||
| **抗菌药物管控** | 分级管理/权限控制 | 完全缺失 | 🟡 P1 | 3天 |
|
||||
| **处方点评系统** | 合理用药管控 | 仅基础框架 | 🟡 P1 | 3天 |
|
||||
| **数据集成平台(ESB)** | 互联互通四级甲等 | 完全缺失 | 🟡 P1 | 5天 |
|
||||
| **患者主索引(EMPI)** | 数据标准化基础 | 完全缺失 | 🟡 P1 | 3天 |
|
||||
|
||||
---
|
||||
|
||||
## 二、分阶段详细设计
|
||||
|
||||
### Phase 1: 核心安全模块(3周)
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 7: 合理用药系统 (5天)
|
||||
|
||||
**业务背景**: 三甲医院要求门诊处方审核率≥100%,住院医嘱审核率≥100%。系统必须在医生开方时实时拦截不合理处方。
|
||||
|
||||
**已有基础**: `PrescriptionReviewRecord`实体、`ReviewPrescriptionRecordsController`审方接口
|
||||
|
||||
**需要新增的功能**:
|
||||
|
||||
##### 7.1 处方前置审核引擎
|
||||
|
||||
**业务流程**:
|
||||
```
|
||||
医生开方 → 系统自动审核 → 合理 → 通过
|
||||
→ 不合理 → 拦截弹窗 → 医生确认/修改
|
||||
→ 需人工审核 → 药师审核 → 通过/驳回
|
||||
```
|
||||
|
||||
**审核规则(按优先级)**:
|
||||
1. **配伍禁忌检查**: 两药/三药相互作用(禁忌/严重/一般三级)
|
||||
2. **过敏检测**: 患者过敏史自动匹配药品成分
|
||||
3. **剂量审查**: 超剂量/低剂量预警(按年龄/体重/肝肾功能)
|
||||
4. **重复用药**: 同类/同成分重复使用检查
|
||||
5. **妊娠/哺乳用药**: 特殊人群用药警示
|
||||
6. **儿童用药**: 按体重/体表面积计算剂量
|
||||
7. **肝肾功能调量**: 根据化验结果自动建议调量
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
// 合理用药审核引擎(新建,不修改原有代码)
|
||||
public interface IRationalDrugReviewService {
|
||||
// 处方前置审核
|
||||
PrescriptionReviewResult reviewPrescription(PrescriptionReviewParam param);
|
||||
// 药品相互作用检查
|
||||
List<DrugInteraction> checkDrugInteraction(List<String> drugCodes);
|
||||
// 过敏检查
|
||||
List<AllergyAlert> checkAllergy(Long patientId, List<String> drugCodes);
|
||||
// 剂量检查
|
||||
List<DoseAlert> checkDose(DoseCheckParam param);
|
||||
// 重复用药检查
|
||||
List<DuplicateAlert> checkDuplicate(List<String> drugCodes);
|
||||
}
|
||||
```
|
||||
|
||||
**新增数据库表(Flyway)**:
|
||||
```sql
|
||||
-- V2026_007__rational_drug_review.sql
|
||||
|
||||
-- 药品相互作用规则表
|
||||
CREATE TABLE sys_drug_interaction_rule (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
drug_code_a VARCHAR(50) NOT NULL, -- 药品A编码
|
||||
drug_code_b VARCHAR(50) NOT NULL, -- 药品B编码
|
||||
drug_name_a VARCHAR(200),
|
||||
drug_name_b VARCHAR(200),
|
||||
interaction_level VARCHAR(20) NOT NULL, -- 禁忌/严重/一般
|
||||
description TEXT, -- 描述
|
||||
suggestion TEXT, -- 处理建议
|
||||
severity INT DEFAULT 1, -- 严重程度 1-5
|
||||
status CHAR(1) DEFAULT '0', -- 0正常 1停用
|
||||
tenant_id INT,
|
||||
create_by VARCHAR(64),
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
update_by VARCHAR(64),
|
||||
update_time TIMESTAMP
|
||||
);
|
||||
|
||||
-- 药品过敏规则表
|
||||
CREATE TABLE sys_drug_allergy_rule (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
drug_code VARCHAR(50) NOT NULL,
|
||||
drug_name VARCHAR(200),
|
||||
allergy_component VARCHAR(200), -- 过敏成分
|
||||
cross_reaction_drugs TEXT, -- 交叉反应药品
|
||||
description TEXT,
|
||||
status CHAR(1) DEFAULT '0',
|
||||
tenant_id INT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 剂量范围规则表
|
||||
CREATE TABLE sys_drug_dose_rule (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
drug_code VARCHAR(50) NOT NULL,
|
||||
drug_name VARCHAR(200),
|
||||
dose_type VARCHAR(20), -- 单次/日总量
|
||||
min_dose DECIMAL(10,2),
|
||||
max_dose DECIMAL(10,2),
|
||||
unit VARCHAR(20),
|
||||
age_min INT, -- 最小年龄
|
||||
age_max INT, -- 最大年龄
|
||||
weight_min DECIMAL(5,2), -- 最小体重
|
||||
weight_max DECIMAL(5,2), -- 最大体重
|
||||
renal_adjust CHAR(1) DEFAULT '0', -- 肾功能调整
|
||||
hepatic_adjust CHAR(1) DEFAULT '0', -- 肝功能调整
|
||||
status CHAR(1) DEFAULT '0',
|
||||
tenant_id INT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 处方审核记录表(扩展已有表)
|
||||
-- 在已有 prescription_review_record 表基础上增加字段
|
||||
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS review_rules JSONB;
|
||||
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS auto_review_result VARCHAR(20);
|
||||
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS review_time TIMESTAMP;
|
||||
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS drug_details JSONB;
|
||||
```
|
||||
|
||||
**测试用例(20个)**:
|
||||
1. 正常处方审核通过
|
||||
2. 配伍禁忌药物拦截(禁忌级别)
|
||||
3. 配伍禁忌药物预警(一般级别)
|
||||
4. 过敏药物拦截
|
||||
5. 超剂量预警
|
||||
6. 低剂量预警
|
||||
7. 重复用药拦截
|
||||
8. 妊娠用药警示
|
||||
9. 儿童用药按体重计算
|
||||
10. 肾功能不全剂量调整
|
||||
11. 肝功能不全剂量调整
|
||||
12. 多药联用审查
|
||||
13. 抗菌药物分级限制
|
||||
14. 处方审核结果查询
|
||||
15. 审核规则配置
|
||||
16. 无权限访问拒绝
|
||||
17. 空处方审核
|
||||
18. 大处方预警
|
||||
19. 审核统计查询
|
||||
20. 处方点评导出
|
||||
|
||||
---
|
||||
|
||||
##### 7.2 抗菌药物分级管理
|
||||
|
||||
**业务背景**: 三甲医院要求抗菌药物使用率≤60%,必须实行分级管理。
|
||||
|
||||
**分级标准**:
|
||||
- **非限制使用级**: 经临床长期应用证明安全、有效,对细菌耐药性影响较小的抗菌药物
|
||||
- **限制使用级**: 与非限制使用级相比较,在疗效、安全性、耐药性、价格等方面存在局限性
|
||||
- **特殊使用级**: 不良反应明显,不宜随意使用或临床需要倍加保护以免细菌过快产生耐药性的抗菌药物
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IAntibioticManageService {
|
||||
// 查询抗菌药物使用统计
|
||||
AntibioticUsageStats getUsageStats(Long departmentId, Date startDate, Date endDate);
|
||||
// 查询医生抗菌药物处方权限
|
||||
AntibioticPermission checkPermission(Long doctorId, String antibioticLevel);
|
||||
// 抗菌药物处方审批(特殊使用级需审批)
|
||||
R<?> approveAntibiotic(AntibioticApprovalParam param);
|
||||
// DDD监测
|
||||
List<DDDMonitorDto> getDDDMonitoring(Date startDate, Date endDate);
|
||||
}
|
||||
```
|
||||
|
||||
**新增数据库表**:
|
||||
```sql
|
||||
-- V2026_007__antibiotic_management.sql
|
||||
|
||||
-- 抗菌药物目录表
|
||||
CREATE TABLE sys_antibiotic_drug (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
drug_code VARCHAR(50) NOT NULL,
|
||||
drug_name VARCHAR(200),
|
||||
generic_name VARCHAR(200),
|
||||
antibiotic_level VARCHAR(20) NOT NULL, -- 非限制/限制/特殊
|
||||
ddd_value DECIMAL(10,2), -- 限定日剂量
|
||||
ddd_unit VARCHAR(20),
|
||||
atc_code VARCHAR(50), -- ATC分类代码
|
||||
status CHAR(1) DEFAULT '0',
|
||||
tenant_id INT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 抗菌药物使用记录表
|
||||
CREATE TABLE sys_antibiotic_usage (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
doctor_id BIGINT NOT NULL,
|
||||
department_id BIGINT,
|
||||
drug_code VARCHAR(50) NOT NULL,
|
||||
drug_name VARCHAR(200),
|
||||
antibiotic_level VARCHAR(20),
|
||||
dosage DECIMAL(10,2),
|
||||
dosage_unit VARCHAR(20),
|
||||
frequency VARCHAR(50),
|
||||
route VARCHAR(50),
|
||||
start_time TIMESTAMP,
|
||||
end_time TIMESTAMP,
|
||||
usage_days INT,
|
||||
ddd_value DECIMAL(10,2),
|
||||
ddd_sum DECIMAL(10,4), -- DDD累计
|
||||
approval_status VARCHAR(20), -- 待审批/已批准/已拒绝
|
||||
approver_id BIGINT,
|
||||
approval_time TIMESTAMP,
|
||||
status CHAR(1) DEFAULT '0',
|
||||
tenant_id INT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 抗菌药物医生权限表
|
||||
CREATE TABLE sys_antibiotic_permission (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
doctor_id BIGINT NOT NULL,
|
||||
doctor_name VARCHAR(100),
|
||||
department_id BIGINT,
|
||||
allowed_levels JSONB, -- 允许使用的级别 ["非限制","限制","特殊"]
|
||||
valid_from DATE,
|
||||
valid_to DATE,
|
||||
status CHAR(1) DEFAULT '0',
|
||||
tenant_id INT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 8: 手术麻醉系统 (5天)
|
||||
|
||||
**业务背景**: 互联互通测评必测项I-13,三甲评审现场检查必查项。
|
||||
|
||||
**已有基础**:
|
||||
- `OpSchedule`(手术排程实体)、`OperatingRoom`(手术室实体)
|
||||
- `SurgicalScheduleController`(手术排程接口)
|
||||
- `SurgeryController`(手术管理接口)
|
||||
|
||||
**需要新增的功能**:
|
||||
|
||||
##### 8.1 麻醉评估系统
|
||||
|
||||
**业务流程**:
|
||||
```
|
||||
术前评估 → ASA分级 → 气道评估 → 麻醉方案 → 知情同意 → 术中记录 → 苏醒评估
|
||||
```
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IAnesthesiaService {
|
||||
// 术前麻醉评估
|
||||
AnesthesiaAssessment createAssessment(AnessmentAssessmentParam param);
|
||||
// ASA分级评估
|
||||
ASAResult assessASA(ASAAssessmentParam param);
|
||||
// 气道评估
|
||||
AirwayAssessment assessAirway(AirwayAssessmentParam param);
|
||||
// 麻醉方案制定
|
||||
AnesthesiaPlan createPlan(AnesthesiaPlanParam param);
|
||||
// 术中记录
|
||||
IntraOpRecord recordIntraOp(IntraOpRecordParam param);
|
||||
// 麻醉苏醒评估
|
||||
RecoveryAssessment assessRecovery(RecoveryAssessmentParam param);
|
||||
// 查询麻醉记录
|
||||
AnesthesiaRecord getRecord(Long surgeryScheduleId);
|
||||
}
|
||||
```
|
||||
|
||||
**新增数据库表**:
|
||||
```sql
|
||||
-- V2026_008__anesthesia_system.sql
|
||||
|
||||
-- 麻醉评估表
|
||||
CREATE TABLE sys_anesthesia_assessment (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
surgery_schedule_id BIGINT NOT NULL, -- 关联手术排程
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
assessment_date TIMESTAMP,
|
||||
assessor_id BIGINT,
|
||||
|
||||
-- ASA分级
|
||||
asa_level VARCHAR(10), -- ASA I-VI
|
||||
asa_description TEXT,
|
||||
|
||||
-- 气道评估
|
||||
airway_assessment JSONB, -- 气道评估详细数据
|
||||
mallampati_grade VARCHAR(10), -- Mallampati分级 I-IV
|
||||
mouth_opening DECIMAL(5,2), -- 张口度(cm)
|
||||
neck_mobility VARCHAR(50), -- 颈部活动度
|
||||
thyromental_distance DECIMAL(5,2), -- 甲颏距离(cm)
|
||||
dental_prostheses CHAR(1), -- 假牙 0无 1有
|
||||
|
||||
-- 心肺评估
|
||||
cardiac_function VARCHAR(50), -- 心功能分级
|
||||
pulmonary_function VARCHAR(50), -- 肺功能
|
||||
ekg_result TEXT, -- 心电图结果
|
||||
|
||||
-- 实验室检查
|
||||
lab_results JSONB, -- 实验室检查结果
|
||||
|
||||
-- 综合评估
|
||||
overall_risk VARCHAR(20), -- 低/中/高/极高
|
||||
contraindications TEXT, -- 禁忌症
|
||||
special_notes TEXT, -- 特殊注意事项
|
||||
|
||||
status VARCHAR(20), -- 草稿/已提交/已审核
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 麻醉方案表
|
||||
CREATE TABLE sys_anesthesia_plan (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
assessment_id BIGINT NOT NULL,
|
||||
surgery_schedule_id BIGINT NOT NULL,
|
||||
anesthesia_type VARCHAR(50), -- 全麻/椎管内/神经阻滞/局部/复合
|
||||
anesthesia_method TEXT, -- 具体麻醉方法
|
||||
monitor_plan TEXT, -- 监测方案
|
||||
airway_management TEXT, -- 气道管理方案
|
||||
fluid_plan TEXT, -- 输液方案
|
||||
blood_plan TEXT, -- 输血方案
|
||||
pain_management TEXT, -- 镇痛方案
|
||||
special_requirements TEXT, -- 特殊要求
|
||||
planned_by_id BIGINT,
|
||||
plan_time TIMESTAMP,
|
||||
status VARCHAR(20), -- 草稿/已提交/已批准
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 术中麻醉记录表
|
||||
CREATE TABLE sys_anesthesia_intra_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
surgery_schedule_id BIGINT NOT NULL,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
|
||||
-- 时间节点
|
||||
patient_entry_time TIMESTAMP, -- 患者入室时间
|
||||
anesthesia_start_time TIMESTAMP, -- 麻醉开始时间
|
||||
surgery_start_time TIMESTAMP, -- 手术开始时间
|
||||
surgery_end_time TIMESTAMP, -- 手术结束时间
|
||||
anesthesia_end_time TIMESTAMP, -- 麻醉结束时间
|
||||
patient_exit_time TIMESTAMP, -- 患者出室时间
|
||||
|
||||
-- 生命体征(定时采集)
|
||||
vital_signs_data JSONB, -- [{time, systolic, diastolic, heart_rate, spo2, temp, etco2, ...}]
|
||||
|
||||
-- 麻醉用药
|
||||
anesthesia_medications JSONB, -- [{drug_name, dose, unit, time, route, operator}]
|
||||
|
||||
-- 非麻醉用药
|
||||
non_anesthesia_medications JSONB, -- [{drug_name, dose, unit, time, reason}]
|
||||
|
||||
-- 液体出入量
|
||||
fluid_input JSONB, -- [{type, volume_ml, time}]
|
||||
fluid_output JSONB, -- [{type, volume_ml, time}]
|
||||
blood_loss_ml INT, -- 出血量
|
||||
blood_transfusion_ml INT, -- 输血量
|
||||
urine_output_ml INT, -- 尿量
|
||||
|
||||
-- 术中事件
|
||||
intra_events JSONB, -- [{event_type, time, description, handling}]
|
||||
|
||||
-- 气道管理
|
||||
airway_management JSONB, -- {intubation_type, tube_size, depth, ...}
|
||||
|
||||
-- 麻醉医师
|
||||
primary_anesthesiologist_id BIGINT, -- 主麻
|
||||
assistant_anesthesiologist_id BIGINT, -- 助麻
|
||||
|
||||
status VARCHAR(20), -- 进行中/已完成
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 麻醉苏醒评估表
|
||||
CREATE TABLE sys_anesthesia_recovery (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
intra_record_id BIGINT NOT NULL,
|
||||
surgery_schedule_id BIGINT NOT NULL,
|
||||
recovery_time TIMESTAMP,
|
||||
consciousness_level VARCHAR(50), -- 清醒/嗜睡/模糊/昏迷
|
||||
respiratory_rate INT,
|
||||
heart_rate INT,
|
||||
blood_pressure VARCHAR(50),
|
||||
spo2 DECIMAL(5,2),
|
||||
temperature DECIMAL(5,2),
|
||||
pain_score INT, -- NRS评分 0-10
|
||||
恶心_nausea CHAR(1), -- 0无 1有
|
||||
vomiting CHAR(1), -- 0无 1有
|
||||
Aldrete_score INT, -- Aldrete评分 0-10
|
||||
discharge_eligible CHAR(1), -- 0不达标 1达标
|
||||
extubation_time TIMESTAMP, -- 拔管时间
|
||||
special_notes TEXT,
|
||||
assessor_id BIGINT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 知情同意书表
|
||||
CREATE TABLE sys_consent_form (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
form_type VARCHAR(50), -- 手术/麻醉/输血/其他
|
||||
surgery_schedule_id BIGINT,
|
||||
form_template_id BIGINT,
|
||||
form_content TEXT, -- 知情同意书内容
|
||||
patient_name VARCHAR(100),
|
||||
patient_signature_data TEXT, -- 患者签名(base64)
|
||||
patient_sign_time TIMESTAMP,
|
||||
doctor_signature_data TEXT, -- 医生签名(base64)
|
||||
doctor_sign_time TIMESTAMP,
|
||||
witness_signature_data TEXT, -- 见证人签名(base64)
|
||||
witness_sign_time TIMESTAMP,
|
||||
status VARCHAR(20), -- 待签署/已签署/已撤回
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
##### 8.2 手术记录系统
|
||||
|
||||
**业务流程**:
|
||||
```
|
||||
手术申请 → 科室审批 → 医务科审批 → 手术排程 → 术前准备 → 手术执行 → 术后医嘱
|
||||
```
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface ISurgeryRecordService {
|
||||
// 创建手术记录
|
||||
SurgeryRecord createRecord(SurgeryRecordParam param);
|
||||
// 记录术中信息
|
||||
void recordIntraOp(IntraOpParam param);
|
||||
// 记录植入物
|
||||
void recordImplant(ImplantRecordParam param);
|
||||
// 记录标本
|
||||
void recordSpecimen(SpecimenRecordParam param);
|
||||
// 术后医嘱自动生成
|
||||
List<Advice> generatePostOpOrders(Long surgeryRecordId);
|
||||
// 手术统计
|
||||
SurgeryStatistics getStatistics(Long departmentId, Date startDate, Date endDate);
|
||||
}
|
||||
```
|
||||
|
||||
**新增数据库表**:
|
||||
```sql
|
||||
-- V2026_008__surgery_record.sql
|
||||
|
||||
-- 手术记录表(扩展已有op_schedule)
|
||||
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS surgery_record_id BIGINT;
|
||||
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS post_op_diagnosis TEXT;
|
||||
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS post_op_orders JSONB;
|
||||
|
||||
-- 手术记录详细表
|
||||
CREATE TABLE sys_surgery_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
surgery_schedule_id BIGINT NOT NULL,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
|
||||
-- 手术团队
|
||||
surgeon_id BIGINT, -- 主刀
|
||||
assistant1_id BIGINT, -- 助手1
|
||||
assistant2_id BIGINT, -- 助手2
|
||||
assistant3_id BIGINT, -- 助手3
|
||||
scrub_nurse_id BIGINT, -- 器械护士
|
||||
circulating_nurse_id BIGINT, -- 巡回护士
|
||||
|
||||
-- 手术时间
|
||||
incision_time TIMESTAMP, -- 切皮时间
|
||||
closure_time TIMESTAMP, -- 缝合时间
|
||||
total_surgery_minutes INT, -- 手术总时长
|
||||
|
||||
-- 手术信息
|
||||
surgical_site VARCHAR(200), -- 手术部位
|
||||
approach VARCHAR(100), -- 手术入路
|
||||
implant_records JSONB, -- [{implant_name, serial_no, manufacturer, quantity}]
|
||||
specimen_records JSONB, -- [{specimen_type, description, send_to_pathology}]
|
||||
|
||||
-- 出血与输血
|
||||
estimated_blood_loss INT, -- 估计出血量(ml)
|
||||
actual_blood_loss INT, -- 实际出血量(ml)
|
||||
blood_transfusion_units INT, -- 输血量(单位)
|
||||
|
||||
-- 并发症
|
||||
intraoperative_complications JSONB, -- [{type, description, time, handling}]
|
||||
postoperative_complications JSONB, -- [{type, description, time, handling}]
|
||||
|
||||
-- 手术级别
|
||||
surgery_level VARCHAR(20), -- 一/二/三/四级
|
||||
surgery_classification VARCHAR(50), -- 急诊/限期/择期
|
||||
|
||||
-- 感染控制
|
||||
infection_risk CHAR(1), -- 0低 1中 2高
|
||||
isolation_type VARCHAR(50), -- 隔离类型
|
||||
antibiotic_prophylaxis CHAR(1), -- 0无 1有预防性抗菌药物
|
||||
|
||||
status VARCHAR(20), -- 进行中/已完成
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 植入物记录表
|
||||
CREATE TABLE sys_implant_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
surgery_record_id BIGINT NOT NULL,
|
||||
implant_name VARCHAR(200),
|
||||
implant_model VARCHAR(100),
|
||||
serial_no VARCHAR(100), -- 序列号/批号
|
||||
manufacturer VARCHAR(200),
|
||||
specification VARCHAR(200),
|
||||
quantity INT DEFAULT 1,
|
||||
implant_site VARCHAR(200), -- 植入部位
|
||||
Implant_time TIMESTAMP,
|
||||
status CHAR(1) DEFAULT '0',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 9: 院感管理系统 (5天)
|
||||
|
||||
**业务背景**: 三甲评审要求医院感染监测报告率达标,院感管理是评审必查项。
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IInfectionControlService {
|
||||
// 院感病例监测
|
||||
List<InfectionCase> monitorInfection(Date startDate, Date endDate);
|
||||
// 院感病例上报
|
||||
void reportCase(InfectionCaseReportParam param);
|
||||
// 院感预警
|
||||
List<InfectionAlert> getAlerts(Long departmentId);
|
||||
// 院感统计
|
||||
InfectionStatistics getStatistics(Date startDate, Date endDate);
|
||||
// 多重耐药菌监测
|
||||
List<MDRORecord> monitorMDRO(Date startDate, Date endDate);
|
||||
|
||||
// 手卫生管理
|
||||
void recordHandHygiene(HandHygieneRecordParam param);
|
||||
HandHygieneStats getHandHygieneStats(Long departmentId, Date startDate, Date endDate);
|
||||
|
||||
// 职业暴露管理
|
||||
void reportExposure(OccupationalExposureParam param);
|
||||
void trackExposure(Long exposureId, ExposureFollowUpParam param);
|
||||
List<OccupationalExposure> getExposureRecords(Date startDate, Date endDate);
|
||||
|
||||
// 环境监测
|
||||
void recordEnvironmentMonitor(EnvironmentMonitorParam param);
|
||||
List<EnvironmentMonitor> getEnvironmentMonitorRecords(Long departmentId, Date startDate, Date endDate);
|
||||
}
|
||||
```
|
||||
|
||||
**新增数据库表**:
|
||||
```sql
|
||||
-- V2026_009__infection_control.sql
|
||||
|
||||
-- 院感病例表
|
||||
CREATE TABLE sys_infection_case (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
infection_type VARCHAR(50), -- 医院感染/社区感染
|
||||
infection_site VARCHAR(100), -- 下呼吸道/泌尿道/血液/手术部位/其他
|
||||
pathogen_code VARCHAR(50),
|
||||
pathogen_name VARCHAR(200),
|
||||
drug_resistance JSONB, -- [{drug_name, resistance_type}]
|
||||
diagnosis_basis TEXT, -- 诊断依据
|
||||
report_time TIMESTAMP,
|
||||
reporter_id BIGINT,
|
||||
department_id BIGINT,
|
||||
status VARCHAR(20), -- 疑似/确认/已排除/已处理
|
||||
treatment_plan TEXT,
|
||||
outcome TEXT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 手卫生记录表
|
||||
CREATE TABLE sys_hand_hygiene (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
staff_id BIGINT NOT NULL,
|
||||
staff_name VARCHAR(100),
|
||||
department_id BIGINT,
|
||||
observation_time TIMESTAMP,
|
||||
observation_type VARCHAR(50), -- 两前三后/手卫生五个时刻
|
||||
correct_flag CHAR(1), -- 0不正确 1正确
|
||||
handrub_type VARCHAR(50), -- 洗手液/速干手消毒剂
|
||||
observer_id BIGINT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 职业暴露记录表
|
||||
CREATE TABLE sys_occupational_exposure (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
staff_id BIGINT NOT NULL,
|
||||
staff_name VARCHAR(100),
|
||||
department_id BIGINT,
|
||||
exposure_type VARCHAR(50), -- 锐器伤/血液体液暴露/化学暴露/其他
|
||||
exposure_source VARCHAR(200), -- 暴露源描述
|
||||
source_patient_name VARCHAR(100),
|
||||
source_patient_hiv VARCHAR(20),
|
||||
source_patient_hbv VARCHAR(20),
|
||||
source_patient_hcv VARCHAR(20),
|
||||
exposure_time TIMESTAMP,
|
||||
exposure_site VARCHAR(100), -- 暴露部位
|
||||
exposure_amount VARCHAR(100), -- 暴露量
|
||||
immediate_handling TEXT, -- 立即处理措施
|
||||
risk_assessment VARCHAR(20), -- 低/中/高
|
||||
follow_up_plan TEXT, -- 随访计划
|
||||
follow_up_records JSONB, -- [{time, result, note}]
|
||||
report_time TIMESTAMP,
|
||||
reporter_id BIGINT,
|
||||
status VARCHAR(20), -- 登记中/处置中/随访中/已结案
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 环境监测表
|
||||
CREATE TABLE sys_environment_monitor (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
department_id BIGINT,
|
||||
monitor_type VARCHAR(50), -- 空气/物表/手/消毒剂
|
||||
monitor_item VARCHAR(100), -- 监测项目
|
||||
monitor_result VARCHAR(200), -- 监测结果
|
||||
standard_value VARCHAR(200), -- 标准值
|
||||
is_qualified CHAR(1), -- 0不合格 1合格
|
||||
monitor_time TIMESTAMP,
|
||||
monitor_by_id BIGINT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: 病案与护理体系(3周)
|
||||
|
||||
#### Sprint 10: 病案管理系统 (5天)
|
||||
|
||||
**业务背景**: 三甲要求病案首页24小时归档率≥90%,主要诊断编码正确率≥95%。
|
||||
|
||||
**已有基础**: `InpatientMedicalRecordHomePageCollectionController`(病案首页统计)
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IMedicalRecordManagementService {
|
||||
// 病案首页数据自动采集
|
||||
MedicalRecordHome autoCollectHome(Long encounterId);
|
||||
// ICD-10编码推荐
|
||||
List<ICD10Code> recommendDiagnosisCode(String diagnosisName);
|
||||
// ICD-9-CM-3手术编码映射
|
||||
List<ICD9CM3Code> mapSurgeryCode(String surgeryName);
|
||||
// 首页数据质量校验
|
||||
HomeQualityResult validateHomeQuality(Long homeId);
|
||||
// 病案质控
|
||||
MedicalRecordAudit auditRecord(MedicalRecordAuditParam param);
|
||||
// DRG自动分组
|
||||
DRGGroupingResult autoDRGGrouping(Long encounterId);
|
||||
// 病案归档
|
||||
void archiveMedicalRecord(Long encounterId);
|
||||
// 病案借阅
|
||||
MedicalRecordBorrow borrowRecord(MedicalRecordBorrowParam param);
|
||||
// 病案封存/解封
|
||||
void sealRecord(Long recordId, boolean seal);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 11: 护理评估体系 (5天)
|
||||
|
||||
**业务背景**: 三甲要求护理评估完成率≥95%,入院评估8小时内完成。
|
||||
|
||||
**已有基础**: `VitalSignsController`(生命体征)、`NursingRecordController`(护理记录)
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface INursingAssessmentService {
|
||||
// 入院护理评估
|
||||
NursingAssessment createAdmissionAssessment(AdmissionAssessmentParam param);
|
||||
// Braden压疮风险评估(自动评分)
|
||||
BradenScore assessBraden(BradenAssessmentParam param);
|
||||
// Morse跌倒风险评估(自动评分)
|
||||
MorseScore assessMorse(MorseAssessmentParam param);
|
||||
// NRS2002营养风险评估
|
||||
NRS2002Score assessNRS2002(NRS2002AssessmentParam param);
|
||||
// 疼痛评估(NRS/VAS)
|
||||
PainScore assessPain(PainAssessmentParam param);
|
||||
// Caprini VTE风险评估
|
||||
CapriniScore assessCaprini(CapriniAssessmentParam param);
|
||||
// Barthel自理能力评估
|
||||
BarthelScore assessBarthel(BarthelAssessmentParam param);
|
||||
// 评估时间轴(动态变化追踪)
|
||||
List<AssessmentTimeline> getTimeline(Long patientId, String assessmentType);
|
||||
|
||||
// 护理计划
|
||||
NursingPlan createPlan(NursingPlanParam param);
|
||||
// 护理交接班
|
||||
NursingHandover createHandover(NursingHandoverParam param);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: 数据集成与标准化(3周)
|
||||
|
||||
#### Sprint 12: 患者主索引+主数据 (3天)
|
||||
|
||||
**业务背景**: 互联互通四级甲等基础,统一患者身份标识。
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IEMPIService {
|
||||
// 患者身份匹配
|
||||
String matchPatient(PatientMatchParam param);
|
||||
// 患者身份合并
|
||||
void mergePatient(Long primaryId, Long secondaryId);
|
||||
// 患者身份拆分
|
||||
void splitPatient(Long mergedId);
|
||||
// 主数据同步
|
||||
void syncMasterData(MasterDataSyncParam param);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 13: 数据集成平台ESB (5天)
|
||||
|
||||
**业务背景**: 互联互通四级甲等核心,所有系统通过集成平台互联。
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IESBService {
|
||||
// 发送消息
|
||||
void sendMessage(ESBMessage message);
|
||||
// 接收消息
|
||||
ESBMessage receiveMessage(String messageId);
|
||||
// 服务注册
|
||||
void registerService(ESBServiceRegistry service);
|
||||
// 服务发现
|
||||
ESBServiceRegistry discoverService(String serviceName);
|
||||
// 消息监控
|
||||
ESBMonitor getMonitor(Date startDate, Date endDate);
|
||||
// CDA文档生成
|
||||
CDADocument generateCDA(String documentType, Long encounterId);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 4: 智能化与决策支持(3周)
|
||||
|
||||
#### Sprint 14: 危急值管理系统 (3天)
|
||||
|
||||
**业务背景**: 医疗质量安全核心制度,检验危急值必须闭环管理。
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface ICriticalValueService {
|
||||
// 危急值规则配置
|
||||
void configureRules(List<CriticalValueRule> rules);
|
||||
// 检验结果自动匹配危急值
|
||||
List<CriticalValueAlert> matchCriticalValue(Long inspectionResultId);
|
||||
// 危急值通知
|
||||
void notifyCriticalValue(Long alertId, List<Long> notifyUserIds);
|
||||
// 危急值确认
|
||||
void confirmCriticalValue(Long alertId, CriticalValueConfirmParam param);
|
||||
// 危急值处置
|
||||
void handleCriticalValue(Long alertId, CriticalValueHandleParam param);
|
||||
// 危急值统计
|
||||
CriticalValueStats getStats(Date startDate, Date endDate);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 15: 电子病历结构化 (5天)
|
||||
|
||||
**业务背景**: 电子病历应用管理规范要求修改留痕、版本管理、电子签名。
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IStructuredEMRService {
|
||||
// 结构化病历创建
|
||||
StructuredEMR createEMR(EMRCreateParam param);
|
||||
// 病历修改(留痕)
|
||||
void modifyEMR(Long emrId, EMRModifyParam param);
|
||||
// 版本历史
|
||||
List<EMRVersion> getVersionHistory(Long emrId);
|
||||
// 版本对比
|
||||
EMRDiff compareVersions(Long versionId1, Long versionId2);
|
||||
// 病历模板管理
|
||||
EMRTemplate saveTemplate(EMRTemplateParam param);
|
||||
// 病历完整性检查
|
||||
EMRCompletenessResult checkCompleteness(Long emrId);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Sprint 16: 医保智能审核 (5天)
|
||||
|
||||
**业务背景**: 医保基金使用监督管理条例,防范骗保、规范使用。
|
||||
|
||||
**已有基础**: `ybmanage/*`(医保管理模块)
|
||||
|
||||
**新增Service**:
|
||||
```java
|
||||
public interface IInsuranceAuditService {
|
||||
// 事前审核(开方时)
|
||||
PreAuditResult preAudit(PreAuditParam param);
|
||||
// 事中审核(住院中)
|
||||
List<InAuditAlert> inAudit(Long encounterId);
|
||||
// 事后审核(结算后)
|
||||
PostAuditResult postAudit(Long settlementId);
|
||||
// DRG/DIP优化建议
|
||||
DRGOptimizationSuggestion optimizeDRG(Long encounterId);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、测试计划
|
||||
|
||||
### 每个Sprint测试矩阵
|
||||
|
||||
| 测试类型 | 内容 | 通过标准 |
|
||||
|---|---|---|
|
||||
| **接口测试** | 所有新增API端点 | 正常/异常/边界各至少1个用例 |
|
||||
| **白盒测试** | Service层方法 | 覆盖率≥80% |
|
||||
| **黑盒测试** | 业务流程完整性 | 关键流程100%覆盖 |
|
||||
| **冒烟测试** | 核心功能可用性 | 所有核心接口返回200 |
|
||||
| **回归测试** | 原有功能不受影响 | 158个已有测试全部通过 |
|
||||
|
||||
### 测试用例设计原则
|
||||
|
||||
1. **正常流程测试**: 每个API至少1个正常用例
|
||||
2. **边界条件测试**: 空值/极值/特殊字符/超长文本
|
||||
3. **异常处理测试**: 无权限/参数错误/数据不存在/并发冲突
|
||||
4. **数据一致性测试**: 事务完整性、级联操作
|
||||
5. **性能测试**: 并发场景(可选,P2优先级)
|
||||
|
||||
---
|
||||
|
||||
## 四、实施路线图
|
||||
|
||||
```
|
||||
Phase 1 (Week 1-3): 核心安全模块
|
||||
├── Sprint 7: 合理用药系统 (5天) → 20个测试用例
|
||||
├── Sprint 8: 手术麻醉系统 (5天) → 25个测试用例
|
||||
└── Sprint 9: 院感管理系统 (5天) → 20个测试用例
|
||||
|
||||
Phase 2 (Week 4-6): 病案与护理
|
||||
├── Sprint 10: 病案管理系统 (5天) → 20个测试用例
|
||||
└── Sprint 11: 护理评估体系 (5天) → 25个测试用例
|
||||
|
||||
Phase 3 (Week 7-9): 数据集成
|
||||
├── Sprint 12: EMPI + 主数据 (3天) → 15个测试用例
|
||||
└── Sprint 13: ESB集成平台 (5天) → 20个测试用例
|
||||
|
||||
Phase 4 (Week 10-12): 智能化
|
||||
├── Sprint 14: 危急值管理 (3天) → 15个测试用例
|
||||
├── Sprint 15: 电子病历结构化 (5天) → 20个测试用例
|
||||
└── Sprint 16: 医保智能审核 (5天) → 20个测试用例
|
||||
|
||||
总计: 12周 (约3个月)
|
||||
总用例数: 预计 220+ 个接口测试
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、质量保障
|
||||
|
||||
### 5.1 开发规范铁律
|
||||
|
||||
1. **不修改原有函数签名** — 扩展功能通过新建Service/AppService实现
|
||||
2. **数据库变更通过Flyway** — 所有新建表和字段使用Flyway版本化管理
|
||||
3. **代码审查** — 每个PR必须经过Code Review
|
||||
4. **单元测试** — Service层覆盖率≥80%
|
||||
5. **接口测试** — 每个API端点必须有测试用例
|
||||
|
||||
### 5.2 铁律
|
||||
|
||||
1. 修改完必须测试才能提交
|
||||
2. 新建表和字段必须通过Flyway
|
||||
3. 测试通过后才提交代码
|
||||
4. 前后端API路径必须对齐
|
||||
5. 每个Sprint完成后进行完整回归测试
|
||||
6. 白盒测试+黑盒测试+冒烟测试+接口测试+回归测试全部通过后才能提交
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**: v1.0
|
||||
> **最后更新**: 2026-06-06
|
||||
729
MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md
Normal file
729
MD/architecture/GRADE3A_GAP_ANALYSIS_AND_DESIGN.md
Normal file
@@ -0,0 +1,729 @@
|
||||
# HealthLink-HIS 三甲医院差距分析与缺失模块设计
|
||||
|
||||
> **文档类型**: 架构设计
|
||||
> **适用范围**: 三甲达标全量差距分析
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
## 一、分析基础
|
||||
|
||||
### 1.1 评估依据
|
||||
- 《三级医院评审标准(2022年版)》及广西实施细则
|
||||
- 《电子病历系统应用水平分级评价标准》(≥4级 = 三甲硬性)
|
||||
- 《医院信息互联互通标准化成熟度测评方案》(≥四级甲等 = 三甲硬性)
|
||||
- 《医院信息系统基本功能规范》(卫生部2002版 + 2024修订)
|
||||
- 《广西卫生健康信息化"十四五"发展规划》
|
||||
|
||||
### 1.2 当前系统基线
|
||||
|
||||
| 维度 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| 数据库表 | 181张 | @TableName 实体映射 |
|
||||
| 后端Controller | 230个 | 45个业务模块 |
|
||||
| 前端视图 | 209个 | 42个模块目录 |
|
||||
| Mapper XML | 662个 | 含复杂SQL映射 |
|
||||
| 空壳视图 | 26个 | 仅22字节占位 |
|
||||
| 缺失组件 | 18个 | 路由指向不存在的组件 |
|
||||
| 已实现核心流程 | 6条 | 挂号→收费→发药→入院→医嘱→报表 |
|
||||
|
||||
### 1.3 电子病历评级差距总览
|
||||
|
||||
| 等级 | 要求 | 当前状态 | 差距 |
|
||||
|------|------|---------|------|
|
||||
| 1级 | 独立信息系统 | ✅ 已达 | — |
|
||||
| 2级 | 科室内共享 | ✅ 已达 | — |
|
||||
| 3级 | 跨科室共享 | ✅ 基本达到 | 部分模块数据未打通 |
|
||||
| **4级** | **全院共享+CDSS** | **❌ 未达到** | **差6大核心能力** |
|
||||
| 5级 | 结构化+质控 | ❌ | 需4级基础上建设 |
|
||||
|
||||
---
|
||||
|
||||
## 二、差距全景图
|
||||
|
||||
### 2.1 按三甲标准17个互联互通必测项对比
|
||||
|
||||
| 接口 | 名称 | 标准要求 | 当前状态 | 差距等级 |
|
||||
|------|------|---------|---------|---------|
|
||||
| I-01 | 患者信息注册 | 统一EMPI | ⚠️ 有基础患者表,无EMPI | 🟡 |
|
||||
| I-02 | 门诊挂号 | 预约+当日+退号 | ✅ 已实现 | ✅ |
|
||||
| I-03 | 门诊医生工作站 | 处方+检验检查申请 | ✅ 已实现 | ✅ |
|
||||
| I-04 | 门诊收费 | 费用明细+医保结算 | ✅ 已实现 | ✅ |
|
||||
| I-05 | 门诊药房 | 发药信息 | ✅ 已实现 | ✅ |
|
||||
| I-06 | 住院入出转 | 入院+转科+出院 | ✅ 已实现 | ✅ |
|
||||
| I-07 | 住院医生工作站 | 医嘱信息 | ⚠️ 基础实现 | 🟡 缺闭环 |
|
||||
| I-08 | 住院护士工作站 | 护理执行 | ⚠️ 基础实现 | 🟡 缺评估 |
|
||||
| I-09 | 住院收费 | 费用结算 | ✅ 已实现 | ✅ |
|
||||
| I-10 | 住院药房 | 药品发放 | ✅ 已实现 | ✅ |
|
||||
| I-11 | 检验系统 | 标本+结果 | ✅ LIS框架已有 | ⚠️ 缺危急值 |
|
||||
| I-12 | 检查系统 | 申请+报告 | ✅ PACS框架已有 | ⚠️ 缺结构化 |
|
||||
| **I-13** | **手麻系统** | **手术申请+麻醉记录** | **❌ 仅排程** | **🔴 严重** |
|
||||
| **I-14** | **病案系统** | **病案首页** | **❌ 仅基础统计** | **🔴 严重** |
|
||||
| I-15 | 医保接口 | 医保结算 | ⚠️ DRG框架有 | 🟡 |
|
||||
| **I-16** | **电子病历** | **病历文档共享** | **⚠️ 有模板** | **🔴 缺结构化+留痕** |
|
||||
| **I-17** | **护理系统** | **护理评估+记录** | **⚠️ 仅基础** | **🔴 缺评估体系** |
|
||||
|
||||
### 2.2 按模块域差距分析
|
||||
|
||||
#### 🔴 P0 — 三甲硬性缺失(不达标的评审一票否决)
|
||||
|
||||
| # | 模块 | 三甲要求 | 当前状态 | 预估工时 |
|
||||
|---|------|---------|---------|---------|
|
||||
| 1 | **合理用药系统** | 处方审核率≥100% | 仅`prescription_review_record`基础表,无审核引擎 | 15天 |
|
||||
| 2 | **麻醉记录系统** | 互联互通I-13必测 | 仅`AnesthesiaTypeEnum`枚举+手术排程 | 15天 |
|
||||
| 3 | **病案首页管理** | 首页数据质量≥95% | 仅有`yb_inpatient_discharge`基础统计 | 10天 |
|
||||
| 4 | **医嘱闭环管理** | 开立→审核→执行→完成 | `order_main`+`doc_order_process`部分实现 | 10天 |
|
||||
| 5 | **电子病历结构化** | 结构化+模板+留痕+版本 | `doc_emr`+`doc_emr_template`基础框架 | 15天 |
|
||||
| 6 | **电子签名/CA** | 三甲硬性 | 仅医保证书签名,无临床CA | 5天 |
|
||||
|
||||
#### 🟡 P1 — 三甲评审重要项(影响评分)
|
||||
|
||||
| # | 模块 | 三甲要求 | 当前状态 | 预估工时 |
|
||||
|---|------|---------|---------|---------|
|
||||
| 7 | **护理评估体系** | 多种量表+评估计划 | `doc_vital_signs`仅生命体征 | 10天 |
|
||||
| 8 | **危急值管理** | 检验危急值闭环 | 完全缺失 | 8天 |
|
||||
| 9 | **院感管理** | 实时监测+预警 | `infectious_*` 3张表仅有框架 | 10天 |
|
||||
| 10 | **抗菌药物管控** | 分级管理+权限控制 | 完全缺失 | 8天 |
|
||||
| 11 | **处方点评系统** | 合理用药管控 | `nd_review_prescription_records`基础表 | 5天 |
|
||||
| 12 | **数据集成平台(ESB)** | 互联互通四级甲等 | 完全缺失 | 20天 |
|
||||
| 13 | **患者主索引(EMPI)** | 数据标准化基础 | 完全缺失 | 8天 |
|
||||
| 14 | **病历质控系统** | 按时完成率+完整性 | 完全缺失 | 8天 |
|
||||
| 15 | **死亡病例讨论** | 评审必查 | 完全缺失 | 3天 |
|
||||
|
||||
#### 🟢 P2 — 广西地方特色要求
|
||||
|
||||
| # | 模块 | 广西要求 | 当前状态 | 预估工时 |
|
||||
|---|------|---------|---------|---------|
|
||||
| 16 | **壮医/中医特色模块** | 广西壮医药诊疗 | `yb_catalog_zy_*`医保目录有中医 | 10天 |
|
||||
| 17 | **传染病直报** | 对接广西疾控 | `diseaseReportManagement`有框架 | 5天 |
|
||||
| 18 | **电子健康卡** | 对接广西平台 | 完全缺失 | 5天 |
|
||||
| 19 | **电子票据** | 对接广西财政 | 完全缺失 | 5天 |
|
||||
| 20 | **DRG/DIP深化** | 广西医保规则 | `ybmanage`基础框架 | 10天 |
|
||||
|
||||
---
|
||||
|
||||
## 三、缺失模块详细设计
|
||||
|
||||
### 3.1 合理用药系统(P0 — 15天)
|
||||
|
||||
#### 业务流程
|
||||
```
|
||||
医生开方 → ┌→ 规则引擎自动审核 ──→ 合理 → 通过
|
||||
├→ 配伍禁忌/过敏/剂量 ──→ 不合理 → 拦截弹窗 → 修改
|
||||
└→ 需人工审核 ──────→ 药师在线审核 → 通过/驳回
|
||||
```
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 子功能 | 描述 | 实现方式 |
|
||||
|--------|------|---------|
|
||||
| 处方前置审核引擎 | 医生开方时实时拦截 | 新建 `RationalDrugAppService` |
|
||||
| 配伍禁忌检查 | 两药/三药相互作用 | 新建 `DrugInteractionChecker` |
|
||||
| 过敏检测 | 患者过敏史自动匹配 | 扩展 `cli_allergy_intolerance` |
|
||||
| 剂量范围检查 | 肾/肝功能自动调量 | 新建 `DosageRangeChecker` |
|
||||
| 重复用药检查 | 同成分/同功效重复 | 新建 `DuplicateTherapyChecker` |
|
||||
| 审核结果记录 | 每次审核留痕 | 扩展 `prescription_review_record` |
|
||||
| 审核统计报表 | 合理率/拦截率统计 | 新建 `RationalDrugReportAppService` |
|
||||
|
||||
#### 数据库设计(Flyway)
|
||||
```sql
|
||||
-- V2.1__rational_drug_system.sql
|
||||
CREATE TABLE drug_interaction_rule (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
drug_a_code VARCHAR(32) NOT NULL,
|
||||
drug_b_code VARCHAR(32) NOT NULL,
|
||||
severity VARCHAR(16) NOT NULL, -- CRITICAL/MAJOR/MODERATE
|
||||
description TEXT,
|
||||
suggestion TEXT,
|
||||
del_flag CHAR(1) DEFAULT '0',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE prescription_audit_log (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
prescription_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
doctor_id BIGINT NOT NULL,
|
||||
audit_result VARCHAR(16) NOT NULL, -- PASS/REJECT/MANUAL
|
||||
rule_hit VARCHAR(64),
|
||||
detail TEXT,
|
||||
auditor_id BIGINT,
|
||||
audit_time TIMESTAMP,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
#### 接口设计
|
||||
```
|
||||
POST /healthlink-his/api/v1/rational-drug/audit # 处方审核
|
||||
GET /healthlink-his/api/v1/rational-drug/interactions # 查询配伍禁忌
|
||||
GET /healthlink-his/api/v1/rational-drug/statistics # 审核统计
|
||||
POST /healthlink-his/api/v1/rational-drug/manual-review # 人工审核
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.2 麻醉记录系统(P0 — 15天)
|
||||
|
||||
#### 业务流程
|
||||
```
|
||||
手术申请 → 麻醉评估 → 麻醉方案 → 术中记录 → 术后随访
|
||||
│ │
|
||||
├ ASA分级评估 ├ 生命体征(5min间隔)
|
||||
├ 禁食确认 ├ 用药记录
|
||||
└ 知情同意 ├ 出入量记录
|
||||
└ 并发症记录
|
||||
```
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 子功能 | 描述 | 互联互通映射 |
|
||||
|--------|------|-------------|
|
||||
| 麻醉前评估 | ASA分级、气道评估、禁食确认 | I-13 必测 |
|
||||
| 麻醉方案 | 全麻/半麻/局麻方案制定 | I-13 必测 |
|
||||
| 术中记录 | 生命体征、用药、出入量 | I-13 必测 |
|
||||
| 麻醉小结 | 麻醉总结、并发症记录 | I-13 必测 |
|
||||
| 术后随访 | 24h内随访、疼痛评估 | I-13 必测 |
|
||||
| 麻醉质控 | 麻醉安全指标统计 | 评审加分 |
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.2__anesthesia_system.sql
|
||||
CREATE TABLE anes_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
surgery_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
anesthetist_id BIGINT NOT NULL,
|
||||
asa_grade VARCHAR(8),
|
||||
anesthesia_type VARCHAR(32),
|
||||
start_time TIMESTAMP,
|
||||
end_time TIMESTAMP,
|
||||
airway_assessment TEXT,
|
||||
fasting_confirmed BOOLEAN DEFAULT FALSE,
|
||||
consent_signed BOOLEAN DEFAULT FALSE,
|
||||
summary TEXT,
|
||||
complications TEXT,
|
||||
del_flag CHAR(1) DEFAULT '0',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
update_time TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE anes_vital_sign (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
record_id BIGINT NOT NULL,
|
||||
record_time TIMESTAMP NOT NULL,
|
||||
heart_rate INTEGER,
|
||||
blood_pressure_sys INTEGER,
|
||||
blood_pressure_dia INTEGER,
|
||||
spo2 DECIMAL(5,2),
|
||||
etco2 DECIMAL(5,2),
|
||||
temperature DECIMAL(4,1),
|
||||
respiratory_rate INTEGER,
|
||||
remark TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE anes_medication (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
record_id BIGINT NOT NULL,
|
||||
drug_name VARCHAR(128) NOT NULL,
|
||||
dosage VARCHAR(64),
|
||||
route VARCHAR(32),
|
||||
start_time TIMESTAMP,
|
||||
end_time TIMESTAMP,
|
||||
remark TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE anes_io_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
record_id BIGINT NOT NULL,
|
||||
record_type VARCHAR(16) NOT NULL, -- INPUT/OUTPUT
|
||||
item_name VARCHAR(64),
|
||||
amount DECIMAL(10,2),
|
||||
unit VARCHAR(16),
|
||||
record_time TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.3 病案首页管理(P0 — 10天)
|
||||
|
||||
#### 标准要求
|
||||
- 主要诊断编码正确率 ≥95%
|
||||
- 其他诊断编码正确率 ≥90%
|
||||
- 手术操作编码正确率 ≥95%
|
||||
- 24小时归档率 ≥90%
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 子功能 | 描述 |
|
||||
|--------|------|
|
||||
| 首页数据录入 | 出院时自动生成首页数据 |
|
||||
| ICD编码辅助 | 诊断→ICD-10自动映射推荐 |
|
||||
| 首页质控 | 入组前必填项校验、逻辑校验 |
|
||||
| DRG预入组 | 费用+诊断→DRG分组预估 |
|
||||
| 首页上报 | HQMS数据上报接口 |
|
||||
| 首页查询 | 按科室/医生/时间段统计 |
|
||||
| 缺陷管理 | 首页缺陷记录、整改跟踪 |
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.3__medical_record_homepage.sql
|
||||
CREATE TABLE mr_homepage (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
discharge_date DATE,
|
||||
los_days INTEGER,
|
||||
primary_diagnosis_code VARCHAR(16),
|
||||
primary_diagnosis_name VARCHAR(128),
|
||||
other_diagnosis_codes TEXT,
|
||||
primary_procedure_code VARCHAR(16),
|
||||
primary_procedure_name VARCHAR(128),
|
||||
other_procedure_codes TEXT,
|
||||
admission_condition VARCHAR(32),
|
||||
discharge_condition VARCHAR(32),
|
||||
drg_group VARCHAR(32),
|
||||
drg_weight DECIMAL(8,4),
|
||||
total_cost DECIMAL(12,2),
|
||||
self_pay_cost DECIMAL(12,2),
|
||||
insurance_cost DECIMAL(12,2),
|
||||
quality_status VARCHAR(16) DEFAULT 'DRAFT',
|
||||
submit_time TIMESTAMP,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
update_time TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE mr_homepage_quality_check (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
homepage_id BIGINT NOT NULL,
|
||||
check_item VARCHAR(64) NOT NULL,
|
||||
check_result VARCHAR(16) NOT NULL, -- PASS/FAIL/WARN
|
||||
check_detail TEXT,
|
||||
checker VARCHAR(32), -- SYSTEM/MANUAL
|
||||
check_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.4 医嘱闭环管理(P0 — 10天)
|
||||
|
||||
#### 当前实现
|
||||
- `order_main` — 医嘱主表 ✅
|
||||
- `doc_order_process` — 医嘱处理 ✅
|
||||
- `elep_medication_request` — 电子处方 ✅
|
||||
|
||||
#### 缺失环节
|
||||
|
||||
| 闭环 | 已有 | 缺失 |
|
||||
|------|------|------|
|
||||
| 药品医嘱 | 开立✅ 调配⚠️ | 核对❌ 发药❌ 执行确认❌ |
|
||||
| 检验医嘱 | 开立✅ 采集⚠️ | 运送❌ 接收❌ 检测❌ 审核❌ |
|
||||
| 检查医嘱 | 开立✅ 预约⚠️ | 登记❌ 检查❌ 审核❌ |
|
||||
| 治疗医嘱 | 开立✅ | 执行❌ 观察❌ |
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.4__order_closed_loop.sql
|
||||
CREATE TABLE order_execute_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
order_id BIGINT NOT NULL,
|
||||
order_type VARCHAR(32) NOT NULL, -- DRUG/LAB/EXAM/TREAT
|
||||
step_name VARCHAR(32) NOT NULL, -- DISPATCH/VERIFY/EXECUTE/OBSERVE
|
||||
step_status VARCHAR(16) NOT NULL, -- PENDING/IN_PROGRESS/COMPLETED/SKIPPED
|
||||
executor_id BIGINT,
|
||||
execute_time TIMESTAMP,
|
||||
execute_location VARCHAR(64),
|
||||
remark TEXT,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.5 电子病历结构化(P0 — 15天)
|
||||
|
||||
#### 三甲4级要求
|
||||
- 结构化病历(非纯文本)
|
||||
- 病历模板管理
|
||||
- 修改留痕(修改人、时间、内容)
|
||||
- 版本管理(历史版本不可删除)
|
||||
- 打印管理(标注"打印版")
|
||||
|
||||
#### 当前实现
|
||||
- `doc_emr` — 电子病历 ✅
|
||||
- `doc_emr_template` — 病历模板 ✅
|
||||
- `doc_emr_detail` — 病历详情 ✅
|
||||
|
||||
#### 缺失功能
|
||||
|
||||
| 功能 | 描述 | 实现方式 |
|
||||
|------|------|---------|
|
||||
| 结构化录入 | 选择式+自由文本混合 | 新建 `StructuredEmrAppService` |
|
||||
| 修改留痕 | diff追踪 | 新建 `EmrRevisionTracker` |
|
||||
| 版本管理 | 历史版本快照 | 扩展 `doc_emr` 增加 `version` 字段 |
|
||||
| 完整性检查 | 必填项+逻辑校验 | 新建 `EmrCompletenessChecker` |
|
||||
| 时限监控 | 24h完成率监控 | 新建 `EmrTimelinessMonitor` |
|
||||
| 打印管理 | 打印水印+版本比对 | 新建 `EmrPrintManager` |
|
||||
|
||||
---
|
||||
|
||||
### 3.6 电子签名/CA(P0 — 5天)
|
||||
|
||||
#### 标准要求
|
||||
- 医师签名:按职称、科室分配权限
|
||||
- 操作时效:住院24h、门诊当日
|
||||
- 签名认证:可靠电子签名,等同手写
|
||||
- 版本管理:历史版本不可删除
|
||||
|
||||
#### 实现方案
|
||||
```java
|
||||
// 新建签名服务
|
||||
public interface ICaSignatureService {
|
||||
// 医生签名
|
||||
SignatureResult signDocument(Long docId, Long doctorId, String password);
|
||||
// 验证签名
|
||||
boolean verifySignature(Long docId);
|
||||
// 获取签名历史
|
||||
List<SignatureHistory> getSignatureHistory(Long docId);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.7 护理评估体系(P1 — 10天)
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 评估类型 | 量表 | 频次 |
|
||||
|---------|------|------|
|
||||
| 入院评估 | 压力性损伤风险(Braden)、跌倒风险(Morse)、营养风险(NRS2002)、疼痛(NRS)、Barthel指数 | 入院时 |
|
||||
| 跌倒评估 | Morse跌落评估量表 | 每班 |
|
||||
| 压疮评估 | Braden量表 | 每班 |
|
||||
| 疼痛评估 | NRS数字评分法 | 按需 |
|
||||
| 营养评估 | NRS2002 | 入院时 |
|
||||
| 导管评估 | 导管滑脱风险 | 每班 |
|
||||
| 自理能力 | Barthel指数评定 | 入院时 |
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.5__nursing_assessment.sql
|
||||
CREATE TABLE nursing_assessment (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
assessor_id BIGINT NOT NULL,
|
||||
assessment_type VARCHAR(32) NOT NULL,
|
||||
assessment_tool VARCHAR(64) NOT NULL,
|
||||
total_score INTEGER,
|
||||
risk_level VARCHAR(16),
|
||||
detail JSONB,
|
||||
assessment_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
del_flag CHAR(1) DEFAULT '0'
|
||||
);
|
||||
|
||||
CREATE TABLE nursing_care_plan (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
diagnosis VARCHAR(256),
|
||||
goal TEXT,
|
||||
interventions TEXT,
|
||||
evaluation TEXT,
|
||||
planner_id BIGINT,
|
||||
plan_date DATE,
|
||||
del_flag CHAR(1) DEFAULT '0',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.8 危急值管理(P1 — 8天)
|
||||
|
||||
#### 业务流程
|
||||
```
|
||||
LIS出报告 → 系统自动识别危急值 → 接收确认(30min内) → 通知医生(5min内)
|
||||
→ 医生处理 → 处理记录 → 闭环确认
|
||||
```
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.6__critical_value.sql
|
||||
CREATE TABLE critical_value (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
lab_result_id BIGINT NOT NULL,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
item_name VARCHAR(128),
|
||||
result_value VARCHAR(128),
|
||||
reference_range VARCHAR(64),
|
||||
notify_time TIMESTAMP,
|
||||
receiver_id BIGINT,
|
||||
receive_time TIMESTAMP,
|
||||
handler_id BIGINT,
|
||||
handle_time TIMESTAMP,
|
||||
handle_result TEXT,
|
||||
close_time TIMESTAMP,
|
||||
status VARCHAR(16) DEFAULT 'PENDING',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.9 院感管理(P1 — 10天)
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 子功能 | 描述 |
|
||||
|--------|------|
|
||||
| 院感病例监测 | 自动筛查+人工上报 |
|
||||
| 医院感染预警 | 新发感染+聚集性预警 |
|
||||
| 抗菌药物监测 | 使用率、DDD值、耐药率 |
|
||||
| 手卫生监测 | 依从性统计 |
|
||||
| 环境监测 | 消毒灭菌记录 |
|
||||
| 职业暴露 | 登记+跟踪+随访 |
|
||||
| 上报管理 | 向疾控中心上报 |
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.7__hospital_infection.sql
|
||||
CREATE TABLE hir_infection_case (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
infection_type VARCHAR(64),
|
||||
infection_site VARCHAR(64),
|
||||
pathogen VARCHAR(128),
|
||||
diagnosis_time DATE,
|
||||
reporter_id BIGINT,
|
||||
report_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
status VARCHAR(16) DEFAULT 'REPORTED',
|
||||
del_flag CHAR(1) DEFAULT '0'
|
||||
);
|
||||
|
||||
CREATE TABLE hir_antibiotic_usage (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
encounter_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
drug_code VARCHAR(32),
|
||||
drug_name VARCHAR(128),
|
||||
ddd_value DECIMAL(10,2),
|
||||
usage_days INTEGER,
|
||||
usage_type VARCHAR(32), -- PREVENTIVE/THERAPEUTIC
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.10 数据集成平台/ESB(P1 — 20天)
|
||||
|
||||
#### 互联互通四级甲等要求
|
||||
|
||||
| 能力 | 要求 | 实现方案 |
|
||||
|------|------|---------|
|
||||
| 消息路由 | HL7 FHIR R4 消息路由 | 新建 `IntegrationHub` |
|
||||
| 格式转换 | HIS内部格式↔FHIR | 新建 `FhirConverter` |
|
||||
| 服务注册 | 接口目录管理 | 新建 `ServiceRegistry` |
|
||||
| 集成监控 | 消息追踪+日志 | 新建 `IntegrationMonitor` |
|
||||
| 可靠性 | 存储转发+确认 | Redis + 消息队列 |
|
||||
|
||||
#### HL7 FHIR 资源映射
|
||||
|
||||
| FHIR资源 | HIS模块 | 映射 |
|
||||
|----------|---------|------|
|
||||
| Patient | adm_patient | 患者信息 |
|
||||
| Practitioner | adm_practitioner | 医护人员 |
|
||||
| Encounter | adm_encounter | 就诊记录 |
|
||||
| Condition | cli_condition | 诊断 |
|
||||
| MedicationRequest | med_medication_request | 药品医嘱 |
|
||||
| ServiceRequest | doc_request_form | 检查检验申请 |
|
||||
| Observation | lab_observation | 检验结果 |
|
||||
| MedicationDispense | med_medication_dispense | 发药记录 |
|
||||
| Procedure | cli_procedure | 手术操作 |
|
||||
| AllergyIntolerance | cli_allergy_intolerance | 过敏信息 |
|
||||
| Claim | fin_claim | 费用结算 |
|
||||
|
||||
---
|
||||
|
||||
### 3.11 患者主索引/EMPI(P1 — 8天)
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 功能 | 描述 |
|
||||
|------|------|
|
||||
| 患者身份合并 | 同一患者多卡合并 |
|
||||
| 身份校验 | 身份证+姓名+手机号交叉验证 |
|
||||
| 主索引维护 | 一个患者一个全局ID |
|
||||
| 重复检测 | 新建时自动检测重复 |
|
||||
| 跨系统同步 | EMPI→HIS/LIS/PACS/EMR |
|
||||
|
||||
#### 数据库设计
|
||||
```sql
|
||||
-- V2.8__empi.sql
|
||||
CREATE TABLE empi_person (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
global_id VARCHAR(64) UNIQUE NOT NULL,
|
||||
id_card_no VARCHAR(32),
|
||||
name VARCHAR(64),
|
||||
gender VARCHAR(8),
|
||||
birth_date DATE,
|
||||
phone VARCHAR(20),
|
||||
merge_status VARCHAR(16) DEFAULT 'ACTIVE',
|
||||
source_system VARCHAR(32),
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
update_time TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE empi_person_id_mapping (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
global_id VARCHAR(64) NOT NULL,
|
||||
local_patient_id BIGINT NOT NULL,
|
||||
source_system VARCHAR(32) NOT NULL,
|
||||
id_type VARCHAR(32),
|
||||
id_value VARCHAR(64),
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.12 病历质控系统(P1 — 8天)
|
||||
|
||||
#### 功能清单
|
||||
|
||||
| 子功能 | 描述 |
|
||||
|--------|------|
|
||||
| 运行质控 | 入院后实时检查病历完成情况 |
|
||||
| 终末质控 | 出院后完整性质控评分 |
|
||||
| 时限监控 | 入院记录24h、首次病程8h、日常病程 |
|
||||
| 完整性检查 | 必填项+逻辑校验 |
|
||||
| 质控评分 | 按标准自动打分 |
|
||||
| 缺陷管理 | 缺陷记录+整改+复查 |
|
||||
|
||||
---
|
||||
|
||||
### 3.13 广西地方特色模块(P2)
|
||||
|
||||
#### 3.13.1 壮医/中医特色
|
||||
|
||||
| 功能 | 描述 |
|
||||
|------|------|
|
||||
| 壮医诊疗 | 壮医望诊、脉诊、目诊记录 |
|
||||
| 中医处方 | 中药饮片处方+壮药处方 |
|
||||
| 中医体质辨识 | 九种体质辨识量表 |
|
||||
| 中医处方模板 | 常用中药方剂模板 |
|
||||
| 民族药编码 | 壮药、瑶药目录维护 |
|
||||
|
||||
#### 3.13.2 传染病直报
|
||||
|
||||
| 功能 | 描述 |
|
||||
|------|------|
|
||||
| 传染病自动筛查 | 诊断+检验结果自动匹配 |
|
||||
| 直报对接 | 对接广西疾控中心系统 |
|
||||
| 报告管理 | 填报+审核+上报 |
|
||||
| 统计分析 | 传染病发病率统计 |
|
||||
|
||||
---
|
||||
|
||||
## 四、空壳模块补全清单
|
||||
|
||||
### 4.1 当前26个空壳视图实现计划
|
||||
|
||||
| 优先级 | 模块 | 前端路径 | 后端接口 | 工时 |
|
||||
|--------|------|---------|---------|------|
|
||||
| P0 | 门诊退号 | `clinicmanagement/refundNumber/` | `RefundNumberAppService` | 2天 |
|
||||
| P0 | 门诊退药 | `clinicmanagement/withdrawal/` | `ReturnMedicineAppService` | 2天 |
|
||||
| P0 | 门诊退费 | `clinicmanagement/consultationRefund/` | `ConsultationRefundAppService` | 2天 |
|
||||
| P0 | 收费详情查询 | `clinicmanagement/chargeDetail/` | `ChargeDetailQueryAppService` | 1天 |
|
||||
| P0 | 申请单管理 | `clinicmanagement/requisition/` | `RequisitionManageAppService` | 2天 |
|
||||
| P0 | 结果查看 | `clinicmanagement/lisPascResult/` | `LabResultViewAppService` | 2天 |
|
||||
| P0 | 医嘱查看与打印 | `clinicmanagement/orderViewPrint/` | `OrderViewPrintAppService` | 1天 |
|
||||
| P0 | 入院诊断 | `inHospitalManagement/inpatientDiagnosis/` | `InpatientDiagnosisAppService` | 2天 |
|
||||
| P0 | 医嘱管理 | `inHospitalManagement/orderManage/` | `OrderManageAppService` | 2天 |
|
||||
| P0 | 门诊收费结算 | `charge/registerRecords/` | `RegisterRecordsAppService` | 2天 |
|
||||
| P0 | 排班管理 | `charge/schedule/` | `ScheduleManageAppService` | 2天 |
|
||||
| P1 | 病案管理 | `inHospitalManagement/medicalRecord/` | `MedicalRecordAppService` | 3天 |
|
||||
| P1 | 费用清单 | `inHospitalManagement/listFee/` | `ListFeeAppService` | 2天 |
|
||||
| P1 | 手术管理 | `inHospitalManagement/surgeryManage/` | `SurgeryManageAppService` | 3天 |
|
||||
| P1 | 服务目录 | `catalog/service/` | `ServiceCatalogAppService` | 2天 |
|
||||
| P1 | 常用诊断 | `basicmanage/commonlyDiagnosis/` | `CommonDiagnosisAppService` | 1天 |
|
||||
| P1 | 中医处方 | `basicmanage/tcmPrescription/` | `TcmPrescriptionAppService` | 2天 |
|
||||
| P1 | 床位管理 | `basicmanage/bedspace/` | `BedManageAppService` | 2天 |
|
||||
| P1 | 费用配置 | `basicmanage/fee/` | `FeeConfigAppService` | 1天 |
|
||||
| P2 | LIS对照 | 目录对照 | `LisContrastAppService` | 2天 |
|
||||
| P2 | PACS对照 | 目录对照 | `PacsContrastAppService` | 2天 |
|
||||
| P2 | 诊断对照 | 目录对照 | `DiagnosisContrastAppService` | 2天 |
|
||||
| P2 | 货位管理 | `medicationmanagement/locationManagement/` | `LocationManageAppService` | 2天 |
|
||||
| P2 | 调价管理 | `adjustprice/` | `AdjustPriceAppService` | 2天 |
|
||||
| P2 | 退药管理 | 药房管理 | `PharmacyReturnAppService` | 2天 |
|
||||
| P2 | 自动计算 | `basicmanage/automaticBilling/` | `AutoBillingAppService` | 2天 |
|
||||
|
||||
---
|
||||
|
||||
## 五、实施路线图
|
||||
|
||||
### Phase 1: 核心达标(4周,Sprint 7-8)
|
||||
|
||||
**目标**:补齐6个P0模块,达到电子病历4级基本要求
|
||||
|
||||
```
|
||||
Week 1-2: 合理用药系统 + 医嘱闭环管理
|
||||
Week 3: 麻醉记录系统
|
||||
Week 4: 病案首页管理 + 电子病历结构化(基础) + 电子签名
|
||||
```
|
||||
|
||||
### Phase 2: 评审保障(4周,Sprint 9-10)
|
||||
|
||||
**目标**:补齐P1模块,达到三甲评审合格线
|
||||
|
||||
```
|
||||
Week 5-6: 护理评估体系 + 危急值管理 + 病历质控
|
||||
Week 7-8: 院感管理 + 抗菌药物管控 + 处方点评 + 空壳模块补全
|
||||
```
|
||||
|
||||
### Phase 3: 地方特色(3周,Sprint 11-12)
|
||||
|
||||
**目标**:满足广西地方要求 + 互联互通基础
|
||||
|
||||
```
|
||||
Week 9-10: 壮医/中医特色 + 传染病直报 + 电子健康卡
|
||||
Week 11: 电子票据 + DRG/DIP深化
|
||||
```
|
||||
|
||||
### Phase 4: 高级能力(6周,Sprint 13-16)
|
||||
|
||||
**目标**:数据集成平台 + EMPI,达到互联互通四级甲等
|
||||
|
||||
```
|
||||
Week 12-14: ESB集成平台 + HL7 FHIR转换
|
||||
Week 15-16: 患者主索引(EMPI) + 服务注册
|
||||
Week 17: 集成监控 + 全系统联调
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、工时汇总
|
||||
|
||||
| 类别 | 模块数 | 总工时 |
|
||||
|------|--------|--------|
|
||||
| 🔴 P0 核心达标 | 6个 | 70天 |
|
||||
| 🟡 P1 评审保障 | 9个 | 68天 |
|
||||
| 🟢 P2 地方特色 | 5个 | 35天 |
|
||||
| ⚡ P1 高级能力 | 3个 | 36天 |
|
||||
| 🔧 空壳补全 | 26个 | 49天 |
|
||||
| **总计** | **49个模块** | **258人天** |
|
||||
|
||||
> 按2人并行开发,预计 **5-6个月** 可完成全部三甲达标建设。
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**: v1.0
|
||||
> **最后更新**: 2026-06-06
|
||||
219
MD/architecture/GRADE3A_HIS_DESIGN.md
Normal file
219
MD/architecture/GRADE3A_HIS_DESIGN.md
Normal file
@@ -0,0 +1,219 @@
|
||||
# 广西三甲医院 HIS 系统功能设计文档
|
||||
|
||||
> **文档类型**: 架构设计
|
||||
> **适用范围**: 三甲医院HIS系统
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
> 参考标准:
|
||||
> - 《医院信息系统功能基本规范》(卫生部)
|
||||
> - 《三级医院评审标准(2022年版)》信息化部分
|
||||
> - 《电子病历应用管理规范(试行)》
|
||||
> - 《医院信息平台技术规范》(WS/T 500)
|
||||
> - 互联互通标准化成熟度测评四级甲等要求
|
||||
> - 广西壮族自治区卫生健康信息化"十四五"规划
|
||||
|
||||
---
|
||||
|
||||
## 一、门诊管理模块 (Outpatient)
|
||||
|
||||
### 1.1 门诊挂号 (Registration)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 普通挂号 | 支持科室/医生/时段多维度挂号 | ✅必须 |
|
||||
| 预约挂号 | 支持电话/网络/现场预约,分时段预约 | ✅必须 |
|
||||
| 挂号退号 | 退号退费,限当日退号 | ✅必须 |
|
||||
| 号源管理 | 号源池管理,限号/加号/停诊 | ✅必须 |
|
||||
| 多身份挂号 | 医保/自费/公费/商业保险 | ✅必须 |
|
||||
| 就诊卡管理 | 发卡/补卡/换卡/挂失 | ✅必须 |
|
||||
| 排班管理 | 医生排班/停诊/替班 | ✅必须 |
|
||||
|
||||
### 1.2 门诊医生工作站 (Doctor Workstation)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 候诊患者列表 | 按就诊顺序排列,显示患者基本信息 | ✅必须 |
|
||||
| 病历书写 | 主诉/现病史/既往史/体格检查/辅助检查 | ✅必须(电子病历≥4级) |
|
||||
| 诊断录入 | ICD-10编码,主诊断+副诊断 | ✅必须 |
|
||||
| 处方开具 | 西药/中成药/中药饮片处方 | ✅必须 |
|
||||
| 检验申请 | LIS检验项目申请,条码打印 | ✅必须 |
|
||||
| 检查申请 | PACS检查项目申请 | ✅必须 |
|
||||
| 治疗申请 | 治疗/手术/操作申请 | ✅必须 |
|
||||
| 医嘱管理 | 长期医嘱/临时医嘱,医嘱审核 | ✅必须 |
|
||||
| 处方审核 | 药师审核处方,合理用药提醒 | ✅必须 |
|
||||
| 模板管理 | 个人/科室/全院病历模板 | 推荐 |
|
||||
| 诊断知识库 | 诊断建议,鉴别诊断 | 推荐 |
|
||||
|
||||
### 1.3 门诊收费 (Billing)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 门诊收费 | 处方/检查/治疗费用收取 | ✅必须 |
|
||||
| 多支付方式 | 现金/银行卡/微信/支付宝/医保 | ✅必须 |
|
||||
| 发票管理 | 电子发票/纸质发票 | ✅必须 |
|
||||
| 退费管理 | 部分退费/全部退费,退费审批 | ✅必须 |
|
||||
| 费用查询 | 患者费用明细查询 | ✅必须 |
|
||||
| 日结管理 | 收款员日结/月结 | ✅必须 |
|
||||
| 欠费管理 | 记账/催缴/坏账处理 | 推荐 |
|
||||
|
||||
### 1.4 门诊药房 (Pharmacy)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 处方接收 | 自动接收门诊处方 | ✅必须 |
|
||||
| 配药发药 | 按处方配药,核对发药 | ✅必须 |
|
||||
| 退药管理 | 退药退回药房 | ✅必须 |
|
||||
| 处方点评 | 抗菌药物/重点监控药品点评 | ✅必须 |
|
||||
| 用药安全 | 过敏提醒/配伍禁忌/重复用药 | ✅必须 |
|
||||
| 药品效期 | 近效期预警/过期药品管理 | ✅必须 |
|
||||
| 毒麻药品 | 专柜存放,双人核对 | ✅必须 |
|
||||
|
||||
---
|
||||
|
||||
## 二、住院管理模块 (Inpatient)
|
||||
|
||||
### 2.1 住院登记 (Admission)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 入院登记 | 患者信息录入,医保类型确认 | ✅必须 |
|
||||
| 床位管理 | 床位分配/转床/包床 | ✅必须 |
|
||||
| 押金管理 | 押金收取/补交/退押 | ✅必须 |
|
||||
| 预交金管理 | 预交金查询/催缴 | ✅必须 |
|
||||
| 出院登记 | 出院结算/出院带药 | ✅必须 |
|
||||
|
||||
### 2.2 住院医生工作站 (Inpatient Doctor)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 入院记录 | 入院记录书写,24小时内完成 | ✅必须(电子病历≥4级) |
|
||||
| 病程记录 | 首次病程/日常病程/上级查房 | ✅必须 |
|
||||
| 医嘱开立 | 长期/临时医嘱,医嘱套餐 | ✅必须 |
|
||||
| 医嘱审核 | 护士审核/药师审核 | ✅必须 |
|
||||
| 手术申请 | 术前讨论/手术审批/手术安排 | ✅必须 |
|
||||
| 会诊申请 | 科内/科间/全院/院外会诊 | ✅必须 |
|
||||
| 输血申请 | 输血申请/输血反应记录 | ✅必须 |
|
||||
| 死亡记录 | 死亡病例讨论记录 | ✅必须 |
|
||||
| 知情同意 | 知情同意书电子签署 | ✅必须 |
|
||||
|
||||
### 2.3 住院护士工作站 (Nurse Station)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 医嘱执行 | 医嘱审核/执行/停止 | ✅必须 |
|
||||
| 护理记录 | 生命体征/出入量/护理评估 | ✅必须 |
|
||||
| 体温单 | 电子体温单,自动绘制 | ✅必须(电子病历≥4级) |
|
||||
| 标本采集 | 标本采集/条码打印/送检 | ✅必须 |
|
||||
| 药品领取 | 病区药品领取/退药 | ✅必须 |
|
||||
| 费用录入 | 护士站记费/材料费 | ✅必须 |
|
||||
| 交接班 | 护士交接班记录 | ✅必须 |
|
||||
| 责任护理 | 责任护士分管患者 | ✅必须 |
|
||||
| 护理评估 | 入院评估/压疮评估/跌倒评估 | ✅必须 |
|
||||
|
||||
### 2.4 住院收费 (Inpatient Billing)
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 费用汇总 | 按类别/项目汇总 | ✅必须 |
|
||||
| 中途结算 | 住院中途结算 | ✅必须 |
|
||||
| 出院结算 | 出院总结算,多支付方式 | ✅必须 |
|
||||
| 医保结算 | 医保实时结算/手工报销 | ✅必须 |
|
||||
| 费用清单 | 每日费用清单/住院费用明细 | ✅必须 |
|
||||
| 费用审核 | 大额费用审核/异常费用提醒 | 推荐 |
|
||||
|
||||
---
|
||||
|
||||
## 三、药品管理模块 (Drug Management)
|
||||
|
||||
### 3.1 药品基础数据
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 药品目录 | 药品字典,国药准字/规格/厂家 | ✅必须 |
|
||||
| 药品分类 | 西药/中成药/中药饮片/外用/毒麻 | ✅必须 |
|
||||
| 基础代谢 | 给药途径/用药频次/疗程 | ✅必须 |
|
||||
| 供应商管理 | 药品供应商/资质证照管理 | ✅必须 |
|
||||
|
||||
### 3.2 药品采购
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 采购计划 | 科室请购/药房汇总/审批 | ✅必须 |
|
||||
| 采购订单 | 生成采购单/供应商确认 | ✅必须 |
|
||||
| 入库验收 | 到货验收/质量检查/入库 | ✅必须 |
|
||||
| 退货管理 | 质量问题退货 | ✅必须 |
|
||||
|
||||
### 3.3 药品库存
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 库存查询 | 实时库存/批号/效期 | ✅必须 |
|
||||
| 出入库管理 | 入库/出库/调拨/报损 | ✅必须 |
|
||||
| 盘点管理 | 定期盘点/盈亏处理 | ✅必须 |
|
||||
| 效期管理 | 近效期预警(3月/6月) | ✅必须 |
|
||||
| 高值耗材 | 高值耗材追溯管理 | ✅必须 |
|
||||
|
||||
---
|
||||
|
||||
## 四、检验检查模块 (Lab & PACS)
|
||||
|
||||
### 4.1 LIS 检验系统
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 申请接收 | 接收门诊/住院检验申请 | ✅必须 |
|
||||
| 标本采集 | 条码打印/采集确认 | ✅必须 |
|
||||
| 标本接收 | 标本签收/不合格退回 | ✅必须 |
|
||||
| 结果录入 | 仪器接口/手工录入/审核 | ✅必须 |
|
||||
| 危急值管理 | 危急值报告/处理/追踪 | ✅必须 |
|
||||
| 报告审核 | 初审/复审/修改 | ✅必须 |
|
||||
| 报告查询 | 历史报告对比 | ✅必须 |
|
||||
|
||||
### 4.2 PACS 影像系统
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 申请接收 | 接收检查申请 | ✅必须 |
|
||||
| 登记排队 | 检查登记/排队叫号 | ✅必须 |
|
||||
| 影像采集 | DICOM影像采集 | ✅必须 |
|
||||
| 报告书写 | 结构化报告/模板 | ✅必须 |
|
||||
| 影像浏览 | DICOM Viewer | ✅必须 |
|
||||
| 报告审核 | 书写/审核/修改 | ✅必须 |
|
||||
|
||||
---
|
||||
|
||||
## 五、运营监管模块 (Operations)
|
||||
|
||||
### 5.1 质控管理
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 病案质控 | 病案首页质控/运行病历质控 | ✅必须 |
|
||||
| 抗菌药物监测 | 使用率/使用强度/送检率 | ✅必须 |
|
||||
| DRGs/DIP监控 | 病组/费用/权重监控 | ✅必须 |
|
||||
| 合理用药 | 处方点评/用药监控 | ✅必须 |
|
||||
|
||||
### 5.2 统计分析
|
||||
| 功能 | 说明 | 三甲要求 |
|
||||
|---|---|---|
|
||||
| 门诊统计 | 门诊量/收入/科室统计 | ✅必须 |
|
||||
| 住院统计 | 出入院/床位使用率/均费 | ✅必须 |
|
||||
| 药品统计 | 药占比/基本药物比例 | ✅必须 |
|
||||
| 医保统计 | 医保费用/结算/对账 | ✅必须 |
|
||||
|
||||
---
|
||||
|
||||
## 六、电子病历评级要求 (EMR Level 4+)
|
||||
|
||||
三甲医院要求电子病历应用水平≥4级:
|
||||
|
||||
| 级别 | 要求 |
|
||||
|---|---|
|
||||
| 3级 | 医疗文书统一管理,关键信息可用 |
|
||||
| 4级 | 中级医疗决策支持,闭环管理 |
|
||||
| 5级 | 高级医疗决策支持,知识库 |
|
||||
| 6级 | 全流程医疗信息闭环 |
|
||||
| 7级 | 健康信息整合,区域协同 |
|
||||
|
||||
---
|
||||
|
||||
## 七、互联互通要求 (四级甲等)
|
||||
|
||||
| 要素 | 要求 |
|
||||
|---|---|
|
||||
| 数据集标准化 | HL7 FHIR / CDA 2.0 |
|
||||
| 术语标准化 | ICD-10 / SNOMED CT / LOINC |
|
||||
| 接口规范 | RESTful API / Web Service |
|
||||
| 数据交换 | 消息队列 / ESB |
|
||||
| 安全认证 | CA认证 / 电子签名 |
|
||||
128
MD/architecture/PHASE_A_EMERGENCY_DESIGN.md
Normal file
128
MD/architecture/PHASE_A_EMERGENCY_DESIGN.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# 急诊分诊+抢救模块 — 深度设计文档
|
||||
|
||||
> **版本**: v1.0 | **编制日期**: 2026-06-07
|
||||
> **依据**: 《急诊科建设与管理指南》+ 《急诊预检分诊专家共识》
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
急诊是三甲医院的关键科室,必须实现:
|
||||
- 四级预检分诊(Ⅰ级濒死/Ⅱ级危重/Ⅲ级急症/Ⅳ级非急)
|
||||
- 绿色通道(胸痛/卒中/创伤)
|
||||
- 抢救记录电子化
|
||||
- 急诊绿色通道时间监控(门-药/门-球囊/门-手术)
|
||||
|
||||
## 二、业务流程
|
||||
|
||||
```
|
||||
患者到达急诊
|
||||
↓
|
||||
[预检分诊台]
|
||||
├─ 采集生命体征(体温/脉搏/呼吸/血压/血氧/意识)
|
||||
├─ 评估病情分级
|
||||
└─ 分配就诊区域
|
||||
↓
|
||||
┌─ Ⅰ级(濒死) → 立即抢救 → 绿色通道
|
||||
├─ Ⅱ级(危重) → 10分钟内就诊
|
||||
├─ Ⅲ级(急症) → 30分钟内就诊
|
||||
└─ Ⅳ级(非急) → 引导至门诊
|
||||
↓
|
||||
[急诊医生接诊] ←→ [急诊医嘱]
|
||||
↓
|
||||
[检查/检验] ←→ [抢救/留观/住院/出院]
|
||||
↓
|
||||
[急诊病历] ←→ [急诊统计]
|
||||
```
|
||||
|
||||
## 三、数据模型
|
||||
|
||||
```sql
|
||||
-- 急诊分诊
|
||||
CREATE TABLE emergency_triage (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT,
|
||||
patient_name VARCHAR(50),
|
||||
triage_level INT NOT NULL, -- 1-4级
|
||||
chief_complaint TEXT,
|
||||
temperature DECIMAL(4,1),
|
||||
pulse INT,
|
||||
respiration INT,
|
||||
systolic_bp INT,
|
||||
diastolic_bp INT,
|
||||
spo2 INT,
|
||||
consciousness VARCHAR(20),
|
||||
triage_nurse VARCHAR(64),
|
||||
triage_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
area VARCHAR(20), -- RESUS/EMERGENCY/OBSERVATION/GREEN
|
||||
status VARCHAR(20) DEFAULT 'WAITING',
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 抢救记录
|
||||
CREATE TABLE emergency_rescue (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT NOT NULL,
|
||||
triage_id BIGINT,
|
||||
rescue_start TIMESTAMP,
|
||||
rescue_end TIMESTAMP,
|
||||
rescue_result VARCHAR(20),
|
||||
chief_doctor VARCHAR(64),
|
||||
rescue_team TEXT,
|
||||
procedures TEXT,
|
||||
medications TEXT,
|
||||
outcome VARCHAR(20), -- ADMITTED/DISCHARGED/TRANSFERRED/DECEASED
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 留观记录
|
||||
CREATE TABLE emergency_observation (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT NOT NULL,
|
||||
triage_id BIGINT,
|
||||
observation_start TIMESTAMP,
|
||||
observation_end TIMESTAMP,
|
||||
bed_no VARCHAR(20),
|
||||
doctor VARCHAR(64),
|
||||
diagnosis TEXT,
|
||||
disposition VARCHAR(20), -- ADMITTED/DISCHARGED/TRANSFERRED
|
||||
observation_hours INT,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 绿色通道
|
||||
CREATE TABLE emergency_green_channel (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT NOT NULL,
|
||||
disease_type VARCHAR(30), -- CHEST_PAIN/STROKE/TRAUMA/POISONING
|
||||
door_to_treatment_time INT, -- 门到治疗时间(分钟)
|
||||
target_time INT, -- 目标时间
|
||||
is_achieved BOOLEAN,
|
||||
doctor VARCHAR(64),
|
||||
activate_time TIMESTAMP,
|
||||
complete_time TIMESTAMP,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
## 四、接口设计
|
||||
|
||||
| API | 方法 | 说明 |
|
||||
|-----|------|------|
|
||||
| /emergency/triage/add | POST | 预检分诊 |
|
||||
| /emergency/triage/queue | GET | 分诊队列(按级别排序) |
|
||||
| /emergency/rescue/add | POST | 开始抢救 |
|
||||
| /emergency/rescue/complete/{id} | PUT | 抢救完成 |
|
||||
| /emergency/observation/add | POST | 留观登记 |
|
||||
| /emergency/observation/discharge/{id} | PUT | 留观出院 |
|
||||
| /emergency/green-channel/activate | POST | 启动绿色通道 |
|
||||
| /emergency/green-channel/stats | GET | 绿色通道统计(达标率) |
|
||||
| /emergency/stats | GET | 急诊统计(分级分布/抢救率/等候时间) |
|
||||
195
MD/architecture/PHASE_A_FOLLOWUP_DESIGN.md
Normal file
195
MD/architecture/PHASE_A_FOLLOWUP_DESIGN.md
Normal file
@@ -0,0 +1,195 @@
|
||||
# 门诊随访管理模块 — 深度设计文档
|
||||
|
||||
> **版本**: v1.0 | **编制日期**: 2026-06-07
|
||||
> **依据**: 《三级医院评审标准》患者服务条款 + 慢病管理规范
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
门诊随访是三甲医院患者服务的核心环节:
|
||||
- 慢病患者(高血压/糖尿病/冠心病等)出院后需定期随访
|
||||
- 手术患者术后需随访恢复情况
|
||||
- 肿瘤患者需长期随访复发/转移
|
||||
- 满意度调查是医院服务质量的核心指标
|
||||
|
||||
## 二、业务流程
|
||||
|
||||
### 2.1 随访计划生成
|
||||
```
|
||||
出院/门诊结束
|
||||
↓
|
||||
[自动触发] ← 根据病种+诊断自动生成随访计划
|
||||
↓ (规则引擎)
|
||||
┌─ 高血压: 每月1次电话随访, 持续1年
|
||||
├─ 糖尿病: 每2周1次, 持续6个月
|
||||
├─ 手术后: 术后1周/1月/3月/6月/1年
|
||||
├─ 肿瘤: 每3个月复查, 持续5年
|
||||
└─ 普通: 出院后1周电话随访1次
|
||||
↓
|
||||
[分配责任人] ← 根据科室+医生自动分配
|
||||
```
|
||||
|
||||
### 2.2 随访执行
|
||||
```
|
||||
[随访任务列表] ← 责任医生/护士查看今日任务
|
||||
↓
|
||||
[选择联系方式] ← 电话/短信/微信/门诊
|
||||
↓
|
||||
[拨打电话/发送短信]
|
||||
↓
|
||||
[录入随访结果]
|
||||
├─ 患者情况良好 → 标记完成
|
||||
├─ 有异常症状 → 创建复查预约
|
||||
├─ 需要调药 → 转诊门诊
|
||||
└─ 失访 → 标记失访原因
|
||||
↓
|
||||
[更新随访记录]
|
||||
```
|
||||
|
||||
### 2.3 满意度调查
|
||||
```
|
||||
[出院时] → 发放满意度问卷(纸质/电子)
|
||||
↓
|
||||
[患者填写] → 评分+建议
|
||||
↓
|
||||
[数据汇总] → 按科室/医生统计
|
||||
↓
|
||||
[问题整改] → 质量改进措施
|
||||
```
|
||||
|
||||
## 三、数据模型
|
||||
|
||||
### 3.1 核心表
|
||||
|
||||
```sql
|
||||
-- 随访计划
|
||||
CREATE TABLE followup_plan (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT NOT NULL,
|
||||
patient_name VARCHAR(50),
|
||||
encounter_id BIGINT,
|
||||
disease_code VARCHAR(20),
|
||||
disease_name VARCHAR(100),
|
||||
followup_type VARCHAR(20) NOT NULL, -- PHONE/SMS/WECHAT/OUTPATIENT
|
||||
frequency VARCHAR(20), -- DAILY/WEEKLY/MONTHLY/QUARTERLY
|
||||
total_times INT DEFAULT 1,
|
||||
completed_times INT DEFAULT 0,
|
||||
responsible_doctor VARCHAR(64),
|
||||
responsible_nurse VARCHAR(64),
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
status VARCHAR(20) DEFAULT 'ACTIVE', -- ACTIVE/COMPLETED/CANCELLED
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 随访任务
|
||||
CREATE TABLE followup_task (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
plan_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
patient_name VARCHAR(50),
|
||||
phone VARCHAR(20),
|
||||
scheduled_date DATE NOT NULL,
|
||||
actual_date DATE,
|
||||
contact_method VARCHAR(20),
|
||||
operator_name VARCHAR(64),
|
||||
result VARCHAR(20), -- SUCCESS/FAILED/NO_ANSWER/WRONG_NUMBER/LOST
|
||||
abnormal_flag BOOLEAN DEFAULT FALSE,
|
||||
next_action VARCHAR(200),
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 随访记录
|
||||
CREATE TABLE followup_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
task_id BIGINT NOT NULL,
|
||||
patient_id BIGINT NOT NULL,
|
||||
contact_content TEXT,
|
||||
patient_condition TEXT,
|
||||
medication_compliance VARCHAR(20),
|
||||
symptoms TEXT,
|
||||
vital_signs JSONB,
|
||||
reappointment_flag BOOLEAN DEFAULT FALSE,
|
||||
reappointment_date DATE,
|
||||
transfer_flag BOOLEAN DEFAULT FALSE,
|
||||
transfer_reason TEXT,
|
||||
operator_name VARCHAR(64),
|
||||
operate_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 满意度调查
|
||||
CREATE TABLE satisfaction_survey (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT,
|
||||
patient_name VARCHAR(50),
|
||||
survey_type VARCHAR(20) NOT NULL, -- INPATIENT/OUTPATIENT/EMERGENCY
|
||||
department_name VARCHAR(100),
|
||||
doctor_name VARCHAR(64),
|
||||
overall_score INT,
|
||||
service_score INT,
|
||||
environment_score INT,
|
||||
suggestions TEXT,
|
||||
survey_date DATE DEFAULT CURRENT_DATE,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 投诉记录
|
||||
CREATE TABLE complaint_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT,
|
||||
patient_name VARCHAR(50),
|
||||
complaint_type VARCHAR(30) NOT NULL, -- SERVICE/TECHNIQUE/ENVIRONMENT/BILLING/OTHER
|
||||
complaint_content TEXT NOT NULL,
|
||||
department_name VARCHAR(100),
|
||||
handler VARCHAR(64),
|
||||
handle_result TEXT,
|
||||
handle_time TIMESTAMP,
|
||||
status VARCHAR(20) DEFAULT 'PENDING', -- PENDING/PROCESSING/RESOLVED/CLOSED
|
||||
satisfaction_after INT,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
### 3.2 接口设计
|
||||
|
||||
| API | 方法 | 说明 | 参数 |
|
||||
|-----|------|------|------|
|
||||
| /followup/plan/page | GET | 随访计划列表 | patientName,status,pageNo,pageSize |
|
||||
| /followup/plan/add | POST | 新建随访计划 | patientId,diseaseCode,frequency,totalTimes |
|
||||
| /followup/task/my | GET | 我的今日任务 | operatorName |
|
||||
| /followup/task/page | GET | 任务列表(分页) | status,scheduledDate,pageNo,pageSize |
|
||||
| /followup/task/complete/{id} | PUT | 完成任务 | result,abnormalFlag,nextAction |
|
||||
| /followup/record/add | POST | 录入随访记录 | taskId,contactContent,patientCondition |
|
||||
| /followup/survey/add | POST | 提交满意度 | surveyType,overallScore,suggestions |
|
||||
| /followup/survey/stats | GET | 满意度统计 | departmentName,startDate,endDate |
|
||||
| /followup/complaint/page | GET | 投诉列表 | status,complaintType,pageNo,pageSize |
|
||||
| /followup/complaint/handle/{id} | PUT | 处理投诉 | handler,handleResult |
|
||||
| /followup/stats/overview | GET | 随访概览 | startDate,endDate |
|
||||
|
||||
## 四、前端页面设计
|
||||
|
||||
### 4.1 页面结构
|
||||
```
|
||||
followup/
|
||||
├── plan/ # 随访计划管理
|
||||
├── task/ # 随访任务(今日任务/我的任务)
|
||||
├── record/ # 随访记录查询
|
||||
├── survey/ # 满意度调查
|
||||
├── complaint/ # 投诉管理
|
||||
└── stats/ # 统计分析
|
||||
```
|
||||
|
||||
### 4.2 核心交互
|
||||
- **今日任务看板**: 按优先级排序(异常>待随访>已完成)
|
||||
- **一键拨号**: 点击患者电话直接拨打(集成HIS电话模块)
|
||||
- **随访结果快速录入**: 预设选项+自由文本
|
||||
- **满意度雷达图**: 多维度评分可视化
|
||||
142
MD/architecture/PHASE_A_PATHOLOGY_DESIGN.md
Normal file
142
MD/architecture/PHASE_A_PATHOLOGY_DESIGN.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# 病理管理模块 — 深度设计文档
|
||||
|
||||
> **版本**: v1.0 | **编制日期**: 2026-06-07
|
||||
> **依据**: 《病理科建设与管理指南》+ 《临床病理质量控制标准》
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
病理诊断是手术后诊断的"金标准",三甲医院必须具备:
|
||||
- 病理标本全流程追溯(从手术室到病理科)
|
||||
- 三级审核制度(住院医师→主治→副主任)
|
||||
- 病理报告质量控制
|
||||
- 肿瘤登记上报
|
||||
|
||||
## 二、业务流程
|
||||
|
||||
```
|
||||
[手术/活检/穿刺] → 病理申请单
|
||||
↓
|
||||
[标本采集] ←→ [条码打印] ←→ [标本固定(10%福尔马林)]
|
||||
↓ (运送至病理科)
|
||||
[标本接收] ←→ [标本核对(条码扫码)]
|
||||
↓ (不合格退回)
|
||||
[取材描述] ←→ [组织处理(脱水/包埋)]
|
||||
↓
|
||||
[切片制作] ←→ [染色(HE/免疫组化/特殊染色)]
|
||||
↓
|
||||
[初诊阅片] ←→ [上级医师审核]
|
||||
↓ (疑难病例会诊)
|
||||
[病理会诊] ←→ [最终诊断]
|
||||
↓
|
||||
[报告编写] ←→ [三级审核]
|
||||
↓
|
||||
[报告签发] ←→ [临床科室领取]
|
||||
↓
|
||||
[肿瘤登记] ←→ [随访]
|
||||
```
|
||||
|
||||
## 三、数据模型
|
||||
|
||||
```sql
|
||||
-- 病理申请
|
||||
CREATE TABLE pathology_order (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
patient_id BIGINT NOT NULL,
|
||||
patient_name VARCHAR(50),
|
||||
encounter_id BIGINT,
|
||||
specimen_type VARCHAR(50), -- 手术标本/活检/穿刺/细胞学
|
||||
clinical_diagnosis TEXT,
|
||||
sample_site VARCHAR(100),
|
||||
urgency VARCHAR(20) DEFAULT 'NORMAL', -- URGENT/NORMAL
|
||||
order_status VARCHAR(20) DEFAULT 'PENDING',
|
||||
apply_doctor VARCHAR(64),
|
||||
apply_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 病理标本
|
||||
CREATE TABLE pathology_specimen (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
order_id BIGINT NOT NULL,
|
||||
barcode VARCHAR(100) NOT NULL,
|
||||
specimen_desc TEXT,
|
||||
collection_site VARCHAR(100),
|
||||
fixative VARCHAR(50),
|
||||
fixative_time TIMESTAMP,
|
||||
receive_time TIMESTAMP,
|
||||
receiver VARCHAR(64),
|
||||
is_qualified BOOLEAN DEFAULT TRUE,
|
||||
reject_reason TEXT,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 病理处理
|
||||
CREATE TABLE pathology_process (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
specimen_id BIGINT NOT NULL,
|
||||
process_type VARCHAR(30), -- 取材/脱水/包埋/切片/染色/免疫组化
|
||||
process_desc TEXT,
|
||||
operator VARCHAR(64),
|
||||
operate_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 病理诊断
|
||||
CREATE TABLE pathology_diagnosis (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
order_id BIGINT NOT NULL,
|
||||
specimen_id BIGINT,
|
||||
diagnosis_type VARCHAR(30), -- 初诊/复诊/会诊/最终
|
||||
diagnosis_result TEXT,
|
||||
immunostain_result TEXT,
|
||||
doctor_name VARCHAR(64),
|
||||
doctor_title VARCHAR(20),
|
||||
diagnose_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 病理报告
|
||||
CREATE TABLE pathology_report (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
order_id BIGINT NOT NULL,
|
||||
patient_id BIGINT,
|
||||
specimen_desc TEXT,
|
||||
macroscopic_desc TEXT, -- 肉眼所见
|
||||
microscopic_desc TEXT, -- 镜下所见
|
||||
diagnosis_result TEXT, -- 病理诊断
|
||||
suggestion TEXT,
|
||||
report_doctor VARCHAR(64),
|
||||
report_time TIMESTAMP,
|
||||
audit_doctor VARCHAR(64),
|
||||
audit_time TIMESTAMP,
|
||||
final_doctor VARCHAR(64),
|
||||
final_time TIMESTAMP,
|
||||
status VARCHAR(20) DEFAULT 'DRAFT',
|
||||
tenant_id BIGINT DEFAULT 0,
|
||||
is_deleted INT NOT NULL DEFAULT 0,
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
## 四、接口设计
|
||||
|
||||
| API | 方法 | 说明 |
|
||||
|-----|------|------|
|
||||
| /pathology/order/page | GET | 病理申请列表 |
|
||||
| /pathology/order/add | POST | 新建病理申请 |
|
||||
| /pathology/specimen/scan | POST | 标本扫码接收 |
|
||||
| /pathology/specimen/reject/{id} | PUT | 标本拒收 |
|
||||
| /pathology/process/record | POST | 记录处理过程 |
|
||||
| /pathology/diagnosis/add | POST | 录入诊断 |
|
||||
| /pathology/report/page | GET | 病理报告列表 |
|
||||
| /pathology/report/add | POST | 新建报告 |
|
||||
| /pathology/report/audit/{id} | PUT | 审核报告 |
|
||||
| /pathology/stats | GET | 病理统计(标本数/诊断分布/周转时间) |
|
||||
@@ -1,5 +1,14 @@
|
||||
# Bug #439 分析报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 439
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Bug描述
|
||||
领用出库:选择领用药品后"总库存数量"列数据未显示
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Bug #462 分析报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 462
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Bug 描述
|
||||
[目录管理-诊疗目录] 编辑弹窗中"所需标本"下拉框数据加载失败,显示为"无数据"
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Bug #494 分析报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 494
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Bug 描述
|
||||
住院医生工作站-检查申请:"申请单名称"字段显示为通用名称"检查申请单",未展示具体检查项目名称。
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Bug #498 分析报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 498
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Bug 描述
|
||||
【住院医生工作站-检查申请】检查申请列表操作项过于单一,缺失修改/作废/打印/看报告等核心临床操作
|
||||
|
||||
15
MD/bugs/BUG_503_ANALYSIS.md
Normal file
15
MD/bugs/BUG_503_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #503 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 503
|
||||
- 标题: 【住院发退药】发药明细与发药汇总单数据触发时机不一致,存在业务脱节风险
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: guanyu
|
||||
15
MD/bugs/BUG_606_ANALYSIS.md
Normal file
15
MD/bugs/BUG_606_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #606 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 606
|
||||
- 标题: 门诊术中安排-医嘱】预览列表字段显示及逻辑异常(涉及单位、频次、执行时间)
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
15
MD/bugs/BUG_611_ANALYSIS.md
Normal file
15
MD/bugs/BUG_611_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #611 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 611
|
||||
- 标题: 【住院护士站-住院记账】“补费”弹窗确认按钮位置过深且未固定,建议将核心操作与汇总信息上移
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
15
MD/bugs/BUG_613_ANALYSIS.md
Normal file
15
MD/bugs/BUG_613_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #613 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 613
|
||||
- 标题: 【医嘱校对/住院医生工作站】医嘱“退回”流程缺失反馈机制:护士端退回无原因录入,医生端缺失原因显示
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
15
MD/bugs/BUG_616_ANALYSIS.md
Normal file
15
MD/bugs/BUG_616_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #616 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 616
|
||||
- 标题: 【住院医生工作站-临床医嘱】医嘱录入频次下拉框缺少英文缩写(字典键值)显示,不符合临床书写习惯
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
15
MD/bugs/BUG_617_ANALYSIS.md
Normal file
15
MD/bugs/BUG_617_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #617 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 617
|
||||
- 标题: [住院登记] “费用性质”字段保存逻辑错误(登记选择医保保存后变为全自费)
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: guanyu
|
||||
@@ -1,5 +1,14 @@
|
||||
# Bug #632 修复报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 632
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #632 测试完成,请验收。提出人: chenxj。
|
||||
- **严重程度**: 待查
|
||||
@@ -1,5 +1,14 @@
|
||||
# Bug #634 修复报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 634
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 基本信息
|
||||
- **标题**: [系统维护-检验套餐] 保存套餐失败,报 JSON 反序列化日期解析异常 (LocalDateTime)
|
||||
- **严重程度**: 致命
|
||||
15
MD/bugs/BUG_637_ANALYSIS.md
Normal file
15
MD/bugs/BUG_637_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #637 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 637
|
||||
- 标题: [住院护士站-体温单] 选中患者后系统上下文不同步,导致无法触发“变更体温单”录入弹窗
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
15
MD/bugs/BUG_638_ANALYSIS.md
Normal file
15
MD/bugs/BUG_638_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #638 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 638
|
||||
- 标题: [分诊排队管理] 智能候选池数据过滤失效,导致跨科室患者数据错误显示
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: guanyu
|
||||
15
MD/bugs/BUG_643_ANALYSIS.md
Normal file
15
MD/bugs/BUG_643_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #643 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 643
|
||||
- 标题: [门诊手术安排-术中医嘱] 删除已生成的临时医嘱提示成功,但点击刷新后医嘱重新出现
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
41
MD/bugs/BUG_644_ANALYSIS.md
Normal file
41
MD/bugs/BUG_644_ANALYSIS.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Bug #644 修复报告
|
||||
|
||||
> **文档类型**: Bug修复
|
||||
> **适用范围**: Bug 644
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-06
|
||||
> **最后更新**: 2026-06-06
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #644 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 00:24:37 ~ 00:32:06
|
||||
- **修复耗时**: 347.9s
|
||||
- **Commit**: `bd50c58dd`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
## 变更摘要
|
||||
|
||||
### 根因分析
|
||||
|
||||
**Issue 1 — 状态不同步**:`getInpatientAdvicePage` 方法中,执行记录(`exePerformRecordList`)的计算被包裹在 `if (exeStatus != null)` 条件内,只有在"医嘱执行"页签(传 `exeStatus` 参数)时才计算。"已校对"页签不传 `exeStatus`,因此执行记录永远不会被
|
||||
|
||||
## 修复文件
|
||||
.../impl/AdviceProcessAppServiceImpl.java | 89 +++++++++++++++-------
|
||||
.../dto/InpatientAdviceDto.java | 3 +
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 00:24:37 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 00:25:39 | guanyu | fix_retry | ❓ | 0.0s |
|
||||
| 00:32:06 | guanyu | fix_done | ✅ | 347.9s |
|
||||
| 00:32:09 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 00:32:11 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
34
MD/bugs/BUG_648_ANALYSIS.md
Normal file
34
MD/bugs/BUG_648_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #648 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:56:11
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 648
|
||||
- **标题**: 【住院医生工作站】临床医嘱下的手术按钮点击,不会出现报卡
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd67-df3d-7c71-bf6d-30f90a80ea57"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_651_ANALYSIS.md
Normal file
34
MD/bugs/BUG_651_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #651 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:54:57
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 651
|
||||
- **标题**: [住院医生站-手术申请] 无法检索出已启用的手术项目(如:“血管闭合切割刀”)
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd66-bbbc-7e51-baa6-21fce84ded9d"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_653_ANALYSIS.md
Normal file
34
MD/bugs/BUG_653_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #653 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:53:31
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 653
|
||||
- **标题**: [住院医生站-临床医嘱] 医嘱录入界面“给药途径”下拉列表及显示值包含冗余数字编码
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd65-58c3-79b2-a2ee-dbce445061dc"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_655_ANALYSIS.md
Normal file
34
MD/bugs/BUG_655_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #655 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:52:03
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 655
|
||||
- **标题**: [门诊医生站-检查开单] 检查申请保存后总金额结算异常,未累加“检查方法”附加金额
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd64-16c7-7581-9c6d-677e3ea9d50e"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_656_ANALYSIS.md
Normal file
34
MD/bugs/BUG_656_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #656 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:50:34
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 656
|
||||
- **标题**: [门诊医生站-检查申请] 单击已保存记录回显异常:自动跳转页签错误且“检查方法”数据未回显
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd62-b87a-7a20-9007-a4f7f3d0221f"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_657_ANALYSIS.md
Normal file
34
MD/bugs/BUG_657_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #657 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:48:58
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 657
|
||||
- **标题**: [门诊医生站-检查申请] “检查明细”页签数据展示异常:检查方法未回显且单价/金额计算错误
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd61-420f-7202-a12d-5658faf3a782"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_659_ANALYSIS.md
Normal file
34
MD/bugs/BUG_659_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #659 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:47:35
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 659
|
||||
- **标题**: 【住院管理-住院护士站】选择了患者还提示叫你选择患者
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd5f-ee1b-7cf3-a1e1-02052bc2e994"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_660_ANALYSIS.md
Normal file
34
MD/bugs/BUG_660_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #660 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:46:08
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 660
|
||||
- **标题**: 【分诊排队管理-智能分诊排队管理】加入队列失败
|
||||
- **模块**: 分诊排队管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd5e-9721-70a3-840f-c408e2899450"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_661_ANALYSIS.md
Normal file
34
MD/bugs/BUG_661_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #661 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:45:14
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 661
|
||||
- **标题**: 【住院管理-住院护士站】选择一名患者进行换床会出现报卡且报错
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd5d-c771-78a0-ab9a-d6761a97bfbc"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_662_ANALYSIS.md
Normal file
34
MD/bugs/BUG_662_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #662 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:44:13
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 662
|
||||
- **标题**: 【住院管理-住院护士站】在医嘱校对中的已停止字段没有对应的已停止按钮
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd5c-d876-7242-9774-ec5a26b7610c"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_664_ANALYSIS.md
Normal file
34
MD/bugs/BUG_664_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #664 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:43:05
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 664
|
||||
- **标题**: 【住院管理-住院护士站】医嘱执行中的取消执行无法点击
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd5b-cf04-7930-9cbf-a075148435d6"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_665_ANALYSIS.md
Normal file
34
MD/bugs/BUG_665_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #665 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:41:42
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 665
|
||||
- **标题**: 【收费工作站-门诊挂号】当日已挂号,界面加载卡死
|
||||
- **模块**: 收费工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd5a-999f-7131-9cff-376ffdbca994"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_666_ANALYSIS.md
Normal file
34
MD/bugs/BUG_666_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #666 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:40:37
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 666
|
||||
- **标题**: [门诊-发药管理] 药品已完成收费但“门诊发药”模块无法检索到患者信息,导致无法实现发药逻辑
|
||||
- **模块**: 门诊药房管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd59-9d9a-7033-860f-1f9bb39e8335"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_667_ANALYSIS.md
Normal file
34
MD/bugs/BUG_667_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #667 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:39:11
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 667
|
||||
- **标题**: [门诊收费-业务流程] 医嘱未挂钩【完诊】状态,医生未终结门诊即可提前在收费端结算,存在漏开/错开费用风险
|
||||
- **模块**: 门诊收费管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd58-3b49-78a0-bc30-4aa9e6a0867c"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_668_ANALYSIS.md
Normal file
34
MD/bugs/BUG_668_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #668 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:37:37
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 668
|
||||
- **标题**: [门诊医生站-中医处方] 点击【签发】按钮系统崩溃,提示“element cannot be mapped to a null key”
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd56-cdbd-7993-b9ec-de7f1c2cf84b"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_669_ANALYSIS.md
Normal file
34
MD/bugs/BUG_669_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #669 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:36:00
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 669
|
||||
- **标题**: [门诊医生站-中医处方] 中医处方头信息(费用性质、频次、天数、付数等)在保存并重新进入后回显为空
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd55-51d4-7a52-bc60-168bba962fff"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_670_ANALYSIS.md
Normal file
34
MD/bugs/BUG_670_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #670 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:34:28
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 670
|
||||
- **标题**: [门诊医生站-中医处方] “煎药方式”与“特殊煎法”下拉框数据为空,未能调用字典管理数据
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd53-fbb0-7cb1-a270-c561f87c0d0a"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_671_ANALYSIS.md
Normal file
34
MD/bugs/BUG_671_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #671 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:32:13
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 671
|
||||
- **标题**: [门诊医生站-医嘱] 列表字段定义错误:“退回原因”应变更为“备注”并正确回显录入内容
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd51-db08-7f40-9733-ba8443073467"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_672_ANALYSIS.md
Normal file
34
MD/bugs/BUG_672_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #672 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:30:04
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 672
|
||||
- **标题**: [门诊医生站-诊断] 新增中医诊断保存后,列表中“发病日期”、“诊断日期”和“医生”字段显示为空
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd4f-e1ab-7c50-9afd-f9606ce9d862"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_673_ANALYSIS.md
Normal file
34
MD/bugs/BUG_673_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #673 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:28:21
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 673
|
||||
- **标题**: 【收费工作站-门诊挂号】挂号列表排版错乱
|
||||
- **模块**: 收费工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd4e-6113-73a0-804e-fe1a2937d45f"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_674_ANALYSIS.md
Normal file
34
MD/bugs/BUG_674_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #674 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:27:13
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 674
|
||||
- **标题**: 【住院管理-住院医生工作站】在临床医嘱的签发失效
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd4d-58dc-7ac0-8588-e329ed1d71e3"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_675_ANALYSIS.md
Normal file
34
MD/bugs/BUG_675_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #675 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:25:50
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 675
|
||||
- **标题**: [门诊医生站-检查申请] “检查方法”字段缺少必填标识却执行了强校验逻辑
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd4c-154d-7fc3-bfe2-8d1c1233ae5c"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_676_ANALYSIS.md
Normal file
34
MD/bugs/BUG_676_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #676 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:24:48
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 676
|
||||
- **标题**: [住院医生站-临床医嘱] 勾选“待签发”临时医嘱后,点击【签发】按钮无响应
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd4b-0f4d-7073-8f70-c6d403872519"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_678_ANALYSIS.md
Normal file
34
MD/bugs/BUG_678_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #678 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:23:07
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 678
|
||||
- **标题**: 【住院医生工作站】诊断录入中的诊断类别无法选择数据
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd49-8574-7243-a5a0-60adcf729dcf"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_679_ANALYSIS.md
Normal file
34
MD/bugs/BUG_679_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #679 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:21:52
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 679
|
||||
- **标题**: [住院医生站-临床医嘱] 新增项目点击“确定”后编辑面板不自动收起,且“取消”按钮失效
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd48-7364-7fe1-8c03-5c6411c0ba39"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_680_ANALYSIS.md
Normal file
34
MD/bugs/BUG_680_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #680 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:20:02
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 680
|
||||
- **标题**: [住院医生站-临床医嘱] 勾选“待签发”临时医嘱后点击【删除】按钮无响应
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd46-b544-7ab3-b1e9-18fa9b9bf8f5"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_681_ANALYSIS.md
Normal file
34
MD/bugs/BUG_681_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #681 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:18:56
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 681
|
||||
- **标题**: [门诊收费] 点击“已收费”列表患者报错“encounterId 为 undefined”,导致无法查看收费详情
|
||||
- **模块**: 门诊收费管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd45-c39e-7cd3-9c4c-704b5dd61808"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_682_ANALYSIS.md
Normal file
34
MD/bugs/BUG_682_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #682 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:17:56
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 682
|
||||
- **标题**: 【住院医生工作站】历史医嘱的报卡的布局有些字段被覆盖
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd44-ccf6-7e70-bf1e-d8b34b3047b2"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_683_ANALYSIS.md
Normal file
34
MD/bugs/BUG_683_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #683 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:16:25
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 683
|
||||
- **标题**: 【门诊医生工作站】无法选择医嘱项目
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd43-6142-7222-bb99-c29ab0ce42de"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_684_ANALYSIS.md
Normal file
34
MD/bugs/BUG_684_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #684 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:14:54
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 684
|
||||
- **标题**: 【手术管理】手术状态下拉框有重复
|
||||
- **模块**: 手术麻醉管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd42-029a-7491-9473-ef085ac9e5b6"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_685_ANALYSIS.md
Normal file
34
MD/bugs/BUG_685_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #685 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:13:19
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 685
|
||||
- **标题**: 【住院护士站】住院护士站报错404页面打不开
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd40-8cfb-7290-bcb6-d7550ebb4239"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_686_ANALYSIS.md
Normal file
34
MD/bugs/BUG_686_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #686 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:12:25
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 686
|
||||
- **标题**: 【门诊管理-门诊划价】项目的排版错乱字段重叠
|
||||
- **模块**: 门诊收费管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd3f-b780-7ed0-8698-4e67181f0d55"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_687_ANALYSIS.md
Normal file
34
MD/bugs/BUG_687_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #687 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:10:24
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 687
|
||||
- **标题**: 【库房管理-统计管理】库房明细记录的操作列表下停供报错
|
||||
- **模块**: 库房管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd3d-e4f7-7723-8b8f-ef72d5b3805b"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_688_ANALYSIS.md
Normal file
34
MD/bugs/BUG_688_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #688 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:09:19
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 688
|
||||
- **标题**: [住院发退药-发药明细单] 患者列表布局挤压导致内容显示不全,且多条件组合检索(患者信息/发药状态/药品分类)失效
|
||||
- **模块**: 住院药房管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd3c-f5ef-7fe3-b95b-7e2f0355ea42"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_689_ANALYSIS.md
Normal file
34
MD/bugs/BUG_689_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #689 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:08:01
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 689
|
||||
- **标题**: [住院管理-住院发退药] 发药汇总单界面布局被挤压、发放状态文案不符及右侧详情联动无数据
|
||||
- **模块**: 住院药房管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd3b-b577-7670-945c-a995871568c1"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_691_ANALYSIS.md
Normal file
34
MD/bugs/BUG_691_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #691 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:06:34
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 691
|
||||
- **标题**: [门诊挂号-预约签到] 确认弹窗患者姓名显示为undefined,且提交签到报错缺失organizationId参数
|
||||
- **模块**: 建档挂号管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd3a-5d3f-7bf2-9279-a062ef4ff8fc"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_693_ANALYSIS.md
Normal file
34
MD/bugs/BUG_693_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #693 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:05:00
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 693
|
||||
- **标题**: [门诊医生站-诊断录入] 诊断选择弹窗中点击诊断后,界面无法回填且未赋值
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd38-ecfe-7432-b7e0-040657841dc1"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_694_ANALYSIS.md
Normal file
34
MD/bugs/BUG_694_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #694 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:02:47
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 694
|
||||
- **标题**: 【住院医生工作站】不同的权限登录之前的标签后面的权限也可以打开
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd36-e742-7c22-a18d-c5c27bc2a7f7"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_695_ANALYSIS.md
Normal file
34
MD/bugs/BUG_695_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #695 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:01:29
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 695
|
||||
- **标题**: 【住院医生工作站】将一条已签发的医嘱进行停嘱,显示成功但是状态还是已签发
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd35-b960-7cf2-858d-ed17672599d7"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
34
MD/bugs/BUG_696_ANALYSIS.md
Normal file
34
MD/bugs/BUG_696_ANALYSIS.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Bug #696 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 03:00:12
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 696
|
||||
- **标题**: [收费工作站-住院登记] 优化姓名搜索框,增设“身份证号”与“申请时间段”检索条件,及列表字段补充显示
|
||||
- **模块**: 住院登记管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
{"type":"thread.started","thread_id":"019ebd34-8727-7480-b6b5-c61fdeb2c987"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 2/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 3/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 4/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"Reconnecting... 5/5 (stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses))"}
|
||||
{"type":"error","message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}
|
||||
{"type":"turn.failed","error":{"message":"stream disconnected before completion: error sending request for url (http://127.0.0.1:8788/v1/responses)"}}
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
194
MD/bugs/BUG_697_ANALYSIS.md
Normal file
194
MD/bugs/BUG_697_ANALYSIS.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# Bug #697 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:58:52
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 697
|
||||
- **标题**: [门诊管理-门诊挂号] 检索并选择患者后,信息未回填赋值至挂号表单,导致挂号阻断
|
||||
- **模块**: 建档挂号管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have a comprehensive understanding of the bug. Let me produce my analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
### 禅道原文引用
|
||||
|
||||
**Bug 标题**:[门诊管理-门诊挂号] 检索并选择患者后,信息未回填赋值至挂号表单,导致挂号阻断
|
||||
|
||||
**重现步骤**:
|
||||
> 【步骤】登录账号 admin/admin123,进入【门诊管理】→【门诊挂号】。在"患者身份信息"输入框中输入关键字"随子赫"(或就诊卡号 2123123)。系统自动弹出模糊匹配的待选患者悬浮列表。用鼠标左键双击或单击选中列表中的患者"随子赫"这一行数据。观察挂号主界面各患者信息输入框(姓名、性别、年龄、就诊卡号、证件号、电话等)的接收状态。
|
||||
|
||||
**期望结果**:
|
||||
> 选中列表中的患者后,该患者的所有基本信息(包括但不限于:姓名、性别、年龄、就诊卡号、证件号、电话等)应自动回填并正确渲染显示在挂号主界面的对应表单中。
|
||||
|
||||
**实际结果**:
|
||||
> 选中下拉列表后该列表消失,但主界面的姓名、性别、年龄、就诊卡号、证件号、电话等所有患者基本信息字段依然为空,未回显任何数据,导致整个挂号业务无法继续保存。
|
||||
|
||||
### 附图分析关键信息
|
||||
- 截图中红色标注:**"点击选中患者,患者信息未实现赋值至主界面,实现不了挂号业务"**
|
||||
- 截图中红色标注:**"未赋值"**(第二个截图中整个挂号表单区域为空白)
|
||||
- 患者下拉列表正常显示,数据完整(姓名、就诊卡号、性别、证件号、联系电话、年龄),但选中后主表单所有字段为空
|
||||
|
||||
### 综合总结
|
||||
用户在门诊挂号页面搜索患者后,下拉列表能正常弹出并显示匹配结果。但点击选中某一行后,**列表关闭了,主表单的姓名、性别、年龄、就诊卡号、证件号、电话等字段全部为空**,挂号流程被完全阻断。这是一个典型的**前端数据回填事件链断裂**问题——选中事件触发了列表关闭,但回填逻辑未成功执行。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
### 根因:el-popover `trigger="manual"` + input `@blur` 导致事件链断裂
|
||||
|
||||
**完整事件链分析:**
|
||||
|
||||
1. 用户在搜索输入框输入关键字 → `handleFocus()` 显示 popover → `patientList` 组件通过 watcher 触发 `getList()` → API 返回患者列表正常 ✅
|
||||
2. 用户**点击** popover 中的某一行 →
|
||||
3. **关键断裂点**:点击 popover 内部内容时,浏览器先处理 input 的 **blur 事件** → `handleBlur()` 立即执行 `showPopover.value = false`
|
||||
4. Element Plus 的 `el-popover` 使用 `trigger="manual"` 模式,当 `:visible` 变为 `false` 时,**popover 内容从 DOM 中移除/隐藏**
|
||||
5. 由于 popover 内容被移除,vxe-table 的 `@cell-click="clickRow"` 事件**来不及触发**或触发时 DOM 已不可用
|
||||
6. `clickRow` → `emit("selsectPatient", params.row)` **未被触发**
|
||||
7. 父组件的 `selsectPatient(row)` **未被调用** → 表单字段未赋值
|
||||
|
||||
**事件时序图:**
|
||||
```
|
||||
mousedown (table row)
|
||||
→ input blur fires (handleBlur)
|
||||
→ showPopover = false
|
||||
→ popover content removed from DOM
|
||||
→ cell-click fires on vxe-table (TOO LATE, DOM gone)
|
||||
```
|
||||
|
||||
**涉及文件:**
|
||||
|
||||
| 文件 | 作用 | 问题点 |
|
||||
|------|------|--------|
|
||||
| `healthlink-his-ui/src/views/charge/outpatientregistration/index.vue` (L116-137) | el-popover + input 模板 | `@blur="handleBlur"` 立即关闭 popover |
|
||||
| `healthlink-his-ui/src/views/charge/outpatientregistration/index.vue` (L1996-1998) | `handleBlur` 函数 | 无延迟,立即 `showPopover = false` |
|
||||
| `healthlink-his-ui/src/views/charge/outpatientregistration/index.vue` (L2228-2241) | `selsectPatient` 函数 | 逻辑正确但未被触发 |
|
||||
| `healthlink-his-ui/src/views/charge/outpatientregistration/components/patientList.vue` (L96) | `@cell-click="clickRow"` | click 事件未能触发 |
|
||||
| `healthlink-his-ui/src/views/charge/outpatientregistration/components/patientList.vue` (L54) | `@mousedown.prevent` | 绑在组件上,未阻止 input blur |
|
||||
|
||||
**为什么 `@mousedown.prevent` 没有阻止 blur?**
|
||||
|
||||
`@mousedown.prevent` 是 Vue 事件修饰符,绑定在 `<patientList>` 组件上,会附加到组件的根元素 `<div>` 上。但 `mousedown` 事件的传播方向是**从目标元素向上冒泡**:
|
||||
- 表格单元格 `mousedown` → 表格 `mousedown` → `<div>` 的 Vue mousedown(`preventDefault` 执行)
|
||||
- 但 input 的 `blur` 是由浏览器的**焦点管理机制**触发的,不受 `preventDefault` 的完全控制
|
||||
- 特别是当 el-popover 使用 Teleport 将内容渲染到 `document.body` 时,popover 内容的 mousedown 事件可能不会冒泡到触发元素的父容器
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 修复策略:在 popover 内容区域拦截 mousedown,阻止 input 失焦
|
||||
|
||||
**修改文件**:`healthlink-his-ui/src/views/charge/outpatientregistration/index.vue`
|
||||
|
||||
**修改内容**:
|
||||
|
||||
#### 修改 1:在 popover 内容区域添加 mousedown 阻止事件(约 L116-137)
|
||||
|
||||
将模板中的 popover 内容区域修改为:
|
||||
|
||||
```vue
|
||||
<!-- 修改前 -->
|
||||
<el-popover
|
||||
:popper-style="{ padding: '0' }"
|
||||
placement="bottom-start"
|
||||
:visible="showPopover"
|
||||
trigger="manual"
|
||||
:width="1200"
|
||||
>
|
||||
<patientList
|
||||
:searchkey="patientSearchKey"
|
||||
@selsect-patient="selsectPatient"
|
||||
@mousedown.prevent
|
||||
/>
|
||||
...
|
||||
</el-popover>
|
||||
|
||||
<!-- 修改后 -->
|
||||
<el-popover
|
||||
:popper-style="{ padding: '0' }"
|
||||
placement="bottom-start"
|
||||
:visible="showPopover"
|
||||
trigger="manual"
|
||||
:width="1200"
|
||||
>
|
||||
<div @mousedown.prevent>
|
||||
<patientList
|
||||
:searchkey="patientSearchKey"
|
||||
@selsect-patient="selsectPatient"
|
||||
/>
|
||||
</div>
|
||||
...
|
||||
</el-popover>
|
||||
```
|
||||
|
||||
关键变化:
|
||||
- `@mousedown.prevent` 从 `<patientList>` 组件标签移到**包裹 popover 内容的 `<div>`** 上
|
||||
- 确保 popover 内任何位置的 mousedown 都会被阻止默认行为,从而**阻止 input 失焦**
|
||||
- input 不失焦 → popover 不关闭 → `cell-click` 正常触发 → `selsectPatient` 正常执行 → 表单正确赋值
|
||||
|
||||
#### 修改 2:添加防御性保障 — 优化 `handleBlur`(约 L1996-1998)
|
||||
|
||||
```javascript
|
||||
// 修改前
|
||||
function handleBlur() {
|
||||
showPopover.value = false;
|
||||
}
|
||||
|
||||
// 修改后
|
||||
function handleBlur() {
|
||||
setTimeout(() => {
|
||||
showPopover.value = false;
|
||||
}, 200);
|
||||
}
|
||||
```
|
||||
|
||||
双重保障:即使 `@mousedown.prevent` 在某些边界情况下未完全生效,200ms 延迟也足以让 `cell-click` 事件完成、`selsectPatient` 执行,之后再关闭 popover。
|
||||
|
||||
#### 修改 3:(可选)增加键盘关闭支持
|
||||
|
||||
由于 `@mousedown.prevent` 阻止了焦点转移,用户需要其他方式关闭 popover:
|
||||
|
||||
```javascript
|
||||
// 在 onMounted 中添加
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape' && showPopover.value) {
|
||||
showPopover.value = false;
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### 修改清单
|
||||
|
||||
| # | 文件 | 行号(约) | 修改内容 |
|
||||
|---|------|-----------|---------|
|
||||
| 1 | `outpatientregistration/index.vue` | L116-137 | popover 内容包裹 `<div @mousedown.prevent>` |
|
||||
| 2 | `outpatientregistration/index.vue` | L1996-1998 | `handleBlur` 增加 200ms setTimeout |
|
||||
| 3 | `outpatientregistration/index.vue` | L2228-2241 | `selsectPatient` 函数逻辑无需修改(已正确) |
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: zhaoyun
|
||||
|
||||
**REASON**: 纯前端 Bug——el-popover 事件链断裂导致患者信息回填失败,涉及 Vue 模板事件绑定和 el-popover 组件交互逻辑,属于前端 UI 修复范畴,无需数据库变更,不需要后端参与。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
25
MD/bugs/BUG_698_ANALYSIS.md
Normal file
25
MD/bugs/BUG_698_ANALYSIS.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Bug #698 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-11 16:51:39
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 698
|
||||
- **标题**: [收费工作站-住院登记-已登记入院] 检索维度单一,且关键归档信息缺失(需增设检索条件与补充列表字段展示)
|
||||
- **模块**: 住院登记管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
(LLM 失败,关键词分析)
|
||||
Bug: [收费工作站-住院登记-已登记入院] 检索维度单一,且关键归档信息缺失(需增设检索条件与补充列表字段展示)
|
||||
模块: 住院登记管理
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **修复 Agent**: zhaoyun
|
||||
- **原因**: 关键词: 前端
|
||||
139
MD/bugs/BUG_712_ANALYSIS.md
Normal file
139
MD/bugs/BUG_712_ANALYSIS.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# Bug #712 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:46:37
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 712
|
||||
- **标题**: 【收费工作站-预交金管理】“预交金管理”页面缺失展示“支付方式”列及患者“床号”、“费用类型”
|
||||
- **模块**: 住院登记管理
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
分析完成。以下是完整的 Bug #712 分析报告。
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**Bug 标题**:【收费工作站-预交金管理】"预交金管理"页面缺失展示"支付方式"列及患者"床号"、"费用类型"
|
||||
|
||||
**重现步骤**:
|
||||
1. 登录系统,进入"收费工作站" → "预交金管理"页面
|
||||
2. 输入住院号查询关联患者(如"三太子")
|
||||
3. 检查患者基本信息卡片及下方收支明细列表
|
||||
|
||||
**期望结果**:
|
||||
1. 患者卡片区增加展示"床号"(如:012床)与"费用类型"(医保类型,如:职工医保)
|
||||
2. 明细列表区在"票据类型"与"收款时间"之间新增"支付方式"字段列
|
||||
|
||||
**附图分析关键信息**:
|
||||
- 图2492/2493 显示患者卡片区域"在院科室/病区: 呼吸内科病房/呼吸内科一区",**没有独立展示床号和费用类型**
|
||||
- 收支明细列表列头为:序号、收据号、金额、票据类型、收款时间、收款员 —— **缺少"支付方式"列**
|
||||
- 截图中有红色标注:"增加患者床号和费用类型"、"增加支付方式字段列"
|
||||
|
||||
**综合总结**:用户在预交金管理页面查询住院患者后,患者信息卡片只显示了科室/病区,无法看到该患者的具体床号和医保费用类型;下方流水明细列表缺少支付方式列,无法知道每笔交易的支付渠道(现金/支付宝等)。这两个信息对打印收据和财务核对都是必需的。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
经过全链路 6 环分析,问题分布在前端和后端两个层面:
|
||||
|
||||
### 缺陷 1:费用类型(费用类型/医保类型)缺失
|
||||
|
||||
**前端** `index.vue:88-110`:患者信息卡片区域没有展示"费用类型"字段。
|
||||
**后端** `AdvancePaymentInfoDto.java`:DTO 缺少 `ybClassText`(医保类别文本)字段。
|
||||
**后端** `AdvancePaymentManageAppMapper.xml`:`getAdvancePaymentInfo` SQL 查询未 SELECT `ae.yb_class_text`。
|
||||
**数据库**:`adm_encounter` 表已有 `yb_class_text` 字段(保险类型文本,如"职工医保")。
|
||||
|
||||
### 缺陷 2:床号显示不突出
|
||||
|
||||
**后端** SQL 已查询 `alb.name AS bed_name`,DTO 已有 `bedName` 字段。
|
||||
**前端** `index.vue:115-120`:床号被拼在"在院科室/病区"字符串中(`wardName + houseName + bedName`),没有独立展示为"床号:012床"。
|
||||
|
||||
### 缺陷 3:支付方式列缺失
|
||||
|
||||
**前端** `index.vue:147`:`<vxe-column field="payWay" title="支付方式" />` 被注释掉了。
|
||||
**后端** `AdvancePaymentFlowRecordDto.java`:DTO 缺少支付方式字段(`payEnum` / `payWay`)。
|
||||
**后端** `AdvancePaymentManageAppMapper.xml:90-99`:`getAdvancePaymentFlowRecordList` SQL 只查了 `fin_payment_reconciliation` 主表,**未 JOIN** `fin_payment_rec_detail` 子表(`pay_enum` 字段在子表中)。
|
||||
**数据库**:`fin_payment_rec_detail` 表有 `pay_enum`(支付类型编码,如现金/支付宝/微信)。
|
||||
|
||||
**涉及文件清单**:
|
||||
|
||||
| 文件 | 修改内容 |
|
||||
|------|---------|
|
||||
| `AdvancePaymentInfoDto.java` | 新增 `ybClassText` 字段 |
|
||||
| `AdvancePaymentManageAppMapper.xml` | `getAdvancePaymentInfo` SQL 加 `ae.yb_class_text` |
|
||||
| `AdvancePaymentFlowRecordDto.java` | 新增 `payEnum` + `payWay` 字段 |
|
||||
| `AdvancePaymentManageAppMapper.xml` | `getAdvancePaymentFlowRecordList` SQL JOIN `fin_payment_rec_detail`,取 `pay_enum` |
|
||||
| `AdvancePaymentManageAppServiceImpl.java` | 流水记录返回后增加 `payWay` 枚举映射 |
|
||||
| `index.vue` | 卡片区域新增"床号"和"费用类型"展示;取消注释支付方式列 |
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### Step 1:后端 — DTO 新增字段
|
||||
|
||||
**`AdvancePaymentInfoDto.java`**:新增字段
|
||||
```java
|
||||
/** 费用类型(医保类型文本,如:职工医保) */
|
||||
private String ybClassText;
|
||||
```
|
||||
|
||||
**`AdvancePaymentFlowRecordDto.java`**:新增字段
|
||||
```java
|
||||
/** 支付方式编码 */
|
||||
private Integer payEnum;
|
||||
/** 支付方式文本(如:现金、支付宝) */
|
||||
private String payWay;
|
||||
```
|
||||
|
||||
### Step 2:后端 — Mapper XML 修改
|
||||
|
||||
**`AdvancePaymentManageAppMapper.xml`**:
|
||||
|
||||
1. `getAdvancePaymentInfo` 子查询中加 `ae.yb_class_text AS yb_class_text`
|
||||
2. `getAdvancePaymentFlowRecordList` SQL 加 JOIN `fin_payment_rec_detail`,取 `prd.pay_enum`
|
||||
|
||||
### Step 3:后端 — ServiceImpl 枚举映射
|
||||
|
||||
**`AdvancePaymentManageAppServiceImpl.java`**:
|
||||
|
||||
在 `getAdvancePaymentFlowRecord` 方法中增加支付方式枚举映射:
|
||||
```java
|
||||
e.setPayWay(EnumUtils.getInfoByValue(YbPayment.class, e.getPayEnum()));
|
||||
```
|
||||
|
||||
### Step 4:前端 — 页面字段补充
|
||||
|
||||
**`index.vue`**:
|
||||
1. 在"在院科室/病区"行下方(或同行),新增展示:
|
||||
- `床号: {{ patientInfo.bedName }}`(独立标签)
|
||||
- `费用类型: {{ patientInfo.ybClassText }}`
|
||||
2. 取消注释支付方式列,改为:
|
||||
```html
|
||||
<vxe-column field="payWay" title="支付方式" align="center" min-width="100" />
|
||||
```
|
||||
3. 插入位置:在 `paymentEnum_enumText`(票据类型)列之后、`operateTime`(收款时间)列之前
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: zhaoyun(赵云 — 前端开发)
|
||||
**REASON**: 本次修复核心在于前端页面展示(卡片字段补充 + 表格列取消注释),后端改动量较小(DTO 加 2 字段、SQL 加 2 列、Service 加 1 行映射),属于前后端联动的 UI 展示修复,赵云可一并处理前端和后端轻量改动。无需 DBA 审查(无建表/加字段迁移)。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
127
MD/bugs/BUG_714_ANALYSIS.md
Normal file
127
MD/bugs/BUG_714_ANALYSIS.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# Bug #714 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:42:58
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 714
|
||||
- **标题**: 【住院护士站-医嘱校对】住院护士站-医嘱核对界面:缺少“截止时间”过滤条件且默认单选未选中“全部”
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
分析完毕。以下是完整输出。
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**Bug 标题**:【住院护士站-医嘱校对】住院护士站-医嘱核对界面:缺少"截止时间"过滤条件且默认单选未选中"全部"
|
||||
|
||||
**重现步骤**:
|
||||
1. 登录系统,进入"住院护士站"菜单
|
||||
2. 点击进入"医嘱核对"页面,选中左侧"在科"列表中的某位患者
|
||||
3. 观察右侧查询条件区域(包含"未校对/已校对/已停止/已退回"四个标签页)
|
||||
|
||||
**结果**:
|
||||
1. 过滤条件中缺少"截止时间"时间控件,无法限制截止时间进行医嘱筛选
|
||||
2. 医嘱分类单选框默认未自动选中"全部"
|
||||
3. 切换到"已校对/已停止/已退回"标签页时,同样缺失截止时间字段
|
||||
|
||||
**期望**:
|
||||
1. 四个标签页均应增加"截止时间"查询条件
|
||||
2. "截止时间"默认显示为系统当前时间,且支持手动编辑/选择
|
||||
3. 页面初始化默认选中"全部"单项
|
||||
|
||||
**附图关键信息**:截图清晰显示查询条件区域仅有"医嘱分类"(全部/长期/临时)单选框和"查询"按钮,无截止时间DatePicker控件;且"全部"选项未处于选中状态。
|
||||
|
||||
**综合总结**:用户在住院护士站医嘱核对界面无法按时间节点批量筛选医嘱,因为查询区域缺少截止时间过滤条件。同时初始化时医嘱分类默认未选中"全部",不利于日常操作。这是一个典型的设计缺陷——查询条件不完整影响护士工作效率。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
经代码全链路追踪,Bug 涉及前端组件 + 后端 DTO + Service + Mapper 四层:
|
||||
|
||||
**前端层**(`medicalOrderProofread/components/prescriptionList.vue`):
|
||||
1. `<el-radio-group>` 中"全部"选项的 `:value` 原为 `null`(commit `376ddd46f` 中添加),导致 `type` 初始值为 `null`,UI 上无选项被选中
|
||||
2. 组件中完全没有 `<el-date-picker>` 日期选择控件,无法选择截止时间
|
||||
3. `handleGetPrescription()` 构造请求参数时未传递 `deadline` 字段
|
||||
|
||||
**后端 DTO 层**(`InpatientAdviceParam.java`):
|
||||
- `deadline` 字段已存在(在初始重构中引入),但此前未被 Service 层实际使用
|
||||
|
||||
**Service 层**(`AdviceProcessAppServiceImpl.java` → `getInpatientAdvicePage()`):
|
||||
- 未提取 `deadline` 参数,未在 `QueryWrapper` 中拼接时间范围条件
|
||||
|
||||
**Mapper 层**(`AdviceProcessAppMapper.xml`):
|
||||
- SQL 使用 `${ew.customSqlSegment}` 拼接条件,Service 未设置条件则 SQL 无截止时间过滤
|
||||
|
||||
**根因总结**:前端查询组件设计时遗漏了截止时间控件,且默认值设置不当;后端虽然 DTO 有字段但 Service 层未处理该参数,导致整条链路断裂。
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案(⚠️ 已在 `ca812421d` 中修复)
|
||||
|
||||
> **注意**:经过 git 历史追踪,此 Bug 的修复已作为 Bug #665 的附带修复在 commit `ca812421d` 中完成。以下是修复内容详解:
|
||||
|
||||
### 3.1 前端修复(`prescriptionList.vue`)
|
||||
|
||||
| 修改点 | 修改前 | 修改后 |
|
||||
|--------|--------|--------|
|
||||
| Radio 默认值 | `:value="null"` | `:value="0"` |
|
||||
| type 初始值 | `ref(null)` | `ref(0)` |
|
||||
| 截止时间控件 | 无 | 新增 `<el-date-picker>` (datetime类型) |
|
||||
| deadline 初始值 | 无 | `ref(formatDateStr(new Date(), 'YYYY-MM-DD') + ' 23:59:59')` |
|
||||
| 查询参数 | 无 deadline | `...(deadline.value ? { deadline: deadline.value } : {})` |
|
||||
| therapyEnum 条件 | `type.value != null` | `type.value !== 0`(仅非"全部"时传递) |
|
||||
|
||||
### 3.2 后端修复(`AdviceProcessAppServiceImpl.java` → `getInpatientAdvicePage()`)
|
||||
|
||||
新增代码逻辑:
|
||||
```java
|
||||
// 提取 deadline 手动处理
|
||||
String deadline = inpatientAdviceParam.getDeadline();
|
||||
inpatientAdviceParam.setDeadline(null);
|
||||
// ...
|
||||
// 手动拼接 deadline 条件,按医嘱截止时间筛选
|
||||
if (deadline != null && !deadline.isEmpty()) {
|
||||
LocalDateTime deadlineTime = LocalDateTime.parse(deadline,
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||
queryWrapper.le("end_time", deadlineTime); // ≤ 截止时间
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 四标签页覆盖机制
|
||||
|
||||
`index.vue` 中四个 tab 各创建独立的 `PrescriptionList` 实例,每个实例维护独立的 `type` 和 `deadline` ref。切换 tab 时通过 `provide/inject` + `ref` 调用目标 tab 组件的 `handleGetPrescription()`,四标签页均能独立使用截止时间过滤。
|
||||
|
||||
### 3.4 验证检查项
|
||||
|
||||
- [ ] 前端编译通过(`npm run build:dev`)
|
||||
- [ ] 后端编译通过(`mvn clean compile -DskipTests`)
|
||||
- [ ] "未校对" tab:截止时间默认为当日 23:59:59,可编辑
|
||||
- [ ] "全部" radio 默认选中,查询结果包含长期+临时
|
||||
- [ ] "已校对/已停止/已退回" tab 同样有截止时间控件
|
||||
- [ ] 修改截止时间后点"查询",结果正确过滤
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: zhaoyun(前端为主)+ guanyu(后端 Service 层配合)
|
||||
|
||||
**REASON**: Bug 涉及前端 UI 组件(DatePicker 控件新增 + Radio 默认值修正)占主要工作量,交赵云处理;后端 Service 层 deadline 条件拼接需关羽配合验证 SQL 正确性。**但此 Bug 已在 `ca812421d` commit 中修复完成**,若禅道状态仍为 active,建议直接关闭并更新禅道状态为"已解决"。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
235
MD/bugs/BUG_715_ANALYSIS.md
Normal file
235
MD/bugs/BUG_715_ANALYSIS.md
Normal file
@@ -0,0 +1,235 @@
|
||||
# Bug #715 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:38:26
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 715
|
||||
- **标题**: 【住院护士站-医嘱校对】医生已签发的“临时耗材医嘱”未同步至护士站“医嘱校对”界面
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have all the information needed. Let me write the comprehensive analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**禅道 Bug 标题**:【住院护士站-医嘱校对】医生已签发的"临时耗材医嘱"未同步至护士站"医嘱校对"界面
|
||||
|
||||
**重现步骤**:
|
||||
1. 医生端:进入"住院医生工作站",为患者刘潇凡开具并手动点击【签发】一条"临时"医嘱(如:一次性使用导尿包)
|
||||
2. 护士端:进入"住院护士站" > "医嘱校对"界面
|
||||
3. 在"未校对"标签页中,选中患者,点击【查询】
|
||||
|
||||
**期望结果**:系统应正确加载并显示已签发的临时耗材医嘱,以便护士进行核对操作。
|
||||
|
||||
**实际结果**:医嘱核对页面显示空白,提示"点击查询获取患者医嘱信息",无法查到已签发的临时耗材医嘱。
|
||||
|
||||
**附图关键信息**:
|
||||
- 截图1(医生端):显示患者刘潇凡有一条状态为"**已签发**"的临时医嘱"一次性使用导尿包",类别为"耗材",金额 38.00 元
|
||||
- 截图2(护士端):"医嘱校对 → 未校对"页面,患者已选中但右侧**内容区域完全空白**,仅显示"点击查询获取患者医嘱信息"
|
||||
|
||||
**综合总结**:医生签发的耗材医嘱(存储在 `wor_device_request` 表)在护士站医嘱校对页面无法查询到,因为该页面的 SQL 查询只包含了药品请求(`med_medication_request`)和服务请求(`wor_service_request`)两个 UNION 子查询,**完全缺失了耗材请求(`wor_device_request`)的第三个 UNION 子查询**。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
### 根因定位
|
||||
|
||||
**核心缺陷文件**:`healthlink-his-server/healthlink-his-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml`
|
||||
|
||||
`selectInpatientAdvicePage` 查询使用 UNION 组合三种医嘱类型,但只写了两个子查询:
|
||||
|
||||
| 序号 | 表名 | 医嘱类型 | 状态 |
|
||||
|------|------|---------|------|
|
||||
| ✅ 1 | `med_medication_request` | 药品医嘱 | 有 |
|
||||
| ✅ 2 | `wor_service_request` | 诊疗服务医嘱 | 有 |
|
||||
| ❌ 3 | `wor_device_request` | **耗材/器材医嘱** | **缺失** |
|
||||
|
||||
**对比证据**:住院医生站的 `DoctorStationAdviceAppMapper.xml`(行 674-732)和住院医生工作站的 `AdviceManageAppMapper.xml`(行 247-305)都正确包含了 `wor_device_request` 的 UNION 子查询,证明耗材医嘱是系统支持的医嘱类型。
|
||||
|
||||
### 签发流程差异
|
||||
|
||||
从 `AdviceManageAppServiceImpl.java`(行 842-845)可确认:
|
||||
- 药品/服务医嘱签发:状态保持 `DRAFT(1)` + 设置 `performer_check_id`
|
||||
- **耗材医嘱签发**:状态直接设为 `ACTIVE(2)`(不使用 `performer_check_id`)
|
||||
|
||||
### 涉及文件
|
||||
|
||||
| 文件 | 作用 |
|
||||
|------|------|
|
||||
| `AdviceProcessAppMapper.xml` | **需修改** — 缺少 `wor_device_request` UNION 子查询 |
|
||||
| `AdviceProcessAppServiceImpl.java` | **可能需微调** — `therapyEnum` 条件处理(设备医嘱的 `therapy_enum` 为 NULL) |
|
||||
| `InpatientAdviceDto.java` | DTO,已包含 `adviceTable` 字段,可区分医嘱来源表 |
|
||||
| `DeviceRequest.java` | 基础实体,注意:**没有** `performerCheckId` 字段 |
|
||||
| `CommonConstants.java:150` | 常量 `WOR_DEVICE_REQUEST = "wor_device_request"` 已定义 |
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### Step 1: 在 `AdviceProcessAppMapper.xml` 中添加第三个 UNION 子查询
|
||||
|
||||
在现有的 `wor_service_request` UNION 之后、`ORDER BY T1.status_enum )` 之前,添加 `wor_device_request` 的 UNION 子查询。需映射到 `InpatientAdviceDto` 的所有字段:
|
||||
|
||||
```xml
|
||||
UNION
|
||||
( SELECT DISTINCT T1.encounter_id,
|
||||
T1.tenant_id,
|
||||
#{worDeviceRequest} AS advice_table,
|
||||
T1.id AS request_id,
|
||||
T1.use_start_time AS start_time,
|
||||
T1.use_end_time AS end_time,
|
||||
T1.requester_id AS requester_id,
|
||||
T1.create_time AS request_time,
|
||||
NULL::integer AS skin_test_flag,
|
||||
NULL::integer AS inject_flag,
|
||||
NULL::bigint AS group_id,
|
||||
NULL::bigint AS performer_check_id,
|
||||
T2."name" AS advice_name,
|
||||
T2.id AS item_id,
|
||||
NULL::varchar AS volume,
|
||||
T1.lot_number AS lot_number,
|
||||
T1.quantity AS quantity,
|
||||
T1.unit_code AS unit_code,
|
||||
T1.status_enum AS request_status,
|
||||
NULL::varchar AS method_code,
|
||||
T1.rate_code AS rate_code,
|
||||
NULL::numeric AS dose,
|
||||
NULL::varchar AS dose_unit_code,
|
||||
al1.id AS position_id,
|
||||
al1."name" AS position_name,
|
||||
NULL::integer AS dispense_per_duration,
|
||||
T2.part_percent AS part_percent,
|
||||
NULL::varchar AS condition_definition_name,
|
||||
NULL::integer AS therapy_enum,
|
||||
NULL::integer AS sort_number,
|
||||
NULL::integer AS execute_num,
|
||||
af.day_times,
|
||||
ae.bus_no,
|
||||
ap."name" AS patient_name,
|
||||
al2."name" AS bed_name,
|
||||
ap.gender_enum,
|
||||
ap.birth_date,
|
||||
ap.id AS patient_id,
|
||||
fc.contract_name,
|
||||
diagnosis.condition_names,
|
||||
pra."name" AS admitting_doctor_name,
|
||||
personal_account.balance_amount,
|
||||
personal_account.id AS account_id,
|
||||
NULL::varchar AS category_code,
|
||||
NULL::integer AS dispense_status,
|
||||
NULL::numeric AS unit_price,
|
||||
NULL::numeric AS total_price,
|
||||
NULL::bigint AS stopper_id,
|
||||
T1.update_by AS stopper_name
|
||||
FROM wor_device_request AS T1
|
||||
LEFT JOIN adm_device_definition AS T2
|
||||
ON T2.id = T1.device_def_id AND T2.delete_flag = '0'
|
||||
LEFT JOIN adm_location AS al1
|
||||
ON al1.id = T1.perform_location AND al1.delete_flag = '0'
|
||||
LEFT JOIN adm_encounter ae
|
||||
ON ae.id = T1.encounter_id AND ae.class_enum = #{imp} AND ae.delete_flag = '0'
|
||||
LEFT JOIN adm_patient ap ON ae.patient_id = ap.id AND ap.delete_flag = '0'
|
||||
LEFT JOIN adm_encounter_location ael
|
||||
ON ae.id = ael.encounter_id AND ael.delete_flag = '0'
|
||||
AND ael.status_enum = #{active} AND ael.form_enum = #{bed}
|
||||
LEFT JOIN adm_location al2 ON ael.location_id = al2.id AND al2.delete_flag = '0'
|
||||
LEFT JOIN adm_account aa
|
||||
ON ae.id = aa.encounter_id AND aa.encounter_flag = 1 AND aa.delete_flag = '0'
|
||||
LEFT JOIN fin_contract fc ON aa.contract_no = fc.bus_no AND fc.delete_flag = '0'
|
||||
LEFT JOIN (
|
||||
SELECT aed.encounter_id, STRING_AGG(ccd.name, ', ') AS condition_names
|
||||
FROM adm_encounter_diagnosis aed
|
||||
INNER JOIN cli_condition cc ON cc.id = aed.condition_id AND cc.delete_flag = '0'
|
||||
INNER JOIN cli_condition_definition ccd ON ccd.id = cc.definition_id AND ccd.delete_flag = '0'
|
||||
WHERE aed.delete_flag = '0'
|
||||
GROUP BY aed.encounter_id
|
||||
) AS diagnosis ON ae.id = diagnosis.encounter_id
|
||||
LEFT JOIN adm_encounter_participant aep
|
||||
ON ae.id = aep.encounter_id AND aep.delete_flag = '0'
|
||||
AND aep.status_enum = #{active} AND aep.type_code = #{admittingDoctor}
|
||||
LEFT JOIN adm_practitioner pra ON aep.practitioner_id = pra.id AND pra.delete_flag = '0'
|
||||
LEFT JOIN (
|
||||
SELECT aa.id, aa.encounter_id,
|
||||
(aa.balance_amount -
|
||||
COALESCE(SUM(CASE WHEN aci.status_enum IN (#{billed}, #{billable})
|
||||
THEN aci.total_price ELSE 0 END), 0) +
|
||||
COALESCE(SUM(CASE WHEN aci.status_enum = #{refunded}
|
||||
THEN aci.total_price ELSE 0 END), 0)) AS balance_amount
|
||||
FROM adm_account aa
|
||||
LEFT JOIN adm_charge_item aci ON aa.encounter_id = aci.encounter_id AND aa.delete_flag = '0'
|
||||
WHERE aa.type_code = #{personalCashAccount} AND aa.delete_flag = '0'
|
||||
GROUP BY aa.id, aa.encounter_id, aa.balance_amount
|
||||
) AS personal_account ON personal_account.encounter_id = ae.id
|
||||
LEFT JOIN adm_frequency af ON af.rate_code = T1.rate_code AND af.delete_flag = '0'
|
||||
WHERE T1.delete_flag = '0'
|
||||
AND T1.generate_source_enum = #{doctorPrescription}
|
||||
AND T1.refund_device_id IS NULL
|
||||
AND (T1.based_on_id IS NULL OR T1.based_on_table IS NULL)
|
||||
ORDER BY T1.status_enum )
|
||||
```
|
||||
|
||||
**关键差异注意**:
|
||||
1. `performer_check_id` — 设为 `NULL::bigint`,因为 `wor_device_request` 没有此字段,耗材签发时直接将 `statusEnum` 设为 `ACTIVE(2)`
|
||||
2. `therapy_enum` — 设为 `NULL::integer`,因为耗材医嘱没有治疗类型分类
|
||||
3. `advice_table` — 使用新的参数 `#{worDeviceRequest}`
|
||||
4. WHERE 条件中不需要 `performer_check_id IS NOT NULL` 检查,因为耗材签发后直接为 `ACTIVE(2)` 状态
|
||||
5. 需要排除基于其他医嘱生成的执行记录:`AND (T1.based_on_id IS NULL OR T1.based_on_table IS NULL)`
|
||||
|
||||
### Step 2: 修改 `AdviceProcessAppMapper.java` — 添加参数
|
||||
|
||||
在 `selectInpatientAdvicePage` 方法签名中添加 `worDeviceRequest` 参数:
|
||||
|
||||
```java
|
||||
Page<InpatientAdviceDto> selectInpatientAdvicePage(
|
||||
@Param("page") Page<InpatientAdviceDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<InpatientAdviceParam> queryWrapper,
|
||||
@Param("medMedicationRequest") String medMedicationRequest,
|
||||
@Param("worServiceRequest") String worServiceRequest,
|
||||
@Param("worDeviceRequest") String worDeviceRequest, // 新增
|
||||
// ... 其余参数不变
|
||||
);
|
||||
```
|
||||
|
||||
### Step 3: 修改 `AdviceProcessAppServiceImpl.java` — 传递新参数
|
||||
|
||||
在 `getInpatientAdvicePage` 方法中,调用 mapper 时添加 `CommonConstants.TableName.WOR_DEVICE_REQUEST`:
|
||||
|
||||
```java
|
||||
Page<InpatientAdviceDto> inpatientAdvicePage
|
||||
= adviceProcessAppMapper.selectInpatientAdvicePage(
|
||||
new Page<>(pageNo, pageSize), queryWrapper,
|
||||
CommonConstants.TableName.MED_MEDICATION_REQUEST,
|
||||
CommonConstants.TableName.WOR_SERVICE_REQUEST,
|
||||
CommonConstants.TableName.WOR_DEVICE_REQUEST, // 新增
|
||||
RequestStatus.DRAFT.getValue(), ...);
|
||||
```
|
||||
|
||||
### Step 4: 确保 `therapyEnum` 条件兼容
|
||||
|
||||
当前代码已修复(行 `queryWrapper.and(w -> w.eq("therapy_enum", therapyEnum).or().isNull("therapy_enum"))`),允许 NULL 的 `therapy_enum` 通过。耗材医嘱的 `therapy_enum` 为 NULL,会匹配 "全部" 和 "临时" 两个筛选条件,这是正确的行为。
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: `guanyu`(后端开发)
|
||||
|
||||
**REASON**: 此 Bug 为纯后端 SQL 查询缺陷——Mapper XML 中 UNION 缺少 `wor_device_request` 子查询,需修改 XML、Mapper 接口、ServiceImpl 调用三处。前端无需改动,属于后端数据查询层的修复,交给后端开发最合适。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
214
MD/bugs/BUG_716_ANALYSIS.md
Normal file
214
MD/bugs/BUG_716_ANALYSIS.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# Bug #716 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:33:10
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 716
|
||||
- **标题**: 【住院医生站-临床医嘱】住院医嘱录入界面:医嘱类型/耗材仓库显示不符合业务逻辑,且开嘱医生列无回写值
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
I have enough evidence now. Let me provide the comprehensive analysis.
|
||||
|
||||
---
|
||||
|
||||
## Bug #716 分析报告
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**原文引用 — 禅道 Bug 标题:**
|
||||
> 【住院医生站-临床医嘱】住院医嘱录入界面:医嘱类型/耗材仓库显示不符合业务逻辑,且开嘱医生列无回写值
|
||||
|
||||
**重现步骤:**
|
||||
1. 登录账号 `doctor1`,在"住院医生工作站"选中患者,点击【新增】医嘱
|
||||
2. 点击【医嘱类型】下拉框,观察显示内容
|
||||
3. 在添加含耗材的医嘱时,观察【耗材仓库】字段选择列表的显示内容
|
||||
4. 保存并签发该医嘱,查看医嘱列表明细中【开嘱医生】列的显示
|
||||
|
||||
**结果:**
|
||||
1. 医嘱类型显示为数字(如"2")
|
||||
2. 耗材仓库选择框显示的是批号(如"4444444")
|
||||
3. 已保存/签发的医嘱,【开嘱医生】列显示为"-"
|
||||
|
||||
**期望:**
|
||||
1. 医嘱类型下拉应展示业务名称(如"耗材"),而非数字
|
||||
2. 耗材仓库选择列表应展示"仓库名称",而非批号
|
||||
3. 【开嘱医生】应显示当前操作医生的姓名
|
||||
|
||||
**附图关键信息:**
|
||||
- 图2506:红色箭头标注"显示数字",指向医嘱类型区域显示"2"
|
||||
- 图2507:红色箭头标注"应该显示耗材仓库 不是批号",耗材仓库下拉选中值为"4444444"
|
||||
- 图2508:红色箭头标注"未回写",新保存的耗材医嘱【开嘱医生】列显示"-"
|
||||
|
||||
**综合总结:** 用户在住院医生工作站新增耗材类医嘱时,遇到三个显示/数据问题:(1) 医嘱类型下拉框的 el-select 显示原始数字编码而非业务名称;(2) 耗材仓库下拉框显示的是 inventoryId/批号而非仓库名称标签;(3) 新保存的耗材医嘱在列表中开嘱医生列显示"-",说明 requesterId 的字典翻译或数据回写链路断裂。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
#### 问题1:医嘱类型显示数字
|
||||
|
||||
**目标文件:**
|
||||
- `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue` (行 312-357)
|
||||
|
||||
**根因:** 内联编辑行的医嘱类型 el-select 使用 `:model-value="getRowSelectValue(scope.row)"` 单向绑定。`@change` 处理器直接修改 `filterPrescriptionList[scope.rowIndex].adviceType`,但 `filterPrescriptionList` 是 computed 属性,其返回的数组是 `prescriptionList.value.filter(...)` 的结果。虽然修改的是同一个对象引用,但 Vue 的 computed 缓存机制可能导致 el-select 未及时重新评估 `model-value`,从而显示原始值而非匹配的 label。
|
||||
|
||||
此外,`getRowSelectValue` 返回 `row.adviceType`(数字),而选项的 `value` 也是数字 `2`。如果 `adviceType` 在某处被转为字符串 `"2"`(例如从 `contentJson` 反序列化时),则 `model-value="2"` (string) 与 `value: 2` (number) 不匹配,el-select 会显示原始值。
|
||||
|
||||
**关键代码:**
|
||||
```javascript
|
||||
// index.vue:1202
|
||||
function getRowSelectValue(row) {
|
||||
if (row.adviceType == 1 && row.categoryCode) {
|
||||
return '1-' + row.categoryCode;
|
||||
}
|
||||
if (row.adviceType == 7) {
|
||||
return 7;
|
||||
}
|
||||
return row.adviceType; // ← 可能是 string "2" 而非 number 2
|
||||
}
|
||||
```
|
||||
|
||||
**影响范围:** `index.vue:316` 的 el-select `:model-value` 绑定
|
||||
|
||||
---
|
||||
|
||||
#### 问题2:耗材仓库显示批号
|
||||
|
||||
**目标文件:**
|
||||
- `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/OrderForm.vue` (行 479-498)
|
||||
|
||||
**根因:** 耗材(adviceType==2)的药房/仓库下拉框使用 `v-model="row.inventoryId"`,el-option 的 `:value="item.inventoryId"`。当 `row.inventoryId` 与 stockList 中的 `item.inventoryId` 类型不一致时(一个是 string,一个是 number),el-select 无法匹配选项,回退显示原始 `inventoryId` 值。
|
||||
|
||||
后端 `AdviceInventoryDto.inventoryId` 使用了 `@JsonSerialize(using = ToStringSerializer.class)`,Jackson 会将其序列化为字符串。但在 `setValue` 函数中,`inventoryId` 从 `selectedStock?.inventoryId` 赋值,而 `selectedStock` 来自 `mergedStockList`(合并了 `inventoryList` 和 `priceList`)。如果 `priceList` 中也有 `inventoryId` 字段且为 number 类型,`{ ...item, ...priceList[index] }` 的 spread 会覆盖为 number,导致类型不一致。
|
||||
|
||||
**关键代码:**
|
||||
```javascript
|
||||
// index.vue:2206
|
||||
mergedStockList = row.inventoryList.map((item, index) => {
|
||||
return { ...item, ...priceList[index] }; // priceList 可能覆盖 inventoryId 类型
|
||||
});
|
||||
|
||||
// OrderForm.vue:480
|
||||
<el-select v-model="row.inventoryId" ...>
|
||||
<el-option :value="item.inventoryId" :label="`${item.locationName} 批次号: ...`" />
|
||||
</el-select>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 问题3:开嘱医生显示"-"
|
||||
|
||||
**目标文件:**
|
||||
- 后端:`AdviceManageAppServiceImpl.java` (行 817-910, `handDevice` 方法)
|
||||
- 前端:`index.vue` (行 1030-1033, 数据转换)
|
||||
|
||||
**根因:** 后端 `AdviceSaveDto` 构造函数设置了 `this.practitionerId = SecurityUtils.getLoginUser().getPractitionerId()`。但 `handDevice` 方法中,`requesterId` 只在 `if (is_save)` 分支内设置:
|
||||
```java
|
||||
if (is_save) {
|
||||
deviceRequest.setRequesterId(regAdviceSaveDto.getPractitionerId());
|
||||
}
|
||||
```
|
||||
|
||||
当用户直接签发(`adviceOpType=SIGN_ADVICE`)时,`is_save=false`,`requesterId` 不会被设置到 `DeviceRequest` 对象上。虽然 MyBatis-Plus 的 `saveOrUpdate` 默认跳过 null 字段(不会覆盖已有的 `requester_id`),但如果这是**首次签发**(未先保存),则 `requester_id` 在数据库中为 NULL。
|
||||
|
||||
更重要的是,SQL 查询的列别名 `requester_id_dict_text`(下划线命名)与 DTO 字段 `requesterId_dictText`(混合命名)不匹配。MyBatis 的 `mapUnderscoreToCamelCase` 会将 `requester_id_dict_text` 映射为 `requesterIdDictText`,而非 `requesterId_dictText`。虽然 `@Dict` 注解理论上会补填,但如果 `requesterId` 本身为 NULL,则字典查询也返回 NULL,最终前端回退到 `'-'`。
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
#### 修复1:医嘱类型 el-select 显示数字
|
||||
|
||||
**文件:** `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue`
|
||||
|
||||
**修改内容:**
|
||||
1. 在 `getRowSelectValue` 函数中,确保返回值类型与选项 `value` 类型一致(统一为 number)
|
||||
2. 在 `@change` 处理器中,使用 `prescriptionList.value[index]` 直接操作源数据,而非通过 computed 属性
|
||||
|
||||
```javascript
|
||||
// 修复 getRowSelectValue,确保返回 number
|
||||
function getRowSelectValue(row) {
|
||||
const adviceType = Number(row.adviceType);
|
||||
if (adviceType === 1 && row.categoryCode) {
|
||||
return '1-' + row.categoryCode;
|
||||
}
|
||||
if (adviceType === 7) {
|
||||
return 7;
|
||||
}
|
||||
return isNaN(adviceType) ? undefined : adviceType;
|
||||
}
|
||||
```
|
||||
|
||||
#### 修复2:耗材仓库显示批号
|
||||
|
||||
**文件:** `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/OrderForm.vue`
|
||||
|
||||
**修改内容:**
|
||||
1. 在耗材(adviceType==2)的 el-select 中,使用 `:value="String(item.inventoryId)"` 和 `v-model` 统一为 string 类型
|
||||
2. 或者在 `setValue` 函数中确保 `inventoryId` 类型一致
|
||||
|
||||
```javascript
|
||||
// OrderForm.vue 中耗材部分,统一 inventoryId 为 string
|
||||
<el-option
|
||||
v-for="item in row.stockList"
|
||||
:key="item.inventoryId"
|
||||
:value="String(item.inventoryId)"
|
||||
:label="`${item.locationName} 批次号: ${item.lotNumber ?? '-'} 库存:${...}`"
|
||||
/>
|
||||
```
|
||||
|
||||
同时在 `index.vue` 的 `setValue` 中:
|
||||
```javascript
|
||||
inventoryId: selectedStock?.inventoryId ? String(selectedStock.inventoryId) : undefined,
|
||||
```
|
||||
|
||||
#### 修复3:开嘱医生显示"-"
|
||||
|
||||
**文件:** `healthlink-his-server/.../AdviceManageAppServiceImpl.java`
|
||||
|
||||
**修改内容:**
|
||||
在 `handDevice` 方法中,将 `requesterId` 的设置移到 `if (is_save)` 块外面,确保签发操作也设置 `requesterId`:
|
||||
|
||||
```java
|
||||
// handDevice 方法中,longInsertOrUpdateList 和 tempInsertOrUpdateList 的循环内
|
||||
// 将 requesterId 设置移到 if (is_save) 块外
|
||||
deviceRequest.setRequesterId(regAdviceSaveDto.getPractitionerId()); // ← 移到这里
|
||||
if (is_save) {
|
||||
deviceRequest.setBusNo(...);
|
||||
deviceRequest.setGenerateSourceEnum(...);
|
||||
// ... 其他仅保存时设置的字段
|
||||
}
|
||||
```
|
||||
|
||||
同样在 `handMedication` 和 `handService` 方法中检查是否存在相同问题。
|
||||
|
||||
**附加修复(保险措施):** 在前端数据转换中,确保 `requesterId_dictText` 的回退逻辑更健壮:
|
||||
```javascript
|
||||
requesterId_dictText: item.requesterId_dictText
|
||||
|| (item.requesterId ? (String(item.requesterId) === String(userStore.practitionerId) ? userStore.name : '') : '')
|
||||
|| '-',
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER:** `zhaoyun`(前端开发)+ `guanyu`(后端开发)
|
||||
|
||||
**REASON:** 问题1和问题2是纯前端 el-select 绑定/类型问题,由赵云修复;问题3涉及后端 `handDevice` 方法中 `requesterId` 设置位置不当,需要关羽修改后端 Java 代码。两个角色各负责独立的修复范围,无冲突,可并行工作。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: ** 问题1和问题2是纯前端 el-select 绑定/类型问题,由赵云修复;问题3涉及后端 `handDevice` 方法中 `requesterId` 设置位置不当,需要关羽修改后端 Java 代码。两个角色各负责独立的修复范围,无冲突,可并行工作。
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
169
MD/bugs/BUG_718_ANALYSIS.md
Normal file
169
MD/bugs/BUG_718_ANALYSIS.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Bug #718 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:19:56
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 718
|
||||
- **标题**: 【业务逻辑缺陷】医生端点击“停嘱”后医嘱直接变更为“已停止”,未流转至护士端进行停止核对
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have a thorough understanding of the entire flow. Let me compile my analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
### 原文引用
|
||||
|
||||
**Bug 标题**:【业务逻辑缺陷】医生端点击"停嘱"后医嘱直接变更为"已停止",未流转至护士端进行停止核对
|
||||
|
||||
**重现步骤**:
|
||||
1. 登录"住院医生工作站",选择在科患者(如:刘潇凡)
|
||||
2. 找到一条已校对且正在执行的长期医嘱(如:注射用头孢哌酮舒巴坦钠)
|
||||
3. 选中该医嘱,点击界面上方的【停嘱】按钮
|
||||
4. 观察医生端该医嘱的状态变化
|
||||
5. 登录"住院护士站",进入"医嘱核对"页面
|
||||
6. 依次查看【未校对】和【已停止】标签页
|
||||
|
||||
**期望结果**:
|
||||
1. 医生端点击"停嘱"后,医嘱状态应变更为【已停嘱】(中间状态),不能一步到位直接变成终态【停止】
|
||||
2. 该医嘱应流转并显示在护士端的【未校对】标签页内,供护士进行停嘱确认
|
||||
3. 只有当护士在"未校对"下选中该停嘱医嘱并点击【核对通过】后,医嘱状态才变更为【已停止】,并最终流转显示在【已停止】标签页中
|
||||
|
||||
**附图关键信息**:
|
||||
- 图1(医生端):红色标注指出"停嘱成功的医嘱状态应该是'已停嘱'待核对,需要重新定义一个医嘱状态'已停嘱'记录已停嘱的医嘱";列表中停嘱后医嘱状态显示为"停止"
|
||||
- 图2(护士端):红色标注指出"已停嘱的医嘱应该显示在未校对标签页 待护士核对,核对后状态变成已停止";未校对标签页中无停嘱待核对记录
|
||||
|
||||
### 综合总结
|
||||
|
||||
医生点击停嘱后,医嘱状态直接跳变为终态"停止"(或至少在显示上呈现为停止),护士端的【未校对】标签页未收到该停嘱待核对记录,护士无法执行核对确认。期望的流程是:医生停嘱→状态变为中间态"已停嘱"→流转至护士端未校对→护士核对通过→状态变为终态"停止"。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
通过代码审查,我追踪了完整的停嘱数据流链路:
|
||||
|
||||
### 后端代码(看似正确但存在显示链路断裂)
|
||||
|
||||
1. **医生停嘱接口** `AdviceManageAppServiceImpl.stopRegAdvice()`(第1100行):将状态设为 `RequestStatus.PENDING_STOP(13, "已停嘱")` ✅
|
||||
2. **护士站查询** `AdviceProcessAppServiceImpl.getInpatientAdvicePage()`(第204-213行):查询 ACTIVE(2) 时同时包含 PENDING_STOP(13) ✅
|
||||
3. **护士核对** `AdviceProcessAppServiceImpl.adviceVerify()`(第433-450行):将 PENDING_STOP(13) 转为 STOPPED(6) ✅
|
||||
4. **枚举定义** `RequestStatus.java`:`PENDING_STOP(13, "pending_stop", "已停嘱")` ✅
|
||||
|
||||
### 根本问题:护士站前端状态显示映射缺失
|
||||
|
||||
`prescriptionList.vue` 中的 `REQUEST_STATUS_DISPLAY` 映射表**缺少 PENDING_STOP(13) 条目**:
|
||||
|
||||
```javascript
|
||||
// 第356-361行
|
||||
const REQUEST_STATUS_DISPLAY = {
|
||||
[RequestStatus.DRAFT]: '待签发', // 1 → '待签发'
|
||||
[RequestStatus.ACTIVE]: '已签发', // 2 → '已签发'
|
||||
[RequestStatus.COMPLETED]: '已校对', // 3 → '已校对'
|
||||
[RequestStatus.STOPPED]: '已停止', // 6 → '已停止'
|
||||
// ⚠️ 缺少 PENDING_STOP(13) 条目!
|
||||
};
|
||||
```
|
||||
|
||||
`getStatusDisplayText()` 的回退逻辑虽然最终能通过 `LEGACY_STATUS_TEXT` 或 `requestStatus_enumText` 返回正确的文本"已停嘱",但**存在一个更严重的问题**:
|
||||
|
||||
对于药品医嘱,`getStatusDisplayText()` **优先使用 `dispenseStatus`**(发药状态)。如果停嘱前已存在发药记录(如 dispenseStatus=4 → "已发药"),则 PENDING_STOP 的停嘱状态会被发药状态**遮蔽**,护士看不到"已停嘱"状态。
|
||||
|
||||
### 涉及的关键文件
|
||||
|
||||
| 文件 | 问题 |
|
||||
|------|------|
|
||||
| `healthlink-his-ui/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue` | `REQUEST_STATUS_DISPLAY` 缺少 PENDING_STOP 映射;`getStatusDisplayText` 对 PENDING_STOP 的优先级逻辑不当 |
|
||||
| `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue` | 医生端模板已有 statusEnum==13→"已停嘱" 映射,**看似正确** |
|
||||
| `healthlink-his-server/.../AdviceManageAppServiceImpl.java` | 后端停嘱逻辑已正确设置 PENDING_STOP,**无需修改** |
|
||||
| `healthlink-his-server/.../AdviceProcessAppServiceImpl.java` | 护士站查询已包含 PENDING_STOP,核对逻辑已正确处理,**无需修改** |
|
||||
| `healthlink-his-server/healthlink-his-common/.../RequestStatus.java` | 枚举定义正确,PENDING_STOP(13) 已存在,**无需修改** |
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 修复1:护士站前端状态显示映射(核心修复)
|
||||
|
||||
**文件**:`healthlink-his-ui/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue`
|
||||
|
||||
**修改1a**:在 `REQUEST_STATUS_DISPLAY` 中添加 PENDING_STOP 映射
|
||||
|
||||
```javascript
|
||||
// 第356行后添加
|
||||
const REQUEST_STATUS_DISPLAY = {
|
||||
[RequestStatus.DRAFT]: '待签发',
|
||||
[RequestStatus.ACTIVE]: '已签发',
|
||||
[RequestStatus.COMPLETED]: '已校对',
|
||||
[RequestStatus.STOPPED]: '已停止',
|
||||
[RequestStatus.PENDING_STOP]: '已停嘱', // ← 新增
|
||||
};
|
||||
```
|
||||
|
||||
**修改1b**:修改 `getStatusDisplayText` 逻辑,确保 PENDING_STOP 优先级高于 dispenseStatus
|
||||
|
||||
PENDING_STOP 是停嘱的中间状态,应优先显示,不受旧的发药状态遮蔽:
|
||||
|
||||
```javascript
|
||||
const getStatusDisplayText = (row) => {
|
||||
// 0. 已停嘱(13)优先显示 —— 停嘱中间态必须醒目,不被旧发药状态遮蔽
|
||||
const requestCode = Number(row?.requestStatus);
|
||||
if (requestCode === RequestStatus.PENDING_STOP) {
|
||||
return '已停嘱';
|
||||
}
|
||||
// 1. 优先使用发药状态
|
||||
const dispenseCode = Number(row?.dispenseStatus);
|
||||
if (DISPENSE_STATUS_DISPLAY[dispenseCode]) {
|
||||
return DISPENSE_STATUS_DISPLAY[dispenseCode];
|
||||
}
|
||||
// 2. 使用行级别请求状态
|
||||
if (REQUEST_STATUS_DISPLAY[requestCode]) {
|
||||
return REQUEST_STATUS_DISPLAY[requestCode];
|
||||
}
|
||||
// 3. 兼容旧后端枚举文本
|
||||
return LEGACY_STATUS_TEXT[row?.requestStatus_enumText] || row?.requestStatus_enumText || '';
|
||||
};
|
||||
```
|
||||
|
||||
### 修复2:医生端 SQL 查询补充 stop_time/stop_user_name(优化)
|
||||
|
||||
**文件**:`healthlink-his-server/.../mapper/regdoctorstation/AdviceManageAppMapper.xml`
|
||||
|
||||
当前 SQL 中 stop_time 和 stop_user_name 仅在 `status_enum = 6`(STOPPED)时返回,PENDING_STOP(13) 时不返回,导致医生端停嘱时间/停嘱医生列为空。需将条件改为 `status_enum IN (6, 13)`:
|
||||
|
||||
```xml
|
||||
<!-- 修改前 -->
|
||||
CASE WHEN T1.status_enum = 6 THEN T1.effective_dose_end ELSE NULL END AS stop_time,
|
||||
CASE WHEN T1.status_enum = 6 THEN T1.update_by ELSE NULL END AS stop_user_name
|
||||
|
||||
<!-- 修改后 -->
|
||||
CASE WHEN T1.status_enum IN (6, 13) THEN T1.effective_dose_end ELSE NULL END AS stop_time,
|
||||
CASE WHEN T1.status_enum IN (6, 13) THEN T1.update_by ELSE NULL END AS stop_user_name
|
||||
```
|
||||
|
||||
(对 ServiceRequest 和 DeviceRequest 的 UNION 部分同样修改)
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: `guanyu`(后端开发)+ `zhaoyun`(前端开发)
|
||||
|
||||
**REASON**: 本 Bug 涉及前后端两个层面。核心修复在前端护士站的状态显示映射(`prescriptionList.vue` 的 `REQUEST_STATUS_DISPLAY` 和 `getStatusDisplayText`),属于 `zhaoyun` 的职责范围。次要修复在后端 Mapper XML 的 SQL 条件补充(`AdviceManageAppMapper.xml`),属于 `guanyu` 的职责范围。后端核心停嘱逻辑(`stopRegAdvice` 和 `adviceVerify`)**已正确实现**,无需修改。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
147
MD/bugs/BUG_719_ANALYSIS.md
Normal file
147
MD/bugs/BUG_719_ANALYSIS.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# Bug #719 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 02:11:11
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 719
|
||||
- **标题**: 【护士站-医嘱校对】已停止列表:频次/用法及停嘱医生字段未回写显示
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have a complete understanding of the bug. Let me provide the analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
### 禅道 Bug 原文
|
||||
|
||||
**标题**: 【护士站-医嘱校对】已停止列表:频次/用法及停嘱医生字段未回写显示
|
||||
|
||||
**重现步骤**:
|
||||
1. 医生端已对某医嘱进行"停嘱"操作(如:注射用头孢哌酮舒巴坦钠)
|
||||
2. 登录护士端进入"住院护士站" > "医嘱校对"
|
||||
3. 在查询页签中点击"已停止"标签
|
||||
4. 查看对应医嘱记录的"频次/用法"及"停嘱医生"两列
|
||||
|
||||
**结果**: 列表中"频次/用法"及"停嘱医生"列内容为空,未显示任何数据。
|
||||
|
||||
**期望**: 列表对应的"频次/用法"及"停嘱医生"列应正确显示数据,且与临床医生端显示内容一致(如:每日一次 静脉滴注、内科医生1)。
|
||||
|
||||
### 附图关键信息
|
||||
- **图2513**(护士站"已停止"标签页):两条已停医嘱记录中,"频次/用法"列和"停嘱医生"列均为空白。图中用红色标注"频次/用法 和停嘱医生未回写"。
|
||||
- **图2512**(医生站视图):同一医嘱显示"频次/用法"为"每日一次 静脉滴注","停嘱医生"为"内科医生1"。
|
||||
|
||||
### 综合总结
|
||||
护士在医嘱校对的"已停止"列表中查看已停医嘱时,"频次/用法"和"停嘱医生"两个字段显示为空。这两个字段在医生端正常显示。问题出在护士站查询已停止医嘱时,数据源(SQL查询或Java处理)未能正确返回这两个字段的值。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
### 根因1:停嘱医生字段 —— `stopper_name` 映射到 `update_by` 被覆盖
|
||||
|
||||
**核心问题链路**:
|
||||
|
||||
1. **医生停嘱** (`AdviceManageAppServiceImpl.stopRegAdvice`): 设置 `update_by = SecurityUtils.getNickName()`(医生昵称)
|
||||
- 此时 `update_by = "内科医生1"` ✓
|
||||
- **但未设置 `stopper_id`**(虽然 V41 迁移已添加此列)
|
||||
|
||||
2. **护士校对** (`AdviceProcessAppServiceImpl.adviceVerify`): 设置 `update_by = SecurityUtils.getNickName()`(护士昵称)
|
||||
- 此时 `update_by` 被覆盖为护士名
|
||||
- 如果护士昵称为空/NULL → `update_by = NULL`
|
||||
|
||||
3. **SQL 查询** (`AdviceProcessAppMapper.xml`):
|
||||
```sql
|
||||
NULL::bigint AS stopper_id, -- 硬编码 NULL!
|
||||
T1.update_by AS stopper_name -- 使用 update_by,已被覆盖
|
||||
```
|
||||
|
||||
4. **Java 处理**:
|
||||
```java
|
||||
e.setStopperName(e.getStopperName()); // 这是空操作!
|
||||
```
|
||||
|
||||
**结论**: `stopper_name` 取自 `update_by`,而 `update_by` 被护士校对操作覆盖。若护士昵称为空,该字段为 NULL。V41 迁移添加了 `stopper_id` 列但 Java 实体和查询均未使用。
|
||||
|
||||
**涉及文件**:
|
||||
- `AdviceProcessAppMapper.xml` (L209-210, L355-356): `NULL::bigint AS stopper_id` + `T1.update_by AS stopper_name`
|
||||
- `AdviceProcessAppServiceImpl.java` (L318): `e.setStopperName(e.getStopperName())` — 空操作
|
||||
- `AdviceManageAppServiceImpl.java` (L1127): `.set(MedicationRequest::getUpdateBy, stopUserName)` — 未设 `stopper_id`
|
||||
- `MedicationRequest.java`: 缺少 `stopperId` 字段
|
||||
- `ServiceRequest.java`: 缺少 `stopperId` 字段
|
||||
|
||||
### 根因2:频次/用法字段 —— 需要进一步排查
|
||||
|
||||
SQL 查询正确选取了 `T1.rate_code` 和 `T1.method_code`,Java 代码也正确计算了 `frequencyUsage`。但两个停嘱医嘱都为空,可能是:
|
||||
- 数据库中这两条医嘱的 `rate_code`/`method_code` 为 NULL(创建时未设置)
|
||||
- 或 `DictUtils.getDictLabel` 返回空字符串
|
||||
|
||||
**需验证**: 检查 `med_medication_request` 表中对应记录的 `rate_code` 和 `method_code` 值。
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 修复1:停嘱医生字段(核心修复)
|
||||
|
||||
**Step 1**: 给 `MedicationRequest` 和 `ServiceRequest` 实体添加 `stopperId` 字段
|
||||
|
||||
**Step 2**: 更新医生站停嘱逻辑,设置 `stopper_id`
|
||||
|
||||
```java
|
||||
// AdviceManageAppServiceImpl.stopRegAdvice
|
||||
// 获取停嘱医生的 practitionerId
|
||||
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
|
||||
// 药品
|
||||
.set(MedicationRequest::getStopperId, practitionerId)
|
||||
.set(MedicationRequest::getUpdateBy, stopUserName)
|
||||
// 诊疗
|
||||
.set(ServiceRequest::getStopperId, practitionerId)
|
||||
.set(ServiceRequest::getUpdateBy, stopUserName)
|
||||
```
|
||||
|
||||
**Step 3**: 更新护士站 SQL 查询,用 `stopper_id` 关联 `adm_practitioner` 获取医生姓名
|
||||
|
||||
```sql
|
||||
-- AdviceProcessAppMapper.xml 中 MedicationRequest UNION:
|
||||
-- 修改前:
|
||||
NULL::bigint AS stopper_id,
|
||||
T1.update_by AS stopper_name
|
||||
-- 修改后:
|
||||
T1.stopper_id AS stopper_id,
|
||||
COALESCE(practitioner_stop.name, T1.update_by) AS stopper_name
|
||||
-- 并增加 LEFT JOIN:
|
||||
LEFT JOIN adm_practitioner practitioner_stop ON T1.stopper_id = practitioner_stop.id AND practitioner_stop.delete_flag = '0'
|
||||
```
|
||||
|
||||
对 ServiceRequest UNION 同理修改。
|
||||
|
||||
**Step 4**: 更新护士站校对逻辑,停嘱单校对时不应覆盖 `update_by`(或同时保留 stopper 信息)
|
||||
|
||||
### 修复2:频次/用法字段
|
||||
|
||||
先验证数据:检查 `med_medication_request` 表中 `rate_code` 和 `method_code` 是否为 NULL。如果为 NULL,需检查订单创建流程是否正确设置了这两个字段。
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER: guanyu(后端开发)+ zhaoyun(前端开发)**
|
||||
|
||||
**REASON**: 根因在后端(SQL 查询 `stopper_name` 映射错误 + 实体缺少 `stopperId` + 停嘱逻辑未设 `stopper_id`),需 guanyu 修复实体类、Mapper XML、Service 层。频次/用法需排查数据库数据,也属后端。前端可能需确认"频次/用法"为空时的展示逻辑,属 zhaoyun 范围。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
228
MD/bugs/BUG_720_ANALYSIS.md
Normal file
228
MD/bugs/BUG_720_ANALYSIS.md
Normal file
@@ -0,0 +1,228 @@
|
||||
# Bug #720 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:53:34
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 720
|
||||
- **标题**: 【住院医生工作站】只要打开了一个模块所有的的权限的都可以打开存在安全隐患
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
I now have a complete understanding of the bug. Here is my analysis:
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**禅道 Bug #720 标题**:【住院医生工作站】只要打开了一个模块所有的权限的都可以打开存在安全隐患
|
||||
|
||||
**重现步骤**:随便登录一个账号(例:wx,密码:123456),随便打开一个模块,随便切换一个账号(例:doctor1,密码:123456),可以打开 wx 账号的卡片模块。
|
||||
|
||||
**期望结果**:什么权限下的模块就在什么权限下出现,不应该在别的权限下打开。
|
||||
|
||||
**附图分析**:
|
||||
- 截图1(用户"韦雪"):在「医保管理」→「电子处方管理」中查看处方列表
|
||||
- 截图2(用户"内科医生1"):登录后左侧导航中「门诊医生工作站」展开但**无「电子处方管理」子菜单**,然而主界面却**依然停留在「电子处方管理」页面**,且数据完全一致
|
||||
- 两张截图中,不同角色看到了相同的业务数据和操作按钮,且无任何"无权限"提示
|
||||
|
||||
**综合总结**:用户 A(护士/药师角色)登录后打开某模块,退出后切换为用户 B(医生角色),用户 B 能直接访问 A 的页面。根因是切换账号后旧路由未被清除、新守卫校验不充分,导致路由级权限绕过。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
### 核心问题:Vue Router `addRoute()` 是永久性的,切换账号后旧路由从未被移除
|
||||
|
||||
**完整触发链路**:
|
||||
|
||||
```
|
||||
用户A登录 → getInfo()获取A的权限 → generateRoutes() → router.addRoute(A的路由) [永久注册]
|
||||
↓
|
||||
用户A退出 → logOut() → 清除token/roles/permissions/标签页 → 跳转/login
|
||||
[⚠️ 未清除: permission store状态、router中已注册的路由]
|
||||
↓
|
||||
用户B登录 → setToken(B的token) → 跳转/
|
||||
↓
|
||||
router.beforeEach → roles.length===0 → getInfo()获取B的权限 → generateRoutes()
|
||||
→ router.addRoute(B的路由) [B的路由被追加,A的路由依然存在]
|
||||
↓
|
||||
用户B访问/ePrescribing → router.resolve(to).matched.length > 0 ✅(A的路由还在)
|
||||
→ 守卫放行 → 越权访问成功 ❌
|
||||
```
|
||||
|
||||
**三处代码缺陷**:
|
||||
|
||||
| 缺陷 | 文件 | 问题 |
|
||||
|------|------|------|
|
||||
| **缺陷1** | `store/modules/permission.js` `generateRoutes()` | 只追加新路由,从不移除旧路由。没有记录已添加的动态路由名 |
|
||||
| **缺陷2** | `store/modules/user.js` `logOut()` | 只清除 token/roles/permissions/tagsView,**未重置 permission store**(routes/sidebarRouters等)|
|
||||
| **缺陷3** | `permission.js` 路由守卫 | 最终校验只检查 `router.resolve(to).matched.length === 0`(路由是否注册),**不检查当前用户是否有权访问该路由** |
|
||||
|
||||
**注意**:路由守卫中已有注释"铁律: 路由权限校验 — 防止切换账户后通过旧标签或直接输入URL访问无权限页面",说明开发者**意识到了这个问题但修复不彻底**——因为旧路由从未被清除,所以 `matched.length` 永远 > 0,校验形同虚设。
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 方案:三层防御(清除旧路由 + 重置状态 + 守卫增强)
|
||||
|
||||
#### 修改1:`healthlink-his-ui/src/store/modules/permission.js` — 记录并清除旧路由
|
||||
|
||||
```javascript
|
||||
// 新增 state
|
||||
state: () => ({
|
||||
routes: [],
|
||||
addRoutes: [],
|
||||
defaultRoutes: [],
|
||||
topbarRouters: [],
|
||||
sidebarRouters: [],
|
||||
// 新增:记录所有动态添加的路由名,用于清理
|
||||
addedRouteNames: []
|
||||
}),
|
||||
|
||||
// 新增 action:清除所有动态路由
|
||||
actions: {
|
||||
removeAddedRoutes() {
|
||||
this.addedRouteNames.forEach(name => {
|
||||
try { router.removeRoute(name) } catch(e) {}
|
||||
})
|
||||
this.addedRouteNames = []
|
||||
},
|
||||
|
||||
generateRoutes(roles) {
|
||||
return new Promise(resolve => {
|
||||
// 【修复】生成新路由前,先清除所有旧的动态路由
|
||||
this.removeAddedRoutes()
|
||||
|
||||
getRouters().then(res => {
|
||||
const sdata = JSON.parse(JSON.stringify(res.data))
|
||||
const rdata = JSON.parse(JSON.stringify(res.data))
|
||||
const defaultData = JSON.parse(JSON.stringify(res.data))
|
||||
const sidebarRoutes = filterAsyncRouter(sdata)
|
||||
const rewriteRoutes = filterAsyncRouter(rdata, false, true)
|
||||
const defaultRoutes = filterAsyncRouter(defaultData)
|
||||
const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
|
||||
|
||||
// 记录并添加路由
|
||||
const addedNames = []
|
||||
asyncRoutes.forEach(route => {
|
||||
router.addRoute(route)
|
||||
if (route.name) addedNames.push(route.name)
|
||||
})
|
||||
addNotFoundRoute()
|
||||
|
||||
// 记录后端动态路由名
|
||||
this.trackAddedRoutes(rewriteRoutes, addedNames)
|
||||
|
||||
this.setRoutes(rewriteRoutes)
|
||||
this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
|
||||
this.setDefaultRoutes(sidebarRoutes)
|
||||
this.setTopbarRoutes(defaultRoutes)
|
||||
resolve(rewriteRoutes)
|
||||
}).catch(err => {
|
||||
console.error('获取路由失败:', err)
|
||||
addNotFoundRoute()
|
||||
this.setRoutes([])
|
||||
resolve([])
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 新增:递归追踪所有动态添加的路由名
|
||||
trackAddedRoutes(routes, names) {
|
||||
routes.forEach(route => {
|
||||
if (route.name) names.push(route.name)
|
||||
if (route.children) this.trackAddedRoutes(route.children, names)
|
||||
})
|
||||
this.addedRouteNames = [...new Set(names)]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 修改2:`healthlink-his-ui/src/store/modules/user.js` — logOut 时重置权限状态
|
||||
|
||||
```javascript
|
||||
import usePermissionStore from '@/store/modules/permission'
|
||||
|
||||
// 在 logOut action 中增加:
|
||||
logOut() {
|
||||
return new Promise((resolve, reject) => {
|
||||
logout(this.token).then(() => {
|
||||
this.token = ''
|
||||
this.roles = []
|
||||
this.permissions = []
|
||||
this.tenantId = ''
|
||||
removeToken()
|
||||
try { useTagsViewStore().delAllViews() } catch(e) {}
|
||||
// 【修复】清除所有动态路由,防止旧用户路由残留
|
||||
try { usePermissionStore().removeAddedRoutes() } catch(e) {}
|
||||
try { usePermissionStore().$reset() } catch(e) {}
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
#### 修改3:`healthlink-his-ui/src/permission.js` — 增强路由守卫权限校验
|
||||
|
||||
在现有的 `resolved.matched.length` 检查之后,增加基于用户权限的二次校验:
|
||||
|
||||
```javascript
|
||||
// 在 "return true" 之前,增加权限校验
|
||||
// 获取目标路由对应的菜单路径
|
||||
const targetPath = to.path
|
||||
const sidebarRoutes = usePermissionStore().sidebarRouters
|
||||
const allPaths = collectAllPaths(sidebarRoutes) // 递归收集所有已授权路径
|
||||
if (allPaths.size > 0 && !allPaths.has(targetPath) && !isConstantPath(targetPath)) {
|
||||
ElMessage.warning('无权访问该页面')
|
||||
return { path: '/' }
|
||||
}
|
||||
return true
|
||||
```
|
||||
|
||||
其中辅助函数:
|
||||
```javascript
|
||||
// 常量路由(始终允许访问)不需要权限校验
|
||||
function isConstantPath(path) {
|
||||
const constantPaths = ['/', '/index', '/login', '/register', '/401', '/lock', '/user/profile', '/redirect']
|
||||
return constantPaths.some(p => path === p || path.startsWith(p + '/'))
|
||||
}
|
||||
|
||||
// 递归收集 sidebarRouters 中所有路由路径
|
||||
function collectAllPaths(routes) {
|
||||
const paths = new Set()
|
||||
function walk(items) {
|
||||
items.forEach(r => {
|
||||
if (r.path) paths.add(r.path.startsWith('/') ? r.path : '/' + r.path)
|
||||
if (r.children) walk(r.children)
|
||||
})
|
||||
}
|
||||
walk(routes)
|
||||
return paths
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: guanyu(后端开发 + 通用修复)
|
||||
|
||||
**REASON**: 此 Bug 的修复**全部在前端**(`permission.js` 路由守卫、`permission.js` store、`user.js` store),涉及 Vue Router 路由生命周期管理和 Pinia store 状态管理,属于前端核心逻辑修改。虽然分类为"后端开发"的关羽,但此任务本质是前端路由/权限架构修复,**更应交给 zhaoyun(前端开发)**。因为需要修改 3 个前端核心文件(`permission.js` store、`user.js` store、路由守卫 `permission.js`),涉及 Vue Router 4 的 `addRoute/removeRoute` 生命周期、Pinia store 重置、路由守卫权限校验等前端专属知识。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
101
MD/bugs/BUG_721_ANALYSIS.md
Normal file
101
MD/bugs/BUG_721_ANALYSIS.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# Bug #721 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:44:34
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 721
|
||||
- **标题**: 【影像管理】点击新增检查出现sql语句报错
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
已定位根因,分析完成。
|
||||
|
||||
---
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道原文:**
|
||||
> **Bug #721**:【影像管理】点击新增检查出现sql语句报错
|
||||
>
|
||||
> **重现步骤**:登录内科医生1的账号:doctor1 密码:123456进入影像管理→点击新增检查→填写新增影像检查记录→确认 → 出现报错
|
||||
>
|
||||
> **期望结果**:能够正常的新增成功不会出现报错
|
||||
|
||||
**附图关键信息:**
|
||||
- 错误信息:`ERROR: null value in column "patient_id" of relation "radiology_image_comparison" violates not-null constraint`
|
||||
- 失败的 INSERT SQL:`INSERT INTO radiology_image_comparison (id, examination_type, examination_name, body_part, finding_text, conclusion_text, doctor_name, create_by, create_time, tenant_id)` — 注意 **`patient_id` 列根本不在 INSERT 语句中**,说明实体的 `patientId` 字段始终为 null
|
||||
- 表单弹窗里**没有患者ID字段**,只有检查类型、检查名称、检查部位等字段
|
||||
|
||||
**综合总结:** 用户在影像对比页面点击"新增检查"时,弹窗表单没有 `patientId` 字段,提交后后端实体的 `patientId` 为 null,而数据库表 `radiology_image_comparison.patient_id` 有 NOT NULL 约束,导致插入失败。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
**根因:前后端均缺失 `patientId` 传递**
|
||||
|
||||
| 层级 | 问题 |
|
||||
|------|------|
|
||||
| **前端 `index.vue`** | `formData` 初始值无 `patientId`,弹窗表单无患者ID输入,`submitForm()` 直接提交 `formData.value`,不含 `patientId` |
|
||||
| **后端 Controller** | `addRecord(@RequestBody RadiologyImageComparison record)` 直接 `save()`,既不校验 `patientId` 是否为空,也不从页面查询区的 `patientId` 中获取 |
|
||||
| **数据库** | `radiology_image_comparison.patient_id` 列有 NOT NULL 约束,插入空值失败 |
|
||||
|
||||
**涉及文件:**
|
||||
- `healthlink-his-ui/src/views/radiologycomparison/index.vue` — formData 缺少 patientId
|
||||
- `healthlink-his-server/.../RadiologyComparisonController.java` — addRecord 未校验/设置 patientId
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
**修改 1:前端 `index.vue`** — `submitForm()` 中补充 `patientId`
|
||||
|
||||
```js
|
||||
async function submitForm() {
|
||||
// 补充患者ID(来自页面查询区)
|
||||
formData.value.patientId = patientId.value ? Number(patientId.value) : null
|
||||
await addRecord(formData.value)
|
||||
ElMessage.success('新增成功')
|
||||
showAdd.value = false
|
||||
loadData()
|
||||
}
|
||||
```
|
||||
|
||||
**修改 2:后端 `RadiologyComparisonController.java`** — `addRecord` 增加参数校验
|
||||
|
||||
```java
|
||||
@PostMapping("/add")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public R<?> addRecord(@RequestBody RadiologyImageComparison record) {
|
||||
if (record.getPatientId() == null) {
|
||||
return R.fail("患者ID不能为空");
|
||||
}
|
||||
record.setCreateTime(new Date());
|
||||
comparisonService.save(record);
|
||||
return R.ok(record);
|
||||
}
|
||||
```
|
||||
|
||||
**修改范围:** 2个文件,改动量极小,不破坏现有功能。
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER: guanyu**
|
||||
**REASON: 后端 Controller 缺少参数校验是核心根因(后端权重更高),前端 formData 传递也需要同步修复,优先由 guanyu 处理后端校验 + 前端联动调整。**
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: 后端 Controller 缺少参数校验是核心根因(后端权重更高),前端 formData 传递也需要同步修复,优先由 guanyu 处理后端校验 + 前端联动调整。**
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
168
MD/bugs/BUG_722_ANALYSIS.md
Normal file
168
MD/bugs/BUG_722_ANALYSIS.md
Normal file
@@ -0,0 +1,168 @@
|
||||
# Bug #722 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:41:53
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 722
|
||||
- **标题**: 【住院医生工作站】住院病历的页面打不开
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Based on my thorough analysis, here's the complete Bug #722 analysis:
|
||||
|
||||
---
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**Bug 标题**: 【住院医生工作站】住院病历的页面打不开
|
||||
|
||||
**重现步骤**: 登录内科医生1账号 doctor1/123456 → 进入住院管理 → 住院医生增强 → 住院病历
|
||||
|
||||
**期望结果**: 能够正常打开住院病历
|
||||
|
||||
**实际结果**: 页面标签 "住院病历" 已打开,但主内容区域完全空白,无任何表单、列表、患者信息或操作界面加载。无错误提示。
|
||||
|
||||
**附图关键信息**:
|
||||
- 左侧导航菜单"住院病历"已高亮(蓝色)
|
||||
- 顶部已打开"住院病历 ×"标签页
|
||||
- 主内容区域**完全空白**,无任何UI元素
|
||||
- 无弹出错误提示框
|
||||
|
||||
**综合总结**: 用户通过侧边栏菜单点击"住院病历",标签页成功创建,但页面主体内容区域渲染为空白,无任何数据或组件显示。问题可能源于前端路由配置、组件加载失败或数据获取异常。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
通过代码链路追踪,定位到以下技术问题链:
|
||||
|
||||
#### 根因1(最可能):菜单路由的 `component` 字段路径与实际组件路径不匹配
|
||||
|
||||
**关键代码链路**:
|
||||
- 路由动态加载:`src/store/modules/permission.js` → `loadView()` 函数通过 `import.meta.glob` 匹配组件路径
|
||||
- 匹配逻辑:`dir === view`,其中 `dir = path.split('views/')[1].split('.vue')[0]`
|
||||
- 实际文件:`inpatientDoctor/home/index.vue` → 路径 `inpatientDoctor/home/index`
|
||||
- 如果数据库菜单 `component` 字段为 `inpatientDoctor/home/emr/index`(EMR子组件),则**脱离了 home 页面的患者列表和标签页容器**,EMR 组件独立渲染但无法获取患者上下文
|
||||
|
||||
**验证方法**: 查询数据库 `sys_menu` 表中"住院病历"菜单项的 `component` 字段值
|
||||
|
||||
#### 根因2(补充):EMR 组件无患者上下文时渲染空白
|
||||
|
||||
**关键代码** (`inpatientDoctor/home/emr/index.vue`):
|
||||
```javascript
|
||||
// line 172 - 组件使用 localPatientInfo
|
||||
import {localPatientInfo as patientInfo} from '../store/localPatient.js';
|
||||
|
||||
// line 903 - onMounted 中依赖 patientInfo
|
||||
onMounted(async () => {
|
||||
await queryTemplateTree();
|
||||
if (patientInfo.value && patientInfo.value.patientId && ...) {
|
||||
nextTick(() => { selectDefaultTemplate(); });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
当 EMR 作为独立路由组件加载时:
|
||||
1. `localPatientInfo` 为空(未通过 home 页面的患者列表选择患者)
|
||||
2. `queryTemplateTree()` 执行后模板树为空(可能因 `primaryMenuEnum=1` 无匹配文书定义)
|
||||
3. `currentComponent` 保持为空字符串,`<component :is="currentComponent" />` 不渲染任何内容
|
||||
4. 整页空白
|
||||
|
||||
#### 根因3(次要):PatientList 组件 API 调用缺少状态过滤
|
||||
|
||||
**关键代码** (`inpatientDoctor/home/index.vue`):
|
||||
```javascript
|
||||
// line 90 - getList 使用 status: 5
|
||||
getPatientList({ status: 5, searchKey: searchData.keyword })
|
||||
```
|
||||
|
||||
**但** `PatientList/patient-list.vue` 内部**独立调用** `getPatientList` **不传 status 参数**,导致返回所有患者(可能为空或不正确)。
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
#### 修复1(核心):确认并修正菜单路由 component 字段
|
||||
|
||||
**检查步骤**:
|
||||
```sql
|
||||
SELECT menu_id, menu_name, component, path
|
||||
FROM sys_menu
|
||||
WHERE menu_name LIKE '%住院病历%';
|
||||
```
|
||||
|
||||
**预期问题**: component 字段值为 `inpatientDoctor/home/emr/index`
|
||||
|
||||
**修复**:
|
||||
```sql
|
||||
UPDATE sys_menu
|
||||
SET component = 'inpatientDoctor/home/index'
|
||||
WHERE menu_name = '住院病历' AND parent_id = (
|
||||
SELECT menu_id FROM sys_menu WHERE menu_name = '住院医生增强'
|
||||
);
|
||||
```
|
||||
|
||||
#### 修复2(防御性):EMR 组件增加患者未选择提示
|
||||
|
||||
**文件**: `healthlink-his-ui/src/views/inpatientDoctor/home/emr/index.vue`
|
||||
|
||||
在 `onMounted` 的 `queryTemplateTree()` 之后增加患者状态检查:
|
||||
|
||||
```javascript
|
||||
onMounted(async () => {
|
||||
await queryTemplateTree();
|
||||
if (
|
||||
patientInfo.value &&
|
||||
patientInfo.value.patientId &&
|
||||
Object.keys(patientInfo.value).length > 0
|
||||
) {
|
||||
nextTick(() => {
|
||||
selectDefaultTemplate();
|
||||
});
|
||||
} else {
|
||||
// 增加:无患者时显示提示而非空白
|
||||
ElMessage.info('请先在左侧选择患者');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### 修复3(可选):PatientList 组件传递 status 参数
|
||||
|
||||
**文件**: `healthlink-his-ui/src/components/PatientList/patient-list.vue`
|
||||
|
||||
确保 `getPatientList` 调用时传入 `status` prop:
|
||||
|
||||
```javascript
|
||||
const getList = () => {
|
||||
queryloading.value = true;
|
||||
getPatientList({
|
||||
status: props.status || 5,
|
||||
searchKey: searchData.keyword
|
||||
}).then(res => {
|
||||
// ...
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER**: `zhaoyun`(前端开发)
|
||||
|
||||
**REASON**: 本 Bug 核心是前端路由配置(菜单 component 字段映射)和 EMR 组件渲染问题,涉及前端路由动态加载机制、Vue 组件容器结构、以及患者上下文状态管理,属于纯前端问题链。需要 zhaoyun 验证数据库菜单 component 路径、修复路由映射,并增强 EMR 组件的容错提示。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
98
MD/bugs/BUG_723_ANALYSIS.md
Normal file
98
MD/bugs/BUG_723_ANALYSIS.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# Bug #723 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:31:01
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 723
|
||||
- **标题**: 【住院医生工作站】有两个住院医生增强
|
||||
- **模块**: 门诊医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Now I have enough context to provide the analysis. Let me compile the findings.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**禅道原文引用:**
|
||||
|
||||
- **标题**:【住院医生工作站】有两个住院医生增强
|
||||
- **重现步骤**:登录内科医生1账号:doctor1 密码:123456 打开住院管理有两个住院增强
|
||||
- **结果**:出现重复了
|
||||
- **期望**:不会出现重复的模块卡片,显得很冗余
|
||||
|
||||
**附图关键信息:**
|
||||
|
||||
截图显示左侧导航菜单栏,展开"住院管理"一级菜单后,二级菜单列表中出现了**两个完全相同的"住院医生增强"**条目(图标、文字均一致),紧邻排列。
|
||||
|
||||
**综合总结:** 用户登录 doctor1 账号后,在"住院管理"导航菜单下看到两个一模一样的"住院医生增强"菜单入口,造成界面冗余和用户困惑。这是一个**菜单数据重复问题**,需要删除其中一条重复的 `sys_menu` 记录。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
**根因:`sys_menu` 数据库表中存在两条 `menu_name = '住院医生增强'` 且 `parent_id` 相同的记录。**
|
||||
|
||||
在 RuoYi 架构中,导航菜单由后端 `sys_menu` 表动态提供,前端根据 API 返回的菜单树渲染侧边栏。具体数据链路:
|
||||
|
||||
```
|
||||
sys_menu 表 → SysMenuMapper.xml (selectMenuList/selectMenuTreeByMenuIds)
|
||||
→ SysMenuService → SysMenuController (/system/menu/list)
|
||||
→ 前端 usePermissionStore → Sidebar 渲染
|
||||
```
|
||||
|
||||
最可能的产生原因:某次 Flyway 迁移或手动数据库操作中,对"住院医生增强"菜单执行了**两次 INSERT**,导致 `sys_menu` 表中出现两条同名、同父节点的菜单记录。前端渲染时会忠实地展示所有有效菜单,因此出现重复。
|
||||
|
||||
**涉及的关键文件:**
|
||||
- `core-system/src/main/resources/mapper/system/SysMenuMapper.xml` — 菜单查询 SQL
|
||||
- `sys_menu` 表 — 存储菜单数据(`menu_id`, `menu_name`, `parent_id`, `path`, `component`)
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
**方案:创建 Flyway 迁移脚本,删除 `sys_menu` 表中 `menu_name = '住院医生增强'` 的重复记录(保留 `menu_id` 最小的一条)。**
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. **创建 Flyway 迁移文件** `V45__fix_duplicate_menu_doctor_enhanced.sql`:
|
||||
|
||||
```sql
|
||||
-- V45: 修复 Bug#723 — 删除 sys_menu 中重复的"住院医生增强"菜单条目
|
||||
-- 保留 menu_id 最小的那条,删除其余重复记录
|
||||
DELETE FROM sys_menu
|
||||
WHERE menu_name = '住院医生增强'
|
||||
AND menu_id NOT IN (
|
||||
SELECT MIN(menu_id)
|
||||
FROM sys_menu
|
||||
WHERE menu_name = '住院医生增强'
|
||||
);
|
||||
```
|
||||
|
||||
**注意事项:**
|
||||
- Flyway 迁移一旦执行不可回滚,所以此 SQL 使用了子查询保留最小 `menu_id` 的策略,确保只删重复
|
||||
- 需要确认"住院医生增强"对应的 `path` 和 `component` 是否也一致(如果不一致,说明两个菜单指向不同功能,需要人工判断保留哪个)
|
||||
- 修复后需要**重新登录** doctor1 账号验证侧边栏不再重复
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: `xunyu`(荀彧 / DBA)
|
||||
|
||||
**REASON**: 这是纯数据库数据问题(`sys_menu` 表重复记录),不涉及 Java 代码或前端代码修改,只需要创建一条 Flyway 迁移 SQL 删除重复菜单记录,属于数据库变更范畴,由 DBA 角色处理最合适。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
178
MD/bugs/BUG_724_ANALYSIS.md
Normal file
178
MD/bugs/BUG_724_ANALYSIS.md
Normal file
@@ -0,0 +1,178 @@
|
||||
# Bug #724 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:24:08
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 724
|
||||
- **标题**: 【合理用药】模块下的功能卡片打开都会出现报错
|
||||
- **模块**: 手术麻醉管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Now I have a clear picture. Let me trace the full request flow and output my analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
### 禅道原文引用
|
||||
|
||||
**Bug 标题**: 【合理用药】模块下的功能卡片打开都会出现报错
|
||||
|
||||
**重现步骤**: 登录内科医生1的账号 doctor1 / 123456 → 打开合理用药 → 点击合理用药下面的模块
|
||||
|
||||
**期望结果**: 不会出现报错,能够正常进入该模块下的页面
|
||||
|
||||
### 附图关键信息
|
||||
|
||||
截图中红色错误横幅:
|
||||
```
|
||||
No static resource healthlink-his/api/v1/antibiotic/statistics for request '/healthlink-his/healthlink-his/api/v1/antibiotic/statistics'.
|
||||
```
|
||||
|
||||
左侧导航栏"合理用药"展开,包含四个子模块:抗菌药物规则、药物相互作用、审核日志、合理用药统计。四个统计卡片全部为 0,表格显示"暂无数据"。所有模块页面都会出现相同报错。
|
||||
|
||||
### 综合总结
|
||||
|
||||
用户登录医生账号后,打开"合理用药"模块下的所有子页面(抗菌药物规则、药物相互作用、审核日志、合理用药统计),页面顶部均出现红色错误提示。错误信息显示请求路径中 `/healthlink-his` 出现了两次,导致 Spring Boot 无法匹配到任何 Controller 端点,所有合理用药相关 API 请求全部失败。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
### 错误路径解剖
|
||||
|
||||
```
|
||||
浏览器请求: /healthlink-his/healthlink-his/api/v1/antibiotic/statistics
|
||||
↑ 第一次 ↑ Spring Boot context-path
|
||||
```
|
||||
|
||||
Spring Boot 收到请求后:
|
||||
1. 去除 context-path `/healthlink-his` → 剩余路径:`/healthlink-his/api/v1/antibiotic/statistics`
|
||||
2. 匹配 Controller:`AntibioticController` 的 `@RequestMapping("/api/v1/antibiotic")` → **无法匹配**(路径多了一层 `/healthlink-his`)
|
||||
3. Spring Boot 退化为静态资源查找 → 找不到 → 返回 404 错误
|
||||
|
||||
### 请求链路追踪
|
||||
|
||||
```
|
||||
前端 API 调用:
|
||||
request.js → baseURL = import.meta.env.VITE_APP_BASE_API
|
||||
api/antibiotic/index.js → url = '/api/v1/antibiotic/statistics'
|
||||
最终 URL = ${VITE_APP_BASE_API}/api/v1/antibiotic/statistics
|
||||
|
||||
错误路径 = /healthlink-his/healthlink-his/api/v1/antibiotic/statistics
|
||||
```
|
||||
|
||||
**反推得出**:`VITE_APP_BASE_API` 在实际部署环境中被设置为 `/healthlink-his`(或类似的包含 context-path 的值),而非代码仓库中定义的 `/prd-api` 或 `/dev-api`。
|
||||
|
||||
### 根因结论
|
||||
|
||||
**上下文路径 `/healthlink-his` 被重复叠加了两次。** 可能的触发场景:
|
||||
|
||||
| 层 | 配置 | 效果 |
|
||||
|---|---|---|
|
||||
| `VITE_APP_BASE_API`(实际部署值) | `/healthlink-his`(异常值,代码仓库中为 `/prd-api`) | 前端发送 `/healthlink-his/api/v1/...` |
|
||||
| Nginx 代理 | `location /healthlink-his/ { proxy_pass http://backend/healthlink-his/; }` | 转发后路径变为 `/healthlink-his/api/v1/...` |
|
||||
| Spring Boot context-path | `context-path: /healthlink-his` | 去除一次后剩余 `/healthlink-his/api/v1/...` → 无法匹配 |
|
||||
|
||||
**核心矛盾**:前端 API 路径 `/api/v1/...` 是正确的相对路径,但 `VITE_APP_BASE_API` 环境变量在部署时被设置为了 `/healthlink-his`,与 Spring Boot 的 `context-path` 冲突,导致路径叠加。
|
||||
|
||||
### 涉及文件
|
||||
|
||||
| 文件 | 作用 | 是否需要修改 |
|
||||
|---|---|---|
|
||||
| `healthlink-his-ui/src/utils/request.js:56` | `baseURL: import.meta.env.VITE_APP_BASE_API` | ✅ 需确认部署时的值 |
|
||||
| `healthlink-his-ui/src/api/antibiotic/index.js` | 抗菌药物 API 定义(`/api/v1/antibiotic/...`) | ❌ 路径正确 |
|
||||
| `healthlink-his-ui/src/api/rationaldrug.js` | 合理用药 API 定义(`/api/v1/rational-drug/...`) | ❌ 路径正确 |
|
||||
| `healthlink-his-server/.../application.yml:20` | `context-path: /healthlink-his` | ❌ 后端正确 |
|
||||
| `deploy/nginx-healthlink-his.conf` | Nginx 代理配置 | ✅ 需确认实际部署版本 |
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 方案 1:修复部署环境的 `VITE_APP_BASE_API`(推荐,最小改动)
|
||||
|
||||
**问题本质**:部署环境使用了错误的 `VITE_APP_BASE_API` 值。
|
||||
|
||||
**修复**:确保部署时使用正确的环境文件:
|
||||
|
||||
```bash
|
||||
# 生产环境部署命令
|
||||
cd healthlink-his-ui
|
||||
npm run build -- --mode prod
|
||||
```
|
||||
|
||||
确保 `.env.prod` 中的值为:
|
||||
```
|
||||
VITE_APP_BASE_API = '/prd-api'
|
||||
```
|
||||
|
||||
对应的 Nginx 配置(`deploy/nginx-healthlink-his.conf`):
|
||||
```nginx
|
||||
location /prd-api/ {
|
||||
proxy_pass http://127.0.0.1:18082/healthlink-his/;
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 方案 2:如果部署环境必须使用 `/healthlink-his` 作为前端路径
|
||||
|
||||
如果实际部署环境中前端通过 `http://server/healthlink-his/` 访问,Nginx 也需要相应调整:
|
||||
|
||||
```nginx
|
||||
# 方案 A:Nginx 不在 proxy_pass 中添加 context-path(让 Spring Boot 处理)
|
||||
location /healthlink-his/api/ {
|
||||
proxy_pass http://127.0.0.1:18082; # 注意:无尾部路径
|
||||
...
|
||||
}
|
||||
|
||||
# 方案 B:前端 API 路径不包含 context-path
|
||||
# VITE_APP_BASE_API = ''(空字符串),前端请求 /api/v1/...
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:18082/healthlink-his;
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 方案 3:代码层面的防御性修复(可选)
|
||||
|
||||
在 `request.js` 中添加 URL 校验,防止 context-path 重复:
|
||||
|
||||
```javascript
|
||||
// request.js 中 axios 实例创建后
|
||||
service.interceptors.request.use(config => {
|
||||
// 防止 baseURL 包含后端 context-path 导致重复
|
||||
if (config.baseURL && config.baseURL.includes('/healthlink-his')) {
|
||||
console.warn('[WARN] VITE_APP_BASE_API 包含 /healthlink-his,可能导致路径重复!')
|
||||
}
|
||||
// ...existing code
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER: guanyu(后端)+ zhaoyun(前端)联合排查,优先 zhaoyun**
|
||||
|
||||
**REASON**: 本 Bug 的根因是**部署配置问题**而非代码缺陷。需要:
|
||||
1. **zhaoyun** 确认实际部署环境的 `VITE_APP_BASE_API` 值,检查前端 `.env` 文件和构建命令是否正确
|
||||
2. **guanyu** 确认后端 Spring Boot `context-path` 与 Nginx 代理规则的匹配关系
|
||||
3. 修复的核心是**对齐前端 baseURL 与 Nginx 代理规则**,确保 `/healthlink-his` 不被叠加两次
|
||||
|
||||
**优先级**:zhaoyun 先检查 `.env.prod` 和实际构建配置 → guanyu 验证 Nginx 配置 → 联合确认修复
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
121
MD/bugs/BUG_725_ANALYSIS.md
Normal file
121
MD/bugs/BUG_725_ANALYSIS.md
Normal file
@@ -0,0 +1,121 @@
|
||||
# Bug #725 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:14:15
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 725
|
||||
- **标题**: 【急诊管理】绿色通道的激活出现报错
|
||||
- **模块**: 会诊管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
I have all the information needed. Let me now output the analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**禅道 Bug #725**:【急诊管理】绿色通道的激活出现报错
|
||||
|
||||
**重现步骤**:
|
||||
> 登录内科医生1账号:doctor1 密码:123456 → 打开急诊管理 → 进入绿色通道激活
|
||||
|
||||
**期望结果**:能够正常激活绿色通道
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
Error updating database. Cause: PSQLException: ERROR: null value in column "patient_id"
|
||||
of relation "emergency_green_channel" violates not-null constraint
|
||||
```
|
||||
|
||||
**附图分析**:
|
||||
- 弹窗表单中「患者ID」字段为空(`el-input-number` 未输入值),但用户点击了「激活」按钮
|
||||
- 数据库 INSERT SQL:`INSERT INTO emergency_green_channel (id, disease_type, target_time, doctor, activate_time, create_by, create_time, tenant_id)` — **`patient_id` 完全不在 INSERT 列表中**
|
||||
- 表单规则 `addFormRules.patientId` 声明了 required,但实际未阻止提交
|
||||
|
||||
**综合总结**:用户点击「激活绿色通道」时,弹窗表单中「患者ID」为空就直接提交,后端 MyBatis-Plus 生成的 INSERT 语句完全跳过了 `patient_id` 字段(null 值被 MyBatis 默认策略忽略),导致违反数据库 `NOT NULL` 约束。前端表单的 required 校验规则未生效,后端校验也未拦住请求。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
**根因链路(全链路 6 环)**:
|
||||
|
||||
| 环 | 问题 |
|
||||
|---|---|
|
||||
| ① 录入(前端) | `addFormRules.patientId` 的 `required` 规则触发条件是 `trigger:'blur'`,但 `el-input-number` 的 blur 事件对 null 值不触发校验;`submitAdd` 中的 `validate()` 可能静默通过 |
|
||||
| ② 验证(后端) | `EmergencyController.activateGreenChannel()` 有 `if (gc.getPatientId() == null)` 检查,但 **前端根本没发起带正确错误码的请求** — MyBatis-Plus 异常被全局异常处理器捕获,前端收到的是原始错误堆栈文本而非结构化 R.fail |
|
||||
| ③ 业务 | `EmergencyGreenChannelServiceImpl` 无额外校验,直接继承 MyBatis-Plus `save()` |
|
||||
| ④ 持久化 | MyBatis-Plus 默认 `FieldStrategy.INSERT_NOT_NULL`:null 字段不写入 INSERT → `patient_id` 缺失 |
|
||||
| ⑤ 存储 | `emergency_green_channel` 表定义 `patient_id BIGINT NOT NULL` → 报错 |
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-server/.../web/emergency/controller/EmergencyController.java` — 后端校验逻辑(已有但被跳过)
|
||||
- `healthlink-his-ui/src/views/emergency/greentrack/index.vue` — 前端表单校验失效
|
||||
- `healthlink-his-ui/src/views/emergency/greentrack/api.js` — API 调用
|
||||
- `healthlink-his-server/.../emergency/domain/EmergencyGreenChannel.java` — 实体定义
|
||||
- `V32__followup_pathology_emergency.sql` — DB 表结构(`NOT NULL` 约束)
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 修复点 1:前端表单校验(`greentrack/index.vue`)
|
||||
|
||||
**问题**:`submitAdd` 中 `validate()` 逻辑有隐患 — `el-input-number` 组件在未输入时 v-model 为 `null`,但 required 校验的 `trigger:'blur'` 对此场景不可靠。更关键的是,**validate 的 try-catch 写法在某些情况下可能跳过校验**。
|
||||
|
||||
**修改**:改为标准 async/await 写法,并将 trigger 改为 `change`:
|
||||
|
||||
```js
|
||||
// 修改 addFormRules
|
||||
const addFormRules = {
|
||||
patientId: [{required: true, message: '请输入患者ID', trigger: 'change'}]
|
||||
}
|
||||
|
||||
// 修改 submitAdd — 移除 try-catch,使用标准 await
|
||||
const submitAdd = async () => {
|
||||
if (addFormRef.value) {
|
||||
const valid = await addFormRef.value.validate().catch(() => false)
|
||||
if (!valid) return
|
||||
}
|
||||
await activate(addForm.value)
|
||||
ElMessage.success('绿色通道已激活')
|
||||
addVisible.value = false
|
||||
loadData()
|
||||
refreshStats()
|
||||
}
|
||||
```
|
||||
|
||||
### 修复点 2:后端校验(`EmergencyController.java`)
|
||||
|
||||
后端已有 `gc.getPatientId() == null` 检查,但需确认 `R.fail()` 返回格式被前端正确识别。当前后端代码已正确,无需修改后端(校验逻辑存在且会返回错误)。如果前端仍能穿透,则需要检查全局异常处理器是否正确包装了 `MethodArgumentNotValidException`。
|
||||
|
||||
### 修复点 3(可选优化):增加后端 `@Valid` 注解
|
||||
|
||||
在 `activateGreenChannel` 方法参数上增加 `@Valid` 并在实体 `patientId` 字段加 `@NotNull`,作为双保险:
|
||||
|
||||
```java
|
||||
public R<?> activateGreenChannel(@RequestBody @Valid EmergencyGreenChannel gc) {
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: **zhaoyun**(前端开发)
|
||||
|
||||
**REASON**: 根因在前端表单校验失效 — `addFormRules` 的 trigger 选择不当 + `submitAdd` 中 validate 的错误处理逻辑有缺陷。后端校验逻辑已存在且正确,核心修复是前端表单校验。修改范围仅限 1 个前端文件 `greentrack/index.vue`。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
134
MD/bugs/BUG_726_ANALYSIS.md
Normal file
134
MD/bugs/BUG_726_ANALYSIS.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# Bug #726 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:12:01
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 726
|
||||
- **标题**: 【病理管理】开病历医嘱出现报错
|
||||
- **模块**: 疾病报告管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Now I have all the information needed for a complete analysis. Let me compile the findings.
|
||||
|
||||
---
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道 Bug #726:【病理管理】开病历医嘱出现报错**
|
||||
|
||||
- **重现步骤**: 登录内科医生1账号(doctor1/123456),进入病理管理→病理医嘱→点击"开病理医嘱"报卡→点击确定
|
||||
- **结果**: 出现报错 `ERROR: null value in column "patient_id" of relation "pathology_order" violates not-null constraint`
|
||||
- **期望**: 能够正常进行该项操作
|
||||
|
||||
**附图关键信息**:
|
||||
- 弹窗表单中"患者ID"、"患者姓名"、"就诊ID"三个字段均为空
|
||||
- `el-input-number` 控件未填入值,`patientId` 为 `null`
|
||||
- 后端执行的 INSERT SQL 中**完全没有 `patient_id` 列**,说明 MyBatis-Plus 对 null 值字段执行了跳过策略
|
||||
|
||||
**综合总结**: 用户在"开病理医嘱"弹窗中未填写患者ID(或系统未自动填充),导致提交时 `patientId=null`。MyBatis-Plus 的默认 insert 策略跳过了 null 字段(INSERT SQL 中无 `patient_id` 列),而数据库 `pathology_order.patient_id` 列有 `NOT NULL` 约束,导致插入失败。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
**直接原因**: 前端表单提交了 `patientId: null`,后端 Controller `addOrder()` 未做任何校验直接调用 `orderService.save(order)`,MyBatis-Plus 生成的 INSERT 不包含 `patient_id` 列,触发 PostgreSQL NOT NULL 约束。
|
||||
|
||||
**根因链条**:
|
||||
1. **前端** `healthlink-his-ui/src/views/pathology/order/index.vue`: `el-input-number` 的 `v-model="form.patientId"` 初始值为 `null`,用户未手动输入时保持 `null`
|
||||
2. **前端** `submitForm()`: 无任何校验逻辑,直接调用 `add(form.value)`
|
||||
3. **后端** `PathologyController.addOrder()`: 无参数校验(无 `@Valid`、无手动检查),直接 `orderService.save(order)`
|
||||
4. **DB**: `pathology_order.patient_id BIGINT NOT NULL`(V32 迁移脚本定义)
|
||||
|
||||
**涉及文件**:
|
||||
| 文件 | 问题 |
|
||||
|------|------|
|
||||
| `healthlink-his-ui/src/views/pathology/order/index.vue` | 表单无校验,`patientId` 可为 null |
|
||||
| `healthlink-his-server/.../web/pathology/controller/PathologyController.java` | `addOrder()` 无参数校验 |
|
||||
| `healthlink-his-domain/.../pathology/domain/PathologyOrder.java` | Entity 无 `@NotNull` 注解 |
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
**方案:前后端双重校验 + 自动获取患者信息**
|
||||
|
||||
#### 1. 后端:Controller 加校验(1 个文件)
|
||||
|
||||
**文件**: `PathologyController.java` 的 `addOrder()` 方法
|
||||
|
||||
**修改内容**: 在保存前校验必填字段 `patientId` 和 `patientName`:
|
||||
|
||||
```java
|
||||
@PostMapping("/order/add")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public R<?> addOrder(@RequestBody PathologyOrder order) {
|
||||
if (order.getPatientId() == null) {
|
||||
return R.fail("患者ID不能为空");
|
||||
}
|
||||
if (!StringUtils.hasText(order.getPatientName())) {
|
||||
return R.fail("患者姓名不能为空");
|
||||
}
|
||||
if (!StringUtils.hasText(order.getOrderStatus())) {
|
||||
order.setOrderStatus("PENDING");
|
||||
}
|
||||
order.setApplyTime(new Date());
|
||||
order.setCreateTime(new Date());
|
||||
orderService.save(order);
|
||||
return R.ok(order);
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 前端:表单提交前校验(1 个文件)
|
||||
|
||||
**文件**: `healthlink-his-ui/src/views/pathology/order/index.vue`
|
||||
|
||||
**修改内容**: 在 `submitForm()` 中增加校验逻辑:
|
||||
|
||||
```javascript
|
||||
const submitForm = async () => {
|
||||
if (!form.value.patientId) { ElMessage.warning('请选择患者'); return }
|
||||
if (!form.value.patientName) { ElMessage.warning('请填写患者姓名'); return }
|
||||
if (isEdit.value) {
|
||||
await update(form.value)
|
||||
} else {
|
||||
await add(form.value)
|
||||
}
|
||||
ElMessage.success('操作成功')
|
||||
dlgVisible.value = false
|
||||
loadData()
|
||||
}
|
||||
```
|
||||
|
||||
**修改总结**:
|
||||
|
||||
| 文件 | 修改内容 | 影响范围 |
|
||||
|------|---------|---------|
|
||||
| `PathologyController.java:~addOrder()` | 增加 `patientId` 和 `patientName` 非空校验 | 仅影响新增病理医嘱接口 |
|
||||
| `pathology/order/index.vue:submitForm()` | 增加前端提交前校验 | 仅影响病理医嘱表单 |
|
||||
|
||||
**验证步骤**:
|
||||
1. `mvn clean compile -DskipTests` → 编译通过
|
||||
2. 不填 patientId 点确定 → 前端提示"请选择患者"
|
||||
3. 填入 patientId 后提交 → 后端正常保存,INSERT 包含 `patient_id` 列
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
- **FIXER**: `guanyu`(后端修复 Controller 校验)+ `zhaoyun`(前端修复表单校验)
|
||||
- **REASON**: 此 Bug 涉及后端 Controller 缺少参数校验和前端表单缺少提交前校验两个独立修改点,后端修复归属关羽,前端修复归属赵云,可并行处理。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
125
MD/bugs/BUG_727_ANALYSIS.md
Normal file
125
MD/bugs/BUG_727_ANALYSIS.md
Normal file
@@ -0,0 +1,125 @@
|
||||
# Bug #727 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:08:49
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 727
|
||||
- **标题**: 【住院护士站-入出转管理】转出页面待转科患者医嘱列表缺失“医嘱状态”列且“执行科室”未获取值回显
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
I now have a complete understanding of the bug. Let me provide the analysis.
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**禅道 Bug 标题**:【住院护士站-入出转管理】转出页面待转科患者医嘱列表缺失"医嘱状态"列且"执行科室"未获取值回显
|
||||
|
||||
**重现步骤**:
|
||||
1. 登录"住院医生工作站",为患者开立医嘱(如:荆防颗粒),确保已校对(状态为:已校对,药房/科室为:中心药房)
|
||||
2. 登录"住院护士站",进入【入出转管理】下的【转出】标签页,选择该患者
|
||||
3. 观察右侧下方医嘱列表
|
||||
|
||||
**期望结果**:
|
||||
1. 医嘱列表应有"医嘱状态"列,正确回显"已校对"
|
||||
2. "执行科室"列应显示"中心药房",不能显示"-"
|
||||
|
||||
**附图关键信息**:
|
||||
- 图2524(护士站转出页):医嘱列表缺少"医嘱状态"列,"执行科室"显示"-"
|
||||
- 图2525(医生站对比页):同一医嘱"荆防颗粒",状态显示"已校对",药房/科室显示"中心药房"
|
||||
|
||||
**综合总结**:护士站在转出页面查看待转科患者的医嘱时,列表缺少"医嘱状态"列且"执行科室"未回显药房名称。而同一医嘱在医生站正常显示"已校对"和"中心药房"。这是一个前后端数据展示不一致的问题。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
### 问题1:医嘱状态列缺失
|
||||
|
||||
**已修复**。Commit `babd8d0c0`(2026-06-11)已添加了"医嘱状态"列到 `transferOut.vue` 模板,且后端 `ATDManageAppServiceImpl.getInPatientPendingList()` 已正确设置 `requestStatus_enumText`。
|
||||
|
||||
### 问题2:执行科室显示"-"
|
||||
|
||||
**根因**:后端保存药品医嘱时,`perform_location` 字段未正确赋值。
|
||||
|
||||
**完整数据链路分析**:
|
||||
|
||||
| 环 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| ① 前端录入 | ✅ 正常 | 医生站选药房后,`orgId` 字段存有药房 ID |
|
||||
| ② DTO 传输 | ❌ 断裂 | 前端发送 `orgId` → DTO 反序列化到 `orgId` 字段 |
|
||||
| ③ Service 保存 | ❌ 断裂 | `DoctorStationAdviceAppServiceImpl:1172` 读取 `adviceSaveDto.getLocationId()` 而非 `getOrgId()`,导致 `performLocation` 为 null |
|
||||
| ④ 数据库存储 | ❌ 数据缺失 | `med_medication_request.perform_location` 为 NULL |
|
||||
| ⑤ 护士站查询 | ✅ SQL 正确 | `ATDManageAppMapper.xml` 正确 JOIN `adm_location`,但因 `perform_location` 为 NULL,`position_name` 为 NULL |
|
||||
| ⑥ 前端展示 | ✅ 逻辑正确 | `positionName \|\| orgName` 均为 null,显示"-" |
|
||||
|
||||
**关键代码定位**:
|
||||
|
||||
`DoctorStationAdviceAppServiceImpl.java:1172`:
|
||||
```java
|
||||
// 发放药房
|
||||
medicationRequest.setPerformLocation(adviceSaveDto.getLocationId());
|
||||
```
|
||||
|
||||
`AdviceSaveDto.java` 中:
|
||||
- `positionId`(line 65):前端字段名 `orgId`,对应数据库 `perform_location`
|
||||
- `orgId`(line 78):前端传来字段名 `orgId`,对应数据库 `org_id`
|
||||
- `locationId`(line 166):独立字段,前端可能未发送此字段
|
||||
|
||||
**Bug #238 修复引入的问题**:`AdviceSaveDto` 添加了 `orgId` 字段(Bug #238 修复),但 `DoctorStationAdviceAppServiceImpl` 仍然从 `getLocationId()` 读取药房 ID,而前端实际发送的是 `orgId`。`locationId` 未被前端赋值,导致 `performLocation` 始终为 null。
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 方案:修复后端赋值逻辑
|
||||
|
||||
**修改文件**:`DoctorStationAdviceAppServiceImpl.java`
|
||||
|
||||
**修改位置**:第 1172 行
|
||||
|
||||
**修改内容**:
|
||||
```java
|
||||
// 修改前
|
||||
medicationRequest.setPerformLocation(adviceSaveDto.getLocationId());
|
||||
|
||||
// 修改后 — 优先使用 getPerformLocation(),其次 getOrgId(),最后 getLocationId()
|
||||
medicationRequest.setPerformLocation(
|
||||
adviceSaveDto.getPerformLocation() != null ? adviceSaveDto.getPerformLocation()
|
||||
: adviceSaveDto.getOrgId() != null ? adviceSaveDto.getOrgId()
|
||||
: adviceSaveDto.getLocationId()
|
||||
);
|
||||
```
|
||||
|
||||
**同时检查**(同类问题):
|
||||
1. `DoctorStationChineseMedicalAppServiceImpl.java:551` — 中药处方可能有相同问题
|
||||
2. 现有数据修复 — 对 `perform_location` 为 NULL 的已保存医嘱,需要从 `content_json` 中提取 `orgId` 回填
|
||||
|
||||
**验证步骤**:
|
||||
1. `mvn clean compile -DskipTests` — 编译通过
|
||||
2. 医生站开药 → 选"中心药房" → 签发
|
||||
3. 护士站转出页 → 选该患者 → 医嘱列表"执行科室"应显示"中心药房"
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER**: guanyu(后端开发)
|
||||
|
||||
**REASON**: 核心 Bug 在后端 `DoctorStationAdviceAppServiceImpl` 的字段赋值逻辑,需要修改 Java 代码中 `setPerformLocation` 的取值来源。前端模板和 SQL 查询均已正确,无需前端修改。可能还需同步修复 `DoctorStationChineseMedicalAppServiceImpl` 中的同类问题。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
147
MD/bugs/BUG_728_ANALYSIS.md
Normal file
147
MD/bugs/BUG_728_ANALYSIS.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# Bug #728 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:00:18
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 728
|
||||
- **标题**: 【住院护士站-医嘱校对】转科医嘱核对通过后原床位被提前释放,导致转科前待处理事项无法执行
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
分析完成。以下是完整的 Bug 分析报告:
|
||||
|
||||
---
|
||||
|
||||
## 一、Bug 理解
|
||||
|
||||
**禅道标题:** 【住院护士站-医嘱校对】转科医嘱核对通过后原床位被提前释放,导致转科前待处理事项无法执行
|
||||
|
||||
**重现步骤:**
|
||||
1. 医生端为患者(002床 不知道)开立转科预嘱并签发
|
||||
2. 登录住院护士站,在【医嘱校对】页面"未校对-临时医嘱"中找到该患者的"转科"医嘱
|
||||
3. 选中该医嘱,点击【核对通过】,提示"校对成功"
|
||||
4. 切换至其他菜单(医嘱执行、汇总领药等)
|
||||
|
||||
**结果:**
|
||||
- 护士核对通过转科医嘱后,系统**立即释放并清退了该患者的原床位**(床号显示为 `-:-`,非在科状态)
|
||||
- 患者从左侧在科患者列表中**消失**,护士无法在【医嘱执行】【汇总领药】等界面选中该患者
|
||||
- 转科前尚未完成的带药、治疗等医嘱无法执行
|
||||
|
||||
**期望:**
|
||||
1. 核对通过转科医嘱后,应**保留原床位占用**和在科状态
|
||||
2. 允许护士继续处理转科前所有待执行医嘱
|
||||
3. **只有**护士在【入出转管理】页面确认执行【转科】或【清床】操作后,才正式释放床位
|
||||
|
||||
**附图关键信息:**
|
||||
- 图2527:校对页面,红框标注"核对通过"按钮和转科医嘱
|
||||
- 图2526/2529:入出转管理页面,床号显示 `-:-`,患者已标记"待转科",仍显示"待取药/待退药"和"待处理执行单"
|
||||
- 图2528:校对页面,患者"不知道"已从左侧列表消失,红框注释"转科医嘱护士校对通过后 待转科的患者床位应该保留"
|
||||
|
||||
**综合总结:** 护士在医嘱校对页面核对通过转科医嘱后,系统过早触发了床位释放和在科状态变更,导致患者从在科列表中消失,护士无法继续执行转科前遗留的待办医嘱。正确行为应是核对通过仅更新医嘱状态,保留床位和在科状态,待护士在入出转管理页面手动执行转科时才释放资源。
|
||||
|
||||
---
|
||||
|
||||
## 二、根因分析
|
||||
|
||||
**核心问题代码:** `AdviceProcessAppServiceImpl.adviceVerify()` 方法(第 465-472 行)
|
||||
|
||||
```java
|
||||
// 处理转科/出院等特殊医嘱
|
||||
for (ServiceRequest serviceRequest : normalRequests) {
|
||||
if (ActivityDefCategory.TRANSFER.getValue().equals(serviceRequest.getCategoryEnum())) {
|
||||
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
|
||||
EncounterZyStatus.PENDING_TRANSFER.getValue()); // ← BUG:校对时立即改变患者状态
|
||||
} else if (ActivityDefCategory.DISCHARGE.getValue().equals(serviceRequest.getCategoryEnum())) {
|
||||
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
|
||||
EncounterZyStatus.AWAITING_DISCHARGE.getValue());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**根因链条:**
|
||||
1. **`adviceVerify`(校对通过)** 在处理转科医嘱时,直接调用 `encounterService.updateEncounterStatus()` 将患者 encounter 状态改为 `PENDING_TRANSFER`(6)
|
||||
2. 同时,转科医嘱的 ServiceRequest 状态被设为 `COMPLETED`(3)
|
||||
3. 这触发了系统级联反应——患者状态变更导致床位信息被释放(`encounter_location` 中 BED 类型的记录状态被联动修改),患者从在科患者列表中消失
|
||||
4. **实际的转科操作** 由 `ATDManageAppServiceImpl.transferDepartment()` 执行,这才是应该执行床位释放、状态变更的地方
|
||||
|
||||
**正确的时序设计:**
|
||||
- **校对通过** → 仅更新医嘱状态(转科医嘱→COMPLETED),**不改变**患者 encounter 状态
|
||||
- **入出转管理→转科** → 执行床位释放、状态变更、新病区分配
|
||||
|
||||
**涉及文件:**
|
||||
- `AdviceProcessAppServiceImpl.java` — `adviceVerify()` 方法,第 465-472 行
|
||||
- `ATDManageAppServiceImpl.java` — `transferDepartment()` 方法(正确的转科执行逻辑)
|
||||
- `EncounterLocationServiceImpl.java` — `updateEncounterLocationStatus()` 方法(床位状态更新)
|
||||
|
||||
---
|
||||
|
||||
## 三、修复方案
|
||||
|
||||
### 修复步骤
|
||||
|
||||
**步骤 1:修改 `AdviceProcessAppServiceImpl.adviceVerify()` 方法**
|
||||
|
||||
**文件:** `healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java`
|
||||
|
||||
**修改内容:** 删除校对通过时对转科医嘱的 encounter 状态更新
|
||||
|
||||
将第 463-472 行:
|
||||
```java
|
||||
// 处理转科/出院等特殊医嘱
|
||||
for (ServiceRequest serviceRequest : normalRequests) {
|
||||
if (ActivityDefCategory.TRANSFER.getValue().equals(serviceRequest.getCategoryEnum())) {
|
||||
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
|
||||
EncounterZyStatus.PENDING_TRANSFER.getValue());
|
||||
} else if (ActivityDefCategory.DISCHARGE.getValue().equals(serviceRequest.getCategoryEnum())) {
|
||||
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
|
||||
EncounterZyStatus.AWAITING_DISCHARGE.getValue());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
改为:
|
||||
```java
|
||||
// 转科/出院医嘱核对通过时,不立即改变患者 encounter 状态
|
||||
// 状态变更推迟到入出转管理页面执行转科/出院操作时触发(ATDManageAppServiceImpl.transferDepartment)
|
||||
// 校对通过仅更新医嘱状态(已在上方 COMPLETED 处理),保留原床位和在科状态
|
||||
```
|
||||
|
||||
**说明:**
|
||||
- 转科医嘱的 `ServiceRequest` 状态已在上方通过 `updateCompleteRequestStatus` 设为 COMPLETED(3),这是正确的
|
||||
- 删除的是 encounter 状态的联动更新,不影响医嘱本身的校对完成
|
||||
- 出院医嘱同理删除(AWAITING_DISCHARGE 状态应推迟到出院操作时设置)
|
||||
|
||||
**步骤 2:编译验证**
|
||||
```bash
|
||||
mvn clean compile -DskipTests -pl healthlink-his-server/healthlink-his-application
|
||||
mvn test -pl healthlink-his-server/healthlink-his-application -Dtest="NurseStationTest" -Dsurefire.failIfNoSpecifiedTests=false
|
||||
```
|
||||
|
||||
**步骤 3:前端确认(无需修改)**
|
||||
|
||||
前端【医嘱校对】页面无需修改,因为:
|
||||
- 医嘱校对接口返回"校对成功"后,前端刷新医嘱列表,转科医嘱状态正确更新为"已完成"
|
||||
- 患者在科列表的刷新由后端 `selectInpatientPage` 查询驱动,患者 encounter 状态不变 → 列表中继续显示
|
||||
|
||||
---
|
||||
|
||||
## 四、路由决策
|
||||
|
||||
**FIXER:** guanyu(关羽 — 后端开发)
|
||||
|
||||
**REASON:** 修复涉及 Java 后端 Service 层逻辑修改(`AdviceProcessAppServiceImpl.adviceVerify` 方法),属于纯后端业务逻辑调整,无前端改动,由后端开发 Agent 执行最合适。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: ** 修复涉及 Java 后端 Service 层逻辑修改(`AdviceProcessAppServiceImpl.adviceVerify` 方法),属于纯后端业务逻辑调整,无前端改动,由后端开发 Agent 执行最合适。
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
139
MD/bugs/BUG_729_ANALYSIS.md
Normal file
139
MD/bugs/BUG_729_ANALYSIS.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# Bug #729 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 00:53:38
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 729
|
||||
- **标题**: 【住院护士站-入出转管理】待转科列表“入院病区/入院病房”下拉筛选项无数据,未正确读取转科申请数据
|
||||
- **模块**: 病区护士工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have a complete understanding of the issue. Let me finalize my analysis.
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道 Bug #729 原文:**
|
||||
- **标题**:【住院护士站-入出转管理】待转科列表"入院病区/入院病房"下拉筛选项无数据,未正确读取转科申请数据
|
||||
- **重现步骤**:1. 临床医生端为患者提交转科申请(转入科室:临床心理科,转入病区:第二病区);2. 登录住院护士站,进入入出转管理的"转出"页面;3. 点击"入院病区"或"入院病房"下拉框
|
||||
- **期望结果**:「入院病区」应去重读取所有"待转科"患者的【转科申请-转入病区】字段值;「入院病房」应去重读取所有"待转科"患者的【转科申请-转入科室/病房】字段值
|
||||
|
||||
**图片关键信息**:图2中"入院病区"和"入院病房"下拉框展开后为空白,无任何选项数据,红色文字明确标注"应该取值当前有待转科患者的转入科室和转入病区的数据供护士筛选用"。
|
||||
|
||||
**综合总结**:护士在"转出"页面使用下拉框筛选待转科患者时,下拉框为空。原因是当前代码调用 `getPractitionerWard()` 获取的是当前登录护士被分配的病区列表,而不是从 `doc_order_process` 表中读取待转科患者的转入病区/转入科室数据。正确的数据源应该是所有 encounter_status=6(待转科)的患者的转科申请中的 targetLocationId 和 targetOrganizationId。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
**核心问题**:前端 `transferOut.vue` 的 `initData()` 函数调用 `getPractitionerWard()`(接口 `/app-common/practitioner-ward`)获取下拉数据,这个接口返回的是当前护士被分配的病区列表,与"待转科患者的转入病区/转入科室"无关。
|
||||
|
||||
**数据链路分析**:
|
||||
1. 医生提交转科申请时,`SpecialAdviceAppServiceImpl.saveTransferOrders()` 创建 `doc_order_process` 记录,其中:
|
||||
- `target_location_id` = 转入病区(对应 `adm_location` 表)
|
||||
- `target_organization_id` = 转入科室(对应 `adm_organization` 表)
|
||||
- `encounter_id` = 关联就诊记录
|
||||
2. 患者的 `adm_encounter.status_enum = 6`(PENDING_TRANSFER)
|
||||
3. 当前前端下拉框应该查询:`doc_order_process` JOIN `adm_encounter`(status=6),分别获取 DISTINCT `target_location_id` 和 `target_organization_id` 对应的名称
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-ui/src/views/inpatientNurse/inOut/components/transferOut.vue` — `initData()` 函数调用了错误的 API
|
||||
- `healthlink-his-server/.../inhospitalnursestation/controller/ATDManageController.java` — 需要新增端点
|
||||
- `healthlink-his-server/.../inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java` — 需要新增方法
|
||||
- `healthlink-his-server/.../inhospitalnursestation/mapper/ATDManageAppMapper.java` — 需要新增查询
|
||||
- `healthlink-his-server/.../resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml` — 需要新增 SQL
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
**后端(3个文件修改 + 1个新增查询):**
|
||||
|
||||
1. **`ATDManageAppMapper.java`** — 新增方法:
|
||||
```java
|
||||
List<Map<String, Object>> selectTransferWardOptions(Long currentUserOrgId);
|
||||
List<Map<String, Object>> selectTransferOrganizationOptions(Long currentUserOrgId);
|
||||
```
|
||||
或合并为一个方法返回两个列表。
|
||||
|
||||
2. **`ATDManageAppMapper.xml`** — 新增 SQL:
|
||||
```sql
|
||||
<!-- 获取待转科患者的转入病区去重列表 -->
|
||||
<select id="selectTransferWardOptions" resultType="map">
|
||||
SELECT DISTINCT al.id AS id, al.name AS name
|
||||
FROM doc_order_process dop
|
||||
JOIN adm_encounter ae ON ae.id = dop.encounter_id AND ae.delete_flag = '0'
|
||||
JOIN adm_location al ON al.id = dop.target_location_id AND al.delete_flag = '0'
|
||||
WHERE ae.status_enum = 6
|
||||
AND ae.class_enum = 1 -- 住院
|
||||
AND ae.organization_id = #{currentUserOrgId}
|
||||
AND ae.delete_flag = '0'
|
||||
AND dop.delete_flag = '0'
|
||||
</select>
|
||||
|
||||
<!-- 获取待转科患者的转入科室去重列表 -->
|
||||
<select id="selectTransferOrganizationOptions" resultType="map">
|
||||
SELECT DISTINCT ao.id AS id, ao.name AS name
|
||||
FROM doc_order_process dop
|
||||
JOIN adm_encounter ae ON ae.id = dop.encounter_id AND ae.delete_flag = '0'
|
||||
JOIN adm_organization ao ON ao.id = dop.target_organization_id AND ao.delete_flag = '0'
|
||||
WHERE ae.status_enum = 6
|
||||
AND ae.class_enum = 1
|
||||
AND ae.organization_id = #{currentUserOrgId}
|
||||
AND ae.delete_flag = '0'
|
||||
AND dop.delete_flag = '0'
|
||||
</select>
|
||||
```
|
||||
|
||||
3. **`IATDManageAppService.java` / `ATDManageAppServiceImpl.java`** — 新增方法:
|
||||
```java
|
||||
R<?> getTransferFilterOptions();
|
||||
```
|
||||
实现中调用 mapper 获取两个去重列表,返回 `{ wardList: [...], organizationList: [...] }`。
|
||||
|
||||
4. **`ATDManageController.java`** — 新增端点:
|
||||
```java
|
||||
@GetMapping("/transfer-filter-options")
|
||||
public R<?> getTransferFilterOptions() {
|
||||
return atdManageAppService.getTransferFilterOptions();
|
||||
}
|
||||
```
|
||||
|
||||
**前端(2个文件修改):**
|
||||
|
||||
5. **`api.js`** — 新增 API:
|
||||
```javascript
|
||||
export function getTransferFilterOptions() {
|
||||
return request({
|
||||
url: '/nurse-station/atd-manage/transfer-filter-options',
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
6. **`transferOut.vue`** — 修改 `initData()` 函数:
|
||||
- 将 `getPractitionerWard()` 替换为 `getTransferFilterOptions()`
|
||||
- 用返回的 `wardList` 填充 `initInfoOptions.value.wardListOptions`
|
||||
- 用返回的 `organizationList` 填充 `wardLocationList`(或新建变量 `organizationListOptions`)
|
||||
- 当选择"入院病区"时,应根据选择的 wardId 过滤对应的转入科室(可选优化,也可独立显示两个下拉框)
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER: zhaoyun**
|
||||
**REASON**: 这是一个纯前端+后端接口对接问题,涉及下拉框数据源替换。前端 `transferOut.vue` 是主体修改点(替换 API 调用和数据绑定),后端只需新增一个查询端点。赵云负责前端开发,且修改涉及 Vue 组件交互逻辑,由赵云主导、配合荀彧(新增 mapper SQL)最为合适。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: zhaoyun
|
||||
- **修复 Agent**: zhaoyun(前端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
15
MD/bugs/BUG_730_ANALYSIS.md
Normal file
15
MD/bugs/BUG_730_ANALYSIS.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Bug #730 分析报告
|
||||
|
||||
## 基本信息
|
||||
- Bug ID: 730
|
||||
- 标题: 【门诊医生工作站】医嘱下的个人组套都是空的删不掉
|
||||
- 严重程度: 3
|
||||
- 模块:
|
||||
|
||||
## 根因分析
|
||||
(待深入分析)
|
||||
|
||||
## 修复方案
|
||||
(待分析后确定)
|
||||
|
||||
FIXER_ID: zhaoyun
|
||||
179
MD/bugs/BUG_731_ANALYSIS.md
Normal file
179
MD/bugs/BUG_731_ANALYSIS.md
Normal file
@@ -0,0 +1,179 @@
|
||||
# Bug #731 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 00:39:06
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 731
|
||||
- **标题**: 【临床医嘱-转科】转科申请成功后主界面未自动刷新,且生成的医嘱名称与科室数据错误
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have a complete picture. Here's my analysis:
|
||||
|
||||
---
|
||||
|
||||
## Bug #731 分析报告
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道标题**:【临床医嘱-转科】转科申请成功后主界面未自动刷新,且生成的医嘱名称与科室数据错误
|
||||
|
||||
**重现步骤**:
|
||||
1. 登录住院医生工作站,选择在科患者(如:002,当前科室:呼吸内科病房)
|
||||
2. 进入"临床医嘱"页面,点击【转科】唤起申请弹窗
|
||||
3. 选择"转入科室"为【临床心理科】,"转入病区"为【第二病区】,填写原因后点击【确认】
|
||||
4. 弹窗关闭且提示"转科申请已提交"后,观察医嘱列表状态
|
||||
5. 手动点击【刷新数据】按钮后,核对自动生成的转科医嘱
|
||||
|
||||
**期望结果**:
|
||||
1. 提交成功后自动刷新医嘱列表
|
||||
2. 医嘱名称应为"转科-临床心理科"
|
||||
3. 药房/科室应为患者当前科室"呼吸内科病房"
|
||||
|
||||
**实际结果**:
|
||||
1. 未自动刷新,需手动点击"刷新数据"按钮
|
||||
2. 医嘱名称仅为"转科",缺少转入科室名
|
||||
3. 药房/科室显示为"信息科"(系统管理科室),完全错误
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
本 Bug 包含 **3 个独立问题**,根因分布在前端和后端:
|
||||
|
||||
#### 问题1:未自动刷新
|
||||
|
||||
**根因**:前端 `transferOrganizationDialog.vue` 在成功提交后没有 `emit('success')`,且父组件 `order/index.vue` 没有给该对话框绑定 `@success` 处理函数。
|
||||
|
||||
对比已正常工作的出院对话框 `leaveHospitalDialog.vue`:
|
||||
- 出院对话框有 `emit('success')` 调用
|
||||
- 父组件有 `@success="handleLeaveHospitalSuccess"` → `getListInfo(false)` 刷新列表
|
||||
- 转科对话框两处都缺失
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/applicationForm/transferOrganizationDialog.vue`(第149行附近 `submitApplicationForm`)
|
||||
- `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue`(第673行 `<TransferOrganizationDialog>`)
|
||||
|
||||
#### 问题2:医嘱名称仅为"转科"
|
||||
|
||||
**根因**:后端 `SpecialAdviceAppServiceImpl.saveTransferOrganizationOrders()` 中,`ServiceRequest` 的名称使用了诊疗目录定义的默认名称"转科"(来自 `CommonConstants.BusinessName.TRANSFER_ORGANIZATION = "转科"`),没有拼接转入科室名称。
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-server/.../regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.java`(`saveTransferOrganizationOrders` 方法,约第300行)
|
||||
|
||||
#### 问题3:药房/科室显示为"信息科"
|
||||
|
||||
**根因**:后端 `saveTransferOrganizationOrders()` 中设置了 `serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId())`,其中 `activityAdviceBaseDto` 是从诊疗目录(activity definition)获取的默认数据,其 `positionId` 对应的科室是"信息科"(转科医嘱定义的默认归属科室),而非患者当前所在科室。
|
||||
|
||||
对比出院医嘱 `saveLeaveHospitalOrders()` 使用了 `activityAdviceBaseDto.getPositionId()` 但出院医嘱没有这个问题(因为出院后不需要药房/科室归属)。转科医嘱需要显示的是**患者当前所在的科室**(转出科室)。
|
||||
|
||||
前端 `patientInfo` store 中有 `inHospitalOrgId`(入科科室ID),但后端 `TransferOrganizationParam` 没有传入原科室参数。
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-server/.../regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.java`(`saveTransferOrganizationOrders` 方法)
|
||||
- `healthlink-his-server/.../regdoctorstation/dto/TransferOrganizationParam.java`(缺少 `originalOrganizationId` 字段)
|
||||
- `healthlink-his-ui/.../order/applicationForm/transferOrganizationDialog.vue`(未传入原科室参数)
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
#### 修复1:自动刷新
|
||||
|
||||
**文件**:`transferOrganizationDialog.vue`
|
||||
```diff
|
||||
// 在 <script setup> 中添加 emit 定义
|
||||
+ const emit = defineEmits(['success']);
|
||||
|
||||
// submitApplicationForm 中成功后 emit
|
||||
transferOrganization(form).then((res) => {
|
||||
if (res.code == 200) {
|
||||
proxy.$modal.msgSuccess('转科申请已提交');
|
||||
dialogVisible.value = false;
|
||||
+ emit('success');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**文件**:`order/index.vue`
|
||||
```diff
|
||||
<TransferOrganizationDialog
|
||||
ref="transferOrganizationRef"
|
||||
+ @success="handleTransferOrgSuccess"
|
||||
/>
|
||||
|
||||
// 添加回调函数(在 handleTransferOrg 函数附近)
|
||||
+ function handleTransferOrgSuccess() {
|
||||
+ getListInfo(false);
|
||||
+ }
|
||||
```
|
||||
|
||||
#### 修复2:医嘱名称拼接科室
|
||||
|
||||
**文件**:`SpecialAdviceAppServiceImpl.java`(`saveTransferOrganizationOrders` 方法)
|
||||
|
||||
在创建 `ServiceRequest` 后、`save` 前,根据 `targetOrganizationId` 查询转入科室名称并拼接到请求名称中:
|
||||
|
||||
```diff
|
||||
serviceRequest.setRequesterId(practitionerId); // 开方医生
|
||||
serviceRequest.setEncounterId(encounterId); // 就诊id
|
||||
- serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()); // 执行科室(见修复3)
|
||||
+ // 查询转入科室名称,拼接到医嘱名称
|
||||
+ // 原名称"转科" → "转科-转入的科室名称"
|
||||
serviceRequest.setConditionId(conditionId); // 诊断id
|
||||
serviceRequest.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id
|
||||
```
|
||||
|
||||
需要在 `ServiceRequest` 上设置名称。具体做法:在 `AdviceManageAppMapper` 或 `SpecialAdviceAppMapper` 中添加查询方法,根据 `targetOrganizationId` 查询科室名称,然后:
|
||||
```java
|
||||
// 设置医嘱显示名称为 "转科-转入科室名"
|
||||
```
|
||||
|
||||
#### 修复3:药房/科室使用患者当前科室
|
||||
|
||||
**文件**:`TransferOrganizationParam.java`
|
||||
```diff
|
||||
+ /** 原科室(患者当前所在科室) */
|
||||
+ @JsonSerialize(using = ToStringSerializer.class)
|
||||
+ private Long originalOrganizationId;
|
||||
```
|
||||
|
||||
**文件**:`transferOrganizationDialog.vue`
|
||||
```diff
|
||||
form.encounterId = patientInfo.value.encounterId
|
||||
form.patientId = patientInfo.value.patientId
|
||||
+ form.originalOrganizationId = patientInfo.value.inHospitalOrgId
|
||||
```
|
||||
|
||||
**文件**:`SpecialAdviceAppServiceImpl.java`
|
||||
```diff
|
||||
- serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()); // 执行科室(诊疗定义默认)
|
||||
+ serviceRequest.setOrgId(transferOrganizationParam.getOriginalOrganizationId()); // 执行科室(患者当前科室)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER**: **zhaoyun** + **guanyu**(联合修复)
|
||||
|
||||
**REASON**:
|
||||
- **zhaoyun(赵云/前端)** 负责修复1(自动刷新):修改 `transferOrganizationDialog.vue` 添加 `emit('success')`,修改 `order/index.vue` 添加 `@success` 回调——纯前端改动
|
||||
- **guanyu(关羽/后端)** 负责修复2和修复3(医嘱名称+科室ID):修改 `TransferOrganizationParam.java` 添加 `originalOrganizationId` 字段,修改 `SpecialAdviceAppServiceImpl.java` 的 `saveTransferOrganizationOrders` 方法——纯后端改动
|
||||
|
||||
两个修复互不依赖,可以并行实施。但由于修复3(后端接收 `originalOrganizationId`)需要前端配合传参,**建议由 zhaoyun 先改前端(修复1+修复3前端部分),guanyu 同时改后端(修复2+修复3后端部分),最后联调验证**。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
195
MD/bugs/BUG_732_ANALYSIS.md
Normal file
195
MD/bugs/BUG_732_ANALYSIS.md
Normal file
@@ -0,0 +1,195 @@
|
||||
# Bug #732 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 00:30:55
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 732
|
||||
- **标题**: 【医嘱闭环-闭环统计】科室的闭环和未闭环医嘱预警加载卡死
|
||||
- **模块**: 系统管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Based on my analysis, I now have a clear picture of the root cause. Let me output the structured analysis.
|
||||
|
||||
---
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道原文引用:**
|
||||
- **标题**:【医嘱闭环-闭环统计】科室的闭环和未闭环医嘱预警加载卡死
|
||||
- **重现步骤**:登录内科医生1的账号:doctor1 密码:123456进入医嘱闭环打开闭环统计查看界面
|
||||
- **结果**:出现报错:`main.js:84 TypeError: Cannot convert object to primitive value`
|
||||
- **期望**:能够正常显示报卡的信息和操作界面
|
||||
|
||||
**附图分析关键信息:**
|
||||
- 页面标题"科室/医生闭环统计",右侧有"按科室"下拉和"刷新"按钮
|
||||
- 两个数据区域(科室/医生闭环统计表格、未闭环医嘱预警表格)均为空白,仅有蓝色加载动画圆圈(loading spinner)
|
||||
- 右上角红色标签"X 条待处理"但数字被遮挡
|
||||
- **核心异常**:控制台 `TypeError: Cannot convert object to primitive value`,导致两个表格数据加载卡死
|
||||
|
||||
**综合总结**:用户登录 doctor1 账号进入医嘱闭环统计页面,页面框架正常渲染但两个核心数据表格(科室/医生闭环统计、未闭环医嘱预警)均卡在 loading 状态无法加载数据。控制台报 `TypeError: Cannot convert object to primitive value`,表明前端在渲染过程中遇到了一个对象值被当作原始值使用的场景。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
经过全链路追踪(前端 Vue 组件 → API → Controller → AppService → Mapper SQL),根因是**多层问题叠加**:
|
||||
|
||||
#### 根因 1(直接触发 TypeError):PostgreSQL 列别名大小写折叠 + 前端 prop 不匹配
|
||||
|
||||
`OrderExecuteRecordMapper.java` 中的 4 个 SQL 查询使用了 camelCase 列别名:
|
||||
```sql
|
||||
-- selectGroupByDepartment
|
||||
SELECT COALESCE(m.department_name, '未知') AS department, COUNT(*) AS totalOrders, ...
|
||||
|
||||
-- selectGroupByDoctor
|
||||
SELECT COALESCE(m.doctor_name, '未知') AS doctorName, COUNT(*) AS totalOrders, ...
|
||||
|
||||
-- selectUnclosedWarnings
|
||||
SELECT e.order_no AS orderNo, e.patient_name AS patientName, ...
|
||||
```
|
||||
|
||||
**PostgreSQL 会将未加引号的标识符折叠为小写**。因此 JDBC ResultSet 返回的 Map key 全部是小写:
|
||||
- `totalOrders` → `totalorders`
|
||||
- `closedCount` → `closedcount`
|
||||
- `orderNo` → `orderno`
|
||||
- `patientName` → `patientname`
|
||||
- `orderType` → `ordertype`
|
||||
- `currentStep` → `currentstep`
|
||||
- `orderTime` → `ordertime`
|
||||
|
||||
Java 的 `getLong()`/`getString()` helper 有 `key.toLowerCase()` fallback,所以 Java 层计算正确。但 **`getGroupStats()` 返回的 Map 中同时存在**:
|
||||
- 小写 key(来自 SQL):`totalorders`, `closedcount`
|
||||
- camelCase key(Java 代码 put):`unclosedCount`, `closedRate`
|
||||
|
||||
前端模板使用 `prop="totalOrders"` 无法匹配 `totalorders`,导致表格列值为 `undefined`。
|
||||
|
||||
#### 根因 2(直接触发 TypeError):`el-progress` 接收到非 number 类型的 `percentage`
|
||||
|
||||
在 `<el-progress :percentage="scope.row.closedRate || 0">` 中:
|
||||
- `scope.row.closedRate` 是 Java 计算后 put 进 map 的 `double`,序列化为 JSON number → 正常
|
||||
- 但 `scope.row.closedRate` 如果因上游数据异常为非数字对象,`||` 不会拦截(对象是 truthy),`el-progress` 内部尝试数值转换时抛出 `TypeError: Cannot convert object to primitive value`
|
||||
|
||||
#### 根因 3(数据问题):`getUnclosedWarnings()` 未用 helper 处理 `orderTime`
|
||||
|
||||
```java
|
||||
// 第 143 行
|
||||
Object orderTimeObj = row.get("orderTime"); // ← PostgreSQL 返回的是 "ordertime",永远 null
|
||||
```
|
||||
|
||||
导致所有未闭环医嘱的 `overdueDuration` 都显示"未知",`orderTime` 都显示空字符串。
|
||||
|
||||
#### 根因 4(缺失数据源):`order_execute_record` 表与 `order_main` 表无关联数据
|
||||
|
||||
`selectGroupByDepartment` 等 SQL 做了 `LEFT JOIN order_main m ON e.order_no = m.order_no`,但 `order_execute_record` 是闭环追踪表,其中的 `order_no` 可能与 `order_main`(门诊挂号单表)中的 `order_no` **语义不同**——`order_main` 是门诊挂号/预约表,不是医嘱表。即使 JOIN 成功,`department_name` 和 `doctor_name` 也可能全为 NULL。
|
||||
|
||||
**涉及的关键文件:**
|
||||
|
||||
| 层 | 文件 | 行号 |
|
||||
|---|---|---|
|
||||
| Mapper SQL | `OrderExecuteRecordMapper.java` | 全部 4 个 `@Select` 方法 |
|
||||
| AppService | `OrderClosedLoopAppServiceImpl.java` | `getGroupStats()` L131-143, `getUnclosedWarnings()` L146-168 |
|
||||
| 前端组件 | `statistics/index.vue` | L74 `el-progress`, L84-88 `el-table-column`, L99-102 `el-progress` |
|
||||
| 前端 API | `orderclosedloop.js` | `getClosedLoopStatistics()` |
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
#### 修复 1:SQL 列别名加双引号保留大小写(根本修复)
|
||||
|
||||
修改 `OrderExecuteRecordMapper.java`,所有 SQL 别名加 PostgreSQL 双引号:
|
||||
|
||||
```sql
|
||||
-- selectOverviewByType
|
||||
SELECT e.order_type AS "orderType",
|
||||
COUNT(*) AS "totalOrders",
|
||||
COUNT(CASE WHEN e.execute_status = 'completed' THEN 1 END) AS "closedCount"
|
||||
|
||||
-- selectGroupByDepartment
|
||||
SELECT COALESCE(m.department_name, '未知') AS "department",
|
||||
COUNT(*) AS "totalOrders",
|
||||
COUNT(CASE WHEN e.execute_status = 'completed' THEN 1 END) AS "closedCount"
|
||||
|
||||
-- selectGroupByDoctor
|
||||
SELECT COALESCE(m.doctor_name, '未知') AS "doctorName",
|
||||
COUNT(*) AS "totalOrders",
|
||||
COUNT(CASE WHEN e.execute_status = 'completed' THEN 1 END) AS "closedCount"
|
||||
|
||||
-- selectUnclosedWarnings
|
||||
SELECT e.order_no AS "orderNo",
|
||||
e.patient_name AS "patientName",
|
||||
e.order_type AS "orderType",
|
||||
COALESCE(m.department_name, '未知') AS "department",
|
||||
COALESCE(m.doctor_name, '未知') AS "doctorName",
|
||||
e.current_step AS "currentStep",
|
||||
e.create_time AS "orderTime"
|
||||
```
|
||||
|
||||
这样 JDBC 返回的 Map key 就是精确的 camelCase,前端 `prop` 能正确匹配。
|
||||
|
||||
#### 修复 2:`getUnclosedWarnings()` 使用 helper 处理 `orderTime`
|
||||
|
||||
将 `row.get("orderTime")` 改为使用 `getString()` helper 或直接用小写 key:
|
||||
|
||||
```java
|
||||
// 修改前
|
||||
Object orderTimeObj = row.get("orderTime");
|
||||
|
||||
// 修改后(兼容大小写)
|
||||
Object orderTimeObj = row.get("orderTime");
|
||||
if (orderTimeObj == null) {
|
||||
orderTimeObj = row.get("ordertime");
|
||||
}
|
||||
```
|
||||
|
||||
或者更彻底地,在修复 1(SQL 加引号)之后,`row.get("orderTime")` 就能正确获取值。
|
||||
|
||||
#### 修复 3:前端 `el-progress` 添加防御性数值转换
|
||||
|
||||
在 `statistics/index.vue` 中,确保传给 `el-progress` 的 `percentage` 始终为 number:
|
||||
|
||||
```html
|
||||
<!-- 修复前 -->
|
||||
<el-progress :percentage="statistics.drugClosedRate || 0" :stroke-width="8" />
|
||||
|
||||
<!-- 修复后 -->
|
||||
<el-progress :percentage="Number(statistics.drugClosedRate) || 0" :stroke-width="8" />
|
||||
```
|
||||
|
||||
同理修复 `closedRate` 的绑定:
|
||||
```html
|
||||
<el-progress :percentage="Number(scope.row.closedRate) || 0" :stroke-width="12" />
|
||||
```
|
||||
|
||||
#### 修复 4:`getGroupStats()` 确保 key 一致性
|
||||
|
||||
在 `OrderClosedLoopAppServiceImpl.getGroupStats()` 中,显式 put camelCase key(即使修复 1 后 SQL 已正确,这是防御性编码):
|
||||
|
||||
```java
|
||||
// 在 item.put("unclosedCount", ...) 之前加:
|
||||
item.put("totalOrders", totalOrders);
|
||||
item.put("closedCount", closedCount);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER: zhaoyun(赵云 — 前端开发)**
|
||||
|
||||
**REASON**: 此 Bug 的直接表现是前端 TypeError 导致页面卡死,核心修复在前端模板的防御性编码(修复 3)和后端 Mapper SQL 的列别名引号处理(修复 1/2/4)。赵云负责前端修复(`statistics/index.vue` 中 `el-progress` 的数值转换),同时需要协调荀彧协助后端 Mapper SQL 修改(`OrderExecuteRecordMapper.java`)。前端权重更高(页面卡死的直接原因是前端渲染),由赵云主导。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: zhaoyun
|
||||
- **修复 Agent**: zhaoyun(前端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user