yxh
6 天以前 68ff33beff11310e830b0615b5a81f83fad0f683
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/doctor/DoctorController.java
@@ -12,6 +12,7 @@
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO;
import cn.lihu.jh.module.ecg.enums.QueueStatusEnum;
import cn.lihu.jh.module.ecg.annotation.RequireBedOwner;
import cn.lihu.jh.module.ecg.service.call.CallService;
import cn.lihu.jh.module.ecg.service.queue.QueueService;
import io.swagger.v3.oas.annotations.Operation;
@@ -25,6 +26,7 @@
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static cn.lihu.jh.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS;
@@ -42,9 +44,14 @@
    @Resource
    private QueueService queueService;
    /** 【本次修复】撤销"检查完成"时回滚检查单状态并取消确费 */
    @Resource
    private cn.lihu.jh.module.ecg.service.devrent.DevRentService devRentService;
    @Resource
    private CallService callService;
    @RequireBedOwner("暂停接诊")
    @GetMapping("/bed-doctor-pause")
    @Operation(summary = "医生暂停")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:state')")
@@ -64,6 +71,7 @@
        return error(result);
    }
    @RequireBedOwner("恢复接诊")
    @GetMapping("/bed-doctor-resume")
    @Operation(summary = "医生恢复")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:state')")
