package com.sandu.ximon.admin.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.gson.Gson; import com.sandu.common.execption.BusinessException; import com.sandu.common.file.FileUploadDto; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.config.RealtimeServerBean; import com.sandu.ximon.admin.entity.*; import com.sandu.ximon.admin.param.PoleBindingParam; import com.sandu.ximon.admin.redis.DeviceRedisKey; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.admin.utils.*; import com.sandu.ximon.admin.vo.EquipmentInfomation; import com.sandu.ximon.admin.vo.RedisDeviceStatus; import com.sandu.ximon.dao.domain.Pole; import com.sandu.ximon.dao.domain.PoleLightemitEntity; import com.sandu.ximon.dao.enums.OrderByEnums; import com.sandu.ximon.dao.enums.PoleBindingEnums; import com.sandu.ximon.dao.mapper.PoleLightemitEntityMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; import java.util.*; /** * 熙讯设备 */ @Service @EnableCaching public class PoleLightemitService extends BaseServiceImpl { @Autowired private PoleBindingService poleBindingService; LightemitUtils lightemitUtils; @Autowired private RealtimeServerBean realtimeServerBean; @Value("${server.port}") private String port; @Autowired ApplicationContext applicationContext; @Autowired PoleLightemitEntityMapper poleLightemitDao; @Autowired LedSFileService xiXunFileService; @Autowired RedisUtils redisUtils; @PostConstruct public void init() { //重新获取单例 lightemitUtils = applicationContext.getBean(LightemitUtils.class); } /** * 熙讯list * * @param keyword * @param isOnLine * @return */ public List listLed(String keyword, Integer order, Integer seq, boolean isOnLine) { List poleLightemitEntityList; //排序字段 String orderByResult = "id"; //正序、倒叙 String orderBySeq = OrderByEnums.ASC.getCode(); if (order != null) { switch (order) { case 1: orderByResult = OrderByEnums.LED_S_CODE.getCode(); break; case 2: orderByResult = OrderByEnums.LED_S_NAME.getCode(); break; case 3: orderByResult = OrderByEnums.LED_S_POLE_NAME.getCode(); break; case 4: orderByResult = OrderByEnums.LED_S_CREATE_TIME.getCode(); break; default: } } if (seq != null) { switch (seq) { case 1: orderBySeq = " ASC"; break; case 2: orderBySeq = " DESC"; break; default: break; } } //排序方式 String orderBy = orderByResult + " " + orderBySeq; //超管 if (SecurityUtils.getClientId() == null) { poleLightemitEntityList = poleLightemitDao.listLed(keyword, null, orderBy); } else { poleLightemitEntityList = poleLightemitDao.listLed(keyword, SecurityUtils.getUserId(), orderBy); } List temp = new ArrayList<>(); for (PoleLightemitEntity poleLightemitEntity : poleLightemitEntityList) { //查询设备在线状态 boolean onLine = lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode()); //查询屏幕的开启状态 String isOpen = lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()); poleLightemitEntity.setIsOpen(String.valueOf(isOpen)); poleLightemitEntity.setOnLine(onLine); if (!isOnLine || onLine) { temp.add(poleLightemitEntity); } } return temp; } /** * 熙讯设备列表(用于首页数据统计) * * @return */ public List listLedOnHome() { List poleLightemitEntityList; //超管 if (SecurityUtils.getClientId() == null) { poleLightemitEntityList = poleLightemitDao.listLed(null, null, null); } else { poleLightemitEntityList = poleLightemitDao.listLed(null, SecurityUtils.getUserId(), null); } return poleLightemitEntityList; } /** * 绑定使用 * * @param keyword * @return */ public List listLedOnBinding(String keyword) { List poleLightemitEntityList; //超管 if (SecurityUtils.getClientId() == null) { poleLightemitEntityList = poleLightemitDao.listLedOnBinding(keyword, null); } else { poleLightemitEntityList = poleLightemitDao.listLedOnBinding(keyword, SecurityUtils.getUserId()); } for (PoleLightemitEntity poleLightemitEntity : poleLightemitEntityList) { //查询设备在线状态 boolean onLine = lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode()); //查询屏幕的开启状态 String isOpen = lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()); poleLightemitEntity.setIsOpen(String.valueOf(isOpen)); poleLightemitEntity.setOnLine(onLine); } return poleLightemitEntityList; } /** * 取出在线的熙讯 * * @param list * @return */ public List ledOnline(List list) { List onLineList = new ArrayList<>(); for (PoleLightemitEntity poleLightemitEntity : list) { // if(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()).contains("true")){ // poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()).contains("true")); // } poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode())); boolean ledOnLine = lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode()); if (ledOnLine) { poleLightemitEntity.setOnLine(true); onLineList.add(poleLightemitEntity); } else { poleLightemitEntity.setOnLine(false); } } return onLineList; } /** * 设置在线状态 * * @param list */ public void ledOnlineCheck(List list) { for (PoleLightemitEntity poleLightemitEntity : list) { poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode())); poleLightemitEntity.setOnLine(lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode())); } } /** * 查询单个LED * * @param lightControlCode * @return */ public PoleLightemitEntity getLedByLightControlCode(String lightControlCode) { PoleLightemitEntity xiXun = getOne(Wrappers.lambdaQuery(PoleLightemitEntity.class).eq(PoleLightemitEntity::getLightemitControlCode, lightControlCode)); Pole getpole = poleLightemitDao.getpole(lightControlCode); if (xiXun == null) { return null; } boolean isScreenOpen = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode()); xiXun.setIsOpen(lightemitUtils.getIsScreenOpen(lightControlCode)); xiXun.setOnLine(isScreenOpen); xiXun.setStreetlightName(getpole.getPoleName()); xiXun.setStreetlightId(getpole.getId()); return xiXun; } /** * 首页灯杆绑定信息 */ public EquipmentInfomation getLedByLightControlCodeInfo(String lightControlCode) { EquipmentInfomation equipmentInfo = new EquipmentInfomation(); equipmentInfo.setEquipmentType("SLED"); if (lightControlCode == null || lightControlCode.trim().length() == 0) { return equipmentInfo; } PoleLightemitEntity xiXun = getOne(Wrappers.lambdaQuery(PoleLightemitEntity.class).eq(PoleLightemitEntity::getLightemitControlCode, lightControlCode)); boolean isScreenOpen = false; if (xiXun != null) { equipmentInfo.setEquipmentCreateTime(xiXun.getCreateTime()); equipmentInfo.setEquipmentMac(xiXun.getLightemitControlCode()); equipmentInfo.setEquipmentName(xiXun.getLightemitName()); isScreenOpen = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode()); } if (isScreenOpen) { equipmentInfo.setEquipmentState("在线"); } else { equipmentInfo.setEquipmentState("离线"); } return equipmentInfo; } @Transactional(rollbackFor = Exception.class) public void savePoleLightemit(PoleLightemitEntity poleLightemit) { boolean save = this.save(poleLightemit); // 绑定灯杆 if (save && poleLightemit.getStreetlightId() != null) { PoleBindingParam poleBindingParam = new PoleBindingParam(); poleBindingParam.setDeviceCode(poleLightemit.getLightemitControlCode()); poleBindingParam.setDeviceType(10); poleBindingParam.setDeviceName(poleLightemit.getLightemitName()); if (SpringContextHolder.getBean(PoleService.class).getById(poleLightemit.getStreetlightId()) == null) { throw new BusinessException("灯杆不存在"); } boolean b = poleBindingService.bindPole(poleLightemit.getStreetlightId(), poleBindingParam); } /** * 熙汛led新增日志记录开始 */ List listCode = new ArrayList<>(); listCode.add(poleLightemit.getLightemitControlCode()); String content = "{屏幕id:" + poleLightemit.getLightemitId() + ", 屏幕名称:" + poleLightemit.getLightemitName() + ", 屏幕编码:" + poleLightemit.getLightemitControlCode() + " }"; StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛LED新增", content); /** * 熙汛led新增日志记录结束 */ // poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId()); } public void updatePoleLightemit(Long ledId, PoleLightemitEntity poleLightemit) { PoleLightemitEntity byId = getById(ledId); if (byId == null) { throw new BusinessException("未找到LED屏"); } if (SecurityUtils.getClientId() != null) { boolean belong = SpringContextHolder.getBean(PoleBindingService.class).isBelong(byId.getLightemitControlCode(), PoleBindingEnums.XIXUN); if (!belong) { throw new BusinessException("该设备不属于您,不能修改设备信息"); } } poleLightemit.setLightemitId(ledId); boolean b = this.updateById(poleLightemit); // 绑定灯杆 if (b && poleLightemit.getStreetlightId() != null) { //先删除绑定关系 poleBindingService.unBindPole(null, poleLightemit.getLightemitControlCode()); //再绑定 PoleBindingParam poleBindingParam = new PoleBindingParam(); poleBindingParam.setDeviceCode(poleLightemit.getLightemitControlCode()); poleBindingParam.setDeviceType(10); poleBindingParam.setDeviceName(poleLightemit.getLightemitName()); poleBindingService.bindPole(poleLightemit.getStreetlightId(), poleBindingParam); } /** * 熙汛led编辑日志记录开始 */ List listCode = new ArrayList<>(); listCode.add(byId.getLightemitControlCode()); String content = "{屏幕id:" + byId.getLightemitId() + ", 屏幕原名:" + byId.getLightemitName() + ", 屏幕名称:" + poleLightemit.getLightemitName() + ", 屏幕编码:" + byId.getLightemitControlCode() + " }"; StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛LED编辑", content); /** * 熙汛led编辑日志记录结束 */ // poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId()); } public boolean deletePoleLightemit(List ledIds) { List poleLightemitEntities = listByIds(ledIds); if (poleLightemitEntities != null && poleLightemitEntities.size() == 0) { throw new BusinessException("设备不存在"); } List listCode = new ArrayList<>(); // 删除设备绑定 if (poleLightemitEntities != null && poleLightemitEntities.size() != 0) { for (PoleLightemitEntity poleLightemitEntitie : poleLightemitEntities) { if (poleLightemitEntitie.getLightemitControlCode() != null) { //删除绑定关系//先删除绑定关系 listCode.add(poleLightemitEntitie.getLightemitControlCode()); poleBindingService.unBindPole(poleLightemitEntitie.getLightemitControlCode()); } } } //删除设备 boolean b = removeByIds(ledIds); /** * 熙汛led删除日志记录开始 */ List nameList = new ArrayList<>(); for (PoleLightemitEntity poleLightemitEntitie : poleLightemitEntities) { nameList.add(poleLightemitEntitie.getLightemitName()); } String content = "{删除熙汛LED的设备信息:" + nameList.toString() + " }"; StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛LED删除", content); /** * 熙汛led删除日志记录结束 */ return b; // poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId()); } /** * led上传图片 * * @param lightemitControlCode * @param path * @param filenameList * @param userName * @throws IOException */ @Async("taskExecutor") public void photoUpload(String lightemitControlCode, String path, List filenameList, String userName) throws IOException { //获取屏幕宽 String screenWidth = lightemitUtils.getScreenWidth(lightemitControlCode); String screenHeight = lightemitUtils.getScreenHeight(lightemitControlCode); //html地址 String filenameTemp = path + userName + "_" + lightemitControlCode + ".html"; File htmlFile = new File(filenameTemp); if (!htmlFile.exists() || htmlFile.delete()) { htmlFile.createNewFile(); } //获取body的html Map params = new HashMap<>(); params.put("imgList", filenameList); params.put("screenWidth", screenWidth); params.put("screenHeight", screenHeight); String body = new HtmlTemplateUtils().renderPath("classpath:templates/lightemitTemplates/photoTemplates.html", params); boolean flag = new FileUtil().writeToFile(body, filenameTemp); if (flag) { //清屏操作 lightemitUtils.clear(lightemitControlCode); //清除播放列表 lightemitUtils.clearVideoPlay(lightemitControlCode); //清除节目列表 lightemitUtils.clearPlayerTask(lightemitControlCode); //推送图片 lightemitUtils.postHtml(lightemitControlCode, userName); } } /** * led上传视频 * * @param lightemitControlCode */ @Async("taskExecutor") public String videoUpload(String lightemitControlCode, FileUploadDto fileUploadDto, Integer type) { //获取屏幕宽 String screenWidth = lightemitUtils.getScreenWidth(lightemitControlCode); String screenHeight = lightemitUtils.getScreenHeight(lightemitControlCode); //发送视频至开发板并播放 String fileUrl = fileUploadDto.getFileUrl(); String[] split = fileUrl.split("/"); String id = split[split.length - 1]; String result = this.videoXixunPlayer(lightemitControlCode, id, fileUploadDto.getFileSize(), fileUploadDto.getMd5(), type, fileUploadDto.getFileType(), 999999); LogUtils.error("上传播放结果:" + result); return result; } @Async("taskExecutor") public String videoXixunPlayer(String lightemitControlCode, String filename, Long filesize, String md5, Integer type, String fileType, Integer videoTime) { //获取屏幕宽 Integer screenWidth = Integer.valueOf(lightemitUtils.getScreenWidth(lightemitControlCode)); Integer screenHeight = Integer.valueOf(lightemitUtils.getScreenHeight(lightemitControlCode)); Source source = new Source(); Layer layer = new Layer(); Program pro = new Program(); TaskItem items = new TaskItem(); ProgramsTask task = new ProgramsTask(); Command command = new Command(); XixunPlayer xixun = new XixunPlayer(); //所有_id都可用UUID随机生成 source.set_id(UUID.randomUUID().toString()); //请求头拼接该ID为该资源的完整下载地址 source.setId(filename); if (type == 1) { //设置资源类型,其他资源类型请参考xixunplayer节目json说明文档 source.set_type("Video"); source.setMime("video/mp4"); } else { source.set_type("Image"); source.setMime("image/jpeg"); } //资源后缀名 source.setFileExt(fileType); //资源高度 source.setHeight(screenHeight); //资源宽度 source.setWidth(screenWidth); //距左 source.setLeft(0); source.setMd5(md5); source.setName(filename); source.setPlayTime(0); //播放起始时间 source.setSize(filesize); //资源字节数,要精准 source.setTimeSpan(videoTime); //该资源播放时长 source.setTop(0); //距顶 List list = new ArrayList(); list.add(source); layer.setSources(list); pro.set_id(UUID.randomUUID().toString()); pro.setHeight(screenHeight); //节目高度 List list1 = new ArrayList(); list1.add(layer); pro.setLayers(list1); pro.setName("文件上传播放"); //节目名称 pro.setOthers(true);//如果为true,则该节目来自第三方接口,不是来自我们自己的web,二次开发请务必赋值为true pro.setTotalSize(filesize); //所有资源总字节数 pro.setVersion(0); //高级节目=0,简易节目=2 pro.setWidth(screenWidth); //节目宽度 items.set_id(UUID.randomUUID().toString()); items.set_program(pro); items.setRepeatTimes(1); items.setSchedules(null);//定时段,不做定时可为null task.set_id(UUID.randomUUID().toString()); task.setName("这是一个示例"); List list2 = new ArrayList(); list2.add(items); task.setItems(list2); command.setId(UUID.randomUUID().toString()); //这里是下方的post回调地址,需要修改IP地址 command.setNotificationURL(""); //资源下载链接的请求头 command.setPreDownloadURL("https://ximonsmart.oss-cn-shanghai.aliyuncs.com/"); command.setTask(task); xixun.set_id(UUID.randomUUID().toString()); xixun.setCommand(command); xixun.setType("commandXixunPlayer"); //命令固定类型,不可更改 String jsondata = new Gson().toJson(xixun); String clearResult = lightemitUtils.clear(lightemitControlCode); if (clearResult.contains("does not exist")) { return "推送失败"; } else { poleLightemitDao.updateRequestBody(lightemitControlCode, jsondata); String post = lightemitUtils.post(realtimeServerBean.getCommand() + lightemitControlCode, jsondata); LogUtils.error("结果:" + post); //{"_type":"success","_id":"ce8dc3ff-dc88-43b7-8f55-60abd8700f1a","timestamp":1653555160535} if (post.startsWith("{") && post.endsWith("}") && post.contains("_type\":\"success")) { return "推送成功"; } else { return "推送失败"; } } } /** * 更新请求数据 * * @param ledCode * @param postBody */ public void updateRequestBody(String ledCode, String postBody) { baseMapper.updateRequestBody(ledCode, postBody); } /** * 根据led屏编码设置音量 * * @param lightemitControlCode * @param volume */ @Async("taskExecutor") public void setVolume(String lightemitControlCode, Integer volume) { lightemitUtils.setVoiume(lightemitControlCode, volume); } /** * 根据led屏编码设置亮度 * * @param lightemitControlCode * @param brightness */ @Async("taskExecutor") public void setBrightness(String lightemitControlCode, Integer brightness) { lightemitUtils.setBrightness(lightemitControlCode, brightness); } public Object getProgram(Long lightemitId) { PoleLightemitEntity xiXun = getById(lightemitId); String requestBody = xiXun.getRequestBody(); if (requestBody == null || requestBody.isEmpty()) { throw new BusinessException("未找到节目"); } Map map = JSON.parseObject(requestBody, Map.class); return map; } /** * 向Redis中存入设备状态 */ public void setCacheData() { list().forEach( xiXun -> { RedisDeviceStatus deviceStatus = new RedisDeviceStatus(); deviceStatus.setDeviceId(xiXun.getLightemitControlCode()); boolean ledOnLine = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode()); if (ledOnLine) { deviceStatus.setStatus(0); } else { deviceStatus.setStatus(1); } redisUtils.set(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode(), JSON.toJSONString(deviceStatus)); // redisUtils.delete(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode()); } ); } }