From ab2884ade73fed97d1e7d7daf4b9b5b6dee83fdd Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期四, 29 十月 2026 09:26:12 +0800
Subject: [PATCH] 代码提交

---
 smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java |   61 +++++++++++++++++++++++++-----
 1 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
index aa89ed0..b8368b4 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -63,6 +63,8 @@
 import com.ruoyi.task.service.IServiceSubtaskDetailTraceService;
 import com.ruoyi.task.domain.ServiceSubtaskPreachform;
 import com.ruoyi.task.service.IServiceTaskService;
+import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
+import com.ruoyi.patarchive.mapper.PatArchiveMapper;
 /**
  * 浠诲姟闂嵎闂閫夐」Service涓氬姟灞傚鐞�
  *
@@ -276,6 +278,8 @@
     public Integer saveQuestionAnswer(ServiceSubTaskAnswerReq serviceSubTaskAnswerReq, Long flag) {
         String threadName = Thread.currentThread().getName();
         log.info("[{}] 寮�濮嬪紓姝ュ鐞嗕繚瀛橀棶鍗风瓟妗�", threadName);
+        // 骞傜瓑鍗犱綅閿細澶辫触鏃惰閲婃斁锛屽厑璁告偅鑰呴噸璇�
+        String idemKey = null;
         try {
             //鍙傛暟瑙e瘑
             Long tid = null;
@@ -299,6 +303,17 @@
             //鏍规嵁 PID銆乀ID銆丼UBID 鏋勫缓闇�瑕佸鐞嗙殑 cache key
             String scriptCacheKeyPrefix = pid + "-" + tid + "-" + subid;
             Set<String> targetKeys = new HashSet<>();
+
+            // ---------------- 骞傜瓑锛氬悓涓�浠介棶鍗� 60 绉掑唴鍙鐞嗕竴娆� ----------------
+            // 鏈柟娉曟槸 @Async 寮傛鎵ц锛屾偅鑰呯閲嶅鐐瑰嚮/缃戠粶閲嶈瘯浼氳瀹冨苟鍙戣窇澶氭锛�
+            // 姣忔閮戒細 upsert 涓�閬嶆槑缁嗭紱骞跺彂鏃跺郊姝ょ湅涓嶅埌瀵规柟杩樻病鎻愪氦鐨勮 -> 鎻掑叆閲嶅鍓湰
+            // 锛坣hfy 2026-09-08 灏辨槸杩欐牱鍫嗗嚭 2~6 浠斤紝骞朵笖鎶� del_flag 涓�璧峰啓鍧忥級銆�
+            idemKey = "subtaskAnswer:submit:" + scriptCacheKeyPrefix + ":"
+                    + (serviceSubTaskAnswerReq == null || serviceSubTaskAnswerReq.getType() == null ? "all" : serviceSubTaskAnswerReq.getType());
+            if (!redisCache.setCacheObjectIfAbsent(idemKey, "1", 60, TimeUnit.SECONDS)) {
+                log.warn("[{}] 妫�娴嬪埌閲嶅鎻愪氦锛屾湰娆″拷鐣ワ細{}", threadName, idemKey);
+                return 0;
+            }
 
             if (serviceSubTaskAnswerReq != null && serviceSubTaskAnswerReq.getType() != null) {
                 if (serviceSubTaskAnswerReq.getType() == 2) {
@@ -491,6 +506,14 @@
             return 1;
         } catch (Exception e) {
             log.error("[{}] 寮傛澶勭悊淇濆瓨闂嵎绛旀鍙戠敓寮傚父 : {},璇锋眰鐨勫璞′负锛歿}", Thread.currentThread().getName(), e.getMessage(), e, serviceSubTaskAnswerReq);
+            // 澶勭悊澶辫触鏃堕噴鏀惧箓绛夐敭锛屽厑璁告偅鑰呴噸鏂版彁浜�
+            if (idemKey != null) {
+                try {
+                    redisCache.deleteObject(idemKey);
+                } catch (Exception ignore) {
+                    log.warn("[{}] 閲婃斁骞傜瓑閿け璐ワ細{}", Thread.currentThread().getName(), idemKey);
+                }
+            }
             throw new RuntimeException("淇濆瓨闂嵎绛旀澶辫触", e);
         }
     }
@@ -728,8 +751,8 @@
                 serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid()));
                 if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                     serviceSubtask.setHospType("2");
-                    serviceSubtask.setDeptname(patMedInhospList.get(0).getDeptname());
-                    serviceSubtask.setDeptcode(patMedInhospList.get(0).getDeptcode());
+                    serviceSubtask.setLeaveldeptname(patMedInhospList.get(0).getDeptname());
+                    serviceSubtask.setLeaveldeptcode(patMedInhospList.get(0).getDeptcode());
                     serviceSubtask.setLeavehospitaldistrictcode(patMedInhospList.get(0).getLeavehospitaldistrictcode());
                     serviceSubtask.setLeavehospitaldistrictname(patMedInhospList.get(0).getLeavehospitaldistrictname());
                     serviceSubtask.setDrname(patMedInhospList.get(0).getDrname());
@@ -743,8 +766,8 @@
                     serviceSubtask.setHospType("1");
                     serviceSubtask.setAdmindate(patMedOuthosps.get(0).getAdmitdate());
                     serviceSubtask.setHospno(patMedOuthosps.get(0).getOuthospno());
-                    serviceSubtask.setDeptname(patMedOuthosps.get(0).getDeptname());
-                    serviceSubtask.setDeptcode(patMedOuthosps.get(0).getDeptcode());
+                    serviceSubtask.setLeaveldeptname(patMedOuthosps.get(0).getDeptname());
+                    serviceSubtask.setLeaveldeptcode(patMedOuthosps.get(0).getDeptcode());
                     serviceSubtask.setDrname(patMedOuthosps.get(0).getDrname());
                     serviceSubtask.setDrcode(patMedOuthosps.get(0).getDrcode());
                     serviceSubtask.setCampusid(patMedOuthosps.get(0).getCampusid());
@@ -766,7 +789,7 @@
                 }
                 if (StringUtils.isNotEmpty(dealDept)) {
                     //鎶曡瘔寤鸿鐨勫鐞嗛儴闂�
-                    serviceSubtask.setDeptcode(dealDept);
+                    serviceSubtask.setLeaveldeptcode(dealDept);
                     serviceSubtask.setServiceType("15");
                 }
                 serviceSubtask.setSubmit(1L);
@@ -899,7 +922,8 @@
         Map<String, Object> map = new HashMap<>();
         if (serviceSubTaskQueryReq.getSubId() != null) {
             ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubTaskQueryReq.getSubId());
-            if (serviceSubtask.getSendstate() == 4L) {
+            // 浠诲姟鍙兘宸茶鍒犻櫎/鏌ヤ笉鍒帮紝sendstate 涔熷彲鑳戒负绌猴紝杩欓噷蹇呴』鍒ょ┖锛屽惁鍒欐媶绠变細 NPE
+            if (serviceSubtask != null && Long.valueOf(4L).equals(serviceSubtask.getSendstate())) {
                 log.info("鎮h�呭瓙浠诲姟ID涓猴細{}锛岀姸鎬佷负锛歿}", serviceSubTaskQueryReq.getSubId(), serviceSubtask.getSendstate());
                 throw new BaseException("璇ヤ换鍔′笉鎵ц");
             }
@@ -912,7 +936,7 @@
         //鑾峰彇涓婃鐨勯棶绛旂粨鏋�
         ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubTaskQueryReq.getSubId());
         map.put("upScriptResult", null);
-        map.put("templateName", serviceSubtask.getTemplatename());
+        map.put("templateName", serviceSubtask == null ? null : serviceSubtask.getTemplatename());
         map.put("upTaskName", null);
         if (ObjectUtils.isNotEmpty(serviceSubtask) && serviceSubtask.getUpid() != null) {
             Map<String, Object> scriptInfoByCondition2 = serviceTaskService.getScriptInfoByCondition(serviceSubTaskQueryReq.getTaskid(), serviceSubTaskQueryReq.getPatid(), serviceSubTaskQueryReq.getIsFinish(), serviceSubTaskQueryReq.getPatfrom(), serviceSubTaskQueryReq.getSubId());
@@ -930,7 +954,7 @@
     private Map<String, Object> getMap(Map<String, Object> scriptInfoByCondition, Long subid, Long patid) {
         Map<String, Object> map = new HashMap<>();
         if (ObjectUtils.isNotEmpty(scriptInfoByCondition) && ObjectUtils.isNotEmpty(scriptInfoByCondition.get("script"))) {
-            if (scriptInfoByCondition.get("type").equals("1")) {
+            if ("1".equals(scriptInfoByCondition.get("type"))) {
                 List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVOS = (List<IvrTaskTemplateScriptVO>) scriptInfoByCondition.get("script");
                 // 鎵归噺鏌ヨ鎵�鏈夋槑缁嗭紝閬垮厤寰幆涓�愭潯鏌ユ暟鎹簱锛圢+1闂浼樺寲锛�
                 Map<Long, ServiceSubtaskDetail> detailMap = getScriptResultMap(subid, patid);
@@ -943,7 +967,7 @@
                 }
                 map.put("scriptResult", ivrTaskTemplateScriptVOS);
                 map.put("taskName", scriptInfoByCondition.get("taskName"));
-            } else if (scriptInfoByCondition.get("type").equals("2")) {
+            } else if ("2".equals(scriptInfoByCondition.get("type"))) {
                 List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOList = (List) scriptInfoByCondition.get("script");
                 // 鎵归噺鏌ヨ鎵�鏈夋槑缁嗭紝閬垮厤寰幆涓�愭潯鏌ユ暟鎹簱锛圢+1闂浼樺寲锛�
                 Map<Long, ServiceSubtaskDetail> detailMap = getScriptResultMap(subid, patid);
@@ -959,7 +983,7 @@
                 }
                 map.put("scriptResult", svyTaskTemplateScriptVOList);
                 map.put("taskName", scriptInfoByCondition.get("taskName"));
-            } else if (scriptInfoByCondition.get("type").equals("3")) {
+            } else if ("3".equals(scriptInfoByCondition.get("type"))) {
                 //瀹f暀涓嶉渶瑕佹煡鐪�
                 List<HeLibrary> heLibraryList = (List) scriptInfoByCondition.get("script");
                 map.put("scriptResult", heLibraryList);
@@ -1025,6 +1049,11 @@
 
     /**
      * 鎵归噺鏌ヨ宸插瓨鍦ㄧ殑鏄庣粏璁板綍ID锛屾寜scriptid鍒嗙粍锛堥伩鍏嶅惊鐜腑閫愭潯鏌ヨ锛�
+     * <p>
+     * 鈿狅笍 2026-10-21锛�<b>涓嶅啀杩囨护 del_flag</b>锛屽悓涓� scriptid 鍙� id 鏈�澶э紙鏈�鏂帮級鐨勯偅涓�琛屻��
+     * 鍘熸潵鍙 del_flag=0锛屾槑缁嗚閫昏緫鍒犻櫎鍚庡氨鏌ヤ笉鍒� 鈫� 涓嬩竴娆′繚瀛樺繀鐒� INSERT 鏂板壇鏈紝
+     * 鍚屼竴鎮h�呭悓涓�棰樹細鍫嗗嚭 2~6 鏉¢噸澶嶆槑缁嗭紙nhfy 2026-09-08锛夈��
+     * 鍛戒腑琚垹鍓湰鏃剁敱璋冪敤鏂瑰啀璋� {@code reviveServiceSubtaskDetail} 缃洖 '0'銆�
      */
     private Map<Long, Long> getExistingDetailIdMap(Long subid) {
         if (subid == null) return Collections.emptyMap();
@@ -1034,7 +1063,9 @@
         if (CollectionUtils.isEmpty(details)) return Collections.emptyMap();
         Map<Long, Long> map = new HashMap<>();
         for (ServiceSubtaskDetail d : details) {
-            if ((d.getDelFlag() == null || "0".equals(d.getDelFlag())) && d.getScriptid() != null && !map.containsKey(d.getScriptid())) {
+            if (d.getScriptid() == null || d.getId() == null) continue;
+            Long existId = map.get(d.getScriptid());
+            if (existId == null || d.getId() > existId) {
                 map.put(d.getScriptid(), d.getId());
             }
         }
@@ -1131,6 +1162,8 @@
             serviceSubtaskDetail.setId(existDetailId);
             serviceSubtaskDetail.setUpdateTime(new Date());
             serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
+            //鍛戒腑鍘嗗彶琚�昏緫鍒犻櫎鐨勫壇鏈椂缃洖 del_flag='0'锛堝惁鍒欑瓟妗堝啓杩涘幓浜嗗嵈鏌ヤ笉鍒帮紝涓斾笅娆″張浼氭柊澧炲壇鏈級
+            serviceSubtaskDetailMapper.reviveServiceSubtaskDetail(existDetailId);
         } else {
             serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail);
         }
