2025-12-24 发版,具体内容见发版日志

This commit is contained in:
whm
2025-12-24 22:15:55 +08:00
parent 9ea7d46df0
commit 2f581b34ba
370 changed files with 94577 additions and 66778 deletions

View File

@@ -5,10 +5,8 @@ import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.openhis.common.enums.AccountBillingStatus;
import com.openhis.common.enums.AccountStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -66,4 +64,7 @@ public class Account extends HisBaseEntity {
/** 是否为就诊登记使用 */
private Integer encounterFlag;
/** 险种类型 */
private String insutype;
}

View File

@@ -6,9 +6,8 @@ import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.openhis.common.enums.PublicationStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -67,4 +66,9 @@ public class ChargeItemDefinition extends HisBaseEntity {
/** 基础价格 */
private BigDecimal price;
/**
* 物价编码
*/
private String priceCode;
}

View File

@@ -6,13 +6,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.ActPriority;
import com.openhis.common.enums.PublicationStatus;
import com.openhis.common.enums.SupplyCategory;
import com.openhis.common.enums.SupplyStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -132,9 +128,4 @@ public class Patient extends HisBaseEntity {
/** 机构Id */
private Long organizationId;
public Patient() {
// 活动标识:启用
this.activeFlag = PublicationStatus.ACTIVE.getValue();
}
}

View File

@@ -61,4 +61,10 @@ public class ChargeItemDefInfo extends ChargeItem {
/** 基础价格 */
private BigDecimal price;
/** 基础价格 */
private BigDecimal manualAdjustedPrice;
/** 基础价格 */
private BigDecimal systemDiscountPrice;
}

View File

@@ -0,0 +1,145 @@
package com.openhis.administration.dto;
import java.math.BigDecimal;
import java.util.Date;
import com.core.common.annotation.Excel;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 费用明细Dto
*
* @author swb
* @date 2025-12-16
*/
@Data
@Accessors(chain = true)
public class CostDetailDto {
/**
* 项目名称
*/
@Excel(name = "项目名称", sort = 2)
private String chargeName;
/**
* 费用类型
*/
private Integer chargeItemEnum;
@Excel(name = "费用类型", sort = 3)
private String chargeItemEnum_enumText;
/**
* 单价
*/
@Excel(name = "单价", sort = 4, scale = 2)
private BigDecimal unitPrice;
/**
* 数量
*/
@Excel(name = "数量", sort = 5, scale = 0)
private BigDecimal quantityValue;
/**
* 金额
*/
@Excel(name = "金额", sort = 6, scale = 2)
private BigDecimal totalPrice;
/**
* 执行科室
*/
private Long orgId;
@Excel(name = "执行科室", sort = 7)
private String orgName;
/**
* 执行人
*/
@Excel(name = "执行人", sort = 8)
private String practitioner;
/**
* 执行日期
*/
@Excel(name = "执行日期", sort = 9, dateFormat = "yyyy-MM-dd")
private Date recordedTime;
/**
* 医保类型
*/
private Integer chrgitmLv;
@Excel(name = "医保类型", sort = 10)
private String chrgitmLv_enumText;
/**
* 备注
*/
@Excel(name = "备注", sort = 11)
private String remark;
/**
* 住院患者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 患者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/**
* 患者姓名
*/
private String patientName;
/**
* 生日
*/
private Date birthDate;
/**
* 年龄
*/
private String age;
/**
* 性别
*/
private Integer genderEnum;
private String genderEnum_enumText;
/**
* 诊断
*/
private String conditionNames;
/**
* 住院医生
*/
private String admittingDoctorName;
/**
* 余额
*/
private BigDecimal balanceAmount;
/**
* 住院号
*/
private String BusNo;
/**
* 床位名称
*/
private String bedName;
/**
* 费别
*/
private String contractName;
}

View File

@@ -0,0 +1,36 @@
package com.openhis.administration.dto;
import java.util.List;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 费用明细查询条件
*
* @author swb
* @date 2025-12-15
*/
@Data
@Accessors(chain = true)
public class CostDetailSearchParam {
/**
* 就诊ID列表
*/
@JsonSerialize(using = ToStringSerializer.class)
private List<Long> encounterIds;
/**
* 科室ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long orgId;
/**
* 费用类型ID
*/
private String chargeItemEnum;
}

View File

@@ -0,0 +1,47 @@
package com.openhis.administration.dto;
import java.util.Date;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 药品追溯患者信息Dto
*
* @author swb
* @date 2025-12-15
*/
@Data
@Accessors(chain = true)
public class TracePatientInfoDto {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private Integer genderEnum;
private String genderEnum_enumText;
/**
* 生日
*/
private Date birthDate;
/**
* 年龄
*/
private String age;
/**
* 手机号
*/
private String phone;
/**
* 挂号时间
*/
private Date registerTime;
}

View File

