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.GateWayTestParam;
|
import com.fzzy.gateway.entity.GatewayDevice;
|
import com.fzzy.gateway.hx2023.ScConstant;
|
import com.fzzy.gateway.hx2023.data.*;
|
import com.fzzy.gateway.service.repository.GatewayDeviceRep;
|
|
import com.fzzy.mqtt.MqttProviderConfig;
|
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.*;
|
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;
|
@Resource
|
private MqttProviderConfig providerClient;
|
|
/**
|
* gatewayDeviceService#listAll
|
*
|
* @return
|
*/
|
@DataProvider
|
public List<GatewayDevice> listAll() {
|
Sort sort = new Sort(Sort.Direction.ASC, "deviceId");
|
return gatewayDeviceRep.findAll(sort);
|
}
|
/**
|
* gatewayDeviceService#getQuery
|
* @return
|
*/
|
@DataProvider
|
public GateWayTestParam getQuery() {
|
GateWayTestParam param = new GateWayTestParam();
|
param.setDayTime(new Date());
|
param.setCarNumber("川A12345");
|
param.setEnd(new Date());
|
param.setStart(new Date());
|
param.setWeight(25000.00);
|
return param;
|
}
|
/**
|
* gatewayDeviceService#updateSave
|
*
|
* @param data
|
*/
|
@DataResolver
|
public void updateSave(GatewayDevice data) {
|
GatewayDevice data2 = new GatewayDevice();
|
BeanUtils.copyProperties(data, data2);
|
|
if (null == data2.getDeviceSn()) {
|
if (null != data2.getIp()) {
|
data.setDeviceSn(data2.getIp());
|
} else {
|
data.setDeviceSn(data2.getDeviceId());
|
}
|
}
|
|
if (null == data2.getId()) {
|
data2.setId(ContextUtil.getUUID());
|
gatewayDeviceRep.save(data2);
|
} else {
|
gatewayDeviceRep.save(data2);
|
}
|
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;
|
}
|
|
|
public void flushCache() {
|
List<GatewayDevice> list = listAll();
|
if (null == list || list.isEmpty()) return;
|
for (GatewayDevice device : list) {
|
GatewayUtils.add2Cache(device);
|
}
|
}
|
|
|
/**
|
* gatewayDeviceService#ajaxTestWeight
|
* 地磅推送测试
|
*
|
* @param parameter
|
* @return
|
*/
|
@Expose
|
public String ajaxTestWeight(Map<String ,Object> parameter) {
|
double weigh = (double) parameter.get("weight");
|
//sdouble weigh = Math.random() * (35000 - 16000 + 1) + 16000;
|
List<GatewayDevice> devices = listAll();
|
if (devices == null || devices.size() <= 0) {
|
return "没有设备";
|
}
|
List<GatewayDevice> 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(Map<String ,Object> parameter) {
|
String carNumber = (String) parameter.get("carNumber");
|
//String carNumber = "川A12345";
|
List<GatewayDevice> devices = listAll();
|
if (devices == null || devices.size() <= 0) {
|
return "没有设备";
|
}
|
List<GatewayDevice> 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());
|
packet.setMessageId(System.currentTimeMillis() + "");
|
//设置信息主体
|
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(Map<String ,Object> parameter) {
|
|
//获取设备配置,只针对粮情设备进行执行
|
|
List<GatewayDevice> 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<GatewayDevice> list, Date start, Date end) {
|
|
String depotIdSys;
|
List<Fz40Grain> 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<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];
|
|
|
//判断最大
|
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<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;
|
}
|
|
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;
|
}
|
|
}
|