干燥机配套车间生产管理系统/云平台服务端
zhuguifei
6 天以前 2871d648f1b89453e88eb9180f45fde124ff0391
Merge branch 'master' of http://lanpucloud.cn:1111/r/herb
已添加4个文件
已修改10个文件
529 ■■■■ 文件已修改
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonCacheConstant.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataParentVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeFaultVo.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeProdVo.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeReportVo.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryEquipmentService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryEquipmentServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java 226 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-server-cloud/jeecg-cloud-nacos/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonCacheConstant.java
@@ -5,4 +5,7 @@
    String SYS_CACHE_TENANT = "sys:cache:tenant";
    //redis缓存各租户下设备信息
    String DRY_CACHE_TENANT_EQUS = "dry:cache:tenant::equs";
    // redis缓存各租户下设备信息列表
    String DRY_CACHE_TENANT_EQUS_LIST = "dry:cache:tenant:equsList";
}
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java
@@ -77,6 +77,7 @@
  String TENANT_UP_PREFIX = "tenant/up";
  String TENANT_UP_PREFIX_REALTIME_DATA = TENANT_UP_PREFIX + "/realTime/data";
  String TENANT_UP_PREFIX_REALTIME_DATA_EQP = TENANT_UP_PREFIX + "/realTime/data/eqp";
  String TENANT_UP_PREFIX_FAULT_DATA = TENANT_UP_PREFIX + "/fault/data";
  String TENANT_UP_PREFIX_REAL_FAULT_DATA = TENANT_UP_PREFIX + "/real/fault/data";
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataParentVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package org.jeecg.modules.dry.vo;
import lombok.Data;
@Data
public class RealTimeDataParentVo {
    private RealTimeDataVo realTime;
    private RealTimeReportVo report;
    private RealTimeFaultVo fault;
    /**工单号*/
    private String workorder;
    /**租户ID*/
    private Integer tenantid;
    /**设备编号*/
    private String machineid;
}
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java
@@ -94,23 +94,6 @@
    private Integer ai_time;
    // private List<DryEquipment> eqpCodes;
    /**接管状态 0:自动   1:手动  */
    private Integer state_auto;
    /**风箱状态 0:低位静止  1:高位静止  2:正在上升  3:正在下降*/
    private Integer state_windbox;
    /**滚筒状态 0:高位静止  1:低位静止 2:正在上升  3:正在下降 4:正转  5:反转*/
    private Integer state_roller;
    /**风机状态 0:关闭  1:开启*/
    private Integer state_fan;
    /**蒸汽阀状态 0:关闭 1:开启*/
    private Integer state_valve;
    /**工单状态*/
    private Integer workorder_status;