@@ -5,10 +5,14 @@ import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.dto.ChargeItemBaseInfoDto;
import com.openhis.administration.dto.ChargeItemDefInfo;
import com.openhis.administration.dto.CostDetailDto;
import com.openhis.administration.dto.CostDetailSearchParam;
/**
* 费用项管理Mapper接口
@@ -34,4 +38,22 @@ public interface ChargeItemMapper extends BaseMapper<ChargeItem> {
* @return 集合
*/
List<ChargeItemDefInfo> getChargeItemDefInfoByIds(@Param("chargeItemIds") List<Long> chargeItemIds);
/**
* 查询费用明细
*
* @param queryWrapper 查询条件
* @param billable 待结算
* @param billed 已收费
* @param refunded 已退费
* @param active 使用中
* @param bed 床位
* @param admittingDoctor 住院医生
* @param personalCashAccount 个人现金账户
* @return 费用明细分页列表
*/
List<CostDetailDto> getCostDetails(@Param(Constants.WRAPPER) QueryWrapper<CostDetailSearchParam> queryWrapper,
@Param("billable") Integer billable, @Param("billed") Integer billed, @Param("refunded") Integer refunded,
@Param("active") Integer active, @Param("bed") Integer bed, @Param("admittingDoctor") String admittingDoctor,
@Param("personalCashAccount") String personalCashAccount);
}

View File

@@ -20,20 +20,35 @@ import com.openhis.administration.dto.PatientBedInfoDto;
public interface LocationMapper extends BaseMapper<Location> {
/**
* Desc: 根据区域id数组查询 区域表
*
* @param locationIds
* @Author raymond
* @Date 07:46 2025/10/28
* @return java.util.List<com.openhis.administration.dto.LocationDataDto>
**/
List<LocationDataDto> searchLocationDataByIds(@Param("locationIds") List<Long> locationIds);
/**
* Desc: 根据病区bus_no 查询病床
*
* @param busNo
* @param formEnum
* @Author raymond
* @Date 14:01 2025/10/28
* @return java.util.List<com.openhis.administration.dto.LocationDataDto>
**/
List<PatientBedInfoDto> searchLocationDataByBusNo(@Param("busNo") String busNo, @Param("formEnum") Integer formEnum, @Param("statusEnum") Integer statusEnum);
List<PatientBedInfoDto> searchLocationDataByBusNo(@Param("busNo") String busNo, @Param("formEnum") Integer formEnum,
@Param("statusEnum") Integer statusEnum);
/**
* 判断是否存在相同名字
*
* @param name 名字
* @param busNo 病区号/病房号/病床号
* @param locId 病区ID/病房ID/病床ID
* @param delFlag 删除标志
* @return true/false
*/
boolean isExistName(@Param("name") String name, @Param("busNo") String busNo, @Param("locId") Long locId,
@Param("delFlag") String delFlag);
}

View File

@@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.openhis.administration.domain.TraceNoManage;
import com.openhis.administration.dto.TracePatientInfoDto;
/**
* 【追溯码管理】Mapper接口
@@ -28,4 +29,14 @@ public interface TraceNoManageMapper extends BaseMapper<TraceNoManage> {
*/
List<TraceNoManage> getItemTraceNoInfo(@Param("itemTable") String itemTable, @Param("itemId") Long itemId,
@Param("locationId") Long locationId, @Param("lotNumber") String lotNumber);
/**
* 追溯患者信息
*
* @param medId 药品定义ID
* @param dispenseStatus 药品发放状态
* @return 患者信息列表
*/
List<TracePatientInfoDto> tracePatient(@Param("medId") Long medId, @Param("dispenseStatus") Integer dispenseStatus,
@Param("traceNo") String traceNo);
}

View File

@@ -2,10 +2,13 @@ package com.openhis.administration.service;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.dto.ChargeItemBaseInfoDto;
import com.openhis.administration.dto.ChargeItemDefInfo;
import com.openhis.administration.dto.CostDetailDto;
import com.openhis.administration.dto.CostDetailSearchParam;
/**
* 费用项管理Service接口
@@ -138,5 +141,22 @@ public interface IChargeItemService extends IService<ChargeItem> {
* @param id
* @return
*/
List<ChargeItem> getChargeItemByEncounterId(Long id,String tableName,List<Long> serviceId);
List<ChargeItem> getChargeItemByEncounterId(Long id, String tableName, List<Long> serviceId);
/**
* 查询费用明细
*
* @param queryWrapper 查询条件
* @param billable 待结算
* @param billed 已收费
* @param refunded 已退费
* @param active 使用中
* @param bed 床位
* @param admittingDoctor 住院医生
* @param personalCashAccount 个人现金账户
* @return 费用明细分页列表
*/
List<CostDetailDto> getCostDetails(QueryWrapper<CostDetailSearchParam> queryWrapper, Integer billable,
Integer billed, Integer refunded, Integer active, Integer bed, String admittingDoctor,
String personalCashAccount);
}

View File

@@ -2,11 +2,11 @@ package com.openhis.administration.service;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.Location;
import com.openhis.administration.dto.LocationDataDto;
import liquibase.pro.packaged.L;
import org.apache.ibatis.annotations.Param;
/**
* 位置管理Service接口
@@ -37,7 +37,6 @@ public interface ILocationService extends IService<Location> {
*/
List<Location> getWarehouseList();
/**
* 获取药房药库列表
*
@@ -89,9 +88,10 @@ public interface ILocationService extends IService<Location> {
* 根据科室ID集合查询对应信息
*
* @param ids 科室ID集合
* @param status 状态列表
* @return 科室信息列表
*/
List<Location> getLocationList(List<Long> ids);
List<Location> getLocationList(List<Long> ids, List<Integer> status);
/**
* 根据locationId更新状态
@@ -104,6 +104,7 @@ public interface ILocationService extends IService<Location> {
/**
* Desc: 根据区域id数组查询 区域表
*
* @param locationIds
* @Author raymond
* @Date 07:46 2025/10/28
@@ -116,6 +117,15 @@ public interface ILocationService extends IService<Location> {
*
* @return 所有位置信息列表
*/
List< Location> getLocationList();
List<Location> getLocationList();
/**
* 判断是否存在相同名字
*
* @param name 名字
* @param busNo 病区号/病房号/病床号
* @param locId 病区ID/病房ID/病床ID
* @return true/false
*/
boolean isExistName(String name, String busNo, Long locId);
}

