소스 검색

Merge branch 'master' of http://47.111.81.118:3000/uskycloud/usky-modules into fu-normal-push

fuyuchuan 4 일 전
부모
커밋
d7334bd439
37개의 변경된 파일571개의 추가작업 그리고 56개의 파일을 삭제
  1. 9 4
      service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/impl/BaseAlarmNoticeResultServiceImpl.java
  2. 1 0
      service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/impl/BaseAlarmServiceImpl.java
  3. 2 1
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgDeviceServiceImpl.java
  4. 5 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgDeviceRequestVO.java
  5. 1 1
      service-eg/service-eg-biz/src/main/resources/logback.xml
  6. 5 4
      service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/MybatisGeneratorUtils.java
  7. 14 5
      service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/DemReportInfoController.java
  8. 21 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionSiteStoreController.java
  9. 10 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/DemReportInfo.java
  10. 43 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/PatrolInspectionSiteStore.java
  11. 21 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/ReportResult.java
  12. 4 1
      service-fire/service-fire-biz/src/main/java/com/usky/fire/mapper/PatrolInspectionSiteMapper.java
  13. 16 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/mapper/PatrolInspectionSiteStoreMapper.java
  14. 7 1
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/DemReportInfoService.java
  15. 2 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/PatrolInspectionSiteService.java
  16. 24 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/PatrolInspectionSiteStoreService.java
  17. 92 9
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/DemReportInfoServiceImpl.java
  18. 20 4
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionAreaServiceImpl.java
  19. 7 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionPlanSonServiceImpl.java
  20. 2 2
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionRecordServiceImpl.java
  21. 12 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionSiteServiceImpl.java
  22. 29 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionSiteStoreServiceImpl.java
  23. 68 12
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/ReportResultServiceImpl.java
  24. 10 0
      service-fire/service-fire-biz/src/main/resources/mapper/fire/PatrolInspectionSiteMapper.xml
  25. 13 0
      service-fire/service-fire-biz/src/main/resources/mapper/fire/PatrolInspectionSiteStoreMapper.xml
  26. 1 1
      service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java
  27. 2 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/DmpProductAttributeMapper.java
  28. 3 2
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseAppInfoServiceImpl.java
  29. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java
  30. 62 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpProductAttributeServiceImpl.java
  31. 35 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpProductInfoServiceImpl.java
  32. 7 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/DmpProductAttributeMapper.xml
  33. 5 1
      service-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java
  34. 2 2
      service-job/src/main/java/com/ruoyi/job/task/RyTask.java
  35. 13 0
      service-pm/service-pm-biz/src/main/java/com/usky/pm/service/impl/PmProjectServiceImpl.java
  36. 1 2
      service-pm/service-pm-biz/src/main/java/com/usky/pm/service/impl/PmWorkContentServiceImpl.java
  37. 1 1
      service-pm/service-pm-biz/src/main/java/com/usky/pm/service/impl/PmWorkReportServiceImpl.java

+ 9 - 4
service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/impl/BaseAlarmNoticeResultServiceImpl.java

@@ -93,24 +93,26 @@ public class BaseAlarmNoticeResultServiceImpl extends AbstractCrudService<BaseAl
 
                 if (records3.get(0).getNoticeMethod().contains("电话")) {
                     handleVoiceNotice(sysUser, baseAlarmNoticeResult, records.get(0), baseAlarmType, baseAlarm);
+                    saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
                 }
 
                 if (records3.get(0).getNoticeMethod().contains("短信")) {
                     handleSmsNotice(sysUser, baseAlarmNoticeResult, templateParam);
+                    saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
                 }
 
                 if (records3.get(0).getNoticeMethod().contains("APP")) {
                     handleMceNotice(sysUser, baseAlarmNoticeResult, baseAlarm, baseAlarmType, records2.get(0), "1");
+                    saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
                 }
 
                 if (records3.get(0).getNoticeMethod().contains("微信")) {
                     handleMceNotice(sysUser, baseAlarmNoticeResult, baseAlarm, baseAlarmType, records2.get(0), "2");
+                    saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
                 }
-
-                saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
             }
         } catch (Exception e) {
-            log.error("Error in sending alarm notice", e);
+            log.error("发送报警通知时异常", e);
         }
         return saveAlarmResult;
     }
@@ -163,7 +165,7 @@ public class BaseAlarmNoticeResultServiceImpl extends AbstractCrudService<BaseAl
             request.setTemplateCode(SMS_TEMPLATE_CODE);
             request.setTemplateParam(templateParam);
             SendSmsResponse response = client.getAcsResponse(request);
-            baseAlarmNoticeResult.setNoticeResult(response.getCode() != null && response.getCode().equals("OK") ? 1 : 2);
+            baseAlarmNoticeResult.setNoticeResult(response.getCode() != null && "OK".equals(response.getCode()) ? 1 : 2);
         } catch (Exception e) {
             log.error("用户:{},告警消息短信发送失败", sysUser.getUserId(), e);
             baseAlarmNoticeResult.setNoticeResult(2);
@@ -198,12 +200,15 @@ public class BaseAlarmNoticeResultServiceImpl extends AbstractCrudService<BaseAl
         mceRequestVO.setInfoType(INFO_TYPE);
         mceRequestVO.setInfoTitle(INFO_TITLE);
         mceRequestVO.setDeviceId(device.getDeviceId());
+        log.info("设备ID:{}", device.getDeviceId());
         mceRequestVO.setInfoContent(baseAlarmType.getTypeName());
         mceRequestVO.setAlarmTime(formatAlarmTime(baseAlarm.getAlarmTime()));
+        log.info("告警时间:{}", baseAlarm.getAlarmTime());
         mceRequestVO.setAlarmSendType(sendType);
         mceRequestVO.setRemark(String.format(REMARK_TEMPLATE, device.getDeviceName()));
         mceRequestVO.setUserIds(Collections.singletonList(sysUser.getUserId()));
         mceRequestVO.setUserName(sysUser.getUserName());
+        mceRequestVO.setId(baseAlarm.getId());
         return mceRequestVO;
     }
 

+ 1 - 0
service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/impl/BaseAlarmServiceImpl.java

