Browse Source

Merge remote-tracking branch 'origin/master'

liuyaowen 1 year ago
parent
commit
629e85b77e
21 changed files with 889 additions and 492 deletions
  1. 1 1
      src/main/java/com/yunfeiyun/agmp/iotm/device/common/domin/IotDeviceDataListReqVo.java
  2. 1 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/common/service/impl/IotDeviceCommonServiceImpl.java
  3. 115 17
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotDeviceCbdController.java
  4. 103 111
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotPestController.java
  5. 36 225
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotPestrecogController.java
  6. 24 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdimgCountResVo.java
  7. 24 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestRecogPeriodInfoResVo.java
  8. 2 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestRecogPeriodReqVo.java
  9. 11 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestrecogGroupByNameListResVo.java
  10. 10 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestrecogGroupPestListResVo.java
  11. 2 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotPestService.java
  12. 5 3
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotPestrecogService.java
  13. 5 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotPestServiceImpl.java
  14. 166 125
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotPestrecogServiceImpl.java
  15. 18 10
      src/main/java/com/yunfeiyun/agmp/iotm/device/qxsqz/controller/IotDeviceQxzController.java
  16. 198 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/ybq/controller/IotYbqController.java
  17. 28 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/ybq/service/IotYbqEnvDataService.java
  18. 119 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/ybq/serviceImp/IotYbqEnvDataServiceImpl.java
  19. 10 0
      src/main/java/com/yunfeiyun/agmp/iotm/web/domain/reqvo/IotDeviceListReqVo.java
  20. 2 0
      src/main/java/com/yunfeiyun/agmp/iotm/web/mapper/IotPestMapper.java
  21. 9 0
      src/main/resources/mapper/IotPestMapper.xml

+ 1 - 1
src/main/java/com/yunfeiyun/agmp/iotm/device/common/domin/IotDeviceDataListReqVo.java

@@ -17,7 +17,7 @@ public class IotDeviceDataListReqVo
     private String devBid;
 
     /** 客户id */
-    private String cId;
+    private String tid;
 
     /** 开始时间 */
     private String startTime;

+ 1 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/common/service/impl/IotDeviceCommonServiceImpl.java

@@ -75,6 +75,7 @@ public class IotDeviceCommonServiceImpl implements IotDeviceCommonService {
             throw new IotBizException(ErrorCode.INVALID_PARAMETER.getCode(),"设备信息不存在");
         }
         iotDeviceBaseFunReqVo.setIotDevice(iotDevice);
+        System.out.println(typeCacheService.getServiceNameByDevTypeBid(iotDevice.getDevtypeBid()));
         IotDeviceBaseService iotDeviceBaseService = iotDeviceBaseServiceMap.get(typeCacheService.getServiceNameByDevTypeBid(iotDevice.getDevtypeBid()));
         return iotDeviceBaseService.func(iotDeviceBaseFunReqVo);
     }

+ 115 - 17
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotDeviceCbdController.java

@@ -18,7 +18,6 @@ import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
 import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
 import com.yunfeiyun.agmp.iot.common.domain.IotCbddata;
 import com.yunfeiyun.agmp.iot.common.domain.IotCbdimg;
-import com.yunfeiyun.agmp.iot.common.domain.TosDevicetype;
 import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdConfigEditReqVo;
 import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
 import com.yunfeiyun.agmp.iot.common.service.MongoService;
@@ -27,6 +26,7 @@ import com.yunfeiyun.agmp.iotm.common.controller.BaseController;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListResVo;
 import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceRefreshService;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgCountResVo;
 import com.yunfeiyun.agmp.iotm.device.pest.service.IotCbdService;
 import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotDeviceListReqVo;
 import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotDeviceListResVo;
@@ -34,9 +34,15 @@ import com.yunfeiyun.agmp.iotm.web.service.IIotCmdtaskService;
 import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.GroupOperation;
+import org.springframework.data.mongodb.core.aggregation.MatchOperation;
+import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
+import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -71,6 +77,74 @@ public class IotDeviceCbdController extends BaseController {
     private IotDeviceRefreshService iotDeviceRefreshService;
 
     /**
+     * 获取测报灯列表数据
+     * 普通测报灯  pt
+     * 水稻测报灯  sc
+     * 高空测报灯  gk
+     * @param reqVo
+     * @return
+     */
+    @GetMapping({"/list", "/gk/list", "/sd/list", "/pt/list"})
+    public TableDataInfo list(HttpServletRequest request, IotDeviceListReqVo reqVo) {
+        String reqUri = request.getRequestURI();
+        log.info("【{}】【测报灯】【列表】客户id {}", LogCore.getSeq(), getCustomerId());
+        String[] devTypeList = new String[]{
+                IotDeviceDictConst.TYPE_YF_GKCBD, IotDeviceDictConst.TYPE_YF_SDCBD, IotDeviceDictConst.TYPE_YF_CBD
+        };
+        if(reqUri.endsWith("/gk/list")){
+            devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_GKCBD};
+        }else if(reqUri.endsWith("/sd/list")){
+            devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_SDCBD};
+        }else if(reqUri.endsWith("/pt/list")){
+            devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_CBD};
+        }
+        reqVo.setDevtypeBidList(Arrays.asList(devTypeList));
+
+        startPage();
+        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+        List<String> devBidList = new ArrayList<>();
+        if(!list.isEmpty()){
+            for(IotDeviceListResVo resVo : list){
+                devBidList.add(resVo.getDevBid());
+            }
+        }
+
+        if(!devBidList.isEmpty()) {
+            Criteria criteria = new Criteria()
+                    .and("devBid").in(devBidList)
+                    .and("cbdimgDelstatus").is("0");
+            MatchOperation matchOperation = Aggregation.match(criteria);
+            GroupOperation groupOperation = Aggregation.group("devBid").count().as("imgCount");
+
+            ProjectionOperation projectionOperationResult = Aggregation.project()
+                    .and("_id").as("devBid")
+                    .and("imgCount").as("imgCount");
+            Aggregation aggregation = Aggregation.newAggregation(
+                    matchOperation,
+                    groupOperation,
+                    projectionOperationResult
+            );
+            List<IotCbdimgCountResVo> iotCbdimgCountResVoList = mongoService.aggregate(
+                    IotCbdimg.class, aggregation, IotCbdimgCountResVo.class
+            );
+
+            Map<String, Long> imgCountMap = new HashMap<>();
+            for (IotCbdimgCountResVo iotCbdimgCountResVo : iotCbdimgCountResVoList) {
+                String devBid = iotCbdimgCountResVo.getDevBid();
+                imgCountMap.put(devBid, (long) iotCbdimgCountResVo.getImgCount());
+            }
+            for (IotDeviceListResVo resVo : list) {
+                //查询图片数量
+                String devBid = resVo.getDevBid();
+                resVo.setImgCount(imgCountMap.getOrDefault(devBid, 0L));
+            }
+        }
+
+        return getDataTable(list);
+    }
+
+
+    /**
      * 下发测报灯配置指令
      *
      * @return
@@ -187,21 +261,45 @@ public class IotDeviceCbdController extends BaseController {
      * @param reqVo
      * @return
      */
-    @GetMapping("/list")
-    public TableDataInfo list(IotDeviceListReqVo reqVo) {
-        startPage();
-        TosDevicetype tosDevicetype= typeCacheService.getCacheObjectByDevTypeCode(IotDeviceDictConst.TYPE_YF_CBD);
-        reqVo.setDevtypeBid(tosDevicetype.getDevtypeBid());
-        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
-        for (IotDeviceListResVo resVo : list) {
-            //查询图片数量
-            Map<String, Object> map = new HashMap<>();
-            map.put("devBid", resVo.getDevBid());
-            map.put("cbdimgDelstatus", "0");
-            long count = mongoService.count(IotCbdimg.class, map);
-            resVo.setImgCount(count);
+//    @GetMapping("/list")
+//    public TableDataInfo list(IotDeviceListReqVo reqVo) {
+//        startPage();
+//        TosDevicetype tosDevicetype= typeCacheService.getCacheObjectByDevTypeCode(IotDeviceDictConst.TYPE_YF_CBD);
+//        reqVo.setDevtypeBid(tosDevicetype.getDevtypeBid());
+//        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+//        for (IotDeviceListResVo resVo : list) {
+//            //查询图片数量
+//            Map<String, Object> map = new HashMap<>();
+//            map.put("devBid", resVo.getDevBid());
+//            map.put("cbdimgDelstatus", "0");
+//            long count = mongoService.count(IotCbdimg.class, map);
+//            resVo.setImgCount(count);
+//
+//        }
+//        return getDataTable(list);
+//    }
 
-        }
-        return getDataTable(list);
-    }
+//
+//    /**
+//     * 水稻测报灯列表
+//     * @param reqVo
+//     * @return
+//     */
+//    @GetMapping("/sd/list")
+//    public TableDataInfo sdList(IotDeviceListReqVo reqVo) {
+//        startPage();
+//        TosDevicetype tosDevicetype= typeCacheService.getCacheObjectByDevTypeCode(IotDeviceDictConst.TYPE_YF_CBD);
+//        reqVo.setDevtypeBid(tosDevicetype.getDevtypeBid());
+//        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+//        for (IotDeviceListResVo resVo : list) {
+//            //查询图片数量
+//            Map<String, Object> map = new HashMap<>();
+//            map.put("devBid", resVo.getDevBid());
+//            map.put("cbdimgDelstatus", "0");
+//            long count = mongoService.count(IotCbdimg.class, map);
+//            resVo.setImgCount(count);
+//
+//        }
+//        return getDataTable(list);
+//    }
 }

