版本更新

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

View File

@@ -0,0 +1,227 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.basicservice.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.servlet.http.HttpServletRequest;
import com.openhis.yb.service.YbManager;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
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.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.HealthcareService;
import com.openhis.administration.service.IChargeItemDefinitionService;
import com.openhis.administration.service.IHealthcareServiceService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.AccountStatus;
import com.openhis.common.enums.PublicationStatus;
import com.openhis.common.enums.Whether;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.web.basicservice.dto.*;
import com.openhis.web.basicservice.mapper.HealthcareServiceBizMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 服务管理 controller
*/
@RestController
@RequestMapping("/basic-service/healthcare")
@Slf4j
@AllArgsConstructor
public class HealthcareServiceController {
private final IHealthcareServiceService iHealthcareServiceService;
private final IChargeItemDefinitionService iChargeItemDefinitionService;
private final HealthcareServiceBizMapper healthcareServiceBizMapper;
private final YbManager ybService;
/**
* 服务管理基础数据初始化
*/
@GetMapping(value = "/init")
public R<?> init() {
HealthcareServiceInitDto healthcareServiceInitDto = new HealthcareServiceInitDto();
// 活动标记
List<HealthcareServiceInitDto.activeFlagOption> activeFlagOptions = Stream.of(AccountStatus.values())
.map(status -> new HealthcareServiceInitDto.activeFlagOption(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
healthcareServiceInitDto.setActiveFlagOptions(activeFlagOptions);
// 是否需要预约
List<HealthcareServiceInitDto.appointmentRequiredFlagOption> appointmentRequiredFlagOptions =
Stream.of(Whether.values())
.map(wh -> new HealthcareServiceInitDto.appointmentRequiredFlagOption(wh.getValue(), wh.getInfo()))
.collect(Collectors.toList());
healthcareServiceInitDto.setAppointmentRequiredFlagOptions(appointmentRequiredFlagOptions);
return R.ok(healthcareServiceInitDto);
}
/**
* 服务管理 新增
*/
@PostMapping(value = "/healthcare-service")
public R<?> add(@Validated @RequestBody HealthcareServiceAddOrUpdateParam healthcareServiceAddOrUpdateParam) {
// 服务管理-表单数据
HealthcareServiceFormData healthcareServiceFormData =
healthcareServiceAddOrUpdateParam.getHealthcareServiceFormData();
// 费用定价-表单数据
ChargeItemDefinitionFormData chargeItemDefinitionFormData =
healthcareServiceAddOrUpdateParam.getChargeItemDefinitionFormData();
// 服务管理-新增
HealthcareService healthcareService = new HealthcareService();
BeanUtils.copyProperties(healthcareServiceFormData, healthcareService);
HealthcareService healthcareServiceAfterAdd = iHealthcareServiceService.addHealthcareService(healthcareService);
// 同时保存费用定价
ChargeItemDefinition chargeItemDefinition = new ChargeItemDefinition();
chargeItemDefinitionFormData.setStatusEnum(PublicationStatus.ACTIVE.getValue());
BeanUtils.copyProperties(chargeItemDefinitionFormData, chargeItemDefinition);
boolean res = iChargeItemDefinitionService.addChargeItemDefinitionByHealthcareService(healthcareServiceAfterAdd,
chargeItemDefinition);
// 调用医保目录对照接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
// 医保开关打开并且,页面传了医保编码
String ybNo = healthcareServiceFormData.getYbNo();
if (Whether.YES.getCode().equals(ybSwitch) && StringUtils.isNotEmpty(ybNo)) {
R<?> r = ybService.directoryCheck(CommonConstants.TableName.ADM_HEALTHCARE_SERVICE,
healthcareServiceAfterAdd.getId());
if (200 != r.getCode()) {
throw new RuntimeException("医保目录对照接口异常");
}
}
return res ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"服务管理"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00010, null));
}
/**
* 服务管理 分页查询
*
* @param healthcareServiceDto 查询条件
* @param searchKey 模糊查询关键字
* @param pageNo 当前页码
* @param pageSize 查询条数
* @param request 请求数据
* @return 列表信息
*/
@GetMapping(value = "/healthcare-service-page")
public R<?> getHealthcareServicePage(HealthcareServiceDto healthcareServiceDto,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
// 构建查询条件
QueryWrapper<HealthcareServiceDto> queryWrapper = HisQueryUtils.buildQueryWrapper(healthcareServiceDto,
searchKey, new HashSet<>(Arrays.asList("name", "charge_name")), request);
IPage<HealthcareServiceDto> healthcareServicePage = healthcareServiceBizMapper.getHealthcareServicePage(
new Page<>(pageNo, pageSize), CommonConstants.TableName.ADM_HEALTHCARE_SERVICE,
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, queryWrapper);
healthcareServicePage.getRecords().forEach(e -> {
// 活动标记-枚举类回显赋值
e.setActiveFlag_enumText(EnumUtils.getInfoByValue(AccountStatus.class, e.getActiveFlag()));
// 预约要求-枚举类回显赋值
e.setAppointmentRequiredFlag_enumText(
EnumUtils.getInfoByValue(Whether.class, e.getAppointmentRequiredFlag()));
});
return R.ok(healthcareServicePage, MessageUtils.createMessage(PromptMsgConstant.Common.M00009, null));
}
/**
* 服务管理 详情
*
* @param id 主键
* @return 详情
*/
@GetMapping(value = "/healthcare-service-detail")
public R<?> getHealthcareServiceDetail(@RequestParam Long id) {
HealthcareServiceDto healthcareServiceDto = new HealthcareServiceDto();
healthcareServiceDto.setId(id);
// 构建查询条件
QueryWrapper<HealthcareServiceDto> queryWrapper =
HisQueryUtils.buildQueryWrapper(healthcareServiceDto, null, null, null);
IPage<HealthcareServiceDto> healthcareServicePage = healthcareServiceBizMapper.getHealthcareServicePage(
new Page<>(1, 1), CommonConstants.TableName.ADM_HEALTHCARE_SERVICE,
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, queryWrapper);
HealthcareServiceDto healthcareServiceDtoDetail = healthcareServicePage.getRecords().get(0);
// 枚举赋值
healthcareServiceDtoDetail
.setActiveFlag_enumText(
EnumUtils.getInfoByValue(AccountStatus.class, healthcareServiceDtoDetail.getActiveFlag()))
.setAppointmentRequiredFlag_enumText(
EnumUtils.getInfoByValue(Whether.class, healthcareServiceDtoDetail.getAppointmentRequiredFlag()));
return R.ok(healthcareServiceDtoDetail);
}
/**
* 服务管理 编辑
*
* @param healthcareServiceAddOrUpdateParam 表单数据
* @return 编辑结果
*/
@PutMapping(value = "/healthcare-service")
public R<?> edit(@Validated @RequestBody HealthcareServiceAddOrUpdateParam healthcareServiceAddOrUpdateParam) {
// 服务管理-表单数据
HealthcareServiceFormData healthcareServiceFormData =
healthcareServiceAddOrUpdateParam.getHealthcareServiceFormData();
HealthcareService healthcareService = new HealthcareService();
BeanUtils.copyProperties(healthcareServiceFormData, healthcareService);
// 调用医保目录对照接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
// 医保开关打开并且,页面传了医保编码
String ybNo = healthcareServiceFormData.getYbNo();
if (Whether.YES.getCode().equals(ybSwitch) && StringUtils.isNotEmpty(ybNo)) {
R<?> r =
ybService.directoryCheck(CommonConstants.TableName.ADM_HEALTHCARE_SERVICE, healthcareService.getId());
if (200 != r.getCode()) {
throw new RuntimeException("医保目录对照接口异常");
}
}
boolean res = iHealthcareServiceService.updateHealthcareService(healthcareService);
return res ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"服务管理"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
* 服务管理 删除
*
* @param ids ID
* @return 删除结果
*/
@DeleteMapping(value = "/healthcare-service")
public R<?> delete(@RequestParam String ids) {
List<Long> idsList = new ArrayList<>();
if (ids != null) {
idsList = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
}
boolean res = iHealthcareServiceService.removeByIds(idsList);
// 同时删除非同定价
for (Long id : idsList) {
LambdaQueryWrapper<ChargeItemDefinition> QueryWrapper = new LambdaQueryWrapper<>();
QueryWrapper.eq(ChargeItemDefinition::getInstanceId, id).eq(ChargeItemDefinition::getInstanceTable,
CommonConstants.TableName.ADM_HEALTHCARE_SERVICE);
iChargeItemDefinitionService.remove(QueryWrapper);
}
return res ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"服务管理"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
}
}

View File

@@ -0,0 +1,95 @@
package com.openhis.web.basicservice.dto;
import com.openhis.common.enums.PublicationStatus;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.Date;
/**
* 费用定价管理表单数据
*
* @author system
* @date 2025-02-20
*/
@Data
public class ChargeItemDefinitionFormData {
/**
* ID
*/
private Long id;
/**
* 名称
*/
@NotBlank(message = "名称不能为空")
private String chargeName;
/**
* 标题
*/
private String title;
/**
* 状态
*/
private Integer statusEnum;
/**
* 机构ID
*/
@NotBlank(message = "机构ID不能为空")
private Long orgId;
/**
* 描述
*/
@NotBlank(message = "描述不能为空")
private String description;
/**
* 代码
*/
private String instanceTable;
/**
* 关联项目
*/
private Long instanceId;
/**
* 有效时间开始
*/
private Date effectiveStart;
/**
* 有效时间结束
*/
private Date effectiveEnd;
/**
* 财务类别
*/
@NotBlank(message = "财务类别不能为空")
private String typeCode;
/**
* 医保类别
*/
@NotBlank(message = "医保类别不能为空")
private String ybType;
/**
* 是否使用详细价格规则
*/
@NotBlank(message = "是否使用详细价格规则不能为空")
private Integer conditionFlag;
/**
* 基础价格
*/
@NotBlank(message = "基础价格不能为空")
private BigDecimal price;
}

View File

@@ -0,0 +1,23 @@
package com.openhis.web.basicservice.dto;
import lombok.Data;
/**
* 服务项目管理 新增修改参数类
*
* @author system
* @date 2025-02-20
*/
@Data
public class HealthcareServiceAddOrUpdateParam {
/**
* 服务管理
*/
private HealthcareServiceFormData healthcareServiceFormData;
/**
* 费用定价
*/
private ChargeItemDefinitionFormData chargeItemDefinitionFormData;
}

View File

@@ -0,0 +1,114 @@
package com.openhis.web.basicservice.dto;
import java.math.BigDecimal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 服务管理 Dto
*/
@Data
@Accessors(chain = true)
public class HealthcareServiceDto {
/**
* ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 活动标记
*/
private Integer activeFlag;
private String activeFlag_enumText;
/**
* 提供部门ID
*/
@Dict(dictTable = "adm_organization", dictCode = "id", dictText = "name")
@JsonSerialize(using = ToStringSerializer.class)
private Long offeredOrgId;
private String offeredOrgId_dictText;
/**
* 服务分类
*/
@Dict(dictCode = "category_code")
private String categoryCode;
private String categoryCode_dictText;
/**
* 服务类型
*/
@Dict(dictCode = "service_type_code")
private String typeCode;
private String typeCode_dictText;
/**
* 服务专业
*/
@Dict(dictCode = "specialty_code")
private String specialtyCode;
private String specialtyCode_dictText;
/**
* 地点
*/
@Dict(dictTable = "adm_location", dictCode = "id", dictText = "name")
@JsonSerialize(using = ToStringSerializer.class)
private Long locationId;
private String locationId_dictText;
/**
* 服务名称
*/
private String name;
/**
* 说明
*/
private String comment;
/**
* 额外细节
*/
private String extraDetails;
/**
* 联系方式
*/
private String contact;
/**
* 预约要求
*/
private Integer appointmentRequiredFlag;
private String appointmentRequiredFlag_enumText;
/**
* 费用定价ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
/**
* 名称
*/
private String chargeName;
/**
* 基础价格
*/
private BigDecimal price;
/**
* 诊疗费
*/
private BigDecimal activityPrice;
}

View File

@@ -0,0 +1,88 @@
package com.openhis.web.basicservice.dto;
import javax.validation.constraints.NotBlank;
import lombok.Data;
/**
* 服务项目管理表单数据
*
* @author system
* @date 2025-02-20
*/
@Data
public class HealthcareServiceFormData {
/**
* ID
*/
private Long id;
/**
* 活动标记
*/
@NotBlank(message = "活动标记不能为空")
private Integer activeFlag;
/**
* 提供部门ID
*/
@NotBlank(message = "提供部门ID不能为空")
private Long offeredOrgId;
/**
* 服务分类
*/
@NotBlank(message = "服务分类不能为空")
private String categoryCode;
/**
* 服务类型
*/
@NotBlank(message = "服务类型不能为空")
private String typeCode;
/**
* 服务专业
*/
@NotBlank(message = "服务专业不能为空")
private String specialtyCode;
/**
* 地点
*/
// @NotBlank(message = "地点不能为空")
private Long locationId;
/**
* 服务名称
*/
@NotBlank(message = "服务名称不能为空")
private String name;
/**
* 说明
*/
private String comment;
/**
* 额外细节
*/
private String extraDetails;
/**
* 联系方式
*/
@NotBlank(message = "联系方式不能为空")
private String contact;
/**
* 预约要求
*/
@NotBlank(message = "预约要求不能为空")
private Integer appointmentRequiredFlag;
/** 医保编码 */
private String ybNo;
}

View File

@@ -0,0 +1,48 @@
package com.openhis.web.basicservice.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* 服务管理 init基础数据
*/
@Data
@Accessors(chain = true)
public class HealthcareServiceInitDto {
private List<activeFlagOption> activeFlagOptions;
private List<appointmentRequiredFlagOption> appointmentRequiredFlagOptions;
/**
* 活动标记
*/
@Data
public static class activeFlagOption {
private Integer value;
private String label;
public activeFlagOption(Integer value, String label) {
this.value = value;
this.label = label;
}
}
/**
* 是否需要预约
*/
@Data
public static class appointmentRequiredFlagOption {
private Integer value;
private String label;
public appointmentRequiredFlagOption(Integer value, String label) {
this.value = value;
this.label = label;
}
}
}

View File

@@ -0,0 +1,30 @@
package com.openhis.web.basicservice.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
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.basicservice.dto.HealthcareServiceDto;
/**
* 服务管理 自定义Mapper
*/
@Repository
public interface HealthcareServiceBizMapper {
/**
* 服务管理 分页查询
*
* @param page 分页参数
* @param tableName 定价表名
* @param queryWrapper 查询条件
* @return 列表信息
*/
IPage<HealthcareServiceDto> getHealthcareServicePage(@Param("page") Page<HealthcareServiceDto> page,
@Param("tableName") String tableName, @Param("activityTableName") String activityTableName,
@Param(Constants.WRAPPER) QueryWrapper<HealthcareServiceDto> queryWrapper);
}