Procházet zdrojové kódy

阶段提交:测报灯的代码初步提交

yf_zn před 1 rokem
rodič
revize
f2c85db7c2
22 změnil soubory, kde provedl 2787 přidání a 2 odebrání
  1. 122 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotCbdimgController.java
  2. 112 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotCbdrecogController.java
  3. 153 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotDeviceCbdController.java
  4. 10 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdimgGroupDateListResVo.java
  5. 27 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdimgSumInfoResVo.java
  6. 137 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdrecogResVo.java
  7. 76 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotPestRecogPeriodReqVo.java
  8. 45 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotCbdimgService.java
  9. 40 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotCbdrecogService.java
  10. 89 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotPestService.java
  11. 27 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IotCbdService.java
  12. 75 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IotPestMapper.java
  13. 179 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotCbdServiceImpl.java
  14. 329 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotCbdimgServiceImpl.java
  15. 505 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotCbdrecogServiceImpl.java
  16. 172 0
      src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/impl/IotPestServiceImpl.java
  17. 69 0
      src/main/java/com/yunfeiyun/agmp/iotm/web/mapper/IotDeviceconfigMapper.java
  18. 96 0
      src/main/java/com/yunfeiyun/agmp/iotm/web/service/IIotDeviceconfigService.java
  19. 6 2
      src/main/java/com/yunfeiyun/agmp/iotm/web/service/impl/IotCmdtaskServiceImpl.java
  20. 255 0
      src/main/java/com/yunfeiyun/agmp/iotm/web/service/impl/IotDeviceconfigServiceImpl.java
  21. 124 0
      src/main/resources/mapper/IotDeviceconfigMapper.xml
  22. 139 0
      src/main/resources/mapper/IotPestMapper.xml

+ 122 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotCbdimgController.java

@@ -0,0 +1,122 @@
+package com.yunfeiyun.agmp.iotm.device.pest.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yunfeiyun.agmp.common.annotation.Log;
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+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.enums.BusinessType;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdimg;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgGroupDateListResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgSumInfoResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestRecogPeriodReqVo;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotCbdimgService;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestService;
+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.*;
+
+/**
+ * 虫情识别信息表Controller
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@RestController
+@RequestMapping("/iot/cbdimg")
+public class IotCbdimgController extends BaseController {
+    @Autowired
+    private IIotPestService iotPestService;
+    @Autowired
+    private MongoService mongoService;
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Autowired
+    private IIotCbdimgService iotCbdimgService;
+
+
+    /**
+     * 识别数据列表
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdimg:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(IotPestRecogPeriodReqVo reqVo) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("devBid", reqVo.getDevBid());
+        map.put("cbdimgDelstatus", "0");
+        timePackage(map, "cbdimgCreatedDate", reqVo.getStartTime(), reqVo.getEndTime());
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        IPage listPage = mongoService.findListPage(IotCbdimg.class, map, pageDomain);
+        return getDataTable(listPage);
+    }
+
+    /**
+     * 识别数据列表
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdimg:sum:info')")
+    @GetMapping("/sum/info")
+    public AjaxResult sumInfo(IotPestRecogPeriodReqVo reqVo) {
+        IotCbdimgSumInfoResVo iotCbdimgSumInfoResVo = iotCbdimgService.sumInfo(reqVo);
+
+        return AjaxResult.success(iotCbdimgSumInfoResVo);
+    }
+
+    /**
+     * 图片识别率
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdimg:group:date:list')")
+    @GetMapping("/group/date/list")
+    public AjaxResult groupDateList(IotPestRecogPeriodReqVo reqVo) {
+
+        List<IotCbdimgGroupDateListResVo> iotCbdimgGroupDateListResVoList = iotCbdimgService.groupDateList(reqVo);
+        return AjaxResult.success(iotCbdimgGroupDateListResVoList);
+    }
+
+
+    /**
+     * 删除图片
+     */
+    @PreAuthorize("@ss.hasPermi('iot:device:remove')")
+    @Log(title = "删除图片", businessType = BusinessType.DELETE)
+    @DeleteMapping("/delete")
+    public AjaxResult remove(@RequestParam("ids") String[] ids) {
+        return toAjax(iotCbdimgService.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;
+    }
+
+    /**
+     * 对开始时间结束时间进行封装
+     *
+     * @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);
+        }
+    }
+}

+ 112 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotCbdrecogController.java

@@ -0,0 +1,112 @@
+package com.yunfeiyun.agmp.iotm.device.pest.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+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.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdrecog;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdrecogAgainReqVo;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdrecogReqVo;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdrecogResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestRecogPeriodReqVo;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotCbdrecogService;
+import org.springframework.beans.factory.annotation.Autowired;
+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/cbdrecog")
+public class IotCbdrecogController extends BaseController
+{
+    @Autowired
+    private MongoService mongoService;
+
+    @Autowired
+    private IIotCbdrecogService iotCbdrecogService;
+
+    /**
+     * 识别数据列表
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdrecog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(IotPestRecogPeriodReqVo reqVo) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("devBid", reqVo.getDevBid());
+        map.put("cbdrecogType",reqVo.getCbdRecogType());
+        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isEmpty(reqVo.getEndTime())) {
+            map.put("gte_cbdrecogCreatedDate", reqVo.getStartTime());
+        }
+        if (StringUtils.isEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+            map.put("lte_cbdrecogCreatedDate", reqVo.getEndTime());
+        }
+        if (StringUtils.isNotEmpty(reqVo.getStartTime()) && StringUtils.isNotEmpty(reqVo.getEndTime())) {
+            map.put("time_cbdrecogCreatedDate", reqVo.getStartTime() + "," + reqVo.getEndTime());
+        }
+
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        IPage listPage = mongoService.findListPage(IotCbdrecog.class, map, pageDomain);
+        return getDataTable(listPage);
+    }
+
+    /**
+     * 测报灯图片识别数据详情
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdrecog:query')")
+    @GetMapping(value = "/info")
+    public AjaxResult getInfo(IotCbdrecogReqVo reqVo) {
+        IotCbdrecogResVo resVo = iotCbdrecogService.info(reqVo);
+        return success(resVo);
+    }
+
+    /**
+     * 人工修正提交
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdrecog:artificial:update')")
+    @PostMapping(value = "/artificial/update")
+    public AjaxResult artificialUpdate(@RequestBody IotCbdrecogReqVo reqVo) {
+        return toAjax(iotCbdrecogService.artificialUpdate(reqVo));
+    }
+
+    /**
+     * 人工修正重置
+     */
+    @PreAuthorize("@ss.hasPermi('iot:cbdrecog:artificial:reset')")
+    @PostMapping(value = "/artificial/reset")
+    public AjaxResult artificialReset(@RequestBody IotCbdrecogReqVo reqVo) {
+        return toAjax(iotCbdrecogService.artificialReset(reqVo));
+    }
+
+    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:cbdrecog:again')")
+    @PostMapping(value = "/again")
+    public AjaxResult againRecog(@RequestBody IotCbdrecogAgainReqVo reqVo) {
+
+        IotCbdrecogResVo resVo = iotCbdrecogService.againRecog(reqVo);
+        return success(resVo);
+    }
+}

+ 153 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/controller/IotDeviceCbdController.java

@@ -0,0 +1,153 @@
+package com.yunfeiyun.agmp.iotm.device.pest.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.log.LogCore;
+import com.yunfeiyun.agmp.common.utils.uuid.IdUtils;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbddata;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdConfigEditReqVo;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbddataReqVo;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdModel;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iotm.common.controller.BaseController;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IotCbdService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotCmdtaskService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.Map;
+
+/**
+ * 测报灯相关接口
+ *
+ * @author
+ */
+@RestController
+@RequestMapping("/iot/device/cbd")
+@Slf4j
+public class IotDeviceCbdController extends BaseController {
+
+    @Resource
+    private IIotCmdtaskService iIotCmdtaskService;
+
+    @Resource
+    private MongoService mongoService;
+
+    @Autowired
+    private IotCbdService iotCbdService;
+
+
+    /**
+     * 下发测报灯配置指令
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/config/edit")
+    public AjaxResult sendConfigCmd(@RequestBody IotCbdConfigEditReqVo iotCbdConfigEditReqVo) {
+        log.info("【{}】【测报灯】【下发指令配置】客户id {}", LogCore.getSeq(), getCustomerId());
+        String taskId=iotCbdService.editConfig(iotCbdConfigEditReqVo);
+
+        return new AjaxResult(ErrorCode.SUCCESS.getCode(), "下发成功,等待设备响应结果", taskId);
+    }
+
+    /**
+     * 测报灯-拍照
+     *
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/takephoto/{devBid}")
+    public AjaxResult takePhoto(@PathVariable("devBid") String devBid) {
+        log.info("【{}】【测报灯】【拍照】客户id {}", LogCore.getSeq(), getCustomerId());
+        String taskId=iotCbdService.takePhoto(devBid);
+        return new AjaxResult(ErrorCode.SUCCESS.getCode(), "下发成功,等待设备响应结果", taskId);
+    }
+
+    @GetMapping("/data/list")
+    public TableDataInfo getList(IotCbddataReqVo reqVo) {
+        Map<String, Object> cases = BeanUtil.beanToMap(reqVo);
+        return getDataTable(mongoService.findListPage(IotCbddata.class, cases, TableSupport.buildPageRequest()));
+    }
+
+    @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();
+    }
+}

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

@@ -0,0 +1,10 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import lombok.Data;
+
+@Data
+public class IotCbdimgGroupDateListResVo {
+    String date;
+    int cbdimgRecognumTotal;
+    int cbdimgPestnumTotal;
+}

+ 27 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdimgSumInfoResVo.java

@@ -0,0 +1,27 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import lombok.Data;
+
+@Data
+public class IotCbdimgSumInfoResVo {
+    /**
+     * 图片数量
+     */
+    int imgCount;
+    /**
+     * 识别图片数量
+     */
+    int recogImgCount;
+    /**
+     * 未识别图片数量
+     */
+    int noRecogImgCount;
+    /**
+     * 识别害虫数量
+     */
+    int sum;
+    /**
+     * 识别害虫种类
+     */
+    int typeCount;
+}

+ 137 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/domain/IotCbdrecogResVo.java

@@ -0,0 +1,137 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import com.yunfeiyun.agmp.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 测报灯图片识别对象 IotCbdrecog
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotCbdrecogResVo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    private String id;
+
+    /**
+     * 图片识别业务标识
+     */
+    @Excel(name = "图片识别业务标识")
+    private String cbdrecogBid;
+
+    /**
+     * 客户id
+     */
+    @Excel(name = "客户id")
+    private String cId;
+
+    /**
+     * 图片基础业务标识
+     */
+    @Excel(name = "图片基础业务标识")
+    private String cbdimgBid;
+
+    /**
+     * 识别类型
+     */
+    @Excel(name = "识别类型")
+    private String cbdrecogType;
+
+    /**
+     * 识别图片地址
+     */
+    @Excel(name = "识别图片地址")
+    private String cbdrecogAddr;
+
+    /**
+     * 手动标记图片地址
+     */
+    @Excel(name = "手动标记图片地址")
+    private String cbdrecogManualaddr;
+
+
+    /**
+     * 害虫识别结果
+     */
+    @Excel(name = "害虫识别结果")
+    private String cbdrecogResult;
+
+    /**
+     * 标记类型
+     */
+    @Excel(name = "标记类型")
+    private String cbdrecogMarktype;
+
+    /**
+     * 手动标记结果
+     */
+    @Excel(name = "手动标记结果")
+    private String cbdrecogManualmark;
+
+    /**
+     * 机器标注结果
+     */
+    @Excel(name = "机器标注结果")
+    private String cbdrecogMachinemark;
+
+    /**
+     * 创建人
+     */
+    @Excel(name = "创建人")
+    private String cbdrecogCreator;
+
+    /**
+     * 修改人
+     */
+    @Excel(name = "修改人")
+    private String cbdrecogModifier;
+
+    /**
+     * 修改时间
+     */
+    @Excel(name = "修改时间")
+    private String cbdrecogModifieddate;
+
+    /**
+     * 创建时间
+     */
+    @Excel(name = "创建时间")
+    private String cbdrecogCreatedDate;
+
+    /**
+     * 删除状态
+     */
+    @Excel(name = "删除状态")
+    private String cbdrecogDelstatus;
+
+    /**
+     * 原图地址
+     */
+    @Excel(name = "原图地址")
+    private String cbdimgAddr;
+
+    /**
+     * 总数
+     */
+    @Excel(name = "总数")
+    private Long cbdimgPestnum;
+
+    /**
+     * 识别数
+     */
+    @Excel(name = "识别数")
+    private Long cbdimgRecognum;
+
+    private Map<String, Integer> pestRecogNumMap;
+
+    private String cbdimgModifieddate;
+
+    private String cbdimgCreatedDate;
+}

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

