package com.ruoyi.satisfaction.api;
import com.ruoyi.satisfaction.domain.ServiceSubtaskDetailRatioExport;
import com.ruoyi.satisfaction.service.SatisfactionSubtaskService;
import com.ruoyi.satisfaction.support.MydOptionRatioChartBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* {@link SatisfactionApi} 的内部实现(常驻 Bean)。
*
* 开关已改为存放在 {@code sys_config} 参数表的 {@code satisfaction.enabled},
* 运行时热读,因此本 Bean 无条件创建:
*
* - 参数为 {@code true}(默认)→ {@link SatisfactionFacade} 正常转发到本实现;
* - 参数为 {@code false} → 本 Bean 仍然存在,但门面在
* {@link com.ruoyi.satisfaction.config.SatisfactionSwitch} 判断为关闭后
* 不再转发,而是返回安全空值/全零。
*
* 之所以不再用 {@code @ConditionalOnProperty}:那个注解只在启动时求值一次,
* 与"改完参数配置即时生效"的诉求冲突。
*
* 调用方不要直接注入本类,应注入 {@link SatisfactionFacade}。
*/
@Slf4j
@Component
public class DefaultSatisfactionApi implements SatisfactionApi {
private final SatisfactionSubtaskService satisfactionSubtaskService;
public DefaultSatisfactionApi(SatisfactionSubtaskService satisfactionSubtaskService) {
this.satisfactionSubtaskService = satisfactionSubtaskService;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public Map getSatisfactionCategories(String orgid) {
return satisfactionSubtaskService.getSatisfactionCategories(orgid);
}
@Override
public SatisfactionExportBundle getQuestionOptionRatioExport(List subtaskIds, String questiontext) {
List rows =
satisfactionSubtaskService.statMydQuestionOptionForExport(subtaskIds, questiontext);
if (rows == null || rows.isEmpty()) {
// 没有行时不给图表构建器:ExcelUtil 会跳过该 Sheet(与原实现"空数据不画图"一致)
return new SatisfactionExportBundle(rows, ServiceSubtaskDetailRatioExport.class, null);
}
return new SatisfactionExportBundle(rows, ServiceSubtaskDetailRatioExport.class,
new MydOptionRatioChartBuilder(rows));
}
@Override
public boolean hasSatisfactionCategory(String orgid) {
Map categories = satisfactionSubtaskService.getSatisfactionCategories(orgid);
if (categories == null || categories.isEmpty()) {
return false;
}
Object voice = categories.get("voiceCategories");
Object questionnaire = categories.get("questionnaireCategorys");
return isNotEmpty(voice) || isNotEmpty(questionnaire);
}
private boolean isNotEmpty(Object value) {
return value instanceof java.util.Collection && !((java.util.Collection>) value).isEmpty();
}
@Override
public Map getSatisfactionIndex(String type, String code, String orgid,
Long ivrCategoryid, Long svyCategoryid) {
return satisfactionSubtaskService.getSatisfactionIndex(type, code, orgid, ivrCategoryid, svyCategoryid);
}
}