View File

@@ -1,9 +1,7 @@
package com.openhis.administration.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.Encounter;
import com.openhis.administration.domain.Patient;
import com.openhis.administration.domain.PatientIdentifier;
/**
* 患者管理Service接口
@@ -27,19 +25,4 @@ public interface IPatientService extends IService<Patient> {
*/
boolean savePatient(Patient patient);
/**
* 添加病人
*
* @param patient 患者实体
*/
boolean addPatient(Patient patient);
/**
* 更新病人
*
* @param patient 患者实体
*/
boolean updatePatient(Patient patient);
}

View File

@@ -10,21 +10,25 @@ import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.enums.DelFlag;
import com.core.common.exception.ServiceException;
import com.core.common.utils.AgeCalculatorUtil;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.dto.ChargeItemBaseInfoDto;
import com.openhis.administration.dto.ChargeItemDefInfo;
import com.openhis.administration.dto.CostDetailDto;
import com.openhis.administration.dto.CostDetailSearchParam;
import com.openhis.administration.mapper.ChargeItemDefinitionMapper;
import com.openhis.administration.mapper.ChargeItemMapper;
import com.openhis.administration.service.IChargeItemService;
import com.openhis.common.enums.ChargeItemContext;
import com.openhis.common.enums.ChargeItemStatus;
import com.core.common.enums.DelFlag;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
import lombok.AllArgsConstructor;
@@ -263,7 +267,51 @@ public class ChargeItemServiceImpl extends ServiceImpl<ChargeItemMapper, ChargeI
@Override
public List<ChargeItem> getChargeItemByEncounterId(Long id, String tableName, List<Long> serviceId) {
return baseMapper.selectList(new LambdaUpdateWrapper<ChargeItem>().eq(ChargeItem::getEncounterId, id)
.in(ChargeItem::getEncounterId, serviceId)
.eq(ChargeItem::getDeleteFlag, DelFlag.NO.getCode()));
.in(ChargeItem::getEncounterId, serviceId).eq(ChargeItem::getDeleteFlag, DelFlag.NO.getCode()));
}
/**
* 查询费用明细
*
* @param queryWrapper 查询条件
* @param billable 待结算
* @param billed 已收费
* @param refunded 已退费
* @param active 使用中
* @param bed 床位
* @param admittingDoctor 住院医生
* @param personalCashAccount 个人现金账户
* @return 费用明细分页列表
*/
@Override
public List<CostDetailDto> getCostDetails(QueryWrapper<CostDetailSearchParam> queryWrapper, Integer billable,
Integer billed, Integer refunded, Integer active, Integer bed, String admittingDoctor,
String personalCashAccount) {
// 查询费用明细
List<CostDetailDto> costDetails = baseMapper.getCostDetails(queryWrapper, billable, billed, refunded, active,
bed, admittingDoctor, personalCashAccount);
// 翻译字段
costDetails.forEach(costDetail -> {
// 医保类型
if (costDetail.getChrgitmLv() != null) {
costDetail
.setChrgitmLv_enumText(EnumUtils.getInfoByValue(InsuranceLevel.class, costDetail.getChrgitmLv()));
}
// 性别枚举
if (costDetail.getGenderEnum() != null) {
costDetail.setGenderEnum_enumText(
EnumUtils.getInfoByValue(AdministrativeGender.class, costDetail.getGenderEnum()));
}
// 计算年龄
if (costDetail.getBirthDate() != null) {
costDetail.setAge(AgeCalculatorUtil.getAge(costDetail.getBirthDate()));
}
// 费用类型
if (costDetail.getChargeItemEnum() != null) {
costDetail
.setChargeItemEnum_enumText(ChargeItemEnum.getByValue(costDetail.getChargeItemEnum()).getInfo());
}
});
return costDetails;
}
}

View File