@@ -0,0 +1,76 @@
+package com.yunfeiyun.agmp.iotm.device.pest.domain;
+
+import com.yunfeiyun.agmp.iot.common.enums.EnumCbdRecogType;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 获取害虫周期
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Data
+public class IotPestRecogPeriodReqVo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备业务标识
+     */
+    private String devBid;
+
+    /**
+     * 客户id
+     */
+    private String cId;
+
+    /**
+     * 害虫业务id
+     */
+    private String pestBid;
+
+    /**
+     * 害虫业务id
+     */
+    private List<String> pestBids;
+
+    /**
+     * 虫情识别信息业务标识
+     */
+    private List<String> pestrecogBids;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 标记类型 1 AI,0 人工
+     */
+    private String pestrecogMarktype;
+    /**
+     * 设备ids
+     */
+    private List<String> devBids;
+
+    /**
+     * 测报灯识别类型
+     * 1  A模型
+     * 2  B模型
+     */
+    private String cbdRecogType;
+
+    public String getCbdRecogType() {
+        if(!Objects.equals(cbdRecogType, EnumCbdRecogType.A.getCode()) && !Objects.equals(cbdRecogType, EnumCbdRecogType.B.getCode())) {
+            return EnumCbdRecogType.A.getCode();
+        }
+        return cbdRecogType;
+    }
+}

+ 45 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotCbdimgService.java

@@ -0,0 +1,45 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdimg;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgGroupDateListResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgSumInfoResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestRecogPeriodReqVo;
+
+import java.util.List;
+
+/**
+ * 测报灯识别数据Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotCbdimgService {
+    public IotCbdimgSumInfoResVo sumInfo(IotPestRecogPeriodReqVo reqVo);
+
+    public List<IotCbdimgGroupDateListResVo> groupDateList(IotPestRecogPeriodReqVo reqV);
+
+    /**
+     * 删除
+     *
+     * @param ids ids
+     */
+    public int remove(String[] ids);
+
+    /**
+     * 统计测报灯今日数据
+     */
+    public int statIdentifyNum(List<String> devIds,String startData,String endDate);
+
+    /**
+     * 统计测报灯今日数据
+     */
+    public int statDestoryNum(List<String> devIds,String startData,String endDate);
+
+
+    /**
+     * 获取测报灯的照片
+     */
+    public List<IotCbdimg> getCbdImgLimit(List<String> devIds,String startData,String endDate,Integer limitNum);
+
+}

+ 40 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IIotCbdrecogService.java

@@ -0,0 +1,40 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdrecogAgainReqVo;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdrecogReqVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdrecogResVo;
+
+import java.util.List;
+
+/**
+ * 测报灯识别数据Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotCbdrecogService
+{
+    /**
+     * 人工修正提交
+     *
+     * @param iotCbdrecog 测报灯识别数据
+     */
+    public int artificialUpdate(IotCbdrecogReqVo reqVo);
+
+    /**
+     * 人工修正重置
+     *
+     * @param iotCbdrecog 测报灯识别数据
+     */
+    public int artificialReset(IotCbdrecogReqVo reqVo);
+
+    public IotCbdrecogResVo info(IotCbdrecogReqVo reqVo);
+
+    /**
+     * 获取测报灯的照片
+     */
+    public List<IotCbdrecogResVo> getCbdImgLimit(List<String> devIds, String startData, String endDate, Integer limitNum);
+
+    public IotCbdrecogResVo againRecog(IotCbdrecogAgainReqVo reqVo);
+}

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

@@ -0,0 +1,89 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotPest;
+import com.yunfeiyun.agmp.iot.common.domain.resvo.IoPestResVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 害虫信息Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotPestService
+{
+    /**
+     * 查询害虫信息
+     *
+     * @param pestBid 害虫信息主键
+     * @return 害虫信息
+     */
+    public IotPest selectIotPestByPestBid(String pestBid);
+
+    public List<IotPest> selectIotPestListBatchByBid(List<String> pestBidList);
+
+    public IotPest selectIotPestByPestId(String pestId);
+    /**
+     * 查询害虫信息列表
+     *
+     * @param iotPest 害虫信息
+     * @return 害虫信息集合
+     */
+    public List<IotPest> selectIotPestList(IotPest iotPest);
+
+
+    /**
+     * 返回结果  pestBid 作为key
+     * @return
+     */
+    public Map<String, IotPest> selectIotPestMapAllInfo();
+
+    /**
+     * 返回结果  pestId 作为key
+     * @return
+     */
+    public Map<String, IotPest> selectIotPestMapAllInfo2();
+    public Map<String, String> selectIotPestMapAll();
+
+
+    /**
+     * 新增害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int insertIotPest(IotPest iotPest);
+
+    /**
+     * 修改害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int updateIotPest(IotPest iotPest);
+
+    /**
+     * 批量删除害虫信息
+     *
+     * @param ids 需要删除的害虫信息主键集合
+     * @return 结果
+     */
+    public int deleteIotPestByIds(Long[] ids);
+
+    /**
+     * 删除害虫信息信息
+     *
+     * @param id 害虫信息主键
+     * @return 结果
+     */
+    public int deleteIotPestById(Long id);
+
+    IoPestResVo selectIotPestDetailByPestBid(String pestBid);
+
+    String selectIotPestCropsByCalarmId(String calarmId);
+
+    IotPest selectIotPestByPestName(IotPest iotPest);
+}

+ 27 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IotCbdService.java

@@ -0,0 +1,27 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service;
+
+import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdConfigEditReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseListReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.service.IotDeviceBaseService;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDeviceAddressGetReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDeviceCaptureReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDevicePtzReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDeviceVideoReqVo;
+
+import java.util.List;
+
+/**
+ * @author 123
+ */
+public interface IotCbdService extends IotDeviceBaseService {
+    public List<IotDevice> list(IotDeviceBaseListReqVo iotDeviceBaseListReqVo);
+
+    public IotDevice info(IotDeviceBaseListReqVo iotDeviceBaseListReqVo);
+    /**抓拍*/
+    public String takePhoto(String devId);
+
+    public String refreshStatus(String devId);
+    public String editConfig(IotCbdConfigEditReqVo iotCbdConfigEditReqVo);
+
+}

+ 75 - 0
src/main/java/com/yunfeiyun/agmp/iotm/device/pest/service/IotPestMapper.java

@@ -0,0 +1,75 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotPest;
+import com.yunfeiyun.agmp.iot.common.domain.resvo.IoPestResVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 害虫信息Mapper接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IotPestMapper
+{
+    /**
+     * 查询害虫信息
+     *
+     * @param pestBid 害虫信息主键
+     * @return 害虫信息
+     */
+    public IotPest selectIotPestByPestBid(String pestBid);
+
+    public List<IotPest> selectIotPestListBatchByBid(List<String> pestBidList);
+
+    public IotPest selectIotPestByPestId(String pestId);
+
+    /**
+     * 查询害虫信息列表
+     *
+     * @param iotPest 害虫信息
+     * @return 害虫信息集合
+     */
+    public List<IotPest> selectIotPestList(IotPest iotPest);
+
+    /**
+     * 新增害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int insertIotPest(IotPest iotPest);
+
+    /**
+     * 修改害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    public int updateIotPest(IotPest iotPest);
+
+    /**
+     * 删除害虫信息
+     *
+     * @param id 害虫信息主键
+     * @return 结果
+     */
+    public int deleteIotPestById(Long id);
+
+    /**
+     * 批量删除害虫信息
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteIotPestByIds(Long[] ids);
+
+    IoPestResVo selectIotPestDetailByPestBid(@Param("pestBid") String pestBid);
+
+    String selectIotPestCropsByCalarmId(@Param("calarmId")  String calarmId);
+
+    IotPest selectIotPestByPestName(IotPest iotPest);
+}

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

@@ -0,0 +1,179 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
+import com.yunfeiyun.agmp.common.enums.RedisCacheKey;
+import com.yunfeiyun.agmp.common.framework.manager.RedisCacheManager;
+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.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.constant.devicetype.IotDeviceTypeLv1Enum;
+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.reqvo.IotCbdConfigEditReqVo;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdModel;
+import com.yunfeiyun.agmp.iot.common.util.tmn.CustomerIdUtil;
+import com.yunfeiyun.agmp.iotm.device.common.domin.IotDeviceBaseListReqVo;
+import com.yunfeiyun.agmp.iotm.device.common.service.impl.IotDeviceBaseServiceImpl;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDeviceAddressGetReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDeviceCaptureReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDevicePtzReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.domin.IotEzvizDeviceVideoReqVo;
+import com.yunfeiyun.agmp.iotm.device.monitor.service.IotEzvizMonitorService;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IotCbdService;
+import com.yunfeiyun.agmp.iotm.web.mapper.IotDeviceMapper;
+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.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 测报灯
+ *
+ * @author liuyaowen
+ *
+ * */
+@Slf4j
+@Service(value = ServiceNameConst.SERVICE_YF_CBD)
+public class IotCbdServiceImpl extends IotDeviceBaseServiceImpl implements IotCbdService {
+
+    @Resource
+    private IotDeviceMapper iotDeviceMapper;
+    @Autowired
+    private IIotCmdtaskService iIotCmdtaskService;
+
+    @Autowired
+    private IIotDeviceService iIotDeviceService;
+
+    @Resource
+    private IIotDeviceconfigService iIotDeviceconfigService;
+
+    @Override
+    public List<IotDevice> list(IotDeviceBaseListReqVo iotDeviceBaseCtlReqVo){
+        return iotDeviceMapper.selectIotDeviceList(iotDeviceBaseCtlReqVo);
+    }
+    @Override
+    public IotDevice info(IotDeviceBaseListReqVo iotDeviceBaseListReqVo){
+        return iotDeviceMapper.selectIotDeviceByDevBid(iotDeviceBaseListReqVo.getDevBid());
+    }
+
+    /**
+     * 发送更改配置
+     * @param iotCbdConfigEditReqVo
+     * @return
+     */
+    @Override
+    public String editConfig(IotCbdConfigEditReqVo iotCbdConfigEditReqVo) {
+        log.info("【{}】【测报灯】【下发指令配置】客户id {}", LogCore.getSeq());
+        if (StringUtils.isEmpty(iotCbdConfigEditReqVo.getCdbdataBid())) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(),"设备id不可为空");
+        }
+        IotDevice iotDevice = iIotDeviceService.selectIotDeviceByDevBid(iotCbdConfigEditReqVo.getCdbdataBid());
+        if (iotDevice == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(),"设备不存在");
+        }
+        IotDeviceconfig iotDeviceconfig = iIotDeviceconfigService.selectIotDeviceConfigByDevBid(iotCbdConfigEditReqVo.getCdbdataBid());
+        if (null == iotDeviceconfig) {
+            // 如果测报灯配置为空,则新增测报灯配置
+            iotDeviceconfig = new IotDeviceconfig();
+            iotDeviceconfig.setDevcfgBid(iotDeviceconfig.getUUId());
+            iotDeviceconfig.setCId(iotDevice.getTid());
+            iotDeviceconfig.setDevBid(iotCbdConfigEditReqVo.getCdbdataBid());
+            iotDeviceconfig.setDevcfgContext(JSONUtils.toJSONString(iotCbdConfigEditReqVo.getIotCbdConfig()));
+            iotDeviceconfig.setDevcfgDelstatus("0");
+            iIotDeviceconfigService.insertIotDeviceconfig(iotDeviceconfig);
+        } else {
+            // 如果测报灯配置不为空,则更新测报灯配置
+            iotDeviceconfig.setDevcfgContext(JSONUtils.toJSONString(iotCbdConfigEditReqVo.getIotCbdConfig()));
+            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(iotCbdConfigEditReqVo));
+        iIotCmdtaskService.handInternalCmd(cmdGroupModel);
+        return cmdGroupModel.getTaskUuid();
+    }
+
+
+    @Override
+    public String takePhoto(String devBid) {
+        log.info("【{}】【测报灯】【拍照】客户id {}", LogCore.getSeq());
+        IotDevice iotDevice = iIotDeviceService.selectIotDeviceByDevBid(devBid);
+        if (iotDevice == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(),"设备不存在");
+        }
+
+        IotDeviceconfig iotDeviceconfig = new IotDeviceconfig();
+        iotDeviceconfig.setCId(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);
+        return cmdGroupModel.getTaskUuid();
+    }
+
+
+
+    @Override
+    public String refreshStatus(String devBid) {
+        IotDevice iotDevice = iotDeviceMapper.selectIotDeviceByDevBid(devBid);
+        if (iotDevice == null) {
+            throw new IotBizException(IotErrorCode.FAILURE.getCode(), "设备不存在" + devBid);
+        }
+        log.info("创建【“刷新”指令集任务】,设备类型:CBD");
+        JSONObject   payload = new JSONObject();
+        payload.put("cmd", "read");
+        payload.put("ext", "data");
+        IotDeviceconfig iotDeviceconfig = new IotDeviceconfig();
+        iotDeviceconfig.setCId(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);
+        return cmdGroupModel.getTaskUuid();
+    }
+
+
+}

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

