liusheng
2026-10-12 0c1f8c479065739f3c7a5126de8e667035d00b58
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -23,9 +23,9 @@
import com.ruoyi.quartz.task.RyTask;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserDeptService;
import com.smartor.common.MydOptionRatioChartBuilder;
import com.ruoyi.satisfaction.api.SatisfactionExportBundle;
import com.ruoyi.satisfaction.api.SatisfactionFacade;
import com.smartor.domain.*;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.VO.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskRecordService;
@@ -69,6 +69,15 @@
    @Autowired
    private IServiceSubtaskService serviceSubtaskService;
    /**
     * 满意度模块对外门面(常驻 Bean)。
     * <p>
     * 满意度相关数据(问题详情占比)只能通过它获取;满意度模块关闭时
     * 门面返回空结果并打 WARN,<b>不会</b>影响随访导出的其它内容。
     */
    @Autowired
    private SatisfactionFacade satisfactionFacade;
    @Autowired
    private IServiceTaskService serviceTaskService;
@@ -205,7 +214,8 @@
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskEntity);
        }
        List<ServiceSubtaskExport> serviceSubtaskExports = null;
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = null;
        //满意度占比导出包:默认空包(没有可导出的患者时保持为空),有数据时由满意度门面填充
        SatisfactionExportBundle ratioBundle = SatisfactionExportBundle.empty();
        if (!CollectionUtils.isEmpty(serviceSubtaskList)) {
            serviceSubtaskExports = DtoConversionUtils.sourceToTarget(serviceSubtaskList, ServiceSubtaskExport.class);
            for (ServiceSubtaskExport serviceSubtaskExport : serviceSubtaskExports) {
@@ -223,21 +233,23 @@
                }
            }
            //问题详情占比:只统计本次导出的这批患者,数量=选该选项的患者数,比例=占该题作答人数
            //满意度模块化后:只通过满意度模块暴露的 api 包取数(导出包 = 行 + 行类型 + 图表构建器);
            //模块关闭(satisfaction.enabled=false)时门面返回空导出包,导出照常完成(只是没有占比 Sheet)。
            List<Long> subtaskIds = new ArrayList<>();
            for (ServiceSubtaskRes serviceSubtaskRes : serviceSubtaskList) {
                if (serviceSubtaskRes.getId() != null) {
                    subtaskIds.add(serviceSubtaskRes.getId());
                }
            }
            serviceSubtaskDetailRatioExports = serviceSubtaskService.statMydQuestionOptionForExport(subtaskIds, null);
            ratioBundle = satisfactionFacade.getQuestionOptionRatioExport(subtaskIds, null);
        }
        ExcelUtil<ServiceSubtaskExport> util = new ExcelUtil<ServiceSubtaskExport>(ServiceSubtaskExport.class);
        //第三个Sheet:问题详情占比图表(按任务名称分组,一个任务一张柱状图)
        util.exportExcelTwoSheetWithChart(response, serviceSubtaskExports, "患者随访信息表单",
                serviceSubtaskDetailRatioExports, "问题详情占比", ServiceSubtaskDetailRatioExport.class,
                new MydOptionRatioChartBuilder(serviceSubtaskDetailRatioExports));
                ratioBundle.getRows(), "问题详情占比", ratioBundle.getRowClass(),
                ratioBundle.getChartBuilder());
    }
    /**