package com.admin.service.impl;
import com.admin.common.dto.GostDto;
import com.admin.common.dto.SpeedLimitDto;
import com.admin.common.dto.SpeedLimitUpdateDto;
import com.admin.common.lang.R;
import com.admin.common.utils.GostUtil;
import com.admin.entity.*;
import com.admin.mapper.SpeedLimitMapper;
import com.admin.service.*;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
/**
*
* 限速规则服务实现类
* 提供限速规则的增删改查功能,包括与Gost服务的集成
* 支持限速器的创建、更新、删除和查询操作
*
*
* @author QAQ
* @since 2025-06-04
*/
@Service
public class SpeedLimitServiceImpl extends ServiceImpl implements SpeedLimitService {
@Resource
@Lazy
TunnelService tunnelService;
@Resource
NodeService nodeService;
@Resource
UserTunnelService userTunnelService;
@Resource
ChainTunnelService chainTunnelService;
@Override
public R createSpeedLimit(SpeedLimitDto speedLimitDto) {
Tunnel tunnel = tunnelService.getById(speedLimitDto.getTunnelId());
if (tunnel == null) return R.err("隧道不存在");
SpeedLimit speedLimit = new SpeedLimit();
BeanUtils.copyProperties(speedLimitDto, speedLimit);
long currentTime = System.currentTimeMillis();
speedLimit.setCreatedTime(currentTime);
speedLimit.setUpdatedTime(currentTime);
speedLimit.setStatus(1);
this.save(speedLimit);
String speedInMBps = convertBitsToMBps(speedLimit.getSpeed());
List limit_success = new ArrayList<>();
List tunnelList = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", speedLimit.getTunnelId()));
for (ChainTunnel chainTunnel : tunnelList) {
Node node = nodeService.getById(chainTunnel.getNodeId());
if (node != null) {
GostDto gostDto = GostUtil.AddLimiters(node.getId(), speedLimit.getId(), speedInMBps);
if (Objects.equals(gostDto.getMsg(), "OK")){
limit_success.add(node.getId());
}else {
this.removeById(speedLimit.getId());
for (Long node_id : limit_success) {
GostDto deleteLimiters = GostUtil.DeleteLimiters(node_id, speedLimit.getId());
System.out.println(deleteLimiters);
}
return R.err(gostDto.getMsg());
}
}
}
return R.ok();
}
@Override
public R getAllSpeedLimits() {
List speedLimits = this.list();
return R.ok(speedLimits);
}
@Override
public R updateSpeedLimit(SpeedLimitUpdateDto speedLimitUpdateDto) {
SpeedLimit speedLimit = this.getById(speedLimitUpdateDto.getId());
if (speedLimit == null) return R.err("限速不存在");
BeanUtils.copyProperties(speedLimitUpdateDto, speedLimit);
speedLimit.setUpdatedTime(System.currentTimeMillis());
String speedInMBps = convertBitsToMBps(speedLimit.getSpeed());
List tunnelList = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", speedLimit.getTunnelId()));
for (ChainTunnel chainTunnel : tunnelList) {
Node node = nodeService.getById(chainTunnel.getNodeId());
if (node != null) {
GostDto gostDto = GostUtil.UpdateLimiters(node.getId(), speedLimit.getId(), speedInMBps);
if (!Objects.equals(gostDto.getMsg(), "OK")) return R.err(gostDto.getMsg());
}
}
this.updateById(speedLimit);
return R.ok();
}
@Override
public R deleteSpeedLimit(Long id) {
// 1. 验证限速规则是否存在
SpeedLimit speedLimit = this.getById(id);
if (speedLimit == null) return R.err("限速规则不存在");
int userCount = userTunnelService.count(new QueryWrapper().eq("speed_id", speedLimit.getId()));
if (userCount != 0) return R.err("该限速规则还有用户在使用 请先取消分配");
List tunnelList = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", speedLimit.getTunnelId()));
for (ChainTunnel chainTunnel : tunnelList) {
Node node = nodeService.getById(chainTunnel.getNodeId());
if (node != null) {
GostDto gostDto = GostUtil.DeleteLimiters(node.getId(), speedLimit.getId());
if (!Objects.equals(gostDto.getMsg(), "OK"))return R.err(gostDto.getMsg());
}
}
this.removeById(id);
return R.ok();
}
private String convertBitsToMBps(Integer speedInBits) {
double mbs = speedInBits / 8.0;
BigDecimal bd = new BigDecimal(mbs).setScale(1, RoundingMode.HALF_UP);
return bd.doubleValue() + "";
}
}