Просмотр исходного кода

新增 孢子仪数据列表,折线图,要素修改,实时数据,数据导出接口

zhaiyifei 1 год назад
Родитель
Сommit
71ae3026a2
17 измененных файлов с 2296 добавлено и 0 удалено
  1. 255 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/controller/IotBzyimgController.java
  2. 163 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/controller/IotBzyrecogController.java
  3. 390 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/controller/IotDeviceBzyController.java
  4. 213 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotBzyDeviceDataListResVo.java
  5. 92 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotBzyrecogResVo.java
  6. 49 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotSporeResVo.java
  7. 129 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotSporerecogResVo.java
  8. 14 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotYfBzyPolylineResVo.java
  9. 7 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotBzyService.java
  10. 19 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotBzyimgService.java
  11. 41 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotBzyrecogService.java
  12. 70 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotSporeService.java
  13. 56 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotBzyServiceImpl.java
  14. 71 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotBzyimgServiceImpl.java
  15. 530 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotBzyrecogServiceImpl.java
  16. 131 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotSporeServiceImpl.java
  17. 66 0
      src/main/java/com/yunfeiyun/agmp/iotm/web/mapper/IotSporeMapper.java

+ 255 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/controller/IotBzyimgController.java

@@ -0,0 +1,255 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yunfeiyun.agmp.common.core.controller.BaseController;
+import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
+import com.yunfeiyun.agmp.common.core.page.PageDomain;
+import com.yunfeiyun.agmp.common.core.page.TableDataInfo;
+import com.yunfeiyun.agmp.common.core.page.TableSupport;
+import com.yunfeiyun.agmp.common.framework.manager.ResManager;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyimg;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyrecog;
+import com.yunfeiyun.agmp.iot.common.domain.IotSporerecog;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyimgService;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyrecogService;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotSporeService;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestRecogPeriodReqVo;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+/**
+ * 虫情识别信息表Controller
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@RestController
+@RequestMapping("/iot/device/bzyimg")
+public class IotBzyimgController extends BaseController {
+    @Autowired
+    private IIotSporeService iotSporeService;
+    @Autowired
+    private MongoService mongoService;
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Autowired
+    private IIotBzyimgService iotBzyimgService;
+    @Autowired
+    private IIotBzyrecogService iIotBzyrecogService;
+
+    //private IotSporerecog
+
+    @Autowired
+    private ResManager resManager;
+    @Autowired
+    private IIotDeviceService iotDeviceService;
+
+    void validateParam(String bizId) {
+        if (StringUtils.isEmpty(bizId)) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备id不可为空");
+        }
+    }
+
+    /**
+     * 对开始时间结束时间进行封装
+     *
+     * @param map
+     * @param column
+     * @param startTime
+     * @param endTime
+     */
+    private void timePackage(Map<String, Object> map, String column, String startTime, String endTime) {
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isEmpty(endTime)) {
+            map.put("gte_" + column, startTime);
+        }
+        if (StringUtils.isEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            map.put("lte_" + column, endTime);
+        }
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            map.put("time_" + column, startTime + "," + endTime);
+        }
+    }
+
+    /**
+     * 识别数据列表
+     */
+    @PreAuthorize("@ss.hasPermi('iot:bzyimg:sum:info')")
+    @GetMapping("/sum/info")
+    public AjaxResult sumInfo(IotPestRecogPeriodReqVo reqVo) {
+        validateParam(reqVo.getDevBid());
+        Map<String, Object> map = new HashMap<>();
+        map.put("devBid", reqVo.getDevBid());
+        map.put("bzyimgDelstatus", "0");
+        timePackage(map, "bzyimgCreatedDate", reqVo.getStartTime(), reqVo.getEndTime());
+        // 获取图片总数
+        List<IotBzyimg> iotCbdimgs = mongoService.findAll(IotBzyimg.class, map);
+        List<String> bzyimgBids = new ArrayList<>();
+        for (IotBzyimg iotCbdimg : iotCbdimgs) {
+            bzyimgBids.add(iotCbdimg.getBzyimgBid());
+        }
+        if (!bzyimgBids.isEmpty()) {
+            Map<String, Object> map2 = new HashMap<>();
+            map2.put("newList_bzyimgBid", bzyimgBids);
+            map2.put("bzyrecogDelstatus", "0");
+            //获取识别记录总数,查询识别数据
+            List<IotBzyrecog> iotCbdrecogs = mongoService.findAll(IotBzyrecog.class, map2);
+            // 获取虫子总数
+            Map<String, String> iotPestrecogsParam = new HashMap<>();
+            iotPestrecogsParam.put("devBid", reqVo.getDevBid());
+            List<IotSporerecog> iotSporerecogs = mongoService.findAll(IotSporerecog.class, iotPestrecogsParam);
+            // 统计虫子和类型
+            int sporeCount = 0;
+            Set<String> sporeTypeCount = new HashSet<>();
+            for (IotSporerecog iotSporerecog : iotSporerecogs) {
+                Long num = iotSporerecog.getSporerecogNum();
+                sporeCount += (num == null ? 0 : num);
+                sporeTypeCount.add(iotSporerecog.getSporeBusid());
+                // 处理统计逻辑
+            }
+
+            Map<String, Object> returnMap = new HashMap<>();
+            returnMap.put("imgCount", iotCbdimgs.size());
+            returnMap.put("recogImgCount", iotCbdrecogs.size());
+            returnMap.put("sum", sporeCount);
+            returnMap.put("typeCount", sporeTypeCount.size());
+            return AjaxResult.success(returnMap);
+        }
+        Map<String, Object> returnMap = new HashMap<>();
+        returnMap.put("imgCount", 0);
+        returnMap.put("recogImgCount", 0);
+        returnMap.put("sum", 0);
+        returnMap.put("typeCount", 0);
+        return AjaxResult.success(returnMap);
+    }
+
+    /**
+     * 识别数据列表
+     */
+    @PreAuthorize("@ss.hasPermi('iot:bzyimg:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(IotPestRecogPeriodReqVo reqVo) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("devBid", reqVo.getDevBid());
+        map.put("bzyimgDelstatus", "0");
+        timePackage(map, "bzyimgCreatedDate", reqVo.getStartTime(), reqVo.getEndTime());
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        IPage listPage = mongoService.findListPage(IotBzyimg.class, map, pageDomain);
+        return getDataTable(listPage);
+    }
+//
+//
+
+//
+//    /**
+//     * 图片识别率
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:bzyimg:group:date:list')")
+//    @GetMapping("/group/date/list")
+//    public AjaxResult groupDateList(IotPestRecogPeriodReqVo reqVo) {
+//        validateParam(reqVo.getDevBid());
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("devBid", reqVo.getDevBid());
+//        map.put("bzyimgDelstatus", "0");
+//        timePackage(map, "bzyimgCreatedDate", reqVo.getStartTime(), reqVo.getEndTime());
+//        // 获取图片总数
+//        List<IotBzyimg> iotCbdimgs = mongoService.findAll(IotBzyimg.class, map);
+//        //获取日期集合
+//        List<String> dateList = DatePlugUtil.getTwoDaysDayDes(reqVo.getStartTime(), reqVo.getEndTime());
+//        Map<String, DateCountStatResVo> map3 = new HashMap();
+//        List<DateCountStatResVo> dateList2 = new ArrayList<>();
+//        for (String s1 : dateList) {
+//            map3.put(s1, new DateCountStatResVo(s1, 0));
+//            dateList2.add(map3.get(s1));
+//        }
+//        for (IotBzyimg iotCbdimg : iotCbdimgs) {
+//            String bzyimgCreatedDate = iotCbdimg.getBzyimgCreatedDate().substring(0, 10);
+//            DateCountStatResVo dateCountStatResVo = map3.get(bzyimgCreatedDate) == null ? map3.get(bzyimgCreatedDate + " 00:00:00") : map3.get(bzyimgCreatedDate);
+//            dateCountStatResVo.setCount(dateCountStatResVo.getCount() + (iotCbdimg.getBzyimgRecognum() == null ? 0 : iotCbdimg.getBzyimgRecognum()));
+//
+//        }
+//        return AjaxResult.success(dateList2);
+//    }
+//
+//
+//    /**
+//     * 删除图片
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:device:remove')")
+//    @Log(title = "删除图片", businessType = BusinessType.DELETE)
+//    @DeleteMapping("/delete")
+//    public AjaxResult remove(@RequestParam("ids") String[] ids) {
+//        return toAjax(iotBzyimgService.remove(ids));
+//    }
+//
+//    protected TableDataInfo getDataTable(IPage page) {
+//        TableDataInfo rspData = new TableDataInfo();
+//        rspData.setCode(ErrorCode.SUCCESS.getCode());
+//        rspData.setMsg(ErrorCode.SUCCESS.getMessage());
+//        rspData.setData(page.getRecords());
+//        rspData.setTotal(page.getTotal());
+//        return rspData;
+//    }
+//
+
+//
+//    @PreAuthorize("@ss.hasPermi('iot:bzyimg:upload')")
+//    @Log(title = "孢子仪采集照片上传", businessType = BusinessType.INSERT)
+//    @PostMapping("/upload")
+//    public AjaxResult upload(MultipartFile file) throws Exception
+//    {
+//        if (!file.isEmpty())
+//        {
+//            SysRes sysRes  = resManager.uploadRes( ResConstants.BizType.IOT_BZY_PIC, ResConstants.mediaType.IMG,"", file,getLoginUser());
+//            return success(sysRes);
+//        }
+//        return error(ErrorCode.UPLOAD_FAIL.getCode());
+//    }
+//
+//    /**
+//     * 新增采集照片
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:bzyimg:add')")
+//    @Log(title = "新增孢子仪采集照片", businessType = BusinessType.INSERT)
+//    @PostMapping("/add")
+//    public AjaxResult add(@Validated @RequestBody IotBzyimgAddReqVo reqVo)
+//    {
+//
+//        String datetimeNow = DateUtils.dateTimeNow();
+//
+//        List<IotBzyimg> bzyimgList = reqVo.getBzyimgList();
+//        for (IotBzyimg bzyimg : bzyimgList) {
+//            IotBzyimg iotBzyimg = new IotBzyimg();
+//            iotBzyimg.setBzyimgBid(iotBzyimg.getUUId());
+//            iotBzyimg.setCId(CustomerIdUtil.getCustomerId());
+//            iotBzyimg.setDevBid(reqVo.getDevBid());
+//            iotBzyimg.setBzyimgAddr(bzyimg.getBzyimgAddr());
+//            iotBzyimg.setBzyimgResid(bzyimg.getBzyimgResid());
+//            iotBzyimg.setBzyimgPestnum(0L);
+//            iotBzyimg.setBzyimgRecognum(0L);
+//            iotBzyimg.setBzyimgModifieddate(datetimeNow);
+//            iotBzyimg.setBzyimgCreatedDate(datetimeNow);
+//            iotBzyimg.setBzyimgDelstatus("0");
+//
+//            mongoService.saveOne(iotBzyimg);
+//        }
+//
+//        //更新设备的”更新时间(上报日期)“
+//        IotDevice iotDevice = new IotDevice();
+//        iotDevice.setDevBid(reqVo.getDevBid());
+//        iotDevice.setDevUpdateddate(datetimeNow);
+//        iotDeviceService.updateIotDevice(iotDevice);
+//
+//        return success();
+//    }
+}

