| | |
| | | package com.fzzy.gateway.hx2023.service; |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.fzzy.api.data.DepotType; |
| | | import com.fzzy.api.data.GatewayDeviceType; |
| | | import com.fzzy.api.data.PushProtocol; |
| | | import com.fzzy.api.utils.DateUtil; |
| | | import com.fzzy.api.utils.NumberUtil; |
| | | import com.fzzy.api.utils.RedisConst; |
| | | import com.fzzy.api.utils.RedisUtil; |
| | | import com.fzzy.async.fzzy40.Fzzy40CommonService; |
| | | import com.fzzy.async.fzzy40.entity.Fz40Grain; |
| | | import com.fzzy.data.ConfigData; |
| | | import com.fzzy.gateway.GatewayUtils; |
| | | import com.fzzy.gateway.api.GatewayDeviceTestService; |
| | | import com.fzzy.gateway.data.BaseReqData; |
| | | import com.fzzy.gateway.data.BaseResp; |
| | | import com.fzzy.gateway.data.GrainCableData; |
| | | import com.fzzy.gateway.data.WeatherWebDto; |
| | | import com.fzzy.gateway.entity.GatewayDevice; |
| | | import com.fzzy.gateway.hx2023.ScConstant; |
| | | import com.fzzy.gateway.hx2023.data.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.apache.commons.lang.time.DateFormatUtils; |
| | | import org.apache.commons.lang3.RandomUtils; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | |
| | | @Resource |
| | | private Fzzy40CommonService fzzy40CommonService; |
| | | |
| | | @Resource |
| | | private DeviceReportServiceImpl deviceReportService; |
| | | |
| | | @Resource |
| | | private ConfigData configData; |
| | | @Resource |
| | | private RedisUtil redisUtil; |
| | | |
| | | @Override |
| | | public String getProtocol() { |
| | | return PushProtocol.GATEWAY_SC_2023.getCode(); |
| | |
| | | |
| | | GatewayDevice device = reqData.getDevice(); |
| | | |
| | | if (StringUtils.isEmpty(device.getCableCir())) { |
| | | if (DepotType.TYPE_02.getCode().equals(device.getDepotType())) { |
| | | return getGrainTest2(reqData, device); |
| | | } else if (DepotType.TYPE_04.getCode().equals(device.getDepotType())) { |
| | | return getGrainTest2(reqData, device); |
| | | } else if (DepotType.TYPE_03.getCode().equals(device.getDepotType())) { |
| | | return getGrainTest3(reqData, device); |
| | | } else { |
| | | return getGrainTest1(reqData, device); |
| | | } |
| | | |
| | | } |
| | | |
| | | private BaseResp getGrainTest2(BaseReqData reqData, GatewayDevice device) { |
| | | BaseResp resp = new BaseResp(); |
| | | resp.setCode(500); |
| | | resp.setMsg("没有匹配到规则"); |
| | | resp.setMsg("筒仓测试暂未实现"); |
| | | return resp; |
| | | } |
| | | |
| | | private BaseResp getGrainTest3(BaseReqData reqData, GatewayDevice device) { |
| | | BaseResp resp = new BaseResp(); |
| | | |
| | | GrainCableData cableData = GatewayUtils.getCableData(device); |
| | | int cableZ = cableData.getCableZ(); |
| | | int cableY = cableData.getCableY(); |
| | | int sumNum = cableData.getSumNum(); |
| | | |
| | | |
| | | WeatherWebDto weather = WeatherWebDto.contextMap.get("default"); |
| | | double tMIn = 10, tMax = 15; |
| | | if (null != weather) { |
| | | double tOut = Double.valueOf(weather.getTem()); |
| | | tMIn = tOut - 5; |
| | | tMax = tOut; |
| | | } |
| | | if (tMIn < 10) tMIn = 10; |
| | | if (tMIn > 20) tMIn = 20; |
| | | if (tMax < 15) tMax = 15; |
| | | if (tMax > 25) tMax = 25; |
| | | |
| | | //数据封装 |
| | | GrainData grain = new GrainData(); |
| | | grain.setMessageId(ScConstant.getMessageId()); |
| | | grain.setDeviceId(device.getDeviceId()); |
| | | grain.setTimestamp(System.currentTimeMillis() + ""); |
| | | grain.setMessageType("REPORT_PROPERTY"); |
| | | |
| | | ClientHeaders headers = new ClientHeaders(); |
| | | headers.setDeviceName(device.getDeviceName()); |
| | | headers.setProductId(device.getProductId()); |
| | | headers.setOrgId(device.getOrgId()); |
| | | headers.setMsgId(reqData.getMessageId()); |
| | | grain.setHeaders(headers); |
| | | |
| | | GrainOutPut outPut = new GrainOutPut(); |
| | | |
| | | List<GrainTemp> temperature = new ArrayList<>(); |
| | | //根号 |
| | | int cableNum = 1, position = 0; |
| | | |
| | | double curTemp = tMIn; |
| | | double randomNumber = tMIn; |
| | | int x = 0, y = 0, z = 0; |
| | | for (int i = 0; i < sumNum; i++) { |
| | | |
| | | randomNumber = Math.random() * (tMax - tMIn + 1) + tMIn; |
| | | curTemp = NumberUtil.keepPrecision(randomNumber, 1); |
| | | position = i; |
| | | |
| | | z = i % cableZ + 1; |
| | | x = i / (cableZ * cableY); |
| | | y = x * (cableZ * cableY); |
| | | y = (i - y) / cableZ; |
| | | |
| | | //根号 |
| | | cableNum = (i / cableZ) + 1; |
| | | |
| | | temperature.add(new GrainTemp(cableNum + "", z + "", curTemp + "", position + "")); |
| | | } |
| | | |
| | | outPut.setTemperature(temperature); |
| | | outPut.setAvgTemperature(NumberUtil.keepPrecision((tMax + tMIn) / 2, 1) + ""); |
| | | outPut.setMinTemperature(tMax + ""); |
| | | outPut.setMaxTemperature(tMIn + ""); |
| | | |
| | | |
| | | JSONObject properties = new JSONObject(); |
| | | properties.put("data", outPut); |
| | | properties.put("timestamp", grain.getTimestamp()); |
| | | |
| | | String height = this.getCacheHeight(device); |
| | | if (StringUtils.isEmpty(height)) height = "1.0"; |
| | | properties.put("liquidHeight", height); |
| | | |
| | | |
| | | grain.setProperties(properties); |
| | | |
| | | //封装好的数据 |
| | | log.info("---油罐仓信息封装完成----开始执行推送"); |
| | | |
| | | |
| | | return new BaseResp(JSONObject.toJSONString(grain)); |
| | | } |
| | | |
| | | /** |
| | | * 从REDIS中获取液位高度信息 |
| | | * |
| | | * @param device |
| | | * @return |
| | | */ |
| | | private String getCacheHeight(GatewayDevice device) { |
| | | //给其他软使用 |
| | | String key = RedisConst.KEY_DEPOT_HEIGHT + ":" + configData.getCompanyId() + "_" + device.getDepotIdSys(); |
| | | return (String) redisUtil.get(key); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | if (StringUtils.isEmpty(depotIdSys)) { |
| | | log.error("--------设备--{}-未配置系统相关仓库编码,无法执行当前操作", device.getDeviceName()); |
| | | return new BaseResp(BaseResp.CODE_50, "未配置系统相关仓库编码,无法执行当前操作"); |
| | | return new BaseResp(BaseResp.CODE_500, "未配置系统相关仓库编码,无法执行当前操作"); |
| | | } |
| | | |
| | | List<Fz40Grain> listGrain = fzzy40CommonService.listGrain(depotIdSys, start, end); |
| | | if (null == listGrain || listGrain.isEmpty()) { |
| | | log.error("---------设备-{}-系统仓库编码-{}-未同步到粮情信息,请确认当前条件下是否有数据", device.getDeviceName(), device.getDepotIdSys()); |
| | | return new BaseResp(BaseResp.CODE_50, "未同步到粮情信息,请确认当前条件下是否有数据"); |
| | | return new BaseResp(BaseResp.CODE_500, "未同步到粮情信息,请确认当前条件下是否有数据"); |
| | | } |
| | | |
| | | //获取第一条数据执行推送 |
| | | Fz40Grain lastData = listGrain.get(0); |
| | | KafaGrainData pushData = this.lastData2PushData(lastData, device); |
| | | |
| | | return new BaseResp(JSONObject.toJSONString(pushData)); |
| | | log.info(lastData.toString()); |
| | | return deviceReportService.grainData2GatewayApiInfo(lastData, device); |
| | | } |
| | | |
| | | /** |
| | | * 将粮情数据转换为推送需要的数据格式 |
| | | * |
| | | * @param grainData |
| | | * @return |
| | | */ |
| | | private KafaGrainData lastData2PushData(Fz40Grain grainData, GatewayDevice device) { |
| | | KafaGrainData result = new KafaGrainData(); |
| | | |
| | | result.setMessageId(ScConstant.getMessageId()); |
| | | result.setMessgeId(result.getMessageId()); |
| | | result.setDeviceID(device.getDeviceId()); |
| | | result.setAvgTemperature(grainData.getTempAve() + ""); |
| | | result.setMinTemperature(grainData.getTempMin() + ""); |
| | | result.setMaxTemperature(grainData.getTempMax() + ""); |
| | | result.setCollectTime(DateFormatUtils.format(grainData.getReceiveDate(), "yyyy-MM-dd HH:mm:ss")); |
| | | |
| | | //层-行-列 |
| | | String[] attrCable = grainData.getCable().split("-"); |
| | | if (StringUtils.isNotEmpty(grainData.getCableCir())) { |
| | | return lastData2PushData2(grainData, device); |
| | | } |
| | | |
| | | //层行列 |
| | | int cableZ = Integer.valueOf(attrCable[0]); |
| | | int cableY = Integer.valueOf(attrCable[1]); |
| | | int cableX = Integer.valueOf(attrCable[2]); |
| | | |
| | | //温度集合 |
| | | String[] attr = grainData.getPoints().split(","); |
| | | |
| | | //根号 |
| | | int cableNum = 1, position = 0; |
| | | String curTemp; |
| | | List<KafkaGrainDataDetail1> 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]; |
| | | |
| | | |
| | | //如果是异常值,执行调整数据 TODO |
| | | if (Double.valueOf(curTemp) < -99.9) { |
| | | |
| | | curTemp = grainData.getTempAve() + ""; |
| | | |
| | | } else { |
| | | //判断最大 |
| | | 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(grainData.getHumidityIn() + ""); |
| | | grainTH.setTemperature(grainData.getTempIn() + ""); |
| | | grainTH.setAirHumidity(grainData.getHumidityOut() + ""); |
| | | grainTH.setAirTemperature(grainData.getTempOut() + ""); |
| | | |
| | | List<KafkaGrainTH> 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; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public BaseResp testWeight(BaseReqData reqData) { |
| | |
| | | weightInfo.setNetWeight(reqData.getWeight()); |
| | | weightInfo.setNetWeight(reqData.getWeight()); |
| | | weightInfo.setWeightUnit("KG"); |
| | | |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("weightInfo", JSONObject.toJSONString(weightInfo)); |
| | | jsonObject.put("weightInfo", weightInfo); |
| | | |
| | | packet.setProperties(jsonObject); |
| | | |