@@ -1190,6 +1223,8 @@
             //闈炴弧鎰忓害鎰忚寮傚父鑷姩濉叆绌�
             subtaskDetailTrace.setMatchedtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException());
             subtaskDetailTrace.setAsrtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException());
+            //琛ュ厖鎻忚堪锛堥�変簡"鍏朵粬/鏈夌棁鐘�"鏃跺~鐨勬枃瀛楋級涓�骞跺甫鍒� trace 琛�
+            subtaskDetailTrace.setAnswerps(serviceSubtaskDetail.getAnswerps());
             subtaskDetailTrace.setIsMydException(svyTaskTemplateScriptVO.getIsMydException());
 
             subtaskDetailTrace.setRecordpath(null);
@@ -1430,6 +1465,8 @@
             serviceSubtaskDetail.setId(existServiceSubtaskDetail.getId());
             serviceSubtaskDetail.setUpdateTime(new Date());
             serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
+            //鍛戒腑鍘嗗彶琚�昏緫鍒犻櫎鐨勫壇鏈椂缃洖 del_flag='0'锛岄伩鍏嶉噸澶嶅壇鏈�
+            serviceSubtaskDetailMapper.reviveServiceSubtaskDetail(existServiceSubtaskDetail.getId());
         } else {
             serviceSubtaskDetailMapper.insertServiceSubtaskDetail(serviceSubtaskDetail);
         }
@@ -1481,6 +1518,8 @@
             subtaskDetailTrace.setType(ivrLibaScriptAssort != null ? ivrLibaScriptAssort.getType() : null);
             subtaskDetailTrace.setScriptid(ivrTaskTemplateScriptVO.getId() == null ? ivrTaskTemplateScriptVO.getScriptID() : ivrTaskTemplateScriptVO.getId());
             subtaskDetailTrace.setAsrtext(ivrTaskTemplateScriptVO.getIvrtext());
+            //琛ュ厖鎻忚堪涓�骞跺甫鍒� trace 琛�
+            subtaskDetailTrace.setAnswerps(serviceSubtaskDetail.getAnswerps());
             subtaskDetailTrace.setRecordpath(null);
             subtaskDetailTrace.setPatid(selectServiceSubtaskList.get(0).getPatid());
             JSONObject patdescJson2 = new JSONObject();

--
Gitblit v1.9.3