+ 163 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/controller/IotBzyrecogController.java

@@ -0,0 +1,163 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.controller;
+
+
+import com.yunfeiyun.agmp.common.core.controller.BaseController;
+import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
+import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyimg;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyrecog;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotBzyrecogResVo;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyrecogService;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotSporeService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 虫情识别信息表Controller
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@RestController
+@RequestMapping("/iot/device/bzyrecog")
+public class IotBzyrecogController extends BaseController {
+    @Autowired
+    private IIotSporeService iotPestService;
+    @Autowired
+    private MongoService mongoService;
+    @Autowired
+    private IIotBzyrecogService iotBzyrecogService;
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    /**
+     * 测报灯图片识别数据详情
+     */
+    @PreAuthorize("@ss.hasPermi('iot:bzyrecog:query')")
+    @GetMapping(value = "/info")
+    public AjaxResult getInfo(@RequestParam("bzyimgBid") String bzyimgBid) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("bzyimgBid", bzyimgBid);
+        IotBzyrecog iotCbdrecog = (IotBzyrecog) mongoService.findOne(IotBzyrecog.class, map, null, null);
+        IotBzyimg iotCbdimg = (IotBzyimg) mongoService.findOne(IotBzyimg.class, map, null, null);
+        if (iotCbdimg == null) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), bzyimgBid + "数据不存在");
+        }
+        IotBzyrecogResVo resVo = new IotBzyrecogResVo();
+        if (iotCbdrecog != null) {
+            BeanUtils.copyProperties(iotCbdrecog, resVo);
+        }
+        resVo.setBzyimgAddr(iotCbdimg.getBzyimgAddr());
+        resVo.setBzyimgPestnum(iotCbdimg.getBzyimgPestnum());
+        resVo.setBzyimgRecognum(iotCbdimg.getBzyimgRecognum());
+        return success(resVo);
+    }
+
+
+    /**
+     * 人工修正提交
+     */
+    @PreAuthorize("@ss.hasPermi('iot:bzyrecog:artificial:update')")
+    @PostMapping(value = "/artificial/update")
+    public AjaxResult artificialUpdate(@RequestBody IotBzyrecog iotCbdrecog) {
+        iotCbdrecog.setBzyrecogMarktype("0");
+        return toAjax(iotBzyrecogService.artificialUpdate(iotCbdrecog));
+    }
+
+
+    /**
+     * 人工修正重置
+     */
+    @PreAuthorize("@ss.hasPermi('iot:bzyrecog:artificial:reset')")
+    @PostMapping(value = "/artificial/reset")
+    public AjaxResult artificialReset(@RequestBody IotBzyrecog iotCbdrecog) {
+        iotCbdrecog.setBzyrecogMarktype("1");
+        iotBzyrecogService.artificialReset(iotCbdrecog);
+        return AjaxResult.success();
+    }
+
+//    /**
+//     * 识别数据列表
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:bzyrecog:list')")
+//    @GetMapping("/list")
+//    public TableDataInfo list(IotSporeRecogPeriodReqVo reqVo) {
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("devBid", reqVo.getDevBid());
+//        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isEmpty(reqVo.getEndTime())) {
+//            map.put("gte_bzyrecogCreatedDate", reqVo.getStartTime());
+//        }
+//        if (StringUtils.isEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+//            map.put("lte_bzyrecogCreatedDate", reqVo.getEndTime());
+//        }
+//        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+//            map.put("time_bzyrecogCreatedDate", reqVo.getStartTime() + "," + reqVo.getEndTime());
+//        }
+//
+//        PageDomain pageDomain = TableSupport.buildPageRequest();
+//        IPage listPage = mongoService.findListPage(IotBzyrecog.class, map, pageDomain);
+//        List<IotBzyrecog> records = listPage.getRecords();
+//
+////        List<IotPestrecogResVo> list = getIotPestrecogResVoList(records);
+////        listPage.setRecords(list);
+//
+//        return getDataTable(listPage);
+//    }
+//
+//
+
+
+//
+//    protected TableDataInfo getDataTable(IPage page) {
+//        TableDataInfo rspData = new TableDataInfo();
+//        rspData.setCode(ErrorCode.SUCCESS.getCode());
+//        rspData.setMsg(ErrorCode.SUCCESS.getMessage());
+//        rspData.setData(page.getRecords());
+//        rspData.setTotal(page.getTotal());
+//        return rspData;
+//    }
+//
+//    /**
+//     * 更新病害识别结果
+//     * (昌黎)暂时直接使用孢子识别的代码
+//     * */
+//    @PreAuthorize("@ss.hasPermi('iot:bzyrecog:disease:update')")
+//    @Log(title = "更新病害识别结果",businessType = BusinessType.UPDATE)
+//    @PostMapping("/disease/update")
+//    public AjaxResult diseaseUpdate(@RequestBody IotBzyrecog iotCbdrecog){
+//        iotCbdrecog.setBzyrecogMarktype("0");
+//        return toAjax(iotBzyrecogService.diseaseUpdate(iotCbdrecog));
+//    }
+//
+//    /**
+//     * 取 病害识别结果
+//     * (昌黎)暂时直接使用孢子识别的代码
+//     */
+//    @PreAuthorize("@ss.hasPermi('iot:bzyrecog:disease:query')")
+//    @GetMapping(value = "/disease/info")
+//    public AjaxResult diseaseInfo(@RequestParam("bzyimgBid") String bzyimgBid) {
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("bzyimgBid", bzyimgBid);
+//        IotBzyrecog iotCbdrecog = (IotBzyrecog) mongoService.findOne(IotBzyrecog.class, map, null, null);
+//        IotBzyimg iotCbdimg = (IotBzyimg) mongoService.findOne(IotBzyimg.class, map, null, null);
+//        if (iotCbdimg == null) {
+//            throw new IotBizException(IotErrorCode.FAILURE.getCode(), bzyimgBid + "数据不存在");
+//        }
+//        IotBzyrecogResVo resVo = new IotBzyrecogResVo();
+//        if (iotCbdrecog != null) {
+//            BeanUtils.copyProperties(iotCbdrecog, resVo);
+//        }
+//        resVo.setBzyimgAddr(iotCbdimg.getBzyimgAddr());
+//        resVo.setBzyimgPestnum(iotCbdimg.getBzyimgPestnum());
+//        resVo.setBzyimgRecognum(iotCbdimg.getBzyimgRecognum());
+//        return success(resVo);
+//    }
+}

+ 390 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/controller/IotDeviceBzyController.java

