package com.ruoyi.phone.api; import com.ruoyi.phone.config.PhoneProperties; import com.ruoyi.phone.config.PhoneSwitch; import com.ruoyi.phone.domain.PhoneCallBackSHVO; 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.PhoneCallResultYQVO; import com.ruoyi.phone.domain.PullTaskVO; import com.ruoyi.phone.service.IPhoneService; import com.ruoyi.task.domain.ServiceSubTaskDetailReq; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Collections; import java.util.List; /** * 电话模块对外门面(常驻 Bean)。 * *
* @Autowired
* private PhoneApi phoneApi;
*
* if (phoneApi.isEnabled()) {
* List<PullTaskVO> tasks = phoneApi.taskPull();
* }
*
*/
@Slf4j
@Component
public class PhoneFacade implements PhoneApi {
/**
* 运行时开关({@code sys_config} 优先,{@link PhoneProperties} 兜底)
*/
private final PhoneSwitch phoneSwitch;
/**
* 模块内实现(唯一实现 {@code PhoneServiceImpl})。
* * 与满意度门面不同,这里不需要 {@code ObjectProvider} + 自引用过滤: * 本类不实现 {@code IPhoneService},不存在"Spring 把自引用当兜底候选"导致的无限递归; * 实现 Bean 也不受任何条件装配控制,恒定存在。 *
* 允许为 {@code null}:仅供测试/非 Spring 环境构造时使用(此时所有方法按"不可用"降级)。 */ private final IPhoneService phoneService; /** * Spring 使用的构造器。 *
* ⚠️ 显式标注 {@code @Autowired}:本类有两个公开构造器(另一个给测试用),
* 标注后 Spring 不会退回查找无参构造器。该规则已由
* {@code sql/_probe/verify_spring_beans.py} 静态把关。
*/
@Autowired
public PhoneFacade(PhoneSwitch phoneSwitch, IPhoneService phoneService) {
this.phoneSwitch = phoneSwitch;
this.phoneService = phoneService;
}
/**
* 供测试/非 Spring 环境直接构造:{@code sysConfigValue} 就是 {@code sys_config}
* 里 {@code phone.enabled} 的值,{@code null} 表示"参数行不存在";{@code phoneService} 可为 {@code null}。
*/
public PhoneFacade(PhoneProperties properties, String sysConfigValue, IPhoneService phoneService) {
this(new PhoneSwitch(properties, sysConfigValue), phoneService);
}
/**
* 取运行时开关(供拦截器复用同一实例、也供测试断言)
*/
public PhoneSwitch getPhoneSwitch() {
return phoneSwitch;
}
@Override
public boolean isEnabled() {
return phoneSwitch.isEnabled();
}
@Override
public void phoneCallBack(PhoneCallBackVO phoneCallBackVO) {
if (!available("phoneCallBack")) {
return;
}
phoneService.phoneCallBack(phoneCallBackVO);
}
@Override
public PhoneCallBackYQVO phoneCallBackYQ(PhoneCallReqYQVO phoneCallReqYQVO) {
if (!available("phoneCallBackYQ")) {
return new PhoneCallBackYQVO();
}
return phoneService.phoneCallBackYQ(phoneCallReqYQVO);
}
@Override
public List