595 【住院护士站-医嘱校对】医嘱校对模块列表字段缺失严重,与医生站医嘱要素不一致,存在核对安全隐患

This commit is contained in:
wangjian963
2026-06-08 12:51:54 +08:00
parent 57f591e1c0
commit 376ddd46ff
5 changed files with 215 additions and 25 deletions

View File

@@ -230,6 +230,68 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
if (e.getBirthDate() != null) {
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
}
// ---------- Bug #595: 医嘱校对列表计算字段 ----------
// 单次剂量:剂量 + 单位
if (e.getDose() != null) {
String doseStr = e.getDose().stripTrailingZeros().toPlainString();
String unitStr = e.getDoseUnitCode_dictText() != null ? e.getDoseUnitCode_dictText() : "";
e.setSingleDose(doseStr + unitStr);
}
// 总量:剂量 × 数量 + 单位(仅药品医嘱)
if (e.getDose() != null && e.getQuantity() != null) {
BigDecimal total = e.getDose().multiply(BigDecimal.valueOf(e.getQuantity()));
String totalStr = total.stripTrailingZeros().toPlainString();
String unitStr = e.getUnitCode_dictText() != null ? e.getUnitCode_dictText() : "";
e.setTotalAmount(totalStr + unitStr);
} else if (e.getQuantity() != null) {
String unitStr = e.getUnitCode_dictText() != null ? e.getUnitCode_dictText() : "";
e.setTotalAmount(e.getQuantity() + unitStr);
}
// 频次/用法组合
StringBuilder freqBuilder = new StringBuilder();
if (e.getRateCode_dictText() != null && !e.getRateCode_dictText().isEmpty()) {
freqBuilder.append(e.getRateCode_dictText());
}
if (e.getMethodCode_dictText() != null && !e.getMethodCode_dictText().isEmpty()) {
if (freqBuilder.length() > 0) freqBuilder.append(" ");
freqBuilder.append(e.getMethodCode_dictText());
}
e.setFrequencyUsage(freqBuilder.length() > 0 ? freqBuilder.toString() : null);
// 开嘱医生
e.setOrderingDoctor(e.getRequesterId_dictText() != null
? e.getRequesterId_dictText() : e.getAdmittingDoctorName());
// 皮试状态 + 高亮
if (e.getSkinTestFlag() != null && e.getSkinTestFlag() == 1) {
e.setSkinTestStatus("需皮试");
e.setSkinTestHighlight(true);
} else if (e.getSkinTestFlag() != null && e.getSkinTestFlag() == 2) {
e.setSkinTestStatus("皮试通过");
e.setSkinTestHighlight(false);
} else {
e.setSkinTestStatus("无需");
e.setSkinTestHighlight(false);
}
// 注射药品标记
e.setIsInjection(e.getInjectFlag() != null && e.getInjectFlag() == 1);
// 停嘱医生
e.setStopperName(e.getStopperName());
// 停嘱时间
e.setStopTime(e.getEndTime());
// 医嘱号
e.setOrderNo(e.getRequestId() != null ? e.getRequestId().toString() : null);
// 诊断(行级)
e.setDiagnosis(e.getConditionNames());
});
// 获取医嘱列表

View File

@@ -259,4 +259,40 @@ public class InpatientAdviceDto {
/** 发药状态 */
private Integer dispenseStatus;
private String dispenseStatus_enumText;
// ========== Bug #595 计算展示字段 ==========
/** 单次剂量(格式化:剂量+单位) */
private String singleDose;
/** 总量(格式化:剂量×数量+单位) */
private String totalAmount;
/** 频次/用法组合tid 静滴) */
private String frequencyUsage;
/** 开嘱医生 */
private String orderingDoctor;
/** 皮试状态文本(需皮试/皮试通过/无需) */
private String skinTestStatus;
/** 皮试高亮标记需皮试时为true */
private Boolean skinTestHighlight;
/** 是否注射药品 */
private Boolean isInjection;
/** 停嘱医生 */
private String stopperName;
/** 停嘱时间 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date stopTime;
/** 医嘱号 */
private String orderNo;
/** 诊断(行级展示) */
private String diagnosis;
}

View File