@@ -0,0 +1,390 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.controller;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.common.annotation.Log;
+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.enums.BusinessType;
+import com.yunfeiyun.agmp.common.log.LogCore;
+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.common.utils.uuid.IdUtils;
+import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzydata;
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotBzyConfigEditReqVo;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotBzydataReqVo;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.common.controller.BaseController;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotBzyDeviceDataListResVo;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotYfBzyPolylineResVo;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyrecogService;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceDataListReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceRefreshService;
+import com.yunfeiyun.agmp.iotm.util.ValidateUtil;
+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.IIotCmdtaskService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceconfigService;
+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.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+/**
+ * 孢子仪相关接口
+ *
+ * @author
+ */
+@RestController
+@RequestMapping("/iot/device/bzy")
+@Slf4j
+public class IotDeviceBzyController extends BaseController {
+
+    @Resource
+    private IIotDeviceconfigService iIotDeviceconfigService;
+    @Resource
+    private IIotCmdtaskService iIotCmdtaskService;
+    @Resource
+    private MongoService mongoService;
+    @Autowired
+    private IIotDeviceService iIotDeviceService;
+
+    @Autowired
+    private IIotBzyrecogService iIotBzyrecogService;
+
+    @Resource
+    private IotDeviceRefreshService iotDeviceRefreshService;
+
+
+    /**
+     * 孢子仪列表
+     * /list  所有孢子仪设备
+     * /pt/list 普通孢子仪设备
+     * @param reqVo
+     * @return
+     */
+    @GetMapping({"/list", "/pt/list"})
+    public TableDataInfo list(HttpServletRequest request, IotDeviceListReqVo reqVo) {
+        startPage();
+        String reqUri = request.getRequestURI();
+        String[] devTypeList = new String[]{
+                IotDeviceDictConst.TYPE_YF_BZY,
+                IotDeviceDictConst.TYPE_YF_L_BZY
+        };
+
+        if(reqUri.endsWith("/pt/list")){
+            devTypeList = new String[]{IotDeviceDictConst.TYPE_YF_BZY};
+        }
+        reqVo.setDevtypeBidList(Arrays.asList(devTypeList));
+        List<IotDeviceListResVo> list = iIotDeviceService.selectIotDeviceListByType(reqVo);
+        return getDataTable(list);
+    }
+
+    @GetMapping("/data/list")
+    public TableDataInfo dataList(IotBzydataReqVo reqVo) {
+        Map<String, Object> map = BeanUtil.beanToMap(reqVo);
+        String startTime = reqVo.getStartTime();
+        String endTime = reqVo.getEndTime();
+
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isEmpty(endTime)) {
+            map.put("gte_bzydataCreatedDate", startTime);
+        }
+        if (StringUtils.isEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            map.put("lte_bzydataCreatedDate", endTime);
+        }
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            map.put("time_bzydataCreatedDate", startTime + "," + endTime);
+        }
+        map.remove("startTime");
+        map.remove("endTime");
+        return getDataTable(mongoService.findListPage(IotBzydata.class, map, TableSupport.buildPageRequest()));
+    }
+
+    /**
+     * 统计温湿度折线图
+     *
+     * @param reqVo
+     * @return
+     */
+    @GetMapping("/ath/stat")
+    public AjaxResult statAth(IotBzydataReqVo reqVo) {
+        String startTime = reqVo.getStartTime();
+        String endTime = reqVo.getEndTime();
+
+        if (StringUtils.isEmpty(reqVo.getDevBid())) {
+            return AjaxResult.error(IotErrorCode.PARAM_INVALID.getCode(), "设备id不可为空");
+        }
+        if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {
+            return AjaxResult.error(IotErrorCode.PARAM_INVALID.getCode(), "时间不可为空,请设置检索范围");
+        }
+
+        List<IotYfBzyPolylineResVo> iotYfBzyPolylineResVoList = iIotBzyrecogService.polyline(reqVo);
+        return AjaxResult.success(iotYfBzyPolylineResVoList);
+    }
+
+    /**
+     * 孢子仪-拍照
+     *
+     * @return
+     * @throws Exception
+     */
+
+    @GetMapping("/takephoto/{devBid}")
+    public AjaxResult takePhoto(@PathVariable("devBid") String devBid) {
+        log.info("【{}】【孢子仪】【拍照】客户id {}", LogCore.getSeq(), getCustomerId());
+        IotDevice iotDevice = iIotDeviceService.selectIotDeviceByDevBid(devBid);
+        if (iotDevice == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(),"设备不存在");
+        }
+
+        IotDeviceconfig iotDeviceconfig = new IotDeviceconfig();
+        iotDeviceconfig.setTid(iotDevice.getTid());
+        iotDeviceconfig.setDevBid(devBid);
+
+        CmdGroupModel cmdGroupModel = iIotDeviceconfigService.createTakePhotoCmd(iotDeviceconfig);
+        cmdGroupModel.setRequestId(IdUtils.fastUUID());
+        // 适配增加详细日志使用
+        cmdGroupModel.setDevCode(iotDevice.getDevCode());
+        cmdGroupModel.setCtBiztitle(iotDevice.getDevtypeName() + ":" + iotDevice.getDevCode());
+        cmdGroupModel.setCtBiztype("3");
+        cmdGroupModel.setCtDevtype(iotDevice.getDevtypeBid());
+        //cmdGroupModel.setCtParam(deviceConfigurationTranslator.logTakePhoto(iotDevice.getDevBid()));
+        cmdGroupModel.setCtParam("设备id:"+devBid);
+        iIotCmdtaskService.handInternalCmd(cmdGroupModel);
+        String taskId = cmdGroupModel.getTaskUuid();
+        return new AjaxResult(ErrorCode.SUCCESS.getCode(), "下发成功,等待设备响应结果", taskId);
+    }
+
+    @GetMapping("/config/info/{devBid}")
+    public AjaxResult configInfo(@PathVariable("devBid") String devBid){
+        if(StringUtils.isEmpty(devBid)){
+            throw new IotBizException(IotErrorCode.PARAM_INVALID.getCode(),"参数不能为空");
+        }
+        IotDevice iotDevice = iIotDeviceService.selectIotDeviceByDevBid(devBid);
+        if(iotDevice == null){
+            throw new IotBizException(ErrorCode.INVALID_PARAMETER.getCode(),"设备不存在");
+        }
+        IotDeviceconfig iotDeviceconfig = iIotDeviceconfigService.selectIotDeviceConfigByDevBid(devBid);
+        return AjaxResult.success(iotDeviceconfig.getDevcfgContext());
+    }
+
+    /**
+     * 下发孢子仪配置指令
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/config/edit")
+    public AjaxResult sendConfigCmd(@RequestBody IotBzyConfigEditReqVo iotBzyConfigEditReqVo) {
+        log.info("【{}】【孢子仪】【下发指令配置】客户id {}", LogCore.getSeq(), getCustomerId());
+        String devBid = iotBzyConfigEditReqVo.getDevBid();
+        if (StringUtils.isEmpty(devBid)) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(),"设备id不可为空");
+        }
+        IotDevice iotDevice = iIotDeviceService.selectIotDeviceByDevBid(devBid);
+        if (iotDevice == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(),"设备不存在");
+        }
+        IotDeviceconfig iotDeviceconfig = iIotDeviceconfigService.selectIotDeviceConfigByDevBid(devBid);
+        if (null == iotDeviceconfig) {
+            // 如果测报灯配置为空,则新增测报灯配置
+            iotDeviceconfig = new IotDeviceconfig();
+            iotDeviceconfig.setDevcfgBid(iotDeviceconfig.getUUId());
+            iotDeviceconfig.setTid(iotDevice.getTid());
+            iotDeviceconfig.setDevBid(devBid);
+            iotDeviceconfig.setDevcfgContext(JSONUtils.toJSONString(iotBzyConfigEditReqVo.getIotBzyConfig()));
+            iotDeviceconfig.setDevcfgDelstatus("0");
+            iIotDeviceconfigService.insertIotDeviceconfig(iotDeviceconfig);
+        } else {
+            // 如果测报灯配置不为空,则更新测报灯配置
+            iotDeviceconfig.setDevcfgContext(JSONUtils.toJSONString(iotBzyConfigEditReqVo.getIotBzyConfig()));
+            iIotDeviceconfigService.updateIotDeviceconfig(iotDeviceconfig);
+        }
+
+        CmdGroupModel cmdGroupModel = iIotDeviceconfigService.createConfigCmd(iotDeviceconfig);
+        log.info("【{}】【孢子仪】【构建 cmdGroupModel】{}", LogCore.getSeq(), JSONUtils.toJSONString(cmdGroupModel));
+        cmdGroupModel.setRequestId(IdUtils.fastUUID());
+
+        // 适配增加详细日志使用
+        cmdGroupModel.setDevCode(iotDevice.getDevCode());
+        cmdGroupModel.setCtBiztitle(iotDevice.getDevtypeName() + ":" + iotDevice.getDevCode());
+        cmdGroupModel.setCtBiztype("3");
+        cmdGroupModel.setCtDevtype(iotDevice.getDevtypeBid());
+        //cmdGroupModel.setCtParam(deviceConfigurationTranslator.configTranslate(iotCbdConfigEditReqVo));
+        cmdGroupModel.setCtParam(JSONUtils.toJSONString(iotBzyConfigEditReqVo));
+        iIotCmdtaskService.handInternalCmd(cmdGroupModel);
+        String taskId = cmdGroupModel.getTaskUuid();
+        return new AjaxResult(ErrorCode.SUCCESS.getCode(), "下发成功,等待设备响应结果", taskId);
+    }
+
+    @GetMapping("/refresh/{devBid}")
+    public AjaxResult refresh(@PathVariable("devBid") String devBid) {
+        String result = iotDeviceRefreshService.refresh(devBid);
+        return new AjaxResult(ErrorCode.SUCCESS.getCode(), result, null);
+    }
+
+    @Log(title = "设备数据", businessType = BusinessType.EXPORT)
+    @PostMapping("/data/export")
+    public void dataExport(HttpServletResponse response, @RequestBody IotDeviceDataListReqVo reqVo) {
+        ValidateUtil.validateDevBid(reqVo.getDevBid());
+        String devBid = reqVo.getDevBid();
+        String startTime = reqVo.getStartTime();
+        String endTime = reqVo.getEndTime();
+        String[] params = {devBid, startTime, endTime};
+        for (String k : params) {
+            if (StringUtils.isEmpty(k)) {
+                throw new IotBizException(IotErrorCode.PARAM_INVALID.getCode(), "参数不能为空");
+            }
+        }
+
+        List<IotBzyDeviceDataListResVo> list = new ArrayList<>();
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("devBid", devBid);
+        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isEmpty(reqVo.getEndTime())) {
+            map.put("gte_bzydataCreatedDate", reqVo.getStartTime());
+        }
+        if (StringUtils.isEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+            map.put("lte_bzydataCreatedDate", reqVo.getEndTime());
+        }
+        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+            map.put("time_bzydataCreatedDate", reqVo.getStartTime() + "," + reqVo.getEndTime());
+        }
+
+        List<IotBzydata> all = mongoService.findAll(IotBzydata.class, map);
+
+        for (IotBzydata item : all) {
+            IotBzyDeviceDataListResVo resVo = JSONObject.parseObject(item.getBzydataContent().toJSONString(), IotBzyDeviceDataListResVo.class);
+            resVo.setStamp(item.getBzydataCreatedDate());
+            list.add(resVo);
+        }
+
+        ExcelUtil<IotBzyDeviceDataListResVo> util = new ExcelUtil<>(IotBzyDeviceDataListResVo.class);
+        util.exportExcel(response, list, "设备数据");
+    }
+
+//
+
+//
+//  /*  boolean isSameDay(String startTimeStr, String endTimeStr) {
+//        return startTimeStr.substring(0, 10).equals(endTimeStr.substring(0, 10));
+//    }*/
+//
+//    public List<IotAthStatVo> generateTimeSeries(String startTimeStr, String endTimeStr) {
+//        // 创建日期时间格式器
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//
+//        // 解析开始时间和结束时间
+//        LocalDateTime start = LocalDateTime.parse(startTimeStr, formatter);
+//        LocalDateTime end = LocalDateTime.parse(endTimeStr, formatter);
+//
+//        // 确保开始时间早于结束时间
+//        if (start.isAfter(end)) {
+//            throw new IllegalArgumentException("Start time must be before end time.");
+//        }
+//
+//        // 创建一个用于存储时间序列的列表
+//        List<IotAthStatVo> timeSeries = new ArrayList<>();
+//
+//        // 使用while循环来生成时间序列
+//        while (!start.isAfter(end)) {
+//            IotAthStatVo statVo = new IotAthStatVo();
+//            // 添加当前时间点到列表
+//            statVo.setTime(start.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")));
+//            timeSeries.add(statVo);
+//            // 将开始时间增加10分钟
+//            start = start.plusMinutes(10);
+//        }
+//
+//        return timeSeries;
+//    }
+//
+//    @GetMapping("/cmdTest")
+//    public AjaxResult cmdTest() {
+//        CmdGroupModel cmdGroupModel = new CmdGroupModel();
+//        cmdGroupModel.setCId("1");
+//        cmdGroupModel.setCmdModels(new LinkedList<>());
+//        cmdGroupModel.setRequestId(IdUtils.fastUUID());
+//
+//
+//        CmdModel cmdModel = new CmdModel();
+//        cmdModel.setDeviceId("bidzhaiyifei123456");
+//
+//        CmdModel.Cmd cmd = new CmdModel.Cmd();
+//        cmd.setFunc("takephoto");
+//        cmd.setRetry(5L);
+//        cmdModel.setFinalStatus(false);
+//        cmdModel.setTimeout(10);
+//        cmdModel.setNeedcheckStatus(true);
+//        cmdModel.setCmdDistribution(cmd);
+//
+//        CmdModel err = new CmdModel();
+//        err.setDeviceId("bidzhaiyifei123456");
+//        err.setFinalStatus(false);
+//        err.setTimeout(10);
+//        err.setNeedcheckStatus(false);
+//        err.setCmdDistribution(cmd);
+//        CmdModel.Cmd errCmd = new CmdModel.Cmd();
+//        errCmd.setFunc("err");
+//        err.setCmdDistribution(errCmd);
+//
+//
+//        //cmdGroupModel.getCmdModels().add(Collections.singletonList(err));
+//
+///*        for(int i = 0;i<3;i++){
+//            List<CmdModel> cmdModelList = new ArrayList<>(Collections.singleton(cmdModel));
+//            cmdGroupModel.getCmdModels().add(cmdModelList);
+//        }*/
+//
+//
+//        cmdGroupModel.getCmdModels().add(Collections.singletonList(cmdModel));
+//
+//
+//        CmdModel cmdModel2 = new CmdModel();
+//        cmdModel2.setDeviceId("bidzhaiyifei123456");
+//        CmdModel.Cmd cmd2 = new CmdModel.Cmd();
+//        cmd2.setFunc("takephoto");
+//        cmd2.setRetry(5L);
+//        cmdModel2.setFinalStatus(false);
+//        cmdModel2.setTimeout(10);
+//        cmdModel2.setNeedcheckStatus(true);
+//        cmdModel2.setCmdDistribution(cmd2);
+//
+//
+//        cmdGroupModel.getCmdModels().add(Collections.singletonList(cmdModel2));
+//
+//
+//        CmdModel cmdModel3 = new CmdModel();
+//        cmdModel3.setDeviceId("bidzhaiyifei123456");
+//        CmdModel.Cmd cmd3 = new CmdModel.Cmd();
+//        cmd3.setFunc("takephoto");
+//        cmd3.setRetry(5L);
+//        cmdModel3.setFinalStatus(true);
+//        cmdModel3.setTimeout(10);
+//        cmdModel3.setNeedcheckStatus(false);
+//        cmdModel3.setCmdDistribution(cmd3);
+//
+//        cmdGroupModel.getCmdModels().add(Collections.singletonList(cmdModel3));
+//
+//
+//        iIotCmdtaskService.handInternalCmd(cmdGroupModel);
+//        return AjaxResult.success();
+//    }
+
+
+}

+ 213 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotBzyDeviceDataListResVo.java

@@ -0,0 +1,213 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.domain;
+
+import com.yunfeiyun.agmp.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 设备数据
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotBzyDeviceDataListResVo {
+    // 设备版本号,必传且在Excel表格中显示为"设备版本号"
+    @Excel(name = "设备版本号")
+    private String dver;
+
+    // 内部版本号,必传且在Excel表格中显示为"内部版本号"
+    @Excel(name = "内部版本号")
+    private String proj;
+
+    // 设备类型,必传且不可调整,例如:"7"代表孢子仪设备;在Excel表格中显示为"设备类型"
+    @Excel(name = "设备类型")
+    private String dtype;
+
+    // 摄像头状态,在Excel表格中显示为"摄像头状态",必传且不可为空
+    // 取值含义:0 - 待机,1 - 收集,2 - 培养,3 - 拍照
+    @Excel(name = "摄像头状态")
+    private String work_sta;
+
+    // 运行状态,在Excel表格中显示为"运行状态",必传且不可为空,含义同摄像头状态
+    @Excel(name = "运行状态")
+    private String run_sta;
+
+    // 机箱温度(℃),在Excel表格中显示为"机箱温度(℃)",必传且不可为空
+    @Excel(name = "机箱温度(℃)")
+    private String box_tem;
+
+    // 孢子培养时间(小时),在Excel表格中显示为"孢子培养时间",必传且不可为空
+    @Excel(name = "孢子培养时间")
+    private String cul_time;
+
+    // 制冷机开关,在Excel表格中显示为"制冷机开关",必传且不可为空
+    // 取值含义:0 - 关闭,1 - 开启
+    @Excel(name = "制冷机开关")
+    private String cold_sw;
+
+    // 电压状态,在Excel表格中显示为"电压状态",必传且不可为空
+    // 取值含义:0 - 正常,1 - 欠压
+    @Excel(name = "电压状态")
+    private String batStatus;
+
+    // 已培养时间(小时),在Excel表格中显示为"已培养时间",必传且不可为空
+    @Excel(name = "已培养时间(小时)")
+    private String stay_time;
+
+    // 风机开关,在Excel表格中显示为"风机开关",必传且不可为空
+    // 取值含义:0 - 关闭,1 - 开启
+    @Excel(name = "风机开关")
+    private String wind_sw;
+
+    // 保温仓当前温度(℃),在Excel表格中显示为"保温仓当前温度",必传
+    @Excel(name = "保温仓当前温度")
+    private String pre_temp;
+
+    // 图片分辨率,在Excel表格中显示为"图片分辨率",必传且不可调整
+    @Excel(name = "图片分辨率")
+    private String imgres;
+
+    // 摄像头状态,在Excel表格中显示为"摄像头硬件状态",必传且不可为空
+    // 取值含义:0 - 正常,1 - 异常
+    @Excel(name = "摄像头硬件状态")
+    private String usb_sta;
+
+    // 雨控,在Excel表格中显示为"雨控",必传且不可为空
+    // 取值含义:0 - 正常,1 - 保护
+    @Excel(name = "雨控")
+    private String rps;
+
+    // 收集时间,在Excel表格中显示为"收集时间",必传且不可为空,格式如 ["8-10","14-16"]
+    @Excel(name = "收集时间")
+    private String coll_time;
+
+    // 保温仓设定温度(℃),在Excel表格中显示为"保温仓设定温度",必传且不可为空
+    @Excel(name = "保温仓设定温度")
+    private String set_temp;
+
+    // 滴液时间(秒),在Excel表格中显示为"滴液时间",必传且不可为空
+    @Excel(name = "滴液时间")
+    private String shake_sec;
+
+    // 定位状态,在Excel表格中显示为"定位状态",必传且不可为空
+    // 取值含义:0 - 失败,1 - GPS定位,2 - 基站定位
+    @Excel(name = "定位状态")
+    private String gps;
+
+    // 设备开关状态,在Excel表格中显示为"设备开关状态",必传且不可为空
+    // 取值含义:0 - 关机, 1 - 开机
+    @Excel(name = "设备开关状态")
+    private String ds;
+
+    // 环境湿度,在Excel表格中显示为"环境湿度",必传且不可为空
+    @Excel(name = "环境湿度")
+    private String ah;
+
+    // 环境温度,在Excel表格中显示为"环境温度",必传且不可为空
+    @Excel(name = "环境温度")
+    private String at;
+
+    // 设备唯一编号(IMEI),在Excel表格中显示为"设备IMEI",必传且不可为空
+    @Excel(name = "设备IMEI")
+    private String imei;
+
+    // 设备物联网卡号(ICCID),在Excel表格中显示为"设备ICCID",必传且不可为空
+    @Excel(name = "设备ICCID")
+    private String iccid;
+
+    // 时间戳,在Excel表格中显示为"时间戳",非必传
+    @Excel(name = "时间戳")
+    private String stamp; // 格式如:"2021-11-25 11:22:30"
+
+    // 经度,在Excel表格中显示为"经度",必传
+    @Excel(name = "经度")
+    private String lng;
+
+    // 纬度,在Excel表格中显示为"纬度",必传
+    @Excel(name = "纬度")
+    private String lat;
+
+    // 重启次数,在Excel表格中显示为"重启次数",必传
+    @Excel(name = "重启次数")
+    private String rcnt;
+
+    // 功率,单位:mA,在Excel表格中显示为"功率",必传
+    @Excel(name = "功率")
+    private String current;
+
+    // 电压,在Excel表格中显示为"电压",必传且不可为空
+    @Excel(name = "电压")
+    private String vbat;
+
+    // 数据上传时间间隔,在Excel表格中显示为"数据上传时间间隔",必传且不可为空
+    @Excel(name = "数据上传时间间隔")
+    private String dat_f;
+
+    // 信号强度,在Excel表格中显示为"信号强度",必传且不可为空
+    @Excel(name = "信号强度")
+    private String csq;
+
+    public void setSet_temp(String set_temp) {
+        this.set_temp = set_temp;
+    }
+
+    // 摄像头状态转换
+    public void setWork_sta(String workSta) {
+        this.work_sta = "0".equals(workSta) ? "待机" :
+                "1".equals(workSta) ? "收集" :
+                        "2".equals(workSta) ? "培养" :
+                                "3".equals(workSta) ? "拍照" :
+                                        "未知";
+    }
+
+    // 运行状态转换,由于与摄像头状态含义相同,可复用上面的逻辑
+    public void setRun_sta(String runSta) {
+        this.run_sta = "0".equals(runSta) ? "待机" :
+                "1".equals(runSta) ? "收集" :
+                        "2".equals(runSta) ? "培养" :
+                                "3".equals(runSta) ? "拍照" :
+                                        "未知";
+    }
+
+    // 电压状态转换
+    public void setBatStatus(String batStatus) {
+        this.batStatus = "0".equals(batStatus) ? "正常" : "欠压";
+    }
+
+    // 风机开关转换
+    public void setWind_sw(String windSw) {
+        this.wind_sw = "0".equals(windSw) ? "关闭" : "开启";
+    }
+
+    // 制冷机开关转换,复用风机开关的逻辑
+    public void setCold_sw(String coldSw) {
+        this.cold_sw = "0".equals(coldSw) ? "关闭" : "开启";
+    }
+
+    public void setUsb_sta(String usb_sta) {
+        this.usb_sta = "0".equals(usb_sta) ? "正常" : "异常";
+    }
+
+    // 雨控转换
+    public void setRps(String rps) {
+        this.rps = "0".equals(rps) ? "正常" : "保护";
+    }
+
+    // 定位状态转换
+    public void setGps(String gps) {
+        this.gps = "0".equals(gps) ? "失败" :
+                "1".equals(gps) ? "GPS定位" :
+                        "2".equals(gps) ? "基站定位" :
+                                "未知";
+    }
+
+    // 设备开关状态转换
+    public void setDs(String ds) {
+        this.ds = "0".equals(ds) ? "关机" : "开机";
+    }
+
+    // 设备开关状态转换
+    public void setDtype(String dtype) {
+        this.dtype = "孢子仪";
+    }
+}

+ 92 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotBzyrecogResVo.java

@@ -0,0 +1,92 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.domain;
+
+import com.yunfeiyun.agmp.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 测报灯图片识别对象 IotCbdrecog
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotBzyrecogResVo
+{
+    private static final long serialVersionUID = 1L;
+
+    /**  */
+    private String id;
+
+    /** 图片识别业务标识 */
+    @Excel(name = "图片识别业务标识")
+    private String bzyrecogBid;
+
+    /** 客户id */
+    @Excel(name = "客户id")
+    private String cId;
+
+    /** 图片基础业务标识 */
+    @Excel(name = "图片基础业务标识")
+    private String bzyimgBid;
+
+    /** 识别类型 */
+    @Excel(name = "识别类型")
+    private String bzyrecogType;
+
+    /** 识别图片地址 */
+    @Excel(name = "识别图片地址")
+    private String bzyrecogAddr;
+
+    /** 手动标记图片地址 */
+    @Excel(name = "手动标记图片地址")
+    private String bzyrecogManualaddr;
+
+
+    /** 害虫识别结果 */
+    @Excel(name = "害虫识别结果")
+    private String bzyrecogResult;
+
+    /** 标记类型 */
+    @Excel(name = "标记类型")
+    private String bzyrecogMarktype;
+
+    /** 手动标记结果 */
+    @Excel(name = "手动标记结果")
+    private String bzyrecogManualmark;
+
+    /** 机器标注结果 */
+    @Excel(name = "机器标注结果")
+    private String bzyrecogMachinemark;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    private String bzyrecogCreator;
+
+    /** 修改人 */
+    @Excel(name = "修改人")
+    private String bzyrecogModifier;
+
+    /** 修改时间 */
+    @Excel(name = "修改时间")
+    private String bzyrecogModifieddate;
+
+    /** 创建时间 */
+    @Excel(name = "创建时间")
+    private String bzyrecogCreatedDate;
+
+    /** 删除状态 */
+    @Excel(name = "删除状态")
+    private String bzyrecogDelstatus;
+
+    /** 原图地址 */
+    @Excel(name = "原图地址")
+    private String bzyimgAddr;
+
+    /** 总数 */
+    @Excel(name = "总数")
+    private Long bzyimgPestnum;
+
+    /** 识别数 */
+    @Excel(name = "识别数")
+    private Long bzyimgRecognum;
+}

+ 49 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotSporeResVo.java

@@ -0,0 +1,49 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.domain;
+
+import com.yunfeiyun.agmp.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 虫情识别信息对象 IotPestrecog
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotSporeResVo
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 害虫业务标识 */
+    @Excel(name = "害虫业务标识")
+    private String sporeBusid;
+
+    /** 害虫业务标识 */
+    @Excel(name = "害虫业务标识")
+    private String sporeBid;
+
+    /** 害虫名称 */
+    @Excel(name = "害虫名称")
+    private String sporeName;
+
+    /** 害虫数量 */
+    @Excel(name = "害虫数量")
+    private Long sporerecogNum;
+
+    /** 孢子病害描述 */
+    @Excel(name = "孢子病害描述")
+    private String calamRemark;
+
+    /** 孢子病害例图 */
+    @Excel(name = "孢子病害例图")
+    private String calarmCloudresurl;
+
+    /** 孢子病害防治措施 */
+    @Excel(name = "孢子病害防治措施")
+    private String calamCounterMeasures;
+
+    /** 类型  1孢子 2病害 */
+    private String sporeType;
+
+
+}

+ 129 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotSporerecogResVo.java

@@ -0,0 +1,129 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.domain;
+
+import com.yunfeiyun.agmp.common.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 虫情识别信息对象 IotPestrecog
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotSporerecogResVo
+{
+    private static final long serialVersionUID = 1L;
+
+    /**  */
+    private String id;
+
+    /** 虫情识别信息业务标识 */
+    @Excel(name = "虫情识别信息业务标识")
+    private String sporerecogBid;
+
+    /** 客户id */
+    @Excel(name = "客户id")
+    private String cId;
+
+    /** 设备业务标识 */
+    @Excel(name = "设备业务标识")
+    private String devBid;
+
+    /** 设备名称 */
+    @Excel(name = "设备名称")
+    private String devName;
+
+    /** 设备ID */
+    @Excel(name = "设备ID")
+    private String devCode;
+
+    /** 设备类型标识 */
+    @Excel(name = "设备类型标识")
+    private String devtypeBid;
+
+    /** 温度 */
+    @Excel(name = "温度")
+    private BigDecimal sporerecogAt;
+
+    /** 湿度 */
+    @Excel(name = "湿度")
+    private BigDecimal sporerecogAh;
+
+    /** 经度 */
+    @Excel(name = "经度")
+    private BigDecimal sporerecogLng;
+
+    /** 纬度 */
+    @Excel(name = "纬度")
+    private BigDecimal sporerecogLat;
+
+    /** 省 */
+    @Excel(name = "省")
+    private String sporerecogProvince;
+
+    /** 市 */
+    @Excel(name = "市")
+    private String sporerecogCity;
+
+    /** 县 */
+    @Excel(name = "县")
+    private String sporerecogDistrict;
+
+    /** 害虫业务标识 */
+    @Excel(name = "害虫业务标识")
+    private String sporeBusid;
+
+    /** 害虫id */
+    @Excel(name = "害虫id")
+    private String sporeId;
+
+    /** 害虫名称 */
+    @Excel(name = "害虫名称")
+    private String sporeName;
+
+    /** 害虫数量 */
+    @Excel(name = "害虫数量")
+    private Long sporerecogNum;
+
+    /** 创建时间 */
+    @Excel(name = "创建时间")
+    private String sporerecogCreatedDate;
+
+    /** 识别图片地址 */
+    @Excel(name = "识别图片地址")
+    private String cbdrecogAddr;
+
+    /** 手动标记图片地址 */
+    @Excel(name = "手动标记图片地址")
+    private String cbdrecogManualaddr;
+
+    /** 标记类型 */
+    @Excel(name = "标记类型")
+    private String cbdrecogMarktype;
+
+    /** 手动标记结果 */
+    @Excel(name = "手动标记结果")
+    private String cbdrecogManualmark;
+
+    /** 机器标注结果 */
+    @Excel(name = "机器标注结果")
+    private String cbdrecogMachinemark;
+
+    /** 绑定的地块 */
+    @Excel(name = "绑定的地块")
+    private String blockNames;
+
+    /** 孢子病害描述 */
+    @Excel(name = "孢子病害描述")
+    private String calamRemark;
+
+    /** 孢子病害例图 */
+    @Excel(name = "孢子病害例图")
+    private String calarmCloudresurl;
+
+    /** 孢子病害防治措施 */
+    @Excel(name = "孢子病害防治措施")
+    private String calamCounterMeasures;
+}

+ 14 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/domain/IotYfBzyPolylineResVo.java

@@ -0,0 +1,14 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.domain;
+
+import lombok.Data;
+
+/**
+ * 杀虫灯折线图数据
+ */
+@Data
+public class IotYfBzyPolylineResVo {
+    private String ah;
+    private String at;
+    private String pre_temp;
+    private String time;
+}

+ 7 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotBzyService.java

@@ -0,0 +1,7 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service;
+
+import com.yunfeiyun.agmp.iotm.device.common.domin.DeviceRefreshDto;
+
+public interface IIotBzyService {
+    public void refresh(DeviceRefreshDto reqVo);
+}

+ 19 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotBzyimgService.java

@@ -0,0 +1,19 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service;
+
+
+/**
+ * 测报灯识别数据Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotBzyimgService
+{
+    /**
+     * 删除
+     *
+     * @param ids ids
+     */
+    public int remove(String[] ids);
+
+}

+ 41 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotBzyrecogService.java

@@ -0,0 +1,41 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyrecog;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotBzydataReqVo;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotYfBzyPolylineResVo;
+
+import java.util.List;
+
+/**
+ * 测报灯识别数据Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotBzyrecogService
+{
+    /**
+     * 人工修正提交
+     *
+     * @param iotBzyrecog 测报灯识别数据
+     */
+    public int artificialUpdate(IotBzyrecog iotBzyrecog);
+
+    /**
+     * 人工修正重置
+     *
+     * @param iotBzyrecog 测报灯识别数据
+     */
+    public int artificialReset(IotBzyrecog iotBzyrecog);
+
+    public List<IotYfBzyPolylineResVo> polyline(IotBzydataReqVo reqVo);
+
+
+    /**
+     * 提交 人工病害识别结果
+     *
+     * @param iotBzyrecog
+     */
+    public int diseaseUpdate(IotBzyrecog iotBzyrecog);
+}

+ 70 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/IIotSporeService.java

@@ -0,0 +1,70 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotSpore;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotSporeResVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 害虫信息Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotSporeService
+{
+    /**
+     * 查询害虫信息
+     *
+     * @param pestBid 害虫信息主键
+     * @return 害虫信息
+     */
+    public IotSpore selectIotSporeByPestBid(String pestBid);
+    public IotSpore selectIotSporeByPestId(String pestId);
+    /**
+     * 查询害虫信息列表
+     *
+     * @param iotPest 害虫信息
+     * @return 害虫信息集合
+     */
+    public List<IotSpore> selectIotSporeList(IotSpore iotPest);
+    public List<IotSporeResVo> selectIotSporeList1(IotSpore iotSpore);
+
+    public Map<String, IotSpore> selectIotSporeMapAllInfo();
+    public Map<String, String> selectIotSporeMapAll();
+
+
+    /**
+     * 新增害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int insertIotSpore(IotSpore iotPest);
+
+    /**
+     * 修改害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int updateIotSpore(IotSpore iotPest);
+
+    /**
+     * 批量删除害虫信息
+     *
+     * @param ids 需要删除的害虫信息主键集合
+     * @return 结果
+     */
+    public int deleteIotSporeByIds(Long[] ids);
+
+    /**
+     * 删除害虫信息信息
+     *
+     * @param id 害虫信息主键
+     * @return 结果
+     */
+    public int deleteIotSporeById(Long id);
+}

+ 56 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotBzyServiceImpl.java

@@ -0,0 +1,56 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service.impl;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.common.utils.JSONUtils;
+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.model.cmd.CmdGroupModel;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyService;
+import com.yunfeiyun.agmp.iotm.device.common.domin.DeviceRefreshDto;
+import com.yunfeiyun.agmp.iotm.device.common.service.impl.IotDeviceBaseServiceImpl;
+import com.yunfeiyun.agmp.iotm.web.service.IIotCmdtaskService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceconfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Service(value = ServiceNameConst.SERVICE_YF_BZY)
+public class IotBzyServiceImpl extends IotDeviceBaseServiceImpl implements IIotBzyService {
+    @Resource
+    private IIotDeviceconfigService iIotDeviceconfigService;
+
+    @Autowired
+    private IIotCmdtaskService iIotCmdtaskService;
+
+    @Override
+    public void refresh(DeviceRefreshDto reqVo) {
+        IotDevice iotDevice = reqVo.getIotDevice();
+        String devBid = iotDevice.getDevBid();
+
+        log.info("创建【“刷新”指令集任务】,设备类型:CBD");
+        JSONObject payload = new JSONObject();
+        payload.put("cmd", "read");
+        payload.put("ext", "data");
+        IotDeviceconfig iotDeviceconfig = new IotDeviceconfig();
+        iotDeviceconfig.setTid(iotDevice.getTid());
+        iotDeviceconfig.setDevBid(devBid);
+        iotDeviceconfig.setDevcfgContext(JSONUtils.toJSONString(payload));
+
+        CmdGroupModel cmdGroupModel = iIotDeviceconfigService.createRefreshCmd(iotDeviceconfig);
+
+        // 构建日志需要用的内容
+        cmdGroupModel.setRequestId(IdUtils.fastUUID());
+        cmdGroupModel.setDevCode(iotDevice.getDevCode());
+        cmdGroupModel.setCtBiztype("3");
+        cmdGroupModel.setCtDevtype(iotDevice.getDevtypeBid());
+        cmdGroupModel.setCtBiztitle(iotDevice.getDevtypeName() + ":" + iotDevice.getDevCode());
+        //cmdGroupModel.setCtParam(cbdDeviceConfigurationTranslator.logTakeRefresh(iotDevice.getDevBid()));
+        cmdGroupModel.setCtParam("设备id:"+devBid);
+        iIotCmdtaskService.handInternalCmd(cmdGroupModel);
+    }
+}

+ 71 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotBzyimgServiceImpl.java

@@ -0,0 +1,71 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service.impl;
+
+import com.mongodb.client.result.UpdateResult;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyimg;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyrecog;
+import com.yunfeiyun.agmp.iot.common.domain.IotBzyspore;
+import com.yunfeiyun.agmp.iot.common.domain.IotSporerecog;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyimgService;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotSporeService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import org.springframework.beans.factory.annotation.Autowired;
+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.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * 孢子仪识别数据Service业务层处理
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Service
+public class IotBzyimgServiceImpl implements IIotBzyimgService {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Resource
+    private IIotSporeService iotPestService;
+    @Resource
+    private IIotDeviceService iotDeviceService;
+
+    @Transactional
+    @Override
+    public int remove(String[] ids) {
+        List<String> list = Arrays.asList(ids);
+        Criteria criteria = new Criteria();
+        criteria.and("bzyimgBid").in(list);
+        Query query = new Query(criteria);
+        Update update = new Update().set("bzyimgDelstatus", "1");
+        Update update2 = new Update().set("bzyrecogDelstatus", "1");
+
+        List<IotBzyrecog> iotCbdrecogs = mongoTemplate.find(query, IotBzyrecog.class, "IotBzyrecog");
+        List<String> bzyrecogBids = new ArrayList<>();
+        for (IotBzyrecog iotCbdrecog : iotCbdrecogs) {
+            bzyrecogBids.add(iotCbdrecog.getBzyrecogBid());
+        }
+        Query query2 = new Query(Criteria.where("bzyrecogBid").in(bzyrecogBids));
+        List<IotBzyspore> iotCbdpests = mongoTemplate.find(query2, IotBzyspore.class, "IotBzyspore");
+        List<String> pestrecogBids = new ArrayList<>();
+        for (IotBzyspore iotCbdpest : iotCbdpests) {
+            pestrecogBids.add(iotCbdpest.getSporerecogBid());
+        }
+        Query query3 = new Query(Criteria.where("sporerecogBid").in(pestrecogBids));
+
+        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, IotBzyimg.class, "IotBzyimg");
+        mongoTemplate.updateMulti(query, update2, IotBzyrecog.class, "IotBzyrecog");
+        mongoTemplate.remove(query2, IotBzyspore.class, "IotBzyspore");
+        mongoTemplate.remove(query3, IotSporerecog.class, "IotSporerecog");
+
+        return (int) updateResult.getModifiedCount();
+    }
+}

+ 530 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotBzyrecogServiceImpl.java

@@ -0,0 +1,530 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service.impl;
+
+import cn.hutool.core.codec.Base64;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.mongodb.client.result.UpdateResult;
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+import com.yunfeiyun.agmp.common.constant.ResConstants;
+import com.yunfeiyun.agmp.common.exception.BizException;
+import com.yunfeiyun.agmp.common.framework.oss.cloud.OSSFactory;
+import com.yunfeiyun.agmp.common.utils.DateUtils;
+import com.yunfeiyun.agmp.common.utils.SecurityUtils;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.constant.IotErrorCode;
+import com.yunfeiyun.agmp.iot.common.domain.*;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotBzydataReqVo;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iot.common.util.tmn.CustomerIdUtil;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotYfBzyPolylineResVo;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotBzyrecogService;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotSporeService;
+import com.yunfeiyun.agmp.iotm.util.MongoUtil;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.*;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * 测报灯识别数据Service业务层处理
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Service
+@Slf4j
+public class IotBzyrecogServiceImpl implements IIotBzyrecogService {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Resource
+    private IIotSporeService iotPestService;
+    @Resource
+    private IIotDeviceService iotDeviceService;
+
+    @Resource
+    private MongoService mongoService;
+
+    @Value("${iot.warnVer:2}")
+    private String warnVer;
+
+    @Transactional
+    @Override
+    public int artificialUpdate(IotBzyrecog iotCbdrecog) {
+        Criteria cri = Criteria.where("bzyimgBid").is(iotCbdrecog.getBzyimgBid());
+        Query query2 = new Query(cri);
+        IotBzyimg iotCbdimg = mongoTemplate.findOne(query2, IotBzyimg.class, "IotBzyimg");
+        if (iotCbdimg == null) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), iotCbdrecog.getBzyimgBid() + "数据不存在");
+        }
+        IotBzyrecog iotCbdrecog1 = mongoTemplate.findOne(new Query(cri),
+                IotBzyrecog.class, "IotBzyrecog");
+        if (iotCbdrecog1 == null) {
+            //如果未查到,新增一条
+            iotCbdrecog1 = new IotBzyrecog();
+            iotCbdrecog1.setCId(iotCbdimg.getCId());
+            iotCbdrecog1.setBzyrecogBid(iotCbdrecog1.getUUId());
+            iotCbdrecog1.setBzyimgBid(iotCbdimg.getBzyimgBid());
+            iotCbdrecog1.setBzyrecogType("1");
+            iotCbdrecog1.setBzyrecogAddr("");
+            iotCbdrecog1.setBzyrecogManualaddr("");
+            iotCbdrecog1.setBzyrecogManualmark(iotCbdrecog.getBzyrecogManualmark());
+            iotCbdrecog1.setBzyrecogResult(iotCbdrecog.getBzyrecogResult());
+            iotCbdrecog1.setBzyrecogMarktype(iotCbdrecog.getBzyrecogMarktype());
+            iotCbdrecog1.setBzyrecogMachinemark("");
+            iotCbdrecog1.setBzyrecogCreator(SecurityUtils.getUserId());
+            iotCbdrecog1.setBzyrecogModifier(SecurityUtils.getUserId());
+            iotCbdrecog1.setBzyrecogCreatedDate(iotCbdimg.getBzyimgCreatedDate());
+            iotCbdrecog1.setBzyrecogModifieddate(iotCbdimg.getBzyimgModifieddate());
+            iotCbdrecog1.setBzyrecogDelstatus("0");
+
+            mongoTemplate.insert(iotCbdrecog1, "IotBzyrecog");
+        }
+
+        Query query = new Query(Criteria.where("_id").is(iotCbdrecog1.getId()));
+        Update update = new Update();
+        update.set("bzyrecogMarktype", iotCbdrecog.getBzyrecogMarktype());
+        String bzyrecogManualmark = iotCbdrecog.getBzyrecogManualmark();
+        update.set("bzyrecogManualmark", bzyrecogManualmark);
+
+        String recogBid = iotCbdrecog1.getId();
+        JSONArray recogArray = JSONArray.parseArray(bzyrecogManualmark);
+
+        List<JSONObject> points = new ArrayList<>();
+        // 虫子数量
+        long recordNum = 0;
+        List<JSONObject> points2 = new ArrayList<>();
+        if (recogArray != null) {
+            for (Object o : JSONArray.parseArray(bzyrecogManualmark)) {
+                points.add((JSONObject) o);
+            }
+        }
+
+        //害虫信息
+        List<IotSpore> iotPests = iotPestService.selectIotSporeList(null);
+        Map<String, String> pestMap = iotPests.stream().collect(Collectors.toMap(IotSpore::getSporeId, IotSpore::getSporeBid));
+        //设备信息
+        IotDevice resVo = iotDeviceService.selectIotDeviceByDevBid(iotCbdimg.getDevBid());
+        //统计害虫数量
+        Map<String, Integer> pest = new HashMap<>();
+        recordNum = points.size();
+        //IotSporerecog存储
+        for (JSONObject point : points) {
+            points2.add(point);
+            //判断人工修正的是否有新的害虫名字,有的新的新增,并存储
+            for (String s : point.keySet()) {
+                if (pestMap.get(s) == null) {
+                    IotSpore iotPest = new IotSpore();
+                    iotPest.setSporeBid(iotPest.getUUId());
+                    iotPest.setSporeName(s);
+                    iotPest.setSporeId(iotPest.getSporeBid());
+                    iotPest.setSporeCreator(SecurityUtils.getUserId());
+                    iotPest.setSporeCreatedDate(DateUtils.dateTimeNow());
+                    iotPest.setSporeDelstatus("0");
+                    iotPest.setSporeInsertType("2");
+                    iotPestService.insertIotSpore(iotPest);
+                    pestMap.put(iotPest.getSporeId(), iotPest.getSporeBid());
+                    JSONObject point2 = new JSONObject();
+                    point2.put(iotPest.getSporeId(), point.get(s));
+                    points2.add(point2);
+                    points2.remove(point);
+                    pest.put(iotPest.getSporeId(), pest.get(s) == null ? 1 : pest.get(s) + 1);
+                } else {
+                    pest.put(s, pest.get(s) == null ? 1 : pest.get(s) + 1);
+                }
+            }
+        }
+        String bzyrecogManualBase64 = iotCbdrecog.getBzyrecogManualBase64();
+        if (StringUtils.isNotEmpty(bzyrecogManualBase64)) {
+            String imgUrl = getSporeRecogImgOssUrl(bzyrecogManualBase64, recogBid);
+            update.set("bzyrecogManualaddr", imgUrl);
+        }
+
+        //IotSporerecog进行存储
+        List<IotSporerecog> iotPestrecogs = new ArrayList<>();
+        List<IotBzyspore> iotCbdpests = new ArrayList<>();
+        for (String s : pest.keySet()) {
+            IotSporerecog iotPestrecog = new IotSporerecog();
+            iotPestrecog.setCId(iotCbdimg.getCId());
+            iotPestrecog.setDevBid(iotCbdimg.getDevBid());
+            iotPestrecog.setSporeBusid(pestMap.get(s));
+            iotPestrecog.setDevtypeBid(resVo.getDevtypeBid());
+            iotPestrecog.setSporerecogBid(iotPestrecog.getUUId());
+            iotPestrecog.setSporerecogMarktype(iotCbdrecog.getBzyrecogMarktype());
+            iotPestrecog.setSporerecogNum(pest.get(s).longValue());
+            iotPestrecog.setSporerecogCreatedDate(DateUtils.dateTimeNow());
+            iotPestrecogs.add(iotPestrecog);
+
+            IotBzyspore iotCbdpest = new IotBzyspore();
+            iotCbdpest.setCId(iotCbdimg.getCId());
+            iotCbdpest.setBzysporeBid(iotCbdpest.getUUId());
+            iotCbdpest.setSporerecogBid(iotPestrecog.getSporerecogBid());
+            iotCbdpest.setBzyrecogBid(iotCbdrecog1.getBzyrecogBid());
+            iotCbdpests.add(iotCbdpest);
+        }
+
+        //删除过去的人工修正的数据
+        List<IotBzyspore> cbdpests = mongoTemplate.find(new Query(Criteria.where("bzyrecogBid").is(iotCbdrecog1.getBzyrecogBid())), IotBzyspore.class, "IotBzyspore");
+        List<String> pestrecogBids = new ArrayList<>();
+        for (IotBzyspore cbdpest : cbdpests) {
+            pestrecogBids.add(cbdpest.getSporerecogBid());
+        }
+
+        Criteria criteria = new Criteria();
+        criteria.and("sporerecogBid").in(pestrecogBids);
+        criteria.and("sporerecogMarktype").is("0");
+        Query query1 = new Query(criteria);
+        //删除该图片过去的人工修正的虫情识别数据
+        List<IotSporerecog> iotPestrecogs1 = mongoTemplate.findAllAndRemove(query1, IotSporerecog.class, "IotSporerecog");
+        List<String> pestrecogBids2 = new ArrayList<>();
+        for (IotSporerecog iotPestrecog : iotPestrecogs1) {
+            pestrecogBids2.add(iotPestrecog.getSporerecogBid());
+        }
+        //删除该图片过去的测报灯虫情信息关联对象数据
+        mongoTemplate.remove(new Query(Criteria.where("sporerecogBid").in(pestrecogBids2)), IotBzyspore.class, "IotBzyspore");
+
+        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, IotBzyrecog.class, "IotBzyrecog");
+        mongoTemplate.insert(iotPestrecogs, "IotSporerecog");
+        mongoTemplate.insert(iotCbdpests, "IotBzyspore");
+        // 图片标记数量
+        // 图片标记数量为 0
+        Query queryPic = new Query(Criteria.where("bzyimgBid").is(iotCbdrecog.getBzyimgBid()));
+        Update updatePic = new Update();
+        updatePic.set("bzyimgRecognum", recordNum);
+        updatePic.set("bzyimgModifieddate", DateUtils.dateTimeNow());
+        UpdateResult updateIotBzyimgResult = mongoTemplate.updateFirst(queryPic, updatePic, IotBzyimg.class, "IotBzyimg");
+
+        return (int) updateResult.getModifiedCount();
+    }
+
+    @Override
+    public int artificialReset(IotBzyrecog iotCbdrecog) {
+        Criteria cri = Criteria.where("bzyimgBid").is(iotCbdrecog.getBzyimgBid());
+        IotBzyrecog iotCbdrecog1 = mongoTemplate.findOne(new Query(cri),
+                IotBzyrecog.class, "IotBzyrecog");
+        if (iotCbdrecog1 == null) {
+            throw new BizException(ErrorCode.INVALID_PARAMETER.getCode(), "该图片未有识别记录");
+        }
+
+        Query query = new Query(Criteria.where("_id").is(iotCbdrecog1.getId()));
+        Update update = new Update();
+        update.set("bzyrecogMarktype", iotCbdrecog.getBzyrecogMarktype());
+        update.set("bzyrecogManualmark", null);
+        update.set("bzyrecogDelstatus", "1");
+
+        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, IotBzyrecog.class, "IotBzyrecog");
+
+
+        // 图片标记数量为 0
+        Query queryPic = new Query(Criteria.where("bzyimgBid").is(iotCbdrecog.getBzyimgBid()));
+        Update updatePic = new Update();
+        updatePic.set("bzyimgRecognum", 0);
+        updatePic.set("bzyimgModifieddate", DateUtils.dateTimeNow());
+        UpdateResult updateIotBzyimgResult = mongoTemplate.updateFirst(queryPic, updatePic, IotBzyimg.class, "IotBzyimg");
+        //删除过去的人工修正的数据
+        List<IotBzyspore> cbdpests = mongoTemplate.find(new Query(Criteria.where("bzyrecogBid").is(iotCbdrecog1.getBzyrecogBid())), IotBzyspore.class, "IotBzyspore");
+        List<String> pestrecogBids = new ArrayList<>();
+        for (IotBzyspore cbdpest : cbdpests) {
+            pestrecogBids.add(cbdpest.getSporerecogBid());
+        }
+
+        Criteria criteria = new Criteria();
+        criteria.and("sporerecogBid").in(pestrecogBids);
+        criteria.and("sporerecogMarktype").is("0");
+        Query query1 = new Query(criteria);
+        //删除该图片过去的人工修正的虫情识别数据
+        List<IotSporerecog> iotPestrecogs1 = mongoTemplate.findAllAndRemove(query1, IotSporerecog.class, "IotSporerecog");
+        List<String> pestrecogBids2 = new ArrayList<>();
+        for (IotSporerecog iotPestrecog : iotPestrecogs1) {
+            pestrecogBids2.add(iotPestrecog.getSporerecogBid());
+        }
+        //删除该图片过去的测报灯虫情信息关联对象数据
+        mongoTemplate.remove(new Query(Criteria.where("sporerecogBid").in(pestrecogBids2)), IotBzyspore.class, "IotBzyspore");
+        return (int) updateResult.getModifiedCount();
+    }
+
+    @Override
+    public List<IotYfBzyPolylineResVo> polyline(IotBzydataReqVo reqVo) {
+
+        String devBid = reqVo.getDevBid();
+        if (StringUtils.isEmpty(devBid)) {
+            throw new IotBizException(IotErrorCode.INVALID_DEVICE_ID.getCode(), "设备标识不能为空");
+        }
+        String startTime = reqVo.getStartTime();
+        String endTime = reqVo.getEndTime();
+        String unit = "day";
+        Criteria criteria = new Criteria().and("devBid").is(devBid);
+        //必须设置起止时间
+        if(StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)){
+            //限制 起止时间
+            criteria = criteria.andOperator(
+                    Criteria.where("bzydataCreatedDate").gte(startTime),
+                    Criteria.where("bzydataCreatedDate").lte(endTime)
+            );
+            //选择 数据粒度
+            unit = MongoUtil.getDateTruncUnit(startTime, endTime);
+        }else{
+            throw new IotBizException(IotErrorCode.INVALID_DEVICE_ID.getCode(), "查询时间不能为空");
+        }
+
+        ;
+        /**
+         * $mtch {"devBid": devBid, "$add": [{"bzydataCreatedDate": {"$gte": startDate}}, {"bzydataCreatedDate": {"$lte": endDate}}]}
+         */
+        MatchOperation matchOperation = Aggregation.match(criteria);
+
+        /**
+         * $project
+         *      {
+         *          "ah": "$bzydataContent.ah",
+         *          "time": "$bzydataCreatedDate"
+         *      }
+         */
+        ProjectionOperation projectionOperation = Aggregation.project()
+                .and("bzydataContent.ah").as("ah")
+                .and("bzydataContent.at").as("at")
+                .and("bzydataContent.pre_temp").as("pre_temp")
+                .and("bzydataCreatedDate").as("time");
+        /**
+         * $project
+         *      {
+         *          "at": {$convert: {input: '$at', to: 'double', onError: -99, onNull: -99}},
+         *          "time": {$dateTrunc: {date: {$toDate: '$createDate'}, unit: 'minute'}}
+         *      }
+         */
+
+        ProjectionOperation projectionOperation2 = Aggregation.project()
+                .andExpression("{$convert: {input: '$at', to: 'double', onError: -99, onNull: -99}}").as("at")
+                .andExpression("{$convert: {input: '$ah', to: 'double', onError: -99, onNull: -99}}").as("ah")
+                .andExpression("{$convert: {input: '$pre_temp', to: 'double', onError: -99, onNull: -99}}").as("pre_temp")
+                .andExpression("{$dateTrunc: {date: {$toDate: '$time'}, unit:'" + unit + "'}}").as("time");
+
+        Criteria criteria2 = new Criteria()
+                .and("at").gt(-99)
+                .and("ah").gt(-99)
+                .and("pre_temp").gt(-99);
+        MatchOperation matchOperation2 = Aggregation.match(criteria2);
+
+        /**
+         * {
+         *    "$group" : {
+         *       "_id" : "$createDate", "ah" : { "$avg" : "$ah"}, "at" : { "$avg" : "$at"}, "pre_temp" : { "$avg" : "$pre_temp"}, "cv" : { "$avg" : "$cv"}, "ct" : { "$sum" : "$ct"}
+         *    }
+         * }
+         */
+        GroupOperation groupOperation = Aggregation.group("time")
+                .avg("ah").as("ah")
+                .avg("at").as("at")
+                .avg("pre_temp").as("pre_temp");
+
+        /**
+         * { "$project" : { "ct" : 1, "pre_temp" : { "$trunc" : ["$pre_temp", 3]}, "time" : { "$dateToString" : { "format" : "%Y-%m-%d %H:%M:%S", "date" : "$_id"}}}}
+         */
+        ProjectionOperation projectionOperation3 = Aggregation.project()
+                .andExpression("{$trunc: {'$pre_temp', 1}}").as("pre_temp")
+                .andExpression("{$trunc: {'$ah', 1}}").as("ah")
+                .andExpression("{$trunc: {'$at', 1}}").as("at")
+                .andExpression("{$dateToString: {format: '%Y-%m-%d %H:%M:%S', date: '$_id'}}").as("time");
+
+        /**
+         * { "$sort" : { "time" : 1}}
+         */
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "time");
+
+        Aggregation aggregation = Aggregation.newAggregation(
+                matchOperation,
+                projectionOperation,
+                projectionOperation2,
+                matchOperation2,
+                groupOperation,
+                projectionOperation3,
+                sortOperation
+        );
+        List<IotYfBzyPolylineResVo> iotYfBzyPolylineResVoList = mongoService.aggregate(
+                IotBzydata.class, aggregation, IotYfBzyPolylineResVo.class
+        );
+
+        return iotYfBzyPolylineResVoList;
+    }
+
+    public String getSporeRecogImgOssUrl(String base64, String imgId) {
+        if (base64.contains(",")) {
+            base64 = base64.split(",")[1];
+        }
+        byte[] bytesFile = Base64.decode(base64);
+        return OSSFactory.build().uploadSuffix(bytesFile, "jpg", ResConstants.BizType.BZY_RECOGNITION_MARKERS_AI.getPath(), imgId);
+    }
+
+    @Transactional
+    @Override
+    public int diseaseUpdate(IotBzyrecog iotCbdrecog) {
+        //TODO 改写成病害识别    共用原有的孢子表,通过一个类型字段区分是孢子还是病害 :1、  IotBzyrecog  BzyrecogType 1为孢子,2为病害
+        Criteria cri = Criteria.where("bzyimgBid").is(iotCbdrecog.getBzyimgBid());
+        Query query2 = new Query(cri);
+        IotBzyimg iotCbdimg = mongoTemplate.findOne(query2, IotBzyimg.class, "IotBzyimg");
+        if (iotCbdimg == null) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), iotCbdrecog.getBzyimgBid() + "数据不存在");
+        }
+        IotBzyrecog iotCbdrecog1 = mongoTemplate.findOne(new Query(cri),
+                IotBzyrecog.class, "IotBzyrecog");
+        if (iotCbdrecog1 == null) {
+            //如果未查到,新增一条
+            iotCbdrecog1 = new IotBzyrecog();
+            iotCbdrecog1.setCId(iotCbdimg.getCId());
+            iotCbdrecog1.setBzyrecogBid(iotCbdrecog1.getUUId());
+            iotCbdrecog1.setBzyimgBid(iotCbdimg.getBzyimgBid());
+            iotCbdrecog1.setBzyrecogType("2");
+            iotCbdrecog1.setBzyrecogAddr(iotCbdimg.getBzyimgAddr());
+            iotCbdrecog1.setBzyrecogManualaddr("");
+            iotCbdrecog1.setBzyrecogManualmark(iotCbdrecog.getBzyrecogManualmark());
+            iotCbdrecog1.setBzyrecogResult(iotCbdrecog.getBzyrecogResult());
+            iotCbdrecog1.setBzyrecogMarktype(iotCbdrecog.getBzyrecogMarktype());
+            iotCbdrecog1.setBzyrecogMachinemark("");
+            iotCbdrecog1.setBzyrecogCreator(SecurityUtils.getUserId());
+            iotCbdrecog1.setBzyrecogModifier(SecurityUtils.getUserId());
+            iotCbdrecog1.setBzyrecogCreatedDate(iotCbdimg.getBzyimgCreatedDate());
+            iotCbdrecog1.setBzyrecogModifieddate(iotCbdimg.getBzyimgModifieddate());
+            iotCbdrecog1.setBzyrecogDelstatus("0");
+
+            mongoTemplate.insert(iotCbdrecog1, "IotBzyrecog");
+        }
+
+        Query query = new Query(Criteria.where("_id").is(iotCbdrecog1.getId()));
+        Update update = new Update();
+        update.set("bzyrecogMarktype", iotCbdrecog.getBzyrecogMarktype());
+        String bzyrecogManualmark = iotCbdrecog.getBzyrecogManualmark();
+        update.set("bzyrecogManualmark", bzyrecogManualmark);
+
+        String recogBid = iotCbdrecog1.getId();
+        JSONArray recogArray = JSONArray.parseArray(bzyrecogManualmark);
+
+        List<JSONObject> points = new ArrayList<>();
+        // 统计数量
+        long recordNum = 0;
+        List<JSONObject> points2 = new ArrayList<>();
+        if (recogArray != null) {
+            for (Object o : JSONArray.parseArray(bzyrecogManualmark)) {
+                points.add((JSONObject) o);
+            }
+        }
+
+        //病害信息
+        List<IotSpore> iotPests = iotPestService.selectIotSporeList(null);
+        Map<String, String> pestMap = iotPests.stream().collect(Collectors.toMap(IotSpore::getSporeName, IotSpore::getSporeBid));
+
+        //设备信息
+        IotDevice resVo = iotDeviceService.selectIotDeviceByDevBid(iotCbdimg.getDevBid());
+        //统计病害数量
+        Map<String, Integer> pest = new HashMap<>();
+        recordNum = points.size();
+        //IotSporerecog存储
+        for (JSONObject point : points) {
+            points2.add(point);
+            //判断人工修正的是否有新的病害名字,有的新的新增,并存储
+            for (String s : point.keySet()) {
+                if (pestMap.get(s) == null) {
+
+                    //新增病害
+                    IotSpore iotPest = new IotSpore();
+                    iotPest.setCId(CustomerIdUtil.getCustomerId());
+                    iotPest.setSporeBid(iotPest.getUUId());
+                    iotPest.setSporeName(s);
+                    iotPest.setSporeId(iotPest.getSporeBid());
+                    iotPest.setSporeCreator(SecurityUtils.getUserId());
+                    iotPest.setSporeCreatedDate(DateUtils.dateTimeNow());
+                    iotPest.setSporeDelstatus("0");
+                    iotPest.setSporeInsertType("2");
+                    iotPestService.insertIotSpore(iotPest);
+
+                    pestMap.put(iotPest.getSporeName(), iotPest.getSporeBid());
+                    JSONObject point2 = new JSONObject();
+                    point2.put(iotPest.getSporeId(), point.get(s));
+                    points2.add(point2);
+                    points2.remove(point);
+                    pest.put(iotPest.getSporeName(), pest.get(s) == null ? 1 : pest.get(s) + 1);
+                } else {
+                    pest.put(s, pest.get(s) == null ? 1 : pest.get(s) + 1);
+                }
+            }
+        }
+
+        String bzyrecogManualBase64 = iotCbdrecog.getBzyrecogManualBase64();
+        if (StringUtils.isNotEmpty(bzyrecogManualBase64)) {
+            String imgUrl = getSporeRecogImgOssUrl(bzyrecogManualBase64, recogBid);
+            update.set("bzyrecogManualaddr", imgUrl);
+        }
+
+        //IotSporerecog进行存储
+        List<IotSporerecog> iotPestrecogs = new ArrayList<>();
+        List<IotBzyspore> iotCbdpests = new ArrayList<>();
+        for (String s : pest.keySet()) {
+            IotSporerecog iotPestrecog = new IotSporerecog();
+            iotPestrecog.setCId(iotCbdimg.getCId());
+            iotPestrecog.setDevBid(iotCbdimg.getDevBid());
+            iotPestrecog.setSporeBusid(pestMap.get(s));
+            iotPestrecog.setDevtypeBid(resVo.getDevtypeBid());
+            iotPestrecog.setSporerecogBid(iotPestrecog.getUUId());
+            iotPestrecog.setSporerecogMarktype(iotCbdrecog.getBzyrecogMarktype());
+            iotPestrecog.setSporerecogNum(pest.get(s).longValue());
+            iotPestrecog.setSporerecogCreatedDate(DateUtils.dateTimeNow());
+            iotPestrecogs.add(iotPestrecog);
+
+            IotBzyspore iotCbdpest = new IotBzyspore();
+            iotCbdpest.setCId(iotCbdimg.getCId());
+            iotCbdpest.setBzysporeBid(iotCbdpest.getUUId());
+            iotCbdpest.setSporerecogBid(iotPestrecog.getSporerecogBid());
+            iotCbdpest.setBzyrecogBid(iotCbdrecog1.getBzyrecogBid());
+            iotCbdpests.add(iotCbdpest);
+        }
+
+        //删除过去的人工修正的数据
+        List<IotBzyspore> cbdpests = mongoTemplate.find(new Query(Criteria.where("bzyrecogBid").is(iotCbdrecog1.getBzyrecogBid())), IotBzyspore.class, "IotBzyspore");
+        List<String> pestrecogBids = new ArrayList<>();
+        for (IotBzyspore cbdpest : cbdpests) {
+            pestrecogBids.add(cbdpest.getSporerecogBid());
+        }
+
+        Criteria criteria = new Criteria();
+        criteria.and("sporerecogBid").in(pestrecogBids);
+        criteria.and("sporerecogMarktype").is("0");
+        Query query1 = new Query(criteria);
+        //删除该图片过去的人工修正的虫情识别数据
+        List<IotSporerecog> iotPestrecogs1 = mongoTemplate.findAllAndRemove(query1, IotSporerecog.class, "IotSporerecog");
+        List<String> pestrecogBids2 = new ArrayList<>();
+        for (IotSporerecog iotPestrecog : iotPestrecogs1) {
+            pestrecogBids2.add(iotPestrecog.getSporerecogBid());
+        }
+        //删除该图片过去的测报灯虫情信息关联对象数据
+        mongoTemplate.remove(new Query(Criteria.where("sporerecogBid").in(pestrecogBids2)), IotBzyspore.class, "IotBzyspore");
+
+        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, IotBzyrecog.class, "IotBzyrecog");
+        mongoTemplate.insert(iotPestrecogs, "IotSporerecog");
+        mongoTemplate.insert(iotCbdpests, "IotBzyspore");
+        // 图片标记数量
+        // 图片标记数量为 0
+        Query queryPic = new Query(Criteria.where("bzyimgBid").is(iotCbdrecog.getBzyimgBid()));
+        Update updatePic = new Update();
+        updatePic.set("bzyimgRecognum", recordNum);
+        updatePic.set("bzyimgModifieddate", DateUtils.dateTimeNow());
+        UpdateResult updateIotBzyimgResult = mongoTemplate.updateFirst(queryPic, updatePic, IotBzyimg.class, "IotBzyimg");
+
+        return (int) updateResult.getModifiedCount();
+    }
+}

+ 131 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/bzy/service/impl/IotSporeServiceImpl.java

@@ -0,0 +1,131 @@
+package com.yunfeiyun.agmp.iotm.device.bzy.service.impl;
+
+import com.yunfeiyun.agmp.common.enums.RedisCacheKey;
+import com.yunfeiyun.agmp.common.framework.manager.RedisCacheManager;
+import com.yunfeiyun.agmp.iot.common.domain.IotSpore;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotSporeResVo;
+import com.yunfeiyun.agmp.iotm.device.bzy.service.IIotSporeService;
+import com.yunfeiyun.agmp.iotm.web.mapper.IotSporeMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * 害虫信息Service业务层处理
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Service
+public class IotSporeServiceImpl implements IIotSporeService {
+    @Autowired
+    private IotSporeMapper iotPestMapper;
+    @Resource
+    private RedisCacheManager redisCacheManager;
+
+    /**
+     * 查询害虫信息
+     *
+     * @param pestBid 害虫信息主键
+     * @return 害虫信息
+     */
+    @Override
+    public IotSpore selectIotSporeByPestBid(String pestBid) {
+        return iotPestMapper.selectIotSporeByPestBid(pestBid);
+    }
+
+    @Override
+    public IotSpore selectIotSporeByPestId(String pestId) {
+        return iotPestMapper.selectIotSporeByPestId(pestId);
+    }
+
+    /**
+     * 查询害虫信息列表
+     *
+     * @param iotPest 害虫信息
+     * @return 害虫信息
+     */
+    @Override
+    public List<IotSpore> selectIotSporeList(IotSpore iotPest) {
+        return iotPestMapper.selectIotSporeList(iotPest);
+    }
+
+    @Override
+    public List<IotSporeResVo> selectIotSporeList1(IotSpore iotSpore) {
+        return iotPestMapper.selectIotSporeList1(iotSpore);
+    }
+
+    @Override
+    public Map<String, IotSpore> selectIotSporeMapAllInfo() {
+//        Map<String,String> map = redisCacheManager.getCacheMap(RedisCacheKey.IOT_PEST,"all");
+//        if(map.size()==0){
+//            List<IotSpore> iotPestList = selectIotSporeList(null);
+//            map = iotPestList.stream().collect(Collectors.toMap(IotSpore::getSporeId,IotSpore::getSporeName));
+//            redisCacheManager.setCacheMap(RedisCacheKey.IOT_PEST,"all",map);
+//        }
+
+        List<IotSpore> iotPestList = selectIotSporeList(null);
+        Map<String, IotSpore> map = iotPestList.stream().collect(Collectors.toMap(IotSpore::getSporeBid, obj -> obj, (a, b) -> a));
+        return map;
+    }
+
+    @Override
+    public Map<String, String> selectIotSporeMapAll() {
+        Map<String, String> map = redisCacheManager.getCacheMap(RedisCacheKey.IOT_SPORE, "all");
+        if (map.size() == 0) {
+            List<IotSpore> iotPestList = selectIotSporeList(null);
+            map = iotPestList.stream().collect(Collectors.toMap(IotSpore::getSporeId, IotSpore::getSporeName));
+            redisCacheManager.setCacheMap(RedisCacheKey.IOT_SPORE, "all", map);
+        }
+        return map;
+    }
+
+    /**
+     * 新增害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    @Override
+    public int insertIotSpore(IotSpore iotPest) {
+        return iotPestMapper.insertIotSpore(iotPest);
+    }
+
+    /**
+     * 修改害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    @Override
+    public int updateIotSpore(IotSpore iotPest) {
+        return iotPestMapper.updateIotSpore(iotPest);
+    }
+
+    /**
+     * 批量删除害虫信息
+     *
+     * @param ids 需要删除的害虫信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIotSporeByIds(Long[] ids) {
+        return iotPestMapper.deleteIotSporeByIds(ids);
+    }
+
+    /**
+     * 删除害虫信息信息
+     *
+     * @param id 害虫信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIotSporeById(Long id) {
+        return iotPestMapper.deleteIotSporeById(id);
+    }
+}

+ 66 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/mapper/IotSporeMapper.java

@@ -0,0 +1,66 @@
+package com.yunfeiyun.agmp.iotm.web.mapper;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotSpore;
+import com.yunfeiyun.agmp.iotm.device.bzy.domain.IotSporeResVo;
+
+import java.util.List;
+
+/**
+ * 害虫信息Mapper接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IotSporeMapper {
+    /**
+     * 查询害虫信息
+     *
+     * @param pestBid 害虫信息主键
+     * @return 害虫信息
+     */
+    public IotSpore selectIotSporeByPestBid(String pestBid);
+
+    public IotSpore selectIotSporeByPestId(String pestId);
+
+    /**
+     * 查询害虫信息列表
+     *
+     * @param iotPest 害虫信息
+     * @return 害虫信息集合
+     */
+    public List<IotSpore> selectIotSporeList(IotSpore iotPest);
+    public List<IotSporeResVo> selectIotSporeList1(IotSpore iotSpore);
+
+    /**
+     * 新增害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int insertIotSpore(IotSpore iotPest);
+
+    /**
+     * 修改害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int updateIotSpore(IotSpore iotPest);
+
+    /**
+     * 删除害虫信息
+     *
+     * @param id 害虫信息主键
+     * @return 结果
+     */
+    public int deleteIotSporeById(Long id);
+
+    /**
+     * 批量删除害虫信息
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteIotSporeByIds(Long[] ids);
+}