| | |
| | | @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} 兜底) |
| | |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | * <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); |
| | | } |
| | | |
| | | /** |