干燥机配套车间生产管理系统/云平台服务端
baoshiwei
2025-02-06 39cae5e98a6fd6fb7ade9c80a11f45f46d0ab4c5
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
@@ -71,6 +71,9 @@
    @Autowired
    private MqttUtil mqttUtil;
    @Value(value = "${jeecg.mqtt.enable}")
    private boolean mqttEnable;
    public String getTemporaryToken() {
        if (token == null) {
            RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);
@@ -88,7 +91,7 @@
    @Transactional
    public Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo) {
        TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
       // log.info("实时数据:"+realTimeDataVo.toString());
        log.info("实时数据:"+realTimeDataVo.toString());
        // 1 查询或创建工单
@@ -129,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());
@@ -144,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());
@@ -201,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和工单号查询数据库是否有记录,有则返回,没有则新增一条
@@ -480,7 +554,7 @@
    }
    @Override
    public Result<?> fitFultRecord(RealTimeDataVo vo) {
    public Result<?> fitFaultRecord(RealTimeDataVo vo) {
        TenantContext.setTenant(vo.getTenantid()+"");
        ThreadUtil.execute(() -> {
            try {
@@ -492,7 +566,7 @@
                //处理结束后,将redis中实时数据发送至云服务器
                    Map<Object, Object> toCloudFaultMap = redisUtil.hmget(MqttConstant.MQTT_REAL_FAULT);
                    if(!toCloudFaultMap.isEmpty()){
                    if(mqttEnable && !toCloudFaultMap.isEmpty()){
                        MqMessage< Map<Object, Object>> message = new MqMessage<>();
                        message.setData(toCloudFaultMap);
                        message.setTentId(vo.getTenantid()+"");
@@ -525,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();
            }
        });
    }
    /**
     * 解析存储故障数据