feat(surgery): 完善手术管理功能模块
- 添加手术申请相关API接口,包括根据患者ID查询就诊列表功能 - 在医生工作站界面集成手术申请功能选项卡 - 实现手术管理页面的完整功能,包括手术申请的增删改查 - 添加手术排期、开始、完成等状态流转功能 - 优化手术管理页面表格展示,增加手术类型、等级、计划时间等字段 - 实现手术申请表单的完整编辑和查看模式 - 集成患者信息和就诊记录关联功能 - 添加手术室、医生、护士等资源选择功能 - 更新系统依赖配置,添加core-common模块 - 优化图标资源和manifest配置文件 - 调整患者档案和门诊记录相关状态枚举
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package com.openhis.web.basedatamanage.appservice;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.basedatamanage.dto.OperatingRoomDto;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* 手术室应用Service接口
|
||||
*
|
||||
* @author system
|
||||
* @date 2026-01-04
|
||||
*/
|
||||
public interface IOperatingRoomAppService {
|
||||
|
||||
/**
|
||||
* 分页查询手术室列表
|
||||
*
|
||||
* @param operatingRoomDto 查询条件
|
||||
* @param pageNo 当前页
|
||||
* @param pageSize 每页条数
|
||||
* @param request 请求
|
||||
* @return 手术室列表
|
||||
*/
|
||||
R<?> getOperatingRoomPage(OperatingRoomDto operatingRoomDto, Integer pageNo, Integer pageSize,
|
||||
HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 根据ID查询手术室详情
|
||||
*
|
||||
* @param id 手术室ID
|
||||
* @return 手术室详情
|
||||
*/
|
||||
R<?> getOperatingRoomById(Long id);
|
||||
|
||||
/**
|
||||
* 新增手术室
|
||||
*
|
||||
* @param operatingRoomDto 手术室信息
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> addOperatingRoom(@Validated OperatingRoomDto operatingRoomDto);
|
||||
|
||||
/**
|
||||
* 修改手术室
|
||||
*
|
||||
* @param operatingRoomDto 手术室信息
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> updateOperatingRoom(@Validated OperatingRoomDto operatingRoomDto);
|
||||
|
||||
/**
|
||||
* 删除手术室
|
||||
*
|
||||
* @param ids 手术室ID(支持批量)
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> deleteOperatingRoom(String ids);
|
||||
|
||||
/**
|
||||
* 启用手术室
|
||||
*
|
||||
* @param ids 手术室ID数组
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> enableOperatingRoom(java.util.List<Long> ids);
|
||||
|
||||
/**
|
||||
* 停用手术室
|
||||
*
|
||||
* @param ids 手术室ID数组
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> disableOperatingRoom(java.util.List<Long> ids);
|
||||
}
|
||||
@@ -0,0 +1,293 @@
|
||||
package com.openhis.web.basedatamanage.appservice.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.core.common.utils.AssignSeqUtil;
|
||||
import com.core.common.utils.ChineseConvertUtils;
|
||||
import com.core.common.utils.StringUtils;
|
||||
import com.openhis.administration.domain.OperatingRoom;
|
||||
import com.openhis.administration.mapper.OperatingRoomMapper;
|
||||
import com.openhis.administration.service.IOperatingRoomService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import com.openhis.common.enums.AssignSeqEnum;
|
||||
import com.openhis.common.enums.LocationStatus;
|
||||
import com.openhis.common.utils.HisPageUtils;
|
||||
import com.openhis.common.utils.HisQueryUtils;
|
||||
import com.openhis.web.basedatamanage.appservice.IOperatingRoomAppService;
|
||||
import com.openhis.web.basedatamanage.dto.OperatingRoomDto;
|
||||
import com.openhis.web.common.appservice.ICommonService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 手术室应用Service实现类
|
||||
*
|
||||
* @author system
|
||||
* @date 2026-01-04
|
||||
*/
|
||||
@Service
|
||||
public class OperatingRoomAppServiceImpl implements IOperatingRoomAppService {
|
||||
|
||||
@Resource
|
||||
private IOperatingRoomService operatingRoomService;
|
||||
|
||||
@Resource
|
||||
private OperatingRoomMapper operatingRoomMapper;
|
||||
|
||||
@Resource
|
||||
private AssignSeqUtil assignSeqUtil;
|
||||
|
||||
@Resource
|
||||
private ICommonService commonService;
|
||||
|
||||
/**
|
||||
* 分页查询手术室列表
|
||||
*
|
||||
* @param operatingRoomDto 查询条件
|
||||
* @param pageNo 当前页
|
||||
* @param pageSize 每页条数
|
||||
* @param request 请求
|
||||
* @return 手术室列表
|
||||
*/
|
||||
@Override
|
||||
public R<?> getOperatingRoomPage(OperatingRoomDto operatingRoomDto, Integer pageNo, Integer pageSize,
|
||||
HttpServletRequest request) {
|
||||
// 构建查询条件
|
||||
QueryWrapper<OperatingRoom> queryWrapper = HisQueryUtils.buildQueryWrapper(operatingRoomDto,
|
||||
operatingRoomDto.getName(),
|
||||
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), request);
|
||||
|
||||
// 设置排序
|
||||
queryWrapper.orderByDesc("display_order").orderByDesc("create_time");
|
||||
|
||||
// 查询手术室分页列表
|
||||
Page<OperatingRoomDto> operatingRoomPage =
|
||||
HisPageUtils.selectPage(operatingRoomMapper, queryWrapper, pageNo, pageSize, OperatingRoomDto.class);
|
||||
|
||||
// 处理枚举字段显示文本
|
||||
operatingRoomPage.getRecords().forEach(e -> {
|
||||
// 状态
|
||||
e.setStatusEnum_dictText(e.getStatusEnum() != null && e.getStatusEnum() == 1 ? "启用" : "停用");
|
||||
// 拼音码
|
||||
e.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(e.getName()));
|
||||
// 五笔码
|
||||
e.setWbStr(ChineseConvertUtils.toWBFirstLetter(e.getName()));
|
||||
});
|
||||
|
||||
return R.ok(operatingRoomPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID查询手术室详情
|
||||
*
|
||||
* @param id 手术室ID
|
||||
* @return 手术室详情
|
||||
*/
|
||||
@Override
|
||||
public R<?> getOperatingRoomById(Long id) {
|
||||
OperatingRoom operatingRoom = operatingRoomService.getById(id);
|
||||
if (operatingRoom == null) {
|
||||
return R.fail("手术室信息不存在");
|
||||
}
|
||||
|
||||
OperatingRoomDto operatingRoomDto = new OperatingRoomDto();
|
||||
BeanUtils.copyProperties(operatingRoom, operatingRoomDto);
|
||||
|
||||
// 状态描述
|
||||
operatingRoomDto.setStatusEnum_dictText(
|
||||
operatingRoom.getStatusEnum() != null && operatingRoom.getStatusEnum() == 1 ? "启用" : "停用");
|
||||
|
||||
// 如果有机构ID,查询机构名称
|
||||
if (operatingRoom.getOrganizationId() != null) {
|
||||
String orgName = commonService.getOrgNameById(operatingRoom.getOrganizationId());
|
||||
operatingRoomDto.setOrganizationName(orgName);
|
||||
}
|
||||
|
||||
return R.ok(operatingRoomDto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增手术室
|
||||
*
|
||||
* @param operatingRoomDto 手术室信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> addOperatingRoom(OperatingRoomDto operatingRoomDto) {
|
||||
// 校验名称不能为空
|
||||
if (StringUtils.isEmpty(operatingRoomDto.getName())) {
|
||||
return R.fail("手术室名称不能为空");
|
||||
}
|
||||
|
||||
// 去除空格
|
||||
String name = operatingRoomDto.getName().replaceAll("[ ]", "");
|
||||
operatingRoomDto.setName(name);
|
||||
|
||||
// 判断是否存在同名
|
||||
if (isExistName(name, null)) {
|
||||
return R.fail("【" + name + "】已存在");
|
||||
}
|
||||
|
||||
OperatingRoom operatingRoom = new OperatingRoom();
|
||||
BeanUtils.copyProperties(operatingRoomDto, operatingRoom);
|
||||
|
||||
// 生成编码
|
||||
String code = assignSeqUtil.getSeq(AssignSeqEnum.OPERATING_ROOM_BUS_NO.getPrefix(), 3);
|
||||
operatingRoom.setBusNo(code);
|
||||
|
||||
// 拼音码
|
||||
operatingRoom.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(operatingRoomDto.getName()));
|
||||
// 五笔码
|
||||
operatingRoom.setWbStr(ChineseConvertUtils.toWBFirstLetter(operatingRoomDto.getName()));
|
||||
|
||||
boolean result = operatingRoomService.save(operatingRoom);
|
||||
if (result) {
|
||||
return R.ok(null, "新增成功");
|
||||
}
|
||||
return R.fail("新增失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改手术室
|
||||
*
|
||||
* @param operatingRoomDto 手术室信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> updateOperatingRoom(OperatingRoomDto operatingRoomDto) {
|
||||
// 校验手术室是否存在
|
||||
OperatingRoom existOperatingRoom = operatingRoomService.getById(operatingRoomDto.getId());
|
||||
if (existOperatingRoom == null) {
|
||||
return R.fail("手术室信息不存在");
|
||||
}
|
||||
|
||||
// 校验名称不能为空
|
||||
if (StringUtils.isEmpty(operatingRoomDto.getName())) {
|
||||
return R.fail("手术室名称不能为空");
|
||||
}
|
||||
|
||||
// 去除空格
|
||||
String name = operatingRoomDto.getName().replaceAll("[ ]", "");
|
||||
operatingRoomDto.setName(name);
|
||||
|
||||
// 判断是否存在同名(排除自己)
|
||||
if (isExistName(name, operatingRoomDto.getId())) {
|
||||
return R.fail("【" + name + "】已存在");
|
||||
}
|
||||
|
||||
OperatingRoom operatingRoom = new OperatingRoom();
|
||||
BeanUtils.copyProperties(operatingRoomDto, operatingRoom);
|
||||
|
||||
// 拼音码
|
||||
operatingRoom.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(operatingRoomDto.getName()));
|
||||
// 五笔码
|
||||
operatingRoom.setWbStr(ChineseConvertUtils.toWBFirstLetter(operatingRoomDto.getName()));
|
||||
|
||||
boolean result = operatingRoomService.updateById(operatingRoom);
|
||||
if (result) {
|
||||
return R.ok(null, "修改成功");
|
||||
}
|
||||
return R.fail("修改失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除手术室
|
||||
*
|
||||
* @param ids 手术室ID(支持批量)
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> deleteOperatingRoom(String ids) {
|
||||
// 解析ID字符串
|
||||
String[] idArray = ids.split(",");
|
||||
List<Long> idList = new ArrayList<>();
|
||||
for (String idStr : idArray) {
|
||||
try {
|
||||
idList.add(Long.parseLong(idStr.trim()));
|
||||
} catch (NumberFormatException e) {
|
||||
return R.fail("ID格式错误");
|
||||
}
|
||||
}
|
||||
|
||||
// 删除手术室
|
||||
boolean result = operatingRoomService.removeByIds(idList);
|
||||
if (result) {
|
||||
return R.ok(null, "删除成功");
|
||||
}
|
||||
return R.fail("删除失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用手术室
|
||||
*
|
||||
* @param ids 手术室ID数组
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> enableOperatingRoom(List<Long> ids) {
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return R.fail("请选择要启用的手术室");
|
||||
}
|
||||
|
||||
// 批量更新状态为启用
|
||||
List<OperatingRoom> operatingRooms = operatingRoomService.listByIds(ids);
|
||||
for (OperatingRoom operatingRoom : operatingRooms) {
|
||||
operatingRoom.setStatusEnum(LocationStatus.ACTIVE.getValue());
|
||||
}
|
||||
|
||||
boolean result = operatingRoomService.updateBatchById(operatingRooms);
|
||||
if (result) {
|
||||
return R.ok("启用成功");
|
||||
}
|
||||
return R.fail("启用失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 停用手术室
|
||||
*
|
||||
* @param ids 手术室ID数组
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> disableOperatingRoom(List<Long> ids) {
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return R.fail("请选择要停用的手术室");
|
||||
}
|
||||
|
||||
// 批量更新状态为停用
|
||||
List<OperatingRoom> operatingRooms = operatingRoomService.listByIds(ids);
|
||||
for (OperatingRoom operatingRoom : operatingRooms) {
|
||||
operatingRoom.setStatusEnum(LocationStatus.INACTIVE.getValue());
|
||||
}
|
||||
|
||||
boolean result = operatingRoomService.updateBatchById(operatingRooms);
|
||||
if (result) {
|
||||
return R.ok("停用成功");
|
||||
}
|
||||
return R.fail("停用失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断名称是否已存在
|
||||
*
|
||||
* @param name 名称
|
||||
* @param excludeId 排除的ID
|
||||
* @return 是否存在
|
||||
*/
|
||||
private boolean isExistName(String name, Long excludeId) {
|
||||
LambdaQueryWrapper<OperatingRoom> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(OperatingRoom::getName, name);
|
||||
if (excludeId != null) {
|
||||
queryWrapper.ne(OperatingRoom::getId, excludeId);
|
||||
}
|
||||
return operatingRoomService.count(queryWrapper) > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
package com.openhis.web.basedatamanage.controller;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.basedatamanage.appservice.IOperatingRoomAppService;
|
||||
import com.openhis.web.basedatamanage.dto.OperatingRoomDto;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 手术室管理Controller
|
||||
*
|
||||
* @author system
|
||||
* @date 2026-01-04
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/base-data-manage/operating-room")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class OperatingRoomController {
|
||||
|
||||
@Resource
|
||||
private IOperatingRoomAppService operatingRoomAppService;
|
||||
|
||||
/**
|
||||
* 分页查询手术室列表
|
||||
*
|
||||
* @param operatingRoomDto 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求
|
||||
* @return 手术室列表
|
||||
*/
|
||||
@GetMapping(value = "/list")
|
||||
public R<?> getOperatingRoomPage(OperatingRoomDto operatingRoomDto,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
HttpServletRequest request) {
|
||||
return operatingRoomAppService.getOperatingRoomPage(operatingRoomDto, pageNo, pageSize, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取手术室详情
|
||||
*
|
||||
* @param id 手术室ID
|
||||
* @return 手术室详情
|
||||
*/
|
||||
@GetMapping("/{id}")
|
||||
public R<?> getOperatingRoomById(@PathVariable Long id) {
|
||||
return operatingRoomAppService.getOperatingRoomById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增手术室
|
||||
*
|
||||
* @param operatingRoomDto 手术室信息
|
||||
* @return 操作结果
|
||||
*/
|
||||
@PostMapping
|
||||
public R<?> addOperatingRoom(@Validated @RequestBody OperatingRoomDto operatingRoomDto) {
|
||||
return operatingRoomAppService.addOperatingRoom(operatingRoomDto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改手术室
|
||||
*
|
||||
* @param operatingRoomDto 手术室信息
|
||||
* @return 操作结果
|
||||
*/
|
||||
@PutMapping
|
||||
public R<?> updateOperatingRoom(@Validated @RequestBody OperatingRoomDto operatingRoomDto) {
|
||||
return operatingRoomAppService.updateOperatingRoom(operatingRoomDto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除手术室
|
||||
*
|
||||
* @param ids 手术室ID(支持批量)
|
||||
* @return 操作结果
|
||||
*/
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<?> deleteOperatingRoom(@PathVariable String ids) {
|
||||
return operatingRoomAppService.deleteOperatingRoom(ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用手术室
|
||||
*
|
||||
* @param ids 手术室ID数组
|
||||
* @return 操作结果
|
||||
*/
|
||||
@PutMapping("/enable")
|
||||
public R<?> enableOperatingRoom(@RequestBody List<Long> ids) {
|
||||
return operatingRoomAppService.enableOperatingRoom(ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 停用手术室
|
||||
*
|
||||
* @param ids 手术室ID数组
|
||||
* @return 操作结果
|
||||
*/
|
||||
@PutMapping("/disable")
|
||||
public R<?> disableOperatingRoom(@RequestBody List<Long> ids) {
|
||||
return operatingRoomAppService.disableOperatingRoom(ids);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.openhis.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 手术室DTO
|
||||
*
|
||||
* @author system
|
||||
* @date 2026-01-04
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class OperatingRoomDto implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
private String busNo;
|
||||
|
||||
/**
|
||||
* 手术室名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 所属机构ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
|
||||
/**
|
||||
* 机构名称
|
||||
*/
|
||||
private String organizationName;
|
||||
|
||||
/**
|
||||
* 位置描述
|
||||
*/
|
||||
private String locationDescription;
|
||||
|
||||
/**
|
||||
* 设备配置
|
||||
*/
|
||||
private String equipmentConfig;
|
||||
|
||||
/**
|
||||
* 容纳人数
|
||||
*/
|
||||
private Integer capacity;
|
||||
|
||||
/**
|
||||
* 状态编码
|
||||
*/
|
||||
private Integer statusEnum;
|
||||
|
||||
/**
|
||||
* 状态描述
|
||||
*/
|
||||
private String statusEnum_dictText;
|
||||
|
||||
/**
|
||||
* 显示顺序
|
||||
*/
|
||||
private Integer displayOrder;
|
||||
|
||||
/**
|
||||
* 拼音码
|
||||
*/
|
||||
private String pyStr;
|
||||
|
||||
/**
|
||||
* 五笔码
|
||||
*/
|
||||
private String wbStr;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
Reference in New Issue
Block a user