From 15206b16b0121ba7331496c0f0946e4004ad4507 Mon Sep 17 00:00:00 2001 From: zhuguifei <312353457@qq.com> Date: 星期一, 18 十一月 2024 09:43:36 +0800 Subject: [PATCH] 添加故障上报、存储 --- jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryFaultRecord.java | 102 +++++++++++ jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java | 124 +++++++++++++ jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryFaultRecordMapper.java | 14 + jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java | 51 ++++- jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttConfig.java | 19 + jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryFaultRecordService.java | 15 + jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java | 7 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryFaultRecordServiceImpl.java | 19 ++ jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java | 4 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryFaultRecordController.java | 167 ++++++++++++++++++ jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java | 6 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryFaultRecordMapper.xml | 5 12 files changed, 510 insertions(+), 23 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java index 4fb4240..addf80e 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java @@ -54,6 +54,7 @@ String TENANT_UP_PREFIX = "tenant/up"; String TENANT_UP_PREFIX_REALTIME_DATA = TENANT_UP_PREFIX + "/realTime/data"; + String TENANT_UP_PREFIX_FAULT_DATA = TENANT_UP_PREFIX + "/fault/data"; String TENANT_UP_PREFIX_EQU = TENANT_UP_PREFIX + "/equipment"; @@ -67,8 +68,13 @@ /**************************鏈嶅姟绔悜绉熸埛绔姹傛暟鎹甧nd*******************************/ + + /**************************start*******************************/ + /**************************end*******************************/ + //redis缂撳瓨 String MQTT_ONLINE_CLIENT = "mqtt:online:client::"; + String MQTT_EQP_FAULT = "mqtt:eqp:fault"; } diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryFaultRecord.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryFaultRecord.java new file mode 100644 index 0000000..a4ab146 --- /dev/null +++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryFaultRecord.java @@ -0,0 +1,102 @@ +package org.jeecg.modules.dry.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: dry_eqp_fault + * @Author: jeecg-boot + * @Date: 2024-11-13 + * @Version: V1.0 + */ +@Data +@TableName("dry_fault_record") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="dry_eqp_fault瀵硅薄", description="dry_eqp_fault") +public class DryFaultRecord implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private String id; + /**宸ュ崟id*/ + @Excel(name = "宸ュ崟id", width = 15) + @ApiModelProperty(value = "宸ュ崟id") + private String orderId; + /**鏁呴殰鍚嶇О*/ + @Excel(name = "鏁呴殰鍚嶇О", width = 15) + @ApiModelProperty(value = "鏁呴殰鍚嶇О") + private String faultName; + /**鏁呴殰code*/ + @Excel(name = "鏁呴殰code", width = 15) + @ApiModelProperty(value = "宸ュ崟id") + private String faultCode; + /**鏁呴殰绫诲瀷*/ + @Excel(name = "鏁呴殰绫诲瀷", width = 15) + @ApiModelProperty(value = "鏁呴殰绫诲瀷") + private Integer faultType; + /**鏁呴殰鎻忚堪*/ + @Excel(name = "鏁呴殰鎻忚堪", width = 15) + @ApiModelProperty(value = "鏁呴殰鎻忚堪") + private String faultDesc; + /**鏁呴殰鐘舵��*/ + @Excel(name = "鏁呴殰鐘舵��", width = 15) + @ApiModelProperty(value = "鏁呴殰鐘舵��") + private Integer faultStatu; + /**寮�濮嬫椂闂�*/ + @Excel(name = "寮�濮嬫椂闂�", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "寮�濮嬫椂闂�") + private Date startTime; + /**缁撴潫鏃堕棿*/ + @Excel(name = "缁撴潫鏃堕棿", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "缁撴潫鏃堕棿") + private Date endTime; + /**鍒涘缓浜�*/ + @ApiModelProperty(value = "鍒涘缓浜�") + private String createBy; + /**鍒涘缓鏃ユ湡*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "鍒涘缓鏃ユ湡") + private Date createTime; + /**鏇存柊浜�*/ + @ApiModelProperty(value = "鏇存柊浜�") + private String updateBy; + /**鏇存柊鏃ユ湡*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "鏇存柊鏃ユ湡") + private Date updateTime; + + public DryFaultRecord() { + } + + public DryFaultRecord(String orderId, String faultName,Integer faultType, Date startTime, Date endTime) { + this.orderId = orderId; + this.faultName = faultName; + this.startTime = startTime; + this.endTime = endTime; + this.faultType = faultType; + } +} diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryFaultRecordController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryFaultRecordController.java new file mode 100644 index 0000000..0e396cf --- /dev/null +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryFaultRecordController.java @@ -0,0 +1,167 @@ +package org.jeecg.modules.dry.controller; + +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; + +import org.jeecg.modules.dry.entity.DryFaultRecord; +import org.jeecg.modules.dry.service.IDryFaultRecordService; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import org.springframework.web.servlet.ModelAndView; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + /** + * @Description: dry_eqp_fault + * @Author: jeecg-boot + * @Date: 2024-11-13 + * @Version: V1.0 + */ +@Api(tags="dry_eqp_fault") +@RestController +@RequestMapping("/dry/dryEqpFault") +@Slf4j +public class DryFaultRecordController extends JeecgController<DryFaultRecord, IDryFaultRecordService> { + @Autowired + private IDryFaultRecordService dryEqpFaultService; + + /** + * 鍒嗛〉鍒楄〃鏌ヨ + * + * @param dryEqpFault + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "dry_eqp_fault-鍒嗛〉鍒楄〃鏌ヨ") + @ApiOperation(value="dry_eqp_fault-鍒嗛〉鍒楄〃鏌ヨ", notes="dry_eqp_fault-鍒嗛〉鍒楄〃鏌ヨ") + @GetMapping(value = "/list") + public Result<IPage<DryFaultRecord>> queryPageList(DryFaultRecord dryEqpFault, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<DryFaultRecord> queryWrapper = QueryGenerator.initQueryWrapper(dryEqpFault, req.getParameterMap()); + Page<DryFaultRecord> page = new Page<DryFaultRecord>(pageNo, pageSize); + IPage<DryFaultRecord> pageList = dryEqpFaultService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 娣诲姞 + * + * @param dryEqpFault + * @return + */ + @AutoLog(value = "dry_eqp_fault-娣诲姞") + @ApiOperation(value="dry_eqp_fault-娣诲姞", notes="dry_eqp_fault-娣诲姞") + @RequiresPermissions("org.jeecg.modules.dry.mqtt:dry_eqp_fault:add") + @PostMapping(value = "/add") + public Result<String> add(@RequestBody DryFaultRecord dryEqpFault) { + dryEqpFaultService.save(dryEqpFault); + return Result.OK("娣诲姞鎴愬姛锛�"); + } + + /** + * 缂栬緫 + * + * @param dryEqpFault + * @return + */ + @AutoLog(value = "dry_eqp_fault-缂栬緫") + @ApiOperation(value="dry_eqp_fault-缂栬緫", notes="dry_eqp_fault-缂栬緫") + @RequiresPermissions("org.jeecg.modules.dry.mqtt:dry_eqp_fault:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result<String> edit(@RequestBody DryFaultRecord dryEqpFault) { + dryEqpFaultService.updateById(dryEqpFault); + return Result.OK("缂栬緫鎴愬姛!"); + } + + /** + * 閫氳繃id鍒犻櫎 + * + * @param id + * @return + */ + @AutoLog(value = "dry_eqp_fault-閫氳繃id鍒犻櫎") + @ApiOperation(value="dry_eqp_fault-閫氳繃id鍒犻櫎", notes="dry_eqp_fault-閫氳繃id鍒犻櫎") + @RequiresPermissions("org.jeecg.modules.dry.mqtt:dry_eqp_fault:delete") + @DeleteMapping(value = "/delete") + public Result<String> delete(@RequestParam(name="id",required=true) String id) { + dryEqpFaultService.removeById(id); + return Result.OK("鍒犻櫎鎴愬姛!"); + } + + /** + * 鎵归噺鍒犻櫎 + * + * @param ids + * @return + */ + @AutoLog(value = "dry_eqp_fault-鎵归噺鍒犻櫎") + @ApiOperation(value="dry_eqp_fault-鎵归噺鍒犻櫎", notes="dry_eqp_fault-鎵归噺鍒犻櫎") + @RequiresPermissions("org.jeecg.modules.dry.mqtt:dry_eqp_fault:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.dryEqpFaultService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("鎵归噺鍒犻櫎鎴愬姛!"); + } + + /** + * 閫氳繃id鏌ヨ + * + * @param id + * @return + */ + //@AutoLog(value = "dry_eqp_fault-閫氳繃id鏌ヨ") + @ApiOperation(value="dry_eqp_fault-閫氳繃id鏌ヨ", notes="dry_eqp_fault-閫氳繃id鏌ヨ") + @GetMapping(value = "/queryById") + public Result<DryFaultRecord> queryById(@RequestParam(name="id",required=true) String id) { + DryFaultRecord dryEqpFault = dryEqpFaultService.getById(id); + if(dryEqpFault==null) { + return Result.error("鏈壘鍒板搴旀暟鎹�"); + } + return Result.OK(dryEqpFault); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param dryEqpFault + */ + @RequiresPermissions("org.jeecg.modules.dry.mqtt:dry_eqp_fault:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, DryFaultRecord dryEqpFault) { + return super.exportXls(request, dryEqpFault, DryFaultRecord.class, "dry_eqp_fault"); + } + + /** + * 閫氳繃excel瀵煎叆鏁版嵁 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("org.jeecg.modules.dry.mqtt:dry_eqp_fault:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, DryFaultRecord.class); + } + +} diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java index f786e32..09ee499 100644 --- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java @@ -3,7 +3,9 @@ import ai.djl.modality.Classifications; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.thread.ThreadUtil; import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -97,6 +99,8 @@ mqttMessage.setQos(0); mqttMessage.setPayload(JSONObject.toJSONString(realTimeDataVo).getBytes()); mqttUtil.getMqttClient().publish(MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA,mqttMessage); + //澶勭悊鏁呴殰淇℃伅 + dryRealTimeDataService.fitFultRecord(realTimeDataVo); } } catch (MqttException e) { diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryFaultRecordMapper.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryFaultRecordMapper.java new file mode 100644 index 0000000..321ca4c --- /dev/null +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryFaultRecordMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.dry.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.dry.entity.DryFaultRecord; + +/** + * @Description: dry_eqp_fault + * @Author: jeecg-boot + * @Date: 2024-11-13 + * @Version: V1.0 + */ +public interface DryFaultRecordMapper extends BaseMapper<DryFaultRecord> { + +} diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryFaultRecordMapper.xml b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryFaultRecordMapper.xml new file mode 100644 index 0000000..c02ee05 --- /dev/null +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryFaultRecordMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.dry.mapper.DryFaultRecordMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttConfig.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttConfig.java index 21a69b6..41d3db4 100644 --- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttConfig.java +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttConfig.java @@ -97,6 +97,9 @@ // 璁㈤槄绉熸埛瀹炴椂鏁版嵁 mqttClient.subscribe(MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA); System.out.println("admin璁㈤槄" + MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA); + // 璁㈤槄绉熸埛鎶ヨ鏁版嵁 + mqttClient.subscribe(MqttConstant.TENANT_UP_PREFIX_FAULT_DATA); + System.out.println("admin璁㈤槄" + MqttConstant.TENANT_UP_PREFIX_FAULT_DATA); mqttClient.subscribe(MqttConstant.TENANT_UP_PREFIX_EQU); System.out.println("admin璁㈤槄" + MqttConstant.TENANT_UP_PREFIX_EQU); initClients(); @@ -150,7 +153,7 @@ * 鏈嶅姟绔紙admin瑙掕壊锛夊惎鍔ㄦ椂鏌ヨ鎵�鏈夎澶囧苟缂撳瓨鍒皉edis */ private void initClients() { - redisUtil.del(MqttConstant.MQTT_ONLINE_CLIENT); + redisUtil.removeAll(MqttConstant.MQTT_ONLINE_CLIENT); JSONObject clients = emqxApi.queryEmqx(EmqxApi.CMD_CLIENTS); //TODO 鏍规嵁emqx杩斿洖缂栧啓瀹炰綋绫� @@ -171,11 +174,15 @@ //鏄惁杩炴帴 Boolean connected = obj.getBoolean("connected"); item.put("connected", connected); - // - String[] info = clientid.split("-"); - item.put("type", info[0]); - item.put("tenantId", info[1]); - item.put("code", info[2]); + //鏍规嵁clientid瑙f瀽(娉ㄦ剰閰嶇疆鏂囦欢涓璫lientid鏍煎紡 渚嬶細client-1000) + try { + String[] info = clientid.split("-"); + item.put("type", info[0]); + item.put("tenantId", info[1]); + //item.put("code", info[2]); + }catch (Exception e){ + e.printStackTrace(); + } if (connected) { redisUtil.set(MqttConstant.MQTT_ONLINE_CLIENT + clientid, item); diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java index e9e23cf..1efee35 100644 --- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mqtt/MqttSampleCallback.java @@ -2,7 +2,9 @@ import cn.hutool.core.thread.ThreadUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; @@ -16,17 +18,17 @@ import org.jeecg.modules.dry.api.EmqxApi; import org.jeecg.modules.dry.entity.DryEqpType; import org.jeecg.modules.dry.entity.DryEquipment; +import org.jeecg.modules.dry.entity.DryFaultRecord; import org.jeecg.modules.dry.entity.DryShop; -import org.jeecg.modules.dry.service.IDryEqpTypeService; -import org.jeecg.modules.dry.service.IDryEquipmentService; -import org.jeecg.modules.dry.service.IDryRealTimeDataService; -import org.jeecg.modules.dry.service.IDryShopService; +import org.jeecg.modules.dry.service.*; import org.jeecg.modules.dry.vo.DryEquipmentVo; import org.jeecg.modules.dry.vo.RealTimeDataVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; + +import java.util.List; @Slf4j @Component @@ -56,16 +58,20 @@ @Autowired private IDryShopService dryShopService; + @Autowired + private IDryFaultRecordService faultRecordService; + @Override public void connectionLost(Throwable throwable) { System.err.println("杩炴帴鏂紑锛氾細鎺夌嚎"); + System.err.println("杩炴帴鏂紑锛氾細"+throwable.toString()); } @Override - public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { + public void messageArrived(String topic, MqttMessage mqttMessage) { System.out.println("鏀跺埌娑堟伅: \n topic锛�" + topic + "\n Qos锛�" + mqttMessage.getQos() + "\n payload锛�" + new String(mqttMessage.getPayload())); @@ -90,12 +96,15 @@ item.put("clientid", clientid); //鏄惁杩炴帴 item.put("connected", true); - // - String[] info = clientid.split("-"); - item.put("type", info[0]); - item.put("tenantId", info[1]); - item.put("code", info[2]); - + //鏍规嵁clientid瑙f瀽(娉ㄦ剰閰嶇疆鏂囦欢涓璫lientid鏍煎紡 渚嬶細client-1000) + try { + String[] info = clientid.split("-"); + item.put("type", info[0]); + item.put("tenantId", info[1]); + //item.put("code", info[2]); + }catch (Exception e){ + e.printStackTrace(); + } redisUtil.set(MqttConstant.MQTT_ONLINE_CLIENT + clientid, item); System.err.println(String.format("璁惧: %s涓婄嚎", clientid)); } @@ -150,7 +159,7 @@ messageJson.put("timestamp", DateUtils.zone2Str(messageJson.get("timestamp").toString())); } // 瀹炴椂鏁版嵁涓婁紶澶绻佷笖鏁版嵁鍐呭瓒呰繃瀛楁澶у皬涓嶈褰曟棩蹇� - if (!topic.equals(MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA)){ + if (!topic.equals(MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA) && !topic.equals(MqttConstant.TENANT_UP_PREFIX_FAULT_DATA)){ baseCommonService.addLog(message, CommonConstant.LOG_TYPE_MQTT, CommonConstant.OPERATE_MQTT_1); } @@ -203,6 +212,24 @@ }); break; + // 鎺ユ敹璁惧鎶ヨ鏁版嵁 + case MqttConstant.TENANT_UP_PREFIX_FAULT_DATA: + ThreadUtil.execute(() -> { + try { + + JSONObject jsonObject = JSON.parseObject(message); + List<DryFaultRecord> faultRecords = JSON.parseArray(jsonObject.get("data").toString(), DryFaultRecord.class); + System.err.println(faultRecords.toString()); + faultRecordService.saveBatch(faultRecords); + + } catch (Exception e) { + e.printStackTrace(); + } + }); + + break; + + case MqttConstant.TENANT_UP_PREFIX_EQU: ThreadUtil.execute(() -> { try { diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryFaultRecordService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryFaultRecordService.java new file mode 100644 index 0000000..6173b97 --- /dev/null +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryFaultRecordService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.dry.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.dry.entity.DryFaultRecord; + +/** + * @Description: dry_eqp_fault + * @Author: jeecg-boot + * @Date: 2024-11-13 + * @Version: V1.0 + */ +public interface IDryFaultRecordService extends IService<DryFaultRecord> { + +} diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java index 713ad91..60a6bbd 100644 --- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java @@ -15,4 +15,11 @@ Result<?> queryWorkshopStatistics(RealTimeDataVo realTimeDataVo); Result<?> statisticsDataHandle(StatisticsDataVo statsDataVo); + + /** + * 閫氳繃瀹炴椂鏁版嵁鏀堕泦澶勭悊鏁呴殰淇℃伅 + * @param realTimeDataVo + * @return + */ + Result<?> fitFultRecord(RealTimeDataVo realTimeDataVo); } diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryFaultRecordServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryFaultRecordServiceImpl.java new file mode 100644 index 0000000..ce045e9 --- /dev/null +++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryFaultRecordServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.dry.service.impl; + + +import org.jeecg.modules.dry.entity.DryFaultRecord; +import org.jeecg.modules.dry.mapper.DryFaultRecordMapper; +import org.jeecg.modules.dry.service.IDryFaultRecordService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: dry_eqp_fault + * @Author: jeecg-boot + * @Date: 2024-11-13 + * @Version: V1.0 + */ +@Service +public class DryFaultRecordServiceImpl extends ServiceImpl<DryFaultRecordMapper, DryFaultRecord> implements IDryFaultRecordService { + +} 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 index e3f64dd..8910d51 100644 --- 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,10 +1,14 @@ 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.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.session.IoSession; @@ -20,6 +24,7 @@ import org.jeecg.common.constant.MqttConstant; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; +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; @@ -41,10 +46,8 @@ import java.io.ObjectOutputStream; import java.net.Socket; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Service @@ -68,6 +71,9 @@ @Autowired private IDryProdRecordService prodRecordService; + + @Autowired + private IDryFaultRecordService faultRecordService; private String token; @@ -336,7 +342,7 @@ private void saveOrderTrendVo(DryOrderTrendVo trendVo, DryOrderVo orderVo) { //鍒ゆ柇 瀹炴椂鍚按鐜� 鎴� 瀹炴椂閲嶉噺鏈夋病鏈夊彉鍖栵紝鏈夊彉鍖栧垯鏇存柊 if(orderVo.getTrendVo() == null && trendVo != null && trendVo.getWeight() > 0 - || trendVo.getWeight() < orderVo.getTrendVo().getWeight() + || orderVo.getTrendVo()!=null && trendVo.getWeight() < orderVo.getTrendVo().getWeight() ) { DryOrder byId = dryOrderService.getById(orderVo.getId()); // 灏嗘渶鏂扮粨鏋滄洿鏂板埌宸ュ崟 @@ -485,4 +491,112 @@ public Result<?> statisticsDataHandle(StatisticsDataVo statsDataVo) { return null; } + + @Override + public Result<?> fitFultRecord(RealTimeDataVo vo) { + 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); + JSONObject json = new JSONObject(); + json.put("data",JSON.toJSONString(faultRecords1)); + + if(faultRecords1.isEmpty()) return; + MqttMessage mqttMessage = new MqttMessage(); + mqttMessage.setQos(0); + mqttMessage.setPayload((JSON.toJSONString(json).getBytes())); + mqttUtil.getMqttClient().publish(MqttConstant.TENANT_UP_PREFIX_FAULT_DATA,mqttMessage); + + } catch (Exception e) { + e.printStackTrace(); + } + }); + + return null; + } + + + /** + * 瑙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<>(); + //鏁版嵁鏍锋湰锛�"eqp_fault": "婊氱瓛闄嶈秴鏃�-鎶ヨ,椋庢満杩囨祦鎶ヨ,婊氱瓛鍗囪秴鏃�-鎶ヨ,椋庣鍗囨姤璀�", + System.err.println((faultType == 1 ? "绫诲瀷锛氭晠闅�" : "绫诲瀷锛氭姤璀�") + DateUtils.formatDateTime()+"--"+fault); + //redis涓殑鏁呴殰 + Map<Object, Object> rFauMap = redisUtil.hmget(MqttConstant.MQTT_EQP_FAULT); + 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> realFauMap = new HashMap<>(); + for (int i = 0; i < eqpFaults.length; i++) { + String eqpFault = eqpFaults[i]; + //閬垮厤绌哄瓧绗︿覆 + if(StringUtils.isEmpty(eqpFault)) continue; + //1.1妫�鏌qtt涓槸鍚﹀凡瀛樺湪杩欎釜鏁呴殰 + String redisKey = String.format("%s_%s_%s", tenantId, machineId,eqpFault); + String rFault = (String) redisUtil.get(redisKey); + //1.2濡傛灉redis涓嶅瓨鍦ㄥ垯瀛樺叆锛堝瓨鏁呴殰寮�濮嬶級 + if(rFault ==null){ + //缁勮缂撳瓨鏁版嵁 + DryFaultRecord faultRecord = new DryFaultRecord(orderId,eqpFault,faultType,new Date(),null); + realFauMap.put(redisKey,faultRecord); + } + + } + + //1.3缂撳瓨鑷硆edis + //鍚堝苟鏁版嵁 + realFauMap.forEach((key, value) -> redFauMap.putIfAbsent(key, value)); + //娌℃湁鏂版晠闅滄暟鎹笉鐢ㄨ鐩� + if(!realFauMap.isEmpty()){ + redisUtil.hmset(MqttConstant.MQTT_EQP_FAULT,redFauMap); + } + + + + //2妫�娴嬪凡缁撴潫鐨勬晠闅� + //2.1濡傛灉瀹炴椂鏁版嵁涓嶅瓨鍦╮edis瀛樺湪鍒欎唬琛ㄦ晠闅滅粨鏉燂紝瀛樺叆鏁版嵁搴� + Map<Object, Object> curFauMap = redisUtil.hmget(MqttConstant.MQTT_EQP_FAULT); + curFauMap.keySet().stream() + //鐗瑰埆娉ㄦ剰锛屽涓姤璀︾被鍨嬪叡鐢ㄦ柟娉曢渶瑕佸尯鍒嗙被鍨� + .filter(key -> !realFauMap.containsKey(key) && ((DryFaultRecord)curFauMap.get(key)).getFaultType() == faultType) + .forEach(key -> { + System.err.println((faultType == 1 ? "绫诲瀷锛氭晠闅�" : "绫诲瀷锛氭姤璀�") + DateUtils.formatDateTime()+"瀛樺叆鏁版嵁搴�"); + DryFaultRecord record = (DryFaultRecord)redFauMap.get(key); + record.setEndTime(new Date()); + faultRecordService.save(record); + redisUtil.hdel(MqttConstant.MQTT_EQP_FAULT,key); + + result.add(record); + + }); + + return result; + } + + + } -- Gitblit v1.9.3