package com.zy.asrs.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.core.common.Cools; import com.zy.system.entity.Announcement; import com.zy.asrs.entity.BasStationTv; import com.zy.asrs.entity.TvDevice; import com.zy.asrs.entity.dto.TvDataDto; import com.zy.asrs.entity.dto.WcsStationDto; import com.zy.asrs.enums.RedisKeyType; import com.zy.asrs.utils.StationUtils; import com.zy.asrs.websocket.TvWebSocketServer; import com.zy.common.model.WebSocketMessage; import com.zy.common.utils.RedisUtil; import com.zy.system.service.AnnouncementService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.util.*; @Slf4j @Service public class TvDataPushService { @Autowired private TvWebSocketServer tvWebSocketServer; @Autowired private TvDeviceService tvDeviceService; @Autowired private BasStationTvService basStationTvService; @Autowired private StationUtils stationUtils; @Autowired private RedisUtil redisUtil; @Autowired private AnnouncementService announcementService; private static final String[] WEEK = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; @Scheduled(fixedRate = 1000) public void pushAll() { if (tvWebSocketServer.getOnlineIps().isEmpty()) { return; } pushLedInfosAndError(); pushLocData(); pushLineCharts(); pushLocDetlStatistics(); pushAnnouncement(); pushDate(); } private void pushLedInfosAndError() { String manualError = ""; Object manualErrorObj = redisUtil.get(RedisKeyType.TV_MANUAL_ERROR_MSG.key); if (manualErrorObj != null) { manualError = String.valueOf(manualErrorObj); } for (String ip : tvWebSocketServer.getOnlineIps()) { TvDevice tvDevice = tvDeviceService.getOne( new QueryWrapper().eq("ip", ip)); if (tvDevice == null) { // 非注册设备(如调试页面),推送空数据和通用错误 Map ledData = new HashMap<>(); ledData.put("deviceName", "未注册设备(" + ip + ")"); ledData.put("data", new ArrayList<>()); tvWebSocketServer.sendMessageToDevice(ip, buildMessage("ledInfos", ledData)); Map errorData = new HashMap<>(); errorData.put("errorMsg", manualError != null ? manualError : ""); tvWebSocketServer.sendMessageToDevice(ip, buildMessage("error", errorData)); continue; } List relations = basStationTvService .list(new QueryWrapper().eq("tv_id", tvDevice.getId())); List dataList = new ArrayList<>(); Set errors = new LinkedHashSet<>(); if (manualError != null && !manualError.isEmpty()) { errors.add(manualError); } if (relations != null && !relations.isEmpty()) { for (BasStationTv relation : relations) { WcsStationDto wcsStationDto = stationUtils.stationMap.get(relation.getStationId()); if (wcsStationDto == null || wcsStationDto.getLoading() != 1) { continue; } String errorMsg = ""; if (!Cools.isEmpty(wcsStationDto.getErrorMsg())) { errorMsg += wcsStationDto.getErrorMsg(); } if (!Cools.isEmpty(wcsStationDto.getSystemWarning())) { errorMsg += wcsStationDto.getSystemWarning(); } if (!Cools.isEmpty(errorMsg)) { errors.add(errorMsg); } TvDataDto tvDataDto = new TvDataDto(); tvDataDto.setStationId(wcsStationDto.getStationId()); tvDataDto.setTaskNo(wcsStationDto.getTaskNo()); tvDataDto.setBarcode(wcsStationDto.getBarcode()); tvDataDto.setErrorMsg(errorMsg); tvDataDto.setIoType(wcsStationDto.getIoType()); tvDataDto.setWrkDetls(wcsStationDto.getWrkDetls()); tvDataDto.setErrorCode(Cools.isEmpty(errorMsg) ? 0 : 1); dataList.add(tvDataDto); } } // 推送 ledInfos Map ledData = new HashMap<>(); ledData.put("deviceName", tvDevice.getName()); ledData.put("data", dataList); tvWebSocketServer.sendMessageToDevice(ip, buildMessage("ledInfos", ledData)); // 推送 error Map errorData = new HashMap<>(); errorData.put("errorMsg", String.join(";", errors)); tvWebSocketServer.sendMessageToDevice(ip, buildMessage("error", errorData)); } } private void pushLocData() { Object o = redisUtil.get(RedisKeyType.TV_LOC_DATA_DTO.key); String currentData = o != null ? o.toString() : "{}"; tvWebSocketServer.sendMessageToAll(buildMessage("locData", JSON.parseObject(currentData))); } private void pushLineCharts() { Object o = redisUtil.get(RedisKeyType.TV_LINE_CHARTS.key); if (o == null) { return; } String currentData = o.toString(); tvWebSocketServer.sendMessageToAll(buildMessage("lineCharts", JSON.parseObject(currentData))); } private void pushLocDetlStatistics() { Object o = redisUtil.get(RedisKeyType.TV_LOC_DETL_STATISTICS.key); if (o == null) { return; } String currentData = o.toString(); tvWebSocketServer.sendMessageToAll(buildMessage("locDetlStatistics", JSON.parseArray(currentData))); } private void pushAnnouncement() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("status", 1); wrapper.orderBy(true, false, "create_time"); wrapper.last("limit 5"); List list = announcementService.list(wrapper); tvWebSocketServer.sendMessageToAll(buildMessage("announcement", list)); } private void pushDate() { Date now = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(now); Map dateMap = new HashMap<>(); dateMap.put("year", calendar.get(Calendar.YEAR)); dateMap.put("month", zerofill(String.valueOf(calendar.get(Calendar.MONTH) + 1), 2)); dateMap.put("day", zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2)); dateMap.put("hour", zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2)); dateMap.put("minute", zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2)); dateMap.put("second", zerofill(String.valueOf(calendar.get(Calendar.SECOND)), 2)); dateMap.put("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK) - 1]); tvWebSocketServer.sendMessageToAll(buildMessage("date", dateMap)); } private String buildMessage(String url, Object data) { WebSocketMessage message = new WebSocketMessage(); message.setUrl(url); message.setData(JSON.toJSONString(data)); return JSON.toJSONString(message); } private String zerofill(String str, int length) { while (str.length() < length) { str = "0" + str; } return str; } }