package com.estate.expert.admin.service.impl; import com.alibaba.fastjson.JSONObject; import com.deepoove.poi.XWPFTemplate; import com.estate.expert.admin.domain.business.device.usage.DeviceUsage; import com.estate.expert.admin.domain.exam.eval.fuzzy.EvalFuzzyResult; import com.estate.expert.admin.domain.exam.eval.score.EvalScoreResult; import com.estate.expert.admin.domain.report.ReportTemplate; import com.estate.expert.admin.enums.BizResultCode; import com.estate.expert.admin.service.*; import com.estate.expert.admin.service.eval.EvalFuzzyService; import com.estate.expert.admin.service.eval.EvalScoreService; import com.estate.expert.admin.stat.report.builder.DeviceReportBuilder; import com.estate.expert.admin.stat.report.builder.ReportBuilderBase; import com.estate.expert.admin.stat.report.builder.SystemReportBuilder; import com.estate.expert.admin.stat.report.data.impl.DeviceFuzzyReportData; import com.estate.expert.admin.stat.report.data.impl.DeviceScoreReportData; import com.estate.expert.admin.stat.report.data.impl.SystemFuzzyReportData; import com.estate.expert.admin.stat.report.data.impl.SystemScoreReportData; import com.estate.expert.common.exception.BizException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * 报告数据服务实现类 **/ @Slf4j @Service public class ReportServiceImpl implements ReportService { @Resource private ReportTemplateService reportTemplateService; @Resource private ProjectInfoService projectInfoService; @Resource private DeviceUsageService deviceUsageService; @Resource private EvalFuzzyService evalFuzzyService; @Resource private EvalScoreService evalScoreService; @Resource private ErrorRecordService errorRecordService; @Resource private DeviceService deviceService; @Resource private UserFileService userFileService; @Override public JSONObject fuzzyReportData(Integer checkTaskId, Integer templateId) { var evalFuzzyResult = evalFuzzyService.getByCheckTaskId(checkTaskId); BizResultCode.EVAL_FUZZY_RESULT_NOT_EXIST.check(evalFuzzyResult == null); var evalScoreResult = evalScoreService.getByCheckTaskId(checkTaskId); BizResultCode.EVAL_SCORE_RESULT_NOT_EXIST.check(evalScoreResult == null); var reportTemplate = reportTemplateService.get(templateId); BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null); switch (reportTemplate.getType()) { case ThirdPartyReport: return buildFuzzySystemReportData(evalFuzzyResult, evalScoreResult, reportTemplate); case DeviceReport: return buildFuzzyDeviceReportData(evalFuzzyResult, evalScoreResult, reportTemplate); default: throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST); } } @Override public JSONObject scoreReportData(Integer checkTaskId, Integer templateId) { var evalFuzzyResult = evalFuzzyService.getByCheckTaskId(checkTaskId); BizResultCode.EVAL_FUZZY_RESULT_NOT_EXIST.check(evalFuzzyResult == null); var evalScoreResult = evalScoreService.getByCheckTaskId(checkTaskId); BizResultCode.EVAL_SCORE_RESULT_NOT_EXIST.check(evalScoreResult == null); var reportTemplate = reportTemplateService.get(templateId); BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null); switch (reportTemplate.getType()) { case ThirdPartyReport: return buildScoreSystemReportData(evalFuzzyResult, evalScoreResult, reportTemplate); case DeviceReport: return buildScoreDeviceReportData(evalFuzzyResult, evalScoreResult, reportTemplate); default: throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST); } } @Override public XWPFTemplate fuzzyReport(Integer checkTaskId, Integer templateId) { var reportData = fuzzyReportData(checkTaskId, templateId); var builder = getReportBuilder(templateId); var template = reportTemplateService.get(templateId); // reportData to JSONObject return builder.buildReport(reportData, template.getConfig()); } @Override public XWPFTemplate scoreReport(Integer checkTaskId, Integer templateId) { var reportData = scoreReportData(checkTaskId, templateId); var builder = getReportBuilder(templateId); var template = reportTemplateService.get(templateId); // reportData to JSONObject return builder.buildReport(reportData, template.getConfig()); } private ReportBuilderBase getReportBuilder(Integer templateId) { var reportTemplate = reportTemplateService.get(templateId); BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null); switch (reportTemplate.getType()) { case ThirdPartyReport: return new SystemReportBuilder(userFileService); case DeviceReport: return new DeviceReportBuilder(userFileService); default: throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST); } } private JSONObject buildFuzzySystemReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult, ReportTemplate reportTemplate) { // 查询必须要的数据 var records = errorRecordService.listSystemErrors(evalFuzzyResult.getTask().getId()); var project = evalFuzzyResult.getProject(); var projectInfo = evalFuzzyResult.getTask().getProjectInfo(); // var projectInfo = projectInfoService.getByCheckTaskId(evalFuzzyResult.getTask().getId()); var deviceUsages = deviceUsageService.listUsages(project.getId(), null); var devices= deviceUsages.stream().map(DeviceUsage::getDevice).toList(); var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent(); // 生成报告数据 return SystemFuzzyReportData.builder() .reportId(evalFuzzyResult.getId()) .systemHierarchy(hierarchy) .sysResult(evalFuzzyResult.getSystemRes()) .scoreResult(scoreResult.getSystemRes()) .template(reportTemplate) .project(project) .projectInfo(projectInfo) .devices(devices) .records(records) .build() .generate(); } private JSONObject buildScoreSystemReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult, ReportTemplate reportTemplate) { // 查询必须要的数据 var records = errorRecordService.listSystemErrors(evalFuzzyResult.getTask().getId()); var project = evalFuzzyResult.getProject(); // var projectInfo = projectInfoService.latest(evalFuzzyResult.getProject().getId()); var projectInfo = evalFuzzyResult.getTask().getProjectInfo(); var deviceUsages = deviceUsageService.listUsages(project.getId(), null); var devices= deviceUsages.stream().map(DeviceUsage::getDevice).toList(); var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent(); // 生成报告数据 return SystemScoreReportData.builder() .reportId(evalFuzzyResult.getId()) .systemHierarchy(hierarchy) .sysResult(evalFuzzyResult.getSystemRes()) .scoreResult(scoreResult.getSystemRes()) .template(reportTemplate) .project(project) .projectInfo(projectInfo) .devices(devices) .records(records) .build() .generate(); } private JSONObject buildFuzzyDeviceReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult, ReportTemplate reportTemplate) { var records = errorRecordService.listDeviceErrors(evalFuzzyResult.getTask().getId()); var project = evalFuzzyResult.getProject(); var projectInfo = evalFuzzyResult.getTask().getProjectInfo(); // var projectInfo = projectInfoService.getByCheckTaskId(evalFuzzyResult.getTask().getId()); var deviceIds = evalFuzzyResult.getDeviceResMap().keySet(); var devices = deviceService.findAllById(deviceIds); var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent(); // 生成报告数据 return DeviceFuzzyReportData.builder() .reportId(evalFuzzyResult.getId()) .deviceResMap(evalFuzzyResult.getDeviceResMap()) .deviceHierarchy(hierarchy) .template(reportTemplate) .project(project) .projectInfo(projectInfo) .devices(devices) .records(records) .build() .generate(); } private JSONObject buildScoreDeviceReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult evalScoreResult, ReportTemplate reportTemplate) { var records = errorRecordService.listDeviceErrors(evalFuzzyResult.getTask().getId()); var project = evalFuzzyResult.getProject(); // var projectInfo = projectInfoService.getByCheckTaskId(evalFuzzyResult.getTask().getId()); var projectInfo = evalFuzzyResult.getTask().getProjectInfo(); var deviceIds = evalFuzzyResult.getDeviceResMap().keySet(); var devices = deviceService.findAllById(deviceIds); var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent(); // 生成报告数据 return DeviceScoreReportData.builder() .reportId(evalFuzzyResult.getId()) .deviceResMap(evalFuzzyResult.getDeviceResMap()) .deviceScoreResMap(evalScoreResult.getDeviceResMap()) .deviceHierarchy(hierarchy) .template(reportTemplate) .project(project) .projectInfo(projectInfo) .devices(devices) .records(records) .build() .generate(); } }