package org.jeecg.modules.dry.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.units.qual.A; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.MqttConstant; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.DateUtils; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.dry.api.EmqxApi; import org.jeecg.modules.dry.entity.DryEquipment; import org.jeecg.modules.dry.entity.DryFaultRecord; import org.jeecg.modules.dry.entity.DryOrder; import org.jeecg.modules.dry.service.IDryEquipmentService; import org.jeecg.modules.dry.service.IDryFaultRecordService; import org.jeecg.modules.dry.service.IDryOrderService; import org.jeecg.modules.dry.vo.DryFaultRecordVo; import org.jeecg.modules.dry.vo.MoEquVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.time.Duration; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @Api(tags = "移动端") @RestController @RequestMapping("/mobile") @Slf4j public class MobileController { @Autowired private IDryEquipmentService dryEquipmentService; @Autowired private IDryFaultRecordService faultRecordService; @Autowired private RedisUtil redisUtil; @Autowired private IDryOrderService orderService; @ApiOperation(value = "设备列表查询", notes = "设备列表查询") @GetMapping(value = "/equ/list") public Result> queryPageList(DryEquipment dryEquipment, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { //------------------------------------------------------------------------------------------------ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { dryEquipment.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0)); } //------------------------------------------------------------------------------------------------ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(dryEquipment, req.getParameterMap()); Page page = new Page(pageNo, pageSize); Page voPage = new Page(pageNo, pageSize); IPage pageList = dryEquipmentService.page(page, queryWrapper); compEqu(pageList, voPage); return Result.OK(voPage); } @ApiOperation(value = "设备报警数据", notes = "设备报警数据列表查询") @GetMapping(value = "/fault/list") public Result> queryFaultList(DryFaultRecord faultRecord, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { faultRecord.setTenantId(tenantId); } QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(faultRecord, req.getParameterMap()); Page page = new Page(pageNo, pageSize); IPage pageList = faultRecordService.page(page, queryWrapper); Page voPage = new Page(pageNo, pageSize); compFault(pageList, voPage); return Result.OK(voPage); } private void compFault(IPage pageList, Page page) { List collect = pageList.getRecords().stream().filter(item -> item.getOrderId() != null).map(item -> { DryFaultRecordVo vo = new DryFaultRecordVo(); BeanUtils.copyProperties(item, vo); String orderCode = item.getOrderId(); QueryWrapper orderQueryWrapper = new QueryWrapper<>(); orderQueryWrapper.lambda().eq(DryOrder::getCode, orderCode); DryOrder order = orderService.getOne(orderQueryWrapper); if (vo.getStartTime() != null && vo.getEndTime() != null) { String faultTimeStr = calculateTimeDifference(DateUtils.date2Str(vo.getStartTime(), DateUtils.datetimeFormat.get()), DateUtils.date2Str(vo.getEndTime(), DateUtils.datetimeFormat.get())); vo.setFaultTimeStr(faultTimeStr); } if (order == null) return vo; String equId = order.getEquId(); if (equId == null) return vo; DryEquipment equipment = dryEquipmentService.getById(equId); if (equipment == null || equipment.getName() == null) return vo; vo.setEquName(equipment.getName().substring(0, 2)); return vo; }).collect(Collectors.toList()); BeanUtils.copyProperties(pageList, page); page.setRecords(collect); } @ApiOperation(value = "报警图标数据", notes = "报警图标数据查询") @GetMapping(value = "/fault/chart") public List queryFaultChartData(DryFaultRecord faultRecord, HttpServletRequest req) { int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { faultRecord.setTenantId(tenantId); } QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(faultRecord, req.getParameterMap()); List faultList = faultRecordService.list(queryWrapper); List result = new ArrayList<>(faultList.stream() .collect(Collectors.groupingBy(DryFaultRecord::getFaultName, Collectors.collectingAndThen(Collectors.toList(), list -> new DryFaultRecordVo(list.get(0), list.size())))) .values()) .stream() .sorted(Comparator.comparingInt(DryFaultRecordVo::getECount).reversed()) .collect(Collectors.toList()); return result; } //此接口仅用作uniapp下拉返回,无实际意义 @GetMapping(value = "/sample/list") public Result> querySampleList(DryFaultRecord faultRecord, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { Page page = new Page(pageNo, pageSize); page.setRecords(Arrays.asList("")); page.setSize(1); page.setCurrent(1); return Result.OK(page); } private void compEqu(IPage pageList, Page page) { //当前租户id int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); List collect = pageList.getRecords().stream().map(item -> { MoEquVo vo = new MoEquVo(); BeanUtils.copyProperties(item, vo); String clientid = "client-" + tenantId + "-" + item.getCode(); //JSONObject client = (JSONObject) redisUtil.hget(MqttConstant.MQTT_ONLINE_CLIENT ,tenantId); JSONObject client = (JSONObject) redisUtil.hget(String.format(MqttConstant.MQTT_ONLINE_CLIENT, tenantId), clientid); //组装状态数据 if (client != null) { vo.setOnline(true); //连接时间 String st = client.getString("connectedAt"); vo.setUpTime(st); vo.setClientId(clientid); } return vo; }).collect(Collectors.toList()); //排序 collect.sort(Comparator.comparing(obj -> obj.getCode(), Comparator.nullsLast(Comparator.naturalOrder()))); collect.sort(Comparator.comparing(obj -> obj.getOnline(), Comparator.nullsLast(Comparator.naturalOrder()))); BeanUtils.copyProperties(pageList, page); page.setRecords(collect); } /** * @param startTimeStr * @param endTimeStr * @return */ private String calculateTimeDifference(String startTimeStr, String endTimeStr) { // 定义时间格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 将字符串解析为 LocalDateTime 对象 LocalDateTime startTime = LocalDateTime.parse(startTimeStr, formatter); LocalDateTime endTime = LocalDateTime.parse(endTimeStr, formatter); // 计算两个时间点之间的持续时间 Duration duration = Duration.between(startTime, endTime); // 获取小时、分钟和秒数 long hours = duration.toHours(); long minutes = duration.toMinutes() % 60; long seconds = duration.getSeconds() % 60; StringBuilder result = new StringBuilder(); if (hours > 0) { result.append(hours).append("时"); } if (minutes > 0) { result.append(minutes).append("分"); } if (seconds > 0) { result.append(seconds).append("秒"); } return result.toString(); } }