DssEquipmentController.java 10.9 KB
package com.ruoyi.controller.dss;

import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.domain.dss.equipment.dto.EquipmentAuthDTO;
import com.ruoyi.domain.dss.equipment.dto.EquipmentSelfcheckCamerasDto;
import com.ruoyi.domain.dss.equipment.dto.EquipmentSelfcheckDto;
import com.ruoyi.domain.dss.equipment.dto.HeartbeatDTO;
import com.ruoyi.domain.dss.equipment.vo.AuthVo;
import com.ruoyi.domain.dss.equipment.vo.EquimentAddressParamVo;
import com.ruoyi.domain.dss.equipment.vo.EquimentVideoParamVo;
import com.ruoyi.domain.dss.equipment.vo.EquipmentConfigVo;
import com.ruoyi.domain.equipment.heartbeat.LingangEquipmentHeartbeat;
import com.ruoyi.domain.equipment.self.check.LingangEquimentSelfCheck;
import com.ruoyi.equipment.domain.Equipment;
import com.ruoyi.equipment.service.IEquipmentService;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.service.equipment.heartbeat.LingangEquipmentHeartbeatService;
import com.ruoyi.service.equipment.self.check.LingangEquimentSelfCheckService;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author liujun
 * @date 2024年07月05日 15:29
 */
@RestController
@Slf4j
@RequestMapping("/dss/Driver")
@Api(tags = "【蓝斯一期】设备信息")
public class DssEquipmentController extends BaseController {
    @Autowired
    private IEquipmentService equipmentService;
    @Resource
    private AuthenticationManager authenticationManager;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private LingangEquipmentHeartbeatService lingangEquipmentHeartbeatService;
    @Autowired
    private ISysDictTypeService sysDictTypeService;
    @Autowired
    private ISysDictDataService sysDictDataService;
    @Autowired
    private LingangEquimentSelfCheckService lingangEquimentSelfCheckServicelingangEquimentSelfCheckService;


    private static final String[] GET_CONFIG_DICT_KEY = {"drinking", "drunkenness", "videoParam", "addressParam"};


    @ApiOperation("设备获取访问令牌")
    @GetMapping("/Auth")
    public AjaxResult auth(@Valid EquipmentAuthDTO dto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return AjaxResult.error(bindingResult.getFieldError().getDefaultMessage());
        }

        Equipment equipment = equipmentService.getOneByDeviceId(dto.getDevice());
        if (Objects.isNull(equipment)) {
            log.info("[{}] equipment is null", dto.getDevice());
            return AjaxResult.error("设备号错误,请检查设备号");
        }
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(equipment.getDeviceId(), equipment.getId());
        AuthenticationContextHolder.setContext(authenticationToken);
        Authentication authentication = authenticationManager.authenticate(authenticationToken);
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(dto.getDevice(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        String token = tokenService.createToken(loginUser, Constants.EQUIPMENT_KEY);

        AuthVo vo = new AuthVo(token);

        return AjaxResult.success(vo);
    }

    @PostMapping("/Heartbeat")
    @ApiOperation("设备报警信息(心跳包)")
    public AjaxResult heartbeat(@Valid HeartbeatDTO heartbeatDTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return AjaxResult.error(bindingResult.getFieldError().getDefaultMessage());
        }
        List<LingangEquipmentHeartbeat> heartbeats = convertHeartbeatDTO(heartbeatDTO);
        if (CollectionUtils.isNotEmpty(heartbeats)) {
            lingangEquipmentHeartbeatService.saveBatch(heartbeats);
        }
        return AjaxResult.success();
    }

    @GetMapping(value = "/getConfig")
    @ApiOperation("设备获取远程参数配置")
    @Parameter(name = "device", description = "设备号", required = true)
    public AjaxResult getConfig(@RequestParam(value = "device") String device) {
        if (StringUtils.isEmpty(device)) {
            return AjaxResult.error("设备号不能为空");
        }

        Set<String> keys = Arrays.stream(GET_CONFIG_DICT_KEY).collect(Collectors.toSet());

        SysDictData sysDictData = new SysDictData();
        sysDictData.setStatus(Constants.ENABLE_STR);

        List<SysDictData> list = sysDictDataService.queryDictDateList(sysDictData, keys);
        EquipmentConfigVo configVo = combitionEquipmentConfigVo(list);
        return AjaxResult.success(configVo);
    }


