fix(consultation): 解决会诊流程中的多个功能问题
- 在 deptappthoursManage.js 中添加 status 参数以仅获取已启动的机构 - 为 consultationapplication 组件添加已确认和已签名状态选项 - 扩展操作列宽度并添加打印功能按钮 - 优化 handlePrint 方法以支持行参数和性别枚举转换 - 为 consultationconfirmation 组件添加必填验证和编辑权限控制 - 修复会诊确认医师信息回显逻辑 - 在 inspectionApplication 组件中修复表格行点击事件和检验项目加载 - 禁用非紧急标记的编辑权限以解决Bug #268 - 为 surgeryApplication 组件添加响应码验证和错误处理 - 在 consultation 组件中添加表单验证清除功能 - 为 PackageManagement 组件实现动态机构选项加载 - 重构 PackageSettings 组件的套餐金额显示和只读模式 - 为检查项目设置组件添加套餐筛选和下级类型选择功能 - 实现检验套餐的编辑和查看模式切换功能
This commit is contained in:
@@ -260,7 +260,10 @@ public class DoctorScheduleAppServiceImpl implements IDoctorScheduleAppService {
|
|||||||
|| doctorSchedule.getLimitNumber() != null
|
|| doctorSchedule.getLimitNumber() != null
|
||||||
|| doctorSchedule.getStopReason() != null
|
|| doctorSchedule.getStopReason() != null
|
||||||
|| doctorSchedule.getRegType() != null
|
|| doctorSchedule.getRegType() != null
|
||||||
|| doctorSchedule.getRegisterFee() != null;
|
|| doctorSchedule.getRegisterFee() != null
|
||||||
|
|| doctorSchedule.getRegisterItem() != null
|
||||||
|
|| doctorSchedule.getDiagnosisItem() != null
|
||||||
|
|| doctorSchedule.getDiagnosisFee() != null;
|
||||||
|
|
||||||
if (needSyncPool) {
|
if (needSyncPool) {
|
||||||
schedulePoolService.lambdaUpdate()
|
schedulePoolService.lambdaUpdate()
|
||||||
@@ -277,6 +280,7 @@ public class DoctorScheduleAppServiceImpl implements IDoctorScheduleAppService {
|
|||||||
.set(doctorSchedule.getRegisterFee() != null, SchedulePool::getFee, Double.valueOf(doctorSchedule.getRegisterFee().toString()))
|
.set(doctorSchedule.getRegisterFee() != null, SchedulePool::getFee, Double.valueOf(doctorSchedule.getRegisterFee().toString()))
|
||||||
.set(doctorSchedule.getRegisterFee() != null, SchedulePool::getInsurancePrice,
|
.set(doctorSchedule.getRegisterFee() != null, SchedulePool::getInsurancePrice,
|
||||||
Double.valueOf(doctorSchedule.getRegisterFee().toString()))
|
Double.valueOf(doctorSchedule.getRegisterFee().toString()))
|
||||||
|
.set(doctorSchedule.getRegisterItem() != null, SchedulePool::getRegType, doctorSchedule.getRegisterItem())
|
||||||
.update();
|
.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,5 +24,5 @@ public interface ICheckMethodAppService{
|
|||||||
|
|
||||||
R<?> searchCheckMethodList(Integer pageNo, Integer pageSize, String checkType, String name, String packageName);
|
R<?> searchCheckMethodList(Integer pageNo, Integer pageSize, String checkType, String name, String packageName);
|
||||||
|
|
||||||
R<?> exportCheckMethod(String checkType, String name, String packageName, HttpServletResponse response);
|
void exportCheckMethod(String checkType, String name, String packageName, HttpServletResponse response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,5 +16,5 @@ public interface ICheckPartAppService {
|
|||||||
|
|
||||||
R<?> searchCheckPartList(Integer pageNo, Integer pageSize, String checkType, String name, String packageName);
|
R<?> searchCheckPartList(Integer pageNo, Integer pageSize, String checkType, String name, String packageName);
|
||||||
|
|
||||||
R<?> exportCheckPart(String checkType, String name, String packageName, HttpServletResponse response);
|
void exportCheckPart(String checkType, String name, String packageName, HttpServletResponse response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class CheckMethodAppServiceImpl implements ICheckMethodAppService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public R<?> exportCheckMethod(String checkType, String name, String packageName, HttpServletResponse response) {
|
public void exportCheckMethod(String checkType, String name, String packageName, HttpServletResponse response) {
|
||||||
LambdaQueryWrapper<CheckMethod> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<CheckMethod> wrapper = new LambdaQueryWrapper<>();
|
||||||
if (checkType != null && ObjectUtil.isNotEmpty(checkType)) {
|
if (checkType != null && ObjectUtil.isNotEmpty(checkType)) {
|
||||||
wrapper.eq(CheckMethod::getCheckType, checkType);
|
wrapper.eq(CheckMethod::getCheckType, checkType);
|
||||||
@@ -103,7 +103,13 @@ public class CheckMethodAppServiceImpl implements ICheckMethodAppService {
|
|||||||
List<CheckMethod> list = checkMethodService.list(wrapper);
|
List<CheckMethod> list = checkMethodService.list(wrapper);
|
||||||
|
|
||||||
if (list.isEmpty()) {
|
if (list.isEmpty()) {
|
||||||
return R.fail("导出Excel失败,无数据。");
|
try {
|
||||||
|
response.setContentType("application/json;charset=UTF-8");
|
||||||
|
response.getWriter().write("{\"code\":500,\"msg\":\"导出Excel失败,无数据。\"}");
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("写入响应失败", e);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -123,9 +129,12 @@ public class CheckMethodAppServiceImpl implements ICheckMethodAppService {
|
|||||||
ExcelFillerUtil.makeExcelFile(response, list, headers, excelName, null);
|
ExcelFillerUtil.makeExcelFile(response, list, headers, excelName, null);
|
||||||
} catch (IOException | IllegalAccessException e) {
|
} catch (IOException | IllegalAccessException e) {
|
||||||
log.error("导出Excel失败", e);
|
log.error("导出Excel失败", e);
|
||||||
return R.fail("导出Excel失败:" + e.getMessage());
|
try {
|
||||||
|
response.setContentType("application/json;charset=UTF-8");
|
||||||
|
response.getWriter().write("{\"code\":500,\"msg\":\"导出Excel失败:" + e.getMessage() + "\"}");
|
||||||
|
} catch (IOException ex) {
|
||||||
|
log.error("写入响应失败", ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return R.ok(null, "导出Excel成功");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import java.util.List;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查套餐AppService实现
|
* 检查套餐 AppService 实现
|
||||||
*
|
*
|
||||||
* @author system
|
* @author system
|
||||||
* @date 2025-11-26
|
* @date 2025-11-26
|
||||||
@@ -35,6 +35,32 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
private final ICheckPackageService checkPackageService;
|
private final ICheckPackageService checkPackageService;
|
||||||
private final ICheckPackageDetailService checkPackageDetailService;
|
private final ICheckPackageDetailService checkPackageDetailService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换明细 DTO 列表为实体列表
|
||||||
|
* @param detailDtos 明细 DTO 列表
|
||||||
|
* @param packageId 套餐 ID
|
||||||
|
* @param orderNumStart 起始序号
|
||||||
|
* @return 明细实体列表
|
||||||
|
*/
|
||||||
|
private List<CheckPackageDetail> convertToDetails(List<CheckPackageDetailDto> detailDtos, Long packageId, int orderNumStart) {
|
||||||
|
if (detailDtos == null || detailDtos.isEmpty()) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CheckPackageDetail> details = new ArrayList<>();
|
||||||
|
int orderNum = orderNumStart;
|
||||||
|
for (CheckPackageDetailDto detailDto : detailDtos) {
|
||||||
|
CheckPackageDetail detail = new CheckPackageDetail();
|
||||||
|
BeanUtils.copyProperties(detailDto, detail);
|
||||||
|
detail.setPackageId(packageId);
|
||||||
|
detail.setOrderNum(orderNum++);
|
||||||
|
detail.setCreateTime(LocalDateTime.now());
|
||||||
|
detail.setUpdateTime(LocalDateTime.now());
|
||||||
|
details.add(detail);
|
||||||
|
}
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public R<?> getCheckPackageList() {
|
public R<?> getCheckPackageList() {
|
||||||
try {
|
try {
|
||||||
@@ -61,7 +87,7 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
.orderByAsc(CheckPackageDetail::getOrderNum)
|
.orderByAsc(CheckPackageDetail::getOrderNum)
|
||||||
);
|
);
|
||||||
|
|
||||||
// 转换为DTO
|
// 转换为 DTO
|
||||||
CheckPackageDto dto = new CheckPackageDto();
|
CheckPackageDto dto = new CheckPackageDto();
|
||||||
BeanUtils.copyProperties(checkPackage, dto);
|
BeanUtils.copyProperties(checkPackage, dto);
|
||||||
|
|
||||||
@@ -101,17 +127,7 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
|
|
||||||
// 保存套餐明细
|
// 保存套餐明细
|
||||||
if (checkPackageDto.getItems() != null && !checkPackageDto.getItems().isEmpty()) {
|
if (checkPackageDto.getItems() != null && !checkPackageDto.getItems().isEmpty()) {
|
||||||
List<CheckPackageDetail> details = new ArrayList<>();
|
List<CheckPackageDetail> details = convertToDetails(checkPackageDto.getItems(), checkPackage.getId(), 1);
|
||||||
int orderNum = 1;
|
|
||||||
for (CheckPackageDetailDto detailDto : checkPackageDto.getItems()) {
|
|
||||||
CheckPackageDetail detail = new CheckPackageDetail();
|
|
||||||
BeanUtils.copyProperties(detailDto, detail);
|
|
||||||
detail.setPackageId(checkPackage.getId());
|
|
||||||
detail.setOrderNum(orderNum++);
|
|
||||||
detail.setCreateTime(LocalDateTime.now());
|
|
||||||
detail.setUpdateTime(LocalDateTime.now());
|
|
||||||
details.add(detail);
|
|
||||||
}
|
|
||||||
checkPackageDetailService.saveBatch(details);
|
checkPackageDetailService.saveBatch(details);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,10 +135,10 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("新增检查套餐失败", e);
|
log.error("新增检查套餐失败", e);
|
||||||
|
|
||||||
// 捕获PostgreSQL唯一约束冲突异常
|
// 捕获 PostgreSQL 唯一约束冲突异常
|
||||||
String errorMessage = e.getMessage();
|
String errorMessage = e.getMessage();
|
||||||
if (errorMessage != null) {
|
if (errorMessage != null) {
|
||||||
// PostgreSQL唯一约束错误通常包含 "duplicate key value" 或约束名称
|
// PostgreSQL 唯一约束错误通常包含 "duplicate key value" 或约束名称
|
||||||
if (errorMessage.contains("duplicate key value") ||
|
if (errorMessage.contains("duplicate key value") ||
|
||||||
errorMessage.contains("违反唯一约束") ||
|
errorMessage.contains("违反唯一约束") ||
|
||||||
errorMessage.contains("unique constraint")) {
|
errorMessage.contains("unique constraint")) {
|
||||||
@@ -135,7 +151,7 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return R.fail("新增检查套餐失败: " + errorMessage);
|
return R.fail("新增检查套餐失败:" + errorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,24 +186,14 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
|
|
||||||
// 保存新的套餐明细
|
// 保存新的套餐明细
|
||||||
if (checkPackageDto.getItems() != null && !checkPackageDto.getItems().isEmpty()) {
|
if (checkPackageDto.getItems() != null && !checkPackageDto.getItems().isEmpty()) {
|
||||||
List<CheckPackageDetail> details = new ArrayList<>();
|
List<CheckPackageDetail> details = convertToDetails(checkPackageDto.getItems(), checkPackage.getId(), 1);
|
||||||
int orderNum = 1;
|
|
||||||
for (CheckPackageDetailDto detailDto : checkPackageDto.getItems()) {
|
|
||||||
CheckPackageDetail detail = new CheckPackageDetail();
|
|
||||||
BeanUtils.copyProperties(detailDto, detail);
|
|
||||||
detail.setPackageId(checkPackage.getId());
|
|
||||||
detail.setOrderNum(orderNum++);
|
|
||||||
detail.setCreateTime(LocalDateTime.now());
|
|
||||||
detail.setUpdateTime(LocalDateTime.now());
|
|
||||||
details.add(detail);
|
|
||||||
}
|
|
||||||
checkPackageDetailService.saveBatch(details);
|
checkPackageDetailService.saveBatch(details);
|
||||||
}
|
}
|
||||||
|
|
||||||
return R.ok("更新成功");
|
return R.ok("更新成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("更新检查套餐失败", e);
|
log.error("更新检查套餐失败", e);
|
||||||
return R.fail("更新检查套餐失败: " + e.getMessage());
|
return R.fail("更新检查套餐失败:" + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,11 +207,14 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
return R.fail("套餐不存在");
|
return R.fail("套餐不存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除套餐明细
|
// 删除套餐明细 - 先删除子表数据
|
||||||
checkPackageDetailService.remove(
|
boolean removeDetailsResult = checkPackageDetailService.remove(
|
||||||
new LambdaQueryWrapper<CheckPackageDetail>()
|
new LambdaQueryWrapper<CheckPackageDetail>()
|
||||||
.eq(CheckPackageDetail::getPackageId, id)
|
.eq(CheckPackageDetail::getPackageId, id)
|
||||||
);
|
);
|
||||||
|
if (!removeDetailsResult) {
|
||||||
|
log.warn("删除套餐明细失败,套餐 ID: {}", id);
|
||||||
|
}
|
||||||
|
|
||||||
// 删除套餐主表
|
// 删除套餐主表
|
||||||
boolean deleteResult = checkPackageService.removeById(id);
|
boolean deleteResult = checkPackageService.removeById(id);
|
||||||
@@ -213,11 +222,11 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
|
|||||||
return R.fail("删除套餐失败");
|
return R.fail("删除套餐失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("删除检查套餐成功,套餐 ID: {}", id);
|
||||||
return R.ok("删除成功");
|
return R.ok("删除成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("删除检查套餐失败", e);
|
log.error("删除检查套餐失败", e);
|
||||||
return R.fail("删除检查套餐失败: " + e.getMessage());
|
return R.fail("删除检查套餐失败:" + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class CheckPartAppServiceImpl implements ICheckPartAppService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public R<?> exportCheckPart(String checkType, String name, String packageName, HttpServletResponse response) {
|
public void exportCheckPart(String checkType, String name, String packageName, HttpServletResponse response) {
|
||||||
LambdaQueryWrapper<CheckPart> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<CheckPart> wrapper = new LambdaQueryWrapper<>();
|
||||||
if (checkType != null && ObjectUtil.isNotEmpty(checkType)) {
|
if (checkType != null && ObjectUtil.isNotEmpty(checkType)) {
|
||||||
wrapper.eq(CheckPart::getCheckType, checkType);
|
wrapper.eq(CheckPart::getCheckType, checkType);
|
||||||
@@ -79,7 +79,13 @@ public class CheckPartAppServiceImpl implements ICheckPartAppService {
|
|||||||
List<CheckPart> list = checkPartService.list(wrapper);
|
List<CheckPart> list = checkPartService.list(wrapper);
|
||||||
|
|
||||||
if (list.isEmpty()) {
|
if (list.isEmpty()) {
|
||||||
return R.fail("导出Excel失败,无数据。");
|
try {
|
||||||
|
response.setContentType("application/json;charset=UTF-8");
|
||||||
|
response.getWriter().write("{\"code\":500,\"msg\":\"导出Excel失败,无数据。\"}");
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("写入响应失败", e);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -102,8 +108,12 @@ public class CheckPartAppServiceImpl implements ICheckPartAppService {
|
|||||||
ExcelFillerUtil.makeExcelFile(response, list, headers, excelName, null);
|
ExcelFillerUtil.makeExcelFile(response, list, headers, excelName, null);
|
||||||
} catch (IOException | IllegalAccessException e) {
|
} catch (IOException | IllegalAccessException e) {
|
||||||
log.error("导出Excel失败", e);
|
log.error("导出Excel失败", e);
|
||||||
return R.fail("导出Excel失败:" + e.getMessage());
|
try {
|
||||||
|
response.setContentType("application/json;charset=UTF-8");
|
||||||
|
response.getWriter().write("{\"code\":500,\"msg\":\"导出Excel失败:" + e.getMessage() + "\"}");
|
||||||
|
} catch (IOException ex) {
|
||||||
|
log.error("写入响应失败", ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return R.ok(null, "导出Excel成功");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.openhis.web.clinicalmanage.appservice.impl;
|
package com.openhis.web.clinicalmanage.appservice.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.core.common.core.domain.R;
|
import com.core.common.core.domain.R;
|
||||||
@@ -7,6 +8,8 @@ import com.core.common.core.domain.model.LoginUser;
|
|||||||
import com.core.common.utils.SecurityUtils;
|
import com.core.common.utils.SecurityUtils;
|
||||||
import com.openhis.administration.domain.Patient;
|
import com.openhis.administration.domain.Patient;
|
||||||
import com.openhis.administration.service.IPatientService;
|
import com.openhis.administration.service.IPatientService;
|
||||||
|
import com.openhis.clinical.domain.Surgery;
|
||||||
|
import com.openhis.clinical.service.ISurgeryService;
|
||||||
import com.openhis.surgicalschedule.domain.OpSchedule;
|
import com.openhis.surgicalschedule.domain.OpSchedule;
|
||||||
import com.openhis.surgicalschedule.service.IOpScheduleService;
|
import com.openhis.surgicalschedule.service.IOpScheduleService;
|
||||||
import com.openhis.web.clinicalmanage.appservice.ISurgicalScheduleAppService;
|
import com.openhis.web.clinicalmanage.appservice.ISurgicalScheduleAppService;
|
||||||
@@ -47,6 +50,9 @@ public class SurgicalScheduleAppServiceImpl implements ISurgicalScheduleAppServi
|
|||||||
@Resource
|
@Resource
|
||||||
private SurgicalScheduleAppMapper surgicalScheduleAppMapper;
|
private SurgicalScheduleAppMapper surgicalScheduleAppMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ISurgeryService surgeryService;
|
||||||
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private RequestFormManageAppMapper requestFormManageAppMapper;
|
private RequestFormManageAppMapper requestFormManageAppMapper;
|
||||||
@@ -183,12 +189,30 @@ public class SurgicalScheduleAppServiceImpl implements ISurgicalScheduleAppServi
|
|||||||
|
|
||||||
// 保存手术安排
|
// 保存手术安排
|
||||||
boolean saved = opScheduleService.save(opSchedule);
|
boolean saved = opScheduleService.save(opSchedule);
|
||||||
//修改申请单状态为已排期
|
|
||||||
|
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
return R.fail("新增手术安排失败");
|
return R.fail("新增手术安排失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bug #247 修复:更新手术申请单状态为已排期 (1)
|
||||||
|
if (opCreateScheduleDto.getApplyId() != null) {
|
||||||
|
try {
|
||||||
|
// 通过手术单号查找手术申请记录并更新状态
|
||||||
|
LambdaQueryWrapper<com.openhis.clinical.domain.Surgery> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(com.openhis.clinical.domain.Surgery::getSurgeryNo, opSchedule.getOperCode())
|
||||||
|
.eq(com.openhis.clinical.domain.Surgery::getDeleteFlag, "0");
|
||||||
|
com.openhis.clinical.domain.Surgery surgery = surgeryService.getOne(queryWrapper);
|
||||||
|
if (surgery != null) {
|
||||||
|
surgery.setStatusEnum(1); // 1 = 已排期
|
||||||
|
surgery.setUpdateTime(new Date());
|
||||||
|
surgeryService.updateById(surgery);
|
||||||
|
log.info("更新手术申请单状态为已排期 - surgeryNo: {}, surgeryId: {}", opSchedule.getOperCode(), surgery.getId());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("更新手术申请单状态失败 - operCode: {}", opSchedule.getOperCode(), e);
|
||||||
|
// 状态更新失败不影响主流程,只记录日志
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return R.ok("新增手术安排成功");
|
return R.ok("新增手术安排成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,7 @@
|
|||||||
cs.apply_dept_id,
|
cs.apply_dept_id,
|
||||||
cs.apply_dept_name,
|
cs.apply_dept_name,
|
||||||
cs.surgery_type_enum,
|
cs.surgery_type_enum,
|
||||||
|
cs.status_enum,
|
||||||
fc.contract_name AS fee_type
|
fc.contract_name AS fee_type
|
||||||
FROM doc_request_form drf
|
FROM doc_request_form drf
|
||||||
LEFT JOIN cli_surgery cs ON cs.surgery_no = drf.prescription_no
|
LEFT JOIN cli_surgery cs ON cs.surgery_no = drf.prescription_no
|
||||||
@@ -106,6 +107,8 @@
|
|||||||
AND cs.apply_dept_id = #{requestFormDto.applyDeptId}
|
AND cs.apply_dept_id = #{requestFormDto.applyDeptId}
|
||||||
</if>
|
</if>
|
||||||
AND drf.delete_flag = '0'
|
AND drf.delete_flag = '0'
|
||||||
|
<!-- Bug #249 修复:过滤掉已取消状态的手术申请 -->
|
||||||
|
AND (cs.status_enum IS NULL OR cs.status_enum != 4)
|
||||||
</where>
|
</where>
|
||||||
ORDER BY drf.create_time DESC
|
ORDER BY drf.create_time DESC
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
@@ -70,7 +70,8 @@ export function getTenantList() {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
params: {
|
params: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 1000
|
pageSize: 1000,
|
||||||
|
status: '1' // 只获取已启动的机构 (1=已启动,0=未启动)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,8 @@
|
|||||||
<el-option label="全部" value="" />
|
<el-option label="全部" value="" />
|
||||||
<el-option label="未提交" value="0" />
|
<el-option label="未提交" value="0" />
|
||||||
<el-option label="提交" value="10" />
|
<el-option label="提交" value="10" />
|
||||||
|
<el-option label="已确认" value="20" />
|
||||||
|
<el-option label="已签名" value="30" />
|
||||||
<el-option label="结束" value="40" />
|
<el-option label="结束" value="40" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -137,8 +139,15 @@
|
|||||||
<el-checkbox :model-value="scope.row.consultationStatus === 40" disabled />
|
<el-checkbox :model-value="scope.row.consultationStatus === 40" disabled />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="200" fixed="right" align="center">
|
<el-table-column label="操作" width="250" fixed="right" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
size="small"
|
||||||
|
:icon="Printer"
|
||||||
|
@click="handlePrint(scope.row)"
|
||||||
|
title="打印"
|
||||||
|
/>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -493,22 +502,26 @@ const handleCurrentChange = (val) => {
|
|||||||
loadData()
|
loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
const handlePrint = async () => {
|
const handlePrint = async (row) => {
|
||||||
if (!currentRow.value) {
|
// 优先使用传入的 row,如果没有传入则使用 currentRow
|
||||||
|
const printRow = row || currentRow.value
|
||||||
|
|
||||||
|
if (!printRow) {
|
||||||
ElMessage.warning('请先选择一条记录')
|
ElMessage.warning('请先选择一条记录')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 构建打印数据
|
// 构建打印数据
|
||||||
const printData = {
|
const printData = {
|
||||||
patientName: currentRow.value.patientName || '',
|
patientName: printRow.patientName || '',
|
||||||
gender: currentRow.value.genderText || '',
|
gender: printRow.genderEnum === 1 ? '男' : '女',
|
||||||
age: currentRow.value.age || '',
|
age: printRow.age || '',
|
||||||
deptName: currentRow.value.department || '',
|
deptName: printRow.department || '',
|
||||||
diagnosis: currentRow.value.provisionalDiagnosis || '',
|
diagnosis: printRow.provisionalDiagnosis || '',
|
||||||
consultationReason: currentRow.value.consultationPurpose || '',
|
consultationReason: printRow.consultationPurpose || '',
|
||||||
applyTime: currentRow.value.applyTime || '',
|
applyTime: printRow.consultationRequestDate || '',
|
||||||
applyDoctor: currentRow.value.requestingPhysician || ''
|
applyDoctor: printRow.requestingPhysician || ''
|
||||||
}
|
}
|
||||||
await simplePrint(PRINT_TEMPLATE.CONSULTATION, printData)
|
await simplePrint(PRINT_TEMPLATE.CONSULTATION, printData)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -135,8 +135,14 @@
|
|||||||
<el-input v-model="formData.provisionalDiagnosis" type="textarea" :rows="2" disabled />
|
<el-input v-model="formData.provisionalDiagnosis" type="textarea" :rows="2" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="会诊确认参加医师">
|
<el-form-item label="会诊确认参加医师" required>
|
||||||
<el-input v-model="formData.confirmingPhysician" type="textarea" :rows="3" />
|
<el-input
|
||||||
|
v-model="formData.confirmingPhysician"
|
||||||
|
type="textarea"
|
||||||
|
:rows="3"
|
||||||
|
placeholder="请输入会诊确认参加医师"
|
||||||
|
:disabled="!canEdit"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="会诊意见" required>
|
<el-form-item label="会诊意见" required>
|
||||||
@@ -328,11 +334,10 @@ const applyRowToForm = (row) => {
|
|||||||
invitedObject: row.invitedObject,
|
invitedObject: row.invitedObject,
|
||||||
consultationPurpose: row.consultationPurpose,
|
consultationPurpose: row.consultationPurpose,
|
||||||
provisionalDiagnosis: row.provisionalDiagnosis,
|
provisionalDiagnosis: row.provisionalDiagnosis,
|
||||||
confirmingPhysician: row.confirmingPhysician || '',
|
confirmingPhysician: '',
|
||||||
confirmingPhysicianName: '',
|
confirmingPhysicianName: '',
|
||||||
consultationOpinion: '', // 先清空,后面从 opinionList 中获取
|
consultationOpinion: '',
|
||||||
confirmingPhysicianName: row.confirmingPhysicianName || '',
|
confirmingDeptName: '',
|
||||||
confirmingDeptName: row.confirmingDeptName || '',
|
|
||||||
signature: row.signature || '',
|
signature: row.signature || '',
|
||||||
signatureDate: row.signatureDate,
|
signatureDate: row.signatureDate,
|
||||||
submittingPhysician: row.submittingPhysician,
|
submittingPhysician: row.submittingPhysician,
|
||||||
@@ -340,28 +345,22 @@ const applyRowToForm = (row) => {
|
|||||||
consultationStatus: row.consultationStatus
|
consultationStatus: row.consultationStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从会诊意见列表中获取所有确认医师的信息,并生成显示文本
|
// 从会诊意见列表中获取当前医生的信息
|
||||||
if (opinionList.value.length > 0) {
|
if (opinionList.value.length > 0) {
|
||||||
// 生成所有参与确认医师的文本(格式:科室-医生姓名;科室-医生姓名)
|
|
||||||
const allConfirmingPhysicians = opinionList.value.map(op => `${op.deptName}-${op.physicianName}`).join(';')
|
|
||||||
formData.value.confirmingPhysician = allConfirmingPhysicians // 这个字段显示所有确认的医生
|
|
||||||
|
|
||||||
// 从会诊意见列表中获取当前医生的信息
|
|
||||||
const currentPhysicianId = userStore.practitionerId || userStore.user?.practitionerId
|
const currentPhysicianId = userStore.practitionerId || userStore.user?.practitionerId
|
||||||
const myOpinion = opinionList.value.find(op => op.physicianId === currentPhysicianId)
|
const myOpinion = opinionList.value.find(op => op.physicianId === currentPhysicianId)
|
||||||
|
|
||||||
if (myOpinion) {
|
if (myOpinion) {
|
||||||
// 如果当前医生已确认,回显其信息到所属医生字段
|
// 如果当前医生已确认,回显其信息
|
||||||
|
formData.value.confirmingPhysician = myOpinion.physicianName || ''
|
||||||
formData.value.confirmingPhysicianName = myOpinion.physicianName
|
formData.value.confirmingPhysicianName = myOpinion.physicianName
|
||||||
formData.value.confirmingDeptName = myOpinion.deptName
|
formData.value.confirmingDeptName = myOpinion.deptName
|
||||||
|
|
||||||
// 回显会诊意见(去掉前缀"科室-医生:")
|
// 回显会诊意见(去掉前缀"科室-医生:")
|
||||||
if (myOpinion.opinion) {
|
if (myOpinion.opinion) {
|
||||||
// 格式:科室-医生:意见内容
|
|
||||||
const opinionText = myOpinion.opinion
|
const opinionText = myOpinion.opinion
|
||||||
const colonIndex = opinionText.indexOf(':')
|
const colonIndex = opinionText.indexOf(':')
|
||||||
if (colonIndex > 0) {
|
if (colonIndex > 0) {
|
||||||
// 提取冒号后面的内容
|
|
||||||
formData.value.consultationOpinion = opinionText.substring(colonIndex + 1)
|
formData.value.consultationOpinion = opinionText.substring(colonIndex + 1)
|
||||||
} else {
|
} else {
|
||||||
formData.value.consultationOpinion = opinionText
|
formData.value.consultationOpinion = opinionText
|
||||||
@@ -374,6 +373,11 @@ const applyRowToForm = (row) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果当前医生未确认,预填当前医生姓名作为默认值
|
||||||
|
if (!formData.value.confirmingPhysician) {
|
||||||
|
formData.value.confirmingPhysician = getDoctorName()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleRowChange = async (row) => {
|
const handleRowChange = async (row) => {
|
||||||
@@ -433,6 +437,10 @@ const handleConfirm = async () => {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 确认会诊
|
// 确认会诊
|
||||||
|
if (!formData.value.confirmingPhysician.trim()) {
|
||||||
|
ElMessage.warning('请先填写会诊确认参加医师')
|
||||||
|
return
|
||||||
|
}
|
||||||
if (!formData.value.consultationOpinion.trim()) {
|
if (!formData.value.consultationOpinion.trim()) {
|
||||||
ElMessage.warning('请先填写会诊意见')
|
ElMessage.warning('请先填写会诊意见')
|
||||||
return
|
return
|
||||||
@@ -442,7 +450,7 @@ const handleConfirm = async () => {
|
|||||||
const data = {
|
const data = {
|
||||||
consultationId: formData.value.consultationId,
|
consultationId: formData.value.consultationId,
|
||||||
consultationOpinion: formData.value.consultationOpinion,
|
consultationOpinion: formData.value.consultationOpinion,
|
||||||
confirmingPhysician: getDoctorName(), // 自动使用当前医生姓名
|
confirmingPhysician: formData.value.confirmingPhysician.trim() || getDoctorName(), // 优先使用用户填写的值
|
||||||
confirmingDeptName: getDoctorDept() // 自动使用当前科室
|
confirmingDeptName: getDoctorDept() // 自动使用当前科室
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -702,6 +702,13 @@ const loadMainDiagnosis = async () => {
|
|||||||
|
|
||||||
// 点击表格行
|
// 点击表格行
|
||||||
const handleRowClick = async (row) => {
|
const handleRowClick = async (row) => {
|
||||||
|
console.log('点击行,当前 selectedRow:', selectedRow.value, '新 row:', row);
|
||||||
|
|
||||||
|
// 先清空表单验证状态
|
||||||
|
if (formRef.value) {
|
||||||
|
formRef.value.clearValidate();
|
||||||
|
}
|
||||||
|
|
||||||
selectedRow.value = row;
|
selectedRow.value = row;
|
||||||
if (row) {
|
if (row) {
|
||||||
console.log('点击的行数据:', row);
|
console.log('点击的行数据:', row);
|
||||||
@@ -760,10 +767,19 @@ const handleRowClick = async (row) => {
|
|||||||
participatingPhysicians.value = [];
|
participatingPhysicians.value = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('行点击处理完成,selectedRow:', selectedRow.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 新增
|
// 新增
|
||||||
const handleNew = () => {
|
const handleNew = () => {
|
||||||
|
console.log('点击新增按钮');
|
||||||
|
|
||||||
|
// 先清空表单验证状态
|
||||||
|
if (formRef.value) {
|
||||||
|
formRef.value.clearValidate();
|
||||||
|
}
|
||||||
|
|
||||||
selectedRow.value = null;
|
selectedRow.value = null;
|
||||||
|
|
||||||
// 获取当前登录用户信息
|
// 获取当前登录用户信息
|
||||||
@@ -809,6 +825,8 @@ const handleNew = () => {
|
|||||||
selectedPhysiciansList.value = [];
|
selectedPhysiciansList.value = [];
|
||||||
participatingPhysicians.value = [];
|
participatingPhysicians.value = [];
|
||||||
|
|
||||||
|
console.log('新增模式初始化完成,selectedRow:', selectedRow.value);
|
||||||
|
|
||||||
// 加载主诊断
|
// 加载主诊断
|
||||||
loadMainDiagnosis();
|
loadMainDiagnosis();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -33,7 +33,9 @@
|
|||||||
max-height="300px"
|
max-height="300px"
|
||||||
style="width: 100%; min-width: 100%"
|
style="width: 100%; min-width: 100%"
|
||||||
class="inspection-table"
|
class="inspection-table"
|
||||||
|
highlight-current-row
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
|
@current-change="handleRowClick"
|
||||||
@cell-click="handleCellClick"
|
@cell-click="handleCellClick"
|
||||||
>
|
>
|
||||||
<el-table-column type="selection" width="55" align="center" header-align="center" />
|
<el-table-column type="selection" width="55" align="center" header-align="center" />
|
||||||
@@ -292,16 +294,20 @@
|
|||||||
</template>
|
</template>
|
||||||
<el-row type="flex" :gutter="16" wrap>
|
<el-row type="flex" :gutter="16" wrap>
|
||||||
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
||||||
|
<!-- 🔧 Bug #268 修复:只有急标记能编辑 -->
|
||||||
<el-checkbox v-model="formData.priorityCode" :true-value="1" :false-value="0">急</el-checkbox>
|
<el-checkbox v-model="formData.priorityCode" :true-value="1" :false-value="0">急</el-checkbox>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
||||||
<el-checkbox v-model="formData.applyStatus" :true-value="1" :false-value="0">收费</el-checkbox>
|
<!-- 🔧 Bug #268 修复:收费标记默认不勾选并不可编辑 -->
|
||||||
|
<el-checkbox v-model="formData.applyStatus" :true-value="1" :false-value="0" disabled>收费</el-checkbox>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
||||||
<el-checkbox v-model="formData.needRefund" :true-value="true" :false-value="false">退费</el-checkbox>
|
<!-- 🔧 Bug #268 修复:退费标记默认不勾选并不可编辑 -->
|
||||||
|
<el-checkbox v-model="formData.needRefund" :true-value="true" :false-value="false" disabled>退费</el-checkbox>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
<el-col :xs="12" :sm="6" :md="6" :lg="6">
|
||||||
<el-checkbox v-model="formData.needExecute" :true-value="true" :false-value="false">执行</el-checkbox>
|
<!-- 🔧 Bug #268 修复:执行标记默认不勾选并不可编辑 -->
|
||||||
|
<el-checkbox v-model="formData.needExecute" :true-value="true" :false-value="false" disabled>执行</el-checkbox>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -1521,62 +1527,87 @@ function handleDelete(row) {
|
|||||||
function handleCellClick(row, column) {
|
function handleCellClick(row, column) {
|
||||||
// 点击表格行时,将该申请单的数据加载到表单中
|
// 点击表格行时,将该申请单的数据加载到表单中
|
||||||
if (row && row.applicationId) {
|
if (row && row.applicationId) {
|
||||||
// 切换到申请单 TAB
|
loadApplicationToForm(row);
|
||||||
leftActiveTab.value = 'application'
|
}
|
||||||
|
}
|
||||||
// 加载表单数据
|
|
||||||
Object.assign(formData, {
|
// 🔧 Bug #269 修复:行点击事件处理
|
||||||
applicationId: row.applicationId,
|
function handleRowClick(currentRow, oldRow) {
|
||||||
applyNo: row.applyNo,
|
// 点击表格行时,将该申请单的数据加载到表单中
|
||||||
patientName: row.patientName,
|
if (currentRow && currentRow.applicationId) {
|
||||||
medicalrecordNumber: row.medicalrecordNumber,
|
loadApplicationToForm(currentRow);
|
||||||
natureofCost: row.natureofCost || 'self',
|
}
|
||||||
applyTime: row.applyTime,
|
}
|
||||||
applyDepartment: row.applyDepartment,
|
|
||||||
applyDocName: row.applyDocName,
|
// 🔧 Bug #269 修复:提取公共方法加载申请单到表单
|
||||||
executeDepartment: row.executeDepartment || 'medical_lab',
|
function loadApplicationToForm(row) {
|
||||||
clinicDesc: row.clinicDesc,
|
// 切换到申请单 TAB
|
||||||
contraindication: row.contraindication,
|
leftActiveTab.value = 'application'
|
||||||
clinicDiag: row.clinicDiag,
|
|
||||||
medicalHistorySummary: row.medicalHistorySummary,
|
// 加载表单数据
|
||||||
purposeofInspection: row.purposeofInspection,
|
Object.assign(formData, {
|
||||||
physicalExam: row.physicalExam,
|
applicationId: row.applicationId,
|
||||||
applyRemark: row.applyRemark,
|
applyNo: row.applyNo,
|
||||||
priorityCode: row.priorityCode || 0,
|
patientName: row.patientName,
|
||||||
applyStatus: row.applyStatus || 1,
|
medicalrecordNumber: row.medicalrecordNumber,
|
||||||
needRefund: row.needRefund || false,
|
natureofCost: row.natureofCost || 'self',
|
||||||
needExecute: row.needExecute || false,
|
applyTime: row.applyTime,
|
||||||
inspectionDoctor: row.inspectionDoctor,
|
applyDepartment: row.applyDepartment,
|
||||||
inspectionTime: row.inspectionTime,
|
applyDocName: row.applyDocName,
|
||||||
auditDoctor: row.auditDoctor,
|
executeDepartment: row.executeDepartment || 'medical_lab',
|
||||||
auditTime: row.auditTime,
|
clinicDesc: row.clinicDesc,
|
||||||
visitNo: row.visitNo,
|
contraindication: row.contraindication,
|
||||||
applyDocCode: row.applyDocCode,
|
clinicDiag: row.clinicDiag,
|
||||||
applyDeptCode: row.applyDeptCode,
|
medicalHistorySummary: row.medicalHistorySummary,
|
||||||
specimenName: row.specimenName,
|
purposeofInspection: row.purposeofInspection,
|
||||||
encounterId: row.encounterId,
|
physicalExam: row.physicalExam,
|
||||||
patientId: row.patientId,
|
applyRemark: row.applyRemark,
|
||||||
applyOrganizationId: row.applyOrganizationId
|
priorityCode: row.priorityCode || 0,
|
||||||
})
|
applyStatus: row.applyStatus || 0, // 🔧 Bug #268: 默认为 0
|
||||||
|
needRefund: row.needRefund || false,
|
||||||
// 根据检验项目名称解析已选项目
|
needExecute: row.needExecute || false,
|
||||||
selectedInspectionItems.value = []
|
inspectionDoctor: row.inspectionDoctor,
|
||||||
if (row.itemName || row.inspectionItem) {
|
inspectionTime: row.inspectionTime,
|
||||||
const itemNames = (row.itemName || row.inspectionItem).split('、')
|
auditDoctor: row.auditDoctor,
|
||||||
inspectionCategories.value.forEach(category => {
|
auditTime: row.auditTime,
|
||||||
category.items.forEach(item => {
|
visitNo: row.visitNo,
|
||||||
if (itemNames.includes(item.itemName)) {
|
applyDocCode: row.applyDocCode,
|
||||||
selectedInspectionItems.value.push({ ...item })
|
applyDeptCode: row.applyDeptCode,
|
||||||
}
|
specimenName: row.specimenName,
|
||||||
})
|
encounterId: row.encounterId,
|
||||||
|
patientId: row.patientId,
|
||||||
|
applyOrganizationId: row.applyOrganizationId
|
||||||
|
})
|
||||||
|
|
||||||
|
// 🔧 Bug #269 修复:根据检验项目 ID 加载详细的检验项目数据
|
||||||
|
selectedInspectionItems.value = []
|
||||||
|
if (row.labApplyItemList && row.labApplyItemList.length > 0) {
|
||||||
|
// 如果后端返回了检验项目列表,直接使用
|
||||||
|
selectedInspectionItems.value = row.labApplyItemList.map(item => ({
|
||||||
|
...item,
|
||||||
|
itemId: item.itemId || item.id || Math.random().toString(36).substring(2, 11),
|
||||||
|
itemName: item.itemName || item.name || '',
|
||||||
|
itemPrice: item.itemPrice || item.price || 0,
|
||||||
|
itemAmount: item.itemAmount || item.price || 0,
|
||||||
|
}))
|
||||||
|
} else if (row.itemName || row.inspectionItem) {
|
||||||
|
// 如果只有项目名称,尝试从本地分类中查找匹配项
|
||||||
|
const itemNames = (row.itemName || row.inspectionItem).split(/[+,]/) // 支持多种分隔符
|
||||||
|
inspectionCategories.value.forEach(category => {
|
||||||
|
category.items.forEach(item => {
|
||||||
|
if (itemNames.includes(item.itemName)) {
|
||||||
|
selectedInspectionItems.value.push({ ...item })
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
// 重置验证错误状态
|
|
||||||
Object.keys(validationErrors).forEach(key => {
|
|
||||||
validationErrors[key] = false
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重置验证错误状态
|
||||||
|
Object.keys(validationErrors).forEach(key => {
|
||||||
|
validationErrors[key] = false
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('已加载申请单到表单:', row.applyNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 监听activeTab变化
|
// 监听activeTab变化
|
||||||
|
|||||||
@@ -1048,29 +1048,37 @@ function submitForm() {
|
|||||||
if (form.value.id == undefined) {
|
if (form.value.id == undefined) {
|
||||||
// 新增手术
|
// 新增手术
|
||||||
addSurgery(form.value).then((res) => {
|
addSurgery(form.value).then((res) => {
|
||||||
proxy.$modal.msgSuccess('新增成功')
|
if (res.code === 200) {
|
||||||
//保存麻醉方式
|
proxy.$modal.msgSuccess('新增成功')
|
||||||
seesionStorage.setItem('anesthesiaType', form.value.anesthesiaTypeEnum)
|
//保存麻醉方式
|
||||||
open.value = false
|
sessionStorage.setItem('anesthesiaType', form.value.anesthesiaTypeEnum)
|
||||||
getList()
|
open.value = false
|
||||||
|
getList()
|
||||||
|
} else {
|
||||||
|
proxy.$modal.msgError(res.msg || '新增手术失败')
|
||||||
|
}
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error('新增手术失败:', error)
|
console.error('新增手术失败:', error)
|
||||||
proxy.$message.error('新增手术失败,请检查表单信息')
|
proxy.$modal.msgError('新增手术失败,请稍后重试')
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// 修改手术
|
// 修改手术
|
||||||
updateSurgery(form.value).then((res) => {
|
updateSurgery(form.value).then((res) => {
|
||||||
proxy.$modal.msgSuccess('修改成功')
|
if (res.code === 200) {
|
||||||
seesionStorage.setItem('anesthesiaType', form.value.anesthesiaTypeEnum)
|
proxy.$modal.msgSuccess('修改成功')
|
||||||
open.value = false
|
sessionStorage.setItem('anesthesiaType', form.value.anesthesiaTypeEnum)
|
||||||
getList()
|
open.value = false
|
||||||
|
getList()
|
||||||
|
} else {
|
||||||
|
proxy.$modal.msgError(res.msg || '修改手术失败')
|
||||||
|
}
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error('更新手术失败:', error)
|
console.error('更新手术失败:', error)
|
||||||
proxy.$message.error('更新手术失败,请检查表单信息')
|
proxy.$modal.msgError('更新手术失败,请稍后重试')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
proxy.$message.error('请检查表单信息,标红字段为必填项')
|
proxy.$modal.msgError('请检查表单信息,标红字段为必填项')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ import {computed, onMounted, ref} from 'vue';
|
|||||||
import {useRouter} from 'vue-router';
|
import {useRouter} from 'vue-router';
|
||||||
import {ElMessage} from 'element-plus';
|
import {ElMessage} from 'element-plus';
|
||||||
import {getLocationTree} from '@/views/charge/outpatientregistration/components/outpatientregistration';
|
import {getLocationTree} from '@/views/charge/outpatientregistration/components/outpatientregistration';
|
||||||
import {listInspectionPackage} from '@/api/system/inspectionPackage';
|
import {listInspectionPackage, delInspectionPackage} from '@/api/system/inspectionPackage';
|
||||||
import { getTenantPage } from '@/api/system/tenant';
|
import { getTenantPage } from '@/api/system/tenant';
|
||||||
|
|
||||||
|
|
||||||
@@ -583,7 +583,13 @@ const pageButtons = computed(() => {
|
|||||||
|
|
||||||
// 处理新增
|
// 处理新增
|
||||||
function handleAdd() {
|
function handleAdd() {
|
||||||
router.push('/maintainSystem/Inspection?tab=2');
|
router.push({
|
||||||
|
path: '/maintainSystem/Inspection',
|
||||||
|
query: {
|
||||||
|
tab: '2',
|
||||||
|
mode: 'add'
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理编辑
|
// 处理编辑
|
||||||
@@ -625,12 +631,39 @@ function handleView(item) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理删除
|
// 处理删除
|
||||||
function handleDelete(item) {
|
async function handleDelete(item) {
|
||||||
if (confirm(`确定要删除套餐 "${item.name}" 吗?`)) {
|
try {
|
||||||
const index = tableData.value.findIndex(i => i.id === item.id);
|
await ElMessageBox.confirm(
|
||||||
if (index !== -1) {
|
`确定要删除套餐 "${item.name}" 吗?删除后将无法恢复。`,
|
||||||
tableData.value.splice(index, 1);
|
'确认删除',
|
||||||
alert(`套餐 "${item.name}" 已删除`);
|
{
|
||||||
|
confirmButtonText: '确定删除',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// 获取套餐ID(优先使用 basicInformationId)
|
||||||
|
const packageId = item.basicInformationId || item.id
|
||||||
|
if (!packageId) {
|
||||||
|
ElMessage.error('无法获取套餐ID,删除失败')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用后端API删除
|
||||||
|
const response = await delInspectionPackage(packageId)
|
||||||
|
|
||||||
|
if (response && (response.code === 200 || response.code === 0)) {
|
||||||
|
ElMessage.success('删除成功')
|
||||||
|
// 删除成功后,重新加载列表数据
|
||||||
|
loadData()
|
||||||
|
} else {
|
||||||
|
ElMessage.error(response?.msg || response?.message || '删除失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (error !== 'cancel' && error !== 'close') {
|
||||||
|
console.error('删除失败:', error)
|
||||||
|
ElMessage.error('删除失败: ' + (error?.message || error?.msg || '未知错误'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -424,7 +424,8 @@
|
|||||||
<el-button :icon="RefreshRight" @click="resetForm">重置</el-button>
|
<el-button :icon="RefreshRight" @click="resetForm">重置</el-button>
|
||||||
<el-button type="success" @click="handlePackageManagement">套餐管理</el-button>
|
<el-button type="success" @click="handlePackageManagement">套餐管理</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-button type="success" size="large" @click="handleSave">保存</el-button>
|
<el-button v-if="!isViewMode" type="success" size="large" @click="handleSave">{{ packageMode === 'edit' ? '更新' : '保存' }}</el-button>
|
||||||
|
<el-button v-else type="primary" size="large" @click="handleBackToManagement">返回管理</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 表单区域 -->
|
<!-- 表单区域 -->
|
||||||
@@ -448,6 +449,7 @@
|
|||||||
default-first-option
|
default-first-option
|
||||||
placeholder="请选择或输入套餐级别"
|
placeholder="请选择或输入套餐级别"
|
||||||
style="width: 100%;"
|
style="width: 100%;"
|
||||||
|
:disabled="isViewMode"
|
||||||
@change="handlePackageLevelChange"
|
@change="handlePackageLevelChange"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@@ -473,6 +475,7 @@
|
|||||||
check-strictly
|
check-strictly
|
||||||
:expand-on-click-node="false"
|
:expand-on-click-node="false"
|
||||||
clearable
|
clearable
|
||||||
|
:disabled="isViewMode"
|
||||||
style="width: 100%;"
|
style="width: 100%;"
|
||||||
@change="handlePackageDepartmentChange"
|
@change="handlePackageDepartmentChange"
|
||||||
/>
|
/>
|
||||||
@@ -483,7 +486,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label"><span style="color:red"></span>套餐名称</span>
|
<span class="form-label"><span style="color:red"></span>套餐名称</span>
|
||||||
<el-input v-model="packageName" placeholder="请输入套餐名称" />
|
<el-input v-model="packageName" placeholder="请输入套餐名称" :disabled="isViewMode" />
|
||||||
<div class="error-message" id="packageNameError" style="color: #ff4d4f; font-size: 12px; margin-top: 4px; display: none;">套餐名称不能为空</div>
|
<div class="error-message" id="packageNameError" style="color: #ff4d4f; font-size: 12px; margin-top: 4px; display: none;">套餐名称不能为空</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
@@ -495,6 +498,7 @@
|
|||||||
@change="handleTenantChange"
|
@change="handleTenantChange"
|
||||||
clearable
|
clearable
|
||||||
filterable
|
filterable
|
||||||
|
:disabled="isViewMode"
|
||||||
:loading="loadingTenant"
|
:loading="loadingTenant"
|
||||||
no-data-text="暂无数据,请稍后重试"
|
no-data-text="暂无数据,请稍后重试"
|
||||||
@visible-change="handleTenantVisibleChange"
|
@visible-change="handleTenantVisibleChange"
|
||||||
@@ -513,7 +517,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">折扣 %</span>
|
<span class="form-label">折扣 %</span>
|
||||||
<el-input v-model="discount" @input="calculateAmounts" />
|
<el-input v-model="discount" @input="calculateAmounts" :disabled="isViewMode" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">制单人</span>
|
<span class="form-label">制单人</span>
|
||||||
@@ -521,32 +525,32 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">备注</span>
|
<span class="form-label">备注</span>
|
||||||
<el-input v-model="remarks" placeholder="请输入备注" />
|
<el-input v-model="remarks" placeholder="请输入备注" :disabled="isViewMode" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">是否停用</span>
|
<span class="form-label">是否停用</span>
|
||||||
<el-radio-group v-model="isDisabled">
|
<el-radio-group v-model="isDisabled" :disabled="isViewMode">
|
||||||
<el-radio :label="false">启用</el-radio>
|
<el-radio :label="false">启用</el-radio>
|
||||||
<el-radio :label="true">停用</el-radio>
|
<el-radio :label="true">停用</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">显示套餐名</span>
|
<span class="form-label">显示套餐名</span>
|
||||||
<el-radio-group v-model="showPackageName">
|
<el-radio-group v-model="showPackageName" :disabled="isViewMode">
|
||||||
<el-radio :label="true">是</el-radio>
|
<el-radio :label="true">是</el-radio>
|
||||||
<el-radio :label="false">否</el-radio>
|
<el-radio :label="false">否</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">生成服务费</span>
|
<span class="form-label">生成服务费</span>
|
||||||
<el-radio-group v-model="generateServiceFee">
|
<el-radio-group v-model="generateServiceFee" :disabled="isViewMode">
|
||||||
<el-radio :label="true">是</el-radio>
|
<el-radio :label="true">是</el-radio>
|
||||||
<el-radio :label="false">否</el-radio>
|
<el-radio :label="false">否</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">套餐价格</span>
|
<span class="form-label">套餐价格</span>
|
||||||
<el-radio-group v-model="enablePackagePrice">
|
<el-radio-group v-model="enablePackagePrice" :disabled="isViewMode">
|
||||||
<el-radio :label="true">启用</el-radio>
|
<el-radio :label="true">启用</el-radio>
|
||||||
<el-radio :label="false">不启用</el-radio>
|
<el-radio :label="false">不启用</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
@@ -558,7 +562,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">lis分组</span>
|
<span class="form-label">lis分组</span>
|
||||||
<el-select v-model="selectedLisGroup" placeholder="请选择lis分组" style="width: 100%;">
|
<el-select v-model="selectedLisGroup" placeholder="请选择lis分组" style="width: 100%;" :disabled="isViewMode">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="group in lisGroupList"
|
v-for="group in lisGroupList"
|
||||||
:key="group.id"
|
:key="group.id"
|
||||||
@@ -569,7 +573,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">血量</span>
|
<span class="form-label">血量</span>
|
||||||
<el-input v-model="bloodVolume" />
|
<el-input v-model="bloodVolume" :disabled="isViewMode" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -578,7 +582,7 @@
|
|||||||
<div class="table-container" style="width: 100%; margin-top: 20px;">
|
<div class="table-container" style="width: 100%; margin-top: 20px;">
|
||||||
<div class="table-header" style="display: flex; justify-content: space-between; align-items: center; padding: 10px;">
|
<div class="table-header" style="display: flex; justify-content: space-between; align-items: center; padding: 10px;">
|
||||||
<div class="table-title" style="font-size: 16px; font-weight: bold;">检验套餐明细</div>
|
<div class="table-title" style="font-size: 16px; font-weight: bold;">检验套餐明细</div>
|
||||||
<el-button type="primary" size="small" circle @click="addPackageItem" title="添加项目">
|
<el-button v-if="!isViewMode" type="primary" size="small" circle @click="addPackageItem" title="添加项目">
|
||||||
<el-icon><Plus /></el-icon>
|
<el-icon><Plus /></el-icon>
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -890,6 +894,7 @@ import {
|
|||||||
import {listLisGroup} from '@/api/system/checkType';
|
import {listLisGroup} from '@/api/system/checkType';
|
||||||
import {
|
import {
|
||||||
addInspectionPackage,
|
addInspectionPackage,
|
||||||
|
updateInspectionPackage,
|
||||||
getInspectionPackage,
|
getInspectionPackage,
|
||||||
listInspectionPackageDetails,
|
listInspectionPackageDetails,
|
||||||
saveInspectionPackageDetails
|
saveInspectionPackageDetails
|
||||||
@@ -1545,6 +1550,12 @@ const bloodVolume = ref('');
|
|||||||
const remarks = ref('');
|
const remarks = ref('');
|
||||||
// 检验套餐明细项目 - 从后端API获取
|
// 检验套餐明细项目 - 从后端API获取
|
||||||
const packageItems = ref([]);
|
const packageItems = ref([]);
|
||||||
|
// 套餐当前模式: add-新增, edit-编辑, view-查看
|
||||||
|
const packageMode = ref('add');
|
||||||
|
// 当前编辑的套餐ID(用于编辑和查看模式)
|
||||||
|
const currentPackageId = ref(null);
|
||||||
|
// 是否为查看模式(只读)
|
||||||
|
const isViewMode = computed(() => packageMode.value === 'view');
|
||||||
|
|
||||||
let addingItem = false;
|
let addingItem = false;
|
||||||
const addPackageItem = () => {
|
const addPackageItem = () => {
|
||||||
@@ -2651,34 +2662,50 @@ const savePackageData = async (basicInfo, detailData) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 1. 先保存基本信息
|
// 判断是新增还是编辑模式
|
||||||
const basicResponse = await addInspectionPackage(basicInfo);
|
const isEditMode = packageMode.value === 'edit' && currentPackageId.value;
|
||||||
|
|
||||||
// 检查响应码
|
// 如果是编辑模式,设置packageId到basicInfo中
|
||||||
if (basicResponse.code !== 200) {
|
if (isEditMode) {
|
||||||
loading.close();
|
basicInfo.packageId = currentPackageId.value;
|
||||||
throw new Error(basicResponse.msg || '保存基本信息失败');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查响应数据结构 - 兼容多种可能的响应格式
|
// 1. 先保存或更新基本信息
|
||||||
let packageId = null;
|
let packageId = null;
|
||||||
|
let basicResponse;
|
||||||
|
|
||||||
|
if (isEditMode) {
|
||||||
|
// 编辑模式:调用更新API
|
||||||
|
basicResponse = await updateInspectionPackage(basicInfo);
|
||||||
|
packageId = currentPackageId.value;
|
||||||
|
} else {
|
||||||
|
// 新增模式:调用新增API
|
||||||
|
basicResponse = await addInspectionPackage(basicInfo);
|
||||||
|
|
||||||
|
// 检查响应码
|
||||||
|
if (basicResponse.code !== 200) {
|
||||||
|
loading.close();
|
||||||
|
throw new Error(basicResponse.msg || '保存基本信息失败');
|
||||||
|
}
|
||||||
|
|
||||||
if (basicResponse.data) {
|
// 检查响应数据结构 - 兼容多种可能的响应格式
|
||||||
// 标准格式:{code: 200, data: {packageId: xxx}}
|
if (basicResponse.data) {
|
||||||
packageId = basicResponse.data.packageId || basicResponse.data.id;
|
// 标准格式:{code: 200, data: {packageId: xxx}}
|
||||||
} else if (basicResponse.packageId) {
|
packageId = basicResponse.data.packageId || basicResponse.data.id;
|
||||||
// 如果data不存在,尝试直接从响应根级别获取
|
} else if (basicResponse.packageId) {
|
||||||
packageId = basicResponse.packageId;
|
// 如果data不存在,尝试直接从响应根级别获取
|
||||||
} else if (basicResponse.id) {
|
packageId = basicResponse.packageId;
|
||||||
// 如果data不存在,尝试直接从响应根级别获取id
|
} else if (basicResponse.id) {
|
||||||
packageId = basicResponse.id;
|
// 如果data不存在,尝试直接从响应根级别获取id
|
||||||
}
|
packageId = basicResponse.id;
|
||||||
|
}
|
||||||
|
|
||||||
// 验证套餐ID是否存在
|
// 验证套餐ID是否存在
|
||||||
if (!packageId) {
|
if (!packageId) {
|
||||||
loading.close();
|
loading.close();
|
||||||
console.error('无法从响应中获取套餐ID,完整响应:', basicResponse);
|
console.error('无法从响应中获取套餐ID,完整响应:', basicResponse);
|
||||||
throw new Error('保存成功但未返回套餐ID。请检查后端接口是否正确返回了packageId或id字段');
|
throw new Error('保存成功但未返回套餐ID。请检查后端接口是否正确返回了packageId或id字段');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 分别保存每个明细数据到明细表,并将后端返回的 id 回填到 packageItems
|
// 2. 分别保存每个明细数据到明细表,并将后端返回的 id 回填到 packageItems
|
||||||
@@ -2780,6 +2807,10 @@ const doResetForm = () => {
|
|||||||
|
|
||||||
// 清空明细数据
|
// 清空明细数据
|
||||||
packageItems.value = [];
|
packageItems.value = [];
|
||||||
|
|
||||||
|
// 重置模式为新增
|
||||||
|
packageMode.value = 'add';
|
||||||
|
currentPackageId.value = null;
|
||||||
|
|
||||||
// 重新计算金额
|
// 重新计算金额
|
||||||
calculateAmounts();
|
calculateAmounts();
|
||||||
@@ -2857,6 +2888,13 @@ const handlePackageManagement = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleBackToManagement = () => {
|
||||||
|
// 返回套餐管理页面
|
||||||
|
router.push({
|
||||||
|
path: '/maintainSystem/Inspection/PackageManagement'
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const refreshPage = () => {
|
const refreshPage = () => {
|
||||||
getInspectionTypeList();
|
getInspectionTypeList();
|
||||||
};
|
};
|
||||||
@@ -2889,7 +2927,19 @@ watch(
|
|||||||
|
|
||||||
const applyRouteForPackage = async (query) => {
|
const applyRouteForPackage = async (query) => {
|
||||||
const packageId = query?.packageId;
|
const packageId = query?.packageId;
|
||||||
if (!packageId) return;
|
const mode = query?.mode || 'add';
|
||||||
|
|
||||||
|
// 设置当前模式和套餐ID
|
||||||
|
packageMode.value = mode;
|
||||||
|
currentPackageId.value = packageId ? String(packageId) : null;
|
||||||
|
|
||||||
|
// 如果是新增模式,重置表单
|
||||||
|
if (mode === 'add' || !packageId) {
|
||||||
|
activeNav.value = 2;
|
||||||
|
doResetForm();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
activeNav.value = 2;
|
activeNav.value = 2;
|
||||||
await nextTick();
|
await nextTick();
|
||||||
loadInspectionPackage(String(packageId));
|
loadInspectionPackage(String(packageId));
|
||||||
|
|||||||
@@ -17,8 +17,13 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="卫生机构">
|
<el-form-item label="卫生机构">
|
||||||
<el-select v-model="queryParams.organization" placeholder="请选择机构" style="width: 150px" clearable>
|
<el-select v-model="queryParams.organization" placeholder="请选择机构" style="width: 150px" clearable filterable>
|
||||||
<el-option label="演示医院" value="演示医院" />
|
<el-option
|
||||||
|
v-for="org in organizationOptions"
|
||||||
|
:key="org.value"
|
||||||
|
:label="org.label"
|
||||||
|
:value="org.value"
|
||||||
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -199,6 +204,7 @@ import {ElMessage, ElMessageBox} from 'element-plus'
|
|||||||
import {getDicts} from '@/api/system/dict/data'
|
import {getDicts} from '@/api/system/dict/data'
|
||||||
import {listDept} from '@/api/system/dept'
|
import {listDept} from '@/api/system/dept'
|
||||||
import {delCheckPackage, getCheckPackage, listCheckPackage} from '@/api/system/checkType'
|
import {delCheckPackage, getCheckPackage, listCheckPackage} from '@/api/system/checkType'
|
||||||
|
import {getTenantPage} from '@/api/system/tenant'
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
import useUserStore from '@/store/modules/user'
|
import useUserStore from '@/store/modules/user'
|
||||||
|
|
||||||
@@ -275,6 +281,8 @@ const loading = ref(false)
|
|||||||
const packageLevelOptions = ref([])
|
const packageLevelOptions = ref([])
|
||||||
// 科室选项
|
// 科室选项
|
||||||
const departments = ref([])
|
const departments = ref([])
|
||||||
|
// 卫生机构选项
|
||||||
|
const organizationOptions = ref([])
|
||||||
|
|
||||||
// 初始化数据
|
// 初始化数据
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
@@ -394,6 +402,33 @@ onMounted(async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取卫生机构列表
|
||||||
|
try {
|
||||||
|
const tenantResponse = await getTenantPage({ pageNum: 1, pageSize: 100 })
|
||||||
|
if (tenantResponse && tenantResponse.code === 200) {
|
||||||
|
const tenantData = tenantResponse.data || {}
|
||||||
|
let tenantList = []
|
||||||
|
if (Array.isArray(tenantData)) {
|
||||||
|
tenantList = tenantData
|
||||||
|
} else if (tenantData.records) {
|
||||||
|
tenantList = tenantData.records
|
||||||
|
} else if (tenantData.rows) {
|
||||||
|
tenantList = tenantData.rows
|
||||||
|
} else if (tenantData.list) {
|
||||||
|
tenantList = tenantData.list
|
||||||
|
}
|
||||||
|
// 过滤启用的机构
|
||||||
|
organizationOptions.value = tenantList
|
||||||
|
.filter(item => item && item.status === '0')
|
||||||
|
.map(item => ({
|
||||||
|
value: item.tenantName || item.name || item.orgName || String(item.id),
|
||||||
|
label: item.tenantName || item.name || item.orgName || String(item.id)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取卫生机构列表失败:', error)
|
||||||
|
}
|
||||||
|
|
||||||
// 加载列表数据
|
// 加载列表数据
|
||||||
handleQuery()
|
handleQuery()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="套餐金额">
|
<el-form-item label="套餐金额">
|
||||||
<el-input v-model="formData.packagePrice" :disabled="true" placeholder="自动计算">
|
<el-input v-model="packagePriceDisplay" :disabled="true" placeholder="自动计算">
|
||||||
<template #append>元</template>
|
<template #append>元</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -112,73 +112,60 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="是否停用">
|
<el-form-item label="是否停用">
|
||||||
<el-radio-group v-model="formData.isDisabled">
|
<el-radio-group v-model="formData.isDisabled" :disabled="isReadOnly">
|
||||||
<el-radio :value="0">启用</el-radio>
|
<el-radio :value="0">启用</el-radio>
|
||||||
<el-radio :value="1">停用</el-radio>
|
<el-radio :value="1">停用</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="显示套餐名">
|
<el-form-item label="显示套餐名">
|
||||||
<el-radio-group v-model="formData.showPackageName">
|
<el-radio-group v-model="formData.showPackageName" :disabled="isReadOnly">
|
||||||
<el-radio :value="1">是</el-radio>
|
<el-radio :value="1">是</el-radio>
|
||||||
<el-radio :value="0">否</el-radio>
|
<el-radio :value="0">否</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="生成服务费">
|
<el-form-item label="生成服务费">
|
||||||
<el-radio-group v-model="formData.generateServiceFee">
|
<el-radio-group v-model="formData.generateServiceFee" :disabled="isReadOnly">
|
||||||
<el-radio :value="1">是</el-radio>
|
<el-radio :value="1">是</el-radio>
|
||||||
<el-radio :value="0">否</el-radio>
|
<el-radio :value="0">否</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="套餐价格">
|
<el-form-item label="套餐价格">
|
||||||
<el-radio-group v-model="formData.packagePriceEnabled">
|
<el-radio-group v-model="formData.packagePriceEnabled" :disabled="isReadOnly">
|
||||||
<el-radio :value="1">启用</el-radio>
|
<el-radio :value="1">启用</el-radio>
|
||||||
<el-radio :value="0">不启用</el-radio>
|
<el-radio :value="0">不启用</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||||
<el-form-item label="服务费">
|
<el-form-item label="服务费">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="formData.serviceFee"
|
v-model="formData.serviceFee"
|
||||||
:precision="2"
|
:precision="2"
|
||||||
:min="0"
|
:min="0"
|
||||||
placeholder="请输入服务费"
|
placeholder="请输入服务费"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
/>
|
:disabled="isReadOnly"
|
||||||
</el-form-item>
|
/>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6">
|
<el-col :xs="24" :sm="12" :md="12" :lg="12">
|
||||||
<el-form-item label="日期">
|
<el-form-item label="备注">
|
||||||
<el-date-picker
|
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" :disabled="isReadOnly" />
|
||||||
v-model="formData.createDate"
|
</el-form-item>
|
||||||
type="date"
|
</el-col>
|
||||||
placeholder="选择日期"
|
|
||||||
format="YYYY-MM-DD"
|
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
:disabled="true"
|
|
||||||
style="width: 100%"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :xs="24" :sm="12" :md="12" :lg="12">
|
|
||||||
<el-form-item label="备注">
|
|
||||||
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
@@ -338,7 +325,7 @@
|
|||||||
<span v-else>{{ row.origin || '-' }}</span>
|
<span v-else>{{ row.origin || '-' }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
<el-table-column label="操作" v-if="!isReadOnly" width="150" align="center" fixed="right">
|
||||||
<template #default="{ row, $index }">
|
<template #default="{ row, $index }">
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<el-button
|
<el-button
|
||||||
@@ -446,7 +433,7 @@ const formData = reactive({
|
|||||||
user: '',
|
user: '',
|
||||||
packageName: '',
|
packageName: '',
|
||||||
organization: '',
|
organization: '',
|
||||||
packagePrice: '0.00',
|
packagePrice: 0,
|
||||||
discount: '',
|
discount: '',
|
||||||
creator: userStore.name || '当前用户',
|
creator: userStore.name || '当前用户',
|
||||||
isDisabled: 0,
|
isDisabled: 0,
|
||||||
@@ -458,6 +445,14 @@ const formData = reactive({
|
|||||||
createDate: new Date().toISOString().split('T')[0] // 自动生成当前系统日期
|
createDate: new Date().toISOString().split('T')[0] // 自动生成当前系统日期
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 套餐金额显示值(格式化后的字符串)
|
||||||
|
const packagePriceDisplay = computed({
|
||||||
|
get: () => formData.packagePrice?.toFixed(2) || '0.00',
|
||||||
|
set: (value) => {
|
||||||
|
// 只读,不允许直接修改
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// 表单验证规则
|
// 表单验证规则
|
||||||
const formRules = {
|
const formRules = {
|
||||||
packageType: [
|
packageType: [
|
||||||
@@ -499,6 +494,9 @@ watch(() => props.packageData, (newData) => {
|
|||||||
function loadPackageData(data) {
|
function loadPackageData(data) {
|
||||||
if (!data) return
|
if (!data) return
|
||||||
|
|
||||||
|
console.log('=== 加载套餐数据 ===')
|
||||||
|
console.log('套餐数据:', data)
|
||||||
|
|
||||||
// 填充基本信息
|
// 填充基本信息
|
||||||
Object.keys(formData).forEach(key => {
|
Object.keys(formData).forEach(key => {
|
||||||
if (data[key] !== undefined) {
|
if (data[key] !== undefined) {
|
||||||
@@ -511,7 +509,7 @@ function loadPackageData(data) {
|
|||||||
// 旧编码格式:在下拉框中添加临时选项
|
// 旧编码格式:在下拉框中添加临时选项
|
||||||
const tempDept = {
|
const tempDept = {
|
||||||
deptCode: deptValue,
|
deptCode: deptValue,
|
||||||
dictLabel: `旧编码: ${deptValue} (请重新选择)`,
|
dictLabel: `旧编码:${deptValue} (请重新选择)`,
|
||||||
dictValue: deptValue,
|
dictValue: deptValue,
|
||||||
isOldFormat: true
|
isOldFormat: true
|
||||||
}
|
}
|
||||||
@@ -548,13 +546,45 @@ function loadPackageData(data) {
|
|||||||
editing: false,
|
editing: false,
|
||||||
filteredList: diagnosisTreatmentList.value
|
filteredList: diagnosisTreatmentList.value
|
||||||
}))
|
}))
|
||||||
|
console.log('明细数据加载成功,条数:', detailData.value.length)
|
||||||
|
} else {
|
||||||
|
console.log('没有明细数据')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('formData 加载后:', formData)
|
||||||
|
console.log('detailData 加载后:', detailData.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
console.log('=== PackageSettings 组件开始初始化 ===')
|
console.log('=== PackageSettings 组件开始初始化 ===')
|
||||||
|
console.log('当前模式:', props.mode)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 新增模式初始化 formData
|
||||||
|
if (props.mode === 'add') {
|
||||||
|
console.log('新增模式:初始化 formData')
|
||||||
|
// 确保表单字段正确初始化
|
||||||
|
formData.id = null
|
||||||
|
formData.packageType = '检查套餐'
|
||||||
|
formData.packageLevel = ''
|
||||||
|
formData.department = ''
|
||||||
|
formData.user = ''
|
||||||
|
formData.packageName = ''
|
||||||
|
formData.organization = ''
|
||||||
|
formData.packagePrice = 0
|
||||||
|
formData.discount = ''
|
||||||
|
formData.isDisabled = 0
|
||||||
|
formData.showPackageName = 1
|
||||||
|
formData.generateServiceFee = 0
|
||||||
|
formData.packagePriceEnabled = 1
|
||||||
|
formData.serviceFee = 0
|
||||||
|
formData.remark = ''
|
||||||
|
formData.createDate = new Date().toISOString().split('T')[0]
|
||||||
|
// 清空明细数据并初始化一行
|
||||||
|
detailData.value = []
|
||||||
|
handleAddRow()
|
||||||
|
}
|
||||||
|
|
||||||
// 获取套餐级别字典
|
// 获取套餐级别字典
|
||||||
try {
|
try {
|
||||||
const levelResponse = await getDicts('examination_item_package_level')
|
const levelResponse = await getDicts('examination_item_package_level')
|
||||||
@@ -698,11 +728,6 @@ onMounted(async () => {
|
|||||||
// 加载卫生机构列表(只获取启用的租户)
|
// 加载卫生机构列表(只获取启用的租户)
|
||||||
await loadOrganizationList()
|
await loadOrganizationList()
|
||||||
|
|
||||||
// 初始化一行空数据
|
|
||||||
if(props.mode === 'add'){
|
|
||||||
handleAddRow()
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('✗ 初始化数据失败:', error)
|
console.error('✗ 初始化数据失败:', error)
|
||||||
}
|
}
|
||||||
@@ -1033,12 +1058,12 @@ function calculatePackagePrice() {
|
|||||||
// 如果有折扣,应用折扣计算
|
// 如果有折扣,应用折扣计算
|
||||||
let finalPrice = total
|
let finalPrice = total
|
||||||
if (formData.discount && parseFloat(formData.discount) > 0 && parseFloat(formData.discount) <= 100) {
|
if (formData.discount && parseFloat(formData.discount) > 0 && parseFloat(formData.discount) <= 100) {
|
||||||
const discountRate = parseFloat(formData.discount) / 100 // 将百分比转换为小数(如10% -> 0.1)
|
const discountRate = parseFloat(formData.discount) / 100 // 将百分比转换为小数(如 10% -> 0.1)
|
||||||
const discountAmount = total * discountRate // 折扣金额
|
const discountAmount = total * discountRate // 折扣金额
|
||||||
finalPrice = total - discountAmount // 折扣后金额
|
finalPrice = total - discountAmount // 折扣后金额
|
||||||
}
|
}
|
||||||
|
|
||||||
formData.packagePrice = finalPrice.toFixed(2)
|
formData.packagePrice = finalPrice
|
||||||
}
|
}
|
||||||
|
|
||||||
// 折扣变更处理
|
// 折扣变更处理
|
||||||
|
|||||||
@@ -233,7 +233,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="search-item">
|
<div class="search-item">
|
||||||
<label>费用套餐</label>
|
<label>费用套餐</label>
|
||||||
<el-select v-model="searchParamsMethod.packageName" placeholder="选择使用套餐" style="width: 150px">
|
<el-select v-model="searchParamsMethod.packageName" placeholder="选择使用套餐" style="width: 150px" filterable clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="pkg in checkPackages"
|
v-for="pkg in checkPackages"
|
||||||
:key="pkg.id"
|
:key="pkg.id"
|
||||||
@@ -551,10 +551,17 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<template v-if="item.editing">
|
<template v-if="item.editing">
|
||||||
<input type="text" placeholder="请输入下级医技类型" v-model="item.subType">
|
<el-select v-model="item.subType" placeholder="选择下级医技类型" style="width: 100%" clearable filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="opt in checkTypeOptionsForMethodPart"
|
||||||
|
:key="opt.value"
|
||||||
|
:label="opt.label"
|
||||||
|
:value="opt.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
{{ item.subType || '' }}
|
{{ getCheckTypeLabelForMethodPart(item.subType) || '' }}
|
||||||
</template>
|
</template>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
|
|||||||
@@ -257,8 +257,9 @@
|
|||||||
v-model="form.scheduleDate"
|
v-model="form.scheduleDate"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
placeholder="选择安排时间"
|
placeholder="选择安排时间"
|
||||||
value-format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
:default-time="new Date(2026, 0, 1, 8, 0, 0)"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -751,6 +752,13 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="主刀医生" align="center" width="100" prop="mainSurgeonName" />
|
<el-table-column label="主刀医生" align="center" width="100" prop="mainSurgeonName" />
|
||||||
|
<el-table-column label="状态" align="center" width="90">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag :type="getStatusTagType(scope.row.statusEnum)">
|
||||||
|
{{ getStatusText(scope.row.statusEnum) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<!-- 底部分页区 -->
|
<!-- 底部分页区 -->
|
||||||
@@ -1699,6 +1707,44 @@ function getAnesthesiaName(anesMethod) {
|
|||||||
return anesthesia ? anesthesia.label : ''
|
return anesthesia ? anesthesia.label : ''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取状态标签类型
|
||||||
|
function getStatusTagType(statusEnum) {
|
||||||
|
const typeMap = {
|
||||||
|
0: 'info', // 新开/待排期
|
||||||
|
1: 'warning', // 已排期
|
||||||
|
2: 'primary', // 手术中
|
||||||
|
3: 'success', // 已完成
|
||||||
|
4: 'danger', // 已取消
|
||||||
|
5: 'info' // 暂停
|
||||||
|
}
|
||||||
|
return typeMap[statusEnum] || 'info'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取状态文本
|
||||||
|
function getStatusText(statusEnum) {
|
||||||
|
const textMap = {
|
||||||
|
0: '待排期',
|
||||||
|
1: '已排期',
|
||||||
|
2: '手术中',
|
||||||
|
3: '已完成',
|
||||||
|
4: '已取消',
|
||||||
|
5: '暂停'
|
||||||
|
}
|
||||||
|
return textMap[statusEnum] || '未知'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将麻醉名称映射为枚举值
|
||||||
|
function mapAnesthesiaNameToValue(name) {
|
||||||
|
if (!name) return undefined
|
||||||
|
if (name.includes('局部')) return '1'
|
||||||
|
if (name.includes('区域')) return '2'
|
||||||
|
if (name.includes('全身') || name.includes('全麻')) return '3'
|
||||||
|
if (name.includes('脊椎')) return '4'
|
||||||
|
if (name.includes('硬膜外')) return '5'
|
||||||
|
if (name.includes('表面')) return '6'
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
// 根据出生日期计算年龄
|
// 根据出生日期计算年龄
|
||||||
function calculateAge(birthDay) {
|
function calculateAge(birthDay) {
|
||||||
if (!birthDay) return ''
|
if (!birthDay) return ''
|
||||||
@@ -1731,6 +1777,37 @@ function confirmApply() {
|
|||||||
proxy.$modal.msgWarning('请先选择一条手术申请记录')
|
proxy.$modal.msgWarning('请先选择一条手术申请记录')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
const selectedRow = selectedRows[0]
|
||||||
|
// 填充手术申请信息到表单
|
||||||
|
form.surgeryNo = selectedRow.surgeryNo // 手术单号对应填入手术单号
|
||||||
|
form.applyId=selectedRow.applyId// 手术申请 id
|
||||||
|
form.patientId = selectedRow.patientId// 患者 id
|
||||||
|
form.visitId = selectedRow.encounterId // id 对应填入就诊 id
|
||||||
|
form.operCode = selectedRow.surgeryNo // 手术单号作为手术编码
|
||||||
|
form.operName = selectedRow.descJson.surgeryName//手术名称
|
||||||
|
form.preoperativeDiagnosis = selectedRow.descJson?.preoperativeDiagnosis || ''
|
||||||
|
form.patientName = selectedRow.name// 患者姓名对应填入患者姓名
|
||||||
|
form.gender = selectedRow.gender//患者性别
|
||||||
|
form.birthDay = selectedRow.birthDay//患者出生日期
|
||||||
|
form.age = calculateAge(selectedRow.birthDay)//计算患者年龄
|
||||||
|
form.applyDeptName = selectedRow.applyDeptName//申请部门名称
|
||||||
|
form.applyDoctorName = selectedRow.applyDoctorName//申请医生
|
||||||
|
form.applyTime = selectedRow.applyTime//申请时间
|
||||||
|
form.surgeryType = selectedRow.surgeryTypeEnum//手术类型
|
||||||
|
form.surgeryNature = selectedRow.surgeryTypeEnum//手术性质
|
||||||
|
form.surgeonCode = selectedRow.mainSurgeonId//主刀医生 id
|
||||||
|
form.surgeonName = selectedRow.mainSurgeonName//主刀医生姓名
|
||||||
|
form.feeType = selectedRow.feeType//费用类别
|
||||||
|
// Bug #252 修复:继承手术申请的麻醉方式
|
||||||
|
if (selectedRow.descJson?.anesthesiaName) {
|
||||||
|
form.anesMethod = mapAnesthesiaNameToValue(selectedRow.descJson.anesthesiaName)
|
||||||
|
}
|
||||||
|
// Bug #253/#254 修复:继承手术申请的切口类型
|
||||||
|
if (selectedRow.descJson?.incisionLevel) {
|
||||||
|
form.incisionType = String(selectedRow.descJson.incisionLevel)
|
||||||
|
}
|
||||||
|
showApplyDialog.value = false
|
||||||
|
}
|
||||||
const selectedRow = selectedRows[0]
|
const selectedRow = selectedRows[0]
|
||||||
// 填充手术申请信息到表单
|
// 填充手术申请信息到表单
|
||||||
form.surgeryNo = selectedRow.surgeryNo // 手术单号对应填入手术单号
|
form.surgeryNo = selectedRow.surgeryNo // 手术单号对应填入手术单号
|
||||||
|
|||||||
Reference in New Issue
Block a user