liusheng
14 小时以前 ab2884ade73fed97d1e7d7daf4b9b5b6dee83fdd
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/api/InhospVisitFacade.java
@@ -51,22 +51,9 @@
@Component
public class InhospVisitFacade implements InhospVisitApi,
        InhospVisitDataService,
        com.ruoyi.common.core.service.PreachformApi,
        com.ruoyi.common.core.service.PublicitySubtaskApi {
    private final InhospVisitProperties properties;
    /**
     * 宣教单({@code service_subtask_preachform})数据访问。
     * <p>
     * ⚠️ 用 {@code ObjectProvider} 惰性取,而不是直接注入接口 —— 理由同 {@code dataService}:
     * 本类自身也实现了 {@code PreachformApi},按接口类型直接注入会命中"正在创建的自己"
     * ({@code BeanCurrentlyInCreationException})。
     * <p>
     * 该表的归属模块是本模块;跨模块 SQL 收口后,外部只经 {@code PreachformApi} 访问它
     * (此前 smartor 里另有一整份同表 Mapper 与 XML,已删除)。
     */
    private final ObjectProvider<com.ruoyi.common.core.service.PreachformApi> preachformApiProvider;
    /**
     * 运行时开关({@code sys_config} 优先,{@link InhospVisitProperties} 兜底)
@@ -107,103 +94,11 @@
    public InhospVisitFacade(InhospVisitProperties properties,
                             InhospVisitSwitch inhospVisitSwitch,
                             ObjectProvider<InhospVisitApi> apiProvider,
                             ObjectProvider<InhospVisitDataService> dataServiceProvider,
                             ObjectProvider<com.ruoyi.common.core.service.PreachformApi> preachformApiProvider) {
                             ObjectProvider<InhospVisitDataService> dataServiceProvider) {
        this.properties = properties;
        this.inhospVisitSwitch = inhospVisitSwitch;
        this.apiProvider = apiProvider;
        this.dataService = firstDataServiceOrNull(dataServiceProvider);
        this.preachformApiProvider = preachformApiProvider;
    }
    /**
     * 取宣教单数据访问实现;容器里没有、状态异常、或<b>只找到自己</b>时返回 {@code null}。
     * <p>
     * ⚠️ 与 {@link #firstDataServiceOrNull} 同一手法与理由(自引用 / 循环依赖)。
     */
    private com.ruoyi.common.core.service.PreachformApi preachformOrNull() {
        if (preachformApiProvider == null) {
            return null;
        }
        try {
            return preachformApiProvider.stream()
                    .filter(svc -> svc != this)
                    .findFirst()
                    .orElse(null);
        } catch (Exception e) {
            log.warn("【出入院随访】获取宣教单数据服务失败,相关访问将降级:{}", e.toString());
            return null;
        }
    }
    /**
     * 数据服务是否不可用(不可用时打 WARN 并返回 true)
     */
    private boolean preachformUnavailable(String method) {
        if (preachformOrNull() == null) {
            log.warn("【出入院随访】宣教单数据服务不可用,{} 跳过。", method);
            return true;
        }
        return false;
    }
    // ==================================================================
    // 宣教单 service_subtask_preachform(PreachformApi)
    //
    // ⚠️ 与上面 6 个随访方法的关键区别:以下方法【不做开关判断】。
    //    它是跨模块 SQL 收口后的数据访问入口(替代 smartor 里那份同表 Mapper),
    //    属数据基础设施;开关只该控制"要不要生成随访"。
    // ==================================================================
    @Override
    public com.ruoyi.common.core.service.dto.VisitPreachformRow findById(Long id) {
        return preachformUnavailable("findById") ? null : preachformOrNull().findById(id);
    }
    @Override
    public java.util.List<com.ruoyi.common.core.service.dto.VisitPreachformRow> findList(
            com.ruoyi.common.core.service.dto.VisitPreachformRow query) {
        return preachformUnavailable("findList")
                ? java.util.Collections.<com.ruoyi.common.core.service.dto.VisitPreachformRow>emptyList()
                : preachformOrNull().findList(query);
    }
    @Override
    public java.util.List<com.ruoyi.common.core.service.dto.VisitPreachformRow> findByTaskidAndOrgid(
            Long taskid, String orgid) {
        return preachformUnavailable("findByTaskidAndOrgid")
                ? java.util.Collections.<com.ruoyi.common.core.service.dto.VisitPreachformRow>emptyList()
                : preachformOrNull().findByTaskidAndOrgid(taskid, orgid);
    }
    @Override
    public boolean insert(com.ruoyi.common.core.service.dto.VisitPreachformRow row) {
        return !preachformUnavailable("insert") && preachformOrNull().insert(row);
    }
    @Override
    public boolean updateById(com.ruoyi.common.core.service.dto.VisitPreachformRow row) {
        return !preachformUnavailable("updateById") && preachformOrNull().updateById(row);
    }
    @Override
    public boolean updateByCondition(com.ruoyi.common.core.service.dto.VisitPreachformRow row) {
        return !preachformUnavailable("updateByCondition") && preachformOrNull().updateByCondition(row);
    }
    @Override
    public boolean softDeleteById(Long id) {
        return !preachformUnavailable("softDeleteById") && preachformOrNull().softDeleteById(id);
    }
    @Override
    public boolean softDeleteByIds(Long[] ids) {
        return !preachformUnavailable("softDeleteByIds") && preachformOrNull().softDeleteByIds(ids);
    }
    @Override
    public boolean softDeleteBySubid(Long subid) {
        return !preachformUnavailable("softDeleteBySubid") && preachformOrNull().softDeleteBySubid(subid);
    }
    /**
@@ -243,12 +138,12 @@
     * <p>
     * 开关取自 {@code sys_config} 的模拟键值,从而保证"开关校验"脚本无需 Spring/数据库即可运行。
     * <p>
     * 数据服务不传:测试构造下不提供基础出入院信息访问与宣教单访问
     * 数据服务不传:测试构造下不提供基础出入院信息访问
     * (调用会得到 null / 空集合 / false),保证"开关校验"类测试不必拉起数据库。
     */
    public InhospVisitFacade(InhospVisitProperties properties, InhospVisitApi delegate, String sysConfigValue) {
        this(properties, new InhospVisitSwitch(properties, sysConfigValue), new FixedProvider(delegate),
                null, null);
                null);
    }
    /**