Browse Source

日志优化、电梯视频存储

Lifan 1 year ago
parent
commit
ee7d42a199

+ 2 - 1
.gitignore

@@ -36,4 +36,5 @@ pom.xml.versionsBackup
 rebuild-docker.sh
 */.run/**
 .run/**
-.run
+.run
+logs/**

+ 52 - 5
application/src/main/java/org/thingsboard/server/controller/nanxi/NxEventManagementController.java

@@ -18,10 +18,15 @@ import org.thingsboard.server.domain.BaseOutput;
 import org.thingsboard.server.domain.NxEventManagement;
 import org.thingsboard.server.domain.NxEventPush;
 import org.thingsboard.server.domain.UserInfo;
+import org.thingsboard.server.domain.export.NxEventManagementExport;
+import org.thingsboard.server.domain.export.NxMaterialsManagementExport;
 import org.thingsboard.server.domain.query.NxEventManagementQuery;
+import org.thingsboard.server.domain.query.NxMaterialsManagementQuery;
 import org.thingsboard.server.domain.vo.NxEventManagementVO;
+import org.thingsboard.server.glossary.constants.ExportConstant;
 import org.thingsboard.server.glossary.enums.EventDataSource;
 import org.thingsboard.server.glossary.enums.EventStatus;
+import org.thingsboard.server.service.nanxi.IBasicDataConvertService;
 import org.thingsboard.server.service.nanxi.ICommonService;
 import org.thingsboard.server.service.nanxi.INxEventManagementService;
 import io.swagger.annotations.Api;
@@ -29,14 +34,14 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import org.thingsboard.server.service.security.model.SecurityUser;
+import org.thingsboard.server.utils.ExcelUtil;
 import org.thingsboard.server.utils.NxDateUtils;
 import org.thingsboard.server.utils.UserTicketUtil;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -59,6 +64,8 @@ public class NxEventManagementController {
     private SysDictItemService sysDictItemService;
     @Autowired
     private SysNoticeService sysNoticeService;
+    @Autowired
+    private IBasicDataConvertService basicDataConvertService;
 
     /**
      * 分页查询
@@ -159,6 +166,46 @@ public class NxEventManagementController {
         return nxEventManagementService.batchRemoveNxEventManagementById(list) ? BaseOutput.successMsg("删除成功") : BaseOutput.failure("删除失败");
     }
 
+    /**
+     * 导出
+     * @param nxEventManagementQuery
+     * @param response
+     * @throws IOException
+     */
+    @ApiOperation(value = "导出", notes = "导出")
+    @PostMapping("/export")
+    @SortOrder
+    @CompletePageData
+    public void export(@RequestBody NxEventManagementQuery nxEventManagementQuery, HttpServletResponse response) throws IOException {
+        nxEventManagementQuery.setPageSize(Integer.MAX_VALUE);
+        Collection<NxEventManagement> items = nxEventManagementService.page(nxEventManagementQuery).getItems();
+        List<NxEventManagementExport> list = new ArrayList<>();
+        NxEventManagementExport export = null;
+        for (NxEventManagement item : items) {
+            export = new NxEventManagementExport();
+            basicDataConvertService.pageDataConvert(item);
+            export.setEventName(item.getEventName());
+            export.setEventTypeName(item.getEventTypeName());
+            export.setEventLevelName(item.getEventLevelName());
+            export.setDataSource(Objects.isNull(item.getDataSource()) ? "" : EventDataSource.getEventDataSourceText(item.getDataSource()));
+            export.setStatus(Objects.isNull(item.getStatus()) ? "" : EventStatus.getEventStatusText(item.getStatus()));
+            export.setDomainName(item.getDomainName());
+            export.setIndustryName(item.getIndustryName());
+            export.setSiteName(item.getSiteName());
+            export.setDeviceName(item.getDeviceName());
+            List<NxEventPush> leaders = item.getLeaders();
+            if(!CollectionUtils.isEmpty(leaders)){
+                export.setCompanyName(leaders.get(0).getCompanyName());
+                export.setPersonName(leaders.get(0).getPersonName());
+                export.setContactPhone(leaders.get(0).getContactPhone());
+                export.setExpertDuties(leaders.get(0).getExpertDuties());
+            }
+            export.setPushTime(item.getPushTime());
+            list.add(export);
+        }
+        ExcelUtil.exportExcel(response, ExcelUtil.exportFilename(ExportConstant.EVENT_EXPORT_NAME), ExportConstant.EXPORT_SHEET_NAME, list, NxEventManagementExport.class);
+    }
+
     /**
      * 接收
      * @param id id
@@ -172,7 +219,7 @@ public class NxEventManagementController {
     }
 
     /**
-     * 接收
+     * 催办
      * @param id id
      * @return Result
      */

