package com.ruoyi.phone.controller; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.phone.api.PhoneApi; import com.ruoyi.phone.domain.PhoneCallBackVO; import com.ruoyi.phone.domain.PhoneCallBackYQVO; import com.ruoyi.phone.domain.PhoneCallRecordVO; import com.ruoyi.phone.domain.PhoneCallReqYQVO; import com.ruoyi.phone.domain.PullTaskVO; import com.ruoyi.task.domain.ServiceSubTaskDetailReq; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; 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 java.util.List; /** * 外呼回调 / 任务拉取 Controller(上海 + 雨绮两条通道)。 * *

⚠️ URL 与模块化前完全一致

* 这些端点是外部电话平台回调用地址,模块化时刻意不改路径 * ({@code /smartor/serviceSubtask/xxx}),否则线上需要同步改电话平台的配置, * 且 {@code SecurityConfig} 的免登录白名单也要跟着改。 * 因此本 Controller 与 {@code ruoyi-task} 的 {@code ServiceSubtaskController} * 共用一个 URL 前缀——只要完整路径不重复,Spring 可以正常注册。 * *

为什么走门面(PhoneApi)而不是内部 IPhoneService

* 与出入院/满意度模块"模块只有门面一个入口"的约定一致: * 门面统一承担"开关关闭 → 降级/明确报错"的处理,Controller 不再各写一遍判断。 * *

与模块开关的关系

* 这 8 个端点(含三汇那个 Controller)由 {@code PhoneWebConfig} 挂 * {@code PhoneAvailabilityInterceptor};同时在 {@code TaskWebConfig} 里把其中 6 条 * 从"任务模块开关"的拦截范围里排除,做到两个模块的开关各管各的。 * * @author ruoyi * @date 2024-08-08 */ @Slf4j @Api(description = "外呼回调(上海/雨绮)") @RestController @RequestMapping("/smartor/serviceSubtask") public class PhoneCallbackController extends BaseController { @Autowired private PhoneApi phoneApi; /** * 电话回调任务(上海) */ @ApiOperation("电话回调任务") @PostMapping("/phoneCallBack") public AjaxResult phoneCallBack(@RequestBody PhoneCallBackVO phoneCallBackVO) { phoneApi.phoneCallBack(phoneCallBackVO); return success(); } /** * 电话ASR通话回调(雨绮) */ @ApiOperation("电话ASR通话回调(雨绮)") @PostMapping("/phoneCallBackYQ") public PhoneCallBackYQVO phoneCallBackYQ(@RequestBody PhoneCallReqYQVO phoneCallReqYQVO) { log.info("电话ASR通话回调(雨绮) ?{}", phoneCallReqYQVO); return phoneApi.phoneCallBackYQ(phoneCallReqYQVO); } /** * 电话任务拉取(雨绮) */ @ApiOperation("电话任务拉取(雨绮)") @PostMapping("/taskPull") public List taskPull() { log.info("电话任务拉取(雨绮)"); List pullTaskVOList = phoneApi.taskPull(); log.info("电话任务拉取数据(雨绮):{}", pullTaskVOList); return pullTaskVOList; } /** * 患者问题结果记录(电话) */ @ApiOperation("患者问题结果记录(电话)") @PostMapping("/saveQuestionAnswerPhone") public AjaxResult saveQuestionAnswerPhone(@RequestBody ServiceSubTaskDetailReq serviceSubTaskDetailReq) { log.info("患者问题结果记录(电话):{}", serviceSubTaskDetailReq); return toAjax(phoneApi.saveQuestionAnswerPhone(serviceSubTaskDetailReq)); } /** * 通话记录回调(上海) */ @ApiOperation("通话记录回调(上海)") @PostMapping("/recordAcceptshanghai") public AjaxResult recordAccepshanghait(@RequestBody ServiceSubTaskDetailReq serviceSubTaskDetailReq) { log.info("通话记录回调(上海):{}", serviceSubTaskDetailReq); return toAjax(phoneApi.saveQuestionAnswerPhone(serviceSubTaskDetailReq)); } /** * 通话记录回调(雨绮) */ @ApiOperation("通话记录回调(雨绮)") @PostMapping("/recordAccept") public AjaxResult recordAccept(@RequestBody PhoneCallRecordVO phoneCallRecordVO) { log.info("通话记录回调(雨绮):{}", phoneCallRecordVO); phoneApi.recordAccept(phoneCallRecordVO); return success(); } }