429 433 438 476 477 478

This commit is contained in:
Ranyunqiao
2026-05-12 12:21:25 +08:00
committed by 荀彧
parent 5838b868df
commit fff7ef849a
14 changed files with 755 additions and 256 deletions

View File

@@ -246,6 +246,16 @@ public class OpCreateScheduleDto {
*/ */
private String communicationInfo; private String communicationInfo;
/**
* 是否外请专家 1-是 0-否
*/
private Integer isExternalExpert;
/**
* 外请专家姓名
*/
private String externalExpertName;
/** /**
* 备注 * 备注
*/ */

View File

@@ -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);
/** /**
* 分页查询申请单 * 分页查询申请单

View File

@@ -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 =

View File

@@ -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));
} }
/** /**

View File

@@ -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都是数字代码 -->

View File

@@ -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 &lt;= (#{endDate}::date + INTERVAL '1 day' - INTERVAL '1 second') AND drf.create_time &lt;= (#{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">

View File

@@ -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;

View File

@@ -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();

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;

View File

@@ -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();
// 诊断目录列表 // 诊断目录列表

View File

@@ -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(1watch监听类型 2:点击保存类型) * type(1watch监听类型 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,10 +208,8 @@ 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 {