Merge pull request !5 from Ubuntu_925/develop
This commit is contained in:
abing
2025-09-25 07:54:11 +00:00
committed by Gitee
465 changed files with 21422 additions and 8044 deletions

View File

@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.openhis.common.enums.AdministrativeGender;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -70,6 +71,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
String nickName = userAndPractitionerDto.getNickName();
String phonenumber = userAndPractitionerDto.getPhonenumber();
String pharPracCertNo = userAndPractitionerDto.getPharPracCertNo(); // 职业证件编号
String signature = userAndPractitionerDto.getSignature(); // 签名图片
String drProfttlCode = userAndPractitionerDto.getDrProfttlCode(); // 职称编码
String sex = userAndPractitionerDto.getSex();
// 账号唯一性
long count = iBizUserService.count(new LambdaQueryWrapper<BizUser>().eq(BizUser::getUserName, userName));
@@ -106,7 +109,7 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
Practitioner practitioner = new Practitioner();
practitioner.setActiveFlag(AccountStatus.ACTIVE.getValue()); // 活动标记
practitioner.setName(nickName); // 姓名
practitioner.setGenderEnum(Integer.parseInt(sex)); // 性别
practitioner.setGenderEnum(sex==null? AdministrativeGender.UNKNOWN.getValue() : Integer.parseInt(sex)); // 性别
practitioner.setBirthDate(userAndPractitionerDto.getBirthDate()); // 出生日期
practitioner.setPhone(phonenumber); // 电话
practitioner.setAddress(userAndPractitionerDto.getAddress()); // 地址
@@ -119,6 +122,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
practitioner.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(nickName)); // 拼音码
practitioner.setWbStr(ChineseConvertUtils.toWBFirstLetter(nickName)); // 五笔码
practitioner.setPharPracCertNo(pharPracCertNo); // 职业证件编号
practitioner.setSignature(signature); // 签名图片
practitioner.setDrProfttlCode(drProfttlCode); // 职称编码
iPractitionerService.save(practitioner);
Long practitionerId = practitioner.getId();// 参与者id
// 新增 adm_practitioner_role
@@ -276,6 +281,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
String phonenumber = userAndPractitionerDto.getPhonenumber();
String sex = userAndPractitionerDto.getSex();
String pharPracCertNo = userAndPractitionerDto.getPharPracCertNo(); // 职业证件编号
String signature = userAndPractitionerDto.getSignature(); // 签名图片
String drProfttlCode = userAndPractitionerDto.getDrProfttlCode(); // 职称编码
// 编辑 sys_user
BizUser bizUser = new BizUser();
bizUser.setNickName(nickName); // 昵称
@@ -299,7 +306,7 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
Practitioner practitioner = new Practitioner();
practitioner.setId(practitionerId);
practitioner.setName(nickName); // 姓名
practitioner.setGenderEnum(Integer.parseInt(sex)); // 性别
practitioner.setGenderEnum(sex==null? AdministrativeGender.UNKNOWN.getValue() : Integer.parseInt(sex)); // 性别
practitioner.setBirthDate(userAndPractitionerDto.getBirthDate()); // 出生日期
practitioner.setPhone(phonenumber); // 电话
practitioner.setAddress(userAndPractitionerDto.getAddress()); // 地址
@@ -312,6 +319,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
practitioner.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(nickName)); // 拼音码
practitioner.setWbStr(ChineseConvertUtils.toWBFirstLetter(nickName)); // 五笔码
practitioner.setPharPracCertNo(pharPracCertNo);// 职业证件编号
practitioner.setSignature(signature); // 签名图片
practitioner.setDrProfttlCode(drProfttlCode); // 职称编码
iPractitionerService.updateById(practitioner);
// 先删除,再新增 adm_practitioner_role
practitionerAppAppMapper.delPractitionerRole(practitionerId);

View File

@@ -99,6 +99,12 @@ public class UserAndPractitionerDto {
*/
private String pharPracCertNo;
/** 签名图片 */
private String signature;
/** 职称编码 */
private String drProfttlCode ;
/**
* 机构id
*/

View File

@@ -3,6 +3,7 @@
*/
package com.openhis.web.chargemanage.appservice.impl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -272,7 +273,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
medicationRequest.setId(null); // 药品请求id
medicationRequest
.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4)); // 药品请求编码
medicationRequest.setQuantity(dto.getQuantity() * (-1)); // 请求数量
medicationRequest.setQuantity(dto.getQuantity().multiply(new BigDecimal("-1"))); // 请求数量
medicationRequest.setUnitCode(dto.getUnitCode()); // 请求单位编码
medicationRequest.setStatusEnum(RequestStatus.CANCELLED.getValue()); // 请求状态
medicationRequest.setRefundMedicineId(dto.getRequestId()); // 退药id
@@ -298,7 +299,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
// 生成服务请求(取消服务)
serviceRequest.setId(null); // 服务请求id
serviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4)); // 服务请求编码
serviceRequest.setQuantity(dto.getQuantity() * (-1)); // 请求数量
serviceRequest.setQuantity(dto.getQuantity().multiply(new BigDecimal("-1"))); // 请求数量
serviceRequest.setUnitCode(dto.getUnitCode()); // 请求单位编码
serviceRequest.setStatusEnum(RequestStatus.CANCELLED.getValue()); // 请求状态
serviceRequest.setRefundServiceId(dto.getRequestId()); // 退药id
@@ -321,7 +322,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
// 生成耗材请求(退耗材)
deviceRequest.setId(null); // 耗材请求id
deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); // 耗材请求编码
deviceRequest.setQuantity(dto.getQuantity() * (-1)); // 请求数量
deviceRequest.setQuantity(dto.getQuantity().multiply(new BigDecimal("-1"))); // 请求数量
deviceRequest.setUnitCode(dto.getUnitCode()); // 请求单位编码
deviceRequest.setStatusEnum(RequestStatus.CANCELLED.getValue()); // 请求状态
deviceRequest.setRefundDeviceId(dto.getRequestId()); // 退药id
@@ -374,11 +375,11 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.idCard)),
request);
// 就诊患者分页列表
Page<EncounterPatientPageDto> encounterPatientPage =
outpatientRefundAppMapper.selectBilledEncounterPatientPage(new Page<>(pageNo, pageSize), queryWrapper,
ChargeItemStatus.BILLED.getValue(), ChargeItemStatus.REFUNDING.getValue(),
ChargeItemStatus.REFUNDED.getValue(), ChargeItemStatus.PART_REFUND.getValue(),
AccountType.MEDICAL_ELECTRONIC_CERTIFICATE.getCode(), EncounterClass.AMB.getValue());
Page<EncounterPatientPageDto> encounterPatientPage = outpatientRefundAppMapper.selectBilledEncounterPatientPage(
new Page<>(pageNo, pageSize), queryWrapper, ChargeItemStatus.BILLED.getValue(),
ChargeItemStatus.REFUNDING.getValue(), ChargeItemStatus.REFUNDED.getValue(),
ChargeItemStatus.PART_REFUND.getValue(), AccountType.MEDICAL_ELECTRONIC_CERTIFICATE.getCode(),
EncounterClass.AMB.getValue(), ChargeItemContext.REGISTER.getValue());
encounterPatientPage.getRecords().forEach(e -> {
// 性别枚举
@@ -387,8 +388,6 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
e.setStatusEnum_enumText(EnumUtils.getInfoByValue(ChargeItemStatus.class, e.getStatusEnum()));
// 计算年龄
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
// 合同类型枚举
e.setCategoryEnum_enumText(EnumUtils.getInfoByValue(ContractCategory.class, e.getCategoryEnum()));
});
return R.ok(encounterPatientPage);
}

View File

@@ -2,15 +2,12 @@ package com.openhis.web.chargemanage.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.EncounterLocationStatus;
import com.openhis.common.enums.EncounterActivityStatus;
import com.openhis.common.enums.LocationForm;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 就诊位置 表单数据
*/
@@ -39,7 +36,7 @@ public class EncounterLocationFormData {
* 设置默认值
*/
public EncounterLocationFormData() {
this.statusEnum = EncounterLocationStatus.PLANNED.getValue();
this.statusEnum = EncounterActivityStatus.PLANNED.getValue();
this.formEnum = LocationForm.ROOM.getValue();
}

View File

@@ -79,13 +79,6 @@ public class EncounterPatientPageDto {
*/
private Date birthDate;
/**
* 账户类型编码
*/
@Dict(dictCode = "account_code")
private String typeCode;
private String typeCode_dictText;
/**
* 账户余额
*/
@@ -120,10 +113,6 @@ public class EncounterPatientPageDto {
*/
private BigDecimal totalAmount;
/** 合同类型 */
private Integer categoryEnum;
private String categoryEnum_enumText;
/**
* 结算时间
*/
@@ -135,4 +124,9 @@ public class EncounterPatientPageDto {
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 科室名称
*/
private String organizationName;
}

View File

@@ -9,6 +9,7 @@ import java.util.Date;
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;
@@ -103,4 +104,9 @@ public class EncounterPatientPrescriptionDto {
/** 服务所在表 */
private String serviceTable;
/** 服务所在表对应的id */
@JsonSerialize(using = ToStringSerializer.class)
private Long serviceId;
}

View File

@@ -42,7 +42,7 @@ public class RefundItemDto {
private String prescriptionNo;
/** 请求数量 */
private Integer quantity;
private BigDecimal quantity;
/** 请求单位编码 */
@Dict(dictCode = "unit_code")

View File

@@ -61,12 +61,14 @@ public interface OutpatientRefundAppMapper {
* @param partRefund 收费状态:部分退费
* @param insurance 账户类型:医保
* @param amb 就诊类型:门诊
* @param register 账单类型:挂号费
* @return 已结算就诊患者分页列表
*/
Page<EncounterPatientPageDto> selectBilledEncounterPatientPage(@Param("page") Page<EncounterPatientPageDto> page,
@Param(Constants.WRAPPER) QueryWrapper<EncounterPatientPageParam> queryWrapper, @Param("billed") Integer billed,
@Param("refunding") Integer refunding, @Param("refunded") Integer refunded,
@Param("partRefund") Integer partRefund, @Param("insurance") String insurance, @Param("amb") Integer amb);
@Param("partRefund") Integer partRefund, @Param("insurance") String insurance, @Param("amb") Integer amb,
@Param("register") Integer register);
/**
* 查询患者退费项目

View File

@@ -149,4 +149,21 @@ public interface ICommonService {
* @return 病区列表
*/
List<LocationDto> getPractitionerWard();
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
R<?> getPractitionerList(String searchKey);
/**
* 查询医嘱打印信息
*
* @param requestIds 请求ids
* @param isPrescription 是否为处方
* @return 医嘱打印单
*/
R<?> getAdvicePrintInfo(List<Long> requestIds, String isPrescription);
}

View File

@@ -15,10 +15,12 @@ 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.StringUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.Location;
import com.openhis.administration.domain.Organization;
import com.openhis.administration.domain.TraceNoManage;
import com.openhis.administration.mapper.TraceNoManageMapper;
import com.openhis.administration.service.ILocationService;
@@ -36,7 +38,6 @@ import com.openhis.web.common.dto.*;
import com.openhis.web.common.mapper.CommonAppMapper;
import com.openhis.workflow.domain.InventoryItem;
import com.openhis.workflow.service.IInventoryItemService;
import com.openhis.administration.domain.Organization;
/**
* app常用接口
@@ -301,7 +302,7 @@ public class CommonServiceImpl implements ICommonService {
* @return 科室列表
*/
@Override
public List<Organization> departmentList(){
public List<Organization> departmentList() {
return organizationService.getList(OrganizationType.DEPARTMENT.getValue(), null);
}
@@ -451,4 +452,43 @@ public class CommonServiceImpl implements ICommonService {
}
return locationDtoList;
}
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
@Override
public R<?> getPractitionerList(String searchKey) {
return R.ok(commonAppMapper.getPractitionerList(searchKey));
}
/**
* 查询医嘱打印信息
*
* @param requestIds 请求ids
* @param isPrescription 是否为处方
* @return 医嘱打印单
*/
@Override
public R<?> getAdvicePrintInfo(List<Long> requestIds, String isPrescription) {
AdvicePrintInfoDto advicePrintInfoDto;
if (Whether.YES.getCode().equals(isPrescription)) {
// 查询处方单
advicePrintInfoDto = commonAppMapper.selectPrescriptionPrintInfo(requestIds);
} else {
// 查询处置单
advicePrintInfoDto = commonAppMapper.selectTreatmentPrintInfo(requestIds);
}
advicePrintInfoDto
.setAge(advicePrintInfoDto.getBirthDate() != null
? AgeCalculatorUtil.getAge(advicePrintInfoDto.getBirthDate()) : "")
.setGenderEnum_enumText(
EnumUtils.getInfoByValue(AdministrativeGender.class, advicePrintInfoDto.getGenderEnum()))
.setEncounterYbClass_enumText(
EnumUtils.getInfoByValue(EncounterYbClass.class, advicePrintInfoDto.getEncounterYbClass()));
return R.ok(advicePrintInfoDto);
}
}

View File

@@ -7,6 +7,8 @@ import java.util.List;
import javax.annotation.Resource;
import com.openhis.common.enums.Whether;
import com.openhis.web.common.dto.AdvicePrintInfoDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@@ -198,4 +200,28 @@ public class CommonAppController {
public List<LocationDto> getPractitionerWard() {
return commonService.getPractitionerWard();
}
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
@GetMapping(value = "/practitioner-list")
public R<?> getPractitionerList(@RequestParam(value = "searchKey", required = false) String searchKey) {
return commonService.getPractitionerList(searchKey);
}
/**
* 查询医嘱打印信息
*
* @param requestIds 请求ids
* @param isPrescription 是否为处方
* @return 医嘱打印单
*/
@GetMapping("/advice-print")
public R<?> getAdvicePrintInfo(@RequestParam(value = "requestIds") List<Long> requestIds, String isPrescription) {
return commonService.getAdvicePrintInfo(requestIds,isPrescription);
}
}

View File

@@ -0,0 +1,95 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import java.math.BigDecimal;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 医嘱项目打印信息
*
* @author zwh
* @date 2025-09-16
*/
@Data
@Accessors(chain = true)
public class AdviceItemPrintInfoDto {
/**
* 数量
*/
private Integer quantity;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 总价
*/
private BigDecimal totalPrice;
/**
* 项目名称
*/
private String itemName;
/**
* 规格
*/
private String totalVolume;
/**
* 单次剂量
*/
private BigDecimal dose;
/**
* 用药频次
*/
@Dict(dictCode = "rate_code")
private String rateCode;
private String rateCode_dictText;
/**
* 用法
*/
@Dict(dictCode = "method_code")
private String methodCode;
private String methodCode_dictText;
/**
* 剂量单位
*/
@Dict(dictCode = "unit_code")
private String doseUnitCode;
private String doseUnitCode_dictText;
/**
* 单位
*/
@Dict(dictCode = "unit_code")
private String unitCode;
private String unitCode_dictText;
/**
* 处方号
*/
private String prescriptionNo;
/**
* 分组号
*/
private Long groupId;
/**
* 排序号
*/
private Integer sortNumber;
}

View File

@@ -0,0 +1,100 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
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;
/**
* 处方信息
*
* @author zwh
* @date 2025-09-16
*/
@Data
@Accessors(chain = true)
public class AdvicePrintInfoDto {
/** 科室 */
private String departmentName;
/** 患者姓名 */
private String patientName;
/** 电话 */
private String phone;
/**
* 就诊编码
*/
private String encounterNo;
/** 性别 */
private Integer genderEnum;
private String genderEnum_enumText;
/** 年龄 */
private String age;
/** 生日 */
private Date birthDate;
/** 开具日期 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date reqTime;
/**
* 费用性质
*/
private String contractName;
/**
* 诊断名称
*/
private String conditionName;
/**
* 开单医生
*/
private String doctorName;
/**
* 发药医生
*/
private String dispenseDoctorName;
/**
* 配药医生
*/
private String preparerDoctorName;
/**
* 收费医生
*/
private String chargeDoctorName;
/** 就诊类型 */
private Integer encounterYbClass;
private String encounterYbClass_enumText;
/**
* 单位
*/
@Dict(dictCode = "unit_code")
private String unitCode;
private String unitCode_dictText;
/**
* 医嘱项目打印列表
*/
private List<AdviceItemPrintInfoDto> adviceItemList;
}

View File

@@ -26,10 +26,6 @@ public class PerformInfoDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long requestId;
/** 医嘱项目id */
@JsonSerialize(using = ToStringSerializer.class)
private Long itemId;
/** 住院id */
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
@@ -45,20 +41,20 @@ public class PerformInfoDto {
/** 请求所在表 */
private String requestTable;
/** 执行时间列表 */
private List<String> executeTimes;
/** 执行位置 */
@JsonSerialize(using = ToStringSerializer.class)
private Long locationId;
/** 分组id */
@JsonSerialize(using = ToStringSerializer.class)
private Long groupId;
/** 执行开始时间 */
private Date exeStartTime;
/** 执行结束时间 */
private Date exeEndTime;
/** 组号 */
@JsonSerialize(using = ToStringSerializer.class)
private Long groupId;
/** 执行时间列表 */
private List<String> executeTimes;
}

View File

@@ -0,0 +1,38 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 参与者dto
*
* @author zwh
* @date 2025-04-01
*/
@Data
@Accessors(chain = true)
public class PractitionerInfoDto {
/**
* 参与者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long practitionerId;
/**
* 参与者名称
*/
private String practitionerName;
/**
* 科室名称
*/
private String organizationName;
}

View File

@@ -5,7 +5,6 @@ package com.openhis.web.common.mapper;
import java.util.List;
import com.openhis.administration.domain.TraceNoManage;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@@ -13,9 +12,8 @@ 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.common.dto.InventoryItemDto;
import com.openhis.web.common.dto.InventoryItemParam;
import com.openhis.web.common.dto.LocationInventoryDto;
import com.openhis.administration.domain.TraceNoManage;
import com.openhis.web.common.dto.*;
/**
* app常用接口 mapper
@@ -62,8 +60,32 @@ public interface CommonAppMapper {
/**
* 查询追溯码信息
*
* @param traceNo 追溯码
* @param traceNo 追溯码
* @return
*/
TraceNoManage getInfoByTraceNo(@Param("traceNo") String traceNo);
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
List<PractitionerInfoDto> getPractitionerList(@Param("searchKey") String searchKey);
/**
* 查询处方打印信息
*
* @param requestIds 请求ids
* @return 处方打印信息
*/
AdvicePrintInfoDto selectPrescriptionPrintInfo(@Param("requestIds") List<Long> requestIds);
/**
* 查询处置打印信息
*
* @param requestIds 请求ids
* @return 处置打印信息
*/
AdvicePrintInfoDto selectTreatmentPrintInfo(@Param("requestIds") List<Long> requestIds);
}

View File

@@ -6,15 +6,15 @@ package com.openhis.web.datadictionary.appservice;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.dto.DeviceManageSelParam;
import com.openhis.web.datadictionary.dto.DeviceManageUpDto;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 器材目录 service
@@ -80,4 +80,19 @@ public interface IDeviceManageAppService {
* @return
*/
R<?> editDeviceStart(@RequestBody List<Long> ids);
/**
* 导入器材目录
*
* @param file 文件
* @return 结果
*/
R<?> importData(MultipartFile file);
/**
* 获取导入模板
*
* @param response 响应
*/
void importTemplate(HttpServletResponse response);
}

View File

@@ -3,35 +3,39 @@
*/
package com.openhis.web.datadictionary.appservice.impl;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
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.core.domain.entity.SysDictData;
import com.core.common.enums.DeleteFlag;
import com.core.common.utils.*;
import com.core.common.utils.bean.BeanUtils;
import com.core.common.utils.poi.ExcelUtil;
import com.core.system.service.ISysDictTypeService;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.DeviceDefinition;
import com.openhis.administration.domain.Location;
import com.openhis.administration.domain.Supplier;
import com.openhis.administration.service.IDeviceDefinitionService;
import com.openhis.administration.service.ISupplierService;
import com.openhis.administration.service.*;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
@@ -60,6 +64,15 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
@Autowired
private IDeviceDefinitionService deviceDefinitionService;
@Autowired
IChargeItemDefinitionService chargeItemDefinitionService;
@Autowired
IChargeItemDefDetailService chargeItemDefDetailService;
@Autowired
private ILocationService locationService;
@Resource
private DeviceManageMapper deviceManageMapper;
@@ -185,11 +198,11 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
*/
@Override
public R<?> editDevice(DeviceManageUpDto deviceManageDto) {
// // 校验是否可以编辑
// boolean result = supplyRequestService.verifyAbleEdit(deviceManageDto.getId());
// if (result) {
// return R.fail("该耗材已经发生过业务,不可编辑");
// }
// 校验是否可以编辑
boolean result = supplyRequestService.verifyAbleEdit(deviceManageDto.getId());
if (result) {
return R.fail("该耗材已经发生过业务,不可编辑");
}
DeviceDefinition deviceDefinition = new DeviceDefinition();
BeanUtils.copyProperties(deviceManageDto, deviceDefinition);
// 拼音码
@@ -363,4 +376,96 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
return R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
}
/**
* 导入器材目录
*
* @param file 文件
* @return 结果
*/
@Override
public R<?> importData(MultipartFile file) {
// 读取文件
R<List<DeviceImportDto>> readResult = readExcelFile(file);
if (R.SUCCESS != readResult.getCode()) {
return readResult;
}
List<DeviceImportDto> importDtoList = readResult.getData();
// 导入信息校验
R<?> validateResult = validateImportDtoList(importDtoList);
if (R.SUCCESS != validateResult.getCode()) {
return validateResult;
}
// 查询机构ID、当前时间、位置信息供后续使用
Long orgId = SecurityUtils.getLoginUser().getOrgId();
Date now = DateUtils.getNowDate();
List<Location> locationList = locationService.list(new LambdaQueryWrapper<Location>()
.eq(Location::getDeleteFlag, DeleteFlag.NOT_DELETED.getCode()).orderByAsc(Location::getId));
Long defaultLocationId = locationList.stream().findFirst().orElse(new Location()).getId();
Map<String, List<Location>> locationNameMap =
locationList.stream().collect(Collectors.groupingBy(Location::getName));
// 创建表数据
for (DeviceImportDto importDto : importDtoList) {
}
return R.ok(null, "导入成功!");
}
/**
* 获取导入模板
*
* @param response 响应
*/
@Override
public void importTemplate(HttpServletResponse response) {
ExcelUtil<DeviceImportDto> util = new ExcelUtil<>(DeviceImportDto.class);
util.importTemplateExcel(response, "器材目录数据");
}
/**
* 读取Excel文件
*
* @param file 文件
* @return 读取结果
*/
private R<List<DeviceImportDto>> readExcelFile(MultipartFile file) {
ExcelUtil<DeviceImportDto> util = new ExcelUtil<>(DeviceImportDto.class);
List<DeviceImportDto> importDtoList;
try {
importDtoList = util.importExcel(file.getInputStream());
} catch (IOException e) {
return R.fail("导入失败!文件读取异常");
}
if (importDtoList.isEmpty()) {
return R.fail("导入失败!文件不能为空");
}
return R.ok(importDtoList);
}
/**
* 导入信息校验
*
* @param importDtoList 器材目录导入数据列表
*/
private R<?> validateImportDtoList(List<DeviceImportDto> importDtoList) {
// 字段校验(必填及数值类型)
// 重复校验(文件行重复)
// 重复校验(文件与数据库重复)
return R.ok();
}
/**
* 创建器材定义实体
*
* @param importDto 器材目录导入Dto
* @return 器材定义实体
*/
private DeviceDefinition createDeviceDefinitionEntity(DeviceImportDto importDto) {
return null;
}
}

