SceneUpgradeToV4Service.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package com.fdkankan.ucenter.service.impl;
  2. import cn.hutool.core.exceptions.ExceptionUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.fdkankan.common.constant.CommonStatus;
  7. import com.fdkankan.common.constant.ErrorCode;
  8. import com.fdkankan.common.constant.SceneKind;
  9. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  10. import com.fdkankan.redis.constant.RedisKey;
  11. import com.fdkankan.redis.constant.RedisLockKey;
  12. import com.fdkankan.redis.util.RedisLockUtil;
  13. import com.fdkankan.redis.util.RedisUtil;
  14. import com.fdkankan.ucenter.bean.SceneUpgradeProgressBean;
  15. import com.fdkankan.ucenter.common.Result;
  16. import com.fdkankan.ucenter.entity.ScenePlus;
  17. import com.fdkankan.ucenter.entity.ScenePlusExt;
  18. import com.fdkankan.ucenter.entity.ScenePro;
  19. import com.fdkankan.ucenter.entity.SceneRepairLog;
  20. import com.fdkankan.ucenter.mapper.ISceneUpgradeMapper;
  21. import com.fdkankan.ucenter.service.IScenePlusExtService;
  22. import com.fdkankan.ucenter.service.IScenePlusService;
  23. import com.fdkankan.ucenter.service.ISceneProService;
  24. import com.fdkankan.ucenter.service.ISceneRepairLogService;
  25. import com.fdkankan.ucenter.service.ISceneUpgradeToV4Service;
  26. import java.util.Calendar;
  27. import java.util.HashMap;
  28. import java.util.Map;
  29. import java.util.Objects;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.beans.factory.annotation.Value;
  33. import org.springframework.stereotype.Service;
  34. /**
  35. * <p>
  36. * TODO
  37. * </p>
  38. *
  39. * @author dengsixing
  40. * @since 2022/4/21
  41. **/
  42. @Slf4j
  43. @Service
  44. public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
  45. @Value("${queue.scene.upgrade-to-v4}")
  46. private String upgradeToV4;
  47. @Autowired
  48. private ISceneRepairLogService sceneRepairLogService;
  49. @Autowired
  50. private ISceneProService sceneProService;
  51. @Autowired
  52. private ISceneUpgradeMapper sceneUpgradeMapper;
  53. @Autowired
  54. private RedisUtil redisUtil;
  55. @Autowired
  56. private RedisLockUtil redisLockUtil;
  57. @Autowired
  58. private RabbitMqProducer rabbitMqProducer;
  59. @Autowired
  60. private IScenePlusService scenePlusService;
  61. @Autowired
  62. private IScenePlusExtService scenePlusExtService;
  63. @Override
  64. public Result upgrade(String num) throws Exception{
  65. boolean reUpgrade = false;
  66. ScenePro scenePro = sceneProService.getOne(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getNum, num));
  67. if(scenePro.getIsUpgrade() == CommonStatus.YES.code().intValue()){
  68. reUpgrade = true;
  69. }
  70. //加锁
  71. String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, num);
  72. boolean lock = redisLockUtil.lock(lockKey,RedisKey.EXPIRE_TIME_2_HOUR);
  73. if(!lock){
  74. return Result.failure(ErrorCode.FAILURE_CODE_7019.code(), ErrorCode.FAILURE_CODE_7019.message());
  75. }
  76. SceneRepairLog sceneRepairLog = null;
  77. try {
  78. //查询升级日志,如果已经升级成功,不允许重复升级
  79. sceneRepairLog = sceneRepairLogService.getOne(
  80. new LambdaQueryWrapper<SceneRepairLog>()
  81. .eq(SceneRepairLog::getNum, num)
  82. .orderByDesc(SceneRepairLog::getId)
  83. .last("limit 1"));
  84. if(Objects.nonNull(sceneRepairLog)){
  85. if(sceneRepairLog.getState() == 0){
  86. return Result.failure(ErrorCode.FAILURE_CODE_7019.code(), ErrorCode.FAILURE_CODE_7019.message());
  87. }
  88. }
  89. scenePro.setIsUpgrade(2); //升级中
  90. sceneProService.updateById(scenePro);
  91. //写入升级日志
  92. this.upgradeLog(null, num, 0, null);
  93. //同步到scenePlus、scenePlus
  94. ScenePlus scenePlus = scenePlusService.getByNum(num);
  95. if(Objects.nonNull(scenePlus)){
  96. sceneUpgradeMapper.deleteScenePlus(num);
  97. sceneUpgradeMapper.deleteScenePlusExt(scenePlus.getId());
  98. }
  99. sceneUpgradeMapper.transferScenePlus(num);
  100. scenePlus = scenePlusService.getByNum(num);
  101. String sceneKind = scenePro.getSceneScheme() == 3 ? SceneKind.FACE.code():SceneKind.TILES.code();
  102. sceneUpgradeMapper.transferScenePlusExt(num, scenePlus.getId(), sceneKind);
  103. //写入进度条
  104. Map<String, Integer> progress = new HashMap<>();
  105. progress.put("status", 0);
  106. progress.put("progress", 0);
  107. redisUtil.set(RedisKey.scene_upgrade_progress_num, JSON.toJSONString(progress));
  108. //发送mq
  109. HashMap<String, Object> msg = new HashMap<>();
  110. msg.put("sceneProId", scenePro.getId());
  111. msg.put("reUpgrade", reUpgrade);
  112. rabbitMqProducer.sendByWorkQueue(upgradeToV4, msg);
  113. }catch (Exception e){
  114. log.error("场景升级失败", e);
  115. redisLockUtil.unlockLua(lockKey);
  116. this.upgradeLog(sceneRepairLog, num, 2, ExceptionUtil.stacktraceToString(e, 3000));
  117. return Result.failure(ErrorCode.FAILURE_CODE_7021.code(), ErrorCode.FAILURE_CODE_7021.message());
  118. }
  119. return Result.success();
  120. }
  121. public Result getUpgradeToV4Progress(String num){
  122. String key = String.format(RedisKey.scene_upgrade_progress_num, num);
  123. String progress = redisUtil.get(key);
  124. SceneUpgradeProgressBean progressBean = null;
  125. if(StrUtil.isNotEmpty(progress)){
  126. progressBean = JSON.parseObject(progress, SceneUpgradeProgressBean.class);
  127. }else{
  128. progressBean = SceneUpgradeProgressBean.builder().num(num).status(0).progress(0).build();
  129. }
  130. return Result.success(progressBean);
  131. }
  132. private void upgradeLog(SceneRepairLog sceneRepairLog, String num, int status, String reason){
  133. //写入升级日志
  134. if(Objects.isNull(sceneRepairLog)){
  135. sceneRepairLog = new SceneRepairLog();
  136. sceneRepairLog.setNum(num);
  137. }
  138. sceneRepairLog.setState(status);
  139. sceneRepairLog.setReason(reason);
  140. sceneRepairLog.setCreateTime(Calendar.getInstance().getTime());
  141. sceneRepairLogService.saveOrUpdate(sceneRepairLog);
  142. }
  143. }