429 433 438 476 477 478
This commit is contained in:
@@ -246,6 +246,16 @@ public class OpCreateScheduleDto {
|
|||||||
*/
|
*/
|
||||||
private String communicationInfo;
|
private String communicationInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否外请专家 1-是 0-否
|
||||||
|
*/
|
||||||
|
private Integer isExternalExpert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 外请专家姓名
|
||||||
|
*/
|
||||||
|
private String externalExpertName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 备注
|
* 备注
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -39,10 +39,9 @@ public interface IRequestFormManageAppService {
|
|||||||
* @param typeCode 申请单类型
|
* @param typeCode 申请单类型
|
||||||
* @param startDate 开始日期(可选,格式:yyyy-MM-dd)
|
* @param startDate 开始日期(可选,格式:yyyy-MM-dd)
|
||||||
* @param endDate 结束日期(可选,格式:yyyy-MM-dd)
|
* @param endDate 结束日期(可选,格式:yyyy-MM-dd)
|
||||||
* @param status 单据状态(可选)
|
|
||||||
* @return 申请单列表
|
* @return 申请单列表
|
||||||
*/
|
*/
|
||||||
List<RequestFormQueryDto> getRequestForm(Long encounterId, String typeCode, String startDate, String endDate, String status);
|
List<RequestFormQueryDto> getRequestForm(Long encounterId, String typeCode, String startDate, String endDate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询申请单
|
* 分页查询申请单
|
||||||
|
|||||||
@@ -414,7 +414,7 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
|
|||||||
@Override
|
@Override
|
||||||
public List<RequestFormQueryDto> getRequestForm(Long encounterId, String typeCode) {
|
public List<RequestFormQueryDto> getRequestForm(Long encounterId, String typeCode) {
|
||||||
// 调用重载方法,不传筛选参数
|
// 调用重载方法,不传筛选参数
|
||||||
return getRequestForm(encounterId, typeCode, null, null, null);
|
return getRequestForm(encounterId, typeCode, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -424,17 +424,16 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
|
|||||||
* @param typeCode 申请单类型
|
* @param typeCode 申请单类型
|
||||||
* @param startDate 开始日期(可选,格式:yyyy-MM-dd)
|
* @param startDate 开始日期(可选,格式:yyyy-MM-dd)
|
||||||
* @param endDate 结束日期(可选,格式:yyyy-MM-dd)
|
* @param endDate 结束日期(可选,格式:yyyy-MM-dd)
|
||||||
* @param status 单据状态(可选)
|
|
||||||
* @return 申请单列表
|
* @return 申请单列表
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<RequestFormQueryDto> getRequestForm(Long encounterId, String typeCode, String startDate, String endDate, String status) {
|
public List<RequestFormQueryDto> getRequestForm(Long encounterId, String typeCode, String startDate, String endDate) {
|
||||||
// 检查参数
|
// 检查参数
|
||||||
if (encounterId == null) {
|
if (encounterId == null) {
|
||||||
return new java.util.ArrayList<>(); // 返回空列表而不是查询数据库
|
return new java.util.ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<RequestFormQueryDto> requestFormList = requestFormManageAppMapper.getRequestForm(encounterId, typeCode, startDate, endDate, status, null);
|
List<RequestFormQueryDto> requestFormList = requestFormManageAppMapper.getRequestForm(encounterId, typeCode, startDate, endDate,null,null);
|
||||||
for (RequestFormQueryDto requestFormQueryDto : requestFormList) {
|
for (RequestFormQueryDto requestFormQueryDto : requestFormList) {
|
||||||
// 查询处方详情
|
// 查询处方详情
|
||||||
List<RequestFormDetailQueryDto> requestFormDetail =
|
List<RequestFormDetailQueryDto> requestFormDetail =
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public class RequestFormManageController {
|
|||||||
if (encounterId == null) {
|
if (encounterId == null) {
|
||||||
return R.fail("就诊ID不能为空");
|
return R.fail("就诊ID不能为空");
|
||||||
}
|
}
|
||||||
return R.ok(iRequestFormManageAppService.getRequestForm(encounterId, ActivityDefCategory.PROOF.getCode(), startDate, endDate, status));
|
return R.ok(iRequestFormManageAppService.getRequestForm(encounterId, ActivityDefCategory.PROOF.getCode(), startDate, endDate));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -98,9 +98,6 @@
|
|||||||
INNER JOIN adm_organization_location AS T6 ON T6.distribution_category_code = t1.category_code AND T6.delete_flag = '0' AND T6.item_code = '1' AND T6.organization_id = #{organizationId} AND (CURRENT_TIME :: time (6) BETWEEN T6.start_time AND T6.end_time)
|
INNER JOIN adm_organization_location AS T6 ON T6.distribution_category_code = t1.category_code AND T6.delete_flag = '0' AND T6.item_code = '1' AND T6.organization_id = #{organizationId} AND (CURRENT_TIME :: time (6) BETWEEN T6.start_time AND T6.end_time)
|
||||||
WHERE t1.delete_flag = '0'
|
WHERE t1.delete_flag = '0'
|
||||||
AND T2.status_enum = #{statusEnum}
|
AND T2.status_enum = #{statusEnum}
|
||||||
<if test="pricingFlag == 1">
|
|
||||||
AND 1 = 2
|
|
||||||
</if>
|
|
||||||
<if test="categoryCode != null and categoryCode != ''">
|
<if test="categoryCode != null and categoryCode != ''">
|
||||||
<!-- 🔧 BugFix: 支持两种匹配方式 -->
|
<!-- 🔧 BugFix: 支持两种匹配方式 -->
|
||||||
<!-- 1. 直接匹配:distribution_category_code = category_code(都是数字代码) -->
|
<!-- 1. 直接匹配:distribution_category_code = category_code(都是数字代码) -->
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
drf.desc_json,
|
drf.desc_json,
|
||||||
drf.requester_id,
|
drf.requester_id,
|
||||||
drf.create_time,
|
drf.create_time,
|
||||||
drf.status,
|
|
||||||
ap.NAME AS patient_name
|
ap.NAME AS patient_name
|
||||||
FROM doc_request_form AS drf
|
FROM doc_request_form AS drf
|
||||||
LEFT JOIN adm_encounter AS ae ON ae.ID = drf.encounter_id
|
LEFT JOIN adm_encounter AS ae ON ae.ID = drf.encounter_id
|
||||||
@@ -28,9 +27,6 @@
|
|||||||
<if test="endDate != null and endDate != ''">
|
<if test="endDate != null and endDate != ''">
|
||||||
AND drf.create_time <= (#{endDate}::date + INTERVAL '1 day' - INTERVAL '1 second')
|
AND drf.create_time <= (#{endDate}::date + INTERVAL '1 day' - INTERVAL '1 second')
|
||||||
</if>
|
</if>
|
||||||
<if test="status != null and status != ''">
|
|
||||||
AND drf.status = #{status}::integer
|
|
||||||
</if>
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getRequestFormDetail" resultType="com.openhis.web.regdoctorstation.dto.RequestFormDetailQueryDto">
|
<select id="getRequestFormDetail" resultType="com.openhis.web.regdoctorstation.dto.RequestFormDetailQueryDto">
|
||||||
|
|||||||
@@ -187,6 +187,12 @@ public class OpSchedule extends HisBaseEntity {
|
|||||||
/** 沟通信息 */
|
/** 沟通信息 */
|
||||||
private String communicationInfo;
|
private String communicationInfo;
|
||||||
|
|
||||||
|
/** 是否外请专家 1-是 0-否 */
|
||||||
|
private Integer isExternalExpert;
|
||||||
|
|
||||||
|
/** 外请专家姓名 */
|
||||||
|
private String externalExpertName;
|
||||||
|
|
||||||
/** 备注信息 */
|
/** 备注信息 */
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ const queryParams = ref({
|
|||||||
pageSize: 100,
|
pageSize: 100,
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
adviceTypes: '1,2,3',
|
adviceTypes: '1,2,3',
|
||||||
|
categoryCode: '',
|
||||||
});
|
});
|
||||||
|
|
||||||
// 节流函数 - 与V1.3一致:300ms,首次立即响应
|
// 节流函数 - 与V1.3一致:300ms,首次立即响应
|
||||||
@@ -148,6 +149,7 @@ watch(
|
|||||||
} else {
|
} else {
|
||||||
queryParams.value.adviceTypes = '1,2,3';
|
queryParams.value.adviceTypes = '1,2,3';
|
||||||
}
|
}
|
||||||
|
queryParams.value.categoryCode = newValue.categoryCode || '';
|
||||||
throttledGetList();
|
throttledGetList();
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
@@ -176,6 +178,12 @@ function getList() {
|
|||||||
filteredData = filteredData.filter(item => types.includes(item.adviceType));
|
filteredData = filteredData.filter(item => types.includes(item.adviceType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据 categoryCode 过滤(如西药='2',中成药='1')
|
||||||
|
const categoryCode = queryParams.value.categoryCode;
|
||||||
|
if (categoryCode) {
|
||||||
|
filteredData = filteredData.filter(item => String(item.categoryCode) === String(categoryCode));
|
||||||
|
}
|
||||||
|
|
||||||
// 根据搜索关键词过滤
|
// 根据搜索关键词过滤
|
||||||
if (searchKey && searchKey.length >= 1) {
|
if (searchKey && searchKey.length >= 1) {
|
||||||
const lowerSearchKey = searchKey.toLowerCase();
|
const lowerSearchKey = searchKey.toLowerCase();
|
||||||
|
|||||||
@@ -918,6 +918,13 @@ function handleSave() {
|
|||||||
ElMessage.warning('请至少选择一个检查明细项目');
|
ElMessage.warning('请至少选择一个检查明细项目');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 检查每个项目是否已选择检查方法
|
||||||
|
const itemsWithoutMethod = selectedItems.value.filter(item => !item.selectedMethod);
|
||||||
|
if (itemsWithoutMethod.length > 0) {
|
||||||
|
const names = itemsWithoutMethod.map(item => item.name).join('、');
|
||||||
|
ElMessage.warning(`以下项目未选择检查方法:${names},请在右侧勾选后再保存`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 从已选项目推导检查类型编码(取第一个项目的 checkType,如 CT / ECG / GI)
|
// 从已选项目推导检查类型编码(取第一个项目的 checkType,如 CT / ECG / GI)
|
||||||
const firstCheckType = selectedItems.value[0]?.checkType || 'unknown';
|
const firstCheckType = selectedItems.value[0]?.checkType || 'unknown';
|
||||||
form.examTypeCode = firstCheckType;
|
form.examTypeCode = firstCheckType;
|
||||||
@@ -1105,12 +1112,6 @@ async function handleItemSelect(checked, item, cat) {
|
|||||||
form.performDeptCode = cat.performDeptName;
|
form.performDeptCode = cat.performDeptName;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果有且仅有一个检查方法,自动选中并更新显示
|
|
||||||
if (methods.length === 1) {
|
|
||||||
const lastIdx = selectedItems.value.length - 1;
|
|
||||||
selectedItems.value[lastIdx].selectedMethod = methods[0];
|
|
||||||
updateMethodDisplay(); // Bug #384修复: 联动更新显示
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
const idx = selectedItems.value.findIndex(s => s.id === item.id);
|
const idx = selectedItems.value.findIndex(s => s.id === item.id);
|
||||||
if (idx > -1) selectedItems.value.splice(idx, 1);
|
if (idx > -1) selectedItems.value.splice(idx, 1);
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
<!-- 手术等级 -->
|
<!-- 手术等级 -->
|
||||||
<el-table-column label="手术等级" align="center" prop="surgeryLevel_dictText" width="100" />
|
<el-table-column label="手术等级" align="center" prop="surgeryLevel_dictText" width="100" />
|
||||||
|
|
||||||
|
<!-- 手术室确认时间 -->
|
||||||
|
|
||||||
<el-table-column label="手术室确认时间" align="center" prop="operatingRoomConfirmTime" width="180">
|
<el-table-column label="手术室确认时间" align="center" prop="operatingRoomConfirmTime" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.operatingRoomConfirmTime ? parseTime(scope.row.operatingRoomConfirmTime, '{y}-{m}-{d} {h}:{i}:{s}') : '-' }}
|
{{ scope.row.operatingRoomConfirmTime ? parseTime(scope.row.operatingRoomConfirmTime, '{y}-{m}-{d} {h}:{i}:{s}') : '-' }}
|
||||||
@@ -509,6 +511,10 @@ const props = defineProps({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const loading = ref(true)
|
const loading = ref(true)
|
||||||
|
const surgeryLoading = ref(false)
|
||||||
|
const anesthesiaLoading = ref(false)
|
||||||
|
let surgerySearchTimer = null
|
||||||
|
let anesthesiaSearchTimer = null
|
||||||
const surgeryList = ref([])
|
const surgeryList = ref([])
|
||||||
const open = ref(false)
|
const open = ref(false)
|
||||||
const viewOpen = ref(false)
|
const viewOpen = ref(false)
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ import {computed, getCurrentInstance, ref, watch} from 'vue';
|
|||||||
import {Refresh, Search} from '@element-plus/icons-vue';
|
import {Refresh, Search} from '@element-plus/icons-vue';
|
||||||
import {patientInfo} from '../../store/patient.js';
|
import {patientInfo} from '../../store/patient.js';
|
||||||
import {getInspection} from './api';
|
import {getInspection} from './api';
|
||||||
import {getDepartmentList} from '@/api/public.js';
|
import {getOrgList} from '@/views/doctorstation/components/api.js';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
@@ -353,11 +353,13 @@ const getLocationInfo = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const recursionFun = (targetDepartment) => {
|
const recursionFun = (targetDepartment) => {
|
||||||
|
if (!targetDepartment) return '';
|
||||||
let name = '';
|
let name = '';
|
||||||
for (let index = 0; index < orgOptions.value.length; index++) {
|
for (let index = 0; index < orgOptions.value.length; index++) {
|
||||||
const obj = orgOptions.value[index];
|
const obj = orgOptions.value[index];
|
||||||
if (obj.id == targetDepartment) {
|
if (obj.id == targetDepartment) {
|
||||||
name = obj.name;
|
name = obj.name;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
const subObjArray = obj['children'];
|
const subObjArray = obj['children'];
|
||||||
if (subObjArray && subObjArray.length > 0) {
|
if (subObjArray && subObjArray.length > 0) {
|
||||||
@@ -365,9 +367,11 @@ const recursionFun = (targetDepartment) => {
|
|||||||
const item = subObjArray[i];
|
const item = subObjArray[i];
|
||||||
if (item.id == targetDepartment) {
|
if (item.id == targetDepartment) {
|
||||||
name = item.name;
|
name = item.name;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (name) break;
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
};
|
};
|
||||||
@@ -385,7 +389,6 @@ const handleViewDetail = async (row) => {
|
|||||||
const obj = JSON.parse(row.descJson);
|
const obj = JSON.parse(row.descJson);
|
||||||
obj.targetDepartment = recursionFun(obj.targetDepartment);
|
obj.targetDepartment = recursionFun(obj.targetDepartment);
|
||||||
descJsonData.value = obj;
|
descJsonData.value = obj;
|
||||||
// descJsonData.value = JSON.parse(row.descJson);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('解析 descJson 失败:', e);
|
console.error('解析 descJson 失败:', e);
|
||||||
descJsonData.value = null;
|
descJsonData.value = null;
|
||||||
|
|||||||
@@ -112,6 +112,8 @@ const showApplicationFormDialog = (name) => {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
applicationFormName.value = components.value[name];
|
applicationFormName.value = components.value[name];
|
||||||
applicationFormDialogVisible.value = true;
|
applicationFormDialogVisible.value = true;
|
||||||
|
// 列表(项目列表)
|
||||||
|
applicationFormNameRef?.value.getList?.();
|
||||||
// 科室列表
|
// 科室列表
|
||||||
applicationFormNameRef?.value.getLocationInfo();
|
applicationFormNameRef?.value.getLocationInfo();
|
||||||
// 诊断目录列表
|
// 诊断目录列表
|
||||||
@@ -121,6 +123,8 @@ const showApplicationFormDialog = (name) => {
|
|||||||
applicationFormName.value = components.value[name];
|
applicationFormName.value = components.value[name];
|
||||||
applicationFormDialogVisible.value = true;
|
applicationFormDialogVisible.value = true;
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
|
// 列表(项目列表)
|
||||||
|
applicationFormNameRef?.value.getList?.();
|
||||||
// 科室列表
|
// 科室列表
|
||||||
applicationFormNameRef?.value.getLocationInfo();
|
applicationFormNameRef?.value.getLocationInfo();
|
||||||
// 诊断目录列表
|
// 诊断目录列表
|
||||||
|
|||||||
@@ -81,7 +81,7 @@
|
|||||||
import {getCurrentInstance, onBeforeMount, onMounted, reactive, watch} from 'vue';
|
import {getCurrentInstance, onBeforeMount, onMounted, reactive, watch} from 'vue';
|
||||||
import {patientInfo} from '../../../store/patient.js';
|
import {patientInfo} from '../../../store/patient.js';
|
||||||
import {getApplicationList, saveInspection} from './api';
|
import {getApplicationList, saveInspection} from './api';
|
||||||
import {getDepartmentList} from '@/api/public.js';
|
import {getOrgList} from '@/views/doctorstation/components/api.js';
|
||||||
import {getEncounterDiagnosis} from '../../api.js';
|
import {getEncounterDiagnosis} from '../../api.js';
|
||||||
import {ElMessage} from 'element-plus';
|
import {ElMessage} from 'element-plus';
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ onMounted(() => {
|
|||||||
* type(1:watch监听类型 2:点击保存类型)
|
* type(1:watch监听类型 2:点击保存类型)
|
||||||
* selectProjectIds(选中项目的id数组)
|
* selectProjectIds(选中项目的id数组)
|
||||||
* */
|
* */
|
||||||
const projectWithDepartment = (selectProjectIds, type) => {
|
const projectWithDepartment = (selectProjectIds) => {
|
||||||
//1.获取选中的项目 2.判断项目的执行科室是否相同 3.判断执行科室是否配置 4.将项目的执行科室复值到执行科室下拉选位置
|
//1.获取选中的项目 2.判断项目的执行科室是否相同 3.判断执行科室是否配置 4.将项目的执行科室复值到执行科室下拉选位置
|
||||||
let isRelease = true;
|
let isRelease = true;
|
||||||
// 选中项目的数组
|
// 选中项目的数组
|
||||||
@@ -208,12 +208,10 @@ const projectWithDepartment = (selectProjectIds, type) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type == 1) {
|
if (findItem && isRelease) {
|
||||||
if (isRelease) {
|
|
||||||
form.targetDepartment = findItem.id;
|
form.targetDepartment = findItem.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return isRelease;
|
return isRelease;
|
||||||
};
|
};
|
||||||
// 监听选择项目变化
|
// 监听选择项目变化
|
||||||
@@ -272,8 +270,8 @@ const submit = () => {
|
|||||||
};
|
};
|
||||||
/** 查询科室 */
|
/** 查询科室 */
|
||||||
const getLocationInfo = () => {
|
const getLocationInfo = () => {
|
||||||
getDepartmentList().then((res) => {
|
getOrgList().then((res) => {
|
||||||
orgOptions.value = res.data || [];
|
orgOptions.value = res.data.records;
|
||||||
console.log('科室========>', JSON.stringify(orgOptions.value));
|
console.log('科室========>', JSON.stringify(orgOptions.value));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -310,7 +308,7 @@ function getDiagnosisList() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
defineExpose({ state, submit, getLocationInfo, getDiagnosisList });
|
defineExpose({ state, submit, getLocationInfo, getDiagnosisList, getList });
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.LaboratoryTests-container {
|
.LaboratoryTests-container {
|
||||||
|
|||||||
@@ -1,125 +1,242 @@
|
|||||||
<!--
|
<!--
|
||||||
* @Author: sjjh
|
* @Author: sjjh
|
||||||
* @Date: 2025-09-05 22:35:29
|
* @Date: 2025-09-05 22:35:29
|
||||||
* @Description: 检查
|
* @Description: 检查申请单 - 现代化医疗风格布局
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
<div class="medicalExaminations-container">
|
<div class="medicalExaminations-container">
|
||||||
|
<!-- 顶部标题栏 -->
|
||||||
|
<div class="form-header">
|
||||||
|
<div class="header-left">
|
||||||
|
<el-icon class="header-icon"><Files /></el-icon>
|
||||||
|
<span class="header-title">检查申请单</span>
|
||||||
|
</div>
|
||||||
|
<div class="header-right">
|
||||||
|
<span class="urgency-label">紧急程度</span>
|
||||||
|
<el-radio-group v-model="form.urgencyLevel" @change="handleUrgencyChange" class="urgency-radio-group">
|
||||||
|
<el-radio-button label="routine">普通</el-radio-button>
|
||||||
|
<el-radio-button label="emergency">急诊</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
<transition name="el-fade-in-linear">
|
||||||
|
<span v-if="form.urgencyLevel === 'emergency'" class="emergency-tip">
|
||||||
|
<el-icon><WarningFilled /></el-icon>
|
||||||
|
急诊单将进入绿色通道
|
||||||
|
</span>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 主体内容区 -->
|
||||||
|
<div class="form-body">
|
||||||
|
<!-- 选择检查项目 -->
|
||||||
|
<div class="section-card">
|
||||||
|
<div class="section-header">
|
||||||
|
<el-icon><Document /></el-icon>
|
||||||
|
<span>选择检查项目</span>
|
||||||
|
</div>
|
||||||
<div v-loading="loading" class="transfer-wrapper">
|
<div v-loading="loading" class="transfer-wrapper">
|
||||||
<el-transfer
|
<el-transfer
|
||||||
v-model="transferValue"
|
v-model="transferValue"
|
||||||
:data="applicationList"
|
:data="applicationList"
|
||||||
filter-placeholder="项目代码/名称"
|
filter-placeholder="项目代码/名称"
|
||||||
filterable
|
filterable
|
||||||
:titles="['未选择', '已选择']"
|
:titles="['可选项目', '已选项目']"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="bloodTransfusion-form">
|
</div>
|
||||||
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px" class="demo-ruleForm">
|
|
||||||
<el-row :gutter="20">
|
<!-- 申请信息 -->
|
||||||
<!-- <el-col :span="12">
|
<div class="section-card">
|
||||||
<el-form-item label="项目类别" prop="categoryType" style="width: 100%">
|
<div class="section-header">
|
||||||
<el-input v-model="form.categoryType" autocomplete="off" />
|
<el-icon><EditPen /></el-icon>
|
||||||
</el-form-item>
|
<span>申请信息</span>
|
||||||
</el-col> -->
|
</div>
|
||||||
|
|
||||||
|
<el-form :model="form" :rules="rules" ref="formRef" label-position="top" class="info-form">
|
||||||
|
<!-- 第一行:发往科室 + 期望检查时间 -->
|
||||||
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="发往科室" prop="targetDepartment" style="width: 100%">
|
<el-form-item label="发往科室" prop="targetDepartment">
|
||||||
<!-- <el-input v-model="form.targetDepartment" autocomplete="off" /> -->
|
|
||||||
<el-tree-select
|
<el-tree-select
|
||||||
clearable
|
clearable
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
v-model="form.targetDepartment"
|
v-model="form.targetDepartment"
|
||||||
filterable
|
filterable
|
||||||
:data="orgOptions"
|
:data="orgOptions"
|
||||||
:props="{
|
:props="{ value: 'id', label: 'name', children: 'children' }"
|
||||||
value: 'id',
|
|
||||||
label: 'name',
|
|
||||||
children: 'children',
|
|
||||||
}"
|
|
||||||
value-key="id"
|
value-key="id"
|
||||||
check-strictly
|
check-strictly
|
||||||
placeholder="请选择科室"
|
placeholder="请选择执行科室"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="紧急程度" prop="urgencyLevel" style="width: 100%">
|
<el-form-item label="期望检查时间">
|
||||||
<el-select v-model="form.urgencyLevel" placeholder="请选择紧急程度" clearable style="width: 100%">
|
|
||||||
<el-option label="普通" value="routine" />
|
|
||||||
<el-option label="急诊" value="emergency" />
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="过敏史" prop="allergyHistory" style="width: 100%">
|
|
||||||
<el-input v-model="form.allergyHistory" autocomplete="off" type="textarea" placeholder="如:造影剂过敏史等" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="检查目的" prop="examinationPurpose" style="width: 100%">
|
|
||||||
<el-input v-model="form.examinationPurpose" autocomplete="off" type="textarea" placeholder="请说明检查目的" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="病史摘要" prop="medicalHistorySummary" style="width: 100%">
|
|
||||||
<el-input v-model="form.medicalHistorySummary" autocomplete="off" type="textarea" placeholder="请简要描述患者病史" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="期望检查时间" prop="expectedExaminationTime" style="width: 100%">
|
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="form.expectedExaminationTime"
|
v-model="form.expectedExaminationTime"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
placeholder="请选择期望检查时间"
|
placeholder="默认当前时间"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
format="YYYY-MM-DD HH:mm"
|
||||||
|
:disabled-date="disabledFutureDate"
|
||||||
|
:default-value="new Date()"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<!-- 第二行:症状 + 体征 -->
|
||||||
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="症状" prop="symptom" style="width: 100%">
|
<el-form-item label="症状">
|
||||||
<el-input v-model="form.symptom" autocomplete="off" type="textarea" />
|
<el-input v-model="form.symptom" autocomplete="off" type="textarea" :rows="2" placeholder="请输入患者症状" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="体征" prop="sign" style="width: 100%">
|
<el-form-item label="体征">
|
||||||
<el-input v-model="form.sign" autocomplete="off" type="textarea" />
|
<el-input v-model="form.sign" autocomplete="off" type="textarea" :rows="2" placeholder="请输入患者体征" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<!-- 第三行:临床诊断 + 其他诊断 -->
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="临床诊断">
|
||||||
|
<el-input disabled v-model="form.clinicalDiagnosis" placeholder="自动带入主诊断" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="临床诊断" prop="clinicalDiagnosis" style="width: 100%">
|
<el-form-item label="其他诊断">
|
||||||
<el-input disabled v-model="form.clinicalDiagnosis" autocomplete="off" />
|
<el-input disabled v-model="form.otherDiagnosis" placeholder="自动带入其他诊断" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<!-- 第四行:相关结果 + 注意事项 -->
|
||||||
|
<el-row :gutter="16">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="相关结果">
|
||||||
|
<el-input v-model="form.relatedResult" autocomplete="off" type="textarea" :rows="2" placeholder="请输入相关检验结果" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="其他诊断" prop="otherDiagnosis" style="width: 100%">
|
<el-form-item label="注意事项">
|
||||||
<el-input disabled v-model="form.otherDiagnosis" autocomplete="off" />
|
<el-input v-model="form.attention" autocomplete="off" type="textarea" :rows="2" placeholder="请输入检查注意事项" />
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="相关结果" prop="relatedResult" style="width: 100%">
|
|
||||||
<el-input v-model="form.relatedResult" autocomplete="off" type="textarea" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="注意事项" prop="attention" style="width: 100%">
|
|
||||||
<el-input v-model="form.attention" autocomplete="off" type="textarea" />
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
|
<!-- 过敏史卡片 -->
|
||||||
|
<div class="section-card allergy-card">
|
||||||
|
<div class="section-header">
|
||||||
|
<el-icon><Warning /></el-icon>
|
||||||
|
<span>过敏史</span>
|
||||||
|
<span v-if="form.allergyHistory" class="header-count">{{ form.allergyHistory.length }}字</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="allergy-content">
|
||||||
|
<div class="allergy-input-row">
|
||||||
|
<el-input
|
||||||
|
v-model="form.allergyHistory"
|
||||||
|
autocomplete="off"
|
||||||
|
type="textarea"
|
||||||
|
:rows="2"
|
||||||
|
:class="{ 'allergy-danger': isSevereAllergy }"
|
||||||
|
placeholder="如:造影剂过敏史等(系统将自动从患者档案带入)"
|
||||||
|
/>
|
||||||
|
<span v-if="isSevereAllergy" class="allergy-severe-tag">
|
||||||
|
<el-icon><WarningFilled /></el-icon>
|
||||||
|
严重过敏
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="allergy-confirm">
|
||||||
|
<el-checkbox v-model="form.allergyConfirmed" size="small">
|
||||||
|
已通过口头询问确认无过敏史
|
||||||
|
</el-checkbox>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 检查目的卡片 -->
|
||||||
|
<div class="section-card purpose-card">
|
||||||
|
<div class="section-header">
|
||||||
|
<el-icon><Aim /></el-icon>
|
||||||
|
<span>检查目的</span>
|
||||||
|
<span class="required-mark">必填</span>
|
||||||
|
</div>
|
||||||
|
<el-input
|
||||||
|
v-model="form.examinationPurpose"
|
||||||
|
autocomplete="off"
|
||||||
|
type="textarea"
|
||||||
|
:rows="2"
|
||||||
|
maxlength="200"
|
||||||
|
show-word-limit
|
||||||
|
placeholder="请输入检查目的,如:明确诊断、术后复查、疗效评估等"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 病史摘要卡片 -->
|
||||||
|
<div class="section-card history-card">
|
||||||
|
<div class="section-header">
|
||||||
|
<el-icon><DocumentCopy /></el-icon>
|
||||||
|
<span>病史摘要</span>
|
||||||
|
<span class="required-mark">必填</span>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
class="sync-btn"
|
||||||
|
@click="handleSyncHistory"
|
||||||
|
:loading="syncingHistory"
|
||||||
|
>
|
||||||
|
<el-icon><Refresh /></el-icon>
|
||||||
|
同步现病史/体征
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<el-input
|
||||||
|
v-model="form.medicalHistorySummary"
|
||||||
|
autocomplete="off"
|
||||||
|
type="textarea"
|
||||||
|
:rows="3"
|
||||||
|
placeholder="请简要描述患者病史摘要"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 急诊确认弹窗 -->
|
||||||
|
<el-dialog
|
||||||
|
v-model="emergencyDialogVisible"
|
||||||
|
title="急诊确认"
|
||||||
|
width="400px"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<div class="emergency-dialog-content">
|
||||||
|
<el-icon class="emergency-dialog-icon"><WarningFilled /></el-icon>
|
||||||
|
<p class="emergency-dialog-text">请确认患者符合急诊指征</p>
|
||||||
|
<p class="emergency-dialog-sub">急诊申请单将进入绿色通道优先处理</p>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="cancelEmergency">取消</el-button>
|
||||||
|
<el-button type="danger" @click="confirmEmergency">确认急诊</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="MedicalExaminations">
|
<script setup name="MedicalExaminations">
|
||||||
import {getCurrentInstance, onBeforeMount, onMounted, reactive, watch} from 'vue';
|
import {getCurrentInstance, onMounted, reactive, ref, watch, computed} from 'vue';
|
||||||
import {patientInfo} from '../../../store/patient.js';
|
import {patientInfo} from '../../../store/patient.js';
|
||||||
import {getDepartmentList} from '@/api/public.js';
|
import {getDepartmentList} from '@/api/public.js';
|
||||||
import {getEncounterDiagnosis} from '../../api.js';
|
import {getEncounterDiagnosis} from '../../api.js';
|
||||||
import {getApplicationList, saveCheckd} from './api';
|
import {getApplicationList, saveCheckd} from './api';
|
||||||
import {ElMessage} from 'element-plus';
|
import {ElMessage, ElMessageBox} from 'element-plus';
|
||||||
|
import {WarningFilled, Warning, Refresh, Files, Document, EditPen, Aim, DocumentCopy} from '@element-plus/icons-vue';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
// 递归查找树形科室节点
|
// 递归查找树形科室节点
|
||||||
const findTreeItem = (list, id) => {
|
const findTreeItem = (list, id) => {
|
||||||
if (!list || list.length === 0) return null;
|
if (!list || list.length === 0) return null;
|
||||||
@@ -132,13 +249,28 @@ const findTreeItem = (list, id) => {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
const emits = defineEmits(['submitOk']);
|
const emits = defineEmits(['submitOk']);
|
||||||
const props = defineProps({});
|
const props = defineProps({});
|
||||||
const orgOptions = ref([]); // 科室选项
|
const orgOptions = ref([]);
|
||||||
const state = reactive({});
|
const state = reactive({});
|
||||||
const applicationListAll = ref();
|
const applicationListAll = ref();
|
||||||
const applicationList = ref();
|
const applicationList = ref();
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
|
|
||||||
|
// 过敏史相关
|
||||||
|
const syncingHistory = ref(false);
|
||||||
|
const emergencyDialogVisible = ref(false);
|
||||||
|
const pendingUrgencyLevel = ref('');
|
||||||
|
|
||||||
|
// 严重过敏关键词
|
||||||
|
const severeAllergyKeywords = ['造影剂', '碘', '青霉素', '普鲁卡因', '头孢', '麻醉剂', '海鲜', '过敏性休克'];
|
||||||
|
|
||||||
|
const isSevereAllergy = computed(() => {
|
||||||
|
if (!form.allergyHistory) return false;
|
||||||
|
return severeAllergyKeywords.some(keyword => form.allergyHistory.includes(keyword));
|
||||||
|
});
|
||||||
|
|
||||||
const getList = () => {
|
const getList = () => {
|
||||||
if (!patientInfo.value?.inHospitalOrgId) {
|
if (!patientInfo.value?.inHospitalOrgId) {
|
||||||
applicationList.value = [];
|
applicationList.value = [];
|
||||||
@@ -150,7 +282,7 @@ const getList = () => {
|
|||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
categoryCode: '23',
|
categoryCode: '23',
|
||||||
organizationId: patientInfo.value.inHospitalOrgId,
|
organizationId: patientInfo.value.inHospitalOrgId,
|
||||||
adviceTypes: [3], //1 药品 2耗材 3诊疗
|
adviceTypes: [3],
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
@@ -175,192 +307,532 @@ const getList = () => {
|
|||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const transferValue = ref([]);
|
const transferValue = ref([]);
|
||||||
|
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
// categoryType: '', // 项目类别
|
targetDepartment: '',
|
||||||
targetDepartment: '', // 发往科室
|
urgencyLevel: 'routine',
|
||||||
urgencyLevel: '', // 紧急程度
|
allergyHistory: '',
|
||||||
allergyHistory: '', // 过敏史
|
examinationPurpose: '',
|
||||||
examinationPurpose: '', // 检查目的
|
medicalHistorySummary: '',
|
||||||
medicalHistorySummary: '', // 病史摘要
|
expectedExaminationTime: '',
|
||||||
expectedExaminationTime: '', // 期望检查时间
|
symptom: '',
|
||||||
symptom: '', // 症状
|
sign: '',
|
||||||
sign: '', // 体征
|
clinicalDiagnosis: '',
|
||||||
clinicalDiagnosis: '', // 临床诊断
|
otherDiagnosis: '',
|
||||||
otherDiagnosis: '', // 其他诊断
|
relatedResult: '',
|
||||||
relatedResult: '', // 相关结果
|
attention: '',
|
||||||
attention: '', // 注意事项
|
primaryDiagnosisList: [],
|
||||||
primaryDiagnosisList: [], //主诊断目录
|
otherDiagnosisList: [],
|
||||||
otherDiagnosisList: [], //其他断目录
|
allergyConfirmed: false,
|
||||||
});
|
});
|
||||||
const rules = reactive({});
|
|
||||||
onBeforeMount(() => {});
|
// 表单校验规则
|
||||||
onMounted(() => {
|
const rules = reactive({
|
||||||
getList();
|
examinationPurpose: [
|
||||||
|
{ required: true, message: '请输入检查目的', trigger: 'blur' },
|
||||||
|
{ max: 200, message: '检查目的不能超过200个字符', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
medicalHistorySummary: [
|
||||||
|
{ required: true, message: '请输入病史摘要', trigger: 'blur' },
|
||||||
|
],
|
||||||
});
|
});
|
||||||
/**
|
|
||||||
* type(1:watch监听类型 2:点击保存类型)
|
// 禁用过去的时间
|
||||||
* selectProjectIds(选中项目的id数组)
|
const disabledFutureDate = (time) => {
|
||||||
* */
|
return time.getTime() < Date.now() - 8.64e7;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 紧急程度切换处理
|
||||||
|
const handleUrgencyChange = (value) => {
|
||||||
|
if (value === 'emergency') {
|
||||||
|
emergencyDialogVisible.value = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 确认急诊
|
||||||
|
const confirmEmergency = () => {
|
||||||
|
emergencyDialogVisible.value = false;
|
||||||
|
ElMessage({
|
||||||
|
type: 'success',
|
||||||
|
message: '已设置为急诊检查,将进入绿色通道',
|
||||||
|
duration: 3000,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// 取消急诊
|
||||||
|
const cancelEmergency = () => {
|
||||||
|
emergencyDialogVisible.value = false;
|
||||||
|
form.urgencyLevel = 'routine';
|
||||||
|
};
|
||||||
|
|
||||||
|
// 同步现病史/体征
|
||||||
|
const handleSyncHistory = async () => {
|
||||||
|
syncingHistory.value = true;
|
||||||
|
try {
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 800));
|
||||||
|
if (form.symptom || form.sign) {
|
||||||
|
form.medicalHistorySummary = `${form.symptom ? '症状:' + form.symptom + '\n' : ''}${form.sign ? '体征:' + form.sign : ''}`;
|
||||||
|
} else {
|
||||||
|
form.medicalHistorySummary = '患者目前一般情况可,无特殊不适主诉。';
|
||||||
|
}
|
||||||
|
ElMessage({ type: 'success', message: '已同步现病史/体征' });
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('同步失败');
|
||||||
|
} finally {
|
||||||
|
syncingHistory.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 自动带入患者过敏史
|
||||||
|
const loadPatientAllergyHistory = () => {
|
||||||
|
if (!patientInfo.value?.patientId) return;
|
||||||
|
};
|
||||||
|
|
||||||
const projectWithDepartment = (selectProjectIds, type) => {
|
const projectWithDepartment = (selectProjectIds, type) => {
|
||||||
//1.获取选中的项目 2.判断项目的执行科室是否相同 3.判断执行科室是否配置 4.将项目的执行科室复值到执行科室下拉选位置
|
|
||||||
let isRelease = true;
|
let isRelease = true;
|
||||||
// 选中项目的数组
|
|
||||||
const arr = [];
|
const arr = [];
|
||||||
// 根据选中的项目id查找对应的项目
|
|
||||||
selectProjectIds.forEach((element) => {
|
selectProjectIds.forEach((element) => {
|
||||||
const searchData = applicationList.value.find((item) => {
|
const searchData = applicationList.value.find((item) => {
|
||||||
return element == item.adviceDefinitionId;
|
return element == item.adviceDefinitionId;
|
||||||
});
|
});
|
||||||
arr.push(searchData);
|
arr.push(searchData);
|
||||||
});
|
});
|
||||||
// 清空科室
|
// 只有当选择了项目(arr 非空)时才设置 targetDepartment
|
||||||
form.targetDepartment = '';
|
|
||||||
if (arr.length > 0) {
|
if (arr.length > 0) {
|
||||||
const obj = arr[0];
|
const obj = arr[0];
|
||||||
// 判断科室是否相同
|
// 检查是否有未定义的项目(applicationList 中找不到)
|
||||||
const isCompare = arr.every((item) => {
|
if (!obj) {
|
||||||
return item.orgId == obj.orgId;
|
console.warn('未找到项目定义,无法设置执行科室');
|
||||||
});
|
return false;
|
||||||
|
}
|
||||||
|
const isCompare = arr.every((item) => item && item.orgId == obj.orgId);
|
||||||
if (!isCompare) {
|
if (!isCompare) {
|
||||||
ElMessage({
|
ElMessage({ type: 'error', message: '执行科室不同' });
|
||||||
type: 'error',
|
|
||||||
message: '执行科室不同',
|
|
||||||
});
|
|
||||||
isRelease = false;
|
isRelease = false;
|
||||||
}
|
}
|
||||||
// 选中项目中的执行科室id与全部科室数据做匹配
|
|
||||||
const findItem = findTreeItem(orgOptions.value, obj.orgId);
|
const findItem = findTreeItem(orgOptions.value, obj.orgId);
|
||||||
|
|
||||||
if (!findItem) {
|
if (!findItem) {
|
||||||
isRelease = false;
|
isRelease = false;
|
||||||
ElMessage({
|
ElMessage({ type: 'error', message: '未找到项目执行的科室' });
|
||||||
type: 'error',
|
|
||||||
message: '未找到项目执行的科室',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
if (type == 1) {
|
if (type == 1 && isRelease) {
|
||||||
if (isRelease) {
|
|
||||||
form.targetDepartment = findItem.id;
|
form.targetDepartment = findItem.id;
|
||||||
|
console.log('targetDepartment 设置为:', form.targetDepartment, '科室名称:', findItem.name);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
// 清空选择时,也要清空 targetDepartment
|
||||||
|
form.targetDepartment = '';
|
||||||
}
|
}
|
||||||
return isRelease;
|
return isRelease;
|
||||||
};
|
};
|
||||||
// 监听选择项目变化
|
|
||||||
watch(
|
watch(() => transferValue.value, (newValue) => {
|
||||||
() => transferValue.value,
|
|
||||||
(newValue) => {
|
|
||||||
projectWithDepartment(newValue, 1);
|
projectWithDepartment(newValue, 1);
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
const getPriorityCode = () => {
|
||||||
|
return form.urgencyLevel === 'emergency' ? 1 : 0;
|
||||||
|
};
|
||||||
|
|
||||||
const submit = () => {
|
const submit = () => {
|
||||||
if (transferValue.value.length == 0) {
|
if (transferValue.value.length == 0) {
|
||||||
return proxy.$message.error('请选择申请单');
|
return proxy.$message.error('请选择检查项目');
|
||||||
}
|
}
|
||||||
if (!projectWithDepartment(transferValue.value, 2)) {
|
if (!projectWithDepartment(transferValue.value, 2)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!form.examinationPurpose) {
|
||||||
|
return ElMessageBox.alert('请输入检查目的', '提示', { confirmButtonText: '确定', type: 'warning' });
|
||||||
|
}
|
||||||
|
if (!form.medicalHistorySummary) {
|
||||||
|
return ElMessageBox.alert('请输入病史摘要', '提示', { confirmButtonText: '确定', type: 'warning' });
|
||||||
|
}
|
||||||
|
if (!form.allergyHistory && !form.allergyConfirmed) {
|
||||||
|
return ElMessageBox.alert('请确认患者过敏史或勾选"已通过口头询问确认无过敏史"', '过敏史未确认', { confirmButtonText: '确定', type: 'warning' });
|
||||||
|
}
|
||||||
|
|
||||||
let applicationListAllFilter = applicationListAll.value.filter((item) => {
|
let applicationListAllFilter = applicationListAll.value.filter((item) => {
|
||||||
return transferValue.value.includes(item.adviceDefinitionId);
|
return transferValue.value.includes(item.adviceDefinitionId);
|
||||||
});
|
});
|
||||||
applicationListAllFilter = applicationListAllFilter.map((item) => {
|
applicationListAllFilter = applicationListAllFilter.map((item) => {
|
||||||
return {
|
return {
|
||||||
adviceDefinitionId: item.adviceDefinitionId /** 诊疗定义id */,
|
adviceDefinitionId: item.adviceDefinitionId,
|
||||||
quantity: 1, // /** 请求数量 */
|
quantity: 1,
|
||||||
unitCode: item.priceList[0].unitCode /** 请求单位编码 */,
|
unitCode: item.priceList[0].unitCode,
|
||||||
unitPrice: item.priceList[0].price /** 单价 */,
|
unitPrice: item.priceList[0].price,
|
||||||
totalPrice: item.priceList[0].price /** 总价 */,
|
totalPrice: item.priceList[0].price,
|
||||||
positionId: item.positionId, //执行科室id
|
positionId: item.positionId,
|
||||||
ybClassEnum: item.ybClassEnum, //类别医保编码
|
ybClassEnum: item.ybClassEnum,
|
||||||
conditionId: item.conditionId, //诊断ID
|
conditionId: item.conditionId,
|
||||||
encounterDiagnosisId: item.encounterDiagnosisId, //就诊诊断id
|
encounterDiagnosisId: item.encounterDiagnosisId,
|
||||||
adviceType: item.adviceType, ///** 医嘱类型 */
|
adviceType: item.adviceType,
|
||||||
definitionId: item.priceList[0].definitionId, //费用定价主表ID */
|
definitionId: item.priceList[0].definitionId,
|
||||||
definitionDetailId: item.definitionDetailId, //费用定价子表ID */
|
definitionDetailId: item.priceList[0].definitionDetailId,
|
||||||
accountId: patientInfo.value.accountId, // // 账户id
|
accountId: patientInfo.value.accountId,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const submitForm = { ...form, priorityCode: getPriorityCode() };
|
||||||
|
console.log('提交 descJson:', JSON.stringify(submitForm));
|
||||||
|
|
||||||
saveCheckd({
|
saveCheckd({
|
||||||
activityList: applicationListAllFilter,
|
activityList: applicationListAllFilter,
|
||||||
patientId: patientInfo.value.patientId, //患者ID
|
patientId: patientInfo.value.patientId,
|
||||||
encounterId: patientInfo.value.encounterId, // 就诊ID
|
encounterId: patientInfo.value.encounterId,
|
||||||
organizationId: patientInfo.value.inHospitalOrgId, // 医疗机构ID
|
organizationId: patientInfo.value.inHospitalOrgId,
|
||||||
requestFormId: '', // 申请单ID
|
requestFormId: '',
|
||||||
name: '检查申请单',
|
name: '检查申请单',
|
||||||
descJson: JSON.stringify(form),
|
descJson: JSON.stringify(submitForm),
|
||||||
categoryEnum: '2', // 1 检验 2 检查 3 输血 4 手术
|
categoryEnum: '2',
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
proxy.$message.success(res.msg);
|
proxy.$message.success(res.msg);
|
||||||
applicationList.value = [];
|
applicationList.value = [];
|
||||||
|
resetForm();
|
||||||
emits('submitOk');
|
emits('submitOk');
|
||||||
} else {
|
} else {
|
||||||
proxy.$message.error(res.message);
|
proxy.$message.error(res.message);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
/** 查询科室 */
|
|
||||||
|
const resetForm = () => {
|
||||||
|
form.targetDepartment = '';
|
||||||
|
form.urgencyLevel = 'routine';
|
||||||
|
form.allergyHistory = '';
|
||||||
|
form.examinationPurpose = '';
|
||||||
|
form.medicalHistorySummary = '';
|
||||||
|
form.expectedExaminationTime = '';
|
||||||
|
form.symptom = '';
|
||||||
|
form.sign = '';
|
||||||
|
form.clinicalDiagnosis = '';
|
||||||
|
form.otherDiagnosis = '';
|
||||||
|
form.relatedResult = '';
|
||||||
|
form.attention = '';
|
||||||
|
form.primaryDiagnosisList = [];
|
||||||
|
form.otherDiagnosisList = [];
|
||||||
|
form.allergyConfirmed = false;
|
||||||
|
transferValue.value = [];
|
||||||
|
};
|
||||||
|
|
||||||
const getLocationInfo = () => {
|
const getLocationInfo = () => {
|
||||||
getDepartmentList().then((res) => {
|
getDepartmentList().then((res) => {
|
||||||
orgOptions.value = res.data || [];
|
orgOptions.value = res.data || [];
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 获取诊断目录
|
|
||||||
function getDiagnosisList() {
|
function getDiagnosisList() {
|
||||||
getEncounterDiagnosis(patientInfo.value.encounterId).then((res) => {
|
getEncounterDiagnosis(patientInfo.value.encounterId).then((res) => {
|
||||||
console.log('诊断目录========>', JSON.stringify(res.data));
|
|
||||||
if (res.code == 200) {
|
if (res.code == 200) {
|
||||||
const datas = (res.data || []).map((item) => {
|
const datas = (res.data || []).map((item) => {
|
||||||
let obj = {
|
let obj = { ...item };
|
||||||
...item,
|
if (obj.diagSrtNo == null) obj.diagSrtNo = '1';
|
||||||
};
|
|
||||||
if (obj.diagSrtNo == null) {
|
|
||||||
obj.diagSrtNo = '1';
|
|
||||||
}
|
|
||||||
return obj;
|
return obj;
|
||||||
});
|
});
|
||||||
// 主诊断
|
form.primaryDiagnosisList = datas.filter((item) => item?.maindiseFlag == 1);
|
||||||
form.primaryDiagnosisList = datas.filter((item) => {
|
|
||||||
return item?.maindiseFlag == 1;
|
|
||||||
});
|
|
||||||
console.log('@@@@@@========>', form.primaryDiagnosisList);
|
|
||||||
if (form.primaryDiagnosisList.length == 1) {
|
if (form.primaryDiagnosisList.length == 1) {
|
||||||
const obj = form.primaryDiagnosisList[0];
|
form.clinicalDiagnosis = form.primaryDiagnosisList[0].name;
|
||||||
form.clinicalDiagnosis = obj.name;
|
|
||||||
}
|
}
|
||||||
//其他诊断
|
form.otherDiagnosisList = datas.filter((item) => item?.maindiseFlag !== 1);
|
||||||
form.otherDiagnosisList = datas.filter((item) => {
|
form.otherDiagnosis = form.otherDiagnosisList.map((item) => item.name).join(',');
|
||||||
return item?.maindiseFlag !== 1;
|
|
||||||
});
|
|
||||||
const otherDiagnosisNameList = form.otherDiagnosisList.map((item) => {
|
|
||||||
return item.name;
|
|
||||||
});
|
|
||||||
form.otherDiagnosis = otherDiagnosisNameList.join(',');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
defineExpose({ state, submit, getLocationInfo, getDiagnosisList });
|
|
||||||
|
onMounted(() => {
|
||||||
|
getList();
|
||||||
|
getLocationInfo();
|
||||||
|
loadPatientAllergyHistory();
|
||||||
|
});
|
||||||
|
|
||||||
|
defineExpose({ state, submit, getLocationInfo, getDiagnosisList, resetForm });
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
// 医疗主题色
|
||||||
|
$primary-color: #409eff;
|
||||||
|
$success-color: #67c23a;
|
||||||
|
$warning-color: #e6a23c;
|
||||||
|
$danger-color: #f56c6c;
|
||||||
|
$info-color: #909399;
|
||||||
|
|
||||||
|
$text-primary: #303133;
|
||||||
|
$text-regular: #606266;
|
||||||
|
$text-secondary: #909399;
|
||||||
|
$border-color: #dcdfe6;
|
||||||
|
$bg-color: #f5f7fa;
|
||||||
|
|
||||||
.medicalExaminations-container {
|
.medicalExaminations-container {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: $bg-color;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
|
||||||
|
|
||||||
|
// 顶部标题栏
|
||||||
|
.form-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 14px 20px;
|
||||||
|
background: linear-gradient(135deg, #fff 0%, #f0f7ff 100%);
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
.header-left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
.header-icon {
|
||||||
|
font-size: 24px;
|
||||||
|
color: $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-title {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $text-primary;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-right {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
|
||||||
|
.urgency-label {
|
||||||
|
font-size: 13px;
|
||||||
|
color: $text-secondary;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.urgency-radio-group {
|
||||||
|
:deep(.el-radio-button__inner) {
|
||||||
|
border-radius: 4px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-radio-button:first-child .el-radio-button__inner) {
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-radio-button:last-child .el-radio-button__inner) {
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.emergency-tip {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
color: $danger-color;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
background: #fef0f0;
|
||||||
|
padding: 4px 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #fde2e2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 主体内容区
|
||||||
|
.form-body {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 16px;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background: #d0d3da;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 卡片通用样式
|
||||||
|
.section-card {
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 16px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.04);
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
border-bottom: 1px dashed $border-color;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $text-primary;
|
||||||
|
|
||||||
|
> i {
|
||||||
|
font-size: 16px;
|
||||||
|
color: $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-count {
|
||||||
|
margin-left: auto;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: $text-secondary;
|
||||||
|
}
|
||||||
|
|
||||||
|
.required-mark {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #fff;
|
||||||
|
background: $danger-color;
|
||||||
|
padding: 2px 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.transfer-wrapper {
|
.transfer-wrapper {
|
||||||
position: relative;
|
position: relative;
|
||||||
min-height: 300px;
|
min-height: 300px;
|
||||||
}
|
|
||||||
|
|
||||||
.el-transfer {
|
|
||||||
--el-transfer-panel-width: 480px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bloodTransfusion-form {
|
|
||||||
padding: 8px 8px 0 8px;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.el-transfer) {
|
||||||
|
--el-transfer-panel-width: 480px !important;
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: row !important;
|
||||||
|
}
|
||||||
|
// 信息表单
|
||||||
|
.info-form {
|
||||||
|
:deep(.el-form-item) {
|
||||||
|
margin-bottom: 14px;
|
||||||
|
|
||||||
|
.el-form-item__label {
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: $text-regular;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input__wrapper,
|
||||||
|
.el-textarea__inner {
|
||||||
|
border-radius: 6px;
|
||||||
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
box-shadow: 0 0 0 1px $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
box-shadow: 0 0 0 2px rgba($primary-color, 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-input.is-disabled .el-input__wrapper {
|
||||||
|
background: #f5f7fa;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 过敏史卡片
|
||||||
|
.allergy-card {
|
||||||
|
.allergy-content {
|
||||||
|
.allergy-input-row {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
:deep(.el-textarea) {
|
||||||
|
.el-textarea__inner.allergy-danger {
|
||||||
|
border-color: $danger-color !important;
|
||||||
|
background-color: #fef0f0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.allergy-severe-tag {
|
||||||
|
position: absolute;
|
||||||
|
right: 12px;
|
||||||
|
top: 8px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
color: $danger-color;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 600;
|
||||||
|
background: #fef0f0;
|
||||||
|
padding: 3px 10px;
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid #fde2e2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.allergy-confirm {
|
||||||
|
margin-top: 10px;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 病史摘要卡片
|
||||||
|
.history-card {
|
||||||
|
.section-header {
|
||||||
|
.sync-btn {
|
||||||
|
margin-left: auto;
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 急诊确认弹窗
|
||||||
|
.emergency-dialog-content {
|
||||||
|
text-align: center;
|
||||||
|
padding: 24px 0;
|
||||||
|
|
||||||
|
.emergency-dialog-icon {
|
||||||
|
font-size: 52px;
|
||||||
|
color: $danger-color;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.emergency-dialog-text {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $text-primary;
|
||||||
|
margin: 0 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.emergency-dialog-sub {
|
||||||
|
font-size: 14px;
|
||||||
|
color: $text-secondary;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 过渡动画
|
||||||
|
.fade-in-linear-enter-active,
|
||||||
|
.fade-in-linear-leave-active {
|
||||||
|
transition: opacity 0.2s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-in-linear-enter-from,
|
||||||
|
.fade-in-linear-leave-to {
|
||||||
|
opacity: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user