zhangnaisong
2024-08-01 2799314298467be9ed68d9e19891e35cb3c3edad
ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarLockServiceImpl.java
@@ -1,6 +1,9 @@
package com.ruoyi.sy.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.sy.domain.ArdSyCar;
import com.ruoyi.sy.domain.ArdSyCarLock;
@@ -8,21 +11,29 @@
import com.ruoyi.sy.mapper.ArdSyCarLockMapper;
import com.ruoyi.sy.mapper.ArdSyCarMapper;
import com.ruoyi.sy.mapper.ArdSyCarRtuMapper;
import com.ruoyi.sy.param.AddRtuParam;
import com.ruoyi.sy.param.LockTypeParam;
import com.ruoyi.sy.param.RtuTypeParam;
import com.ruoyi.sy.service.ArdSyCarLockService;
import com.ruoyi.sy.vo.CarLockVo;
import com.ruoyi.sy.vo.CarVo;
import com.ruoyi.sy.vo.RtuVo;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.mapper.SysDeptMapper;
import com.ruoyi.utils.qymqtt.newM.EmqClient;
import com.ruoyi.utils.qymqtt.newM.QosEnum;
import com.ruoyi.utils.qymqtt.oldM.MqttCustomerClient;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * @author Administrator
 */
@Slf4j(topic = "mqttCar")
@Service
public class ArdSyCarLockServiceImpl implements ArdSyCarLockService {
@@ -34,6 +45,9 @@
    private ArdSyCarRtuMapper rtuMapper;
    @Autowired
    private ArdSyCarLockMapper lockMapper;
    @Autowired
    private SysConfigMapper configMapper;
    @Override
    public List<CarVo> car() {
@@ -52,18 +66,24 @@
    }
    @Override
    public int addRtu(String carId) {
    public int addRtu(AddRtuParam addRtuParam) {
        ArdSyCarRtu ardSyCarRtu = new ArdSyCarRtu();
        ardSyCarRtu.setId(String.valueOf(UUID.randomUUID()));
        ardSyCarRtu.setCarId(carId);
        ardSyCarRtu.setTopicPublish("/p"+carId+"/");
        ardSyCarRtu.setTopicSubscribe("/p"+carId+"/set/");
        rtuMapper.insert(ardSyCarRtu);
        ardSyCarRtu.setCarId(addRtuParam.getCarId());
        ardSyCarRtu.setTopicPublish("/p"+addRtuParam.getCarId()+"/set/");
        ardSyCarRtu.setTopicSubscribe("/p"+addRtuParam.getCarId()+"/");
        ardSyCarRtu.setInstallType(addRtuParam.getInstallType());
        ardSyCarRtu.setUnloadType(addRtuParam.getUnloadType());
        int num = rtuMapper.insert(ardSyCarRtu);
        QueryWrapper<ArdSyCar> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("car_id",carId);
        queryWrapper.eq("car_id",addRtuParam.getCarId());
        ArdSyCar ardSyCar = ardSyCarMapper.selectOne(queryWrapper);
        ardSyCar.setReserved1(ardSyCarRtu.getId());
        return ardSyCarMapper.updateById(ardSyCar);
        ardSyCarMapper.updateById(ardSyCar);
        MqttCustomerClient mqttCustomerClient = new MqttCustomerClient();
        mqttCustomerClient.connect(addRtuParam.getCarId()+"mqtt");
        mqttCustomerClient.subscribe(ardSyCarRtu.getTopicSubscribe());
        return num;
    }
    @Override
@@ -76,6 +96,11 @@
    @Override
    public int delCar(String id) {
        ArdSyCarRtu ardSyCarRtu = rtuMapper.selectById(id);
        String subscribe = ardSyCarRtu.getTopicSubscribe();
        MqttCustomerClient mqttCustomerClient = new MqttCustomerClient();
        mqttCustomerClient.connect(ardSyCarRtu.getCarId()+"del");
        mqttCustomerClient.unSubscribe(subscribe);
        rtuMapper.deleteById(id);
        QueryWrapper<ArdSyCarLock> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("rtu_id",id);
@@ -105,9 +130,15 @@
    @Override
    public List<ArdSyCarLock> carLock(String rtu) {
        QueryWrapper<ArdSyCarLock> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("rtu_id",rtu);
        return lockMapper.selectList(queryWrapper);
//        List<ArdSyCarLock> locks = new ArrayList<>();
//        try {
//            QueryWrapper<ArdSyCarLock> queryWrapper = new QueryWrapper<>();
//            queryWrapper.eq("rtu_id",rtu);
//            locks = lockMapper.selectList(queryWrapper);
//        }catch (Exception e){
//
//        }
        return lockMapper.lockList(rtu);
    }
    @Override
@@ -147,6 +178,8 @@
        rtuVo.setRtu(ardSyCar.getReserved1());
        rtuVo.setTopicPublish(ardSyCarRtu.getTopicPublish());
        rtuVo.setTopicSubscribe(ardSyCarRtu.getTopicSubscribe());
        rtuVo.setInstallType(ardSyCarRtu.getInstallType());
        rtuVo.setUnloadType(ardSyCarRtu.getUnloadType());
        return rtuVo;
    }
@@ -160,6 +193,248 @@
        return ardSyCarMapper.updateById(ardSyCar);
    }
    @Override
    public List<CarVo> queryCar(List<String> list) {
//        QueryWrapper<ArdSyCar> queryWrapper = new QueryWrapper<>();
//        if(list.size()>0){
//            queryWrapper.ne("reserved_1","").notIn("car_id",list);
//        }else {
//            queryWrapper.ne("reserved_1","");
//        }
//        List<ArdSyCar> ardSyCars = ardSyCarMapper.selectList(queryWrapper);
        List<ArdSyCar> ardSyCars = new ArrayList<>();
        if(list.size()>0){
            QueryWrapper<ArdSyCar> queryWrapper = new QueryWrapper<>();
            queryWrapper.notIn("car_id",list);
            ardSyCars = ardSyCarMapper.selectList(queryWrapper);
        }else {
            ardSyCars = ardSyCarMapper.selectList(null);
        }
        return carAnalysis(ardSyCars);
    }
    @Override
    public List<CarVo> addCarBefore(String id) {
        QueryWrapper<ArdSyCar> ardSyCarQueryWrapper = new QueryWrapper<>();
        ardSyCarQueryWrapper.eq("car_id",id);
        List<ArdSyCar> carList = ardSyCarMapper.selectList(ardSyCarQueryWrapper);
        return carAnalysis(carList);
    }
    @Override
    public List<ArdSyCarLock> data(String msg) {
//        String pattern = "0.00"; // 指定保留两位小数的格式
//        DecimalFormat decimalFormat = new DecimalFormat(pattern); //
        JSONObject jsonObject = JSONObject.parseObject(msg);
        List<ArdSyCarLock> lockList = new ArrayList<>();
        ArdSyCarLock ardSyCarLock1 = new ArdSyCarLock();
        ardSyCarLock1.setRelay("A01");
//        ardSyCarLock1.setRelayInfo(String.valueOf(jsonObject.getInteger("A01")));
        ardSyCarLock1.setRelayInfo(jsonObject.getInteger("A01"));
        ardSyCarLock1.setCurrents("C01");
//        ardSyCarLock1.setCurrentInfo(decimalFormat.format(jsonObject.getDouble("C01")));
        ardSyCarLock1.setCurrentInfo(jsonObject.getDouble("C01"));
        lockList.add(ardSyCarLock1);
        ArdSyCarLock ardSyCarLock2 = new ArdSyCarLock();
        ardSyCarLock2.setRelay("A02");
        ardSyCarLock2.setRelayInfo(jsonObject.getInteger("A02"));
        ardSyCarLock2.setCurrents("C02");
        ardSyCarLock2.setCurrentInfo(jsonObject.getDouble("C02"));
        lockList.add(ardSyCarLock2);
        return lockList;
    }
    @Override
    public int updLock(ArdSyCarLock ardSyCarLock) {
        return lockMapper.updateById(ardSyCarLock);
    }
    @Override
    public ArdSyCarLock getCurrentInfo(String Rtu, String currents) {
        QueryWrapper<ArdSyCarLock> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("rtu_id",Rtu).eq("currents",currents);
        return lockMapper.selectOne(queryWrapper);
    }
    @Override
    public AjaxResult seal(RtuTypeParam rtuTypeParam) {
        QueryWrapper<ArdSyCarRtu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("car_id",rtuTypeParam.getCarId());
        ArdSyCarRtu ardSyCarRtu = rtuMapper.selectOne(queryWrapper);
        //1解封
        if(rtuTypeParam.getType()==1){
//            Map<String,Object> map = new HashMap<>();
//            map.put("A01", 110000);//导通第一路继电器
//            map.put("A02", 110000);//导通第二路继电器
//            map.put("res", String.valueOf(System.currentTimeMillis()));
//            String mapString = JSON.toJSONString(map);
            String mapString = "{\"A01\":110000,\"A02\":110000,\"res\":\""+String.valueOf(System.currentTimeMillis())+"\"}";
            log.debug("解封:"+mapString);
            EmqClient emqClient = new EmqClient(rtuTypeParam.getCarId()+"mqttPublish"+UUID.randomUUID());
            emqClient.connect();
            emqClient.publish(ardSyCarRtu.getTopicPublish(),mapString, QosEnum.QoS2,false);
            return AjaxResult.success("解封命令发送成功!");
//                return AjaxResult.success(mqttOnce.publishCar(rtuTypeParam.getCarId(),ardSyCarRtu.getTopicPublish(),String.valueOf(new com.alibaba.fastjson2.JSONObject(map)),"解封"));
        }
        //0施封
        if(rtuTypeParam.getType()==0){
            //锁开关状态
            int lockCloseNum = 0;
            //查询锁信息
            List<ArdSyCarLock> ardSyCarLocks = carLock(ardSyCarRtu.getId());
            String mapString1 = "{\"A01\":100000,\"A02\":100000,\"res\":\""+String.valueOf(System.currentTimeMillis())+"\"}";
            System.out.println("施封:"+mapString1);
            EmqClient emqClient1 = new EmqClient(rtuTypeParam.getCarId()+"mqttPublish"+UUID.randomUUID());
            emqClient1.connect();
            emqClient1.publish(ardSyCarRtu.getTopicPublish(),mapString1, QosEnum.QoS2,false);
            for (int j = 0; j < ardSyCarLocks.size(); j++) {
                ArdSyCarLock ardSyCarLock = ardSyCarLocks.get(j);
                String currents = ardSyCarLock.getCurrents();
                Double currentInfo = ardSyCarLock.getCurrentInfo();
                //电流值为4.0是关锁状态
                if(currentInfo.equals(4.00) || currentInfo.equals(4)){
                    lockCloseNum += 1;
                }else {
                    String key = "";
                    if(currents.equals("C01")){
                        key = "D03";
                    }else if(currents.equals("C02")){
                        key = "D04";
                    }
//                    Map<String,Object> map = new HashMap();
//                    map.put(key, 0.01);
//                    map.put("res", String.valueOf(System.currentTimeMillis()));
//                    String mapString = JSON.toJSONString(map);
                    String mapString = "{\""+key+"\":0.01,\"res\":\""+String.valueOf(System.currentTimeMillis())+"\"}";
                    log.debug("关锁:"+mapString);
                    EmqClient emqClient = new EmqClient(rtuTypeParam.getCarId()+"mqttPublish"+UUID.randomUUID());
                    emqClient.connect();
                    emqClient.publish(ardSyCarRtu.getTopicPublish(),mapString, QosEnum.QoS2,false);
//                        mqttOnce.publishCar("carId",ardSyCarRtu.getTopicPublish(),String.valueOf(new com.alibaba.fastjson2.JSONObject(map)),"开锁:"+currents);
//                    long startTime = System.currentTimeMillis();  // 获取循环开始时间
//                    long endTime = startTime + 30000;  // 设置循环结束时间为开始时间加上5秒钟
                    while(true){
                        ArdSyCarLock ardSyCarLock1 = getCurrentInfo(ardSyCarRtu.getId(),currents);
                        Double currentInfo1 = ardSyCarLock1.getCurrentInfo();
                        if(currentInfo1.equals(4.00) || currentInfo1.equals(4)){
                            lockCloseNum +=1;
                            break;
                        }
                    }
                }
            }
            if(lockCloseNum == 2){
//                Map<String,Object> map = new HashMap<>();
//                map.put("A01", 100000);//断开第一路继电器
//                map.put("A02", 100000);//断开第二路继电器
//                map.put("res", String.valueOf(System.currentTimeMillis()));
//                String mapString = JSON.toJSONString(map);
                return AjaxResult.success("施封命令发生成功!");
//                    return AjaxResult.success(mqttOnce.publishCar(rtuTypeParam.getCarId(),ardSyCarRtu.getTopicPublish(),String.valueOf(new com.alibaba.fastjson2.JSONObject(map)),"施封"));
            }
        }
        return AjaxResult.success();
    }
    @Override
    public AjaxResult onOff(LockTypeParam lockTypeParam) throws MqttException {
        QueryWrapper<ArdSyCarRtu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("car_id",lockTypeParam.getCarId());
        ArdSyCarRtu ardSyCarRtu = rtuMapper.selectOne(queryWrapper);
        ArdSyCarLock ardSyCarLock = lockMapper.selectById(lockTypeParam.getLockId());
        Integer relay = ardSyCarLock.getRelayInfo();
        if(relay!=null){
            if(relay.equals(1)){
                return AjaxResult.error(0,"该锁处于解封状态,远程无法操控,请先执行施封操作!");
            }
        }
        String key = "";
        String currents = ardSyCarLock.getCurrents();
        if(currents.equals("C01")){
            key = "D03";
        }else if(currents.equals("C02")){
            key = "D04";
        }
        double lockState = lockTypeParam.getNum();
        if(lockState==100){
            lockState = 99.99;
        }else if(lockState==0){
            lockState = 0.01;
        }else{
            lockState = lockState + 0.01;
        }
//        Map<String,Object> map = new HashMap();
//        map.put(key, lockState);//范围是0.01到99.99
//        map.put("res", String.valueOf(System.currentTimeMillis()));
//        String mapString = JSON.toJSONString(map);
        String mapString = "{\""+key+"\":"+lockState+",\"res\":\""+String.valueOf(System.currentTimeMillis())+"\"}";
        log.debug("开关锁:"+mapString);
        EmqClient emqClient = new EmqClient(lockTypeParam.getCarId()+"mqttPublish"+UUID.randomUUID());
        emqClient.connect();
        emqClient.publish(ardSyCarRtu.getTopicPublish(),mapString, QosEnum.QoS2,false);
//        MqttCustomerClient mqttCustomerClient = new MqttCustomerClient();
//        mqttCustomerClient.connect(lockTypeParam.getCarId()+"change"+UUID.randomUUID());
//        mqttCustomerClient.pushlish(ardSyCarRtu.getTopicPublish(),mapString);
        int min = lockTypeParam.getNum() -5;  int max = lockTypeParam.getNum() +5;
        while(true){
            ArdSyCarLock ardSyCarLockLoop = lockMapper.selectById(lockTypeParam.getLockId());
            Double currentInfo =  ardSyCarLockLoop.getCurrentInfo();
            int d = (int) ((int)(currentInfo*150/138.3 - 4)/0.16);
            if(d >= min && d <= max){
                break;
            }
//                TimeUnit.SECONDS.sleep(5);
        }
        return AjaxResult.success("开关锁成功,进度为"+lockTypeParam.getNum());
    }
    @Override
    public AjaxResult lockIng(String carId) {
        QueryWrapper<ArdSyCarRtu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("car_id",carId);
        ArdSyCarRtu ardSyCarRtu = rtuMapper.selectOne(queryWrapper);
        if(ardSyCarRtu!=null){
            List<ArdSyCarLock> locks = lockMapper.lockList(ardSyCarRtu.getId());
            if(locks.size()>0){
                for (int i = 0; i < locks.size(); i++) {
                    ArdSyCarLock ardSyCarLock = locks.get(i);
                    if(ardSyCarLock.getCurrentInfo()!=null){
                        double info = ardSyCarLock.getCurrentInfo();
                        int d = (int) ((int)(info*150/138.3 - 4)/0.16);
                        ardSyCarLock.setCurrentInfo((double) d);
                    }else {
                        ardSyCarLock.setCurrentInfo(0.0);
                    }
                }
                return AjaxResult.success(locks);
            }else {
                return AjaxResult.error("无该车的锁数据!");
            }
        }else{
            return AjaxResult.error("该车无RTU!");
        }
    }
    @Override
    public Boolean isLock(String carId) {
        QueryWrapper<ArdSyCarRtu> queryWrapperRtu = new QueryWrapper<>();
        queryWrapperRtu.eq("car_id",carId);
        ArdSyCarRtu ardSyCarRtu = rtuMapper.selectOne(queryWrapperRtu);
        if(ardSyCarRtu!=null){
            List<ArdSyCarLock> ardSyCarLocks = lockMapper.lockList(ardSyCarRtu.getId());
            if(ardSyCarLocks.size()>0){
                return true;
            }else {
                return false;
            }
        }else {
            return false;
        }
    }
    //车辆列表封装
    public List<CarVo> carAnalysis(List<ArdSyCar> ardSyCars){
        List<CarVo> list = new ArrayList<>();
        for (int i = 0; i < ardSyCars.size(); i++) {
@@ -172,6 +447,7 @@
            SysDept sysDept = sysDeptMapper.selectById(ardSyCar.getDeptId());
            carVo.setDeptName(sysDept.getDeptName());
            carVo.setRtu(ardSyCar.getReserved1());
            carVo.setCarModel(ardSyCar.getCarModel());
            list.add(carVo);
        }
        return list;