@@ -86,12 +94,15 @@
    @PreAuthorize("@ss.hasPermission('ecg:doctor:state')")
    public CommonResult<Integer> bedDoctorOn(
            @RequestParam("roomId") Long roomId,
            @RequestParam("bedNo") String bedNo)
            @RequestParam("bedNo") String bedNo,
            // 工位主键(前端请求里本来就带):传入时优先按它定位,避免 bed_no 与请求值
            // 存在肉眼难辨的差异(结尾空格/大小写/全角)时"明明空闲却更新 0 行"
            @RequestParam(value = "id", required = false) Integer bedId)
    {
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        String userNickname = SecurityFrameworkUtils.getLoginUserNickname();
        ErrorCode result = queueService.startBedDoctorOn(roomId, bedNo, userId, userNickname);
        ErrorCode result = queueService.startBedDoctorOn(roomId, bedNo, userId, userNickname, bedId);
        if (result.equals(SUCCESS))
            return success(0);
@@ -167,6 +178,7 @@
        return result;
    }
    @RequireBedOwner("叫号:取下一位患者")
    @GetMapping("/finish-next-patient")
    @Operation(summary = "常规叫号、下一位患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -193,6 +205,7 @@
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @RequireBedOwner("领用:取下一位患者")
    @GetMapping("/finish-receive-next-patient")
    @Operation(summary = "领用叫号、下一位患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -219,6 +232,7 @@
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @RequireBedOwner("装机:取下一位患者")
    @GetMapping("/finish-install-next-patient")
    @Operation(summary = "装机叫号、下一位患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -262,6 +276,7 @@
    }
    // 常规检查过号、领用过号
    @RequireBedOwner("过号")
    @GetMapping("/pass-next-patient")
    @Operation(summary = "过号、下一位患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -286,6 +301,7 @@
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @RequireBedOwner("装机过号")
    @GetMapping("/pass-install-next-patient")
    @Operation(summary = "安装过号、下一位患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -312,6 +328,7 @@
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @RequireBedOwner("重叫")
    @GetMapping("/call-again")
    @Operation(summary = "[常规检查]或[领用] 重叫、患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -342,6 +359,7 @@
    }
    @RequireBedOwner("重叫(安装)")
    @GetMapping("/call-install-again")
    @Operation(summary = "重叫、患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -382,7 +400,64 @@
            @RequestParam("bedNo") String bedNo)
    {
        List<QueueDO> queueDOList = queueService.getCheckRelatedPatient(roomId, bedNo);
        // 【自助诊断】现场多次出现"列表是空的"却看不出原因:这里把**前端问的工位 + 后端返回几条**
        // 打出来,配合接口一起看就能立刻区分"前端问错工位 / 后端确实没数据 / 页面没刷新"。
        log.info("[getToBeCheckedPatientList] roomId={} bedNo=[{}] 登录人={} → 返回 {} 条",
                roomId, bedNo, SecurityFrameworkUtils.getLoginUserId(),
                null == queueDOList ? 0 : queueDOList.size());
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @GetMapping("/get-room-waiting-list")
    @Operation(summary = "取本诊室「排队中(未分配工位)」患者列表")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "121")
    @Parameter(name = "bedNo", description = "工位编号", required = true, example = "F1")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<List<QueueRespVO>> getRoomWaitingList(
            @RequestParam("roomId") Long roomId,
            @RequestParam("bedNo") String bedNo)
    {
        // 【本诊室未分配】候诊列表只含"已分流到本工位"的患者;这里把"本工位检查类型、
        // 还没分配工位"的排队患者(大屏能看到、工作台原先看不到)单独返回,供医生手工拉入。
        List<QueueDO> queueDOList = queueService.getUnassignedWaitingPatient(roomId, bedNo);
        log.info("[getRoomWaitingList] roomId={} bedNo=[{}] 登录人={} → 未分配排队中 {} 条",
                roomId, bedNo, SecurityFrameworkUtils.getLoginUserId(),
                null == queueDOList ? 0 : queueDOList.size());
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @RequireBedOwner("拉入排队患者")
    @GetMapping("/pull-waiting-patient")
    @Operation(summary = "把「排队中」的患者手工拉入本工位")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "121")
    @Parameter(name = "bedNo", description = "工位编号", required = true, example = "F1")
    @Parameter(name = "id", description = "排队行id", required = true, example = "123")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<String> pullWaitingPatient(
            @RequestParam("roomId") Long roomId,
            @RequestParam("bedNo") String bedNo,
            @RequestParam("id") Integer id)
    {
        ErrorCode result = queueService.pullWaitingPatient(roomId, bedNo, id);
        if (result.equals(SUCCESS))
            return success("操作成功");
        return error(result);
    }
    @RequireBedOwner("立即补人")
    @GetMapping("/hurry-up-now")
    @Operation(summary = "立即补人(手动触发本工位自动分流,并返回诊断信息)")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "121")
    @Parameter(name = "bedNo", description = "工位编号", required = true, example = "F1")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<Map<String, Object>> hurryUpNow(
            @RequestParam("roomId") Long roomId,
            @RequestParam("bedNo") String bedNo)
    {
        // 现场自救 + 自助诊断:候诊区为空时点一下,立刻得到
        // 「系统开诊状态 / 是否停止候诊 / 候诊上限 / 补人前后人数 / 结论」。
        return success(queueService.hurryUpNow(roomId, bedNo));
    }
    @GetMapping("/get-to-be-installed-list")
@@ -438,6 +513,9 @@
        return success(patientStatisticVO);
    }
    // 【本需求·排队队列供服务台分诊调度使用】不再做「工位主人」校验:
    // 分诊台不占座(clinic_room.doc_id 是坐诊医生),否则必报 1010002003「围观模式,不能执行该操作」。
    // 仍保留 @PreAuthorize('ecg:doctor:task') 权限点。
    @GetMapping("/recall-pass-waiting-patient")
    @Operation(summary = "过号-排队中 患者召回")
    @Parameter(name = "patId", description = "患者编号", required = true, example = "B2")
@@ -454,6 +532,7 @@
        return success("操作成功");
    }
    // 【本需求·排队队列供服务台分诊调度使用】不再做「工位主人」校验(原因同上)。
    @GetMapping("/recall-patient")
    @Operation(summary = "过号病人召回")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -475,6 +554,7 @@
        return success("操作成功");
    }
    // 【本需求·排队队列供服务台分诊调度使用】不再做「工位主人」校验(原因同上)。
    @GetMapping("/recall-install-patient")
    @Operation(summary = "过号安装病人召回")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -490,10 +570,15 @@
            @RequestParam("roomId_operator") Long roomId_operator,
            @RequestParam("bedNo_operator") String bedNo_operator )
    {
        if (roomId != roomId_operator)
            return error(QUEUE_RECALL_INSTALL_NOT_CUR_ROOM);
        // 【本需求·排队队列供服务台分诊调度使用】去掉「操作者工位必须等于患者工位」的校验:
        //   · 分诊台不占座,roomId_operator / bedNo_operator 可能是空或与服务台当前工位不一致;
        //   · 排队队列页传的是**队列行内的工位**,本来也只用于亲和项重新定位。
        // 原校验:if (roomId != roomId_operator) return error(QUEUE_RECALL_INSTALL_NOT_CUR_ROOM);
        // 现在:操作者工位缺失时,退化为用患者队列行上的工位(roomId/bedNo)。
        Long operatorRoomId = (null != roomId_operator) ? roomId_operator : roomId;
        String operatorBedNo = (null != bedNo_operator && !bedNo_operator.isEmpty()) ? bedNo_operator : bedNo;
        Integer result = queueService.recallInstallPatient(roomId, bedNo, patId, checkType, roomId_operator, bedNo_operator);
        Integer result = queueService.recallInstallPatient(roomId, bedNo, patId, checkType, operatorRoomId, operatorBedNo);
        if (null == result || 0 == result)
            return error(PATIENT_NOT_EXISTS);
@@ -502,6 +587,7 @@
    // ==================== 需求2:撤销「叫号 / 检查完成」 ====================
    @RequireBedOwner("撤销检查完成")
    @GetMapping("/undo-finish-patient")
    @Operation(summary = "撤销检查完成:已就诊(40) → 候诊中(20)")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -519,9 +605,14 @@
        if (null == result || 0 == result) {
            return error(APPOINTMENT_NOT_EXISTS);
        }
        // 【本次修复】只回滚队列状态是不够的:检查单(dev_rent)仍停在「常规检查完成(60)」,
        // 前端再次完成时取不到「待检查」单(rentId 为空)→ 后端报「请先预约确认」。
        // 这里把检查单回滚成「待检查」并取消确费(内部已 try/catch,失败不影响撤销结果)。
        devRentService.rollbackRoutineFinish(patId, checkType);
        return success("已撤销检查完成,患者已返回候诊区");
    }
    @RequireBedOwner("撤销叫号")
    @GetMapping("/undo-call-patient")
    @Operation(summary = "撤销叫号:就诊中(30) → 候诊中(20)")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -551,6 +642,7 @@
    // ==================== 需求3:停止候诊开关 ====================
    @RequireBedOwner("停止候诊")
    @GetMapping("/stop-ready")
    @Operation(summary = "停止候诊:不再新增候诊患者(已有候诊仍可叫号)")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
@@ -566,6 +658,7 @@
        return success(true);
    }
    @RequireBedOwner("恢复候诊")
    @GetMapping("/resume-ready")
    @Operation(summary = "恢复候诊:重新开始接收候诊患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")