package com.ruoyi.publicity.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 宣教模块的拦截器注册。
*
* 与 {@code InhospVisitWebConfig} 完全同款做法与理由。
*
*
为什么只挂 2 条精确路径,不用 {@code /smartor/publicity/**} 前缀
* 本模块的端点是:
*
* POST /smartor/publicity/dealInHospPublicity ← 挂(会生成宣教)
* POST /smartor/publicity/dealMedicalPublicity ← 挂(会生成宣教)
* GET /smartor/publicity/status ← 不挂(只读状态查询)
*
* {@code /status} 是排查"为什么没发宣教"的唯一入口,模块关掉时恰恰最需要它;
* 若用前缀把它一起拦了,就等于"出问题时连诊断入口都进不去"。
* 这也与出入院模块"开关只拦随访触发、不拦数据端点"的约定保持一致。
*
* 新增端点时的约定
* 往后本模块若再加端点,默认不加入本清单;
* 只有"会真的生成/改变宣教数据"的端点才挂,并同步更新
* {@code PublicityContextCheck} 里的受保护路径条数断言。
*/
@Configuration
public class PublicityWebConfig implements WebMvcConfigurer {
/**
* 入院宣教(科室 type=4 / 病区 type=5)
*/
public static final String DEAL_IN_HOSP_PUBLICITY_ENDPOINT =
"/smartor/publicity/dealInHospPublicity";
/**
* 药品宣教(仅 sltd 站点,type=0)
*/
public static final String DEAL_MEDICAL_PUBLICITY_ENDPOINT =
"/smartor/publicity/dealMedicalPublicity";
/**
* 状态查询端点 —— 刻意不纳入拦截,仅作为常量公开,
* 便于测试断言"它确实没被挂上"。
*/
public static final String STATUS_ENDPOINT_PENDING =
"/smartor/publicity/status";
@Autowired
private PublicityAvailabilityInterceptor publicityAvailabilityInterceptor;
/**
* 供测试/非 Spring 环境直接构造
*/
public PublicityWebConfig(PublicityAvailabilityInterceptor publicityAvailabilityInterceptor) {
this.publicityAvailabilityInterceptor = publicityAvailabilityInterceptor;
}
/**
* 受开关保护的精确路径(供测试断言条数与内容)
*/
public static String[] guardedPathPatterns() {
return new String[]{
DEAL_IN_HOSP_PUBLICITY_ENDPOINT,
DEAL_MEDICAL_PUBLICITY_ENDPOINT,
};
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(publicityAvailabilityInterceptor)
.addPathPatterns(guardedPathPatterns())
// 拦截器本身很轻(只读一个 boolean),order 给小值让它在业务拦截器之前执行
.order(-100);
}
}