@@ -115,6 +115,7 @@ public class BaseAlarmServiceImpl extends AbstractCrudService<BaseAlarmMapper, B
                     List<BaseAlarmNotice> records3 = baseAlarmNoticeService.list(lambdaQuery3);
                     if (records3.size()>0){
                         Integer saveAlarmResult = baseAlarmNoticeResultService.send(baseAlarm,records3,alarmId,records,baseAlarmType,records2);
+                        log.info("异步发送告警通知数据: {}", baseAlarm);
                     }
                     return saveResult;
                 }

+ 2 - 1
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgDeviceServiceImpl.java

@@ -68,10 +68,11 @@ public class EgDeviceServiceImpl extends AbstractCrudService<EgDeviceMapper, EgD
                 .like(StringUtils.isNotBlank(requestVO.getInstallAddress()),EgDevice::getInstallAddress,requestVO.getInstallAddress())
                 .eq(null != requestVO.getServiceStatus(),EgDevice::getServiceStatus,requestVO.getServiceStatus())
                 .eq(null != requestVO.getId(),EgDevice::getId,requestVO.getId())
+                .eq(null != requestVO.getDeviceUuid(),EgDevice::getDeviceUuid, requestVO.getDeviceUuid())
                 .eq(EgDevice::getTenantId,tenantId)
                 .orderByDesc(EgDevice::getId);
         page = this.page(page,queryWrapper);