@@ -2,21 +2,21 @@ package com.openhis.administration.service.impl;
import java.util.List;
import com.openhis.administration.dto.LocationDataDto;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.enums.DelFlag;
import com.openhis.administration.domain.Location;
import com.openhis.administration.dto.LocationDataDto;
import com.openhis.administration.mapper.LocationMapper;
import com.openhis.administration.service.ILocationService;
import com.core.common.enums.DelFlag;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.enums.LocationStatus;
import javax.annotation.Resource;
/**
* 位置管理Service业务层处理
*
@@ -49,6 +49,7 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
return baseMapper
.selectList(new LambdaQueryWrapper<Location>().eq(Location::getFormEnum, LocationForm.CABINET.getValue()));
}
/**
* 获取仓库列表
*
@@ -56,8 +57,8 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
*/
@Override
public List<Location> getWarehouseList() {
return baseMapper
.selectList(new LambdaQueryWrapper<Location>().eq(Location::getFormEnum, LocationForm.WAREHOUSE.getValue()));
return baseMapper.selectList(
new LambdaQueryWrapper<Location>().eq(Location::getFormEnum, LocationForm.WAREHOUSE.getValue()));
}
/**
@@ -151,10 +152,11 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
* 根据科室ID集合查询对应信息
*
* @param ids 科室ID集合
* @param status 状态列表
* @return 科室信息列表
*/
@Override
public List<Location> getLocationList(List<Long> ids) {
public List<Location> getLocationList(List<Long> ids, List<Integer> status) {
// // 如果 ids 是空的,获取当前登录用户的 orgId
// if (ids == null || ids.isEmpty()) {
// Long orgId = SecurityUtils.getLoginUser().getOrgId();
@@ -166,7 +168,7 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
LambdaQueryWrapper<Location> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(Location::getId, Location::getName, Location::getFormEnum, Location::getBusNo)
.in(Location::getId, ids).eq(Location::getDeleteFlag, DelFlag.NO.getCode())
.eq(Location::getStatusEnum, LocationStatus.ACTIVE.getValue());
.in(Location::getStatusEnum, status);
return baseMapper.selectList(queryWrapper);
}
@@ -195,8 +197,22 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
*
* @return 所有位置信息列表
*/
@Override public List<Location> getLocationList() {
@Override
public List<Location> getLocationList() {
return baseMapper.selectList(new LambdaQueryWrapper<Location>());
}
/**
* 判断是否存在相同名字
*
* @param name 名字
* @param busNo 病区号/病房号/病床号
* @param locId 病区ID/病房ID/病床ID
* @return true/false
*/
@Override
public boolean isExistName(String name, String busNo, Long locId) {
return locationMapper.isExistName(name, busNo, locId, DelFlag.NO.getCode());
}
}

View File

@@ -2,20 +2,20 @@ package com.openhis.administration.service.impl;
import java.util.List;
import com.openhis.administration.dto.OrgDataDto;
import com.core.common.enums.DelFlag;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.enums.DelFlag;
import com.openhis.administration.domain.Organization;
import com.openhis.administration.dto.OrgDataDto;
import com.openhis.administration.mapper.OrganizationMapper;
import com.openhis.administration.service.IOrganizationService;
import com.openhis.common.enums.AccountStatus;
import javax.annotation.Resource;
/**
* 机构管理Service业务层处理
*
@@ -27,6 +27,7 @@ public class OrganizationServiceImpl extends ServiceImpl<OrganizationMapper, Org
implements IOrganizationService {
@Resource
private OrganizationMapper organizationMapper;
/**
* 机构启用
*
@@ -63,8 +64,10 @@ public class OrganizationServiceImpl extends ServiceImpl<OrganizationMapper, Org
@Override
public List<Organization> getList(Integer organizationType, Integer organizationClass) {
return baseMapper.selectList(new LambdaQueryWrapper<Organization>()
.select(Organization::getId, Organization::getName).eq(Organization::getTypeEnum, organizationType)
.eq(organizationClass != null, Organization::getClassEnum, organizationClass));
.select(Organization::getId, Organization::getName, Organization::getDisplayOrder)
.eq(Organization::getTypeEnum, organizationType)
.eq(organizationClass != null, Organization::getClassEnum, organizationClass)
.orderByAsc(Organization::getDisplayOrder)); // 按 displayOrder 升序排序
}
/**
@@ -76,7 +79,7 @@ public class OrganizationServiceImpl extends ServiceImpl<OrganizationMapper, Org
@Override
public List<Organization> getOrganizationListById(List<Long> collect) {
return baseMapper.selectList(new LambdaQueryWrapper<Organization>().in(Organization::getId, collect)
.eq(Organization::getDeleteFlag, DelFlag.NO.getCode()));
.eq(Organization::getDeleteFlag, DelFlag.NO.getCode()));
}
@Override

View File

@@ -123,51 +123,4 @@ public class PatientServiceImpl extends ServiceImpl<PatientMapper, Patient> impl
return patientExists;
}
/**
* 添加病人
*
* @param patient 患者实体
*/
@Override
public boolean addPatient(Patient patient) {
Long organizationId = SecurityUtils.getLoginUser().getHospitalId();
// 设置机构ID
patient.setOrganizationId(organizationId);
// 设置拼音首拼
patient.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(patient.getName()));
// 设置五笔首拼
patient.setWbStr(ChineseConvertUtils.toWBFirstLetter(patient.getName()));
// 不存在重复的证件号,新增患者
if (patient.getIdCard() == null || patient.getIdCard().isEmpty() ||idCardExists(patient) == null) {
// 添加患者
return baseMapper.insert(patient) > 0;
}
return false;
}
/**
* 更新病人
*
* @param patient 患者实体
*/
@Override
public boolean updatePatient(Patient patient) {
Patient patientExists = idCardExists(patient);
Long organizationId = SecurityUtils.getLoginUser().getHospitalId();
// 设置机构ID
patient.setOrganizationId(organizationId);
// 设置拼音首拼
patient.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(patient.getName()));
// 设置五笔首拼
patient.setWbStr(ChineseConvertUtils.toWBFirstLetter(patient.getName()));
// 根据证件号查询,不存在重复的证件号
if (patientExists == null) {
// 患者修改了证件号码且不重复,更新患者
return baseMapper.updateById(patient) > 0;
} else if (patientExists.getId().compareTo(patient.getId()) == 0) {
// 患者未修改证件号码,更新患者
return baseMapper.updateById(patient) > 0;
}
return false;
}
}

