版本更新
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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("文书科室分配更新失败:新增新分配记录异常");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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("删除患者文书记录失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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, "文档统计定义获取成功");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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, "获取成功");
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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<>();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user