版本更新

This commit is contained in:
Zhang.WH
2025-09-03 15:54:41 +08:00
parent 0b93d16b64
commit 8f82322d10
3290 changed files with 154339 additions and 23829 deletions

View File

@@ -0,0 +1,40 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.document.dto.DocDefinitionDto;
import com.openhis.web.document.dto.DocDefinitonParam;
/**
* 文书定义 应用Service
*/
public interface IDocDefinitionAppService {
/**
* 新增文书定义
*
* @param definitionDto
* @return
*/
R<?> addDefinition(DocDefinitionDto definitionDto);
/**
* 修改文书定义
*
* @param definitionDto
* @return
*/
R<?> updateDefinition(DocDefinitionDto definitionDto);
/**
* 获取文书定义列表 树形结构
*
* @param param 条件参数
* @return
*/
R<?> getTreeList(DocDefinitonParam param);
R<?> getDefinitionDetailById(Long id);
DocDefinitionDto getDefinitionById(Long id);
}

View File

@@ -0,0 +1,41 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.document.dto.DocDefinitionOrganizationDto;
import java.util.List;
/**
* 文书定义 应用Service
*/
public interface IDocDefinitionOrganizationAppService {
/**
* 新增文书分配科室列表
*
* @param organizationDto
* @return
*/
R<?> add(DocDefinitionOrganizationDto organizationDto);
/**
* 删除文书分配科室列表
*
* @param definitionId
* @param busNo
* @return
*/
R<?> delete(Long definitionId, String busNo);
/**
* 查询文书定义科室列表
*
* @param definitionId
* @param busNo
* @return
*/
R<?> getOrganizationIdlist(Long definitionId, String busNo);
R<?> updateOrganization(DocDefinitionOrganizationDto organizationDto);
}

View File