View File

@@ -3,6 +3,7 @@ package com.openhis.medication.domain;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
@@ -173,4 +174,10 @@ public class MedicationDefinition extends HisBaseEntity {
*/
private String dosageInstruction;
/**
* 药品69码
*/
@TableField("drug_69_code")
private String drug69Code;
}

View File

@@ -14,8 +14,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
/**
* 药品信息详情
*
@@ -220,4 +218,9 @@ public class MedicationDetail extends HisBaseEntity {
*/
private String dosageInstruction;
/**
* 药品69码
*/
private String drug69Code;
}

View File

@@ -13,11 +13,11 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.enums.DelFlag;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.DateUtils;
import com.openhis.common.enums.AssignSeqEnum;
import com.openhis.common.enums.DbOpType;
import com.core.common.enums.DelFlag;
import com.openhis.common.enums.DispenseStatus;
import com.openhis.medication.domain.MedicationDispense;
import com.openhis.medication.domain.MedicationRequest;
@@ -97,12 +97,14 @@ public class MedicationDispenseServiceImpl extends ServiceImpl<MedicationDispens
// 设置限制发药时间
medicationDispense.setLimitTime(limitTime);
if (DbOpType.INSERT.getCode().equals(dbOpType)) {
baseMapper.insert(medicationDispense);
} else if (DbOpType.UPDATE.getCode().equals(dbOpType)) {
baseMapper.update(medicationDispense, new LambdaUpdateWrapper<MedicationDispense>()
.eq(MedicationDispense::getMedReqId, medicationRequest.getId()));
}
baseMapper.insert(medicationDispense);
// if (DbOpType.INSERT.getCode().equals(dbOpType)) {
// baseMapper.insert(medicationDispense);
// } else if (DbOpType.UPDATE.getCode().equals(dbOpType)) {
// baseMapper.update(medicationDispense, new LambdaUpdateWrapper<MedicationDispense>()
// .eq(MedicationDispense::getMedReqId, medicationRequest.getId()));
// }
return medicationDispense.getId();
}
@@ -325,6 +327,7 @@ public class MedicationDispenseServiceImpl extends ServiceImpl<MedicationDispens
public List<MedicationDispense> getMedDispenseBySummaryNo(List<String> summaryNoList) {
return baseMapper
.selectList(new LambdaQueryWrapper<MedicationDispense>().in(MedicationDispense::getSummaryNo, summaryNoList)
.eq(MedicationDispense::getDeleteFlag, DelFlag.NO.getCode()));
.eq(MedicationDispense::getDeleteFlag, DelFlag.NO.getCode())
.eq(MedicationDispense::getStatusEnum, DispenseStatus.SUMMARIZED.getValue()));
}
}

View File

