From 2cfa20c70ea84fa3435f3fd1e653c5ae60a3fc1e Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期二, 06 一月 2026 16:52:38 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java |  219 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 214 insertions(+), 5 deletions(-)

diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
index a0e33fe..a573f16 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson2.JSON;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import com.ruoyi.common.core.redis.RedisCache;
@@ -17,6 +18,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -359,7 +362,7 @@
 //        return map;
 //    }
 
-    
+
     /**
      * 缁熻浠诲姟鍚勭鐘舵�佺殑鏁伴噺锛堝凡浼樺寲锛�
      * 浼樺寲璇存槑锛�
@@ -374,7 +377,10 @@
     public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) {
         // 鐩存帴璋冪敤鏁版嵁搴撶粺璁℃柟娉曪紝鍦ㄦ暟鎹簱灞傚畬鎴愯仛鍚堣绠�
         Map<String, Object> result = serviceSubtaskMapper.countByCondition(serviceSubtaskVO);
-
+        // 澶勭悊绌哄紓甯�
+        if(MapUtils.isEmpty(result)){
+            result = new HashMap<>();
+        }
         // 纭繚鎵�鏈� key 閮芥湁鍊硷紝閬垮厤绌烘寚閽堝紓甯�
         // MyBatis 鐨� SUM 鍦ㄦ病鏈夊尮閰嶈鏃朵細杩斿洖 null
         result.putIfAbsent("wzx", 0);
@@ -516,7 +522,15 @@
             }
             if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) {
                 tempid = Long.valueOf(ivrTaskTemplateService.saveOrUpdateTempScript(serviceTaskVO.getIvrTaskTemplateVO()));
-                tempName = ivrTaskTemplateService.selectIvrTaskTemplateByID(tempid).getTemplateName();
+                log.info("IVR妯℃澘鎻掑叆鎴愬姛锛岃繑鍥炵殑tempid={}", tempid);
+
+                IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(tempid);
+                if (ivrTaskTemplate == null) {
+                    log.error("鏍规嵁tempid={}鏌ヨIVR妯℃澘澶辫触锛岃繑鍥瀗ull锛佽妫�鏌el_flag瀛楁鏄惁姝g‘璁剧疆", tempid);
+                    throw new BaseException("IVR妯℃澘淇濆瓨鎴愬姛浣嗘煡璇㈠け璐ワ紝璇疯仈绯荤鐞嗗憳妫�鏌ユ暟鎹�");
+                }
+                tempName = ivrTaskTemplate.getTemplateName();
+                log.info("IVR妯℃澘鏌ヨ鎴愬姛锛宼empName={}", tempName);
             }
 
             //寰�浠诲姟琛ㄤ腑锛屾柊澧炰换鍔�
@@ -2185,8 +2199,18 @@
             stringBuilder.append("鍏ラ櫌鍑嗗涓績鐢佃瘽锛�89975977銆傚叆闄㈠姙鐞嗛』鐭�:https://mp.weixin.qq.com/s/OCkotuRyQ8Ld2owFF0YErw");
 
             String data = MessageSend.sendMsg(stringBuilder.toString(), "6", patArchiveSrmVO.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
-            if (StringUtils.isNotEmpty(data) && data.contains("result=0")) {
-                sendError.add(patArchiveSrmVO);
+            if (StringUtils.isNotEmpty(data)) {
+                ObjectMapper mapper = new ObjectMapper();
+                JsonNode root = null;
+                try {
+                    root = mapper.readTree(data);
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                }
+                String status = root.get("result").get(0).get("status").asText();
+                if (status.equals("00000")) {
+                    sendError.add(patArchiveSrmVO);
+                }
             }
         }
 
@@ -2355,6 +2379,8 @@
 
         return serviceSubtaskStatistics;
     }
+
+
 
     /**
      * 鑾峰彇婊℃剰搴﹂鐩�婚噺
@@ -2916,6 +2942,184 @@
         return serviceSubtaskMapper.getSfStatisticsJoydetails(serviceSubtaskCountReq);
     }
 
+    /**
+     * 鑾峰彇闅忚缁熻姣斾緥
+     *
+     * @param serviceSubtaskCountReq
+     * @return
+     */
+    @Override
+    @Cacheable(value = "sfStatisticsJoy", key = "T(org.springframework.util.DigestUtils).md5DigestAsHex(#serviceSubtaskCountReq.toString().getBytes())", unless = "#result == null or #result.isEmpty()")
+    public List<ServiceSubtaskStatistic> getSfStatisticsScript(ServiceSubtaskCountReq serviceSubtaskCountReq) {
+        log.error("getSfStatisticsScript鐨勫叆鍙備负锛歿}", serviceSubtaskCountReq);
+        List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
+
+        // 鏍规嵁鏉′欢杩涜鍒嗙粍
+        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
+        String orgid = null;
+
+        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) {
+            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
+                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
+
+            } else {
+                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown")));
+            }
+        } else if (serviceSubtaskCountReq.getDeptcodes() != null && serviceSubtaskCountReq.getDeptcodes().size() > 0) {
+            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
+                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
+            } else {
+                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
+            }
+        }
+        //鑾峰彇闅忚缁熻
+        List<ServiceSubtaskCount> subCount = new ArrayList<>();
+        subCount = serviceSubtaskMapper.getSfStatisticsCategory(serviceSubtaskCountReq);
+        for (List<ServiceSubtask> serviceSubtaskList : collect.values()) {
+            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
+                continue;
+            }
+            ServiceSubtaskStatistic statistic = getStatisticJoy(serviceSubtaskList, subCount);
+            //鍙婃椂鐜�
+            ServiceSubtask ss = new ServiceSubtask();
+            orgid = serviceSubtaskList.get(0).getOrgid();
+            ss.setOrgid(orgid);
+
+            // 濡傛灉鏈夊尰鐢熺紪鐮侊紝璁剧疆鍖荤敓缂栫爜鐢ㄤ簬鍙婃椂鐜囨煡璇�
+            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
+                ss.setDrcode(serviceSubtaskList.get(0).getDrcode());
+            } else {
+                if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
+                    ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
+                } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
+                    ss.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
+                }
+            }
+
+            ss.setStarttime(serviceSubtaskCountReq.getStartTime());
+            ss.setEndtime(serviceSubtaskCountReq.getEndTime());
+            if (serviceSubtaskCountReq.getEndTime() != null && new Date().before(serviceSubtaskCountReq.getEndTime())) {
+                ss.setEndtime(new Date());
+            }
+            Double jsRate = serviceSubtaskMapper.selectTimelyRate(ss);
+            statistic.setRate(jsRate);
+            if (ObjectUtils.isNotEmpty(statistic)) {
+                serviceSubtaskStatistics.add(statistic);
+            }
+        }
+        if (CollectionUtils.isNotEmpty(serviceSubtaskStatistics)) {
+            for (ServiceSubtaskStatistic serviceSubtaskStatistic : serviceSubtaskStatistics) {
+                //鑾峰彇婊℃剰搴﹂鐩�婚噺
+                BigDecimal mydtmzlsum = new BigDecimal(0);
+                //鑾峰彇婊℃剰搴﹂鐩~鎶ラ噺
+                BigDecimal mydtblsum = new BigDecimal(0);
+                //瀹屾垚姣斾緥
+                Double wcbl = null;
+                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyAllCount())){
+                    mydtblsum = new BigDecimal(serviceSubtaskStatistic.getJoyAllCount());
+                }
+
+                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyCount())){
+                    mydtmzlsum = new BigDecimal(serviceSubtaskStatistic.getJoyCount());
+                }
+                if(mydtmzlsum.intValue() != 0){
+                    wcbl = mydtblsum.divide(mydtmzlsum, 2, RoundingMode.HALF_UP).doubleValue();
+                }
+                serviceSubtaskStatistic.setJoyAllCount(mydtmzlsum.intValue());
+                serviceSubtaskStatistic.setJoyCount(mydtblsum.intValue());
+                serviceSubtaskStatistic.setJoyTotal(wcbl);
+            }
+        }
+
+        return serviceSubtaskStatistics;
+    }
+
+    @Override
+    public Map<String, ServiceSubtaskScriptCount> getSfStatisticsScriptDetails(ServiceSubtaskCountReq serviceSubtaskCountReq) {
+        Map<String, ServiceSubtaskScriptCount> result = new HashMap<>();
+        List<ServiceSubtaskScriptCount> allCounts = new ArrayList<>();
+        List<ServiceSubtaskScriptCount> allItemCounts = new ArrayList<>();
+        String type = serviceSubtaskCountReq.getType();
+        if(ObjectUtils.isEmpty(type)){
+            //鏌ヨ璇煶缁熻鏄庣粏
+            serviceSubtaskCountReq.setType("1");
+            List<ServiceSubtaskScriptCount> ivyCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
+            List<ServiceSubtaskScriptCount> ivyItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
+
+            //鏌ヨ鐭俊缁熻鏄庣粏
+            serviceSubtaskCountReq.setType("2");
+            List<ServiceSubtaskScriptCount> svyCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
+            List<ServiceSubtaskScriptCount> svyItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
+
+            allCounts.addAll(ivyCounts);
+            allCounts.addAll(svyCounts);
+            allItemCounts.addAll(ivyItemCounts);
+            allItemCounts.addAll(svyItemCounts);
+        }else {
+            allCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
+            allItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
+        }
+
+        for(ServiceSubtaskScriptCount count : allCounts){
+            Map<String, ServiceSubtaskScriptCount> itemCountMap = new HashMap<>();
+            //闂嵎鍔犱笂绌虹櫧閫夐」
+            if(ObjectUtils.isNotEmpty(count.getTemplateid())
+                    && ObjectUtils.isNotEmpty(count.getSubtaskType())
+                    && count.getSubtaskType().equals("2")){
+                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = new SvyTaskTemplateScriptVO();
+                svyTaskTemplateScriptVO.setId(count.getScriptid());
+                SvyTaskTemplateScriptVO svyTaskTemplateScriptResultVo = svyTaskTemplateScriptService.selectInfoByCondition(svyTaskTemplateScriptVO);
+                if(ObjectUtils.isNotEmpty(svyTaskTemplateScriptResultVo)){
+                    List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = svyTaskTemplateScriptResultVo.getSvyTaskTemplateTargetoptions();
+                    if(ObjectUtils.isNotEmpty(svyTaskTemplateTargetoptions)){
+                        //濉叆绌虹櫧淇℃伅
+                        svyTaskTemplateTargetoptions.forEach(targetoption ->{
+                            ServiceSubtaskScriptCount emptyCount = new ServiceSubtaskScriptCount();
+                            emptyCount.setScriptid(count.getScriptid());
+                            emptyCount.setScriptContent(count.getScriptContent());
+                            emptyCount.setScriptType(count.getScriptType());
+                            emptyCount.setSubtaskType(count.getSubtaskType());
+                            emptyCount.setCompletedQuantity(count.getCompletedQuantity());
+                            emptyCount.setAllQuantity(count.getAllQuantity());
+                            emptyCount.setCompletedPercentage(count.getCompletedPercentage());
+                            emptyCount.setTemplateid(count.getTemplateid());
+                            emptyCount.setChosenQuantity(0);
+                            emptyCount.setChosenPercentage("0.0");
+                            emptyCount.setOptionText(targetoption.getOptioncontent());
+                            itemCountMap.put(targetoption.getOptioncontent(),emptyCount);
+                        });
+                    }
+                }
+            }
+            allItemCounts.forEach(itemCount ->{
+                if(ObjectUtils.isNotEmpty(count.getScriptid()) && ObjectUtils.isNotEmpty(itemCount.getScriptid())){
+                    if(count.getScriptid().equals(itemCount.getScriptid())){
+                        //鏀惧叆缁熻淇℃伅
+                        itemCount.setScriptContent(count.getScriptContent());
+                        itemCount.setScriptType(count.getScriptType());
+                        itemCount.setSubtaskType(count.getSubtaskType());
+                        itemCount.setCompletedQuantity(count.getCompletedQuantity());
+                        itemCount.setAllQuantity(count.getAllQuantity());
+                        itemCount.setCompletedPercentage(count.getCompletedPercentage());
+                        itemCount.setTemplateid(count.getTemplateid());
+                        //璁$畻閫夋嫨姣斾緥
+                        int chosenQuantity = ObjectUtils.isNotEmpty(itemCount.getChosenQuantity())?itemCount.getChosenQuantity():0;
+                        int completedQuantity = itemCount.getCompletedQuantity();
+                        if(ObjectUtils.isNotEmpty(completedQuantity) && completedQuantity != 0){
+                            BigDecimal chosenPercentage = (new BigDecimal(chosenQuantity)).divide(new BigDecimal(completedQuantity), 2, RoundingMode.HALF_UP);
+                            itemCount.setChosenPercentage(chosenPercentage.toString());
+                        }
+                        itemCountMap.put(itemCount.getOptionText(), itemCount);
+                    }
+                }
+            });
+            List<ServiceSubtaskScriptCount> itemCounts = new ArrayList<>(itemCountMap.values());
+            count.setDetails(itemCounts);
+            result.put(count.getScriptid().toString(),count);
+        }
+        return result;
+    }
+
 
     /**
      * @param serviceSubtask
@@ -2971,6 +3175,11 @@
         serviceSubtaskPreachform.setTaskid(taskid);
         List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
         if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
+            //娌℃湁闅忚鏃堕棿鍒欐寜褰撳ぉ鏉ョ畻--涓存椂
+            if (ObjectUtils.isEmpty(visitTime)) {
+                visitTime = new Date();
+            }
+
             String compensateTime = serviceSubtaskPreachforms.get(0).getCompensateTime();
             int hoursToAdd = Integer.valueOf(compensateTime) * 24;
             Calendar calendar = Calendar.getInstance();

--
Gitblit v1.9.3