@@ -128,61 +111,7 @@
    private String level;
    /**设备故障**/
   // private String fault;
    /**---------------------生产记录相关字段定义---s-------------------------*/
    private Boolean report_flag;       // æäº¤æ ‡å¿—
    private String report_head_name;         // å“å
    private String report_head_batch   ;     //批次
    private String report_head_num     ;     //数量--16框/355.8Kg
    private String report_head_machine ;     //设备
    private String report_head_accepter;     //接料人
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    private Date report_head_date    ;     //生产日期
    private String report_head_leader  ;     //班组长
    private String report_head_techer  ;     //工艺员
    //检查
    private Boolean report_check_field ;    //生产现场
    private Boolean report_check_file  ;    //执行文件
    private Boolean report_check_tag   ;    //物料标示
    private Boolean report_check_tool  ;    //称量器具
    private String report_check_man   ;    //检查人
    private Boolean report_check_status;    //检查情况
    private String report_check_qa ;     //QA
    private String report_check_record    ;     //异常记录
    //生产
    private Boolean report_product_view    ;    //外观检查
    private Boolean report_product_wind    ;    //吹风
    private Boolean report_product_sun     ;    //晒
    private Boolean report_product_low_dry ;    //低温干燥
    private Boolean report_product_dry     ;    //干燥
    private String  report_product_start   ;     //开始时间
    private String  report_product_end     ;     //结束时间
    private Integer report_product_total   ;    //干燥总时间
    private Boolean report_product_check   ;    //干燥检查
    private String  report_product_man1    ;     //操作人
    private String  report_product_man2    ;     //复核人
    private Double  report_product_weight  ;     //操作后重量
    private Double  report_product_waste   ;     //废料数量
    private Double  report_product_use     ;     //收率
    private String  report_product_qa      ;     //QA
    //清场
    private Boolean report_clean_machine   ;    //设备清理
    private Boolean report_clean_waste     ;    //废料清理
    private Boolean report_clean_tool      ;    //工具清理
    private Boolean report_clean_door      ;    //门窗清理
    private Boolean report_clean_box       ;    //箱体清理
    private Boolean report_clean_record    ;    //生产记录清理
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    private Date report_clean_date      ;     //清场日期
    private String report_clean_man       ;     //清场人
    private Boolean report_clean_confirm   ;    //清场确认
    private String report_clean_qa        ;     //QA
    /**---------------------生产记录相关字段定义---e-------------------------*/
}
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeFaultVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package org.jeecg.modules.dry.vo;
import lombok.Data;
@Data
public class RealTimeFaultVo {
    private String error;
    private String warning;
    private String info;
}
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeProdVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package org.jeecg.modules.dry.vo;
import lombok.Data;
@Data
public class RealTimeProdVo {
    private Integer ai_time;
    private Integer ai_total_time;
    /**自动 true/手动 false*/
    private Boolean auto;
    /**荡料延时*/
    private Integer delay;
    /**环境湿度*/
    private Double envhum;
    /**环境温度*/
    private Double envtemp;
    /**风机频率*/
    private Double fanfrq;
    /**配方索引*/
    private Integer index;
    private String level;
    /**温度过低 true/正常 false*/
    private Boolean lowalarm;
    /**初始含水率(设定值)*/
    private Double moisture1;
    /**实时含水率*/
    private Double moisture2;
    /**目标含水率*/
    private Double moisture3;
    /**药材名称*/
    private String name;
    /**上位机 true/PLC false*/
    private Boolean plcdisable;
    /**开始干爆*/
    private Boolean start;
    /**蒸汽消耗**/
    private Double steam;
    /**暂停标志 true/false*/
    private Boolean stop;
    /**风机温度*/
    private Double temp1;
    /**风箱温度*/
    private Double temp2;
    /**温度设定值*/
    private Double temp3;
    /**时间设定值*/
    private Integer time1;
    /**时间计数*/
    private Integer time2;
    /**总时间*/
    private Integer time3;
    /**翻料次数*/
    private Integer turntime;
    /**电能消耗**/
    private Double watt;
    /**投料量(筐)*/
    private Integer weight1;
    /**初始重量*/
    private Double weight2;
    /**过程实时重量*/
    private Double weight3;
    /**热风 true/冷风 false*/
    private Boolean wind;
    /**工单状态*/
    private Integer workorder_status;
}
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeReportVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package org.jeecg.modules.dry.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class RealTimeReportVo {
    private Boolean report_flag;       // æäº¤æ ‡å¿—
    private String report_head_name;         // å“å
    private String report_head_batch   ;     //批次
    private String report_head_num     ;     //数量--16框/355.8Kg
    private String report_head_machine ;     //设备
    private String report_head_accepter;     //接料人
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    private Date report_head_date    ;     //生产日期
    private String report_head_leader  ;     //班组长
    private String report_head_techer  ;     //工艺员
    //检查
    private Boolean report_check_field ;    //生产现场
    private Boolean report_check_file  ;    //执行文件
    private Boolean report_check_tag   ;    //物料标示
    private Boolean report_check_tool  ;    //称量器具
    private String report_check_man   ;    //检查人
    private Boolean report_check_status;    //检查情况
    private String report_check_qa ;     //QA
    private String report_check_record    ;     //异常记录
    //生产
    private Boolean report_product_view    ;    //外观检查
    private Boolean report_product_wind    ;    //吹风
    private Boolean report_product_sun     ;    //晒
    private Boolean report_product_low_dry ;    //低温干燥
    private Boolean report_product_dry     ;    //干燥
    private String  report_product_start   ;     //开始时间
    private String  report_product_end     ;     //结束时间
    private Integer report_product_total   ;    //干燥总时间
    private Boolean report_product_check   ;    //干燥检查
    private String  report_product_man1    ;     //操作人
    private String  report_product_man2    ;     //复核人
    private Double  report_product_weight  ;     //操作后重量
    private Double  report_product_waste   ;     //废料数量
    private Double  report_product_use     ;     //收率
    private String  report_product_qa      ;     //QA
    //清场
    private Boolean report_clean_machine   ;    //设备清理
    private Boolean report_clean_waste     ;    //废料清理
    private Boolean report_clean_tool      ;    //工具清理
    private Boolean report_clean_door      ;    //门窗清理
    private Boolean report_clean_box       ;    //箱体清理
    private Boolean report_clean_record    ;    //生产记录清理
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    private Date report_clean_date      ;     //清场日期
    private String report_clean_man       ;     //清场人
    private Boolean report_clean_confirm   ;    //清场确认
    private String report_clean_qa        ;     //QA
}
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java
@@ -100,6 +100,31 @@
        return dryRealTimeDataService.realTimeDataHandle(realTimeDataVo);
    }
    @ApiOperation(value="接收实时数据Json", notes="设备实时数据上传")
    @PostMapping("/sendRealTimeDataJson2")
    public Result<?> realTimeDataJson2(@RequestBody RealTimeDataParentVo realTimeDataParentVo)  {
        try {
            if (mqttConfig.isEnable() && "user".equals(mqttConfig.getRole())){
                MqttMessage mqttMessage = new MqttMessage();
                mqttMessage.setQos(0);
                mqttMessage.setPayload(JSONObject.toJSONString(realTimeDataParentVo).getBytes());
                mqttUtil.getMqttClient().publish(MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA,mqttMessage);
                //处理故障信息
                dryRealTimeDataService.fitFaultRecord(realTimeDataParentVo);
            }
            if ("user".equals(mqttConfig.getRole()) && realTimeDataParentVo.getFault() != null){
                //处理故障信息
                dryRealTimeDataService.fitFaultRecord(realTimeDataParentVo);
            }
        } catch (MqttException e) {
            e.printStackTrace();
        }
        return dryRealTimeDataService.realTimeDataHandle(realTimeDataParentVo);
    }
    @ApiOperation(value="获取设备实时数据", notes="通过租户ID和设备编码获取实时数据")
