From fea22e82e7e49691f6e0c20a29b228d0ab3173e9 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期三, 29 十月 2025 17:08:38 +0800
Subject: [PATCH] 修改问题

---
 ycl-server/src/main/java/com/ycl/platform/service/IMonitorConstructionService.java          |   29 +
 ycl-server/src/main/java/com/ycl/platform/service/impl/IMonitorConstructionServiceImpl.java |  142 +++++++
 ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DemeritRecord.java                    |    5 
 ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java                        |    2 
 ycl-pojo/src/main/java/com/ycl/platform/domain/entity/MonitorConstruction.java              |   32 +
 ycl-pojo/src/main/java/com/ycl/platform/domain/dto/MonitorConstructionDTO.java              |   22 +
 ycl-server/src/main/java/com/ycl/platform/controller/MonitorConstructionController.java     |   35 +
 ycl-server/src/main/java/com/ycl/platform/mapper/IMonitorConstructionMapper.java            |   14 
 ycl-pojo/src/main/java/com/ycl/platform/domain/vo/screen/DemeritRecordVO.java               |    6 
 ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java                           |    7 
 ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java             |  356 ++++++++++++-------
 ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java                                |  200 ++++++----
 ycl-server/src/main/resources/mapper/zgyw/IMonitorConstructionMapper.xml                    |   13 
 ycl-server/src/main/resources/mapper/zgyw/DemeritREcordMapper.xml                           |    8 
 ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java           |   28 
 ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java            |   21 
 ycl-server/src/main/java/com/ycl/task/UYTask.java                                           |   11 
 ycl-server/src/main/java/com/ycl/platform/controller/TMonitorController.java                |    2 
 ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml                                |  120 +++++-
 19 files changed, 788 insertions(+), 265 deletions(-)

diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/dto/MonitorConstructionDTO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/dto/MonitorConstructionDTO.java
new file mode 100644
index 0000000..a5a0e1f
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/dto/MonitorConstructionDTO.java
@@ -0,0 +1,22 @@
+package com.ycl.platform.domain.dto;
+
+
+import annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * zgyw
+ *
+ * @author : zxl
+ * @date : 2025-10-20 14:20
+ **/
+@Data
+public class MonitorConstructionDTO {
+    @Excel(name = "璁惧缂栫爜")
+    private String serialNumber;
+
+    @Excel(name = "寤鸿绫诲瀷鏍囩")
+    private String tag;
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DemeritRecord.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DemeritRecord.java
index d327cd0..7107546 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DemeritRecord.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DemeritRecord.java
@@ -8,6 +8,7 @@
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * zgyw
@@ -27,4 +28,8 @@
 
     @TableField("construction_type")
     private String constructionType;
+
+    //褰曞儚璁$畻鐢熸垚鏃堕棿
+    @TableField("record_time")
+    private Date recordTime;
 }
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/MonitorConstruction.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/MonitorConstruction.java
new file mode 100644
index 0000000..eddb219
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/MonitorConstruction.java
@@ -0,0 +1,32 @@
+package com.ycl.platform.domain.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ycl.platform.base.AbsEntity;
+import com.ycl.system.entity.BaseEntity;
+import lombok.Data;
+
+/**
+ * zgyw
+ *
+ * @author : zxl
+ * @date : 2025-10-20 11:37
+ **/
+@Data
+@TableName("t_monitor_construction")
+public class MonitorConstruction extends AbsEntity {
+
+    /**
+     * 璁惧缂栧彿
+     */
+    @TableField(value = "serial_number")
+    private String serialNumber;
+
+    /**
+     * 璁惧鏍囩json瀛楃涓�
+     */
+    @TableField(value = "tag")
+    private String tag;
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java
index 7da59b2..30542eb 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java
@@ -4,6 +4,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ycl.system.entity.BaseEntity;
 import lombok.Data;
+import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -342,4 +343,10 @@
      * 璁惧鍘傚晢锛� 0娴峰悍  1澶у崕  2瀹囪
      */
     private Integer deviceType;
+
+    List<String> ids;
+    /**
+     * 寤鸿绫诲瀷鏍囩
+     */
+    private String tag;
 }
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/screen/DemeritRecordVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/screen/DemeritRecordVO.java
index baa6ab2..b796116 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/screen/DemeritRecordVO.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/screen/DemeritRecordVO.java
@@ -1,9 +1,11 @@
 package com.ycl.platform.domain.vo.screen;
 
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ycl.platform.base.AbsVo;
 import lombok.Data;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * zgyw
@@ -33,4 +35,8 @@
      */
     private BigDecimal demerit;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date recordTime;