+ 103 - 111
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotPestController.java

@@ -1,25 +1,16 @@
 package com.yunfeiyun.agmp.iotm.device.pest.controller;
 
-import com.alibaba.fastjson2.JSONArray;
-import com.yunfeiyun.agmp.common.annotation.Log;
 import com.yunfeiyun.agmp.common.core.controller.BaseController;
 import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
-import com.yunfeiyun.agmp.common.core.page.TableDataInfo;
-import com.yunfeiyun.agmp.common.enums.BusinessType;
-import com.yunfeiyun.agmp.common.utils.poi.ExcelUtil;
-import com.yunfeiyun.agmp.iot.common.domain.*;
 import com.yunfeiyun.agmp.iotm.device.pest.service.IIotAidispestService;
 import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
+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;
 
 /**
  * 害虫信息Controller
@@ -39,31 +30,6 @@ public class IotPestController extends BaseController
     private IIotAidispestService iotAidispestService;
 
     /**
-     * 查询害虫信息列表
-     */
-    @PreAuthorize("@ss.hasPermi('iot:pest:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(IotPest iotPest)
-    {
-        startPage();
-        List<IotPest> list = iotPestService.selectIotPestList(iotPest);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出害虫信息列表
-     */
-    @PreAuthorize("@ss.hasPermi('iot:pest:export')")
-    @Log(title = "害虫信息", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, IotPest iotPest)
-    {
-        List<IotPest> list = iotPestService.selectIotPestList(iotPest);
-        ExcelUtil<IotPest> util = new ExcelUtil<IotPest>(IotPest.class);
-        util.exportExcel(response, list, "害虫信息数据");
-    }
-
-    /**
      * 获取害虫信息详细信息
      */
     @PreAuthorize("@ss.hasPermi('iot:pest:query')")
@@ -73,77 +39,103 @@ public class IotPestController extends BaseController
         return success(iotPestService.selectIotPestByPestBid(pestBid));
     }
 
-    /**
-     * 获取害虫信息详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('iot:pest:plug:query')")
-    @GetMapping(value = "/plug/info")
-    public AjaxResult getPlugInfo(@RequestParam("pestBid") String pestBid)
-    {
-        Criteria criteria = new Criteria();
-        criteria.and("pestBusid").is(pestBid);
-        Query query = new Query(criteria);
-        query.with(Sort.by(Sort.Direction.DESC, "pestrecogCreatedDate"));
-        IotPestrecog iotPestrecog = mongoTemplate.findOne(query, IotPestrecog.class, "IotPestrecog");
-        IotPest iotPest = iotPestService.selectIotPestByPestBid(pestBid);
-        if (iotPestrecog != null) {
-            Criteria criteria2 = new Criteria();
-            criteria2.and("pestrecogBid").is(iotPestrecog.getPestrecogBid());
-            IotCbdpest iotCbdpest = mongoTemplate.findOne(new Query(criteria2), IotCbdpest.class, "IotCbdpest");
-            if (iotCbdpest != null) {
-                Criteria criteria3 = new Criteria();
-                criteria3.and("cbdrecogBid").is(iotCbdpest.getCbdrecogBid());
-                IotCbdrecog iotCbdrecog = mongoTemplate.findOne(new Query(criteria3), IotCbdrecog.class, "IotCbdrecog");
-                if (iotCbdrecog != null) {
-                    Criteria criteria4 = new Criteria();
-                    criteria4.and("cbdimgBid").is(iotCbdrecog.getCbdimgBid());
-                    IotCbdimg iotCbdimg = mongoTemplate.findOne(new Query(criteria4), IotCbdimg.class, "IotCbdimg");
-                    iotPest.setPestImgUrl(iotCbdimg.getCbdimgAddr());
-                }
-            }
-        }
-
-        try {
-            JSONArray preventiveMeasuresInfo = iotAidispestService.getPreventiveMeasuresInfo(iotPest.getPestName());
-            if (preventiveMeasuresInfo.size() > 0) {
-                iotPest.setPestInfo(preventiveMeasuresInfo.getJSONObject(0).toJSONString());
-            }
-        } catch (Exception e) {
-            logger.error("获得防治措施异常", e);
-        }
-        return success(iotPest);
-    }
-
-    /**
-     * 新增害虫信息
-     */
-    @PreAuthorize("@ss.hasPermi('iot:pest:add')")
-    @Log(title = "害虫信息", businessType = BusinessType.INSERT)
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody IotPest iotPest)
-    {
-        return toAjax(iotPestService.insertIotPest(iotPest));
-    }
-
-    /**
-     * 修改害虫信息
-     */
-    @PreAuthorize("@ss.hasPermi('iot:pest:edit')")
-    @Log(title = "害虫信息", businessType = BusinessType.UPDATE)
-    @PutMapping("/edit")
-    public AjaxResult edit(@RequestBody IotPest iotPest)
-    {
-        return toAjax(iotPestService.updateIotPest(iotPest));
-    }
-
-    /**
-     * 删除害虫信息
-     */
-    @PreAuthorize("@ss.hasPermi('iot:pest:remove')")
-    @Log(title = "害虫信息", businessType = BusinessType.DELETE)
-	@DeleteMapping("/delete")
-    public AjaxResult remove(@RequestParam("ids") Long[] ids)
-    {
-        return toAjax(iotPestService.deleteIotPestByIds(ids));
-    }
+//    /**
+//     * 查询害虫信息列表
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:pest:list')")
+//    @GetMapping("/list")
+//    public TableDataInfo list(IotPest iotPest)
+//    {
+//        startPage();
+//        List<IotPest> list = iotPestService.selectIotPestList(iotPest);
+//        return getDataTable(list);
+//    }
+//
+//    /**
+//     * 导出害虫信息列表
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:pest:export')")
+//    @Log(title = "害虫信息", businessType = BusinessType.EXPORT)
+//    @PostMapping("/export")
+//    public void export(HttpServletResponse response, IotPest iotPest)
+//    {
+//        List<IotPest> list = iotPestService.selectIotPestList(iotPest);
+//        ExcelUtil<IotPest> util = new ExcelUtil<IotPest>(IotPest.class);
+//        util.exportExcel(response, list, "害虫信息数据");
+//    }
+//
+//
+//    /**
+//     * 获取害虫信息详细信息
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:pest:plug:query')")
+//    @GetMapping(value = "/plug/info")
+//    public AjaxResult getPlugInfo(@RequestParam("pestBid") String pestBid)
+//    {
+//        Criteria criteria = new Criteria();
+//        criteria.and("pestBusid").is(pestBid);
+//        Query query = new Query(criteria);
+//        query.with(Sort.by(Sort.Direction.DESC, "pestrecogCreatedDate"));
+//        IotPestrecog iotPestrecog = mongoTemplate.findOne(query, IotPestrecog.class, "IotPestrecog");
+//        IotPest iotPest = iotPestService.selectIotPestByPestBid(pestBid);
+//        if (iotPestrecog != null) {
+//            Criteria criteria2 = new Criteria();
+//            criteria2.and("pestrecogBid").is(iotPestrecog.getPestrecogBid());
+//            IotCbdpest iotCbdpest = mongoTemplate.findOne(new Query(criteria2), IotCbdpest.class, "IotCbdpest");
+//            if (iotCbdpest != null) {
+//                Criteria criteria3 = new Criteria();
+//                criteria3.and("cbdrecogBid").is(iotCbdpest.getCbdrecogBid());
+//                IotCbdrecog iotCbdrecog = mongoTemplate.findOne(new Query(criteria3), IotCbdrecog.class, "IotCbdrecog");
+//                if (iotCbdrecog != null) {
+//                    Criteria criteria4 = new Criteria();
+//                    criteria4.and("cbdimgBid").is(iotCbdrecog.getCbdimgBid());
+//                    IotCbdimg iotCbdimg = mongoTemplate.findOne(new Query(criteria4), IotCbdimg.class, "IotCbdimg");
+//                    iotPest.setPestImgUrl(iotCbdimg.getCbdimgAddr());
+//                }
+//            }
+//        }
+//
+//        try {
+//            JSONArray preventiveMeasuresInfo = iotAidispestService.getPreventiveMeasuresInfo(iotPest.getPestName());
+//            if (preventiveMeasuresInfo.size() > 0) {
+//                iotPest.setPestInfo(preventiveMeasuresInfo.getJSONObject(0).toJSONString());
+//            }
+//        } catch (Exception e) {
+//            logger.error("获得防治措施异常", e);
+//        }
+//        return success(iotPest);
+//    }
+//
+//    /**
+//     * 新增害虫信息
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:pest:add')")
+//    @Log(title = "害虫信息", businessType = BusinessType.INSERT)
+//    @PostMapping("/add")
+//    public AjaxResult add(@RequestBody IotPest iotPest)
+//    {
+//        return toAjax(iotPestService.insertIotPest(iotPest));
+//    }
+//
+//    /**
+//     * 修改害虫信息
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:pest:edit')")
+//    @Log(title = "害虫信息", businessType = BusinessType.UPDATE)
+//    @PutMapping("/edit")
+//    public AjaxResult edit(@RequestBody IotPest iotPest)
+//    {
+//        return toAjax(iotPestService.updateIotPest(iotPest));
+//    }
+//
+//    /**
+//     * 删除害虫信息
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:pest:remove')")
+//    @Log(title = "害虫信息", businessType = BusinessType.DELETE)
+//	@DeleteMapping("/delete")
+//    public AjaxResult remove(@RequestParam("ids") Long[] ids)
+//    {
+//        return toAjax(iotPestService.deleteIotPestByIds(ids));
+//    }
 }

+ 36 - 225
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotPestrecogController.java

@@ -80,231 +80,42 @@ public class IotPestrecogController extends BaseController {
         ExcelUtil<IotPestrecogListExportResVo> util = new ExcelUtil<>(IotPestrecogListExportResVo.class);
         util.exportExcel(response, list, "识别数据");
     }
-//
-//    /**
-//     * 根据害虫分组统计数量
-//     */
-//    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:pest:list')")
-//    @GetMapping("/group/pest/list")
-//    public AjaxResult groupByPestList(IotPestRecogPeriodReqVo reqVo) {
-//        Criteria criteria = new Criteria();
-//        criteria.and("devBid").is(reqVo.getDevBid());
-//        if (StringUtils.isNotEmpty(reqVo.getPestrecogMarktype())) {
-//            criteria.and("pestrecogMarktype").is(reqVo.getPestrecogMarktype());
-//        }
-//        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isEmpty(reqVo.getEndTime())) {
-//            criteria.and("pestrecogCreatedDate").gte(reqVo.getStartTime());
-//        }
-//        if (StringUtils.isEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
-//            criteria.and("pestrecogCreatedDate").lte(reqVo.getEndTime());
-//        }
-//        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
-//            criteria.and("pestrecogCreatedDate").gte(reqVo.getStartTime()).lte(reqVo.getEndTime());
-//        }
-//        MatchOperation matchOperation = Aggregation.match(criteria);
-//
-//        ProjectionOperation projectionOperation = Aggregation.project()
-//                .andExclude("_id")
-//                .and("$$ROOT").as("c");
-//
-//        LookupOperation lookupOperationIotCbdpest = Aggregation.lookup(
-//                "IotCbdpest", "c.pestrecogBid", "pestrecogBid", "cp"
-//        );
-//        UnwindOperation unwindOperationCp = Aggregation.unwind("cp", true);
-//
-//
-//        LookupOperation lookupOperationIotCbdrecog = Aggregation.lookup(
-//                "IotCbdrecog", "cp.cbdrecogBid", "cbdrecogBid", "ce"
-//        );
-//        UnwindOperation unwindOperationCe = Aggregation.unwind("ce", true);
-//        Criteria criteria2 = new Criteria()
-//                .and("ce.cbdrecogType").is(reqVo.getCbdRecogType())
-//                .and("ce.cbdrecogMarktype").is(reqVo.getPestrecogMarktype());;
-//        MatchOperation matchOperation2 = Aggregation.match(criteria2);
-//
-//        GroupOperation group = Aggregation.group("c.pestBusid").first("c.pestBusid").as("pestBusid")
-//                .sum("c.pestrecogNum").as("pestrecogNum");// fieldName为要分组的字段名称,totalField为需要求和的字段名称
-//
-//
-//        Aggregation aggregation = Aggregation.newAggregation(
-//                matchOperation,
-//                projectionOperation,
-//                lookupOperationIotCbdpest,
-//                unwindOperationCp,
-//                lookupOperationIotCbdrecog,
-//                unwindOperationCe,
-//                matchOperation2,
-//                group
-//                );
-//        List<IotPestResVo> results = mongoService.aggregate(IotPestrecog.class, aggregation, IotPestResVo.class);
-//
-//        //获取害虫数据
-//        Map<String, IotPest> pestMap = iotPestService.selectIotPestMapAllInfo();
-//        for (IotPestResVo result : results) {
-//            if (!StringUtils.isEmpty(result.getPestBusid())) {
-//                IotPest pest = pestMap.get(result.getPestBusid());
-//                if (pest != null) {
-//                    result.setPestName(pest.getPestName());
-//                }
-//            } else {
-//                // 手动识别的名字,待完善
-//                result.setPestName("-");
-//            }
-//
-//
-//        }
-//
-//        return AjaxResult.success(results);
-//    }
-//
-//    /**
-//     * 虫情趋势矩阵
-//     */
-//    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:date:name')")
-//    @GetMapping("/group/date/name")
-//    public AjaxResult groupByDateName(IotDeviceDataListReqVo reqVo) {
-//        if (StringUtils.isEmpty(reqVo.getStartTime()) || StringUtils.isEmpty(reqVo.getEndTime())) {
-//            return AjaxResult.error(ErrorCode.INVALID_PARAMETER.getCode(), "时间不能为空");
-//        }
-//        List<IotPestrecog> results = iIotPestrecogService.groupByDateName(reqVo);
-//
-//        //获取存在识别害虫集合
-//        List<IotPest> iotPests2 = getIotPestList(results);
-//
-//        List<Map<String, Object>> list1 = new ArrayList<>();
-//        //获取日期集合
-//        List<String> dateList = DatePlugUtil.getTwoDaysDayDes(reqVo.getStartTime(), reqVo.getEndTime());
-//        for (String s : dateList) {
-//            Map<String, Object> dateMap = new HashMap<>();
-//            dateMap.put("date", s);
-//            List<Map<String, Object>> list2 = new ArrayList<>();
-//            dateMap.put("data", list2);
-//            for (IotPest iotPest : iotPests2) {
-//                String pestBid = iotPest.getPestBid();
-//                Map<String, Object> pestMap = new HashMap<>();
-//                pestMap.put("pestName", iotPest.getPestName());
-//                pestMap.put("pestBid", iotPest.getPestBid());
-//                int sum = 0;
-//                for (IotPestrecog iotPestrecog : results) {
-//                    if (s.equals(iotPestrecog.getPestrecogCreatedDate().substring(0, 10))
-//                            && pestBid != null && pestBid.equals(iotPestrecog.getPestBusid())) {
-//                        sum += iotPestrecog.getPestrecogNum();
-//                    }
-//                }
-//                pestMap.put("sum", sum);
-//                list2.add(pestMap);
-//            }
-//            list1.add(dateMap);
-//        }
-//        return AjaxResult.success(list1);
-//    }
-//
-////    /**
-////     * 虫情趋势矩阵
-////     */
-////    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:date:name')")
-////    @GetMapping("/group/date/name")
-////    public AjaxResult groupByDateName(IotDeviceDataListReqVo reqVo) {
-////        if (StringUtils.isEmpty(reqVo.getStartTime()) || StringUtils.isEmpty(reqVo.getEndTime())) {
-////            return AjaxResult.error(ErrorCode.INVALID_PARAMETER.getCode(), "时间不能为空");
-////        }
-////
-////
-////        Criteria criteria = new Criteria();
-////        criteria.and("devBid").is(reqVo.getDevBid());
-////        if (StringUtils.isNotEmpty(reqVo.getPestrecogMarktype())) {
-////            criteria.and("pestrecogMarktype").is(reqVo.getPestrecogMarktype());
-////        }
-////        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isEmpty(reqVo.getEndTime())) {
-////            criteria.and("pestrecogCreatedDate").is(reqVo.getPestrecogMarktype());
-////        }
-////        if (StringUtils.isEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
-////            criteria.and("pestrecogCreatedDate").is(reqVo.getPestrecogMarktype());
-////        }
-////        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
-////            criteria.and("pestrecogCreatedDate").gte(reqVo.getStartTime()).lte(reqVo.getEndTime());
-////        }
-////        MatchOperation matchOperation = Aggregation.match(criteria);
-////
-////        ProjectionOperation projectionOperation = Aggregation.project()
-////                .andExclude("_id")
-////                .and("$$ROOT").as("c");
-////
-////        LookupOperation lookupOperationIotCbdpest = Aggregation.lookup(
-////                "IotCbdpest", "c.pestrecogBid", "pestrecogBid", "cp"
-////        );
-////        UnwindOperation unwindOperationCp = Aggregation.unwind("cp", true);
-////
-////
-////        LookupOperation lookupOperationIotCbdrecog = Aggregation.lookup(
-////                "IotCbdrecog", "cp.cbdrecogBid", "cbdrecogBid", "ce"
-////        );
-////        UnwindOperation unwindOperationCe = Aggregation.unwind("ce", true);
-////        Criteria criteria2 = new Criteria()
-////                .and("ce.cbdrecogType").is(reqVo.getCbdRecogType());
-////        MatchOperation matchOperation2 = Aggregation.match(criteria2);
-////
-////        GroupOperation group = Aggregation.group("c.pestBusid")
-////                .first("c.pestBusid").as("pestBusid")
-////                .first("c.pestrecogCreatedDate").as("pestrecogCreatedDate")
-////                .sum("c.pestrecogNum").as("pestrecogNum");// fieldName为要分组的字段名称,totalField为需要求和的字段名称
-////
-////
-////        Aggregation aggregation = Aggregation.newAggregation(
-////                matchOperation,
-////                projectionOperation,
-////                lookupOperationIotCbdpest,
-////                unwindOperationCp,
-////                lookupOperationIotCbdrecog,
-////                unwindOperationCe,
-////                matchOperation2,
-////                group
-////        );
-////        List<IotPestrecog> results = mongoService.aggregate(IotPestrecog.class, aggregation, IotPestrecog.class);
-////
-////        //获取存在识别害虫集合
-////        List<IotPest> iotPests2 = getIotPestList(results);
-////
-////        List<Map<String, Object>> list1 = new ArrayList<>();
-////        //获取日期集合
-////        List<String> dateList = DatePlugUtil.getTwoDaysDayDes(reqVo.getStartTime(), reqVo.getEndTime());
-////        for (String s : dateList) {
-////            Map<String, Object> dateMap = new HashMap<>();
-////            dateMap.put("date", s);
-////            List<Map<String, Object>> list2 = new ArrayList<>();
-////            dateMap.put("data", list2);
-////            for (IotPest iotPest : iotPests2) {
-////                String pestBid = iotPest.getPestBid();
-////                Map<String, Object> pestMap = new HashMap<>();
-////                pestMap.put("pestName", iotPest.getPestName());
-////                pestMap.put("pestBid", iotPest.getPestBid());
-////                int sum = 0;
-////                for (IotPestrecog iotPestrecog : results) {
-////                    if (s.equals(iotPestrecog.getPestrecogCreatedDate().substring(0, 10))
-////                            && pestBid != null && pestBid.equals(iotPestrecog.getPestBusid())) {
-////                        sum += iotPestrecog.getPestrecogNum();
-////                    }
-////                }
-////                pestMap.put("sum", sum);
-////                list2.add(pestMap);
-////            }
-////            list1.add(dateMap);
-////        }
-////        return AjaxResult.success(list1);
-////    }
-//
-//
-//
-//
-//    /**
-//     * 根据害虫业务标识查询始见期高峰期终见期
-//     */
-//    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:name')")
-//    @GetMapping("/period")
-//    public AjaxResult period(IotPestRecogPeriodReqVo reqVo) {
-//        Map<String, Object> resultMap = iIotPestrecogService.period(reqVo);
-//        return AjaxResult.success(resultMap);
-//    }
+
+
+    /**
+     * 虫情趋势矩阵
+     */
+    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:date:name')")
+    @GetMapping("/group/date/name")
+    public AjaxResult groupByDateName(IotDeviceDataListReqVo reqVo) {
+        if (StringUtils.isEmpty(reqVo.getStartTime()) || StringUtils.isEmpty(reqVo.getEndTime())) {
+            return AjaxResult.error(ErrorCode.INVALID_PARAMETER.getCode(), "时间不能为空");
+        }
+        List<IotPestrecogGroupByNameListResVo> results = iIotPestrecogService.groupByDateName(reqVo);
+        return AjaxResult.success(results);
+    }
+
+
+    /**
+     * 根据害虫分组统计数量
+     */
+    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:pest:list')")
+    @GetMapping("/group/pest/list")
+    public AjaxResult groupByPestList(IotDeviceDataListReqVo reqVo) {
+        List<IotPestrecogGroupPestListResVo> results = iIotPestrecogService.groupByPestList(reqVo);
+        return AjaxResult.success(results);
+    }
+
+
+    /**
+     * 根据害虫业务标识查询始见期高峰期终见期
+     */
+    @PreAuthorize("@ss.hasPermi('iot:pestrecog:group:name')")
+    @GetMapping("/period")
+    public AjaxResult period(IotPestRecogPeriodReqVo reqVo) {
+        IotPestRecogPeriodInfoResVo infoResVo = iIotPestrecogService.period(reqVo);
+        return AjaxResult.success(infoResVo);
+    }
 //
 //    public List<IotPest> getIotPestList(List<IotPestrecog> list) {
 //        Map<String, IotPest> pestMap = iotPestService.selectIotPestMapAllInfo();

+ 24 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdimgCountResVo.java

@@ -0,0 +1,24 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import com.yunfeiyun.agmp.common.annotation.Excel;
+import com.yunfeiyun.agmp.iot.common.domain.IotBaseEntity;
+import lombok.Data;
+
+/**
+ * 测报灯图片基础对象 IotCbdimg
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ *
+ */
+@Data
+public class IotCbdimgCountResVo extends IotBaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 设备业务标识 */
+    @Excel(name = "设备业务标识")
+    private String devBid;
+
+    private int imgCount;
+}

+ 24 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestRecogPeriodInfoResVo.java

@@ -0,0 +1,24 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import lombok.Data;
+
+/**
+ * 获取害虫周期
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotPestRecogPeriodInfoResVo {
+    private static final long serialVersionUID = 1L;
+
+    private String alias;
+    private String calamRemark;
+    private String course;
+    private String crops;
+    private String endInPeriod;
+    private String fastigium;
+    private String pic;
+    private String seeTimes;
+    private String pestName;
+}

+ 2 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestRecogPeriodReqVo.java

@@ -67,4 +67,6 @@ public class IotPestRecogPeriodReqVo {
     private String cbdrecogMarktype;
 
     private List<String> cbdrecogBids;
+
+    private String pestName;
 }

+ 11 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestrecogGroupByNameListResVo.java

@@ -0,0 +1,11 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class IotPestrecogGroupByNameListResVo {
+    private String date;
+    private List<IotPestrecogGroupByNameResVo> data;
+}

+ 10 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestrecogGroupPestListResVo.java

@@ -0,0 +1,10 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import lombok.Data;
+
+@Data
+public class IotPestrecogGroupPestListResVo {
+    private String pestBusid;
+    private String pestName;
+    private int pestrecogNum;
+}

+ 2 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotPestService.java

@@ -83,6 +83,8 @@ public interface IIotPestService
 
     IoPestResVo selectIotPestDetailByPestBid(String pestBid);
 
+    IoPestResVo selectIotPestDetailByPestName(String pestName);
+
     String selectIotPestCropsByCalarmId(String calarmId);
 
     IotPest selectIotPestByPestName(IotPest iotPest);

+ 5 - 3
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotPestrecogService.java

@@ -3,7 +3,6 @@ package com.yunfeiyun.agmp.iotm.device.pest.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.yunfeiyun.agmp.common.core.page.PageDomain;
-import com.yunfeiyun.agmp.iot.common.domain.IotPestrecog;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
 import com.yunfeiyun.agmp.iotm.device.pest.domain.*;
 import com.yunfeiyun.agmp.iotm.device.xy.domain.IotXyinfoPestTotalDto;
@@ -18,9 +17,12 @@ public interface IIotPestrecogService {
 
     public List<IotPestrecogGroupByNameResVo> groupByName(IotDeviceDataListReqVo reqVo);
 
-    public List<IotPestrecog> groupByDateName(IotDeviceDataListReqVo reqVo);
+    public List<IotPestrecogGroupByNameListResVo> groupByDateName(IotDeviceDataListReqVo reqVo);
+
+    public List<IotPestrecogGroupPestListResVo> groupByPestList(IotDeviceDataListReqVo reqVo);
+
     public List<IotXyinfoPestTotalDto> getIotXyinfoPestTotal(List<String> devBidList);
     public Map<String, IotXyinfoPestTotalDto> getIotXyinfoPestTotalMap(List<String> devBidList);
 
-    public Map<String, Object> period(IotPestRecogPeriodReqVo reqVo);
+    public IotPestRecogPeriodInfoResVo period(IotPestRecogPeriodReqVo reqVo);
 }

+ 5 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotPestServiceImpl.java

@@ -161,6 +161,11 @@ public class IotPestServiceImpl implements IIotPestService
     }
 
     @Override
+    public IoPestResVo selectIotPestDetailByPestName(String pestName) {
+        return iotPestMapper.selectIotPestDetailByPestName(pestName);
+    }
+
+    @Override
     public String selectIotPestCropsByCalarmId(String calarmId) {
         return iotPestMapper.selectIotPestCropsByCalarmId(calarmId);
     }

+ 166 - 125
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotPestrecogServiceImpl.java

@@ -1,24 +1,24 @@
 package com.yunfeiyun.agmp.iotm.device.pest.service.impl;
 
-import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.yunfeiyun.agmp.common.core.page.PageDomain;
 import com.yunfeiyun.agmp.common.utils.StringUtils;
-import com.yunfeiyun.agmp.iot.common.domain.*;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdimg;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.domain.IotPest;
+import com.yunfeiyun.agmp.iot.common.domain.IotYfXycb2data;
 import com.yunfeiyun.agmp.iot.common.domain.resvo.IoPestResVo;
 import com.yunfeiyun.agmp.iot.common.enums.EnumCbdMarkType;
 import com.yunfeiyun.agmp.iot.common.service.MongoService;
 import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
-import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestRecogPeriodReqVo;
-import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestrecogGroupByNameResVo;
-import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestrecogListExportResVo;
-import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestrecogListResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.*;
 import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestService;
 import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestrecogService;
 import com.yunfeiyun.agmp.iotm.device.xy.domain.IotXyinfoPestTotalDto;
 import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.aggregation.*;
@@ -302,91 +302,144 @@ public class IotPestrecogServiceImpl implements IIotPestrecogService {
      * @return
      */
     @Override
-    public List<IotPestrecog> groupByDateName(IotDeviceDataListReqVo reqVo) {
+    public List<IotPestrecogGroupByNameListResVo> groupByDateName(IotDeviceDataListReqVo reqVo) {
         String startTime = reqVo.getStartTime();
         String endTime = reqVo.getEndTime();
         String devBid = reqVo.getDevBid();
-        String cbdRecogType = "";
-        String pestrecogMarktype = "";
-//        String cbdRecogType = reqVo.getCbdRecogType();
-//        String pestrecogMarktype = reqVo.getPestrecogMarktype();
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdrecogMarktype = reqVo.getCbdrecogMarktype();
+        String unit = "day";
 
         Criteria criteria = new Criteria()
                 .and("devBid").is(devBid)
                 .and("cbdimgDelstatus").is("0");
+
         if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
             criteria = criteria.andOperator(
-                    Criteria.where("cbdimgCreatedDate").gte(startTime),
-                    Criteria.where("cbdimgCreatedDate").lte(endTime)
+                    Criteria.where("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").gte(startTime),
+                    Criteria.where("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").lte(endTime)
             );
         } else if (StringUtils.isNotEmpty(startTime)) {
-            criteria = criteria.and("cbdimgCreatedDate").gte(startTime);
+            criteria = criteria.and("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").gte(startTime);
         } else if (StringUtils.isNotEmpty(endTime)) {
-            criteria = criteria.and("cbdimgCreatedDate").lte(endTime);
+            criteria = criteria.and("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").lte(endTime);
         }
+        criteria = criteria.and("cbdrecog." + cbdrecogType + ".pestrecog." + cbdrecogMarktype + ".pestBusid").exists(true);
+
         MatchOperation matchOperation = Aggregation.match(criteria);
 
         ProjectionOperation projectionOperation = Aggregation.project()
-                .andExclude("_id")
-                .and("$$ROOT").as("c");
+                .and("cbdrecog." + cbdrecogType + ".pestrecog." + cbdrecogMarktype).as("pestrecog");
 
-        LookupOperation lookupOperationIotCbdrecog = Aggregation.lookup(
-                "IotCbdrecog", "c.cbdimgBid", "cbdimgBid", "ce"
-        );
-        Criteria cbdRecogCriteria = new Criteria()
-                .and("ce.cbdrecogType").is(cbdRecogType)
-                .and("ce.cbdrecogMarktype").is(pestrecogMarktype);
-        MatchOperation cbdRecogMatchOperation = Aggregation.match(cbdRecogCriteria);
-        UnwindOperation unwindOperationCe = Aggregation.unwind("ce", false);
-
-        LookupOperation lookupOperationIotCbdpest = Aggregation.lookup(
-                "IotCbdpest", "ce.cbdrecogBid", "cbdrecogBid", "cp"
+        UnwindOperation unwindOperation = Aggregation.unwind("pestrecog", false);
+
+        ProjectionOperation projectionOperation2 = Aggregation.project()
+                .and("pestrecog.pestBusid").as("pestBusid")
+                .and("pestrecog.pestName").as("pestName")
+                .and("pestrecog.pestrecogNum").as("pestrecogNum")
+                .andExpression(
+                    "{$dateTrunc: {date: {$dateFromString: {dateString: '$pestrecog.pestrecogCreatedDate', format: '%Y-%m-%d %H:%M:%S'}}, unit:'" + unit + "'}}").as("date");
+        GroupOperation groupOperation = Aggregation.group("date", "pestBusid")
+                .sum("pestrecogNum").as("pestrecogNum")
+                .first("pestName").as("pestName");
+
+        Map<String, String> sumMap = new HashMap<>();
+        sumMap.put("$toInt", "$pestrecogNum");
+
+        Map<String, Object> dateMap = new HashMap<>();
+        dateMap.put("sum", "$pestrecogNum");
+        dateMap.put("pestName", "$pestName");
+        dateMap.put("pestBid", "$_id.pestBusid");
+
+        GroupOperation groupOperation2 = Aggregation.group("$_id.date")
+                .push(dateMap).as("data");
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "_id");
+
+        ProjectionOperation projectionOperationResult = Aggregation.project()
+                .and("data").as("data")
+                .andExpression("{'$dateToString':{'date': '$_id', 'format': '%Y-%m-%d'}}").as("date");
+
+        Aggregation aggregation = Aggregation.newAggregation(
+                matchOperation,
+                projectionOperation,
+                unwindOperation,
+                projectionOperation2,
+                groupOperation,
+                groupOperation2,
+                sortOperation,
+                projectionOperationResult
         );
-        UnwindOperation unwindOperationCp = Aggregation.unwind("cp", false);
 
-        LookupOperation lookupOperationIotPestrecog = Aggregation.lookup(
-                "IotPestrecog", "cp.pestrecogBid", "pestrecogBid", "pr"
+        List<IotPestrecogGroupByNameListResVo> iotPestrecogGroupByNameResVoList = mongoService.aggregate(
+                IotCbdimg.class, aggregation, IotPestrecogGroupByNameListResVo.class
         );
-        UnwindOperation unwindOperationPr = Aggregation.unwind("pr", false);
-        Criteria pestRecogCriteria = new Criteria()
-                .and("pr.pestrecogMarktype").is(pestrecogMarktype);
-        MatchOperation pestRecogMatchOperation = Aggregation.match(pestRecogCriteria);
+        return iotPestrecogGroupByNameResVoList;
+    }
+
+    @Override
+    public List<IotPestrecogGroupPestListResVo> groupByPestList(IotDeviceDataListReqVo reqVo) {
+        String startTime = reqVo.getStartTime();
+        String endTime = reqVo.getEndTime();
+        String devBid = reqVo.getDevBid();
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdrecogMarktype = reqVo.getCbdrecogMarktype();
+
+        Criteria criteria = new Criteria()
+                .and("devBid").is(devBid)
+                .and("cbdimgDelstatus").is("0");
+
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            criteria = criteria.andOperator(
+                    Criteria.where("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").gte(startTime),
+                    Criteria.where("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").lte(endTime)
+            );
+        } else if (StringUtils.isNotEmpty(startTime)) {
+            criteria = criteria.and("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").gte(startTime);
+        } else if (StringUtils.isNotEmpty(endTime)) {
+            criteria = criteria.and("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").lte(endTime);
+        }
+        criteria = criteria.and("cbdrecog." + cbdrecogType + ".pestrecog." + cbdrecogMarktype + ".pestBusid").exists(true);
+
+        MatchOperation matchOperation = Aggregation.match(criteria);
+
+        ProjectionOperation projectionOperation = Aggregation.project()
+                .and("cbdrecog." + cbdrecogType + ".pestrecog." + cbdrecogMarktype).as("pestrecog");
+
+        UnwindOperation unwindOperation = Aggregation.unwind("pestrecog", false);
 
         ProjectionOperation projectionOperation2 = Aggregation.project()
-                .and("pr.pestBusid").as("pestBusid")
-                .and("pr.pestrecogNum").as("pestrecogNum")
-                .andExpression(
-                        "{$dateTrunc: {date: {$dateFromString: {dateString: '$pr.pestrecogCreatedDate', format: '%Y-%m-%d %H:%M:%S'}}, unit:'day'}}").as("pestrecogCreatedDate");
+                .and("pestrecog.pestBusid").as("pestBusid")
+                .and("pestrecog.pestName").as("pestName")
+                .and("pestrecog.pestrecogNum").as("pestrecogNum");
+
+        GroupOperation groupOperation = Aggregation.group("pestBusid")
+                .sum("pestrecogNum").as("pestrecogNum")
+                .first("pestName").as("pestName");
+
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "pestrecogNum");
 
-        GroupOperation groupOperation = Aggregation.group("pestrecogCreatedDate", "pestBusid")
-                .sum("pestrecogNum").as("pestrecogNum");
-        ProjectionOperation projectionOperation3 = Aggregation.project()
-                .and("_id.pestBusid").as("pestBusid")
+        ProjectionOperation projectionOperationResult = Aggregation.project()
+                .and("_id").as("pestBusid")
                 .and("pestrecogNum").as("pestrecogNum")
-                .andExpression(
-                        "{$dateToString: { format: '%Y-%m-%d', date: '$_id.pestrecogCreatedDate'}}").as("pestrecogCreatedDate");
+                .and("pestName").as("pestName");
 
         Aggregation aggregation = Aggregation.newAggregation(
                 matchOperation,
                 projectionOperation,
-                lookupOperationIotCbdrecog,
-                unwindOperationCe,
-                cbdRecogMatchOperation,
-                lookupOperationIotCbdpest,
-                unwindOperationCp,
-                lookupOperationIotPestrecog,
-                unwindOperationPr,
-                pestRecogMatchOperation,
+                unwindOperation,
                 projectionOperation2,
                 groupOperation,
-                projectionOperation3
+                sortOperation,
+                projectionOperationResult
         );
-        List<IotPestrecog> iotPestrecogList = mongoService.aggregate(
-                IotCbdimg.class, aggregation, IotPestrecog.class
+
+        List<IotPestrecogGroupPestListResVo> iotPestrecogGroupPestListResVoList = mongoService.aggregate(
+                IotCbdimg.class, aggregation, IotPestrecogGroupPestListResVo.class
         );
-        return iotPestrecogList;
+        return iotPestrecogGroupPestListResVoList;
     }
 
+
     /**
      * 获取性诱设备虫情识别总数
      * @param devBidList
@@ -442,101 +495,89 @@ public class IotPestrecogServiceImpl implements IIotPestrecogService {
      * @param reqVo
      */
     @Override
-    public Map<String, Object> period(IotPestRecogPeriodReqVo reqVo) {
-        String devBid = reqVo.getDevBid();
+    public IotPestRecogPeriodInfoResVo period(IotPestRecogPeriodReqVo reqVo) {
         String startTime = reqVo.getStartTime();
         String endTime = reqVo.getEndTime();
+        String devBid = reqVo.getDevBid();
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdrecogMarktype = reqVo.getCbdrecogMarktype();
         String pestBusid = reqVo.getPestBid();
+        String pestName = reqVo.getPestName();
+
+        Criteria criteria = new Criteria()
+                .and("devBid").is(devBid)
+                .and("cbdimgDelstatus").is("0")
+                .and("cbdrecog." + cbdrecogType + ".pestrecog." + cbdrecogMarktype + ".pestBusid").is(pestBusid);
 
-        Criteria criteria = new Criteria().and("devBid").is(devBid).and("pestBusid").is(pestBusid);
-        if(StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)){
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
             criteria = criteria.andOperator(
-                    Criteria.where("pestrecogCreatedDate").gte(startTime),
-                    Criteria.where("pestrecogCreatedDate").lte(endTime)
+                    Criteria.where("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").gte(startTime),
+                    Criteria.where("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").lte(endTime)
             );
         } else if (StringUtils.isNotEmpty(startTime)) {
-            criteria = criteria.and("pestrecogCreatedDate").gte(startTime);
+            criteria = criteria.and("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").gte(startTime);
         } else if (StringUtils.isNotEmpty(endTime)) {
-            criteria = criteria.and("pestrecogCreatedDate").lte(endTime);
+            criteria = criteria.and("cbdrecog." + cbdrecogType + ".cbdrecogModifieddate").lte(endTime);
         }
 
         MatchOperation matchOperation = Aggregation.match(criteria);
 
-        ProjectionOperation projectionOperation = Aggregation.project("_id")
-                .and("pestrecogNum").as("pestrecogNum")
-                .andExpression("{$dateTrunc: {date: {$dateFromString: {dateString: '$pestrecogCreatedDate', format: '%Y-%m-%d %H:%M:%S'}}, unit:'day'}}").as("date");
-
-        GroupOperation groupOperation = Aggregation.group("date")
-                .sum("pestrecogNum").as("pestrecogNum");
-
-        ProjectionOperation projectionOperation2 = Aggregation.project("_id")
-                .and("_id").as("date")
-                .and("pestrecogNum").as("pestrecogNum")
-                .andExpression("{$dateToString: {'date': '$_id', 'format': '%Y-%m-%d %H:%M:%S'}}").as("dataStr");
+        ProjectionOperation projectionOperation = Aggregation.project()
+                .and("cbdrecog." + cbdrecogType + ".pestrecog." + cbdrecogMarktype).as("pestrecog");
 
-        SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "date");
+        UnwindOperation unwindOperation = Aggregation.unwind("pestrecog", false);
 
-        GroupOperation groupOperation2 = Aggregation.group()
-                .push("$$ROOT").as("dataList");
+        Criteria criteria2 = new Criteria().and("pestrecog.pestBusid").is(pestBusid);
+        MatchOperation matchOperation2 = Aggregation.match(criteria2);
 
-        ProjectionOperation projectionOperation3 = Aggregation.project()
-                .and("dataList").as("dataList")
-                .andExpression("{'$first': '$dataList'}").as("seeTimeInfo")
-                .andExpression("{'$last': '$dataList'}").as("endInPeriodInfo");
+        ProjectionOperation projectionOperation2 = Aggregation.project()
+                .and("pestrecog.pestBusid").as("pestBusid")
+                .and("pestrecog.pestName").as("pestName")
+                .and("pestrecog.pestrecogNum").as("pestrecogNum")
+                .and("pestrecog.pestrecogCreatedDate").as("pestrecogCreatedDate");
 
-        UnwindOperation unwindOperation = Aggregation.unwind("dataList");
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "pestrecogCreatedDate");
 
-        SortOperation sortOperation2 = Aggregation.sort(Sort.Direction.DESC, "dataList.pestrecogNum");
+        Map<String, String> dataMap = new HashMap<>();
+        dataMap.put("pestrecogNum", "$pestrecogNum");
+        dataMap.put("pestrecogCreatedDate", "$pestrecogCreatedDate");
 
-        LimitOperation limitOperation = Aggregation.limit(1);
+        GroupOperation groupOperation = Aggregation.group()
+                .first("pestName").as("pestName")
+                .push(dataMap).as("dataList");
 
-        ProjectionOperation projectionOperation4 = Aggregation.project()
-                .and("seeTimeInfo").as("seeTimeInfo")
-                .and("endInPeriodInfo").as("endInPeriodInfo")
-                .and("dataList").as("fastigiumInfo");
+        ProjectionOperation projectionOperationResult = Aggregation.project()
+                .and("pestName").as("pestName")
+                .andExpression("{'$substrBytes': {{'$first': '$dataList.pestrecogCreatedDate'}, 0, 10}}").as("seeTimes")
+                .andExpression("{'$substrBytes': {{'$last': '$dataList.pestrecogCreatedDate'}, 0, 10}}").as("endInPeriod")
+                .andExpression("{'$substrBytes': {{'$max': '$dataList.pestrecogCreatedDate'}, 0, 10}}").as("fastigium");
 
         Aggregation aggregation = Aggregation.newAggregation(
                 matchOperation,
                 projectionOperation,
-                groupOperation,
+                unwindOperation,
+                matchOperation2,
                 projectionOperation2,
                 sortOperation,
-                groupOperation2,
-                projectionOperation3,
-                unwindOperation,
-                sortOperation2,
-                limitOperation,
-                projectionOperation4
+                groupOperation,
+                projectionOperationResult
         );
-        List<JSONObject> jsonObjectList = mongoService.aggregate(
-                IotPestrecog.class, aggregation, JSONObject.class
+        List<IotPestRecogPeriodInfoResVo> infoResVoList = mongoService.aggregate(
+                IotCbdimg.class, aggregation, IotPestRecogPeriodInfoResVo.class
         );
-
-        Map<String, Object> resultMap = new HashMap<>();
-        resultMap.put("seeTimes", "");
-        resultMap.put("fastigium", "");
-        resultMap.put("fastigiumaNum", "");
-        resultMap.put("endInPeriod", "");
-
-        if(jsonObjectList.size() > 0){
-            JSONObject result = jsonObjectList.get(0);
-            resultMap.put("seeTimes", result.getJSONObject("seeTimeInfo").getString("dataStr"));
-            resultMap.put("fastigium", result.getJSONObject("fastigiumInfo").getString("dataStr"));
-            resultMap.put("fastigiumaNum", result.getJSONObject("fastigiumInfo").getInteger("pestrecogNum"));
-            resultMap.put("endInPeriod", result.getJSONObject("endInPeriodInfo").getString("dataStr"));
-        }
-
-        IoPestResVo ioPestResVo = iotPestService.selectIotPestDetailByPestBid(reqVo.getPestBid());
-        if (ioPestResVo == null) {
-            ioPestResVo = new IoPestResVo();
+        IotPestRecogPeriodInfoResVo result = new IotPestRecogPeriodInfoResVo();
+        if(infoResVoList != null && !infoResVoList.isEmpty()){
+            result = infoResVoList.get(0);
+            IoPestResVo ioPestResVo = null;
+            if(Objects.equals(cbdrecogMarktype, EnumCbdMarkType.AUTO.getCode())){
+                ioPestResVo = iotPestService.selectIotPestDetailByPestBid(pestBusid);
+            }else{
+                ioPestResVo = iotPestService.selectIotPestDetailByPestName(pestName);
+            }
+            if(ioPestResVo != null){
+                BeanUtils.copyProperties(ioPestResVo, result);
+            }
         }
-        resultMap.put("pic", ioPestResVo.getPic());
-        resultMap.put("course", ioPestResVo.getCourse());
-        resultMap.put("calamRemark",ioPestResVo.getCalamRemark());
-        resultMap.put("alias", "");
-        String cropsList = iotPestService.selectIotPestCropsByCalarmId(ioPestResVo.getCalarmId());
-        resultMap.put("crops", cropsList);
-
-        return resultMap;
+        return result;
     }
 }

