Fix Bug #550: fallback修复

This commit is contained in:
2026-05-27 01:58:27 +08:00
parent ce325b96a5
commit 37c197081a
5 changed files with 284 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
package com.openhis.web.outpatient.controller;
import com.openhis.web.outpatient.service.CheckRequestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 检查申请接口
*
* 修复 Bug #550
* 1. 前端已改为手动控制勾选,后端需要确保一次只能提交同一检查项目的唯一记录。
* 2. 防止重复提交导致明细耦合,新增校验逻辑。
*/
@RestController
@RequestMapping("/outpatient/check-requests")
public class CheckRequestController {
@Autowired
private CheckRequestService checkRequestService;
@GetMapping
public List<Map<String, Object>> list() {
return checkRequestService.listPendingRequests();
}
@PostMapping("/submit")
public void submit(@RequestBody List<Map<String, Object>> selected) {
// 校验:同一检查项目只能提交一次
checkRequestService.validateAndSubmit(selected);
}
}

View File

@@ -0,0 +1,40 @@
package com.openhis.web.outpatient.mapper;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
/**
* 检查申请数据访问层
*
* 修复 Bug #550
* - 新增 selectExistingItemCodes 用于校验冲突。
* - 新增 batchInsertRequests 实现一次性插入,避免明细耦合。
*/
@Mapper
public interface CheckRequestMapper {
@Select("SELECT id, item_code AS itemCode, item_name AS itemName, spec, dept_name AS deptName, " +
"apply_doctor AS applyDoctor, apply_time AS applyTime " +
"FROM outpatient_check_request " +
"WHERE status = 0") // 待处理状态
List<Map<String, Object>> selectPendingRequests();
@Select("<script>" +
"SELECT item_code FROM outpatient_check_request " +
"WHERE status = 0 AND item_code IN " +
"<foreach collection='itemCodes' item='code' open='(' separator=',' close=')'>#{code}</foreach>" +
"</script>")
List<String> selectExistingItemCodes(@Param("itemCodes") List<String> itemCodes);
@Insert("<script>" +
"INSERT INTO outpatient_check_request " +
"(item_code, item_name, spec, dept_name, apply_doctor, apply_time, status) " +
"VALUES " +
"<foreach collection='list' item='item' separator=','>" +
"(#{item.itemCode}, #{item.itemName}, #{item.spec}, #{item.deptName}, " +
" #{item.applyDoctor}, NOW(), 0)" +
"</foreach>" +
"</script>")
int batchInsertRequests(@Param("list") List<Map<String, Object>> list);
}

View File

@@ -0,0 +1,68 @@
package com.openhis.web.outpatient.service.impl;
import com.openhis.web.outpatient.mapper.CheckRequestMapper;
import com.openhis.web.outpatient.service.CheckRequestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 检查申请业务实现
*
* 修复 Bug #550
* - 在提交前校验同一检查项目item_code是否已存在未完成的申请防止自动勾选冲突。
* - 通过一次 INSERT 完成明细保存,避免前端明细与后端耦合。
*/
@Service
public class CheckRequestServiceImpl implements CheckRequestService {
@Autowired
private CheckRequestMapper checkRequestMapper;
@Override
public List<Map<String, Object>> listPendingRequests() {
return checkRequestMapper.selectPendingRequests();
}
/**
* 校验并提交检查申请
*
* @param selected 前端选中的检查项目列表
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void validateAndSubmit(List<Map<String, Object>> selected) {
if (selected == null || selected.isEmpty()) {
return;
}
// 1. 检查前端是否传入了重复的 item_code
List<String> duplicateCodes = selected.stream()
.collect(Collectors.groupingBy(item -> (String) item.get("itemCode")))
.entrySet().stream()
.filter(e -> e.getValue().size() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
if (!duplicateCodes.isEmpty()) {
throw new IllegalArgumentException("同一检查项目不能重复选择:" + duplicateCodes);
}
// 2. 检查数据库中是否已有未完成的相同项目
List<String> itemCodes = selected.stream()
.map(item -> (String) item.get("itemCode"))
.collect(Collectors.toList());
List<String> existing = checkRequestMapper.selectExistingItemCodes(itemCodes);
if (!existing.isEmpty()) {
throw new IllegalArgumentException("以下检查项目已存在未完成的申请,请先处理:" + existing);
}
// 3. 批量插入新申请记录
checkRequestMapper.batchInsertRequests(selected);
}
}