| | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.List; |
| | | import java.util.Random; |
| | | |
| | | |
| | | public abstract class AbstractGetDataJob implements Runnable { |
| | |
| | | |
| | | public abstract String getName(); |
| | | |
| | | // 在类中定义静态Random实例 |
| | | private static final Random random = new Random(); |
| | | |
| | | public abstract void realtimeHandle(String symbols); |
| | | |
| | |
| | | AdjustmentValue delayValue = AdjustmentValueCache.getDelayValue().get(symbol); |
| | | |
| | | if (delayValue != null) { |
| | | // 延时几次 |
| | | int frequency = (int) Arith.div(Arith.mul(delayValue.getSecond(), 1000.0D), this.interval); |
| | | //延时几次 缓存frequency |
| | | Integer frequency = AdjustmentValueCache.getFrequency().get(symbol); |
| | | if (frequency == null) { //首次计算 缓存 |
| | | frequency = (int) Arith.div(Arith.mul(delayValue.getSecond(), 1000.0D), this.interval); |
| | | AdjustmentValueCache.getFrequency().put(symbol, frequency); |
| | | } |
| | | |
| | | if (frequency <= 1) { |
| | | if (currentValue == null) { |
| | |
| | | itemService.saveOrUpdate(item); |
| | | } |
| | | AdjustmentValueCache.getDelayValue().remove(symbol); |
| | | AdjustmentValueCache.getFrequency().remove(symbol); |
| | | } else { |
| | | // 本次调整值 |
| | | /*// 本次调整值 |
| | | BigDecimal currentValue_frequency = delayValue.getValue().divide(new BigDecimal(frequency), decimal, RoundingMode.HALF_UP); |
| | | |
| | | if (currentValue == null) { |
| | |
| | | if (!item.getAdjustmentValue().equals(AdjustmentValueCache.getCurrentValue().get(symbol))) { |
| | | item.setAdjustmentValue(AdjustmentValueCache.getCurrentValue().get(symbol)); |
| | | itemService.saveOrUpdate(item); |
| | | }*/ |
| | | // 保存原始总值用于计算随机分配 |
| | | BigDecimal totalValue = delayValue.getValue(); |
| | | // 计算已分配次数(从缓存中获取) |
| | | Integer allocatedCount = AdjustmentValueCache.getAllocatedCount().get(symbol); |
| | | if (allocatedCount == null) { |
| | | allocatedCount = 0; |
| | | // 首次分配时保存总值到缓存,用于后续计算 |
| | | AdjustmentValueCache.getTotalValue().put(symbol, totalValue); |
| | | } else { |
| | | //不是首次 |
| | | totalValue = AdjustmentValueCache.getTotalValue().get(symbol); |
| | | } |
| | | |
| | | BigDecimal currentValue_frequency; |
| | | // 计算剩余分配次数 |
| | | int remainingAllocations = frequency - allocatedCount; |
| | | |
| | | if (remainingAllocations > 1) { |
| | | // 不是最后一次分配,生成随机值 |
| | | // 计算基础平均值 |
| | | BigDecimal average = totalValue.divide(new BigDecimal(frequency), decimal, RoundingMode.HALF_UP); |
| | | // 生成0.3到1.7之间的随机因子(可根据需求调整) |
| | | double randomFactor = 0.3 + random.nextDouble() * 1.4; |
| | | currentValue_frequency = average.multiply(new BigDecimal(randomFactor)) |
| | | .setScale(decimal, RoundingMode.HALF_UP); |
| | | |
| | | // 确保随机值不会超过剩余值的80%,防止最后一次分配出现负值 |
| | | BigDecimal remainingValue = totalValue.subtract(AdjustmentValueCache.getAccumulatedValue().getOrDefault(symbol, BigDecimal.ZERO)); |
| | | BigDecimal maxAllowed = remainingValue.multiply(new BigDecimal(0.8)).setScale(decimal, RoundingMode.HALF_UP); |
| | | if (currentValue_frequency.compareTo(maxAllowed) > 0) { |
| | | currentValue_frequency = maxAllowed; |
| | | } |
| | | } else { |
| | | // 最后一次分配,使用剩余的全部值 |
| | | BigDecimal accumulated = AdjustmentValueCache.getAccumulatedValue().getOrDefault(symbol, BigDecimal.ZERO); |
| | | currentValue_frequency = totalValue.subtract(accumulated).setScale(decimal, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | // 更新累计值 |
| | | BigDecimal newAccumulated = AdjustmentValueCache.getAccumulatedValue().getOrDefault(symbol, BigDecimal.ZERO) |
| | | .add(currentValue_frequency); |
| | | AdjustmentValueCache.getAccumulatedValue().put(symbol, newAccumulated); |
| | | // 更新分配次数 |
| | | AdjustmentValueCache.getAllocatedCount().put(symbol, allocatedCount + 1); |
| | | |
| | | // 更新当前值 |
| | | if (currentValue == null) { |
| | | AdjustmentValueCache.getCurrentValue().put(symbol, currentValue_frequency); |
| | | } else { |
| | | AdjustmentValueCache.getCurrentValue().put(symbol, |
| | | currentValue.add(currentValue_frequency)); |
| | | } |
| | | |
| | | // 更新延迟值 |
| | | delayValue.setValue(delayValue.getValue().subtract(currentValue_frequency)); |
| | | delayValue.setSecond(Arith.sub(delayValue.getSecond(), Arith.div(this.interval, 1000.0D))); |
| | | AdjustmentValueCache.getDelayValue().put(symbol, delayValue); |
| | | |
| | | // 如果是最后一次分配,清理缓存 |
| | | if (remainingAllocations <= 1) { |
| | | AdjustmentValueCache.getAllocatedCount().remove(symbol); |
| | | AdjustmentValueCache.getTotalValue().remove(symbol); |
| | | AdjustmentValueCache.getAccumulatedValue().remove(symbol); |
| | | AdjustmentValueCache.getFrequency().remove(symbol); |
| | | |
| | | AdjustmentValueCache.getDelayValue().remove(symbol); |
| | | } |
| | | |
| | | // 保存更新 |
| | | if (!item.getAdjustmentValue().equals(AdjustmentValueCache.getCurrentValue().get(symbol))) { |
| | | item.setAdjustmentValue(AdjustmentValueCache.getCurrentValue().get(symbol)); |
| | | itemService.saveOrUpdate(item); |
| | | } |
| | | } |
| | | } |