+ 4 - 1
application/src/main/java/org/thingsboard/server/controller/nanxi/YunTiController.java

@@ -20,6 +20,7 @@ import org.thingsboard.server.dao.yunteng.service.SysNoticeService;
 import org.thingsboard.server.domain.*;
 import org.thingsboard.server.domain.dto.LiftWarningDataDto;
 import org.thingsboard.server.glossary.constants.YunTiMonitorIndex;
+import org.thingsboard.server.glossary.enums.YnEnums;
 import org.thingsboard.server.rpc.YunTiRpc;
 import org.thingsboard.server.rpc.dto.*;
 import org.thingsboard.server.rpc.enums.AlarmType;
@@ -114,7 +115,7 @@ public class YunTiController {
     @RequestMapping("/getYunTiWarningData")
     public String getYunTiWarningData(@RequestBody LiftWarningDataDto liftWarningDataDto){
         setAccessToken();
-        RegisterWarnOriginal registerWarnOriginal = new RegisterWarnOriginal(null, null, liftWarningDataDto.getAlarmCode(), liftWarningDataDto.getRegisterCode(), String.valueOf(liftWarningDataDto.getAlarmType()), String.valueOf(liftWarningDataDto.getAlarmStatus()), liftWarningDataDto.getAlarmTime(), liftWarningDataDto.getAlarmEndTime(), liftWarningDataDto.getYtStatus());
+        RegisterWarnOriginal registerWarnOriginal = new RegisterWarnOriginal(null, null, liftWarningDataDto.getAlarmCode(), liftWarningDataDto.getRegisterCode(), String.valueOf(liftWarningDataDto.getAlarmType()), String.valueOf(liftWarningDataDto.getAlarmStatus()), liftWarningDataDto.getAlarmTime(), liftWarningDataDto.getAlarmEndTime(), liftWarningDataDto.getYtStatus(), YnEnums.NO.getCode());
         registerWarnOriginalService.save(registerWarnOriginal);
         log.info("云梯报警参数:{}", JSON.toJSONString(liftWarningDataDto));
         NxMonitorWarnData monitorWarnData = new NxMonitorWarnData();
@@ -163,6 +164,8 @@ public class YunTiController {
                     BeanUtils.copyProperties(upload, annex);
                     annex.setContactId(monitorWarnData.getId());
                     nxAnnexService.save(annex);
+                    registerWarnOriginal.setYn(YnEnums.YES.getCode());
+                    registerWarnOriginalService.updateById(registerWarnOriginal);
                 }
             }catch (RuntimeException e){
                 log.error("电梯报警存储视频失败:{}", e.getMessage());

+ 41 - 0
application/src/main/java/org/thingsboard/server/converter/JsonMessageConverter.java

@@ -0,0 +1,41 @@
+package org.thingsboard.server.converter;
+
+import ch.qos.logback.classic.pattern.MessageConverter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.helpers.MessageFormatter;
+
+import java.util.stream.Stream;
+
+@Slf4j
+public class JsonMessageConverter extends MessageConverter {
+
+    @Override
+    public String convert(ILoggingEvent event) {
+
+        if(null != event.getArgumentArray() && event.getArgumentArray().length > 0){
+            Object[] objects = Stream.of(event.getArgumentArray()).map(t -> {
+                String str = "";
+                if (t instanceof String) {
+                    // String类型直接打印
+                    str = t.toString();
+                }else if(t instanceof Long
+                        || t instanceof Integer
+                        || t instanceof Double
+                        || t instanceof Float
+                        || t instanceof Character
+                        || t instanceof Boolean
+                            ){
+                    str = String.valueOf(t);
+                } else {
+                    str = JSONUtil.toJsonStr(t);
+                }
+                return str;
+            }).toArray();
+            return MessageFormatter.arrayFormat(event.getMessage(), objects).getMessage();
+        }else{
+            return event.getMessage();
+        }
+    }
+}

+ 4 - 0
application/src/main/java/org/thingsboard/server/domain/RegisterWarnOriginal.java

@@ -58,4 +58,8 @@ public class RegisterWarnOriginal {
      * 20 正常 40 演示 50 测试
      */
     private String ytStatus;
+    /**
+     * 视频是否保存成功 01
+     */
+    private String yn;
 }

+ 56 - 0
application/src/main/java/org/thingsboard/server/domain/export/NxEventManagementExport.java

@@ -0,0 +1,56 @@
+package org.thingsboard.server.domain.export;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author LF
+ * @date 2023-05-06
+ *
+ * @description (NxEmergencyHospital实体类)
+ */
+@Data
+@TableName("nx_event_management")
+@ApiModel(value = "", description = "对象 nxEventManagement")
+@NoArgsConstructor
+@AllArgsConstructor
+public class NxEventManagementExport {
+    @ExcelProperty("事件名称")
+    private String eventName;
+    @ExcelProperty("事件类型")
+    private String eventTypeName;
+    @ExcelProperty("事件级别")
+    private String eventLevelName;
+    @ExcelProperty("事件来源")
+    private String dataSource;
+    @ExcelProperty("事件处置状态")
+    private String status;
+    @ExcelProperty("所属领域")
+    private String domainName;
+    @ExcelProperty("所属行业")
+    private String industryName;
+    @ExcelProperty("站点名称")
+    private String siteName;
+    @ExcelProperty("设备名称")
+    private String deviceName;
+    @ExcelProperty("牵头单位")
+    private String companyName;
+    @ExcelProperty("牵头单位联系人")
+    private String personName;
+    @ExcelProperty("职务")
+    private String expertDuties;
+    @ExcelProperty("联系方式")
+    private String contactPhone;
+    @ExcelProperty("派发日期")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date pushTime;
+}

+ 1 - 0
application/src/main/java/org/thingsboard/server/glossary/constants/ExportConstant.java

@@ -1,6 +1,7 @@
 package org.thingsboard.server.glossary.constants;
 
 public class ExportConstant {
+    public static final String EVENT_EXPORT_NAME = "事件管理";
     public static final String DANGER_EXPORT_NAME = "危险源";
 
     public static final String HOSPITAL_EXPORT_NAME = "应急医疗队";

+ 19 - 0
application/src/main/java/org/thingsboard/server/schedule/YuntiWarnDataVideoScheduledTasks.java

@@ -0,0 +1,19 @@
+package org.thingsboard.server.schedule;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.service.nanxi.INxEventManagementService;
+import org.thingsboard.server.service.nanxi.IRegisterWarnOriginalService;
+
+@Component
+public class YuntiWarnDataVideoScheduledTasks {
+    @Autowired
+    private IRegisterWarnOriginalService registerWarnOriginalService;
+
+    // 每分钟执行一次
+    @Scheduled(cron = "0 0/10 * * * ?")
+    public void queryYunTiWarnDataHasVideo() {
+        registerWarnOriginalService.queryYunTiWarnDataHasVideo();
+    }
+}

+ 4 - 0
application/src/main/java/org/thingsboard/server/service/nanxi/IRegisterWarnOriginalService.java

@@ -20,4 +20,8 @@ public interface IRegisterWarnOriginalService extends IService<RegisterWarnOrigi
     */
     TkPageData<RegisterWarnOriginal> page(RegisterWarnOriginal registerWarnOriginal);
 
+    /**
+     * 查询云梯报警数据是否存储视频
+     */
+    void queryYunTiWarnDataHasVideo();
 }

+ 2 - 4
application/src/main/java/org/thingsboard/server/service/nanxi/impl/NxMonitorWarnDataServiceImpl.java

@@ -25,10 +25,7 @@ import org.thingsboard.server.domain.query.WarnDataCurveQuery;
 import org.thingsboard.server.domain.query.WarnDataQuery;
 import org.thingsboard.server.domain.query.WarnTrendQuery;
 import org.thingsboard.server.domain.vo.*;
-import org.thingsboard.server.glossary.enums.DateTimeEnum;
-import org.thingsboard.server.glossary.enums.WarnHandleStatus;
-import org.thingsboard.server.glossary.enums.WarnHandleUnitEnum;
-import org.thingsboard.server.glossary.enums.WarnLevelStatus;
+import org.thingsboard.server.glossary.enums.*;
 import org.thingsboard.server.mapper.NxMonitorWarnDataMapper;
 import org.thingsboard.server.mapper.ScadaHistoryMapper;
 import org.thingsboard.server.service.nanxi.NxMonitorWarnDataService;
@@ -112,6 +109,7 @@ public class NxMonitorWarnDataServiceImpl extends ServiceImpl<NxMonitorWarnDataM
             warnDataList.forEach(d -> {
                 NxWarnDataQueryExport nxWarnDataQueryExport = new NxWarnDataQueryExport();
                 BeanUtil.copyProperties(d, nxWarnDataQueryExport, true);
+                nxWarnDataQueryExport.setWarnHandleStatus(Objects.isNull(d.getWarnHandleStatus()) ? "" : WarnHandleStatus.getWarningStatusText(d.getWarnHandleStatus()));
                 results.add(nxWarnDataQueryExport);
             });
         }

+ 73 - 8
application/src/main/java/org/thingsboard/server/service/nanxi/impl/RegisterWarnOriginalServiceImpl.java

@@ -1,16 +1,37 @@
 package org.thingsboard.server.service.nanxi.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+import org.thingsboard.server.common.data.yunteng.dto.FileUploadResponse;
 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.thingsboard.server.domain.BaseOutput;
+import org.thingsboard.server.domain.NxAnnex;
 import org.thingsboard.server.domain.RegisterWarnOriginal;
+import org.thingsboard.server.glossary.enums.YnEnums;
 import org.thingsboard.server.mapper.RegisterWarnOriginalMapper;
+import org.thingsboard.server.rpc.YunTiRpc;
+import org.thingsboard.server.rpc.dto.RecordvideoAuthorization;
+import org.thingsboard.server.rpc.dto.Token;
+import org.thingsboard.server.rpc.enums.ErrorCode;
+import org.thingsboard.server.rpc.query.SecretProperties;
+import org.thingsboard.server.service.nanxi.INxAnnexService;
 import org.thingsboard.server.service.nanxi.IRegisterWarnOriginalService;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.thingsboard.server.utils.MinioUtils;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.*;
+
+import static org.thingsboard.server.glossary.constants.ThreadLocalConstant.YUN_TI_ACCESS_TOKEN;
 import static org.thingsboard.server.utils.PageConvert.getPageData;
 /**
  * @author Mu
@@ -19,24 +40,68 @@ import static org.thingsboard.server.utils.PageConvert.getPageData;
  * @description
  */
 @Service
+@Slf4j
 public class RegisterWarnOriginalServiceImpl extends ServiceImpl<RegisterWarnOriginalMapper, RegisterWarnOriginal> implements IRegisterWarnOriginalService {
 
 
-        @Autowired
-        private RegisterWarnOriginalMapper registerWarnOriginalMapper;
+    @Autowired
+    private RegisterWarnOriginalMapper registerWarnOriginalMapper;
+    @Autowired
+    private YunTiRpc yunTiRpc;
+    @Autowired
+    private MinioUtils minioUtils;
+    @Autowired
+    private INxAnnexService nxAnnexService;
+    @Autowired
+    private SecretProperties secretProperties;
 
-        @Override
-        public TkPageData<RegisterWarnOriginal> page(RegisterWarnOriginal registerWarnOriginal) {
-            // 创建分页对象,设置当前页和每页记录数
+    @Override
+    public TkPageData<RegisterWarnOriginal> page(RegisterWarnOriginal registerWarnOriginal) {
+        // 创建分页对象,设置当前页和每页记录数
 //            Page<RegisterWarnOriginal> page = new Page<>(registerWarnOriginal.getPage(), registerWarnOriginal.getPageSize());
 
-            // 构造查询条件
+        // 构造查询条件
 //            Wrapper<RegisterWarnOriginal> wrapper = new QueryWrapper<RegisterWarnOriginal>();
 
-            // 执行分页查询
+        // 执行分页查询
 //            return getPageData(registerWarnOriginalMapper.selectPage(page, wrapper),RegisterWarnOriginal.class);
-            return null;
+        return null;
+    }
+
+    @Override
+    public void queryYunTiWarnDataHasVideo() {
+        LambdaQueryWrapper<RegisterWarnOriginal> wrapper = new LambdaQueryWrapper<RegisterWarnOriginal>();
+        Calendar instance = Calendar.getInstance();
+        instance.add(Calendar.DAY_OF_MONTH, -1);
+        wrapper.eq(RegisterWarnOriginal::getYn, YnEnums.NO.getCode())
+               .gt(RegisterWarnOriginal::getAlarmTime, instance.getTimeInMillis())
+        ;
+        List<RegisterWarnOriginal> registerWarnOriginals = registerWarnOriginalMapper.selectList(wrapper);
+        Map<String, Object> paramMap = null;
+        if(!CollectionUtils.isEmpty(registerWarnOriginals)){
+            BaseOutput<Token> token = yunTiRpc.getToken(secretProperties);
+            if(ErrorCode.SUCCESS.getCode().equals(token.getCode())) YUN_TI_ACCESS_TOKEN.set(token.getData().getAccessToken());
+            for (RegisterWarnOriginal registerWarnOriginal : registerWarnOriginals) {
+                paramMap = new HashMap<>();
+                paramMap.put("alarmCode", registerWarnOriginal.getAlarmCode());
+                BaseOutput<RecordvideoAuthorization> alarmvideoAuthorization = yunTiRpc.getAlarmvideoAuthorization(paramMap);
+                if(alarmvideoAuthorization.getData() != null){
+                    try {
+                        FileUploadResponse upload = minioUtils.saveInputStream(alarmvideoAuthorization.getData().getUrlSec(), registerWarnOriginal.getRegisterCode() + "_" + registerWarnOriginal.getAlarmCode());
+                        NxAnnex annex = new NxAnnex();
+                        BeanUtils.copyProperties(upload, annex);
+                        annex.setContactId(registerWarnOriginal.getWarnId());
+                        nxAnnexService.save(annex);
+                        registerWarnOriginal.setYn(YnEnums.YES.getCode());
+                        this.updateById(registerWarnOriginal);
+                    }catch (RuntimeException e){
+                        log.error("电梯报警存储视频失败:{}", e.getMessage());
+                    }
+                }
+            }
+
         }
+    }
 }
 
 

+ 18 - 16
application/src/main/java/org/thingsboard/server/utils/MinioUtils.java

@@ -1,7 +1,6 @@
 package org.thingsboard.server.utils;
 
 import io.minio.*;
-import io.minio.errors.*;
 import io.minio.http.Method;
 import io.minio.messages.Bucket;
 import lombok.SneakyThrows;
@@ -10,9 +9,8 @@ import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
@@ -27,13 +25,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -44,9 +37,11 @@ public class MinioUtils {
 
     private final MinioFileStorageProperties fileStorageProperties;
     private final MinioClient minioClient;
+    private final String downloadAddress;
 
     @Autowired
-    public MinioUtils(MinioFileStorageProperties fileStorageProperties) {
+    public MinioUtils(MinioFileStorageProperties fileStorageProperties, @Value("${file.download.address}") String downloadAddress) {
+        this.downloadAddress = downloadAddress;
         log.info("endpoint={}  ,  accessKey={}  ,secretKey={}", fileStorageProperties.getMinioUrl(), fileStorageProperties.getMinioName(), fileStorageProperties.getMinioPass());
         this.fileStorageProperties = fileStorageProperties;
         this.minioClient = MinioClient.builder().credentials(fileStorageProperties.getMinioName(), fileStorageProperties.getMinioPass()).endpoint(fileStorageProperties.getMinioUrl()).build();
@@ -153,9 +148,13 @@ public class MinioUtils {
             getUploadObjectUrl(fileName, 7 * 24 * 60 * 60);
             try {
                 // 获取request
-                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-                // 生成下载接口的地址
-                realDownloadPath = request.getRequestURL().toString().replace(request.getServletPath(), "/api/yt/nxAnnex/downloadFile/" + fileName);
+                if(null != RequestContextHolder.getRequestAttributes()){
+                    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+                    // 生成下载接口的地址
+                    realDownloadPath = request.getRequestURL().toString().replace(request.getServletPath(), "/api/yt/nxAnnex/downloadFile/" + fileName);
+                }else{
+                    realDownloadPath = downloadAddress + "/api/yt/nxAnnex/downloadFile/" + fileName;
+                }
             } catch (Exception e) {
                 e.printStackTrace();
                 log.info("Could not upload file " + fileName + ". Please try again!");
@@ -242,10 +241,13 @@ public class MinioUtils {
             upload(commonsMultipartFile);
             // 上传视频到MinIO
 //            minioClient.putObject(PutObjectArgs.builder().bucket(fileStorageProperties.getBucketName()).object(fileName).stream(inputStream, 999999999999l, -1).contentType("application/octet-stream").build());
-            // 获取request
-            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-            // 生成下载接口的地址
-            realDownloadPath = request.getRequestURL().toString().replace(request.getServletPath(), "/api/yt/nxAnnex/downloadFile/" + fileName);
+            if(null != RequestContextHolder.getRequestAttributes()){
+                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+                // 生成下载接口的地址
+                realDownloadPath = request.getRequestURL().toString().replace(request.getServletPath(), "/api/yt/nxAnnex/downloadFile/" + fileName);
+            }else{
+                realDownloadPath = downloadAddress + "/api/yt/nxAnnex/downloadFile/" + fileName;
+            }
             return new FileUploadResponse(fileName, realDownloadPath, "video/mp4", commonsMultipartFile.getSize(), staticPath);
         } catch (Throwable e) {
             e.printStackTrace();

+ 6 - 2
application/src/main/resources/bootstrap-dev.yml

@@ -1,10 +1,12 @@
 yunti:
   register:
-    url: http://125.71.54.118:11225/api/yt/yunTi/getYunTiWarningData
+    url: http://221.182.8.141:11225/api/yt/yunTi/getYunTiWarningData
   secret:
     AppKey: emp6ODEwNDVtSE91M0tWZ0NYSVM1a3l2
     AppSecret: ZW1wNk9ERXdORFZ0U0U5MU0wdFdaME5Z
 file:
+  download:
+    address: http://221.182.8.141:11225
   storage:
     type: minio                          #local, minio, or other to be implemented
     randomFileName: true                  #是否重命名文件名字,防止冲突
@@ -27,4 +29,6 @@ spring:
     username: "${SPRING_DATASOURCE_USERNAME:postgres}"
     password: "${SPRING_DATASOURCE_PASSWORD:tofly@028..}"
     hikari:
-      maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}"
+      maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}"
+log:
+  maxHistory: 30

+ 5 - 1
application/src/main/resources/bootstrap-test.yml

@@ -5,6 +5,8 @@ yunti:
     AppKey: emp6ODEwNDVtSE91M0tWZ0NYSVM1a3l2
     AppSecret: ZW1wNk9ERXdORFZ0U0U5MU0wdFdaME5Z
 file:
+  download:
+    address: http://221.182.8.141:11225
   storage:
     type: minio                          #local, minio, or other to be implemented
     randomFileName: true                  #是否重命名文件名字,防止冲突
@@ -27,4 +29,6 @@ spring:
     username: "${SPRING_DATASOURCE_USERNAME:postgres}"
     password: "${SPRING_DATASOURCE_PASSWORD:tofly@028..}"
     hikari:
-      maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}"
+      maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}"
+log:
+  maxHistory: 30

+ 59 - 50
application/src/main/resources/logback.xml

@@ -1,54 +1,63 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-
-    Copyright © 2016-2022 The Thingsboard Authors
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<!DOCTYPE configuration>
-<configuration scan="true" scanPeriod="10 seconds">
-
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration  debug="false">
+    <!-- 日志名称 -->
+    <property name="LOG_NAME" value="tofly-application" />
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
+    <property name="LOG_HOME" value="logs" />
+
+    <!-- 日志文件存放的历史天数 可以在nacos 或者 bootstrap.properties 中配置,此处配置的变量名为:log.maxHistory -->
+    <springProperty scope="context" name="maxHistory" source="log.maxHistory" />
+    <springProperty name="LOG_PROFILE" scope="context"  source="spring.profiles.active" />
+    <!-- 日志控制台输出 -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
-            <pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <pattern>%d %-5level [${LOG_NAME}-${LOG_PROFILE}] [%t] [%c:%L] -| %msg%n</pattern>
+        </encoder>
+    </appender>
+    <!-- 日志文件输出 -->
+    <appender name="FILE"
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_HOME}/${LOG_NAME}.log</file>
+        <rollingPolicy
+                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 -->
+            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${LOG_NAME}_%i.log.zip</fileNamePattern>
+            <!--日志文件保留天数(FileNamePattern中的%d 格式有关,如果yyyy-MM-dd 则是天数) -->
+            <maxHistory>${maxHistory}</maxHistory>
+            <!--日志文件最大的大小 -->
+            <maxFileSize>10MB</maxFileSize>
+        </rollingPolicy>
+        <encoder
+                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d %-5level [${LOG_NAME}-${LOG_PROFILE}] [%t] [%c:%L] -| %msg%n</pattern>
         </encoder>
     </appender>
 
-    <logger name="org.thingsboard.server" level="DEBUG" />
-    <logger name="org.thingsboard.server.exception" level="DEBUG" />
-    <logger name="org.thingsboard.server.service.telemetry" level="DEBUG" />
-
-<!--    <logger name="org.thingsboard.server.service.queue" level="TRACE" />-->
-<!--    <logger name="org.thingsboard.server.service.transport" level="TRACE" />-->
-<!--    <logger name="org.thingsboard.server.queue.memory.InMemoryStorage" level="DEBUG" />-->
-<!--    <logger name="org.thingsboard.server.service.ttl.AbstractCleanUpService" level="DEBUG" />-->
-
-<!--    <logger name="org.thingsboard.server.service.subscription" level="TRACE"/>-->
-<!--    <logger name="org.thingsboard.server.service.telemetry" level="TRACE"/>-->
-<!--    <logger name="org.eclipse.californium.scandium.DTLSConnector" level="TRACE" />-->
-<!--    <logger name="org.eclipse.californium.scandium.dtls.Handshaker" level="DEBUG" />-->
-
-    <!-- Top Rule Nodes by max execution time -->
-<!--    <logger name="org.thingsboard.server.service.queue.TbMsgPackProcessingContext" level="DEBUG" /> -->
-
-<!-- MQTT transport debug -->
-    <logger name="org.thingsboard.server.transport.mqtt.MqttTransportHandler" level="DEBUG" />
-    <logger name="com.microsoft.azure.servicebus.primitives.CoreMessageReceiver" level="OFF" />
-
-    <root level="INFO">
-        <appender-ref ref="STDOUT"/>
-    </root>
-
-
-</configuration>
+    <logger name="com.alibaba.nacos.client.config" level="WARN"/>
+    <logger name="p6spy" level="debug"/>
+    <logger name="org.zalando" level="trace" />
+    <logger name="com.netflix.config.sources" level="warn" />
+    <logger name="org.springframework.context.support.PostProcessorRegistrationDelegate" level="warn"/>
+    <!-- 开发环境 -->
+    <springProfile name="dev">
+        <root level="DEBUG">
+            <appender-ref ref="CONSOLE" />
+            <appender-ref ref="FILE" />
+        </root>
+    </springProfile>
+    <!-- 测试环境 -->
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE" />
+            <appender-ref ref="FILE" />
+        </root>
+    </springProfile>
+    <!-- 灰度、生产环境 -->
+    <springProfile name="pre,prod">
+        <jmxConfigurator />
+        <root level="INFO">
+            <appender-ref ref="FILE" />
+        </root>
+    </springProfile>
+
+</configuration>

+ 1 - 0
application/src/main/resources/mapper/NxDisposeFeedbackMapper.xml

@@ -10,6 +10,7 @@
             <where>
                     AND em.status in ('1', '2', '3')
                     and em.is_deleted = '0'
+                    and em.event_level_code is not null
                     and ep.person_id = #{query.userId}
                     <if test="query.pushStartTime != null">
                             AND em.push_time >= #{query.pushStartTime}

+ 1 - 0
application/src/main/resources/mapper/NxEventManagementMapper.xml

@@ -10,6 +10,7 @@
         <where>
             AND em.status != '0'
             and em.is_deleted = '0'
+            and em.event_level_code is not null
             <if test="query.pushStartTime != null">
                 AND em.push_time >= #{query.pushStartTime}
             </if>