@@ -154,7 +154,11 @@
ii.account_id AS account_id,
ii.performer_check_id,
ii.category_code,
ii.dispense_status
ii.dispense_status,
ii.unit_price,
ii.total_price,
ii.stopper_id,
ii.stopper_name
FROM (( SELECT DISTINCT T1.encounter_id,
T1.tenant_id,
#{medMedicationRequest} AS advice_table,
@@ -199,7 +203,11 @@
personal_account.balance_amount,
personal_account.id AS account_id,
T2.category_code,
mmd.status_enum AS dispense_status
mmd.status_enum AS dispense_status,
NULL::numeric AS unit_price,
NULL::numeric AS total_price,
NULL::bigint AS stopper_id,
NULL::varchar AS stopper_name
FROM med_medication_request AS T1
LEFT JOIN med_medication_definition AS T2
ON T2.id = T1.medication_id
@@ -341,7 +349,11 @@
personal_account.balance_amount,
personal_account.id AS account_id,
T2.category_code,
NULL::integer AS dispense_status
NULL::integer AS dispense_status,
NULL::numeric AS unit_price,
NULL::numeric AS total_price,
NULL::bigint AS stopper_id,
NULL::varchar AS stopper_name
FROM wor_service_request AS T1
LEFT JOIN wor_activity_definition AS T2
ON T2.id = T1.activity_id

View File

@@ -1,18 +1,19 @@
<template>
<div style="height: calc(100vh - 126px)">
<div style="height: calc(100vh - 126px); display: flex; flex-direction: column; overflow: hidden">
<div
style="
height: 51px;
border-bottom: 2px solid #e4e7ed;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
flex-shrink: 0;
overflow: hidden;
"
>
<div>
<div style="display: flex; align-items: center; gap: 12px; flex-shrink: 1; min-width: 0;">
<el-radio-group
v-model="type"
class="ml20"
@change="handleRadioChange"
>
<el-radio :value="null">
@@ -26,7 +27,6 @@
</el-radio>
</el-radio-group>
<el-button
class="ml20"
type="primary"
plain
@click="handleGetPrescription"
@@ -34,21 +34,20 @@
查询
</el-button>
</div>
<div>
<span class="descriptions-item-label">全选</span>
<div style="flex: 1; min-width: 0;"></div>
<div style="display: flex; align-items: center; gap: 12px; flex-shrink: 1; min-width: 0;">
<span class="descriptions-item-label" style="flex-shrink: 0;">全选</span>
<el-switch
v-model="chooseAll"
@change="handelSwitchChange"
/>
<el-button
class="ml20"
type="primary"
@click="handleCheck"
>
核对通过
</el-button>
<el-button
class="ml20 mr20"
type="danger"
:disabled="hasDispensedSelected"
@click="handleCancel"
@@ -59,7 +58,7 @@
</div>
<div
v-loading="loading"
style="padding: 10px; background-color: #eef9fd; height: 100%; overflow-y: auto"
style="padding: 10px; background-color: #eef9fd; flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden"
>
<el-collapse
v-if="prescriptionList.length > 0"
@@ -69,8 +68,6 @@
border-bottom: 0px;
border-top: 0px;
border-radius: 0px;
overflow-y: auto;
max-height: calc(100vh - 200px);
"
>
<el-collapse-item
@@ -81,12 +78,11 @@
border: 2px solid #e4e7ed;
border-radius: 8px;
margin-bottom: 10px;
overflow: hidden;
"
>
<template #title>
<div style="display: flex; justify-content: space-between; align-items: center">
<div>
<div style="display: flex; gap: 16px; align-items: center; width: 100%; min-width: 0; overflow: hidden">
<div style="flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding-right: 12px;">
<span>{{ item[0].bedName + '【' + item[0].busNo + '】' }}</span>
<span>
{{
@@ -103,17 +99,18 @@
<div
style="
display: flex;
justify-content: space-between;
gap: 20px;
align-items: center;
margin-right: 20px;
flex-shrink: 1;
min-width: 0;
overflow: hidden;
"
>
<div style="display: inline-block; margin-right: 10px">
<div style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;">
<span class="descriptions-item-label">住院医生</span>
<span>{{ item[0].requesterId_dictText }}</span>
</div>
<div style="display: inline-block; margin-right: 10px">
<div style="white-space: nowrap; flex-shrink: 0;">
<div
class="descriptions-item-label"
style="height: 20px; line-height: 20px; text-align: center; margin: 0"
@@ -135,6 +132,7 @@
</div>
</div>
</template>
<div style="overflow-x: auto">
<vxe-table
:ref="'tableRef' + index"
:data="item"
@@ -168,6 +166,7 @@
<vxe-column
title="医嘱内容"
field="adviceName"
min-width="220"
>
<template #default="scope">
<span>
@@ -217,7 +216,88 @@
field="requestTime"
width="230"
/>
<vxe-column
title="开始时间"
field="startTime"
width="150"
align="center"
/>
<vxe-column
title="单次剂量"
field="singleDose"
width="100"
align="center"
/>
<vxe-column
title="总量"
field="totalAmount"
width="100"
align="center"
/>
<vxe-column
title="频次/用法"
field="frequencyUsage"
width="110"
align="center"
/>
<vxe-column
title="皮试"
field="skinTestStatus"
width="90"
align="center"
>
<template #default="scope">
<el-tag
v-if="scope.row.skinTestStatus"
:type="scope.row.skinTestHighlight ? 'danger' : 'info'"
:class="{ 'skin-test-warning': scope.row.skinTestHighlight }"
size="small"
>
{{ scope.row.skinTestStatus }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="注射药品"
field="isInjection"
width="90"
align="center"
>
<template #default="scope">
<el-tag
v-if="scope.row.isInjection"
type="warning"
size="small"
>
注射
</el-tag>
</template>
</vxe-column>
<vxe-column
title="开嘱医生"
field="orderingDoctor"
width="100"
align="center"
/>
<vxe-column
title="诊断"
field="diagnosis"
min-width="150"
/>
<vxe-column
title="停嘱时间"
field="stopTime"
width="150"
align="center"
/>
<vxe-column
title="停嘱医生"
field="stopperName"
width="100"
align="center"
/>
</vxe-table>
</div>
</el-collapse-item>
</el-collapse>
<el-empty

View File

@@ -1,6 +1,6 @@
<template>
<div style="display: flex; justify-content: space-between">
<div style="width: 20%; height: 90vh; border-right: solid 2px #e4e7ed">
<div style="display: flex; height: 90vh; overflow: hidden">
<div style="width: 20%; flex-shrink: 0; border-right: solid 2px #e4e7ed; overflow: hidden">
<div
style="
height: 40px;
@@ -37,7 +37,7 @@
-->
</el-tabs>
</div>
<div style="width: 100%">
<div style="flex: 1; min-width: 0; overflow: hidden">
<el-tabs
v-model="activeName"
class="centered-tabs"