@@ -0,0 +1,53 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.document.dto.DocRecordDto;
import com.openhis.web.document.dto.DocRecordPatientQueryParam;
import com.openhis.web.document.dto.DocRecordQueryParam;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
/**
* 文书记录 应用Service
*/
public interface IDocRecordAppService {
// /**
// * 新增记录
// *
// * @param docRecordDto 文书记录信息
// * @return
// */
// R<?> createOrEditRecord(DocRecordDto docRecordDto);
R<?> addRecord(DocRecordDto docRecordDto);
R<?> updateRecord(DocRecordDto docRecordDto);
/**
* 根据患者ID或就诊ID获取文书记录列表,只针对不需返回患者具体信息的列表,体温单除外,单独处理
*/
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam, Integer IsPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
R<?> getRecordPageList(DocRecordPatientQueryParam docRecordPatientQueryParam, List<Integer> primaryMenuEnumList, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
/**
* 根据文书记录ID获取文书记录信息
*
* @param recordId 文书记录ID
* @return
*/
R<?> getRecordById(Long recordId);
R<?> setIsEdit(Long recordId);
/**
* 删除文书分配信息
*
* @param ids 删除文书分配信息ID列表
* @return
*/
R<?> deleteRecord(List<Long> ids);
}

View File

@@ -0,0 +1,23 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.R;
import com.openhis.document.domain.DocStatistics;
import com.openhis.web.document.dto.DocStatisticsDto;
import java.util.List;
/**
* 文档模板 业务接口
*/
public interface IDocStatisticsAppService {
public R<?> createOrUpdte(List<DocStatisticsDto> docStatisticsList);
public R<?> delete(List<Long> ids);
public R<?> queryByRecordId(Long recordId);
public R<?> queryByEncounterId(Long encounterId);
}

View File

@@ -0,0 +1,74 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.document.dto.DocStatisticsDefinitionDto;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 文档模板 业务接口
*/
public interface IDocStatisticsDefinitionAppService {
/**
* 创建或更新文档模板
*
* @param docStatisticsDefinitionDto
*/
public R<?> createOrEdit(DocStatisticsDefinitionDto docStatisticsDefinitionDto);
public R<?> add(DocStatisticsDefinitionDto docStatisticsDefinitionDto);
public R<?> update(DocStatisticsDefinitionDto docStatisticsDefinitionDto);
/**
* 分页查询列表-不包含options 分页
*
* @return
*/
public R<?> getPageList(Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
/**
* 获取文档统计定义列表(不分页)
*
* @param isStatistics 是否统计
* @return 文档统计定义列表
*/
public List<DocStatisticsDefinitionDto> getList(Integer isStatistics);
/**
* 获取文档统计定义选项列表并按指定格式返回
*
* @return 封装了处理结果的响应对象
*/
public R<?> getOptionList();
/**
* 删除文档模板
*
* @param id
*/
public R<?> deleteDocStatisticsDefinition(Long id);
/**
* 根据id获取文档统计定义
*
* @param id
* @return 封装了处理结果的响应对象
*/
public R<?> getDocStatisticsDefinitionById(Long id);
/**
* 根据code获取文档统计定义
*
* @param code
* @return 封装了处理结果的响应对象
*/
public R<?> getDocStatisticsDefinitionByCode(String code);
}

View File

@@ -0,0 +1,36 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.AjaxResult;
import com.core.common.core.domain.R;
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionDto;
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionList;
import java.util.List;
/**
* 文档模板 业务接口
*/
public interface IDocStatisticsDefinitionOptionAppService {
/**
* 新增、修改文档模板 统计项选项
*
* @param docStatisticsDefinitionOptionList
*/
public R<?> add(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList);
public R<?> createOrEdit(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList);
public R<?> deleteDocStatisticsDefinitionOptionById(Long id);
public DocStatisticsDefinitionOptionList getDocStatisticsDefinitionOptionByDefinitionId(Long docStatisticsDefinitionId);
/**
* 获取文档模板 统计项选项列表
*/
public AjaxResult getDocStatisticsDefinitionOptionList();
}

View File

@@ -0,0 +1,25 @@
package com.openhis.web.document.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.document.dto.DocTemplateDto;
import javax.servlet.http.HttpServletRequest;
/**
* 文书模板-一 业务接口
*/
public interface IDocTemplateAppService {
public R<?> add(DocTemplateDto docTemplateDto);
public R<?> delete(Long id);
public R<?> update(DocTemplateDto docTemplateDto);
public R<?> getById(Long id);
public R<?> getListByDefinitionId(Long definitionId);
public R<?> getPageList(Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
}

View File

@@ -0,0 +1,292 @@
package com.openhis.web.document.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.domain.R;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.common.enums.AssignSeqEnum;
import com.openhis.common.enums.DocUseRangeEnum;
import com.openhis.document.domain.DocDefinition;
import com.openhis.document.domain.DocDefinitionOrganization;
import com.openhis.document.service.IDocDefinitionOrganizationService;
import com.openhis.document.service.IDocDefinitionService;
import com.openhis.web.document.appservice.IDocDefinitionAppService;
import com.openhis.web.document.appservice.IDocDefinitionOrganizationAppService;
import com.openhis.web.document.dto.DirectoryNode;
import com.openhis.web.document.dto.DocDefinitionOrganizationDto;
import com.openhis.web.document.dto.DocDefinitionDto;
import com.openhis.web.document.dto.DocDefinitonParam;
import com.openhis.web.document.mapper.DocDefinitionAppMapper;
import com.openhis.web.document.util.DocumentDirectoryProcessor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
@Resource
private IDocDefinitionService docDefinitionService;
@Resource
private IDocDefinitionOrganizationAppService docDefinitionOrganizationAppService;
@Resource
private IDocDefinitionOrganizationService docDefinitionOrganizationService;
@Resource
private DocDefinitionAppMapper docDefinitionAppMapper;
@Autowired(required = false)
private AssignSeqUtil assignSeqUtil;
/**
* 新增文书定义(含科室分配逻辑)
*/
@Override
public R<?> addDefinition(DocDefinitionDto definitionDto) {
// 1. 基础参数校验(按必填优先级排序)
if (definitionDto.getName() == null || definitionDto.getName().trim().isEmpty()) {
return R.fail("新增文书定义失败:文书名称不能为空(或不能为空白字符)");
}
if (definitionDto.getVersion() == null || definitionDto.getVersion().trim().isEmpty()) {
return R.fail("新增文书定义失败:文书版本号不能为空(或不能为空白字符)");
}
if (definitionDto.getVueRouter() == null || definitionDto.getVueRouter().trim().isEmpty()) {
return R.fail("新增文书定义失败:文书路由不能为空(或不能为空白字符)");
}
// 2. 校验"名称+版本号"唯一性(避免重复创建)
long duplicateCount = docDefinitionService.lambdaQuery()
.eq(DocDefinition::getName, definitionDto.getName().trim())
.eq(DocDefinition::getVersion, definitionDto.getVersion().trim())
.count();
if (duplicateCount > 0) {
log.warn("新增文书定义失败:名称={}、版本号={}的文书已存在",
definitionDto.getName(), definitionDto.getVersion());
return R.fail("新增文书定义失败:相同名称和版本号的文书已存在,请修改后重试");
}
// 3. 补充默认值避免null字段插入数据库
if (definitionDto.getDisplayOrder() == null) {
definitionDto.setDisplayOrder(0);
}
if (definitionDto.getIsValid() == null) {
definitionDto.setIsValid(0); // 0-默认无效需根据业务确认是否改为1
}
// 4. 封装文书定义实体(生成业务编号)
DocDefinition docDefinition = new DocDefinition();
// 校验AssignSeqUtil是否注入避免空指针
if (assignSeqUtil == null) {
log.error("新增文书定义失败AssignSeqUtil工具类未注入无法生成业务编号");
return R.fail("新增文书定义失败:系统工具类异常,无法生成业务编号");
}
String busNo = assignSeqUtil.getSeq(AssignSeqEnum.PURCHASE_DOCUMENT.getPrefix(), 10);
docDefinition.setBusNo(busNo);
docDefinition.setName(definitionDto.getName().trim());
docDefinition.setVersion(definitionDto.getVersion().trim());
docDefinition.setDisplayOrder(definitionDto.getDisplayOrder());
docDefinition.setHospitalId(SecurityUtils.getLoginUser().getHospitalId());
docDefinition.setIsValid(definitionDto.getIsValid());
docDefinition.setVueRouter(definitionDto.getVueRouter().trim());
docDefinition.setPrimaryMenuEnum(definitionDto.getPrimaryMenuEnum());
docDefinition.setSubMenu(definitionDto.getSubMenu());
docDefinition.setUseRangeEnum(definitionDto.getUseRangeEnum());
docDefinition.setDoctorPermissionEnum(definitionDto.getDoctorPermissionEnum());
docDefinition.setNursingPermissionEnum(definitionDto.getNursingPermissionEnum());
docDefinition.setMedicalPermissionEnum(definitionDto.getMedicalPermissionEnum());
docDefinition.setPharmacistPermissionEnum(definitionDto.getPharmacistPermissionEnum());
// 5. 保存文书定义
boolean saveSuccess = docDefinitionService.save(docDefinition);
if (!saveSuccess) {
log.error("新增文书定义失败:数据库保存异常(名称={}, 版本号={}, 业务编号={}",
definitionDto.getName(), definitionDto.getVersion(), busNo);
return R.fail("新增文书定义失败:数据库保存操作异常");
}
// 6. 科室分配(仅当使用范围为"科室级"时执行)
if (DocUseRangeEnum.DEPT_USE.getValue().equals(definitionDto.getUseRangeEnum())
&& definitionDto.getOrganizationIds() != null
&& !definitionDto.getOrganizationIds().isEmpty()) {
DocDefinitionOrganizationDto orgDto = new DocDefinitionOrganizationDto();
orgDto.setBusNo(busNo);
orgDto.setDefinitionId(docDefinition.getId());
orgDto.setOrganizationIds(definitionDto.getOrganizationIds());
// 复用科室分配服务的新增逻辑,直接返回结果
return docDefinitionOrganizationAppService.add(orgDto);
}
return R.ok("新增文书定义成功");
}
/**
* 修改文书定义(版本号冲突时自动新增,含科室分配更新)
*/
@Override
public R<?> updateDefinition(DocDefinitionDto definitionDto) {
// 1. 基础参数校验(修改必传字段)
if (definitionDto.getId() == null) {
return R.fail("修改文书定义失败文书ID不能为空");
}
if (definitionDto.getName() == null || definitionDto.getName().trim().isEmpty()) {
return R.fail("修改文书定义失败:文书名称不能为空(或不能为空白字符)");
}
if (definitionDto.getVersion() == null || definitionDto.getVersion().trim().isEmpty()) {
return R.fail("修改文书定义失败:文书版本号不能为空(或不能为空白字符)");
}
if (definitionDto.getVueRouter() == null || definitionDto.getVueRouter().trim().isEmpty()) {
return R.fail("修改文书定义失败:文书路由不能为空(或不能为空白字符)");
}
if (definitionDto.getBusNo() == null || definitionDto.getBusNo().trim().isEmpty()) {
return R.fail("修改文书定义失败:文书业务编号不能为空(或不能为空白字符)");
}
// 2. 校验文书是否存在
DocDefinition existingDoc = docDefinitionService.getById(definitionDto.getId());
if (existingDoc == null) {
log.warn("修改文书定义失败未找到ID={}的文书记录", definitionDto.getId());
return R.fail("修改文书定义失败:待修改的文书记录不存在");
}
// 3. 版本号冲突处理(版本号不一致时,转为新增逻辑)
if (!existingDoc.getVersion().trim().equals(definitionDto.getVersion().trim())) {
log.info("修改文书定义:版本号冲突(原版本={}, 新版本={}),自动执行新增逻辑",
existingDoc.getVersion(), definitionDto.getVersion());
// 新增前清空ID避免覆盖原有记录
definitionDto.setId(null);
return addDefinition(definitionDto);
}
// 4. 补充默认值
if (definitionDto.getDisplayOrder() == null) {
definitionDto.setDisplayOrder(0);
}
if (definitionDto.getIsValid() == null) {
definitionDto.setIsValid(0);
}
// 5. 封装修改后的数据
existingDoc.setBusNo(definitionDto.getBusNo().trim());
existingDoc.setName(definitionDto.getName().trim());
existingDoc.setVersion(definitionDto.getVersion().trim());
existingDoc.setDisplayOrder(definitionDto.getDisplayOrder());
existingDoc.setHospitalId(SecurityUtils.getLoginUser().getHospitalId());
existingDoc.setIsValid(definitionDto.getIsValid());
existingDoc.setVueRouter(definitionDto.getVueRouter().trim());
existingDoc.setPrimaryMenuEnum(definitionDto.getPrimaryMenuEnum());
existingDoc.setSubMenu(definitionDto.getSubMenu());
existingDoc.setUseRangeEnum(definitionDto.getUseRangeEnum());
existingDoc.setDoctorPermissionEnum(definitionDto.getDoctorPermissionEnum());
existingDoc.setNursingPermissionEnum(definitionDto.getNursingPermissionEnum());
existingDoc.setMedicalPermissionEnum(definitionDto.getMedicalPermissionEnum());
existingDoc.setPharmacistPermissionEnum(definitionDto.getPharmacistPermissionEnum());
// 6. 执行修改
boolean updateSuccess = docDefinitionService.updateById(existingDoc);
if (!updateSuccess) {
log.error("修改文书定义失败数据库更新异常ID={}, 业务编号={}",
definitionDto.getId(), definitionDto.getBusNo());
return R.fail("修改文书定义失败:数据库更新操作异常");
}
// 7. 更新科室分配(仅当使用范围为"科室级"时执行)
DocDefinitionOrganizationDto orgDto = new DocDefinitionOrganizationDto();
orgDto.setBusNo(existingDoc.getBusNo());
orgDto.setDefinitionId(existingDoc.getId());
orgDto.setOrganizationIds(definitionDto.getOrganizationIds());
// 复用科室分配服务的更新逻辑(先删后加,全量覆盖)
return docDefinitionOrganizationAppService.updateOrganization(orgDto);
}
/**
* 获取文书定义树形列表(按目录结构组织)
*/
@Override
public R<?> getTreeList(DocDefinitonParam param) {
// 1. 获取当前登录用户的医院ID避免跨医院查询
Long hospitalId = SecurityUtils.getLoginUser().getHospitalId();
if (hospitalId == null) {
log.warn("获取文书定义树形列表失败当前登录用户未关联医院ID");
return R.fail("获取文书定义树形列表失败:当前用户未关联医院,请重新登录");
}
// 2. 数据库查询文书定义列表
List<DocDefinitionDto> docList = docDefinitionAppMapper.getDefinationList(
param.getUseRanges(),
param.getOrganizationId(),
hospitalId,
param.getName(),
param.getPrimaryMenuEnum()
);
// 3. 构建树形结构(空列表时返回空树,避免空指针)
List<DirectoryNode> treeNodes = new ArrayList<>();
if (docList != null && !docList.isEmpty()) {
treeNodes = DocumentDirectoryProcessor.buildDocumentDirectory(docList);
log.info("获取文书定义树形列表成功医院ID={}, 文书数量={}, 树形节点数量={}",
hospitalId, docList.size(), treeNodes.size());
} else {
log.info("获取文书定义树形列表成功医院ID={}, 暂无匹配的文书定义", hospitalId);
}
return R.ok(treeNodes, "获取文书定义树形列表成功");
}
/**
* 根据ID获取文书定义详情含已分配科室ID列表
*/
@Override
public R<?> getDefinitionDetailById(Long id) {
// 1. 参数校验
if (id == null) {
return R.fail("获取文书定义详情失败文书ID不能为空");
}
// 2. 调用私有方法获取详情含科室ID
DocDefinitionDto docDto = getDefinitionById(id);
if (docDto == null) {
log.warn("获取文书定义详情失败未找到ID={}的文书记录", id);
return R.fail("获取文书定义详情失败:未查询到对应的文书定义信息");
}
log.info("获取文书定义详情成功ID={}, 名称={}, 业务编号={}",
id, docDto.getName(), docDto.getBusNo());
return R.ok(docDto, "获取文书定义详情成功");
}
/**
* 私有方法根据ID查询文书定义含已分配科室ID列表
*/
public DocDefinitionDto getDefinitionById(Long id) {
// 1. 查询文书定义主信息
DocDefinition doc = docDefinitionService.getById(id);
if (doc == null) {
log.debug("根据ID查询文书定义失败ID={}的文书不存在", id);
return null;
}
// 2. 查询该文书已分配的科室ID列表
LambdaQueryWrapper<DocDefinitionOrganization> orgWrapper = new LambdaQueryWrapper<>();
orgWrapper.eq(DocDefinitionOrganization::getDefinitionId, id)
.eq(DocDefinitionOrganization::getBusNo, doc.getBusNo());
List<DocDefinitionOrganization> orgList = docDefinitionOrganizationService.list(orgWrapper);
// 3. 提取科室ID并封装DTO
List<Long> orgIdList = new ArrayList<>();
for (DocDefinitionOrganization org : orgList) {
orgIdList.add(org.getOrganizationId());
}
DocDefinitionDto docDto = new DocDefinitionDto();
BeanUtils.copyProperties(doc, docDto);
docDto.setOrganizationIds(orgIdList);
return docDto;
}
}

View File

@@ -0,0 +1,173 @@
package com.openhis.web.document.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.domain.R;
import com.openhis.document.domain.DocDefinitionOrganization;
import com.openhis.document.service.IDocDefinitionOrganizationService;
import com.openhis.web.document.appservice.IDocDefinitionOrganizationAppService;
import com.openhis.web.document.dto.DocDefinitionOrganizationDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOrganizationAppService {
@Resource
private IDocDefinitionOrganizationService docDefinitionOrganizationService;
/**
* 新增文书分配科室列表
* 注:新增前未删除原有分配,若需"覆盖新增"请使用updateOrganization方法
*/
@Override
public R<?> add(DocDefinitionOrganizationDto definitionOrganizationDto) {
// 1. 参数校验(明确错误原因,避免模糊提示)
if (definitionOrganizationDto == null) {
return R.fail("文书科室分配失败:请求参数不能为空");
}
if (definitionOrganizationDto.getOrganizationIds() == null || definitionOrganizationDto.getOrganizationIds().isEmpty()) {
return R.fail("文书科室分配失败科室ID列表不能为空");
}
if (definitionOrganizationDto.getDefinitionId() == null || definitionOrganizationDto.getDefinitionId() == 0) {
return R.fail("文书科室分配失败文书定义ID不能为空或不能为0");
}
if (definitionOrganizationDto.getBusNo() == null || definitionOrganizationDto.getBusNo().trim().isEmpty()) {
return R.fail("文书科室分配失败:业务编号不能为空(或不能为空白字符)");
}
// 2. DTO转实体批量封装科室分配关系
List<DocDefinitionOrganization> organizationList = new ArrayList<>();
for (Long orgId : definitionOrganizationDto.getOrganizationIds()) {
DocDefinitionOrganization docOrg = new DocDefinitionOrganization();
docOrg.setDefinitionId(definitionOrganizationDto.getDefinitionId());
docOrg.setBusNo(definitionOrganizationDto.getBusNo().trim()); // 去除业务编号前后空白
docOrg.setOrganizationId(orgId);
organizationList.add(docOrg);
}
// 3. 批量新增
boolean saveSuccess = docDefinitionOrganizationService.saveBatch(organizationList);
if (saveSuccess) {
return R.ok("文书科室分配成功");
} else {
log.error("文书科室分配新增失败文书定义ID={}, 业务编号={}",
definitionOrganizationDto.getDefinitionId(), definitionOrganizationDto.getBusNo());
return R.fail("文书科室分配失败:数据库新增操作异常");
}
}
/**
* 根据文书定义ID和业务编号删除对应的科室分配关系
*/
@Override
public R<?> delete(Long definitionId, String busNo) {
// 1. 参数校验
if (definitionId == null || definitionId == 0) {
return R.fail("文书科室分配删除失败文书定义ID不能为空或不能为0");
}
if (busNo == null || busNo.trim().isEmpty()) {
return R.fail("文书科室分配删除失败:业务编号不能为空(或不能为空白字符)");
}
// 2. 构建查询条件(精准匹配文书+业务编号)
LambdaQueryWrapper<DocDefinitionOrganization> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocDefinitionOrganization::getDefinitionId, definitionId)
.eq(DocDefinitionOrganization::getBusNo, busNo.trim()); // 去除业务编号前后空白
// 3. 执行删除
boolean deleteSuccess = docDefinitionOrganizationService.remove(queryWrapper);
if (deleteSuccess) {
return R.ok("文书科室分配删除成功");
} else {
log.warn("文书科室分配删除失败未找到匹配的分配关系文书定义ID={}, 业务编号={}",
definitionId, busNo);
return R.fail("文书科室分配删除失败:未找到对应的科室分配记录");
}
}
/**
* 根据文书定义ID和业务编号查询已分配的科室ID列表
*/
@Override
public R<?> getOrganizationIdlist(Long definitionId, String busNo) {
// 1. 参数校验
if (definitionId == null || definitionId == 0) {
return R.fail("文书科室分配查询失败文书定义ID不能为空或不能为0");
}
if (busNo == null || busNo.trim().isEmpty()) {
return R.fail("文书科室分配查询失败:业务编号不能为空(或不能为空白字符)");
}
// 2. 构建查询条件
LambdaQueryWrapper<DocDefinitionOrganization> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocDefinitionOrganization::getDefinitionId, definitionId)
.eq(DocDefinitionOrganization::getBusNo, busNo.trim());
// 3. 查询并提取科室ID避免返回冗余字段
List<DocDefinitionOrganization> orgList = docDefinitionOrganizationService.list(queryWrapper);
List<Long> orgIdList = new ArrayList<>();
for (DocDefinitionOrganization docOrg : orgList) {
orgIdList.add(docOrg.getOrganizationId());
}
log.info("文书科室分配查询成功文书定义ID={}, 业务编号={}, 分配科室数量={}",
definitionId, busNo, orgIdList.size());
return R.ok(orgIdList, "文书科室分配查询成功");
}
/**
* 更新文书科室分配(先删除原有分配,再新增新分配,实现"全量覆盖"
*/
@Override
public R<?> updateOrganization(DocDefinitionOrganizationDto definitionOrganizationDto) {
// 1. 参数校验与add方法保持一致的校验逻辑
if (definitionOrganizationDto == null) {
return R.fail("文书科室分配更新失败:请求参数不能为空");
}
if (definitionOrganizationDto.getOrganizationIds() == null || definitionOrganizationDto.getOrganizationIds().isEmpty()) {
return R.fail("文书科室分配更新失败科室ID列表不能为空");
}
if (definitionOrganizationDto.getDefinitionId() == null || definitionOrganizationDto.getDefinitionId() == 0) {
return R.fail("文书科室分配更新失败文书定义ID不能为空或不能为0");
}
if (definitionOrganizationDto.getBusNo() == null || definitionOrganizationDto.getBusNo().trim().isEmpty()) {
return R.fail("文书科室分配更新失败:业务编号不能为空(或不能为空白字符)");
}
// 2. 先删除原有分配关系
LambdaQueryWrapper<DocDefinitionOrganization> deleteWrapper = new LambdaQueryWrapper<>();
deleteWrapper.eq(DocDefinitionOrganization::getDefinitionId, definitionOrganizationDto.getDefinitionId())
.eq(DocDefinitionOrganization::getBusNo, definitionOrganizationDto.getBusNo().trim());
boolean deleteSuccess = docDefinitionOrganizationService.remove(deleteWrapper);
if (!deleteSuccess) {
log.error("文书科室分配更新失败删除原有分配记录异常文书定义ID={}, 业务编号={}",
definitionOrganizationDto.getDefinitionId(), definitionOrganizationDto.getBusNo());
return R.fail("文书科室分配更新失败:删除原有分配记录异常");
}
// 3. 再新增新的分配关系
List<DocDefinitionOrganization> newOrgList = new ArrayList<>();
for (Long orgId : definitionOrganizationDto.getOrganizationIds()) {
DocDefinitionOrganization docOrg = new DocDefinitionOrganization();
docOrg.setDefinitionId(definitionOrganizationDto.getDefinitionId());
docOrg.setBusNo(definitionOrganizationDto.getBusNo().trim());
docOrg.setOrganizationId(orgId);
newOrgList.add(docOrg);
}
boolean saveSuccess = docDefinitionOrganizationService.saveBatch(newOrgList);
if (saveSuccess) {
return R.ok("文书科室分配更新成功");
} else {
log.error("文书科室分配更新失败新增新分配记录异常文书定义ID={}, 业务编号={}",
definitionOrganizationDto.getDefinitionId(), definitionOrganizationDto.getBusNo());
return R.fail("文书科室分配更新失败:新增新分配记录异常");
}
}
}