View File

@@ -110,15 +110,15 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
.collect(Collectors.toList());
diagnosisTreatmentInitDto.setDiagnosisCategoryOptions(diagnosisCategories);
// 查询医疗服务项类型
List<SysDictData> medical_service_items =
iSysDictTypeService.selectDictDataByType(ActivityDefCategory.MEDICAL_SERVICE_ITEM.getCode());
// 获取医疗服务项List
List<DiagnosisTreatmentInitDto.diseaseTreatmentType> diseaseTreatmentCategoryList = medical_service_items
.stream().map(status -> new DiagnosisTreatmentInitDto.diseaseTreatmentType(status.getDictValue(),
status.getDictLabel()))
.collect(Collectors.toList());
List<DiagnosisTreatmentInitDto.diseaseTreatmentCategory> diseaseTreatmentCategories = new ArrayList<>();
// // 查询医疗服务项类型
// List<SysDictData> medical_service_items =
// iSysDictTypeService.selectDictDataByType(ActivityDefCategory.MEDICAL_SERVICE_ITEM.getCode());
// // 获取医疗服务项List
// List<DiagnosisTreatmentInitDto.diseaseTreatmentType> diseaseTreatmentCategoryList = medical_service_items
// .stream().map(status -> new DiagnosisTreatmentInitDto.diseaseTreatmentType(status.getDictValue(),
// status.getDictLabel()))
// .toList();
// List<DiagnosisTreatmentInitDto.diseaseTreatmentCategory> diseaseTreatmentCategories = new ArrayList<>();
//
// //获取目录分类
// DiagnosisTreatmentInitDto.diseaseTreatmentCategory diseaseTreatmentCategory =

View File

@@ -63,13 +63,13 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
DiseaseManageInitDto diseaseManageInitDto = new DiseaseManageInitDto();
// 获取疾病目录种类
List<DiseaseManageInitDto.diseaseCategory> diseaseCategoryList = Stream.of(ConditionDefinitionSource.values())
.map(status -> new DiseaseManageInitDto.diseaseCategory(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
.map(status -> new DiseaseManageInitDto.diseaseCategory(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
diseaseManageInitDto.setDiseaseCategoryList(diseaseCategoryList);
// 获取状态
List<DiseaseManageInitDto.statusEnumOption> statusEnumOptions = Stream.of(PublicationStatus.values())
.map(status -> new DiseaseManageInitDto.statusEnumOption(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
.map(status -> new DiseaseManageInitDto.statusEnumOption(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
diseaseManageInitDto.setStatusFlagOptions(statusEnumOptions);
return R.ok(diseaseManageInitDto);
@@ -79,22 +79,22 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
* 查询病种目录分页列表
*
* @param diseaseManageSelParam 查询条件
* @param searchKey 查询条件-模糊查询
* @param pageNo 当前页码
* @param pageSize 查询条数
* @param searchKey 查询条件-模糊查询
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return
*/
public R<?> getDiseaseList(DiseaseManageSelParam diseaseManageSelParam, String searchKey, Integer pageNo,
Integer pageSize, HttpServletRequest request) {
Integer pageSize, HttpServletRequest request) {
// 构建查询条件
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(diseaseManageSelParam,
searchKey, new HashSet<>(Arrays.asList("condition_code", "name", "py_str", "wb_str")), request);
searchKey, new HashSet<>(Arrays.asList("condition_code", "name", "py_str", "wb_str")), request);
// 设置排序
queryWrapper.orderByAsc("condition_code");
// 分页查询
Page<DiseaseManageDto> diseasePage =
HisPageUtils.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, DiseaseManageDto.class);
HisPageUtils.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, DiseaseManageDto.class);
diseasePage.getRecords().forEach(e -> {
// 医保对码枚举类回显赋值
@@ -142,8 +142,8 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
// 更新病种信息
return ConditionDefinitionService.updateById(conditionDefinition)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
@@ -159,13 +159,13 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
for (Long detail : ids) {
ConditionDefinition conditionDefinition = new ConditionDefinition();
conditionDefinition.setId(detail);
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
conditionDefinition.setStatusEnum(PublicationStatus.RETIRED.getValue());
conditionDefinitionList.add(conditionDefinition);
}
// 更新病种信息
return ConditionDefinitionService.updateBatchById(conditionDefinitionList)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
@@ -186,8 +186,8 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
}
// 更新病种信息
return ConditionDefinitionService.updateBatchById(conditionDefinitionList)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
@@ -210,8 +210,8 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
// 五笔码
conditionDefinition.setWbStr(ChineseConvertUtils.toWBFirstLetter(conditionDefinition.getName()));
return ConditionDefinitionService.addDisease(conditionDefinition)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
}
}

View File

@@ -4,10 +4,8 @@
package com.openhis.web.datadictionary.appservice.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -21,19 +19,24 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
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.core.domain.entity.SysDictData;
import com.core.common.enums.DeleteFlag;
import com.core.common.utils.*;
import com.core.common.utils.bean.BeanUtils;
import com.core.common.utils.poi.ExcelUtil;
import com.core.system.service.ISysDictTypeService;
import com.openhis.administration.domain.ChargeItemDefDetail;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.Location;
import com.openhis.administration.domain.Supplier;
import com.openhis.administration.service.IChargeItemDefDetailService;
import com.openhis.administration.service.IChargeItemDefinitionService;
import com.openhis.administration.service.ILocationService;
import com.openhis.administration.service.ISupplierService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
@@ -75,6 +78,9 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
@Autowired
IChargeItemDefDetailService chargeItemDefDetailService;
@Autowired
private ILocationService locationService;
@Autowired
private MedicationManageSearchMapper medicationManageSearchMapper;
@Autowired
@@ -246,16 +252,11 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
*/
@Override
public R<?> editMedication(@Validated @RequestBody MedicationManageUpDto medicationManageUpDto) {
// // 校验是否可以编辑
// boolean result = supplyRequestService.verifyAbleEdit(medicationManageUpDto.getMedicationDefId());
// if (result) {
// return R.fail("该药品已经发生过业务,不可编辑");
// }
// boolean result = medicationDispenseService.verifyAbleEdit(medicationManageUpDto.getMedicationDefId());
// if (result) {
// return R.fail("该药品已经发生过业务,不可编辑");
// }
// 校验是否可以编辑
boolean result = supplyRequestService.verifyAbleEdit(medicationManageUpDto.getMedicationDefId());
if (result) {
return R.fail("该药品已经发生过业务,不可编辑");
}
// Todo:用Medication和medicationDefinition的domainservice来创造新的实例根据业务需求使用构造函数
// 如果小于5哥变量就用基本类型传递如果大于5哥在domain层定义构造方法的入参
@@ -472,15 +473,44 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
*/
@Override
public R<?> importData(MultipartFile file) {
ExcelUtil<MedicationImportDto> util = new ExcelUtil<>(MedicationImportDto.class);
List<MedicationImportDto> dtoList;
try {
dtoList = util.importExcel(file.getInputStream());
} catch (IOException e) {
return R.fail("文件读取失败");
// 读取文件
R<List<MedicationImportDto>> readResult = readExcelFile(file);
if (R.SUCCESS != readResult.getCode()) {
return readResult;
}
return null;
List<MedicationImportDto> importDtoList = readResult.getData();
// 导入信息校验
R<?> validateResult = validateImportDtoList(importDtoList);
if (R.SUCCESS != validateResult.getCode()) {
return validateResult;
}
// 查询机构ID、当前时间、位置信息供后续使用
Long orgId = SecurityUtils.getLoginUser().getOrgId();
Date now = DateUtils.getNowDate();
List<Location> locationList = locationService.list(new LambdaQueryWrapper<Location>()
.eq(Location::getDeleteFlag, DeleteFlag.NOT_DELETED.getCode()).orderByAsc(Location::getId));
Long defaultLocationId = locationList.stream().findFirst().orElse(new Location()).getId();
Map<String, List<Location>> locationNameMap =
locationList.stream().collect(Collectors.groupingBy(Location::getName));
// 创建表数据
for (MedicationImportDto importDto : importDtoList) {
// 药品定义表
MedicationDefinition medicationDefinition = createMedicationDefinitionEntity(importDto);
medicationDefinitionService.save(medicationDefinition);
// 药品表
Medication medication =
createMedicationEntity(importDto, medicationDefinition.getId(), defaultLocationId, locationNameMap);
medicationService.save(medication);
// 费用定价表
ChargeItemDefinition chargeItemDefinition =
createChargeItemDefinition(importDto, orgId, medicationDefinition.getId(), now);
chargeItemDefinitionService.save(chargeItemDefinition);
// 费用定价子表
List<ChargeItemDefDetail> chargeItemDefDetailList =
createChargeItemDefDetailList(importDto, chargeItemDefinition.getId());
chargeItemDefDetailService.saveBatch(chargeItemDefDetailList);
}
return R.ok(null, "导入成功!");
}
/**
@@ -494,4 +524,373 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
util.importTemplateExcel(response, "药品目录数据");
}
/**
* 读取Excel文件
*
* @param file 文件
* @return 读取结果
*/
private R<List<MedicationImportDto>> readExcelFile(MultipartFile file) {
ExcelUtil<MedicationImportDto> util = new ExcelUtil<>(MedicationImportDto.class);
List<MedicationImportDto> importDtoList;
try {
importDtoList = util.importExcel(file.getInputStream());
} catch (IOException e) {
return R.fail("导入失败!文件读取异常");
}
if (importDtoList.isEmpty()) {
return R.fail("导入失败!文件不能为空");
}
return R.ok(importDtoList);
}
/**
* 导入信息校验
*
* @param importDtoList 药品目录导入数据列表
*/
private R<?> validateImportDtoList(List<MedicationImportDto> importDtoList) {
// 字段校验(必填及数值类型)
List<String> fieldValidateMsgList = new ArrayList<>();
for (int i = 0; i < importDtoList.size(); i++) {
MedicationImportDto importDto = importDtoList.get(i);
importDto.setLineNumber(i + 2);
List<String> lineValidateMsgList = new ArrayList<>();
if (StringUtils.isEmpty(importDto.getName())) {
lineValidateMsgList.add("药品名称必填");
}
if (StringUtils.isEmpty(importDto.getCategoryCode())) {
lineValidateMsgList.add("药品分类必填");
}
if (Whether.YES.getCode().equals(importDto.getYbMatchFlag())
&& !MedCategoryCode.TRADITIONAL_CHINESE_MEDICINE.getValue().equals(importDto.getCategoryCode())
&& !MedCategoryCode.WESTERN_MEDICINE.getValue().equals(importDto.getCategoryCode())
&& !MedCategoryCode.CHINESE_HERBAL_MEDICINE.getValue().equals(importDto.getCategoryCode())) {
lineValidateMsgList.add("医保药的药品分类只能选择中成药、西药或中草药;");
}
if (StringUtils.isEmpty(importDto.getMerchandiseName())) {
lineValidateMsgList.add("商品名称必填");
}
if (StringUtils.isEmpty(importDto.getUnitCode())) {
lineValidateMsgList.add("药品单位必填");
}
if (StringUtils.isEmpty(importDto.getMinUnitCode())) {
lineValidateMsgList.add("最小单位必填");
}
if (StringUtils.isEmpty(importDto.getPartPercentStr())) {
lineValidateMsgList.add("拆零比必填");
}
BigDecimal partPercent;
try {
partPercent = new BigDecimal(importDto.getPartPercentStr());
importDto.setPartPercent(partPercent);
} catch (Exception e) {
lineValidateMsgList.add("拆零比应为数值类型");
}
if (StringUtils.isEmpty(importDto.getDoseFrom())) {
lineValidateMsgList.add("剂量形式必填");
}
if (StringUtils.isEmpty(importDto.getYbMatchFlag())) {
lineValidateMsgList.add("医保是否对码必填");
}
if (Whether.YES.getCode().equals(importDto.getYbMatchFlag()) && StringUtils.isEmpty(importDto.getYbNo())) {
lineValidateMsgList.add("医保对码时,医保编码必填");
}
if (StringUtils.isEmpty(importDto.getSkinTestFlag())) {
lineValidateMsgList.add("是否皮试必填");
}
if (StringUtils.isEmpty(importDto.getInjectFlag())) {
lineValidateMsgList.add("是否为注射药物必填");
}
if (StringUtils.isEmpty(importDto.getRestrictedFlag())) {
lineValidateMsgList.add("是否限制使用必填");
}
if (Whether.YES.getCode().equals(importDto.getRestrictedFlag())
&& StringUtils.isEmpty(importDto.getRestrictedScope())) {
lineValidateMsgList.add("限制使用时,限制使用范围必填");
}
if (StringUtils.isEmpty(importDto.getChildrenFlag())) {
lineValidateMsgList.add("儿童用药标志必填");
}
if (StringUtils.isEmpty(importDto.getPartAttributeEnum())) {
lineValidateMsgList.add("拆分属性必填");
}
if (StringUtils.isEmpty(importDto.getAntibioticFlag())) {
lineValidateMsgList.add("是否抗生素必填");
}
if (Whether.YES.getCode().equals(importDto.getAntibioticFlag())
&& StringUtils.isEmpty(importDto.getAntibioticCode())) {
lineValidateMsgList.add("为抗生素时,抗生素分类必填");
}
if (StringUtils.isEmpty(importDto.getSelfFlag())) {
lineValidateMsgList.add("是否自制必填");
}
if (StringUtils.isEmpty(importDto.getBasicFlag())) {
lineValidateMsgList.add("基药标识必填");
}
if (StringUtils.isEmpty(importDto.getManufacturerText())) {
lineValidateMsgList.add("生产厂商文本必填");
}
if (StringUtils.isEmpty(importDto.getThoPartAttributeEnum())) {
lineValidateMsgList.add("住院临时医嘱拆分属性必填");
}
if (StringUtils.isEmpty(importDto.getUnitConversionRatioStr())) {
lineValidateMsgList.add("剂量单位换算比必填");
}
BigDecimal unitConversionRatio;
try {
unitConversionRatio = new BigDecimal(importDto.getUnitConversionRatioStr());
importDto.setUnitConversionRatio(unitConversionRatio);
} catch (Exception e) {
lineValidateMsgList.add("剂量单位换算比应为数值类型");
}
if (StringUtils.isEmpty(importDto.getChrgitmLv())) {
lineValidateMsgList.add("医保等级必填");
}
if (StringUtils.isEmpty(importDto.getRxFlag())) {
lineValidateMsgList.add("处方标志必填");
}
if (StringUtils.isEmpty(importDto.getItemMinQuantityStr())) {
lineValidateMsgList.add("最小库存警戒数量(常规单位)必填");
}
BigDecimal itemMinQuantity;
try {
itemMinQuantity = new BigDecimal(importDto.getItemMinQuantityStr());
importDto.setItemMinQuantity(itemMinQuantity);
} catch (Exception e) {
lineValidateMsgList.add("最小库存警戒数量(常规单位)应为数值类型");
}
if (StringUtils.isEmpty(importDto.getItemMaxQuantityStr())) {
lineValidateMsgList.add("最大库存警戒数量(常规单位)必填");
}
BigDecimal itemMaxQuantity;
try {
itemMaxQuantity = new BigDecimal(importDto.getItemMaxQuantityStr());
importDto.setItemMaxQuantity(itemMaxQuantity);
} catch (Exception e) {
lineValidateMsgList.add("最大库存警戒数量(常规单位)应为数值类型");
}
if (StringUtils.isEmpty(importDto.getLocationName())) {
lineValidateMsgList.add("所在位置名称必填");
}
if (StringUtils.isEmpty(importDto.getTotalVolume())) {
lineValidateMsgList.add("规格必填");
}
if (StringUtils.isNotEmpty(importDto.getDoseStr())) {
BigDecimal dose;
try {
dose = new BigDecimal(importDto.getDoseStr());
importDto.setDose(dose);
} catch (Exception e) {
lineValidateMsgList.add("单次剂量应为数值类型");
}
}
if (StringUtils.isNotEmpty(importDto.getMaxUnitStr())) {
BigDecimal maxUnit;
try {
maxUnit = new BigDecimal(importDto.getMaxUnitStr());
importDto.setMaxUnit(maxUnit);
} catch (Exception e) {
lineValidateMsgList.add("单次最大剂量应为数值类型");
}
}
if (StringUtils.isEmpty(importDto.getTypeCode())) {
lineValidateMsgList.add("财务类别必填");
}
if (StringUtils.isEmpty(importDto.getYbType())) {
lineValidateMsgList.add("医保费用类别必填");
}
if (StringUtils.isEmpty(importDto.getPurchasePriceStr())) {
lineValidateMsgList.add("购入价必填");
}
BigDecimal purchasePrice;
try {
purchasePrice = new BigDecimal(importDto.getPurchasePriceStr());
importDto.setPurchasePrice(purchasePrice);
} catch (Exception e) {
lineValidateMsgList.add("购入价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getRetailPriceStr())) {
lineValidateMsgList.add("零售价必填");
}
BigDecimal retailPrice;
try {
retailPrice = new BigDecimal(importDto.getRetailPriceStr());
importDto.setRetailPrice(retailPrice);
} catch (Exception e) {
lineValidateMsgList.add("零售价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getMaximumRetailPriceStr())) {
lineValidateMsgList.add("最高零售价必填");
}
BigDecimal maximumRetailPrice;
try {
maximumRetailPrice = new BigDecimal(importDto.getMaximumRetailPriceStr());
importDto.setMaximumRetailPrice(maximumRetailPrice);
} catch (Exception e) {
lineValidateMsgList.add("最高零售价应为数值类型");
}
if (!lineValidateMsgList.isEmpty()) {
fieldValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行:" + String.join("", lineValidateMsgList) + "");
}
}
if (!fieldValidateMsgList.isEmpty()) {
return R.fail("导入失败!药品信息填写有误:" + String.join(" ", fieldValidateMsgList));
}
// 重复校验(文件行重复)
List<String> lineRepeatedValidateMsgList = new ArrayList<>();
List<List<MedicationImportDto>> importDtoGroupList = new ArrayList<>(importDtoList.stream()
.collect(Collectors.groupingBy(e -> e.getName() + e.getManufacturerText() + e.getTotalVolume())).values());
for (List<MedicationImportDto> importDtoGroup : importDtoGroupList) {
if (importDtoGroup.size() > 1) {
lineRepeatedValidateMsgList
.add(
"■ 第"
+ importDtoGroup.stream().map(MedicationImportDto::getLineNumber).sorted()
.map(Object::toString).collect(Collectors.joining(","))
+ "行的【" + importDtoGroup.get(0).getName() + "】重复;");
}
}
if (!lineRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!文件中存在重复药品:" + String.join(" ", lineRepeatedValidateMsgList));
}
// 重复校验(文件与数据库重复)
List<String> dbRepeatedValidateMsgList = new ArrayList<>();
for (MedicationImportDto importDto : importDtoList) {
List<MedicationDefinition> medicationDefinitionList = medicationDefinitionService.list(
new LambdaQueryWrapper<MedicationDefinition>().eq(MedicationDefinition::getName, importDto.getName())
.eq(MedicationDefinition::getManufacturerText, importDto.getManufacturerText()));
if (!medicationDefinitionList.isEmpty()) {
List<Medication> medicationList =
medicationService.list(new LambdaQueryWrapper<Medication>()
.in(Medication::getMedicationDefId,
medicationDefinitionList.stream().map(MedicationDefinition::getId)
.collect(Collectors.toList()))
.eq(Medication::getTotalVolume, importDto.getTotalVolume()));
if (!medicationList.isEmpty()) {
dbRepeatedValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行的【" + importDto.getName() + "】在系统中已存在;");
}
}
}
if (!dbRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!系统中存在重复药品:" + String.join(" ", dbRepeatedValidateMsgList));
}
return R.ok();
}
/**
* 创建药品定义实体
*
* @param importDto 药品目录导入Dto
* @return 药品定义实体
*/
private MedicationDefinition createMedicationDefinitionEntity(MedicationImportDto importDto) {
MedicationDefinition medicationDefinition = new MedicationDefinition();
medicationDefinition.setName(importDto.getName())
.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.MEDICATION_NUM.getPrefix(), 10)).setDomainEnum(1)
.setVersion(importDto.getVersion()).setNameEn(importDto.getNameEn())
.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getName()))
.setWbStr(ChineseConvertUtils.toWBFirstLetter(importDto.getName()))
.setCategoryCode(importDto.getCategoryCode()).setMerchandiseName(importDto.getMerchandiseName())
.setMerchandisePyStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getMerchandiseName()))
.setMerchandiseWbStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getMerchandiseName()))
.setUnitCode(importDto.getUnitCode()).setMinUnitCode(importDto.getMinUnitCode())
.setPartPercent(importDto.getPartPercent()).setDoseFrom(tryParseInt(importDto.getDoseFrom()))
.setApprovalNumber(importDto.getApprovalNumber()).setYbMatchFlag(tryParseInt(importDto.getYbMatchFlag()))
.setYbNo(importDto.getYbNo()).setPharmacologyCategoryCode("1")
.setSkinTestFlag(tryParseInt(importDto.getSkinTestFlag()))
.setInjectFlag(tryParseInt(importDto.getInjectFlag())).setManufacturerText(importDto.getManufacturerText())
.setRestrictedFlag(tryParseInt(importDto.getRestrictedFlag()))
.setRestrictedScope(importDto.getRestrictedScope()).setActiveFlag(Whether.YES.getValue())
.setChildrenFlag(tryParseInt(importDto.getChildrenFlag()))
.setNationalDrugCode(importDto.getNationalDrugCode())
.setPartAttributeEnum(tryParseInt(importDto.getPartAttributeEnum()))
.setAntibioticCode(importDto.getAntibioticCode()).setSelfFlag(tryParseInt(importDto.getSelfFlag()))
.setAntibioticFlag(tryParseInt(importDto.getAntibioticFlag()))
.setBasicFlag(tryParseInt(importDto.getBasicFlag()))
.setThoPartAttributeEnum(tryParseInt(importDto.getThoPartAttributeEnum()))
.setUnitConversionRatio(importDto.getUnitConversionRatio())
.setChrgitmLv(tryParseInt(importDto.getChrgitmLv())).setRxFlag(tryParseInt(importDto.getRxFlag()))
.setItemMinQuantity(importDto.getItemMinQuantity()).setItemMaxQuantity(importDto.getItemMaxQuantity());
return medicationDefinition;
}
/**
* 创建药品基本实体
*
* @param importDto 药品目录导入Dto
* @param medicationDefId 药品定义ID
* @param defaultLocationId 默认位置ID
* @param locationNameMap 位置名称匹配分组Map
* @return 药品基本实体
*/
private Medication createMedicationEntity(MedicationImportDto importDto, Long medicationDefId,
Long defaultLocationId, Map<String, List<Location>> locationNameMap) {
Medication medication = new Medication();
// 根据输入的所在位置名称获取位置ID
List<Location> mapLocationList = locationNameMap.get(importDto.getLocationName());
if (mapLocationList == null || mapLocationList.isEmpty()) {
medication.setLocationId(defaultLocationId);
} else {
medication.setLocationId(mapLocationList.get(0).getId());
}
medication.setMedicationDefId(medicationDefId).setStatusEnum(PublicationStatus.ACTIVE.getValue())
.setDoseFormCode(importDto.getDoseFrom()).setTotalVolume(importDto.getTotalVolume())
.setActiveFlag(Whether.YES.getValue()).setMethodCode(importDto.getMethodCode())
.setRateCode(importDto.getRateCode()).setDose(importDto.getDose())
.setDoseUnitCode(importDto.getDoseUnitCode()).setMaxUnit(importDto.getMaxUnit());
return medication;
}
/**
* 创建费用定价实体
*
* @param importDto 药品目录导入Dto
* @return 药品基本实体
*/
private ChargeItemDefinition createChargeItemDefinition(MedicationImportDto importDto, Long orgId,
Long medicationDefId, Date effectiveStart) {
ChargeItemDefinition chargeItemDefinition = new ChargeItemDefinition();
chargeItemDefinition.setChargeName(importDto.getName()).setStatusEnum(PublicationStatus.ACTIVE.getValue())
.setOrgId(orgId).setInstanceTable(CommonConstants.TableName.MED_MEDICATION_DEFINITION)
.setInstanceId(medicationDefId).setEffectiveStart(effectiveStart).setTypeCode(importDto.getTypeCode())
.setYbType(importDto.getYbType()).setConditionFlag(Whether.YES.getValue())
.setPrice(importDto.getRetailPrice());
return chargeItemDefinition;
}
/**
* 创建费用定价子实体列表
*
* @param importDto 药品目录导入Dto
* @param chargeItemDefId 费用定价ID
* @return 费用定价子实体列表
*/
private List<ChargeItemDefDetail> createChargeItemDefDetailList(MedicationImportDto importDto,
Long chargeItemDefId) {
ChargeItemDefDetail defDetailPurchase = new ChargeItemDefDetail().setDefinitionId(chargeItemDefId)
.setConditionCode(ConditionCode.PURCHASE.getCode()).setAmount(importDto.getPurchasePrice());
ChargeItemDefDetail defDetailRetail =
new ChargeItemDefDetail().setDefinitionId(chargeItemDefId).setConditionCode(ConditionCode.UNIT.getCode())
.setConditionValue(importDto.getUnitCode()).setAmount(importDto.getRetailPrice());
ChargeItemDefDetail defDetailMaximumRetail = new ChargeItemDefDetail().setDefinitionId(chargeItemDefId)
.setConditionCode(ConditionCode.LIMIT.getCode()).setAmount(importDto.getMaximumRetailPrice());
return Arrays.asList(defDetailPurchase, defDetailRetail, defDetailMaximumRetail);
}
/**
* 尝试转化为int
*
* @param intStr int字符串
* @return int值
*/
private Integer tryParseInt(String intStr) {
try {
return Integer.parseInt(intStr);
} catch (Exception e) {
return null;
}
}
}

