xuqiang 1 vuosi sitten
vanhempi
commit
9151f659bc

+ 9 - 0
src/main/java/com/ydtech/modules/ttqf/dao/PartTtqfRecordMapper.java

@@ -0,0 +1,9 @@
+package com.ydtech.modules.ttqf.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.ttqf.entity.PartTtqfRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PartTtqfRecordMapper extends BaseMapper<PartTtqfRecord> {
+}

+ 31 - 0
src/main/java/com/ydtech/modules/ttqf/entity/PartTtqfRecord.java

@@ -0,0 +1,31 @@
+package com.ydtech.modules.ttqf.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ydtech.modules.base.model.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("pay_ttqf_record")
+public class PartTtqfRecord extends BaseEntity {
+
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    private String userId;
+
+    private String bankCard;
+
+    private BigDecimal accumulatedAmount;
+
+    private BigDecimal feeAmount;
+
+    private BigDecimal amount;
+
+
+}

+ 54 - 0
src/main/java/com/ydtech/modules/ttqf/xxx/InitializeInternalWithdrawalId.java

@@ -0,0 +1,54 @@
+package com.ydtech.modules.ttqf.xxx;
+
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.ydtech.modules.admin.service.SysUserService;
+import groovy.util.logging.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@lombok.extern.slf4j.Slf4j
+@Component
+@Slf4j
+public class InitializeInternalWithdrawalId {
+
+
+    private final RedisTemplate<String, String> redisTemplate;
+
+    private final SysUserService sysUserService;
+
+
+    public InitializeInternalWithdrawalId(RedisTemplate<String, String> redisTemplate,SysUserService sysUserService) {
+        this.redisTemplate = redisTemplate;
+        this.sysUserService = sysUserService;
+    }
+
+    public void initialize() {
+        List<String> tasks = sysUserService.queryInternalNumber();
+        if (redisTemplate.hasKey(RoundRobinService.LIST_KEY)){
+            log.info("Redis 存在key DEFAULT_INTERNAL_ID 加载内部提现工号 {} 条任务", tasks.size());
+            List<String> range = redisTemplate.opsForList().range(RoundRobinService.LIST_KEY, 0, -1);
+            if (CollectionUtil.isNotEmpty(tasks)) {
+                List<String> add = tasks.stream().filter(s -> !range.contains(s)).collect(Collectors.toList());
+                if (CollectionUtil.isNotEmpty(add)){
+                    SpringUtil.getBean(RoundRobinService.class).batchAdd(add);
+                }
+                for (String s : range) {
+                    if (!tasks.contains(s)){
+                        SpringUtil.getBean(RoundRobinService.class).remove(s);
+                    }
+                }
+            }
+        }else {
+            SpringUtil.getBean(RoundRobinService.class).batchAdd(tasks);
+            log.info("Redis 初始化完成,加载内部提现工号 {} 条任务", tasks.size());
+        }
+
+    }
+
+
+}

+ 80 - 0
src/main/java/com/ydtech/modules/ttqf/xxx/RoundRobinService.java

@@ -0,0 +1,80 @@
+package com.ydtech.modules.ttqf.xxx;
+
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
+import org.springframework.stereotype.Service;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@Service
+public class RoundRobinService {
+
+    private final RedisTemplate<String, String> redisTemplate;
+    public static final String LIST_KEY = "DEFAULT:WITHDRAWAL:id";
+    private static final String INDEX_KEY =  "DEFAULT:WITHDRAWAL:index";
+
+    public RoundRobinService(RedisTemplate<String, String> redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+
+    private static final String LUA_SCRIPT =
+            "local indexKey = KEYS[2] " +
+                    "local listKey = KEYS[1] " +
+                    "local currentIndex = tonumber(redis.call('GET', indexKey) or 0) " +
+                    "local listSize = redis.call('LLEN', listKey) " +
+                    "if listSize == 0 then  return nil  end " +
+                    "local value = redis.call('LINDEX', listKey, currentIndex) " +
+                    "local nextIndex = (currentIndex + 1) % listSize " +
+                    "redis.call('SET', indexKey, nextIndex) " +
+                    "return value";
+
+
+    public String getNextWithLua() {
+        DefaultRedisScript<String> script = new DefaultRedisScript<>(LUA_SCRIPT, String.class);
+        return redisTemplate.execute(script, Arrays.asList(LIST_KEY, INDEX_KEY));
+    }
+
+
+
+    // 添加成员(动态扩展)
+    public void batchAdd(List<String> values) {
+        Long l = redisTemplate.opsForList().rightPushAll(LIST_KEY, values);
+        System.out.println("添加成功,当前队列长度为:" + l);
+    }
+
+
+    public boolean remove(String value) {
+        String script =
+                "local list = redis.call('LRANGE', KEYS[1], 0, -1) " +
+                        "local new_list = {} " +
+                        "for i, v in ipairs(list) do " +
+                        "    if v ~= ARGV[1] then " +
+                        "        table.insert(new_list, v) " +
+                        "    end " +
+                        "end " +
+                        "redis.call('DEL', KEYS[1]) " +
+                        "redis.call('RPUSH', KEYS[1], unpack(new_list)) " +
+                        "return #new_list";
+        Long result = redisTemplate.execute(
+                new DefaultRedisScript<>(script, Long.class),
+                Collections.singletonList(LIST_KEY),
+                value
+        );
+        return result != null && result > 0;
+    }
+
+
+
+    /**
+     * 添加字符串到集合
+     */
+    public void addString(String item) {
+        redisTemplate.opsForList().rightPush(LIST_KEY, item);
+    }
+
+
+}