Преглед на файлове

Merge branch 'release' into feature-算法指定切图方式-20220629

# Conflicts:
#	src/main/java/com/fdkankan/repair/DataRepairApplication.java
#	src/main/java/com/fdkankan/repair/controller/ScenePlusController.java
#	src/main/java/com/fdkankan/repair/entity/ScenePlus.java
#	src/main/java/com/fdkankan/repair/generate/AutoGenerate.java
#	src/main/java/com/fdkankan/repair/mapper/IScenePlusMapper.java
#	src/main/java/com/fdkankan/repair/service/IScenePlusService.java
#	src/main/java/com/fdkankan/repair/service/impl/ScenePlusServiceImpl.java
#	src/main/java/com/fdkankan/repair/service/impl/SceneUpgradeToV4Service.java
dengsixing преди 3 години
родител
ревизия
536f26d609

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

@@ -4,15 +4,15 @@ 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;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication
+@EnableScheduling
 @ComponentScan(basePackages = {"com.fdkankan"})
 @MapperScan("com.fdkankan.**.mapper")
 @EnableAsync

+ 2 - 0
src/main/java/com/fdkankan/repair/bean/RequestSceneProV4.java

@@ -23,5 +23,7 @@ public class RequestSceneProV4 {
 
     private String webSite;
 
+    private String thumb;
+
 
 }

+ 26 - 0
src/main/java/com/fdkankan/repair/bean/UpgradeBean.java

@@ -0,0 +1,26 @@
+package com.fdkankan.repair.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/6/28
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UpgradeBean {
+
+    private Long sceneProId;
+
+    private boolean reUpgrade;
+
+}

+ 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;
 

+ 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);
+
 }

+ 9 - 2
src/main/java/com/fdkankan/repair/listener/RabbitMqListener.java

@@ -1,8 +1,11 @@
 package com.fdkankan.repair.listener;
 
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.repair.bean.UpgradeBean;
 import com.fdkankan.repair.service.ISceneUpgradeToV4Service;
 import com.rabbitmq.client.Channel;
 import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.core.Message;
 import org.springframework.amqp.rabbit.annotation.Queue;
@@ -43,9 +46,13 @@ public class RabbitMqListener {
         String correlationId = (String) correlation;
         String msg = new String(message.getBody(), StandardCharsets.UTF_8);
         log.info("场景升级开始,队列名:{},id:{},消息体:{}", upgradeToV4, correlationId, msg);
-        long sceneProId = Long.parseLong(msg);
+//        UpgradeBean upgradeBean = JSON.parseObject(msg, UpgradeBean.class);
+        HashMap hashMap = JSON.parseObject(msg, HashMap.class);
+        int sceneProId = (int)hashMap.get("sceneProId");
+        boolean reUpgrade = (boolean)hashMap.get("reUpgrade");
+
         //迁移数据
-        sceneUpgradeToV4Service.upgrade(sceneProId);
+        sceneUpgradeToV4Service.upgrade(sceneProId, reUpgrade);
         log.info("场景升级结束,队列名:{},id:{}", upgradeToV4, correlationId);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     }

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

@@ -0,0 +1,46 @@
+package com.fdkankan.repair.schedule;
+
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+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
+    private ISceneRepairLogService sceneRepairLogService;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+
+
+    /**
+     *  扫描升级日志,如果有失败的,把v3场景的升级状态回滚
+     */
+    @Scheduled(cron = "0 0/10 * * * ? ")
+    public void rollbackSceneUpgradeStatus() {
+        log.info("场景升级失败回滚任务开始执行");
+        String lockKey = RedisLockKey.LOCK_SCENE_UPGRADE_FAILED_ROLLBACK;
+        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_2_HOUR);
+        if(!lock){
+            return;
+        }
+        try {
+            long start = Calendar.getInstance().getTimeInMillis();
+            sceneRepairLogService.rollbackSceneUpgradeStatus();
+            log.info("场景升级失败回滚任务开始执行,耗时:{}", Calendar.getInstance().getTimeInMillis() - start);
+        }catch (Exception e){
+            log.error("场景升级失败回滚任务执行失败", e);
+        }finally {
+            redisLockUtil.unlockLua(lockKey);
+        }
+    }
+
+
+}

