package com.sandu.ximon.admin.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.execption.BusinessException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.newnova.led.NewNovaLedService; import com.sandu.ximon.admin.param.PoleBindingParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.domain.*; import com.sandu.ximon.dao.enums.PoleBindingEnums; import com.sandu.ximon.dao.mapper.PoleBindingMapper; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * @author chenjiantian * @date 2021/12/14 11:48 */ @Service @AllArgsConstructor public class PoleBindingService extends BaseServiceImpl { private final LightReportDataService lightReportDataService; /** * 灯杆绑定设备 * * @param poleId * @param param * @return */ @Transactional(rollbackFor = Exception.class) public boolean bindPole(Long poleId, PoleBindingParam param) { Integer deviceType = param.getDeviceType(); if (deviceType == 1){ deviceType = 12; } int size = 0; switch (deviceType.toString()) { case PoleBindingEnums.LIGHT: size = SpringContextHolder.getBean(LightService.class).list(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, param.getDeviceCode())).size(); break; case PoleBindingEnums.VONNOX: size = SpringContextHolder.getBean(LedPlayerEntityService.class).list(Wrappers.lambdaQuery(LedPlayerEntity.class).eq(LedPlayerEntity::getSn, param.getDeviceCode())).size(); break; case PoleBindingEnums.CHARGING_PILE: size = SpringContextHolder.getBean(C3ChargingService.class).list(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, param.getDeviceCode())).size(); break; case PoleBindingEnums.ATMOSPHERIC: Pole byId = SpringContextHolder.getBean(PoleService.class).getById(poleId); if (byId == null) { throw new BusinessException("未找到灯杆"); } if (byId.getDeviceCode() != null || !byId.getDeviceCode().isEmpty()) { if (!param.getDeviceCode().equals(byId.getDeviceCode())) { throw new BusinessException("灯杆mac和大气mac不一致, 无法绑定"); } } else { throw new BusinessException("灯杆mac为空,无法绑定大气设备"); } int size1 = SpringContextHolder.getBean(AirEquipmentService.class).list(Wrappers.lambdaQuery(AirEquipment.class).eq(AirEquipment::getMac, param.getDeviceCode())).size(); int size2 = SpringContextHolder.getBean(AirEquipmentNongGengService.class).list(Wrappers.lambdaQuery(AirEquipmentNongGeng.class).eq(AirEquipmentNongGeng::getMac, param.getDeviceCode())).size(); //一键求助两类硬件 if (size1 > 0 || size2 > 0) { size = 1; } break; case PoleBindingEnums.WATER: size = SpringContextHolder.getBean(WaterQualityEquipmentService.class).list(Wrappers.lambdaQuery(WaterQualityEquipment.class).eq(WaterQualityEquipment::getWaterQualityEquipmentCode, param.getDeviceCode())).size(); break; case PoleBindingEnums.IPVOLUME: size = SpringContextHolder.getBean(IpVolumeService.class).list(Wrappers.lambdaQuery(BroadcastTerminalV2Entity.class).eq(BroadcastTerminalV2Entity::getId, param.getDeviceCode())).size(); break; case PoleBindingEnums.LCD_ADVERTISING: break; case PoleBindingEnums.MONITOR: size = SpringContextHolder.getBean(MonitorService.class).list(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, param.getDeviceCode())).size(); break; case PoleBindingEnums.LIGHTPOLEHEELING: size = SpringContextHolder.getBean(LightPoleHeelingEquipmentService.class).list(Wrappers.lambdaQuery(LightPoleHeelingEquipment.class).eq(LightPoleHeelingEquipment::getMac, param.getDeviceCode())).size(); break; case PoleBindingEnums.FOR_HELP: int size3 = SpringContextHolder.getBean(InterphoneHostService.class).list(Wrappers.lambdaQuery(InterphoneHost.class).eq(InterphoneHost::getHostMac, param.getDeviceCode())).size(); int size4 = SpringContextHolder.getBean(InterphoneSubService.class).list(Wrappers.lambdaQuery(InterphoneSub.class).eq(InterphoneSub::getSubMac, param.getDeviceCode())).size(); //一键求助两类硬件 if (size3 > 0 || size4 > 0) { size = 1; } break; case PoleBindingEnums.XIXUN: size = SpringContextHolder.getBean(PoleLightemitService.class).list(Wrappers.lambdaQuery(PoleLightemitEntity.class).eq(PoleLightemitEntity::getLightemitControlCode, param.getDeviceCode())).size(); break; case PoleBindingEnums.ATMOSPHERIC_NONG_GENG: size = SpringContextHolder.getBean(AirEquipmentNongGengService.class).list(Wrappers.lambdaQuery(AirEquipmentNongGeng.class).eq(AirEquipmentNongGeng::getMac, param.getDeviceCode())).size(); break; case PoleBindingEnums.NEW_NOVA: size = SpringContextHolder.getBean(NewNovaLedService.class).list(Wrappers.lambdaQuery(NewNovaLed.class).eq(NewNovaLed::getSn, param.getDeviceCode())).size(); break; default: break; } if (size == 0) { throw new BusinessException("设备码不正确,硬件不存在"); } LambdaQueryWrapper eq = Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceType, param.getDeviceType()).eq(PoleBinding::getPoleId, poleId); List list = list(eq); if (list.size() != 0) { for (PoleBinding poleBinding : list) { //充电桩的绑定是网络请求是带过来的灯杆信息,要允许直接修改 if (poleBinding.getDeviceType().equals(deviceType) && deviceType != 2) { throw new BusinessException("该灯杆已绑定过相同类型设备"); } } } PoleBinding one = getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, param.getDeviceCode()) .eq(PoleBinding::getDeviceType, param.getDeviceType())); if (one == null) { //充电桩保存绑定关系需要先判断是不是正确的灯杆 if (deviceType == 2) { C3mCharging mCharging = SpringContextHolder.getBean(C3ChargingService.class). getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, param.getDeviceCode())); Pole poleInfo = SpringContextHolder.getBean(PoleService.class).getById(poleId); if (!mCharging.getPoleDevicesCode().equals(poleInfo.getDeviceCode())) { throw new BusinessException("绑定出错!该充电桩硬件绑定的灯杆mac为:" + mCharging.getPoleDevicesCode()); } } PoleBinding poleBinding = new PoleBinding(); poleBinding.setPoleId(poleId); poleBinding.setDeviceType(deviceType); poleBinding.setDeviceName(param.getDeviceName()); poleBinding.setDeviceCode(param.getDeviceCode()); return save(poleBinding); } else { //修改单灯的绑定关系的时候要额外处理的事务 // 删除灯杆的devicescode if (param.getDeviceType() == 0) { PoleService poleService = SpringContextHolder.getBean(PoleService.class); Pole pole = poleService.getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getId, one.getPoleId())); if (pole != null) { pole.setDeviceCode(null); poleService.updateById(pole); } } //充电桩保存绑定关系需要先判断是不是正确的灯杆 if (deviceType == 2) { C3mCharging mCharging = SpringContextHolder.getBean(C3ChargingService.class). getOne(Wrappers.lambdaQuery(C3mCharging.class).eq(C3mCharging::getMcuUdid, param.getDeviceCode())); Pole poleInfo = SpringContextHolder.getBean(PoleService.class).getById(poleId); if (!mCharging.getPoleDevicesCode().equals(poleInfo.getDeviceCode())) { throw new BusinessException("绑定出错!该充电桩硬件绑定的灯杆mac为:" + mCharging.getPoleDevicesCode()); } } one.setPoleId(poleId); one.setDeviceType(param.getDeviceType()); one.setDeviceName(param.getDeviceName()); one.setDeviceCode(param.getDeviceCode()); return updateById(one); } } /** * 灯杆解绑设备,删除设备前需要解绑 * * @param deviceCode */ public boolean unBindPole(Long poleId, String deviceCode) { if (deviceCode == null) { throw new BusinessException("设备编号不能为空"); } PoleBinding one; //直接删除设备不需要灯杆ID if (poleId == null) { one = getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode)); } else { one = getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode).eq(PoleBinding::getPoleId, poleId)); } if (one != null) { return removeById(one.getId()); } else { throw new BusinessException("设备不存在绑定情况或灯杆ID不正确"); } } /** * 灯杆解绑设备,删除设备前需要解绑 * * @param deviceCode */ public boolean unBindPole(Long poleId, String deviceCode, Integer deviceType) { if (deviceCode == null) { throw new BusinessException("设备编号不能为空"); } PoleBinding one; //直接删除设备不需要灯杆ID if (poleId == null) { one = getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode).eq(PoleBinding::getDeviceType, deviceType)); } else { one = getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode) .eq(PoleBinding::getDeviceType, deviceType).eq(PoleBinding::getPoleId, poleId)); } if (one != null) { return removeById(one.getId()); } else { throw new BusinessException("设备不存在绑定情况或灯杆ID不正确"); } } /** * 设备删除,直接解绑设备相关绑定数据 * * @param deviceCode */ public boolean unBindPole(String deviceCode) { if (deviceCode == null) { throw new BusinessException("设备编号不能为空"); } if (SecurityUtils.getClientId() != null) { //查灯杆归属关系 boolean belong = isBelong(deviceCode, null); if (!belong) { throw new BusinessException("该灯杆不属于您,无法解绑!"); } } //直接删除设备不需要灯杆ID PoleBinding one = getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode)); if (one != null) { return removeById(one.getId()); } else { return false; } } public PoleBinding getPoleIdByMac(String deviceCode) { return getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode).eq(PoleBinding::getDeviceType, 0)); } /** * 判断设备归属 * * @param deviceCode 设备编号 * @param type 设备类型 * @return 属于该用户返回true,不是返回false */ public boolean isBelong(String deviceCode, String type) { Long userId = SecurityUtils.getClientId(); Pole binding = baseMapper.getPoleByBinding(type, deviceCode, userId); if (binding != null) { return true; } else { return false; } } }