package com.ruoyi.publicity.controller; import com.ruoyi.common.core.service.IConfigService; import com.ruoyi.publicity.api.PublicityFacade; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.LinkedHashMap; import java.util.Map; /** * 宣教模块的 HTTP 入口:宣教生成入口 + 开关/状态查询。 * *
* POST /smartor/publicity/dealInHospPublicity 入院宣教(科室 type=4 / 病区 type=5) * POST /smartor/publicity/dealMedicalPublicity 药品宣教(仅 sltd 站点,type=0) * GET /smartor/publicity/status 开关与子开关状态(只读、不受开关拦截) ** *
* ⚠️ 注入门面而不是 {@code PublicityService}:门面永远存在, * 即使模块被开关关掉或没被打进应用,本 Controller 也不会启动失败, * 只是调用降级并打 WARN。 */ @Autowired private PublicityFacade publicityFacade; /** * 参数配置服务(ruoyi-common 的接口,实现在 ruoyi-system)。 *
* ⚠️ 用 {@code ObjectProvider} 惰性取:本模块只依赖 ruoyi-common,
* 在独立部署/测试等"容器里没有实现"的场景下不能因此启动失败。
*/
@Autowired
private ObjectProvider
* 逐行对应原 {@code PatMedInhospServiceImpl#dealOutHospInfo} L331-409 的调用部分:
* 原实现在主流程里直接调 {@code dealInHospPublicity(config)},此处只是把它暴露成端点。
*
* 返回处理记录数(与原实现的日志用值同源),便于手工触发时看到结果。
*/
@ApiOperation("入院宣教(科室 type=4 / 病区 type=5)")
@PostMapping("/dealInHospPublicity")
public int dealInHospPublicity() {
return publicityFacade.dealInHospPublicity(readVisitEarlyDay());
}
/**
* 药品宣教:按患者的 {@code medicalCode} 逐个药品编码匹配长期宣教任务(type=0)。
*
* 仅 {@code spring.profiles.active == "sltd"} 时执行,其它站点由
* {@code PublicityServiceImpl} 直接返回 0(站点判断不在本 Controller,
* 与原实现位置一致)。
*/
@ApiOperation("药品宣教(仅 sltd 站点,type=0)")
@PostMapping("/dealMedicalPublicity")
public int dealMedicalPublicity() {
return publicityFacade.dealMedicalPublicity(readVisitEarlyDay());
}
/**
* 开关与子开关状态(只读,不触发任何业务)。
*
* 专为排查"为什么没发宣教"而设:把两个层级的开关、以及"实现是否装配"
* 分别报出来,避免把"模块关了"误判成"没配长期宣教任务"。
*/
@ApiOperation("查询宣教模块开关状态")
@GetMapping("/status")
public Map
* 取不到(没有实现 / 读库异常)时返回 {@code null} 并打 WARN ——
* 原实现在这种情况下拿到的也是 {@code null},故语义一致。
*/
private String readVisitEarlyDay() {
return readConfig(VISIT_EARLY_DAY_KEY);
}
/**
* 读任意 {@code sys_config} 键;没有实现或读失败时返回 {@code null} 并打 WARN。
*/
private String readConfig(String key) {
if (configServiceProvider == null) {
return null;
}
try {
IConfigService svc = configServiceProvider.stream().findFirst().orElse(null);
if (svc == null) {
log.warn("【宣教】容器里没有 IConfigService 实现,{} 按未配置(null)处理。", key);
return null;
}
return svc.selectConfigByKey(key);
} catch (Exception e) {
log.warn("【宣教】读取 {} 失败,按未配置(null)处理:{}", key, e.toString());
return null;
}
}
}