package com.ld.igds.protocol.modbus.command;
|
|
import com.ld.igds.common.CoreDeviceService;
|
import com.ld.igds.constant.BizType;
|
import com.ld.igds.gas.CoreGasService;
|
import com.ld.igds.io.constant.OrderRespEnum;
|
import com.ld.igds.io.notify.NotifyWebInvoker;
|
import com.ld.igds.io.request.CheckGasRequest;
|
import com.ld.igds.io.request.DeviceControlRequest;
|
import com.ld.igds.models.Gas;
|
import com.ld.igds.protocol.modbus.ServerUtil;
|
import com.ld.igds.protocol.modbus.data.ModbusGasResult;
|
import com.ld.igds.util.ContextUtil;
|
import com.ld.igds.util.NumberUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.text.DecimalFormat;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 解析
|
*/
|
@Slf4j
|
@Component
|
public class AnalysisService {
|
|
@Resource
|
private CoreDeviceService coreDeviceService;
|
@Resource
|
private NotifyWebInvoker notifyInvoker;
|
@Autowired
|
private CoreGasService gasService;
|
|
|
/**
|
* 异步更新设备状态,
|
*
|
* @param request
|
* @param sleepTime 延迟执行时间=毫秒值,如果==0 ,表示不延迟
|
*/
|
@Async
|
public void analysisDevice(DeviceControlRequest request, long sleepTime) {
|
|
try {
|
if (sleepTime > 0) {
|
Thread.sleep(sleepTime);
|
}
|
|
coreDeviceService.updateStatus(request.getCompanyId(), request.getSerId(), ServerUtil.getStatusMap());
|
|
notifyInvoker.notifyAnalysisStatusSuccess(request.getCompanyId(), request.getSerId(), OrderRespEnum.MSG_SUCCESS, "设备状态查询成功并完成解析!");
|
|
} catch (Exception e) {
|
log.error("---MODBUS-TCP-状态解析异常{}", e);
|
}
|
}
|
|
|
/**
|
* 解析气体检测结果
|
*
|
* @param request
|
* @param results
|
*/
|
public void analysisGas(CheckGasRequest request, List<ModbusGasResult> results) {
|
|
log.debug("----------开始执行气体结果解析----{}", request.getDepotId());
|
|
String batchId = ContextUtil.getDefaultBatchId();
|
//主体信息
|
Gas gas = new Gas(batchId, request.getCompanyId(), request.getDepotId(), new Date());
|
gas.setCheckNum(results.size());
|
gas.setGasEnd(results.size());
|
gas.setGasStart(1);
|
gas.setReceiveDate(new Date());
|
|
int sumNum = results.size();
|
double co2, o2, ph3, n2;
|
DecimalFormat df = new DecimalFormat("#0.00");
|
double sumO2 = 0.0, sumCo2 = 0.0, sumPh3 = 0.0, sumN2 = 0.0;
|
int num = 1;
|
StringBuffer sb = new StringBuffer();
|
for (ModbusGasResult gasResult : results) {
|
//二氧化碳,单位:PPM,直接使用
|
co2 = gasResult.getCo2().doubleValue();
|
//氧气,除以10,单位:百分比
|
o2 = Double.valueOf(df.format(gasResult.getO2().doubleValue()*0.1));
|
//磷化氢,单位:PPM,直接使用
|
ph3 = gasResult.getPh3().doubleValue();
|
n2 = Double.valueOf(df.format(99.9 - o2));;
|
|
if(num == 1){
|
gas.setPerCo2Min(co2);
|
gas.setPerO2Min(o2);
|
gas.setPerPh3Min(ph3);
|
gas.setPerN2Min(n2);
|
}
|
num ++;
|
if (gas.getPerCo2Max() < co2) {
|
gas.setPerCo2Max(co2);
|
}
|
if (gas.getPerCo2Min() > co2) {
|
gas.setPerCo2Min(co2);
|
}
|
if (gas.getPerO2Max() < o2) {
|
gas.setPerO2Max(o2);
|
}
|
if (gas.getPerO2Min() > o2) {
|
gas.setPerO2Min(o2);
|
}
|
if (gas.getPerPh3Max() < ph3) {
|
gas.setPerPh3Max(ph3);
|
}
|
if (gas.getPerPh3Min() > ph3) {
|
gas.setPerPh3Min(ph3);
|
}
|
if (gas.getPerN2Max() < n2) {
|
gas.setPerN2Max(n2);
|
}
|
if (gas.getPerN2Min() > n2) {
|
gas.setPerN2Min(n2);
|
}
|
|
//固定为:passCode,co2,o2,ph3,n2;passCode,co2,o2,ph3,n2;"
|
sb.append(gasResult.getPasscode());
|
sb.append(",");
|
sb.append(co2);
|
sb.append(",");
|
sb.append(o2);
|
sb.append(",");
|
sb.append(ph3);
|
sb.append(",");
|
sb.append(n2);
|
sb.append(";");
|
|
sumCo2 += co2;
|
sumO2 += o2;
|
sumPh3 += ph3;
|
sumN2 += n2;
|
|
}
|
gas.setPoints(sb.toString());
|
gas.setPerCo2(NumberUtil.keepPrecision(sumCo2 / sumNum, 2));
|
gas.setPerO2(NumberUtil.keepPrecision(sumO2 / sumNum, 2));
|
gas.setPerN2(NumberUtil.keepPrecision(sumN2 / sumNum, 2));
|
gas.setPerPh3(NumberUtil.keepPrecision(sumPh3 / sumNum, 2));
|
|
gasService.saveOrUpdateData(gas);
|
|
// 调用通知前端
|
notifyInvoker.notifyWeb(gas.getCompanyId(), OrderRespEnum.MSG_SUCCESS, BizType.GAS, request.getDepotId() + " 气体检测:结果返回成功.");
|
log.info("控制柜----->>>平台:气体解析完成-仓库={}", request.getDepotId());
|
}
|
}
|