@@ -115,6 +140,14 @@
    }
    @ApiOperation(value="获取所有机台", notes="通过租户ID获取所有机台数据")
    @GetMapping("/queryAllEqps")
    public Result<?> queryAllEqps(DryEquipment equipment) {
        List<DryEquipment> dryEquipments = dryEquipmentService.queryEqusByTenantId(equipment);
        return  Result.OK(dryEquipments);
    }
    /**
     * 1001 é£Žç®±å‡     1002 é£Žç®±é™
     * 1003 æ»šç­’升     1004 æ»šç­’降
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java
@@ -24,6 +24,7 @@
import org.jeecg.modules.dry.service.*;
import org.jeecg.modules.dry.vo.DryEquipmentVo;
import org.jeecg.modules.dry.vo.DryFaultRecordVo;
import org.jeecg.modules.dry.vo.RealTimeDataParentVo;
import org.jeecg.modules.dry.vo.RealTimeDataVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -215,6 +216,17 @@
                });
                break;
            // æŽ¥æ”¶è®¾å¤‡å®žæ—¶æ•°æ®-机台
            case MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA_EQP:
                ThreadUtil.execute(() -> {
                    try {
                        RealTimeDataParentVo vo = JSON.parseObject(message, RealTimeDataParentVo.class);
                        realTimeDataService.realTimeDataHandle(vo);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
                break;
            //各租户上传的实时报警数据
            case MqttConstant.TENANT_UP_PREFIX_REAL_FAULT_DATA: {
@@ -243,8 +255,6 @@
                //发送广播
                System.err.println("广播给:" + recTopic);
                sendMqttMessage(MqttConstant.SERVICE_BROADCAST_TENANT_REAL_FAULT, mqMessage, 1);
            }
            break;
            //移动端主动请求设备实时故障数据(用于页面刚打开时拉取一次数据)
@@ -260,8 +270,6 @@
                                entry -> entry.getKey().toString(),
                                entry -> (DryFaultRecordVo) entry.getValue()
                        ));
                if (dryFaultMap.isEmpty()) {
                    return;
                }
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryEquipmentService.java
@@ -1,5 +1,6 @@
package org.jeecg.modules.dry.service;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.dry.entity.DryEquipment;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -24,4 +25,5 @@
     */
    Map<String,DryEquipment>  queryEquByTenantId(Integer tenantId);
    List<DryEquipment> queryEqusByTenantId(DryEquipment dryEquipment);
}
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java
@@ -1,9 +1,7 @@
package org.jeecg.modules.dry.service;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.dry.vo.CommandMessageVo;
import org.jeecg.modules.dry.vo.RealTimeDataVo;
import org.jeecg.modules.dry.vo.StatisticsDataVo;
import org.jeecg.modules.dry.vo.*;
public interface IDryRealTimeDataService {
    Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo);
