package com.xy.alipay; import cn.hutool.json.JSONObject; import com.xy.constants.SpiResponseConst; import com.xy.consumer.disconnect.DisconnectedMqttConfiguration; import com.xy.consumer.disconnect.DisconnectedProducer; import com.xy.dto.DeviceEventMsgDto; import com.xy.dto.spi.DeviceAlarmNotifyDTO; import com.xy.dto.spi.DeviceStatusChangeNotifyDTO; import com.xy.entity.DeviceCharging; import com.xy.entity.DeviceInfo; import com.xy.entity.SysDictRedis; import com.xy.service.DeviceChargingServiceImpl; import com.xy.service.DeviceEventMsgServiceImpl; import com.xy.service.DeviceInfoServiceImpl; import com.xy.utils.SysDictUtils; import com.xy.utils.enums.DeviceErrorRecordTypesEnum; import com.xy.utils.enums.DictsEnum; import com.xy.utils.enums.DictsSonEnum; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; /** * spi 设备相关 * * @author 谭斌 * @date 2023/04/16 */ @Service @AllArgsConstructor @Slf4j @Api(tags = "支付宝设备相关SPI") public class SpiDeviceServiceImpl implements SpiDeviceService { private DeviceInfoServiceImpl deviceInfoService; private DeviceEventMsgServiceImpl deviceEventMsgService; private DisconnectedProducer disconnectedProducer; private DeviceChargingServiceImpl deviceChargingService; @Override @ApiOperation("设备告警通知") public String deviceAlarmNotify(DeviceAlarmNotifyDTO deviceAlarmNotifyDTO) { //查询设备信息 DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(deviceAlarmNotifyDTO.getTerminalId())); String faultCode = deviceAlarmNotifyDTO.getFaultCode(); DeviceErrorRecordTypesEnum deviceErrorRecordTypesEnum = faultCode.equals("DeviceOffline") ? DeviceErrorRecordTypesEnum.NET : faultCode.equals("DoorOpenedOnNoTrade") ? DeviceErrorRecordTypesEnum.DOOR_LOCK : null; if (deviceErrorRecordTypesEnum == null) { return SpiResponseConst.FAIL; } //添加设备异常记录 DeviceEventMsgDto.Save save = new DeviceEventMsgDto.Save() .setDeviceId(deviceInfo.getDeviceId()); save.setCode(deviceErrorRecordTypesEnum.getCode()); save.setMsg(deviceAlarmNotifyDTO.getFaultMsg()); deviceEventMsgService.save(save); //修改设备为离线 if (deviceErrorRecordTypesEnum.getCode() == DeviceErrorRecordTypesEnum.NET.getCode()) { JSONObject jsonObject = new JSONObject().set("clientid", deviceInfo.getDeviceId()); disconnectedProducer.sendToMqtt(jsonObject.toString(), DisconnectedMqttConfiguration.TOPIC, 1); } return SpiResponseConst.SPI_SUCCESS; } @Override @ApiOperation("设备状态变更通知") public String deviceStatusChangeNotify(DeviceStatusChangeNotifyDTO deviceStatusChangeNotifyDTO) { //查询设备信息 DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(deviceStatusChangeNotifyDTO.getTerminalId())); Integer status = deviceStatusChangeNotifyDTO.getStatus(); if (deviceInfo.getFreezeStatus().equals(status)) { return SpiResponseConst.FAIL; } //修改冻结状态、运营状态 DeviceInfo updateDeviceInfo = new DeviceInfo() .setDeviceId(deviceInfo.getDeviceId()) .setBusyState(status) .setFreezeStatus(status); //修改激活状态 if (deviceStatusChangeNotifyDTO.getActiveStatus() != null && deviceStatusChangeNotifyDTO.getActiveStatus() == 1) { if (deviceInfo == null || deviceInfo.getActiveState() != 1) { LocalDateTime now = LocalDateTime.now(); updateDeviceInfo.setActiveState(deviceStatusChangeNotifyDTO.getActiveStatus()); updateDeviceInfo.setActiveTime(now); //首次激活可试用x天 DeviceCharging deviceCharging = deviceChargingService.getById(deviceInfo.getDeviceId()); if (deviceCharging == null) { SysDictRedis sysDictRedis = SysDictUtils.get(DictsEnum.DEVICE_CHARGING.getKey(), DictsSonEnum.DEVICE_CHARGING_X.getKey()); deviceChargingService.save(new DeviceCharging() .setDeviceId(deviceInfo.getDeviceId()) .setChargingX(Integer.valueOf(sysDictRedis.getValue())) .setTimeout(now) .setCreateTime(now) ); } } } deviceInfoService.updateById(updateDeviceInfo); return SpiResponseConst.SPI_SUCCESS; } }