From 0c1f8c479065739f3c7a5126de8e667035d00b58 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 12 十月 2026 14:21:52 +0800
Subject: [PATCH] 【丽水】满意度模块化:新增 ruoyi-satisfaction 独立模块
---
ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java | 322 ++++++++++++++++++++++++-----------------------------
1 files changed, 148 insertions(+), 174 deletions(-)
diff --git a/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java
similarity index 79%
rename from smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
rename to ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java
index 9e07d77..5d1078a 100644
--- a/smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
+++ b/ruoyi-satisfaction/src/main/java/com/ruoyi/satisfaction/service/impl/PatSatisfactionServiceImpl.java
@@ -1,4 +1,4 @@
-package com.smartor.service.impl;
+package com.ruoyi.satisfaction.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -12,18 +12,27 @@
import com.ruoyi.common.utils.ArrayListUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
-import com.smartor.domain.*;
-import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
-import com.smartor.domain.VO.PatSatisfactionReqVO;
-import com.smartor.domain.VO.PatSatisfactionResVO;
-import com.smartor.domain.entity.PatSatisfactionDetailEntity;
-import com.smartor.domain.entity.SatisfactionStatQuery;
-import com.smartor.domain.entity.ServiceSubtaskSatisfactionEntity;
-import com.smartor.mapper.*;
+import com.ruoyi.satisfaction.domain.vo.PatSatisfactionReqVO;
+import com.ruoyi.satisfaction.domain.vo.PatSatisfactionResVO;
+import com.ruoyi.satisfaction.domain.entity.PatSatisfactionDetailEntity;
+import com.ruoyi.satisfaction.domain.entity.SatisfactionStatQuery;
+import com.ruoyi.satisfaction.domain.entity.ServiceSubtaskSatisfactionEntity;
+import com.ruoyi.satisfaction.mapper.PatSatisfactionMapper;
+import com.ruoyi.satisfaction.mapper.SatisfactionMapper;
+import com.ruoyi.satisfaction.mapper.SatisfactionScriptMapper;
+import com.ruoyi.satisfaction.domain.row.SatisfactionCategoryRow;
+import com.ruoyi.satisfaction.domain.row.SatisfactionIvrScriptRow;
+import com.ruoyi.satisfaction.domain.row.SatisfactionOptionScoreRow;
+import com.ruoyi.satisfaction.domain.row.SatisfactionScriptQuery;
+import com.ruoyi.satisfaction.domain.row.SatisfactionSvyScriptRow;
+import com.ruoyi.satisfaction.domain.ServiceSubtaskDetailRatioExport;
+import com.ruoyi.satisfaction.service.strategy.SatisfactionScoreStrategyResolver;
+import com.ruoyi.satisfaction.service.strategy.SatisfactionSites;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import com.smartor.service.IPatSatisfactionService;
+import com.ruoyi.satisfaction.domain.PatSatisfaction;
+import com.ruoyi.satisfaction.service.IPatSatisfactionService;
import static com.ruoyi.common.utils.SecurityUtils.getLoginUser;
@@ -39,28 +48,21 @@
private PatSatisfactionMapper patSatisfactionMapper;
@Autowired
- private ServiceSubtaskMapper serviceSubtaskMapper;
+ private SatisfactionMapper satisfactionMapper;
@Autowired
- private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper;
+ private SatisfactionScriptMapper satisfactionScriptMapper;
+ /**
+ * 绔欑偣鍙e緞绛栫暐瑙f瀽鍣ㄣ��
+ * <p>
+ * 鏈被鐨� {@code averageScoreByStat} 灏辨槸銆岄�氱敤鍙e緞锛堝崡鍗庯級銆嶇殑缁煎悎婊℃剰搴﹀緱鍒嗗彛寰勶紝
+ * 鐜版敼涓哄鎵� {@link com.ruoyi.satisfaction.service.strategy.CommonSatisfactionScoreStrategy}锛�
+ * 涓庣渷绔嬪悓寰峰彛寰勶紙{@code SltdSatisfactionScoreStrategy}锛夐�氳繃鍚屼竴绛栫暐鎺ュ彛骞跺垪锛�
+ * 閬垮厤鍚屼竴涓蹇靛湪涓ゅ鍚勫啓涓�浠藉疄鐜般��
+ */
@Autowired
- private IvrLibaTemplateScriptMapper ivrLibaTemplateScriptMapper;
-
- @Autowired
- private IvrLibaScriptAssortMapper ivrLibaScriptAssortMapper;
-
- @Autowired
- private SvyLibScriptCategoryMapper svyLibScriptCategoryMapper;
-
- @Autowired
- private IvrLibaTemplateTargetoptionMapper ivrLibaTemplateTargetoptionMapper;
-
- @Autowired
- private SvyLibTemplateTargetoptionMapper svyLibTemplateTargetoptionMapper;
-
- @Autowired
- private SvyLibTemplateScriptMapper svyLibTemplateScriptMapper;
+ private SatisfactionScoreStrategyResolver satisfactionScoreStrategyResolver;
/**
* 鏌ヨ鎮h�呮弧鎰忓害
@@ -201,41 +203,33 @@
int[] personTotals = new int[2];
// 鍙煡鏈鏉′欢涓嬪疄闄呭瓨鍦ㄥ摢浜� type锛堝師鏉ユ槸鎶婃帴杩戝叏琛ㄧ殑涓婄櫨涓瓧娈垫煡鍥炴潵锛屼粎鐢ㄤ簬鍒ゆ柇涓嬮潰涓や釜鍒嗘敮鏄惁涓虹┖锛�
- List<String> types = serviceSubtaskMapper.selectSatisfactionSubtaskTypes(patSatisfactionReqVO);
+ List<String> types = satisfactionMapper.selectSatisfactionSubtaskTypes(patSatisfactionReqVO);
boolean hasVoice = types != null && types.contains("1");
boolean hasQuestionnaire = types != null && types.contains("2");
if (hasVoice) {
- //1. 鍏堣幏鍙杋vr_liba_script_assort鐨勬弧鎰忓害鍒嗙被ID
- IvrLibaScriptAssort ivrLibaScriptAssort = new IvrLibaScriptAssort();
- ivrLibaScriptAssort.setOrgid(patSatisfactionReqVO.getOrgid());
- List<IvrLibaScriptAssort> ivrLibaScriptAssorts = ivrLibaScriptAssortMapper.selectIvrLibaScriptAssortList(ivrLibaScriptAssort);
- List<Long> mydIdList = ivrLibaScriptAssorts.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(IvrLibaScriptAssort::getId).collect(Collectors.toList());
+ List<SatisfactionCategoryRow> ivrLibaScriptAssorts = satisfactionScriptMapper.selectIvrCategoryList(ivrCategoryQuery(patSatisfactionReqVO));
+ List<Long> mydIdList = ivrLibaScriptAssorts.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(SatisfactionCategoryRow::getId).collect(Collectors.toList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.queryLibTemplateIds(mydIdList);
+ List<SatisfactionIvrScriptRow> ivrLibaTemplateScripts = satisfactionScriptMapper.queryIvrScriptByAssort(assortQuery(mydIdList));
//3 涓�娆$粺璁″叏閮ㄩ棶棰樼殑鍙戦�侀噺/濉姤閲�/閫夐」鍒嗗�硷紙鍘熸潵鏄瘡涓棶棰樺悇鏌� 3 娆★級
List<SatScriptRef> scriptRefs = new ArrayList<>();
- for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScripts) {
+ for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScripts) {
scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent()));
}
buildSatisfactionDetailEntities(patSatisfactionReqVO, "1", true, scriptRefs, patSatisfactionDetailEntities, personTotals);
}
if (hasQuestionnaire) {
- //1. 鍏堣幏鍙杝vy_lib_script_category鐨勬弧鎰忓害鍒嗙被ID
- SvyLibScriptCategory svyLibScriptCategory = new SvyLibScriptCategory();
- svyLibScriptCategory.setOrgid(patSatisfactionReqVO.getOrgid());
- List<SvyLibScriptCategory> svyLibScriptCategories = svyLibScriptCategoryMapper.selectSvyLibScriptCategoryList(svyLibScriptCategory);
- List<Long> mydIdList = svyLibScriptCategories.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(SvyLibScriptCategory::getId).collect(Collectors.toList());
+ List<SatisfactionCategoryRow> svyLibScriptCategories = satisfactionScriptMapper.selectSvyCategoryList(svyCategoryQuery(patSatisfactionReqVO));
+ List<Long> mydIdList = svyLibScriptCategories.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(SatisfactionCategoryRow::getId).collect(Collectors.toList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.querySvyLibTemplateIds(mydIdList);
+ List<SatisfactionSvyScriptRow> svyLibTemplateScripts = satisfactionScriptMapper.querySvyScriptByCategory(categoryQuery(mydIdList));
//3 涓�娆$粺璁″叏閮ㄩ棶棰樼殑鍙戦�侀噺/濉姤閲�/閫夐」鍒嗗�硷紙鍘熸潵鏄瘡涓棶棰樺悇鏌� 3 娆★級
List<SatScriptRef> scriptRefs = new ArrayList<>();
- for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScripts) {
+ for (SatisfactionSvyScriptRow svyLibTemplateScript : svyLibTemplateScripts) {
// 闂嵎鐨勯�夐」琛ㄦ寜 svy_lib_template_script 鐨勪富閿叧鑱�
scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent()));
}
@@ -264,21 +258,18 @@
int[] personTotals = new int[2];
// 鍙煡鏈鏉′欢涓嬪疄闄呭瓨鍦ㄥ摢浜� type锛堝師鏉ユ槸鎶婃帴杩戝叏琛ㄧ殑涓婄櫨涓瓧娈垫煡鍥炴潵锛屼粎鐢ㄤ簬鍒ゆ柇涓嬮潰涓や釜鍒嗘敮鏄惁涓虹┖锛�
- List<String> types = serviceSubtaskMapper.selectSatisfactionSubtaskTypes(patSatisfactionReqVO);
+ List<String> types = satisfactionMapper.selectSatisfactionSubtaskTypes(patSatisfactionReqVO);
boolean hasVoice = types != null && types.contains("1");
boolean hasQuestionnaire = types != null && types.contains("2");
if (hasVoice) {
//1. 鍏堣幏鍙栧叆鍙備腑鐨勭淮鎶ら泦鍚�
- IvrLibaTemplateScript iltscript = new IvrLibaTemplateScript();
- iltscript.setDimensionList(patSatisfactionReqVO.getDimensionList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectILTSBydimension(iltscript);
+ List<SatisfactionIvrScriptRow> ivrLibaTemplateScripts = satisfactionScriptMapper.selectIvrScriptByDimension(dimensionQuery(patSatisfactionReqVO));
if (CollectionUtils.isNotEmpty(ivrLibaTemplateScripts)) {
//3 涓�娆$粺璁″叏閮ㄩ棶棰樼殑鍙戦�侀噺/濉姤閲�/閫夐」鍒嗗�硷紙鍘熸潵鏄瘡涓棶棰樺悇鏌� 3 娆★級
List<SatScriptRef> scriptRefs = new ArrayList<>();
- for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScripts) {
+ for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScripts) {
scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent()));
}
buildSatisfactionDetailEntities(patSatisfactionReqVO, "1", true, scriptRefs, patSatisfactionDetailEntities, personTotals);
@@ -287,14 +278,11 @@
if (hasQuestionnaire) {
//1. 鍏堣幏鍙栧叆鍙備腑鐨勬弧鎰忓害缁村害
- SvyLibTemplateScriptVO svyLibTemplateScriptVO = new SvyLibTemplateScriptVO();
- svyLibTemplateScriptVO.setDimensionList(patSatisfactionReqVO.getDimensionList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSLTScriptListBydimension(svyLibTemplateScriptVO);
+ List<SatisfactionSvyScriptRow> svyLibTemplateScripts = satisfactionScriptMapper.selectSvyScriptByDimension(dimensionQuery(patSatisfactionReqVO));
if (CollectionUtils.isNotEmpty(svyLibTemplateScripts)) {
//3 涓�娆$粺璁″叏閮ㄩ棶棰樼殑鍙戦�侀噺/濉姤閲�/閫夐」鍒嗗�硷紙鍘熸潵鏄瘡涓棶棰樺悇鏌� 3 娆★級
List<SatScriptRef> scriptRefs = new ArrayList<>();
- for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScripts) {
+ for (SatisfactionSvyScriptRow svyLibTemplateScript : svyLibTemplateScripts) {
// 闂嵎鐨勯�夐」琛ㄦ寜 svy_lib_template_script 鐨勪富閿叧鑱�
scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent()));
}
@@ -317,24 +305,20 @@
Map<String, List<ScoreCount>> assortNameFillCountMap = new HashMap<>();
if (patSatisfactionReqVO.getType() == null || patSatisfactionReqVO.getType() == 1) {
- //1. 鍏堣幏鍙杋vr_liba_script_assort鐨勬弧鎰忓害鍒嗙被ID
- IvrLibaScriptAssort ivrLibaScriptAssort = new IvrLibaScriptAssort();
- ivrLibaScriptAssort.setOrgid(patSatisfactionReqVO.getOrgid());
- List<IvrLibaScriptAssort> ivrLibaScriptAssorts = ivrLibaScriptAssortMapper.selectIvrLibaScriptAssortList(ivrLibaScriptAssort);
- List<Long> mydIdList = ivrLibaScriptAssorts.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(IvrLibaScriptAssort::getId).collect(Collectors.toList());
+ List<SatisfactionCategoryRow> ivrLibaScriptAssorts = satisfactionScriptMapper.selectIvrCategoryList(ivrCategoryQuery(patSatisfactionReqVO));
+ List<Long> mydIdList = ivrLibaScriptAssorts.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(SatisfactionCategoryRow::getId).collect(Collectors.toList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.queryLibTemplateIds(mydIdList);
+ List<SatisfactionIvrScriptRow> ivrLibaTemplateScripts = satisfactionScriptMapper.queryIvrScriptByAssort(assortQuery(mydIdList));
//2.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "1",
- ivrLibaTemplateScripts.stream().map(IvrLibaTemplateScript::getTemplateid).collect(Collectors.toList()));
+ ivrLibaTemplateScripts.stream().map(SatisfactionIvrScriptRow::getTemplateid).collect(Collectors.toList()));
Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
//3 鎸塻criptAssortname鍒嗙粍,骞惰幏鍙栨瘡涓泦鍚堣繘琛岄亶鍘嗭紝璁$畻姣忎釜鍒嗙被鐨勬�讳汉鏁板拰濉姤浜烘暟
- Map<String, List<IvrLibaTemplateScript>> scriptGroupByAssortName = ivrLibaTemplateScripts.stream().filter(item -> item.getScriptAssortname() != null).collect(Collectors.groupingBy(IvrLibaTemplateScript::getScriptAssortname));
+ Map<String, List<SatisfactionIvrScriptRow>> scriptGroupByAssortName = ivrLibaTemplateScripts.stream().filter(item -> item.getScriptAssortname() != null).collect(Collectors.groupingBy(SatisfactionIvrScriptRow::getScriptAssortname));
if (scriptGroupByAssortName != null && !scriptGroupByAssortName.isEmpty()) {
for (String assortNameKey : scriptGroupByAssortName.keySet()) {
// 璇ュ垎绫绘秹鍙婄殑鍘婚噸妯℃澘锛氬彂閫佷汉鏁�/鍥炴敹浜烘暟閮芥寜妯℃澘缁熻锛�
@@ -343,8 +327,8 @@
//鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲忥紙鍙敤浜庣畻骞冲潎鍒嗭紝鎸夐鐩仛鍚堢殑琛屾暟锛�
List<ScoreCount> allFillCountList = new ArrayList<>();
- List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = scriptGroupByAssortName.get(assortNameKey);
- for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
+ List<SatisfactionIvrScriptRow> ivrLibaTemplateScriptList = scriptGroupByAssortName.get(assortNameKey);
+ for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
Long templateId = ivrLibaTemplateScript.getTemplateid();
if (templateId != null) {
categoryTemplateIds.add(templateId);
@@ -375,24 +359,20 @@
}
if (patSatisfactionReqVO.getType() == null || patSatisfactionReqVO.getType() == 2) {
- //1. 鍏堣幏鍙杝vy_lib_script_category鐨勬弧鎰忓害鍒嗙被ID
- SvyLibScriptCategory svyLibScriptCategory = new SvyLibScriptCategory();
- svyLibScriptCategory.setOrgid(patSatisfactionReqVO.getOrgid());
- List<SvyLibScriptCategory> svyLibScriptCategories = svyLibScriptCategoryMapper.selectSvyLibScriptCategoryList(svyLibScriptCategory);
- List<Long> mydIdList = svyLibScriptCategories.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(SvyLibScriptCategory::getId).collect(Collectors.toList());
+ List<SatisfactionCategoryRow> svyLibScriptCategories = satisfactionScriptMapper.selectSvyCategoryList(svyCategoryQuery(patSatisfactionReqVO));
+ List<Long> mydIdList = svyLibScriptCategories.stream().filter(item -> item.getType() != null && item.getType().contains("myd")).map(SatisfactionCategoryRow::getId).collect(Collectors.toList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.querySvyLibTemplateIds(mydIdList);
+ List<SatisfactionSvyScriptRow> svyLibTemplateScripts = satisfactionScriptMapper.querySvyScriptByCategory(categoryQuery(mydIdList));
//2.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "2",
- svyLibTemplateScripts.stream().map(SvyLibTemplateScript::getSvyid).collect(Collectors.toList()));
+ svyLibTemplateScripts.stream().map(SatisfactionSvyScriptRow::getSvyid).collect(Collectors.toList()));
Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
//3 鎸塻criptAssortname鍒嗙粍,骞惰幏鍙栨瘡涓泦鍚堣繘琛岄亶鍘嗭紝璁$畻姣忎釜鍒嗙被鐨勬�讳汉鏁板拰濉姤浜烘暟
- Map<String, List<SvyLibTemplateScript>> scriptGroupByatCegoryName = svyLibTemplateScripts.stream().filter(item -> item.getCategoryName() != null).collect(Collectors.groupingBy(SvyLibTemplateScript::getCategoryName));
+ Map<String, List<SatisfactionSvyScriptRow>> scriptGroupByatCegoryName = svyLibTemplateScripts.stream().filter(item -> item.getCategoryName() != null).collect(Collectors.groupingBy(SatisfactionSvyScriptRow::getCategoryName));
if (scriptGroupByatCegoryName != null && !scriptGroupByatCegoryName.isEmpty()) {
for (String categoryNameKey : scriptGroupByatCegoryName.keySet()) {
// 璇ュ垎绫绘秹鍙婄殑鍘婚噸妯℃澘锛氬彂閫佷汉鏁�/鍥炴敹浜烘暟閮芥寜妯℃澘缁熻锛�
@@ -401,8 +381,8 @@
//鑾峰彇璇ュ垎绫荤殑濉姤鎬绘暟閲忥紙鍙敤浜庣畻骞冲潎鍒嗭紝鎸夐鐩仛鍚堢殑琛屾暟锛�
List<ScoreCount> allFillCountList = new ArrayList<>();
- List<SvyLibTemplateScript> svyLibTemplateScriptList = scriptGroupByatCegoryName.get(categoryNameKey);
- for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) {
+ List<SatisfactionSvyScriptRow> svyLibTemplateScriptList = scriptGroupByatCegoryName.get(categoryNameKey);
+ for (SatisfactionSvyScriptRow svyLibTemplateScript : svyLibTemplateScriptList) {
Long templateId = svyLibTemplateScript.getSvyid();
if (templateId != null) {
categoryTemplateIds.add(templateId);
@@ -419,7 +399,6 @@
subidAll += sendCountMap.getOrDefault(templateId, 0L);
fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L);
}
-
// 杩欓噷鍏堣褰曚竴涓嬫瘡涓垎绫荤殑鎬讳汉鏁板拰濉姤浜烘暟
Map<String, Object> personCount = (Map<String, Object>) zzt.get(categoryNameKey);
@@ -449,7 +428,6 @@
return zzt;
}
-
@Override
public Map<String, Object> satisfactionGraphDimension(PatSatisfactionReqVO patSatisfactionReqVO) {
//鐢ㄦ潵璁板綍鏌辩姸鍥句俊鎭紙key=婊℃剰搴︾淮搴﹀悕绉帮紝value=璇ョ淮搴︿笅鐨勬�讳汉鏁板拰濉姤浜烘暟锛�
@@ -459,21 +437,17 @@
Map<String, List<ScoreCount>> assortNameFillCountMap = new HashMap<>();
if (patSatisfactionReqVO.getType() == null || patSatisfactionReqVO.getType() == 1) {
- //1. 浠庡叆鍙備腑鑾峰彇婊℃剰搴︾淮缁村害
- IvrLibaTemplateScript ivrLibaTemplateScript2 = new IvrLibaTemplateScript();
- ivrLibaTemplateScript2.setDimensionList(patSatisfactionReqVO.getDimensionList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectILTSBydimension(ivrLibaTemplateScript2);
+ List<SatisfactionIvrScriptRow> ivrLibaTemplateScripts = satisfactionScriptMapper.selectIvrScriptByDimension(dimensionQuery(patSatisfactionReqVO));
if (ivrLibaTemplateScripts != null && !ivrLibaTemplateScripts.isEmpty()) {
//3 鎸塪imension缁村害鍒嗙粍,骞惰幏鍙栨瘡涓泦鍚堣繘琛岄亶鍘嗭紝璁$畻姣忎釜鍒嗙被鐨勬�讳汉鏁板拰濉姤浜烘暟
- List<IvrLibaTemplateScript> dimensionScripts = ivrLibaTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.toList());
- Map<String, List<IvrLibaTemplateScript>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(IvrLibaTemplateScript::getDimension));
+ List<SatisfactionIvrScriptRow> dimensionScripts = ivrLibaTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.toList());
+ Map<String, List<SatisfactionIvrScriptRow>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(SatisfactionIvrScriptRow::getDimension));
if (groupByDimension != null && !groupByDimension.isEmpty()) {
//3.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "1",
- dimensionScripts.stream().map(IvrLibaTemplateScript::getTemplateid).collect(Collectors.toList()));
+ dimensionScripts.stream().map(SatisfactionIvrScriptRow::getTemplateid).collect(Collectors.toList()));
Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
@@ -484,8 +458,8 @@
//鑾峰彇璇ョ淮搴︾殑濉姤鍒嗗�煎垎甯冿紙鍙敤浜庣畻骞冲潎鍒嗭級
List<ScoreCount> allFillCountList = new ArrayList<>();
- List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = groupByDimension.get(dimension);
- for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
+ List<SatisfactionIvrScriptRow> ivrLibaTemplateScriptList = groupByDimension.get(dimension);
+ for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
Long templateId = ivrLibaTemplateScript.getTemplateid();
if (templateId != null) {
dimensionTemplateIds.add(templateId);
@@ -518,19 +492,16 @@
if (patSatisfactionReqVO.getType() == null || patSatisfactionReqVO.getType() == 2) {
//1. 浠庡叆鍙備腑鑾峰彇婊℃剰搴︾淮缁村害
- SvyLibTemplateScriptVO svyLibTemplateScriptVO = new SvyLibTemplateScriptVO();
- svyLibTemplateScriptVO.setDimensionList(patSatisfactionReqVO.getDimensionList());
- //2 鍐嶈幏鍙栬闂婊℃剰搴﹀垎绫讳笅鐨処vrLibaTemplateScript鐨勯泦鍚�
- List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSLTScriptListBydimension(svyLibTemplateScriptVO);
+ List<SatisfactionSvyScriptRow> svyLibTemplateScripts = satisfactionScriptMapper.selectSvyScriptByDimension(dimensionQuery(patSatisfactionReqVO));
if (svyLibTemplateScripts != null && !svyLibTemplateScripts.isEmpty()) {
//3 鎸塪imension缁村害鍒嗙粍,骞惰幏鍙栨瘡涓泦鍚堣繘琛岄亶鍘嗭紝璁$畻姣忎釜鍒嗙被鐨勬�讳汉鏁板拰濉姤浜烘暟
- List<SvyLibTemplateScript> dimensionScripts = svyLibTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.toList());
- Map<String, List<SvyLibTemplateScript>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(SvyLibTemplateScript::getDimension));
+ List<SatisfactionSvyScriptRow> dimensionScripts = svyLibTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.toList());
+ Map<String, List<SatisfactionSvyScriptRow>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(SatisfactionSvyScriptRow::getDimension));
if (groupByDimension != null && !groupByDimension.isEmpty()) {
//3.1 涓�娆℃�ф妸鏈璇锋眰鍏ㄩ儴妯℃澘鐨勫彂閫侀噺銆佸洖鏀朵汉鏁版煡鍥炴潵锛堝師鏉ユ槸姣忎釜妯℃澘闂鍚勬煡涓ゆ锛�
SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "2",
- dimensionScripts.stream().map(SvyLibTemplateScript::getSvyid).collect(Collectors.toList()));
+ dimensionScripts.stream().map(SatisfactionSvyScriptRow::getSvyid).collect(Collectors.toList()));
Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery);
SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery);
Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery);
@@ -541,8 +512,8 @@
//鑾峰彇璇ュ垎绫荤殑濉姤鍒嗗�煎垎甯冿紙鍙敤浜庣畻骞冲潎鍒嗭級
List<ScoreCount> allFillCountList = new ArrayList<>();
- List<SvyLibTemplateScript> svyLibTemplateScriptList = groupByDimension.get(dimension);
- for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) {
+ List<SatisfactionSvyScriptRow> svyLibTemplateScriptList = groupByDimension.get(dimension);
+ for (SatisfactionSvyScriptRow svyLibTemplateScript : svyLibTemplateScriptList) {
Long templateId = svyLibTemplateScript.getSvyid();
if (templateId != null) {
dimensionTemplateIds.add(templateId);
@@ -559,7 +530,6 @@
subidAll += sendCountMap.getOrDefault(templateId, 0L);
fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L);
}
-
// 杩欓噷鍏堣褰曚竴涓嬫瘡涓垎绫荤殑鎬讳汉鏁板拰濉姤浜烘暟
Map<String, Object> personCount = (Map<String, Object>) zzt.get(dimension);
@@ -590,53 +560,7 @@
return zzt;
}
- /**
- * 鑾峰彇鏈�楂樺垎
- *
- * @param options
- * @return
- */
- private Double maxScore(List<IvrLibaTemplateTargetoption> options) {
- if (CollectionUtils.isEmpty(options)) return 0.0;
- Double maxScore = options.stream()
- .map(IvrLibaTemplateTargetoption::getScore)
- .filter(scoreStr -> scoreStr != null && !scoreStr.isEmpty())
- .mapToDouble(Double::parseDouble)
- .max()
- .orElse(0.0);
- return maxScore;
- }
-
- /**
- * 鑾峰彇鏈�浣庡垎
- *
- * @param options
- * @return
- */
- private Double minScore(List<IvrLibaTemplateTargetoption> options) {
- if (CollectionUtils.isEmpty(options)) return 0.0;
- Double minScore = options.stream()
- .map(IvrLibaTemplateTargetoption::getScore)
- .filter(scoreStr -> scoreStr != null && !scoreStr.isEmpty())
- .mapToDouble(Double::parseDouble)
- .min()
- .orElse(0.0);
- return minScore;
- }
-
- /**
- * 鑾峰彇骞冲潎鍒�
- *
- * @param fillCount
- * @return
- */
- private Double averageScore(List<ServiceSubtaskDetailDTO> fillCount) {
- if (CollectionUtils.isEmpty(fillCount)) return 0.0;
- double sum = fillCount.stream().filter(dto -> dto.getScore() != null && !dto.getScore().isEmpty()).mapToDouble(dto -> Double.parseDouble(dto.getScore())).sum();
- return new BigDecimal(sum / fillCount.size()).setScale(1, RoundingMode.HALF_UP).doubleValue();
- }
-
- // ==================== satisfactionGraph 鑱氬悎缁熻锛堟浛浠i�愪釜妯℃澘鏌ュ簱锛� ====================
+ // ==================== satisfactionGraph 鑱氬悎缁熻锛堟浛浠i�愪釜妯℃澘鏌ュ簱锛� ====================
/**
* 鏋勫缓鑱氬悎缁熻鍏ュ弬锛堝彇鍊兼潵婧愪笌鍘� DtoConversionUtils.sourceToTarget(patSatisfactionReqVO, ServiceSubtaskSatisfactionEntity.class) 涓�鑷达級
@@ -667,7 +591,7 @@
private Map<Long, Long> mapSatisfactionSendCount(SatisfactionStatQuery statQuery) {
Map<Long, Long> sendCountMap = new HashMap<>();
if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return sendCountMap;
- List<Map<String, Object>> rows = serviceSubtaskMapper.selectSatisfactionSendCount(statQuery);
+ List<Map<String, Object>> rows = satisfactionMapper.selectSatisfactionSendCount(statQuery);
if (CollectionUtils.isEmpty(rows)) return sendCountMap;
for (Map<String, Object> row : rows) {
Long templateId = toLong(row.get("libtemplateid"));
@@ -685,7 +609,7 @@
private Map<Long, Long> mapSatisfactionFillPersonCount(SatisfactionStatQuery statQuery) {
Map<Long, Long> fillPersonCountMap = new HashMap<>();
if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return fillPersonCountMap;
- List<Map<String, Object>> rows = serviceSubtaskDetailMapper.selectSatisfactionFillPersonCount(statQuery);
+ List<Map<String, Object>> rows = satisfactionMapper.selectSatisfactionFillPersonCount(statQuery);
if (CollectionUtils.isEmpty(rows)) return fillPersonCountMap;
for (Map<String, Object> row : rows) {
Long templateId = toLong(row.get("libtemplateid"));
@@ -701,7 +625,7 @@
private SatisfactionFillStat querySatisfactionFillStat(SatisfactionStatQuery statQuery) {
SatisfactionFillStat fillStat = new SatisfactionFillStat();
if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return fillStat;
- List<Map<String, Object>> rows = serviceSubtaskDetailMapper.selectSatisfactionFillStat(statQuery);
+ List<Map<String, Object>> rows = satisfactionMapper.selectSatisfactionFillStat(statQuery);
if (CollectionUtils.isEmpty(rows)) return fillStat;
for (Map<String, Object> row : rows) {
Long templateId = toLong(row.get("libtemplateid"));
@@ -719,22 +643,31 @@
/**
* 鑾峰彇骞冲潎鍒嗭紙鑱氬悎鐗堬細鍒嗗�间笌鏉℃暟锛�
* <p>
- * 鍙e緞涓� {@link #averageScore(List)} 瀹屽叏涓�鑷达細鍒嗗瓙涓哄彲瑙f瀽鍒嗗�间箣鍜岋紝鍒嗘瘝涓烘槑缁嗚鏁帮紙鍖呭惈鍒嗗�间负绌虹殑琛岋級銆�
+ * 鍙e緞涓庡師 {@code averageScore(List)} 瀹屽叏涓�鑷达細鍒嗗瓙涓哄彲瑙f瀽鍒嗗�间箣鍜岋紝鍒嗘瘝涓烘槑缁嗚鏁帮紙鍖呭惈鍒嗗�间负绌虹殑琛岋級銆�
* 娉ㄦ剰涓嶈兘鏀规垚 sql 鐨� avg() 鎴栥�屾湁鍒嗗�肩殑琛屾暟銆嶅仛鍒嗘瘝锛屽惁鍒欒繑鍥炵殑 averageScore 浼氬彉銆�
+ * <p>
+ * <b>绛栫暐鍖栵紙2026锛�</b>锛氱湡姝g殑绠楁硶宸叉敹鏁涘埌銆岄�氱敤鍙e緞锛堝崡鍗庯級銆嶇瓥鐣�
+ * {@link com.ruoyi.satisfaction.service.strategy.CommonSatisfactionScoreStrategy}锛�
+ * 鏈柟娉曞彧鍋氬叆鍙傞�傞厤锛堟妸鍐呴儴 {@code ScoreCount} 杞垚缁熶竴鐨勫崰姣旇锛夈��
+ * <b>璁$畻缁撴灉涓庤縼绉诲墠閫愪綅鐩稿悓</b>锛堜繚鐣� 1 浣嶃�丠ALF_UP锛涙棤琛屾椂 0.0锛夈��
*/
private Double averageScoreByStat(List<ScoreCount> fillCount) {
if (CollectionUtils.isEmpty(fillCount)) return 0.0;
- double sum = 0.0;
- long rows = 0L;
+
+ // 閫傞厤鎴愮瓥鐣ョ殑缁熶竴鍏ュ弬锛氬彧甯� score 涓� count 涓や釜瀛楁锛堢瓥鐣ュ彧鐢ㄥ埌杩欎袱涓級
+ List<ServiceSubtaskDetailRatioExport> rows = new ArrayList<>(fillCount.size());
for (ScoreCount scoreCount : fillCount) {
- if (scoreCount.getCount() <= 0L) continue;
- rows += scoreCount.getCount();
- if (scoreCount.getScore() != null && !scoreCount.getScore().isEmpty()) {
- sum += Double.parseDouble(scoreCount.getScore()) * scoreCount.getCount();
- }
+ if (scoreCount.getCount() <= 0L) continue; // 涓庡師鏂囦竴鑷达細闈炴鏁扮殑鑱氬悎琛屼笉鍙備笌
+ ServiceSubtaskDetailRatioExport row = new ServiceSubtaskDetailRatioExport();
+ row.setScore(scoreCount.getScore());
+ row.setCount(String.valueOf(scoreCount.getCount()));
+ rows.add(row);
}
- if (rows == 0L) return 0.0;
- return new BigDecimal(sum / rows).setScale(1, RoundingMode.HALF_UP).doubleValue();
+
+ BigDecimal average = satisfactionScoreStrategyResolver
+ .resolve(SatisfactionSites.COMMON)
+ .comprehensiveScore(rows);
+ return average == null ? 0.0 : average.doubleValue();
}
/**
@@ -863,7 +796,7 @@
private SatisfactionFillStatByMatchedtext querySatisfactionFillStatByMatchedtext(SatisfactionStatQuery statQuery) {
SatisfactionFillStatByMatchedtext fillStat = new SatisfactionFillStatByMatchedtext();
if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return fillStat;
- List<Map<String, Object>> rows = serviceSubtaskDetailMapper.selectSatisfactionFillStatByMatchedtext(statQuery);
+ List<Map<String, Object>> rows = satisfactionMapper.selectSatisfactionFillStatByMatchedtext(statQuery);
if (CollectionUtils.isEmpty(rows)) return fillStat;
for (Map<String, Object> row : rows) {
Long templateId = toLong(row.get("libtemplateid"));
@@ -894,34 +827,33 @@
.filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(scriptIds)) {
addTargetOptionScores(optionScores, voice
- ? ivrLibaTemplateTargetoptionMapper.selectIvrLibaTargetoptionScores(scriptIds)
- : svyLibTemplateTargetoptionMapper.selectSvyLibTargetoptionScores(scriptIds));
+ ? satisfactionScriptMapper.selectIvrTargetOptionScores(scriptIds)
+ : satisfactionScriptMapper.selectSvyTargetOptionScores(scriptIds));
}
if (scriptRefs.stream().anyMatch(ref -> ref.getOptionScriptId() == null)) {
optionScores.put(null, collectTargetOptionScores(voice
- ? ivrLibaTemplateTargetoptionMapper.selectIvrLibaTargetoptionScores(null)
- : svyLibTemplateTargetoptionMapper.selectSvyLibTargetoptionScores(null)));
+ ? satisfactionScriptMapper.selectIvrTargetOptionScores(null)
+ : satisfactionScriptMapper.selectSvyTargetOptionScores(null)));
}
return optionScores;
}
- private void addTargetOptionScores(Map<Long, List<String>> optionScores, List<Map<String, Object>> rows) {
+ private void addTargetOptionScores(Map<Long, List<String>> optionScores,
+ List<SatisfactionOptionScoreRow> rows) {
if (CollectionUtils.isEmpty(rows)) return;
- for (Map<String, Object> row : rows) {
- Long scriptId = toLong(row.get("scriptid"));
+ for (SatisfactionOptionScoreRow row : rows) {
+ Long scriptId = row.getScriptid();
if (scriptId == null) continue;
- Object score = row.get("score");
optionScores.computeIfAbsent(scriptId, key -> new ArrayList<>())
- .add(score == null ? null : String.valueOf(score));
+ .add(row.getScore());
}
}
- private List<String> collectTargetOptionScores(List<Map<String, Object>> rows) {
+ private List<String> collectTargetOptionScores(List<SatisfactionOptionScoreRow> rows) {
List<String> scores = new ArrayList<>();
if (CollectionUtils.isEmpty(rows)) return scores;
- for (Map<String, Object> row : rows) {
- Object score = row.get("score");
- scores.add(score == null ? null : String.valueOf(score));
+ for (SatisfactionOptionScoreRow row : rows) {
+ scores.add(row.getScore());
}
return scores;
}
@@ -1101,4 +1033,46 @@
return byTemplateQuestion.get(statKey(templateId, scriptContent));
}
}
+
+ // ==================== 婊℃剰搴︽ā鍧楀寲锛氭煡璇㈠璞℃瀯閫� ====================
+ // 鍘熷疄鐜扮洿鎺� new smartor 鐨勫疄浣撳綋鍏ュ弬锛涙ā鍧楀寲鍚庣粺涓�鐢� SatisfactionScriptQuery锛�
+ // 杩欓噷鎶婁笁澶勬瀯閫犳敹鏁涗负甯姪鏂规硶锛屾潯浠朵笌鍘熸潵閫愬瓧瀵瑰簲銆�
+
+ /** 婊℃剰搴﹀垎绫绘煡璇紙orgid + type=myd锛� */
+ private SatisfactionScriptQuery ivrCategoryQuery(PatSatisfactionReqVO reqVO) {
+ SatisfactionScriptQuery q = new SatisfactionScriptQuery();
+ q.setOrgid(reqVO.getOrgid());
+ q.setType("myd");
+ return q;
+ }
+
+ /** 婊℃剰搴﹀垎绫绘煡璇紙闂嵎渚э紝鏉′欢鍚岃闊充晶锛� */
+ private SatisfactionScriptQuery svyCategoryQuery(PatSatisfactionReqVO reqVO) {
+ SatisfactionScriptQuery q = new SatisfactionScriptQuery();
+ q.setOrgid(reqVO.getOrgid());
+ q.setType("myd");
+ return q;
+ }
+
+ /** 鎸夎闊冲垎绫� id 鍙栭棶棰� */
+ private SatisfactionScriptQuery assortQuery(List<Long> scriptAssortids) {
+ SatisfactionScriptQuery q = new SatisfactionScriptQuery();
+ q.setScriptAssortids(scriptAssortids);
+ return q;
+ }
+
+ /** 鎸夐棶鍗峰垎绫� id 鍙栭棶棰� */
+ private SatisfactionScriptQuery categoryQuery(List<Long> scriptCategoryids) {
+ SatisfactionScriptQuery q = new SatisfactionScriptQuery();
+ q.setScriptCategoryids(scriptCategoryids);
+ return q;
+ }
+
+ /** 鎸夌淮搴﹀彇闂锛堣闊�/闂嵎鍏辩敤锛涗袱渚с�宒imensionList 涓虹┖鏃舵槸鍚︽嫾 dimension IS NOT NULL銆嶇殑宸紓鍦� SQL 閲屼繚鐣欙級 */
+ private SatisfactionScriptQuery dimensionQuery(PatSatisfactionReqVO reqVO) {
+ SatisfactionScriptQuery q = new SatisfactionScriptQuery();
+ q.setDimensionList(reqVO.getDimensionList());
+ return q;
+ }
+
}
--
Gitblit v1.9.3