@@ -0,0 +1,329 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service.impl;
+
+import com.mongodb.client.result.UpdateResult;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdimg;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdpest;
+import com.yunfeiyun.agmp.iot.common.domain.IotCbdrecog;
+import com.yunfeiyun.agmp.iot.common.domain.IotPestrecog;
+import com.yunfeiyun.agmp.iot.common.domain.resvo.IotScreenCbdStatResVo;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iot.common.service.mongo.LookupWithPipelineOperation;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgGroupDateListResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdimgSumInfoResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotPestRecogPeriodReqVo;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotCbdimgService;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import org.bson.Document;
+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.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.Arrays;
+import java.util.List;
+
+
+/**
+ * 测报灯识别数据Service业务层处理
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Service
+public class IotCbdimgServiceImpl implements IIotCbdimgService {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Resource
+    private IIotPestService iotPestService;
+    @Resource
+    private IIotDeviceService iotDeviceService;
+
+    @Autowired
+    private MongoService mongoService;
+
+    /**
+     * @param reqVo
+     */
+    @Override
+    public IotCbdimgSumInfoResVo sumInfo(IotPestRecogPeriodReqVo reqVo) {
+        String devBid = reqVo.getDevBid();
+        String startTime = reqVo.getStartTime();
+        String endTime = reqVo.getEndTime();
+        String cbdRecogType = reqVo.getCbdRecogType();
+
+        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)
+            );
+        } else if (StringUtils.isNotEmpty(startTime)) {
+            criteria = criteria.and("cbdimgCreatedDate").gte(startTime);
+        } else if (StringUtils.isNotEmpty(endTime)) {
+            criteria = criteria.and("cbdimgCreatedDate").lte(endTime);
+        }
+        MatchOperation matchOperation = Aggregation.match(criteria);
+        ProjectionOperation projectionOperation = Aggregation.project()
+                .andExclude("_id")
+                .and("$$ROOT").as("c");
+        LookupWithPipelineOperation lookupWithPipelineOperation = new LookupWithPipelineOperation(
+                "IotCbdrecog", "c.cbdimgBid", "cbdimgBid", "ce",
+                new Document().append("$match", new Document().append("cbdrecogType", cbdRecogType).append("cbdrecogMarktype", "1")));
+        UnwindOperation unwindOperationCe = Aggregation.unwind("ce", true);
+
+
+
+        LookupOperation lookupOperationIotCbdpest = Aggregation.lookup(
+                "IotCbdpest", "ce.cbdrecogBid", "cbdrecogBid", "cp"
+        );
+        UnwindOperation unwindOperationCp = Aggregation.unwind("cp", true);
+
+
+        LookupOperation lookupOperationIotPestrecog = Aggregation.lookup(
+                "IotPestrecog", "cp.pestrecogBid", "pestrecogBid", "pr"
+        );
+        UnwindOperation unwindOperationPr = Aggregation.unwind("pr", true);
+
+        GroupOperation groupOperation = Aggregation.group("c.cbdimgBid")
+                .push("cp").as("recogArray")
+                .push("pr.pestrecogNum").as("pestArray")
+                .addToSet("pr.pestBusid").as("pestTypeArray");
+
+        ProjectionOperation projectionOperationResult = Aggregation.project("_id")
+                .and("_id").as("cbdimgBid")
+                .andExpression("{'$cond': {'if': {'$eq': {{'$size': '$recogArray'},0}},'then': 1,'else':0}}").as("noRecog")
+                .and("pestTypeArray").as("pestTypeArray")
+                .andExpression("{$sum: '$pestArray'}").as("pestNum");
+
+        GroupOperation groupOperation2 = Aggregation.group()
+                .count().as("imgCount")
+                .sum("noRecog").as("noRecogImgCount")
+                .sum("pestNum").as("sum")
+                .push("pestTypeArray").as("pestTypeArray");
+
+        UnwindOperation unwindOperationPest = Aggregation.unwind("pestTypeArray", true);
+        GroupOperation groupOperation3 = Aggregation.group()
+                .first("imgCount").as("imgCount")
+                .first("noRecogImgCount").as("noRecogImgCount")
+                .first("sum").as("sum")
+                .addToSet("pestTypeArray").as("pestTypeArray");
+        ProjectionOperation projectionOperationResult2 = Aggregation.project("_id")
+                .and("imgCount").as("imgCount")
+                .and("sum").as("sum")
+                .and("noRecogImgCount").as("noRecogImgCount")
+                .andExpression("{$size: '$pestTypeArray'}").as("typeCount");
+
+        Aggregation aggregation = Aggregation.newAggregation(
+                matchOperation,
+                projectionOperation,
+                lookupWithPipelineOperation,
+                unwindOperationCe,
+                lookupOperationIotCbdpest,
+                unwindOperationCp,
+                lookupOperationIotPestrecog,
+                unwindOperationPr,
+                groupOperation,
+                projectionOperationResult,
+                groupOperation2,
+                unwindOperationPest,
+                unwindOperationPest,
+                groupOperation3,
+                projectionOperationResult2
+        );
+
+        List<IotCbdimgSumInfoResVo> iIotCbdimgSumInfoResVoList = mongoService.aggregate(
+                IotCbdimg.class, aggregation, IotCbdimgSumInfoResVo.class
+        );
+
+        IotCbdimgSumInfoResVo iotCbdimgSumInfoResVo = new IotCbdimgSumInfoResVo();
+        iotCbdimgSumInfoResVo.setSum(0);
+        iotCbdimgSumInfoResVo.setImgCount(0);
+        iotCbdimgSumInfoResVo.setNoRecogImgCount(0);
+        iotCbdimgSumInfoResVo.setTypeCount(0);
+        iotCbdimgSumInfoResVo.setRecogImgCount(0);
+
+        if (iIotCbdimgSumInfoResVoList.size() > 0) {
+            iotCbdimgSumInfoResVo = iIotCbdimgSumInfoResVoList.get(0);
+            iotCbdimgSumInfoResVo.setRecogImgCount(iotCbdimgSumInfoResVo.getImgCount() - iotCbdimgSumInfoResVo.getNoRecogImgCount());
+        }
+        return iotCbdimgSumInfoResVo;
+    }
+
+    /**
+     * @param reqV
+     */
+    @Override
+    public List<IotCbdimgGroupDateListResVo> groupDateList(IotPestRecogPeriodReqVo reqV) {
+        String devBid = reqV.getDevBid();
+        String startTime = reqV.getStartTime();
+        String endTime = reqV.getEndTime();
+        String cbdRecogType = reqV.getCbdRecogType();
+        Criteria criteria = new Criteria().and("cbdimgDelstatus").is("0");
+        //支持单个设备查询/多个查询
+        List<String> devBids = reqV.getDevBids();
+        if (devBids != null && devBids.size() >= 1) {
+            criteria.and("devBid").in(devBids);
+        } else {
+            criteria.and("devBid").is(devBid);
+        }
+
+        //时间查询
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            criteria = criteria.andOperator(
+                    Criteria.where("cbdimgCreatedDate").gte(startTime),
+                    Criteria.where("cbdimgCreatedDate").lte(endTime)
+            );
+        } else if (StringUtils.isNotEmpty(startTime)) {
+            criteria = criteria.and("cbdimgCreatedDate").gte(startTime);
+        } else if (StringUtils.isNotEmpty(endTime)) {
+            criteria = criteria.and("cbdimgCreatedDate").lte(endTime);
+        }
+        MatchOperation matchOperation = Aggregation.match(criteria);
+
+        ProjectionOperation projectionOperation = Aggregation.project()
+                .andExclude("_id").and("$$ROOT").as("c")
+                .and("cbdimgPestnum").as("cbdimgPestnum")
+                .and("cbdimgRecognum").as("cbdimgRecognum")
+                .and("cbdimgCreatedDate").as("cbdimgCreatedDate")
+                .andExpression("{$dateToString: {'date': {$dateTrunc: {date: {$dateFromString: {dateString: '$cbdimgCreatedDate', format: '%Y-%m-%d %H:%M:%S'}}, unit:'day'}}, 'format': '%Y-%m-%d'}}").as("tempDate")
+                ;
+
+        LookupOperation lookupOperationIotCbdrecog = Aggregation.lookup(
+                "IotCbdrecog", "c.cbdimgBid", "cbdimgBid", "ce"
+        );
+        UnwindOperation unwindOperationCe = Aggregation.unwind("ce", true);
+        Criteria criteria2 = new Criteria()
+                .and("ce.cbdrecogType").is(cbdRecogType)
+                .and("ce.cbdrecogMarktype").is("1");
+        MatchOperation matchOperation2 = Aggregation.match(criteria2);
+
+        GroupOperation groupOperation = Aggregation.group("tempDate")
+                .sum("cbdimgPestnum").as("cbdimgPestnum")
+                .sum("ce.cbdimgRecognum").as("cbdimgRecognum")
+                .first("tempDate").as("tempDate");
+
+        ProjectionOperation projectionOperation2 = Aggregation.project()
+                .and("cbdimgPestnum").as("cbdimgPestnumTotal")
+                .and("cbdimgRecognum").as("cbdimgRecognumTotal")
+                .and("tempDate").as("date");
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "date");
+
+        Aggregation aggregation = Aggregation.newAggregation(
+                matchOperation,
+                projectionOperation,
+                lookupOperationIotCbdrecog,
+                unwindOperationCe,
+                matchOperation2,
+                groupOperation,
+                projectionOperation2,
+                sortOperation
+        );
+
+        List<IotCbdimgGroupDateListResVo> iotCbdimgGroupDateListResVoList = mongoService.aggregate(
+                IotCbdimg.class, aggregation, IotCbdimgGroupDateListResVo.class
+        );
+        return iotCbdimgGroupDateListResVoList;
+    }
+
+    @Transactional
+    @Override
+    public int remove(String[] ids) {
+        List<String> list = Arrays.asList(ids);
+        Criteria criteria = new Criteria();
+        criteria.and("cbdimgBid").in(list);
+        Query query = new Query(criteria);
+        Update update = new Update().set("cbdimgDelstatus", "1");
+        Update update2 = new Update().set("cbdrecogDelstatus", "1");
+
+        List<IotCbdrecog> iotCbdrecogs = mongoTemplate.find(query, IotCbdrecog.class, "IotCbdrecog");
+        List<String> cbdrecogBids = new ArrayList<>();
+        for (IotCbdrecog iotCbdrecog : iotCbdrecogs) {
+            cbdrecogBids.add(iotCbdrecog.getCbdrecogBid());
+        }
+        Query query2 = new Query(Criteria.where("cbdrecogBid").in(cbdrecogBids));
+        List<IotCbdpest> iotCbdpests = mongoTemplate.find(query2, IotCbdpest.class, "IotCbdpest");
+        List<String> pestrecogBids = new ArrayList<>();
+        for (IotCbdpest iotCbdpest : iotCbdpests) {
+            pestrecogBids.add(iotCbdpest.getPestrecogBid());
+        }
+        Query query3 = new Query(Criteria.where("pestrecogBid").in(pestrecogBids));
+
+        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, IotCbdimg.class, "IotCbdimg");
+        mongoTemplate.updateMulti(query, update2, IotCbdrecog.class, "IotCbdrecog");
+        mongoTemplate.remove(query2, IotCbdpest.class, "IotCbdpest");
+        mongoTemplate.remove(query3, IotPestrecog.class, "IotPestrecog");
+
+        return (int) updateResult.getModifiedCount();
+    }
+
+    @Override
+    public int statIdentifyNum(List<String> devIds, String startData, String endDate) {
+        Criteria criteria = new Criteria()
+                .and("devBid").in(devIds)
+                .and("cbdimgDelstatus").is("0")
+                .andOperator(
+                        Criteria.where("cbdimgCreatedDate").gte(startData),
+                        Criteria.where("cbdimgCreatedDate").lte(endDate));
+        Aggregation cbdimgRecognum = Aggregation.newAggregation(
+                Aggregation.match(criteria),
+                Aggregation.group().sum("cbdimgRecognum").as("identifyNum")
+        );
+        // 执行聚合操作并获取结果
+        AggregationResults<IotScreenCbdStatResVo> results = mongoTemplate.aggregate(cbdimgRecognum, "IotCbdimg", IotScreenCbdStatResVo.class);
+        if (results != null && !results.getMappedResults().isEmpty()) {
+            IotScreenCbdStatResVo result = results.getMappedResults().get(0);
+            return result.getIdentifyNum();
+        }
+        return 0;
+    }
+
+    @Override
+    public int statDestoryNum(List<String> devIds, String startData, String endDate) {
+        Criteria criteria = new Criteria()
+                .and("devBid").in(devIds)
+                .and("cbdimgDelstatus").is("0")
+                .andOperator(
+                        Criteria.where("cbdimgCreatedDate").gte(startData),
+                        Criteria.where("cbdimgCreatedDate").lte(endDate));
+        Aggregation cbdimgPestnum = Aggregation.newAggregation(
+                Aggregation.match(criteria),
+                Aggregation.group().sum("cbdimgPestnum").as("destoryNum")
+        );
+        // 执行聚合操作并获取结果
+        AggregationResults<IotScreenCbdStatResVo> results = mongoTemplate.aggregate(cbdimgPestnum, "IotCbdimg", IotScreenCbdStatResVo.class);
+        if (results != null && !results.getMappedResults().isEmpty()) {
+            IotScreenCbdStatResVo result = results.getMappedResults().get(0);
+            return result.getDestoryNum();
+        }
+        return 0;
+    }
+
+    @Override
+    public List<IotCbdimg> getCbdImgLimit(List<String> devIds, String startData, String endDate,Integer limitNum) {
+        Criteria criteria = new Criteria()
+                .and("devBid").in(devIds)
+                .and("cbdimgDelstatus").is("0")
+                .andOperator(
+                        Criteria.where("cbdimgCreatedDate").gte(startData),
+                        Criteria.where("cbdimgCreatedDate").lte(endDate));
+        Query query = new Query(criteria);
+        query.with(Sort.by(new Sort.Order(Sort.Direction.DESC, "cbdimgCreatedDate")));
+        if(null != limitNum){
+            query.limit(limitNum);
+        }
+        return mongoTemplate.find(query, IotCbdimg.class, "IotCbdimg");
+    }
+
+}

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

@@ -0,0 +1,505 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service.impl;
+
+import cn.hutool.core.codec.Base64;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.yunfeiyun.agmp.common.constant.ErrorCode;
+import com.yunfeiyun.agmp.common.constant.ResConstants;
+import com.yunfeiyun.agmp.common.framework.oss.cloud.OSSFactory;
+import com.yunfeiyun.agmp.common.utils.DateUtils;
+import com.yunfeiyun.agmp.common.utils.JSONUtils;
+import com.yunfeiyun.agmp.common.utils.SecurityUtils;
+import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.common.utils.bean.BeanUtils;
+import com.yunfeiyun.agmp.iot.common.constant.mq.IotActionEnums;
+import com.yunfeiyun.agmp.iot.common.domain.*;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdrecogAgainReqVo;
+import com.yunfeiyun.agmp.iot.common.domain.reqvo.IotCbdrecogReqVo;
+import com.yunfeiyun.agmp.iot.common.enums.EnumCbdRecogType;
+import com.yunfeiyun.agmp.iot.common.exception.IotBizException;
+import com.yunfeiyun.agmp.iot.common.service.IotWeatherService;
+import com.yunfeiyun.agmp.iot.common.service.MongoService;
+import com.yunfeiyun.agmp.iot.common.util.tmn.CustomerIdUtil;
+import com.yunfeiyun.agmp.iotm.device.pest.domain.IotCbdrecogResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotCbdrecogService;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestService;
+import com.yunfeiyun.agmp.iotm.mq.provider.IotsMqProviderService;
+import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
+import lombok.extern.slf4j.Slf4j;
+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.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * 测报灯识别数据Service业务层处理
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Slf4j
+@Service
+public class IotCbdrecogServiceImpl implements IIotCbdrecogService {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Resource
+    private IIotPestService iotPestService;
+    @Resource
+    private IIotDeviceService iotDeviceService;
+
+    @Autowired
+    private IotWeatherService iotWeatherService;
+
+    @Autowired
+    private MongoService mongoService;
+
+    @Resource
+    private IotsMqProviderService iotsMqProviderService;
+
+
+    @Transactional
+    @Override
+    public int artificialUpdate(IotCbdrecogReqVo reqVo) {
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdrecogMarktype = "0";
+        String cbdimgBid = reqVo.getCbdimgBid();
+        String cbdrecogManualmark = reqVo.getCbdrecogManualmark();
+        String cbdrecogManualBase64 = reqVo.getCbdrecogManualBase64();
+        String devBid = reqVo.getDevBid();
+
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("cbdimgBid", cbdimgBid);
+        IotCbdimg iotCbdimg = (IotCbdimg) mongoService.findOne(IotCbdimg.class, map, null, null);
+
+        Criteria cri = Criteria.where("cbdimgBid").is(cbdimgBid)
+                .and("cbdrecogType").is(cbdrecogType)
+                .and("cbdrecogMarktype").is(cbdrecogMarktype);
+        IotCbdrecog iotCbdrecog = mongoTemplate.findOne(new Query(cri),
+                IotCbdrecog.class, "IotCbdrecog");
+        boolean isUpdate = true;
+        if (iotCbdrecog == null) {
+            Criteria cri2 = Criteria.where("cbdimgBid").is(cbdimgBid)
+                    .and("cbdrecogType").is(cbdrecogType);
+            iotCbdrecog = mongoTemplate.findOne(new Query(cri2),
+                    IotCbdrecog.class, "IotCbdrecog");
+            if (iotCbdrecog == null) {
+                iotCbdrecog = new IotCbdrecog();
+                iotCbdrecog.setCbdimgBid(cbdimgBid);
+                iotCbdrecog.setCbdrecogType(cbdrecogType);
+                iotCbdrecog.setCbdrecogDelstatus("0");
+                iotCbdrecog.setCbdrecogCreatedDate(iotCbdimg.getCbdimgCreatedDate());
+                iotCbdrecog.setCbdrecogModifieddate(iotCbdimg.getCbdimgCreatedDate());
+                iotCbdrecog.setCbdrecogCreator(SecurityUtils.getUserId());
+
+            }
+            iotCbdrecog.setCbdrecogBid(iotCbdrecog.getUUId());
+            iotCbdrecog.setCbdrecogMarktype(cbdrecogMarktype);
+            isUpdate = false;
+        }
+
+        if (StringUtils.isNotEmpty(cbdrecogManualBase64)) {
+            String imgUrl = getPestRecogImgOssUrl(cbdrecogManualBase64, iotCbdrecog.getCbdrecogBid());
+            iotCbdrecog.setCbdrecogManualaddr(imgUrl);
+        }
+        iotCbdrecog.setCbdrecogManualmark(cbdrecogManualmark);
+
+        JSONArray recogArray = JSONArray.parseArray(cbdrecogManualmark);
+
+        List<JSONObject> points = new ArrayList<>();//包含了所有识别(标记),其中(已收录过的害虫的),提交上来的是pestid:标记信息,人工识别(?未收录过的害虫?前端是否判断后提交?),提交上来的是  ”害虫名称“:"标记信息"
+        List<JSONObject> points2 = new ArrayList<>();
+        if (recogArray != null) {
+            for (Object o : JSONArray.parseArray(cbdrecogManualmark)) {
+                points.add((JSONObject) o);
+            }
+        }
+
+        //害虫信息
+        List<IotPest> iotPests = iotPestService.selectIotPestList(null);
+        //Map<String, String> pestMap = iotPests.stream().collect(Collectors.toMap(IotPest::getPestId, IotPest::getPestBid));
+        Map<String, String> pestMap = iotPests.stream().collect(Collectors.toMap(IotPest::getPestId, IotPest::getPestName));
+        Map<String, String> pestMap2 = iotPests.stream().collect(Collectors.toMap(IotPest::getPestId, IotPest::getPestBid));
+        //设备信息
+        IotDevice iotDevice = iotDeviceService.selectIotDeviceByDevBid(devBid);
+        //统计害虫数量(pestid->数量)
+        Map<String, Integer> pest = new HashMap<>();
+
+        //IotPestrecog存储
+        for (JSONObject point : points) {
+            points2.add(point);
+            //判断人工修正的是否有新的害虫名字,有的新的新增,并存储
+            for (String s : point.keySet()) {
+                if (pestMap.get(s) == null) {//未收录的
+                    if (!pestMap.containsValue(s)) {//名字确实不存在的
+                        IotPest iotPest = new IotPest();
+                        iotPest.setPestBid(iotPest.getUUId());
+                        iotPest.setPestName(s);
+                        iotPest.setPestId(iotPest.getPestBid());//新产生的iotpest, pest id和pest bid一样
+                        iotPest.setPestCreator(SecurityUtils.getUserId());
+                        iotPest.setPestCreatedDate(DateUtils.dateTimeNow());
+                        iotPest.setPestDelstatus("0");
+                        iotPest.setPestInsertType("2");
+                        iotPest.setCId(CustomerIdUtil.getCustomerId());
+                        iotPestService.insertIotPest(iotPest);//新害虫名称入库
+
+                        //pestMap.put(iotPest.getPestId(), iotPest.getPestBid());
+                        pestMap.put(iotPest.getPestId(), iotPest.getPestName());
+                        pestMap2.put(iotPest.getPestBid(), iotPest.getPestName());
+
+                        JSONObject point2 = new JSONObject();
+                        point2.put(iotPest.getPestId(), point.get(s));
+                        points2.add(point2);
+                        points2.remove(point);
+
+                        //pest.put(iotPest.getPestId(), pest.get(s) == null ? 1 : pest.get(s) + 1);
+                        pest.put(iotPest.getPestId(), pest.get(iotPest.getPestId()) == null ? 1 : pest.get(iotPest.getPestId()) + 1);
+                    } else {
+                        //名字-》pestid
+                        String findPestId = "";
+                        for (Map.Entry<String, String> entry : pestMap.entrySet()) {
+                            if (s.equals(entry.getValue())) {
+                                findPestId = entry.getKey();
+                                break;
+                            }
+                        }
+                        pest.put(findPestId, pest.get(findPestId) == null ? 1 : pest.get(findPestId) + 1);
+                    }
+                } else {
+                    pest.put(s, pest.get(s) == null ? 1 : pest.get(s) + 1);
+                }
+
+            }
+        }
+
+        //IotPestrecog进行存储
+        String province = iotDevice.getDevProvince();
+        String city = iotDevice.getDevCity();
+        String district = iotDevice.getDevDistrict();
+        BigDecimal lat = iotDevice.getDevLatalign() == null ? iotDevice.getDevLat() : iotDevice.getDevLatalign();
+        BigDecimal lng = iotDevice.getDevLngalign() == null ? iotDevice.getDevLng() : iotDevice.getDevLngalign();
+
+        JSONObject weatherInfo = iotWeatherService.getWeatherByAddress(province, city, district);
+        BigDecimal at = BigDecimal.valueOf(Long.parseLong("0"));
+        BigDecimal ah = BigDecimal.valueOf(Long.parseLong("0"));
+        if (weatherInfo != null) {
+            at = BigDecimal.valueOf(Double.parseDouble((String) weatherInfo.getOrDefault("tem", "0")));
+            ah = BigDecimal.valueOf(Double.parseDouble(((String) weatherInfo.getOrDefault("humidity", "0")).replace("%", "")));
+        }
+
+        List<IotPestrecog> iotPestrecogList = new ArrayList<>();
+        long recogNum = 0L;
+        for (String s : pest.keySet()) {
+            long pestNum = pest.get(s).longValue();
+            recogNum += pestNum;
+
+            IotPestrecog iotPestrecog = new IotPestrecog();
+            iotPestrecog.setCId(iotDevice.getTid());
+            iotPestrecog.setPestrecogBid(iotPestrecog.getUUId());
+            iotPestrecog.setDevBid(iotDevice.getDevBid());
+            iotPestrecog.setDevtypeBid(iotDevice.getDevtypeBid());
+            iotPestrecog.setPestrecogAt(at);
+            iotPestrecog.setPestrecogAh(ah);
+            iotPestrecog.setPestrecogLng(lng);
+            iotPestrecog.setPestrecogLat(lat);
+            iotPestrecog.setPestrecogProvince(province);
+            iotPestrecog.setPestrecogCity(city);
+            iotPestrecog.setPestrecogDistrict(district);
+            //iotPestrecog.setPestBusid(pestMap.get(s));
+            iotPestrecog.setPestBusid(pestMap2.get(s));//这里按设计要存放pest bid
+            iotPestrecog.setPestrecogNum(pest.get(s).longValue());
+            iotPestrecog.setPestrecogMarktype(cbdrecogMarktype);
+            iotPestrecog.setPestrecogCreatedDate(iotCbdrecog.getCbdrecogCreatedDate());
+
+            iotPestrecogList.add(iotPestrecog);
+        }
+
+        iotCbdrecog.setCbdimgRecognum(recogNum);
+
+        Map<String, String> cbdpestMap = new HashMap<>();
+        cbdpestMap.put("cbdrecogBid", iotCbdrecog.getCbdrecogBid());
+        List<IotCbdpest> cbdpestList = mongoService.findAll(IotCbdpest.class, cbdpestMap);
+        Set<String> pestrecogBidSet = new HashSet<>();
+        Set<String> cbdpestBidSet = new HashSet<>();
+        for (IotCbdpest cbdpest : cbdpestList) {
+            pestrecogBidSet.add(cbdpest.getPestrecogBid());
+            cbdpestBidSet.add(cbdpest.getCbdpestBid());
+        }
+        List<String> pestrecogBidList = new ArrayList<>(pestrecogBidSet);
+        List<String> cbdpestBidList = new ArrayList<>(cbdpestBidSet);
+
+        if (pestrecogBidList.size() > 0) {
+            mongoService.removeAllByBatch("pestrecogBid", pestrecogBidList, "IotCbdpest");
+        }
+        if (cbdpestBidList.size() > 0) {
+            mongoService.removeAllByBatch("cbdpestBid", cbdpestBidList, "IotCbdpest");
+        }
+
+        //针对人工识别,设置cbdrecogResultManual和cbdrecogManualmark
+        String cbdrecogResultManual = "";
+        //遍历pest,拼接成字符串
+        for (String s : pest.keySet()) {
+            cbdrecogResultManual += s + "," + pest.get(s).longValue() + "#";
+        }
+        if (cbdrecogResultManual.endsWith("#")) {
+            cbdrecogResultManual = cbdrecogResultManual.substring(0, cbdrecogResultManual.length() - 1);
+        }
+
+        iotCbdrecog.setCbdrecogResultManual(cbdrecogResultManual);
+
+        iotCbdrecog.setCbdrecogManualmark(JSONUtils.toJSONString(points2));
+
+        if (isUpdate) {
+            Map<String, Object> updateField = JSONUtils.toMap(JSONUtils.toJSONString(iotCbdrecog));
+            updateField.remove("id");
+            updateField.remove("uuid");
+
+            Criteria criteria = new Criteria();
+            criteria.and("cbdrecogBid").is(iotCbdrecog.getCbdrecogBid());
+            Query updateQuery = new Query(criteria);
+            mongoService.updateOrCreate(IotCbdrecog.class, updateQuery, updateField);
+        } else {
+            mongoService.saveOne(iotCbdrecog);
+        }
+
+        for (IotPestrecog iotPestrecog : iotPestrecogList) {
+            mongoService.saveOne(iotPestrecog);
+
+            // 保存 测报灯图片识别和虫情信息关联信息
+            IotCbdpest iotCbdpest = new IotCbdpest();
+            iotCbdpest.setCId(iotDevice.getTid());
+            iotCbdpest.setCbdpestBid(iotCbdpest.getUUId());
+            iotCbdpest.setPestrecogBid(iotPestrecog.getPestrecogBid());
+            iotCbdpest.setCbdrecogBid(iotCbdrecog.getCbdrecogBid());
+            mongoService.saveOne(iotCbdpest);
+        }
+        return 1;
+    }
+
+    @Override
+    public int artificialReset(IotCbdrecogReqVo reqVo) {
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdrecogMarktype = "0";
+        String cbdimgBid = reqVo.getCbdimgBid();
+
+        Criteria cri = Criteria.where("cbdimgBid").is(cbdimgBid)
+                .and("cbdrecogType").is(cbdrecogType)
+                .and("cbdrecogMarktype").is(cbdrecogMarktype);
+        IotCbdrecog iotCbdrecog = mongoTemplate.findOne(new Query(cri),
+                IotCbdrecog.class, "IotCbdrecog");
+
+        if (iotCbdrecog == null) {
+            return 1;
+        }
+        Map<String, String> cbdpestMap = new HashMap<>();
+        cbdpestMap.put("cbdrecogBid", iotCbdrecog.getCbdrecogBid());
+        List<IotCbdpest> cbdpestList = mongoService.findAll(IotCbdpest.class, cbdpestMap);
+        Set<String> pestrecogBidSet = new HashSet<>();
+        Set<String> cbdpestBidSet = new HashSet<>();
+        for (IotCbdpest cbdpest : cbdpestList) {
+            pestrecogBidSet.add(cbdpest.getPestrecogBid());
+            cbdpestBidSet.add(cbdpest.getCbdpestBid());
+        }
+        List<String> pestrecogBidList = new ArrayList<>(pestrecogBidSet);
+        List<String> cbdpestBidList = new ArrayList<>(cbdpestBidSet);
+
+        if (pestrecogBidList.size() > 0) {
+            mongoService.removeAllByBatch("pestrecogBid", pestrecogBidList, "IotCbdpest");
+        }
+        if (cbdpestBidList.size() > 0) {
+            mongoService.removeAllByBatch("cbdpestBid", cbdpestBidList, "IotCbdpest");
+        }
+        mongoService.removeAllByParam("cbdrecogBid", iotCbdrecog.getCbdrecogBid(), "IotCbdrecog");
+        return 1;
+    }
+
+    /**
+     * @param reqVo
+     * @return
+     */
+    @Override
+    public IotCbdrecogResVo info(IotCbdrecogReqVo reqVo) {
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdrecogMarktype = reqVo.getCbdrecogMarktype();
+        String cbdimgBid = reqVo.getCbdimgBid();
+
+        Criteria cri = Criteria.where("cbdimgBid").is(cbdimgBid)
+                .and("cbdrecogType").is(cbdrecogType)
+                .and("cbdrecogMarktype").is(cbdrecogMarktype);
+        IotCbdrecog iotCbdrecog = mongoTemplate.findOne(new Query(cri),
+                IotCbdrecog.class, "IotCbdrecog");
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("cbdimgBid", cbdimgBid);
+        IotCbdimg iotCbdimg = (IotCbdimg) mongoService.findOne(IotCbdimg.class, map, null, null);
+
+        if (iotCbdrecog == null) {
+            Criteria cri2 = Criteria.where("cbdimgBid").is(cbdimgBid)
+                    .and("cbdrecogType").is(cbdrecogType);
+            iotCbdrecog = mongoTemplate.findOne(new Query(cri2),
+                    IotCbdrecog.class, "IotCbdrecog");
+            if (iotCbdrecog == null) {
+                iotCbdrecog = new IotCbdrecog();
+                iotCbdrecog.setCbdrecogCreatedDate(iotCbdimg.getCbdimgCreatedDate());
+                iotCbdrecog.setCbdimgRecognum(0L);
+            }
+        }
+
+        IotCbdrecogResVo resVo = new IotCbdrecogResVo();
+        BeanUtils.copyProperties(iotCbdrecog, resVo);
+        if (cbdrecogType.equals(EnumCbdRecogType.A.getCode())) {
+            resVo.setCbdimgRecognum(iotCbdimg.getCbdimgRecognum());
+        } else {
+            resVo.setCbdimgRecognum(iotCbdrecog.getCbdimgRecognum());
+        }
+
+        resVo.setCbdimgAddr(iotCbdimg.getCbdimgAddr());
+        resVo.setCbdimgPestnum(iotCbdimg.getCbdimgPestnum());
+
+        return resVo;
+    }
+
+    @Override
+    public List<IotCbdrecogResVo> getCbdImgLimit(List<String> devIds, String startData, String endDate, Integer limitNum) {
+        String startTime = startData;
+        String endTime = endDate;
+
+        // 构建基本查询条件
+        Criteria criteria = new Criteria().and("cbdimgDelstatus").is("0");
+        criteria.and("devBid").in(devIds);
+
+        // 时间查询
+        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+            criteria.andOperator(
+                    Criteria.where("cbdimgCreatedDate").gte(startTime),
+                    Criteria.where("cbdimgCreatedDate").lte(endTime)
+            );
+        } else if (StringUtils.isNotEmpty(startTime)) {
+            criteria.and("cbdimgCreatedDate").gte(startTime);
+        } else if (StringUtils.isNotEmpty(endTime)) {
+            criteria.and("cbdimgCreatedDate").lte(endTime);
+        }
+
+        // 匹配操作
+        AggregationOperation matchOperation = Aggregation.match(criteria);
+
+        // 连接IotCbdrecog
+        AggregationOperation lookupOperationIotCbdrecog = Aggregation.lookup(
+                "IotCbdrecog", "cbdimgBid", "cbdimgBid", "recogs"
+        );
+
+        // 展开recogs数组
+        AggregationOperation unwindOperationRecogs = Aggregation.unwind("recogs");
+
+        // 筛选recogs中特定类型和标记类型的记录
+        Criteria recogCriteria = new Criteria()
+                .and("recogs.cbdrecogMarktype").is("1");
+        AggregationOperation matchRecogOperation = Aggregation.match(recogCriteria);
+
+        // 重新投影字段,以适应IotCbdrecogResVo的结构
+        AggregationOperation projectOperation = Aggregation.project()
+                .and("recogs.cbdrecogBid").as("cbdrecogBid")
+                .and("recogs.cId").as("cId")
+                .and("cbdimgBid").as("cbdimgBid")
+                .and("recogs.cbdrecogType").as("cbdrecogType")
+                .and("recogs.cbdrecogAddr").as("cbdrecogAddr")
+                .and("recogs.cbdrecogManualaddr").as("cbdrecogManualaddr")
+                .and("recogs.cbdrecogResult").as("cbdrecogResult")
+                .and("recogs.cbdrecogMarktype").as("cbdrecogMarktype")
+                .and("recogs.cbdrecogManualmark").as("cbdrecogManualmark")
+                .and("recogs.cbdrecogMachinemark").as("cbdrecogMachinemark")
+                .and("recogs.cbdrecogCreator").as("cbdrecogCreator")
+                .and("recogs.cbdrecogModifier").as("cbdrecogModifier")
+                .and("recogs.cbdrecogModifieddate").as("cbdrecogModifieddate")
+                .and("recogs.cbdrecogCreatedDate").as("cbdrecogCreatedDate")
+                .and("recogs.cbdrecogDelstatus").as("cbdrecogDelstatus")
+                .and("cbdimgAddr").as("cbdimgAddr")
+                .and("cbdimgPestnum").as("cbdimgPestnum")
+                .and("recogs.cbdimgRecognum").as("cbdimgRecognum")
+                //.and("recogs.cbdrecogManualBase64").as("cbdrecogManualBase64")
+                .and("cbdimgCreatedDate").as("cbdimgCreatedDate")
+                .and("cbdimgModifieddate").as("cbdimgModifieddate");
+
+        // 添加排序操作
+        AggregationOperation sortOperation = Aggregation.sort(Sort.by(Sort.Direction.DESC, "cbdimgCreatedDate"));
+        // 添加限制操作
+        AggregationOperation limitOperation = null;
+        if (limitNum != null) {
+            limitOperation = Aggregation.limit(limitNum);
+        }
+        // 创建聚合
+        List<AggregationOperation> aggregationOperations = new ArrayList<>();
+        aggregationOperations.add(matchOperation);
+        aggregationOperations.add(lookupOperationIotCbdrecog);
+        aggregationOperations.add(unwindOperationRecogs);
+        aggregationOperations.add(matchRecogOperation);
+        aggregationOperations.add(projectOperation);
+        aggregationOperations.add(sortOperation);
+        if (limitOperation != null) {
+            aggregationOperations.add(limitOperation);
+        }
+
+        Aggregation aggregation = Aggregation.newAggregation(aggregationOperations);
+
+
+        // 执行聚合并转换结果
+        AggregationResults<IotCbdrecogResVo> results = mongoTemplate.aggregate(aggregation, "IotCbdimg", IotCbdrecogResVo.class);
+        return results.getMappedResults();
+
+
+    }
+
+    /**
+     * @param reqVo
+     * @return
+     */
+    @Override
+    public IotCbdrecogResVo againRecog(IotCbdrecogAgainReqVo reqVo) {
+        String cbdrecogType = reqVo.getCbdrecogType();
+        String cbdimgBid = reqVo.getCbdimgBid();
+        String devBid = reqVo.getDevBid();
+
+        if (EnumCbdRecogType.findEnumByCode(cbdrecogType) == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(), "识别类型错误");
+        }
+
+        IotDevice iotDevice = iotDeviceService.selectIotDeviceByDevBid(devBid);
+        if (iotDevice == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(), "设备不存在");
+        }
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("cbdimgBid", cbdimgBid);
+        IotCbdimg iotCbdimg = (IotCbdimg) mongoService.findOne(IotCbdimg.class, map, null, null);
+        if (iotCbdimg == null) {
+            throw new IotBizException(ErrorCode.FAILURE.getCode(), "图片不存在");
+        }
+        iotsMqProviderService.sendBaseDataToIots(IotActionEnums.DEVICE_CBD_AGAIN_RECORD,reqVo,"测报灯重新识别");
+        //Object recogResult = iotmMqService.sendMsgAndReceive("againRecog", IotMqConstant.CBD_IMAGE_AGAIN_RECOGE, reqVo);
+        IotCbdrecogReqVo iotCbdrecogReqVo = new IotCbdrecogReqVo();
+        iotCbdrecogReqVo.setCbdimgBid(reqVo.getCbdimgBid());
+        iotCbdrecogReqVo.setCbdrecogMarktype("1");
+        iotCbdrecogReqVo.setCbdrecogType(reqVo.getCbdrecogType());
+        return info(iotCbdrecogReqVo);
+    }
+
+    public String getPestRecogImgOssUrl(String base64, String imgId) {
+        if (base64.contains(",")) {
+            base64 = base64.split(",")[1];
+        }
+        byte[] bytesFile = Base64.decode(base64);
+        return OSSFactory.build().uploadSuffix(bytesFile, "jpg", ResConstants.BizType.CBD_RECOGNITION_MARKERS_AI.getPath(), imgId);
+    }
+}

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