View File

@@ -0,0 +1,456 @@
package com.openhis.web.document.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.AgeCalculatorUtil;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.common.enums.AdministrativeGender;
import com.openhis.common.enums.DocStatusEnum;
import com.openhis.common.enums.DocTypeEnum;
import com.openhis.common.enums.EncounterClass;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.document.domain.DocRecord;
import com.openhis.document.mapper.DocRecordMapper;
import com.openhis.document.service.IDocRecordService;
import com.openhis.web.document.appservice.IDocDefinitionAppService;
import com.openhis.web.document.appservice.IDocRecordAppService;
import com.openhis.web.document.dto.DocDefinitionDto;
import com.openhis.web.document.dto.DocRecordDto;
import com.openhis.web.document.dto.DocRecordPatientDto;
import com.openhis.web.document.dto.DocRecordPatientQueryParam;
import com.openhis.web.document.dto.DocRecordQueryParam;
import com.openhis.web.document.mapper.DocRecordAppMapper;
import com.openhis.web.document.util.PermissionProcessor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.*;
@Slf4j
@Service
public class DocRecordAppServiceImpl implements IDocRecordAppService {
@Resource
private IDocRecordService docRecordService;
@Resource
private DocRecordMapper docRecordMapper;
@Resource
private IDocDefinitionAppService docDefinitionAppService;
@Resource
private DocRecordAppMapper docRecordAppMapper;
@Autowired
private JdbcTemplate jdbcTemplate; // 使用 JdbcTemplate 执行 SQL
/**
* 插入单条文档操作日志
*
* @param docRecord 原始文书记录
* @return 是否插入成功
*/
private Boolean insertLog(DocRecord docRecord) {
if (docRecord == null) {
log.error("插入文档日志失败:原始文书记录不能为空");
return false;
}
try {
String sql = "INSERT INTO doc_record_log(" +
"record_id, definition_id, definition_bus_no, content_json, " +
"status_enum, organization_id, encounter_id, patient_id, record_time, " +
"create_by, create_time, update_by, update_time, delete_flag, tenant_id" +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
Object[] params = {
docRecord.getId(),
docRecord.getDefinitionId(),
docRecord.getDefinitionBusNo(),
docRecord.getContentJson(),
docRecord.getStatusEnum(),
docRecord.getOrganizationId(),
docRecord.getEncounterId(),
docRecord.getPatientId(),
new Timestamp(docRecord.getRecordTime().getTime()),
SecurityUtils.getUsername(),
new Timestamp(new Date().getTime()),
null, // update_by
null, // update_time
0, // delete_flag未删除
docRecord.getTenantId()
};
int rowsAffected = jdbcTemplate.update(sql, params);
return rowsAffected > 0;
} catch (Exception e) {
log.error("插入文档操作日志失败: {}", e.getMessage(), e);
return false;
}
}
/**
* 批量插入文档操作日志
*
* @param docRecords 原始文书记录列表
* @return 是否插入成功
*/
private Boolean insertBatchLog(List<DocRecord> docRecords) {
if (docRecords == null || docRecords.isEmpty()) {
log.error("批量插入文档日志失败:文书记录列表不能为空");
return false;
}
try {
String sql = "INSERT INTO doc_record_log(" +
"record_id, definition_id, definition_bus_no, content_json, " +
"status_enum, organization_id, encounter_id, patient_id, record_time, " +
"create_by, create_time, update_by, update_time, delete_flag, tenant_id" +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
int[] results = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
DocRecord docRecord = docRecords.get(i);
ps.setLong(1, docRecord.getId());
ps.setLong(2, docRecord.getDefinitionId());
ps.setString(3, docRecord.getDefinitionBusNo());
ps.setString(4, docRecord.getContentJson());
ps.setInt(5, docRecord.getStatusEnum());
ps.setLong(6, docRecord.getOrganizationId());
ps.setLong(7, docRecord.getEncounterId());
ps.setLong(8, docRecord.getPatientId());
ps.setTimestamp(9, new Timestamp(docRecord.getRecordTime().getTime()));
ps.setString(10, SecurityUtils.getUsername());
ps.setTimestamp(11, new Timestamp(new Date().getTime()));
ps.setObject(12, null); // update_by
ps.setObject(13, null); // update_time
ps.setInt(14, 0); // delete_flag
ps.setLong(15, docRecord.getTenantId());
}
@Override
public int getBatchSize() {
return docRecords.size();
}
});
// 校验所有日志是否插入成功
for (int result : results) {
if (result <= 0) {
log.error("批量插入文档日志失败:部分记录插入无效");
return false;
}
}
return true;
} catch (Exception e) {
log.error("批量插入文档操作日志失败: {}", e.getMessage(), e);
return false;
}
}
/**
* 初始化文书记录参数校验
*
* @param docRecordDto 文书记录DTO
* @return 校验失败信息(空字符串表示校验通过)
*/
private String initRecordCheck(DocRecordDto docRecordDto) {
if (docRecordDto == null) {
return "文书记录不能为空";
}
if (docRecordDto.getDefinitionId() == null) {
return "文书记录文书类型ID不能为空";
}
if (docRecordDto.getDefinitionBusNo() == null) {
return "文书记录:文书编号不能为空";
}
if (docRecordDto.getContentJson() == null) {
return "文书记录:记录内容不能为空";
}
if (docRecordDto.getEncounterId() == null) {
return "文书记录就诊ID不能为空";
}
if (docRecordDto.getPatientId() == null) {
return "文书记录患者ID不能为空";
}
// 2. 校验文书定义是否存在
DocDefinitionDto docDefinitionDto = docDefinitionAppService.getDefinitionById(docRecordDto.getDefinitionId());
if (docDefinitionDto == null) {
return "患者文书记录:对应文书不存在";
}
// 3. 权限校验
boolean hasPermission = PermissionProcessor.hasPermission(docDefinitionDto);
if (!hasPermission) {
return "患者文书记录:当前登录用户无权限新增/编辑该文书";
}
return "";
}
/**
* 新增记录
*
* @param docRecordDto 文书记录信息
* @return 返回结果 R对象
*/
public R<?> addRecord(DocRecordDto docRecordDto) {
String checkMsg = initRecordCheck(docRecordDto);
if (!checkMsg.isEmpty()) {
return R.fail(checkMsg);
}
DocRecord docRecord = new DocRecord();
docRecord.setDefinitionId(docRecordDto.getDefinitionId());
docRecord.setDefinitionBusNo(docRecordDto.getDefinitionBusNo());
docRecord.setContentJson(docRecordDto.getContentJson());
// 状态默认设为草稿(修复原逻辑:原代码先判断再覆盖,导致默认值无效)
docRecord.setStatusEnum(docRecordDto.getStatusEnum() == null ? DocStatusEnum.DRAFT.getValue() : docRecordDto.getStatusEnum());
docRecord.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
docRecord.setEncounterId(docRecordDto.getEncounterId());
docRecord.setPatientId(docRecordDto.getPatientId());
docRecord.setRecordTime(docRecordDto.getRecordTime());
docRecord.setIsEdit(0);
boolean saveSuccess = docRecordService.save(docRecord);
if (saveSuccess) {
return R.ok("新增患者文书记录成功");
} else {
return R.fail("新增患者文书记录失败");
}
}
/**
* 修改记录(含日志留痕)
*
* @param docRecordDto 新文书记录DTO
* @return 返回结果 R对象
*/
public R<?> updateRecord(DocRecordDto docRecordDto) {
String checkMsg = initRecordCheck(docRecordDto);
if (!checkMsg.isEmpty()) {
return R.fail(checkMsg);
}
// 1. 查询原文书记录
DocRecord docRecord = docRecordService.getById(docRecordDto.getId());
if (docRecord == null) {
return R.fail("修改患者文书记录失败:记录不存在");
}
// 2. 记录日志
// 深拷贝原数据用于日志
DocRecord logDocRecord = new DocRecord();
BeanUtils.copyProperties(docRecord, logDocRecord);
// 赋值新数据
docRecord.setDefinitionId(docRecordDto.getDefinitionId());
docRecord.setDefinitionBusNo(docRecordDto.getDefinitionBusNo());
docRecord.setContentJson(docRecordDto.getContentJson());
docRecord.setStatusEnum(docRecordDto.getStatusEnum());
docRecord.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
docRecord.setEncounterId(docRecordDto.getEncounterId());
docRecord.setPatientId(docRecordDto.getPatientId());
docRecord.setRecordTime(docRecordDto.getRecordTime());
docRecord.setIsEdit(0);
// 执行修改
boolean updateSuccess = docRecordService.updateById(docRecord);
if (updateSuccess) {
// 插入操作日志
boolean logSuccess = insertLog(logDocRecord);
if (!logSuccess) {
return R.fail("修改患者文书记录成功,但插入文档操作日志失败");
}
return R.ok("修改患者文书记录成功");
} else {
return R.fail("修改患者文书记录失败");
}
}
/**
* 根据患者ID/就诊ID获取文书记录列表支持分页
*/
@Override
public R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam, Integer isPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
// 1. 参数校验
if (docRecordQueryParam == null) {
return R.fail("患者文书记录:查询参数不能为空");
}
if (docRecordQueryParam.getPatientId() == null && docRecordQueryParam.getEncounterId() == null) {
return R.fail("患者文书记录患者ID和就诊ID不能同时为空");
}
if (docRecordQueryParam.getDefinitionId() == null) {
return R.fail("患者文书记录文书类型ID不能为空");
}
// 2. 分页查询逻辑
if (isPage != null && isPage == 1) {
QueryWrapper<DocRecord> queryWrapper = HisQueryUtils.buildQueryWrapper(
docRecordQueryParam, null, null, request);
// 按记录时间倒序(最新记录在前)
queryWrapper.lambda().orderByDesc(DocRecord::getRecordTime);
Page<DocRecordDto> recordPage = HisPageUtils.selectPage(
docRecordMapper, queryWrapper, pageNo, pageSize, DocRecordDto.class);
return R.ok(recordPage, "获取患者文书记录列表成功");
}
// 3. 不分页查询逻辑
else {
LambdaQueryWrapper<DocRecord> queryWrapper = new LambdaQueryWrapper<>();
// 患者ID查询条件
if (docRecordQueryParam.getPatientId() != null) {
queryWrapper.eq(DocRecord::getPatientId, docRecordQueryParam.getPatientId());
}
// 文书类型ID必传
queryWrapper.eq(DocRecord::getDefinitionId, docRecordQueryParam.getDefinitionId());
// 就诊ID查询条件修复原逻辑原代码字段匹配错误用EncounterId匹配DefinitionBusNo
if (docRecordQueryParam.getEncounterId() != null) {
queryWrapper.eq(DocRecord::getEncounterId, docRecordQueryParam.getEncounterId());
}
// 科室ID查询条件修复原逻辑原代码字段匹配错误用OrganizationId匹配EncounterId
if (docRecordQueryParam.getOrganizationId() != null) {
queryWrapper.eq(DocRecord::getOrganizationId, docRecordQueryParam.getOrganizationId());
}
// 实体转DTO
List<DocRecordDto> dtoList = new ArrayList<>();
List<DocRecord> recordList = docRecordService.list(queryWrapper);
for (DocRecord record : recordList) {
DocRecordDto dto = new DocRecordDto();
BeanUtils.copyProperties(record, dto);
dtoList.add(dto);
}
return R.ok(dtoList, "获取患者文书记录列表成功");
}
}
/**
* 查询患者文书记录列表(携带患者信息,支持分页)
*/
@Override
public R<?> getRecordPageList(DocRecordPatientQueryParam docRecordPatientQueryParam, List<Integer> primaryMenuEnumList, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
if (docRecordPatientQueryParam == null) {
return R.fail("文书记录:查询参数不能为空");
}
// 构建查询条件(支持患者姓名搜索)
QueryWrapper<DocRecordPatientDto> queryWrapper = HisQueryUtils.buildQueryWrapper(
docRecordPatientQueryParam, searchKey, new HashSet<>(Arrays.asList("patient_name", "bus_no")), request);
// 分页查询
IPage<DocRecordPatientDto> pageResult = docRecordAppMapper.getRecordPageList(
new Page<>(pageNo, pageSize), primaryMenuEnumList, queryWrapper);
// 处理返回结果:枚举值转中文描述、计算患者年龄
if (pageResult != null && !pageResult.getRecords().isEmpty()) {
for (DocRecordPatientDto dto : pageResult.getRecords()) {
// 就诊类型枚举转描述修复原逻辑原代码用EncounterClass匹配所有枚举
EncounterClass encounterClass = EncounterClass.getByValue(dto.getClassEnum());
dto.setClassEnumValue(encounterClass != null ? encounterClass.getInfo() : "");
// 性别枚举转描述
AdministrativeGender gender = AdministrativeGender.getByValue(dto.getGender());
dto.setGenderValue(gender != null ? gender.getInfo() : "");
// 文书类型枚举转描述
DocTypeEnum docType = DocTypeEnum.getByValue(dto.getPrimaryMenuEnum());
dto.setPrimaryMenuEnumValue(docType != null ? docType.getInfo() : "");
// 计算患者年龄
dto.setAge(AgeCalculatorUtil.getAge(dto.getBirthDate()));
}
}
return R.ok(pageResult, "获取患者文书记录列表成功");
}
/**
* 根据记录ID获取文书详情
*/
@Override
public R<?> getRecordById(Long recordId) {
if (recordId == null) {
return R.fail("患者文书记录文书记录ID不能为空");
}
DocRecord record = docRecordService.getById(recordId);
if (record == null) {
return R.fail("患者文书记录:对应记录不存在");
}
DocRecordDto dto = new DocRecordDto();
BeanUtils.copyProperties(record, dto);
return R.ok(dto, "获取患者文书记录成功");
}
@Override
public R<?> setIsEdit(Long recordId) {
if (recordId == null) {
return R.fail("患者文书记录文书记录ID不能为空");
}
DocRecord record = docRecordService.getById(recordId);
if (record == null) {
return R.fail("患者文书记录:对应记录不存在");
}
if (record.getIsEdit() != null && record.getIsEdit() == 1) {
return R.ok("患者文书记录:记录已处于编辑中状态,请勿重复 editing");
}
record.setIsEdit(1);
boolean updateSuccess = docRecordService.updateById(record);
if (updateSuccess) {
return R.ok("设置患者文书记录为编辑中成功");
} else {
return R.fail("设置患者文书记录为编辑中失败");
}
}
/**
* 批量删除文书记录(含日志留痕)
*/
@Override
public R<?> deleteRecord(List<Long> ids) {
// 1. 参数校验
if (ids == null || ids.isEmpty()) {
return R.fail("患者文书记录删除的记录ID列表不能为空");
}
// 2. 校验记录是否存在
List<DocRecord> recordList = docRecordService.listByIds(ids);
if (recordList == null || recordList.isEmpty()) {
return R.fail("患者文书记录:待删除的记录不存在");
}
// 3. 权限校验:仅允许删除自己创建的记录
String currentUsername = SecurityUtils.getLoginUser().getUsername();
List<DocRecord> logRecordList = new ArrayList<>();
for (DocRecord record : recordList) {
if (!currentUsername.equals(record.getCreateBy())) {
return R.fail("患者文书记录无权限删除他人创建的记录记录ID" + record.getId() + "");
}
// 拷贝原记录用于日志
DocRecord logRecord = new DocRecord();
BeanUtils.copyProperties(record, logRecord);
logRecordList.add(logRecord);
}
// 4. 执行删除
boolean deleteSuccess = docRecordService.removeByIds(ids);
if (deleteSuccess) {
// 5. 批量插入删除日志
boolean logSuccess = insertBatchLog(logRecordList);
if (!logSuccess) {
return R.fail("删除患者文书记录成功,但插入文档操作日志失败");
}
return R.ok("删除患者文书记录成功");
} else {
return R.fail("删除患者文书记录失败");
}
}
}

