package com.fzzy.gateway.service; 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.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.KafaGrainData; import com.fzzy.gateway.hx2023.data.KafkaGrainDataDetail; import com.fzzy.gateway.hx2023.data.KafkaGrainTH; import com.fzzy.gateway.hx2023.data.TRHInfo; import com.fzzy.gateway.service.repository.GatewayDeviceRep; 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; @Slf4j @Component public class GatewayDeviceService { @Resource private GatewayDeviceRep gatewayDeviceRep; @Resource private Fzzy40CommonService fzzy40CommonService; @Resource private GatewayRemoteManager gatewayRemoteManager; /** * 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#ajaxTestGrain * 粮情推送测试 * * @param parameter * @return */ @Expose public String ajaxTestGrain(Map parameter) { //获取设备配置,只针对粮情设备进行执行 List list = this.listAll(); if (null == list || list.isEmpty()) { return "ERROR:为获取到系统中设备配置,取消执行"; } Date dayTime = (Date) parameter.get("dayTime"); 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.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 KafkaGrainDataDetail(cableNum + "", z + "", curTemp, position + "", x, y)); } //粮温信息 TRHInfo trhInfo = new TRHInfo(); trhInfo.setTemperature(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.setTemperatureAndhumidity(temperatureAndhumidity); 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; } }