From 87b161325d9186d8211a7d472ed04fa279f33954 Mon Sep 17 00:00:00 2001
From: zhuguifei <zhuguifei>
Date: 星期五, 14 十一月 2025 16:12:43 +0800
Subject: [PATCH] Merge branch 'master' of http://lanpucloud.cn:1111/r/herb
---
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java | 821 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 703 insertions(+), 118 deletions(-)
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
old mode 100644
new mode 100755
index 1c5b65d..648ddcc
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
@@ -1,28 +1,47 @@
package org.jeecg.modules.dry.service.impl;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.mina.core.session.IoSession;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.config.TenantContext;
+import org.jeecg.common.constant.CommonCacheConstant;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.constant.MqttConstant;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.dry.common.CacheConstants;
import org.jeecg.modules.dry.entity.*;
+import org.jeecg.modules.dry.mqtt.MqMessage;
+import org.jeecg.modules.dry.mqtt.MqttConfig;
+import org.jeecg.modules.dry.mqtt.MqttUtil;
import org.jeecg.modules.dry.service.*;
-import org.jeecg.modules.dry.vo.DryOrderTrendVo;
-import org.jeecg.modules.dry.vo.DryOrderVo;
-import org.jeecg.modules.dry.vo.RealTimeDataVo;
-import org.jetbrains.annotations.NotNull;
+import org.jeecg.modules.dry.socket.ServerHandler;
+import org.jeecg.modules.dry.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Collectors;
+
@Slf4j
@Service
public class DryRealTimeDataServiceImpl implements IDryRealTimeDataService {
@@ -35,7 +54,13 @@
private IDryHerbService herbService;
@Autowired
+ private IDryHerbFormulaService dryHerbFormulaService;
+
+ @Autowired
private IDryEquipmentService equipmentService;
+
+ @Autowired
+ private IDryEqpTypeService dryEqpTypeService;
@Autowired
private RedisUtil redisUtil;
@@ -43,28 +68,70 @@
@Autowired
private IDryProdRecordService prodRecordService;
+ @Autowired
+ private IDryFaultRecordService faultRecordService;
+
+
+ private String token;
+
+ @Value(value = "${jeecg.mqtt.role}")
+ private String role;
+
+
+ @Autowired
+ private MqttUtil mqttUtil;
+
+ @Value(value = "${jeecg.mqtt.enable}")
+ private boolean mqttEnable;
+
+ private static final ConcurrentHashMap<String, ReentrantLock> tenantLocks = new ConcurrentHashMap<>();
+
+ private ReentrantLock getLock(String tenantId, String type) {
+ String lockKey = tenantId + ":" + type;
+ return tenantLocks.computeIfAbsent(lockKey, k -> new ReentrantLock());
+ }
+
+ public String getTemporaryToken() {
+ if (token == null) {
+ RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);
+ // 妯℃嫙鐧诲綍鐢熸垚Token
+ token = JwtUtil.sign("admin", "b668043e3ea4bc2d");
+ // 璁剧疆Token缂撳瓨鏈夋晥鏃堕棿涓� 5 鍒嗛挓
+ redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+ redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 5 * 60 * 1000);
+ }
+
+ return token;
+ }
+
@Override
@Transactional
public Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo) {
- TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
- log.info("瀹炴椂鏁版嵁锛�"+realTimeDataVo.toString());
+ TenantContext.setTenant(realTimeDataVo.getTenantid() + "");
+// log.info("瀹炴椂鏁版嵁锛�" + realTimeDataVo.toString());
+
// 1 鏌ヨ鎴栧垱寤哄伐鍗�
// 1.1 浠巖edis鍙栧嚭宸ュ崟缂撳瓨
DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
- realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid());
+ realTimeDataVo.getTenantid() + "_" + realTimeDataVo.getMachineid());
// 1.2 濡傛灉鏈夌紦瀛樿褰�
- if(orderVo != null && orderVo.getCode().equals(realTimeDataVo.getWorkorder())) {
+ if (orderVo != null && orderVo.getCode().equals(realTimeDataVo.getWorkorder())) {
- // 1.3 娌℃湁缂撳瓨璁板綍鍐嶆煡璇㈡暟鎹簱
+ // 1.3 娌℃湁缂撳瓨璁板綍鍐嶆煡璇㈡暟鎹簱
} else {
// 鏍规嵁绉熸埛id鍜屽伐鍗曞彿鏌ヨ鏁版嵁搴撴槸鍚︽湁璁板綍锛屾湁鍒欒繑鍥烇紝娌℃湁鍒欐柊澧炰竴鏉″啀杩斿洖
orderVo = getOrSaveDryOrderVoDB(realTimeDataVo);
+ }
+ if (orderVo == null) {
+ log.error("宸ュ崟涓嶅瓨鍦紝宸ュ崟鍙凤細" + realTimeDataVo.getWorkorder() + ",璁惧锛�" + realTimeDataVo.getMachineid() + ",鑽潗锛�" + realTimeDataVo.getName());
+ return Result.error("宸ュ崟涓嶅瓨鍦�");
}
// 2 鏇存柊宸ュ崟瀹炴椂鏁版嵁
// 2.1 灏嗗伐鍗曚腑鐨勬暟鎹浛鎹负鏈�鏂版暟鎹�
realTimeDataVo.setOrderId(orderVo.getId());
+
orderVo.setInitial(realTimeDataVo.getMoisture1());
orderVo.setDryTime(realTimeDataVo.getTime3());
orderVo.setDelay(realTimeDataVo.getDelay());
@@ -82,78 +149,183 @@
orderVo.setEnvTemp(realTimeDataVo.getEnvtemp());
orderVo.setRemain(realTimeDataVo.getAi_total_time());
orderVo.setCurRemain(realTimeDataVo.getAi_time());
- orderVo.setState_fan(realTimeDataVo.getState_fan());
- orderVo.setState_roller(realTimeDataVo.getState_roller());
- orderVo.setState_auto(realTimeDataVo.getState_auto());
- orderVo.setState_windbox(realTimeDataVo.getState_windbox());
- orderVo.setState_valve(realTimeDataVo.getState_valve());
orderVo.setOrderStatus(realTimeDataVo.getWorkorder_status());
+ orderVo.setEqp_status(realTimeDataVo.getEqp_status());
+// orderVo.setEqp_state(realTimeDataVo.getEqp_state());
+ orderVo.setWarning(realTimeDataVo.getEqp_warning());
+ orderVo.setFault(realTimeDataVo.getEqp_fault());
+ orderVo.setLevel(realTimeDataVo.getLevel());
+
+
DryOrderTrendVo trendVo = new DryOrderTrendVo(realTimeDataVo);
// 2.2 淇濆瓨宸ュ崟鍚按鐜囧彉鍖� 鎴� 閲嶉噺鍙樺寲
-
- if(realTimeDataVo.getReport_flag()) {
- DryProdRecord prodRecord = new DryProdRecord();
- prodRecord.setReportHeadName(realTimeDataVo.getReport_head_name());
- prodRecord.setReportHeadBatch(realTimeDataVo.getReport_head_batch());
- prodRecord.setReportHeadNum(realTimeDataVo.getReport_head_num());
- prodRecord.setReportHeadMachine(realTimeDataVo.getReport_head_machine());
- prodRecord.setReportHeadAccepter(realTimeDataVo.getReport_head_accepter());
- prodRecord.setReportHeadDate(realTimeDataVo.getReport_head_date());
- prodRecord.setReportHeadLeader(realTimeDataVo.getReport_head_leader());
- prodRecord.setReportHeadTecher(realTimeDataVo.getReport_head_techer());
-
- prodRecord.setReportCheckField(realTimeDataVo.getReport_check_field()?1:0);
- prodRecord.setReportCheckFile(realTimeDataVo.getReport_check_file()?1:0);
- prodRecord.setReportCheckTag(realTimeDataVo.getReport_check_tag()?1:0);
- prodRecord.setReportCheckTool(realTimeDataVo.getReport_check_tool()?1:0);
- prodRecord.setReportCheckMan(realTimeDataVo.getReport_check_man());
- prodRecord.setReportCheckStatus(realTimeDataVo.getReport_check_status()?1:0);
- prodRecord.setReportCheckQa(realTimeDataVo.getReport_check_qa());
- prodRecord.setReportCheckRecord(realTimeDataVo.getReport_check_record());
-
- prodRecord.setReportProductView(realTimeDataVo.getReport_product_view()?1:0);
- prodRecord.setReportProductWind(realTimeDataVo.getReport_product_wind()?1:0);
- prodRecord.setReportProductSun(realTimeDataVo.getReport_product_sun()?1:0);
- prodRecord.setReportProductLowDry(realTimeDataVo.getReport_product_low_dry()?1:0);
- prodRecord.setReportProductDry(realTimeDataVo.getReport_product_dry()?1:0);
- prodRecord.setReportProductStart(realTimeDataVo.getReport_product_start());
- prodRecord.setReportProductEnd(realTimeDataVo.getReport_product_end());
- prodRecord.setReportProductTotal(realTimeDataVo.getReport_product_total());
- prodRecord.setReportProductCheck(realTimeDataVo.getReport_product_check()?1:0);
- prodRecord.setReportProductMan1(realTimeDataVo.getReport_product_man1());
- prodRecord.setReportProductMan2(realTimeDataVo.getReport_product_man2());
- prodRecord.setReportProductWeight(realTimeDataVo.getReport_product_weight());
- prodRecord.setReportProductWaste(realTimeDataVo.getReport_product_waste());
- prodRecord.setReportProductUse(realTimeDataVo.getReport_product_use());
- prodRecord.setReportProductQa(realTimeDataVo.getReport_product_qa());
-
- prodRecord.setReportCleanMachine(realTimeDataVo.getReport_clean_machine()?1:0);
- prodRecord.setReportCleanWaste(realTimeDataVo.getReport_clean_waste()?1:0);
- prodRecord.setReportCleanTool(realTimeDataVo.getReport_clean_tool()?1:0);
- prodRecord.setReportCleanDoor(realTimeDataVo.getReport_clean_door()?1:0);
- prodRecord.setReportCleanBox(realTimeDataVo.getReport_clean_box()?1:0);
- prodRecord.setReportCleanRecord(realTimeDataVo.getReport_clean_record()?1:0);
- prodRecord.setReportCleanDate(realTimeDataVo.getReport_clean_date());
- prodRecord.setReportCleanMan(realTimeDataVo.getReport_clean_man());
- prodRecord.setReportCleanConfirm(realTimeDataVo.getReport_clean_confirm()?1:0);
- prodRecord.setReportCleanQa(realTimeDataVo.getReport_clean_qa());
- prodRecordService.save(prodRecord);
- }
saveOrderTrendVo(trendVo, orderVo);
orderVo.setTrendVo(trendVo);
orderVo.getBellowsTemp().put(realTimeDataVo.getTime3(), realTimeDataVo.getTemp2());
// 2.3 鏇存柊鍒皉edis缂撳瓨
redisUtil.hset(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
- realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid(),orderVo, 600000);
+ realTimeDataVo.getTenantid() + "_" + realTimeDataVo.getMachineid(), orderVo, 60 * 60);
return Result.ok();
}
+
+ @Override
+ @Transactional
+ public Result<?> realTimeDataHandle(RealTimeDataParentVo realTimeDataParentVo) {
+ TenantContext.setTenant(realTimeDataParentVo.getTenantid() + "");
+// log.info("瀹炴椂鏁版嵁锛�" + realTimeDataParentVo.toString());
+ if (realTimeDataParentVo.getRealTime() != null) {
+ RealTimeDataVo realTimeDataVo = realTimeDataParentVo.getRealTime();
+
+ // 1 鏌ヨ鎴栧垱寤哄伐鍗�
+ // 1.1 浠巖edis鍙栧嚭宸ュ崟缂撳瓨
+ DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
+ realTimeDataParentVo.getTenantid() + "_" + realTimeDataParentVo.getMachineid());
+ // 1.2 濡傛灉鏈夌紦瀛樿褰�
+ if (orderVo != null && orderVo.getCode() != null && orderVo.getCode().equals(realTimeDataParentVo.getWorkorder())) {
+
+ // 1.3 娌℃湁缂撳瓨璁板綍鍐嶆煡璇㈡暟鎹簱
+ } else {
+ // 鏍规嵁绉熸埛id鍜屽伐鍗曞彿鏌ヨ鏁版嵁搴撴槸鍚︽湁璁板綍锛屾湁鍒欒繑鍥烇紝娌℃湁鍒欐柊澧炰竴鏉″啀杩斿洖
+ realTimeDataVo.setWorkorder(realTimeDataParentVo.getWorkorder());
+ orderVo = getOrSaveDryOrderVoDB(realTimeDataVo);
+ }
+ if (orderVo == null) {
+ log.error("宸ュ崟涓嶅瓨鍦紝宸ュ崟鍙凤細" + realTimeDataParentVo.getWorkorder() + ",璁惧锛�" + realTimeDataParentVo.getMachineid() + ",鑽潗锛�" + realTimeDataVo.getName());
+ return Result.error("宸ュ崟涓嶅瓨鍦�");
+ }
+
+ // 2 鏇存柊宸ュ崟瀹炴椂鏁版嵁
+ // 2.1 灏嗗伐鍗曚腑鐨勬暟鎹浛鎹负鏈�鏂版暟鎹�
+ realTimeDataVo.setOrderId(orderVo.getId());
+ orderVo.setInitial(realTimeDataVo.getMoisture1());
+ orderVo.setDryTime(realTimeDataVo.getTime3());
+ orderVo.setDelay(realTimeDataVo.getDelay());
+ orderVo.setTurn(realTimeDataVo.getTurntime());
+ orderVo.setYield(realTimeDataVo.getWeight3());
+ orderVo.setStart(realTimeDataVo.getStart());
+ orderVo.setAuto(realTimeDataVo.getAuto());
+ orderVo.setPlcdisable(realTimeDataVo.getPlcdisable());
+ orderVo.setLowalarm(realTimeDataVo.getLowalarm());
+ orderVo.setWind(realTimeDataVo.getWind());
+ orderVo.setOriginWeight(realTimeDataVo.getWeight2());
+ orderVo.setWatt(realTimeDataVo.getWatt());
+ orderVo.setSteam(realTimeDataVo.getSteam());
+ orderVo.setEnvHum(realTimeDataVo.getEnvhum());
+ orderVo.setEnvTemp(realTimeDataVo.getEnvtemp());
+ orderVo.setRemain(realTimeDataVo.getAi_total_time());
+ orderVo.setCurRemain(realTimeDataVo.getAi_time());
+ orderVo.setOrderStatus(realTimeDataVo.getWorkorder_status());
+ orderVo.setEqp_status(realTimeDataVo.getEqp_status());
+// orderVo.setEqp_state(realTimeDataVo.getEqp_state());
+ if(realTimeDataParentVo.getFault()!=null && StringUtils.isNotEmpty(realTimeDataParentVo.getFault().getWarning())){
+ orderVo.setWarning(realTimeDataParentVo.getFault().getWarning());
+ }
+ if(realTimeDataParentVo.getFault()!=null && StringUtils.isNotEmpty(realTimeDataParentVo.getFault().getError())){
+ orderVo.setFault(realTimeDataParentVo.getFault().getError());
+ }
+ orderVo.setLevel(realTimeDataVo.getLevel());
+ DryOrderTrendVo trendVo = new DryOrderTrendVo(realTimeDataVo);
+ // 2.2 淇濆瓨宸ュ崟鍚按鐜囧彉鍖� 鎴� 閲嶉噺鍙樺寲
+
+ saveOrderTrendVo(trendVo, orderVo);
+ orderVo.setTrendVo(trendVo);
+ orderVo.getBellowsTemp().put(realTimeDataVo.getTime3(), realTimeDataVo.getTemp2());
+
+ if (realTimeDataParentVo.getFault() != null) {
+ if (realTimeDataParentVo.getFault().getError() != null) {
+ orderVo.setFault(realTimeDataParentVo.getFault().getError());
+ }
+ if (realTimeDataParentVo.getFault().getWarning() != null) {
+ orderVo.setWarning(realTimeDataParentVo.getFault().getWarning());
+ }
+ }
+
+ // 2.3 鏇存柊鍒皉edis缂撳瓨
+ redisUtil.hset(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
+ realTimeDataVo.getTenantid() + "_" + realTimeDataVo.getMachineid(), orderVo, 60 * 60);
+ }
+
+ if (realTimeDataParentVo.getReport() != null) {
+ saveReport(realTimeDataParentVo);
+ }
+
+ if (realTimeDataParentVo.getFault() != null) {
+ ReentrantLock faultLock = getLock(realTimeDataParentVo.getTenantid() + "", "fault");
+ faultLock.lock();
+ try {
+ fitFaultRecord(realTimeDataParentVo);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ faultLock.unlock();
+ }
+
+ }
+ return Result.ok();
+ }
+
+ private void saveReport(RealTimeDataParentVo realTimeDataParentVo) {
+ RealTimeReportVo report = realTimeDataParentVo.getReport();
+ if (report.getReport_flag()) {
+ DryProdRecord prodRecord = new DryProdRecord();
+ prodRecord.setReportHeadName(report.getReport_head_name());
+ prodRecord.setReportHeadBatch(report.getReport_head_batch());
+ prodRecord.setReportHeadNum(report.getReport_head_num());
+ prodRecord.setReportHeadMachine(report.getReport_head_machine());
+ prodRecord.setReportHeadAccepter(report.getReport_head_accepter());
+ prodRecord.setReportHeadDate(report.getReport_head_date());
+ prodRecord.setReportHeadLeader(report.getReport_head_leader());
+ prodRecord.setReportHeadTecher(report.getReport_head_techer());
+
+ prodRecord.setReportCheckField(report.getReport_check_field() ? 1 : 0);
+ prodRecord.setReportCheckFile(report.getReport_check_file() ? 1 : 0);
+ prodRecord.setReportCheckTag(report.getReport_check_tag() ? 1 : 0);
+ prodRecord.setReportCheckTool(report.getReport_check_tool() ? 1 : 0);
+ prodRecord.setReportCheckMan(report.getReport_check_man());
+ prodRecord.setReportCheckStatus(report.getReport_check_status() ? 1 : 0);
+ prodRecord.setReportCheckQa(report.getReport_check_qa());
+ prodRecord.setReportCheckRecord(report.getReport_check_record());
+
+ prodRecord.setReportProductView(report.getReport_product_view() ? 1 : 0);
+ prodRecord.setReportProductWind(report.getReport_product_wind() ? 1 : 0);
+ prodRecord.setReportProductSun(report.getReport_product_sun() ? 1 : 0);
+ prodRecord.setReportProductLowDry(report.getReport_product_low_dry() ? 1 : 0);
+ prodRecord.setReportProductDry(report.getReport_product_dry() ? 1 : 0);
+ prodRecord.setReportProductStart(report.getReport_product_start());
+ prodRecord.setReportProductEnd(report.getReport_product_end());
+ prodRecord.setReportProductTotal(report.getReport_product_total());
+ prodRecord.setReportProductCheck(report.getReport_product_check() ? 1 : 0);
+ prodRecord.setReportProductMan1(report.getReport_product_man1());
+ prodRecord.setReportProductMan2(report.getReport_product_man2());
+ prodRecord.setReportProductWeight(report.getReport_product_weight());
+ prodRecord.setReportProductWaste(report.getReport_product_waste());
+ prodRecord.setReportProductUse(report.getReport_product_use());
+ prodRecord.setReportProductQa(report.getReport_product_qa());
+
+ prodRecord.setReportCleanMachine(report.getReport_clean_machine() ? 1 : 0);
+ prodRecord.setReportCleanWaste(report.getReport_clean_waste() ? 1 : 0);
+ prodRecord.setReportCleanTool(report.getReport_clean_tool() ? 1 : 0);
+ prodRecord.setReportCleanDoor(report.getReport_clean_door() ? 1 : 0);
+ prodRecord.setReportCleanBox(report.getReport_clean_box() ? 1 : 0);
+ prodRecord.setReportCleanRecord(report.getReport_clean_record() ? 1 : 0);
+ prodRecord.setReportCleanDate(report.getReport_clean_date());
+ prodRecord.setReportCleanMan(report.getReport_clean_man());
+ prodRecord.setReportCleanConfirm(report.getReport_clean_confirm() ? 1 : 0);
+ prodRecord.setReportCleanQa(report.getReport_clean_qa());
+ prodRecordService.save(prodRecord);
+ }
+ }
+
+
/**
* 鏍规嵁绉熸埛id鍜屽伐鍗曞彿鏌ヨ鏁版嵁搴撴槸鍚︽湁璁板綍锛屾湁鍒欒繑鍥烇紝娌℃湁鍒欐柊澧炰竴鏉�
+ *
* @param realTimeDataVo
* @return
*/
private DryOrderVo getOrSaveDryOrderVoDB(RealTimeDataVo realTimeDataVo) {
+ TenantContext.setTenant(realTimeDataVo.getTenantid() + "");
DryOrderVo orderVo;
LambdaQueryWrapper<DryOrder> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DryOrder::getCode, realTimeDataVo.getWorkorder());
@@ -165,7 +337,8 @@
// 杞崲涓虹紦瀛樻暟鎹粨鏋�
orderVo = BeanUtil.toBean(one, DryOrderVo.class);
if (one.getTemps() != null) {
- Map map = JSONObject.parseObject(one.getTemps(), new TypeReference<Map<Integer,Double>>(){});
+ Map map = JSONObject.parseObject(one.getTemps(), new TypeReference<Map<Integer, Double>>() {
+ });
orderVo.setBellowsTemp(map);
}
// 鏌ヨ绉伴噸璁板綍锛屾坊鍔犲埌缂撳瓨鏁版嵁缁撴瀯
@@ -175,8 +348,9 @@
orderVo.setTrendVo(oldVo);
orderVo.setDetailList(trendVos);
}
- // 3 鏁版嵁搴撴病鏈夊垯鏂板涓�鏉℃暟鎹�
+ // 3 鏁版嵁搴撴病鏈夊垯鏂板涓�鏉℃暟鎹�
} else {
+
orderVo = saveNewOrder(realTimeDataVo);
}
return orderVo;
@@ -184,29 +358,123 @@
/**
* 淇濆瓨鏂板伐鍗�
+ *
* @param realTimeDataVo
* @return
*/
- @NotNull
private DryOrderVo saveNewOrder(RealTimeDataVo realTimeDataVo) {
+ TenantContext.setTenant(realTimeDataVo.getTenantid() + "");
DryOrderVo orderVo;
- // 鏌ヨ鑽潗
- DryHerb herb = queryHerbByIndexTenant(realTimeDataVo);
+
// 鏌ヨ璁惧
DryEquipment equ = queryEquipmentByCodeTenant(realTimeDataVo);
+ if (equ == null) {
+ log.error("鏈壘鍒拌澶囷細" + realTimeDataVo.getIndex() + "," + realTimeDataVo.getName() + ",鏈哄彴锛�" + realTimeDataVo.getMachineid());
+ log.error("鏂板璁惧锛�");
+ if (realTimeDataVo.getMachineid() == null || realTimeDataVo.getTenantid() == null) {
+ log.error("鏂板璁惧澶辫触锛氳澶嘔D鎴栫鎴稩D涓虹┖锛乵achineid={}, tenantid={}",
+ realTimeDataVo.getMachineid(), realTimeDataVo.getTenantid());
+ return null;
+ }
- // 鍒涘缓鏂板伐鍗�
- orderVo = new DryOrderVo(realTimeDataVo);
- orderVo.setHerbId(herb.getId());
- orderVo.setEquId(equ.getId());
- DryOrder dryOrder = BeanUtil.toBean(orderVo, DryOrder.class);
- boolean save = dryOrderService.save(dryOrder);
- return orderVo;
+ DryEquipment addEqu = new DryEquipment(realTimeDataVo);
+
+ try {
+ String digits = StringUtils.getDigits(realTimeDataVo.getMachineid());
+ addEqu.setName(Integer.parseInt(digits) + "#骞茬嚗璁惧");
+ } catch (NumberFormatException e) {
+ log.error("璁惧ID鏍煎紡閿欒锛屾棤娉曟彁鍙栨暟瀛楅儴鍒嗭細machineid={}", realTimeDataVo.getMachineid(), e);
+ return null;
+ }
+
+ DryEqpType eqpType = dryEqpTypeService.getOne(
+ new LambdaQueryWrapper<DryEqpType>()
+ .eq(DryEqpType::getTenantId, realTimeDataVo.getTenantid())
+ );
+ if (eqpType == null) {
+ log.error("鏈煡璇㈠埌绉熸埛璁惧绫诲瀷锛歿}", realTimeDataVo.getTenantid());
+ return null;
+ }
+
+ Optional.ofNullable(eqpType).ifPresent(type -> addEqu.setType(type.getId()));
+
+ // 璁惧鏂板
+ ReentrantLock equipmentLock = getLock(realTimeDataVo.getTenantid() + "", "equipment");
+
+ equipmentLock.lock();
+ try {
+ if (!equipmentService.save(addEqu)) {
+ log.error("鏂板璁惧澶辫触锛氭暟鎹簱淇濆瓨寮傚父锛乪quipment={}", addEqu);
+ return null;
+ }
+ redisUtil.del(CommonCacheConstant.DRY_CACHE_TENANT_EQUS_LIST);
+ redisUtil.del(CommonCacheConstant.DRY_CACHE_TENANT_EQUS);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ equipmentLock.unlock();
+ }
+ equ = addEqu;
+
+ log.info("鏂板璁惧鎴愬姛锛歟quipmentId={}", addEqu.getId());
+
+ }
+ // 鏌ヨ鑽潗
+ DryHerbFormula herbFormula = queryHerbByIndexTenant(realTimeDataVo);
+
+ if (herbFormula == null) {
+ log.error("鏈壘鍒拌嵂鏉愶細" + realTimeDataVo.getIndex() + "," + realTimeDataVo.getName() + ",鏈哄彴锛�" + realTimeDataVo.getMachineid());
+ return null;
+ }
+
+ // 宸ュ崟鏂板
+ ReentrantLock orderLock = getLock(realTimeDataVo.getTenantid() + "", "order");
+ orderLock.lock();
+ try {
+ //鏍规嵁绉熸埛id 鍜� 鑽潗id 妫�鏌ユ渶杩戞槸鍚﹀瓨鍦ㄥ伐鍗� TODO 楠岃瘉
+ LambdaQueryWrapper<DryOrder> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(DryOrder::getHerbId, herbFormula.getId());
+ queryWrapper.eq(DryOrder::getTenantId, realTimeDataVo.getTenantid());
+ queryWrapper.orderByDesc(DryOrder::getOrderTime);
+ queryWrapper.last("LIMIT 1");
+ // 1 鏌ヨ鏁版嵁搴�
+ DryOrder one = dryOrderService.getOne(queryWrapper);
+ if(one!=null){
+ Date orderDate = one.getOrderTime();
+ //30S鍐呬笉鍏佽鏂板缓宸ュ崟锛岄伩鍏嶉噸澶�
+ LocalDateTime orderTime = orderDate.toInstant()
+ .atZone(ZoneId.systemDefault())
+ .toLocalDateTime();
+
+ LocalDateTime now = LocalDateTime.now();
+ long secondsBetween = java.time.Duration.between(orderTime, now).getSeconds();
+ boolean b = secondsBetween <= 30;
+ if(b){
+ return BeanUtil.toBean(one, DryOrderVo.class);
+ }
+ }
+
+ // 鍒涘缓鏂板伐鍗�
+ orderVo = new DryOrderVo(realTimeDataVo);
+ orderVo.setHerbId(herbFormula.getId());
+ orderVo.setEquId(equ.getId());
+ DryOrder dryOrder = BeanUtil.toBean(orderVo, DryOrder.class);
+ boolean save = dryOrderService.save(dryOrder);
+ return orderVo;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ orderLock.unlock();
+ }
+
+
+ return null;
}
/**
* 鏌ヨ璁惧锛屾柊璁惧鍒欐坊鍔犲埌璁惧涓绘暟鎹�
+ *
* @param realTimeDataVo
* @return
*/
@@ -216,39 +484,67 @@
queryWrapper.eq(DryEquipment::getCode, realTimeDataVo.getMachineid());
DryEquipment one = equipmentService.getOne(queryWrapper);
if (one == null) {
- one = new DryEquipment(realTimeDataVo);
- equipmentService.save(one);
+ log.error(role + "淇濆瓨瀹炴椂鏁版嵁锛屾湭鎵惧埌璁惧锛�" + realTimeDataVo.getMachineid());
+// one = new DryEquipment(realTimeDataVo);
+// equipmentService.save(one);
+ if (MqttConstant.ROLE_ADMIN.equals(role)) {
+ MqttMessage mqttMessage = new MqttMessage();
+ mqttMessage.setQos(0);
+ JSONObject object = new JSONObject();
+ object.put("code", realTimeDataVo.getMachineid());
+ object.put("tenantId", realTimeDataVo.getTenantid());
+ mqttMessage.setPayload(object.toJSONString().getBytes());
+ try {
+ if (mqttEnable) {
+ mqttUtil.getMqttClient().publish(MqttConstant.SERVICE_REQ_PREFIX, mqttMessage);
+ }
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+
+ }
+ return null;
}
return one;
}
/**
* 鏌ヨ鑽潗锛屾柊鑽潗娣诲姞鍒版暟鎹簱
+ *
* @param realTimeDataVo
* @return
*/
- private DryHerb queryHerbByIndexTenant(RealTimeDataVo realTimeDataVo) {
- LambdaQueryWrapper<DryHerb> queryWrapper = new LambdaQueryWrapper<>();
- queryWrapper.eq(DryHerb::getTenantId, realTimeDataVo.getTenantid());
- queryWrapper.eq(DryHerb::getCode, realTimeDataVo.getIndex());
- DryHerb one = herbService.getOne(queryWrapper);
- if (one == null) {
- one = new DryHerb(realTimeDataVo);
- herbService.save(one);
- }
+ private DryHerbFormula queryHerbByIndexTenant(RealTimeDataVo realTimeDataVo) {
+ LambdaQueryWrapper<DryHerbFormula> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(DryHerbFormula::getTenantId, realTimeDataVo.getTenantid());
+ queryWrapper.eq(DryHerbFormula::getName, realTimeDataVo.getName());
+ queryWrapper.orderByDesc(DryHerbFormula::getCreateTime);
+ queryWrapper.last("LIMIT 1");
+ DryHerbFormula one = dryHerbFormulaService.getOne(queryWrapper);
+
+// if (one == null) {
+// one = new DryHerbFormula(realTimeDataVo);
+// DryEquipment dryEquipment = equipmentService.selectByTenantIdEquipmentId(realTimeDataVo.getTenantid() + "", realTimeDataVo.getMachineid());
+// if (dryEquipment != null && dryEquipment.getType() != null) {
+// one.setEqpType(dryEquipment.getType());
+// }
+//
+// dryHerbFormulaService.save(one);
+// }
return one;
}
/**
* 淇濆瓨鍚按鐜囧彉鍖栬褰�
+ *
* @param trendVo
* @param orderVo
*/
private void saveOrderTrendVo(DryOrderTrendVo trendVo, DryOrderVo orderVo) {
//鍒ゆ柇 瀹炴椂鍚按鐜� 鎴� 瀹炴椂閲嶉噺鏈夋病鏈夊彉鍖栵紝鏈夊彉鍖栧垯鏇存柊
- if(orderVo.getTrendVo() == null
- || trendVo.getWeight() < orderVo.getTrendVo().getWeight()
- ) {
+ if (orderVo.getTrendVo() == null && trendVo != null && trendVo.getWeight() > 0
+ || orderVo.getTrendVo() != null && trendVo.getWeight() < orderVo.getTrendVo().getWeight()
+ ) {
DryOrder byId = dryOrderService.getById(orderVo.getId());
// 灏嗘渶鏂扮粨鏋滄洿鏂板埌宸ュ崟
if (byId != null) {
@@ -266,49 +562,338 @@
/**
* 鏌ヨ鏈哄彴瀹炴椂鏁版嵁
+ *
* @param realTimeDataVo
* @return
*/
@Override
public Result<?> queryMachineRealTImeData(RealTimeDataVo realTimeDataVo) {
- TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
+ TenantContext.setTenant(realTimeDataVo.getTenantid() + "");
-
+ // 鏌ヨ鎵�鏈夋満鍙�,鏌ヨ璇彞缁勮
LambdaQueryWrapper<DryEquipment> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DryEquipment::getTenantId, realTimeDataVo.getTenantid());
queryWrapper.eq(DryEquipment::getEnable, "Y");
-
+ queryWrapper.orderByAsc(DryEquipment::getCode);
+ // 鏌ヨ鎵�鏈夋満鍙�
List<DryEquipment> dryEquipments = equipmentService.list(queryWrapper);
+ // 鏈哄彴鍒楄〃锛岀敤浜庢晥鐜囧姣�
List<String> list = new ArrayList<>();
-
+ // 鏁堢巼鍒楄〃锛岀敤浜庢晥鐜囧姣�
List<Double> dList = new ArrayList<>();
+ // 鏌ヨ褰撳墠鏈哄彴宸ュ崟
DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid() + "_" + realTimeDataVo.getMachineid());
-try {
+ try {
+ // 濡傛灉鏈夊彲鐢ㄦ満鍙�
+ if (dryEquipments != null && dryEquipments.size() > 0) {
+ // 鏌ヨ鍏跺畠鏈哄彴宸ュ崟
+ dryEquipments.stream().forEach(item -> {
+ // 鑾峰彇宸ュ崟
+ DryOrderVo order = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid() + "_" + item.getCode());
+ list.add(item.getName().substring(0, item.getName().indexOf('#') + 1));
+ if (order != null && order.getDetailList()!=null && !order.getDetailList().isEmpty()) {
+ // 璁$畻骞茬嚗鏁堢巼锛岀敤浜庡姣�
+ DryOrderTrendVo dryOrderTrendVo = order.getDetailList().get(order.getDetailList().size() - 1);
+ double v = order.getOriginWeight() - dryOrderTrendVo.getWeight();
+
+ if (v > 0 && dryOrderTrendVo.getTotalTime() > 0) {
+ DecimalFormat df = new DecimalFormat("#.00");
+ dList.add(Double.valueOf(df.format(v / dryOrderTrendVo.getTotalTime() * 60)));
+ } else {
+ dList.add(50d);
+ }
+
+ } else {
+ // 濡傛灉娌℃湁鐢熶骇锛屾晥鐜囩疆0
+ dList.add(0d);
+ }
+
+ });
+ }
+
+ if (orderVo != null) {
+ // 灏嗘晥鐜囧姣旀暟鎹斁鍏ュ綋鍓嶆満鍙板疄鏃舵暟鎹腑杩斿洖
+ orderVo.setCompEqpNum(list);
+ orderVo.setCompEqpEffic(dList);
+ // 鏌ヨ杩戝崄娆℃晥鐜囧拰鑳借兘鑰楀钩鍧�
+ dryOrderService.queryRecentOrderAvg(orderVo);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return Result.ok(orderVo);
+ }
- if (dryEquipments != null && dryEquipments.size() > 0) {
- dryEquipments.stream().forEach(item -> {
- DryOrderVo order = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid() + "_" + item.getCode());
- if (order != null) {
- double v = order.getOriginWeight() - order.getYield();
- list.add(item.getName().substring(0, item.getName().indexOf('#')+1));
- if (v > 0) {
- DecimalFormat df = new DecimalFormat("#.00");
- dList.add(Double.valueOf(df.format(v / order.getDryTime() * 60)));
- } else {
- dList.add(50d);
+ @Override
+ public Result<?> sendSocketMsg(CommandMessageVo msgVo) {
+
+
+ DryEquipment dryEquipment = equipmentService.selectByTenantIdEquipmentId(msgVo.getTenantId() + "", msgVo.getMachineId());
+ log.info("鑾峰彇璁惧锛�" + dryEquipment.toString());
+
+ // managedSessions.keySet().forEach(addr -> {
+ // ObjectOutputStream oos = null;
+ try {
+// Socket socket = SocketServerConfig.clientMap.get(addr);
+ IoSession session = ServerHandler.clientSocket.get(dryEquipment.getIp());
+ if (session == null) {
+ return Result.error("鏈幏鍙栧埌session,璇锋鏌ュ鎴风閰嶇疆鎴栬澶噄p閰嶇疆鏄惁姝e父");
+ }
+ SocketMsgVo smv = new SocketMsgVo(msgVo);
+ session.write(JSONObject.toJSONString(smv));
+// oos = new ObjectOutputStream(socket.getOutputStream());
+// String s = JSONObject.toJSONString(new SocketMsgVo(msgVo));
+// oos.writeUTF(s);
+// oos.flush();
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+
+ }
+ // });
+ return Result.OK();
+ }
+
+
+ @Override
+ public Result<?> queryWorkshopStatistics(RealTimeDataVo realTimeDataVo) {
+ LambdaQueryWrapper<DryEquipment> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(DryEquipment::getTenantId, realTimeDataVo.getTenantid());
+ queryWrapper.eq(DryEquipment::getEnable, "Y");
+ List<DryEquipment> dryEquipments = equipmentService.list(queryWrapper);
+ DryOrderVo orderVo = new DryOrderVo();
+ if (dryEquipments != null && dryEquipments.size() > 0) {
+ dryEquipments.stream().forEach(item -> {
+ DryOrderVo order = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid() + "_" + item.getCode());
+ if (order != null) {
+ orderVo.setEnvHum(order.getEnvHum());
+ orderVo.setEnvTemp(order.getEnvTemp());
+ double watt = order.getWatt() - (order.getDetailList().size() > 0 ?order.getDetailList().get(0).getWatt():0);
+ orderVo.setWatt(orderVo.getWatt() == null ? watt : orderVo.getWatt() + watt);
+ double steam = order.getSteam() - ( order.getDetailList().size() > 0 ?order.getDetailList().get(0).getSteam():0);
+ orderVo.setSteam(orderVo.getSteam() == null ? steam : orderVo.getSteam() + steam);
+ orderVo.setOriginWeight(orderVo.getOriginWeight() == null ? order.getOriginWeight() : orderVo.getOriginWeight() + order.getOriginWeight());
+
+ double yield = order.getOriginWeight() * (1 - (order.getInitial() / 100)) / (1 - (order.getTarget() / 100));
+ orderVo.setYield(orderVo.getYield() == null ? yield : orderVo.getYield() + yield);
+ double sub = order.getOriginWeight() - order.getYield();
+ orderVo.setReduce(orderVo.getReduce() == null ? sub : orderVo.getReduce() + sub);
+
+
+ }
+ });
+ }
+ //redisUtil.get(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode()
+ return Result.OK(orderVo);
+ }
+
+ @Override
+ public Result<?> statisticsDataHandle(StatisticsDataVo statsDataVo) {
+ return null;
+ }
+
+ @Override
+ public Result<?> fitFaultRecord(RealTimeDataVo vo) {
+ TenantContext.setTenant(vo.getTenantid() + "");
+ ThreadUtil.execute(() -> {
+ try {
+ //瑙f瀽瀛樺偍鎶ヨ鏁版嵁
+ List<DryFaultRecord> faultRecords1 = fitFault(vo.getEqp_fault(), vo.getWorkorder(), vo.getTenantid(), vo.getMachineid(), 1);
+ List<DryFaultRecord> faultRecords2 = fitFault(vo.getEqp_warning(), vo.getWorkorder(), vo.getTenantid(), vo.getMachineid(), 2);
+ faultRecords1.addAll(faultRecords2);
+
+
+ //澶勭悊缁撴潫鍚庯紝灏唕edis涓疄鏃舵暟鎹彂閫佽嚦浜戞湇鍔″櫒
+ Map<Object, Object> toCloudFaultMap = redisUtil.hmget(String.format(MqttConstant.MQTT_REAL_FAULT, vo.getTenantid()));
+ if (mqttEnable && !toCloudFaultMap.isEmpty()) {
+ MqMessage<Map<Object, Object>> message = new MqMessage<>();
+ message.setData(toCloudFaultMap);
+ message.setTentId(vo.getTenantid() + "");
+ MqttMessage mqttMessage = new MqttMessage();
+ mqttMessage.setQos(0);
+ mqttMessage.setPayload(JSON.toJSONString(message).getBytes());
+ mqttUtil.getMqttClient().publish(MqttConstant.TENANT_UP_PREFIX_REAL_FAULT_DATA, mqttMessage);
+ }
+
+
+ //瑕佷繚瀛樼殑鍘嗗彶鏁呴殰
+ if (!faultRecords1.isEmpty()) {
+ MqMessage<List<DryFaultRecord>> message = new MqMessage<>();
+ message.setData(faultRecords1);
+ message.setTentId(vo.getTenantid() + "");
+ MqttMessage mqttMessage = new MqttMessage();
+ mqttMessage.setQos(0);
+ mqttMessage.setPayload((JSON.toJSONString(message).getBytes()));
+ mqttUtil.getMqttClient().publish(MqttConstant.TENANT_UP_PREFIX_FAULT_DATA, mqttMessage);
+ }
+
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ });
+
+ return null;
+ }
+
+ @Override
+ public void fitFaultRecord(RealTimeDataParentVo vo) {
+ TenantContext.setTenant(vo.getTenantid() + "");
+ //瑙f瀽瀛樺偍鎶ヨ鏁版嵁
+ List<DryFaultRecord> errorList = fitFault(vo.getFault().getError(), vo.getWorkorder(), vo.getTenantid(), vo.getMachineid(), 1);
+ List<DryFaultRecord> warnList = fitFault(vo.getFault().getWarning(), vo.getWorkorder(), vo.getTenantid(), vo.getMachineid(), 2);
+ if (!errorList.isEmpty()) {
+ log.error("淇濆瓨鏁呴殰锛歿}", errorList.toString());
+ }
+ if (!warnList.isEmpty()) {
+ log.error("淇濆瓨鍛婅锛歿}", warnList.toString());
+ }
+
+ //浠ヤ笅涓轰簯鏈嶅姟澶勭悊鏁呴殰,鍘傚唴鏈湴鏈嶅姟鏃犻渶澶勭悊
+ if (!mqttEnable) return;
+
+
+ //澶勭悊缁撴潫鍚庯紝灏唕edis涓疄鏃舵暟鎹彂閫佽嚦浜戞湇鍔″櫒 key = tenantId + machineId + eqpFault
+ Map<Object, Object> toCloudFaultMap = redisUtil.hmget(String.format(MqttConstant.MQTT_REAL_FAULT, vo.getTenantid()));
+
+
+ Map<String, DryFaultRecordVo> dryFaultMap = toCloudFaultMap.entrySet().stream()
+ .collect(Collectors.toMap(
+ entry -> entry.getKey().toString(),
+ entry -> (DryFaultRecordVo) entry.getValue()
+ ));
+
+ String tenantId = vo.getTenantid() + "";
+
+ //骞挎挱鍙戦�佺粰鍚勭鎴蜂笅绉诲姩璁惧
+ if (dryFaultMap.isEmpty()) {
+ return;
+ }
+ String recTopic = String.format(MqttConstant.SERVICE_BROADCAST_TENANT_REAL_FAULT, tenantId);
+ //鏁版嵁杞崲
+ List<DryFaultRecordVo> faultList = new ArrayList<DryFaultRecordVo>((dryFaultMap.values()));
+ MqMessage<List<DryFaultRecordVo>> mqMessage = new MqMessage<>(faultList, tenantId, recTopic);
+ //鍙戦�佸箍鎾�
+// log.error("骞挎挱缁欙細{}", recTopic);
+ mqttUtil.sendMqttMessage(MqttConstant.SERVICE_BROADCAST_TENANT_REAL_FAULT, mqMessage, 1);
+
+
+ }
+
+
+ /**
+ * 瑙f瀽瀛樺偍鏁呴殰鏁版嵁
+ * TODO 淇濊瘉鍘熷瓙鎬�
+ *
+ * @param fault 鏁呴殰鏁版嵁
+ * @param orderId 宸ュ崟
+ * @param tenantId 绉熸埛
+ * @param machineId 璁惧
+ * @param faultType 鏁呴殰绫诲瀷
+ * @return 缁勮濂芥晠闅滄暟鎹�
+ */
+ private List<DryFaultRecord> fitFault(String fault, String orderId, Integer tenantId, String machineId, Integer faultType) {
+ List<DryFaultRecord> result = new ArrayList<>();
+ if (StringUtils.isEmpty(fault)) return result;
+ //鏁版嵁鏍锋湰锛�"eqp_fault": "婊氱瓛闄嶈秴鏃�-鎶ヨ,椋庢満杩囨祦鎶ヨ,婊氱瓛鍗囪秴鏃�-鎶ヨ,椋庣鍗囨姤璀�",
+// System.err.println((faultType == 1 ? "绫诲瀷锛氭晠闅�" : "绫诲瀷锛氭姤璀�") + DateUtils.formatDateTime() + "--" + fault);
+ //redis涓殑鏁呴殰
+ Map<Object, Object> rFauMap = redisUtil.hmget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId));
+ Map<String, Object> redFauMap = rFauMap.entrySet().stream()
+ .collect(Collectors.toMap(
+ entry -> entry.getKey().toString(), // 閿浆鎹负瀛楃涓�
+ entry -> entry.getValue()
+ ));
+
+ //娌℃湁鐢熸垚宸ュ崟鐨勬晠闅滄暟鎹笉瀛樺偍
+ if (StringUtils.isEmpty(orderId)) {
+ return result;
+ }
+
+ if (StringUtils.isEmpty(fault) && rFauMap.isEmpty()) {
+ return result;
+ }
+ //1.瑙f瀽鏁版嵁
+ String[] eqpFaults = fault.split(",");
+ Map<String, DryFaultRecord> addFauMap = new HashMap<>();
+ Map<String, DryFaultRecord> realFauMap = new HashMap<>();
+ for (int i = 0; i < eqpFaults.length; i++) {
+ String eqpFault = eqpFaults[i];
+ //閬垮厤绌哄瓧绗︿覆
+ if (StringUtils.isEmpty(eqpFault.trim())) continue;
+ //1.1妫�鏌qtt涓槸鍚﹀凡瀛樺湪杩欎釜鏁呴殰
+ String redisKey = String.format("%s_%s_%s", tenantId, machineId, eqpFault).trim();
+
+
+ realFauMap.put(redisKey, new DryFaultRecord());
+ DryFaultRecordVo rFault = (DryFaultRecordVo) redisUtil.hget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), redisKey);
+ //1.2濡傛灉redis涓嶅瓨鍦ㄥ垯瀛樺叆锛堝瓨鏁呴殰寮�濮嬶級
+ if (rFault == null) {
+ //缁勮缂撳瓨鏁版嵁
+// DryFaultRecord faultRecord = new DryFaultRecord(orderId,tenantId,eqpFault,faultType,new Date(),null);
+// addFauMap.put(redisKey,faultRecord);
+ Map<String, DryEquipment> equipmentMap = equipmentService.queryEquByTenantId(tenantId);
+ String tenantName = (String) redisUtil.hget(CommonCacheConstant.SYS_CACHE_TENANT, tenantId + "");
+ DryFaultRecordVo vo = new DryFaultRecordVo(orderId, tenantId, eqpFault, faultType, new Date(), null, 1, machineId, equipmentMap.get(machineId).getName(), tenantName);
+ addFauMap.put(redisKey, vo);
+ } else {
+
+
+ //濡傛灉鏁版嵁宸插瓨鍦紝涓旇鏁板ぇ浜�1灏遍噸缃鏁帮紙璁℃暟3娆″悗鍒ゅ畾鏁呴殰缁撴潫锛�3娆′箣鍓嶉噸鏂颁笂鎶ユ晠闅滆鏄庢晠闅滆繕鍦ㄦ寔缁� 闇�瑕侀噸鏂拌鏁帮級
+ if (rFault.getECount() != null && rFault.getECount() > 1) {
+ rFault.setECount(1);
+ redisUtil.hset(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), redisKey, rFault);
+ System.err.println("鎶ヨ娆℃暟閲嶇疆 clear clear 锛宬ey-" + redisKey);
}
}
+
+ }
+
+ //1.3缂撳瓨鑷硆edis
+ //鍚堝苟鏁版嵁
+ addFauMap.forEach((key, value) -> redFauMap.putIfAbsent(key, value));
+ //娌℃湁鏂版晠闅滄暟鎹笉鐢ㄨ鐩�
+ if (!addFauMap.isEmpty()) {
+ redisUtil.hmset(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), redFauMap);
+ }
+
+ //2妫�娴嬪凡缁撴潫鐨勬晠闅�
+ //2.1濡傛灉瀹炴椂鏁版嵁涓嶅瓨鍦╮edis瀛樺湪鍒欎唬琛ㄦ晠闅滅粨鏉燂紝瀛樺叆鏁版嵁搴�
+ Map<Object, Object> curFauMap = redisUtil.hmget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId));
+ Map<Object, DryFaultRecordVo> collect = curFauMap.keySet().stream()
+ .filter(key -> {
+ String[] split = key.toString().split("_");
+ return split[0].equals(tenantId + "") && split[1].equals(machineId);
+ })
+ //鐗瑰埆娉ㄦ剰锛屽涓姤璀︾被鍨嬪叡鐢ㄦ柟娉曢渶瑕佸尯鍒嗙被鍨�
+ .filter(key -> !realFauMap.containsKey(key) && (Objects.equals(((DryFaultRecordVo) curFauMap.get(key)).getFaultType(), faultType)))
+ .collect(Collectors.toMap(key -> key, // 淇濈暀鍘熼敭
+ key -> (DryFaultRecordVo) curFauMap.get(key)));
+ collect.keySet().forEach(key -> {
+ DryFaultRecordVo vo = (DryFaultRecordVo) redFauMap.get(key);
+ vo.setECount(vo.getECount() + 1);
+ if (redisUtil.hget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key.toString()) != null) {
+ //鏇存柊娆℃暟
+ redisUtil.hset(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key.toString(), vo);
+ System.err.println("鎶ヨ娆℃暟鏇存柊锛宬ey-" + key);
+ }
+
+ if (vo.getECount() >= 3) {
+ vo.setEndTime(new Date());
+ //TODO 缁撴潫瓒呰繃鏌愪釜鏃堕棿鍖洪棿鍒ゅ畾涓洪敊璇暟鎹�
+ faultRecordService.save(vo);
+ redisUtil.hdel(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key);
+ result.add(vo);
+// System.err.println((faultType == 1 ? "绫诲瀷锛氭晠闅�" : "绫诲瀷锛氭姤璀�") + DateUtils.formatDateTime() + "瀛樺叆鏁版嵁搴�");
+ }
});
+
+
+ return result;
}
- if (orderVo != null) {
- orderVo.setCompEqpNum(list);
- orderVo.setCompEqpEffic(dList);
- }
-}catch (Exception e) {
- e.printStackTrace();
-}
- return Result.ok(orderVo);
- }
+
+
}
--
Gitblit v1.9.3