+ 18 - 10
src/main/java/com/yunfeiyun/agmp/iotm/device/qxsqz/controller/IotDeviceQxzController.java

@@ -54,27 +54,35 @@ public class IotDeviceQxzController extends BaseController {
 
     /**
      * 气象站列表
+     * /qxz/list  所有气象设备
+     * /qxz/pt/list 普通气象设备
+     *
+     * 墒情站列表
+     * /sqz/list 所有墒情设备
+     * /sqz/pt/list 普通墒情设备
      * @param reqVo
      * @return
      */
-    @GetMapping("/list")
+    @GetMapping({"/list", "/pt/list"})
     public TableDataInfo list(HttpServletRequest request, IotDeviceListReqVo reqVo) {
         startPage();
-        log.info(request.getPathInfo());
-        log.info(request.getRequestURI());
-        log.info(request.getContextPath());
-        log.info(String.valueOf(request.getRequestURL()));
         String reqUri = request.getRequestURI();
         String[] devTypeList = null;
+
         if(reqUri.endsWith("/qxz/list")){
             devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_QXZ, IotDeviceDictConst.TYPE_XPH_YF_QXZ};
-        }else{
+        }else if(reqUri.endsWith("/qxz/pt/list")){
+            devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_QXZ, IotDeviceDictConst.TYPE_XPH_YF_QXZ};
+        } else if (reqUri.endsWith("/sqz/list")) {
+            devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_SQZ, IotDeviceDictConst.TYPE_XPH_YF_SQZ};
+        } else if (reqUri.endsWith("/sqz/pt/list")) {
             devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_SQZ, IotDeviceDictConst.TYPE_XPH_YF_SQZ};
         }
-
-        reqVo.setDevtypeBidList(Arrays.asList(devTypeList));
-
-        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+        List<IotDeviceListResVo> list = null;
+        if (devTypeList != null) {
+            reqVo.setDevtypeBidList(Arrays.asList(devTypeList));
+            list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+        }
         return getDataTable(list);
     }
 

+ 198 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/ybq/controller/IotYbqController.java

@@ -0,0 +1,198 @@
+package com.yunfeiyun.agmp.iotm.device.ybq.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
+import com.yunfeiyun.agmp.common.core.page.TableDataInfo;
+import com.yunfeiyun.agmp.common.core.page.TableSupport;
+import com.yunfeiyun.agmp.common.utils.JSONUtils;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.common.utils.poi.ExcelUtil;
+import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdimg;
+import com.yunfeiyun.agmp.iot.common.domain.IotYbqEnvData;
+import com.yunfeiyun.agmp.iot.common.domain.IotYbqPredictData;
+import com.yunfeiyun.agmp.iot.common.domain.TosDevicetype;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotYbqdataReqVo;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.common.controller.BaseController;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceRefreshService;
+import com.yunfeiyun.agmp.iotm.device.ybq.service.IotYbqEnvDataService;
+import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotDeviceListReqVo;
+import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotDeviceListResVo;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/iot/ybq")
+@Slf4j
+public class IotYbqController extends BaseController {
+    @Autowired
+    private IIotDeviceService iIotDeviceService;
+
+    @Autowired
+    private MongoService mongoService;
+
+    @Resource
+    private IotDeviceRefreshService iotDeviceRefreshService;
+
+
+    @Autowired
+    private IotYbqEnvDataService iotYbqEnvDataService;
+
+
+    /**
+     * 水稻稻瘟病
+     *
+     * @param reqVo
+     * @return
+     */
+    @GetMapping("/device/list/dwb")
+    public TableDataInfo getDwbDevicelist(IotDeviceListReqVo reqVo) {
+        return selectDevice(IotDeviceDictConst.TYPE_HS_YBQ_DWB, reqVo);
+    }
+
+    /**
+     * 小麦赤霉病
+     *
+     * @param reqVo
+     * @return
+     */
+    @GetMapping("/device/list/cmb")
+    public TableDataInfo getCmbDevicelist(IotDeviceListReqVo reqVo) {
+        return selectDevice(IotDeviceDictConst.TYPE_HS_YBQ_CMB, reqVo);
+
+    }
+
+    /**
+     * 玉米大斑病
+     *
+     * @param reqVo
+     * @return
+     */
+    @GetMapping("/device/list/dbb")
+    public TableDataInfo getDbbDevicelist(IotDeviceListReqVo reqVo) {
+        return selectDevice(IotDeviceDictConst.TYPE_HS_YBQ_DBB, reqVo);
+
+    }
+
+    TableDataInfo selectDevice(String devTypeId, IotDeviceListReqVo reqVo) {
+        reqVo.setDevtypeBid(devTypeId);
+        startPage();
+        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取预测数据
+     */
+    @RequestMapping("/data/predict/list")
+    public TableDataInfo list(IotYbqdataReqVo reqVo) {
+        String devBizId = reqVo.getDevBid();
+        if (StringUtils.isEmpty(devBizId)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备id不可为空");
+        }
+        String ybqType = reqVo.getDateDevType();
+        if (StringUtils.isEmpty(ybqType)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "数据类型不可为空");
+        }
+        Map<String, Object> map = BeanUtil.beanToMap(reqVo);
+        // 预测时间可能会被更新,所以用修改时间,创建时候这个值会默认有
+        if (StringUtils.isNotEmpty(reqVo.getStartDate()) && StringUtils.isEmpty(reqVo.getEndDate())) {
+            map.put("gte_ybqdataModifiedDate", reqVo.getStartDate());
+        }
+        if (StringUtils.isEmpty(reqVo.getStartDate()) && StringUtils.isNotEmpty(reqVo.getEndDate())) {
+            map.put("lte_ybqdataModifiedDate", reqVo.getEndDate());
+        }
+        if (StringUtils.isNotEmpty(reqVo.getStartDate()) && StringUtils.isNotEmpty(reqVo.getEndDate())) {
+            map.put("time_ybqdataModifiedDate", reqVo.getStartDate() + "," + reqVo.getEndDate());
+        }
+        map.remove("startDate");
+        map.remove("endDate");
+        return getDataTable(mongoService.findListPage(IotYbqPredictData.class, map, TableSupport.buildPageRequest()));
+    }
+
+
+    /**
+     * 获取环境列表数据
+     */
+    @RequestMapping("/data/env/list")
+    public TableDataInfo getEnvList(IotYbqdataReqVo reqVo) {
+        String devBizId = reqVo.getDevBid();
+        if (StringUtils.isEmpty(devBizId)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备id不可为空");
+        }
+        String ybqType = reqVo.getDateDevType();
+        if (StringUtils.isEmpty(ybqType)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "数据类型不可为空");
+        }
+        Map<String, Object> map = BeanUtil.beanToMap(reqVo);
+        // 预测时间可能会被更新,所以用修改时间,创建时候这个值会默认有
+        if (StringUtils.isNotEmpty(reqVo.getStartDate()) && StringUtils.isEmpty(reqVo.getEndDate())) {
+            map.put("gte_ybqdataCreatedDate", reqVo.getStartDate());
+        }
+        if (StringUtils.isEmpty(reqVo.getStartDate()) && StringUtils.isNotEmpty(reqVo.getEndDate())) {
+            map.put("lte_ybqdataCreatedDate", reqVo.getEndDate());
+        }
+        if (StringUtils.isNotEmpty(reqVo.getStartDate()) && StringUtils.isNotEmpty(reqVo.getEndDate())) {
+            map.put("time_ybqdataCreatedDate", reqVo.getStartDate() + "," + reqVo.getEndDate());
+        }
+        map.remove("startDate");
+        map.remove("endDate");
+        return getDataTable(mongoService.findListPage(IotYbqEnvData.class, map, TableSupport.buildPageRequest()));
+    }
+
+    /**
+     * 获取环境列表数据
+     */
+    @RequestMapping("/data/env/stat")
+    public AjaxResult getEnvStatList(IotYbqdataReqVo reqVo) {
+        String devBizId = reqVo.getDevBid();
+        if (StringUtils.isEmpty(devBizId)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备id不可为空");
+        }
+        String ybqType = reqVo.getDateDevType();
+        if (StringUtils.isEmpty(ybqType)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "数据类型不可为空");
+        }
+        Map<String, Object> map = BeanUtil.beanToMap(reqVo);
+        // 预测时间可能会被更新,所以用修改时间,创建时候这个值会默认有
+        if (StringUtils.isNotEmpty(reqVo.getStartDate()) && StringUtils.isEmpty(reqVo.getEndDate())) {
+            map.put("gte_ybqdataCreatedDate", reqVo.getStartDate());
+        }
+        if (StringUtils.isEmpty(reqVo.getStartDate()) && StringUtils.isNotEmpty(reqVo.getEndDate())) {
+            map.put("lte_ybqdataCreatedDate", reqVo.getEndDate());
+        }
+        if (StringUtils.isNotEmpty(reqVo.getStartDate()) && StringUtils.isNotEmpty(reqVo.getEndDate())) {
+            map.put("time_ybqdataCreatedDate", reqVo.getStartDate() + "," + reqVo.getEndDate());
+        }
+        map.remove("startDate");
+        map.remove("endDate");
+        return AjaxResult.success(mongoService.findAll(IotYbqEnvData.class, map, "ybqdataCreatedDate,asc"));
+    }
+
+    @GetMapping("/refresh/{devBid}")
+    public AjaxResult refresh(@PathVariable("devBid") String devBid) {
+        iotDeviceRefreshService.refresh(devBid);
+        return new AjaxResult(ErrorCode.SUCCESS.getCode(), "下发成功,等待设备响应结果", null);
+    }
+
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, @RequestBody IotDeviceDataListReqVo reqVo) {
+        List<IotYbqEnvData> iotYbqEnvDataResVos = iotYbqEnvDataService.selectIotYbqEnvDataList(reqVo);
+        ExcelUtil<IotYbqEnvData> util = new ExcelUtil<>(IotYbqEnvData.class);
+        log.info("要导出的数据条数:{}", iotYbqEnvDataResVos.size());
+        util.exportExcel(response, iotYbqEnvDataResVos, "设备数据");
+    }
+}