@@ -22,4 +20,8 @@
     * @return
     */
    Result<?> fitFaultRecord(RealTimeDataVo realTimeDataVo);
    void fitFaultRecord(RealTimeDataParentVo realTimeDataParentVo);
    Result<?> realTimeDataHandle(RealTimeDataParentVo realTimeDataParentVo);
}
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryEquipmentServiceImpl.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.dry.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.config.TenantContext;
import org.jeecg.common.constant.CommonCacheConstant;
import org.jeecg.common.util.RedisUtil;
@@ -63,4 +64,17 @@
                ));
        return userMap;
    }
    @Override
    @Cacheable(cacheNames = CommonCacheConstant.DRY_CACHE_TENANT_EQUS_LIST, key = "#dryEquipment.tenantId+':'+#dryEquipment.enable" , unless = "#result == null " )
    public List<DryEquipment> queryEqusByTenantId(DryEquipment dryEquipment) {
        TenantContext.setTenant(dryEquipment.getTenantId() +"");
        QueryWrapper<DryEquipment> queryWrapper  = new QueryWrapper<>();
        queryWrapper.lambda().eq(DryEquipment::getTenantId,dryEquipment.getTenantId());
        if (dryEquipment.getEnable()!=null){
            queryWrapper.lambda().eq(DryEquipment::getEnable,dryEquipment.getEnable());
        }
        List<DryEquipment> equipmentList = this.list(queryWrapper);
        return equipmentList;
    }
}
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
@@ -91,7 +91,7 @@
    @Transactional
    public Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo) {
        TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
       // log.info("实时数据:"+realTimeDataVo.toString());
        log.info("实时数据:"+realTimeDataVo.toString());
        // 1 æŸ¥è¯¢æˆ–创建工单
@@ -132,11 +132,6 @@
        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());
@@ -147,55 +142,6 @@
        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());
@@ -204,6 +150,131 @@
                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 ä»Žredis取出工单缓存
            DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
                    realTimeDataParentVo.getTenantid()+"_"+realTimeDataParentVo.getMachineid());
            // 1.2 å¦‚果有缓存记录
            if(orderVo != null && orderVo.getCode().equals(realTimeDataParentVo.getWorkorder())) {
                // 1.3 æ²¡æœ‰ç¼“存记录再查询数据库
            } else {
                // æ ¹æ®ç§Ÿæˆ·id和工单号查询数据库是否有记录,有则返回,没有则新增一条再返回
                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());
            orderVo.setWarning(realTimeDataVo.getEqp_warning());
            orderVo.setFault(realTimeDataVo.getEqp_fault());
            orderVo.setLevel(realTimeDataVo.getLevel());
            DryOrderTrendVo trendVo = new DryOrderTrendVo(realTimeDataVo);
            // 2.2 ä¿å­˜å·¥å•含水率变化 æˆ– é‡é‡å˜åŒ–
            saveOrderTrendVo(trendVo, orderVo);
            orderVo.setTrendVo(trendVo);
            orderVo.getBellowsTemp().put(realTimeDataVo.getTime3(), realTimeDataVo.getTemp2());
            // 2.3 æ›´æ–°åˆ°redis缓存
            redisUtil.hset(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
                    realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid(),orderVo, 60*60);
        }
        if (realTimeDataParentVo.getReport() != null) {
            saveReport(realTimeDataParentVo);
        }
        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和工单号查询数据库是否有记录,有则返回,没有则新增一条
@@ -528,6 +599,51 @@
        return null;
    }
    @Override
    public void fitFaultRecord(RealTimeDataParentVo vo) {
        TenantContext.setTenant(vo.getTenantid()+"");
        ThreadUtil.execute(() -> {
            try {
                //解析存储报警数据
                List<DryFaultRecord> faultRecords1 = fitFault(vo.getFault().getError(), vo.getWorkorder(), vo.getTenantid(), vo.getMachineid(), 1);
                List<DryFaultRecord> faultRecords2 = fitFault(vo.getFault().getWarning(), vo.getWorkorder(), vo.getTenantid(), vo.getMachineid(), 2);
                faultRecords1.addAll(faultRecords2);
                //处理结束后,将redis中实时数据发送至云服务器
                Map<Object, Object> toCloudFaultMap = redisUtil.hmget(MqttConstant.MQTT_REAL_FAULT);
                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();
            }
        });
    }
    /**
     * è§£æžå­˜å‚¨æ•…障数据
jeecg-server-cloud/jeecg-cloud-nacos/src/main/resources/application.yml
@@ -12,9 +12,9 @@
db:
  num: 1
  password:
    '0': ${MYSQL-PWD:root}
    '0': ${MYSQL-PWD:123456}
  url:
    '0': jdbc:mysql://${MYSQL-HOST:localhost}:${MYSQL-PORT:3306}/${MYSQL-DB:nacos-herb}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    '0': jdbc:mysql://${MYSQL-HOST:localhost}:${MYSQL-PORT:3306}/${MYSQL-DB:nacos}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
  user:
    '0': ${MYSQL-USER:root}
management: