diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/controller/EsRecordReportController.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/controller/EsRecordReportController.java
new file mode 100644
index 0000000..b6c7edc
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/controller/EsRecordReportController.java
@@ -0,0 +1,156 @@
+package net.hzvtc.es.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import net.hzvtc.common.core.domain.AjaxResult;
+import net.hzvtc.common.utils.file.FileUtils;
+import net.hzvtc.service.EsRecordReportService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/es/result/report")
+@Slf4j
+@RequiredArgsConstructor
+public class EsRecordReportController {
+ private final EsRecordReportService esRecordReportService;
+
+ @PostMapping("/getBirdStatData")
+ public AjaxResult getBirdStatData(@RequestBody JSONObject object) {
+ return AjaxResult.success(esRecordReportService.getBirdDailyReportStatByParam(object));
+ }
+
+ @PostMapping("/downloadDetailsReport")
+ public void downloadReport(@RequestParam Map param, HttpServletResponse response, HttpServletRequest request) {
+
+// obj.put("dateFrom", param.get("dateFrom"));
+// obj.put("dateTo", param.get("dateTo"));
+// obj.put("excludeIds", param.get("excludeIds"));
+// log.info("=============={}", obj);
+ String filePath = esRecordReportService.exportResultRecordListFileByParam(param);
+// log.info("===========fileName============{}", filePath);
+ if (filePath != null) {
+ try {
+ String realFileName = System.currentTimeMillis() + ".xlsx";
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setCharacterEncoding("utf-8");
+ FileUtils.setAttachmentResponseHeader(response, realFileName);
+ FileUtils.writeBytes(filePath, response.getOutputStream());
+ } catch (Exception ex) {
+ log.error("error", ex);
+ }
+ }
+ }
+
+ //
+// @PostMapping("/sendEmail")
+// public AjaxResult sendEmail(@RequestBody JSONObject object) {
+// return AjaxResult.success(esRecordReportService.sendBirdDataStatEmail(object));
+// }
+ @PostMapping("/speciesMediaStatList")
+ public JSONObject getSpeciesMediaListByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getSpeciesMediaListByParam(object);
+ }
+
+ @PostMapping("/recordStatList")
+ public JSONObject getRecordStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getResultRecordStatReportByParam(object);
+ }
+
+ @PostMapping("/areaStatList")
+ public JSONObject getAreaStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getAreaStatReportByParam(object);
+ }
+
+ @PostMapping("/dateStatList")
+ public JSONObject getRecordStatByDate(@RequestBody JSONObject object) {
+ return esRecordReportService.getRecordStatDateReportByParam(object);
+ }
+
+ @PostMapping("/dateValidStatList")
+ public JSONObject getValidStatByDate(@RequestBody JSONObject object) {
+ return esRecordReportService.getValidStatDateReportByParam(object);
+ }
+
+ @PostMapping("/recordValidStatList")
+ public JSONObject getRecordValidStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getResultRecordValidStatReportByParam(object);
+ }
+
+ @PostMapping("/heatStatList")
+ public JSONObject getRecordValidHeataStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getHeatValidStatReportByParam(object);
+ }
+
+ @PostMapping("/recordDailyStatList")
+ public JSONObject getRecordDailyStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getRecordDailyStatReportByParam(object);
+ }
+
+ @PostMapping("/cameraStatList")
+ public JSONObject getCameraStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getCameraRecordStatReportByParam(object);
+ }
+
+ @PostMapping("/habitatStatList")
+ public JSONObject getHabitatStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getSpeciesHabitatStatReportByParam(object);
+ }
+
+ @PostMapping("/raiStatList")
+ public JSONObject getRAIStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getValidRAIReportByParam(object);
+ }
+
+ @PostMapping("/rnStatList")
+ public JSONObject getRNStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getValidRNReportByParam(object);
+ }
+
+ @PostMapping("/percentStatList")
+ public JSONObject getPercentStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getValidPercentReportByParam(object);
+ }
+
+ @PostMapping("/rrpStatList")
+ public JSONObject getSpeciesRRPStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getValidRAIRNPtReportByParam(object);
+ }
+
+ @PostMapping("/rhythmStatList")
+ public JSONObject getRhythmStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getRhythmReportByParam(object);
+ }
+
+ @PostMapping("/multiStatList")
+ public JSONObject getMultiStatByParam(@RequestBody JSONObject object) {
+ return esRecordReportService.getSpeciesMultiStatReportByParam(object);
+ }
+
+ @GetMapping("/speciesList")
+ public JSONObject getSpeciesList() {
+ return esRecordReportService.getSpeciesTreeList();
+ }
+
+ @PostMapping("/periodStat")
+ public AjaxResult getBirdPeriodStat(@RequestBody JSONObject obj) {
+ obj.put("type", 1);
+ return AjaxResult.success(esRecordReportService.getBirdPeriodStatByParam(obj));
+ }
+
+ @PostMapping("/monthStat")
+ public AjaxResult getMonthStat(@RequestBody JSONObject obj) {
+ obj.put("type", 2);
+ return AjaxResult.success(esRecordReportService.getBirdPeriodStatByParam(obj));
+ }
+
+ @PostMapping("/yearStat")
+ public AjaxResult getYearStat(@RequestBody JSONObject obj) {
+ obj.put("type", 3);
+ return AjaxResult.success(esRecordReportService.getBirdPeriodStatByParam(obj));
+ }
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/controller/EsResultRecordDetailsController.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/controller/EsResultRecordDetailsController.java
new file mode 100644
index 0000000..836f57e
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/controller/EsResultRecordDetailsController.java
@@ -0,0 +1,148 @@
+package net.hzvtc.es.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import net.hzvtc.common.core.domain.AjaxResult;
+import net.hzvtc.common.core.page.TableDataInfo;
+import net.hzvtc.device.domain.DeviceInfo;
+import net.hzvtc.service.EsResultRecordDetailsService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/es/result/details")
+@RequiredArgsConstructor
+public class EsResultRecordDetailsController {
+ private final EsResultRecordDetailsService esResultRecordDetailsService;
+
+
+ @PostMapping("/querySpeciesByParam")
+ public TableDataInfo querySpeciesListByParam(@RequestBody JSONObject params) {
+ params.put("isDeleted", 0);
+ return esResultRecordDetailsService.querySpeciesRecordListByParam(params, 0);
+ }
+
+ @PostMapping("/getSpeciesStatInfoByParam")
+ public JSONObject getSpeciesStatInfoByParam(@RequestBody JSONObject params) {
+ return esResultRecordDetailsService.getSpeciesStatInfo(params);
+ }
+
+ @PostMapping("/querySpeciesByParamForApp")
+ public TableDataInfo querySpeciesListByParamForApp(@RequestBody JSONObject params) {
+ params.put("isDeleted", 0);
+ return esResultRecordDetailsService.querySpeciesRecordListByParam(params, 1);
+ }
+
+ @PostMapping("/querySpeciesByQuery")
+ public TableDataInfo querySpeciesListByQuery(@RequestBody JSONObject obj) {
+ obj.put("isDeleted", 0);
+ return esResultRecordDetailsService.getProtectedAreaSpeciesByQuery(obj);
+ }
+
+ @PostMapping("/birdResultMedias")
+ public TableDataInfo getBirdResultMediasByParam(@RequestBody JSONObject params) {
+ return esResultRecordDetailsService.getResultMediaListByParam(params);
+ }
+
+ @DeleteMapping("/delDocument/{ids}")
+ public AjaxResult deleteDocumentById(@PathVariable String ids) {
+ return AjaxResult.success(esResultRecordDetailsService.deleteDocumentById(ids));
+ }
+
+
+ @PostMapping("/updateResultRecord")
+ public AjaxResult updateResultRecord(@RequestBody JSONObject data) {
+ return AjaxResult.success(esResultRecordDetailsService.updateResultRecordInfoById(data));
+ }
+
+ @PostMapping("/updateResultRecords")
+ public AjaxResult updateResultRecords(@RequestBody JSONObject data) {
+ return AjaxResult.success(esResultRecordDetailsService.updateResultRecordInfoByIds(data));
+ }
+
+ @PostMapping("/birdAudioDailyStat")
+ public AjaxResult getBirdAudioDailyStatList(@RequestBody JSONObject obj) {
+ obj.put("isDeleted", 0);
+ return AjaxResult.success(esResultRecordDetailsService.getBirdAudioDailyStatListByParam(obj));
+ }
+
+ @PostMapping("/birdDailyStat")
+ public AjaxResult getBirdDailyStatList(@RequestBody JSONObject obj) {
+ obj.put("isDeleted", 0);
+ return AjaxResult.success(esResultRecordDetailsService.getBirdDailyStatListByParam(obj));
+ }
+
+ @PostMapping("/birdAudioMonthStat")
+ public AjaxResult getBirdAudioMonthStatList(@RequestBody JSONObject obj) {
+ obj.put("isDeleted", 0);
+ return AjaxResult.success(esResultRecordDetailsService.getBirdAudioMonthStatListByParam(obj));
+ }
+
+ @PostMapping("/birdAudioYearStat")
+ public AjaxResult getBirdAudioYearStatList(@RequestBody JSONObject obj) {
+ obj.put("isDeleted", 0);
+ return AjaxResult.success(esResultRecordDetailsService.getBirdAudioYearStatListByParam(obj));
+ }
+
+ @GetMapping("/listByParam")
+ public AjaxResult getListByParam(DeviceInfo deviceInfo) {
+ return AjaxResult.success(esResultRecordDetailsService.getDeviceInfoListForPage(deviceInfo));
+ }
+
+ @GetMapping("/speciesListByParam")
+ public AjaxResult getSpeciesListByParam() {
+ return AjaxResult.success(esResultRecordDetailsService.getSpeciesListForSelect());
+ }
+
+ @GetMapping("/mediaStatInfo")
+ public JSONObject getStatAmount() {
+ return esResultRecordDetailsService.getResultMediaStatByParam();
+ }
+
+ @PostMapping("/speciesStatList")
+ public JSONObject getSpeciesMediaStatInfoByParam(@RequestBody JSONObject object) {
+ return esResultRecordDetailsService.getSpeciesStatListByParam(object);
+ }
+
+ @GetMapping("/listForMap")
+ public List getDeviceListForGisMap() {
+ return esResultRecordDetailsService.getDeviceInfoListForGisMap();
+ }
+
+ @PostMapping("/updateDocumentInfoByParam")
+ public AjaxResult updateStatus(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.updateResultRecordInfoById(param));
+ }
+
+ @PostMapping("/updateDocumentFavorite")
+ public AjaxResult updateFavorite(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.updateResultRecordInfoById(param));
+ }
+
+ @PostMapping("/updateSpeciesInfo")
+ public AjaxResult updateSpeciesInfo(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.updateSpeciesInfo(param));
+ }
+
+ @PostMapping("/deleteSpeciesInfo")
+ public AjaxResult deleteSpeciesInfo(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.deleteSpeciesInfo(param));
+ }
+
+ @PostMapping("/addSpeciesInfo")
+ public AjaxResult addSpeciesInfo(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.addSpeciesInfo(param));
+ }
+
+ @PostMapping("/favoriteList")
+ public AjaxResult getFavoriteMediaList(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.getFavoriteMediaList(param));
+ }
+
+ @PostMapping("/listByItemId")
+ public AjaxResult getMediaListByItemId(@RequestBody JSONObject param) {
+ return AjaxResult.success(esResultRecordDetailsService.getMediaListByItemId(param));
+ }
+}
+
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetails.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetails.java
new file mode 100644
index 0000000..a9bc854
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetails.java
@@ -0,0 +1,64 @@
+package net.hzvtc.es.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.ibatis.type.Alias;
+import org.springframework.data.annotation.Id;
+
+import java.time.ZonedDateTime;
+import java.util.List;
+
+@Data
+@Alias("EsResultRecordDetails")
+@AllArgsConstructor
+@NoArgsConstructor
+//@JsonIgnoreProperties(ignoreUnknown = true)
+public class EsResultRecordDetails {
+ @Id
+ private Long id;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+ private ZonedDateTime recordTime;
+
+ private Long deviceId;
+
+ private String deviceName;
+
+ private Integer deviceType;
+
+ private String duid;
+
+ private Long deptId;
+
+ private String deptName;
+
+ private String deptLetter;
+
+ private int checked;
+
+ private Long mediaId;
+
+ private String mediaUrl;
+
+ private String metaUrl;
+
+ private int mediaType;
+
+ private Integer favorite;
+
+ private String memo;
+
+ private String tag;
+
+ private String version;
+
+ private Long itemId;
+
+ private List items;
+
+ private int isDeleted;
+
+ private String aiName;
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetailsBak.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetailsBak.java
new file mode 100644
index 0000000..925881f
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetailsBak.java
@@ -0,0 +1,59 @@
+package net.hzvtc.es.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.data.annotation.Id;
+
+import java.time.ZonedDateTime;
+
+
+public class EsResultRecordDetailsBak {
+ @Id
+ private Long id;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+ private ZonedDateTime recordTime;
+
+ private Long recordId;
+
+ private Long deviceId;
+
+ private String deviceName;
+
+ private Integer deviceType;
+
+ private String duid;
+
+ private Long speciesId;
+
+ private String speciesName;
+
+ private String scientificName;
+
+ private Long deptId;
+
+ private int checked;
+
+ private int count;
+
+ private String habitat;
+
+ private double confidence;
+
+ private Long mediaId;
+
+ private String mediaUrl;
+
+ private String metaUrl;
+
+ private int mediaType;
+
+ private int recordType;
+
+ private Integer favorite;
+
+ private String birdIcon;
+
+ private String version;
+
+ private int isDeleted;
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetailsVo.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetailsVo.java
new file mode 100644
index 0000000..7159491
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordDetailsVo.java
@@ -0,0 +1,86 @@
+package net.hzvtc.es.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.apache.ibatis.type.Alias;
+import org.springframework.data.annotation.Id;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Data
+@Alias("EsResultRecordDetailsVo")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EsResultRecordDetailsVo {
+ @Id
+ private Long id;
+
+ @JsonIgnore
+ private LocalDateTime recordTime1;
+
+ private Long recordId;
+
+ private Long deviceId;
+
+ private String deviceName;
+
+ private String duid;
+
+ private Long speciesId;
+
+ private String speciesName;
+
+ private String scientificName;
+
+ private Long deptId;
+
+ private int checked;
+
+ private int count;
+
+ private String habitat;
+
+ private double confidence;
+
+ private Long mediaId;
+
+ private String mediaUrl;
+
+ private String metaUrl;
+
+ private int mediaType;
+
+ private int recordType;
+
+ private Integer favorite;
+
+ private String birdIcon;
+
+ private int isDeleted;
+
+ public String getRecordTime() {
+ if (recordTime1 != null) {
+// LocalDateTime localDateTime =
+// ZonedDateTime zonedDateTime = recordTime1.atZone(ZoneId.of("Asia/Shanghai"));
+
+// ZoneId systemDefault = ZoneId.systemDefault();
+// return zonedDateTime.format(DateTimeFormatter.ISO_DATE_TIME);
+// return recordTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));
+ ZonedDateTime zonedDateTime = recordTime1.atZone(ZoneId.of("Asia/Shanghai"));
+
+ // 使用 DateTimeFormatter 格式化为 ISO 8601 格式的字符串
+// return zonedDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+ ZonedDateTime utcDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC"));
+
+ // 格式化为目标字符串
+ return utcDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
+
+
+ } else {
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordReportData.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordReportData.java
new file mode 100644
index 0000000..def9ec7
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/EsResultRecordReportData.java
@@ -0,0 +1,85 @@
+package net.hzvtc.es.domain;
+
+import lombok.Data;
+import net.hzvtc.data.check.domain.MediaItem;
+import net.hzvtc.device.domain.DeviceInfo;
+
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Data
+public class EsResultRecordReportData {
+ private Long id;
+
+
+ private String recordTime;
+
+ private Long deviceId;
+
+ private DeviceInfo deviceInfo;
+
+ private Long deptId;
+
+ private String fullPath;
+
+ private int checked;
+
+ private Long mediaId;
+
+ private String mediaUrl;
+
+ private String metaUrl;
+
+ private String fileName;
+
+ private int mediaType;
+
+// private Integer favorite;
+//
+// private String memo;
+//
+// private String tag;
+//
+// private String version;
+
+ private Long itemId;
+
+ private List items;
+
+ private MediaItem mediaItem;
+
+ public void convertFrom(EsResultRecordDetails data) {
+ setId(data.getId());
+ DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ if (data.getRecordTime() != null) {
+ setRecordTime(data.getRecordTime().withZoneSameInstant(ZoneId.of("Asia/Shanghai")).format(fmDate));
+ } else {
+ setRecordTime("");
+ }
+ setDeptId(data.getDeptId());
+ setDeviceId(data.getDeviceId());
+ setMediaId(data.getMediaId());
+ setMediaUrl(data.getMediaUrl());
+ setMetaUrl(data.getMetaUrl());
+ setMediaType(data.getMediaType());
+ setItemId(data.getItemId());
+
+ if (mediaType == 2) {
+ if (metaUrl != null) {
+ String name = metaUrl.substring(metaUrl.lastIndexOf("/") + 1);
+ setFileName(name);
+ }
+ } else if (mediaType == 3) {
+ if (mediaUrl != null) {
+ String name = mediaUrl.substring(mediaUrl.lastIndexOf("/") + 1);
+ setFileName(name);
+ }
+ }
+// setFavorite(data.getFavorite());
+// setMemo(data.getMemo());
+// setTag(data.getTag());
+// setVersion(data.getVersion());
+
+ }
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/SpeciesItem.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/SpeciesItem.java
new file mode 100644
index 0000000..db4339b
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/domain/SpeciesItem.java
@@ -0,0 +1,18 @@
+package net.hzvtc.es.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SpeciesItem {
+ private Long detailsId;
+ private Long recordId;
+ private Long speciesId;
+ private String speciesName;
+ private String scientificName;
+ private int count;
+ private int isValid;
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/es/mapper/EsResultRecordDetailsMapper.java b/ai-xuebao-es/src/main/java/net/hzvtc/es/mapper/EsResultRecordDetailsMapper.java
new file mode 100644
index 0000000..216d193
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/es/mapper/EsResultRecordDetailsMapper.java
@@ -0,0 +1,15 @@
+package net.hzvtc.es.mapper;
+
+import net.hzvtc.echart.domain.vo.BirdStatDataVo;
+import net.hzvtc.es.domain.EsResultRecordDetailsVo;
+
+import java.util.List;
+import java.util.Map;
+
+public interface EsResultRecordDetailsMapper {
+ List getResultRecordListForElastic(Map param);
+
+ List getDeviceListByParam(Map map);
+
+ List getAreaBirdSpeciesByParam(Map map);
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/service/EsRecordReportService.java b/ai-xuebao-es/src/main/java/net/hzvtc/service/EsRecordReportService.java
new file mode 100644
index 0000000..45d0f50
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/service/EsRecordReportService.java
@@ -0,0 +1,55 @@
+package net.hzvtc.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Map;
+
+public interface EsRecordReportService {
+ JSONObject getBirdDailyReportStatByParam(JSONObject param);
+
+// String getBirdDataStatFileByParam(JSONObject param);
+
+ String exportResultRecordListFileByParam(Map param);
+
+ String exportValidResultRecordListFileByParam(Map param);
+
+// boolean sendBirdDataStatEmail(JSONObject param);
+
+ JSONObject getSpeciesWeeklyReportByParam(JSONObject param);
+
+ JSONObject getSpeciesMediaListByParam(JSONObject param);
+
+ JSONObject getResultRecordStatReportByParam(JSONObject param);
+
+ JSONObject getResultRecordValidStatReportByParam(JSONObject param);
+
+ JSONObject getHeatValidStatReportByParam(JSONObject param);
+
+ JSONObject getCameraRecordStatReportByParam(JSONObject param);
+
+ JSONObject getAreaStatReportByParam(JSONObject param);
+
+ JSONObject getSpeciesTreeList();
+
+ JSONObject getSpeciesMultiStatReportByParam(JSONObject param);
+
+ JSONObject getRecordDailyStatReportByParam(JSONObject param);
+
+ JSONObject getRecordStatDateReportByParam(JSONObject param);
+
+ JSONObject getValidStatDateReportByParam(JSONObject param);
+
+ JSONObject getValidRAIReportByParam(JSONObject param);
+
+ JSONObject getValidRNReportByParam(JSONObject param);
+
+ JSONObject getValidPercentReportByParam(JSONObject param);
+
+ JSONObject getValidRAIRNPtReportByParam(JSONObject param);
+
+ JSONObject getRhythmReportByParam(JSONObject param);
+
+ JSONObject getBirdPeriodStatByParam(JSONObject object);
+
+ JSONObject getSpeciesHabitatStatReportByParam(JSONObject param);
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/service/EsResultRecordDetailsService.java b/ai-xuebao-es/src/main/java/net/hzvtc/service/EsResultRecordDetailsService.java
new file mode 100644
index 0000000..654f45a
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/service/EsResultRecordDetailsService.java
@@ -0,0 +1,64 @@
+package net.hzvtc.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import net.hzvtc.common.core.page.TableDataInfo;
+import net.hzvtc.device.domain.DeviceInfo;
+import net.hzvtc.es.domain.EsResultRecordDetails;
+
+import java.util.List;
+
+public interface EsResultRecordDetailsService {
+ TableDataInfo querySpeciesRecordListByParam(JSONObject param, int type);
+
+ TableDataInfo getProtectedAreaSpeciesByQuery(JSONObject param);
+
+ TableDataInfo getResultMediaListByParam(JSONObject jsonObject);
+
+ int deleteDocumentById(String id);
+
+ void bulkAddResultRecordDocument();
+
+ int getMaxResultRecordId();
+
+ boolean updateResultRecordInfoById(JSONObject object);
+
+ boolean updateResultRecordInfoByIds(JSONObject object);
+
+ JSONObject getBirdAudioDailyStatListByParam(JSONObject param);
+
+ JSONObject getBirdDailyStatListByParam(JSONObject param);
+
+ JSONObject getBirdAudioMonthStatListByParam(JSONObject param);
+
+ JSONObject getBirdAudioYearStatListByParam(JSONObject param);
+
+ List getDeviceInfoListForPage(DeviceInfo deviceInfo);
+
+ JSONArray getSpeciesListForSelect();
+
+ JSONObject getResultMediaStatByParam();
+
+ JSONObject getSpeciesStatListByParam(JSONObject param);
+
+ List getDeviceInfoListForGisMap();
+
+ JSONObject getSpeciesStatInfo(JSONObject param);
+
+ boolean updateSpeciesInfo(JSONObject object);
+
+
+ boolean deleteSpeciesInfo(JSONObject object);
+
+ Long addSpeciesInfo(JSONObject object);
+
+ List getFavoriteMediaList(JSONObject param);
+
+ List getMediaListByItemId(JSONObject param);
+
+// JSONObject getBirdDailyReportStatByParam(JSONObject param);
+
+// String getBirdDataStatFileByParam(JSONObject param);
+
+// boolean sendBirdDataStatEmail(JSONObject param);
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/service/impl/CommonEsUtils.java b/ai-xuebao-es/src/main/java/net/hzvtc/service/impl/CommonEsUtils.java
new file mode 100644
index 0000000..30b92f8
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/service/impl/CommonEsUtils.java
@@ -0,0 +1,311 @@
+package net.hzvtc.service.impl;
+
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.FieldValue;
+import co.elastic.clients.elasticsearch._types.SortOrder;
+import co.elastic.clients.elasticsearch._types.aggregations.*;
+import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.Hit;
+import co.elastic.clients.elasticsearch.core.search.TrackHits;
+import co.elastic.clients.json.JsonData;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import net.hzvtc.es.domain.EsResultRecordDetails;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class CommonEsUtils {
+ public static JSONArray getSpeciesAggregateList(JSONObject param, String indexName, ElasticsearchClient elasticsearchClient, CalendarInterval calendarInterval) throws IOException {
+ BoolQuery.Builder boolQueryBuilder = createQuery(param);
+// log.info("========111========{}", param);
+ SearchRequest searchRequest = SearchRequest.of(builder -> builder.index(indexName).size(0).query(q -> q.bool(boolQueryBuilder.build())).aggregations("by_speciesId", a -> a.terms(TermsAggregation.of(ta -> ta.field("species_id").size(10000))).aggregations("by_calendarInterval", b -> b.dateHistogram(DateHistogramAggregation.of(dh -> dh.field("record_time").calendarInterval(calendarInterval))).aggregations("sum_count_field", s -> s.sum(SumAggregation.of(sa -> sa.field("count")))))));
+ SearchResponse searchResponse = elasticsearchClient.search(searchRequest, Void.class);
+ Map aggs = searchResponse.aggregations();
+ Aggregate bySpeciesAgg = aggs.get("by_speciesId");
+ JSONArray jsonArray = new JSONArray();
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
+
+ bySpeciesAgg.lterms().buckets().array().forEach(speciesBucket -> {
+ Aggregate byCalendarInterval = speciesBucket.aggregations().get("by_calendarInterval");
+ byCalendarInterval.dateHistogram().buckets().array().forEach(hourBucket -> {
+ if (hourBucket.keyAsString() != null) {
+ JSONObject item = new JSONObject();
+ LocalDateTime dateTime = LocalDateTime.parse(hourBucket.keyAsString(), formatter);
+ if (calendarInterval == CalendarInterval.Hour) {
+ item.put("hour", dateTime.getHour());
+ } else if (calendarInterval == CalendarInterval.Day) {
+ item.put("weekDay", dateTime.getDayOfWeek());
+ }
+
+ item.put("speciesId", speciesBucket.key());
+ Aggregate sumAgg = hourBucket.aggregations().get("sum_count_field");
+ item.put("count", (int) sumAgg.sum().value());
+ jsonArray.add(item);
+ }
+ });
+ });
+ return jsonArray;
+ }
+
+ public static EsResultRecordDetails getResultRecordDetailsByParam(JSONObject param, String indexName, ElasticsearchClient elasticsearchClient) throws IOException {
+ BoolQuery.Builder boolQueryBuilder = createQuery(param);
+ SearchResponse response = elasticsearchClient.search(s -> s.trackTotalHits(new TrackHits.Builder().enabled(true).build())//
+ .index(indexName).query(q -> q.bool(boolQueryBuilder.build()))//
+ .sort(sort -> sort.field(f -> f.field("favorite").order(SortOrder.Desc)))//
+ .sort(sort -> sort.field(f -> f.field("id").order(SortOrder.Desc)))//
+// .source(sc -> sc
+// .filter(f -> f
+// .includes(Arrays.asList(sources))
+// )
+// )
+ .from(0).size(1), EsResultRecordDetails.class);
+
+ List> hitList = response.hits().hits();
+
+ for (Hit mapHit : hitList) {
+ return mapHit.source();
+ }
+
+ return null;
+ }
+
+ public static long getSpeciesStatAmountByParam(JSONObject param, String indexName, ElasticsearchClient elasticsearchClient) throws IOException {
+ BoolQuery.Builder boolQueryBuilder = createQuery(param);
+ SearchRequest searchRequest = SearchRequest.of(builder -> builder.index(indexName).size(0).query(q -> q.bool(boolQueryBuilder.build())).aggregations("sum_count_field", a -> a.sum(SumAggregation.of(ta -> ta.field("count")))));
+ SearchResponse searchResponse = elasticsearchClient.search(searchRequest, Void.class);
+ Map aggs = searchResponse.aggregations();
+ Aggregate sumAgg = aggs.get("sum_count_field");
+ return (long) sumAgg.sum().value();
+ }
+
+
+ public static BoolQuery.Builder createQuery(JSONObject param) {
+// log.info("==================param==========={}", param);
+ BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
+
+// Long areaId = param.getLong("areaId");
+// if (areaId != null) {
+// boolQueryBuilder.must(m -> m.match(t -> t.field("area_id").query(areaId)));
+// }
+
+//
+
+ Long speciesId = param.getLong("speciesId");
+ if (speciesId != null) {
+ boolQueryBuilder.must(m -> m.nested(n -> n.path("items").query(q -> q.match(t -> t.field("items.species_id").query(speciesId)))));
+// boolQueryBuilder.must(m -> m.match(t -> t.field("items.species_id").query(speciesId)));
+ }
+
+ Long species_id = param.getLong("species_id");
+ if (species_id != null) {
+// boolQueryBuilder.must(m -> m.nested(n -> n.path("items").query(q -> q.match(t -> t.field("items.species_id").query(speciesId)))));
+ boolQueryBuilder.must(m -> m.match(t -> t.field("species_id").query(species_id)));
+ }
+
+ Long deviceId = param.getLong("deviceId");
+ if (deviceId != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("device_id").query(deviceId)));
+ }
+
+ Long mediaId = param.getLong("mediaId");
+ if (mediaId != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("media_id").query(mediaId)));
+ }
+
+ Integer deviceType = param.getInteger("deviceType");
+ if (deviceType != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("device_type").query(deviceType)));
+ }
+
+ Integer favorite = param.getInteger("favorite");
+ if (favorite != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("favorite").query(favorite)));
+ }
+
+ Integer checked = param.getInteger("checked");
+ if (checked != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("checked").query(checked)));
+ }
+
+ String version = param.getString("version");
+ if (version != null && !version.isEmpty()) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("version").query(version)));
+ }
+ Long itemId = param.getLong("itemId");
+ if (itemId != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("item_id").query(itemId)));
+ }
+
+
+ String tag = param.getString("tag");
+ if (tag != null && !tag.isEmpty()) {
+// log.info("============tag==========={}", tag);
+// boolQueryBuilder.must(m -> m.fuzzy(fz -> fz.field("tag").value(tag).fuzziness("1")));
+ boolQueryBuilder.must(m -> m.matchPhrase(fz -> fz.field("tag").query(tag)));
+ }
+
+
+ String memo = param.getString("memo");
+ if (memo != null && !memo.isEmpty()) {
+// log.info("============memo==========={}", memo);
+// boolQueryBuilder.must(m -> m.fuzzy(fz -> fz.field("memo").value(memo).fuzziness("1")));
+ boolQueryBuilder.must(m -> m.matchPhrase(fz -> fz.field("memo").query(memo)));
+ }
+
+ String queryStr = param.getString("queryStr");
+ if (queryStr != null && !queryStr.trim().isEmpty()) {
+ boolQueryBuilder.should(s1 -> s1.match(fz -> fz.field("tag").query(queryStr))).should(s2 -> s2.match(fz -> fz.field("memo").query(queryStr))).minimumShouldMatch("1");
+ }
+
+ Integer isDeleted = param.getInteger("isDeleted");
+ if (isDeleted != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("is_deleted").query(isDeleted)));
+ }
+
+ String dateFrom = param.getString("dateFrom");
+ if (dateFrom != null && !dateFrom.isEmpty()) {
+ boolQueryBuilder.must(m -> m.range(v -> v.field("record_time").format("yyyy-MM-dd").gte(JsonData.of(dateFrom)).timeZone("+08:00")));
+ }
+
+ String dateTo = param.getString("dateTo");
+ if (dateTo != null && !dateTo.isEmpty()) {
+ boolQueryBuilder.must(m -> m.range(v -> v.field("record_time").format("yyyy-MM-dd").lte(JsonData.of(dateTo)).timeZone("+08:00")));
+ }
+
+ String startYear = param.getString("startYear");
+ if (startYear != null && !startYear.isEmpty()) {
+ startYear = startYear + "-01-01";
+ String finalStartYear = startYear;
+ boolQueryBuilder.must(m -> m.range(v -> v.field("record_time").format("yyyy-MM-dd").gte(JsonData.of(finalStartYear)).timeZone("+08:00")));
+ }
+
+ String endYear = param.getString("endYear");
+ if (endYear != null && !endYear.isEmpty()) {
+ endYear = endYear + "-12-31";
+ String finalEndYear = endYear;
+ boolQueryBuilder.must(m -> m.range(v -> v.field("record_time").format("yyyy-MM-dd").lte(JsonData.of(finalEndYear))));
+ }
+
+ Integer recordType = param.getInteger("recordType");
+ if (recordType != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("record_type").query(recordType)));
+ }
+
+ String calcDate = param.getString("calcDate");
+ if (calcDate != null && !calcDate.isEmpty()) {
+ boolQueryBuilder.must(m -> m.range(v -> v.field("record_time").format("yyyy-MM-dd").lte(JsonData.of(calcDate)).gte(JsonData.of(calcDate)).timeZone("+08:00")));
+ }
+
+ String calcYear = param.getString("calcYear");
+ if (calcYear != null && !calcYear.isEmpty()) {
+ String from = calcYear + "-01-01";
+ String to = calcYear + "-12-31";
+ boolQueryBuilder.must(m -> m.range(v -> v.field("record_time").format("yyyy-MM-dd").lte(JsonData.of(to)).gte(JsonData.of(from)).timeZone("+08:00")));
+ }
+
+ JSONArray array = param.getJSONArray("exSpeciesIds");
+ if (array != null && !array.isEmpty()) {
+// log.info("==========exSpeciesIds=========={}", array);
+ createExcludeArrayQuery("species_id", null, array, boolQueryBuilder);
+ }
+
+ array = param.getJSONArray("ids");
+ if (array != null && !array.isEmpty()) {
+ createExcludeArrayQuery("items", "items.species_id", array, boolQueryBuilder);
+ }
+
+ array = param.getJSONArray("speciesIds");
+ if (array != null && !array.isEmpty()) {
+ createIncludeNestArrayQuery("items", "items.species_id", array, boolQueryBuilder);
+ }
+
+ array = param.getJSONArray("speciesInIds");
+ if (array != null && !array.isEmpty()) {
+ createIncludeArrayQuery("species_id", array, boolQueryBuilder);
+ }
+
+ Integer mediaType = param.getInteger("mediaType");
+ if (mediaType != null) {
+ boolQueryBuilder.must(m -> m.match(t -> t.field("media_type").query(mediaType)));
+ }
+
+ String mediaTypes = param.getString("mediaTypes");
+ if (mediaTypes != null && !mediaTypes.isEmpty()) {
+ String[] arr = mediaTypes.split(",");
+ List terms = Arrays.asList(arr);
+ List fieldValues = terms.stream().map(FieldValue::of).collect(Collectors.toList());
+ boolQueryBuilder.must(m -> m.terms(t -> t.field("media_type").terms(tq -> tq.value(fieldValues))));
+ }
+
+ array = param.getJSONArray("deviceIds");
+// log.info("=============device ids==={}", array);
+ createIncludeArrayQuery("device_id", array, boolQueryBuilder);
+
+ array = param.getJSONArray("inDocIds");
+ createIncludeArrayQuery("id", array, boolQueryBuilder);
+// if (array != null && !array.isEmpty()) {
+// List list = new ArrayList<>();
+// for (Object id : array) {
+// list.add((Long) id);
+// }
+// List fieldValues = list.stream().map(FieldValue::of).collect(Collectors.toList());
+// boolQueryBuilder.mustNot(m -> m.terms(t -> t.field("device_id").terms(tq -> tq.value(fieldValues))));
+// }
+// log.info("============={}", boolQueryBuilder);
+ return boolQueryBuilder;
+ }
+
+ private static void createIncludeArrayQuery(String fieldName, JSONArray array, BoolQuery.Builder boolQueryBuilder) {
+ if (array != null && !array.isEmpty()) {
+ List list = new ArrayList<>();
+ for (Object id : array) {
+ list.add(Long.parseLong(id.toString()));
+ }
+ List fieldValues = list.stream().map(FieldValue::of).collect(Collectors.toList());
+ boolQueryBuilder.must(m -> m.terms(t -> t.field(fieldName).terms(tq -> tq.value(fieldValues))));
+ }
+ }
+
+ private static void createIncludeNestArrayQuery(String fieldName, String nestedName, JSONArray array, BoolQuery.Builder boolQueryBuilder) {
+ if (array != null && !array.isEmpty()) {
+ List list = new ArrayList<>();
+ for (Object id : array) {
+ list.add(Long.parseLong(id.toString()));
+ }
+ List fieldValues = list.stream().map(FieldValue::of).collect(Collectors.toList());
+ if (nestedName != null && !nestedName.isEmpty()) {
+ boolQueryBuilder.must(mn -> mn.nested(n -> n.path(fieldName).query(nq -> nq.terms(t -> t.field(nestedName).terms(tq -> tq.value(fieldValues))))));
+ } else {
+ boolQueryBuilder.must(m -> m.terms(t -> t.field(fieldName).terms(tq -> tq.value(fieldValues))));
+ }
+
+ }
+ }
+
+ private static void createExcludeArrayQuery(String fieldName, String nestedName, JSONArray array, BoolQuery.Builder boolQueryBuilder) {
+ if (array != null && !array.isEmpty()) {
+ List list = new ArrayList<>();
+ for (Object id : array) {
+ list.add((Long) id);
+ }
+ List fieldValues = list.stream().map(FieldValue::of).collect(Collectors.toList());
+ if (nestedName != null && !nestedName.isEmpty()) {
+ boolQueryBuilder.mustNot(mn -> mn.nested(n -> n.path(fieldName).query(nq -> nq.terms(t -> t.field(nestedName).terms(tq -> tq.value(fieldValues))))));
+ } else {
+ boolQueryBuilder.mustNot(m -> m.terms(t -> t.field(fieldName).terms(tq -> tq.value(fieldValues))));
+ }
+
+ }
+ }
+}
diff --git a/ai-xuebao-es/src/main/java/net/hzvtc/service/impl/EsRecordReportServiceImpl.java b/ai-xuebao-es/src/main/java/net/hzvtc/service/impl/EsRecordReportServiceImpl.java
new file mode 100644
index 0000000..d0ca3b4
--- /dev/null
+++ b/ai-xuebao-es/src/main/java/net/hzvtc/service/impl/EsRecordReportServiceImpl.java
@@ -0,0 +1,2594 @@
+package net.hzvtc.service.impl;
+
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.FieldValue;
+import co.elastic.clients.elasticsearch._types.SortOrder;
+import co.elastic.clients.elasticsearch._types.Time;
+import co.elastic.clients.elasticsearch._types.aggregations.*;
+import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.Hit;
+import co.elastic.clients.elasticsearch.core.search.TrackHits;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import net.hzvtc.area.service.ProtectedAreaService;
+import net.hzvtc.area.service.ProtectedAreaSpeciesService;
+import net.hzvtc.bird.service.BirdSpeciesService;
+import net.hzvtc.common.core.domain.entity.SysDept;
+import net.hzvtc.data.check.service.MediaItemService;
+import net.hzvtc.device.domain.DeviceInfo;
+import net.hzvtc.device.service.DeviceInfoService;
+import net.hzvtc.echart.domain.vo.BirdStatDataVo;
+import net.hzvtc.email.service.EmailService;
+import net.hzvtc.es.domain.EsResultRecordDetails;
+import net.hzvtc.es.domain.EsResultRecordReportData;
+import net.hzvtc.es.domain.SpeciesItem;
+import net.hzvtc.es.mapper.EsResultRecordDetailsMapper;
+import net.hzvtc.service.EsRecordReportService;
+import net.hzvtc.system.mapper.SysDeptMapper;
+import net.hzvtc.web.stat.service.SpeciesDailyStatService;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__(@Lazy))
+@Slf4j
+public class EsRecordReportServiceImpl implements EsRecordReportService {
+ private static final Logger logger = LoggerFactory.getLogger(EsRecordReportService.class);
+ @Resource
+ private final EsResultRecordDetailsMapper esResultRecordDetailsMapper;
+
+ private final ElasticsearchClient elasticsearchClient;
+
+ private final EmailService emailService;
+
+ private final SpeciesDailyStatService speciesDailyStatService;
+
+ private final ProtectedAreaSpeciesService protectedAreaSpeciesService;
+
+ private final BirdSpeciesService birdSpeciesService;
+
+ private final DeviceInfoService deviceInfoService;
+
+ private final SysDeptMapper sysDeptMapper;
+
+ private final MediaItemService mediaItemService;
+
+ @Value("${hzvtc.dailyReportFilePath}")
+ private String dailyReportFilePath;
+
+ @Value("${hzvtc.dailyReportFileOutPath}")
+ private String dailyReportFileOutPath;
+
+ private final ProtectedAreaService protectedAreaService;
+
+ private final String indexName = "animal_record_details";
+
+ private final String validIndexName = "animal_valid_record";
+
+ @Override
+ public JSONObject getBirdDailyReportStatByParam(JSONObject param) {
+ String calcDate = param.getString("calcDate");
+ if (calcDate == null || calcDate.isEmpty()) {
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+ param.put("calcDate", df.format(new Date()));
+ }
+
+ JSONObject result = new JSONObject();
+ JSONArray deviceData = getSpeciesDailyAmountByDeviceId(param);
+ Object[] array = compactJSONArray(deviceData);
+ result.put("deviceData", deviceData);
+ Map map = createQueryMap(param);
+
+ List list = esResultRecordDetailsMapper.getAreaBirdSpeciesByParam(map);
+ JSONArray array1 = new JSONArray();
+ JSONArray array2 = new JSONArray();
+ Long areaId = (Long) map.get("areaId");
+ param.clear();
+ param.put("areaId", areaId);
+ param.put("calcDate", calcDate);
+ if (list != null && !list.isEmpty()) {
+ list.forEach(item -> {
+ JSONObject obj = new JSONObject();
+ Long id = item.getId();
+ obj.put("id", id);
+ obj.put("name", item.getName());
+ obj.put("list", filterArrayBySpeciesId(array, id));
+ array1.add(obj);
+ try {
+ JSONObject obj1 = new JSONObject();
+ param.put("speciesId", item.getId());
+ obj1.put("id", id);
+ obj1.put("name", item.getName());
+ param.put("recordType", 1);
+// log.info("=================={}", param);
+ JSONArray arr = getSpeciesHabitatAggregateList(param);
+ if (arr.isEmpty()) {
+ param.put("recordType", 2);
+ arr = getSpeciesHabitatAggregateList(param);
+ }
+ obj1.put("list", arr);
+ array2.add(obj1);
+ } catch (IOException ex) {
+ logger.error(ex.getMessage());
+ }
+ });
+ }
+ result.put("speciesData", array1);
+ result.put("habitatData", array2);
+ result.put("mediaList", new ArrayList<>());
+ return result;
+ }
+
+// @Override
+// public String getBirdDataStatFileByParam(JSONObject param) {
+// try {
+// Long areaId = param.getLong("areaId");
+// String areaName = "";
+//
+// if (areaId != null) {
+// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(areaId);
+// areaName = protectedArea.getName();
+// } else {
+// return "500";
+// }
+// XSSFWorkbook xssfWorkbook = new XSSFWorkbook(Files.newInputStream(Paths.get(dailyReportFilePath + "daily_report_tmpl.xlsx")));
+// XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
+// sheet.getRow(1).getCell(1).setCellValue(areaName + "鸟类监测日报");
+// String calcDate = param.getString("calcDate");
+// if (calcDate == null || calcDate.isEmpty()) {
+// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+// calcDate = df.format(new Date());
+// }
+// SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
+// sheet.getRow(2).getCell(1).setCellValue("日期:" + calcDate);
+// sheet.getRow(4).getCell(1).setCellValue(areaName + "每日鸟类智慧监测数据,包含鸟类监测总数,关键鸟类生境分布和关键物种分时监测数量");
+// JSONObject result = getBirdDailyReportStatByParam(param);
+// // int baseDiffRow = 0;
+// JSONArray array = result.getJSONArray("deviceData");
+// int[] sum = {0, 0, 0};
+// if (array != null) {
+// AtomicInteger starRow = new AtomicInteger(8);
+//
+// array.forEach(data -> {
+// JSONObject obj = (JSONObject) data;
+// int cell = 1;
+// sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name"));
+// JSONArray subarray = obj.getJSONArray("list");
+// int[] value = {0, 0, 0};
+// if (subarray != null) {
+// subarray.stream().map(el -> (JSONObject) el).forEach(element -> {
+// int hour = element.getInteger("hour");
+// int count = element.getInteger("count");
+// if (hour <= 12) {
+// value[0] += count;
+// } else {
+// value[1] += count;
+// }
+// value[2] = Math.max(value[0], value[1]);
+// });
+// }
+//
+// for (int i = 0; i < sum.length; i++) {
+// sum[i] += value[i];
+// }
+// for (int i = 0; i < value.length; i++) {
+// sheet.getRow(starRow.get()).getCell(cell++).setCellValue(value[i]);
+// }
+//
+// starRow.getAndIncrement();
+// });
+// int cell = 2;
+// for (int i = 0; i < sum.length; i++) {
+// sheet.getRow(28).getCell(cell++).setCellValue(sum[i]);
+// }
+// for (int i = 0; i < 20 - array.size(); i++) {
+// XSSFRow row = sheet.getRow(8 + array.size() + i);
+// row.setZeroHeight(true);
+// }
+// }
+//
+// array = result.getJSONArray("habitatData");
+// if (array != null) {
+// AtomicInteger starRow = new AtomicInteger(32);
+// array.forEach(data -> {
+// JSONObject obj = (JSONObject) data;
+// int cell = 1;
+// sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name"));
+// int[] value = {0, 0, 0, 0, 0};
+//
+// JSONArray subArray = obj.getJSONArray("list");
+// if (subArray != null) {
+// subArray.stream().map(el -> (JSONObject) el).forEach(element -> {
+// String code = element.getString("habitat");
+// int count = element.getInteger("count");
+// if ("ground".equals(code)) {
+// value[0] = count;
+// } else if ("shoreside".equals(code)) {
+// value[1] = count;
+// } else if ("water".equals(code)) {
+// value[2] = count;
+// } else if ("tree".equals(code)) {
+// value[3] = count;
+// } else {
+// value[4] = count;
+// }
+// });
+// }
+// for (int i = 0; i < value.length; i++) {
+// sheet.getRow(starRow.get()).getCell(cell++).setCellValue(value[i]);
+// }
+//
+// starRow.getAndIncrement();
+// });
+// }
+//
+//
+// array = result.getJSONArray("speciesData");
+// if (array != null) {
+// AtomicInteger starRow = new AtomicInteger(43);
+// List