dengsixing %!s(int64=3) %!d(string=hai) anos
pai
achega
8f38e138ca

+ 2 - 2
src/main/java/com/fdkankan/repair/DataRepairApplication.java

@@ -4,14 +4,14 @@ import com.dtflys.forest.springboot.annotation.ForestScan;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.ComponentScans;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
+@EnableScheduling
 @ComponentScan(basePackages = {"com.fdkankan"})
 @MapperScan("com.fdkankan.**.mapper")
 @EnableAsync

+ 6 - 0
src/main/java/com/fdkankan/repair/entity/SceneRepairLog.java

@@ -58,6 +58,12 @@ public class SceneRepairLog implements Serializable {
     @TableField("consum_time")
     private Long consumTime;
 
+    /**
+     * 是否已回滚(0-否,1-是)
+     */
+    @TableField("is_rollback")
+    private Integer isRollback;
+
     @TableField("create_time")
     private Date createTime;
 

+ 1 - 1
src/main/java/com/fdkankan/repair/generate/AutoGenerate.java

@@ -20,7 +20,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"test", getTables(new String[]{
-                "t_scene_plus_ext",
+                "t_scene_plus",
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 7 - 0
src/main/java/com/fdkankan/repair/httpclient/FdkankanMiniClient.java

@@ -29,4 +29,11 @@ public interface FdkankanMiniClient {
     @Retry(maxRetryCount = "3", maxRetryInterval = "100")
     Result upgradeToV4ResultSync(@Var("url") String url, @Body RequestSceneProV4 param, OnSuccess<Result> onSuccess, OnError onError);
 
+    @Post(
+        url = "${url}",
+        contentType = "application/json"
+    )
+    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+    Result sceneUgradeRollback(@Var("url") String url, @Body RequestSceneProV4 param, OnSuccess<Result> onSuccess, OnError onError);
+
 }

+ 30 - 0
src/main/java/com/fdkankan/repair/schedule/ScheduleJob.java

@@ -0,0 +1,30 @@
+package com.fdkankan.repair.schedule;
+
+import com.fdkankan.repair.service.ISceneRepairLogService;
+import java.util.Calendar;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class ScheduleJob {
+
+    @Autowired
+    ISceneRepairLogService sceneRepairLogService;
+
+
+    /**
+     *  扫描升级日志,如果有失败的,把v3场景的升级状态回滚
+     */
+    @Scheduled(cron = "0 0/10 * * * ? ")
+    public void rollbackSceneUpgradeStatus() {
+        log.info("场景升级失败回滚任务开始执行");
+        long timeInMillis = Calendar.getInstance().getTimeInMillis();
+        sceneRepairLogService.rollbackSceneUpgradeStatus();
+        log.info("场景升级失败回滚任务开始执行,耗时:{}", );
+    }
+
+
+}

+ 2 - 0
src/main/java/com/fdkankan/repair/service/ISceneRepairLogService.java

@@ -13,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ISceneRepairLogService extends IService<SceneRepairLog> {
 
+    void rollbackSceneUpgradeStatus();
+
 }

+ 50 - 1
src/main/java/com/fdkankan/repair/service/impl/SceneRepairLogServiceImpl.java

@@ -1,9 +1,21 @@
 package com.fdkankan.repair.service.impl;
 
+import cn.hutool.core.codec.Caesar;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.repair.bean.RequestSceneProV4;
+import com.fdkankan.repair.callback.FdkkMiniReqErrorCallback;
+import com.fdkankan.repair.callback.FdkkMiniReqSuccessCallback;
+import com.fdkankan.repair.entity.ScenePlus;
 import com.fdkankan.repair.entity.SceneRepairLog;
+import com.fdkankan.repair.httpclient.FdkankanMiniClient;
 import com.fdkankan.repair.mapper.ISceneRepairLogMapper;
+import com.fdkankan.repair.service.IScenePlusService;
 import com.fdkankan.repair.service.ISceneRepairLogService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +29,41 @@ import org.springframework.stereotype.Service;
 @Service
 public class SceneRepairLogServiceImpl extends ServiceImpl<ISceneRepairLogMapper, SceneRepairLog> implements ISceneRepairLogService {
 
+    @Value("${http.host.4dkankanMini}")
+    private String fkankanMiniHost;
+    @Value("${http.api-v4.sceneUgradeRollback}")
+    private String URL_SCENE_UGRADE_ROLLBACK;
+    @Autowired
+    private FdkankanMiniClient fdkankanMiniClient;
+    @Autowired
+    private IScenePlusService scenePlusService;
+
+    @Override
+    public void rollbackSceneUpgradeStatus() {
+
+        List<SceneRepairLog> failList = this.list(new LambdaQueryWrapper<SceneRepairLog>()
+            .eq(SceneRepairLog::getState, 2)
+            .eq(SceneRepairLog::getIsRollback, CommonStatus.NO.code()));
+
+        for (SceneRepairLog sceneRepairLog : failList) {
+            try {
+                ScenePlus scenePlus = scenePlusService.getScenePlusByNum(sceneRepairLog.getNum());
+
+                // 调用v3接口回写数据
+                String url = fkankanMiniHost + URL_SCENE_UGRADE_ROLLBACK;
+                fdkankanMiniClient.sceneUgradeRollback(url,
+                    RequestSceneProV4.builder().id(scenePlus.getId()).build(),
+                    new FdkkMiniReqSuccessCallback(), new FdkkMiniReqErrorCallback()
+                );
+
+                sceneRepairLog.setIsRollback(CommonStatus.YES.code().intValue());
+                this.updateById(sceneRepairLog);
+            } catch (Exception e){
+                log.error("场景回滚失败, num=" + sceneRepairLog.getNum(), e);
+            }
+
+        }
+
+
+    }
 }

+ 22 - 21
src/main/java/com/fdkankan/repair/service/impl/SceneUpgradeToV4Service.java

@@ -59,6 +59,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -140,19 +141,12 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
         long startTime = Calendar.getInstance().getTimeInMillis();
         SceneRepairLog sceneRepairLog = null;
         try {
-            sceneRepairLog = sceneRepairLogService.getOne(new LambdaQueryWrapper<SceneRepairLog>().eq(SceneRepairLog::getNum, num));
-            if(sceneRepairLog == null){
-                sceneRepairLog = SceneRepairLog.builder()
-                    .num(scenePro.getNum())
-                    .reason("")
-                    .state(0).build();
-            }else{
-                sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
-                sceneRepairLog.setReason("");
-                sceneRepairLog.setState(0);
-            }
-            //写入日志
-            sceneRepairLogService.saveOrUpdate(sceneRepairLog);
+            sceneRepairLog = sceneRepairLogService.getOne(
+                new LambdaQueryWrapper<SceneRepairLog>()
+                    .eq(SceneRepairLog::getNum, num).eq(SceneRepairLog::getState, 0)
+                    .orderByDesc(SceneRepairLog::getId)
+                    .last("limit 1"));
+            this.upgradeLog(sceneRepairLog, num, 0, null, null);
 
             SceneProExt sceneProExt = sceneProExtService.getOne(
                 new LambdaQueryWrapper<SceneProExt>()
@@ -451,10 +445,7 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
             consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
 
             //记录日志
-            sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
-            sceneRepairLog.setState(1);
-            sceneRepairLog.setConsumTime(consumTime);
-            sceneRepairLogService.updateById(sceneRepairLog);
+            this.upgradeLog(sceneRepairLog, num, 1, null, consumTime);
 
             // 调用v3接口回写数据
             String url = fkankanMiniHost + URL_UPGRADE_TO_V4_RESULT_SYNC;
@@ -473,10 +464,7 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
 
             //记录日志
             consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
-            sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
-            sceneRepairLog.setState(2);
-            sceneRepairLog.setReason(ExceptionUtil.stacktraceToString(e));
-            sceneRepairLog.setConsumTime(consumTime);
+            this.upgradeLog(sceneRepairLog, num, 2, ExceptionUtil.stacktraceToString(e, 3000), consumTime);
             sceneRepairLogService.updateById(sceneRepairLog);
         } finally {
             String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, num);
@@ -603,4 +591,17 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
                     .num(num).status(status)
                     .progress(progress).build()));
     }
+
+    private void upgradeLog(SceneRepairLog sceneRepairLog, String num, int status, String reason, Long consumTime){
+        //写入升级日志
+        if(Objects.isNull(sceneRepairLog)){
+            sceneRepairLog = new SceneRepairLog();
+            sceneRepairLog.setNum(num);
+        }
+        sceneRepairLog.setConsumTime(consumTime);
+        sceneRepairLog.setState(status);
+        sceneRepairLog.setReason(reason);
+        sceneRepairLog.setCreateTime(Calendar.getInstance().getTime());
+        sceneRepairLogService.saveOrUpdate(sceneRepairLog);
+    }
 }