View File

@@ -0,0 +1,71 @@
package com.openhis.web.document.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.domain.R;
import com.openhis.document.domain.DocStatistics;
import com.openhis.document.service.IDocStatisticsService;
import com.openhis.web.document.appservice.IDocStatisticsAppService;
import com.openhis.web.document.appservice.IDocTemplateAppService;
import com.openhis.web.document.dto.DocStatisticsDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 文档模板 业务实现类
*/
@Slf4j
@Service
public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
@Resource
private IDocStatisticsService docStatisticsService;
@Override
public R<?> createOrUpdte(List<DocStatisticsDto> docStatisticsList) {
if (docStatisticsList.size() == 0) {
return R.ok();
}
//根据recordId和statisticDefinitionId判断是否存在存在则更新不存在则新增
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocStatistics::getRecordId, docStatisticsList.get(0).getRecordId());
queryWrapper.eq(DocStatistics::getStatisticDefinitionId, docStatisticsList.get(0).getStatisticDefinitionId());
List<DocStatistics> docStatisticsOldList = docStatisticsService.list(queryWrapper);
if (docStatisticsOldList.size() > 0) {
//批量删除
docStatisticsService.removeByIds(docStatisticsOldList.stream().map(DocStatistics::getId).toList());
}
//批量新增
for (DocStatisticsDto docStatisticsDto : docStatisticsList) {
DocStatistics docStatistics = new DocStatistics();
docStatistics.setRecordId(docStatisticsDto.getRecordId());
docStatistics.setStatisticDefinitionId(docStatisticsDto.getStatisticDefinitionId());
docStatistics.setEncounterId(docStatisticsDto.getEncounterId());
docStatistics.setPatientId(docStatisticsDto.getPatientId());
docStatistics.setStatisticDefinitionCode(docStatisticsDto.getStatisticDefinitionCode());
docStatistics.setOrgnizationId(docStatisticsDto.getOrgnizationId()); //TODO: 待确定
docStatistics.setValue(docStatisticsDto.getValue());
docStatistics.setRecordingDate(docStatisticsDto.getRecordingDate());
docStatistics.setRecordingTime(docStatisticsDto.getRecordingTime());
docStatistics.setSource(docStatisticsDto.getSource());
}
return null;
}
@Override
public R<?> delete(List<Long> ids) {
return null;
}
@Override
public R<?> queryByRecordId(Long recordId) {
return null;
}
@Override
public R<?> queryByEncounterId(Long encounterId) {
return null;
}
}

View File

@@ -0,0 +1,337 @@
package com.openhis.web.document.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.bean.BeanUtils;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.document.domain.DocStatisticsDefinition;
import com.openhis.document.mapper.DocStatisticsDefinitionMapper;
import com.openhis.document.service.IDocStatisticsDefinitionService;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionAppService;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionOptionAppService;
import com.openhis.web.document.dto.DocDefinitionOrganizationDto;
import com.openhis.web.document.dto.DocStatisticsDefinitionDto;
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionList;
import com.openhis.web.document.dto.OptionDto;
import com.openhis.web.document.mapper.DocStatisticsDefinitionAppMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;
/**
* 文档模板 业务实现类
*/
@Slf4j
@Service
public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefinitionAppService {
@Resource
private IDocStatisticsDefinitionService iDocStatisticsDefinitionService;
@Resource
private IDocStatisticsDefinitionOptionAppService iDocStaticsDefinitionOptionAppService;
@Resource
private DocStatisticsDefinitionMapper docStatisticsDefinitionMapper;
@Resource
private DocStatisticsDefinitionAppMapper docStatisticsDefinitionAppMapper;
@Override
public R<?> createOrEdit(DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
if (docStatisticsDefinitionDto == null) {
return R.fail("新增/编辑文档统计定义,参数不能为空");
}
if (docStatisticsDefinitionDto.getName() == null || docStatisticsDefinitionDto.getName().trim().length() == 0) {
return R.fail("新增/编辑文档统计定义,名称不能为空");
}
if (docStatisticsDefinitionDto.getTypeEnum() == null) {
return R.fail("新增/编辑文档统计定义,类型不能为空");
}
if (docStatisticsDefinitionDto.getCode() == null) {
return R.fail("新增/编辑文档统计定义,代码不能为空");
}
DocStatisticsDefinition docStatisticsDefinition = new DocStatisticsDefinition();
BeanUtils.copyProperties(docStatisticsDefinitionDto, docStatisticsDefinition);
// 新增时校验代码唯一性
if (!docStatisticsDefinitionDto.getCode().isEmpty() && docStatisticsDefinitionDto.getId() == null) {
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocStatisticsDefinition::getCode, docStatisticsDefinitionDto.getCode());
docStatisticsDefinition = iDocStatisticsDefinitionService.getOne(queryWrapper);
if (docStatisticsDefinition != null) {
return R.fail("文档统计定义代码已存在,请更换代码");
}
}
// 区分新增/编辑逻辑
return docStatisticsDefinitionDto.getId() == null ? add(docStatisticsDefinitionDto) : update(docStatisticsDefinitionDto);
}
@Override
public R<?> add(DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
String checkResult = initCheck(docStatisticsDefinitionDto);
DocStatisticsDefinition docStatisticsDefinition = new DocStatisticsDefinition();
if (checkResult != null) {
return R.fail(checkResult);
}
if (!docStatisticsDefinitionDto.getCode().isEmpty()) {
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocStatisticsDefinition::getCode, docStatisticsDefinitionDto.getCode());
Long count = iDocStatisticsDefinitionService.count(queryWrapper);
if (count > 0) {
return R.fail("文档统计定义代码已存在,请更换代码");
}
}
// 赋值新增字段
docStatisticsDefinition.setName(docStatisticsDefinitionDto.getName());
docStatisticsDefinition.setCode(docStatisticsDefinitionDto.getCode());
docStatisticsDefinition.setTypeEnum(docStatisticsDefinitionDto.getTypeEnum());
docStatisticsDefinition.setRequired(docStatisticsDefinitionDto.getRequired());
docStatisticsDefinition.setRemark(docStatisticsDefinitionDto.getRemark());
docStatisticsDefinition.setIsStatistics(docStatisticsDefinitionDto.getIsStatistics());
docStatisticsDefinition.setDisplayOrder(docStatisticsDefinitionDto.getDisplayOrder());
docStatisticsDefinition.setUnit(docStatisticsDefinitionDto.getUnit());
boolean saveResult = iDocStatisticsDefinitionService.save(docStatisticsDefinition);
if (saveResult) {
// 同步保存选项列表(如有)
if (docStatisticsDefinitionDto.getOptionList() != null && !docStatisticsDefinitionDto.getOptionList().getOptions().isEmpty()) {
docStatisticsDefinitionDto.getOptionList().setDocStatisticsDefinitionId(docStatisticsDefinition.getId());
return iDocStaticsDefinitionOptionAppService.add(docStatisticsDefinitionDto.getOptionList());
}
return R.ok("文档统计定义新增成功");
} else {
return R.fail("文档统计定义新增失败");
}
}
@Override
public R<?> update(DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
String checkResult = initCheck(docStatisticsDefinitionDto);
if (checkResult != null) {
return R.fail(checkResult);
}
// 校验待更新数据是否存在
DocStatisticsDefinition existingData = iDocStatisticsDefinitionService.getById(docStatisticsDefinitionDto.getId());
if (existingData == null) {
return R.fail("更新文档统计定义失败,目标数据不存在");
}
// 赋值更新字段
existingData.setName(docStatisticsDefinitionDto.getName());
existingData.setCode(docStatisticsDefinitionDto.getCode());
existingData.setTypeEnum(docStatisticsDefinitionDto.getTypeEnum());
existingData.setRequired(docStatisticsDefinitionDto.getRequired());
existingData.setRemark(docStatisticsDefinitionDto.getRemark());
existingData.setIsStatistics(docStatisticsDefinitionDto.getIsStatistics());
existingData.setDisplayOrder(docStatisticsDefinitionDto.getDisplayOrder());
existingData.setUnit(docStatisticsDefinitionDto.getUnit());
boolean updateResult = iDocStatisticsDefinitionService.updateById(existingData);
if (updateResult) {
// 同步更新选项列表
return iDocStaticsDefinitionOptionAppService.createOrEdit(docStatisticsDefinitionDto.getOptionList());
} else {
return R.fail("文档统计定义更新失败");
}
}
private String initCheck(DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
if (docStatisticsDefinitionDto == null) {
return "新增/编辑文档统计定义,参数不能为空";
}
if (docStatisticsDefinitionDto.getName() == null || docStatisticsDefinitionDto.getName().trim().length() == 0) {
return "新增/编辑文档统计定义,名称不能为空";
}
if (docStatisticsDefinitionDto.getTypeEnum() == null) {
return "新增/编辑文档统计定义,类型不能为空";
}
if (docStatisticsDefinitionDto.getCode() == null) {
return "新增/编辑文档统计定义,代码不能为空";
}
return null;
}
/**
* 分页查询列表-不包含options分页
*
* @param pageNo 页码
* @param pageSize 每页条数
* @param searchKey 搜索关键词
* @param request 请求对象
* @return 分页结果
*/
@Override
public R<?> getPageList(Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
// 构建查询条件(支持多字段搜索)
QueryWrapper<DocStatisticsDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(
null, searchKey, new HashSet<>(Arrays.asList("name", "code")), request);
// 按记录时间倒序(最新记录在前)
queryWrapper.lambda().orderByDesc(DocStatisticsDefinition::getDisplayOrder);
Page<DocStatisticsDefinitionDto> recordPage = HisPageUtils.selectPage(
docStatisticsDefinitionMapper, queryWrapper, pageNo, pageSize, DocStatisticsDefinitionDto.class);
// 转换为分页结果
return R.ok(recordPage, "文档统计定义列表获取成功");
}
/**
* 获取文档统计定义列表(不分页)
*
* @param isStatistics 是否统计
* @return 文档统计定义列表
*/
@Override
public List<DocStatisticsDefinitionDto> getList(Integer isStatistics) {
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
if (isStatistics != null) {
queryWrapper.eq(DocStatisticsDefinition::getIsStatistics, isStatistics);
}
List<DocStatisticsDefinition> dataList = iDocStatisticsDefinitionService.list(queryWrapper);
List<DocStatisticsDefinitionDto> resultList = new ArrayList<>();
for (DocStatisticsDefinition data : dataList) {
DocStatisticsDefinitionDto dto = new DocStatisticsDefinitionDto();
BeanUtils.copyProperties(data, dto);
resultList.add(dto);
}
return resultList;
}
/**
* 获取文档统计定义选项列表并按指定格式返回
*
* @return 封装了处理结果的响应对象
*/
@Override
public R<?> getOptionList() {
// 1. 从数据库查询所有选项数据
List<OptionDto> optionDtoList = docStatisticsDefinitionAppMapper.getOptionList(null, null, null);
// 2. 处理空数据场景
if (optionDtoList == null || optionDtoList.isEmpty()) {
return R.ok(new ArrayList<>(), "文档统计定义选项列表获取成功,查询结果为空");
}
// 3. 按code字段分组
Map<String, List<OptionDto>> groupCodeMap = optionDtoList.stream()
.collect(Collectors.groupingBy(OptionDto::getCode));
// 4. 准备最终返回的结果列表
List<Map<String, Object>> resultList = new ArrayList<>();
// 5. 遍历每个code分组
for (Map.Entry<String, List<OptionDto>> entry : groupCodeMap.entrySet()) {
String code = entry.getKey();
List<OptionDto> optionDtos = entry.getValue();
Map<String, Object> resultMap = new HashMap<>();
// 设置名称和code
if (!optionDtos.isEmpty()) {
resultMap.put("name", optionDtos.get(0).getName());
}
resultMap.put("code", code);
// 动态生成列表键名
String listKey = code + "List";
// 检查分组中是否存在任何optionId为null的元素
boolean hasNullOptionId = optionDtos.stream()
.anyMatch(dto -> dto.getOptionId() == null);
// 如果存在null的optionId返回空集合否则正常处理
List<Map<String, Object>> optionList;
if (hasNullOptionId) {
optionList = new ArrayList<>(); // 返回空集合
} else {
// 正常转换有效元素
optionList = optionDtos.stream()
.map(dto -> {
Map<String, Object> optionMap = new HashMap<>();
optionMap.put("id", dto.getOptionId().toString());
optionMap.put("option", dto.getOption());
return optionMap;
})
.collect(Collectors.toList());
}
// 添加列表到结果中(即使是空集合)
resultMap.put(listKey, optionList);
resultList.add(resultMap);
}
return R.ok(resultList, "文档统计定义选项列表获取成功");
}
@Override
public R<?> deleteDocStatisticsDefinition(Long id) {
if (id == null) {
return R.fail("删除文档统计定义参数ID不能为空");
}
boolean deleteResult = iDocStatisticsDefinitionService.removeById(id);
if (deleteResult) {
// 同步删除选项列表
iDocStaticsDefinitionOptionAppService.deleteDocStatisticsDefinitionOptionById(id);
return R.ok("文档统计定义删除成功");
} else {
return R.fail("文档统计定义删除失败");
}
}
/**
* 获取文档统计定义详情
*
* @param id 文档统计定义ID
* @return 封装了处理结果的响应对象
*/
@Override
public R<?> getDocStatisticsDefinitionById(Long id) {
if (id == null) {
return R.fail("获取文档统计定义参数ID不能为空");
}
DocStatisticsDefinition data = iDocStatisticsDefinitionService.getById(id);
if (data == null) {
return R.fail("获取文档统计定义失败,目标数据不存在");
}
// 转换为DTO返回
DocStatisticsDefinitionDto dto = new DocStatisticsDefinitionDto();
BeanUtils.copyProperties(data, dto);
DocStatisticsDefinitionOptionList optionList = iDocStaticsDefinitionOptionAppService.getDocStatisticsDefinitionOptionByDefinitionId(id);
dto.setOptionList(optionList);
return R.ok(dto, "文档统计定义获取成功");
}
/**
* 根据代码获取文档统计定义详情
*
* @param code 文档统计定义代码
* @return 封装了处理结果的响应对象
*/
@Override
public R<?> getDocStatisticsDefinitionByCode(String code) {
if (code == null || code.trim().isEmpty()) {
return R.fail("获取文档统计定义,参数代码不能为空");
}
// 按代码查询
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocStatisticsDefinition::getCode, code);
DocStatisticsDefinition data = iDocStatisticsDefinitionService.getOne(queryWrapper);
if (data == null) {
return R.fail("获取文档统计定义失败,目标数据不存在");
}
DocStatisticsDefinitionDto dto = new DocStatisticsDefinitionDto();
if (data != null) {
BeanUtils.copyProperties(data, dto);
}
DocStatisticsDefinitionOptionList optionList = iDocStaticsDefinitionOptionAppService.getDocStatisticsDefinitionOptionByDefinitionId(data.getId());
dto.setOptionList(optionList);
return R.ok(dto, "文档统计定义获取成功");
}
}

