docs(release-notes): 添加住院护士站划价功能说明和发版记录

- 新增住院护士站划价服务流程说明文档,详细描述了从参数预处理到结果响应的五大阶段流程
- 包含耗材类医嘱和诊疗活动类医嘱的差异化处理逻辑
- 添加完整的发版内容记录,涵盖新增菜单功能和各模块优化点
- 记录了住院相关功能的新增和门诊业务流程的修复
```
This commit is contained in:
2025-12-25 14:13:14 +08:00
parent 85fcb7c2e2
commit abc0674531
920 changed files with 107068 additions and 14495 deletions

View File

@@ -0,0 +1,79 @@
package com.openhis.web.inhospitalnursestation.appservice;
import java.util.List;
import com.core.common.core.domain.R;
import com.openhis.web.inhospitalnursestation.dto.AutoRollSourceDto;
import com.openhis.web.inhospitalnursestation.dto.EncounterAutoRollQueryDto;
import com.openhis.web.inhospitalnursestation.dto.EncounterAutoRollSaveDto;
import com.openhis.web.inhospitalnursestation.dto.InBedPatientInfoDto;
/**
* 住院就诊滚方 应用实现接口
*/
public interface IEncounterAutoRollAppService {
/**
* 查询自动滚方数据源
*
* @return 自动滚方数据源
*/
List<AutoRollSourceDto> getSource();
/**
* 保存住院就诊的滚方信息
*
* @param encounterAutoRollSaveDto 住院就诊的滚方信息
* @return 结果
*/
R<?> saveBinding(EncounterAutoRollSaveDto encounterAutoRollSaveDto);
/**
* 查询住院就诊滚方绑定信息
*
* @param encounterId 就诊id
* @return 住院就诊滚方绑定信息
*/
List<EncounterAutoRollQueryDto> getEncounter(Long encounterId);
/**
* 删除住院就诊的滚方信息
*
* @param id id
* @return 结果
*/
R<?> deleteBinding(Long id);
/**
* 启用or停用
*
* @param id id
* @param status 状态
* @return 结果
*/
R<?> activeOrRetired(Long id, Integer status);
/**
* 查询在床患者信息
*
* @return 在床患者信息
*/
List<InBedPatientInfoDto> getInBedPatientInfo();
/**
* 滚护理费
*
* @param tenantId 租户id
* @param orderPricing 医嘱定价来源 | 定时任务调用时传参
*/
void autoRollNursingFee(Integer tenantId,String orderPricing);
/**
* 滚基础服务费
*
* @param tenantId 租户id
* @param orderPricing 医嘱定价来源 | 定时任务调用时传参
*/
void autoRollBasicService(Integer tenantId,String orderPricing);
}

View File

@@ -0,0 +1,354 @@
package com.openhis.web.inhospitalnursestation.appservice.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Optional;
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.utils.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.service.IChargeItemService;
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.template.domain.EncounterAutoRoll;
import com.openhis.template.service.IEncounterAutoRollService;
import com.openhis.web.doctorstation.appservice.IDoctorStationAdviceAppService;
import com.openhis.web.doctorstation.dto.AdviceBaseDto;
import com.openhis.web.doctorstation.dto.AdvicePriceDto;
import com.openhis.web.inhospitalnursestation.appservice.IEncounterAutoRollAppService;
import com.openhis.web.inhospitalnursestation.dto.*;
import com.openhis.web.inhospitalnursestation.mapper.EncounterAutoRollAppMapper;
/**
* 住院就诊滚方 应用实现类
*/
@Service
public class EncounterAutoRollAppServiceImpl implements IEncounterAutoRollAppService {
@Resource
EncounterAutoRollAppMapper encounterAutoRollAppMapper;
@Resource
IEncounterAutoRollService encounterAutoRollService;
@Resource
IDoctorStationAdviceAppService doctorStationAdviceAppService;
@Resource
IChargeItemService chargeItemService;
@Resource
AssignSeqUtil assignSeqUtil;
/**
* 查询自动滚方数据源
*
* @return 自动滚方数据源
*/
@Override
public List<AutoRollSourceDto> getSource() {
return encounterAutoRollAppMapper.getSource(PublicationStatus.ACTIVE.getValue(),
ActivityDefCategory.BASIC_SERVICE.getCode());
}
/**
* 保存住院就诊的滚方信息
*
* @param encounterAutoRollSaveDto 住院就诊的滚方信息
* @return 结果
*/
@Override
public R<?> saveBinding(EncounterAutoRollSaveDto encounterAutoRollSaveDto) {
// 当前登录账号参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 当前登录账号科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 就诊id
Long encounterId = encounterAutoRollSaveDto.getEncounterId();
// 实例id
Long instanceId = encounterAutoRollSaveDto.getInstanceId();
// 数量
BigDecimal quantity = encounterAutoRollSaveDto.getQuantity();
long count = encounterAutoRollService.count(new LambdaQueryWrapper<EncounterAutoRoll>()
.eq(EncounterAutoRoll::getEncounterId, encounterId).eq(EncounterAutoRoll::getInstanceId, instanceId));
if (count > 0L) {
return R.fail("当前患者已经存在该信息,请勿重复绑定");
}
EncounterAutoRoll encounterAutoRoll = new EncounterAutoRoll();
encounterAutoRoll.setStatusEnum(PublicationStatus.ACTIVE.getValue()); // 状态
encounterAutoRoll.setEncounterId(encounterId);
encounterAutoRoll.setInstanceTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);
encounterAutoRoll.setInstanceId(instanceId);
encounterAutoRoll.setQuantity(quantity);
encounterAutoRoll.setPractitionerId(practitionerId); // 参与者id
encounterAutoRoll.setOrganizationId(orgId); // 参与者科室id
encounterAutoRollService.save(encounterAutoRoll);
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"滚方信息"}));
}
/**
* 查询住院就诊滚方绑定信息
*
* @param encounterId 就诊id
* @return 住院就诊滚方绑定信息
*/
@Override
public List<EncounterAutoRollQueryDto> getEncounter(Long encounterId) {
List<EncounterAutoRollQueryDto> encounter = encounterAutoRollAppMapper.getEncounter(encounterId);
for (EncounterAutoRollQueryDto encounterAutoRollQueryDto : encounter) {
encounterAutoRollQueryDto.setStatusEnum_enumText(
EnumUtils.getInfoByValue(PublicationStatus.class, encounterAutoRollQueryDto.getStatusEnum()));
}
return encounter;
}
/**
* 删除住院就诊的滚方信息
*
* @param id id
* @return 结果
*/
@Override
public R<?> deleteBinding(Long id) {
boolean res = encounterAutoRollService.removeById(id);
if (res) {
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"滚方信息"}));
} else {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
/**
* 启用or停用
*
* @param id id
* @param status 状态
* @return 结果
*/
@Override
public R<?> activeOrRetired(Long id, Integer status) {
EncounterAutoRoll encounterAutoRoll = new EncounterAutoRoll();
encounterAutoRoll.setId(id);
encounterAutoRoll.setStatusEnum(status); // 状态
boolean res = encounterAutoRollService.updateById(encounterAutoRoll);
if (res) {
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"变更状态"}));
} else {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
/**
* 查询在床患者信息
*
* @return 在床患者信息
*/
@Override
public List<InBedPatientInfoDto> getInBedPatientInfo() {
return encounterAutoRollAppMapper.getInBedPatientInfo(PublicationStatus.ACTIVE.getValue(),
EncounterClass.IMP.getValue(), LocationForm.BED.getValue(), AccountType.PERSONAL_CASH_ACCOUNT.getCode(),
Whether.YES.getValue());
}
/**
* 滚护理费
*
* @param tenantId 租户id
* @param orderPricing 医嘱定价来源 | 定时任务调用时传参
*/
@Override
public void autoRollNursingFee(Integer tenantId, String orderPricing) {
// 当前时间
Date date = new Date();
// 在床患者信息
List<InBedPatientInfoDto> inBedPatientInfo = this.getInBedPatientInfo();
// 就诊id集合
List<Long> encounterIdList =
inBedPatientInfo.stream().map(InBedPatientInfoDto::getEncounterId).collect(Collectors.toList());
if (!encounterIdList.isEmpty()) {
// 需要自动计费的护理医嘱
List<AutoRollNursingDto> nursingRequest = encounterAutoRollAppMapper.getNursingRequest(
RequestStatus.COMPLETED.getValue(), ActivityDefCategory.NURSING.getValue(), encounterIdList);
if (!nursingRequest.isEmpty()) {
System.out.println("**************滚护理费start****************");
// 赋值计费的相关字段
nursingRequest.forEach(nursingDto -> {
inBedPatientInfo.stream()
.filter(patientInfo -> patientInfo.getEncounterId().equals(nursingDto.getEncounterId()))
.findFirst() // 匹配到第一个就返回
.ifPresent(patientInfo -> {
nursingDto.setAccountId(patientInfo.getAccountId()); // 账号id
nursingDto.setConditionId(patientInfo.getConditionId()); // 诊断ID
nursingDto.setEncounterDiagnosisId(patientInfo.getEncounterDiagnosisId()); // 就诊诊断id
nursingDto.setOrganizationId(patientInfo.getOrganizationId()); // 住院科室id
});
});
// 诊疗定义id集合
List<Long> activityDefinitionIdList = nursingRequest.stream()
.map(AutoRollNursingDto::getActivityDefinitionId).collect(Collectors.toList());
// 诊疗医嘱信息
List<AdviceBaseDto> activityInfos = doctorStationAdviceAppService.getAdviceBaseInfo(null, null, null,
activityDefinitionIdList, 0L, 1, 500, Whether.NO.getValue(), List.of(3), orderPricing).getRecords();
// 计费
ChargeItem chargeItem;
for (AutoRollNursingDto autoRollNursingDto : nursingRequest) {
// 当天是否已经生成了账单
long count = chargeItemService.count(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getEncounterId, autoRollNursingDto.getEncounterId())
.eq(ChargeItem::getProductId, autoRollNursingDto.getActivityDefinitionId())
.apply("DATE(entered_date) = CURRENT_DATE"));
if (count > 0L) {
break;
}
chargeItem = new ChargeItem();
chargeItem.setTenantId(tenantId); // 租户id
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 收费状态
chargeItem.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix(), 4));
chargeItem.setGenerateSourceEnum(GenerateSource.AUTO_ROLL_FEES.getValue()); // 生成来源
chargeItem.setPatientId(autoRollNursingDto.getPatientId()); // 患者
chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型
chargeItem.setEncounterId(autoRollNursingDto.getEncounterId()); // 就诊id
chargeItem.setEntererId(autoRollNursingDto.getRequesterId());// 开立人ID
chargeItem.setEnteredDate(date); // 开立时间
chargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);// 产品所在表
chargeItem.setProductId(autoRollNursingDto.getActivityDefinitionId());// 收费项id
chargeItem.setAccountId(autoRollNursingDto.getAccountId());// 关联账户ID
chargeItem.setRequestingOrgId(autoRollNursingDto.getOrganizationId()); // 开立科室
chargeItem.setConditionId(autoRollNursingDto.getConditionId()); // 诊断id
chargeItem.setEncounterDiagnosisId(autoRollNursingDto.getEncounterDiagnosisId()); // 就诊诊断id
// 匹配医嘱详细信息
Optional<AdviceBaseDto> matchedAdvice = activityInfos.stream().filter(
advice -> autoRollNursingDto.getActivityDefinitionId().equals(advice.getAdviceDefinitionId()))
.findFirst();
// 医嘱信息
AdviceBaseDto advice = matchedAdvice.get();
Optional<AdvicePriceDto> matchedPrice = advice.getPriceList().stream().findFirst();
// 医嘱定价信息
AdvicePriceDto priceDto = matchedPrice.get();
BigDecimal price = priceDto.getPrice();
chargeItem.setDefinitionId(priceDto.getDefinitionId()); // 费用定价ID
chargeItem.setDefDetailId(priceDto.getDefinitionDetailId()); // 定价子表主键
chargeItem.setQuantityValue(autoRollNursingDto.getQuantity()); // 数量
chargeItem.setUnitPrice(price); // 单价
chargeItem.setTotalPrice(
autoRollNursingDto.getQuantity().multiply(price).setScale(6, RoundingMode.HALF_UP)); // 总价
chargeItemService.save(chargeItem);
}
System.out.println("**************滚护理费end****************");
}
}
}
/**
* 滚基础服务费
*
* @param tenantId 租户id
* @param orderPricing 医嘱定价来源 | 定时任务调用时传参
*/
@Override
public void autoRollBasicService(Integer tenantId, String orderPricing) {
// 当前时间
Date date = new Date();
// 在床患者信息
List<InBedPatientInfoDto> inBedPatientInfo = this.getInBedPatientInfo();
// 就诊id集合
List<Long> encounterIdList =
inBedPatientInfo.stream().map(InBedPatientInfoDto::getEncounterId).collect(Collectors.toList());
if (!encounterIdList.isEmpty()) {
// 需要自动计费的绑定基础服务信息
List<AutoRollBasicServiceDto> autoRollBasicService = encounterAutoRollAppMapper
.getAutoRollBasicService(PublicationStatus.ACTIVE.getValue(), encounterIdList);
if (!autoRollBasicService.isEmpty()) {
System.out.println("**************滚基础服务费start****************");
// 赋值计费的相关字段
autoRollBasicService.forEach(basicServiceDto -> {
inBedPatientInfo.stream()
.filter(patientInfo -> patientInfo.getEncounterId().equals(basicServiceDto.getEncounterId()))
.findFirst() // 匹配到第一个就返回
.ifPresent(patientInfo -> {
basicServiceDto.setAccountId(patientInfo.getAccountId()); // 账号id
basicServiceDto.setConditionId(patientInfo.getConditionId()); // 诊断ID
basicServiceDto.setEncounterDiagnosisId(patientInfo.getEncounterDiagnosisId()); // 就诊诊断id
basicServiceDto.setPatientId(patientInfo.getPatientId()); // 患者id
});
});
// 诊疗定义id集合
List<Long> activityDefinitionIdList = autoRollBasicService.stream()
.map(AutoRollBasicServiceDto::getActivityDefinitionId).collect(Collectors.toList());
// 诊疗医嘱信息
List<AdviceBaseDto> activityInfos = doctorStationAdviceAppService.getAdviceBaseInfo(null, null, null,
activityDefinitionIdList, 0L, 1, 500, Whether.NO.getValue(), List.of(3), orderPricing).getRecords();
// 计费
ChargeItem chargeItem;
for (AutoRollBasicServiceDto autoRollBasicServiceDto : autoRollBasicService) {
// 当天是否已经生成了账单
long count = chargeItemService.count(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getEncounterId, autoRollBasicServiceDto.getEncounterId())
.eq(ChargeItem::getProductId, autoRollBasicServiceDto.getActivityDefinitionId())
.apply("DATE(entered_date) = CURRENT_DATE"));
if (count > 0L) {
break;
}
chargeItem = new ChargeItem();
chargeItem.setTenantId(tenantId); // 租户id
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 收费状态
chargeItem.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix(), 4));
chargeItem.setGenerateSourceEnum(GenerateSource.AUTO_ROLL_FEES.getValue()); // 生成来源
chargeItem.setPatientId(autoRollBasicServiceDto.getPatientId()); // 患者
chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型
chargeItem.setEncounterId(autoRollBasicServiceDto.getEncounterId()); // 就诊id
chargeItem.setEntererId(autoRollBasicServiceDto.getRequesterId());// 开立人ID
chargeItem.setEnteredDate(date); // 开立时间
chargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);// 产品所在表
chargeItem.setProductId(autoRollBasicServiceDto.getActivityDefinitionId());// 收费项id
chargeItem.setAccountId(autoRollBasicServiceDto.getAccountId());// 关联账户ID
chargeItem.setRequestingOrgId(autoRollBasicServiceDto.getOrganizationId()); // 开立科室
chargeItem.setConditionId(autoRollBasicServiceDto.getConditionId()); // 诊断id
chargeItem.setEncounterDiagnosisId(autoRollBasicServiceDto.getEncounterDiagnosisId()); // 就诊诊断id
// 匹配医嘱详细信息
Optional<AdviceBaseDto> matchedAdvice =
activityInfos.stream().filter(advice -> autoRollBasicServiceDto.getActivityDefinitionId()
.equals(advice.getAdviceDefinitionId())).findFirst();
// 医嘱信息
AdviceBaseDto advice = matchedAdvice.get();
Optional<AdvicePriceDto> matchedPrice = advice.getPriceList().stream().findFirst();
// 医嘱定价信息
AdvicePriceDto priceDto = matchedPrice.get();
BigDecimal price = priceDto.getPrice();
chargeItem.setDefinitionId(priceDto.getDefinitionId()); // 费用定价ID
chargeItem.setDefDetailId(priceDto.getDefinitionDetailId()); // 定价子表主键
chargeItem.setQuantityValue(autoRollBasicServiceDto.getQuantity()); // 数量
chargeItem.setUnitPrice(price); // 单价
chargeItem.setTotalPrice(
autoRollBasicServiceDto.getQuantity().multiply(price).setScale(6, RoundingMode.HALF_UP)); // 总价
chargeItemService.save(chargeItem);
}
System.out.println("**************滚基础服务费end****************");
}
}
}
}

View File

@@ -0,0 +1,92 @@
package com.openhis.web.inhospitalnursestation.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
import com.openhis.common.enums.PublicationStatus;
import com.openhis.web.inhospitalnursestation.appservice.IEncounterAutoRollAppService;
import com.openhis.web.inhospitalnursestation.dto.EncounterAutoRollSaveDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 住院就诊滚方
*/
@RestController
@RequestMapping("/nurse-station/auto-roll")
@Slf4j
@AllArgsConstructor
public class EncounterAutoRollAppController {
@Resource
public IEncounterAutoRollAppService iEncounterAutoRollAppService;
/**
* 查询自动滚方数据源
*
* @return 自动滚方数据源
*/
@GetMapping(value = "/source-info")
public R<?> getSource() {
return R.ok(iEncounterAutoRollAppService.getSource());
}
/**
* 保存住院就诊的滚方信息
*
* @param encounterAutoRollSaveDto 住院就诊的滚方信息
* @return 结果
*/
@PostMapping(value = "/save-binding")
public R<?> saveBinding(@RequestBody EncounterAutoRollSaveDto encounterAutoRollSaveDto) {
return iEncounterAutoRollAppService.saveBinding(encounterAutoRollSaveDto);
}
/**
* 查询住院就诊滚方绑定信息
*
* @param encounterId 就诊id
* @return 住院就诊滚方绑定信息
*/
@GetMapping(value = "/encounter-info")
public R<?> getEncounter(@RequestParam(value = "encounterId") Long encounterId) {
return R.ok(iEncounterAutoRollAppService.getEncounter(encounterId));
}
/**
* 删除住院就诊的滚方信息
*
* @param id id
* @return 结果
*/
@DeleteMapping("/delete-binding")
public R<?> deleteBinding(@RequestParam Long id) {
return R.ok(iEncounterAutoRollAppService.deleteBinding(id));
}
/**
* 启用
*
* @param id id
* @return 结果
*/
@PutMapping("/active")
public R<?> active(@RequestParam Long id) {
return R.ok(iEncounterAutoRollAppService.activeOrRetired(id, PublicationStatus.ACTIVE.getValue()));
}
/**
* 停用
*
* @param id id
* @return 结果
*/
@PutMapping("/retired")
public R<?> retired(@RequestParam Long id) {
return R.ok(iEncounterAutoRollAppService.activeOrRetired(id, PublicationStatus.RETIRED.getValue()));
}
}

View File

@@ -177,5 +177,33 @@ public class AdmissionPatientInfoDto {
*/
private String editFlag;
// TODO 体温单相关字段
/**
* 身高
*/
private String height;
/**
* 体重
*/
private String weight;
/**
* 体温
*/
private String temperature;
/**
* 心率
*/
private String hertRate;
/**
* 脉搏
*/
private String pulse;
/**
* 低压
*/
private String endBloodPressure;
/**
* 高压
*/
private String highBloodPressure;
}

View File

@@ -29,6 +29,12 @@ public class AdmissionPatientPageDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 账号id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long accountId;
/**
* 住院号
*/
@@ -45,6 +51,11 @@ public class AdmissionPatientPageDto {
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 入科时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date admissionTime;
/**
* 出院时间
@@ -131,4 +142,9 @@ public class AdmissionPatientPageDto {
* 费别
*/
private String contractName;
/**
* 患者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
}

View File

@@ -3,10 +3,13 @@
*/
package com.openhis.web.inhospitalnursestation.dto;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 医嘱执行参数
@@ -18,6 +21,13 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
public class AdviceExecuteParam {
/**
* 实际执行时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date exeDate;
/**
* 医嘱执行详细参数
*/

View File

@@ -0,0 +1,71 @@
package com.openhis.web.inhospitalnursestation.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 AutoRollBasicServiceDto {
/**
* 诊疗定义id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long activityDefinitionId;
/**
* 数量
*/
private BigDecimal quantity;
/**
* 就诊id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 住院科室id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 患者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/**
* 账号id | 住院就诊的个人现金账户id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long accountId;
/**
* 诊断ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long conditionId;
/**
* 就诊诊断id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterDiagnosisId;
/**
* 请求者 | 开方人
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long requesterId;
}

View File

@@ -0,0 +1,71 @@
package com.openhis.web.inhospitalnursestation.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 AutoRollNursingDto {
/**
* 诊疗定义id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long activityDefinitionId;
/**
* 数量
*/
private BigDecimal quantity;
/**
* 就诊id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 住院科室id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 患者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/**
* 账号id | 住院就诊的个人现金账户id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long accountId;
/**
* 诊断ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long conditionId;
/**
* 就诊诊断id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterDiagnosisId;
/**
* 请求者 | 开方医生
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long requesterId;
}

View File

@@ -0,0 +1,35 @@
package com.openhis.web.inhospitalnursestation.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 自动滚方数据源 Dto
*/
@Data
@Accessors(chain = true)
public class AutoRollSourceDto {
/**
* 实例id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long instanceId;
/**
* 实例名称
*/
private String instanceName;
/**
* 使用单位
*/
@Dict(dictCode = "unit_code")
private String permittedUnitCode;
private String permittedUnitCode_dictText;
}

View File

@@ -0,0 +1,38 @@
package com.openhis.web.inhospitalnursestation.dto;
import java.util.List;
import com.core.common.annotation.Excel;
import com.openhis.administration.dto.CostDetailDto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 住院记账-费用明细导出专用DTO
*
* @author swb
* @date 2025/12/19
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class CostDetailExcelOutDto {
/**
* 就诊ID
*/
private Long encounterId;
/**
* 费用明细列表
*/
@Excel()
private List<CostDetailDto> data;
/**
* 患者姓名
*/
@Excel(name = "姓名", sort = 1, needMerge = true)
private String name;
}

View File

@@ -0,0 +1,37 @@
package com.openhis.web.inhospitalnursestation.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
*
* @author: 1x1
* @date: 2025/11/19 13:50
*/
@Data
@Accessors(chain = true)
public class EncounterAccountDto {
// 就诊ID
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
// 预交金
private BigDecimal advanceAmount;
// 总额
private BigDecimal totalAmount;
// 余额
private BigDecimal balanceAmount;
// 险种类型
private String insutype;
}

View File

@@ -0,0 +1,41 @@
package com.openhis.web.inhospitalnursestation.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 EncounterAutoRollQueryDto {
/**
* id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 状态 */
private Integer statusEnum;
private String statusEnum_enumText;
/** 数量 */
private BigDecimal quantity;
/**
* 单位
*/
private String unitCodeName;
/**
* 服务定义名称
*/
private String definitionName;
}

View File

@@ -0,0 +1,33 @@
package com.openhis.web.inhospitalnursestation.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 EncounterAutoRollSaveDto {
/**
* 就诊id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 实例id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long instanceId;
/** 数量 */
private BigDecimal quantity;
}

View File

@@ -0,0 +1,52 @@
package com.openhis.web.inhospitalnursestation.dto;
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 InBedPatientInfoDto {
/**
* 就诊id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 住院科室id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 患者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/**
* 账号id | 住院就诊的个人现金账户id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long accountId;
/**
* 诊断ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long conditionId;
/**
* 就诊诊断id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterDiagnosisId;
}

View File

@@ -242,4 +242,18 @@ public class InpatientAdviceDto {
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long performerCheckId;
/**
* 药品/服务类型
*/
private Integer categoryCode;
/**
* 执行科室
*/
private String orgName;
/** 单价 */
private BigDecimal unitPrice;
/** 总价 */
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,107 @@
package com.openhis.web.inhospitalnursestation.dto;
import java.math.BigDecimal;
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;
/**
* 待配/退药 dto
*
* @Author: 1x1
* @CreateTime: 2025-11-19 15:49
*/
@Data
@Accessors(chain = true)
public class PendingMedicationDto {
/**
* 药品请求ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long medicationRequestId;
/**
* 药品发放ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long medicationDispenseId;
/**
* 科室
*/
private String orgName;
/**
* 药房
*/
private String performLocationName;
/**
* 药品名称
*/
private String medicationName;
/**
* 药品规格
*/
private String medicationSpec;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 待退数量
*/
private BigDecimal requestQuantity;
/**
* 待配数量
*/
private BigDecimal dispenseQuantity;
/**
* 数量单位编码
*/
@Dict(dictCode = "unit_code")
private String unitCode;
private String unitCode_dictText;
/**
* 总价
*/
private BigDecimal totalPrice;
/**
* 发药人ID
*/
private Long dispensePractitionerId;
/**
* 发药人姓名
*/
private String dispensePractitionerName;
/**
* 预定发药时间
*/
private Date plannedDispenseTime;
/**
* 请求状态
*/
private Integer requestStatusEnum;
/**
* 发放状态
*/
private Integer dispenseStatusEnum;
}

View File

@@ -3,16 +3,16 @@
*/
package com.openhis.web.inhospitalnursestation.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.inhospitalnursestation.dto.AdmissionBedPageDto;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPageParam;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPatientInfoDto;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPatientPageDto;
import com.openhis.web.common.dto.PerformRecordDto;
import com.openhis.web.inhospitalnursestation.dto.*;
/**
* 入出转管理 appMapper
@@ -82,4 +82,74 @@ public interface ATDManageAppMapper {
@Param("bed") Integer bed, @Param("primaryNurse") String primaryNurse,
@Param("attendingDoctor") String attendingDoctor, @Param("admittingDoctor") String admittingDoctor,
@Param("chiefDoctor") String chiefDoctor);
/**
* 诊断个人账户金额信息获取
*
* @param personalCashAccount 账户类型:个人现金账户
* @param billable 收费状态:待结算
* @param billed 收费状态:已结算
* @param refunded 收费状态:已退费
* @param encounterId 诊断id
* @return EncounterAccountDto 诊断账户金额
**/
EncounterAccountDto getAmount(@Param("personalCashAccount") String personalCashAccount,
@Param("billable") Integer billable, @Param("billed") Integer billed, @Param("refunded") Integer refunded,
@Param("encounterId") Long encounterId);
/**
* 获取待配/退药
*
* @param encounterId 诊断id
* @param preparationStatus 配药状态:待配
* @param summarizedStatus 配药状态:已汇总
* @param requestStatus 发药状态:待退
* @param tenantId 租户id
* @return PendingMedicationDto 待配/退药
**/
List<PendingMedicationDto> getPendingMedication(@Param("encounterId") Long encounterId,
@Param("preparationStatus") Integer preparationStatus, @Param("summarizedStatus") Integer summarizedStatus,
@Param("requestStatus") Integer requestStatus, @Param("tenantId") Integer tenantId);
/**
* 查询医嘱分页列表
*
* @param page 分页信息
* @param queryWrapper 查询条件
* @param worServiceRequest 请求所在表:服务请求
* @param medMedicationRequest 请求所在表:药品请求
* @param draft 医嘱状态:待发送
* @param stopped 医嘱状态:停嘱
* @param active 住院位置状态:使用中
* @param bed 位置类型:病床
* @param admittingDoctor 住院医生
* @param personalCashAccount 个人现金账户
* @param billable 收费状态:待结算
* @param billed 收费状态:已结算
* @param refunded 收费状态:已退费
* @param imp 患者状态:住院
* @param doctorPrescription 医嘱类型:医生开立
* @param transfer 特殊医嘱:转科
* @param discharge 特殊医嘱:出院
* @param nursing 特殊医嘱:护理级别
* @return 医嘱分页列表
*/
Page<InpatientAdviceDto> selectInpatientAdvicePage(@Param("page") Page<InpatientAdviceDto> page,
@Param(Constants.WRAPPER) QueryWrapper<InpatientAdviceParam> queryWrapper,
@Param("medMedicationRequest") String medMedicationRequest,
@Param("worServiceRequest") String worServiceRequest, @Param("draft") Integer draft,
@Param("stopped") Integer stopped, @Param("active") Integer active, @Param("bed") Integer bed,
@Param("admittingDoctor") String admittingDoctor, @Param("personalCashAccount") String personalCashAccount,
@Param("billable") Integer billable, @Param("billed") Integer billed, @Param("refunded") Integer refunded,
@Param("imp") Integer imp, @Param("doctorPrescription") Integer doctorPrescription,
@Param("transfer") String transfer, @Param("discharge") String discharge, @Param("nursing") String nursing);
/**
* 查询执行记录
*
* @param reqIds 项目ids
* @return 执行记录列表
*/
List<PerformRecordDto> selectPerformRecordList(@Param("reqIds") List<Long> reqIds);
}

View File

@@ -35,13 +35,14 @@ public interface AdviceProcessAppMapper {
* @param ward 位置类型:病区
* @param house 位置类型:病房
* @param bed 位置类型:病床
* @param personalCashAccount 个人现金账户
* @return 入院患者分页列表
*/
Page<AdmissionPatientPageDto> selectInpatientPage(@Param("page") Page<AdmissionPatientPageDto> page,
@Param(Constants.WRAPPER) QueryWrapper<AdmissionPageParam> queryWrapper, @Param("imp") Integer imp,
@Param("toBeRegistered") Integer toBeRegistered, @Param("registered") Integer registered,
@Param("active") Integer active, @Param("ward") Integer ward, @Param("house") Integer house,
@Param("bed") Integer bed);
@Param("bed") Integer bed, @Param("personalCashAccount") String personalCashAccount);
/**
* 查询医嘱分页列表
@@ -59,6 +60,7 @@ public interface AdviceProcessAppMapper {
* @param billed 收费状态:已结算
* @param refunded 收费状态:已退费
* @param imp 患者状态:住院
* @param doctorPrescription 医嘱类型:医生开立
* @return 医嘱分页列表
*/
Page<InpatientAdviceDto> selectInpatientAdvicePage(@Param("page") Page<InpatientAdviceDto> page,
@@ -67,5 +69,6 @@ public interface AdviceProcessAppMapper {
@Param("worServiceRequest") String worServiceRequest, @Param("draft") Integer draft,
@Param("active") Integer active, @Param("bed") Integer bed, @Param("admittingDoctor") String admittingDoctor,
@Param("personalCashAccount") String personalCashAccount, @Param("billable") Integer billable,
@Param("billed") Integer billed, @Param("refunded") Integer refunded, @Param("imp") Integer imp);
@Param("billed") Integer billed, @Param("refunded") Integer refunded, @Param("imp") Integer imp,
@Param("doctorPrescription") Integer doctorPrescription);
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.openhis.web.inhospitalnursestation.dto.*;
/**
* 住院就诊滚方
*/
@Repository
public interface EncounterAutoRollAppMapper {
/**
* 查询自动滚方数据源
*
* @param status 状态
* @param basicService 基础服务
* @return 自动滚方数据源
*/
List<AutoRollSourceDto> getSource(@Param("status") Integer status, @Param("basicService") String basicService);
/**
* 查询住院就诊滚方绑定信息
*
* @param encounterId 就诊id
* @return 住院就诊滚方绑定信息
*/
List<EncounterAutoRollQueryDto> getEncounter(@Param("encounterId") Long encounterId);
/**
* 查询在床患者信息
*
* @param status 启用状态
* @param classEnum 就诊类型
* @param formEnum 床位
* @param typeCode 个人现金账号
* @param maindiseFlag 主诊断标识
* @return 在床患者信息
*/
List<InBedPatientInfoDto> getInBedPatientInfo(@Param("status") Integer status,
@Param("classEnum") Integer classEnum, @Param("formEnum") Integer formEnum, @Param("typeCode") String typeCode,
@Param("maindiseFlag") Integer maindiseFlag);
/**
* 查询需要自动计费的护理医嘱
*
* @param status 状态为已完成(已校对)
* @param categoryEnum 类型为护理
* @param encounterIdList 就诊id集合
* @return 需要自动计费的护理医嘱
*/
List<AutoRollNursingDto> getNursingRequest(@Param("status") Integer status,
@Param("categoryEnum") Integer categoryEnum, @Param("encounterIdList") List<Long> encounterIdList);
/**
* 查询需要自动计费的绑定基础服务信息
*
* @param status 状态
* @param encounterIdList 就诊id集合
* @return 需要自动计费的绑定基础服务信息
*/
List<AutoRollBasicServiceDto> getAutoRollBasicService(@Param("status") Integer status,
@Param("encounterIdList") List<Long> encounterIdList);
}