+ 28 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/ybq/service/IotYbqEnvDataService.java

@@ -0,0 +1,28 @@
+package com.yunfeiyun.agmp.iotm.device.ybq.service;
+
+import com.yunfeiyun.agmp.iot.common.domain.IotYbqEnvData;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceBaseService;
+
+import java.util.List;
+
+/**
+ * @author zhangn
+ */
+public interface IotYbqEnvDataService  extends IotDeviceBaseService {
+    /**
+     * 插入预测数据
+     */
+    void insertData(IotYbqEnvData iotYbqEnvData);
+    /**
+     * 删除预测数据
+     *
+     * @param id
+     */
+    void deleteData(String id);
+
+
+    List<IotYbqEnvData> selectIotYbqEnvDataList(IotDeviceDataListReqVo reqVo);
+
+    IotYbqEnvData selectIotYbqEnvLastedData(String devBid);
+}

+ 119 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/ybq/serviceImp/IotYbqEnvDataServiceImpl.java

@@ -0,0 +1,119 @@
+package com.yunfeiyun.agmp.iotm.device.ybq.serviceImp;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.common.core.page.PageDomain;
+import com.yunfeiyun.agmp.common.framework.manager.RedisCacheManager;
+import com.yunfeiyun.agmp.common.utils.JSONUtils;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.common.utils.uuid.IdUtils;
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.ServiceNameConst;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevicelasteddata;
+import com.yunfeiyun.agmp.iot.common.domain.IotYbqEnvData;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.device.common.domin.DeviceRefreshDto;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.service.impl.IotDeviceBaseServiceImpl;
+import com.yunfeiyun.agmp.iotm.device.ybq.service.IotYbqEnvDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhangn
+ */
+@Service(ServiceNameConst.SERVICE_HS_YBQ)
+@Slf4j
+public class IotYbqEnvDataServiceImpl extends IotDeviceBaseServiceImpl implements IotYbqEnvDataService {
+    @Resource
+    private RedisTemplate redisTemplate;
+
+    @Autowired
+    private MongoService<IotYbqEnvData> mongoService;
+
+    @Autowired
+    private RedisCacheManager redisCacheManager;
+
+
+    @Override
+    public void insertData(IotYbqEnvData iotYbqEnvData) {
+        mongoService.saveOne(iotYbqEnvData);
+    }
+
+    @Override
+    public void deleteData(String id) {
+        mongoService.removeAllByParam("id", id, "IotYbqEnvData");
+    }
+
+    @Override
+    public List<IotYbqEnvData> selectIotYbqEnvDataList(IotDeviceDataListReqVo reqVo) {
+
+        Map<String, Object> map = BeanUtil.beanToMap(reqVo);
+        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isEmpty(reqVo.getEndTime())) {
+            map.put("gte_ybqdataCreatedDate", reqVo.getStartTime());
+        }
+        if (StringUtils.isEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+            map.put("lte_ybqdataCreatedDate", reqVo.getEndTime());
+        }
+        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+            map.put("time_ybqdataCreatedDate", reqVo.getStartTime() + "," + reqVo.getEndTime());
+        }
+        map.remove("startTime");
+        map.remove("endTime");
+        List<IotYbqEnvData> iotYbqEnvDataResVos = mongoService.findAll(IotYbqEnvData.class, map, "ybqdataCreatedDate desc");
+        return iotYbqEnvDataResVos;
+    }
+
+    @Override
+    public IotYbqEnvData selectIotYbqEnvLastedData(String deviceBid) {
+        // 尝试从Redis中获取设备的最新数据
+        ValueOperations<String, IotDevicelasteddata> operation = redisTemplate.opsForValue();
+
+        IotDevicelasteddata latestData = null;
+        try {
+            // 存放是在IOTS
+            latestData = operation.get("IOTS:IOT:device_lasted_data:" + deviceBid);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (latestData != null) {
+            String content = latestData.getDevldContent();
+            log.info("设备 [{}] 的最新数据在Redis中找到。{}", deviceBid, content);
+            return JSONUtils.toObject(content, IotYbqEnvData.class);
+        } else {
+            log.info("设备 [{}] 在Redis中无最新数据。", deviceBid);
+        }
+        // 从MongoDB中查询数据
+        IotDeviceDataListReqVo dataListReqVo = new IotDeviceDataListReqVo();
+        dataListReqVo.setDevBid(deviceBid);
+
+        Map<String, Object> params = new HashMap<>();
+        PageDomain pageDomain = new PageDomain();
+        pageDomain.setPageSize(1);
+        pageDomain.setPageNum(1);
+        params.put("devBid", deviceBid);
+        List<IotYbqEnvData> envDataList = mongoService.findListPage(IotYbqEnvData.class, params, pageDomain).getRecords();
+        if (envDataList != null && !envDataList.isEmpty()) {
+            log.info("设备 [{}] 的数据从MongoDB成功获取。", deviceBid);
+            return envDataList.get(0);
+        } else {
+            log.warn("设备 [{}] 在MongoDB中也未找到数据。", deviceBid);
+        }
+
+        return null;
+    }
+
+    public void refresh(DeviceRefreshDto reqVo) {
+
+    }
+}

+ 10 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/domain/reqvo/IotDeviceListReqVo.java

@@ -39,4 +39,14 @@ public class IotDeviceListReqVo extends IotDevice {
     private List<String> devtypeBidList;
     /**通用查询字段,用于同时查询设备名称和设备标识 */
     private String devQuery;
+
+    /**
+     * 测报灯识别类型
+     * 1  A模型
+     * 2  B模型
+     */
+    private String cbdrecogType;
+
+    /** 标记类型 0 手动标记 1  机器自动标记 */
+    private String cbdrecogMarktype;
 }

+ 2 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/mapper/IotPestMapper.java

@@ -72,4 +72,6 @@ public interface IotPestMapper
     String selectIotPestCropsByCalarmId(@Param("calarmId")  String calarmId);
 
     IotPest selectIotPestByPestName(IotPest iotPest);
+
+    IoPestResVo selectIotPestDetailByPestName(String pestName);
 }

+ 9 - 0
src/main/resources/mapper/IotPestMapper.xml

@@ -76,6 +76,15 @@ SELECT * from  IotPest where pestBid=#{pestBid}
         </where>
         limit 1
     </select>
+    <select id="selectIotPestDetailByPestName" parameterType="String"
+            resultType="com.yunfeiyun.agmp.iot.common.domain.resvo.IoPestResVo">
+        SELECT b.calarmCloudresurl pic , b.calamRemark ,CONCAT(b.calamFamilies,b.calamOrders) course ,b.calarmId
+        from (
+            SELECT * from IotPest where pestName=#{pestName} order by id desc limit 1
+        ) a
+        LEFT JOIN FmsCalarm b on calarmName = a.pestName
+        limit 0,1
+    </select>
 
     <insert id="insertIotPest" parameterType="IotPest" useGeneratedKeys="true" keyProperty="id">
         insert into IotPest