Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
@@ -140,8 +140,8 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
|
|||||||
.setSourceEnum(ConditionDefinitionSource.TRADITIONAL_CHINESE_MEDICINE_SYNDROME_CATALOG.getValue());
|
.setSourceEnum(ConditionDefinitionSource.TRADITIONAL_CHINESE_MEDICINE_SYNDROME_CATALOG.getValue());
|
||||||
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(conditionDefinition, searchKey,
|
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(conditionDefinition, searchKey,
|
||||||
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null);
|
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null);
|
||||||
// 设置排序
|
// 设置排序(与诊断目录页保持一致,按编码升序,确保取到原始标准编码记录)
|
||||||
queryWrapper.orderByDesc("update_time");
|
queryWrapper.orderByAsc("condition_code");
|
||||||
// 诊断信息
|
// 诊断信息
|
||||||
Page<ConditionDefinitionMetadata> conditionDefinitionMetadataPage = HisPageUtils
|
Page<ConditionDefinitionMetadata> conditionDefinitionMetadataPage = HisPageUtils
|
||||||
.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, ConditionDefinitionMetadata.class);
|
.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, ConditionDefinitionMetadata.class);
|
||||||
|
|||||||
@@ -268,15 +268,9 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
|||||||
e.setSingleDose(doseStr + unitStr);
|
e.setSingleDose(doseStr + unitStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 总量:剂量 × 数量 + 单位(仅药品医嘱)
|
// 总量:数量(总量就是数量,不需要乘以剂量,单位由前端显示)
|
||||||
if (e.getDose() != null && e.getQuantity() != null) {
|
if (e.getQuantity() != null) {
|
||||||
BigDecimal total = e.getDose().multiply(BigDecimal.valueOf(e.getQuantity()));
|
e.setTotalAmount(String.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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 频次/用法组合
|
// 频次/用法组合
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
-- Bug #818: TPR变更体温单下拉框无数据 — 补充缺失的字典类型和字典数据
|
||||||
|
-- 涉及的字典: temperature_select_type, breathe_unit, measurement_select_type,
|
||||||
|
-- urination_frequency_unit, stoolfrequency_unit
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 1. 插入字典类型 (sys_dict_type)
|
||||||
|
-- ============================================================
|
||||||
|
INSERT INTO sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark)
|
||||||
|
VALUES
|
||||||
|
(543, '体温测量类型', 'temperature_select_type', '0', 'admin', NOW(), 'TPR体温单-体温下拉选项'),
|
||||||
|
(544, '呼吸类型', 'breathe_unit', '0', 'admin', NOW(), 'TPR体温单-呼吸下拉选项'),
|
||||||
|
(545, '测量特殊状态', 'measurement_select_type', '0', 'admin', NOW(), 'TPR体温单-体重/腹围/身高特殊状态'),
|
||||||
|
(546, '小便次数符号', 'urination_frequency_unit', '0', 'admin', NOW(), 'TPR体温单-小便次数特殊符号'),
|
||||||
|
(547, '大便次数符号', 'stoolfrequency_unit', '0', 'admin', NOW(), 'TPR体温单-大便次数特殊符号')
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 2. 插入字典数据 (sys_dict_data)
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
-- temperature_select_type: 腋温/口温/额温/耳温/肛温 + 拒测/外出/请假
|
||||||
|
-- Codes 1-5 = measurement types (do NOT replace temperature value)
|
||||||
|
-- Codes 6-8 = special statuses (replace temperature value with text)
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4142, 1, '腋温', '1', 'temperature_select_type', '', 'default', 'Y', '0', 'admin', NOW()),
|
||||||
|
(4143, 2, '口温', '2', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4144, 3, '额温', '3', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4145, 4, '耳温', '4', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4146, 5, '肛温', '5', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4147, 6, '拒测', '6', 'temperature_select_type', '', 'danger', 'N', '0', 'admin', NOW()),
|
||||||
|
(4148, 7, '外出', '7', 'temperature_select_type', '', 'warning', 'N', '0', 'admin', NOW()),
|
||||||
|
(4149, 8, '请假', '8', 'temperature_select_type', '', 'info', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- breathe_unit: 平稳/急促/浅慢/叹息样呼吸/潮式呼吸/抑制呼吸/@
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4150, 1, '平稳', '1', 'breathe_unit', '', 'success', 'Y', '0', 'admin', NOW()),
|
||||||
|
(4151, 2, '急促', '2', 'breathe_unit', '', 'danger', 'N', '0', 'admin', NOW()),
|
||||||
|
(4152, 3, '浅慢', '3', 'breathe_unit', '', 'warning', 'N', '0', 'admin', NOW()),
|
||||||
|
(4153, 4, '叹息样呼吸', '4', 'breathe_unit', '', 'info', 'N', '0', 'admin', NOW()),
|
||||||
|
(4154, 5, '潮式呼吸', '5', 'breathe_unit', '', 'info', 'N', '0', 'admin', NOW()),
|
||||||
|
(4155, 6, '抑制呼吸', '6', 'breathe_unit', '', 'danger', 'N', '0', 'admin', NOW()),
|
||||||
|
(4156, 7, '@', '7', 'breathe_unit', '', 'default', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- measurement_select_type: 卧床/未测
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4157, 1, '卧床', '1', 'measurement_select_type', '', 'warning', 'N', '0', 'admin', NOW()),
|
||||||
|
(4158, 2, '未测', '2', 'measurement_select_type', '', 'info', 'Y', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- urination_frequency_unit: ※/C
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4159, 1, '※', '1', 'urination_frequency_unit', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4160, 2, 'C', '2', 'urination_frequency_unit', '', 'default', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- stoolfrequency_unit: ※/☆/人工肛门
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4161, 1, '※', '1', 'stoolfrequency_unit', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4162, 2, '☆', '2', 'stoolfrequency_unit', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4163, 3, '人工肛门', '3', 'stoolfrequency_unit', '', 'default', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
-- Bug #818: TPR变更体温单下拉框无数据 — 完整修复
|
||||||
|
-- 原因: V20260626_2 使用的 dict_code 4142-4163 已被其他字典占用(rate_code/inpatient_diag_category/separate_decocting),
|
||||||
|
-- dict_id 543-546 也被占用,导致 ON CONFLICT DO NOTHING 跳过所有插入。
|
||||||
|
-- 本迁移使用全新未占用的 dict_id(548-552) 和 dict_code(4237-4258)。
|
||||||
|
-- 同时恢复被 V20260626_2 误覆盖的两行原始数据(dict_code 4142→rate_code, 4153→inpatient_diag_category)。
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 1. 恢复被误覆盖的两行原始 dict_type
|
||||||
|
-- ============================================================
|
||||||
|
UPDATE sys_dict_data SET dict_type = 'rate_code' WHERE dict_code = 4142;
|
||||||
|
UPDATE sys_dict_data SET dict_type = 'inpatient_diag_category' WHERE dict_code = 4153;
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 2. 插入字典类型 (sys_dict_type) — dict_id 548-552
|
||||||
|
-- ============================================================
|
||||||
|
INSERT INTO sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark)
|
||||||
|
VALUES
|
||||||
|
(548, '体温测量类型', 'temperature_select_type', '0', 'admin', NOW(), 'TPR体温单-体温下拉选项'),
|
||||||
|
(549, '呼吸类型', 'breathe_unit', '0', 'admin', NOW(), 'TPR体温单-呼吸下拉选项'),
|
||||||
|
(550, '测量特殊状态', 'measurement_select_type', '0', 'admin', NOW(), 'TPR体温单-体重/腹围/身高特殊状态'),
|
||||||
|
(551, '小便次数符号', 'urination_frequency_unit', '0', 'admin', NOW(), 'TPR体温单-小便次数特殊符号'),
|
||||||
|
(552, '大便次数符号', 'stoolfrequency_unit', '0', 'admin', NOW(), 'TPR体温单-大便次数特殊符号')
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 3. 插入字典数据 (sys_dict_data) — dict_code 4237-4258
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
-- temperature_select_type: 腋温/口温/额温/耳温/肛温 + 拒测/外出/请假
|
||||||
|
-- Codes 1-5 = measurement types (do NOT replace temperature value)
|
||||||
|
-- Codes 6-8 = special statuses (replace temperature value with text)
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4237, 1, '腋温', '1', 'temperature_select_type', '', 'default', 'Y', '0', 'admin', NOW()),
|
||||||
|
(4238, 2, '口温', '2', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4239, 3, '额温', '3', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4240, 4, '耳温', '4', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4241, 5, '肛温', '5', 'temperature_select_type', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4242, 6, '拒测', '6', 'temperature_select_type', '', 'danger', 'N', '0', 'admin', NOW()),
|
||||||
|
(4243, 7, '外出', '7', 'temperature_select_type', '', 'warning', 'N', '0', 'admin', NOW()),
|
||||||
|
(4244, 8, '请假', '8', 'temperature_select_type', '', 'info', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- breathe_unit: 平稳/急促/浅慢/叹息样呼吸/潮式呼吸/抑制呼吸/@
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4245, 1, '平稳', '1', 'breathe_unit', '', 'success', 'Y', '0', 'admin', NOW()),
|
||||||
|
(4246, 2, '急促', '2', 'breathe_unit', '', 'danger', 'N', '0', 'admin', NOW()),
|
||||||
|
(4247, 3, '浅慢', '3', 'breathe_unit', '', 'warning', 'N', '0', 'admin', NOW()),
|
||||||
|
(4248, 4, '叹息样呼吸', '4', 'breathe_unit', '', 'info', 'N', '0', 'admin', NOW()),
|
||||||
|
(4249, 5, '潮式呼吸', '5', 'breathe_unit', '', 'info', 'N', '0', 'admin', NOW()),
|
||||||
|
(4250, 6, '抑制呼吸', '6', 'breathe_unit', '', 'danger', 'N', '0', 'admin', NOW()),
|
||||||
|
(4251, 7, '@', '7', 'breathe_unit', '', 'default', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- measurement_select_type: 卧床/未测
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4252, 1, '卧床', '1', 'measurement_select_type', '', 'warning', 'N', '0', 'admin', NOW()),
|
||||||
|
(4253, 2, '未测', '2', 'measurement_select_type', '', 'info', 'Y', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- urination_frequency_unit: ※/C
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4254, 1, '※', '1', 'urination_frequency_unit', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4255, 2, 'C', '2', 'urination_frequency_unit', '', 'default', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- stoolfrequency_unit: ※/☆/人工肛门
|
||||||
|
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES
|
||||||
|
(4256, 1, '※', '1', 'stoolfrequency_unit', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4257, 2, '☆', '2', 'stoolfrequency_unit', '', 'default', 'N', '0', 'admin', NOW()),
|
||||||
|
(4258, 3, '人工肛门', '3', 'stoolfrequency_unit', '', 'default', 'N', '0', 'admin', NOW())
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
-- Bug #806: lab_apply 表增加 encounter_id 列,用于按就诊流水隔离检验申请单
|
||||||
|
ALTER TABLE lab_apply ADD COLUMN IF NOT EXISTS encounter_id bigint;
|
||||||
|
|
||||||
|
-- 对已有数据:尝试通过 visit_no 关联 adm_encounter.bus_no 回填 encounter_id
|
||||||
|
UPDATE lab_apply la
|
||||||
|
SET encounter_id = ae.id
|
||||||
|
FROM adm_encounter ae
|
||||||
|
WHERE la.visit_no IS NOT NULL
|
||||||
|
AND la.visit_no <> ''
|
||||||
|
AND la.visit_no = ae.bus_no
|
||||||
|
AND la.delete_flag = '0'
|
||||||
|
AND ae.delete_flag = '0';
|
||||||
@@ -23,9 +23,8 @@
|
|||||||
t1.apply_status AS applyStatus,
|
t1.apply_status AS applyStatus,
|
||||||
t1.apply_remark AS applyRemark
|
t1.apply_remark AS applyRemark
|
||||||
FROM lab_apply AS t1
|
FROM lab_apply AS t1
|
||||||
INNER JOIN adm_encounter AS t3 ON t1.patient_id::bigint = t3.patient_id
|
|
||||||
WHERE t1.delete_flag = '0'
|
WHERE t1.delete_flag = '0'
|
||||||
AND t3.id = #{encounterId}
|
AND t1.encounter_id = #{encounterId}
|
||||||
ORDER BY t1.apply_time DESC
|
ORDER BY t1.apply_time DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@@ -124,6 +124,11 @@ public class InspectionLabApply extends HisBaseEntity {
|
|||||||
* 备注
|
* 备注
|
||||||
*/
|
*/
|
||||||
private String applyRemark;
|
private String applyRemark;
|
||||||
|
/**
|
||||||
|
* 就诊ID(本次就诊流水,用于数据隔离)
|
||||||
|
*/
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
|
private Long encounterId;
|
||||||
/**
|
/**
|
||||||
* 操作员工号
|
* 操作员工号
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2001,16 +2001,16 @@ const formatAmount = (amount) => {
|
|||||||
|
|
||||||
// 单据状态标签文字
|
// 单据状态标签文字
|
||||||
const getStatusLabel = (applyStatus, row) => {
|
const getStatusLabel = (applyStatus, row) => {
|
||||||
// applyStatus: 0=待开立, 1=已开立(已签发)
|
// applyStatus: 0=待签发, 1=已签发
|
||||||
// 结合收费/执行标记推导更丰富的状态
|
// 结合收费/执行标记推导更丰富的状态
|
||||||
if (applyStatus === 1) {
|
if (applyStatus === 1) {
|
||||||
// 已收费后根据执行标记判断
|
// 已收费后根据执行标记判断
|
||||||
if (row.needExecute === true) {
|
if (row.needExecute === true) {
|
||||||
return '已执行'
|
return '已执行'
|
||||||
}
|
}
|
||||||
return '已开立'
|
return '已签发'
|
||||||
}
|
}
|
||||||
return '待开立'
|
return '待签发'
|
||||||
}
|
}
|
||||||
|
|
||||||
// 单据状态标签颜色
|
// 单据状态标签颜色
|
||||||
|
|||||||
@@ -40,18 +40,20 @@
|
|||||||
label="中医证候"
|
label="中医证候"
|
||||||
prop="syndromeCode"
|
prop="syndromeCode"
|
||||||
>
|
>
|
||||||
<el-cascader
|
<el-select
|
||||||
ref="cascaderRef"
|
|
||||||
v-model="formData.syndromeCode"
|
v-model="formData.syndromeCode"
|
||||||
:options="getGroupedSyndromeOptions(syndromeOptions)"
|
|
||||||
:props="{ emitPath: false, checkStrictly: true }"
|
|
||||||
:show-all-levels="false"
|
|
||||||
placeholder="请选择中医证候"
|
placeholder="请选择中医证候"
|
||||||
filterable
|
filterable
|
||||||
clearable
|
clearable
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
@change="handleSyndromeCodeChange"
|
>
|
||||||
/>
|
<el-option
|
||||||
|
v-for="item in syndromeOptions"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
@@ -81,7 +83,6 @@ const { proxy } = getCurrentInstance()
|
|||||||
|
|
||||||
const conditionOptions = ref([])
|
const conditionOptions = ref([])
|
||||||
const syndromeOptions = ref([])
|
const syndromeOptions = ref([])
|
||||||
const cascaderRef = ref(null)
|
|
||||||
|
|
||||||
const formData = ref({
|
const formData = ref({
|
||||||
conditionCode: '',
|
conditionCode: '',
|
||||||
@@ -176,154 +177,6 @@ const openAct = () => {
|
|||||||
loadConditionOptions()
|
loadConditionOptions()
|
||||||
loadSyndromeOptions()
|
loadSyndromeOptions()
|
||||||
}
|
}
|
||||||
function getGroupedSyndromeOptions(options) {
|
|
||||||
if (!options || !options.length) return []
|
|
||||||
|
|
||||||
const seen = new Set()
|
|
||||||
const uniqueOptions = []
|
|
||||||
options.forEach(item => {
|
|
||||||
if (!seen.has(item.label)) {
|
|
||||||
seen.add(item.label)
|
|
||||||
uniqueOptions.push(item)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const nameToItems = {}
|
|
||||||
uniqueOptions.forEach(item => {
|
|
||||||
const name = item.label
|
|
||||||
if (!nameToItems[name]) {
|
|
||||||
nameToItems[name] = []
|
|
||||||
}
|
|
||||||
nameToItems[name].push(item)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Level 3 Children of 阴证 (寒证, 虚证)
|
|
||||||
const childrenOfYin = []
|
|
||||||
;['寒证', '虚证'].forEach(name => {
|
|
||||||
if (nameToItems[name]) {
|
|
||||||
childrenOfYin.push(...nameToItems[name])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Level 3 Children of 阳证 (热证, 实证)
|
|
||||||
const childrenOfYang = []
|
|
||||||
;['热证', '实证'].forEach(name => {
|
|
||||||
if (nameToItems[name]) {
|
|
||||||
childrenOfYang.push(...nameToItems[name])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Level 2 under 八纲总纲 (阴证, 阳证)
|
|
||||||
const level2OfBagang = []
|
|
||||||
|
|
||||||
if (nameToItems['阴证']) {
|
|
||||||
nameToItems['阴证'].forEach(item => {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: item.value,
|
|
||||||
label: item.label,
|
|
||||||
id: item.id,
|
|
||||||
children: childrenOfYin.length ? childrenOfYin : undefined
|
|
||||||
})
|
|
||||||
})
|
|
||||||
} else if (childrenOfYin.length > 0) {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: 'virtual-yin',
|
|
||||||
label: '阴证',
|
|
||||||
children: childrenOfYin
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nameToItems['阳证']) {
|
|
||||||
nameToItems['阳证'].forEach(item => {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: item.value,
|
|
||||||
label: item.label,
|
|
||||||
id: item.id,
|
|
||||||
children: childrenOfYang.length ? childrenOfYang : undefined
|
|
||||||
})
|
|
||||||
})
|
|
||||||
} else if (childrenOfYang.length > 0) {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: 'virtual-yang',
|
|
||||||
label: '阳证',
|
|
||||||
children: childrenOfYang
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Level 2 under 危重急症 (闭证, 脱证)
|
|
||||||
const level2OfWeizhong = []
|
|
||||||
;['闭证', '脱证'].forEach(name => {
|
|
||||||
if (nameToItems[name]) {
|
|
||||||
level2OfWeizhong.push(...nameToItems[name])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Level 2 under 其他证候 (all other syndromes)
|
|
||||||
const level2OfOther = []
|
|
||||||
const specialNames = new Set(['阴证', '阳证', '寒证', '热证', '虚证', '实证', '闭证', '脱证'])
|
|
||||||
options.forEach(item => {
|
|
||||||
if (!specialNames.has(item.label)) {
|
|
||||||
level2OfOther.push(item)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const finalTree = []
|
|
||||||
|
|
||||||
if (level2OfBagang.length > 0) {
|
|
||||||
finalTree.push({
|
|
||||||
value: 'root-bagang',
|
|
||||||
label: '八纲总纲',
|
|
||||||
children: level2OfBagang
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (level2OfWeizhong.length > 0) {
|
|
||||||
finalTree.push({
|
|
||||||
value: 'root-weizhong',
|
|
||||||
label: '危重急症',
|
|
||||||
children: level2OfWeizhong
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (level2OfOther.length > 0) {
|
|
||||||
finalTree.push({
|
|
||||||
value: 'root-other',
|
|
||||||
label: '其他证候',
|
|
||||||
children: level2OfOther
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return finalTree
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleSyndromeCodeChange(val) {
|
|
||||||
console.log('handleSyndromeCodeChange called with:', val)
|
|
||||||
if (val === 'root-bagang' || val === 'root-weizhong' || val === 'root-other' || (typeof val === 'string' && val.startsWith('virtual-'))) {
|
|
||||||
formData.value.syndromeCode = ''
|
|
||||||
} else if (val) {
|
|
||||||
if (cascaderRef.value) {
|
|
||||||
console.log('Cascader Ref component instance:', cascaderRef.value)
|
|
||||||
if (typeof cascaderRef.value.togglePopperVisible === 'function') {
|
|
||||||
cascaderRef.value.togglePopperVisible(false)
|
|
||||||
}
|
|
||||||
if (typeof cascaderRef.value.toggleDropDownVisible === 'function') {
|
|
||||||
cascaderRef.value.toggleDropDownVisible(false)
|
|
||||||
}
|
|
||||||
cascaderRef.value.popperVisible = false
|
|
||||||
if (typeof cascaderRef.value.blur === 'function') {
|
|
||||||
cascaderRef.value.blur()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (document.activeElement && typeof document.activeElement.blur === 'function') {
|
|
||||||
console.log('Blurring active element:', document.activeElement)
|
|
||||||
document.activeElement.blur()
|
|
||||||
}
|
|
||||||
setTimeout(() => {
|
|
||||||
document.body.click()
|
|
||||||
}, 50)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const closedAct = () => {
|
const closedAct = () => {
|
||||||
emit('update:visible', false)
|
emit('update:visible', false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -268,19 +268,22 @@
|
|||||||
:prop="`diagnosisList.${scope.rowIndex}.tcmSyndromeCode`"
|
:prop="`diagnosisList.${scope.rowIndex}.tcmSyndromeCode`"
|
||||||
:rules="scope.row.diagnosisSystem === '中医' ? [{ required: true, message: '请选择中医证候', trigger: 'change' }] : []"
|
:rules="scope.row.diagnosisSystem === '中医' ? [{ required: true, message: '请选择中医证候', trigger: 'change' }] : []"
|
||||||
>
|
>
|
||||||
<el-cascader
|
<el-select
|
||||||
:ref="el => setCascaderRef(el, scope.rowIndex)"
|
|
||||||
v-model="scope.row.tcmSyndromeCode"
|
v-model="scope.row.tcmSyndromeCode"
|
||||||
:options="getGroupedSyndromeOptions(scope.row.syndromeOptions)"
|
|
||||||
:props="{ emitPath: false, checkStrictly: true }"
|
|
||||||
:show-all-levels="false"
|
|
||||||
placeholder="请选择中医证候"
|
placeholder="请选择中医证候"
|
||||||
filterable
|
filterable
|
||||||
clearable
|
clearable
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
@focus="loadSyndromeOptions(scope.row)"
|
@focus="loadSyndromeOptions(scope.row)"
|
||||||
@change="(val) => handleSyndromeSelect(val, scope.row, scope.rowIndex)"
|
@change="(val) => handleSyndromeSelect(val, scope.row)"
|
||||||
/>
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in scope.row.syndromeOptions"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<el-form-item v-else>
|
<el-form-item v-else>
|
||||||
@@ -416,12 +419,6 @@ const rowIndex = ref();
|
|||||||
const diagnosis = ref();
|
const diagnosis = ref();
|
||||||
const orgOrUser = ref();
|
const orgOrUser = ref();
|
||||||
const syndromeOptions = ref([]);
|
const syndromeOptions = ref([]);
|
||||||
const cascaderRefs = ref({});
|
|
||||||
const setCascaderRef = (el, index) => {
|
|
||||||
if (el) {
|
|
||||||
cascaderRefs.value[index] = el;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const form = ref({
|
const form = ref({
|
||||||
diagnosisList: [],
|
diagnosisList: [],
|
||||||
});
|
});
|
||||||
@@ -854,43 +851,11 @@ function loadSyndromeOptions(row) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 中医证候选中赋值
|
// 中医证候选中赋值
|
||||||
function handleSyndromeSelect(val, row, rowIndex) {
|
function handleSyndromeSelect(val, row) {
|
||||||
console.log('handleSyndromeSelect called with:', val, 'rowIndex:', rowIndex);
|
|
||||||
if (val) {
|
if (val) {
|
||||||
if (val === 'root-bagang' || val === 'root-weizhong' || val === 'root-other' || (typeof val === 'string' && val.startsWith('virtual-'))) {
|
|
||||||
row.tcmSyndromeCode = '';
|
|
||||||
row.tcmSyndromeName = '';
|
|
||||||
row.syndromeDefinitionId = '';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const selected = (row.syndromeOptions || []).find((item) => item.value === val);
|
const selected = (row.syndromeOptions || []).find((item) => item.value === val);
|
||||||
row.tcmSyndromeName = selected ? selected.label : '';
|
row.tcmSyndromeName = selected ? selected.label : '';
|
||||||
row.syndromeDefinitionId = selected ? selected.id : '';
|
row.syndromeDefinitionId = selected ? selected.id : '';
|
||||||
|
|
||||||
// Close the cascader dropdown programmatically
|
|
||||||
if (rowIndex !== undefined && cascaderRefs.value[rowIndex]) {
|
|
||||||
const refEl = cascaderRefs.value[rowIndex];
|
|
||||||
console.log('Cascader Ref component instance:', refEl);
|
|
||||||
if (refEl) {
|
|
||||||
if (typeof refEl.togglePopperVisible === 'function') {
|
|
||||||
refEl.togglePopperVisible(false);
|
|
||||||
}
|
|
||||||
if (typeof refEl.toggleDropDownVisible === 'function') {
|
|
||||||
refEl.toggleDropDownVisible(false);
|
|
||||||
}
|
|
||||||
refEl.popperVisible = false;
|
|
||||||
if (typeof refEl.blur === 'function') {
|
|
||||||
refEl.blur();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (document.activeElement && typeof document.activeElement.blur === 'function') {
|
|
||||||
console.log('Blurring active element:', document.activeElement);
|
|
||||||
document.activeElement.blur();
|
|
||||||
}
|
|
||||||
setTimeout(() => {
|
|
||||||
document.body.click();
|
|
||||||
}, 50);
|
|
||||||
} else {
|
} else {
|
||||||
row.tcmSyndromeName = '';
|
row.tcmSyndromeName = '';
|
||||||
row.syndromeDefinitionId = '';
|
row.syndromeDefinitionId = '';
|
||||||
@@ -1232,126 +1197,6 @@ function handleNodeClick(data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGroupedSyndromeOptions(options) {
|
|
||||||
if (!options || !options.length) return [];
|
|
||||||
|
|
||||||
const seen = new Set();
|
|
||||||
const uniqueOptions = [];
|
|
||||||
options.forEach(item => {
|
|
||||||
if (!seen.has(item.label)) {
|
|
||||||
seen.add(item.label);
|
|
||||||
uniqueOptions.push(item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const nameToItems = {};
|
|
||||||
uniqueOptions.forEach(item => {
|
|
||||||
const name = item.label;
|
|
||||||
if (!nameToItems[name]) {
|
|
||||||
nameToItems[name] = [];
|
|
||||||
}
|
|
||||||
nameToItems[name].push(item);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Level 3 Children of 阴证 (寒证, 虚证)
|
|
||||||
const childrenOfYin = [];
|
|
||||||
['寒证', '虚证'].forEach(name => {
|
|
||||||
if (nameToItems[name]) {
|
|
||||||
childrenOfYin.push(...nameToItems[name]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Level 3 Children of 阳证 (热证, 实证)
|
|
||||||
const childrenOfYang = [];
|
|
||||||
['热证', '实证'].forEach(name => {
|
|
||||||
if (nameToItems[name]) {
|
|
||||||
childrenOfYang.push(...nameToItems[name]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Level 2 under 八纲总纲 (阴证, 阳证)
|
|
||||||
const level2OfBagang = [];
|
|
||||||
|
|
||||||
if (nameToItems['阴证']) {
|
|
||||||
nameToItems['阴证'].forEach(item => {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: item.value,
|
|
||||||
label: item.label,
|
|
||||||
id: item.id,
|
|
||||||
children: childrenOfYin.length ? childrenOfYin : undefined
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else if (childrenOfYin.length > 0) {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: 'virtual-yin',
|
|
||||||
label: '阴证',
|
|
||||||
children: childrenOfYin
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nameToItems['阳证']) {
|
|
||||||
nameToItems['阳证'].forEach(item => {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: item.value,
|
|
||||||
label: item.label,
|
|
||||||
id: item.id,
|
|
||||||
children: childrenOfYang.length ? childrenOfYang : undefined
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else if (childrenOfYang.length > 0) {
|
|
||||||
level2OfBagang.push({
|
|
||||||
value: 'virtual-yang',
|
|
||||||
label: '阳证',
|
|
||||||
children: childrenOfYang
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Level 2 under 危重急症 (闭证, 脱证)
|
|
||||||
const level2OfWeizhong = [];
|
|
||||||
['闭证', '脱证'].forEach(name => {
|
|
||||||
if (nameToItems[name]) {
|
|
||||||
level2OfWeizhong.push(...nameToItems[name]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Level 2 under 其他证候 (all other syndromes)
|
|
||||||
const level2OfOther = [];
|
|
||||||
const specialNames = new Set(['阴证', '阳证', '寒证', '热证', '虚证', '实证', '闭证', '脱证']);
|
|
||||||
options.forEach(item => {
|
|
||||||
if (!specialNames.has(item.label)) {
|
|
||||||
level2OfOther.push(item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const finalTree = [];
|
|
||||||
|
|
||||||
if (level2OfBagang.length > 0) {
|
|
||||||
finalTree.push({
|
|
||||||
value: 'root-bagang',
|
|
||||||
label: '八纲总纲',
|
|
||||||
children: level2OfBagang
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (level2OfWeizhong.length > 0) {
|
|
||||||
finalTree.push({
|
|
||||||
value: 'root-weizhong',
|
|
||||||
label: '危重急症',
|
|
||||||
children: level2OfWeizhong
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (level2OfOther.length > 0) {
|
|
||||||
finalTree.push({
|
|
||||||
value: 'root-other',
|
|
||||||
label: '其他证候',
|
|
||||||
children: level2OfOther
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return finalTree;
|
|
||||||
}
|
|
||||||
|
|
||||||
defineExpose({ getList, getDetail, handleSaveDiagnosis });
|
defineExpose({ getList, getDetail, handleSaveDiagnosis });
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1137,18 +1137,28 @@ const onActionEdit = async (type) => {
|
|||||||
getTemRequset();
|
getTemRequset();
|
||||||
};
|
};
|
||||||
// 根据code获取文字
|
// 根据code获取文字
|
||||||
|
// 体温(type=1): code 1-5=测量类型(腋温~肛温,不替换值), code 6-8=特殊状态(拒测/外出/请假)
|
||||||
|
// 呼吸(type=2): code 1-6=呼吸类型(平稳~抑制呼吸,不替换值), code 7=@
|
||||||
|
// 血压(type=3): code 1-3=特殊状态(拒测/外出/请假)
|
||||||
|
// 体重/腹围/身高(type=4/5/6): code 1-2=特殊状态(卧床/未测)
|
||||||
|
// 小便(type=7): code 1-2=特殊符号(※/C)
|
||||||
|
// 大便(type=8): code 1-3=特殊符号(※/☆/人工肛门)
|
||||||
const selectContent = (code, type) => {
|
const selectContent = (code, type) => {
|
||||||
let title = '';
|
let title = '';
|
||||||
if (type == 1) {
|
if (type == 1) {
|
||||||
if (code == 1) {
|
// 体温: code 1-5 为测量类型,不替换体温值
|
||||||
|
if (code >= 1 && code <= 5) {
|
||||||
|
title = '';
|
||||||
|
} else if (code == 6) {
|
||||||
title = '拒测';
|
title = '拒测';
|
||||||
} else if (code == 2) {
|
} else if (code == 7) {
|
||||||
title = '外出';
|
title = '外出';
|
||||||
} else {
|
} else if (code == 8) {
|
||||||
title = '请假';
|
title = '请假';
|
||||||
}
|
}
|
||||||
} else if (type == 2) {
|
} else if (type == 2) {
|
||||||
if (code == 1) {
|
// 呼吸: code 1-6 为呼吸类型,不替换呼吸值; code 7=@
|
||||||
|
if (code == 7) {
|
||||||
title = '@';
|
title = '@';
|
||||||
}
|
}
|
||||||
} else if (type == 3) {
|
} else if (type == 3) {
|
||||||
@@ -1183,25 +1193,30 @@ const selectContent = (code, type) => {
|
|||||||
return title;
|
return title;
|
||||||
};
|
};
|
||||||
const temperChange = (row, type = 0) => {
|
const temperChange = (row, type = 0) => {
|
||||||
|
// 只有特殊状态码才替换输入值,测量类型选择不替换
|
||||||
|
const replaceValue = (field, content) => {
|
||||||
|
if (content) row[field] = content;
|
||||||
|
};
|
||||||
if (type == 1) {
|
if (type == 1) {
|
||||||
row.temperature = selectContent(row.temperatureUnit, type);
|
replaceValue('temperature', selectContent(row.temperatureUnit, type));
|
||||||
} else if (type == 2) {
|
} else if (type == 2) {
|
||||||
row.breathe = selectContent(row.breatheUnit, type);
|
replaceValue('breathe', selectContent(row.breatheUnit, type));
|
||||||
} else if (type == 3) {
|
} else if (type == 3) {
|
||||||
row.systolicPressure = selectContent(row.pressureUnit, type);
|
const content = selectContent(row.pressureUnit, type);
|
||||||
row.diastolicPressure = selectContent(row.pressureUnit, type);
|
replaceValue('systolicPressure', content);
|
||||||
row.bloodPressure = selectContent(row.pressureUnit, type);
|
replaceValue('diastolicPressure', content);
|
||||||
|
replaceValue('bloodPressure', content);
|
||||||
} else if (type == 4) {
|
} else if (type == 4) {
|
||||||
row.weight = selectContent(row.weightUnit, type);
|
replaceValue('weight', selectContent(row.weightUnit, type));
|
||||||
} else if (type == 5) {
|
} else if (type == 5) {
|
||||||
row.waistCircumference = selectContent(row.waistCircumferenceUnit, type);
|
replaceValue('waistCircumference', selectContent(row.waistCircumferenceUnit, type));
|
||||||
} else if (type == 6) {
|
} else if (type == 6) {
|
||||||
row.height = selectContent(row.heightUnit, type);
|
replaceValue('height', selectContent(row.heightUnit, type));
|
||||||
} else if (type == 7) {
|
} else if (type == 7) {
|
||||||
row.urinationFrequency = selectContent(row.urinationFrequencyUnit, type);
|
replaceValue('urinationFrequency', selectContent(row.urinationFrequencyUnit, type));
|
||||||
} else if (type == 8) {
|
} else if (type == 8) {
|
||||||
console.log('uuuuuu=========>', row.stoolFrequencyUnit);
|
console.log('uuuuuu=========>', row.stoolFrequencyUnit);
|
||||||
row.stoolFrequency = selectContent(row.stoolFrequencyUnit, type);
|
replaceValue('stoolFrequency', selectContent(row.stoolFrequencyUnit, type));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// 正则只能输入数字(包含小数)
|
// 正则只能输入数字(包含小数)
|
||||||
|
|||||||
Reference in New Issue
Block a user