View File

@@ -3,10 +3,12 @@ package com.openhis.web.datadictionary.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.appservice.IDeviceManageAppService;
@@ -138,4 +140,25 @@ public class DeviceManageController {
public R<?> exportDevice(@RequestBody DeviceManageDto DeviceManageDto) {
return null;
}
/**
* 导入器材目录
*
* @param file 文件
* @return 结果
*/
@PostMapping("/import-data")
public R<?> importData(MultipartFile file) {
return deviceManageAppService.importData(file);
}
/**
* 获取导入模板
*
* @param response 响应
*/
@PostMapping("/import-template")
public void importTemplate(HttpServletResponse response) {
deviceManageAppService.importTemplate(response);
}
}

View File

@@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* 诊疗子项JSON
*/
@@ -20,6 +22,6 @@ public class ActivityChildJsonDto {
/**
* 子项请求数量
*/
private Integer childrenRequestNum;
private BigDecimal childrenRequestNum;
}

View File

@@ -0,0 +1,126 @@
package com.openhis.web.datadictionary.dto;
import java.math.BigDecimal;
import com.core.common.annotation.Excel;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 器材目录导入Dto
*
* @author GuoRui
* @date 2025-09-24
*/
@Data
@Accessors(chain = true)
public class DeviceImportDto {
/** 行号 */
private Integer lineNumber;
// ---------------------- 器材定义 adm_device_definition -------------------------------------
/** 器材名称 */
@Excel(name = "器材名称", prompt = "必填")
private String name;
/** 器材分类 */
@Excel(name = "器材分类", prompt = "必填", dictType = "device_category_code", comboReadDict = true)
private String categoryCode;
/** 包装单位 */
@Excel(name = "包装单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String unitCode;
/** 包装规格 */
@Excel(name = "包装规格", prompt = "必填")
private String size;
/** 最小库存警戒数量(常规单位) */
@Excel(name = "最小库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMinQuantityStr;
private BigDecimal itemMinQuantity;
/** 最大库存警戒数量(常规单位) */
@Excel(name = "最大库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMaxQuantityStr;
private BigDecimal itemMaxQuantity;
/** 拆零比 */
@Excel(name = "拆零比", prompt = "必填,数值类型")
private String partPercentStr;
private BigDecimal partPercent;
/** 最小使用单位 */
@Excel(name = "最小使用单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String minUnitCode;
/** 所属科室名称orgId */
@Excel(name = "所属科室名称", prompt = "必填")
private String orgName;
/** 所在位置名称locationId */
@Excel(name = "所在位置名称", prompt = "必填")
private String locationName;
/** 高值器材标志 */
@Excel(name = "高值器材标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String hvcmFlag;
/** 销售单位 */
@Excel(name = "最小使用单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String salesUnitCode;
/** 批准文号 */
@Excel(name = "批准文号")
private String approvalNumber;
/** 医保标记 */
private String ybFlag;
/** 医保编码 */
@Excel(name = "医保编码", prompt = "医保对码时必填")
private String ybNo;
/** 医药机构目录编码 */
private String ybOrgNo;
/** 医保对码标记 */
private Integer ybMatchFlag;
/** 医保等级 */
private Integer chrgitmLv;
/** 状态 */
private Integer statusEnum;
/** 生产厂家 */
private Long manufacturerId;
/** 生产厂家 */
private String manufacturerText;
/** 供应商 */
private Long supplyId;
/** 说明 */
private String description;
/** 适用范围 */
private String jurisdiction;
/** 器材版本 */
private String version;
/** 主要成分 */
private String substanceText;
/** 过敏标记 */
private Integer allergenFlag;
/** 处方标志 */
private Integer rxFlag;
}

View File

@@ -17,10 +17,13 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
public class MedicationImportDto {
/** 行号 */
private Integer lineNumber;
// ---------------------- 药品定义 med_medication_definition -------------------------------------
/** 药品名称 */
@Excel(name = "药品名称")
@Excel(name = "药品名称", prompt = "必填")
private String name;
/** 药品版本 */
@@ -32,27 +35,28 @@ public class MedicationImportDto {
private String nameEn;
/** 药品分类 */
@Excel(name = "药品分类", dictType = "med_category_code", comboReadDict = true)
@Excel(name = "药品分类", prompt = "必填", dictType = "med_category_code", comboReadDict = true)
private String categoryCode;
/** 商品名称 */
@Excel(name = "商品名称")
@Excel(name = "商品名称", prompt = "必填")
private String merchandiseName;
/** 药品单位 */
@Excel(name = "药品单位", dictType = "unit_code", comboReadDict = true)
@Excel(name = "药品单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String unitCode;
/** 最小单位 */
@Excel(name = "最小单位", dictType = "unit_code", comboReadDict = true)
@Excel(name = "最小单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String minUnitCode;
/** 拆零比 */
@Excel(name = "拆零比")
@Excel(name = "拆零比", prompt = "必填,数值类型")
private String partPercentStr;
private BigDecimal partPercent;
/** 剂量形式 */
@Excel(name = "剂量形式", dictType = "dose_from_code", comboReadDict = true)
@Excel(name = "剂量形式", prompt = "必填", dictType = "dose_form_code", comboReadDict = true)
private String doseFrom;
/** 批准文号 */
@@ -60,35 +64,31 @@ public class MedicationImportDto {
private String approvalNumber;
/** 医保是否对码 */
@Excel(name = "医保是否对码", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "医保是否对码", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String ybMatchFlag;
/** 医保编码 */
@Excel(name = "医保编码")
@Excel(name = "医保编码", prompt = "医保对码时必填")
private String ybNo;
/** 是否皮试 */
@Excel(name = "是否皮试", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否皮试", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String skinTestFlag;
/** 是否为注射药物 */
@Excel(name = "是否为注射药物", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否为注射药物", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String injectFlag;
/** 生产厂商文本 */
@Excel(name = "生产厂商文本")
private String manufacturerText;
/** 是否限制使用 */
@Excel(name = "是否限制使用", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否限制使用", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String restrictedFlag;
/** 限制使用范围 */
@Excel(name = "限制使用范围")
@Excel(name = "限制使用范围", prompt = "限制使用时必填")
private String restrictedScope;
/** 儿童用药标志 */
@Excel(name = "儿童用药标志", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "儿童用药标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String childrenFlag;
/** 贯标国家编码 */
@@ -96,56 +96,68 @@ public class MedicationImportDto {
private String nationalDrugCode;
/** 拆分属性 */
@Excel(name = "拆分属性", readConverterExp = "1=门诊按最小单位每次量向上取整,2=门诊按包装单位不可拆分,3=门诊按最小单位总量向上取整,4=门诊按包装单位每次量向上取整",
@Excel(name = "拆分属性", prompt = "必填",
readConverterExp = "1=门诊按最小单位每次量向上取整,2=门诊按包装单位不可拆分,3=门诊按最小单位总量向上取整,4=门诊按包装单位每次量向上取整",
combo = "门诊按最小单位每次量向上取整,门诊按包装单位不可拆分,门诊按最小单位总量向上取整,门诊按包装单位每次量向上取整")
private String partAttributeEnum;
/** 是否抗生素 */
@Excel(name = "是否抗生素", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否抗生素", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String antibioticFlag;
/** 抗生素分类 */
@Excel(name = "抗生素分类", dictType = "antibiotic_type_code", comboReadDict = true)
@Excel(name = "抗生素分类", prompt = "抗生素时必填", dictType = "antibiotic_type_code", comboReadDict = true)
private String antibioticCode;
/** 权限限制 */
@Excel(name = "权限限制", readConverterExp = "1=非限制使用,2=限制使用,3=特殊使用", combo = "非限制使用,限制使用,特殊使用")
private String restrictedEnum;
/** 是否自制 */
@Excel(name = "是否自制", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否自制", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String selfFlag;
/** 基药标识 */
@Excel(name = "基药标识", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "基药标识", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String basicFlag;
/** 生产厂商文本 */
@Excel(name = "生产厂商文本", prompt = "必填")
private String manufacturerText;
/** 住院临时医嘱拆分属性 */
@Excel(name = "住院临时医嘱拆分属性",
@Excel(name = "住院临时医嘱拆分属性", prompt = "必填", width = 20,
readConverterExp = "1=临时医嘱按最小单位每次量向上取整,2=临时医嘱按包装单位开立,3=临时医嘱按最小单位总量向上取整,4=临时医嘱按包装单位每次量向上取整",
combo = "临时医嘱按最小单位每次量向上取整,临时医嘱按包装单位开立,临时医嘱按最小单位总量向上取整,临时医嘱按包装单位每次量向上取整")
private String thoPartAttributeEnum;
/** 剂量单位换算比 */
@Excel(name = "剂量单位换算比")
@Excel(name = "剂量单位换算比", prompt = "必填,数值类型")
private String unitConversionRatioStr;
private BigDecimal unitConversionRatio;
/** 医保等级 */
@Excel(name = "医保等级", dictType = "chrgitm_lv", comboReadDict = true)
@Excel(name = "医保等级", prompt = "必填", dictType = "chrgitm_lv", comboReadDict = true)
private String chrgitmLv;
/** 处方标志 */
@Excel(name = "处方标志", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "处方标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String rxFlag;
/** 最小库存警戒数量(常规单位) */
@Excel(name = "最小库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMinQuantityStr;
private BigDecimal itemMinQuantity;
/** 最大库存警戒数量(常规单位) */
@Excel(name = "最大库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMaxQuantityStr;
private BigDecimal itemMaxQuantity;
// ---------------------- 药品基本信息 med_medication ----------------------------------------------
/** 所在位置名称locationId */
@Excel(name = "所在位置名称")
@Excel(name = "所在位置名称", prompt = "必填")
private String locationName;
/** 规格 */
@Excel(name = "规格")
@Excel(name = "规格", prompt = "必填")
private String totalVolume;
/** 用法 */
@@ -157,7 +169,8 @@ public class MedicationImportDto {
private String rateCode;
/** 单次剂量 */
@Excel(name = "单次剂量")
@Excel(name = "单次剂量", prompt = "数值类型")
private String doseStr;
private BigDecimal dose;
/** 剂量单位 */
@@ -165,31 +178,35 @@ public class MedicationImportDto {
private String doseUnitCode;
/** 单次最大剂量 */
@Excel(name = "单次最大剂量")
@Excel(name = "单次最大剂量", prompt = "数值类型")
private String maxUnitStr;
private BigDecimal maxUnit;
// ---------------------- 费用定价 adm_charge_item_definition ----------------------------------------------
/** 财务类别 */
@Excel(name = "财务类别", dictType = "fin_type_code", comboReadDict = true)
@Excel(name = "财务类别", prompt = "必填", dictType = "fin_type_code", comboReadDict = true)
private String typeCode;
/** 医保费用类别 */
@Excel(name = "医保费用类别", dictType = "med_chrgitm_type", comboReadDict = true)
@Excel(name = "医保费用类别", prompt = "必填", dictType = "med_chrgitm_type", comboReadDict = true)
private String ybType;
// ---------------------- 费用定价子表 adm_charge_item_def_detail ----------------------------------------------
/** 购入价 */
@Excel(name = "购入价")
@Excel(name = "购入价", prompt = "必填,数值类型")
private String purchasePriceStr;
private BigDecimal purchasePrice;
/** 零售价 */
@Excel(name = "零售价")
@Excel(name = "零售价", prompt = "必填,数值类型")
private String retailPriceStr;
private BigDecimal retailPrice;
/** 最高零售价 */
@Excel(name = "最高零售价")
@Excel(name = "最高零售价", prompt = "必填,数值类型")
private String maximumRetailPriceStr;
private BigDecimal maximumRetailPrice;
}

View File

@@ -185,11 +185,8 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
SupplyType.PURCHASE_STOCKIN.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 调用医保商品采购接口 todo 科室材料相关医保接口未对应
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
@@ -275,11 +272,9 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
}
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.PURCHASE_RETURN.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 调用医保采购退货接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
if (Whether.YES.getCode().equals(ybSwitch)) {
@@ -642,11 +637,9 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
inventoryItemService.stockIn(inventoryItemList);
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
SupplyType.PURCHASE_TRANSFERIN.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
@@ -721,11 +714,9 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
}
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.PURCHASE_TRANSFEROUT.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));

View File

@@ -4,6 +4,7 @@ import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.core.common.core.domain.R;
import com.openhis.web.doctorstation.dto.ActivityBindDeviceDto;
import com.openhis.web.doctorstation.dto.AdviceBaseDto;
import com.openhis.web.doctorstation.dto.AdviceSaveParam;
import com.openhis.web.doctorstation.dto.UpdateGroupIdParam;
@@ -31,6 +32,14 @@ public interface IDoctorStationAdviceAppService {
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
Integer pricingFlag, List<Integer> adviceTypes);
/**
* 查询诊疗绑定耗材信息
*
* @param activityId 诊疗id
* @return 诊疗绑定耗材信息
*/
ActivityBindDeviceDto getActivityBindDevice(Long activityId);
/**
* 门诊保存医嘱
*

View File

@@ -1,5 +1,6 @@
package com.openhis.web.doctorstation.appservice.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -137,6 +138,8 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 预减库存
List<AdviceInventoryDto> adviceInventory =
adviceUtils.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
// 查询取药科室配置
List<AdviceInventoryDto> medLocationConfig = doctorStationAdviceAppMapper.getMedLocationConfig(organizationId);
// 费用定价子表信息
List<AdvicePriceDto> childCharge = doctorStationAdviceAppMapper
.getChildCharge(ConditionCode.LOT_NUMBER_COST.getCode(), chargeItemDefinitionIdList);
@@ -162,9 +165,29 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
.collect(Collectors.toList());
// 库存信息
baseDto.setInventoryList(inventoryList);
// 如果有库存信息,设置默认产品批号
// 设置默认产品批号
if (!inventoryList.isEmpty()) {
baseDto.setDefaultLotNumber(inventoryList.get(0).getLotNumber());
// 库存大于0
List<AdviceInventoryDto> hasInventoryList = inventoryList.stream()
.filter(e -> e.getQuantity().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
if (!hasInventoryList.isEmpty()) {
baseDto.setDefaultLotNumber(hasInventoryList.get(0).getLotNumber());
}
}
if (!inventoryList.isEmpty() && !medLocationConfig.isEmpty()) {
// 第一步在medLocationConfig中匹配categoryCode
AdviceInventoryDto result1 = medLocationConfig.stream()
.filter(dto -> baseDto.getCategoryCode().equals(dto.getCategoryCode())).findFirst()
.orElse(null);
if (result1 != null) {
// 第二步在inventoryList中匹配locationId
AdviceInventoryDto result2 = inventoryList.stream()
.filter(dto -> result1.getLocationId().equals(dto.getLocationId())).findFirst()
.orElse(null);
if (result2 != null && result2.getLotNumber() != null) {
baseDto.setDefaultLotNumber(result2.getLotNumber());
}
}
}
unitCode = baseDto.getUnitCode();
chargeItemDefinitionId = baseDto.getChargeItemDefinitionId();
@@ -201,6 +224,43 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
return adviceBaseInfo;
}
/**
* 查询诊疗绑定耗材信息
*
* @param activityId 诊疗id
* @return 诊疗绑定耗材信息
*/
public ActivityBindDeviceDto getActivityBindDevice(Long activityId) {
ActivityBindDeviceDto activityBindDeviceDto = new ActivityBindDeviceDto();
List<ActivityBindDeviceDetailDto> activityBindDevice = doctorStationAdviceAppMapper.getActivityBindDevice(
activityId + "", PublicationStatus.ACTIVE.getValue(), CommonConstants.TableName.ADM_DEVICE_DEFINITION);
// 详细信息赋值
if (!activityBindDevice.isEmpty()) {
// 耗材id集合
List<Long> deviceIds =
activityBindDevice.stream().map(ActivityBindDeviceDetailDto::getDeviceId).collect(Collectors.toList());
// 耗材医嘱信息
List<AdviceBaseDto> deviceRecords =
this.getAdviceBaseInfo(null, null, null, deviceIds, 0L, 1, 100, Whether.NO.getValue(), List.of(1, 2, 3))
.getRecords();
Map<Long, AdviceBaseDto> adviceMap = deviceRecords.stream().collect(Collectors
.toMap(AdviceBaseDto::getAdviceDefinitionId, advice -> advice, (existing, replacement) -> existing // 如果有重复key保留第一个
));
activityBindDeviceDto.setActivityBindDeviceInfos(activityBindDevice);
for (ActivityBindDeviceDetailDto activityBindDeviceInfo : activityBindDeviceDto
.getActivityBindDeviceInfos()) {
Long deviceId = activityBindDeviceInfo.getDeviceId();
if (deviceId != null) {
AdviceBaseDto matchedAdvice = adviceMap.get(deviceId);
if (matchedAdvice != null) {
activityBindDeviceInfo.setDeviceDetailInfos(matchedAdvice);
}
}
}
}
return activityBindDeviceDto;
}
/**
* 门诊保存/签发医嘱
*
@@ -297,6 +357,18 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 删除
List<AdviceSaveDto> deleteList = medicineList.stream()
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
// 校验删除的医嘱是否已经收费
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
throw new ServiceException("已收费的项目无法删除,请刷新页面后重试");
}
}
}
}
for (AdviceSaveDto adviceSaveDto : deleteList) {
iMedicationRequestService.removeById(adviceSaveDto.getRequestId());
// 删除已经产生的药品发放信息
@@ -511,6 +583,18 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 删除
List<AdviceSaveDto> deleteList = deviceList.stream()
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
// 校验删除的医嘱是否已经收费
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
throw new ServiceException("已收费的项目无法删除,请刷新页面后重试");
}
}
}
}
for (AdviceSaveDto adviceSaveDto : deleteList) {
iDeviceRequestService.removeById(adviceSaveDto.getRequestId());
// 删除已经产生的耗材发放信息
@@ -606,8 +690,22 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 删除
List<AdviceSaveDto> deleteList = activityList.stream()
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
// 校验删除的医嘱是否已经收费
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
throw new ServiceException("已收费的项目无法删除,请刷新页面后重试");
}
}
}
}
for (AdviceSaveDto adviceSaveDto : deleteList) {
iServiceRequestService.removeById(adviceSaveDto.getRequestId());
iServiceRequestService.removeById(adviceSaveDto.getRequestId());// 删除诊疗
iServiceRequestService.remove(
new LambdaQueryWrapper<ServiceRequest>().eq(ServiceRequest::getParentId, adviceSaveDto.getRequestId()));// 删除诊疗套餐对应的子项
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.WOR_SERVICE_REQUEST,
adviceSaveDto.getRequestId());
@@ -683,6 +781,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
activityChildrenJsonParams.setEncounterId(serviceRequest.getEncounterId()); // 就诊id
activityChildrenJsonParams.setAccountId(chargeItem.getAccountId()); // 账户id
activityChildrenJsonParams.setChargeItemId(chargeItem.getId()); // 费用项id
activityChildrenJsonParams.setParentId(serviceRequest.getId());// 子项诊疗的父id
adviceUtils.handleActivityChild(childrenJson, organizationId, activityChildrenJsonParams);
}
}

View File

@@ -246,7 +246,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
Integer pricingFlag) {
adviceBaseDto.setAdviceType(1); // 医嘱类型为药品
adviceBaseDto.setCategoryCode(medCategoryCode.CHINESE_HERBAL_MEDICINE.getValue());// 中草药
adviceBaseDto.setCategoryCode(MedCategoryCode.CHINESE_HERBAL_MEDICINE.getValue());// 中草药
return iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, searchKey, locationId,
adviceDefinitionIdParamList, organizationId, pageNo, pageSize, pricingFlag, List.of(1, 2, 3));
}
@@ -320,7 +320,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
String signCode = assignSeqUtil.getSeq(AssignSeqEnum.ADVICE_SIGN.getPrefix(), 10);
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
// 中药付数
Integer chineseHerbsDoseQuantity = adviceSaveDto.getChineseHerbsDoseQuantity();
BigDecimal chineseHerbsDoseQuantity = adviceSaveDto.getChineseHerbsDoseQuantity();
medicationRequest = new MedicationRequest();
medicationRequest.setTcmFlag(Whether.YES.getValue());// 中医标识
medicationRequest.setId(adviceSaveDto.getRequestId()); // 主键id
@@ -335,7 +335,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
medicationRequest.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4));
medicationRequest.setChineseHerbsDoseQuantity(chineseHerbsDoseQuantity); // 中药付数
medicationRequest.setSufferingFlag(sufferingFlag); // 代煎标识
medicationRequest.setQuantity(adviceSaveDto.getQuantity() * chineseHerbsDoseQuantity); // 请求数量
medicationRequest.setQuantity(adviceSaveDto.getQuantity().multiply(chineseHerbsDoseQuantity)); // 请求数量
medicationRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码
medicationRequest.setLotNumber(adviceSaveDto.getLotNumber()); // 产品批号
medicationRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); // 请求类型
@@ -388,7 +388,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
chargeItem.setQuantityUnit(medicationRequest.getUnitCode()); // 单位
chargeItem.setUnitPrice(adviceSaveDto.getUnitPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(chargeItem.getQuantityValue());
BigDecimal qty = chargeItem.getQuantityValue();
chargeItem.setTotalPrice(qty.multiply(chargeItem.getUnitPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
chargeItem.setTotalPrice(adviceSaveDto.getTotalPrice()); // 总价
@@ -411,7 +411,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
iActivityDefinitionService.getAppointActivityDefinitionId(CommonConstants.BusinessName.SUFFERING_TCM);
// 签发时,生成中药代煎的账单,只生成一次
if (Whether.YES.getValue().equals(sufferingFlag) && is_sign) {
Integer quantity = 1; // 请求数量
BigDecimal quantity = new BigDecimal("1"); // 请求数量
AdviceBaseDto adviceBaseDto = new AdviceBaseDto();
adviceBaseDto.setAdviceDefinitionId(sufferingDefinitionId); // 医嘱定义id
@@ -449,7 +449,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(quantity);
BigDecimal qty = quantity;
chargeItem
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识

View File

@@ -67,7 +67,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
// 如果绑定类型是个人,objectId 存储当前登录账号id
if (BindingType.PERSONAL.getValue().equals(diagnosisBelongBindingDto.getBindingEnum())) {
diagnosisBelongBindingDto.setObjectId(SecurityUtils.getLoginUser().getUserId());
} else if (BindingType.DEFINITION.getValue().equals(diagnosisBelongBindingDto.getBindingEnum())) {
} else if (BindingType.ORGANIZATION.getValue().equals(diagnosisBelongBindingDto.getBindingEnum())) {
diagnosisBelongBindingDto.setObjectId(SecurityUtils.getLoginUser().getOrgId());
}
DiagnosisBelongBinding diagnosisBelongBinding = new DiagnosisBelongBinding();
@@ -128,7 +128,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
diagnosisBelongBindingDto, searchKey, new HashSet<>(Arrays.asList("definition_name", "object_name")), null);
IPage<DiagnosisBelongBindingDto> diagnosisBelongBindingPage =
doctorStationDiagnosisAppMapper.getDiagnosisBelongBindingPage(new Page<>(pageNo, pageSize),
BindingType.PERSONAL.getValue(), BindingType.DEFINITION.getValue(), queryWrapper);
BindingType.PERSONAL.getValue(), BindingType.ORGANIZATION.getValue(), queryWrapper);
diagnosisBelongBindingPage.getRecords().forEach(e -> {
// 诊断绑定类型
e.setBindingEnum_enumText(EnumUtils.getInfoByValue(BindingType.class, e.getBindingEnum()));
@@ -167,6 +167,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(conditionDefinition, searchKey,
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null);
queryWrapper.eq("status_enum",PublicationStatus.ACTIVE.getValue());
// 设置排序
queryWrapper.orderByDesc("update_time");
// 拼接 用于区分 西医诊断 [1] 中医诊断 [2] 的查询条件
@@ -263,7 +264,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
// 科室诊断
Long currentUserOrganizationId = SecurityUtils.getLoginUser().getOrgId();
List<ConditionDefinitionMetadata> organizationList = doctorStationDiagnosisAppMapper.getOrganizationList(
PublicationStatus.ACTIVE.getValue(), BindingType.DEFINITION.getValue(), currentUserOrganizationId);
PublicationStatus.ACTIVE.getValue(), BindingType.ORGANIZATION.getValue(), currentUserOrganizationId);
this.handleConditionDefinitionMetadata(organizationList);
conditionDefinitionBusinessClass.setOrganizationList(organizationList);
return R.ok(conditionDefinitionBusinessClass);

View File

@@ -117,7 +117,7 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
// 构建查询条件
QueryWrapper<String> queryWrapper =
HisQueryUtils.buildQueryWrapper(null, searchKey,
new HashSet<>(Arrays.asList("registered_name", "pinyin_code", "wubi_code", "approval_no")),
new HashSet<>(Arrays.asList("registered_name", "pinyin_code", "wubi_code", "approval_no","manufacturer_name")),
null);
//从yb_catalog_drug_info表中取数据
IPage<CatalogDrugInfo> medicationInfo = elepPrescriptionMapper.selectCatalogDrugInfo(new Page<>(pageNo, pageSize), queryWrapper);
@@ -456,8 +456,12 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
}
for (ElepMedicationRequest item : elepMedicationRequestList) {
// 处方状态
item.setStatusEnum(RequestStatus.ACTIVE.getValue());
if(Objects.equals(item.getStatusEnum(), RequestStatus.DRAFT.getValue())|| Objects.equals(item.getStatusEnum(), RequestStatus.ENDED.getValue())){
// 处方状态
item.setStatusEnum(RequestStatus.ACTIVE.getValue());
}else{
return R.fail("选择了不能签发的处方");
}
}
// 签发处方
boolean flg = elepMedicationRequestService.updateBatchById(elepMedicationRequestList);

View File

@@ -136,7 +136,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi
BeanUtils.copyProperties(emrTemplateDto, emrTemplate);
if (BindingType.PERSONAL.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
emrTemplate.setUserId(SecurityUtils.getLoginUser().getUserId());
} else if (BindingType.DEFINITION.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
} else if (BindingType.ORGANIZATION.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
emrTemplate.setUserId(SecurityUtils.getLoginUser().getOrgId());
} else if (BindingType.HOSPITAL.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
emrTemplate.setUserId(null);

View File

@@ -62,8 +62,8 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
// 当前登录账号ID
Long userId = SecurityUtils.getLoginUser().getUserId();
Long currentUserOrganizationId = SecurityUtils.getLoginUser().getOrgId();
// 不是待诊的情况,需要参与者账户id(接诊医生)的条件
if (!EncounterStatus.PLANNED.getValue().equals(patientInfoDto.getStatusEnum())) {
// 诊的情况,需要参与者账户id(接诊医生)的条件
if (EncounterStatus.IN_PROGRESS.getValue().equals(patientInfoDto.getStatusEnum())) {
patientInfoDto.setJzPractitionerUserId(userId);
}
// 划价时
@@ -83,7 +83,7 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
IPage<PatientInfoDto> patientInfo = doctorStationMainAppMapper.getPatientInfo(new Page<>(pageNo, pageSize),
ParticipantType.REGISTRATION_DOCTOR.getCode(), ParticipantType.ADMITTER.getCode(),
ClinicalStatus.INACTIVE.getValue(), userId, currentUserOrganizationId, pricingFlag,
EncounterStatus.PLANNED.getValue(), queryWrapper);
EncounterStatus.PLANNED.getValue(), EncounterActivityStatus.ACTIVE.getValue(), queryWrapper);
patientInfo.getRecords().forEach(e -> {
// 性别
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
@@ -108,11 +108,18 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
.set(Encounter::getReceptionTime, new Date())
.set(Encounter::getStatusEnum, EncounterStatus.IN_PROGRESS.getValue())
.set(Encounter::getSubjectStatusEnum, EncounterSubjectStatus.RECEIVING_CARE.getValue()));
// 先把之前的接诊记录更新为已完成
iEncounterParticipantService.update(new LambdaUpdateWrapper<EncounterParticipant>()
.eq(EncounterParticipant::getTypeCode, ParticipantType.ADMITTER.getCode())
.eq(EncounterParticipant::getEncounterId, encounterId)
.set(EncounterParticipant::getStatusEnum, EncounterActivityStatus.COMPLETED.getValue()));
// 插入接诊医生参与记录
EncounterParticipant encounterParticipant = new EncounterParticipant();
encounterParticipant.setEncounterId(encounterId);
encounterParticipant.setTypeCode(ParticipantType.ADMITTER.getCode());// 接诊医生
encounterParticipant.setPractitionerId(SecurityUtils.getLoginUser().getPractitionerId());
encounterParticipant.setStatusEnum(EncounterActivityStatus.ACTIVE.getValue()); // 状态
iEncounterParticipantService.save(encounterParticipant);
return update > 0 ? R.ok() : R.fail();
}

View File

@@ -45,7 +45,12 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
Long practitionerId;
if (reservationRecordDto.getPractitionerId() != null) {
practitionerId = reservationRecordDto.getPractitionerId();
} else {
practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
}
ReservationRecord reservationRecord = new ReservationRecord();
@@ -54,6 +59,7 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
reservationRecord.setChiefComplaint(reservationRecordDto.getChiefComplaint()); // 主诉
reservationRecord.setReservationTime(reservationRecordDto.getReservationTime());// 就诊预约时间
reservationRecord.setRemark(reservationRecordDto.getRemark()); // 备注
reservationRecord.setToothPosition(reservationRecordDto.getToothPosition()); // 牙位
reservationRecord.setOrgId(orgId); // 预约科室id
reservationRecord.setPractitionerId(practitionerId); // 预约医生id
iReservationRecordService.save(reservationRecord);
@@ -72,7 +78,12 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
Long practitionerId;
if (reservationRecordDto.getPractitionerId() != null) {
practitionerId = reservationRecordDto.getPractitionerId();
} else {
practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
}
ReservationRecord reservationRecord = new ReservationRecord();
@@ -82,6 +93,7 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
reservationRecord.setChiefComplaint(reservationRecordDto.getChiefComplaint()); // 主诉
reservationRecord.setReservationTime(reservationRecordDto.getReservationTime());// 就诊预约时间
reservationRecord.setRemark(reservationRecordDto.getRemark()); // 备注
reservationRecord.setToothPosition(reservationRecordDto.getToothPosition()); // 牙位
reservationRecord.setOrgId(orgId); // 预约科室id
reservationRecord.setPractitionerId(practitionerId); // 预约医生id
iReservationRecordService.updateById(reservationRecord);
@@ -114,17 +126,12 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
@Override
public IPage<ReservationRecordDto> getReservationInfo(ReservationRecordDto reservationRecordDto, String searchKey,
Integer pageNo, Integer pageSize, HttpServletRequest request) {
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 构建查询条件
QueryWrapper<ReservationRecordDto> queryWrapper = HisQueryUtils.buildQueryWrapper(reservationRecordDto,
searchKey, new HashSet<>(Arrays.asList("patient_name", "chief_complaint", "patient_tel")), request);
return reservationRecordAppMapper.getReservationInfo(new Page<>(pageNo, pageSize), orgId, practitionerId,
queryWrapper);
return reservationRecordAppMapper.getReservationInfo(new Page<>(pageNo, pageSize), queryWrapper);
}
}

View File

@@ -47,14 +47,25 @@ public class DoctorStationAdviceController {
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "locationId", required = false) Long locationId,
@RequestParam(value = "adviceDefinitionIdParamList", required = false) List<Long> adviceDefinitionIdParamList,
@RequestParam(value = "organizationId") Long organizationId,
@RequestParam(value = "adviceTypes") List<Integer> adviceTypes,
@RequestParam(value = "organizationId", defaultValue = "0") Long organizationId,
@RequestParam(value = "adviceTypes", defaultValue = "1,2,3") List<Integer> adviceTypes,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, searchKey, locationId,
adviceDefinitionIdParamList, organizationId, pageNo, pageSize, Whether.NO.getValue(), adviceTypes));
}
/**
* 查询诊疗绑定耗材信息
*
* @param activityId 诊疗id
* @return 诊疗绑定耗材信息
*/
@GetMapping(value = "/activity-bind-device-info")
public R<?> getActivityBindDevice(@RequestParam(value = "activityId") Long activityId) {
return R.ok(iDoctorStationAdviceAppService.getActivityBindDevice(activityId));
}
/**
* 门诊保存医嘱
*

View File

@@ -0,0 +1,43 @@
package com.openhis.web.doctorstation.dto;
import java.math.BigDecimal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 诊疗绑定耗材 详情dto
*/
@Data
@Accessors(chain = true)
public class ActivityBindDeviceDetailDto {
/**
* 诊疗id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long activityId;
/**
* 耗材id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long deviceId;
/** 数量 */
private BigDecimal quantity;
/**
* 单位
*/
private String unitCode;
/**
* 耗材详细信息
*/
private AdviceBaseDto deviceDetailInfos;
}

View File

@@ -0,0 +1,20 @@
package com.openhis.web.doctorstation.dto;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 诊疗绑定耗材 dto
*/
@Data
@Accessors(chain = true)
public class ActivityBindDeviceDto {
/**
* 诊疗绑定耗材详情
*/
private List<ActivityBindDeviceDetailDto> activityBindDeviceInfos;
}

View File

@@ -36,4 +36,10 @@ public class ActivityChildrenJsonParams {
@JsonSerialize(using = ToStringSerializer.class)
private Long chargeItemId;
/**
* 诊疗子项对应的上级ServiceRequestId
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;
}

View File

@@ -23,6 +23,9 @@ public class AdviceInventoryDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long itemId;
/** 目录类别 */
private String categoryCode;
/** 库存id */
@JsonSerialize(using = ToStringSerializer.class)
private Long inventoryId;

View File

@@ -70,7 +70,7 @@ public class AdviceSaveDto {
private String prescriptionNo;
/** 请求数量 */
private Integer quantity;
private BigDecimal quantity;
/** 每次发药供应天数 */
private Integer dispensePerDuration;
@@ -218,7 +218,7 @@ public class AdviceSaveDto {
/**
* 中药付数
*/
private Integer chineseHerbsDoseQuantity;
private BigDecimal chineseHerbsDoseQuantity;
/**
* 代煎标识 | 0:否 , 1:是
@@ -234,7 +234,7 @@ public class AdviceSaveDto {
* 设置默认值
*/
public AdviceSaveDto() {
this.chineseHerbsDoseQuantity = 1;
this.chineseHerbsDoseQuantity = new BigDecimal("1");
this.therapyEnum = TherapyTimeType.TEMPORARY.getValue();
this.practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
this.founderOrgId = SecurityUtils.getLoginUser().getOrgId(); // 开方人科室

View File

@@ -64,4 +64,9 @@ public class ReservationRecordDto {
*/
private String remark;
/**
* 牙位
*/
private String toothPosition;
}

View File

@@ -68,6 +68,14 @@ public interface DoctorStationAdviceAppMapper {
@Param("deviceTableName") String deviceTableName, @Param("status1") Integer status1,
@Param("status2") Integer status2);
/**
* 查询取药科室配置
*
* @param organizationId 患者挂号对应的科室id
* @return 取药科室配置
*/
List<AdviceInventoryDto> getMedLocationConfig(@Param("organizationId") Long organizationId);
/**
* 查询 费用定价子表
*
@@ -112,4 +120,15 @@ public interface DoctorStationAdviceAppMapper {
*/
List<EncounterContractDto> getEncounterContract(@Param("encounterId") Long encounterId);
/**
* 查询诊疗绑定耗材
*
* @param activityId 诊疗id
* @param status 启用状态
* @param tableName 表名
* @return 诊疗绑定耗材
*/
List<ActivityBindDeviceDetailDto> getActivityBindDevice(@Param("activityId") String activityId,
@Param("status") Integer status, @Param("tableName") String tableName);
}

View File

@@ -30,6 +30,7 @@ public interface DoctorStationMainAppMapper {
* @param currentUserOrganizationId 当前登录账号所属的科室ID
* @param pricingFlag 划价标记
* @param encounterStatus 就诊状态
* @param activityStatus 活跃状态
* @param queryWrapper 查询条件
* @return 就诊患者信息
*/
@@ -38,6 +39,7 @@ public interface DoctorStationMainAppMapper {
@Param("ClinicalStatus") Integer ClinicalStatus, @Param("userId") Long userId,
@Param("currentUserOrganizationId") Long currentUserOrganizationId, @Param("pricingFlag") Integer pricingFlag,
@Param("encounterStatus") Integer encounterStatus,
@Param("activityStatus") Integer activityStatus,
@Param(Constants.WRAPPER) QueryWrapper<PatientInfoDto> queryWrapper);
/**

View File

@@ -19,13 +19,10 @@ public interface ReservationRecordAppMapper {
* 查询 预约记录
*
* @param page 分页参数
* @param orgId 科室id
* @param practitionerId 参与者id
* @param queryWrapper 查询条件
* @return 预约记录
*/
IPage<ReservationRecordDto> getReservationInfo(@Param("page") Page<ReservationRecordDto> page,
@Param("orgId") Long orgId, @Param("practitionerId") Long practitionerId,
@Param(Constants.WRAPPER) QueryWrapper<ReservationRecordDto> queryWrapper);
}

View File

@@ -102,11 +102,10 @@ public class AdviceUtils {
matched = true;
// 检查库存是否充足
BigDecimal minUnitQuantity = saveDto.getMinUnitQuantity();
Integer chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); // 中药付数
BigDecimal chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); // 中药付数
// 中草药医嘱的情况
if (chineseHerbsDoseQuantity != null && chineseHerbsDoseQuantity > 0) {
minUnitQuantity =
minUnitQuantity.multiply(BigDecimal.valueOf(chineseHerbsDoseQuantity.longValue()));
if (chineseHerbsDoseQuantity != null && chineseHerbsDoseQuantity.compareTo(BigDecimal.ZERO) > 0) {
minUnitQuantity = minUnitQuantity.multiply(chineseHerbsDoseQuantity);
}
if (minUnitQuantity.compareTo(inventoryDto.getQuantity()) > 0) {
return saveDto.getAdviceName() + "" + inventoryDto.getLocationName() + "库存不足";
@@ -176,12 +175,12 @@ public class AdviceUtils {
AdviceBaseDto adviceBaseDto;
ServiceRequest serviceRequest;
AdviceBaseDto activityAdviceBaseDto;
Integer quantity;
BigDecimal quantity;
ChargeItem chargeItem;
DeviceRequest deviceRequest;
// 生成皮试检查对应的请求和账单;生成皮试检查这个诊疗自身的请求,以及皮试检查诊疗绑定的耗材(包括发放)
if (isSkinTest) {
quantity = 1; // 请求数量
quantity = new BigDecimal("1"); // 请求数量
// 皮试检查的诊疗定义id
Long skinTestInspectionDefinitionId = iActivityDefinitionService
.getAppointActivityDefinitionId(CommonConstants.BusinessName.SKIN_TEST_INSPECTION);
@@ -235,7 +234,7 @@ public class AdviceUtils {
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(quantity);
BigDecimal qty = quantity;
chargeItem
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
iChargeItemService.save(chargeItem);
@@ -301,7 +300,7 @@ public class AdviceUtils {
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(quantity);
BigDecimal qty = quantity;
chargeItem
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
iChargeItemService.save(chargeItem);
@@ -321,7 +320,7 @@ public class AdviceUtils {
List<ActivityDeviceDto> tmpActivityList = outpatientRegistrationAppMapper.getTmpActivityList(methodCode,
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);
for (ActivityDeviceDto activityDeviceDto : tmpActivityList) {
quantity = activityDeviceDto.getQuantity() * executeNum; // 请求数量
quantity = activityDeviceDto.getQuantity().multiply(new BigDecimal(executeNum)); // 请求数量
adviceBaseDto = new AdviceBaseDto();
adviceBaseDto.setAdviceDefinitionId(activityDeviceDto.getDevActId());
// 对应的诊疗医嘱信息
@@ -379,7 +378,7 @@ public class AdviceUtils {
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(quantity);
BigDecimal qty = quantity;
chargeItem.setTotalPrice(
qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
iChargeItemService.saveOrUpdate(chargeItem);
@@ -410,7 +409,7 @@ public class AdviceUtils {
objectMapper.readValue(childrenJson, new TypeReference<>() {});
// 创建子项的诊疗请求
Long adviceDefinitionId; // 诊疗医嘱定义ID
Integer quantity; // 子项请求数量
BigDecimal quantity; // 子项请求数量
List<ChargeItem> chargeItemList = new ArrayList<>(); // 子项账单集合
ServiceRequest serviceRequest;
ChargeItem chargeItem;
@@ -443,6 +442,7 @@ public class AdviceUtils {
serviceRequest.setEncounterId(activityChildrenJsonParams.getEncounterId()); // 就诊id
serviceRequest.setAuthoredTime(curDate); // 请求签发时间
serviceRequest.setOrgId(organizationId); // 执行科室
serviceRequest.setParentId(activityChildrenJsonParams.getParentId()); // 子项诊疗的父id
iServiceRequestService.save(serviceRequest);
@@ -471,7 +471,7 @@ public class AdviceUtils {
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(quantity);
BigDecimal qty = quantity;
chargeItem.setTotalPrice(
qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
chargeItemList.add(chargeItem);

View File

@@ -14,7 +14,7 @@ import com.openhis.administration.domain.Practitioner;
import com.openhis.administration.service.IOrganizationService;
import com.openhis.administration.service.IPatientService;
import com.openhis.administration.service.IPractitionerService;
import com.openhis.common.enums.ActivityType;
import com.openhis.common.enums.ActivityDefCategory;
import com.openhis.common.enums.ybenums.YbGender;
import com.openhis.crosssystem.dto.LisApplyDto;
import com.openhis.crosssystem.dto.LisApplyGroupDto;
@@ -93,7 +93,7 @@ public class DoctorStationSendApplyUtil {
}
// 检验发送LIS申请
if (ActivityType.PROOF.getValue().equals(activityDefinition.getTypeEnum())) {
if (ActivityDefCategory.PROOF.getCode().equals(activityDefinition.getCategoryCode())) {
// LIS性别转换
LisPatientSex lisPatientSex;
if (patient.getGenderEnum() == null) {
@@ -122,7 +122,7 @@ public class DoctorStationSendApplyUtil {
crossSystemSendApplyUtil.sendApplyToLis(lisApplyDto);
// 检查发送PACS申请
} else if (ActivityType.TEST.getValue().equals(activityDefinition.getTypeEnum())) {
} else if (ActivityDefCategory.TEST.getCode().equals(activityDefinition.getCategoryCode())) {
// PACS性别转换
PacsPatientSex pacsPatientSex;
if (patient.getGenderEnum() == null) {

View File

@@ -103,7 +103,7 @@ public class PrescriptionUtils {
BigDecimal currentTotal = BigDecimal.ZERO;
for (AdviceSaveDto medicine : medicines) {
// 计算单个药品总金额
BigDecimal medicinePrice = medicine.getUnitPrice().multiply(new BigDecimal(medicine.getQuantity()));
BigDecimal medicinePrice = medicine.getUnitPrice().multiply(medicine.getQuantity());
// 特殊处理:单药品金额超限
if (medicinePrice.compareTo(MAX_SINGLE_PRESCRIPTION_PRICE) > 0) {
// 先保存当前组(如果有药品)

View File

@@ -26,6 +26,8 @@ public interface IDocDefinitionAppService {
*/
R<?> updateDefinition(DocDefinitionDto definitionDto);
R<?> deleteDefinition(Long id);
/**
* 获取文书定义列表 树形结构
*

View File

@@ -28,7 +28,7 @@ public interface IDocRecordAppService {
/**
* 根据患者ID或就诊ID获取文书记录列表,只针对不需返回患者具体信息的列表,体温单除外,单独处理
*/
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam, Integer IsPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
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);

View File

@@ -2,8 +2,11 @@ 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.DocRecordQueryParam;
import com.openhis.web.document.dto.DocStatisticsDto;
import com.openhis.web.document.dto.DocStatisticsQueryParam;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
@@ -20,4 +23,6 @@ public interface IDocStatisticsAppService {
public R<?> queryByEncounterId(Long encounterId);
R<?> getStatisticsList(DocStatisticsQueryParam queryParam, Integer isPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
}

View File

@@ -58,6 +58,9 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
if (definitionDto.getVueRouter() == null || definitionDto.getVueRouter().trim().isEmpty()) {
return R.fail("新增文书定义失败:文书路由不能为空(或不能为空白字符)");
}
if (definitionDto.getUseRangeEnum() != null && DocUseRangeEnum.DEPT_USE.getValue().equals(definitionDto.getUseRangeEnum()) && definitionDto.getOrganizationIds() == null) {
return R.fail("新增文书定义失败:科室分配时,科室不能为空");
}
// 2. 校验"名称+版本号"唯一性(避免重复创建)
long duplicateCount = docDefinitionService.lambdaQuery()
@@ -146,7 +149,9 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
if (definitionDto.getBusNo() == null || definitionDto.getBusNo().trim().isEmpty()) {
return R.fail("修改文书定义失败:文书业务编号不能为空(或不能为空白字符)");
}
if (definitionDto.getUseRangeEnum() != null && DocUseRangeEnum.DEPT_USE.getValue().equals(definitionDto.getUseRangeEnum()) && definitionDto.getOrganizationIds() == null) {
return R.fail("修改文书定义失败:科室分配时,科室不能为空");
}
// 2. 校验文书是否存在
DocDefinition existingDoc = docDefinitionService.getById(definitionDto.getId());
if (existingDoc == null) {
@@ -193,15 +198,31 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
log.error("修改文书定义失败数据库更新异常ID={}, 业务编号={}",
definitionDto.getId(), definitionDto.getBusNo());
return R.fail("修改文书定义失败:数据库更新操作异常");
} else {
// 7. 更新科室分配(仅当使用范围为"科室级"时执行)
DocDefinitionOrganizationDto orgDto = new DocDefinitionOrganizationDto();
orgDto.setBusNo(existingDoc.getBusNo());
orgDto.setDefinitionId(existingDoc.getId());
orgDto.setOrganizationIds(definitionDto.getOrganizationIds());
// 复用科室分配服务的更新逻辑(先删后加,全量覆盖)
return docDefinitionOrganizationAppService.updateOrganization(orgDto);
}
}
// 7. 更新科室分配(仅当使用范围为"科室级"时执行)
DocDefinitionOrganizationDto orgDto = new DocDefinitionOrganizationDto();
orgDto.setBusNo(existingDoc.getBusNo());
orgDto.setDefinitionId(existingDoc.getId());
orgDto.setOrganizationIds(definitionDto.getOrganizationIds());
// 复用科室分配服务的更新逻辑(先删后加,全量覆盖)
return docDefinitionOrganizationAppService.updateOrganization(orgDto);
@Override
public R<?> deleteDefinition(Long id) {
// 1. 参数校验
if (id == null) {
return R.fail("删除文书定义失败文书ID不能为空");
}
boolean result = docDefinitionService.removeById(id);
if (result) {
log.info("删除文书定义成功ID={}", id);
return R.ok("删除文书定义成功");
} else {
log.error("删除文书定义失败数据库删除异常ID={})", id);
return R.fail("删除文书定义失败:数据库删除操作异常");
}
}
/**

View File

@@ -129,9 +129,6 @@ public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOr
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");
}
@@ -140,34 +137,38 @@ public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOr
}
// 2. 先删除原有分配关系
LambdaQueryWrapper<DocDefinitionOrganization> deleteWrapper = new LambdaQueryWrapper<>();
deleteWrapper.eq(DocDefinitionOrganization::getDefinitionId, definitionOrganizationDto.getDefinitionId())
LambdaQueryWrapper<DocDefinitionOrganization> wrapper = new LambdaQueryWrapper<>();
wrapper.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("文书科室分配更新失败:删除原有分配记录异常");
Long count = docDefinitionOrganizationService.count(wrapper);
if (count > 0) {
boolean deleteSuccess = docDefinitionOrganizationService.remove(wrapper);
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) {
if (definitionOrganizationDto.getOrganizationIds() == null || definitionOrganizationDto.getOrganizationIds().isEmpty()) {
return R.ok("文书科室分配更新成功");
} else {
log.error("文书科室分配更新失败:新增新分配记录异常文书定义ID={}, 业务编号={}",
definitionOrganizationDto.getDefinitionId(), definitionOrganizationDto.getBusNo());
return R.fail("文书科室分配更新失败:新增新分配记录异常");
// 3. 再新增新分配关系
List<DocDefinitionOrganization> newOrgList = new ArrayList<>();
for (Long orgId : definitionOrganizationDto.getOrganizationIds()) {
DocDefinitionOrganization docOrg = new DocDefinitionOrganization();
docOrg.setDefinitionId(definitionOrganizationDto.getDefinitionId());
docOrg.setBusNo(definitionOrganizationDto.getBusNo().trim());
docOrg.setOrganizationId(orgId);
newOrgList.add(docOrg);
}
boolean saveSuccess = docDefinitionOrganizationService.saveBatch(newOrgList);
if (saveSuccess) {
return R.ok("文书科室分配更新成功");
} else {
log.error("文书科室分配更新失败新增新分配记录异常文书定义ID={}, 业务编号={}",
definitionOrganizationDto.getDefinitionId(), definitionOrganizationDto.getBusNo());
return R.fail("文书科室分配更新失败:新增新分配记录异常");
}
}
}
}

View File

@@ -1,5 +1,8 @@
package com.openhis.web.document.appservice.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -19,15 +22,15 @@ 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.appservice.IDocStatisticsAppService;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionAppService;
import com.openhis.web.document.dto.*;
import com.openhis.web.document.mapper.DocRecordAppMapper;
import com.openhis.web.document.util.ConvertToDocStatistics;
import com.openhis.web.document.util.PermissionProcessor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@@ -37,6 +40,9 @@ import javax.servlet.http.HttpServletRequest;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@Slf4j
@@ -51,6 +57,12 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
private IDocDefinitionAppService docDefinitionAppService;
@Resource
private DocRecordAppMapper docRecordAppMapper;
@Resource
private IDocStatisticsDefinitionAppService docStatisticsDefinitionAppService;
@Resource
private IDocStatisticsAppService docStatisticsAppService;
@Resource
ConvertToDocStatistics convertToDocStatistics;
@Autowired
private JdbcTemplate jdbcTemplate; // 使用 JdbcTemplate 执行 SQL
@@ -198,6 +210,27 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
return "";
}
/**
* 文书统计 - 新增、编辑记录
*
* @param docRecordDto
* @return
*/
private R<?> createOrUpdateStatistics(DocRecordDto docRecordDto) {
if (docRecordDto == null) {
return R.fail("插入文书统计数据失败:原始文书记录不能为空");
}
if (docRecordDto.getContentJson() == null) {
return R.fail("插入文书统计数据失败:原始文书记录内容不能为空");
}
List<DocStatisticsDto> list = convertToDocStatistics.convertToStatisticsDtoList(docRecordDto);
if (list == null || list.isEmpty()) {
return R.fail("插入文书统计数据失败:统计数据为空");
}
return docStatisticsAppService.createOrUpdte(list);
}
/**
* 新增记录
*
@@ -213,7 +246,6 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
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());
@@ -222,6 +254,8 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
docRecord.setIsEdit(0);
boolean saveSuccess = docRecordService.save(docRecord);
if (saveSuccess) {
docRecordDto.setId(docRecord.getId());
createOrUpdateStatistics(docRecordDto);
return R.ok("新增患者文书记录成功");
} else {
return R.fail("新增患者文书记录失败");
@@ -259,7 +293,6 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
docRecord.setPatientId(docRecordDto.getPatientId());
docRecord.setRecordTime(docRecordDto.getRecordTime());
docRecord.setIsEdit(0);
// 执行修改
boolean updateSuccess = docRecordService.updateById(docRecord);
if (updateSuccess) {
@@ -268,6 +301,7 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
if (!logSuccess) {
return R.fail("修改患者文书记录成功,但插入文档操作日志失败");
}
createOrUpdateStatistics(docRecordDto);
return R.ok("修改患者文书记录成功");
} else {
return R.fail("修改患者文书记录失败");
@@ -287,19 +321,16 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
return R.fail("患者文书记录患者ID和就诊ID不能同时为空");
}
if (docRecordQueryParam.getDefinitionId() == null) {
return R.fail("患者文书记录文书类型ID不能为空");
return R.fail("患者文书记录:文书类型(定义)ID不能为空");
}
// 2. 分页查询逻辑
if (isPage != null && isPage == 1) {
QueryWrapper<DocRecord> queryWrapper = HisQueryUtils.buildQueryWrapper(
QueryWrapper<DocRecordDto> 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, "获取患者文书记录列表成功");
IPage<DocRecordDto> pageResult = docRecordAppMapper.getRecordPageListByEncounterId(
new Page<>(pageNo, pageSize), queryWrapper);
return R.ok(pageResult, "获取患者文书记录列表成功");
}
// 3. 不分页查询逻辑
else {
@@ -319,12 +350,15 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
queryWrapper.eq(DocRecord::getOrganizationId, docRecordQueryParam.getOrganizationId());
}
DocDefinitionDto docDefinitionDto = docDefinitionAppService.getDefinitionById(docRecordQueryParam.getDefinitionId());
// 实体转DTO
List<DocRecordDto> dtoList = new ArrayList<>();
List<DocRecord> recordList = docRecordService.list(queryWrapper);
for (DocRecord record : recordList) {
DocRecordDto dto = new DocRecordDto();
BeanUtils.copyProperties(record, dto);
dto.setName(docDefinitionDto!=null?docDefinitionDto.getName():"");
dto.setVersion(docDefinitionDto!=null?docDefinitionDto.getVersion():"");
dtoList.add(dto);
}
return R.ok(dtoList, "获取患者文书记录列表成功");

View File

@@ -1,16 +1,25 @@
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.core.common.utils.bean.BeanUtils;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.document.domain.DocStatistics;
import com.openhis.document.mapper.DocStatisticsMapper;
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 com.openhis.web.document.dto.DocStatisticsQueryParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
/**
@@ -22,6 +31,9 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
@Resource
private IDocStatisticsService docStatisticsService;
@Resource
private DocStatisticsMapper docStatisticsMapper;
@Override
public R<?> createOrUpdte(List<DocStatisticsDto> docStatisticsList) {
@@ -31,12 +43,13 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
//根据recordId和statisticDefinitionId判断是否存在存在则更新不存在则新增
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DocStatistics::getRecordId, docStatisticsList.get(0).getRecordId());
queryWrapper.eq(DocStatistics::getStatisticDefinitionId, docStatisticsList.get(0).getStatisticDefinitionId());
// 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());
}
List<DocStatistics> docStatisticsInsertList = new ArrayList<>();
//批量新增
for (DocStatisticsDto docStatisticsDto : docStatisticsList) {
DocStatistics docStatistics = new DocStatistics();
@@ -45,13 +58,18 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
docStatistics.setEncounterId(docStatisticsDto.getEncounterId());
docStatistics.setPatientId(docStatisticsDto.getPatientId());
docStatistics.setStatisticDefinitionCode(docStatisticsDto.getStatisticDefinitionCode());
docStatistics.setOrgnizationId(docStatisticsDto.getOrgnizationId()); //TODO: 待确定
docStatistics.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
docStatistics.setValue(docStatisticsDto.getValue());
docStatistics.setRecordingDate(docStatisticsDto.getRecordingDate());
docStatistics.setRecordingTime(docStatisticsDto.getRecordingTime());
docStatistics.setRecordTime(docStatisticsDto.getRecordTime());
docStatistics.setSource(docStatisticsDto.getSource());
docStatisticsInsertList.add(docStatistics);
}
boolean result = docStatisticsService.saveBatch(docStatisticsInsertList);
if (result) {
return R.ok();
} else {
return R.fail("新增或更新文档统计数据失败");
}
return null;
}
@Override
@@ -66,6 +84,68 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
@Override
public R<?> queryByEncounterId(Long encounterId) {
return null;
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(DocStatistics::getEncounterId, encounterId);
List<DocStatistics> docStatisticsList = docStatisticsService.list(queryWrapper);
List<DocStatisticsDto> docStatisticsDtoList = new ArrayList<>();
for (DocStatistics docStatistics : docStatisticsList) {
DocStatisticsDto docStatisticsDto = new DocStatisticsDto();
docStatisticsDto.setId(docStatistics.getId());
docStatisticsDto.setRecordId(docStatistics.getRecordId());
docStatisticsDto.setStatisticDefinitionId(docStatistics.getStatisticDefinitionId());
docStatisticsDto.setEncounterId(docStatistics.getEncounterId());
docStatisticsDto.setPatientId(docStatistics.getPatientId());
docStatisticsDto.setStatisticDefinitionCode(docStatistics.getStatisticDefinitionCode());
docStatisticsDto.setOrganizationId(docStatistics.getOrganizationId());
docStatisticsDto.setValue(docStatistics.getValue());
docStatisticsDto.setRecordTime(docStatistics.getRecordTime());
docStatisticsDto.setSource(docStatistics.getSource());
docStatisticsDtoList.add(docStatisticsDto);
}
return R.ok(docStatisticsDtoList);
}
@Override
public R<?> getStatisticsList(DocStatisticsQueryParam queryParam, Integer isPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
// 1. 分页查询逻辑
if (isPage != null && isPage == 1) {
QueryWrapper<DocStatistics> queryWrapper = HisQueryUtils.buildQueryWrapper(
queryParam, null, null, request);
// 按记录时间倒序(最新记录在前)
queryWrapper.lambda().orderByDesc(DocStatistics::getRecordTime);
Page<DocStatisticsDto> recordPage = HisPageUtils.selectPage(
docStatisticsMapper, queryWrapper, pageNo, pageSize, DocStatisticsDto.class);
return R.ok(recordPage, "获取患者文书统计数据成功");
}
//2. 不分页查询逻辑
else {
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper<>();
// 患者ID查询条件
if (queryParam.getPatientId() != null) {
queryWrapper.eq(DocStatistics::getPatientId, queryParam.getPatientId());
}
// 就诊ID查询条件修复原逻辑原代码字段匹配错误用EncounterId匹配DefinitionBusNo
if (queryParam.getEncounterId() != null) {
queryWrapper.eq(DocStatistics::getEncounterId, queryParam.getEncounterId());
}
// 科室ID查询条件修复原逻辑原代码字段匹配错误用OrganizationId匹配EncounterId
if (queryParam.getOrganizationId() != null) {
queryWrapper.eq(DocStatistics::getOrganizationId, queryParam.getOrganizationId());
}
if (queryParam.getStatisticsDefinitionCode() != null) {
queryWrapper.eq(DocStatistics::getStatisticDefinitionCode, queryParam.getStatisticsDefinitionCode());
}
// 实体转DTO
List<DocStatisticsDto> dtoList = new ArrayList<>();
List<DocStatistics> statisticsList = docStatisticsService.list(queryWrapper);
for (DocStatistics statistics : statisticsList) {
DocStatisticsDto dto = new DocStatisticsDto();
BeanUtils.copyProperties(statistics, dto);
dtoList.add(dto);
}
return R.ok(dtoList, "获取患者文书统计数据成功");
}
}
}

View File

@@ -84,6 +84,19 @@ public class DocDefinitionController {
return iDocDefinitionAppService.getDefinitionDetailById(id);
}
/**
* 获取文书定义详情
*
* @param id 文书定义ID
* @return 文书定义详情
*/
@DeleteMapping("/delete/{id}")
public R<?> deleteDefinition(@PathVariable("id") Long id) {
log.info("删除文书定义ID={}", id);
// 调用删除服务注意方法名应改为删除相关如removeById
return iDocDefinitionAppService.deleteDefinition(id);
}
/**
* 查询获取文书定义列表 树形结构
*

View File

@@ -90,11 +90,11 @@ public class DocRecordController {
*/
@GetMapping("/getRecordByEncounterIdList")
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam,
@RequestParam(value = "IsPage", defaultValue = "1") Integer IsPage,
@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);
return docRecordAppService.getRecordByEncounterIdList(docRecordQueryParam, isPage, pageNo, pageSize, searchKey, request);
}
/**

View File

@@ -1,24 +1,59 @@
package com.openhis.web.document.controller;
import com.core.common.core.domain.R;
import com.openhis.web.document.appservice.IDocRecordAppService;
import com.openhis.web.document.appservice.IDocStatisticsAppService;
import com.openhis.web.document.dto.DocStatisticsDto;
import com.openhis.web.document.dto.DocStatisticsQueryParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 文档模板-病历另存为模板使用 controller
* DocStatistics文书统计 controller
*
* @author wanghaiming
* @date 2025-08-12
*/
@RestController
@RequestMapping("/document/template")
@RequestMapping("/document/statistics")
@Slf4j
@AllArgsConstructor
public class DocStatisticsController {
private final IDocRecordAppService docRecordAppService;
private final IDocStatisticsAppService docStatisticsAppService;
@PostMapping("/createOrUpdte")
public R<?> createOrUpdte(List<DocStatisticsDto> docStatisticsList) {
return docStatisticsAppService.createOrUpdte(docStatisticsList);
}
@DeleteMapping("/delete")
public R<?> delete(List<Long> ids) {
return docStatisticsAppService.delete(ids);
}
@GetMapping("/queryByRecordId")
public R<?> queryByRecordId(Long recordId) {
return docStatisticsAppService.queryByRecordId(recordId);
}
@GetMapping("/queryByEncounterId")
public R<?> queryByEncounterId(Long encounterId) {
return docStatisticsAppService.queryByEncounterId(encounterId);
}
@GetMapping("/getStatisticsList")
R<?> getStatisticsList(DocStatisticsQueryParam queryParam,
@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 docStatisticsAppService.getStatisticsList(queryParam, isPage, pageNo, pageSize, searchKey, request);
}
}

View File

@@ -18,7 +18,7 @@ import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
/**
* DOC模板 controller
* 文书模板 controller
*
* @author wanghaiming
* @date 2025-08-12

View File

@@ -1,5 +1,7 @@
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;
@@ -12,6 +14,8 @@ public class DirectoryNode {
private String name;
private int level;
private DocDefinitionDto document;
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private List<DirectoryNode> children = new ArrayList<>();
}

View File

@@ -81,5 +81,7 @@ public class DocDefinitionDto {
* 文书权限 0-不限制 1-查看 2- 编辑
*/
private Integer pharmacistPermissionEnum;
// 关键通过contentUsing指定集合中元素的序列化器
@JsonSerialize(contentUsing = ToStringSerializer.class)
private List<Long> organizationIds;
}

View File

@@ -19,6 +19,6 @@ public class DocDefinitionOrganizationDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
private String busNo;
@JsonSerialize(using = ToStringSerializer.class)
@JsonSerialize(contentUsing = ToStringSerializer.class)
private List<Long> organizationIds;
}

View File

@@ -17,8 +17,5 @@ public class DocDefinitonParam {
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
private String name;
@JsonSerialize(using = ToStringSerializer.class)
private List<Integer> useRanges;
}

View File

@@ -53,4 +53,10 @@ public class DocRecordDto {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date recordTime;
private String createBy;
private String source;
/**
* 记录名称
*/
private String name;
private String version;
}

View File

@@ -60,7 +60,7 @@ public class DocRecordPatientDto extends DocRecordDto {
/**
* 病历名称
*/
private String docName;
private String name;
/**
* 主菜单枚举值/病历类型

View File

@@ -1,9 +1,11 @@
package com.openhis.web.document.dto;
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;
@@ -15,6 +17,7 @@ public class DocStatisticsDto {
/**
* 记录ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long recordId;
/**
* 统计项定义ID
@@ -33,19 +36,18 @@ public class DocStatisticsDto {
* 记录科室ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long orgnizationId;
private Long organizationId;
/**
* 统计值
*/
private String value;
/**
* 记录日期 yyyy-MM-dd
* 记录时间
*/
private Date recordingDate;
/**
* 记录时间 yyyy-MM-dd HH:mm:ss
*/
private Date recordingTime;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date recordTime;
/**
* 记录来源
*/

View File

@@ -0,0 +1,30 @@
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 DocStatisticsQueryParam {
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
private String statisticsDefinitionCode;
/**
* 记录时间 yyyy-MM-dd HH:mm:ss
*/
private Date recordTime;
}

View File

@@ -28,6 +28,7 @@ public class DocTemplateDto {
/**
* 文书定义ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
/**
@@ -37,10 +38,12 @@ public class DocTemplateDto {
/**
* 当useRange=1时指定机构ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 当useRange=2时指定用户ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;
/**
* 备注

View File

@@ -4,6 +4,7 @@ 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.DocRecordDto;
import com.openhis.web.document.dto.DocRecordPatientDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@@ -23,4 +24,7 @@ public interface DocRecordAppMapper {
IPage<DocRecordPatientDto> getRecordPageList(@Param("page") Page<DocRecordPatientDto> page,
@Param("primaryMenuEnumList") List<Integer> primaryMenuEnumList,
@Param(Constants.WRAPPER) QueryWrapper<DocRecordPatientDto> queryWrapper);
IPage<DocRecordDto> getRecordPageListByEncounterId(@Param("page") Page<DocRecordPatientDto> page,
@Param(Constants.WRAPPER) QueryWrapper<DocRecordDto> queryWrapper);
}

View File

@@ -0,0 +1,171 @@
package com.openhis.web.document.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.openhis.web.document.appservice.IDocStatisticsDefinitionAppService;
import com.openhis.web.document.dto.DocRecordDto;
import com.openhis.web.document.dto.DocStatisticsDefinitionDto;
import com.openhis.web.document.dto.DocStatisticsDto;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.core.framework.datasource.DynamicDataSourceContextHolder.log;
@Component
public class ConvertToDocStatistics {
@Resource
IDocStatisticsDefinitionAppService docStatisticsDefinitionAppService;
/**
* 将文档记录转换为统计DTO列表的工具方法
* 支持两种JSON结构
* 1. 简单键值对:{"目标code": 值, "recordTime": "yyyy-MM-dd HH:mm:ss"}
* 2. 嵌套Item列表{"目标code+Item": [{"目标code": 值1}, {"目标code": 值2}],"recordTime": "yyyy-MM-dd HH:mm:ss"}
* 3. 记录 Time 字段:{"目标code+Item": [{"目标code": 值1, "recordTime": "yyyy-MM-dd HH:mm:ss"}, {"目标code": 值2, "recordTime": "yyyy-MM-dd HH:mm:ss"}]}
* 4. 记录 Time 字段:{"目标code": 值, "recordTime": "yyyy-MM-dd HH:mm:ss", "目标code+Item": [{"目标code": 值1, "recordTime": "yyyy-MM-dd HH:mm:ss"}, {"目标code": 值2, "recordTime": "yyyy-MM-dd HH:mm:ss"}]}
* 日期类型使用java.util.Date
*/
public List<DocStatisticsDto> convertToStatisticsDtoList(DocRecordDto docRecordDto) {
// 初始化返回的统计DTO列表
List<DocStatisticsDto> statisticsDtoList = new ArrayList<>();
// 防御性判断:如果文档记录为空,直接返回空列表
if (docRecordDto == null) {
return statisticsDtoList;
}
// 获取JSON格式的内容字符串待解析的原始数据
String contentJson = docRecordDto.getContentJson();
// 获取系统中定义的统计项列表需要解析的目标code集合
List<DocStatisticsDefinitionDto> definitionList = docStatisticsDefinitionAppService.getList(1);
// 防御性判断:如果统计项定义为空,直接返回空列表
if (definitionList == null || definitionList.isEmpty()) {
return statisticsDtoList;
}
// 解析JSON字符串为JSONObject方便操作嵌套结构
JSONObject contentJsonObj = parseJson(contentJson);
// 如果JSON解析失败返回null直接返回空列表
if (contentJsonObj == null) {
return statisticsDtoList;
}
// 遍历每个统计项定义,解析对应的值
for (DocStatisticsDefinitionDto definition : definitionList) {
// 当前需要解析的目标字段code如"BQ"、"DrugCode"
String targetCode = definition.getCode();
// 场景1先尝试解析顶级键值对结构如{"BQ": 123}
if (contentJsonObj.containsKey(targetCode)) {
// 提取值并转换为字符串
String value = String.valueOf(contentJsonObj.get(targetCode));
Date recordTime = docRecordDto.getRecordTime();
// 创建DTO并添加到结果列表
addSingleDto(statisticsDtoList, definition, docRecordDto, value,
recordTime);
// 处理完当前统计项,继续下一个
continue;
}
// 场景2如果顶级键不存在尝试解析嵌套的Item列表
// 列表字段名规则目标code + "Item"如code=BQ → 列表字段名=BQItem
String itemListKey = targetCode + "Item";
// 从JSON中获取对应的列表
JSONArray itemArray = contentJsonObj.getJSONArray(itemListKey);
// 判断列表是否存在且不为空
if (itemArray != null && !itemArray.isEmpty()) {
// 遍历列表中的每个元素每个元素是一个JSONObject
for (int i = 0; i < itemArray.size(); i++) {
JSONObject itemObj = itemArray.getJSONObject(i);
// 检查元素是否包含目标code
if (itemObj != null && itemObj.containsKey(targetCode)) {
// 提取当前元素的目标值
String value = String.valueOf(itemObj.get(targetCode));
Date recordTime = new Date();
if (itemObj.containsKey("recordTime")) {
recordTime = itemObj.getDate("recordTime");
} else if (contentJsonObj.containsKey("recordTime")) {
recordTime = contentJsonObj.getDate("recordTime");
} else {
recordTime = docRecordDto.getRecordTime();
}
// 创建DTO并添加到结果列表
addSingleDto(statisticsDtoList, definition, docRecordDto, value,
recordTime);
}
}
// 日志提示如果列表存在但未找到匹配的code
if (statisticsDtoList.isEmpty()) {
log.warn("列表{}中未找到包含{}的元素,可能数据格式不匹配", itemListKey, targetCode);
}
} else {
// 日志提示未找到对应的Item列表或列表为空
log.error("未找到列表{}或列表为空,无法解析统计项: {}", itemListKey, targetCode);
}
}
return statisticsDtoList;
}
/**
* 工具方法解析JSON字符串为JSONObject
*
* @param jsonStr 原始JSON字符串
* @return 解析后的JSONObject失败则返回null
*/
private JSONObject parseJson(String jsonStr) {
// 如果JSON字符串为空直接返回null
if (jsonStr == null) {
return null;
}
try {
// 解析JSON字符串
return JSON.parseObject(jsonStr);
} catch (Exception e) {
// 记录解析异常日志
log.error("JSON解析失败原始字符串: {}", jsonStr, e);
return null;
}
}
/**
* 工具方法创建单个统计DTO并添加到列表
*
* @param dtoList 目标DTO列表
* @param definition 统计项定义
* @param docRecordDto 文档记录DTO
* @param value 解析出的统计值
* @param recordTime 记录时间
*/
private void addSingleDto(List<DocStatisticsDto> dtoList,
DocStatisticsDefinitionDto definition,
DocRecordDto docRecordDto,
String value,
Date recordTime) {
// 创建统计DTO对象
DocStatisticsDto dto = new DocStatisticsDto();
// 设置统计值和关联的统计项定义信息
dto.setValue(value);
dto.setStatisticDefinitionCode(definition.getCode());
dto.setStatisticDefinitionId(definition.getId());
// 设置关联的文档记录信息
dto.setRecordId(docRecordDto.getId());
dto.setEncounterId(docRecordDto.getEncounterId());
dto.setPatientId(docRecordDto.getPatientId());
dto.setOrganizationId(docRecordDto.getOrganizationId());
dto.setRecordTime(recordTime);
dto.setSource(docRecordDto.getSource());
// 将创建好的DTO添加到结果列表
dtoList.add(dto);
}
}

View File

@@ -8,6 +8,8 @@ import java.util.*;
public class DocumentDirectoryProcessor {
private static Long id;
/**
* 构建文档目录树
*
@@ -16,6 +18,7 @@ public class DocumentDirectoryProcessor {
*/
public static List<DirectoryNode> buildDocumentDirectory(List<DocDefinitionDto> documents) {
// 第一步按一级菜单分组使用LinkedHashMap保持插入顺序
id = 1L;
Map<Object, List<DocDefinitionDto>> level1Groups = new LinkedHashMap<>();
for (DocDefinitionDto doc : documents) {
Object key = doc.getPrimaryMenuEnum() != null ? doc.getPrimaryMenuEnum() : doc.getName();
@@ -58,6 +61,7 @@ public class DocumentDirectoryProcessor {
} else {
level1Node.setName(level1Key.toString());
}
level1Node.setId(id++);
level1Node.setLevel(1);
buildSubNodes(level1Node, level1Docs);
@@ -99,6 +103,7 @@ public class DocumentDirectoryProcessor {
DirectoryNode childNode = new DirectoryNode();
childNode.setName(groupKey);
childNode.setLevel(parentNode.getLevel() + 1);
childNode.setId(id++);
// 递归构建子节点
buildSubNodes(childNode, groupDocs);
@@ -127,6 +132,7 @@ public class DocumentDirectoryProcessor {
DirectoryNode node = new DirectoryNode();
node.setName(doc.getName() + " (" + doc.getVersion() + ")");
node.setLevel(3);
node.setId(id++);
node.setDocument(doc);
return node;
}

View File

@@ -77,7 +77,7 @@ public class AdvancePaymentManageAppServiceImpl implements IAdvancePaymentManage
IPage<AdvancePaymentInfoDto> advancePaymentInfo = advancePaymentManageAppMapper.getAdvancePaymentInfo(
new Page<>(pageNo, pageSize), PaymentKind.HOSPITAL_DEPOSIT.getValue(), LocationForm.WARD.getValue(),
LocationForm.HOUSE.getValue(), LocationForm.BED.getValue(), EncounterLocationStatus.ACTIVE.getValue(),
LocationForm.HOUSE.getValue(), LocationForm.BED.getValue(), EncounterActivityStatus.ACTIVE.getValue(),
ChargeItemStatus.BILLABLE.getValue(), ChargeItemStatus.BILLED.getValue(),
ChargeItemStatus.REFUNDED.getValue(), EncounterClass.IMP.getValue(),
AccountType.PERSONAL_CASH_ACCOUNT.getCode(), queryWrapper);

View File

@@ -10,6 +10,7 @@ import javax.servlet.http.HttpServletRequest;
import com.core.common.core.domain.R;
import com.openhis.web.common.dto.PerformInfoDto;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPageParam;
import com.openhis.web.inhospitalnursestation.dto.AdviceExecuteParam;
import com.openhis.web.inhospitalnursestation.dto.InpatientAdviceParam;
/**
@@ -62,10 +63,10 @@ public interface IAdviceProcessAppService {
/**
* 医嘱执行
*
* @param performInfoList 医嘱信息集合
* @param adviceExecuteParam 医嘱执行参数
* @return 操作结果
*/
R<?> adviceExecute(List<PerformInfoDto> performInfoList);
R<?> adviceExecute(AdviceExecuteParam adviceExecuteParam);
/**
* 医嘱取消执行

View File

@@ -105,7 +105,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
// 入院患者分页列表
Page<AdmissionPatientPageDto> admissionPatientPage = atdManageAppMapper.selectAdmissionPatientPage(
new Page<>(pageNo, pageSize), queryWrapper, EncounterClass.IMP.getValue(),
EncounterZyStatus.TO_BE_REGISTERED.getValue(), EncounterLocationStatus.ACTIVE.getValue(),
EncounterZyStatus.TO_BE_REGISTERED.getValue(), EncounterActivityStatus.ACTIVE.getValue(),
LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(), LocationForm.BED.getValue());
admissionPatientPage.getRecords().forEach(e -> {
// 性别枚举
@@ -138,7 +138,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
// 入院患者床位分页列表
Page<AdmissionBedPageDto> admissionBedPage =
atdManageAppMapper.selectAdmissionBadPage(new Page<>(pageNo, pageSize), queryWrapper,
EncounterLocationStatus.ACTIVE.getValue(), LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(),
EncounterActivityStatus.ACTIVE.getValue(), LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(),
LocationForm.BED.getValue(), AccountType.PERSONAL_CASH_ACCOUNT.getCode(),
LocationStatus.INACTIVE.getValue(), ChargeItemStatus.BILLABLE.getValue(),
ChargeItemStatus.BILLED.getValue(), ChargeItemStatus.REFUNDED.getValue());
@@ -167,7 +167,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
public R<?> getAdmissionPatientInfo(Long encounterId) {
// 查询住院患者详细信息
AdmissionPatientInfoDto admissionPatientInfoDto =
atdManageAppMapper.selectAdmissionPatientInfo(encounterId, EncounterLocationStatus.ACTIVE.getValue(),
atdManageAppMapper.selectAdmissionPatientInfo(encounterId, EncounterActivityStatus.ACTIVE.getValue(),
LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(), LocationForm.BED.getValue(),
ParticipantType.PRIMARY_NURSE.getCode(), ParticipantType.ATTENDING_DOCTOR.getCode(),
ParticipantType.ADMITTING_DOCTOR.getCode(), ParticipantType.CHIEF_DOCTOR.getCode());
@@ -242,7 +242,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
Date targetStartTime = null;
Optional<EncounterLocation> encounterLocationOptional =
locationList.stream().filter(x -> x.getFormEnum().equals(LocationForm.BED.getValue()))
.filter(x -> x.getStatusEnum().equals(EncounterLocationStatus.ACTIVE.getValue())).findFirst();
.filter(x -> x.getStatusEnum().equals(EncounterActivityStatus.ACTIVE.getValue())).findFirst();
if (encounterLocationOptional.isPresent()) {
EncounterLocation encounterLocation = encounterLocationOptional.get();
targetStartTime = encounterLocation.getStartTime();

View File

@@ -3,6 +3,7 @@
*/
package com.openhis.web.inhospitalnursestation.appservice.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -11,28 +12,33 @@ import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
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.AgeCalculatorUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.service.IEncounterService;
import com.openhis.clinical.service.IProcedureService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.medication.domain.MedicationDefinition;
import com.openhis.medication.domain.MedicationRequest;
import com.openhis.medication.service.IMedicationDefinitionService;
import com.openhis.medication.service.IMedicationDispenseService;
import com.openhis.medication.service.IMedicationRequestService;
import com.openhis.web.common.dto.PerformInfoDto;
import com.openhis.web.common.dto.PerformRecordDto;
import com.openhis.web.inhospitalnursestation.appservice.IAdviceProcessAppService;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPageParam;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPatientPageDto;
import com.openhis.web.inhospitalnursestation.dto.InpatientAdviceDto;
import com.openhis.web.inhospitalnursestation.dto.InpatientAdviceParam;
import com.openhis.web.inhospitalnursestation.dto.*;
import com.openhis.web.inhospitalnursestation.mapper.AdviceProcessAppMapper;
import com.openhis.web.outpatientmanage.mapper.OutpatientTreatmentAppMapper;
import com.openhis.workflow.domain.ServiceRequest;
import com.openhis.workflow.service.IServiceRequestService;
/**
@@ -62,6 +68,12 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
@Resource
private IMedicationDispenseService medicationDispenseService;
@Resource
private IEncounterService encounterService;
@Resource
private IMedicationDefinitionService medicationDefinitionService;
/**
* 住院患者分页列表
*
@@ -84,7 +96,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
Page<AdmissionPatientPageDto> admissionPatientPage =
adviceProcessAppMapper.selectInpatientPage(new Page<>(pageNo, pageSize), queryWrapper,
EncounterClass.IMP.getValue(), EncounterZyStatus.TO_BE_REGISTERED.getValue(),
EncounterZyStatus.REGISTERED.getValue(), EncounterLocationStatus.ACTIVE.getValue(),
EncounterZyStatus.REGISTERED.getValue(), EncounterActivityStatus.ACTIVE.getValue(),
LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(), LocationForm.BED.getValue());
admissionPatientPage.getRecords().forEach(e -> {
// 性别枚举
@@ -133,7 +145,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
Page<InpatientAdviceDto> inpatientAdvicePage =
adviceProcessAppMapper.selectInpatientAdvicePage(new Page<>(pageNo, pageSize), queryWrapper,
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_SERVICE_REQUEST,
RequestStatus.DRAFT.getValue(), EncounterLocationStatus.ACTIVE.getValue(), LocationForm.BED.getValue(),
RequestStatus.DRAFT.getValue(), EncounterActivityStatus.ACTIVE.getValue(), LocationForm.BED.getValue(),
ParticipantType.ADMITTING_DOCTOR.getCode(), AccountType.PERSONAL_CASH_ACCOUNT.getCode(),
ChargeItemStatus.BILLABLE.getValue(), ChargeItemStatus.BILLED.getValue(),
ChargeItemStatus.REFUNDED.getValue(), EncounterClass.IMP.getValue());
@@ -255,6 +267,20 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
// 更新服务请求状态已完成
serviceRequestService.updateCompleteRequestStatus(
serviceRequestList.stream().map(PerformInfoDto::getRequestId).toList(), practitionerId, checkDate);
List<ServiceRequest> serviceRequests = serviceRequestService
.listByIds(serviceRequestList.stream().map(PerformInfoDto::getRequestId).collect(Collectors.toList()));
for (ServiceRequest serviceRequest : serviceRequests) {
// 判断医嘱类型
if (ActivityDefCategory.TRANSFER.getValue().equals(serviceRequest.getCategoryEnum())) {
// 更新患者状态 待转科
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
EncounterZyStatus.PENDING_TRANSFER.getValue());
} else if (ActivityDefCategory.DISCHARGE.getValue().equals(serviceRequest.getCategoryEnum())) {
// 更新患者状态 待出院
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
EncounterZyStatus.AWAITING_DISCHARGE.getValue());
}
}
}
if (!medRequestList.isEmpty()) {
// 更新药品请求状态已完成
@@ -300,50 +326,80 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
/**
* 医嘱执行
*
* @param performInfoList 医嘱信息集合
* @param adviceExecuteParam 医嘱执行参数
* @return 操作结果
*/
@Override
public R<?> adviceExecute(List<PerformInfoDto> performInfoList) {
// 分别创建两个列表来存储不同类型的请求
List<PerformInfoDto> serviceRequestList = new ArrayList<>();
List<PerformInfoDto> medRequestList = new ArrayList<>();
for (PerformInfoDto item : performInfoList) {
if (CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(item.getRequestTable())) {
serviceRequestList.add(item);
} else if (CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(item.getRequestTable())) {
medRequestList.add(item);
}
public R<?> adviceExecute(AdviceExecuteParam adviceExecuteParam) {
// 医嘱集合
List<AdviceExecuteDetailParam> adviceExecuteDetailList = adviceExecuteParam.getAdviceExecuteDetailList();
// 药品
List<AdviceExecuteDetailParam> medicineList = adviceExecuteDetailList.stream()
.filter(e -> CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(e.getAdviceTable())).toList();
// 诊疗
List<AdviceExecuteDetailParam> activityList = adviceExecuteDetailList.stream()
.filter(e -> CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(e.getAdviceTable())).toList();
// -------------------------------------------整体校验药品库存
if (!medicineList.isEmpty()) {
// 药品请求id集合
List<Long> medicineRequestIdList =
medicineList.stream().map(AdviceExecuteDetailParam::getRequestId).collect(Collectors.toList());
// 药品请求集合
List<MedicationRequest> MedicationRequestList = medicationRequestService
.list(new LambdaQueryWrapper<MedicationRequest>().in(MedicationRequest::getId, medicineRequestIdList));
// 药品定义id集合
List<Long> medicationDefinitionIdList =
MedicationRequestList.stream().map(MedicationRequest::getMedicationId).collect(Collectors.toList());
// 药品定义集合
List<MedicationDefinition> medicationDefinitionList =
medicationDefinitionService.list(new LambdaQueryWrapper<MedicationDefinition>()
.in(MedicationDefinition::getId, medicationDefinitionIdList));
// 组装MedicationRequestUseExe数据结构
List<MedicationRequestUseExe> MedUseExeList = MedicationRequestList.stream().map(medicationRequest -> {
// 创建 MedicationRequestUseExe 对象,并复制 MedicationRequest 的属性
MedicationRequestUseExe useExe = new MedicationRequestUseExe();
BeanUtils.copyProperties(medicationRequest, useExe);
// 匹配 executeTimes根据 medicationRequest 的 id 在 medicineList 中查找匹配的 executeTimes
List<String> matchedExecuteTimes =
medicineList.stream().filter(medicine -> medicine.getRequestId().equals(medicationRequest.getId()))
.findFirst().map(AdviceExecuteDetailParam::getExecuteTimes).orElse(null);
useExe.setExecuteTimes(matchedExecuteTimes);
// 计算 executeTimesNumexecuteTimes 的集合大小,转换为 BigDecimal
if (matchedExecuteTimes != null) {
useExe.setExecuteTimesNum(BigDecimal.valueOf(matchedExecuteTimes.size()));
} else {
useExe.setExecuteTimesNum(BigDecimal.ZERO);
}
// 匹配 minUnitQuantity根据 medicationId 在 medicationDefinitionList 中查找匹配的药品定义
MedicationDefinition matchedDefinition = medicationDefinitionList.stream()
.filter(definition -> definition.getId().equals(medicationRequest.getMedicationId())).findFirst()
.orElse(null);
if (matchedDefinition != null) {
// 判断 minUnitCode 是否等于 unitCode
if (matchedDefinition.getMinUnitCode().equals(medicationRequest.getUnitCode())) {
useExe.setMinUnitQuantity(medicationRequest.getQuantity());
} else {
// 若不相等,则计算 quantity * partPercent
BigDecimal partPercent = matchedDefinition.getPartPercent();
if (partPercent == null) {
partPercent = BigDecimal.ONE; // 避免空指针默认设为1
}
useExe.setMinUnitQuantity(medicationRequest.getQuantity().multiply(partPercent));
}
} else {
// 若未找到匹配的药品定义,设为 null 或默认值
useExe.setMinUnitQuantity(null);
}
return useExe;
}).toList();
// -------------------------------------------处理药品执行
}
//分别处理长期/临时医嘱
// 执行项目列表(需过滤掉特殊医嘱,已经停嘱的医嘱,执行时间与出院时间/入院时间冲突的)
List<PerformInfoDto> executeList = performInfoList;
// 校验是否已经停嘱
// 校验患者是否在科,出院,死亡
// 处理药品医嘱
if (!medRequestList.isEmpty()) {
// 查询医嘱信息
List<Long> requestIdList = medRequestList.stream().map(PerformInfoDto::getRequestId).toList();
List<MedicationRequest> medicationRequestList = medicationRequestService.listByIds(requestIdList);
// 按每个药品分组校验库存
Map<Long, List<MedicationRequest>> medMap =
medicationRequestList.stream().collect(Collectors.groupingBy(MedicationRequest::getMedicationId));
for (Map.Entry<Long, List<MedicationRequest>> entry : medMap.entrySet()) {
List<MedicationRequest> medicationRequests = entry.getValue();
}
//校验库存是校验某个药在某个药房这一次执行的总数够不够,生成药品发放是按每个请求生成的
// 生成药品发放
// medicationDispenseService.handleMedicationDispense();
}
if (!serviceRequestList.isEmpty()) {
// todo:查询绑定的耗材
//生成执行记录
}
// 记录操作记录
for (PerformInfoDto execute : executeList) {
//生成账单(待结算)
}
return null;
// -------------------------------------------处理诊疗执行
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"医嘱执行"}));
}
/**

View File

@@ -9,6 +9,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.openhis.web.common.dto.PerformInfoDto;
import com.openhis.web.inhospitalnursestation.dto.AdviceExecuteParam;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
@@ -92,12 +93,12 @@ public class AdviceProcessController {
/**
* 医嘱执行
*
* @param performInfoList 医嘱信息集合
* @param adviceExecuteParam 医嘱执行参数
* @return 操作结果
*/
@PostMapping(value = "/advice-execute")
public R<?> adviceExecute(List<PerformInfoDto> performInfoList) {
return adviceProcessAppService.adviceExecute(performInfoList);
public R<?> adviceExecute(@RequestBody AdviceExecuteParam adviceExecuteParam) {
return adviceProcessAppService.adviceExecute(adviceExecuteParam);
}
/**

View File

@@ -0,0 +1,34 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.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 zwh
* @date 2025-07-28
*/
@Data
@Accessors(chain = true)
public class AdviceExecuteDetailParam {
/** 医嘱请求id */
@JsonSerialize(using = ToStringSerializer.class)
private Long requestId;
/** 医嘱请求所在表 */
private String adviceTable;
/** 执行时间点集合 */
private List<String> executeTimes;
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.dto;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 医嘱执行参数
*
* @author zwh
* @date 2025-07-28
*/
@Data
@Accessors(chain = true)
public class AdviceExecuteParam {
/**
* 医嘱执行详细参数
*/
private List<AdviceExecuteDetailParam> adviceExecuteDetailList;
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.dto;
import java.math.BigDecimal;
import java.util.List;
import com.openhis.medication.domain.MedicationRequest;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 药品请求用于执行
*
* @author zwh
* @date 2025-07-28
*/
@Data
@Accessors(chain = true)
public class MedicationRequestUseExe extends MedicationRequest {
/** 执行时间点集合 */
private List<String> executeTimes;
/**
* 执行时间点集合数量
*/
private BigDecimal executeTimesNum;
/** 请求小单位数量 */
private BigDecimal minUnitQuantity;
}

View File

@@ -214,7 +214,7 @@ public class AdmissionAppServiceImpl implements IAdmissionAppService {
EncounterLocation encounterLocation = new EncounterLocation();
encounterLocation.setLocationId(admissionUpDto.getWardLocationId()).setEncounterId(admissionUpDto.getId())
.setFormEnum(LocationForm.WARD.getValue()).setStartTime(admissionUpDto.getStartTime())
.setStatusEnum(EncounterLocationStatus.ACTIVE.getValue());
.setStatusEnum(EncounterActivityStatus.ACTIVE.getValue());
boolean encounterLocationSuccess = encounterLocationService.saveOrUpdateEncounterLocation(encounterLocation);
return encounterSuccess && updateAccountSuccess && encounterLocationSuccess;

View File

@@ -8,6 +8,7 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.openhis.common.enums.EncounterActivityStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -26,7 +27,6 @@ import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.AdministrativeGender;
import com.openhis.common.enums.EncounterClass;
import com.openhis.common.enums.EncounterLocationStatus;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
@@ -85,7 +85,7 @@ public class NursingRecordAppServiceImpl implements INursingRecordAppService {
// 分页查询,查询患者信息
IPage<NursingPageDto> NursingInfoPage = nursingRecordAppMapper.getPatientPage(new Page<>(pageNo, pageSize),
EncounterClass.IMP.getValue(), LocationForm.BED.getValue(), LocationForm.WARD.getValue(),
EncounterLocationStatus.ACTIVE.getValue(), queryWrapper);
EncounterActivityStatus.ACTIVE.getValue(), queryWrapper);
NursingInfoPage.getRecords().forEach(e -> {
// 性别枚举类回显赋值
@@ -118,7 +118,7 @@ public class NursingRecordAppServiceImpl implements INursingRecordAppService {
// 分页查询,查询患者护理记录单信息
IPage<NursingDetailDto> NursingPatientPage = nursingRecordAppMapper.getNursingPatientPage(
new Page<>(pageNo, pageSize), EncounterClass.IMP.getValue(), LocationForm.BED.getValue(),
LocationForm.WARD.getValue(), EncounterLocationStatus.ACTIVE.getValue(), queryWrapper);
LocationForm.WARD.getValue(), EncounterActivityStatus.ACTIVE.getValue(), queryWrapper);
NursingPatientPage.getRecords().forEach(e -> {
// 性别枚举类回显赋值

View File

@@ -168,7 +168,7 @@ public class PatientHomeAppServiceImpl implements IPatientHomeAppService {
// 设置物理枚举为 8:病床
.setFormEnum(LocationForm.BED.getValue())
// 状态为使用中
.setStatusEnum(EncounterLocationStatus.ACTIVE.getValue());
.setStatusEnum(EncounterActivityStatus.ACTIVE.getValue());
encounterLocationService.saveOrUpdateEncounterLocation(encounterLocation);
// 2.位置表
@@ -273,7 +273,7 @@ public class PatientHomeAppServiceImpl implements IPatientHomeAppService {
// 设置就诊ID
.setEncounterId(encounterId)
// 设置状态枚举
.setStatusEnum(EncounterLocationStatus.COMPLETED.getValue())
.setStatusEnum(EncounterActivityStatus.COMPLETED.getValue())
// 设置物理枚举为 8:病床
.setFormEnum(LocationForm.BED.getValue());
encounterLocationService.saveOrUpdateEncounterLocation(encounterLocation);

View File

@@ -3,7 +3,6 @@
*/
package com.openhis.web.inventorymanage.appservice.impl;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

View File

@@ -214,7 +214,6 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
// 返回信息
String returnMsg = null;
if (!supplyItemDetailList.isEmpty()) {
InventoryItem inventoryItemPurpose = null;
// 新增库存信息
List<SupplyItemDetailDto> supplyList = new ArrayList<>();
@@ -223,7 +222,7 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
List<InventoryItem> inventoryItemList = inventoryItemService.selectInventoryByItemId(
supplyItemDetailDto.getItemId(), supplyItemDetailDto.getLotNumber(),
supplyItemDetailDto.getPurposeLocationId(), SecurityUtils.getLoginUser().getTenantId());
InventoryItem inventoryItemPurpose = null;
if (!inventoryItemList.isEmpty()) {
inventoryItemPurpose = inventoryItemList.get(0);
}
@@ -257,11 +256,8 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
}
}
// 新增追溯码记录
boolean result = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
SupplyType.PURCHASE_INVENTORY.getValue());
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
if (!supplyList.isEmpty()) {
// 将供应项目的详细信息装配为库存项目
@@ -349,11 +345,7 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
}
}
// 处理盘点追溯码
boolean result =
traceNoAppService.updateTraceNoList(supplyItemDetailList, SupplyType.PRODUCT_STOCKTAKING.getValue());
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
traceNoAppService.updateTraceNoList(supplyItemDetailList, SupplyType.PRODUCT_STOCKTAKING.getValue());
// 医保开关
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH);
if (Whether.YES.getCode().equals(ybSwitch)) {
@@ -508,18 +500,12 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
}
// 处理出库追溯码
boolean outResult = traceNoAppService.addTraceNoManage(outList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(outList, TraceNoStatus.OUT.getValue(),
SupplyType.PRODUCT_TRANSFER.getValue());
if (!outResult) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 处理入库追溯码
boolean inResult = traceNoAppService.addTraceNoManage(inList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(inList, TraceNoStatus.IN.getValue(),
SupplyType.PRODUCT_TRANSFER.getValue());
if (!inResult) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
@@ -601,11 +587,8 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
}
}
// 处理追溯码
boolean result = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.PRODUCT_RETURN.getValue());
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 调用医保采购退货接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
if (Whether.YES.getCode().equals(ybSwitch)) {
@@ -687,11 +670,8 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
}
// 追溯码管理表数据追加
// 处理追溯码
boolean result = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.LOSS_REPORT_FORM.getValue());
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 调用医保库存变更接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
@@ -773,11 +753,8 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
}
}
// 处理追溯码
boolean result = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.ISSUE_INVENTORY.getValue());
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 返回信息
String returnMsg = null;
// 调用医保库存变更接口
@@ -866,11 +843,8 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
inventoryItemService.stockIn(inventoryItemList);
}
// 处理追溯码
boolean result = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
SupplyType.RETURN_ISSUE.getValue());
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 返回信息
String returnMsg = null;
// 调用医保库存变更接口
@@ -971,12 +945,12 @@ public class ReceiptApprovalAppServiceImpl implements IReceiptApprovalAppService
* @param now 库存变更时间
* @return 上传失败的id集合
*/
private List<String> ybInventoryIntegrated(List<SupplyItemDetailDto> supplyItemDetailList,
YbInvChgType ybInvChgType, Date now) {
public List<String> ybInventoryIntegrated(List<SupplyItemDetailDto> supplyItemDetailList, YbInvChgType ybInvChgType,
Date now) {
List<String> uploadFailedNoList = new ArrayList<>();
// 没有医保码的项目不调进销存
for (SupplyItemDetailDto supplyItemDetailDto : supplyItemDetailList) {
if (supplyItemDetailDto.getYbNo() == null) {
if (supplyItemDetailDto.getYbNo() == null || supplyItemDetailDto.getYbNo().isEmpty()) {
continue;
}
R<?> result;

View File

@@ -184,7 +184,10 @@ public class TraceNoAppServiceImpl implements ITraceNoAppService {
TraceNoManage traceNoManage;
for (SupplyItemDetailDto supplyItemDetailDto : supplyItemDetailList) {
// 使用逗号分割追溯码并转换为List
String[] traceNoList = supplyItemDetailDto.getTraceNo().split(CommonConstants.Common.COMMA);
String[] traceNoList = Arrays.stream(supplyItemDetailDto.getTraceNo().split(CommonConstants.Common.COMMA))
.filter(traceNo -> !traceNo.isEmpty()) // 过滤null和空字符串
.toArray(String[]::new); // 转换回String数组
for (String item : traceNoList) {
traceNoManage = new TraceNoManage();
// 追溯码处理
@@ -246,10 +249,14 @@ public class TraceNoAppServiceImpl implements ITraceNoAppService {
List<TraceNoManage> traceNoInfoItemList = traceNoManageMapper.getItemTraceNoInfo(
supplyItemDetailDto.getItemTable(), supplyItemDetailDto.getItemId(),
supplyItemDetailDto.getPurposeLocationId(), supplyItemDetailDto.getLotNumber());
List<String> traceNoList = traceNoInfoItemList.stream().map(TraceNoManage::getTraceNo) // 提取 traceNo
List<String> traceNoList = traceNoInfoItemList.stream()
.map(TraceNoManage::getTraceNo) // 提取traceNo
.filter(traceNo -> traceNo != null && !traceNo.isEmpty()) // 过滤null和空字符串
.toList();
// 使用逗号分割追溯码并转换为List
List<String> traceNoAddList = Arrays.asList(supplyItemDetailDto.getTraceNo().split(","));
List<String> traceNoAddList = Arrays.stream(supplyItemDetailDto.getTraceNo().split(","))
.filter(traceNo -> traceNo != null && !traceNo.isEmpty()) // 过滤null和空字符串
.toList();
Set<String> add =
traceNoAddList.stream().filter(code -> !traceNoList.contains(code)).collect(Collectors.toSet());

View File

@@ -125,20 +125,20 @@ public class LossReportFormController {
return lossReportFormAppService.withdrawApproval(busNo);
}
/**
* 报损单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/loss-receipt-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return lossReportFormAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
}
// /**
// * 报损单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/loss-receipt-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return lossReportFormAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
// }
}

View File

@@ -176,21 +176,21 @@ public class ProductStocktakingController {
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return productStocktakingAppService.getAutoDetail(locationId, time,pageNo,pageSize);
}
/**
* 盘点单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/stocktaking-receipt-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return productStocktakingAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
}
// /**
// * 盘点单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/stocktaking-receipt-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return productStocktakingAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
// }
}

View File

@@ -172,22 +172,22 @@ public class ProductTransferController {
return productTransferAppService.withdrawApproval(busNo);
}
/**
* 调拨单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param inOutFlg 调入调出flg 1:调入2调出
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/transfer-receipt-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,
@RequestParam String endTime, @RequestParam Integer inOutFlg,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return productTransferAppService.getMonthlySettlementDetail(locationId, startTime, endTime,inOutFlg, pageNo, pageSize);
}
// /**
// * 调拨单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param inOutFlg 调入调出flg 1:调入2调出
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/transfer-receipt-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,
// @RequestParam String endTime, @RequestParam Integer inOutFlg,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return productTransferAppService.getMonthlySettlementDetail(locationId, startTime, endTime,inOutFlg, pageNo, pageSize);
// }
}

View File

@@ -124,20 +124,20 @@ public class PurchaseInventoryController {
public R<?> withdrawApproval(@RequestBody String busNo) {
return purchaseInventoryAppService.withdrawApproval(busNo);
}
/**
* 采购入库单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/inventory-receipt-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return purchaseInventoryAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
}
// /**
// * 采购入库单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/inventory-receipt-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return purchaseInventoryAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
// }
}

View File

@@ -115,20 +115,20 @@ public class PurchaseReturnController {
return purchaseReturnAppService.withdrawApproval(busNo);
}
/**
* 采购退货单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/return-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return purchaseReturnAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
}
// /**
// * 采购退货单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/return-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return purchaseReturnAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
// }
}

View File

@@ -125,20 +125,20 @@ public class RequisitionIssueController {
return requisitionIssueAppService.withdrawApproval(busNo);
}
/**
* 领用出库单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/requisition-issue-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return requisitionIssueAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
}
// /**
// * 领用出库单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/requisition-issue-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return requisitionIssueAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
// }
}

View File

@@ -122,21 +122,21 @@ public class ReturnIssueController {
return returnIssueAppService.withdrawApproval(busNo);
}
/**
* 领用退库单据详情
*
* @param locationId 库房id
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 单据详情
*/
@GetMapping(value = "/return-issue-monthly-settlement")
public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return returnIssueAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
}
// /**
// * 领用退库单据详情
// *
// * @param locationId 库房id
// * @param startTime 开始时间
// * @param endTime 结束时间
// * @param pageNo 当前页码
// * @param pageSize 查询条数
// * @return 单据详情
// */
// @GetMapping(value = "/return-issue-monthly-settlement")
// public R<?> getMonthlySettlementDetail(@RequestParam Long locationId, @RequestParam String startTime,@RequestParam String endTime,
// @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
// @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// return returnIssueAppService.getMonthlySettlementDetail(locationId, startTime,endTime,pageNo,pageSize);
// }
}

View File

@@ -11,6 +11,7 @@ import javax.validation.constraints.NotNull;
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;
@@ -113,6 +114,10 @@ public class IssueDto {
/** 总价 */
private BigDecimal totalPrice;
/** 制单时间 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date occurrenceTime;
/** 备注 */
private String remake;
}

View File

@@ -38,6 +38,9 @@ public class ProductDetailsSearchParam {
/** 供应商 */
private String supplyName;
/** 停用状态 */
private Integer inventoryStatusEnum;
/** 查询flg */
private String flg;

View File

@@ -9,6 +9,7 @@ import java.util.List;
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 com.openhis.common.annotation.Dict;
@@ -147,6 +148,10 @@ public class ProductTransferDetailDto {
/** 拆零比 */
private String partPercent;
/** 制单时间 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date occurrenceTime;
/**
* 单位列表
*/

View File

@@ -61,9 +61,8 @@ public class PurchaseReturnPageDto {
/** 期望日期(制单日期) */
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(name="create_time")
private Date createTime;
@JSONField(name="occurrence_time")
private Date occurrenceTime;
/** 审批时间 */
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

View File

@@ -41,6 +41,9 @@ public class TraceNoSearchParam {
/** 操作类型 */
private Integer operationType;
/** 产品批号 */
private String lotNumber;
/** 项目类型 */
private Integer itemType;

View File

@@ -0,0 +1,19 @@
package com.openhis.web.jlau.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.jlau.dto.ReviewPrescriptionRecordsDto;
/**
* 农大审方记录 应用Service
*/
public interface IReviewPrescriptionRecordsAppService {
/**
* 审核处方
*
* @param reviewPrescriptionRecordsDto 审方记录dto
* @return 结果
*/
R<?> reviewPrescription(ReviewPrescriptionRecordsDto reviewPrescriptionRecordsDto);
}

View File

@@ -0,0 +1,95 @@
package com.openhis.web.jlau.appservice.impl;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.domain.R;
import com.core.common.exception.ServiceException;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.service.IChargeItemService;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.ChargeItemStatus;
import com.openhis.jlau.domain.ReviewPrescriptionRecords;
import com.openhis.jlau.service.IReviewPrescriptionRecordsService;
import com.openhis.web.jlau.appservice.IReviewPrescriptionRecordsAppService;
import com.openhis.web.jlau.dto.ReviewPrescriptionRecordsDto;
import com.openhis.web.jlau.mapper.ReviewPrescriptionRecordsAppMapper;
import lombok.extern.slf4j.Slf4j;
/**
* 农大审方记录 应用实现类
*/
@Slf4j
@Service
public class ReviewPrescriptionRecordsAppServiceImpl implements IReviewPrescriptionRecordsAppService {
@Resource
ReviewPrescriptionRecordsAppMapper reviewPrescriptionRecordsAppMapper;
@Resource
IChargeItemService chargeItemService;
@Resource
IReviewPrescriptionRecordsService reviewPrescriptionRecordsService;
/**
* 审核处方
*
* @param reviewPrescriptionRecordsDto 审方记录dto
* @return 结果
*/
@Override
public R<?> reviewPrescription(ReviewPrescriptionRecordsDto reviewPrescriptionRecordsDto) {
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 就诊id
Long encounterId = reviewPrescriptionRecordsDto.getEncounterId();
// 处方号
String prescriptionNo = reviewPrescriptionRecordsDto.getPrescriptionNo();
// 药品请求ids
String medRequestIds = reviewPrescriptionRecordsDto.getMedRequestIds();
if (StringUtils.isNotEmpty(medRequestIds)) {
List<Long> medRequestIdList = Arrays.stream(medRequestIds.split(",")).map(String::trim) // 去除空格
.map(Long::valueOf) // 转换为Long
.collect(Collectors.toList());
if (!medRequestIdList.isEmpty()) {
List<ChargeItem> list = chargeItemService.list(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getStatusEnum, ChargeItemStatus.BILLED.getValue())
.in(ChargeItem::getServiceId, medRequestIdList));
if (!list.isEmpty()) {
throw new ServiceException("已收费药品,无需审核");
}
}
}
// 审方id
Long reviewId = reviewPrescriptionRecordsDto.getReviewId();
// 通过标识
Integer passFlag = reviewPrescriptionRecordsDto.getPassFlag();
// 原因
String reasonText = reviewPrescriptionRecordsDto.getReasonText();
// 保存审核记录
ReviewPrescriptionRecords reviewPrescriptionRecords;
reviewPrescriptionRecords = new ReviewPrescriptionRecords();
reviewPrescriptionRecords.setId(reviewId); // id
reviewPrescriptionRecords.setEncounterId(encounterId); // 就诊id
reviewPrescriptionRecords.setPrescriptionNo(prescriptionNo); // 处方号
reviewPrescriptionRecords.setMedRequestIds(medRequestIds); // 药品请求ids
reviewPrescriptionRecords.setPassFlag(passFlag); // 通过标识
reviewPrescriptionRecords.setReasonText(reasonText); // 原因
reviewPrescriptionRecords.setPractitionerId(practitionerId); // 审方人id
reviewPrescriptionRecordsService.saveOrUpdate(reviewPrescriptionRecords);
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"审核处方"}));
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.jlau.controller;
import com.core.common.core.domain.R;
import com.openhis.web.jlau.dto.ReviewPrescriptionRecordsDto;
import com.openhis.web.regdoctorstation.dto.NursingOrdersSaveDto;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.openhis.web.jlau.appservice.IReviewPrescriptionRecordsAppService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 农大审方记录 controller
*/
@RestController
@RequestMapping("/jlau/review-prescription-records")
@Slf4j
@AllArgsConstructor
public class ReviewPrescriptionRecordsController {
private final IReviewPrescriptionRecordsAppService iReviewPrescriptionRecordsAppService;
/**
* 审核处方
*
* @param reviewPrescriptionRecordsDto 审方记录dto
* @return 结果
*/
@PostMapping(value = "/review-prescription")
public R<?> reviewPrescription(@RequestBody ReviewPrescriptionRecordsDto reviewPrescriptionRecordsDto) {
return iReviewPrescriptionRecordsAppService.reviewPrescription(reviewPrescriptionRecordsDto);
}
}

View File

@@ -0,0 +1,50 @@
package com.openhis.web.jlau.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;
/**
* 农大审方记录 dto
*/
@Data
@Accessors(chain = true)
public class ReviewPrescriptionRecordsDto {
/**
* 就诊id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 处方号
*/
private String prescriptionNo;
/**
* 药品请求ids
*/
private String medRequestIds;
/**
* 审方id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long reviewId;
/**
* 通过标识
*/
private Integer passFlag;
/**
* 原因
*/
private String reasonText;
}

Some files were not shown because too many files have changed in this diff Show More