+
+
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/controller/MonitorConstructionController.java b/ycl-server/src/main/java/com/ycl/platform/controller/MonitorConstructionController.java
new file mode 100644
index 0000000..47ce7e3
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/controller/MonitorConstructionController.java
@@ -0,0 +1,35 @@
+package com.ycl.platform.controller;
+
+
+import com.ycl.platform.service.IMonitorConstructionService;
+import com.ycl.system.Result;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * zgyw
+ *
+ * @author : zxl
+ * @date : 2025-10-20 13:55
+ **/
+@RestController
+@RequestMapping("/monitorConstruction")
+@RequiredArgsConstructor
+public class MonitorConstructionController {
+    private final IMonitorConstructionService monitorConstructionService;
+
+    @PostMapping("/import")
+    public Result importExcel(@RequestBody MultipartFile file) {
+
+        return monitorConstructionService.importExcel(file);
+    }
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse httpServletResponse) {
+        monitorConstructionService.getImportTemplate(httpServletResponse);
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/controller/TMonitorController.java b/ycl-server/src/main/java/com/ycl/platform/controller/TMonitorController.java
index 48f4102..bcd1aaa 100644
--- a/ycl-server/src/main/java/com/ycl/platform/controller/TMonitorController.java
+++ b/ycl-server/src/main/java/com/ycl/platform/controller/TMonitorController.java
@@ -39,7 +39,7 @@
     @GetMapping("/list")
     public TableDataInfo list(TMonitorVO tMonitor)
     {
-        startPage();
+
         List<TMonitorVO> list = tMonitorService.selectTMonitorList(tMonitor);
         return getDataTable(list);
     }
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/IMonitorConstructionMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/IMonitorConstructionMapper.java
new file mode 100644
index 0000000..e4a07d9
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/mapper/IMonitorConstructionMapper.java
@@ -0,0 +1,14 @@
+package com.ycl.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ycl.platform.domain.entity.MonitorConstruction;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface IMonitorConstructionMapper extends BaseMapper<MonitorConstruction> {
+
+    int insertBatch(@Param("list") List<MonitorConstruction> list);
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
index 1a13b60..d4241bd 100644
--- a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
+++ b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -45,7 +45,7 @@
      * @return 璁惧璧勪骇闆嗗悎
      */
     public List<TMonitorVO> selectTMonitorList(TMonitorVO tMonitor);
-
+    public List<TMonitorVO> selectTMonitorListAndIds(TMonitorVO tMonitor);
     /**
      * 鏌ヨ璁惧璧勪骇鍒楄〃
      *
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/IMonitorConstructionService.java b/ycl-server/src/main/java/com/ycl/platform/service/IMonitorConstructionService.java
new file mode 100644
index 0000000..640a0ab
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/service/IMonitorConstructionService.java
@@ -0,0 +1,29 @@
+package com.ycl.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ycl.platform.domain.entity.MonitorConstruction;
+import com.ycl.system.Result;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+public interface IMonitorConstructionService extends IService<MonitorConstruction> {
+
+
+    /**
+     * 瀵煎叆璁惧鏍囩
+     * @param file
+     * @return
+     */
+    Result importExcel(MultipartFile file);
+
+    /**
+     * 瀵煎嚭璁惧妯℃澘
+     * @return
+     */
+    void getImportTemplate(HttpServletResponse httpServletResponse);
+
+    List<MonitorConstruction> getSerialNumberListByConstructionType(String constructionType);
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java
index 86ea120..a778877 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java
@@ -565,21 +565,21 @@
     //澶у睆灞曠ず鑰冩牳寰楀垎
     @Override
     public Map<String, Map<String, Object>> dashboard(DashboardQuery dashboardQuery) {
-//        Date now = new Date();
+        Date now = new Date();
 
-        Calendar cal = Calendar.getInstance();
-
-// 2. 璁剧疆涓轰粖骞�10鏈�12鍙� 00:00:00锛堟竻闄ゆ椂鍒嗙锛岄伩鍏嶅綋鍓嶆椂闂村共鎵帮級
-        cal.set(Calendar.MONTH, Calendar.OCTOBER);  // 10鏈堬紙鐢ㄥ父閲忔洿鐩磋锛岄伩鍏嶈0鍩猴級
-// cal.set(Calendar.MONTH, 9);  // 涔熷彲浠ョ敤鏁板瓧9锛堜笉鎺ㄨ崘锛屽彲璇绘�у樊锛�
-        cal.set(Calendar.DAY_OF_MONTH, 12);         // 鏃ユ湡璁句负12鍙�
-        cal.set(Calendar.HOUR_OF_DAY, 12);           // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
-        cal.set(Calendar.MINUTE, 0);                // 鍒嗛挓璁句负0
-        cal.set(Calendar.SECOND, 0);                // 绉掕涓�0
-        cal.set(Calendar.MILLISECOND, 0);           // 姣璁句负0
-
-// 3. 杞垚Date瀵硅薄
-        Date now = cal.getTime();
+//        Calendar cal = Calendar.getInstance();
+//
+//// 2. 璁剧疆涓轰粖骞�10鏈�12鍙� 00:00:00锛堟竻闄ゆ椂鍒嗙锛岄伩鍏嶅綋鍓嶆椂闂村共鎵帮級
+//        cal.set(Calendar.MONTH, Calendar.OCTOBER);  // 10鏈堬紙鐢ㄥ父閲忔洿鐩磋锛岄伩鍏嶈0鍩猴級
+//// cal.set(Calendar.MONTH, 9);  // 涔熷彲浠ョ敤鏁板瓧9锛堜笉鎺ㄨ崘锛屽彲璇绘�у樊锛�
+//        cal.set(Calendar.DAY_OF_MONTH, 12);         // 鏃ユ湡璁句负12鍙�
+//        cal.set(Calendar.HOUR_OF_DAY, 12);           // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
+//        cal.set(Calendar.MINUTE, 0);                // 鍒嗛挓璁句负0
+//        cal.set(Calendar.SECOND, 0);                // 绉掕涓�0
+//        cal.set(Calendar.MILLISECOND, 0);           // 姣璁句负0
+//
+//// 3. 杞垚Date瀵硅薄
+//        Date now = cal.getTime();
 
 
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/IMonitorConstructionServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/IMonitorConstructionServiceImpl.java
new file mode 100644
index 0000000..ecf4dcb
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/IMonitorConstructionServiceImpl.java
@@ -0,0 +1,142 @@
+package com.ycl.platform.service.impl;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ycl.platform.domain.dto.MonitorConstructionDTO;
+import com.ycl.platform.domain.dto.ReportImportDTO;
+import com.ycl.platform.domain.entity.MonitorConstruction;
+import com.ycl.platform.mapper.IMonitorConstructionMapper;
+import com.ycl.platform.service.IMonitorConstructionService;
+import com.ycl.system.Result;
+import com.ycl.utils.StringUtils;
+import com.ycl.utils.poi.ExcelUtil;
+import enumeration.ConstructionTypeEnum;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * zgyw
+ *
+ * @author : zxl
+ * @date : 2025-10-20 13:58
+ **/
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class IMonitorConstructionServiceImpl extends ServiceImpl<IMonitorConstructionMapper, MonitorConstruction>
+        implements IMonitorConstructionService {
+    private final IMonitorConstructionMapper monitorConstructionMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result importExcel(MultipartFile file) {
+        log.info("杩涘叆瀵煎叆閫昏緫");
+        ExcelUtil<MonitorConstructionDTO> excelUtil = new ExcelUtil<>(MonitorConstructionDTO.class);
+        List<MonitorConstructionDTO> list = null;
+        List<MonitorConstructionDTO> distinctList = null;
+        try {
+            list = excelUtil.importExcel(file.getInputStream());
+            distinctList = list.stream()
+                    .filter(Objects::nonNull)//杩囨护鎺塶ull鐨勫璞�
+                    .filter(dto -> dto.getSerialNumber() != null)//杩囨护鎺� getSerialNumber涓簄ull鐨勫璞�
+                    .collect(Collectors.toMap(
+                            MonitorConstructionDTO::getSerialNumber,
+                            dto -> dto,
+                            (existing, replacement) -> existing
+                    ))
+                    .values()
+                    .stream()
+                    .collect(Collectors.toList());
+        } catch (IOException e) {
+            log.error("璇锋鏌ュ鍏xcel琛ㄦ牸鍐呭");
+            throw new RuntimeException("璇锋鏌ュ鍏xcel琛ㄦ牸鍐呭");
+        }
+
+        List<MonitorConstruction> data = new ArrayList<>();
+        for (MonitorConstructionDTO dto : distinctList) {
+            MonitorConstruction monitorConstruction = new MonitorConstruction();
+            monitorConstruction.setSerialNumber(dto.getSerialNumber());
+            monitorConstruction.setTag(dto.getTag());
+            data.add(monitorConstruction);
+        }
+        List<String> serialNumbers = data.stream()
+                .map(MonitorConstruction::getSerialNumber)
+                .collect(Collectors.toList());
+
+        //鍒犻櫎宸插瓨鍦ㄧ殑璁惧瀵瑰簲鏍囩
+        if (CollectionUtils.isNotEmpty(serialNumbers)) {
+            log.info("鍒犻櫎鏍囩鏁版嵁琛屾暟:{}",serialNumbers.size());
+            QueryWrapper<MonitorConstruction> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("serial_number", serialNumbers);
+            queryWrapper.eq("deleted",false);
+            baseMapper.delete(queryWrapper);
+        }
+
+        if (CollectionUtils.isNotEmpty(data)) {
+            //鎻掑叆鏍囩琛ㄤ腑
+            log.info("鎻掑叆鏍囩鏁版嵁琛屾暟:{}",data.size());
+            saveBatch(data);
+        }
+        return Result.ok();
+    }
+
+
+    @Override
+    public void getImportTemplate(HttpServletResponse httpServletResponse){
+        ExcelUtil<MonitorConstructionDTO> excelUtil = new ExcelUtil<>(MonitorConstructionDTO.class);
+        excelUtil.exportExcel(httpServletResponse, null, "璁惧鏍囩妯℃澘");
+    }
+
+    @Override
+    public List<MonitorConstruction> getSerialNumberListByConstructionType(String constructionType) {
+        List<MonitorConstruction> list = new ArrayList<>();
+        if (ConstructionTypeEnum.PHASE_ONE_TWO.name().equals(constructionType)){
+            //涓�浜屾湡
+            list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                    .eq(MonitorConstruction::getTag, ConstructionTypeEnum.PHASE_ONE_TWO.getDesc())
+                    .list();
+
+        }else if (ConstructionTypeEnum.PHASE_THREE.name().equals(constructionType)){
+            //涓夋湡
+            list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                    .eq(MonitorConstruction::getTag, ConstructionTypeEnum.PHASE_THREE.getDesc())
+                    .list();
+        }else if (ConstructionTypeEnum.PHASE_FOURTH.name().equals(constructionType)){
+            //鍥涙湡浜鸿劯
+            list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                    .eq(MonitorConstruction::getTag, ConstructionTypeEnum.PHASE_FOURTH.getDesc())
+                    .list();
+        }else if (ConstructionTypeEnum.EASTERN_NEW_CITY.name().equals(constructionType)){
+            //涓滈儴鏂板煄
+            list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                    .eq(MonitorConstruction::getTag, ConstructionTypeEnum.EASTERN_NEW_CITY.getDesc())
+                    .list();
+        }else if (ConstructionTypeEnum.CHECK_ENTER_SICHUAN.name().equals(constructionType)){
+            //鍏ュ窛鍗虫
+            list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                    .eq(MonitorConstruction::getTag, ConstructionTypeEnum.CHECK_ENTER_SICHUAN.getDesc())
+                    .list();
+        }else if (ConstructionTypeEnum.YAN_TAN_PHASE_TWO_FACE.name().equals(constructionType)){
+            //娌挎哗浜屾湡浜鸿劯
+            list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                    .eq(MonitorConstruction::getTag, ConstructionTypeEnum.YAN_TAN_PHASE_TWO_FACE.getDesc())
+                    .list();
+        }
+        return list;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
index d7ac0b3..d837e1a 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -6,6 +6,7 @@
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
+import com.ycl.platform.domain.entity.MonitorConstruction;
 import com.ycl.platform.domain.entity.TMonitor;
 import com.ycl.platform.domain.excel.*;
 import com.ycl.platform.domain.form.VideoExportForm;
@@ -31,6 +32,7 @@
 import com.ycl.platform.mapper.TMonitorMapper;
 import com.ycl.platform.mapper.WorkOrderMapper;
 import com.ycl.platform.mapper.YwPointMapper;
+import com.ycl.platform.service.IMonitorConstructionService;
 import com.ycl.platform.service.ITMonitorService;
 import com.ycl.system.Result;
 import com.ycl.system.entity.SysDictData;
@@ -74,6 +76,8 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import static com.ycl.utils.PageUtils.startPage;
+
 /**
  * 璁惧璧勪骇Service涓氬姟灞傚鐞�
  *
@@ -99,7 +103,8 @@
     private DynamicColumnMapper dynamicColumnMapper;
     @Autowired
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
-
+    @Autowired
+    private IMonitorConstructionService monitorConstructionService;
     /**
      * 鏌ヨ璁惧璧勪骇
      *
@@ -129,156 +134,173 @@
             }
             tMonitor.setTime(time);
         }
-        List<TMonitorVO> monitors = tMonitorMapper.selectTMonitorList(tMonitor);
-        // 寮傚父鎭㈠鐩戞帶
-        if (Objects.equals(tMonitor.getRecovery(), 1L)) {
-            //宸ュ崟鍙�
-            List<String> orders = monitors.stream().map(TMonitorVO::getWorkOrderNo).collect(Collectors.toList());
-            if (CollectionUtils.isEmpty(orders)) {
+        List<TMonitorVO> monitors = new ArrayList<>();
+        if (StringUtils.isNotBlank(tMonitor.getConstructionType())){
+            List<MonitorConstruction> list =
+                    monitorConstructionService.getSerialNumberListByConstructionType(tMonitor.getConstructionType());
+            log.info("鎵撳嵃鏌ヨ璁惧鏍囩鏁�:{},寤鸿绫诲瀷鏍囩:{}",list.size(), tMonitor.getConstructionType() );
+            //鑾峰緱璁惧缂栧彿闆嗗悎 閫氳繃寤鸿绫诲瀷鏍囩
+            if(!CollectionUtils.isEmpty(list)){
+                tMonitor.setIds(
+                        list.stream().map(MonitorConstruction::getSerialNumber).collect(Collectors.toList()));
+
+                startPage();
+                monitors = tMonitorMapper.selectTMonitorListAndIds(tMonitor);
+            }
+
+        }else{
+            startPage();
+            monitors = tMonitorMapper.selectTMonitorList(tMonitor);
+        }
+            // 寮傚父鎭㈠鐩戞帶
+            if (Objects.equals(tMonitor.getRecovery(), 1L)) {
+                //宸ュ崟鍙�
+                List<String> orders = monitors.stream().map(TMonitorVO::getWorkOrderNo).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(orders)) {
+                    return monitors;
+                }
+                List<WorkOrderVO> voList = workOrderMapper.getRecoveryInfo(orders);
+                for (TMonitorVO monitor : monitors) {
+                    if (!CollectionUtils.isEmpty(voList)) {
+                        for (WorkOrderVO workOrderVO : voList) {
+                            if (monitor.getWorkOrderNo() != null && monitor.getWorkOrderNo().equals(workOrderVO.getWorkOrderNo())) {
+                                monitor.setUnitContact(workOrderVO.getUnitContact());
+                                monitor.setUnitContactPhone(workOrderVO.getUnitContactPhone());
+                                monitor.setYwPeopleName(workOrderVO.getYwPeopleName());
+                                monitor.setErrorType(workOrderVO.getErrorType());
+                            }
+                        }
+                    }
+                }
                 return monitors;
             }
-            List<WorkOrderVO> voList = workOrderMapper.getRecoveryInfo(orders);
-            for (TMonitorVO monitor : monitors) {
-                if (!CollectionUtils.isEmpty(voList)) {
-                    for (WorkOrderVO workOrderVO : voList) {
-                        if (monitor.getWorkOrderNo() != null && monitor.getWorkOrderNo().equals(workOrderVO.getWorkOrderNo())) {
-                            monitor.setUnitContact(workOrderVO.getUnitContact());
-                            monitor.setUnitContactPhone(workOrderVO.getUnitContactPhone());
-                            monitor.setYwPeopleName(workOrderVO.getYwPeopleName());
-                            monitor.setErrorType(workOrderVO.getErrorType());
+            //璁惧缂栧彿
+            List<String> numbers = monitors.stream().map(TMonitorVO::getSerialNumber).collect(Collectors.toList());
+            Query query = new Query();
+            Date now = new Date();
+            query.addCriteria(Criteria.where("no").in(numbers)
+                    .and("mongoCreateTime").gte(DateUtils.getDayStart(now)).lt(DateUtils.getDayEnd(now))
+            );
+            //涓�鏈轰竴妗d俊鎭�
+            List<MonitorQualifyResult> monitorQualifyResults = mongoTemplate.find(query, MonitorQualifyResult.class);
+            // 瑙嗛鐩戞帶璁惧
+            if (Objects.equals(tMonitor.getCameraFunType(), "1")) {
+                //OSD淇℃伅
+                List<OsdCheckResult> osdCheckResults = mongoTemplate.find(query, OsdCheckResult.class);
+                //褰曞儚鍙敤淇℃伅
+                List<RecordMetaDSumResult> videoResults = mongoTemplate.find(query, RecordMetaDSumResult.class);
+                for (TMonitorVO monitor : monitors) {
+                    monitor.setMongoCreateTime(now);
+                    //涓�鏈轰竴妗�
+                    setOneFile(monitorQualifyResults, monitor);
+                    //褰曞儚
+                    if (!CollectionUtils.isEmpty(videoResults)) {
+                        for (RecordMetaDSumResult videoResult : videoResults) {
+                            if (monitor.getSerialNumber().equals(videoResult.getNo())) {
+                                monitor.setVideoComplete(videoResult.getRecordStatus());
+                                monitor.setVideoLoseTime(videoResult.getMissDuration());
+                            }
+                        }
+                    }
+                    //OSD
+                    if (!CollectionUtils.isEmpty(osdCheckResults)) {
+                        for (OsdCheckResult osdCheckResult : osdCheckResults) {
+                            if (monitor.getSerialNumber().equals(osdCheckResult.getNo())) {
+                                monitor.setOSD(OsdCheckResult.checkOsd(osdCheckResult));
+                                monitor.setOSDTime(OsdCheckResult.checkTime(osdCheckResult));
+                            }
                         }
                     }
                 }
             }
-            return monitors;
-        }
-        //璁惧缂栧彿
-        List<String> numbers = monitors.stream().map(TMonitorVO::getSerialNumber).collect(Collectors.toList());
-        Query query = new Query();
-        Date now = new Date();
-        query.addCriteria(Criteria.where("no").in(numbers)
-                .and("mongoCreateTime").gte(DateUtils.getDayStart(now)).lt(DateUtils.getDayEnd(now))
-        );
-        //涓�鏈轰竴妗d俊鎭�
-        List<MonitorQualifyResult> monitorQualifyResults = mongoTemplate.find(query, MonitorQualifyResult.class);
-        // 瑙嗛鐩戞帶璁惧
-        if (Objects.equals(tMonitor.getCameraFunType(), "1")) {
-            //OSD淇℃伅
-            List<OsdCheckResult> osdCheckResults = mongoTemplate.find(query, OsdCheckResult.class);
-            //褰曞儚鍙敤淇℃伅
-            List<RecordMetaDSumResult> videoResults = mongoTemplate.find(query, RecordMetaDSumResult.class);
-            for (TMonitorVO monitor : monitors) {
-                monitor.setMongoCreateTime(now);
-                //涓�鏈轰竴妗�
-                setOneFile(monitorQualifyResults, monitor);
-                //褰曞儚
-                if (!CollectionUtils.isEmpty(videoResults)) {
-                    for (RecordMetaDSumResult videoResult : videoResults) {
-                        if (monitor.getSerialNumber().equals(videoResult.getNo())) {
-                            monitor.setVideoComplete(videoResult.getRecordStatus());
-                            monitor.setVideoLoseTime(videoResult.getMissDuration());
-                        }
-                    }
-                }
-                //OSD
-                if (!CollectionUtils.isEmpty(osdCheckResults)) {
-                    for (OsdCheckResult osdCheckResult : osdCheckResults) {
-                        if (monitor.getSerialNumber().equals(osdCheckResult.getNo())) {
-                            monitor.setOSD(OsdCheckResult.checkOsd(osdCheckResult));
-                            monitor.setOSDTime(OsdCheckResult.checkTime(osdCheckResult));
-                        }
-                    }
-                }
-            }
-        }
-        // 杞﹁締鐩戞帶璁惧
-        if (Objects.equals(tMonitor.getCameraFunType(), "2")) {
-            //灞炴�т竴鑷寸巼銆佸ぇ鍥�
-            List<VehicleDeviceSamplingResult> sampleResults = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
-            List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class);
-            //鎶撴媿閲忋�佹椂閽熴�佷笂浼�
-            List<VehicleDeviceInspectionResult> inspectResults = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
-            for (TMonitorVO monitor : monitors) {
-                monitor.setMongoCreateTime(now);
-                //涓�鏈轰竴妗�
-                setOneFile(monitorQualifyResults, monitor);
-                //url
-                if (!CollectionUtils.isEmpty(sampleResults)) {
-                    for (PicAccessResult picAccessResult : picAccessResults) {
-                        if (monitor.getSerialNumber().equals(picAccessResult.getNo())) {
-                            BigDecimal bigDecimal = PicAccessResult.calUrl(picAccessResult);
-                            monitor.setUrlPercent(bigDecimal);
-                        }
-                    }
-                }
+            // 杞﹁締鐩戞帶璁惧
+            if (Objects.equals(tMonitor.getCameraFunType(), "2")) {
                 //灞炴�т竴鑷寸巼銆佸ぇ鍥�
-                if (!CollectionUtils.isEmpty(sampleResults)) {
-                    for (VehicleDeviceSamplingResult sampleResult : sampleResults) {
-                        if (monitor.getSerialNumber().equals(sampleResult.getNo())) {
-                            if (sampleResult.getBigUseful() != null) {
-                                monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent());
-                            }
-                            if (sampleResult.getVehDiff() != null) {
-                                monitor.setImportantConPercent(sampleResult.getVehDiff().getImportantConPercent());
-                                monitor.setMajorConPercent(sampleResult.getVehDiff().getMajorConPercent());
-                            }
-                        }
-                    }
-                }
+                List<VehicleDeviceSamplingResult> sampleResults = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
+                List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class);
                 //鎶撴媿閲忋�佹椂閽熴�佷笂浼�
-                if (!CollectionUtils.isEmpty(inspectResults)) {
-                    for (VehicleDeviceInspectionResult inspectResult : inspectResults) {
-                        if (monitor.getSerialNumber().equals(inspectResult.getNo())) {
-                            monitor.setSnapResult(inspectResult.getSnapResult());
-                            monitor.setSnapCount(inspectResult.getDataCount());
-                            if (inspectResult.getSnapClock() != null)
-                                monitor.setClockPercent(inspectResult.getSnapClock().getClockPercent());
-                            if (inspectResult.getSnapTimely() != null)
-                                monitor.setUploadPercent(inspectResult.getSnapTimely().getTimelyPercent());
-                        }
-                    }
-                }
-            }
-        }
-        // 浜鸿劯鐩戞帶璁惧
-        if (Objects.equals(tMonitor.getCameraFunType(), "3")) {
-            //浜鸿劯鍚堟牸銆佸ぇ鍥俱�乽rl璁块棶寮傚父
-            List<FaceDeviceSamplingResult> sampleResults = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
-            //鎶撴媿閲忋�佹椂閽熴�佷笂浼�
-            List<FaceDeviceInspectionResult> inspectResults = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
-            for (TMonitorVO monitor : monitors) {
-                monitor.setMongoCreateTime(now);
-                //涓�鏈轰竴妗�
-                setOneFile(monitorQualifyResults, monitor);
-                //浜鸿劯鍚堟牸銆佸ぇ鍥�
-                if (!CollectionUtils.isEmpty(sampleResults)) {
-                    for (FaceDeviceSamplingResult sampleResult : sampleResults) {
-                        if (monitor.getSerialNumber().equals(sampleResult.getNo())) {
-                            if (sampleResult.getBigUseful() != null) {
-                                monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent());
+                List<VehicleDeviceInspectionResult> inspectResults = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
+                for (TMonitorVO monitor : monitors) {
+                    monitor.setMongoCreateTime(now);
+                    //涓�鏈轰竴妗�
+                    setOneFile(monitorQualifyResults, monitor);
+                    //url
+                    if (!CollectionUtils.isEmpty(sampleResults)) {
+                        for (PicAccessResult picAccessResult : picAccessResults) {
+                            if (monitor.getSerialNumber().equals(picAccessResult.getNo())) {
+                                BigDecimal bigDecimal = PicAccessResult.calUrl(picAccessResult);
+                                monitor.setUrlPercent(bigDecimal);
                             }
-                            if (sampleResult.getFaceEligibility() != null)
-                                monitor.setFacePercent(sampleResult.getFaceEligibility().getFaceEligPercent());
                         }
                     }
-                }
-                //鎶撴媿閲忋�佹椂閽熴�佷笂浼犮�佸缓妯″け璐ョ巼
-                if (!CollectionUtils.isEmpty(inspectResults)) {
-                    for (FaceDeviceInspectionResult inspectResult : inspectResults) {
-                        if (monitor.getSerialNumber().equals(inspectResult.getNo())) {
-                            monitor.setSnapResult(inspectResult.getSnapResult());
-                            monitor.setSnapCount(inspectResult.getDataCount());
-                            if (inspectResult.getSnapClock() != null)
-                                monitor.setClockPercent(inspectResult.getSnapClock().getClockPercent());
-                            if (inspectResult.getSnapTimely() != null)
-                                monitor.setUploadPercent(inspectResult.getSnapTimely().getTimelyPercent());
-                            if (inspectResult.getSnapValidity() != null)
-                                monitor.setFailPercent(inspectResult.getSnapValidity().getFailPercent());
+                    //灞炴�т竴鑷寸巼銆佸ぇ鍥�
+                    if (!CollectionUtils.isEmpty(sampleResults)) {
+                        for (VehicleDeviceSamplingResult sampleResult : sampleResults) {
+                            if (monitor.getSerialNumber().equals(sampleResult.getNo())) {
+                                if (sampleResult.getBigUseful() != null) {
+                                    monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent());
+                                }
+                                if (sampleResult.getVehDiff() != null) {
+                                    monitor.setImportantConPercent(sampleResult.getVehDiff().getImportantConPercent());
+                                    monitor.setMajorConPercent(sampleResult.getVehDiff().getMajorConPercent());
+                                }
+                            }
+                        }
+                    }
+                    //鎶撴媿閲忋�佹椂閽熴�佷笂浼�
+                    if (!CollectionUtils.isEmpty(inspectResults)) {
+                        for (VehicleDeviceInspectionResult inspectResult : inspectResults) {
+                            if (monitor.getSerialNumber().equals(inspectResult.getNo())) {
+                                monitor.setSnapResult(inspectResult.getSnapResult());
+                                monitor.setSnapCount(inspectResult.getDataCount());
+                                if (inspectResult.getSnapClock() != null)
+                                    monitor.setClockPercent(inspectResult.getSnapClock().getClockPercent());
+                                if (inspectResult.getSnapTimely() != null)
+                                    monitor.setUploadPercent(inspectResult.getSnapTimely().getTimelyPercent());
+                            }
                         }
                     }
                 }
             }
-        }
+            // 浜鸿劯鐩戞帶璁惧
+            if (Objects.equals(tMonitor.getCameraFunType(), "3")) {
+                //浜鸿劯鍚堟牸銆佸ぇ鍥俱�乽rl璁块棶寮傚父
+                List<FaceDeviceSamplingResult> sampleResults = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
+                //鎶撴媿閲忋�佹椂閽熴�佷笂浼�
+                List<FaceDeviceInspectionResult> inspectResults = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
+                for (TMonitorVO monitor : monitors) {
+                    monitor.setMongoCreateTime(now);
+                    //涓�鏈轰竴妗�
+                    setOneFile(monitorQualifyResults, monitor);
+                    //浜鸿劯鍚堟牸銆佸ぇ鍥�
+                    if (!CollectionUtils.isEmpty(sampleResults)) {
+                        for (FaceDeviceSamplingResult sampleResult : sampleResults) {
+                            if (monitor.getSerialNumber().equals(sampleResult.getNo())) {
+                                if (sampleResult.getBigUseful() != null) {
+                                    monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent());
+                                }
+                                if (sampleResult.getFaceEligibility() != null)
+                                    monitor.setFacePercent(sampleResult.getFaceEligibility().getFaceEligPercent());
+                            }
+                        }
+                    }
+                    //鎶撴媿閲忋�佹椂閽熴�佷笂浼犮�佸缓妯″け璐ョ巼
+                    if (!CollectionUtils.isEmpty(inspectResults)) {
+                        for (FaceDeviceInspectionResult inspectResult : inspectResults) {
+                            if (monitor.getSerialNumber().equals(inspectResult.getNo())) {
+                                monitor.setSnapResult(inspectResult.getSnapResult());
+                                monitor.setSnapCount(inspectResult.getDataCount());
+                                if (inspectResult.getSnapClock() != null)
+                                    monitor.setClockPercent(inspectResult.getSnapClock().getClockPercent());
+                                if (inspectResult.getSnapTimely() != null)
+                                    monitor.setUploadPercent(inspectResult.getSnapTimely().getTimelyPercent());
+                                if (inspectResult.getSnapValidity() != null)
+                                    monitor.setFailPercent(inspectResult.getSnapValidity().getFailPercent());
+                            }
+                        }
+                    }
+                }
+            }
         return monitors;
     }
 
@@ -346,6 +368,13 @@
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
     public Map<String, String> getVideoCount(TMonitorVO tMonitor) {
+
+        List<MonitorConstruction> list =
+                monitorConstructionService.getSerialNumberListByConstructionType(tMonitor.getConstructionType());
+        //鑾峰緱璁惧缂栧彿闆嗗悎 閫氳繃寤鸿绫诲瀷鏍囩
+        tMonitor.setIds(
+                list.stream().map(MonitorConstruction::getSerialNumber).collect(Collectors.toList()));
+
         return tMonitorMapper.getVideoCount(tMonitor);
     }
 
@@ -556,8 +585,6 @@
         ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet);
         util.exportExcelManySheet(response, mysheet);
     }
-
-
     /**
      * 瀵煎嚭姣忔棩鍦ㄧ嚎鏁版嵁
      */
@@ -578,9 +605,34 @@
         // 浣跨敤绾跨▼瀹夊叏鐨凩ist锛岄鍏堟寚瀹氬閲�
         List<ExcelExp> mysheet = Collections.synchronizedList(new ArrayList<>());
         VideoExportForm.convertTags(exportForm);
-        Query query = getQuery(exportForm);
+        Query query = getQuery(exportForm);//瑁呴厤鏉′欢
         // 鏈堜唤姣忔棩鍦ㄧ嚎鏁版嵁
+
         List<TMonitorResult> onlineResult = mongoTemplate.find(query, TMonitorResult.class);
+        log.info("澶у皬:{}",onlineResult.size());
+        //姝ゅ闇�瑕佽繃婊ゆ帀璁惧鍏ㄦ櫙鍦ㄧ嚎 缁嗚妭涓嶅湪绾跨殑鎯呭喌  鍙互鎸� point鍒嗙粍 鍒嗘垜璁稿缁勪箣鍚庡啀鍋氬鐞�
+        Map<String, List<TMonitorResult>> ipToDevices = onlineResult.stream()
+                .collect(Collectors.groupingBy(TMonitorResult::getIp));
+
+//        onlineResult = ipToDevices.values().stream()
+//                .map(devices -> {
+//                    // 妫�鏌ュ垎缁勪腑鏄惁鏈� online = true 鐨勮澶�
+//                    List<TMonitorResult> onlineDevices = devices.stream()
+//                            .filter(monitor -> monitor.getOnline() == 1) // 鍋囪online瀛楁鐨刧etter鏄痠sOnline()
+//                            .collect(Collectors.toList());
+//
+//                    if (!onlineDevices.isEmpty()) {
+//                        // 鑻ュ瓨鍦╫nline=true鐨勮澶囷紝鍙繚鐣欑涓�涓紙鎴栧彇浠绘剰涓�涓紝鎸夐渶璋冩暣锛�
+//                        return onlineDevices.get(0);
+//                    } else {
+//                        // 鑻ュ叏涓簅nline=false锛屽彧淇濈暀绗竴涓�
+//                        return devices.get(0);
+//                    }
+//                })
+//                .collect(Collectors.toList());
+
+
+
         log.info("鏈堜唤鍦ㄧ嚎鏁版嵁:{}鏉℃暟", onlineResult.size());
         // 浣跨敤Collectors.toMap鍘婚噸锛屼繚鐣欐瘡涓狽o鐨勭涓�涓亣鍒扮殑鍏冪礌
         Map<String, TMonitorResult> uniqueResultsMap = onlineResult.stream()
@@ -589,9 +641,14 @@
                         Function.identity(),  // valueMapper锛岀洿鎺ヤ娇鐢ㄥ璞℃湰韬�
                         (existing, replacement) -> existing // mergeFunction锛屽鏋滄湁閲嶅锛屼繚鐣欑涓�涓�
                 ));
+
+
         // 灏� Map 杞崲涓� List
         List<TMonitorResult> tMonitorResults = new ArrayList<>(uniqueResultsMap.values());
         log.info("鍘婚噸鍚庡ぇ灏�:{}", tMonitorResults.size());
+
+
+
         // 鑾峰彇鍔ㄦ�佸垪鏁版嵁骞舵瀯寤虹紦瀛楳ap
         Map<Integer, List<DynamicColumnVO>> dynamicColumnMap = new HashMap<>();
         if (!tMonitorResults.isEmpty()) {
@@ -600,6 +657,8 @@
                     .map(TMonitorResult::getPointId)
                     .distinct() // 鍘婚噸锛屽噺灏戞暟鎹簱鏌ヨ
                     .collect(Collectors.toList());
+
+
             //鑾峰彇闆嗗悎鐐逛綅鐨勮ˉ鍏呭垪淇℃伅
             List<DynamicColumnVO> dynamics = dynamicColumnMapper.getDynamicsByIds("t_yw_point", pointIds);
             if (!CollectionUtils.isEmpty(dynamics)) {
@@ -631,6 +690,9 @@
             CompletableFuture<ExcelExp> future = CompletableFuture.supplyAsync(() -> {
                 // 鐩存帴浠庨鍒嗙粍鐨凪ap涓幏鍙栵紝閬垮厤姣忔杩囨护
                 List<TMonitorResult> monitors = deptMonitorMap.getOrDefault(currentDeptId, Collections.emptyList());
+
+
+
                 if (monitors.isEmpty()) {
                     return null;
                 }
@@ -1458,6 +1520,22 @@
     @Override
     public void export(HttpServletResponse response, TMonitorVO tMonitor) {
         List<TMonitorExp> monitors = tMonitorMapper.exportTMonitorList(tMonitor);
+        //杩囨护鍑鸿澶囧缓璁剧被鍨�
+        if (StringUtils.isNotBlank(tMonitor.getConstructionType())){
+            List<MonitorConstruction> list =
+                    monitorConstructionService.getSerialNumberListByConstructionType(tMonitor.getConstructionType());
+            //鑾峰緱璁惧缂栧彿闆嗗悎 閫氳繃寤鸿绫诲瀷鏍囩
+            List<String> serialNumberList = list.stream().map(MonitorConstruction::getSerialNumber).collect(Collectors.toList());
+            monitors = monitors.stream()
+                    .filter(result -> {
+                        String sn = result.getSerialNumber();
+                        // 浠讳竴瀛楁闈炵┖涓斿湪闆嗗悎涓嵆鍙�
+                        return (sn != null && serialNumberList.contains(sn));
+                    })
+                    .collect(Collectors.toList());
+        }
+
+
         //鑾峰彇鍔ㄦ�佸垪鏁版嵁
         List<Integer> pointIds = monitors.stream().map(TMonitorExp::getPointId).collect(Collectors.toList());
         List<DynamicColumnVO> dynamics = dynamicColumnMapper.getDynamicsByIds("t_yw_point", pointIds);
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
index a138de8..99411d5 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1303,10 +1303,23 @@
         }
 
         // 鏄惁鎶ュ
-        boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper)
-                .eq(Report::getSerialNumber, workOrder.getSerialNumber())
-                .exists();
-        workOrder.setHasReport(hasReport);
+        Date target = workOrder.getCreateTime();
+
+        Report reports = new LambdaQueryChainWrapper<>(reportMapper)
+                .eq(Report::getSerialNumber,workOrder.getWorkOrderNo())
+                .eq(Report::getStatus,1)
+                .orderByDesc(Report::getCreateTime)
+                .last("LIMIT 1")
+                .one();
+        boolean isInRange = false;
+        if (reports != null){
+            Date start = reports.getBeginCreateTime();
+            Date end = reports.getEndCreateTime();
+            isInRange = target.after(start) || target.equals(start)  // target >= start
+                    && target.before(end) || target.equals(end);
+        }
+
+        workOrder.setHasReport(isInRange);
         // 鏁呴殰绫诲瀷
         List<SysDictData> errorList = workOrderErrorTypeService.getBaseMapper().getErrorList(workOrder.getWorkOrderNo());
         List<String> errList = errorList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList());
diff --git a/ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java b/ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java
index fbd70f3..cd9d594 100644
--- a/ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java
@@ -5,9 +5,11 @@
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.google.common.util.concurrent.AtomicDouble;
 import com.ycl.platform.domain.entity.DemeritRecord;
+import com.ycl.platform.domain.entity.MonitorConstruction;
 import com.ycl.platform.domain.entity.Report;
 import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
 import com.ycl.platform.mapper.DemeritRecordMapper;
+import com.ycl.platform.mapper.IMonitorConstructionMapper;
 import com.ycl.platform.mapper.ReportMapper;
 import com.ycl.platform.service.IDemeritRecordService;
 import com.ycl.utils.DateUtils;
@@ -50,6 +52,8 @@
 
     private final ReportMapper reportMapper;
 
+    private final IMonitorConstructionMapper monitorConstructionMapper;
+
     private static final ExecutorService executorService = new ThreadPoolExecutor(16,
             128,
             5000,
@@ -59,21 +63,12 @@
     );
     private final IDemeritRecordService demeritRecordService;
 
-    // 鎻愬彇鍏叡杩囨护鏂规硶
-    private Predicate<RecordMetaDSumResult> deviceNameStartsWith(String prefix) {
-        return result -> result.getDeviceName() != null && result.getDeviceName().startsWith(prefix);
-    }
-
-    private Predicate<RecordMetaDSumResult> deviceNameStartsWithAny(String... prefixes) {
-        return result -> result.getDeviceName() != null &&
-                Arrays.stream(prefixes).anyMatch(prefix -> result.getDeviceName().startsWith(prefix));
-    }
-
-    private DemeritRecord buildDemeritRecord(String constructionType,BigDecimal demerit,Integer deptId) {
+    private DemeritRecord buildDemeritRecord(String constructionType,BigDecimal demerit,Integer deptId,Date recordTime) {
         DemeritRecord record = new DemeritRecord();
         record.setConstructionType(constructionType);
         record.setDemerit(demerit);
         record.setDeptId(deptId);
+        record.setRecordTime(recordTime);
         return record;
     }
     private BigDecimal calculateTotalDeduction(List<RecordMetaDSumResult> records) {
@@ -126,7 +121,7 @@
 
         log.info("鏃ユ湡:{},鏌ヨ鍑虹殑璁惧褰曞儚璁板綍鏁皗}",today,results.size());
         //杩囨护鎺夐潪鍏ㄦ櫙鐨勮澶� 涓� 1鍒欎负缁嗚妭锛屽鏋滄槸0鍒欎负鍏ㄦ櫙
-        results.stream().filter(obj ->
+        results = results.stream().filter(obj ->
         {
             String deviceId = obj.getDeviceId();
             if (deviceId == null || deviceId.length() < 7) {
@@ -135,7 +130,7 @@
             // 鑾峰彇鍊掓暟绗竷浣嶇殑瀛楃
             char seventhFromEnd = deviceId.charAt(deviceId.length() - 7);
             return seventhFromEnd != '1'; //涓�1 鍒欎細 false 鍘婚櫎鎺�
-        });
+        }).collect(Collectors.toList());
 
         log.info("杩囨护鍚庡墿浣欏叏鏅澶囨暟{}",results.size());
         //鍙�冩牳LT_銆�(涓夋湡)
@@ -143,28 +138,43 @@
         // DX_R銆侊紙鍥涘尯浜鸿劯锛�
         // DX_RS銆侊紙鍥涘尯浜鸿劯锛�
         // 锛堥渶瑕佹帓闄X_R2銆丏X_RD銆丣_銆乀1銆乀3浠ュ強娌℃湁鍓嶇紑鐨勮澶囷級
-        List<String> prefixes = Arrays.asList("LT_", "DX_", "DX_R", "DX_RS");
-
-        results.stream()
+//        List<String> prefixes = Arrays.asList("LT_", "DX_", "DX_R", "DX_RS");
+        //鏌ヨ璁惧鏍囩琛ㄤ腑鐨凪onitorConstruction鍒楄〃
+        List<MonitorConstruction> monitorConstructionList = new LambdaQueryChainWrapper<>(monitorConstructionMapper)
+                .eq(MonitorConstruction::getDeleted, Boolean.FALSE)
+                .list();
+        List<String> serialNumberList = monitorConstructionList.stream()
+                .map(MonitorConstruction::getSerialNumber).collect(Collectors.toList());
+        //杩囨护鑾峰緱鍖呭惈浜嗚繖浜涙爣绛剧殑璁惧褰曞儚鎯呭喌闆嗗悎
+        results = results.stream()
                 .filter(result -> {
-                    String deviceName = result.getDeviceName();
-                    if (deviceName == null) {
-                        return false;
-                    }
-                    return prefixes.stream().anyMatch(deviceName::startsWith);
+                    String sn = result.getNo();
+                    // 浠讳竴瀛楁闈炵┖涓斿湪闆嗗悎涓嵆鍙�
+                    return (sn != null && serialNumberList.contains(sn));
                 })
                 .collect(Collectors.toList());
+
 
         log.info("鍓╀綑鑰冩牳璁惧杩囨护鍚庤澶囨暟{}",results.size());
 
         //杩囨护鎺夋姤澶囩殑璁惧
         //鏌ヨ鍦ㄥ綋鍓嶆椂闂存湁鎶ュ鐨勬墍鏈夎澶囷紝
         //鍥犱负褰曞儚鏁版嵁鐨勬椂闂�
-        List<String> deviceIds = new LambdaQueryChainWrapper<>(reportMapper)
+        Date yesterday =new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(yesterday);
+        calendar.add(Calendar.DAY_OF_YEAR, -1); // 鍑忓幓1澶� 娴嬭瘯鐢�
+        yesterday = calendar.getTime();
+        log.info("娴嬭瘯鏃堕棿:{}",yesterday);
+
+        List<Report> list = new LambdaQueryChainWrapper<>(reportMapper)
                 .eq(Report::getStatus, 1)
-                .ge(Report::getBeginCreateTime, today)
-                .le(Report::getEndCreateTime, today)
-                .list().stream()
+                .ge(Report::getBeginCreateTime, DateUtils.getDayStart(yesterday))
+                .le(Report::getEndCreateTime,  DateUtils.getDayEnd(yesterday))
+                .list();
+
+        log.info("鎶ュ璁板綍锛歿}",list);
+        List<String> deviceIds = list.stream()
                 .collect(Collectors.toMap(
                         Report::getSerialNumber,  // key: serialNumber
                         Function.identity(),      // value: Report瀵硅薄鏈韩
@@ -177,7 +187,7 @@
 
         Set<String> deviceIdSet = new HashSet<>(deviceIds);
         log.info("鎶ュ璁惧鏁皗}",deviceIdSet.size());
-        results.stream()
+        results = results.stream()
                 .filter(result -> {
                     // 鑾峰彇褰撳墠瀵硅薄鐨刣eviceId
                     String resultDeviceId = result.getDeviceId();
@@ -202,6 +212,24 @@
         Map<String,List<RecordMetaDSumResult>> groupByArealayerno = results.stream()
                 .collect(Collectors.groupingBy(RecordMetaDSumResult::getArealayerno));
 
+        //鎸夊缓璁剧被鍨嬫爣绛惧垎缁勮澶嘚O monitorConstructionList
+        //鎸夋爣绛惧垎缁�
+        Map<String, List<String>> groupByTag = monitorConstructionList.stream()
+                // 鍒嗙粍閿細鎻愬彇姣忎釜瀵硅薄鐨� tag锛堟敞鎰忓鐞� tag 涓� null 鐨勬儏鍐碉紝閬垮厤閿负 null锛�
+                .collect(Collectors.groupingBy(
+                        mc -> mc.getTag() != null ? mc.getTag() : "DEFAULT_TAG",
+                        Collectors.mapping(MonitorConstruction::getSerialNumber, Collectors.toList())
+
+                ));
+        List<String> phaseOneTwoSerials = groupByTag.getOrDefault(ConstructionTypeEnum.PHASE_ONE_TWO.getDesc(), Collections.emptyList());
+        List<String> phaseThreeSerials = groupByTag.getOrDefault(ConstructionTypeEnum.PHASE_THREE.getDesc(), Collections.emptyList());
+        List<String> phaseFourthSerials = groupByTag.getOrDefault(ConstructionTypeEnum.PHASE_FOURTH.getDesc(), Collections.emptyList());
+
+        List<String> checkEnterSichuan = groupByTag.getOrDefault(ConstructionTypeEnum.CHECK_ENTER_SICHUAN.getDesc(), Collections.emptyList());
+
+        List<String> easternNewCity= groupByTag.getOrDefault(ConstructionTypeEnum.EASTERN_NEW_CITY.getDesc(), Collections.emptyList());
+
+        List<String> yanTanPhaseTwoFace = groupByTag.getOrDefault(ConstructionTypeEnum.YAN_TAN_PHASE_TWO_FACE.getDesc(), Collections.emptyList());
         //寰幆鍒嗙粍鍚庣殑map
         for (Map.Entry<String, List<RecordMetaDSumResult>> entry : groupByArealayerno.entrySet()) {
             String arealayerno = entry.getKey();
@@ -218,65 +246,62 @@
             if (CollectionUtils.isNotEmpty(resultList)) {
                 // 瀵规瘡涓狶ist杩涜澶勭悊 鍒嗗缓绫诲瀷澶勭悊闆嗗悎
                 List<RecordMetaDSumResult> phase_one_two = resultList.stream()
-                        .filter(deviceNameStartsWith("DX_"))
+                        .filter(result -> {
+                            String no = result.getNo();
+                            return no != null && phaseOneTwoSerials.contains(no);
+                        })
                         .collect(Collectors.toList());
-                log.info("涓�浜屾湡鑰冩牳璁板綍鏁皗}",phase_one_two.size());
+                log.info("涓�浜屾湡鑰冩牳璁板綍鏁皗}", phase_one_two.size());
                 List<RecordMetaDSumResult> phase_three = resultList.stream()
-                        .filter(deviceNameStartsWith("LT_"))
+                        .filter(result -> {
+                            String no = result.getNo();
+                            return no != null && phaseThreeSerials.contains(no);
+                        })
                         .collect(Collectors.toList());
-                log.info("涓夋湡鑰冩牳璁板綍鏁皗}",phase_three.size());
+                log.info("涓夋湡鑰冩牳璁板綍鏁皗}", phase_three.size());
                 List<RecordMetaDSumResult> phase_fourth = resultList.stream()
-                        .filter(deviceNameStartsWithAny("DX_R", "DX_RS"))
+                        .filter(result -> {
+                            String no = result.getNo();
+                            return no != null && phaseFourthSerials.contains(no);
+                        })
                         .collect(Collectors.toList());
-                log.info("鍥涙湡鑰冩牳璁板綍鏁皗}",phase_fourth.size());
-                if (CollectionUtils.isNotEmpty(phase_one_two)){
-                    BigDecimal phaseOneTwoDeduction = calculateTotalDeduction(phase_one_two);
-                    DemeritRecord demeritRecordPhaseOneTwo = buildDemeritRecord(
-                            ConstructionTypeEnum.PHASE_ONE_TWO.name(),
-                            phaseOneTwoDeduction,
-                            areaDeptEnum.getDeptId());
-                    demeritRecords.add(demeritRecordPhaseOneTwo);
-                }else{
-                    DemeritRecord phaseOneTwoDeduction = buildDemeritRecord(
-                            ConstructionTypeEnum.PHASE_ONE_TWO.name(),
-                            BigDecimal.ZERO,
-                            areaDeptEnum.getDeptId());
-                    demeritRecords.add(phaseOneTwoDeduction);
-                }
+                log.info("鍥涙湡鑰冩牳璁板綍鏁皗}", phase_fourth.size());
 
+                List<RecordMetaDSumResult> check_enter_sichuan = resultList.stream()
+                        .filter(result ->{
+                            String no = result.getNo();
+                            return  no != null && checkEnterSichuan.contains(no);
+                        })
+                        .collect(Collectors.toList());
+                log.info("鍏ュ窛鍗虫{}", check_enter_sichuan.size());
 
-                if (CollectionUtils.isNotEmpty(phase_three)){
-                    BigDecimal phaseThreeDeduction = calculateTotalDeduction(phase_three);
-                    DemeritRecord demeritRecordPhaseThree = buildDemeritRecord(
-                            ConstructionTypeEnum.PHASE_THREE.name(),
-                            phaseThreeDeduction,
-                            areaDeptEnum.getDeptId());
-                    demeritRecords.add(demeritRecordPhaseThree);
-                }else {
-                    DemeritRecord phaseThreeDeduction = buildDemeritRecord(
-                            ConstructionTypeEnum.PHASE_THREE.name(),
-                            BigDecimal.ZERO,
-                            areaDeptEnum.getDeptId());
-                    demeritRecords.add(phaseThreeDeduction);
-                }
-                if (CollectionUtils.isNotEmpty(phase_fourth)){
-                    BigDecimal phaseFourthDeduction = calculateTotalDeduction(phase_fourth);
-                    DemeritRecord demeritRecordPhaseFourth = buildDemeritRecord(
-                            ConstructionTypeEnum.PHASE_FOURTH.name(),
-                            phaseFourthDeduction,
-                            areaDeptEnum.getDeptId());
-                    demeritRecords.add(demeritRecordPhaseFourth);
-                }else{
-                    DemeritRecord phaseFourthDeduction = buildDemeritRecord(
-                            ConstructionTypeEnum.PHASE_FOURTH.name(),
-                            BigDecimal.ZERO,
-                            areaDeptEnum.getDeptId());
-                    demeritRecords.add(phaseFourthDeduction);
-                }
-
+                List<RecordMetaDSumResult> eastern_new_city = resultList.stream()
+                        .filter(result ->{
+                            String no = result.getNo();
+                            return  no != null && easternNewCity.contains(no);
+                        })
+                        .collect(Collectors.toList());
+                log.info("涓滈儴鏂板煄{}", eastern_new_city.size());
+                List<RecordMetaDSumResult> yan_tan_phase_two_face = resultList.stream()
+                        .filter(result ->{
+                            String no = result.getNo();
+                            return  no != null && yanTanPhaseTwoFace.contains(no);
+                        })
+                        .collect(Collectors.toList());
+                log.info("娌挎哗浜屾湡浜鸿劯{}", yan_tan_phase_two_face.size());
+                //涓�浜屾湡
+                buildAndAddDemeritRecords(phase_one_two, ConstructionTypeEnum.PHASE_ONE_TWO.name(), areaDeptEnum.getDeptId(),yesterday,demeritRecords);
+                //涓夋湡
+                buildAndAddDemeritRecords(phase_three, ConstructionTypeEnum.PHASE_THREE.name(), areaDeptEnum.getDeptId(),yesterday,demeritRecords);
+                //鍥涙湡
+                buildAndAddDemeritRecords(phase_fourth, ConstructionTypeEnum.PHASE_FOURTH.name(), areaDeptEnum.getDeptId(),yesterday,demeritRecords);
+                //鍏ュ窛鍗虫
+                buildAndAddDemeritRecords(check_enter_sichuan, ConstructionTypeEnum.CHECK_ENTER_SICHUAN.name(), areaDeptEnum.getDeptId(),yesterday,demeritRecords);
+                //涓滈儴鏂板煄
+                buildAndAddDemeritRecords(eastern_new_city, ConstructionTypeEnum.EASTERN_NEW_CITY.name(), areaDeptEnum.getDeptId(),yesterday,demeritRecords);
+                //娌挎哗浜屾湡浜鸿劯
+                buildAndAddDemeritRecords(yan_tan_phase_two_face, ConstructionTypeEnum.YAN_TAN_PHASE_TWO_FACE.name(), areaDeptEnum.getDeptId(),yesterday,demeritRecords);
             }
-
-
 
         }
 
@@ -292,4 +317,25 @@
         log.info("缁撴潫璁$畻姣忔棩鎵e垎璁板綍鎯呭喌锛氭彃鍏ユ暟鎹噺{},鏁版嵁淇℃伅:{}",demeritRecords.size(),demeritRecords);
 
     }
+    public void buildAndAddDemeritRecords(List<RecordMetaDSumResult> constructionByRecordMetaList,
+                                          String constructionType,Integer areaDeptId,Date recordTime,
+                                          List<DemeritRecord> demeritRecords) {
+        if (CollectionUtils.isNotEmpty(constructionByRecordMetaList)) {
+                    BigDecimal deduction = calculateTotalDeduction(constructionByRecordMetaList);
+                    DemeritRecord demeritRecord = buildDemeritRecord(
+                            constructionType,
+                            deduction,
+                            areaDeptId,
+                            DateUtils.getDayStart(recordTime));
+                    demeritRecords.add(demeritRecord);
+                }else{
+                    DemeritRecord demeritRecord = buildDemeritRecord(
+                            constructionType,
+                            BigDecimal.ZERO,
+                            areaDeptId,
+                            DateUtils.getDayStart(recordTime));
+                    demeritRecords.add(demeritRecord);
+        }
+    }
+
 }
diff --git a/ycl-server/src/main/java/com/ycl/task/UYTask.java b/ycl-server/src/main/java/com/ycl/task/UYTask.java
index b1dfe89..fb1bf59 100644
--- a/ycl-server/src/main/java/com/ycl/task/UYTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -182,6 +182,8 @@
      * online瀛楁鏉ヨ嚜浜庝紭浜戯紝pingOnline涓轰富鍔╬ing妫�娴嬬殑銆傚瓨鍏ongo缁欐暟鎹腑蹇冩煡闃�
      */
     public void pointOnline() throws ExecutionException, InterruptedException {
+
+
         log.info("寮�濮嬫娴嬬偣浣嶅湪绾�");
         Integer times = 2;
         SysConfig config = new SysConfig();
@@ -261,6 +263,11 @@
                 unKnownList.add(item.getIp());
             }
         });
+
+        if(!CollectionUtils.isEmpty(onLineList)){
+            log.error("鍦ㄧ嚎鐐逛綅闆嗗悎:{}",onLineList);
+        }
+
         log.error("unKnownList:{}",unKnownList);
         if(!CollectionUtils.isEmpty(offLineList)) {
             log.error("淇敼绂荤嚎鐨勭偣浣嶉泦鍚�:{}",offLineList);
@@ -289,6 +296,10 @@
                         }else if("3".equals(type)){
                             mongoData.setProvinceTag(mongoData.getProvinceTagFace());
                         }
+                        //淇敼绾夸笂
+                        if(mongoData.getPingOnline()){
+                            mongoData.setOnline(1);
+                        }
                         mongoList.add(mongoData);
                     }
                 }
diff --git a/ycl-server/src/main/resources/mapper/zgyw/DemeritREcordMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/DemeritREcordMapper.xml
index 6382d56..47a10cd 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/DemeritREcordMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/DemeritREcordMapper.xml
@@ -18,7 +18,8 @@
             ter.dept_id,
             ter.create_time,
             ter.construction_type,
-            ter.demerit
+            ter.demerit,
+            ter.record_time
         from t_demerit_record ter where ter.deleted = 0
         <if test="query.deptId != null and query.deptId != ''">
             AND ter.dept_id = #{query.deptId}
@@ -28,13 +29,14 @@
         </if>
         <!-- 鏃堕棿鑼冨洿绛涢�夛細鎸夋棩鏌ヨ -->
         <if test="query.searchType == 'day' and query.dayDate != null">
-            AND ter.create_time >= #{query.dayDate}  <!-- 褰撳ぉ00:00:00 -->
-            AND ter.create_time &lt;DATE_ADD(#{query.dayDate}, INTERVAL 1 DAY)  <!-- 娆℃棩00:00:00锛堜笉鍖呭惈锛� -->
+            AND ter.record_time >= #{query.dayDate}  <!-- 褰撳ぉ00:00:00 -->
+            AND ter.record_time &lt;DATE_ADD(#{query.dayDate}, INTERVAL 1 DAY)  <!-- 娆℃棩00:00:00锛堜笉鍖呭惈锛� -->
         </if>
         <!-- 鏃堕棿鑼冨洿绛涢�夛細鎸夋湀鏌ヨ -->
         <if test="query.searchType == 'month' and query.monthDate != null">
             AND ter.create_time >= #{query.monthDate}  <!-- 褰撴湀1鏃�00:00:00 -->
             AND ter.create_time &lt;DATE_ADD(LAST_DAY(#{query.monthDate}), INTERVAL 1 DAY)  <!-- 涓嬫湀1鏃�00:00:00锛堜笉鍖呭惈锛� -->
         </if>
+            ORDER BY ter.record_time DESC
     </select>
 </mapper>
\ No newline at end of file
diff --git a/ycl-server/src/main/resources/mapper/zgyw/IMonitorConstructionMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/IMonitorConstructionMapper.xml
new file mode 100644
index 0000000..03af139
--- /dev/null
+++ b/ycl-server/src/main/resources/mapper/zgyw/IMonitorConstructionMapper.xml
@@ -0,0 +1,13 @@
+<?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.ycl.platform.mapper.IMonitorConstructionMapper">
+    <insert id="insertBatch">
+        INSERT INTO t_monitor_construction(serial_number,tag,deleted) values
+        <foreach collection="list" item="item" index="index" separator=",">
+            ( #{item.serialNumber},#{item.tag},0)
+        </foreach>
+    </insert>
+
+</mapper>
diff --git a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
index bdf1ed6..fa79b60 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -106,7 +106,8 @@
         WHEN p.online = -1 OR p.ping_online = -1 THEN -1
         ELSE 0
         END AS onState, civil_code, d.dept_id, d.dept_name, d.area, p.province_tag_video,p.province_tag_car,p.province_tag_face,p.dept_tag,
-        IF(COUNT(w.id) OVER() > 0, '鏄�', '鍚�') AS error, u.unit_name,p.recovery_time,p.reason,p.start_time,p.end_time, w.work_order_no
+        IF(COUNT(w.id) OVER() > 0, '鏄�', '鍚�') AS error, u.unit_name,p.recovery_time,p.reason,p.start_time,p.end_time, w.work_order_no,
+        tmc.tag
         from t_monitor m
         left join t_yw_point p on m.serial_number = p.serial_number and p.deleted = 0
         left join sys_dept d on p.dept_id = d.dept_id and d.del_flag = 0
@@ -117,6 +118,7 @@
         ) SELECT * FROM cte WHERE rn=1
         ) w on m.serial_number = w.serial_number and w.deleted = 0
         left join t_yw_unit u on p.unit_id = u.id and u.deleted = 0
+        LEFT JOIN t_monitor_construction tmc on m.serial_number = tmc.serial_number and tmc.deleted = 0
         <where>
             p.examine_status = 1
             <if test="serialNumber != null  and serialNumber != ''">and m.serial_number = #{serialNumber}</if>
@@ -166,35 +168,94 @@
             <if test="cameraDept != null  and cameraDept != ''">and camera_dept = #{cameraDept}</if>
             <if test="hybm != null  and hybm != ''">and hybm = #{hybm}</if>
             <if test="lxbm != null ">and lxbm = #{lxbm}</if>
-            <if test="constructionType != null and constructionType != ''">
-                <choose>
-                    <when test="constructionType == 'PHASE_ONE_TWO'">
-                        and m.name LIKE 'DX_%'
-                    </when>
-                    <when test="constructionType == 'PHASE_THREE'">
-                        and m.name LIKE 'LT_%'
-                    </when>
-
-                    <when test="constructionType == 'PHASE_FOURTH'">
-                        and (
-                        m.name LIKE 'DX_R%'
-                        OR
-                        m.name LIKE 'DX_RS%'
-                        )
-                    </when>
-                    <when test="constructionType == 'EASTERN_NEW_CITY'">
-                        and m.name LIKE 'DX_RD%'
-                    </when>
-                    <when test="constructionType == 'YAN_TAN_PHASE_TWO_FACE'">
-                        and m.name LIKE 'DX_R2%'
-                    </when>
-                </choose>
-            </if>
-
             ${params.dataScope}
         </where>
     </select>
+    <select id="selectTMonitorListAndIds" resultType="com.ycl.platform.domain.vo.TMonitorVO">
+        select m.id, m.serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude,
+        camera_capture_area,
+        CASE
+        WHEN p.online = 1 AND p.ping_online = 1 THEN 1
+        WHEN p.online = -1 OR p.ping_online = -1 THEN -1
+        ELSE 0
+        END AS onState, civil_code, d.dept_id, d.dept_name, d.area, p.province_tag_video,p.province_tag_car,p.province_tag_face,p.dept_tag,
+        IF(COUNT(w.id) OVER() > 0, '鏄�', '鍚�') AS error, u.unit_name,p.recovery_time,p.reason,p.start_time,p.end_time, w.work_order_no,
+        tmc.tag
+        from t_monitor m
+        left join t_yw_point p on m.serial_number = p.serial_number and p.deleted = 0
+        left join sys_dept d on p.dept_id = d.dept_id and d.del_flag = 0
+        left join (
+        WITH cte AS (
+        SELECT *,row_number() OVER(PARTITION BY serial_number ORDER BY create_time DESC) rn FROM t_work_order
+        WHERE deleted = 0 AND status != 'AUDITING_SUCCESS'
+        ) SELECT * FROM cte WHERE rn=1
+        ) w on m.serial_number = w.serial_number and w.deleted = 0
+        left join t_yw_unit u on p.unit_id = u.id and u.deleted = 0
+        LEFT JOIN t_monitor_construction tmc on m.serial_number = tmc.serial_number and tmc.deleted = 0
+        <where>
+            p.examine_status = 1
+            <if test="ids != null and ids.size() > 0">
+                and m.serial_number in
+                <foreach collection="ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+            <if test="serialNumber != null  and serialNumber != ''">and m.serial_number = #{serialNumber}</if>
+            <if test="name != null  and name != ''">
+                and (name like concat('%', #{name}, '%')
+                or m.ip like concat('%', #{name}, '%')
+                or m.serial_number like concat('%', #{name}, '%')
+                or u.unit_name like concat('%', #{name}, '%'))
+            </if>
+            <if test="provinceTag != null and cameraFunType == 1">and p.province_tag_video = #{provinceTag}</if>
+            <if test="provinceTag != null and cameraFunType == 2">and p.province_tag_car = #{provinceTag}</if>
+            <if test="provinceTag != null and cameraFunType == 3">and p.province_tag_face = #{provinceTag}</if>
+            <if test="provinceTag != null and recovery == 1">and (p.province_tag_face = #{provinceTag} or p.province_tag_video = #{provinceTag} or p.province_tag_car = #{provinceTag})</if>
+            <if test="deptTag != null ">and p.dept_tag = #{deptTag}</if>
+            <if test="siteType != null ">and site_type = #{siteType}</if>
+            <if test="macAddr != null  and macAddr != ''">and mac_addr = #{macAddr}</if>
+            <if test="ip != null  and ip != ''">and ip = #{ip}</if>
+            <if test="cameraFunType != null  and cameraFunType != ''">and camera_fun_type like concat('%',
+                #{cameraFunType}, '%')
+            </if>
+            <if test="longitude != null  and longitude != ''">and longitude = #{longitude}</if>
+            <if test="latitude != null  and latitude != ''">and latitude = #{latitude}</if>
+            <if test="cameraCaptureArea != null  and cameraCaptureArea != ''">and camera_capture_area =
+                #{cameraCaptureArea}
+            </if>
+            <if test="time !=null and time !=''">and TIMESTAMPDIFF(DAY, p.recovery_time, NOW()) <![CDATA[<=]]> #{time}</if>
+            <if test="onState != null and onState == 1">and (p.online = #{onState} and p.ping_online = #{onState})</if>
+            <if test="onState != null and onState == -1">and (p.online = #{onState} or p.ping_online = #{onState})</if>
+            <if test="onState != null and onState == 0">and (p.online = #{onState} and p.ping_online = #{onState})</if>
+            <if test="civilCode != null  and civilCode != ''">and civil_code = #{civilCode}</if>
+            <if test="integratedDevice != null ">and integrated_device = #{integratedDevice}</if>
+            <if test="cameraBrand != null ">and camera_brand = #{cameraBrand}</if>
+            <if test="address != null  and address != ''">and d.dept_id = #{address}</if>
+            <if test="netWorking != null ">and net_working = #{netWorking}</if>
+            <if test="publicSecurity != null  and publicSecurity != ''">and public_security = #{publicSecurity}</if>
+            <if test="installedTime != null ">and installed_time = #{installedTime}</if>
+            <if test="managementUnit != null  and managementUnit != ''">and management_unit = #{managementUnit}</if>
+            <if test="muContactInfo != null  and muContactInfo != ''">and mu_contact_info = #{muContactInfo}</if>
+            <if test="storageDays != null ">and storage_days = #{storageDays}</if>
+            <if test="monitorAzimuth != null ">and monitor_azimuth = #{monitorAzimuth}</if>
+            <if test="scenePhotoAddr != null  and scenePhotoAddr != ''">and scene_photo_addr = #{scenePhotoAddr}</if>
+            <if test="model != null  and model != ''">and model = #{model}</if>
+            <if test="siteVulgo != null  and siteVulgo != ''">and site_vulgo = #{siteVulgo}</if>
+            <if test="cameraType != null ">and camera_type = #{cameraType}</if>
+            <if test="cameraLightType != null ">and camera_light_type = #{cameraLightType}</if>
+            <if test="encodedFormat != null ">and encoded_format = #{encodedFormat}</if>
+            <if test="cameraDept != null  and cameraDept != ''">and camera_dept = #{cameraDept}</if>
+            <if test="hybm != null  and hybm != ''">and hybm = #{hybm}</if>
+            <if test="lxbm != null ">and lxbm = #{lxbm}</if>
+            ${params.dataScope}
+        </where>
 
+
+
+
+
+
+    </select>
     <select id="exportTMonitorList" resultType="com.ycl.platform.domain.excel.TMonitorExp">
         select m.id, m.serial_number, name, ip, camera_fun_type,
         CASE
@@ -441,6 +502,12 @@
             <if test="address != null">
                 and p.dept_id = #{address}
             </if>
+            <if test="ids != null and ids.size() > 0">
+                and m.serial_number in
+                <foreach collection="ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
             <if test="constructionType != null and constructionType != ''">
                 <choose>
                     <when test="constructionType == 'PHASE_ONE_TWO'">
@@ -464,6 +531,7 @@
                     </when>
                 </choose>
             </if>
+
             ${params.dataScope}
         </where>
     </select>

--
Gitblit v1.8.0