54 lines
2.3 KiB
Markdown
54 lines
2.3 KiB
Markdown
# Bug #523 分析报告
|
||
|
||
## Bug 描述
|
||
[住院医生站-临床医嘱] 待保存医嘱总金额显示缺失且编辑态单位选择框变为数字控件
|
||
|
||
## 根因分析
|
||
|
||
### 问题1:总金额显示为 "-"
|
||
**文件**: `openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue`
|
||
|
||
**根因**: `setValue()` 函数(约1441行)在选中药品后初始化行数据时:
|
||
- 设置了 `unitPrice`、`minUnitPrice`(西药/中成药/中草药)
|
||
- 设置了诊疗类型的 `totalPrice`(adviceType==3 分支,1537-1538行)
|
||
- **但没有为药品类型(adviceType==1)计算 `totalPrice`**
|
||
|
||
`totalPrice` 只在用户后续交互(修改总量、切换单位)时通过 `calculateTotalAmount()` 才计算。
|
||
列表显示逻辑(259行):`scope.row.totalPrice ? ... : '-'`,未设置则显示横杠。
|
||
|
||
**数据流**: 选药 → setValue(设unitPrice) → 用户填总量 → calculateTotalAmount(算totalPrice) → 列表显示
|
||
**问题**: 用户选好药后还没触发计算事件时,totalPrice 为空
|
||
|
||
### 问题2:编辑态单位选择框变为数字控件
|
||
**文件**: `openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue`
|
||
|
||
**根因**: `setValue()` 函数(1518行)中:
|
||
```js
|
||
unitCode: row.partAttributeEnum == 1 ? row.minUnitCode : row.unitCode,
|
||
```
|
||
后端返回的 `row.unitCode` / `row.minUnitCode` 可能是 **Number 类型**。
|
||
而 `row.unitCodeList` 中每个 option 的 `value` 是 `String` 类型(从后端字典值来)。
|
||
|
||
当 `el-select` 的 `v-model` 值(Number)与所有 option 的 `value`(String)类型不匹配时,
|
||
Element Plus 无法找到匹配选项,渲染异常,表现为数字输入控件。
|
||
|
||
## 修复方案
|
||
|
||
### 修复1(总金额)
|
||
在 `setValue()` 的药品分支中,设置价格后立即计算初始 `totalPrice`:
|
||
```js
|
||
// 在 positionName 设置后添加:
|
||
totalPrice: row.quantity ? (row.unitCode == row.minUnitCode
|
||
? (row.quantity * row.minUnitPrice).toFixed(6)
|
||
: (row.quantity * row.unitPrice).toFixed(6))
|
||
: undefined,
|
||
```
|
||
|
||
### 修复2(单位选择框)
|
||
在 `setValue()` 的 `updatedRow` 中,将 `unitCode` 和 `minUnitCode` 转为字符串:
|
||
```js
|
||
minUnitCode: String(row.minUnitCode),
|
||
unitCode: row.partAttributeEnum == 1 ? String(row.minUnitCode) : String(row.unitCode),
|
||
```
|
||
确保与 el-option 的 value(String)类型一致。
|