@@ -0,0 +1,172 @@
+package com.yunfeiyun.agmp.iotm.device.pest.service.impl;
+
+import com.yunfeiyun.agmp.common.enums.RedisCacheKey;
+import com.yunfeiyun.agmp.common.framework.manager.RedisCacheManager;
+import com.yunfeiyun.agmp.iot.common.domain.IotPest;
+import com.yunfeiyun.agmp.iot.common.domain.resvo.IoPestResVo;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IIotPestService;
+import com.yunfeiyun.agmp.iotm.device.pest.service.IotPestMapper;
+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 IotPestServiceImpl implements IIotPestService
+{
+    @Autowired
+    private IotPestMapper iotPestMapper;
+    @Resource
+    private RedisCacheManager redisCacheManager;
+
+    /**
+     * 查询害虫信息
+     *
+     * @param pestBid 害虫信息主键
+     * @return 害虫信息
+     */
+    @Override
+    public IotPest selectIotPestByPestBid(String pestBid)
+    {
+        return iotPestMapper.selectIotPestByPestBid(pestBid);
+    }
+
+    /**
+     * @param pestBidList
+     * @return
+     */
+    @Override
+    public List<IotPest> selectIotPestListBatchByBid(List<String> pestBidList) {
+        return iotPestMapper.selectIotPestListBatchByBid(pestBidList);
+    }
+
+    @Override
+    public IotPest selectIotPestByPestId(String pestId) {
+        return iotPestMapper.selectIotPestByPestId(pestId);
+    }
+
+    /**
+     * 查询害虫信息列表
+     *
+     * @param iotPest 害虫信息
+     * @return 害虫信息
+     */
+    @Override
+    public List<IotPest> selectIotPestList(IotPest iotPest)
+    {
+        return iotPestMapper.selectIotPestList(iotPest);
+    }
+
+    @Override
+    public Map<String, IotPest> selectIotPestMapAllInfo() {
+//        Map<String,String> map = redisCacheManager.getCacheMap(RedisCacheKey.IOT_PEST,"all");
+//        if(map.size()==0){
+//            List<IotPest> iotPestList = selectIotPestList(null);
+//            map = iotPestList.stream().collect(Collectors.toMap(IotPest::getPestId,IotPest::getPestName));
+//            redisCacheManager.setCacheMap(RedisCacheKey.IOT_PEST,"all",map);
+//        }
+
+        List<IotPest> iotPestList = selectIotPestList(null);
+        Map<String, IotPest> map = iotPestList.stream().collect(Collectors.toMap(IotPest::getPestBid, obj -> obj, (a, b) -> a));
+        return map;
+    }
+
+    @Override
+    public Map<String, IotPest> selectIotPestMapAllInfo2() {
+//        Map<String,String> map = redisCacheManager.getCacheMap(RedisCacheKey.IOT_PEST,"all");
+//        if(map.size()==0){
+//            List<IotPest> iotPestList = selectIotPestList(null);
+//            map = iotPestList.stream().collect(Collectors.toMap(IotPest::getPestId,IotPest::getPestName));
+//            redisCacheManager.setCacheMap(RedisCacheKey.IOT_PEST,"all",map);
+//        }
+
+        List<IotPest> iotPestList = selectIotPestList(null);
+        Map<String, IotPest> map = iotPestList.stream().collect(Collectors.toMap(IotPest::getPestId, obj -> obj, (a, b) -> a));
+        return map;
+    }
+
+    @Override
+    public Map<String, String> selectIotPestMapAll() {
+        Map<String,String> map = redisCacheManager.getCacheMap(RedisCacheKey.IOT_PEST,"all");
+        if(map.size()==0){
+            List<IotPest> iotPestList = selectIotPestList(null);
+            map = iotPestList.stream().collect(Collectors.toMap(IotPest::getPestId,IotPest::getPestName));
+            redisCacheManager.setCacheMap(RedisCacheKey.IOT_PEST,"all",map);
+        }
+        return map;
+    }
+
+    /**
+     * 新增害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    @Override
+    public int insertIotPest(IotPest iotPest)
+    {
+        return iotPestMapper.insertIotPest(iotPest);
+    }
+
+    /**
+     * 修改害虫信息
+     *
+     * @param iotPest 害虫信息
+     * @return 结果
+     */
+    @Override
+    public int updateIotPest(IotPest iotPest)
+    {
+        return iotPestMapper.updateIotPest(iotPest);
+    }
+
+    /**
+     * 批量删除害虫信息
+     *
+     * @param ids 需要删除的害虫信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIotPestByIds(Long[] ids)
+    {
+        return iotPestMapper.deleteIotPestByIds(ids);
+    }
+
+    /**
+     * 删除害虫信息信息
+     *
+     * @param id 害虫信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIotPestById(Long id)
+    {
+        return iotPestMapper.deleteIotPestById(id);
+    }
+
+    @Override
+    public IoPestResVo selectIotPestDetailByPestBid(String pestBid) {
+
+        return iotPestMapper.selectIotPestDetailByPestBid(pestBid);
+    }
+
+    @Override
+    public String selectIotPestCropsByCalarmId(String calarmId) {
+        return iotPestMapper.selectIotPestCropsByCalarmId(calarmId);
+    }
+
+    @Override
+    public IotPest selectIotPestByPestName(IotPest iotPest) {
+        return iotPestMapper.selectIotPestByPestName(iotPest);
+    }
+}

+ 69 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/mapper/IotDeviceconfigMapper.java

@@ -0,0 +1,69 @@
+package com.yunfeiyun.agmp.iotm.web.mapper;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig;
+
+import java.util.List;
+
+/**
+ * 设备配置Mapper接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IotDeviceconfigMapper
+{
+    /**
+     * 查询设备配置
+     *
+     * @param id 设备配置主键
+     * @return 设备配置
+     */
+    public IotDeviceconfig selectIotDeviceconfigById(Long id);
+
+    /**
+     * 查询设备配置列表
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 设备配置集合
+     */
+    public List<IotDeviceconfig> selectIotDeviceconfigList(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 新增设备配置
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 结果
+     */
+    public int insertIotDeviceconfig(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 修改设备配置
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 结果
+     */
+    public int updateIotDeviceconfig(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 删除设备配置
+     *
+     * @param id 设备配置主键
+     * @return 结果
+     */
+    public int deleteIotDeviceconfigById(Long id);
+
+    /**
+     * 批量删除设备配置
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteIotDeviceconfigByIds(Long[] ids);
+
+    IotDeviceconfig selectIotDeviceconfigByDevcfgBid(String cdbdataBid);
+
+    IotDeviceconfig selectIotDeviceConfigByDevBid(String devBid);
+
+    List<IotDeviceconfig> selectIotDeviceConfigByDevBidList(List<String> devBidList);
+}

+ 96 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/service/IIotDeviceconfigService.java

@@ -0,0 +1,96 @@
+package com.yunfeiyun.agmp.iotm.web.service;
+
+
+import com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig;
+import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 设备配置Service接口
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+public interface IIotDeviceconfigService {
+    /**
+     * 查询设备配置
+     *
+     * @param id 设备配置主键
+     * @return 设备配置
+     */
+    public IotDeviceconfig selectIotDeviceconfigById(Long id);
+
+    /**
+     * 查询设备配置列表
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 设备配置集合
+     */
+    public List<IotDeviceconfig> selectIotDeviceconfigList(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 新增设备配置
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 结果
+     */
+    public int insertIotDeviceconfig(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 修改设备配置
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 结果
+     */
+    public int updateIotDeviceconfig(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 批量删除设备配置
+     *
+     * @param ids 需要删除的设备配置主键集合
+     * @return 结果
+     */
+    public int deleteIotDeviceconfigByIds(Long[] ids);
+
+    /**
+     * 删除设备配置信息
+     *
+     * @param id 设备配置主键
+     * @return 结果
+     */
+    public int deleteIotDeviceconfigById(Long id);
+
+    IotDeviceconfig selectIotDeviceconfigByDevcfgBid(String cdbdataBid);
+
+    IotDeviceconfig selectIotDeviceConfigByDevBid(String devBid);
+
+    /**
+     * 生成测报灯设备配置编辑指令
+     */
+    public CmdGroupModel createConfigCmd(IotDeviceconfig iotDeviceconfig);
+
+    CmdGroupModel createTakePhotoCmd(IotDeviceconfig iotDeviceconfig);
+
+    List<IotDeviceconfig> selectIotDeviceConfigByDevBidList(List<String> devBidList);
+
+    Map<String, IotDeviceconfig> selectIotDeviceConfigMapByDevBidList(List<String> devBidList);
+
+    public CmdGroupModel createRefreshCmd(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 构造一个 “通用配置指令集”执行任务,提交IOTS执行
+     *
+     * @param iotDeviceconfig
+     */
+    void sendConfig(IotDeviceconfig iotDeviceconfig);
+
+    /**
+     * 将获取的设备配置格式化为同一格式
+     *
+     * @param devId
+     * @return
+     */
+    Map<String, Object> formatConfigContent(String devId);
+}

+ 6 - 2
src/main/java/com/yunfeiyun/agmp/iotm/web/service/impl/IotCmdtaskServiceImpl.java

@@ -107,7 +107,7 @@ public class IotCmdtaskServiceImpl implements IIotCmdtaskService {
         log.info("【处理指令集】1{}", cmdGroupModel);
         // 根据CmdGroupModel创建task任务
         IotCmdtask iotCmdtask = new IotCmdtask();
-        iotCmdtask.setCId(CustomerIdUtil.getCustomerId());
+        iotCmdtask.setCId(cmdGroupModel.getCId());
         iotCmdtask.setCtBid(iotCmdtask.getUUId());
         iotCmdtask.setCtStatus(CmdgroupStatus.CM_STATUS_RUNNING.getCode());
         iotCmdtask.setCtStartddate(DateUtils.dateTimeNow());
@@ -120,7 +120,11 @@ public class IotCmdtaskServiceImpl implements IIotCmdtaskService {
         iotCmdtask.setCtReceiptaddr(cmdGroupModel.getReceiptAddr());
         cmdGroupModel.setTaskUuid(iotCmdtask.getCtBid());
         // 补充新的参数
-        iotCmdtask.setCtCreatorname(SecurityUtils.getUsername());
+        try{
+            iotCmdtask.setCtCreatorname(SecurityUtils.getUsername());
+        }catch (Exception e){
+            iotCmdtask.setCtCreatorname("system");
+        }
         iotCmdtask.setCtDevcode(cmdGroupModel.getDevCode());
         iotCmdtask.setCtBiztitle(cmdGroupModel.getCtBiztitle());
         iotCmdtask.setCtBiztype(cmdGroupModel.getCtBiztype());

+ 255 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/service/impl/IotDeviceconfigServiceImpl.java

@@ -0,0 +1,255 @@
+package com.yunfeiyun.agmp.iotm.web.service.impl;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+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.uuid.IdUtils;
+import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceTypeLv1Enum;
+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.iot.common.model.cmd.CmdModel;
+import com.yunfeiyun.agmp.iot.common.service.TypeCoreService;
+import com.yunfeiyun.agmp.iotm.web.mapper.IotDeviceconfigMapper;
+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.stereotype.Service;
+
+import java.util.*;
+
+
+/**
+ * 设备配置Service业务层处理
+ *
+ * @author 杨晓辉
+ * @date 2024-01-04
+ */
+@Slf4j
+@Service
+public class IotDeviceconfigServiceImpl implements IIotDeviceconfigService {
+    public final static String TAG = "IOTM-设备配置服务";
+
+
+    @Autowired
+    private IotDeviceconfigMapper iotDeviceconfigMapper;
+
+    @Autowired
+    private IIotCmdtaskService iotCmdtaskService;
+    @Autowired
+    private IIotDeviceService iIotDeviceService;
+    @Autowired
+    private TypeCoreService typeCoreService;
+
+    /**
+     * 查询设备配置
+     *
+     * @param id 设备配置主键
+     * @return 设备配置
+     */
+    @Override
+    public IotDeviceconfig selectIotDeviceconfigById(Long id) {
+        return iotDeviceconfigMapper.selectIotDeviceconfigById(id);
+    }
+
+    /**
+     * 查询设备配置列表
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 设备配置
+     */
+    @Override
+    public List<IotDeviceconfig> selectIotDeviceconfigList(IotDeviceconfig iotDeviceconfig) {
+        return iotDeviceconfigMapper.selectIotDeviceconfigList(iotDeviceconfig);
+    }
+
+    /**
+     * 新增设备配置
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 结果
+     */
+    @Override
+    public int insertIotDeviceconfig(IotDeviceconfig iotDeviceconfig) {
+        return iotDeviceconfigMapper.insertIotDeviceconfig(iotDeviceconfig);
+    }
+
+    /**
+     * 修改设备配置
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return 结果
+     */
+    @Override
+    public int updateIotDeviceconfig(IotDeviceconfig iotDeviceconfig) {
+        return iotDeviceconfigMapper.updateIotDeviceconfig(iotDeviceconfig);
+    }
+
+    /**
+     * 构造一个 “通用配置指令集”执行任务,提交IOTS执行
+     *
+     * @param iotDeviceconfig 设备配置
+     * @return
+     */
+    @Override
+    public void sendConfig(IotDeviceconfig iotDeviceconfig) {
+        IotDevice iotDevice = iIotDeviceService.selectIotDeviceByDevBid(iotDeviceconfig.getDevBid());
+
+        //目前把“设备发送配置”统一定义为指令config,参数全部放入一个json
+        CmdGroupModel cmdGroupModel = createConfigCmd(iotDeviceconfig);
+        log.info("【{}】【" + TAG + "】【构建 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(iotDeviceconfig));
+        cmdGroupModel.setCtParam(JSONUtils.toJSONString(iotDeviceconfig));
+
+        iotCmdtaskService.handInternalCmd(cmdGroupModel);
+    }
+
+    /**
+     * 将获取的设备配置格式化为同一格式
+     * @param content
+     * @return
+     */
+    @Override
+    public Map<String, Object> formatConfigContent(String content) {
+
+        Map<String, Object> statusMap = new HashMap<>();
+        if (StringUtils.isEmpty(content)) {
+            return statusMap;
+        }
+        // 赵赫的单独解析
+        if (content.contains("mottab") && content.contains("ctrtab") && content.contains("pumptab")) {
+            JSONObject devcfg = JSONObject.parseObject(content);
+            String[] keyArray = {"ctrtab", "pumptab"};
+            for (String key : keyArray) {
+                JSONArray dataArray = devcfg.getJSONArray(key);
+                for (Object v : dataArray) {
+                    JSONObject o = JSONObject.parseObject(JSONUtils.toJSONString(v));
+                    String ctrlType = o.getString("type");
+                    if (ctrlType.equals("阀门") || ctrlType.equals("水泵") || ctrlType.equals("施肥泵")) {
+                        String ctrlKey = o.getString("nodeaddr") + "-" + o.getString("subaddr");
+                        String statusName = o.getString("status");
+                        String statusCode = StringUtils.isEmpty(statusName) ? "0" : "打开".equals(statusName) ? "1" : "0";
+                        statusMap.put(ctrlKey, statusCode);
+                    }
+                }
+            }
+        } else {
+            statusMap = JSONUtils.toMap(content);
+        }
+        return statusMap;
+    }
+
+    /**
+     * 批量删除设备配置
+     *
+     * @param ids 需要删除的设备配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIotDeviceconfigByIds(Long[] ids) {
+        return iotDeviceconfigMapper.deleteIotDeviceconfigByIds(ids);
+    }
+
+    /**
+     * 删除设备配置信息
+     *
+     * @param id 设备配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteIotDeviceconfigById(Long id) {
+        return iotDeviceconfigMapper.deleteIotDeviceconfigById(id);
+    }
+
+    @Override
+    public IotDeviceconfig selectIotDeviceconfigByDevcfgBid(String cdbdataBid) {
+        return iotDeviceconfigMapper.selectIotDeviceconfigByDevcfgBid(cdbdataBid);
+    }
+
+    @Override
+    public IotDeviceconfig selectIotDeviceConfigByDevBid(String devBid) {
+        return iotDeviceconfigMapper.selectIotDeviceConfigByDevBid(devBid);
+    }
+
+    @Override
+    public CmdGroupModel createConfigCmd(IotDeviceconfig iotDeviceconfig) {
+        return createCmd(iotDeviceconfig, "config");
+    }
+
+    @Override
+    public CmdGroupModel createRefreshCmd(IotDeviceconfig iotDeviceconfig) {
+        return createCmd(iotDeviceconfig, "refresh");
+    }
+
+    public CmdGroupModel createCmd(IotDeviceconfig iotDeviceconfig, String func) {
+        CmdGroupModel cmdGroupModel = new CmdGroupModel();
+        cmdGroupModel.setCId(iotDeviceconfig.getCId());
+        cmdGroupModel.setCmdModels(new LinkedList<>());
+        CmdModel cmdModel = new CmdModel();
+        cmdModel.setDeviceId(iotDeviceconfig.getDevBid());
+        CmdModel.Cmd cmd = new CmdModel.Cmd();
+        cmd.setFunc(func);
+        cmd.setJsons(JSONUtils.toObject(iotDeviceconfig.getDevcfgContext(), JSONObject.class));
+        cmd.setRetry(5L);
+        cmdModel.setFinalStatus(false);
+        cmdModel.setTimeout(10);
+        cmdModel.setNeedcheckStatus(false);
+        cmdModel.setCmdDistribution(cmd);
+        cmdGroupModel.getCmdModels().add(Collections.singletonList(cmdModel));
+        return cmdGroupModel;
+    }
+
+    @Override
+    public CmdGroupModel createTakePhotoCmd(IotDeviceconfig iotDeviceconfig) {
+        CmdGroupModel cmdGroupModel = new CmdGroupModel();
+        cmdGroupModel.setCId(iotDeviceconfig.getCId());
+        cmdGroupModel.setCmdModels(new LinkedList<>());
+        CmdModel cmdModel = new CmdModel();
+        cmdModel.setDeviceId(iotDeviceconfig.getDevBid());
+        CmdModel.Cmd cmd = new CmdModel.Cmd();
+        cmd.setFunc("takephoto");
+        cmd.setRetry(5L);
+        cmdModel.setFinalStatus(false);
+        cmdModel.setTimeout(10);
+        cmdModel.setNeedcheckStatus(false);
+        cmdModel.setCmdDistribution(cmd);
+        cmdGroupModel.getCmdModels().add(Collections.singletonList(cmdModel));
+        return cmdGroupModel;
+    }
+
+    /**
+     * @param devBidList
+     * @return
+     */
+    @Override
+    public List<IotDeviceconfig> selectIotDeviceConfigByDevBidList(List<String> devBidList) {
+        return iotDeviceconfigMapper.selectIotDeviceConfigByDevBidList(devBidList);
+    }
+
+    /**
+     * @param devBidList
+     * @return
+     */
+    @Override
+    public Map<String, IotDeviceconfig> selectIotDeviceConfigMapByDevBidList(List<String> devBidList) {
+        List<IotDeviceconfig> iotDeviceconfigList = selectIotDeviceConfigByDevBidList(devBidList);
+        Map<String, IotDeviceconfig> iotDeviceconfigMap = new HashMap<>();
+        for (IotDeviceconfig iotDeviceconfig : iotDeviceconfigList) {
+            iotDeviceconfigMap.put(iotDeviceconfig.getDevBid(), iotDeviceconfig);
+        }
+        return iotDeviceconfigMap;
+    }
+
+
+}

+ 124 - 0
src/main/resources/mapper/IotDeviceconfigMapper.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yunfeiyun.agmp.iotm.web.mapper.IotDeviceconfigMapper">
+
+    <resultMap type="IotDeviceconfig" id="IotDeviceconfigResult">
+        <result property="id"    column="id"    />
+        <result property="devcfgBid"    column="devcfgBid"    />
+        <result property="cId"    column="cId"    />
+        <result property="devBid"    column="devBid"    />
+        <result property="devcfgCmd"    column="devcfgCmd"    />
+        <result property="devcfgContext"    column="devcfgContext"    />
+        <result property="devcfgCreator"    column="devcfgCreator"    />
+        <result property="devcfgModifier"    column="devcfgModifier"    />
+        <result property="devcfgModifieddate"    column="devcfgModifieddate"    />
+        <result property="devcfgCreateddate"    column="devcfgCreateddate"    />
+        <result property="devcfgDelstatus"    column="devcfgDelstatus"    />
+    </resultMap>
+
+    <sql id="selectIotDeviceconfigVo">
+        select id, devcfgBid, cId, devBid, devcfgCmd, devcfgContext, devcfgCreator, devcfgModifier, devcfgModifieddate, devcfgCreateddate, devcfgDelstatus from IotDeviceconfig
+    </sql>
+
+    <select id="selectIotDeviceconfigList" parameterType="IotDeviceconfig" resultMap="IotDeviceconfigResult">
+        <include refid="selectIotDeviceconfigVo"/>
+        <where>
+            <if test="devcfgBid != null  and devcfgBid != ''"> and devcfgBid = #{devcfgBid}</if>
+            <if test="cId != null  and cId != ''"> and cId = #{cId}</if>
+            <if test="devBid != null  and devBid != ''"> and devBid = #{devBid}</if>
+            <if test="devcfgCmd != null  and devcfgCmd != ''"> and devcfgCmd = #{devcfgCmd}</if>
+            <if test="devcfgContext != null  and devcfgContext != ''"> and devcfgContext = #{devcfgContext}</if>
+            <if test="devcfgCreator != null  and devcfgCreator != ''"> and devcfgCreator = #{devcfgCreator}</if>
+            <if test="devcfgModifier != null  and devcfgModifier != ''"> and devcfgModifier = #{devcfgModifier}</if>
+            <if test="devcfgModifieddate != null  and devcfgModifieddate != ''"> and devcfgModifieddate = #{devcfgModifieddate}</if>
+            <if test="devcfgCreateddate != null  and devcfgCreateddate != ''"> and devcfgCreateddate = #{devcfgCreateddate}</if>
+            <if test="devcfgDelstatus != null  and devcfgDelstatus != ''"> and devcfgDelstatus = #{devcfgDelstatus}</if>
+        </where>
+    </select>
+
+    <select id="selectIotDeviceconfigById" parameterType="Long" resultMap="IotDeviceconfigResult">
+        <include refid="selectIotDeviceconfigVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectIotDeviceconfigByDevcfgBid"
+            resultType="com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig">
+        <include refid="selectIotDeviceconfigVo"/>
+        where devcfgBid = #{devcfgBid}
+    </select>
+    <select id="selectIotDeviceConfigByDevBid"
+            resultType="com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig">
+            <include refid="selectIotDeviceconfigVo"/>
+            where devBid = #{devBid}
+    </select>
+
+    <select id="selectIotDeviceConfigByDevBidList" parameterType="java.util.List"
+            resultType="com.yunfeiyun.agmp.iot.common.domain.IotDeviceconfig" >
+        <include refid="selectIotDeviceconfigVo"/>
+        <where>
+            <if test="list != null and list.size() > 0">
+                devBid in
+                <foreach item="devBid" collection="list" open="(" separator="," close=")">
+                    #{devBid}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <insert id="insertIotDeviceconfig" parameterType="IotDeviceconfig" useGeneratedKeys="true" keyProperty="id">
+        insert into IotDeviceconfig
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="devcfgBid != null">devcfgBid,</if>
+            <if test="cId != null">cId,</if>
+            <if test="devBid != null">devBid,</if>
+            <if test="devcfgCmd != null">devcfgCmd,</if>
+            <if test="devcfgContext != null">devcfgContext,</if>
+            <if test="devcfgCreator != null">devcfgCreator,</if>
+            <if test="devcfgModifier != null">devcfgModifier,</if>
+            <if test="devcfgModifieddate != null">devcfgModifieddate,</if>
+            <if test="devcfgCreateddate != null">devcfgCreateddate,</if>
+            <if test="devcfgDelstatus != null">devcfgDelstatus,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="devcfgBid != null">#{devcfgBid},</if>
+            <if test="cId != null">#{cId},</if>
+            <if test="devBid != null">#{devBid},</if>
+            <if test="devcfgCmd != null">#{devcfgCmd},</if>
+            <if test="devcfgContext != null">#{devcfgContext},</if>
+            <if test="devcfgCreator != null">#{devcfgCreator},</if>
+            <if test="devcfgModifier != null">#{devcfgModifier},</if>
+            <if test="devcfgModifieddate != null">#{devcfgModifieddate},</if>
+            <if test="devcfgCreateddate != null">#{devcfgCreateddate},</if>
+            <if test="devcfgDelstatus != null">#{devcfgDelstatus},</if>
+         </trim>
+    </insert>
+
+    <update id="updateIotDeviceconfig" parameterType="IotDeviceconfig">
+        update IotDeviceconfig
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="devcfgBid != null">devcfgBid = #{devcfgBid},</if>
+            <if test="cId != null">cId = #{cId},</if>
+            <if test="devBid != null">devBid = #{devBid},</if>
+            <if test="devcfgCmd != null">devcfgCmd = #{devcfgCmd},</if>
+            <if test="devcfgContext != null">devcfgContext = #{devcfgContext},</if>
+            <if test="devcfgCreator != null">devcfgCreator = #{devcfgCreator},</if>
+            <if test="devcfgModifier != null">devcfgModifier = #{devcfgModifier},</if>
+            <if test="devcfgModifieddate != null">devcfgModifieddate = #{devcfgModifieddate},</if>
+            <if test="devcfgCreateddate != null">devcfgCreateddate = #{devcfgCreateddate},</if>
+            <if test="devcfgDelstatus != null">devcfgDelstatus = #{devcfgDelstatus},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteIotDeviceconfigById" parameterType="Long">
+        delete from IotDeviceconfig where id = #{id}
+    </delete>
+
+    <delete id="deleteIotDeviceconfigByIds" parameterType="String">
+        delete from IotDeviceconfig where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

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

@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yunfeiyun.agmp.iotm.device.pest.service.IotPestMapper">
+
+    <resultMap type="IotPest" id="IotPestResult">
+        <result property="id" column="id"/>
+        <result property="pestBid" column="pestBid"/>
+        <result property="cId" column="cId"/>
+        <result property="pestName" column="pestName"/>
+        <result property="pestId" column="pestId"/>
+        <result property="pestRemark" column="pestRemark"/>
+        <result property="pestCreator" column="pestCreator"/>
+        <result property="pestModifier" column="pestModifier"/>
+        <result property="pestModifieddate" column="pestModifieddate"/>
+        <result property="pestCreatedDate" column="pestCreatedDate"/>
+        <result property="pestDelstatus" column="pestDelstatus"/>
+        <result property="pestInsertType" column="pestInsertType"/>
+    </resultMap>
+
+    <sql id="selectIotPestVo">
+        select id, pestBid, cId, pestName, pestId, pestRemark, pestCreator, pestModifier, pestModifieddate, pestCreatedDate, pestDelstatus, pestInsertType from IotPest
+    </sql>
+
+    <select id="selectIotPestList" parameterType="IotPest" resultMap="IotPestResult">
+        <include refid="selectIotPestVo"/>
+        <where>
+            pestDelstatus = 0
+            <if test="pestBid != null  and pestBid != ''">and pestBid = #{pestBid}</if>
+            <if test="cId != null  and cId != ''">and cId = #{cId}</if>
+            <if test="pestName != null  and pestName != ''">and pestName like concat('%', #{pestName}, '%')</if>
+            <if test="pestId != null  and pestId != ''">and pestId = #{pestId}</if>
+            <if test="pestInsertType != null  and pestInsertType != ''">and pestInsertType = #{pestInsertType}</if>
+            <if test="pestRemark != null  and pestRemark != ''">and pestRemark like concat('%', #{pestRemark}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectIotPestByPestBid" parameterType="String" resultMap="IotPestResult">
+        <include refid="selectIotPestVo"/>
+        where pestBid = #{pestBid}
+    </select>
+
+    <select id="selectIotPestByPestId" parameterType="String" resultMap="IotPestResult">
+        <include refid="selectIotPestVo"/>
+        where pestId = #{pestId}
+    </select>
+
+    <select id="selectIotPestListBatchByBid" parameterType="java.util.List" resultMap="IotPestResult">
+        <include refid="selectIotPestVo"/>
+        where pestDelstatus = '0' and pestBid in
+        <foreach item="pestBid" collection="list" open="(" separator="," close=")">
+            #{pestBid}
+        </foreach>
+    </select>
+    <select id="selectIotPestDetailByPestBid"
+            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 pestBid=#{pestBid}
+) a LEFT JOIN FmsCalarm b on  calarmName = a.pestName  limit 0,1
+
+    </select>
+    <select id="selectIotPestCropsByCalarmId" resultType="java.lang.String">
+        SELECT group_concat(cropName) crops  from FmsCropcalarm where    calarmId=#{calarmId} GROUP BY calarmId
+    </select>
+    <select id="selectIotPestByPestName" resultType="com.yunfeiyun.agmp.iot.common.domain.IotPest">
+        <include refid="selectIotPestVo"/>
+        <where>
+            pestDelstatus = 0
+            <if test="pestBid != null  and pestBid != ''">and pestBid = #{pestBid}</if>
+            <if test="cId != null  and cId != ''">and cId = #{cId}</if>
+            <if test="pestName != null  and pestName != ''">and pestName like concat('%', #{pestName}, '%')</if>
+            <if test="pestId != null  and pestId != ''">and pestId = #{pestId}</if>
+            <if test="pestRemark != null  and pestRemark != ''">and pestRemark like concat('%', #{pestRemark}, '%')</if>
+        </where>
+        limit 1
+    </select>
+
+    <insert id="insertIotPest" parameterType="IotPest" useGeneratedKeys="true" keyProperty="id">
+        insert into IotPest
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="pestBid != null and pestBid != ''">pestBid,</if>
+            <if test="cId != null">cId,</if>
+            <if test="pestName != null">pestName,</if>
+            <if test="pestId != null">pestId,</if>
+            <if test="pestRemark != null">pestRemark,</if>
+            <if test="pestCreator != null">pestCreator,</if>
+            <if test="pestModifier != null">pestModifier,</if>
+            <if test="pestModifieddate != null">pestModifieddate,</if>
+            <if test="pestCreatedDate != null">pestCreatedDate,</if>
+            <if test="pestDelstatus != null">pestDelstatus,</if>
+            <if test="pestInsertType != null">pestInsertType,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="pestBid != null and pestBid != ''">#{pestBid},</if>
+            <if test="cId != null">#{cId},</if>
+            <if test="pestName != null">#{pestName},</if>
+            <if test="pestId != null">#{pestId},</if>
+            <if test="pestRemark != null">#{pestRemark},</if>
+            <if test="pestCreator != null">#{pestCreator},</if>
+            <if test="pestModifier != null">#{pestModifier},</if>
+            <if test="pestModifieddate != null">#{pestModifieddate},</if>
+            <if test="pestCreatedDate != null">#{pestCreatedDate},</if>
+            <if test="pestDelstatus != null">#{pestDelstatus},</if>
+            <if test="pestInsertType != null">#{pestInsertType},</if>
+        </trim>
+    </insert>
+
+    <update id="updateIotPest" parameterType="IotPest">
+        update IotPest
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="pestBid != null and pestBid != ''">pestBid = #{pestBid},</if>
+            <if test="cId != null">cId = #{cId},</if>
+            <if test="pestName != null">pestName = #{pestName},</if>
+            <if test="pestId != null">pestId = #{pestId},</if>
+            <if test="pestRemark != null">pestRemark = #{pestRemark},</if>
+            <if test="pestCreator != null">pestCreator = #{pestCreator},</if>
+            <if test="pestModifier != null">pestModifier = #{pestModifier},</if>
+            <if test="pestModifieddate != null">pestModifieddate = #{pestModifieddate},</if>
+            <if test="pestCreatedDate != null">pestCreatedDate = #{pestCreatedDate},</if>
+            <if test="pestDelstatus != null">pestDelstatus = #{pestDelstatus},</if>
+            <if test="pestInsertType != null">pestInsertType = #{pestInsertType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+
+    <delete id="deleteIotPestById" parameterType="Long">
+        delete from IotPest where id = #{id}
+    </delete>
+
+    <delete id="deleteIotPestByIds" parameterType="String">
+        delete from IotPest where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>