View File

@@ -0,0 +1,229 @@
package com.openhis.web.document.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.domain.AjaxResult;
import com.core.common.core.domain.R;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.document.domain.DocStatisticsDefinitionOption;
import com.openhis.document.mapper.DocStatisticsDefinitionOptionMapper;
import com.openhis.document.service.IDocStatisticsDefinitionOptionService;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionOptionAppService;
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionDto;
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionList;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 文档统计定义选项 业务实现类
*/
@Slf4j
@Service
public class DocStatisticsDefinitionOptionAppServiceImpl implements IDocStatisticsDefinitionOptionAppService {
@Resource
private DocStatisticsDefinitionOptionMapper docStatisticsDefinitonOptionMapper;
@Resource
private IDocStatisticsDefinitionOptionService docStatisticsDefinitionOptionService;
/**
* 新增文档统计定义选项
*
* @param docStatisticsDefinitionOptionList 选项列表DTO
*/
@Override
public R<?> add(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList) {
// 参数校验
if (docStatisticsDefinitionOptionList == null) {
return R.fail("统计项选项列表为空,请选择统计项选项");
}
if (docStatisticsDefinitionOptionList.getOptions() == null || docStatisticsDefinitionOptionList.getOptions().isEmpty()) {
return R.fail("统计项选项不允许为空,请正确填写统计项选项");
}
if (docStatisticsDefinitionOptionList.getDocStatisticsDefinitionId() == null) {
return R.fail("统计项定义ID为空请选择统计项定义ID");
}
// DTO转实体
List<DocStatisticsDefinitionOption> optionList = new ArrayList<>();
for (DocStatisticsDefinitionOptionDto dto : docStatisticsDefinitionOptionList.getOptions()) {
DocStatisticsDefinitionOption option = new DocStatisticsDefinitionOption();
option.setDocStatisticsDefinitionId(docStatisticsDefinitionOptionList.getDocStatisticsDefinitionId());
option.setOption(dto.getOption());
option.setDisplayOrder(dto.getDisplayOrder());
optionList.add(option);
}
// 批量新增
boolean saveSuccess = docStatisticsDefinitionOptionService.saveBatch(optionList);
if (saveSuccess) {
return R.ok(optionList, "统计项选项保存成功");
} else {
return R.fail("统计项选项保存失败");
}
}
/**
* 新增/编辑文档统计定义选项(区分增删改)
*
* @param docStatisticsDefinitionOptionList 选项列表DTO
*/
@Override
public R<?> createOrEdit(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList) {
// 参数校验
if (docStatisticsDefinitionOptionList == null) {
return R.fail("统计项选项列表为空,请选择统计项选项");
}
Long definitionId = docStatisticsDefinitionOptionList.getDocStatisticsDefinitionId();
if (definitionId == null) {
return R.fail("统计项定义ID为空请选择统计项定义ID");
}
// 1. 查询原数据列表按统计定义ID关联
List<DocStatisticsDefinitionOption> oldList = docStatisticsDefinitonOptionMapper.selectList(
new LambdaQueryWrapper<DocStatisticsDefinitionOption>()
.eq(DocStatisticsDefinitionOption::getDocStatisticsDefinitionId, definitionId));
oldList = oldList == null ? Collections.emptyList() : oldList;
// 2. 处理新数据列表DTO转实体避免空指针
List<DocStatisticsDefinitionOption> newList = new ArrayList<>();
if (docStatisticsDefinitionOptionList.getOptions() != null && !docStatisticsDefinitionOptionList.getOptions().isEmpty()) {
for (DocStatisticsDefinitionOptionDto dto : docStatisticsDefinitionOptionList.getOptions()) {
DocStatisticsDefinitionOption option = new DocStatisticsDefinitionOption();
BeanUtils.copyProperties(dto, option); // 改用BeanUtils简化赋值
option.setDocStatisticsDefinitionId(definitionId); // 强制关联父ID确保数据一致性
newList.add(option);
}
}
newList = newList == null ? Collections.emptyList() : newList;
// 3. 构建原数据ID映射快速查找
Map<Long, DocStatisticsDefinitionOption> oldIdMap = oldList.stream()
.filter(Objects::nonNull)
.filter(item -> item.getId() != null)
.collect(Collectors.toMap(DocStatisticsDefinitionOption::getId, item -> item));
// 4. 提取新数据中的有效ID集合
Set<Long> newIds = newList.stream()
.map(DocStatisticsDefinitionOption::getId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 5. 确定需要删除的项(原数据存在但新数据不存在)
List<Long> deleteIds = oldList.stream()
.map(DocStatisticsDefinitionOption::getId)
.filter(id -> !newIds.contains(id))
.collect(Collectors.toList());
// 6. 区分新增和修改的项
List<DocStatisticsDefinitionOption> addList = new ArrayList<>();
List<DocStatisticsDefinitionOption> updateList = new ArrayList<>();
for (DocStatisticsDefinitionOption newItem : newList) {
Long newItemId = newItem.getId();
if (newItemId != null && oldIdMap.containsKey(newItemId)) {
// 有ID且原数据存在 → 修改
updateList.add(newItem);
} else {
// 无ID或原数据不存在 → 新增
addList.add(newItem);
}
}
// 7. 执行删除操作
if (!deleteIds.isEmpty()) {
boolean deleteSuccess = docStatisticsDefinitionOptionService.removeByIds(deleteIds);
if (!deleteSuccess) {
return R.fail("统计项选项删除失败");
}
}
// 8. 执行修改操作
if (!updateList.isEmpty()) {
boolean updateSuccess = docStatisticsDefinitionOptionService.updateBatchById(updateList);
if (!updateSuccess) {
return R.fail("统计项选项更新失败");
}
}
// 9. 执行新增操作
if (!addList.isEmpty()) {
boolean addSuccess = docStatisticsDefinitionOptionService.saveBatch(addList);
if (!addSuccess) {
return R.fail("统计项选项新增失败");
}
}
return R.ok("统计项选项更新成功");
}
/**
* 删除单个统计项选项
*
* @param id 选项ID
*/
@Override
public R<?> deleteDocStatisticsDefinitionOptionById(Long id) {
if (id == null) {
return R.fail("统计项选项ID为空请选择要删除的统计项选项");
}
// 先校验数据是否存在
DocStatisticsDefinitionOption existingOption = docStatisticsDefinitionOptionService.getById(id);
if (existingOption == null) {
return R.fail("统计项选项不存在,删除失败");
}
// 执行删除
boolean deleteSuccess = docStatisticsDefinitionOptionService.removeById(id);
if (deleteSuccess) {
return R.ok("统计项选项删除成功");
} else {
return R.fail("统计项选项删除失败");
}
}
/**
* 根据统计定义ID查询选项列表
*
* @param docStatisticsDefinitionId 统计定义ID
*/
@Override
public DocStatisticsDefinitionOptionList getDocStatisticsDefinitionOptionByDefinitionId(Long docStatisticsDefinitionId) {
// 修复原查询条件错误原逻辑用ID查ID改为用统计定义ID查关联选项
LambdaQueryWrapper<DocStatisticsDefinitionOption> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocStatisticsDefinitionOption::getDocStatisticsDefinitionId, docStatisticsDefinitionId)
.orderByAsc(DocStatisticsDefinitionOption::getDisplayOrder); // 按显示顺序排序
List<DocStatisticsDefinitionOption> optionList = docStatisticsDefinitonOptionMapper.selectList(queryWrapper);
if (optionList == null || optionList.isEmpty()) {
return null;
}
// 实体转DTO
List<DocStatisticsDefinitionOptionDto> dtoList = new ArrayList<>();
for (DocStatisticsDefinitionOption option : optionList) {
DocStatisticsDefinitionOptionDto dto = new DocStatisticsDefinitionOptionDto();
dto.setId(option.getId());
dto.setOption(option.getOption());
dto.setDisplayOrder(option.getDisplayOrder());
dtoList.add(dto);
}
// 封装返回结果
DocStatisticsDefinitionOptionList resultList = new DocStatisticsDefinitionOptionList();
resultList.setDocStatisticsDefinitionId(docStatisticsDefinitionId);
resultList.setOptions(dtoList);
return resultList;
}
/**
* 获取文档模板 统计项选项列表
*/
@Override
public AjaxResult getDocStatisticsDefinitionOptionList() {
return null;
}
}

View File

