|
@@ -4,8 +4,10 @@ import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
+import com.fdkankan.common.constant.CommonStatus;
|
|
import com.fdkankan.common.constant.RecStatus;
|
|
import com.fdkankan.common.constant.RecStatus;
|
|
import com.fdkankan.common.constant.TbStatus;
|
|
import com.fdkankan.common.constant.TbStatus;
|
|
|
|
+import com.fdkankan.common.util.RandomUtil;
|
|
import com.fdkankan.redis.constant.RedisKey;
|
|
import com.fdkankan.redis.constant.RedisKey;
|
|
import com.fdkankan.redis.constant.RedisLockKey;
|
|
import com.fdkankan.redis.constant.RedisLockKey;
|
|
import com.fdkankan.redis.util.RedisLockUtil;
|
|
import com.fdkankan.redis.util.RedisLockUtil;
|
|
@@ -16,8 +18,12 @@ import com.fdkankan.scene.service.IScene3dNumService;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.fdkankan.common.constant.ErrorCode;
|
|
import com.fdkankan.common.constant.ErrorCode;
|
|
import com.fdkankan.common.exception.BusinessException;
|
|
import com.fdkankan.common.exception.BusinessException;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import java.util.stream.Collectors;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
@@ -39,10 +45,18 @@ import java.util.Objects;
|
|
@RefreshScope
|
|
@RefreshScope
|
|
public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3dNum> implements IScene3dNumService {
|
|
public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3dNum> implements IScene3dNumService {
|
|
|
|
|
|
|
|
+ private
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
RedisUtil redisUtil;
|
|
RedisUtil redisUtil;
|
|
@Autowired
|
|
@Autowired
|
|
RedisLockUtil redisLockUtil;
|
|
RedisLockUtil redisLockUtil;
|
|
|
|
+ @Value("${scene.num.threshold:1000}")
|
|
|
|
+ private int threshold;
|
|
|
|
+ @Value("${scene.num.prefix:V4-}")
|
|
|
|
+ private String numPrefix;
|
|
|
|
+ @Value("${scene.num.batchSize:100}")
|
|
|
|
+ private int batchSize;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public String generateSceneNum(){
|
|
public String generateSceneNum(){
|
|
@@ -82,6 +96,64 @@ public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ public void batchCreateSceneNum() {
|
|
|
|
+
|
|
|
|
+ String lockKey = String.format(RedisLockKey.LOCK_BATCH_CREATE_NUM);
|
|
|
|
+ boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_10_MINUTE);
|
|
|
|
+ if(!lock){
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ long count = this.count(
|
|
|
|
+ new LambdaQueryWrapper<Scene3dNum>().eq(Scene3dNum::getUsed, CommonStatus.NO.code()));
|
|
|
|
+ if(count > threshold){
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ int batchCnt = threshold / batchSize + (threshold % batchSize > 0 ? 1 : 0);
|
|
|
|
+ for (int i = 0; i < batchCnt; i++){
|
|
|
|
+ Set<String> numSet = this.turnCreateSceneNum(batchSize);
|
|
|
|
+ List<Scene3dNum> scene3dNumList = numSet.stream().map(num -> {
|
|
|
|
+ Scene3dNum scene3dNum = new Scene3dNum();
|
|
|
|
+ scene3dNum.setNum(num);
|
|
|
|
+ return scene3dNum;
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
+ this.saveBatch(scene3dNumList);
|
|
|
|
+ }
|
|
|
|
+ }finally {
|
|
|
|
+ redisLockUtil.unlockLua(lockKey);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Set<String> turnCreateSceneNum(int cnt){
|
|
|
|
+
|
|
|
|
+ String num;
|
|
|
|
+ Set<String> numSet = new HashSet<>();
|
|
|
|
+ for(int i = 0; i < cnt; i++){
|
|
|
|
+ num = numPrefix + RandomUtil.generateShortUuid();
|
|
|
|
+ numSet.add(num);
|
|
|
|
+ }
|
|
|
|
+ List<Scene3dNum> existList = this.list(
|
|
|
|
+ new LambdaQueryWrapper<Scene3dNum>()
|
|
|
|
+ .in(Scene3dNum::getNum, numSet));
|
|
|
|
+
|
|
|
|
+ Set<String> existNumSet = null;
|
|
|
|
+ if(CollUtil.isNotEmpty(existList)){
|
|
|
|
+ existNumSet = existList.stream().map(Scene3dNum::getNum).collect(Collectors.toSet());
|
|
|
|
+ }
|
|
|
|
+ if(CollUtil.isNotEmpty(existNumSet)){
|
|
|
|
+ numSet.removeAll(existNumSet);
|
|
|
|
+ }
|
|
|
|
+ if(numSet.size() < cnt){
|
|
|
|
+ numSet.addAll(this.turnCreateSceneNum(cnt - numSet.size()));
|
|
|
|
+ }
|
|
|
|
+ return numSet;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
public List<String> findSceneNum() {
|
|
public List<String> findSceneNum() {
|
|
return baseMapper.findSceneNum();
|
|
return baseMapper.findSceneNum();
|
|
}
|
|
}
|