-        if(page.getRecords().size() > 0){
+        if(!page.getRecords().isEmpty()){
 
             LambdaQueryWrapper<MeetingFace> meetingFaceQuery = Wrappers.lambdaQuery();
             meetingFaceQuery.select(MeetingFace::getFid,MeetingFace::getCreateTime,MeetingFace::getVefNum,MeetingFace::getFaceName,MeetingFace::getRemark,MeetingFace::getFaceStatus,MeetingFace::getCardNum,MeetingFace::getBindDevice,MeetingFace::getDeptId,MeetingFace::getTenantId,MeetingFace::getUserId)

+ 5 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgDeviceRequestVO.java

@@ -40,4 +40,9 @@ public class EgDeviceRequestVO implements Serializable {
      * 域名
      */
     private String domain;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
 }

+ 1 - 1
service-eg/service-eg-biz/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/var/log/uskycloud/data-transfer" />
+	<property name="log.path" value="/var/log/uskycloud/service-eg"/>
    <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 

+ 5 - 4
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/MybatisGeneratorUtils.java

@@ -43,10 +43,11 @@ public class MybatisGeneratorUtils {
         //2、数据源配置
         //修改数据源
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-fire?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-fire?useUnicode=true&serverTimezone=GMT&useSSL=false" +
+                "&characterEncoding=utf8");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
-        dsc.setUsername("usky");
-        dsc.setPassword("Yt#75Usky");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
         mpg.setDataSource(dsc);
 
         // 3、包配置
@@ -71,7 +72,7 @@ public class MybatisGeneratorUtils {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("patrol_inspection_abnormal_picture");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude("patrol_inspection_site_store");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 14 - 5
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/DemReportInfoController.java

@@ -8,10 +8,7 @@ import com.usky.common.log.enums.BusinessType;
 import com.usky.fire.domain.BaseCompany;
 import com.usky.fire.domain.DemReportInfo;
 import com.usky.fire.service.DemReportInfoService;
-import com.usky.fire.service.vo.CompanyAddVO;
-import com.usky.fire.service.vo.CompanyDataVo;
-import com.usky.fire.service.vo.DemReportInfoIdVo;
-import com.usky.fire.service.vo.DemReportInfoVo;
+import com.usky.fire.service.vo.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -45,7 +42,7 @@ public class DemReportInfoController {
                                                                @RequestParam(value = "sourceType", required = false) String sourceType,
                                                                @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
                                                                @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
-        return ApiResult.success(demReportInfoService.reportInfoList(companyId,sourceType,pageNum, pageSize));
+        return ApiResult.success(demReportInfoService.reportInfoList(companyId, sourceType, pageNum, pageSize));
     }
 
     /**
@@ -82,5 +79,17 @@ public class DemReportInfoController {
     public ApiResult<List<DemReportInfo>> reportById(@RequestParam(value = "id", required = false) Integer id) {
         return ApiResult.success(demReportInfoService.reportById(id));
     }
+
+    /**
+     * 报告读取状态更新
+     *
+     * @return
+     */
+    @Log(title = "报告读取状态更新", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateReadStatus")
+    public ApiResult<Void> updateReadStatus(@RequestBody DemReportInfoVo vo) {
+        demReportInfoService.updateReadStatus(vo.getId());
+        return ApiResult.success();
+    }
 }
 

+ 21 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionSiteStoreController.java

@@ -0,0 +1,21 @@
+package com.usky.fire.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2025-10-21
+ */
+@Controller
+@RequestMapping("/patrolInspectionSiteStore")
+public class PatrolInspectionSiteStoreController {
+
+}
+

+ 10 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/DemReportInfo.java

@@ -77,5 +77,15 @@ public class DemReportInfo implements Serializable {
      */
     private LocalDateTime sendTime;
 
+    /**
+     * 是否已读
+     */
+    private Integer isRead;
+
+    /**
+     * 读取时间
+     */
+    private LocalDateTime readTime;
+
 
 }

+ 43 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/PatrolInspectionSiteStore.java

@@ -0,0 +1,43 @@
+package com.usky.fire.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author han
+ * @since 2025-10-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class PatrolInspectionSiteStore implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 地点号码
+     */
+    private String siteNubmber;
+
+    /**
+     * 入库时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 入库人
+     */
+    private String creator;
+
+
+}

+ 21 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/ReportResult.java

@@ -1,10 +1,15 @@
 package com.usky.fire.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+
 import java.time.LocalDate;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+
 import java.time.LocalDateTime;
 import java.io.Serializable;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -78,5 +83,21 @@ public class ReportResult implements Serializable {
      */
     private Integer tenantId;
 
+    /**
+     * 报告状态
+     */
+    @TableField(exist = false)
+    private Integer reportStatus;
 
+    /**
+     * 阅读时间
+     */
+    @TableField(exist = false)
+    private LocalDateTime readTime;
+
+    /**
+     * 是否已读
+     */
+    @TableField(exist = false)
+    private Integer isRead;
 }

+ 4 - 1
service-fire/service-fire-biz/src/main/java/com/usky/fire/mapper/PatrolInspectionSiteMapper.java

@@ -2,8 +2,11 @@ package com.usky.fire.mapper;
 
 import com.usky.common.mybatis.core.CrudMapper;
 import com.usky.fire.domain.PatrolInspectionSite;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * <p>
  * Mapper 接口
@@ -14,5 +17,5 @@ import org.springframework.stereotype.Repository;
  */
 @Repository
 public interface PatrolInspectionSiteMapper extends CrudMapper<PatrolInspectionSite> {
-
+    int selectSiteCount(@Param("ids") List<Integer> ids);
 }

+ 16 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/mapper/PatrolInspectionSiteStoreMapper.java

@@ -0,0 +1,16 @@
+package com.usky.fire.mapper;
+
+import com.usky.fire.domain.PatrolInspectionSiteStore;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author han
+ * @since 2025-10-21
+ */
+public interface PatrolInspectionSiteStoreMapper extends CrudMapper<PatrolInspectionSiteStore> {
+
+}

+ 7 - 1
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/DemReportInfoService.java

@@ -26,7 +26,7 @@ public interface DemReportInfoService extends CrudService<DemReportInfo> {
      * @param pageSize     每页条数
      * @return
      */
-    CommonPage<DemReportInfo> reportInfoList(String companyId, String sourceType,Integer pageNum, Integer pageSize);
+    CommonPage<DemReportInfo> reportInfoList(String companyId, String sourceType, Integer pageNum, Integer pageSize);
 
     /**
      * 生成报告单位信息-列表查询
@@ -51,4 +51,10 @@ public interface DemReportInfoService extends CrudService<DemReportInfo> {
      * @return
      */
     List<DemReportInfo> reportById(Integer id);
+
+    /**
+     * 批量更新已读状态
+     * @param id 主键ID
+     */
+    void updateReadStatus(Integer id);
 }

+ 2 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/PatrolInspectionSiteService.java

@@ -46,4 +46,6 @@ public interface PatrolInspectionSiteService extends CrudService<PatrolInspectio
 
     void patrolInspectionSiteImport(MultipartFile multipartFile);
 
+    int siteCount(List<Integer> ids);
+
 }

+ 24 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/PatrolInspectionSiteStoreService.java

@@ -0,0 +1,24 @@
+package com.usky.fire.service;
+
+import com.usky.fire.domain.PatrolInspectionSiteStore;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author han
+ * @since 2025-10-21
+ */
+public interface PatrolInspectionSiteStoreService extends CrudService<PatrolInspectionSiteStore> {
+
+    /**
+     * 巡检点位采集校验
+     *
+     * @param siteNubmber        地点号码
+     * @return
+     */
+    int siteStoreCount(String siteNubmber);
+
+}

+ 92 - 9
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/DemReportInfoServiceImpl.java

@@ -1,21 +1,26 @@
 package com.usky.fire.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.fire.domain.BaseCompany;
-import com.usky.fire.domain.BaseCompanyAttach1;
 import com.usky.fire.domain.DemReportInfo;
+import com.usky.fire.mapper.BaseCompanyMapper;
 import com.usky.fire.mapper.DemReportInfoMapper;
 import com.usky.fire.service.DemReportInfoService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.fire.service.vo.CompanyDataVo;
 import com.usky.fire.service.vo.DemReportInfoIdVo;
 import com.usky.fire.service.vo.DemReportInfoVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -30,21 +35,53 @@ import java.util.*;
  * @author han
  * @since 2023-03-02
  */
+@Slf4j
 @Service
 public class DemReportInfoServiceImpl extends AbstractCrudService<DemReportInfoMapper, DemReportInfo> implements DemReportInfoService {
+
+    @Autowired
+    private BaseCompanyMapper baseCompanyMapper;
+
     @Override
-    public CommonPage<DemReportInfo> reportInfoList(String companyId,String sourceType,Integer pageNum, Integer pageSize) {
+    public CommonPage<DemReportInfo> reportInfoList(String companyId, String sourceType, Integer pageNum, Integer pageSize) {
         IPage<DemReportInfo> page = new Page<>(pageNum, pageSize);
+
+        String organization = null;
+        try {
+            organization = SecurityUtils.getLoginUser().getSysUser().getRemark();
+        } catch (Exception e) {
+            log.error("获取remake失败", e);
+            return ToCommonPage(page);
+        }
+
+        if (StringUtils.isBlank(organization)) {
+            throw new BusinessException("当前登录账号非消防重点单位,请联系管理员!");
+        }
+
+        LambdaQueryWrapper<BaseCompany> queryWrapper3 = Wrappers.lambdaQuery();
+        queryWrapper3.select(BaseCompany::getCompanyId)
+                .eq(BaseCompany::getOrganization, organization);
+        String companyId1 = null;
+        try {
+            companyId1 = baseCompanyMapper.selectOne(queryWrapper3).getCompanyId();
+        } catch (Exception e) {
+            return ToCommonPage(page);
+        }
+
+        if (StringUtils.isBlank(companyId)) {
+            companyId = companyId1;
+        }
+
         LambdaQueryWrapper<DemReportInfo> queryWrapper = Wrappers.lambdaQuery();
-        if ("2".equals(sourceType)){
-            queryWrapper.eq(StringUtils.isNotBlank(companyId), DemReportInfo::getCompanyId, companyId)
-                    .eq(DemReportInfo::getReportStatus, 1)
-                    .orderByDesc(DemReportInfo::getId);
-        }else {
-            queryWrapper.eq(StringUtils.isNotBlank(companyId), DemReportInfo::getCompanyId, companyId)
+        queryWrapper.eq(DemReportInfo::getCompanyId, companyId);
+        if ("2".equals(sourceType)) {
+            queryWrapper.eq(DemReportInfo::getReportStatus, 1)
                     .orderByDesc(DemReportInfo::getId);
+        } else {
+            queryWrapper.orderByDesc(DemReportInfo::getId);
         }
         page = this.page(page, queryWrapper);
+
         return ToCommonPage(page);
     }
 
@@ -62,7 +99,7 @@ public class DemReportInfoServiceImpl extends AbstractCrudService<DemReportInfoM
             LambdaQueryWrapper<DemReportInfo> queryWrapper1 = Wrappers.lambdaQuery();
             queryWrapper1.select(DemReportInfo::getId, DemReportInfo::getCompanyId)
                     .in(DemReportInfo::getCompanyId, companyIdList)
-                    .eq(DemReportInfo::getStatisticsTime, now.get(Calendar.YEAR)+"-"+now.get(Calendar.MONTH)).groupBy(DemReportInfo::getCompanyId);
+                    .eq(DemReportInfo::getStatisticsTime, now.get(Calendar.YEAR) + "-" + now.get(Calendar.MONTH)).groupBy(DemReportInfo::getCompanyId);
             list2 = this.list(queryWrapper1);
             for (int i = 0; i < companyList.size(); i++) {
                 for (int j = 0; j < list2.size(); j++) {
@@ -102,4 +139,50 @@ public class DemReportInfoServiceImpl extends AbstractCrudService<DemReportInfoM
         List<DemReportInfo> list2 = this.list(queryWrapper1);
         return list2;
     }
+
+    @Override
+    public void updateReadStatus(Integer id) {
+        String remark = null;
+        try {
+            remark = SecurityUtils.getLoginUser().getSysUser().getRemark();
+        } catch (NullPointerException e) {
+            log.error("获取remake失败", e);
+            return;
+        }
+
+        String companyId = null;
+        LambdaQueryWrapper<BaseCompany> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(BaseCompany::getCompanyId)
+                .eq(BaseCompany::getOrganization, remark);
+        BaseCompany baseCompany = baseCompanyMapper.selectOne(queryWrapper);
+        if (baseCompany != null) {
+            companyId = baseCompany.getCompanyId();
+        } else {
+            log.warn("未查询到与组织[{}]匹配的公司信息", remark);
+            return;
+        }
+
+        DemReportInfo report = this.getOne(Wrappers.<DemReportInfo>lambdaQuery()
+                .eq(DemReportInfo::getId, id));
+        if (report == null) {
+            log.warn("报告ID[{}]不存在,无法更新已读状态", id);
+            return;
+        }
+
+        String reportCompanyId = report.getCompanyId();
+        if (!Objects.equals(reportCompanyId, companyId)) {
+            log.warn("报告ID[{}]所属公司[{}]与当前用户公司[{}]不匹配,无权限更新",
+                    id, reportCompanyId, companyId);
+            return;
+        }
+
+        if (report.getIsRead() == 0) {
+            report.setReadTime(LocalDateTime.now());
+            report.setIsRead(1);
+            this.updateById(report);
+            log.info("报告ID[{}]已更新为已读状态", id);
+        } else {
+            log.info("报告ID[{}]非第一次阅读,无需更新", id);
+        }
+    }
 }

+ 20 - 4
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionAreaServiceImpl.java

@@ -9,7 +9,9 @@ import com.usky.common.core.exception.BusinessException;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.fire.domain.PatrolInspectionArea;
+import com.usky.fire.domain.PatrolInspectionSite;
 import com.usky.fire.mapper.PatrolInspectionAreaMapper;
+import com.usky.fire.mapper.PatrolInspectionSiteMapper;
 import com.usky.fire.service.BaseCompanyService;
 import com.usky.fire.service.PatrolInspectionAreaService;
 import com.usky.fire.service.vo.PatrolInspectionAreaVo;
@@ -42,6 +44,9 @@ public class PatrolInspectionAreaServiceImpl extends AbstractCrudService<PatrolI
     @Autowired
     private RemoteDeptService remoteDeptService;
 
+    @Autowired
+    private PatrolInspectionSiteMapper patrolInspectionSiteMapper;
+
     /**
      * 巡查自检-巡检区域-新增
      *
@@ -161,18 +166,29 @@ public class PatrolInspectionAreaServiceImpl extends AbstractCrudService<PatrolI
         LambdaQueryWrapper<PatrolInspectionArea> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(PatrolInspectionArea::getEnable, 1).eq(PatrolInspectionArea::getAreaFid, id);
         List<PatrolInspectionArea> patrolInspectionArealist = this.list(queryWrapper);
+        List<Integer> areaIdList = new ArrayList<>();
+        int siteNum = 0;
         if (null != patrolInspectionArealist && !patrolInspectionArealist.isEmpty()) {
+            for (int j = 0; j < patrolInspectionArealist.size(); j++) {
+                areaIdList.add(patrolInspectionArealist.get(j).getId());
+            }
+            areaIdList.add(id);
+            siteNum = patrolInspectionSiteMapper.selectSiteCount(areaIdList);
+        }
+        if (siteNum>0){
             for (int i = 0; i < patrolInspectionArealist.size(); i++) {
                 PatrolInspectionArea patrolInspectionAreaz = new PatrolInspectionArea();
                 patrolInspectionAreaz.setId(patrolInspectionArealist.get(i).getId());
                 patrolInspectionAreaz.setEnable(0);
                 this.updateById(patrolInspectionAreaz);
             }
+            PatrolInspectionArea patrolInspectionArea = new PatrolInspectionArea();
+            patrolInspectionArea.setId(id);
+            patrolInspectionArea.setEnable(0);
+            this.updateById(patrolInspectionArea);
+        }else {
+            throw new BusinessException("区域下有绑定的点位,请解绑后再删除!");
         }
-        PatrolInspectionArea patrolInspectionArea = new PatrolInspectionArea();
-        patrolInspectionArea.setId(id);
-        patrolInspectionArea.setEnable(0);
-        this.updateById(patrolInspectionArea);
     }
 
     /**

+ 7 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionPlanSonServiceImpl.java

@@ -84,6 +84,9 @@ public class PatrolInspectionPlanSonServiceImpl extends AbstractCrudService<Patr
     @Autowired
     private PatrolInspectionAbnormalService patrolInspectionAbnormalService;
 
+    @Autowired
+    private PatrolInspectionSiteStoreService patrolInspectionSiteStoreService;
+
     private static final Logger LOGGER = LoggerFactory.getLogger(PatrolInspectionPlanSonServiceImpl.class);
 
     @Override
@@ -612,9 +615,13 @@ public class PatrolInspectionPlanSonServiceImpl extends AbstractCrudService<Patr
         queryWrapper.eq(PatrolInspectionSite::getSiteNubmber, patrolInspectionSite.getSiteNubmber())
                 .eq(PatrolInspectionSite::getEnable, 1);
         int list = patrolInspectionSiteService.count(queryWrapper);
+        int siteCount = patrolInspectionSiteStoreService.siteStoreCount(patrolInspectionSite.getSiteNubmber());
         if (list > 0) {
             throw new BusinessException("不可重复采集地点");
         }
+        if (siteCount <= 0) {
+            throw new BusinessException("采集点位不合法,请采集合法点位");
+        }
         patrolInspectionSite.setCreator(SecurityUtils.getUsername());
         patrolInspectionSite.setCollector(SecurityUtils.getLoginUser().getSysUser().getNickName());
         patrolInspectionSite.setCreateTime(LocalDateTime.now());

+ 2 - 2
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionRecordServiceImpl.java

@@ -276,7 +276,7 @@ public class PatrolInspectionRecordServiceImpl extends AbstractCrudService<Patro
         }
         List<Integer> planSonidListTwo = this.getPlanSon(null, null);
         if (planSonidListTwo.size() > 0) {
-            siteCount = this.getPlanSiteSonCount(planSonidListTwo, 0);
+            siteCount = this.getPlanSiteSonCount(planSonidListTwo, 2);
             siteCountLeak = this.getPlanSiteSonCount(planSonidListTwo, 1);
         }
         RecordStatisticsVo recordStatisticsVo = new RecordStatisticsVo();
@@ -300,7 +300,7 @@ public class PatrolInspectionRecordServiceImpl extends AbstractCrudService<Patro
     public Integer getPlanSiteSonCount(List<Integer> planSonidList, Integer inspectionStatus) {
         LambdaQueryWrapper<PatrolInspectionPlanSiteSon> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.in(PatrolInspectionPlanSiteSon::getPlanId, planSonidList);
-        if (inspectionStatus != 0 && inspectionStatus != null) {
+        if (inspectionStatus.equals(1)||inspectionStatus.equals(2)){
             queryWrapper.eq(PatrolInspectionPlanSiteSon::getInspectionStatus, inspectionStatus);
         }
         Integer taskCount = planSiteSonService.count(queryWrapper);

+ 12 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionSiteServiceImpl.java

@@ -256,6 +256,8 @@ public class PatrolInspectionSiteServiceImpl extends AbstractCrudService<PatrolI
         }
         if (areaId != null) {
             queryWrapper.eq(PatrolInspectionSite::getAreaId, areaId);
+        }else{
+            queryWrapper.ne(PatrolInspectionSite::getAreaId, 0);
         }
         if (StringUtils.isNotBlank(idList)) {
             List<Integer> siteidList = new ArrayList<>();
@@ -338,4 +340,14 @@ public class PatrolInspectionSiteServiceImpl extends AbstractCrudService<PatrolI
         Set<T> set = new HashSet<>(list);
         return new ArrayList<>(set);
     }
+
+    @Override
+    public int siteCount(List<Integer> ids){
+        LambdaQueryWrapper<PatrolInspectionSite> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(PatrolInspectionSite::getEnable, 1)
+                .in(PatrolInspectionSite::getAreaId, ids);
+        int siteCounts = this.count(queryWrapper);
+        List<Integer> siteIdList = new ArrayList<>();
+        return siteCounts;
+    }
 }

+ 29 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionSiteStoreServiceImpl.java

@@ -0,0 +1,29 @@
+package com.usky.fire.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.fire.domain.PatrolInspectionPlanSiteSon;
+import com.usky.fire.domain.PatrolInspectionSiteStore;
+import com.usky.fire.mapper.PatrolInspectionSiteStoreMapper;
+import com.usky.fire.service.PatrolInspectionSiteStoreService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author han
+ * @since 2025-10-21
+ */
+@Service
+public class PatrolInspectionSiteStoreServiceImpl extends AbstractCrudService<PatrolInspectionSiteStoreMapper, PatrolInspectionSiteStore> implements PatrolInspectionSiteStoreService {
+    @Override
+    public int siteStoreCount(String siteNubmber) {
+        LambdaQueryWrapper<PatrolInspectionSiteStore> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(PatrolInspectionSiteStore::getSiteNubmber, siteNubmber);
+        int siteCount = this.count(queryWrapper);
+        return siteCount;
+    }
+}

+ 68 - 12
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/ReportResultServiceImpl.java

@@ -6,9 +6,9 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.common.core.bean.CommonPage;
-import com.usky.fire.domain.BaseCompanyPerson;
-import com.usky.fire.domain.ReportConfig;
-import com.usky.fire.domain.ReportResult;
+import com.usky.fire.domain.*;
+import com.usky.fire.mapper.BaseCompanyMapper;
+import com.usky.fire.mapper.DemReportInfoMapper;
 import com.usky.fire.mapper.ReportResultMapper;
 import com.usky.fire.service.ReportConfigService;
 import com.usky.fire.service.ReportResultService;
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -33,23 +34,78 @@ import java.util.Map;
 public class ReportResultServiceImpl extends AbstractCrudService<ReportResultMapper, ReportResult> implements ReportResultService {
     @Autowired
     private ReportConfigService reportConfigService;
+    @Autowired
+    private BaseCompanyMapper baseCompanyMapper;
+    @Autowired
+    private DemReportInfoMapper demReportInfoMapper;
 
     @Override
-    public CommonPage<ReportResult> reportResultList(Integer companyId, String sourceType, Integer pageNum,
-                                                     Integer pageSize) {
-        IPage<ReportResult> page = new Page<>(pageNum, pageSize);
+    public CommonPage<ReportResult> reportResultList(Integer companyId, String sourceType, Integer pageNum, Integer pageSize) {
+        Page<ReportResult> page = new Page<>(pageNum, pageSize);
+
         LambdaQueryWrapper<ReportResult> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(ReportResult::getObjectId, companyId)
-                    .orderByDesc(ReportResult::getId);
-        page = this.page(page, queryWrapper);
-        return ToCommonPage(page);
+                .orderByDesc(ReportResult::getId);
+        IPage<ReportResult> resultPage = this.page(page, queryWrapper);
+        List<ReportResult> resultList = resultPage.getRecords();
+
+        List<Integer> objectIdList = resultList.stream()
+                .map(ReportResult::getObjectId)
+                .distinct()
+                .collect(Collectors.toList());
+
+        if (objectIdList.isEmpty()) {
+            return ToCommonPage(resultPage);
+        }
+
+        LambdaQueryWrapper<BaseCompany> baseCompanyQuery = Wrappers.lambdaQuery();
+        baseCompanyQuery.select(BaseCompany::getId, BaseCompany::getCompanyId)
+                .in(BaseCompany::getId, objectIdList);
+        List<BaseCompany> baseCompanyList = baseCompanyMapper.selectList(baseCompanyQuery);
+
+        List<String> companyIdList = baseCompanyList.stream()
+                .map(BaseCompany::getCompanyId)
+                .distinct()
+                .collect(Collectors.toList());
+
+        if (companyIdList.isEmpty()) {
+            return ToCommonPage(resultPage);
+        }
+
+        LambdaQueryWrapper<DemReportInfo> demReportQuery = Wrappers.lambdaQuery();
+        demReportQuery.select(DemReportInfo::getIsRead, DemReportInfo::getReadTime, DemReportInfo::getCompanyId, DemReportInfo::getReportStatus)
+                .in(DemReportInfo::getCompanyId, companyIdList);
+        List<DemReportInfo> demReportInfoList = demReportInfoMapper.selectList(demReportQuery);
+
+        Map<String, DemReportInfo> demReportMap = demReportInfoList.stream()
+                .collect(Collectors.toMap(DemReportInfo::getCompanyId, info -> info, (existing, replacement) -> existing));
+
+        Map<Integer, String> baseCompanyMap = baseCompanyList.stream()
+                .collect(Collectors.toMap(BaseCompany::getId, BaseCompany::getCompanyId, (existing, replacement) -> existing));
+
+        for (ReportResult reportResult : resultList) {
+            Integer objectId = reportResult.getObjectId();
+            String relatedCompanyId = baseCompanyMap.get(objectId);
+
+            if (relatedCompanyId != null) {
+                DemReportInfo demReportInfo = demReportMap.get(relatedCompanyId);
+                if (demReportInfo != null) {
+                    reportResult.setReportStatus(demReportInfo.getReportStatus());
+                    reportResult.setReadTime(demReportInfo.getReadTime());
+                    reportResult.setIsRead(demReportInfo.getIsRead());
+                }
+            }
+        }
+
+        return ToCommonPage(resultPage);
     }
+
     @Override
     public CommonPage<Object> newReportResultList(String reportObject, Integer pageNum, Integer pageSize) {
         List<Object> list = new ArrayList<>();
         IPage<ReportResult> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<ReportResult> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.like(StringUtils.isNotBlank(reportObject),ReportResult::getReportObject, reportObject)
+        queryWrapper.like(StringUtils.isNotBlank(reportObject), ReportResult::getReportObject, reportObject)
                 .orderByDesc(ReportResult::getId);
         page = this.page(page, queryWrapper);
         LambdaQueryWrapper<ReportConfig> queryWrapper1 = Wrappers.lambdaQuery();
@@ -61,8 +117,8 @@ public class ReportResultServiceImpl extends AbstractCrudService<ReportResultMap
                 map.put("reportObject", page.getRecords().get(i).getReportObject());
                 map.put("overallScore", page.getRecords().get(i).getOverallScore());
                 map.put("createDate", page.getRecords().get(i).getCreateDate());
-                for (int j = 0; j < list1.size(); j++){
-                    if (page.getRecords().get(i).getConfigId().equals(list1.get(j).getId())){
+                for (int j = 0; j < list1.size(); j++) {
+                    if (page.getRecords().get(i).getConfigId().equals(list1.get(j).getId())) {
                         map.put("reportName", list1.get(j).getReportName());
                     }
                 }

+ 10 - 0
service-fire/service-fire-biz/src/main/resources/mapper/fire/PatrolInspectionSiteMapper.xml

@@ -23,4 +23,14 @@
         <result column="company_id" property="companyId" />
     </resultMap>
 
+    <select id="selectSiteCount" resultType="java.lang.Integer">
+        select count(*)
+        from patrol_inspection_site AS a
+        <where>
+            <if test="ids != null">
+                and a.area_id in #{ids}
+            </if>
+        </where>
+    </select>
+
 </mapper>

+ 13 - 0
service-fire/service-fire-biz/src/main/resources/mapper/fire/PatrolInspectionSiteStoreMapper.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.usky.fire.mapper.PatrolInspectionSiteStoreMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.fire.domain.PatrolInspectionSiteStore">
+        <id column="id" property="id" />
+        <result column="site_nubmber" property="siteNubmber" />
+        <result column="create_time" property="createTime" />
+        <result column="creator" property="creator" />
+    </resultMap>
+
+</mapper>

+ 1 - 1
service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java

@@ -6,7 +6,7 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
-@FeignClient(contextId = "RemoteIotTaskService", value = "service-iot" , fallbackFactory = RemoteIotTaskFactory.class)
+@FeignClient(contextId = "remoteIotTaskService", value = "service-iot" , fallbackFactory = RemoteIotTaskFactory.class)
 public interface RemoteIotTaskService {
 
     @GetMapping("/dataOverviewJobData")

+ 2 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/DmpProductAttributeMapper.java

@@ -3,6 +3,7 @@ package com.usky.iot.mapper;
 import com.usky.common.mybatis.core.CrudMapper;
 import com.usky.iot.domain.DmpProductAttribute;
 import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.RequestParam;
 
 
 /**
@@ -15,5 +16,5 @@ import org.springframework.stereotype.Repository;
  */
 @Repository
 public interface DmpProductAttributeMapper extends CrudMapper<DmpProductAttribute> {
-
+    String getSuperTableName(@RequestParam("productId") Integer productId);
 }

+ 3 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseAppInfoServiceImpl.java

@@ -119,11 +119,12 @@ public class BaseAppInfoServiceImpl extends AbstractCrudService<BaseAppInfoMappe
         IPage<BaseAppInfo> page = new Page<>(appInfoRequest.getCurrent(), appInfoRequest.getSize());
         QueryWrapper<BaseAppInfo> queryWrapper = Wrappers.query();
         queryWrapper.eq(StringUtils.isNotBlank(appInfoRequest.getDeviceId()),"device_id",appInfoRequest.getDeviceId())
+                .eq("tenant_id",SecurityUtils.getTenantId())
                 .inSql("id","SELECT MAX(id) AS id FROM base_app_info GROUP BY device_id")
                 .orderByDesc("id");
         page = this.page(page,queryWrapper);
-        if (page.getSize()>0){
-            for (int i = 0; i < page.getSize(); i++) {
+        if (page.getRecords().size()>0){
+            for (int i = 0; i < page.getRecords().size(); i++) {
                 if (page.getRecords().get(i).getCheckStatus().equals(1)){
                     LocalDateTime endTime = LocalDateTime.now();
                     long seconds = ChronoUnit.SECONDS.between(page.getRecords().get(i).getUpdateTime(), endTime);

+ 1 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java

@@ -606,7 +606,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
 
     @Override
     public void updateDeviceStatus(LastInnerQueryVO queryVO){
-        List<LastInnerResultVO> list = remoteTsdbProxyService.last(queryVO);
+        List<LastInnerResultVO> list = remoteTsdbProxyService.queryLastDeviceData(queryVO);
         if(CollectionUtils.isNotEmpty(list)){
             for(int i=0;i<list.size();i++){
                 if(Objects.nonNull(list.get(i).getMetrics())){

+ 62 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpProductAttributeServiceImpl.java

@@ -10,6 +10,11 @@ import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.demo.RemoteTsdbProxyService;
+import com.usky.demo.domain.DataTypeEnum;
+import com.usky.demo.domain.Fields;
+import com.usky.demo.domain.FieldsVO;
+import com.usky.demo.domain.SuperTableDTO;
 import com.usky.iot.domain.DmpProductAttribute;
 import com.usky.iot.domain.DmpProductInfo;
 import com.usky.iot.mapper.DmpProductAttributeMapper;
@@ -19,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.rmi.Remote;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -34,7 +40,10 @@ import java.util.Optional;
  */
 @Service
 public class DmpProductAttributeServiceImpl extends AbstractCrudService<DmpProductAttributeMapper, DmpProductAttribute> implements DmpProductAttributeService {
-
+    @Autowired
+    private RemoteTsdbProxyService remoteTsdbProxyService;
+    @Autowired
+    private DmpProductAttributeMapper dmpProductAttributeMapper;
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -47,6 +56,26 @@ public class DmpProductAttributeServiceImpl extends AbstractCrudService<DmpProdu
         dmpProductAttribute.setCreatedTime(new Date());
         dmpProductAttribute.setTenantId(SecurityUtils.getTenantId());
         this.save(dmpProductAttribute);
+
+        SuperTableDTO superTableDTO = new SuperTableDTO();
+        String superTableName = "super_"+dmpProductAttributeMapper.getSuperTableName(dmpProductAttribute.getProductId());
+        superTableDTO.setSuperTableName(superTableName);
+
+        int data_type = dmpProductAttribute.getDataType();
+        String dataType = "";
+        if(data_type == 1){
+            dataType = "INT";
+        }else if(data_type == 2){
+            dataType = "VARCHAR";
+        }else if(data_type == 3){
+            dataType = "BOOL";
+        }else if(data_type == 4) {
+            dataType = "DOUBLE";
+        }
+        FieldsVO fieldsVO = new FieldsVO(dmpProductAttribute.getAttributeCode(), dataType, dmpProductAttribute.getAttributeLength());
+        superTableDTO.setFields(FieldsVO.toFields(fieldsVO));
+        //超级表新增字段
+        remoteTsdbProxyService.addSuperTableColumn(superTableDTO);
         return true;
     }
 
@@ -58,6 +87,28 @@ public class DmpProductAttributeServiceImpl extends AbstractCrudService<DmpProdu
             throw new BusinessException("新增产品属性信息'" + dmpProductAttribute.getAttributeName() + "'失败,产品信息已存在");
         }
         this.updateById(dmpProductAttribute);
+
+        SuperTableDTO superTableDTO = new SuperTableDTO();
+        String superTableName = "super_"+dmpProductAttributeMapper.getSuperTableName(dmpProductAttribute.getProductId());
+        superTableDTO.setSuperTableName(superTableName);
+
+        int data_type = dmpProductAttribute.getDataType();
+        String dataType = "";
+        if(data_type == 1){
+            dataType = "INT";
+        }else if(data_type == 2){
+            dataType = "VARCHAR";
+        }else if(data_type == 3){
+            dataType = "BOOL";
+        }else if(data_type == 4) {
+            dataType = "DOUBLE";
+        }
+        FieldsVO fieldsVO = new FieldsVO(dmpProductAttribute.getAttributeCode(), dataType, dmpProductAttribute.getAttributeLength());
+        superTableDTO.setFields(FieldsVO.toFields(fieldsVO));
+        //超级表删除字段
+        remoteTsdbProxyService.dropSuperTableColumn(superTableDTO);
+        //超级表新增字段
+        remoteTsdbProxyService.addSuperTableColumn(superTableDTO);
     }
 
     @Override
@@ -89,6 +140,16 @@ public class DmpProductAttributeServiceImpl extends AbstractCrudService<DmpProdu
         DmpProductAttribute dmpProductAttribute = this.getById(id);
         Optional.ofNullable(dmpProductAttribute).orElseThrow(() -> new BusinessException("产品不存在"));
         dmpProductAttribute.setDeleteFlag(1);
+
+        SuperTableDTO superTableDTO = new SuperTableDTO();
+        String superTableName = "super_"+dmpProductAttributeMapper.getSuperTableName(dmpProductAttribute.getProductId());
+        superTableDTO.setSuperTableName(superTableName);
+
+        FieldsVO fieldsVO = new FieldsVO(dmpProductAttribute.getAttributeCode(), "", dmpProductAttribute.getAttributeLength());
+        superTableDTO.setFields(FieldsVO.toFields(fieldsVO));
+        //超级表删除字段
+        remoteTsdbProxyService.dropSuperTableColumn(superTableDTO);
+
         return this.updateById(dmpProductAttribute);
     }
 

+ 35 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpProductInfoServiceImpl.java

@@ -16,6 +16,11 @@ import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.demo.RemoteTsdbProxyService;
+import com.usky.demo.constant.TdsConstants;
+import com.usky.demo.domain.DataTypeEnum;
+import com.usky.demo.domain.FieldsVO;
+import com.usky.demo.domain.SuperTableDTO;
 import com.usky.iot.domain.*;
 import com.usky.iot.mapper.DmpProductInfoMapper;
 import com.usky.iot.service.*;
@@ -61,6 +66,9 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
     @Autowired
     private DmpProductCommandService dmpProductCommandService;
 
+    @Autowired
+    private RemoteTsdbProxyService remoteTsdbProxyService;
+
     @Override
     public void add(List<DmpProductInfo> dmpProductInfo) {
         if (CollectionUtils.isEmpty(dmpProductInfo)) {
@@ -105,6 +113,13 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
                     String dataField = one.getDataField();
                     JSONArray array = new JSONArray();
                     array =  JSONArray.parseArray(dataField);
+
+                    SuperTableDTO superTableDTO = new SuperTableDTO();
+                    superTableDTO.setSuperTableName("super_"+productCode);
+                    List<FieldsVO> schemaFields = new ArrayList<>(Arrays.asList(
+                            new FieldsVO(TdsConstants.TS, "TIMESTAMP", null)
+                    ));
+
                     if(array.size()>0){
                         for(int i=0;i<array.size();i++){
                             JSONObject obj = JSONObject.parseObject(array.getString(i));
@@ -122,6 +137,17 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
                             dmpProductAttribute.setAttributePort(attribute_port);
                             dmpProductAttribute.setAttributeType(1);
                             dmpProductAttribute.setDataType(data_type);
+                            String dataType = "";
+                            if(data_type == 1){
+                                dataType = "INT";
+                            }else if(data_type == 2){
+                                dataType = "VARCHAR";
+                            }else if(data_type == 3){
+                                dataType = "BOOL";
+                            }else if(data_type == 4) {
+                                dataType = "DOUBLE";
+                            }
+
                             dmpProductAttribute.setAttributeLength(attribute_length);
                             dmpProductAttribute.setAttributeUnit(attribute_unit);
                             if(Objects.nonNull(obj.getInteger("maximum"))){
@@ -138,8 +164,17 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
                             dmpProductAttribute.setCreatedTime(new Date());
                             dmpProductAttribute.setTenantId(SecurityUtils.getTenantId());
                             dmpProductAttributeService.save(dmpProductAttribute);
+
+                            schemaFields.add(new FieldsVO(attribute_code, dataType, attribute_length));
                         }
                     }
+
+                    List<FieldsVO> tagsFields = Collections.singletonList(new FieldsVO(TdsConstants.DEVICE_IDENTIFICATION, "VARCHAR", 50));
+
+                    superTableDTO.setSchemaFields(FieldsVO.toFieldsList(schemaFields));
+                    superTableDTO.setTagsFields(FieldsVO.toFieldsList(tagsFields));
+                    //创建超级表及列
+                    remoteTsdbProxyService.createSuperTableAndColumn(superTableDTO);
                 }
 
                 if(Objects.nonNull(one.getCommandField())){

+ 7 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/DmpProductAttributeMapper.xml

@@ -28,4 +28,11 @@
         <result column="tenant_id" property="tenantId" />
     </resultMap>
 
+    <select id="getSuperTableName" resultType="String">
+        SELECT product_code
+        FROM dmp_product
+        where id = #{productId}
+    </select>
+
+
 </mapper>

+ 5 - 1
service-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java

@@ -11,6 +11,7 @@ import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.FilterType;
 import org.springframework.core.env.Environment;
 
 import java.net.InetAddress;
@@ -25,7 +26,10 @@ import java.net.UnknownHostException;
 @EnableCustomSwagger2
 @EnableFeignClients(basePackages = {"com.usky"})
 @MapperScan(value = "com.ruoyi.job.mapper")
-@ComponentScan(basePackages = {"com.usky","com.ruoyi"})
+@ComponentScan(basePackages = {"com.usky","com.ruoyi"},
+        excludeFilters = @ComponentScan.Filter(
+                type = FilterType.ASSIGNABLE_TYPE,
+                classes = com.ruoyi.common.core.utils.SpringUtils.class))
 @SpringBootApplication
 public class RuoYiJobApplication
 {

+ 2 - 2
service-job/src/main/java/com/ruoyi/job/task/RyTask.java

@@ -3,7 +3,7 @@ package com.ruoyi.job.task;
 import com.usky.common.core.utils.StringUtils;
 import com.usky.demo.RemoteMeetingService;
 import com.usky.fire.RemoteFireService;
-import com.usky.pm.RemotePmTaskService;
+import com.usky.iot.RemoteIotTaskService;
 import com.usky.pm.RemotePmService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -22,7 +22,7 @@ public class RyTask {
     private RemotePmService remoteIotService;
 
     @Autowired
-    private RemotePmTaskService remoteIotTaskService;
+    private RemoteIotTaskService remoteIotTaskService;
 
     @Autowired
     private RemoteMeetingService remoteMeetingService;

+ 13 - 0
service-pm/service-pm-biz/src/main/java/com/usky/pm/service/impl/PmProjectServiceImpl.java

@@ -71,6 +71,9 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         Integer tenantId = SecurityUtils.getTenantId();
         LocalDateTime now = LocalDateTime.now();
 
+        // 验证项目成员
+        validateProjectMember(project.getProjectMember());
+
         // 检查项目名称是否为空或超过长度限制
         String projectName = project.getProjectName();
         if (StringUtils.isBlank(projectName)) {
@@ -107,6 +110,16 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         saveOrUpdateProject(project, userName, now, deptId, tenantId);
     }
 
+    // 验证项目成员
+    private void validateProjectMember(String member) {
+        if (StringUtils.isBlank(member)) {
+            return;
+        }
+        if (!member.matches("\\d+(,\\d+)*")) {
+            throw new BusinessException("项目成员格式错误!");
+        }
+    }
+
     // 检查项目名称是否已存在
     private void checkProjectNameExistence(PmProject project, Integer tenantId) {
         LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();

+ 1 - 2
service-pm/service-pm-biz/src/main/java/com/usky/pm/service/impl/PmWorkContentServiceImpl.java

@@ -429,8 +429,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     public List<SysUser> nickNames(List<Long> userIds) {
         LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
         usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar, SysUser::getSex, SysUser::getDeptId)
-                .eq(SysUser::getDelFlag, 0)
-                .eq(SysUser::getStatus, 0);
+                .eq(SysUser::getDelFlag, 0);
         if (!userIds.isEmpty()) {
             usersQuery.in(SysUser::getUserId, userIds);
         }

+ 1 - 1
service-pm/service-pm-biz/src/main/java/com/usky/pm/service/impl/PmWorkReportServiceImpl.java

@@ -511,7 +511,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 try {
                     pmReceiveMapper.insert(pmReceive);
                 } catch (Exception e) {
-                    log.error("报告接收人:" + id + ",报告发送人:" + createBy + ",存入报告消息表失败!");
+                    log.error("报告接收人:{},报告发送人:{},存入报告消息表失败!", id, createBy, e);
                     throw new BusinessException(createBy + " 的工作报告存入报告消息表失败!");
                 }
             }