VehicleSimulation/src/main/java/com/muyu/web/service/impl/VechileInfoServiceImpl.java

145 lines
5.5 KiB
Java

package com.muyu.web.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.system.handle.SystemHandler;
import com.muyu.web.domain.VehicleInfo;
import com.muyu.web.mapper.VehicleInfoMapper;
import com.muyu.web.service.VehicleInstanceService;
import com.muyu.web.service.VehicleInfoService;
import com.muyu.vehicle.VehicleInstance;
import com.muyu.vehicle.core.LocalContainer;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
/**
* <p>
* 车辆 服务实现类
* </p>
*
* @author DongZeLiang
* @since 2022-07-05
*/
@Log4j2
@Service
public class VechileInfoServiceImpl extends ServiceImpl<VehicleInfoMapper, VehicleInfo> implements VehicleInfoService {
@Autowired
private VehicleInstanceService vehicleInstanceService;
/**
* 根据数量生成测试车辆
*
* @param sum 数量
*/
@Override
@Transactional
public void generate (Integer sum) {
List<VehicleInfo> vehicleInfoList = Stream.generate(VehicleInfo::gen).limit(sum).toList();
this.saveBatch(vehicleInfoList);
vehicleInfoList.forEach(vehicleInstanceService::init);
}
/**
* 创建IVN
*
* @param vinStr VIN
*/
@Override
@Transactional
public void create (String vinStr) {
String[] vinList = vinStr.split("\n");
StringBuilder errorMsg = new StringBuilder();
for (String vin : vinList) {
if (vin.length() != 17) {
errorMsg.append("vin[").append(vin).append("]").append("不为17位\n");
} else {
LambdaQueryWrapper<VehicleInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(VehicleInfo::getVin, vin);
queryWrapper.eq(VehicleInfo::getTenantId, SystemHandler.getTenantId());
long count = this.count(queryWrapper);
if (count == 1) {
errorMsg.append("vin[").append(vin).append("]").append("已经存在\n");
}
}
}
if (!errorMsg.isEmpty()) {
throw new RuntimeException(errorMsg.toString());
}
List<VehicleInfo> vehicleInfoList = Arrays.stream(vinList).map(VehicleInfo::create).toList();
this.saveBatch(vehicleInfoList);
vehicleInfoList.forEach(vehicleInstanceService::init);
}
/**
* 同步数据库
*/
@Override
public void syncDb () {
try {
// vehicleInstanceService.isTaskStatus();
log.info("同步数据库开始");
long startTime = System.currentTimeMillis();
Collection<VehicleInstance> vehicleInstanceList = LocalContainer.getTenantOnlineVehicleInstance();
// 成功数量
AtomicInteger syncSuccessSum = new AtomicInteger();
List<VehicleInfo> vehicleInfoList = vehicleInstanceList.stream()
.filter(VehicleInstance::isOnline)
.map(VehicleInfo::instanceBuild)
.toList();
vehicleInfoList.forEach(vehicle -> {
LambdaUpdateWrapper<VehicleInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(VehicleInfo::getRemainingBattery, vehicle.getRemainingBattery());
updateWrapper.set(VehicleInfo::getTotalMileage, vehicle.getTotalMileage());
updateWrapper.eq(VehicleInfo::getVin, vehicle.getVin());
try {
this.update(updateWrapper);
syncSuccessSum.incrementAndGet();
log.debug("车辆:[{}] - 数据同步成功 - 电池容量:[{}毫安] 总公里数量:[{}KM]", vehicle.getVin(), vehicle.getRemainingBattery(), vehicle.getTotalMileage());
}catch (Exception exception){
log.error("车辆:[{}] - 数据同步失败 - 电池容量:[{}毫安] 总公里数量:[{}KM]", vehicle.getVin(), vehicle.getRemainingBattery(), vehicle.getTotalMileage());
}
});
log.info("同步数据库结束 - 耗时:[{}MS],同步量:[{}辆],成功:[{}辆],失败:[{}辆]",
System.currentTimeMillis() - startTime, vehicleInfoList.size(),syncSuccessSum.get(), vehicleInfoList.size() - syncSuccessSum.get());
}catch (Exception exception){
log.error("数据同步异常:{}", exception.getMessage(), exception);
}
}
/**
* 通过VIN删除车辆
*
* @param vin vin
*/
@Override
public void delete(String vin) {
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(vin);
// 先判断车辆是否在上报数据,上报则停止
if (vehicleInstance.isSend()){
vehicleInstance.stopSend();
}
// 判断车辆是否在线,若在线则让车辆下线
if (vehicleInstance.isOnline()){
vehicleInstance.closeClient();
}
// 进行缓存删除
LocalContainer.removeByVin(vin);
// 删除数据库
this.removeById(vin);
}
}