@@ -6,7 +6,6 @@ import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.Practitioner;
import com.openhis.medication.domain.MedicationDispense;
import com.openhis.workflow.domain.DeviceDispense;
import com.openhis.workflow.domain.DeviceRequest;
@@ -18,7 +17,6 @@ import com.openhis.workflow.domain.DeviceRequest;
*/
public interface IDeviceDispenseService extends IService<DeviceDispense> {
/**
* 处理器材发放信息
*
@@ -40,6 +38,18 @@ public interface IDeviceDispenseService extends IService<DeviceDispense> {
Long generateDeviceDispense(DeviceRequest deviceRequest, Long procedureId, Long locationId,
Date plannedDispenseTime);
/**
* 医嘱执行生成耗材发放,状态为已发放
*
* @param deviceRequest 耗材医嘱请求
* @param procedureId 执行记录id
* @param locationId 发放器材房
* @param plannedDispenseTime 预定发药时间
* @return 发放id
*/
Long generateIssuedDeviceDispense(DeviceRequest deviceRequest, Long procedureId, Long locationId,
Date plannedDispenseTime);
/**
* 删除器材发放信息
*

View File

@@ -25,6 +25,14 @@ public interface ISupplyRequestService extends IService<SupplyRequest> {
*/
List<SupplyRequest> getSupplyByBusNo(String busNo);
/**
* 通过单据号批量查询单据信息
*
* @param busNoList 单据号
* @return 单据信息
*/
List<SupplyRequest> getSupplyByBusNoBatch(List<String> busNoList);
/**
* 通过原始单据号查询单据信息
*

View File

@@ -1,5 +1,7 @@
package com.openhis.workflow.service.impl;
import static com.core.common.utils.SecurityUtils.getLoginUser;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
@@ -13,11 +15,11 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.core.domain.model.LoginUser;
import com.core.common.enums.DelFlag;
import com.core.common.utils.AssignSeqUtil;
import com.openhis.administration.domain.Practitioner;
import com.openhis.common.enums.AssignSeqEnum;
import com.openhis.common.enums.DbOpType;
import com.openhis.common.enums.DispenseStatus;
import com.openhis.workflow.domain.DeviceDispense;
import com.openhis.workflow.domain.DeviceRequest;
@@ -87,12 +89,14 @@ public class DeviceDispenseServiceImpl extends ServiceImpl<DeviceDispenseMapper,
// 设置限制发药时间
deviceDispense.setLimitTime(limitTime);
if (DbOpType.INSERT.getCode().equals(dbOpType)) {
baseMapper.insert(deviceDispense);
} else if (DbOpType.UPDATE.getCode().equals(dbOpType)) {
baseMapper.update(deviceDispense,
new LambdaUpdateWrapper<DeviceDispense>().eq(DeviceDispense::getDeviceReqId, deviceRequest.getId()));
}
baseMapper.insert(deviceDispense);
// if (DbOpType.INSERT.getCode().equals(dbOpType)) {
// baseMapper.insert(deviceDispense);
// } else if (DbOpType.UPDATE.getCode().equals(dbOpType)) {
// baseMapper.update(deviceDispense,
// new LambdaUpdateWrapper<DeviceDispense>().eq(DeviceDispense::getDeviceReqId, deviceRequest.getId()));
// }
return deviceDispense.getId();
}
@@ -347,4 +351,69 @@ public class DeviceDispenseServiceImpl extends ServiceImpl<DeviceDispenseMapper,
return baseMapper.selectList(new LambdaQueryWrapper<DeviceDispense>()
.in(DeviceDispense::getDeviceReqId, requestIdList).eq(DeviceDispense::getDeleteFlag, DelFlag.NO.getCode()));
}
/**
* 医嘱执行生成耗材发放,状态为已完成
*
* @param deviceRequest 耗材医嘱请求
* @param procedureId 执行记录id
* @param locationId 发放器材房
* @param plannedDispenseTime 预定发药时间
* @return 发放id
*/
@Override
public Long generateIssuedDeviceDispense(DeviceRequest deviceRequest, Long procedureId, Long locationId,
Date plannedDispenseTime) {
DeviceDispense deviceDispense = new DeviceDispense();
// 执行id
deviceDispense.setProcedureId(procedureId);
// 预定发药时间
deviceDispense.setPlannedDispenseTime(plannedDispenseTime);
// 设置发放时间
deviceDispense.setDispenseTime(plannedDispenseTime);
// 器材发放id
deviceDispense.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_DIS_NO.getPrefix(), 4));
// 器材请求id
deviceDispense.setDeviceReqId(deviceRequest.getId());
// 器材发放状态
deviceDispense.setStatusEnum(DispenseStatus.COMPLETED.getValue());
// 发药类型
deviceDispense.setDispenseCategoryEnum(deviceRequest.getCategoryEnum());
// 器材编码
deviceDispense.setDeviceDefId(deviceRequest.getDeviceDefId());
// 领药患者
deviceDispense.setPatientId(deviceRequest.getPatientId());
// 相关诊疗
deviceDispense.setEncounterId(deviceRequest.getEncounterId());
// 发放数量
deviceDispense.setQuantity(deviceRequest.getQuantity());
// 发放单位
deviceDispense.setUnitCode(deviceRequest.getUnitCode());
// 产品批号
deviceDispense.setLotNumber(deviceRequest.getLotNumber());
// 发药人
// todo 存疑,是否用请求人作为发药人
LoginUser loginUser = getLoginUser();
deviceDispense.setPerformerId(loginUser.getPractitionerId());
// 发放器材房
deviceDispense.setLocationId(locationId);
// 支持用药信息
deviceDispense.setSupportInfo(deviceRequest.getSupportInfo());
// 已发药数量
deviceDispense.setDispenseQuantity(deviceRequest.getQuantity());
// 发药频次
deviceDispense.setDispenseFrequencyCode(deviceRequest.getRateCode());
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 增加12小时
LocalDateTime newTime = now.plusHours(12);
// 转换为Date对象如果需要保持使用Date类型
Date limitTime = Date.from(newTime.atZone(ZoneId.systemDefault()).toInstant());
// 设置限制发药时间
deviceDispense.setLimitTime(limitTime);
baseMapper.insert(deviceDispense);
return deviceDispense.getId();
}
}

View File

