429 433 438 476 477 478

This commit is contained in:
Ranyunqiao
2026-05-12 12:21:25 +08:00
parent 349c587386
commit 1b159cdfab
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 }
@@ -175,6 +177,12 @@ function getList() {
const types = adviceTypes.split(',').map(t => parseInt(t)); const types = adviceTypes.split(',').map(t => parseInt(t));
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) {

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

@@ -24,7 +24,7 @@
style="width: 100%" style="width: 100%"
> >
<el-table-column type="index" label="序号" width="60" align="center" /> <el-table-column type="index" label="序号" width="60" align="center" />
<!-- 手术单号 --> <!-- 手术单号 -->
<el-table-column label="手术单号" align="center" width="150"> <el-table-column label="手术单号" align="center" width="150">
<template #default="scope"> <template #default="scope">
@@ -33,29 +33,31 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<!-- 申请日期 --> <!-- 申请日期 -->
<el-table-column label="申请日期" align="center" prop="createTime" width="180"> <el-table-column label="申请日期" align="center" prop="createTime" width="180">
<template #default="scope"> <template #default="scope">
{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }} {{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 患者姓名 --> <!-- 患者姓名 -->
<el-table-column label="患者姓名" align="center" prop="patientName" width="100" /> <el-table-column label="患者姓名" align="center" prop="patientName" width="100" />
<!-- 申请医生 --> <!-- 申请医生 -->
<el-table-column label="申请医生" align="center" prop="applyDoctorName" width="100" /> <el-table-column label="申请医生" align="center" prop="applyDoctorName" width="100" />
<!-- 申请科室 --> <!-- 申请科室 -->
<el-table-column label="申请科室" align="center" prop="applyDeptName" width="120" show-overflow-tooltip /> <el-table-column label="申请科室" align="center" prop="applyDeptName" width="120" show-overflow-tooltip />
<!-- 手术名称 --> <!-- 手术名称 -->
<el-table-column label="手术名称" align="center" prop="surgeryName" min-width="150" show-overflow-tooltip /> <el-table-column label="手术名称" align="center" prop="surgeryName" min-width="150" show-overflow-tooltip />
<!-- 手术等级 --> <!-- 手术等级 -->
<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}') : '-' }}
@@ -73,16 +75,16 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<!-- 操作 --> <!-- 操作 -->
<el-table-column label="操作" align="center" width="200" fixed="right"> <el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope"> <template #default="scope">
<!-- 查看显示手术申请详情只读模式 --> <!-- 查看显示手术申请详情只读模式 -->
<el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button> <el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button>
<!-- 编辑修改手术申请信息只有状态为新开的能修改 --> <!-- 编辑修改手术申请信息只有状态为新开的能修改 -->
<el-button link type="primary" icon="Edit" @click="handleEdit(scope.row)" v-if="scope.row.statusEnum === 0">编辑</el-button> <el-button link type="primary" icon="Edit" @click="handleEdit(scope.row)" v-if="scope.row.statusEnum === 0">编辑</el-button>
<!-- 删除取消手术申请作废 --> <!-- 删除取消手术申请作废 -->
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-if="scope.row.statusEnum === 0 || scope.row.statusEnum === 1">删除</el-button> <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-if="scope.row.statusEnum === 0 || scope.row.statusEnum === 1">删除</el-button>
</template> </template>
@@ -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 {