package com.fzzy.gateway.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.JSONObject; import com.bstek.dorado.annotation.DataProvider; import com.bstek.dorado.annotation.DataResolver; import com.bstek.dorado.annotation.Expose; import com.fzzy.api.data.GatewayDeviceType; import com.fzzy.api.utils.ContextUtil; import com.fzzy.api.utils.DateUtil; import com.fzzy.async.fzzy40.Fzzy40CommonService; import com.fzzy.async.fzzy40.entity.Fz40Grain; import com.fzzy.gateway.GatewayUtils; import com.fzzy.gateway.api.DeviceReportService; import com.fzzy.gateway.api.GatewayRemoteManager; import com.fzzy.gateway.entity.GatewayDevice; import com.fzzy.gateway.hx2023.ScConstant; import com.fzzy.gateway.hx2023.data.*; import com.fzzy.gateway.hx2023.websocket.WebSocketDeviceReport; import com.fzzy.gateway.service.repository.GatewayDeviceRep; import com.fzzy.mqtt.MqttPublishService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateFormatUtils; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @Component public class GatewayDeviceService { @Resource private GatewayDeviceRep gatewayDeviceRep; @Resource private Fzzy40CommonService fzzy40CommonService; @Resource private GatewayRemoteManager gatewayRemoteManager; @Resource private MqttPublishService mqttPublishService; /** * gatewayDeviceService#listAll * * @return */ @DataProvider public List listAll() { Sort sort = new Sort(Sort.Direction.ASC, "deviceId"); return gatewayDeviceRep.findAll(sort); } /** * gatewayDeviceService#updateSave * * @param entity */ @DataResolver public void updateSave(GatewayDevice entity) { GatewayDevice data = new GatewayDevice(); BeanUtils.copyProperties(entity, data); if (null == data.getId()) { data.setId(ContextUtil.getUUID()); } if (null == data.getDeviceSn()) { if (null != entity.getIp()) { data.setDeviceSn(entity.getIp()); } else { data.setDeviceSn(data.getDeviceId()); } } gatewayDeviceRep.save(data); flushCache(); } /** * gatewayDeviceService#delData * * @param data */ @Expose public String delData(GatewayDevice data) { GatewayDevice data2 = new GatewayDevice(); BeanUtils.copyProperties(data, data2); gatewayDeviceRep.delete(data2); GatewayUtils.removeCache(data2); flushCache(); return null; } /** * gatewayDeviceService#flushCache */ @Expose public void flushCache() { List list = listAll(); if (null == list || list.isEmpty()) return; for (GatewayDevice device : list) { GatewayUtils.add2Cache(device); } } /** * gatewayDeviceService#ajaxTestWeight * 地磅推送测试 * * @param parameter * @return */ @Expose public String ajaxTestWeight(GateWayTestParam parameter) { double weigh = (double) parameter.getWeight(); //double weigh = Double.parseDouble("3500.0"); List devices = listAll(); if(devices == null || devices.size()<= 0){ return "没有设备"; } List weights = devices.stream().filter(s ->(GatewayDeviceType.TYPE_01.getCode().equals(s.getType()))).collect(Collectors.toList()); if(weights == null || weights.size()<= 0){ return "没有获取到地磅设备"; } String topic = "/device/hx-weigh-big-01/91511424746940066Y001_91511424746940066Y0010000_002_004_002_001/message/property/report"; for (GatewayDevice device: weights) { WebSocketPacket packet = new WebSocketPacket(); //productId的值在webSocket执行发送方法中补充 WebSocketPacketHeader header = new WebSocketPacketHeader(); header.setDeviceName(device.getDeviceName()); header.setProductId("hx-weigh-big-01"); //header.set packet.setHeaders(header); packet.setMessageType(ScConstant.MESSAGE_TYPE_REPORT_PROPERTY); packet.setDeviceId(device.getDeviceId()); //设置信息主体 WeightInfo weightInfo = new WeightInfo(); weightInfo.setGrossWeight(weigh); weightInfo.setNetWeight(weigh); weightInfo.setNetWeight(weigh); weightInfo.setWeightUnit("KG"); JSONObject jsonObject = new JSONObject(); jsonObject.put("weightInfo", JSONObject.toJSONString(weightInfo)); packet.setProperties(jsonObject); packet.setTimestamp(System.currentTimeMillis()); topic = "/device/"+header.getProductId()+"/"+device.getDeviceId()+"/message/property/report"; mqttPublishService.publishMsg(topic, JSON.toJSONString(packet)); } return "SUCCESS"; } /** * gatewayDeviceService#ajaxTestLpr * 地磅推送测试 * @return */ @Expose public String ajaxTestLpr() { //String carNumber = parameter.getCarNumber(); String carNumber = "川A12345"; List devices = listAll(); if(devices == null || devices.size()<= 0){ return "没有设备"; } List weights = devices.stream().filter(s ->(GatewayDeviceType.TYPE_02.getCode().equals(s.getType()))).collect(Collectors.toList()); if(weights == null || weights.size()<= 0){ return "没有获取到设备"; } String topic = "/device/hx-weigh-big-01/91511424746940066Y001_91511424746940066Y0010000_002_004_002_001/message/property/report"; for (GatewayDevice device: weights) { WebSocketPacket packet = new WebSocketPacket(); //productId的值在webSocket执行发送方法中补充 WebSocketPacketHeader header = new WebSocketPacketHeader(); header.setDeviceName(device.getDeviceName()); header.setProductId("hx-catch-01"); //header.set packet.setHeaders(header); packet.setMessageType(ScConstant.MESSAGE_TYPE_REPORT_PROPERTY); packet.setDeviceId(device.getDeviceId()); //设置信息主体 LprData lpr = new LprData(); lpr.setDeviceId(device.getDeviceId()); lpr.setCarNumber(carNumber); JSONObject jsonObject = new JSONObject(); jsonObject.put("carNumber", carNumber); jsonObject.put("position", "big"); packet.setProperties(jsonObject); packet.setTimestamp(System.currentTimeMillis()); topic = "/device/"+header.getProductId()+"/"+device.getDeviceId()+"/message/property/report"; mqttPublishService.publishMsg(topic, JSON.toJSONString(packet)); } return "SUCCESS"; } /** * gatewayDeviceService#ajaxTestGrain * 粮情推送测试 * * @param parameter * @return */ @Expose public String ajaxTestGrain(GateWayTestParam parameter) { //获取设备配置,只针对粮情设备进行执行 List list = this.listAll(); if (null == list || list.isEmpty()) { return "ERROR:为获取到系统中设备配置,取消执行"; } Date dayTime = (Date) parameter.getDayTime(); if (null == dayTime) dayTime = new Date(); Date start = DateUtil.getCurZero(dayTime); Date end = DateUtil.getNextZero(dayTime); //如果部署FZZY-IGDS-V40版本系统 return this.pushByV40(list, start, end); } private String pushByV40(List list, Date start, Date end) { String depotIdSys; List listGrain; Fz40Grain lastData; KafaGrainData pushData; DeviceReportService deviceReportService = null; for (GatewayDevice device : list) { depotIdSys = device.getDepotIdSys(); if (StringUtils.isEmpty(depotIdSys)) { log.info("--------设备--{}-未配置系统相关仓库编码,无法执行当前操作", device.getDeviceName()); continue; } listGrain = fzzy40CommonService.listGrain(depotIdSys, start, end); if (null == listGrain || listGrain.isEmpty()) { log.info("---------设备---{}--未同步到粮情信息,请确认当前条件下是否有数据", device.getDeviceName()); continue; } //获取最后一条粮情作为当前数据 lastData = listGrain.get(listGrain.size() - 1); pushData = this.lastData2PushData(lastData, device); if (null == deviceReportService) { deviceReportService = gatewayRemoteManager.getDeviceReportService(device.getProvinceProtocol()); } deviceReportService.pushGrainData2Cloud(pushData); } return "SUCCESS"; } /** * 将粮情数据转换为推送需要的数据格式 * * @param lastData * @return */ private KafaGrainData lastData2PushData(Fz40Grain lastData, GatewayDevice device) { KafaGrainData result = new KafaGrainData(); result.setMessageId(ScConstant.getMessageId()); result.setMessgeId(result.getMessageId()); result.setDeviceID(device.getDeviceId()); result.setAvgTemperature(lastData.getTempAve() + ""); result.setMinTemperature(lastData.getTempMin() + ""); result.setMaxTemperature(lastData.getTempMax() + ""); result.setCollectTime(DateFormatUtils.format(lastData.getReceiveDate(), "yyyy-MM-dd HH:mm:ss")); //层-行-列 String[] attrCable = lastData.getCable().split("-"); if (StringUtils.isNotEmpty(lastData.getCableCir())) { return lastData2PushData2(lastData, device); } //层行列 int cableZ = Integer.valueOf(attrCable[0]); int cableY = Integer.valueOf(attrCable[1]); int cableX = Integer.valueOf(attrCable[2]); //温度集合 String[] attr = lastData.getPoints().split(","); //根号 int cableNum = 1, position = 0; String curTemp; List temperature = new ArrayList<>(); int x = 0, y = 0, z = 0; for (int i = 0; i < attr.length; i++) { position = i; z = i % cableZ + 1; x = i / (cableZ * cableY); y = x * (cableZ * cableY); y = (i - y) / cableZ; // 倒转X轴 x = cableX - 1 - x; //根号 cableNum = (i / cableZ) + 1; curTemp = attr[i]; //判断最大 if (curTemp.equals(result.getMaxTemperature())) { result.setMaxX(x+""); result.setMaxY(y+""); result.setMaxZ(position+""); } //判断最小 if (curTemp.equals(result.getMinTemperature())) { result.setMinX(x+""); result.setMinY(y+""); result.setMinZ(position+""); } temperature.add(new KafkaGrainDataDetail1(cableNum + "", z + "", curTemp, position + "", x+"", y+"")); } //粮温信息 JSONObject trhInfo = new JSONObject(); // TRHInfo trhInfo = new TRHInfo(); trhInfo.put("temperature",temperature); //仓温度信息 KafkaGrainTH grainTH = new KafkaGrainTH(); grainTH.setHumidity(lastData.getHumidityIn() + ""); grainTH.setTemperature(lastData.getTempIn() + ""); grainTH.setAirHumidity(lastData.getHumidityOut() + ""); grainTH.setAirTemperature(lastData.getTempOut() + ""); List temperatureAndhumidity = new ArrayList<>(); temperatureAndhumidity.add(grainTH); trhInfo.put("temperatureAndhumidity",temperatureAndhumidity); //trhInfo.put("temperatureAndhumidity",grainTH); JSONObject params = new JSONObject(); params.put("TRHInfo", trhInfo); result.setParams(params); return result; } /** * 针对筒仓 TODO ----- * * @param lastData * @param device * @return */ private KafaGrainData lastData2PushData2(Fz40Grain lastData, GatewayDevice device) { return null; } private int getCurCir(int curRoot, String[] cableRuleAtt) { int sum = 0; for (int i = 0; i < cableRuleAtt.length; i++) { sum += Integer.valueOf(cableRuleAtt[i]); if (curRoot <= sum) return i + 1; } return 1; } }