Scene3dNumServiceImpl.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.fdkankan.ucenter.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.fdkankan.common.exception.BusinessException;
  4. import com.fdkankan.common.util.RandomUtil;
  5. import com.fdkankan.redis.util.RedisUtil;
  6. import com.fdkankan.ucenter.common.CameraTypeEnum;
  7. import com.fdkankan.ucenter.common.RedisKeyUtil;
  8. import com.fdkankan.ucenter.entity.Scene3dNum;
  9. import com.fdkankan.ucenter.mapper.IScene3dNumMapper;
  10. import com.fdkankan.ucenter.service.IScene3dNumService;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.util.ObjectUtils;
  16. import org.springframework.util.StringUtils;
  17. import java.util.*;
  18. import java.util.stream.Collectors;
  19. /**
  20. * <p>
  21. * 场景编码表 服务实现类
  22. * </p>
  23. *
  24. * @author
  25. * @since 2022-07-12
  26. */
  27. @Service
  28. @Slf4j
  29. public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3dNum> implements IScene3dNumService {
  30. @Autowired
  31. RedisUtil redisUtil;
  32. @Override
  33. public String generateSceneNum(Integer cameraType) {
  34. String sceneNum = redisUtil.lLeftPop(RedisKeyUtil.SCENE_UNUSED_NUMS);
  35. if(!StringUtils.isEmpty(sceneNum)){
  36. return addPrefix(sceneNum,cameraType);
  37. }
  38. long incr = redisUtil.incr(RedisKeyUtil.SCENE_NUMS_LOADING, 1);
  39. if(incr == 1){
  40. try {
  41. log.info("开始从数据库加载场景码");
  42. List<String> numList = this.getSceneNum();
  43. redisUtil.lRightPushAll(RedisKeyUtil.SCENE_UNUSED_NUMS,numList);
  44. log.info("场景码加载完成");
  45. }catch ( Exception e){
  46. e.printStackTrace();
  47. }finally {
  48. redisUtil.del(RedisKeyUtil.SCENE_NUMS_LOADING);
  49. }
  50. }else {
  51. // 等待1秒加载缓存
  52. try {
  53. Thread.sleep(1000);
  54. } catch (InterruptedException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. String num = redisUtil.lLeftPop(RedisKeyUtil.SCENE_UNUSED_NUMS);
  59. if(ObjectUtils.isEmpty(num)){
  60. log.error("场景码加载失败");
  61. throw new BusinessException(-1,"场景码生成失败,请重试");
  62. }
  63. return addPrefix(num,cameraType);
  64. }
  65. private static String addPrefix( String num,Integer cameraType){
  66. if(cameraType == null){
  67. return num;
  68. }
  69. return CameraTypeEnum.getSceneNumPrefixByType(cameraType) + num;
  70. }
  71. private List<String> getSceneNum() {
  72. LambdaQueryWrapper<Scene3dNum> wrapper = new LambdaQueryWrapper<>();
  73. wrapper.eq(Scene3dNum::getUsed,0);
  74. long count = this.count(wrapper);
  75. List<Scene3dNum> numList ;
  76. if(count < 10){
  77. log.info("场景码数量不足生成场景码");
  78. numList = this.createNum(10);
  79. }else {
  80. wrapper.last("limit 100");
  81. numList = this.list(wrapper);
  82. for (Scene3dNum scene3dNum : numList) {
  83. scene3dNum.setUsed(1);
  84. }
  85. this.updateBatchById(numList);
  86. }
  87. return numList.parallelStream().map(Scene3dNum::getCode).collect(Collectors.toList());
  88. }
  89. private List<Scene3dNum> createNum(Integer size) {
  90. //uuid 作为生成批次
  91. List<Scene3dNum> scene3dNums = new ArrayList<>();
  92. String uuid = UUID.randomUUID().toString().replace("-", "");
  93. HashSet<String> codeList = this.createCode(size);
  94. while (codeList.size() < size){
  95. codeList.addAll(this.createCode(size - codeList.size()));
  96. }
  97. for (String code : codeList) {
  98. Scene3dNum scene3dNum = new Scene3dNum();
  99. scene3dNum.setUsed(1);
  100. scene3dNum.setCode(code);
  101. scene3dNum.setFolderName(uuid);
  102. scene3dNum.setCreateTime(new Date());
  103. scene3dNum.setUpdateTime(new Date());
  104. scene3dNums.add(scene3dNum);
  105. }
  106. this.saveBatch(scene3dNums);
  107. return scene3dNums;
  108. }
  109. private HashSet<String> createCode(Integer size) {
  110. HashSet<String> codeList = new HashSet<>();
  111. while (codeList.size() < size){
  112. String code = RandomUtil.generateShortUuid().substring(0,8);
  113. codeList.add(code);
  114. }
  115. LambdaQueryWrapper<Scene3dNum> wrapper = new LambdaQueryWrapper<>();
  116. wrapper.in(Scene3dNum::getCode,codeList);
  117. List<Scene3dNum> list = this.list(wrapper);
  118. if(list.size() <=0){
  119. return codeList;
  120. }
  121. for (Scene3dNum scene3dNum : list) {
  122. codeList.remove(scene3dNum.getCode());
  123. }
  124. return codeList;
  125. }
  126. }