+ 3 - 1
src/main/java/com/fdkankan/repair/service/IScenePlusService.java

@@ -9,8 +9,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * </p>
  *
  * @author 
- * @since 2022-06-29
+ * @since 2022-06-27
  */
 public interface IScenePlusService extends IService<ScenePlus> {
 
+    ScenePlus getScenePlusByNum(String num);
+
 }

+ 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();
+
 }

+ 3 - 1
src/main/java/com/fdkankan/repair/service/ISceneUpgradeToV4Service.java

@@ -1,5 +1,7 @@
 package com.fdkankan.repair.service;
 
+import com.fdkankan.repair.bean.UpgradeBean;
+
 /**
  * <p>
  * TODO
@@ -10,6 +12,6 @@ package com.fdkankan.repair.service;
  **/
 public interface ISceneUpgradeToV4Service {
 
-    void upgrade(long sceneProId) throws Exception;
+    void upgrade(long sceneProId, boolean reUpgrade) throws Exception;
 
 }

+ 6 - 0
src/main/java/com/fdkankan/repair/service/impl/ScenePlusServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fdkankan.repair.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.repair.entity.ScenePlus;
 import com.fdkankan.repair.mapper.IScenePlusMapper;
 import com.fdkankan.repair.service.IScenePlusService;
@@ -17,4 +18,9 @@ import org.springframework.stereotype.Service;
 @Service
 public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
 
+    @Override
+    public ScenePlus getScenePlusByNum(String num) {
+        return this.getOne(new LambdaQueryWrapper<ScenePlus>().eq(ScenePlus::getNum, num));
+    }
+
 }

+ 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);
+            }
+
+        }
+
+
+    }
 }

+ 31 - 24
src/main/java/com/fdkankan/repair/service/impl/SceneUpgradeToV4Service.java

@@ -25,6 +25,7 @@ import com.fdkankan.repair.bean.RequestSceneProV4;
 import com.fdkankan.repair.bean.SceneEditControlsBean;
 import com.fdkankan.repair.bean.SceneJsonBean;
 import com.fdkankan.repair.bean.SceneUpgradeProgressBean;
+import com.fdkankan.repair.bean.UpgradeBean;
 import com.fdkankan.repair.callback.FdkkMiniReqErrorCallback;
 import com.fdkankan.repair.callback.FdkkMiniReqSuccessCallback;
 import com.fdkankan.repair.constant.ProgressStatus;
@@ -59,6 +60,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;
@@ -123,7 +125,7 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
     FdkankanMiniClient fdkankanMiniClient;
 
     @Override
-    public void upgrade(long sceneProId)  throws Exception{
+    public void upgrade(long sceneProId, boolean reUpgrade)  throws Exception{
 
         ScenePro scenePro = sceneProService.getById(sceneProId);
         //线程开始,正在执行线程数+1
@@ -140,19 +142,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>()
@@ -383,7 +378,8 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
                 new LambdaQueryWrapper<ScenePlusExt>()
                     .eq(ScenePlusExt::getPlusId, scenePro.getId()));
             if(StrUtil.isNotEmpty(scenePro.getThumb())
-                && scenePro.getThumb().contains(imagePath)){
+                && scenePro.getThumb().contains(imagePath)
+                && !reUpgrade){
                 String thumbUrl = null;
                 if(scenePro.getThumb().contains("thumbSmallImg.jpg")){
                     uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-1k.jpg");
@@ -454,15 +450,16 @@ 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;
             fdkankanMiniClient.upgradeToV4ResultSync(url,
-                RequestSceneProV4.builder().id(sceneProId).webSite(scenePro.getWebSite()).build(),
+                RequestSceneProV4.builder()
+                    .id(sceneProId)
+                    .webSite(scenePro.getWebSite())
+                    .thumb(scenePlusExt.getThumb())
+                    .build(),
                 new FdkkMiniReqSuccessCallback(), new FdkkMiniReqErrorCallback()
             );
 
@@ -476,10 +473,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);
@@ -606,4 +600,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);
+    }
 }

+ 5 - 0
src/main/resources/mapper/ScenePlusMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.IScenePlusMapper">
+
+</mapper>