package com.ruoyi.web.controller.gas; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.ElasticConstants; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.page.PageDomain; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableSupport; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.AggsType; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.config.ElasticSearchClient; import com.ruoyi.system.domain.GuapMonitorPoint; import com.ruoyi.system.domain.IllegalShip; import com.ruoyi.system.domain.XiuTanSemInstrument; import com.ruoyi.system.service.IAisDatabase; import com.ruoyi.system.service.IHeiYanService; import com.ruoyi.system.service.ISo2Service; import com.ruoyi.system.service.ISysDictTypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.SneakyThrows; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; 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 javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @Description: 硫含量 * @Author: huangcheng * @Date: 2021/8/26 * @Version V1.0 */ @RestController @RequestMapping("/so2") @Api(tags = "硫含量接口") public class So2Controller extends BaseController { @Autowired private ElasticSearchClient client; @Autowired private IAisDatabase aisDatabase; @Autowired private ISo2Service so2Service; @Autowired private IHeiYanService heiYanService; @Autowired private RedisCache redisCache; @Autowired private ISysDictTypeService dictTypeService; @GetMapping("/list") @ApiOperation("硫嫌疑船舶列表数据") public TableDataInfo list(IllegalShip illegalShip) { // 传来的参数 Map params = illegalShip.getParams(); Map equalsCondition = new HashMap<>(); // 组装查询条件 equalsCondition.put("mmsi", StrUtil.isBlank(illegalShip.getMmsi()) ? null : StrUtil.concat(true, "*", illegalShip.getMmsi(), "*")); equalsCondition.put("shipName", StrUtil.isBlank(illegalShip.getShipName()) ? null : StrUtil.concat(true, "*", illegalShip.getShipName(), "*")); equalsCondition.put("shipRegionType", illegalShip.getShipRegionType()); equalsCondition.put("destination", StrUtil.isBlank(illegalShip.getDestination()) ? null : StrUtil.concat(true, "*", illegalShip.getDestination(), "*")); equalsCondition.put("orgName", illegalShip.getOrgName()); equalsCondition.put("illegalStatus", illegalShip.getIllegalStatus()); equalsCondition.put("dealResult", illegalShip.getDealResult()); equalsCondition.put("fastResult", illegalShip.getFastResult()); equalsCondition.put("uploadResult", illegalShip.getUploadResult()); equalsCondition.put("illegalType", illegalShip.getIllegalType()); equalsCondition.put("monitorPointName", illegalShip.getMonitorPointName()); if (StrUtil.isNotBlank(illegalShip.getFilterMmsi()) && StrUtil.isBlank(illegalShip.getMmsi())) { equalsCondition.put("mmsi", illegalShip.getFilterMmsi()); } // 组装范围查询条件 Map rangeCondition = new HashMap<>(); if (ObjectUtil.isNotEmpty(params.get("beginTime"))) { params.put("beginTime", params.get("beginTime") + " 00:00:00"); } if (ObjectUtil.isNotEmpty(params.get("endTime"))) { params.put("endTime", params.get("endTime") + " 23:59:59"); } rangeCondition.put("createTime", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]")); List orderBy = new ArrayList<>(); orderBy.add("-createTime"); PageDomain pageDomain = TableSupport.buildPageRequest(); Map maps = client.searchDocument(equalsCondition, rangeCondition, orderBy, pageDomain.getPageNum(), pageDomain.getPageSize(), ElasticConstants.SO2_ALERT, ElasticConstants.AIS_ILLEGAL_SHIP); // 查询so2系统的设备信息 Map so2Device = so2Service.queryDeviceMap(); Map aisDevice = aisDatabase.queryDeviceMap(); TableDataInfo rspData = new TableDataInfo(); rspData.setCode(HttpStatus.SUCCESS); rspData.setMsg("查询成功"); List pageList = Convert.toList(IllegalShip.class, maps.get("pageList")); for (IllegalShip ship : pageList) { if ("xiutan".equals(ship.getIllegalType())) { ship.setDeviceName(aisDevice.get(ship.getSemId())); } else if ("guangpu".equals(ship.getIllegalType())) { ship.setDeviceName(so2Device.get(ship.getDeviceId())); } } rspData.setRows(pageList); rspData.setTotal(Convert.toLong(maps.get("totalNum"))); return rspData; } @SneakyThrows @Log(title = "硫含量记录导出", businessType = BusinessType.EXPORT) @GetMapping("/export") public AjaxResult export(IllegalShip illegalShip, HttpServletRequest request, HttpServletResponse response) { // 传来的参数 Map params = illegalShip.getParams(); Map equalsCondition = new HashMap<>(); // 组装查询条件 equalsCondition.put("mmsi", StrUtil.isBlank(illegalShip.getMmsi()) ? null : StrUtil.concat(true, "*", illegalShip.getMmsi(), "*")); equalsCondition.put("shipName", StrUtil.isBlank(illegalShip.getShipName()) ? null : StrUtil.concat(true, "*", illegalShip.getShipName(), "*")); equalsCondition.put("shipRegionType", illegalShip.getShipRegionType()); equalsCondition.put("destination", StrUtil.isBlank(illegalShip.getDestination()) ? null : StrUtil.concat(true, "*", illegalShip.getDestination(), "*")); equalsCondition.put("orgName", illegalShip.getOrgName()); equalsCondition.put("illegalStatus", illegalShip.getIllegalStatus()); equalsCondition.put("dealResult", illegalShip.getDealResult()); equalsCondition.put("fastResult", illegalShip.getFastResult()); equalsCondition.put("uploadResult", illegalShip.getUploadResult()); equalsCondition.put("illegalType", illegalShip.getIllegalType()); equalsCondition.put("monitorPointName", illegalShip.getMonitorPointName()); if (StrUtil.isNotBlank(illegalShip.getFilterMmsi()) && StrUtil.isBlank(illegalShip.getMmsi())) { equalsCondition.put("mmsi", illegalShip.getFilterMmsi()); } // 组装范围查询条件 Map rangeCondition = new HashMap<>(); if (ObjectUtil.isNotEmpty(params.get("beginTime"))) { params.put("beginTime", params.get("beginTime") + " 00:00:00"); } if (ObjectUtil.isNotEmpty(params.get("endTime"))) { params.put("endTime", params.get("endTime") + " 23:59:59"); } rangeCondition.put("createTime", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]")); List orderBy = new ArrayList<>(); orderBy.add("-createTime"); Map maps = client.searchDocument(equalsCondition, rangeCondition, orderBy, 1, 1000000, ElasticConstants.SO2_ALERT, ElasticConstants.AIS_ILLEGAL_SHIP); ExcelUtil util = new ExcelUtil<>(IllegalShip.class); return util.exportExcel(Convert.toList(IllegalShip.class, maps.get("pageList")), "硫含量违规数据"); /*util.exportExcelByEasyPoi("so2_" + DateUtil.today(), "硫含量违规数据", "硫含量违规数据", IllegalShip.class, Convert.toList(IllegalShip.class, maps.get("pageList")), request, response); ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下 mv.addObject(NormalExcelConstants.CLASS, clazz); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title)); mv.addObject(NormalExcelConstants.DATA_LIST, exportList); return mv;*/ } @GetMapping("/guangpu/monitorPoint") @ApiOperation("光谱-检测点数据") public AjaxResult monitorPoint(GuapMonitorPoint monitorPoint) { // 传来的参数 Map equalsCondition = new HashMap<>(); // 组装查询条件 equalsCondition.put("name", StrUtil.isBlank(monitorPoint.getName()) ? null : StrUtil.concat(true, "*", monitorPoint.getName(), "*")); Map maps = client.searchDocument(equalsCondition, null, null, 1, 10000, ElasticConstants.SO2_MONITOR_POINT); return AjaxResult.success(Convert.toList(GuapMonitorPoint.class, maps.get("pageList"))); } @GetMapping("/xiutan/semInstrument") @ApiOperation("嗅探-设备数据") public AjaxResult semInstrument(XiuTanSemInstrument semInstrument) { // 传来的参数 Map equalsCondition = new HashMap<>(); // 组装查询条件 equalsCondition.put("name", StrUtil.isBlank(semInstrument.getName()) ? null : StrUtil.concat(true, "*", semInstrument.getName(), "*")); Map maps = client.searchDocument(equalsCondition, null, null, 1, 10000, ElasticConstants.AIS_SEM_INSTRUMENT); return AjaxResult.success(Convert.toList(XiuTanSemInstrument.class, maps.get("pageList"))); } @GetMapping("/static/device") @ApiOperation("设备安装位置统计") public AjaxResult deviceStatic() { if (redisCache.hasKey(CacheConstants.DEVICE_STATIC)) { return AjaxResult.success(redisCache.getCacheMap(CacheConstants.DEVICE_STATIC)); } List> aisDevice = aisDatabase.queryDeviceStatic(); List> so2Device = so2Service.queryDeviceStatic(); List> heiyanDevice = heiYanService.queryDeviceStatic(); // 两个结果合并 Map result = new HashMap<>(8); for (Map stringIntegerMap : aisDevice) { result.put(Convert.toStr(stringIntegerMap.get("point")), Convert.toInt(stringIntegerMap.get("count"))); } for (Map stringIntegerMap : so2Device) { result.put(Convert.toStr(stringIntegerMap.get("point")), Convert.toInt(NumberUtil.add(result.get(Convert.toStr(stringIntegerMap.get("point"))), Convert.toInt(stringIntegerMap.get("count"))))); } for (Map stringObjectMap : heiyanDevice) { result.put(Convert.toStr(stringObjectMap.get("point")), Convert.toInt(NumberUtil.add(result.get(Convert.toStr(stringObjectMap.get("point"))), Convert.toInt(stringObjectMap.get("count"))))); } redisCache.setCacheMap(CacheConstants.DEVICE_STATIC, result); return AjaxResult.success(result); } @GetMapping("/static/semDevice") @ApiOperation("设备安装位置及设备类型统计") public AjaxResult semDevice() { if (redisCache.hasKey(CacheConstants.DEVICE_SEM_STATIC)) { return AjaxResult.success(redisCache.getCacheMap(CacheConstants.DEVICE_SEM_STATIC)); } Map result = new HashMap<>(); Map aisDevice = aisDatabase.queryDeviceStatic().stream().collect(Collectors.toMap(s -> s.get("point"), v -> v.get("count"))); Map so2Device = so2Service.queryDeviceStatic().stream().collect(Collectors.toMap(s -> s.get("point"), v -> v.get("count"))); Map heiyanDevice = heiYanService.queryDeviceStatic().stream().collect(Collectors.toMap(s -> s.get("point"), v -> v.get("count"))); result.put("南京三桥", new Integer[]{Convert.toInt(aisDevice.getOrDefault("南京三桥", 0)), Convert.toInt(so2Device.getOrDefault("南京三桥", 0)), Convert.toInt(heiyanDevice.getOrDefault("南京三桥", 0))}); result.put("南京四桥", new Integer[]{Convert.toInt(aisDevice.getOrDefault("南京四桥", 0)), Convert.toInt(so2Device.getOrDefault("南京四桥", 0)), Convert.toInt(heiyanDevice.getOrDefault("南京四桥", 0))}); result.put("润扬大桥", new Integer[]{Convert.toInt(aisDevice.getOrDefault("润扬大桥", 0)), Convert.toInt(so2Device.getOrDefault("润扬大桥", 0)), Convert.toInt(heiyanDevice.getOrDefault("润扬大桥", 0))}); result.put("泰州大桥", new Integer[]{Convert.toInt(aisDevice.getOrDefault("泰州大桥", 0)), Convert.toInt(so2Device.getOrDefault("泰州大桥", 0)), Convert.toInt(heiyanDevice.getOrDefault("泰州大桥", 0))}); result.put("江阴大桥", new Integer[]{Convert.toInt(aisDevice.getOrDefault("江阴大桥", 0)), Convert.toInt(so2Device.getOrDefault("江阴大桥", 0)), Convert.toInt(heiyanDevice.getOrDefault("江阴大桥", 0))}); result.put("苏通大桥", new Integer[]{Convert.toInt(aisDevice.getOrDefault("苏通大桥", 0)), Convert.toInt(so2Device.getOrDefault("苏通大桥", 0)), Convert.toInt(heiyanDevice.getOrDefault("苏通大桥", 0))}); redisCache.setCacheMap(CacheConstants.DEVICE_SEM_STATIC, result); redisCache.expire(CacheConstants.DEVICE_SEM_STATIC, 86400); return AjaxResult.success(result); } @GetMapping("/static/deviceType") @ApiOperation("设备类型统计") public AjaxResult deviceTypeStatic() { if (redisCache.hasKey(CacheConstants.DEVICE_TYPE_STATIC)) { return AjaxResult.success(redisCache.getCacheMap(CacheConstants.DEVICE_TYPE_STATIC)); } int aisDevice = aisDatabase.queryDeviceCount(); int so2Device = so2Service.queryDeviceCount(); int heiyanDevice = heiYanService.queryDeviceCount(); // 两个结果合并 Map result = new HashMap<>(4); result.put("光谱", so2Device); result.put("嗅探", aisDevice); result.put("黑烟", heiyanDevice); redisCache.setCacheMap(CacheConstants.DEVICE_TYPE_STATIC, result); return AjaxResult.success(result); } @GetMapping("/snapPos/static") @ApiOperation("硫含量超标船舶分布统计") public AjaxResult so2SnapPosStatic(@RequestParam(required = false) String month) { String beginTime = ""; String endTime = ""; if (StrUtil.isBlank(month)) { beginTime = DateUtil.formatDate(DateUtil.beginOfMonth(new Date())) + " 00:00:00"; endTime = DateUtil.formatDate(DateUtil.endOfMonth(new Date())) + " 23:59:59"; } else { beginTime = month + "-01 00:00:00"; endTime = DateUtil.formatDate(DateUtil.endOfMonth(DateUtil.parseDate(beginTime))) + " 23:59:59"; } Map equalsCondition = new HashMap<>(); equalsCondition.put("illegalStatus", 2); Map so2RangeCondition = new HashMap<>(); so2RangeCondition.put("createTime", StrUtil.concat(true, "[", beginTime, ",", endTime, "]")); Map so2Aggs = client.aggs(AggsType.count, "monitorPointName", "id", equalsCondition, so2RangeCondition, ElasticConstants.AIS_ILLEGAL_SHIP, ElasticConstants.SO2_ALERT); // 构造硫的数据 List so2_snap_pos = dictTypeService.selectDictDataByType("so2_snap_pos"); Map result = new HashMap<>(); for (SysDictData so2_snap_po : so2_snap_pos) { result.put(so2_snap_po.getDictLabel(), (ObjectUtil.isEmpty(so2Aggs.get(so2_snap_po.getDictLabel())) ? 0 : Convert.toInt(so2Aggs.get(so2_snap_po.getDictLabel())))); } return AjaxResult.success(result); } @GetMapping("/timeStatic") @ApiOperation("超标船舶统计-按时间") public AjaxResult monthStatic(@RequestParam(required = false) String interval, @RequestParam(required = false) String startMonth, @RequestParam(required = false) String endMonth) { if (StrUtil.isBlank(interval)) { // 默认值为1个月 interval = "1M"; } Map rangeCondition = new HashMap<>(); if (!StrUtil.isAllBlank(startMonth, endMonth)) { if (StrUtil.isNotBlank(startMonth)) { startMonth = startMonth + "-01 00:00:00"; } if (StrUtil.isNotBlank(endMonth)) { endMonth = DateUtil.formatDate(DateUtil.endOfMonth(DateUtil.parseDate(endMonth + "-01 00:00:00"))) + " 23:59:59"; } rangeCondition.put("createTime", StrUtil.concat(true, "[", startMonth, ",", endMonth, "]")); } Map equalsCondition = new HashMap<>(); equalsCondition.put("illegalStatus", 2); Map aisAggs = client.dateHistogramAggs(AggsType.count, "createTime", "id", equalsCondition, rangeCondition, new DateHistogramInterval(interval), ElasticConstants.AIS_ILLEGAL_SHIP); Map so2Aggs = client.dateHistogramAggs(AggsType.count, "createTime", "id", equalsCondition, rangeCondition, new DateHistogramInterval(interval), ElasticConstants.SO2_ALERT); equalsCondition.put("illegalStatus", 3); Map heiyanAggs = client.dateHistogramAggs(AggsType.count, "createTime", "id", equalsCondition, rangeCondition, new DateHistogramInterval(interval), ElasticConstants.HEIYAN_SHIP_RECOGNITION); Map> result = new HashMap<>(); result.put("ais", aisAggs); result.put("so2", so2Aggs); result.put("black", heiyanAggs); return AjaxResult.success(result); } @GetMapping("/third/timeStatic") @ApiOperation("for-Third-超标船舶统计-按时间") public AjaxResult thirdMonthStatic(@RequestParam(required = false) String interval, @RequestParam(required = false) String startMonth, @RequestParam(required = false) String endMonth) { if (StrUtil.isBlank(interval)) { // 默认值为1个月 interval = "1M"; } Map rangeCondition = new HashMap<>(); if (!StrUtil.isAllBlank(startMonth, endMonth)) { if (StrUtil.isNotBlank(startMonth)) { startMonth = startMonth + "-01 00:00:00"; } if (StrUtil.isNotBlank(endMonth)) { endMonth = DateUtil.formatDate(DateUtil.endOfMonth(DateUtil.parseDate(endMonth + "-01 00:00:00"))) + " 23:59:59"; } rangeCondition.put("createTime", StrUtil.concat(true, "[", startMonth, ",", endMonth, "]")); } Map equalsCondition = new HashMap<>(); equalsCondition.put("illegalStatus", 2); Map so2Aggs = client.dateHistogramAggs(AggsType.count, "createTime", "id", equalsCondition, rangeCondition, new DateHistogramInterval(interval), ElasticConstants.SO2_ALERT, ElasticConstants.AIS_ILLEGAL_SHIP); equalsCondition.put("illegalStatus", 3); Map heiyanAggs = client.dateHistogramAggs(AggsType.count, "createTime", "id", equalsCondition, rangeCondition, new DateHistogramInterval(interval), ElasticConstants.HEIYAN_SHIP_RECOGNITION); Map> result = new HashMap<>(); result.put("so2", so2Aggs); result.put("black", heiyanAggs); return AjaxResult.success(result); } }