fix(手术申请): 修复手术部位未保存到cli_surgery表及详情展示为编码的问题

- 后端:保存手术申请单时,从descJson解析surgerySite字段,写入
  cli_surgery.body_site和wor_service_request.content_json,解决
  手术部位数据未持久化到手术主表的问题
- 前端:手术申请详情弹窗加载字典数据(手术等级、麻醉方式、手术
  部位、切口类别、手术性质),将descJson中的字典编码翻译为中文
  标签展示,解决详情中显示原始编码(如"1")而非实际名称的问题
This commit is contained in:
wangjian963
2026-06-05 15:32:21 +08:00
parent f836d816ad
commit cfb1ea1b3c
2 changed files with 62 additions and 1 deletions

View File

@@ -342,6 +342,7 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
String plannedTime = descMap != null ? (String) descMap.get("plannedTime") : null;
String surgeryIndication = descMap != null ? (String) descMap.get("surgeryIndication") : null;
String preoperativeDiagnosis = descMap != null ? (String) descMap.get("preoperativeDiagnosis") : null;
String surgerySite = descMap != null ? (String) descMap.get("surgerySite") : null;
// 🔧 BugFix#318: 从 activityList 获取手术项目名称
String adviceDefinitionName = null;
@@ -422,6 +423,9 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
if (preoperativeDiagnosis != null && !preoperativeDiagnosis.isEmpty()) {
contentMap.put("preoperativeDiagnosis", preoperativeDiagnosis);
}
if (surgerySite != null && !surgerySite.isEmpty()) {
contentMap.put("surgerySite", surgerySite);
}
if (!contentMap.isEmpty()) {
try {
ObjectMapper objectMapper = new ObjectMapper();
@@ -492,6 +496,10 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
// intentionally ignored
}
}
// 从 descJson 解析手术部位,写入 body_site 字段
if (surgerySite != null && !surgerySite.isEmpty()) {
surgery.setBodySite(surgerySite);
}
// 填充患者姓名(从 adm_patient 查询)
if (patientId != null) {
try {

View File

@@ -397,11 +397,12 @@
</template>
<script setup>
import {computed, getCurrentInstance, nextTick, ref, watch} from 'vue';
import {computed, getCurrentInstance, nextTick, onMounted, ref, watch} from 'vue';
import {Refresh, Search} from '@element-plus/icons-vue';
import {patientInfo} from '../../store/patient.js';
import {getSurgery, deleteRequestForm, withdrawRequestForm} from './api';
import {getDepartmentList} from '@/api/public.js';
import {getDicts} from '@/api/system/dict/data';
import SurgeryForm from '../order/applicationForm/surgery.vue';
import useUserStore from '@/store/modules/user';
import auth from '@/plugins/auth';
@@ -419,6 +420,51 @@ const editDialogVisible = ref(false);
const editRowData = ref(null);
const editFormRef = ref(null);
// 字典选项(用于详情展示时将编码转为中文标签)
const surgeryLevelDictMap = ref({});
const anesthesiaTypeDictMap = ref({});
const surgerySiteDictMap = ref({});
const incisionLevelDictMap = ref({});
const surgeryNatureDictMap = ref({});
/** 字段 → 字典映射表getFieldValue 根据此表将字典编码翻译为标签 */
const dictFieldMap = {
surgeryLevel: surgeryLevelDictMap,
anesthesiaType: anesthesiaTypeDictMap,
surgerySite: surgerySiteDictMap,
incisionLevel: incisionLevelDictMap,
surgeryNature: surgeryNatureDictMap,
};
/** 加载字典选项 */
const loadDictOptions = async () => {
try {
const res = await Promise.all([
getDicts('surgery_level'),
getDicts('anesthesia_type'),
getDicts('surgical_site'),
getDicts('incision_level'),
getDicts('surgery_type'),
]);
const toMap = (arr) => {
const m = {};
(arr || []).forEach(item => { m[item.dictValue] = item.dictLabel; });
return m;
};
surgeryLevelDictMap.value = toMap(res[0]?.data);
anesthesiaTypeDictMap.value = toMap(res[1]?.data);
surgerySiteDictMap.value = toMap(res[2]?.data);
incisionLevelDictMap.value = toMap(res[3]?.data);
surgeryNatureDictMap.value = toMap(res[4]?.data);
} catch (e) {
console.error('加载手术字典数据失败:', e);
}
};
onMounted(() => {
loadDictOptions();
});
// 获取默认日期范围近7天
const getDefaultDateRange = () => {
const now = new Date();
@@ -656,6 +702,13 @@ const getFieldValue = (key, value) => {
if (key === 'assistant2Id' && descJsonData.value?.assistant2Name) {
return descJsonData.value.assistant2Name;
}
// 字典字段:将编码翻译为中文标签(如 surgerySite="1" → "头部"
if (dictFieldMap[key]) {
const dictMap = dictFieldMap[key].value;
if (dictMap && dictMap[value] !== undefined) {
return dictMap[value];
}
}
return value || '-';
};