    @PostMapping("/selfcheck")
    @ApiOperation("设备获取远程参数配置")
    public AjaxResult selfCheck(@Valid EquipmentSelfcheckDto equipmentSelfcheckDto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return AjaxResult.error(bindingResult.getFieldError().getDefaultMessage());
        }
        LingangEquimentSelfCheck selfCheck = convertLingangEquimentSelfCheck(equipmentSelfcheckDto);
        lingangEquimentSelfCheckServicelingangEquimentSelfCheckService.insert(selfCheck);
        return AjaxResult.success();
    }

    private List<LingangEquipmentHeartbeat> convertHeartbeatDTO(HeartbeatDTO heartbeatDTO) {
        if (Objects.isNull(heartbeatDTO)) {
            return Collections.emptyList();
        }
        int length = ArrayUtils.getLength(heartbeatDTO.getAlarm());

        List<LingangEquipmentHeartbeat> heartbeats = new ArrayList<>(length);
        if (length == 0) {
            heartbeats.add(convertHeartbeatDTO(heartbeatDTO, null));
        } else {
            for (int i = 0; i < length; i++) {
                heartbeats.add(convertHeartbeatDTO(heartbeatDTO, heartbeatDTO.getAlarm()[i]));
            }
        }
        return heartbeats;
    }

    private LingangEquipmentHeartbeat convertHeartbeatDTO(HeartbeatDTO heartbeatDTO, Integer alarm) {
        LingangEquipmentHeartbeat heartbeat = new LingangEquipmentHeartbeat();
        heartbeat.setAlarm(alarm);
        heartbeat.setTime(heartbeatDTO.getTime());
        heartbeat.setDevice(heartbeatDTO.getDevice());
        heartbeat.setCreateTime(new Date());
        if (CollectionUtils.isNotEmpty(heartbeatDTO.getExKeys())) {
            heartbeat.setExkeys(JSON.toJSONString(heartbeatDTO.getExKeys()));
        }
        return heartbeat;
    }

    private EquipmentConfigVo combitionEquipmentConfigVo(List<SysDictData> sysDictDatas) {
        if (CollectionUtils.isEmpty(sysDictDatas)) {
            return null;
        }
        EquipmentConfigVo configVo = new EquipmentConfigVo();
        EquimentVideoParamVo equimentVideoParamVo = new EquimentVideoParamVo();
        EquimentAddressParamVo equimentAddressParamVo = new EquimentAddressParamVo();

        for (SysDictData sysDictData : sysDictDatas) {
            if (Objects.equals(sysDictData.getDictType(), "drinking") && StringUtils.isNotEmpty(sysDictData.getDictValue())) {
                configVo.setDrinking(Convert.toBigDecimal(sysDictData.getDictValue()));
            } else if (Objects.equals(sysDictData.getDictType(), "drunkenness") && StringUtils.isNotEmpty(sysDictData.getDictValue())) {
                configVo.setDrunkenness(Convert.toBigDecimal(sysDictData.getDictValue()));
            } else if (Objects.equals(sysDictData.getDictType(), "videoParam") && StringUtils.isNotEmpty(sysDictData.getDictValue())) {
                if (StringUtils.equals(sysDictData.getDiscKey(), "upflag")) {
                    equimentVideoParamVo.setUpflag(Convert.toInt(sysDictData.getDictValue()));
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "timespan")) {
                    equimentVideoParamVo.setTimespan(Convert.toInt(sysDictData.getDictValue()));
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "url")) {
                    equimentVideoParamVo.setUrl(sysDictData.getDictValue());
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "saveday")) {
                    equimentVideoParamVo.setSaveday(Convert.toInt(sysDictData.getDictValue()));
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "videoTimeSlot")) {
                    equimentVideoParamVo.setVideoTimeSlot(sysDictData.getDictValue());
                }
            } else if (Objects.equals(sysDictData.getDictType(), "addressParam") && StringUtils.isNotEmpty(sysDictData.getDictValue())) {
                if (StringUtils.equals(sysDictData.getDiscKey(), "upgradeAddress")) {
                    equimentAddressParamVo.setUpgradeAddress(sysDictData.getDictValue());
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "integer")) {
                    equimentAddressParamVo.setInteger(Convert.toInt(sysDictData.getDictValue()));
                }
            }
        }

        configVo.setAddressParam(equimentAddressParamVo);
        configVo.setVideoParam(equimentVideoParamVo);
        return configVo;
    }

    private LingangEquimentSelfCheck convertLingangEquimentSelfCheck(EquipmentSelfcheckDto dto) {
        LingangEquimentSelfCheck selfCheck = new LingangEquimentSelfCheck();
        BeanUtils.copyProperties(dto, selfCheck);
        if (CollectionUtils.isNotEmpty(dto.getCameras())) {
            selfCheck.setCameras(JSON.toJSONString(dto.getCameras()));
           Optional<EquipmentSelfcheckCamerasDto> optional =  dto.getCameras().stream().filter(c->Objects.equals(c.getStatus(),1)).findFirst();
           selfCheck.setCamerasSaveExceptionFlag(optional.isPresent());
        }

        return selfCheck;
    }


}