@@ -12,10 +12,10 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.enums.DelFlag;
import com.core.common.utils.DateUtils;
import com.core.common.utils.SecurityUtils;
import com.openhis.common.constant.CommonConstants;
import com.core.common.enums.DelFlag;
import com.openhis.common.enums.SupplyCategory;
import com.openhis.common.enums.SupplyStatus;
import com.openhis.common.enums.SupplyType;
@@ -53,6 +53,17 @@ public class SupplyRequestServiceImpl extends ServiceImpl<SupplyRequestMapper, S
return baseMapper.selectList(new LambdaQueryWrapper<SupplyRequest>().eq(SupplyRequest::getBusNo, busNo));
}
/**
* 通过单据号批量查询单据信息
*
* @param busNoList 单据号
* @return 单据信息
*/
@Override
public List<SupplyRequest> getSupplyByBusNoBatch(List<String> busNoList) {
return baseMapper.selectList(new LambdaQueryWrapper<SupplyRequest>().in(SupplyRequest::getBusNo, busNoList));
}
/**
* 通过原始单据号查询单据信息
*

View File

@@ -164,6 +164,8 @@
T1.create_by,
T1.update_time,
T1.update_by,
T1.system_discount_price,
T1.manual_adjusted_price,
T2.charge_name,
T2.title,
T2.status_enum,
@@ -188,4 +190,164 @@
</foreach>
AND T1.delete_flag = '0'
</select>
<!-- 查询费用明细 -->
<select id="getCostDetails" resultType="com.openhis.administration.dto.CostDetailDto">
SELECT final_res.charge_name,
final_res.charge_item_enum,
final_res.unit_price,
final_res.quantity_value,
final_res.total_price,
final_res.org_id,
final_res.practitioner,
final_res.recorded_time,
final_res.chrgitm_lv,
final_res.remark,
final_res.encounter_id,
final_res.patient_id,
final_res.patient_name,
final_res.birth_date,
final_res.gender_enum,
final_res.bus_no,
final_res.bed_name,
final_res.condition_names,
final_res.admitting_doctor_name,
final_res.balance_amount,
final_res.contract_name
FROM (WITH execution_table AS (SELECT cp.request_id,
cp.org_id,
ap.NAME,
cp.occurrence_time AS recorded_time
FROM cli_procedure cp
LEFT JOIN cli_procedure_performer cpp ON cpp.procedure_id = cp.ID
AND cpp.delete_flag = '0'
LEFT JOIN adm_practitioner ap ON ap.ID = cpp.practitioner_id
AND ap.active_flag = 1
AND ap.delete_flag = '0'
WHERE cp.delete_flag = '0'),
diagnosis AS (SELECT aed.encounter_id,
STRING_AGG(ccd.NAME, ', ') AS condition_names
FROM adm_encounter_diagnosis aed
INNER JOIN cli_condition cc ON cc.ID = aed.condition_id
AND cc.delete_flag = '0'
INNER JOIN cli_condition_definition ccd ON ccd.ID = cc.definition_id
AND ccd.delete_flag = '0'
WHERE aed.delete_flag = '0'
GROUP BY aed.encounter_id),
hospitalization AS (SELECT aep.encounter_id,
pra.NAME
FROM adm_encounter_participant aep
LEFT JOIN adm_practitioner pra ON aep.practitioner_id = pra.ID
AND pra.delete_flag = '0'
WHERE aep.delete_flag = '0'
AND aep.status_enum = #{ active }
AND aep.type_code = #{ admittingDoctor }),
account AS (SELECT aa.ID,
aa.encounter_id,
(
aa.balance_amount - COALESCE(SUM(CASE
WHEN aci.status_enum IN (#{ billed }, #{ billable })
THEN aci.total_price
ELSE 0 END), 0) + COALESCE(
SUM(CASE WHEN aci.status_enum = #{refunded} THEN aci.total_price ELSE 0 END),
0)
) AS balance_amount
FROM adm_account aa
LEFT JOIN adm_charge_item aci ON aa.encounter_id = aci.encounter_id
AND aci.delete_flag = '0'
WHERE aa.type_code = #{ personalCashAccount }
AND aa.delete_flag = '0'
GROUP BY aa.ID,
aa.encounter_id,
aa.balance_amount),
contract AS (SELECT fc.contract_name, aa.encounter_id
FROM adm_account aa
LEFT JOIN fin_contract fc ON aa.contract_no = fc.bus_no AND fc.delete_flag = '0'
WHERE aa.encounter_flag = 1
AND aa.delete_flag = '0')
SELECT T1.tenant_id,
T2.charge_name,
T2.yb_type AS charge_item_enum,
T1.unit_price,
T1.quantity_value,
T1.total_price,
T6.org_id,
T6.NAME AS practitioner,
T6.recorded_time,
CASE
WHEN T2.instance_table = 'adm_device_definition' THEN
T3.chrgitm_lv
WHEN T2.instance_table = 'med_medication_definition' THEN
T4.chrgitm_lv
WHEN T2.instance_table = 'wor_activity_definition' THEN
T5.chrgitm_lv
ELSE NULL
END AS chrgitm_lv,
'' AS remark,
T1.encounter_id,
T1.patient_id,
T7.NAME AS patient_name,
T7.birth_date,
T7.gender_enum,
T8.bus_no,
T10.NAME AS bed_name,
T11.condition_names,
T12.NAME AS admitting_doctor_name,
T13.balance_amount,
T14.contract_name
FROM adm_charge_item T1
LEFT JOIN adm_charge_item_definition T2 ON T2.ID = T1.definition_id
AND T2.delete_flag = '0'
LEFT JOIN adm_device_definition T3 ON T2.instance_id = T3.ID
AND T2.instance_table = 'adm_device_definition'
AND T3.delete_flag = '0'
LEFT JOIN med_medication_definition T4 ON T2.instance_id = T4.ID
AND T2.instance_table = 'med_medication_definition'
AND T4.delete_flag = '0'
LEFT JOIN wor_activity_definition T5 ON T2.instance_id = T5.ID
AND T2.instance_table = 'wor_activity_definition'
AND T5.delete_flag = '0'
LEFT JOIN execution_table T6 ON T6.request_id = T1.service_id
LEFT JOIN adm_patient T7 ON T7.ID = T1.patient_id
AND T7.delete_flag = '0'
LEFT JOIN adm_encounter T8 ON T8.ID = T1.encounter_id
AND T8.delete_flag = '0'
LEFT JOIN adm_encounter_location T9 ON T8.ID = T9.encounter_id
AND T9.delete_flag = '0'
AND T9.status_enum = #{active}
AND T9.form_enum = #{bed}
LEFT JOIN adm_location T10 ON T9.location_id = T10.ID
AND T10.delete_flag = '0'
LEFT JOIN diagnosis T11 ON T1.encounter_id = T11.encounter_id
LEFT JOIN hospitalization T12 ON T1.encounter_id = T12.encounter_id
LEFT JOIN account T13 ON T1.encounter_id = T13.encounter_id
LEFT JOIN contract T14 ON T1.encounter_id = T14.encounter_id
WHERE T1.delete_flag = '0'
GROUP BY T1.tenant_id,
T2.charge_name,
T2.yb_type,
T1.unit_price,
T1.quantity_value,
T1.total_price,
T6.org_id,
T6.NAME,
T6.recorded_time,
T2.instance_table,
T3.chrgitm_lv,
T4.chrgitm_lv,
T5.chrgitm_lv,
T1.encounter_id,
T1.patient_id,
T7.NAME,
T7.birth_date,
T7.gender_enum,
T8.bus_no,
T10.NAME,
T11.condition_names,
T12.NAME,
T13.balance_amount,
T14.contract_name
ORDER BY T6.recorded_time DESC) final_res
${ew.customSqlSegment}
</select>
</mapper>

View File

@@ -22,17 +22,31 @@
<!-- 根据区域id数组查询 区域表 -->
<select id="searchLocationDataByBusNo" resultType="com.openhis.administration.dto.PatientBedInfoDto">
select id as bedLocationId,
bus_no as busNo,
name as bedName,
status_enum as statusEnum,
mode_enum as modeEnum,
operational_enum as operationalEnum
select id as bedLocationId,
bus_no as busNo,
name as bedName,
status_enum as statusEnum,
mode_enum as modeEnum,
operational_enum as operationalEnum
from adm_location
where delete_flag = '0'
and bus_no like concat (#{busNo}, '%') and form_enum = #{formEnum} and status_enum = #{statusEnum}
and bus_no like concat(#{busNo}, '%')
and form_enum = #{formEnum}
and status_enum = #{statusEnum}
</select>
<select id="isExistName" resultType="java.lang.Boolean">
SELECT EXISTS (SELECT 1
FROM adm_location
WHERE REPLACE(REPLACE(name, ' ', ''), ' ', '') = #{name}
<if test="locId != null">
AND id != #{locId}
</if>
<if test="busNo != null">
AND bus_no like CONCAT(#{busNo}, '%')
</if>
AND delete_flag = #{delFlag}) AS exists_flag;
</select>
</mapper>

View File

@@ -15,17 +15,16 @@
AND item_id = #{itemId}
AND location_id = #{locationId}
AND lot_number = #{lotNumber}
AND (trace_no) IN (
SELECT trace_no
FROM adm_trace_no_manage
WHERE item_table = #{itemTable}
AND item_id = #{itemId}
AND location_id = #{locationId}
AND lot_number = #{lotNumber}
AND delete_flag = '0'
GROUP BY trace_no
HAVING SUM(CASE WHEN status_enum = 1 THEN 1 ELSE 0 END) > -- 库次数
SUM(CASE WHEN status_enum = 2 THEN 1 ELSE 0 END) -- 出库次数
AND (trace_no) IN (SELECT trace_no
FROM adm_trace_no_manage
WHERE item_table = #{itemTable}
AND item_id = #{itemId}
AND location_id = #{locationId}
AND lot_number = #{lotNumber}
AND delete_flag = '0'
GROUP BY trace_no
HAVING SUM(CASE WHEN status_enum = 1 THEN 1 ELSE 0 END) > -- 进库次数
SUM(CASE WHEN status_enum = 2 THEN 1 ELSE 0 END) -- 库次数
)
AND delete_flag = '0'
GROUP BY item_table,
@@ -34,4 +33,22 @@
lot_number,
trace_no
</select>
<select id="tracePatient" resultType="com.openhis.administration.dto.TracePatientInfoDto">
SELECT T2.name,
T2.gender_enum,
T2.birth_date,
T2.phone,
T3.create_time AS register_time
FROM med_medication_dispense T1
LEFT JOIN adm_patient T2 ON T2.ID = T1.patient_id
AND T2.delete_flag = '0'
LEFT JOIN adm_encounter T3 ON T3.ID = T1.encounter_id
AND T3.delete_flag = '0'
WHERE T1.medication_id = #{ medId }
<if test="dispenseStatus != null">
AND T1.status_enum = #{dispenseStatus}
</if>
AND T1.trace_no = #{traceNo}
</select>
</mapper>

View File

@@ -44,7 +44,7 @@
</select>
<!-- 根据关键字查询 如果关键字为空查询10条否则返回查询到的所有 -->
<select id="searchMedListByKeyWord" resultType="com.openhis.medication.dto.AdjustPriceMedListDto">
select med.id as targetId, med_def.name as name, med.total_volume as volume, details.amount as
select med_def.id as targetId, med_def.name as name, med.total_volume as volume, details.amount as
originRetailPrice,def_details.amount as originBuyingPrice,med_def.bus_no as busNo,med_def.min_unit_code as unitCode
from med_medication med
inner join med_medication_definition med_def on med.medication_def_id = med_def.id