@@ -0,0 +1,189 @@
package com.openhis.web.document.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.SecurityUtils;
import com.openhis.common.enums.DocUseRangeEnum;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.document.domain.DocTemplate;
import com.openhis.document.mapper.DocTemplateMapper;
import com.openhis.document.service.IDocTemplateService;
import com.openhis.web.document.appservice.IDocTemplateAppService;
import com.openhis.web.document.dto.DocTemplateDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
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;
/**
* 文档模板 业务实现类
*/
@Slf4j
@Service
public class DocTemplateAppServiceImpl implements IDocTemplateAppService {
@Resource
private IDocTemplateService docTemplateService;
@Resource
private DocTemplateMapper docTemplateMapper;
@Override
public R<?> add(DocTemplateDto docTemplateDto) {
String msg = initCheck(docTemplateDto);
if (msg != null) {
return R.fail(msg);
}
DocTemplate docTemplate = new DocTemplate();
docTemplate.setName(docTemplateDto.getName());
docTemplate.setDisplayOrder(docTemplateDto.getDisplayOrder());
docTemplate.setContextJson(docTemplateDto.getContextJson());
docTemplate.setDefinitionId(docTemplateDto.getDefinitionId());
if (docTemplateDto.getUseRange() == null) {
docTemplate.setUseRange(DocUseRangeEnum.ALL_HOSPITAL_USE.getValue());
}
if (docTemplateDto.getUseRange() == DocUseRangeEnum.DEPT_USE.getValue()) {
docTemplateDto.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
}
if (docTemplateDto.getUseRange() == DocUseRangeEnum.USE_BY_SELF.getValue()) {
docTemplateDto.setUserId(SecurityUtils.getLoginUser().getUserId());
}
docTemplate.setOrganizationId(docTemplateDto.getOrganizationId());
docTemplate.setId(docTemplateDto.getUserId());
docTemplate.setUseRange(docTemplateDto.getUseRange());
docTemplate.setRemark(docTemplateDto.getRemark());
docTemplateService.save(docTemplate);
return R.ok(" 添加成功");
}
private String initCheck(DocTemplateDto docTemplateDto) {
if (docTemplateDto == null) {
return "参数不能为空";
}
if (docTemplateDto.getName().isEmpty()) {
return "名称不能为空";
}
if (docTemplateDto.getContextJson().isEmpty()) {
return "内容不能为空";
}
if (docTemplateDto.getDefinitionId() == null) {
return "模板定义不能为空";
}
if (docTemplateDto.getUseRange() == null) {
return "使用范围不能为空";
}
if (docTemplateDto.getId() == null) {
//根据名称+定义查询模板是否存在
LambdaQueryWrapper<DocTemplate> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocTemplate::getName, docTemplateDto.getName());
queryWrapper.eq(DocTemplate::getDefinitionId, docTemplateDto.getDefinitionId());
DocTemplate docTemplate = docTemplateService.getOne(queryWrapper);
if (docTemplate != null) {
return "该模板已存在,请勿重复添加";
}
}
return null;
}
@Override
public R<?> delete(Long id) {
if (id == null) {
return R.fail("模板ID不能为空");
}
boolean result = docTemplateService.removeById(id);
if (result) {
return R.ok("删除成功");
}
return R.fail("模板不存在");
}
@Override
public R<?> update(DocTemplateDto docTemplateDto) {
String msg = initCheck(docTemplateDto);
if (msg != null) {
return R.fail(msg);
}
if (docTemplateDto.getId() == null) {
return R.fail("模板ID不能为空");
}
DocTemplate docTemplate = docTemplateService.getById(docTemplateDto.getId());
if (docTemplate == null) {
return R.fail("模板不存在");
}
if (docTemplateDto.getUseRange() == DocUseRangeEnum.ALL_HOSPITAL_USE.getValue() || docTemplateDto.getUseRange() == DocUseRangeEnum.NO_IN_USE.getValue()) {
docTemplateDto.setOrganizationId(null);
docTemplateDto.setUserId(null);
}
if (docTemplateDto.getUseRange() == DocUseRangeEnum.DEPT_USE.getValue()) {
docTemplateDto.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
docTemplateDto.setUserId(null);
}
if (docTemplateDto.getUseRange() == DocUseRangeEnum.USE_BY_SELF.getValue()) {
docTemplate.setUserId(SecurityUtils.getLoginUser().getUserId());
docTemplateDto.setOrganizationId(null);
}
docTemplate.setName(docTemplateDto.getName());
docTemplate.setDisplayOrder(docTemplateDto.getDisplayOrder());
docTemplate.setContextJson(docTemplateDto.getContextJson());
docTemplate.setDefinitionId(docTemplateDto.getDefinitionId());
docTemplate.setUseRange(docTemplateDto.getUseRange());
docTemplate.setOrganizationId(docTemplateDto.getOrganizationId());
docTemplate.setUserId(docTemplateDto.getUserId());
docTemplate.setRemark(docTemplateDto.getRemark());
docTemplateService.save(docTemplate);
return R.ok("更新成功");
}
@Override
public R<?> getById(Long id) {
if (id == null) {
return R.fail("模板ID不能为空");
}
DocTemplateDto templateDto = new DocTemplateDto();
DocTemplate result = docTemplateService.getById(id);
BeanUtils.copyProperties(result, templateDto);
return R.ok(templateDto);
}
@Override
public R<?> getListByDefinitionId(Long definitionId) {
if (definitionId == null) {
return R.fail("模板定义ID不能为空");
}
LambdaQueryWrapper<DocTemplate> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocTemplate::getDefinitionId, definitionId);
queryWrapper.orderByAsc(DocTemplate::getDisplayOrder);
List<DocTemplate> docTemplates = docTemplateService.list(queryWrapper);
List<DocTemplateDto> templateDtos = new ArrayList<>();
for (DocTemplate docTemplate : docTemplates) {
DocTemplateDto templateDto = new DocTemplateDto();
BeanUtils.copyProperties(docTemplate, templateDto);
templateDtos.add(templateDto);
}
return R.ok(templateDtos);
}
@Override
public R<?> getPageList(Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
// 构建查询条件(支持多字段搜索)
QueryWrapper<DocTemplate> queryWrapper = HisQueryUtils.buildQueryWrapper(
null, searchKey, new HashSet<>(Arrays.asList("name")), request);
// 按记录时间倒序(最新记录在前)
queryWrapper.lambda().orderByDesc(DocTemplate::getDisplayOrder);
Page<DocTemplateDto> page = HisPageUtils.selectPage(
docTemplateMapper, queryWrapper, pageNo, pageSize, DocTemplateDto.class);
// 转换为分页结果
return R.ok(page, "获取成功");
}
}

View File

@@ -0,0 +1,97 @@
package com.openhis.web.document.controller;
import com.core.common.core.domain.R;
import com.openhis.common.enums.DocPermissionEnum;
import com.openhis.common.enums.DocTypeEnum;
import com.openhis.common.enums.DocUseRangeEnum;
import com.openhis.web.document.appservice.IDocDefinitionAppService;
import com.openhis.web.document.dto.DocDefinitionDto;
import com.openhis.web.document.dto.DocDefinitonParam;
import com.openhis.web.document.util.EnumUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
* 文书定义 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/definition")
@Slf4j
@AllArgsConstructor
public class DocDefinitionController {
private final IDocDefinitionAppService iDocDefinitionAppService;
/**
* 初始化文书定义
*
* @return
*/
@GetMapping("/init")
public R<?> init() {
Map<String, Object> map = new HashMap<>();
// 获取文档类型枚举列表
map.put("docTypes", EnumUtil.toMapList(DocTypeEnum.class));
// 获取权限枚举列表
map.put("permissions", EnumUtil.toMapList(DocPermissionEnum.class));
//使用范围枚举
map.put("useRanges", EnumUtil.toMapList(DocUseRangeEnum.class));
return R.ok(map);
}
/**
* 新增文书定义
*
* @param definitionDto
* @return
*/
@PostMapping("/add")
public R<?> addDefinition(@RequestBody DocDefinitionDto definitionDto) {
return iDocDefinitionAppService.addDefinition(definitionDto);
}
/**
* 修改文书定义
*
* @param definitionDto
* @return
*/
@PostMapping("/update")
public R<?> updateDefinition(@RequestBody DocDefinitionDto definitionDto) {
return iDocDefinitionAppService.updateDefinition(definitionDto);
}
/**
* 获取文书定义详情
*
* @param id 文书定义ID
* @return 文书定义详情
*/
@GetMapping("/{id}")
public R<?> getDefinitionDetailById(@PathVariable Long id) {
log.info("获取文书定义详情 ID={}", id);
return iDocDefinitionAppService.getDefinitionDetailById(id);
}
/**
* 查询获取文书定义列表 树形结构
*
* @return
*/
@GetMapping("/treeList")
public R<?> getTreeList(DocDefinitonParam docDefinitonParam) {
return iDocDefinitionAppService.getTreeList(docDefinitonParam);
}
}

View File

@@ -0,0 +1,59 @@
package com.openhis.web.document.controller;
import com.core.common.core.domain.R;
import com.openhis.web.document.appservice.IDocDefinitionAppService;
import com.openhis.web.document.appservice.IDocDefinitionOrganizationAppService;
import com.openhis.web.document.dto.DocDefinitionOrganizationDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
/**
* 文书定义 - 科室分配 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/definition/Organization")
@Slf4j
@AllArgsConstructor
public class DocDefinitionOrganizationController {
private final IDocDefinitionOrganizationAppService docDefinitionOrganizationAppService;
/**
* 新增文书分配科室列表
*
* @param organizationDto
* @return
*/
@PostMapping("/add")
public R<?> add(@RequestBody DocDefinitionOrganizationDto organizationDto) {
return docDefinitionOrganizationAppService.add(organizationDto);
}
/**
* 删除文书分配科室列表
*
* @param definitionId
* @param busNo
* @return
*/
@DeleteMapping("/delete")
public R<?> delete(@RequestParam("definitionId") Long definitionId, @RequestParam("busNo") String busNo) {
return docDefinitionOrganizationAppService.delete(definitionId, busNo);
}
/**
* 查询文书定义科室列表
*
* @param definitionId
* @param busNo
* @return
*/
@GetMapping("/getOrganizationIdlist")
public R<?> getOrganizationIdlist(@RequestParam("definitionId") Long definitionId, @RequestParam("busNo") String busNo) {
return docDefinitionOrganizationAppService.getOrganizationIdlist(definitionId, busNo);
}
}

View File

@@ -0,0 +1,140 @@
package com.openhis.web.document.controller;
import com.core.common.core.domain.R;
import com.openhis.common.enums.DocStatusEnum;
import com.openhis.common.enums.DocTypeEnum;
import com.openhis.web.document.appservice.IDocRecordAppService;
import com.openhis.web.document.dto.DocRecordDto;
import com.openhis.web.document.dto.DocRecordPatientQueryParam;
import com.openhis.web.document.dto.DocRecordQueryParam;
import com.openhis.web.document.util.EnumUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 文书记录 controller
*
* @author wanghaiming
*/
@RestController
@RequestMapping("/document/record")
@Slf4j
@AllArgsConstructor
public class DocRecordController {
private final IDocRecordAppService docRecordAppService;
/**
* 初始化文书定义
*/
@GetMapping("/init")
public R<?> init() {
Map<String, Object> map = new HashMap<>();
// 获取文档状态枚举
map.put("doc_status_enums", EnumUtil.toMapList(DocStatusEnum.class));
map.put("doc_type_enums", EnumUtil.toMapList(DocTypeEnum.class));
return R.ok(map);
}
/**
* 新增记录
*
* @param docRecordDto 文书记录信息
* @return R
*/
@PostMapping("/addRecord")
public R<?> addRecord(@RequestBody DocRecordDto docRecordDto) {
return docRecordAppService.addRecord(docRecordDto);
}
/**
* 编辑记录 修改前先设置文书为编辑状态
*
* @param docRecordDto 文书记录信息
* @return R
*/
@PostMapping("/updateRecord")
public R<?> updateRecord(@RequestBody DocRecordDto docRecordDto) {
return docRecordAppService.updateRecord(docRecordDto);
}
/**
* 设置文书为编辑状态
*
* @param recordId 文书记录ID
* @return R
*/
@PostMapping("/setIsEdit")
public R<?> setIsEdit(Long recordId) {
return docRecordAppService.setIsEdit(recordId);
}
/**
* 根据患者ID或就诊ID获取文书记录列表,只针对不需返回患者具体信息的列表,体温单除外,单独处理
* 需返回患者具体信息的列表请使用getPatientRecordList
*
* @param docRecordQueryParam 文书记录查询参数
* @param pageNo 页码
* @param pageSize 页大小
* @param searchKey 搜索关键字
* @param request 请求
* 1.IsPage 是否分页 0:不分页 1:分页
* @return R
*/
@GetMapping("/getRecordByEncounterIdList")
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam,
@RequestParam(value = "IsPage", defaultValue = "1") Integer IsPage,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
return docRecordAppService.getRecordByEncounterIdList(docRecordQueryParam, IsPage, pageNo, pageSize, searchKey, request);
}
/**
* 文书记录列表
*
* @param docRecordPatientQueryParam 文书记录查询参数
* @param pageNo 页码
* @param pageSize 页大小
* @param searchKey 搜索关键字
* @param request 请求
* @return R
*/
@GetMapping("/getRecordPageList")
R<?> getRecordPageList(DocRecordPatientQueryParam docRecordPatientQueryParam,
@RequestParam(value = "primaryMenuEnumList", required = false) List<Integer> primaryMenuEnumList,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "searchKey", required = false) String searchKey,
HttpServletRequest request) {
return docRecordAppService.getRecordPageList(docRecordPatientQueryParam, primaryMenuEnumList, pageNo, pageSize, searchKey, request);
}
/**
* 根据文书记录ID获取文书记录信息
*
* @param recordId 文书记录ID
*/
@GetMapping("/getRecordById")
R<?> getRecordById(@RequestParam(value = "recordId") Long recordId) {
return docRecordAppService.getRecordById(recordId);
}
/**
* 删除文书分配信息
*
* @param ids 删除文书分配信息ID列表
*/
@DeleteMapping("/deleteRecord")
R<?> deleteRecord(@RequestBody List<Long> ids) {
return docRecordAppService.deleteRecord(ids);
}
}

