package com.ld.igds.io.impl; import com.ld.igds.common.CoreCommonService; import com.ld.igds.constant.DepotType; import com.ld.igds.io.RemoteGrainService; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.io.constant.ProtocolEnum; import com.ld.igds.io.request.CheckGrainRequest; import com.ld.igds.io.response.GrainResponse; import com.ld.igds.models.DepotConf; import com.ld.igds.models.DicSysConf; import com.ld.igds.models.Grain; import com.ld.igds.models.WeatherInfo; import com.ld.igds.util.ContextUtil; import com.ld.igds.util.NumberUtil; import com.ld.igds.warn.WarnUtils; import com.ld.igds.weather.CoreWeatherService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; /** * 默认实现类,直接返回 */ @Slf4j @Component public class DefaultRemoteGrainImpl implements RemoteGrainService { @Autowired private CoreCommonService commonService; @Autowired private CoreWeatherService weatherService; @Autowired private WarnUtils warnUtils; @Override public String getProtocol() { return ProtocolEnum.TCP_DEFAULT.getCode(); } /** * 演示实现,根据当前库区的气象信息生成,一套演示数据。 * * @param request * @return */ @Override public GrainResponse checkGrain(CheckGrainRequest request) { WeatherInfo weatherInfo = weatherService.getCacheWeather(request.getCompanyId()); if (null == weatherInfo) { log.error("平台------>>>>控制柜:粮情检测-失败{}", "系统没有获取到当前库区气象信息。"); return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "命令发送异常:系统没有获取到当前库区气象信息。"); } DepotConf depotConf = commonService.getCacheDepotConf( request.getCompanyId(), request.getDepotId()); // 首先获取到系统参数,判断是否需要批次自动优化 DicSysConf sysConf = commonService.getCacheSysConf(request.getCompanyId()); List listPoint = new ArrayList<>(); String[] cableRule = depotConf.getCableRule().split("-"); int lay = 0, row = 0, col = 0, sumNum = 0; if (DepotType.TYPE_01.getCode().equals(depotConf.getDepotType())) { lay = Integer.valueOf(cableRule[0]); row = Integer.valueOf(cableRule[1]); col = Integer.valueOf(cableRule[2]); sumNum = lay * row * col; } else { String[] cableCir = depotConf.getCableCir().split("-"); for (int i = 0; i < cableRule.length; i++) { sumNum += Integer.valueOf(cableRule[i]) * Integer.valueOf(cableCir[i]); } } //模拟数据,规则在温湿度的基础上下浮动2度随机取值。 double tOut = Double.valueOf(weatherInfo.getTemp()); double tMIn = tOut - 2; double tMax = tOut + 2; double sumTemp = 0.0; double temp = tOut; for (int i = 0; i < sumNum; i++) { temp = NumberUtil.keepPrecision(RandomUtils.nextDouble(tMIn, tMax), 1); listPoint.add(temp); sumTemp += temp; } double hOut = Integer.valueOf(weatherInfo.getHumidity().replace("%", "")); Grain grain = new Grain(); grain.setBatchId(ContextUtil.getBatchIdByFireq(depotConf.getGrainFreq())); grain.setReceiveDate(new Date()); grain.setCable(request.getCableRule()); grain.setCableCir(depotConf.getCableCir()); grain.setCheckUser(ContextUtil.getLoginUserCName()); grain.setDepotId(request.getDepotId()); grain.setCompanyId(depotConf.getCompanyId()); grain.setHumidityIn(NumberUtil.keepPrecision(RandomUtils.nextDouble(hOut - 2, hOut + 2), 1)); grain.setHumidityOut(hOut); grain.setTempIn(NumberUtil.keepPrecision(RandomUtils.nextDouble(tOut - 2, tOut + 2), 1)); grain.setTempOut(tOut); grain.setTempAve(NumberUtil.keepPrecision(sumTemp / sumNum, 1)); grain.setTempMax(tMax); grain.setTempMin(tMIn); grain.setDeptId(request.getDeptId()); grain.setRemark("粮情正常"); grain.setPoints(StringUtils.join(listPoint, ",")); if (null != depotConf.getTempMax() && tMax > depotConf.getTempMax()) { grain.setRemark("仓库配置高温警告值:" + depotConf.getTempMax() + ",当前检测高温值:" + tMax); warnUtils.addGrainWarn(depotConf, grain); } // 独立启动一个子现在,延迟之后自动返回 FutureTask futureTask = new FutureTask<>(new DefaultAnalysisGrainTask(grain, depotConf, sysConf,request.getOrderId())); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(futureTask); executorService.shutdown(); return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "粮情粮情发送成功!"); } }