Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
20
logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json
Executable file
20
logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json
Executable file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"keep": {
|
||||
"days": true,
|
||||
"amount": 14
|
||||
},
|
||||
"auditLog": "/root/.openclaw/workspace/his-repo/logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json",
|
||||
"files": [
|
||||
{
|
||||
"date": 1778128585254,
|
||||
"name": "/root/.openclaw/workspace/his-repo/logs/application-2026-05-07.log",
|
||||
"hash": "2ec545aad5feb57a45e48b0a980690b3b9ef6b90e57204f6c3dfb1c7f2fd4d95"
|
||||
},
|
||||
{
|
||||
"date": 1778200962650,
|
||||
"name": "/root/.openclaw/workspace/his-repo/logs/application-2026-05-08.log",
|
||||
"hash": "cf50ef7b8aa656efb0a209a252219fea97a437ff9020b1b8770788f1ba51303e"
|
||||
}
|
||||
],
|
||||
"hashType": "sha256"
|
||||
}
|
||||
20
logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json
Executable file
20
logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json
Executable file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"keep": {
|
||||
"days": true,
|
||||
"amount": 14
|
||||
},
|
||||
"auditLog": "/root/.openclaw/workspace/his-repo/logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json",
|
||||
"files": [
|
||||
{
|
||||
"date": 1778128585256,
|
||||
"name": "/root/.openclaw/workspace/his-repo/logs/error-2026-05-07.log",
|
||||
"hash": "84a811bf9cf76799b49d36df79427471c8e0cfaa1bd359422d69091b06a64f87"
|
||||
},
|
||||
{
|
||||
"date": 1778200962653,
|
||||
"name": "/root/.openclaw/workspace/his-repo/logs/error-2026-05-08.log",
|
||||
"hash": "83b015957301572a67ea6fb41a65dfe5aa357831ca361155629630c6e9ef68bd"
|
||||
}
|
||||
],
|
||||
"hashType": "sha256"
|
||||
}
|
||||
@@ -106,6 +106,7 @@ public class CheckMethodAppServiceImpl implements ICheckMethodAppService {
|
||||
if (ObjectUtil.isNotEmpty(m.getPackageName())) {
|
||||
CheckPackage pkg = packageMap.get(m.getPackageName());
|
||||
if (pkg != null) {
|
||||
dto.setPackageId(pkg.getId());
|
||||
dto.setPackagePrice(pkg.getPackagePrice());
|
||||
dto.setServiceFee(pkg.getServiceFee());
|
||||
}
|
||||
|
||||
@@ -220,6 +220,36 @@ public class CheckTypeController extends BaseController {
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询检查套餐明细,用于医生站已选择套餐展开显示
|
||||
*/
|
||||
@GetMapping({ "/package/{packageId}/details", "/check-package/{packageId}/details" })
|
||||
public AjaxResult getPackageDetails(@PathVariable Long packageId) {
|
||||
List<CheckPackageDetail> details = checkPackageDetailService.list(
|
||||
new LambdaQueryWrapper<CheckPackageDetail>()
|
||||
.eq(CheckPackageDetail::getPackageId, packageId)
|
||||
.orderByAsc(CheckPackageDetail::getOrderNum)
|
||||
.orderByAsc(CheckPackageDetail::getId));
|
||||
|
||||
List<Map<String, Object>> result = details.stream().map(d -> {
|
||||
Map<String, Object> item = new LinkedHashMap<>();
|
||||
item.put("id", d.getId());
|
||||
item.put("packageId", d.getPackageId());
|
||||
item.put("itemCode", d.getItemCode());
|
||||
item.put("itemName", d.getItemName());
|
||||
item.put("name", d.getItemName());
|
||||
item.put("quantity", d.getQuantity());
|
||||
item.put("unit", d.getUnit());
|
||||
item.put("unitPrice", d.getUnitPrice());
|
||||
item.put("price", d.getUnitPrice());
|
||||
item.put("amount", d.getAmount());
|
||||
item.put("orderNum", d.getOrderNum());
|
||||
return item;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
/** 套餐级别文字映射 */
|
||||
private String parseLevelText(String level) {
|
||||
if ("1".equals(level))
|
||||
|
||||
@@ -31,6 +31,9 @@ public class CheckMethodDto {
|
||||
/* 套餐名称 */
|
||||
private String packageName;
|
||||
|
||||
/* 套餐ID */
|
||||
private Long packageId;
|
||||
|
||||
/* 套餐价格 - Bug #384修复:通过packageName匹配CheckPackage获取 */
|
||||
private BigDecimal packagePrice;
|
||||
|
||||
|
||||
@@ -25,7 +25,9 @@ public interface ISurgeryAppService {
|
||||
* @param plannedTimeEnd 计划结束时间
|
||||
* @return 手术列表
|
||||
*/
|
||||
IPage<SurgeryDto> getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize, String plannedTimeStart, String plannedTimeEnd);
|
||||
IPage<SurgeryDto> getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize,
|
||||
String plannedTimeStart, String plannedTimeEnd,
|
||||
String createTimeStart, String createTimeEnd);
|
||||
|
||||
/**
|
||||
* 根据ID查询手术详情
|
||||
|
||||
@@ -108,7 +108,9 @@ public class SurgeryAppServiceImpl implements ISurgeryAppService {
|
||||
* @return 手术列表
|
||||
*/
|
||||
@Override
|
||||
public IPage<SurgeryDto> getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize, String plannedTimeStart, String plannedTimeEnd) {
|
||||
public IPage<SurgeryDto> getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize,
|
||||
String plannedTimeStart, String plannedTimeEnd,
|
||||
String createTimeStart, String createTimeEnd) {
|
||||
QueryWrapper<SurgeryDto> queryWrapper = HisQueryUtils.buildQueryWrapper(surgeryDto, null,
|
||||
new HashSet<String>() {{
|
||||
add("surgery_no");
|
||||
@@ -149,6 +151,34 @@ public class SurgeryAppServiceImpl implements ISurgeryAppService {
|
||||
}
|
||||
}
|
||||
|
||||
// 申请时间范围(创建时间 create_time)查询:用于“手术申请查询”弹窗
|
||||
if (createTimeStart != null && !createTimeStart.isEmpty()) {
|
||||
try {
|
||||
LocalDateTime startDateTime = LocalDateTime.parse(createTimeStart, DateTimeFormatter.ISO_DATE_TIME);
|
||||
queryWrapper.ge("create_time", startDateTime);
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
LocalDateTime startDateTime = LocalDateTime.parse(createTimeStart + "T00:00:00", DateTimeFormatter.ISO_DATE_TIME);
|
||||
queryWrapper.ge("create_time", startDateTime);
|
||||
} catch (Exception ex) {
|
||||
log.error("解析创建开始时间失败: {}", createTimeStart, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (createTimeEnd != null && !createTimeEnd.isEmpty()) {
|
||||
try {
|
||||
LocalDateTime endDateTime = LocalDateTime.parse(createTimeEnd, DateTimeFormatter.ISO_DATE_TIME);
|
||||
queryWrapper.le("create_time", endDateTime);
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
LocalDateTime endDateTime = LocalDateTime.parse(createTimeEnd + "T23:59:59", DateTimeFormatter.ISO_DATE_TIME);
|
||||
queryWrapper.le("create_time", endDateTime);
|
||||
} catch (Exception ex) {
|
||||
log.error("解析创建结束时间失败: {}", createTimeEnd, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
queryWrapper.orderByDesc("create_time");
|
||||
return surgeryAppMapper.getSurgeryPage(new Page<>(pageNo, pageSize), queryWrapper);
|
||||
}
|
||||
|
||||
@@ -40,9 +40,12 @@ public class SurgeryController {
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
@RequestParam(value = "plannedTimeStart", required = false) String plannedTimeStart,
|
||||
@RequestParam(value = "plannedTimeEnd", required = false) String plannedTimeEnd) {
|
||||
@RequestParam(value = "plannedTimeEnd", required = false) String plannedTimeEnd,
|
||||
@RequestParam(value = "createTimeStart", required = false) String createTimeStart,
|
||||
@RequestParam(value = "createTimeEnd", required = false) String createTimeEnd) {
|
||||
// 将时间范围参数传递给服务层
|
||||
IPage<SurgeryDto> page = surgeryAppService.getSurgeryPage(surgeryDto, pageNo, pageSize, plannedTimeStart, plannedTimeEnd);
|
||||
IPage<SurgeryDto> page = surgeryAppService.getSurgeryPage(surgeryDto, pageNo, pageSize,
|
||||
plannedTimeStart, plannedTimeEnd, createTimeStart, createTimeEnd);
|
||||
return R.ok(page);
|
||||
}
|
||||
|
||||
|
||||
@@ -912,7 +912,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
ChargeItem chargeItem;
|
||||
// 新增 + 修改
|
||||
// 🔧 BugFix: 如果 requestId 不为空说明是已存在的医嘱,需要更新,即使 dbOpType 不匹配也应该包含进来
|
||||
// 🔧 BugFix #454: 排除删除操作,避免误入insertOrUpdateList
|
||||
List<AdviceSaveDto> insertOrUpdateList = medicineList.stream()
|
||||
.filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType()))
|
||||
.filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|
||||
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType())
|
||||
|| e.getRequestId() != null))
|
||||
@@ -1358,7 +1360,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
ChargeItem chargeItem;
|
||||
// 新增 + 修改
|
||||
// 🔧 BugFix: 如果 requestId 不为空说明是已存在的医嘱,需要更新,即使 dbOpType 不匹配也应该包含进来
|
||||
// 🔧 BugFix #454: 排除删除操作,避免误入insertOrUpdateList
|
||||
List<AdviceSaveDto> insertOrUpdateList = deviceList.stream()
|
||||
.filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType()))
|
||||
.filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|
||||
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType())
|
||||
|| e.getRequestId() != null))
|
||||
@@ -1673,7 +1677,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
ChargeItem chargeItem;
|
||||
// 新增 + 修改
|
||||
// 🔧 BugFix: 如果 requestId 不为空说明是已存在的医嘱,需要更新,即使 dbOpType 不匹配也应该包含进来
|
||||
// 🔧 BugFix #454: 排除删除操作,避免误入insertOrUpdateList触发执行科室校验
|
||||
List<AdviceSaveDto> insertOrUpdateList = activityList.stream()
|
||||
.filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType()))
|
||||
.filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|
||||
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType())
|
||||
|| e.getRequestId() != null))
|
||||
|
||||
@@ -13,6 +13,33 @@ export function listOperatingRoom(query) {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询诊疗项目列表(用于诊疗子项检索)
|
||||
* @param {Object} query - 查询参数
|
||||
* @returns {Promise} 请求结果
|
||||
*/
|
||||
export function listMedicalItems(query) {
|
||||
return request({
|
||||
url: '/clinical-manage/medical-item/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询医嘱类型列表
|
||||
* @param {Object} query - 查询参数
|
||||
* @returns {Promise} 请求结果
|
||||
*/
|
||||
export function listAdviceTypes(query) {
|
||||
return request({
|
||||
url: '/clinical-manage/advice-type/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
/**
|
||||
* 查询手术室详细
|
||||
* @param {Long} id - 手术室ID
|
||||
|
||||
@@ -393,12 +393,24 @@ function openSaveImplementDepartment(row) {
|
||||
editImplementDepartment(params).then((res) => {
|
||||
data.isAdding = false; // 允许新增下一行
|
||||
proxy.$modal.msgSuccess('保存成功!');
|
||||
// 确保选中项在 filteredOptions 中,使 el-select 能正确显示名称
|
||||
const savedItem = allImplementDepartmentList.value.find(i => i.value === row.activityDefinitionId);
|
||||
if (savedItem && !row.filteredOptions.some(o => o.value === row.activityDefinitionId)) {
|
||||
row.filteredOptions.push(savedItem);
|
||||
}
|
||||
getList();
|
||||
});
|
||||
} else {
|
||||
delete params.id;
|
||||
addImplementDepartment(params).then((res) => {
|
||||
data.isAdding = false; // 允许新增下一行
|
||||
proxy.$modal.msgSuccess('保存成功!');
|
||||
// 确保选中项在 filteredOptions 中,使 el-select 能正确显示名称
|
||||
const savedItem = allImplementDepartmentList.value.find(i => i.value === row.activityDefinitionId);
|
||||
if (savedItem && !row.filteredOptions.some(o => o.value === row.activityDefinitionId)) {
|
||||
row.filteredOptions.push(savedItem);
|
||||
}
|
||||
getList();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,20 @@
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!--执行时间-->
|
||||
<el-col :span="8">
|
||||
<el-form-item label="执行时间" style="margin-bottom: 4px">
|
||||
<el-date-picker
|
||||
v-model="formData.executeTime"
|
||||
type="datetime"
|
||||
placeholder="选择执行时间"
|
||||
size="small"
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!--申请科室-->
|
||||
<el-col :span="8">
|
||||
<el-form-item label="申请科室" required style="margin-bottom: 4px">
|
||||
@@ -293,6 +307,34 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 标本类型、申请类型 -->
|
||||
<el-row :gutter="12" style="margin-bottom: 0">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="标本类型" style="margin-bottom: 4px">
|
||||
<el-select v-model="formData.specimenName" placeholder="请选择标本类型" size="small" style="width: 100%">
|
||||
<el-option label="血液" value="血液" />
|
||||
<el-option label="尿液" value="尿液" />
|
||||
<el-option label="粪便" value="粪便" />
|
||||
<el-option label="痰液" value="痰液" />
|
||||
<el-option label="咽拭子" value="咽拭子" />
|
||||
<el-option label="脑脊液" value="脑脊液" />
|
||||
<el-option label="胸腹水" value="胸腹水" />
|
||||
<el-option label="关节液" value="关节液" />
|
||||
<el-option label="分泌物" value="分泌物" />
|
||||
<el-option label="其他" value="其他" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="申请类型" style="margin-bottom: 4px">
|
||||
<el-radio-group v-model="formData.applicationType" size="small">
|
||||
<el-radio :value="0">普通</el-radio>
|
||||
<el-radio :value="1" border type="warning">急诊</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 检验项目和备注 -->
|
||||
<el-row :gutter="12" style="margin-bottom: 0">
|
||||
<el-col :span="12">
|
||||
@@ -925,7 +967,9 @@ const formData = reactive({
|
||||
applyDocCode: '',
|
||||
applyDeptCode: '',
|
||||
specimenName: '血液',
|
||||
encounterId: ''
|
||||
encounterId: '',
|
||||
executeTime: null,
|
||||
applicationType: 0
|
||||
})
|
||||
|
||||
// 表单引用
|
||||
@@ -1329,13 +1373,13 @@ const getInspectionList = () => {
|
||||
// 如果返回的是分页对象 {records: [...], total: 100}
|
||||
if (Array.isArray(res.data.records)) {
|
||||
// 直接使用后端返回的数据(后端已按申请单返回,无需合并)
|
||||
inspectionList.value = res.data.records
|
||||
inspectionList.value = mergeInspectionApplyRecords(res.data.records)
|
||||
total.value = res.data.total || res.data.records.length
|
||||
}
|
||||
// 如果返回的是普通数组
|
||||
else if (Array.isArray(res.data)) {
|
||||
// 直接使用后端返回的数据
|
||||
inspectionList.value = res.data
|
||||
// 合并同一个申请单的明细
|
||||
inspectionList.value = mergeInspectionApplyRecords(res.data)
|
||||
total.value = res.data.length
|
||||
}
|
||||
// 如果返回的是其他对象结构
|
||||
@@ -1476,6 +1520,8 @@ const resetForm = async () => {
|
||||
visitNo: '',
|
||||
specimenName: '血液',
|
||||
encounterId: props.patientInfo.encounterId || '',
|
||||
executeTime: null,
|
||||
applicationType: 0,
|
||||
})
|
||||
selectedInspectionItems.value = []
|
||||
|
||||
@@ -1911,7 +1957,9 @@ const loadApplicationToForm = async (row) => {
|
||||
auditTime: detail.auditTime,
|
||||
visitNo: detail.visitNo,
|
||||
specimenName: detail.specimenName,
|
||||
encounterId: detail.encounterId
|
||||
encounterId: detail.encounterId,
|
||||
executeTime: detail.executeTime || null,
|
||||
applicationType: detail.applicationType ?? 0
|
||||
})
|
||||
|
||||
// 加载检验项目数据
|
||||
|
||||
@@ -17,8 +17,11 @@
|
||||
</el-tab-pane>
|
||||
<!-- <el-tab-pane label="医技报告" name="fourth">Task</el-tab-pane> -->
|
||||
<el-tab-pane label="检验申请" name="test">
|
||||
<TestApplication ref="testApplicationRef" />
|
||||
<TestApplication ref="testApplicationRef" :show-status-column="true" />
|
||||
</el-tab-pane>
|
||||
```vue
|
||||
|
||||
```
|
||||
<el-tab-pane label="检查申请" name="examine">
|
||||
<ExamineApplication ref="examineApplicationRef" />
|
||||
</el-tab-pane>
|
||||
|
||||
@@ -990,7 +990,7 @@ function selectRow(rowValue, index) {
|
||||
form.purchaseinventoryList[index].ybNo = rowValue.ybNo;
|
||||
// #439 fix: 不清空sourceLocationId,保留handleAddRow设置的仓库ID
|
||||
if (!form.purchaseinventoryList[index].sourceLocationId) {
|
||||
form.purchaseinventoryList[index].sourceLocationId = '';
|
||||
form.purchaseinventoryList[index].sourceLocationId = receiptHeaderForm.headerLocationId || '';
|
||||
}
|
||||
getPharmacyCabinetList().then((res) => {
|
||||
purposeTypeListOptions.value = res.data;
|
||||
|
||||
@@ -58,6 +58,312 @@
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['surgical:schedule:add']">
|
||||
新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['surgical:schedule:edit']">
|
||||
修改
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['surgical:schedule:remove']">
|
||||
删除
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="scheduleList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="手术单号" align="center" prop="operCode" />
|
||||
<el-table-column label="患者姓名" align="center" prop="patientName" />
|
||||
<el-table-column label="性别" align="center" prop="sex" :formatter="sexFormat" />
|
||||
<el-table-column label="年龄" align="center" prop="age" />
|
||||
<el-table-column label="申请科室" align="center" prop="applyDeptName" />
|
||||
<el-table-column label="安排时间" align="center" prop="scheduleDate" width="180">
|
||||
<template #default="scope">
|
||||
{{ parseTime(scope.row.scheduleDate, '{y}-{m}-{d} {h}:{i}') }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="手术名称" align="center" prop="operationName" />
|
||||
<el-table-column label="手术医师" align="center" prop="surgeonName" />
|
||||
<el-table-column label="麻醉方法" align="center" prop="anesthesiaMethod" :formatter="anesthesiaMethodFormat" />
|
||||
<el-table-column label="外请专家姓名" align="center" prop="expertName" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['surgical:schedule:edit']">修改</el-button>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['surgical:schedule:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 添加或修改门诊手术安排对话框 -->
|
||||
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
|
||||
<el-form ref="scheduleRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手术单号" prop="operCode">
|
||||
<el-input v-model="form.operCode" placeholder="请输入手术单号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="患者姓名" prop="patientName">
|
||||
<el-input v-model="form.patientName" placeholder="请输入患者姓名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="性别" prop="sex">
|
||||
<el-select v-model="form.sex" placeholder="请选择性别">
|
||||
<el-option label="男" value="1" />
|
||||
<el-option label="女" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="年龄" prop="age">
|
||||
<el-input v-model="form.age" placeholder="请输入年龄" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="申请科室" prop="applyDeptId">
|
||||
<el-select v-model="form.applyDeptId" placeholder="请选择申请科室" @change="handleApplyDeptChange">
|
||||
<el-option
|
||||
v-for="dept in deptList"
|
||||
:key="dept.id"
|
||||
:label="dept.name"
|
||||
:value="dept.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="安排时间" prop="scheduleDate">
|
||||
<el-date-picker
|
||||
v-model="form.scheduleDate"
|
||||
type="datetime"
|
||||
placeholder="选择安排时间"
|
||||
format="YYYY-MM-DD HH:mm"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手术名称" prop="operationName">
|
||||
<el-input v-model="form.operationName" placeholder="请输入手术名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手术医师" prop="surgeonId">
|
||||
<el-select v-model="form.surgeonId" placeholder="请选择手术医师">
|
||||
<el-option
|
||||
v-for="doctor in doctorList"
|
||||
:key="doctor.id"
|
||||
:label="doctor.name"
|
||||
:value="doctor.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="麻醉方法" prop="anesthesiaMethod">
|
||||
<el-select v-model="form.anesthesiaMethod" placeholder="请选择麻醉方法">
|
||||
<el-option
|
||||
v-for="item in anesthesiaMethodOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="外请专家姓名" prop="expertId">
|
||||
<el-select v-model="form.expertId" placeholder="请选择外请专家">
|
||||
<el-option
|
||||
v-for="expert in expertList"
|
||||
:key="expert.id"
|
||||
:label="expert.name"
|
||||
:value="expert.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="麻醉医师" prop="anesthetistId">
|
||||
<el-select v-model="form.anesthetistId" placeholder="请选择麻醉医师">
|
||||
<el-option
|
||||
v-for="doctor in anesthetistList"
|
||||
:key="doctor.id"
|
||||
:label="doctor.name"
|
||||
:value="doctor.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手术室" prop="operatingRoomId">
|
||||
<el-select v-model="form.operatingRoomId" placeholder="请选择手术室">
|
||||
<el-option
|
||||
v-for="room in operatingRoomList"
|
||||
:key="room.id"
|
||||
:label="room.roomName"
|
||||
:value="room.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup name="SurgicalSchedule">
|
||||
import { listSurgicalSchedule, getSurgicalSchedule, delSurgicalSchedule, addSurgicalSchedule, updateSurgicalSchedule } from "@/api/surgical/surgicalSchedule";
|
||||
import { listDept } from "@/api/system/dept";
|
||||
import { listDoctorByDeptId } from "@/api/system/doctor";
|
||||
import { listExpert } from "@/api/surgical/expert";
|
||||
import { listOperatingRoom } from "@/api/surgical/operatingRoom";
|
||||
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { userStore } = useUserStore();
|
||||
|
||||
const scheduleList = ref([]);
|
||||
const open = ref(false);
|
||||
const loading = ref(true);
|
||||
const showSearch = ref(true);
|
||||
const ids = ref([]);
|
||||
const single = ref(true);
|
||||
const multiple = ref(true);
|
||||
const total = ref(0);
|
||||
const title = ref("");
|
||||
const deptList = ref([]);
|
||||
const doctorList = ref([]);
|
||||
const anesthetistList = ref([]);
|
||||
const expertList = ref([]);
|
||||
const operatingRoomList = ref([]);
|
||||
|
||||
const anesthesiaMethodOptions = ref([
|
||||
{ value: '01', label: '全身麻醉' },
|
||||
{ value: '02', label: '局部麻醉' },
|
||||
{ value: '03', label: '椎管内麻醉' },
|
||||
{ value: '04', label: '复合麻醉' }
|
||||
]);
|
||||
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
operCode: null,
|
||||
patientName: null,
|
||||
applyDeptId: null,
|
||||
scheduleDateRange: [],
|
||||
},
|
||||
rules: {
|
||||
operCode: [
|
||||
{ required: true, message: "手术单号不能为空", trigger: "blur" }
|
||||
],
|
||||
patientName: [
|
||||
{ required: true, message: "患者姓名不能为空", trigger: "blur" }
|
||||
],
|
||||
sex: [
|
||||
{ required: true, message: "性别不能为空", trigger: "change" }
|
||||
],
|
||||
age: [
|
||||
{ required: true, message: "年龄不能为空", trigger: "blur" }
|
||||
],
|
||||
applyDeptId: [
|
||||
{ required: true, message: "申请科室不能为空", trigger: "change" }
|
||||
],
|
||||
scheduleDate: [
|
||||
{ required: true, message: "安排时间不能为空", trigger: "change" }
|
||||
],
|
||||
operationName: [
|
||||
{ required: true, message: "手术名称不能为空", trigger: "blur" }
|
||||
],
|
||||
surgeonId: [
|
||||
{ required: true, message: "手术医师不能为空", trigger: "change" }
|
||||
],
|
||||
anesthesiaMethod: [
|
||||
{ required: true, message: "麻醉方法不能为空", trigger: "change" }
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data);
|
||||
|
||||
/** 查询门诊手术安排列表 */
|
||||
function getList() {
|
||||
loading.value = true;
|
||||
listSurgicalSchedule(queryParams.value).then(response => {
|
||||
scheduleList.value = response.rows;
|
||||
total.value = response.total;
|
||||
loading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
/** 取消按钮 */
|
||||
function cancel() {
|
||||
open.value = false;
|
||||
reset();
|
||||
}
|
||||
|
||||
/** 表单重置 */
|
||||
function reset() {
|
||||
form.value = {
|
||||
id: null,
|
||||
operCode: null,
|
||||
patientName: null,
|
||||
sex: null,
|
||||
age: null,
|
||||
applyDeptId: null,
|
||||
scheduleDate: null,
|
||||
operationName: null,
|
||||
surgeonId: null,
|
||||
anesthesiaMethod: null,
|
||||
expertId: null,
|
||||
anesthetistId: null,
|
||||
operatingRoomId: null,
|
||||
remark: null
|
||||
};
|
||||
proxy.$refs["scheduleRef"].resetFields();
|
||||
}
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery()utter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd"> 新增手术安排 </el-button>
|
||||
</el-col>
|
||||
@@ -1113,12 +1419,14 @@ function loadOrgList() {
|
||||
const records = res.data?.records || res.data || []
|
||||
orgList.value = records.map(item => ({ id: item.id, name: item.tenantName || item.name }))
|
||||
} else {
|
||||
proxy.$modal.msgError('获取卫生机构列表失败')
|
||||
// 权限不足时静默降级,不弹窗阻断(Bug #441)
|
||||
console.warn('卫生机构列表加载失败(可能无权限):', res.message || res.code)
|
||||
orgList.value = []
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
proxy.$modal.msgError('获取卫生机构列表失败')
|
||||
.catch((err) => {
|
||||
// 网络错误或权限拒绝:静默降级
|
||||
console.warn('卫生机构列表加载失败:', err?.message || err)
|
||||
orgList.value = []
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user