View File

@@ -0,0 +1,24 @@
package com.openhis.web.document.controller;
import com.openhis.web.document.appservice.IDocRecordAppService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 文档模板-病历另存为模板使用 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/template")
@Slf4j
@AllArgsConstructor
public class DocStatisticsController {
private final IDocRecordAppService docRecordAppService;
}

View File

@@ -0,0 +1,129 @@
package com.openhis.web.document.controller;
import com.core.common.core.domain.R;
import com.openhis.common.enums.DocStatisticsDefinitionTypeEnum;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionAppService;
import com.openhis.web.document.dto.DocStatisticsDefinitionDto;
import com.openhis.web.document.util.EnumUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
* 统计定义 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/statistics/definition")
@Slf4j
@AllArgsConstructor
public class DocStatisticsDefinitionController {
private final IDocStatisticsDefinitionAppService docStatisticsDefinitionAppService;
/**
* 初始化页面数据
*
* @return
*/
@GetMapping("/init")
public R<?> init() {
Map<String, Object> map = new HashMap<>();
// 获取文档状态枚举
map.put("doc_statistics_definition_type_enums", EnumUtil.toMapList(DocStatisticsDefinitionTypeEnum.class));
return R.ok(map);
}
// @PostMapping("/createOrEdit")
// public R<?> createOrEdit(@RequestBody DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
// return docStatisticsDefinitionAppService.createOrEdit(docStatisticsDefinitionDto);
// }
/**
* 新增统计定义
*
* @param docStatisticsDefinitionDto
* @return
*/
@PostMapping("/add")
public R<?> add(@RequestBody DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
return docStatisticsDefinitionAppService.add(docStatisticsDefinitionDto);
}
/**
* 修改统计定义
*
* @param docStatisticsDefinitionDto
* @return
*/
@PostMapping("/update")
public R<?> update(@RequestBody DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
return docStatisticsDefinitionAppService.update(docStatisticsDefinitionDto);
}
/**
* 删除统计定义
*
* @param id
*/
@DeleteMapping("/deleteDocStatisticsDefinition")
public R<?> deleteDocStatisticsDefinition(Long id) {
return docStatisticsDefinitionAppService.deleteDocStatisticsDefinition(id);
}
/**
* 根据id获取统计定义详情
*
* @param id
* @return
*/
@GetMapping("/getDocStatisticsDefinitionById")
public R<?> getDocStatisticsDefinitionById(Long id) {
return docStatisticsDefinitionAppService.getDocStatisticsDefinitionById(id);
}
/**
* 根据code获取统计定义详情
*
* @param code
* @return
*/
@GetMapping("/getDocStatisticsDefinitionByCode")
public R<?> getDocStatisticsDefinitionByCode(String code) {
return docStatisticsDefinitionAppService.getDocStatisticsDefinitionByCode(code);
}
/**
* 分页查询列表-不包含options
*
* @param pageNo
* @param pageSize
* @param searchKey
* @param request
* @return
*/
@GetMapping("/getPageList")
public R<?> getPageList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
return docStatisticsDefinitionAppService.getPageList(pageNo, pageSize, searchKey, request);
}
/**
* 获取文档统计定义选项列表并按指定格式返回
*
* @return
*/
@GetMapping("/getOptionList")
public R<?> getOptionList() {
return docStatisticsDefinitionAppService.getOptionList();
}
}

View File

@@ -0,0 +1,25 @@
package com.openhis.web.document.controller;
import com.openhis.web.document.appservice.IDocRecordAppService;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionOptionAppService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 文文统计选项 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/statisticsOption")
@Slf4j
@AllArgsConstructor
public class DocStatisticsOptionController {
private final IDocStatisticsDefinitionOptionAppService docStatisticsDefinitionOptionAppService;
}

View File

@@ -0,0 +1,82 @@
package com.openhis.web.document.controller;
import java.util.HashMap;
import java.util.Map;
import com.openhis.web.document.dto.DocTemplateDto;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
import com.openhis.common.enums.DocTypeEnum;
import com.openhis.common.enums.DocUseRangeEnum;
import com.openhis.web.document.appservice.IDocTemplateAppService;
import com.openhis.web.document.util.EnumUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
/**
* DOC模板 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/template")
@Slf4j
@AllArgsConstructor
public class DocTemplateController {
private final IDocTemplateAppService docTemplateAppService;
/**
* 初始化文书定义
*
* @return
*/
@GetMapping("/init")
public R<?> init() {
Map<String, Object> map = new HashMap<>();
// 获取文档类型枚举列表
map.put("docTypes", EnumUtil.toMapList(DocTypeEnum.class));
// 使用范围枚举
map.put("useRanges", EnumUtil.toMapList(DocUseRangeEnum.class));
return R.ok(map);
}
@PostMapping("/add")
public R<?> add(@RequestBody DocTemplateDto docTemplateDto) {
return docTemplateAppService.add(docTemplateDto);
}
@DeleteMapping("/delete")
public R<?> delete(Long id) {
return docTemplateAppService.delete(id);
}
@PutMapping("/update")
public R<?> update(@RequestBody DocTemplateDto docTemplateDto) {
return docTemplateAppService.update(docTemplateDto);
}
@GetMapping("/getById")
public R<?> getById(Long id) {
return docTemplateAppService.getById(id);
}
@GetMapping("/getListByDefinitionId")
public R<?> getListByDefinitionId(Long definitionId) {
return docTemplateAppService.getListByDefinitionId(definitionId);
}
@GetMapping("/getPageList")
public R<?> getPageList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
return docTemplateAppService.getPageList(pageNo, pageSize, searchKey, request);
}
}

View File

@@ -0,0 +1,17 @@
package com.openhis.web.document.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.ArrayList;
import java.util.List;
@Data
@Accessors(chain = true)
public class DirectoryNode {
private String name;
private int level;
private DocDefinitionDto document;
private List<DirectoryNode> children = new ArrayList<>();
}

View File

@@ -0,0 +1,85 @@
package com.openhis.web.document.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class DocDefinitionDto {
/**
* ID
*/
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 文书名称
*/
private String name;
/**
* 文书的版本号
*/
private String version;
/**
* 文书类型 一级菜单 ,从枚举中获取 DocTypeEnum
*/
private Integer primaryMenuEnum;
/**
* 文书类型 二级菜单,自定义
*/
private String subMenu;
/**
* 文书编码 busNo在新建时由系统自动生成
*/
private String busNo;
/**
* vue路由地址
*/
private String vueRouter;
/**
* 医院ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long hospitalId;
/**
* 是否有效 0-有效 1-无效
*/
private Integer isValid;
/**
* 显示顺序
*/
private Integer displayOrder;
/**
* 使用范围 0-暂不使用 1-全院使用 2-指定科室使用
*/
private Integer useRangeEnum;
/**
* 医生权限 DocPermissionEnum
* 文书权限 0-不限制 1-查看 2- 编辑
*/
private Integer doctorPermissionEnum;
/**
* 护士权限 DocPermissionEnum
* 文书权限 0-不限制 1-查看 2- 编辑
*/
private Integer nursingPermissionEnum;
/**
* 医技权限 DocPermissionEnum
* 文书权限 0-不限制 1-查看 2- 编辑
*/
private Integer medicalPermissionEnum;
/**
* 药剂师权限 DocPermissionEnum
* 文书权限 0-不限制 1-查看 2- 编辑
*/
private Integer pharmacistPermissionEnum;
private List<Long> organizationIds;
}

View File

@@ -0,0 +1,24 @@
package com.openhis.web.document.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class DocDefinitionOrganizationDto {
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
private String busNo;
@JsonSerialize(using = ToStringSerializer.class)
private List<Long> organizationIds;
}

View File

@@ -0,0 +1,24 @@
package com.openhis.web.document.dto;
import com.core.common.core.domain.R;
import com.core.common.utils.SecurityUtils;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class DocDefinitonParam {
private Integer primaryMenuEnum;
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
private String name;
@JsonSerialize(using = ToStringSerializer.class)
private List<Integer> useRanges;
}

View File

@@ -0,0 +1,56 @@
package com.openhis.web.document.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@Accessors(chain = true)
public class DocRecordDto {
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 文书定义ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
private String definitionBusNo;
/**
* 文档内容 存储为JSON格式
*/
private String contentJson;
/**
* 记录状态 0草稿/暂存 1提交 2归档 3修改 DocStatusEnum 枚举类
* 0草稿/暂存 1提交 2归档 3修改
*/
private Integer statusEnum;
/**
* 记录科室ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 就诊id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* patientId 病人id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date recordTime;
private String createBy;
}

View File

@@ -0,0 +1,74 @@
package com.openhis.web.document.dto;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class DocRecordPatientDto extends DocRecordDto {
/**
* 科室ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 病人住院号、门诊号(病历号)
*/
private String busNo;
private String patientName;
private Integer gender;
private String genderValue;
private String age;
private String IdCard;
private String phone;
private String address;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthDate;
/**
* 入院 接诊时间/门诊 接诊时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date receptionTime;
/**
* 开始时间 encounter 入院登记时间/ 门诊 挂号时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 结束时间 encounter 住院 出院登记时间/ 门诊就诊结束时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
* 就诊类型 encounter 就诊类型 1:门诊 2:住院
*/
private Integer classEnum;
private String classEnumValue;
/**
* 病历名称
*/
private String docName;
/**
* 主菜单枚举值/病历类型
*/
private Integer primaryMenuEnum;
/**
* 主菜单名称 主菜单枚举值/病历类型名称
*/
private String primaryMenuEnumValue;
}

View File

@@ -0,0 +1,38 @@
package com.openhis.web.document.dto;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
@Data
@Accessors(chain = true)
public class DocRecordPatientQueryParam {
/**
* 书写文书的组织机构ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 文书状态
*/
private Integer statusEnum;
/**
* 对应 EncounterClass 枚举 | 就诊类型, 默认 2:门诊 1住院
*/
private Integer classEnum;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date recordTime;
}

View File

@@ -0,0 +1,24 @@
package com.openhis.web.document.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 查询单个患者的文档记录参数
*/
@Data
@Accessors(chain = true)
public class DocRecordQueryParam {
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
}

View File

@@ -0,0 +1,56 @@
package com.openhis.web.document.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.util.List;
@Data
@Accessors(chain = true)
public class DocStatisticsDefinitionDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/*
属性名称
*/
private String name;
/*
属性类型 Input 、 Date 、 Checkbox 、Radio 、 Select 、 Textarea
*/
private Integer typeEnum;
/*
属性代码
*/
private String code;
/*
是否必填 1必填 0 不必填
*/
private Integer required;
/*
备注
*/
private String remark;
/*
单位
*/
private String unit;
/*
是否统计 0不统计 1统计
*/
private Integer isStatistics;
/*
显示顺序
*/
private Integer displayOrder;
/*
统计类型定义选项值
*/
private DocStatisticsDefinitionOptionList optionList;
}

View File

@@ -0,0 +1,21 @@
package com.openhis.web.document.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class DocStatisticsDefinitionOptionDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/*
* 统计项编码
*/
// private String busNo;
private String option;
private Integer displayOrder;
}

View File

@@ -0,0 +1,23 @@
package com.openhis.web.document.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.util.List;
@Data
@Accessors(chain = true)
public class DocStatisticsDefinitionOptionList {
/*
* 统计定义ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long docStatisticsDefinitionId;
List<DocStatisticsDefinitionOptionDto> options;
}

View File

@@ -0,0 +1,54 @@
package com.openhis.web.document.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.util.Date;
@Data
@Accessors(chain = true)
public class DocStatisticsDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 记录ID
*/
private Long recordId;
/**
* 统计项定义ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long statisticDefinitionId;
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/**
* 统计项编码
*/
private String statisticDefinitionCode;
/**
* 记录科室ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long orgnizationId;
/**
* 统计值
*/
private String value;
/**
* 记录日期 yyyy-MM-dd
*/
private Date recordingDate;
/**
* 记录时间 yyyy-MM-dd HH:mm:ss
*/
private Date recordingTime;
/**
* 记录来源
*/
private String source;
}

View File

