SceneUpgradeToV4Service.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.fdkankan.common.constant.ErrorCode;
  7. import com.fdkankan.common.response.ResultData;
  8. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  9. import com.fdkankan.redis.constant.RedisKey;
  10. import com.fdkankan.redis.constant.RedisLockKey;
  11. import com.fdkankan.redis.util.RedisLockUtil;
  12. import com.fdkankan.redis.util.RedisUtil;
  13. import com.fdkankan.scene.bean.SceneUpgradeProgressBean;
  14. import com.fdkankan.scene.entity.ScenePlusExt;
  15. import com.fdkankan.scene.entity.SceneProEdit;
  16. import com.fdkankan.scene.entity.SceneProEditExt;
  17. import com.fdkankan.scene.entity.SceneProEditV3;
  18. import com.fdkankan.scene.entity.SceneProExt;
  19. import com.fdkankan.scene.entity.SceneProV3;
  20. import com.fdkankan.scene.entity.SceneRepairLog;
  21. import com.fdkankan.scene.mapper.ISceneUpgradeMapper;
  22. import com.fdkankan.scene.service.IScenePlusExtService;
  23. import com.fdkankan.scene.service.IScenePlusService;
  24. import com.fdkankan.scene.service.ISceneProEditExtService;
  25. import com.fdkankan.scene.service.ISceneProEditService;
  26. import com.fdkankan.scene.service.ISceneProEditV3Service;
  27. import com.fdkankan.scene.service.ISceneProExtService;
  28. import com.fdkankan.scene.service.ISceneProService;
  29. import com.fdkankan.scene.service.ISceneProV3Service;
  30. import com.fdkankan.scene.service.ISceneRepairLogService;
  31. import com.fdkankan.scene.service.ISceneUpgradeToV4Service;
  32. import com.fdkankan.scene.vo.UpgradeToV4ParamVO;
  33. import java.util.HashMap;
  34. import java.util.Map;
  35. import java.util.Objects;
  36. import lombok.extern.slf4j.Slf4j;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.beans.factory.annotation.Value;
  39. import org.springframework.stereotype.Service;
  40. /**
  41. * <p>
  42. * TODO
  43. * </p>
  44. *
  45. * @author dengsixing
  46. * @since 2022/4/21
  47. **/
  48. @Slf4j
  49. @Service
  50. public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
  51. @Value("${queue.scene.upgrade-to-v4}")
  52. private String upgradeToV4;
  53. @Autowired
  54. private ISceneProV3Service sceneProV3Service;
  55. @Autowired
  56. private ISceneProEditV3Service sceneProEditV3Service;
  57. @Autowired
  58. private ISceneUpgradeMapper sceneUpgradeMapper;
  59. @Autowired
  60. private RedisLockUtil redisLockUtil;
  61. @Autowired
  62. private ISceneRepairLogService sceneRepairLogService;
  63. @Autowired
  64. private RabbitMqProducer rabbitMqProducer;
  65. @Autowired
  66. private RedisUtil redisUtil;
  67. @Autowired
  68. private ISceneProService sceneProService;
  69. @Autowired
  70. private ISceneProExtService sceneProExtService;
  71. @Autowired
  72. private IScenePlusService scenePlusService;
  73. @Autowired
  74. private IScenePlusExtService scenePlusExtService;
  75. @Autowired
  76. private ISceneProEditService sceneProEditService;
  77. @Autowired
  78. private ISceneProEditExtService sceneProEditExtService;
  79. @Override
  80. public ResultData upgradeToV4(UpgradeToV4ParamVO param) {
  81. SceneProV3 sceneProV3 = JSON.parseObject(param.getScenePro(), SceneProV3.class);
  82. SceneProEditV3 sceneProEditV3 = JSON.parseObject(param.getSceneProEdit(), SceneProEditV3.class);
  83. //加锁
  84. String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, sceneProV3.getNum());
  85. boolean lock = redisLockUtil.lock(lockKey,RedisKey.EXPIRE_TIME_2_HOUR);
  86. if(!lock){
  87. return ResultData.error(ErrorCode.FAILURE_CODE_7019);
  88. }
  89. try {
  90. //查询升级日志,如果已经升级成功,不允许重复升级
  91. SceneRepairLog sceneRepairLog = sceneRepairLogService.getOne(
  92. new LambdaQueryWrapper<SceneRepairLog>()
  93. .eq(SceneRepairLog::getNum, sceneProV3.getNum()));
  94. if(Objects.nonNull(sceneRepairLog)){
  95. if(sceneRepairLog.getState() == 0){
  96. redisLockUtil.unlockLua(lockKey);
  97. return ResultData.error(ErrorCode.FAILURE_CODE_7019);
  98. }
  99. if(sceneRepairLog.getState() == 1){
  100. redisLockUtil.unlockLua(lockKey);
  101. return ResultData.error(ErrorCode.FAILURE_CODE_7020);
  102. }
  103. }
  104. //写入sceneProV3
  105. sceneProV3Service.saveOrUpdate(sceneProV3);
  106. //写入sceneProEditV3
  107. sceneProEditV3Service.saveOrUpdate(sceneProEditV3);
  108. //写入sceneProEdit、写入sceneProEditExt
  109. sceneUpgradeMapper.deleteSceneProEdit(sceneProEditV3.getId());
  110. sceneUpgradeMapper.transferSceneProEdit(sceneProEditV3.getId());
  111. sceneUpgradeMapper.deleteSceneProEditExt(sceneProEditV3.getId());
  112. sceneUpgradeMapper.transferSceneProEditExt(sceneProEditV3.getId());
  113. //同步到scenePro、sceneProExt
  114. sceneUpgradeMapper.deleteScenePro(sceneProV3.getId());
  115. sceneUpgradeMapper.transferScenePro(sceneProV3.getId());
  116. sceneUpgradeMapper.deleteSceneProExt(sceneProV3.getId());
  117. sceneUpgradeMapper.transferSceneProExt(sceneProV3.getId());
  118. //同步到scenePlus、scenePlus
  119. sceneUpgradeMapper.deleteScenePlus(sceneProV3.getId());
  120. sceneUpgradeMapper.transferScenePlus(sceneProV3.getId());
  121. sceneUpgradeMapper.deleteScenePlusExt(sceneProV3.getId());
  122. sceneUpgradeMapper.transferScenePlusExt(sceneProV3.getId());
  123. //发送mq
  124. rabbitMqProducer.sendByWorkQueue(upgradeToV4, sceneProV3.getId());
  125. //写入进度条
  126. Map<String, Integer> progress = new HashMap<>();
  127. progress.put("status", 0);
  128. progress.put("progress", 0);
  129. redisUtil.set(RedisKey.scene_upgrade_progress_num, JSON.toJSONString(progress));
  130. }catch (Exception e){
  131. log.error("场景升级失败", e);
  132. return ResultData.error(ErrorCode.FAILURE_CODE_7021);
  133. }
  134. return ResultData.ok();
  135. }
  136. @Override
  137. public ResultData getUpgradeToV4Progress(String num) {
  138. String key = String.format(RedisKey.scene_upgrade_progress_num, num);
  139. String progress = redisUtil.get(key);
  140. SceneUpgradeProgressBean progressBean = null;
  141. if(StrUtil.isNotEmpty(progress)){
  142. progressBean = JSON.parseObject(progress, SceneUpgradeProgressBean.class);
  143. }else{
  144. progressBean = SceneUpgradeProgressBean.builder().num(num).status(0).progress(0).build();
  145. }
  146. return ResultData.ok(progressBean);
  147. }
  148. }