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

import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.TipEnum;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.ResponseResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysUser;
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.security.filter.JwtAuthenticationTokenFilter;
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.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.util.*;
import java.util.stream.Collectors;

/**
 * @author liujun
 * @date 2024年07月05日 15:29
 */
@RestController
@Slf4j
@RequestMapping("/dss")
@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", "resource_base_url"};


    @ApiOperation("设备获取访问令牌")
    @PostMapping("/Driver/Auth")
    public ResponseResult<AuthVo> auth(@Valid @RequestBody EquipmentAuthDTO dto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseResult.error(bindingResult.getFieldError().getDefaultMessage());
        }

        Equipment equipment = equipmentService.getOneByDeviceId(dto.getDevice());
        if (Objects.isNull(equipment)) {
            log.info("[{}] equipment is null", dto.getDevice());
            return ResponseResult.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("equipment.login.success")));
        //LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        LoginUser loginUser = new LoginUser();
        loginUser.setUserId(Convert.toLong(equipment.getId()));
        loginUser.setDeptId(Convert.toLong(equipment.getDeviceId()));
        loginUser.setUser(new SysUser());


        String token = tokenService.createToken(loginUser, Constants.EQUIPMENT_KEY);

        AuthVo vo = new AuthVo(token);

        return ResponseResult.success(vo);
    }

    @PostMapping("/Driver/Heartbeat")
    @ApiOperation("设备报警信息(心跳包)")
    public ResponseResult heartbeat(@Valid @RequestBody HeartbeatDTO heartbeatDTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseResult.error(bindingResult.getFieldError().getDefaultMessage());
        }

        String msg = JwtAuthenticationTokenFilter.validateDevice(heartbeatDTO.getDevice());
        if(StringUtils.isNotEmpty(msg)){
            log.info(msg);
            return ResponseResult.error(TipEnum.TIP_401.getCode(),TipEnum.TIP_401.getMsg());
        }

        List<LingangEquipmentHeartbeat> heartbeats = convertHeartbeatDTO(heartbeatDTO);
        if (CollectionUtils.isNotEmpty(heartbeats)) {
            lingangEquipmentHeartbeatService.saveBatch(heartbeats);
        }
        return ResponseResult.success();
    }

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

        String msg = JwtAuthenticationTokenFilter.validateDevice(device);
        if(StringUtils.isNotEmpty(msg)){
            log.info(msg);
            return ResponseResult.error(TipEnum.TIP_401.getCode(),TipEnum.TIP_401.getMsg());
        }


        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);
        Equipment equipment = equipmentService.getOneByDeviceId(device);

        EquipmentConfigVo configVo = combitionEquipmentConfigVo(list, equipment);
        return ResponseResult.success(configVo);
    }

    @GetMapping(value = "/device/getConfig/v1.1")
    @ApiOperation("设备获取远程参数配置")
    @Parameter(name = "device", description = "设备号", required = true)
    public ResponseResult<EquipmentConfigVo> getConfigV1_1(@RequestParam(value = "device") String device) {

        String msg = JwtAuthenticationTokenFilter.validateDevice(device);
        if(StringUtils.isNotEmpty(msg)){
            log.info(msg);
            return ResponseResult.error(TipEnum.TIP_401.getCode(),TipEnum.TIP_401.getMsg());
        }

        return getConfig(device);
    }


    @PostMapping("/device/selfcheck")
    @ApiOperation("设备获取远程参数配置")
    public ResponseResult selfCheck(@Valid @RequestBody EquipmentSelfcheckDto equipmentSelfcheckDto, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseResult.error(bindingResult.getFieldError().getDefaultMessage());
        }

        String msg = JwtAuthenticationTokenFilter.validateDevice(equipmentSelfcheckDto.getDevice());
        if(StringUtils.isNotEmpty(msg)){
            log.info(msg);
            return ResponseResult.error(TipEnum.TIP_401.getCode(),TipEnum.TIP_401.getMsg());
        }

        LingangEquimentSelfCheck selfCheck = convertLingangEquimentSelfCheck(equipmentSelfcheckDto);
        lingangEquimentSelfCheckServicelingangEquimentSelfCheckService.insert(selfCheck);
        return ResponseResult.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, Equipment equipment) {
        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") && Objects.nonNull(sysDictData.getDictValue())) {
                configVo.setDrinking(Convert.toBigDecimal(sysDictData.getDictValue()));
            } else if (Objects.equals(sysDictData.getDictType(), "drunkenness") && Objects.nonNull(sysDictData.getDictValue())) {
                configVo.setDrunkenness(Convert.toBigDecimal(sysDictData.getDictValue()));
            } else if (Objects.equals(sysDictData.getDictType(), "videoParam") && Objects.nonNull(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(Objects.nonNull(sysDictData.getDictValue()) ? sysDictData.getDictValue().toString() : null);
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "saveday")) {
                    equimentVideoParamVo.setSaveday(Convert.toInt(sysDictData.getDictValue()));
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "videoTimeSlot")) {
                    equimentVideoParamVo.setVideoTimeSlot(Objects.nonNull(sysDictData.getDictValue()) ? sysDictData.getDictValue().toString() : null);
                }
            } else if (Objects.equals(sysDictData.getDictType(), "addressParam") && Objects.nonNull(sysDictData.getDictValue())) {
                if (StringUtils.equals(sysDictData.getDiscKey(), "upgradeAddress")) {
                    equimentAddressParamVo.setUpgradeAddress(Objects.nonNull(sysDictData.getDictValue()) ? sysDictData.getDictValue().toString() : null);
                } else if (StringUtils.equals(sysDictData.getDiscKey(), "integer")) {
                    equimentAddressParamVo.setInteger(Convert.toInt(sysDictData.getDictValue()));
                }
            } else if (Objects.equals(sysDictData.getDictType(), "resource_base_url") && Objects.nonNull(sysDictData.getDictValue())) {
                configVo.setResourceBashURL(sysDictData.getDictValueStr());
            }
        }

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

        int moodCheck = Objects.isNull(equipment) ? null : StringUtils.endsWith(equipment.getPromise(), ",4") || StringUtils.startsWith(equipment.getPromise(), "4,")
                || StringUtils.indexOf(equipment.getPromise(), ",4,") > -1 ? 1 : 0;
        configVo.setMoodCheck(moodCheck);
        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;
    }


}