package com.sandu.ximon.admin.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse; import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; import com.sandu.common.domain.CommonPage; import com.sandu.common.execption.BusinessException; import com.sandu.common.object.BaseConditionVO; import com.sandu.common.redis.RedisService; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.dto.DeviceStatus; import com.sandu.ximon.admin.manager.iot.frame.A1Frame; import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder; import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3HeartbeatReportInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.request.A1TernaryCodeReqInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightResetReqInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.request.EmptyRequestInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1DeviceMacRespInnerFrame; import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1TernaryCodeRespInnerFrame; import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; import com.sandu.ximon.admin.manager.iot.rrpc.enums.*; import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService; import com.sandu.ximon.admin.param.PoleBindingParam; import com.sandu.ximon.admin.param.PoleParam; import com.sandu.ximon.admin.param.PoleStatesParam; import com.sandu.ximon.admin.param.PushAirDataToNovaParam; import com.sandu.ximon.admin.redis.DeviceRedisKey; import com.sandu.ximon.admin.redis.LightKey; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.admin.utils.*; import com.sandu.ximon.admin.utils.response.VnnoxResult; import com.sandu.ximon.admin.vo.DeviceOnLineCountVO; import com.sandu.ximon.admin.vo.OnLineCountVO; import com.sandu.ximon.admin.vo.PoleBindVO; import com.sandu.ximon.admin.vo.RedisDeviceStatus; import com.sandu.ximon.dao.bo.*; import com.sandu.ximon.dao.domain.*; import com.sandu.ximon.dao.enums.OrderByEnums; import com.sandu.ximon.dao.mapper.PoleMapper; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.RandomStringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.sandu.ximon.admin.localMQTT.callback.StatusMqttCallBack.localMqttConnectStatusMap; /** * 灯杆相关 * * @author chenjiantian */ @Service @Slf4j @AllArgsConstructor public class PoleService extends BaseServiceImpl { private final RedisService redisService; private final PoleBindingService poleBindingService; private final PoleGroupRelationService groupRelationService; private final ClientService clientService; private final PoleMapper poleMapper; private final RedisUtils redisUtils; private final CountDownLatchUtil countDownLatchUtil; public boolean addPole(PoleParam param) { Pole pole = new Pole(); BeanUtils.copyProperties(param, pole); pole.setPoleCode(generatePoleCode()); pole.setDeviceType(-1); pole.setCentre(1); boolean save = save(pole); /** * 新增虚拟灯杆日志记录开始 */ String content = "{灯杆ID:" + pole.getId() + ", 灯杆名:" + param.getPoleName() + "}"; StoreOperationRecordsUtils.storeOperationData(null, null, "新增虚拟灯杆", content); /** * 新增虚拟灯杆日志记录结束 */ return save; } public boolean updatePole(Long poleId, PoleParam param) { Pole pole = getById(poleId); if (pole == null) { throw new BusinessException("未找到该灯杆"); } Long clientId = SecurityUtils.getClientId(); //非超管 if (clientId != null) { if (!Objects.equals(SecurityUtils.getUserId(), pole.getUserId()) && !Objects.equals(SecurityUtils.getUserId(), pole.getClientId())) { throw new BusinessException("该灯杆不属于您"); } } Pole update = new Pole(); BeanUtils.copyProperties(param, update); update.setId(poleId); if (param.getIsCenter() != null) { update.setCentre(param.getIsCenter()); } /** * 修改灯杆日志记录开始 */ String content = "编辑灯杆:" + poleId; StoreOperationRecordsUtils.storeOperationData(null, null, "编辑灯杆", content); /** * 修改灯杆日志记录结束 */ return updateById(update); } /** * 删除灯杆 */ public boolean deletePole(List poleIds) { List poles = listByIds(poleIds); if (poles.isEmpty()) { throw new BusinessException("未找到该灯杆"); } // 删除灯杆绑定关系 poleBindingService.remove(Wrappers.lambdaQuery().in(PoleBinding::getPoleId, poleIds)); SpringContextHolder.getBean(LightTaskPoleRelationService.class) .remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).in(LightTaskPoleRelation::getPoleId, poleIds)); /** * 删除灯杆日志记录开始 */ String content = "{灯杆id:" + poles + " }"; StoreOperationRecordsUtils.storeOperationData(null, null, "删除灯杆", content); /** * 删除灯杆日志记录结束 */ return removeByIds(poleIds); } /** * 生成灯杆编号 */ public Long generatePoleCode() { StringBuilder sb = new StringBuilder(); String date = new SimpleDateFormat("yyMMdd").format(new Date()); sb.append(date); String key = LightKey.POLE_SN.key(date); Long increment = redisService.incr(key, 1); String incrementStr = increment.toString(); if (incrementStr.length() <= 4) { sb.append(String.format("%04d", increment)); } else { sb.append(incrementStr); } return Long.parseLong(sb.toString()); } /** * 统计在线灯杆数量 * * @return */ public Map poleCount1() { Map result = new HashMap<>(); LambdaQueryWrapper wrapper; if (SecurityUtils.getClientId() == null) { wrapper = Wrappers.lambdaQuery(Pole.class); } else { wrapper = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, SecurityUtils.getUserId()).or(w -> { w.eq(Pole::getUserId, SecurityUtils.getUserId()); }); } //灯杆 List list = list(wrapper); result.put("poleTotalCount", list.size()); //诺瓦 List ledPlayerEntities = SpringContextHolder.getBean(LedPlayerEntityService.class).ledPlayerEntityListOnHome(); result.put("novaTotalCount", ledPlayerEntities.size()); //ip音柱 List broadcastTerminalList = SpringContextHolder.getBean(IpVolumeService.class).getBroadcastTerminalListOnHome(); result.put("broadcastTotalCount", broadcastTerminalList.size()); //摄像头 List monitorBos = SpringContextHolder.getBean(MonitorService.class).listMonitorOnHome(); result.put("monitorTotalCount", monitorBos.size()); //单灯 List lights = SpringContextHolder.getBean(LightService.class).listLightOnHome(); result.put("LightTotalCount", lights.size()); //充电桩 List c3mChargings = SpringContextHolder.getBean(C3ChargingService.class).getC3ChargingList(); result.put("C3ChargingTotalCount", c3mChargings.size()); //大气 List airEquipments = SpringContextHolder.getBean(AirEquipmentService.class).listAirEquipmentOnHome(); result.put("AirEquipmentTotalCount", airEquipments.size()); //大气(农耕) List airEquipmentNongGengBos = SpringContextHolder.getBean(AirEquipmentNongGengService.class).listAirEquipmentOnHome(); result.put("AirEquipmentNongGengTotalCount", airEquipmentNongGengBos.size()); //水质 List waterQualityEquipments = SpringContextHolder.getBean(WaterQualityEquipmentService.class).listWaterQualityEquipmentByKeyword(null, null); result.put("WaterQualityEquipmentTotalCount", waterQualityEquipments.size()); //灯杆倾斜 List lightPoleHeelingEquipmentBos = SpringContextHolder.getBean(LightPoleHeelingEquipmentService.class).LightPoleHeelingEquipmentListOnHome(); result.put("LightPoleHeelingTotalCount", lightPoleHeelingEquipmentBos.size()); //熙讯 List poleLightemitEntities = SpringContextHolder.getBean(PoleLightemitService.class).listLedOnHome(); result.put("XiXunTotalCount", poleLightemitEntities.size()); return result; } /** * 统计在线灯杆数量 * * @return */ public OnLineCountVO poleCount() { System.out.println("请求时间: " + LocalDateTime.now()); OnLineCountVO onLineCountVO = new OnLineCountVO(); CountDownLatch countDownLatch = new CountDownLatch(9);//todo //获取一个7位随机数 String str = RandomStringUtils.randomAlphanumeric(7); countDownLatchUtil.push(str, countDownLatch); //诺瓦 List ledPlayerEntities = SpringContextHolder.getBean(LedPlayerEntityService.class).ledPlayerEntityListOnHome(); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); //ip音柱 DeviceOnLineCountVO ledNova = new DeviceOnLineCountVO(); ledPlayerEntities.forEach( Volume -> { String s = redisUtils.get(DeviceRedisKey.NOVA + Volume.getId()); if (s != null) { RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class); if (redisDeviceStatus.getStatus() == 0) { //在线 onLine.getAndIncrement(); } else { //离线 offLine.getAndIncrement(); } } else { offLine.getAndIncrement(); } } ); ledNova.setTotalCount(ledPlayerEntities.size()); ledNova.setOnlineCount(onLine.get()); ledNova.setOfflineCount(offLine.get()); onLineCountVO.setLedNova(ledNova); System.out.println("诺瓦执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //音柱 List broadcastTerminalList = SpringContextHolder.getBean(IpVolumeService.class).getBroadcastTerminalListOnHome(); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); //ip音柱 DeviceOnLineCountVO ipVolume = new DeviceOnLineCountVO(); broadcastTerminalList.forEach( Volume -> { String s = redisUtils.get(DeviceRedisKey.IP_BROADCAST + Volume.getId()); if (s != null) { RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class); if (redisDeviceStatus.getStatus() == 0) { //在线 onLine.getAndIncrement(); } else { //离线 offLine.getAndIncrement(); } } else { offLine.getAndIncrement(); } } ); ipVolume.setTotalCount(broadcastTerminalList.size()); ipVolume.setOnlineCount(onLine.get()); ipVolume.setOfflineCount(offLine.get()); onLineCountVO.setBroadcast(ipVolume); System.out.println("音柱执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //摄像头 List monitorBos = SpringContextHolder.getBean(MonitorService.class).listMonitorOnHome(); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); DeviceOnLineCountVO Monitor = new DeviceOnLineCountVO(); monitorBos.forEach( device -> { String s = redisUtils.get(DeviceRedisKey.MONITOR + device.getDeviceSerial()); if (s != null) { RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class); if (redisDeviceStatus.getStatus() == 0) { //在线 onLine.getAndIncrement(); } else { //离线 offLine.getAndIncrement(); } } else { offLine.getAndIncrement(); } } ); Monitor.setTotalCount(monitorBos.size()); Monitor.setOnlineCount(onLine.get()); Monitor.setOfflineCount(offLine.get()); onLineCountVO.setMonitor(Monitor); System.out.println("摄像头执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //单灯 List lights = SpringContextHolder.getBean(LightService.class).listLightOnHome(); BaseConditionVO baseConditionVO = new BaseConditionVO(); baseConditionVO.setPageNo(1); baseConditionVO.setPageSize(999); System.out.println("单灯故障统计时间: " + LocalDateTime.now()); CommonPage commonPage = SpringContextHolder.getBean(LightReportErrorService.class).queryErrorCode(baseConditionVO); System.out.println("单灯故障统计时间: " + LocalDateTime.now()); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); AtomicInteger error = new AtomicInteger(commonPage.getList().size()); DeviceOnLineCountVO light = new DeviceOnLineCountVO(); lights.forEach( device -> { String s = redisUtils.get(DeviceRedisKey.LIGHT_DEVICE + device.getDeviceCode()); if (s != null) { RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class); if (redisDeviceStatus.getStatus() == 0) { //在线 onLine.getAndIncrement(); } else { //离线 offLine.getAndIncrement(); } } else { offLine.getAndIncrement(); } } ); light.setTotalCount(lights.size()); light.setOnlineCount(onLine.get()); light.setOfflineCount(offLine.get()); light.setErrorCount(error.get()); onLineCountVO.setLight(light); System.out.println("单灯执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //充电桩 List c3mChargings = SpringContextHolder.getBean(C3ChargingService.class).getC3ChargingList(); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); AtomicInteger error = new AtomicInteger(0); DeviceOnLineCountVO c3m = new DeviceOnLineCountVO(); c3mChargings.forEach( device -> { String s = redisUtils.get(C3mRedisConstant.C3_STATUS.getCode() + device.getC3Mac()); RedisDeviceStatus redisDeviceStatus = new RedisDeviceStatus(); redisDeviceStatus.setDeviceId(device.getC3Id().toString()); if (s != null) { A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage = JSON.parseObject(s, A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage.class); // 充电桩口状态位 1.空闲 2.充电中 3.充电中断,等待服务器确认 4.充电结束,等待服务器确认 5.有故障 6.与充电桩对接中 if ("5".equals(heartBeatDataPackage.getStatusBit())) { //故障 onLine.getAndIncrement(); error.getAndIncrement(); } else { //在线 onLine.getAndIncrement(); } } else { //离线 offLine.getAndIncrement(); } } ); c3m.setTotalCount(c3mChargings.size()); c3m.setOnlineCount(onLine.get()); c3m.setOfflineCount(offLine.get()); c3m.setErrorCount(error.get()); onLineCountVO.setC3m(c3m); System.out.println("充电桩执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //大气 List airEquipments = SpringContextHolder.getBean(AirEquipmentService.class).listAirEquipmentOnHome(); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); AtomicInteger error = new AtomicInteger(0); DeviceOnLineCountVO air = new DeviceOnLineCountVO(); airEquipments.forEach( device -> { String s = redisUtils.get(DeviceRedisKey.AIR + device.getMac()); if (s != null) { RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class); if (redisDeviceStatus.getStatus() == 0) { //在线 onLine.getAndIncrement(); } else if (redisDeviceStatus.getStatus() == 1) { //离线 offLine.getAndIncrement(); } else { error.getAndIncrement(); } } else { error.getAndIncrement(); } } ); air.setTotalCount(airEquipments.size()); air.setOnlineCount(onLine.get()); air.setOfflineCount(offLine.get()); air.setErrorCount(error.get()); onLineCountVO.setAirEquipment(air); System.out.println("大气执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //大气(农耕) // List airEquipmentNongGengBos = SpringContextHolder.getBean(AirEquipmentNongGengService.class).listAirEquipmentOnHome(); // result.put("AirEquipmentNongGengTotalCount", airEquipmentNongGengBos.size()); //水质 List waterQualityEquipments = SpringContextHolder.getBean(WaterQualityEquipmentService.class).listWaterQualityEquipmentByKeyword(null, null); new Thread(new Runnable() { @Override public void run() { DeviceOnLineCountVO water = new DeviceOnLineCountVO(); water.setTotalCount(waterQualityEquipments.size()); water.setOnlineCount(waterQualityEquipments.size()); water.setOfflineCount(0); water.setErrorCount(0); onLineCountVO.setWaterEquipment(water); System.out.println("水质执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //灯杆倾斜 List lightPoleHeelingEquipmentBos = SpringContextHolder.getBean(LightPoleHeelingEquipmentService.class).LightPoleHeelingEquipmentListOnHome(); new Thread(new Runnable() { @Override public void run() { DeviceOnLineCountVO PoleHeeling = new DeviceOnLineCountVO(); PoleHeeling.setTotalCount(lightPoleHeelingEquipmentBos.size()); PoleHeeling.setOnlineCount(lightPoleHeelingEquipmentBos.size()); PoleHeeling.setOfflineCount(0); PoleHeeling.setErrorCount(0); onLineCountVO.setLightPoleHeeling(PoleHeeling); System.out.println("灯杆倾斜执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); //熙讯 List xiXuns = SpringContextHolder.getBean(PoleLightemitService.class).listLedOnHome(); new Thread(new Runnable() { @Override public void run() { AtomicInteger onLine = new AtomicInteger(0); AtomicInteger offLine = new AtomicInteger(0); DeviceOnLineCountVO xixunLed = new DeviceOnLineCountVO(); xiXuns.forEach( device -> { String s = redisUtils.get(DeviceRedisKey.XIXUN + device.getLightemitControlCode()); if (s != null) { RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class); if (redisDeviceStatus.getStatus() == 0) { //在线 onLine.getAndIncrement(); } else { //离线 offLine.getAndIncrement(); } } else { offLine.getAndIncrement(); } } ); xixunLed.setTotalCount(xiXuns.size()); xixunLed.setOnlineCount(onLine.get()); xixunLed.setOfflineCount(offLine.get()); onLineCountVO.setLedXiXun(xixunLed); System.out.println("熙汛执行时间: " + LocalDateTime.now()); countDownLatchUtil.countDown(str); } }).start(); try { countDownLatch.await(20000, TimeUnit.MILLISECONDS); countDownLatchUtil.remove(str); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("响应时间: " + LocalDateTime.now()); return onLineCountVO; } public CommonPage queryAllStatesAndList(Integer pageNo, Integer pageSize, PoleStatesParam param, Integer order, Integer seq) { if (param == null) { param = new PoleStatesParam(); } //排序字段 String orderByResult = OrderByEnums.POLE_ID.getCode(); //正序、倒叙 String orderBySeq = OrderByEnums.ASC.getCode(); if (order != null) { switch (order) { case 1: orderByResult = OrderByEnums.POLE_NAME.getCode(); break; case 2: orderByResult = OrderByEnums.POLE_ID.getCode(); break; case 3: orderByResult = OrderByEnums.POLE_CREATE_TIME.getCode(); break; default: } } if (seq != null) { switch (seq) { case 1: orderBySeq = OrderByEnums.ASC.getCode(); break; case 2: orderBySeq = OrderByEnums.DESC.getCode(); break; default: break; } } //排序方式 String orderBy = "t1." + orderByResult + " " + orderBySeq; List poleList; Integer center = param.getCenter(); if (SecurityUtils.getClientId() == null) { poleList = poleMapper.queryPoleOnLineStatesList(null, param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword(), center, orderBy); } else { poleList = poleMapper.queryPoleOnLineStatesList(SecurityUtils.getUserId(), param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword(), center, orderBy); } poleList.forEach( centre -> { if (centre.getCentre() == 0) { centre.setCenter(true); } } ); List PoleResult = isOnLine(poleList, param); setCount(PoleResult); CommonPage commonPage = ListPagingUtils.pages(PoleResult, pageNo, pageSize); return commonPage; } /** * 获取绑定设备详情 * * @param list * @return */ public List setCount(List list) { BindEquipments bindEquipments; for (Pole pole : list) { bindEquipments = new BindEquipments(); List poleBindings = poleBindingService.list(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, pole.getId())); pole.setBindingCount(poleBindings.size()); for (PoleBinding poleBinding : poleBindings) { bindEquipments.setInfo(poleBinding.getDeviceType()); } pole.setBindEquipments(bindEquipments); } return list; } /** * 在线状态处理 * * @param list * @param param * @return */ public List isOnLine(List list, PoleStatesParam param) { setOnline(list); List online = new ArrayList<>();//在线 List offline = new ArrayList<>();//离线 list.forEach(onLinePole -> { System.out.println("online---------------------------------------------------" + ("ONLINE").equals(onLinePole.getOnLineState())); System.out.println("online---------------------------------------------------" + (onLinePole.getOnLineState())); if (("ONLINE").equals(onLinePole.getOnLineState())) { online.add(onLinePole); } else if (("OFFLINE").equals(onLinePole.getOnLineState())) { offline.add(onLinePole); } }); if (param.getOnLineStates() == 0) { return online; } else if (param.getOnLineStates() == 1) { return offline; } return list; } /** * 在线灯杆 * * @param list * @param * @return */ public List isOnLine(List list) { setOnline(list); List online = new ArrayList<>();//在线 list.forEach(onLinePole -> { if (("ONLINE").equals(onLinePole.getOnLineState())) { online.add(onLinePole); } }); return online; } /** * 查询绑定状态 * * @param list * @param param * @return */ // public List isBind(List list, PoleStatesParam param) { // List bindList = new ArrayList<>();//已绑定客户 // List unbindList = new ArrayList<>();//未绑定客户 // list.forEach(bindwarpper -> { //// Long clientId = bindwarpper.getClientId(); // if (bindwarpper.getClientId() == null) {//判断是否绑定 // unbindList.add(bindwarpper); // } else { // bindList.add(bindwarpper); // } // }); // if (param.getBingStates() == 0) { // return bindList; // } else if (param.getBingStates() == 1) { // return unbindList; // } // return list; // } public List isTrue(List list, PoleStatesParam param) { //实体灯杆 List isTrue = new ArrayList<>(); //虚拟灯杆 List isFalse = new ArrayList<>(); list.forEach(bindwarpper -> { // Long clientId = bindwarpper.getClientId(); //判断是否绑定 if (bindwarpper.getDeviceType() == -1) { isFalse.add(bindwarpper); } else { isTrue.add(bindwarpper); } }); if (param.getIsTrue() == 0) { return isTrue; } else if (param.getIsTrue() == 1) { return isFalse; } return list; } /** * 设置在线状态 * * @param list * @return */ public List setOnline(List list) { List MacCodes = new ArrayList<>(); for (Pole post : list) { if (post.getDeviceCode() != null) { MacCodes.add(post.getDeviceCode()); } } // List deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(MacCodes); if (deviceStatuses != null) { for (Pole post : list) { for (BatchGetDeviceStateResponse.DeviceStatus deviceStatus : deviceStatuses) { if (post.getDeviceCode() != null && post.getDeviceCode().equals(deviceStatus.getDeviceName())) { post.setOnLineState(deviceStatus.getStatus()); } } } } return list; } /** * 查询灯杆的在线状态并赋值 * * @return */ public List queryStatesAndList(Integer pageNo, Integer pageSize, String keyword, Long groupid) { PageHelper.startPage(pageNo, pageSize); List list = new ArrayList<>(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (SecurityUtils.getClientId() == null) { wrapper = Wrappers.lambdaQuery(Pole.class); } else { wrapper = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, SecurityUtils.getUserId()); } if (!keyword.isEmpty()) { wrapper.like(Pole::getPoleCode, keyword).or(wrappers -> { wrappers.like(Pole::getPoleName, keyword); }); } list = list(wrapper); List MacCodes = new ArrayList<>(); for (Pole post : list) { MacCodes.add(post.getDeviceCode()); } List deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(MacCodes); for (Pole post : list) { for (BatchGetDeviceStateResponse.DeviceStatus deviceStatus : deviceStatuses) { if (post.getDeviceCode() != null && post.getDeviceCode().equals(deviceStatus.getDeviceName())) { post.setOnLineState(deviceStatus.getStatus()); int size = poleBindingService.list(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, post.getId())).size(); post.setBindingCount(size); } } } return list; } /** * 灯杆绑定设备 * * @param poleId 绑定灯杆id * @param param 被绑定设备信息 * @return 是否成功 */ public boolean bindPole(Long poleId, PoleBindingParam param) { Pole pole = getById(poleId); if (pole == null) { throw new BusinessException("未找到该灯杆"); } return poleBindingService.bindPole(poleId, param); } /** * 灯杆解绑绑定设备 * * @return 是否成功 */ public boolean unBindPole(Long poleId, String deviceCode, Integer deviceType) { return poleBindingService.unBindPole(poleId, deviceCode, deviceType); } /** * 灯杆恢复出厂设置 * * @param id * @return */ public boolean poleReset(Long id) { Pole byId = getById(id); if (byId == null) { throw new BusinessException("未找到该灯杆"); } String deviceName = byId.getDeviceCode(); if (deviceName.isEmpty()) { throw new BusinessException("该灯杆Mac为空"); } IRequestFrame build = FrameBuilder.builderA5().orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode()).innerFrame(new A5LightResetReqInnerFrame()).build(); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, build); StoreOperationRecordsUtils.storeInnerFrameData(deviceName, "灯杆恢复出厂设置", build, commonFrame); System.out.println(commonFrame.toString()); IRequestFrame iRequestFrame = FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame()).orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build(); CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, iRequestFrame); StoreOperationRecordsUtils.storeInnerFrameData(deviceName, "灯杆重启", iRequestFrame, commonFrame); boolean b = false; if ("00".equals(rebootFrame.getPayload())) { byId.setDeviceCode(null); b = updateById(byId); System.out.println("重启成功"); } /** * 灯杆恢复出厂设置日志记录开始 */ String content = "{灯杆ID:" + id + " }"; StoreOperationRecordsUtils.storeOperationData(null, null, "灯杆恢复出厂设置", content); /** * 灯杆恢复出厂设置日志记录结束 */ return b; } /** * 给灯杆注册三元码 */ @Transactional(rollbackFor = Exception.class) public Map setMac(String baseMac) { A1Frame a1Frame = new A1Frame(A1OrderEnum.REQUEST_READ_DEVICE_UNIQUE_MAC.getCode(), new EmptyRequestInnerFrame()); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, a1Frame); //存储振记录 StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "注册三元码", a1Frame, commonFrame); if (commonFrame == null) { throw new BusinessException("读取设备唯一ID失败"); } A1DeviceMacRespInnerFrame a1DeviceMacRespInnerFrame = new A1DeviceMacRespInnerFrame().transformFrame(commonFrame.getPayload()); log.info(commonFrame.toString()); String uniqueMac = a1DeviceMacRespInnerFrame.getMac(); uniqueMac = uniqueMac.toLowerCase(); if (uniqueMac.isEmpty()) { throw new BusinessException("读取设备唯一ID失败!"); } log.info("唯一码{}", uniqueMac); // 2 从阿里注册 MainBoardInvokeSyncService.getInstance().registerDevice(uniqueMac); // 3 获取设备详情 QueryDeviceDetailResponse.Data deviceDetail = MainBoardInvokeSyncService.getInstance().queryDeviceDetail(uniqueMac, null); if (deviceDetail == null) { throw new BusinessException("注册失败"); } log.info(deviceDetail.toString()); // 4 配置Mac① IRequestFrame build1 = FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(MainBoardInvokeSyncService.getInstance().getProductKey())).orderType(A1OrderEnum.REQUEST_SET_PRODUCT_KEY.getCode()).build(); CommonFrame commonFrame1 = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build1); //存储振记录 StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "设备配置ProductKey", build1, commonFrame1); A1TernaryCodeRespInnerFrame responseInnerFrame = new A1TernaryCodeRespInnerFrame().transformFrame(commonFrame1.getPayload()); if (!MainBoardInvokeSyncService.getInstance().getProductKey().equals(responseInnerFrame.getTernaryCode())) { throw new BusinessException("设备配置ProductKey失败"); } // 5 配置Mac② IRequestFrame build2 = FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(uniqueMac)).orderType(A1OrderEnum.REQUEST_SET_DEVICE_NAME.getCode()).build(); CommonFrame commonFrame2 = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build2); //存储振记录 StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "设备配置名", build2, commonFrame2); A1TernaryCodeRespInnerFrame a1TernaryCodeRespInnerFrame = new A1TernaryCodeRespInnerFrame().transformFrame(commonFrame2.getPayload()); if (!uniqueMac.equals(a1TernaryCodeRespInnerFrame.getTernaryCode())) { throw new BusinessException("设备配置名失败"); } // 6 配置Mac③ IRequestFrame build3 = FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(deviceDetail.getDeviceSecret())).orderType(A1OrderEnum.REQUEST_SET_DEVICE_SECRET.getCode()).build(); CommonFrame commonFrame3 = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build3); //存储振记录 StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "设备密钥", build3, commonFrame3); A1TernaryCodeRespInnerFrame deviceSecretFrame = new A1TernaryCodeRespInnerFrame().transformFrame(commonFrame3.getPayload()); if (!deviceDetail.getDeviceSecret().equals(deviceSecretFrame.getTernaryCode())) { throw new BusinessException("设备密钥失败"); } // 7 重启设备 并使用新的Mac IRequestFrame build4 = FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame()).orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build(); CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build4); //存储振记录 StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "重启设备", build4, rebootFrame); if ("00".equals(rebootFrame.getPayload())) { System.out.println("重启成功"); } Pole pole = getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, uniqueMac)); if (pole == null) { pole = new Pole(); } pole.setDeviceCode(uniqueMac); pole.setPoleName(uniqueMac); if ("00".equals(a1DeviceMacRespInnerFrame.getType())) { pole.setDeviceType(0); } else if ("01".equals(a1DeviceMacRespInnerFrame.getType())) { pole.setDeviceType(1); } pole.setPoleCode(generatePoleCode()); boolean result = saveOrUpdate(pole); if (result) { Light light = SpringContextHolder.getBean(LightService.class).getOne(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, pole.getDeviceCode()).last("limit 1")); if (light == null) { light = new Light(); light.setDeviceCode(uniqueMac); light.setLightCount(2); SpringContextHolder.getBean(LightService.class).save(light); } } /** * 实体灯杆注册日志记录开始 */ String content = "{灯杆ID:" + pole.getId() + ",灯杆编号:" + pole.getPoleCode() + ",灯杆名称:" + pole.getPoleName() + ",灯杆类型:" + pole.getDeviceType() + ",灯杆MAC:" + pole.getDeviceCode() + " }"; StoreOperationRecordsUtils.storeOperationData(null, null, "实体灯杆注册", content); /** * 实体灯杆注册日志记录结束 */ Map map = new HashMap(); if (true) { map.put("mac", uniqueMac); } else { map.put("mac", -1); } return map; } public List listDeviceCodeByIds(List poleIdList) { if (CollectionUtil.isEmpty(poleIdList)) { return null; } List list = list(Wrappers.lambdaQuery(Pole.class).in(Pole::getId, poleIdList).select(Pole::getDeviceCode)); return list.stream().filter(Objects::nonNull).map(Pole::getDeviceCode).filter(StrUtil::isNotEmpty).collect(Collectors.toList()); } /** * 批量获取阿里云设备的状态 * * @param deviceCodeList 阿里云设备码 * @return 设备状态列表 */ public List listStatusByDeviceCode(ArrayList deviceCodeList) { // 最大只能查50个 List> split = CollectionUtil.split(deviceCodeList, 50); List statusList = new ArrayList<>(); for (List list : split) { List deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(list); if (CollectionUtil.isNotEmpty(deviceStatuses)) { for (BatchGetDeviceStateResponse.DeviceStatus d : deviceStatuses) { DeviceStatus deviceStatus = new DeviceStatus(); deviceStatus.setDeviceCode(d.getDeviceName()); deviceStatus.setStatus(DeviceStateEnum.getCode(d.getStatus())); statusList.add(deviceStatus); } } } // List statusList = new ArrayList<>(); // // deviceCodeList.forEach(l -> { // DeviceStatus deviceStatus = new DeviceStatus(); // deviceStatus.setDeviceCode(l); // // if (localMqttConnectStatusMap.get(l)!=null && // localMqttConnectStatusMap.get(l)== 1){ // deviceStatus.setStatus(1); // }else { // deviceStatus.setStatus(0); // } // statusList.add(deviceStatus); // }); return statusList; } /** * 用户绑定灯杆 * * @param clientId 用户ID * @param poleIds 灯杆ID * @return */ public boolean ClientBindingPole(long clientId, int[] poleIds) { boolean r = false; for (int poleId : poleIds) { Pole pole = getById(poleId); if (pole == null) { throw new BusinessException("灯杆不存在"); } pole.setClientId(clientId); if (clientService.findClientId(clientId)) { pole.setUserId(clientService.getClientId(clientId)); } r = updateById(pole); if (!r) { throw new BusinessException("灯杆ID为" + poleId + "设置失败,自动停止"); } } return r; } /** * 用户解绑灯杆 * * @param clientId * @param poleIds * @return */ public boolean ClientUnBindingPole(long clientId, int[] poleIds) { boolean r = false; for (int poleId : poleIds) { Pole pole = getById(poleId); if (pole == null) { throw new BusinessException("灯杆不存在"); } //一级客户 -1 userId //二级客户 上级客户id userId pole.setClientId(-1L); pole.setUserId(-1L); r = updateById(pole); if (!r) { throw new BusinessException("灯杆ID为" + poleId + "设置失败,自动停止"); } } return r; } public List getOwnerPole(BaseConditionVO baseConditionVO, String keyword, Long cilentId) { LambdaQueryWrapper eq; if (clientService.findClientId(cilentId)) { eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, cilentId); } else { eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, cilentId).or(pole -> { pole.eq(Pole::getUserId, cilentId); }); } if (!keyword.isEmpty()) { eq.like(Pole::getPoleName, keyword).or(code -> { code.like(Pole::getPoleCode, keyword); }).or(deviceCode -> { deviceCode.like(Pole::getDeviceCode, keyword); }); } PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); List list; list = list(eq); setCount(list); setOnline(list); return list; } /** * 根据灯杆id查询灯杆绑定设备 * * @return */ public PoleBindVO getBindByPoleId(Long poleId) { List bind = poleBindingService.list(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId)); Map map = new HashMap<>(); for (int i = 0; i < 11; i++) { map.put(i, null); } for (PoleBinding poleBinding : bind) { map.put(poleBinding.getDeviceType(), poleBinding.getDeviceCode()); } PoleBindVO poleBindVO = new PoleBindVO(); // //灯杆信息 // poleBindVOTest.setPole(getPoleByMac(poleId)); /** * 设备信息 */ //单灯 poleBindVO.getList().add(SpringContextHolder.getBean(LightService.class).getLightInfo(map.get(0))); //诺瓦 poleBindVO.getList().add(SpringContextHolder.getBean(LedPlayerEntityService.class).getBySnAndPlayerSnInfo(map.get(1))); //充电桩 poleBindVO.getList().add(SpringContextHolder.getBean(C3ChargingService.class).getByC3MacInfo(map.get(2))); //大气 poleBindVO.getList().add(SpringContextHolder.getBean(AirEquipmentService.class).getAirEquipmentInfo(map.get(3))); //水质 poleBindVO.getList().add(SpringContextHolder.getBean(WaterQualityEquipmentService.class).getWaterQualityDataInfo(map.get(4))); //音柱 poleBindVO.getList().add(SpringContextHolder.getBean(IpVolumeService.class).getIpTerminalDetail(map.get(5))); //LCD //lcd暂无 //摄像头 poleBindVO.getList().add(SpringContextHolder.getBean(MonitorService.class).getMonitorInfo(map.get(7))); //杆体倾测 poleBindVO.getList().add(SpringContextHolder.getBean(LightPoleHeelingService.class).getLightPoleHeelingByMac(map.get(8))); //一键求助 //一键求助暂无 //熙讯 poleBindVO.getList().add(SpringContextHolder.getBean(PoleLightemitService.class).getLedByLightControlCodeInfo(map.get(10))); return poleBindVO; } public Pole getPoleByMac(Long poleId) { Pole one = getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getId, poleId)); ArrayList macs = new ArrayList<>(); macs.add(one.getDeviceCode()); List deviceStatuses = listStatusByDeviceCode(macs); if (one.getDeviceCode() == null || one.getDeviceType() == null || one.getDeviceType() == -1) { one.setOnLineState("虚拟灯杆"); } else if (deviceStatuses.get(0).getStatus() == 0) { one.setOnLineState("离线"); } else if (deviceStatuses.get(0).getStatus() == 1) { one.setOnLineState("在线"); } else if (deviceStatuses.get(0).getStatus() == 2) { one.setOnLineState("未激活"); } else if (deviceStatuses.get(0).getStatus() == 3) { one.setOnLineState("不可用"); } else { one.setOnLineState("未知"); } return one; } // /** // * 用户总单灯节能率 // */ // public Double getPoleEnergy() { // Double energy = 0.0; // // // return energy; // } public boolean updateDeviceCode(Long poleId) { return poleMapper.updateDeviceCode(poleId); } /** * 推送大气监测数据到novaLED */ public boolean pushAirDataToXiXun(Long poleId) { Pole pole = getById(poleId); //判断归属权 if (SecurityUtils.getClientId() != null) { if (!pole.getClientId().equals(SecurityUtils.getUserId()) && !pole.getUserId().equals(SecurityUtils.getUserId())) { throw new BusinessException("无权限操作"); } } PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3)); PoleBinding xixun = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 10)); if (pole == null) { throw new BusinessException("灯杆不存在"); } if (air == null) { throw new BusinessException("未绑定大气监测设备"); } if (xixun == null) { throw new BusinessException("未绑定xixun设备"); } //获取大气监测数据 A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId); //推送数据 return SpringContextHolder.getBean(XiXunPlayerService.class).pushWeather(xixun.getDeviceCode(), data, pole); } /** * 关闭熙讯大气推送 */ public void closeXiXunAirPush(Long poleId) { Pole pole = getById(poleId); if (SecurityUtils.getClientId() != null) { if (!pole.getClientId().equals(SecurityUtils.getUserId()) && !pole.getUserId().equals(SecurityUtils.getUserId())) { throw new BusinessException("无权限操作"); } } PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3)); PoleBinding xixun = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 10)); if (pole == null || air == null || xixun == null) { throw new BusinessException("设备不存在"); } //关闭推送 String clear = SpringContextHolder.getBean(LightemitUtils.class).clear(xixun.getDeviceCode()); if (clear.contains("is not") || clear.contains("does not")) { throw new BusinessException("设备不在线或设备未存在于服务器"); } } /** * 推送大气监测数据到novaLED */ public VnnoxResult pushAirDataToNova(PushAirDataToNovaParam param) { Long poleId = param.getPoleId(); Pole pole = getById(poleId); PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3)); if (air == null) { throw new BusinessException("未绑定大气监测设备"); } PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 1)); if (nova == null) { throw new BusinessException("未绑定nova设备"); } LedPlayerEntity LED = SpringContextHolder.getBean(LedPlayerEntityService.class).getOne(Wrappers.lambdaQuery(LedPlayerEntity.class).eq(LedPlayerEntity::getSn, nova.getDeviceCode())); if (pole == null) { throw new BusinessException("灯杆不存在"); } //获取大气监测数据 A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId); //推送数据 // return SpringContextHolder.getBean(VnnoxService.class).publishWaterData(LED.getPlayerId(),param.getDuration(), data); return SpringContextHolder.getBean(VnnoxService.class).WaterData(LED.getPlayerId(), param.getDuration(), data); } /** * 统计设备状态存入redis */ public void setRedis() { // redisStatusKeyTimeout为空 代表上次调用在15分钟前 if (redisUtils.get("redisStatusKeyTimeout") != null) { //不为空 说明短时间内调用过 直接返回 System.out.println("15分钟内已经更新过数据"); return; } //设置触发条件 存入Redis 15分钟超时 15分钟内再次调用直接返回 redisUtils.set("redisStatusKeyTimeout", System.currentTimeMillis(), 60 * 15); CountDownLatch countDownLatch = new CountDownLatch(7);//todo 几个设备设置为几 //获取一个7位随机数 String str = RandomStringUtils.randomAlphanumeric(7); countDownLatchUtil.push(str, countDownLatch); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(IpVolumeService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("音柱执行"); } }).start(); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(MonitorService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("摄像头执行"); } }).start(); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(LightService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("单灯执行"); } }).start(); // new Thread(new Runnable() { // @Override // public void run() { // SpringContextHolder.getBean(C3ChargingService.class).setCacheData(); // countDownLatchUtil.countDown(str); // System.out.println("充电桩执行"); // } // }).start(); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(AirEquipmentService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("大气执行"); } }).start(); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(PoleLightemitService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("熙汛执行"); } }).start(); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(VnnoxService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("诺瓦执行"); //todo 诺瓦故障暂无 } }).start(); new Thread(new Runnable() { @Override public void run() { SpringContextHolder.getBean(PoleLightemitService.class).setCacheData(); countDownLatchUtil.countDown(str); System.out.println("熙汛执行"); } }).start(); try { countDownLatch.await(12000, TimeUnit.MILLISECONDS); countDownLatchUtil.remove(str); } catch (InterruptedException e) { throw new RuntimeException(e); } } }