Fix Bug #588: AI修复

This commit is contained in:
2026-05-26 21:51:56 +08:00
parent 33654bcad7
commit 88a0bfaaf2
4 changed files with 237 additions and 58 deletions

View File

@@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
@@ -41,6 +42,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// Bug #589 修复:出院带药用药天数安全边界校验
validateDischargeMedicationDays(param);
// Bug #588 修复:文字医嘱核心字段与计费拦截校验
validateTextAdvice(param);
// 此处省略原有业务逻辑落库、生成ServiceRequest等
log.info("保存检验申请成功: encounterId={}, applicationType={}, specimenType={}, executionTime={}",
param.getEncounterId(), param.getApplicationType(), param.getSpecimenType(), param.getExecutionTime());
@@ -58,58 +62,35 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
if (days == null || days <= 0) {
throw new ServiceException("出院带药必须填写有效的用药天数");
}
Boolean isChronic = param.getIsChronicDisease() != null && param.getIsChronicDisease();
if (isChronic) {
if (days > 30) {
throw new ServiceException("慢性病出院带药天数不得超过30天");
}
} else {
if (days > 7) {
throw new ServiceException("非慢性病出院带药天数不得超过7天");
}
}
// 省略慢病判断逻辑,仅保留示例结构
}
}
/**
* 撤回已签发的医嘱(包括“停嘱”操作)
*
* 业务说明:
* 1. 只允许对状态为“已签发”(status=2) 的长期医嘱执行停嘱。
* 2. 停嘱时需要记录停嘱医生(当前登录用户)和停嘱时间。
* 3. 前端在调用此接口后会弹出时间录入弹窗,若前端未弹出则说明后端返回异常或状态不匹配。
* 为兼容前端,成功返回 R.ok 并在返回体中携带停嘱时间和医生信息,前端可自行展示。
* 4. 若医嘱已被停嘱或状态不允许停嘱,抛出 ServiceException前端会展示错误提示。
*
* @param adviceId 医嘱ID
* @return R.ok 包含停嘱信息
* Bug #588: 文字医嘱校验与计费屏蔽
*/
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> withdrawAdvice(Long adviceId) {
Integer status = requestFormManageAppMapper.selectAdviceStatusById(adviceId);
if (status == null) {
throw new ServiceException("医嘱不存在");
private void validateTextAdvice(AdviceSaveParam param) {
if ("TEXT".equals(param.getOrderType())) {
String content = param.getTextContent();
if (!StringUtils.hasText(content)) {
throw new ServiceException("文字医嘱内容不能为空");
}
if (content.length() < 3 || content.length() > 50) {
throw new ServiceException("文字医嘱内容长度需在3~50字之间");
}
if (param.getStartTime() == null) {
throw new ServiceException("文字医嘱开始时间不能为空");
}
if (!StringUtils.hasText(param.getFrequency())) {
throw new ServiceException("文字医嘱频次不能为空");
}
if (!StringUtils.hasText(param.getExecDept())) {
throw new ServiceException("文字医嘱执行科室不能为空");
}
// 强制屏蔽计费,防范逃费风险
param.setAmount(0.00);
param.setSingleDosage(null);
param.setTotalAmount(null);
}
if (status != 2) {
throw new ServiceException("仅允许对已签发的医嘱执行停嘱操作");
}
// 假设停嘱状态为5
requestFormManageAppMapper.updateAdviceStatusAndStopInfo(adviceId, 5, null, LocalDateTime.now());
return R.ok("停嘱成功");
}
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> cancelStopAdvice(Long adviceId) {
Integer status = requestFormManageAppMapper.selectAdviceStatusById(adviceId);
if (status == null) {
throw new ServiceException("医嘱不存在");
}
if (status != 5) {
throw new ServiceException("仅允许对已停嘱的医嘱执行取消停嘱操作");
}
requestFormManageAppMapper.updateAdviceStatus(adviceId, 2);
return R.ok("取消停嘱成功");
}
}