Эх сурвалжийг харах

fix: 检查任务参数是否重复-如果本次为非重复提交,任务提交失败则清除重复校验的key

lixuesong 2 долоо хоног өмнө
parent
commit
2cc3dee8be

+ 37 - 4
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/api/ApiController.java

@@ -1342,10 +1342,13 @@ public class ApiController {
 
         WmTaskContent wmTaskContent = JSONUtil.toBean(paramStr, WmTaskContent.class);
 
-        boolean checkDuplicate = wmTaskContentService.checkDuplicate(wmTaskContent.getTemp30(),
-            wmTaskContent.getTemp32(), username, wmTaskContent);
-        if (checkDuplicate) {
-            throw new BizException("存在相似数据的提交记录,请重新填写");
+        Map<String, Object> checkDuplicateMap = wmTaskContentService.checkDuplicate(wmTaskContent.getTemp30(),
+                wmTaskContent.getTemp32(), username, wmTaskContent);
+        if (CollUtil.isNotEmpty(checkDuplicateMap)) {
+            boolean checkDuplicate = (boolean) checkDuplicateMap.get("duplicate");
+            if (checkDuplicate) {
+                throw new BizException("存在相似数据的提交记录,请重新填写");
+            }
         }
 
 
@@ -1392,14 +1395,24 @@ public class ApiController {
                     redisTemplate.delete(key);
                 });
             }
+
+            // 清除重复校验的key
+            this.removeCheckDuplicateKey(checkDuplicateMap);
+
             return R.failed(ducImgUrl, "提交重复的图片");
         }
 
         if (CharSequenceUtil.isBlank(wmTaskContent.getTemp30())) {
+            // 清除重复校验的key
+            this.removeCheckDuplicateKey(checkDuplicateMap);
+
             return R.failed("任务类型不能为空");
         }
 
         if (CharSequenceUtil.isBlank(wmTaskContent.getTemp32())) {
+            // 清除重复校验的key
+            this.removeCheckDuplicateKey(checkDuplicateMap);
+
             return R.failed("关联积分包不能为空");
         }
 
@@ -1409,6 +1422,10 @@ public class ApiController {
             r = wmTaskContentService.saveTaskContent(wmTaskContent, ipAddr, region);
         } catch (Exception e) {
             log.error("", e);
+
+            // 清除重复校验的key
+            this.removeCheckDuplicateKey(checkDuplicateMap);
+
             return R.failed(e.getMessage());
         } finally {
 
@@ -1453,6 +1470,22 @@ public class ApiController {
         return r;
     }
 
+    /**
+     * 清除重复校验的key
+     *
+     * @param checkDuplicateMap 检查重复map
+     */
+    private void removeCheckDuplicateKey(Map<String, Object> checkDuplicateMap) {
+        // 如果本次为非重复提交,任务提交失败则清除重复校验的key
+        if (CollUtil.isNotEmpty(checkDuplicateMap)) {
+            boolean checkDuplicate = (boolean) checkDuplicateMap.get("duplicate");
+            if (!checkDuplicate) {
+                String checkDuplicateKey = (String) checkDuplicateMap.get("key");
+                redisTemplate.delete(checkDuplicateKey);
+            }
+        }
+    }
+
     private List<String> duplicateImage(String contentValue, Integer userId, Set<String> errorHash, List<String> duplicateImageUrl, List<String> all) {
 
 

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskContentService.java

@@ -60,5 +60,5 @@ public interface WmTaskContentService extends IService<WmTaskContent> {
 	 * @param taskContent 任务content
 	 * @return boolean    是否重复
 	 */
-	boolean checkDuplicate(String taskTypeId, String packageId, String username, WmTaskContent taskContent);
+	Map<String, Object> checkDuplicate(String taskTypeId, String packageId, String username, WmTaskContent taskContent);
 }

+ 5 - 4
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java

@@ -1124,7 +1124,7 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
      * @return boolean    是否重复
      */
     @Override
-    public boolean checkDuplicate(String taskTypeId, String packageId, String username, WmTaskContent taskContent) {
+    public Map<String, Object> checkDuplicate(String taskTypeId, String packageId, String username, WmTaskContent taskContent) {
         String toCheckParams = null;
         switch (taskTypeId) {
             case "53":
@@ -1213,7 +1213,7 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
                 break;
             default:
                 // 其他任务类型不做重复检查
-                return false;
+                return null;
         }
 
         // 计算参数md5
@@ -1222,10 +1222,11 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
         String cacheKey1 = "save:task:content:ide:key:" + packageId + ":" + username + ":" + paramMd5;
 
         if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(cacheKey1, toCheckParams, 90, TimeUnit.DAYS))) {
+            log.info("重复任务: packageId:[{}], username:[{}], key:[{}], val:[{}]", packageId, username, cacheKey1, toCheckParams);
             // 存在重复任务,则返回true
-            return true;
+            return Map.of("result", Boolean.TRUE, "key", cacheKey1, "val", toCheckParams);
         }
         
-        return false;
+        return Map.of("result", Boolean.FALSE, "key", cacheKey1, "val", toCheckParams);
     }
 }