@@ -0,0 +1,49 @@
package com.openhis.web.document.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class DocTemplateDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 模板名称
*/
private String name;
/**
* 排序
*/
private Integer displayOrder;
/**
* 模板内容
*/
private String contextJson;
/**
* 文书定义ID
*/
private Long definitionId;
/**
* 使用范围 0-全院 1-指定机构 2-指定用户
*/
private Integer useRange;
/**
* 当useRange=1时指定机构ID
*/
private Long organizationId;
/**
* 当useRange=2时指定用户ID
*/
private Long userId;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,24 @@
package com.openhis.web.document.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 查询单个患者的文档记录参数
*/
@Data
@Accessors(chain = true)
public class DocTemplateQueryParam {
@JsonSerialize(using = ToStringSerializer.class)
private Integer useRang;
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
}

View File

@@ -0,0 +1,50 @@
package com.openhis.web.document.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.util.List;
@Data
@Accessors(chain = true)
public class OptionDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long optionId;
private String option;
private Integer displayOrder;
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/*
属性名称
*/
private String name;
/*
属性类型 Input 、 Date 、 Checkbox 、Radio 、 Select 、 Textarea
*/
private Integer typeEnum;
/*
属性代码
*/
private String code;
/*
是否必填 1必填 0 不必填
*/
private Integer required;
/*
备注
*/
private String remark;
/*
是否统计 0不统计 1统计
*/
private Integer isStatistics;
private String unit;
}

View File

@@ -0,0 +1,27 @@
package com.openhis.web.document.mapper;
import com.openhis.web.document.dto.DocDefinitionDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 文书分配信息Mapper
*
* @author wanghaiming
* @since 2025/04/08
*/
@Repository
public interface DocDefinitionAppMapper {
/**
* 根据useRangeEnum获取文书分配信息列表
*
* @return 文书分配信息
*/
List<DocDefinitionDto> getDefinationList(@Param("useRanges") List<Integer> useRanges, @Param("organizationId") Long organizationId,
@Param("hospitalId") Long hospitalId, @Param("name") String name, @Param("primaryMenuEnum") Integer primaryMenuEnum);
}

View File

@@ -0,0 +1,26 @@
package com.openhis.web.document.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.document.dto.DocRecordPatientDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 文书分配信息Mapper
*
* @author wanghaiming
* @since 2025/04/08
*/
@Repository
public interface DocRecordAppMapper {
IPage<DocRecordPatientDto> getRecordPageList(@Param("page") Page<DocRecordPatientDto> page,
@Param("primaryMenuEnumList") List<Integer> primaryMenuEnumList,
@Param(Constants.WRAPPER) QueryWrapper<DocRecordPatientDto> queryWrapper);
}

View File

@@ -0,0 +1,35 @@
package com.openhis.web.document.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.document.dto.DocRecordPatientDto;
import com.openhis.web.document.dto.DocStatisticsDefinitionDto;
import com.openhis.web.document.dto.OptionDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 文书分配信息Mapper
*
* @author wanghaiming
* @since 2025/04/08
*/
@Repository
public interface DocStatisticsDefinitionAppMapper {
/**
* 获取统计定义列表
*
* @return 文书分配信息
*/
IPage<DocStatisticsDefinitionDto> getDocStatisticsDefinitionPageList(@Param("page") Page<DocStatisticsDefinitionDto> page,
@Param(Constants.WRAPPER) QueryWrapper<DocStatisticsDefinitionDto> queryWrapper);
List<OptionDto> getOptionList(@Param("id") Long id, @Param("code") String code, @Param("name") String name);
}

View File

@@ -0,0 +1,156 @@
package com.openhis.web.document.util;
import com.openhis.common.enums.DocTypeEnum;
import com.openhis.web.document.dto.DirectoryNode;
import com.openhis.web.document.dto.DocDefinitionDto;
import java.util.*;
public class DocumentDirectoryProcessor {
/**
* 构建文档目录树
*
* @param documents 文档定义列表
* @return 目录节点列表(树形结构)
*/
public static List<DirectoryNode> buildDocumentDirectory(List<DocDefinitionDto> documents) {
// 第一步按一级菜单分组使用LinkedHashMap保持插入顺序
Map<Object, List<DocDefinitionDto>> level1Groups = new LinkedHashMap<>();
for (DocDefinitionDto doc : documents) {
Object key = doc.getPrimaryMenuEnum() != null ? doc.getPrimaryMenuEnum() : doc.getName();
level1Groups.computeIfAbsent(key, k -> new ArrayList<>()).add(doc);
}
// 对一级节点进行排序,确保输出顺序符合预期
List<Object> sortedKeys = new ArrayList<>(level1Groups.keySet());
sortedKeys.sort((k1, k2) -> {
// 处理数字类型的键primaryMenuEnum
if (k1 instanceof Integer && k2 instanceof Integer) {
return Integer.compare((Integer) k1, (Integer) k2);
}
// 数字键排在前面,非数字键(如体温单)排在后面
if (k1 instanceof Integer) {
return -1;
}
if (k2 instanceof Integer) {
return 1;
}
// 都是非数字键,按名称排序
return k1.toString().compareTo(k2.toString());
});
// 按排序后的键重新组织分组
Map<Object, List<DocDefinitionDto>> sortedLevel1Groups = new LinkedHashMap<>();
for (Object key : sortedKeys) {
sortedLevel1Groups.put(key, level1Groups.get(key));
}
List<DirectoryNode> result = new ArrayList<>();
for (Map.Entry<Object, List<DocDefinitionDto>> entry : sortedLevel1Groups.entrySet()) {
Object level1Key = entry.getKey();
List<DocDefinitionDto> level1Docs = entry.getValue();
DirectoryNode level1Node = new DirectoryNode();
if (level1Key instanceof Integer) {
level1Node.setName(getMenuName((Integer) level1Key));
} else {
level1Node.setName(level1Key.toString());
}
level1Node.setLevel(1);
buildSubNodes(level1Node, level1Docs);
result.add(level1Node);
}
return result;
}
private static void buildSubNodes(DirectoryNode parentNode, List<DocDefinitionDto> documents) {
if (documents == null || documents.isEmpty()) {
return;
}
// 按下一级分组键分组处理null键
Map<String, List<DocDefinitionDto>> groups = new HashMap<>();
for (DocDefinitionDto doc : documents) {
String key = getNextLevelKey(parentNode, doc);
// 统一使用空字符串处理null键避免分组异常
key = (key == null) ? "" : key;
groups.computeIfAbsent(key, k -> new ArrayList<>()).add(doc);
}
// 对分组键进行排序,确保子节点顺序一致
List<String> sortedGroupKeys = new ArrayList<>(groups.keySet());
sortedGroupKeys.sort(String::compareTo);
for (String groupKey : sortedGroupKeys) {
List<DocDefinitionDto> groupDocs = groups.get(groupKey);
if (groupKey.isEmpty()) {
// 分组键为空,直接添加文档节点
for (DocDefinitionDto doc : groupDocs) {
parentNode.getChildren().add(createDocumentNode(doc));
}
} else {
// 创建目录节点
DirectoryNode childNode = new DirectoryNode();
childNode.setName(groupKey);
childNode.setLevel(parentNode.getLevel() + 1);
// 递归构建子节点
buildSubNodes(childNode, groupDocs);
// 添加子节点到父节点
parentNode.getChildren().add(childNode);
}
}
}
/**
* 获取下一级节点的分组键
* 关键优化:二级节点(level=2)不再进行分组直接返回null
*/
private static String getNextLevelKey(DirectoryNode parentNode, DocDefinitionDto doc) {
int parentLevel = parentNode.getLevel();
if (parentLevel == 1) {
return doc.getSubMenu(); // 一级节点的下一级是subMenu(二级菜单)
} else if (parentLevel == 2) {
return null; // 二级节点的下一级直接是文档,不进行分组
}
return null;
}
private static DirectoryNode createDocumentNode(DocDefinitionDto doc) {
DirectoryNode node = new DirectoryNode();
node.setName(doc.getName() + " (" + doc.getVersion() + ")");
node.setLevel(3);
node.setDocument(doc);
return node;
}
private static String getMenuName(Integer menuEnum) {
DocTypeEnum docType = DocTypeEnum.getByValue(menuEnum);
if (docType != null) {
return docType.getInfo();
}
return "其他文书";
}
/**
* 打印目录结构(优化缩进格式)
*
* @param nodes 节点列表
* @param indent 缩进级别0表示无缩进
*/
public static void printDirectory(List<DirectoryNode> nodes, int indent) {
for (DirectoryNode node : nodes) {
// 打印缩进和节点信息
System.out.println(" ".repeat(indent) + node.getName() + " (" + node.getLevel() + ")");
// 递归打印子节点,缩进+1
printDirectory(node.getChildren(), indent + 1);
}
}
}

View File

@@ -0,0 +1,130 @@
package com.openhis.web.document.util;
import com.openhis.common.enums.HisEnumInterface;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 枚举工具类
*/
public class EnumUtil {
/**
* 将枚举转换为包含 value、code、info 的 Map 列表
*
* @param enumClass 枚举类
* @return 包含枚举属性的 Map 列表
*/
public static List<Map<String, Object>> toMapList(Class<? extends HisEnumInterface> enumClass) {
if (enumClass == null || !enumClass.isEnum()) {
return Collections.emptyList();
}
return Arrays.stream(enumClass.getEnumConstants())
.map(EnumUtil::convertEnumToMap)
.collect(Collectors.toList());
}
/**
* 将枚举项转换为 Map
*
* @param enumItem 枚举项
* @return 包含 value、code、info 的 Map
*/
private static Map<String, Object> convertEnumToMap(HisEnumInterface enumItem) {
Map<String, Object> map = new HashMap<>(3);
map.put("value", enumItem.getValue());
map.put("code", enumItem.getCode());
map.put("info", enumItem.getInfo());
return map;
}
/**
* 获取枚举的所有 value 列表
*
* @param enumClass 枚举类
* @return value 列表
*/
public static List<Object> getValues(Class<? extends HisEnumInterface> enumClass) {
if (enumClass == null || !enumClass.isEnum()) {
return Collections.emptyList();
}
return Arrays.stream(enumClass.getEnumConstants())
.map(HisEnumInterface::getValue)
.collect(Collectors.toList());
}
/**
* 获取枚举的所有 code 列表
*
* @param enumClass 枚举类
* @return code 列表
*/
public static List<String> getCodes(Class<? extends HisEnumInterface> enumClass) {
if (enumClass == null || !enumClass.isEnum()) {
return Collections.emptyList();
}
return Arrays.stream(enumClass.getEnumConstants())
.map(HisEnumInterface::getCode)
.collect(Collectors.toList());
}
/**
* 获取枚举的所有 info 列表
*
* @param enumClass 枚举类
* @return info 列表
*/
public static List<String> getInfos(Class<? extends HisEnumInterface> enumClass) {
if (enumClass == null || !enumClass.isEnum()) {
return Collections.emptyList();
}
return Arrays.stream(enumClass.getEnumConstants())
.map(HisEnumInterface::getInfo)
.collect(Collectors.toList());
}
/**
* 根据 value 获取枚举项
*
* @param enumClass 枚举类
* @param value 枚举值
* @return 枚举项,未找到返回 null
*/
public static <T extends HisEnumInterface> T getByValue(Class<T> enumClass, Object value) {
if (enumClass == null || !enumClass.isEnum() || value == null) {
return null;
}
return Arrays.stream(enumClass.getEnumConstants())
.filter(item -> value.equals(item.getValue()))
.findFirst()
.orElse(null);
}
/**
* 根据 code 获取枚举项
*
* @param enumClass 枚举类
* @param code 枚举编码
* @return 枚举项,未找到返回 null
*/
public static <T extends HisEnumInterface> T getByCode(Class<T> enumClass, String code) {
if (enumClass == null || !enumClass.isEnum() || code == null) {
return null;
}
return Arrays.stream(enumClass.getEnumConstants())
.filter(item -> code.equals(item.getCode()))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,36 @@
package com.openhis.web.document.util;
import com.core.common.annotation.Excel;
import com.core.common.core.domain.entity.SysRole;
import com.core.common.utils.SecurityUtils;
import com.openhis.common.enums.DocPermissionEnum;
import com.openhis.web.document.dto.DocDefinitionDto;
import java.util.ArrayList;
import java.util.List;
public class PermissionProcessor {
public static boolean hasPermission(DocDefinitionDto docDefinitionDto) {
//肯定还得改
List<SysRole> roleList = SecurityUtils.getLoginUser().getRoleList();
boolean result = false;
for (SysRole role : roleList) {
if (role.getRoleKey().equals("admin")) {
return true;
}
if (role.getRoleKey().equals("doctor") && docDefinitionDto.getDoctorPermissionEnum() != DocPermissionEnum.VIEW.getValue()) {
return true;
}
if (role.getRoleKey().equals("nurse") && docDefinitionDto.getNursingPermissionEnum() != DocPermissionEnum.VIEW.getValue()) {
return true;
}
if (role.getRoleKey().equals("medicalSkill") && docDefinitionDto.getMedicalPermissionEnum() != DocPermissionEnum.VIEW.getValue()) {
return true;
}
if (role.getRoleKey().equals("pharmacist") && docDefinitionDto.getPharmacistPermissionEnum() != DocPermissionEnum.VIEW.getValue()) {
return true;
}
}
return result;
}
}