瀏覽代碼

1、物联设备相关代码;2、问题删除、导出代码;3、请求第三方平台使用restTemplate方式;4、修改日志配置文件;

tags/V1.3.3^2
wanjing 11 月之前
父節點
當前提交
847c6372d4
共有 62 個檔案被更改,包括 4056 行新增135 行删除
  1. +27
    -0
      tuoheng-service/tuoheng-admin/pom.xml
  2. +32
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/config/CORSConfig.java
  3. +24
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/controller/InspectionFileController.java
  4. +76
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/controller/IotEquipmentController.java
  5. +2
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/conver/InspectionFileConverMapper.java
  6. +24
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/conver/IotEquipmentConverMapper.java
  7. +67
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/dto/InspectionFileExportExcelDto.java
  8. +70
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/entity/IotEquipment.java
  9. +38
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/IotEquipmentMapper.java
  10. +60
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/AddIotEquipmentRequest.java
  11. +65
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/EditIotEquipmentRequest.java
  12. +27
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/QueryIotEquipmentListRequest.java
  13. +43
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/QueryIotEquipmentPageListRequest.java
  14. +0
    -8
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/accident/verify/AccidentVerifyCompletedService.java
  15. +25
    -8
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/accident/verify/AccidentVerifyService.java
  16. +27
    -13
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/index/IndexServiceImpl.java
  17. +20
    -24
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspection/update/status/UpdateWaittStatusService.java
  18. +20
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/IInspectionFileService.java
  19. +31
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/InspectionFileServiceImpl.java
  20. +73
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/delete/DeleteInspectionFileByIdListService.java
  21. +113
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/export/ExportInspectionFileByIdListService.java
  22. +3
    -8
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/query/QueryInspectionFilePageListService.java
  23. +47
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/IotEquipmentService.java
  24. +88
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/IotEquipmentServiceImpl.java
  25. +94
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/add/AddIotEquipmentService.java
  26. +64
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/delete/DeleteEditIotEquipmentByIdService.java
  27. +100
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/edit/EditIotEquipmentService.java
  28. +78
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/query/QueryEditIotEquipmentByIdService.java
  29. +140
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/query/QueryEditIotEquipmentListService.java
  30. +179
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/query/QueryEditIotEquipmentPageListService.java
  31. +18
    -9
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/DroneControlService.java
  32. +22
    -8
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/ExecuteTaskService.java
  33. +20
    -8
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/GetAirLineListService.java
  34. +21
    -10
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/GetAirportListService.java
  35. +23
    -8
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/PointFlightService.java
  36. +19
    -9
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/ReversalFlightService.java
  37. +35
    -14
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/dsp/DspServiceImpl.java
  38. +19
    -3
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/dsp/StopAIService.java
  39. +73
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/CustomCellWriteHandler.java
  40. +53
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/CustomCellWriteHeightConfig.java
  41. +74
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/CustomCellWriteWidthConfig.java
  42. +96
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/ImageModifyHandler.java
  43. +106
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/ImageModifyHandler2.java
  44. +89
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/StyleUtils.java
  45. +112
    -0
      tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/vo/IotEquipmentVo.java
  46. +20
    -4
      tuoheng-service/tuoheng-admin/src/main/resources/logback.xml
  47. +72
    -0
      tuoheng-service/tuoheng-admin/src/main/resources/mapper/IotEquipmentMapper.xml
  48. +86
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/Test.java
  49. +279
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/WordExportTable.java
  50. +15
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/DataAuthSelect.java
  51. +22
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/DataPermission.java
  52. +182
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/DataPermissionInterceptor.java
  53. +17
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/LazyInit.java
  54. +85
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/mapper/DeptMapperTest.java
  55. +27
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/mapper/SectionMapperTest.java
  56. +25
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/mapper/UserMapperTest.java
  57. +253
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/DeptServiceTest.java
  58. +45
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/DspCallbackServiceTest.java
  59. +263
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/InspectionFileServiceTest.java
  60. +148
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/InspectionServiceTest.java
  61. +80
    -0
      tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/UserServiceTest.java
  62. +0
    -1
      tuoheng-service/tuoheng-miniprogram/src/main/java/com/tuoheng/miniprogram/service/impl/AirportServiceImpl.java

+ 27
- 0
tuoheng-service/tuoheng-admin/pom.xml 查看文件

@@ -155,6 +155,33 @@
<version>2.1.7</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-dom</artifactId>
<version>8.7</version>
</dependency>

<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.0.0</version>
</dependency>

<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.0.0</version>
</dependency>
</dependencies>

<!-- 环境变量配置 -->

+ 32
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/config/CORSConfig.java 查看文件

@@ -0,0 +1,32 @@
package com.tuoheng.admin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
* 解决跨域问题
*
* @author wanjing
* @team tuoheng
* @date 2022-11-28
*/
@Configuration
public class CORSConfig {

@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("*")
.allowedOrigins("*");

}
};
}

}

+ 24
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/controller/InspectionFileController.java 查看文件

@@ -124,4 +124,28 @@ public class InspectionFileController {
log.info("进入修改问题类型接口, id={}, questionCode={}", id, questionCode);
return iInspectionFileService.editQuestionType(id, questionCode);
}

/**
*
* 删除问题处理
*
* @param idList
* @return
*/
@GetMapping("/delete/{idList}")
public JsonResult deletedByIdList(@PathVariable("idList") List<String> idList) {
return iInspectionFileService.deletedByIdList(idList);
}

/**
*
* 导出问题清单
*
* @param idList
* @return
*/
@GetMapping("/export/{idList}")
public JsonResult exportExcleByIdList(@PathVariable("idList") List<String> idList) {
return iInspectionFileService.exportExcleByIdList(idList);
}
}

+ 76
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/controller/IotEquipmentController.java 查看文件

@@ -0,0 +1,76 @@
package com.tuoheng.admin.controller;

import com.tuoheng.admin.request.iotequipment.AddIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.EditIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentListRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest;
import com.tuoheng.admin.service.iotequipment.IotEquipmentService;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
* 物联设备前端控制器
*
* @Author wanjing
* @Date 2023-11-25
*/
@RestController
@RequestMapping("/iot/equipment")
@RequiredArgsConstructor
public class IotEquipmentController {

private final IotEquipmentService iotEquipmentService;

/**
* 查询物联设备分页列表
*/
@GetMapping("/page/list")
public JsonResult getPageList(QueryIotEquipmentPageListRequest request) {
return iotEquipmentService.getPageList(request);
}

/**
* 查询物联设备列表
*/
@GetMapping("/list")
public JsonResult getList(QueryIotEquipmentListRequest request) {
return iotEquipmentService.getList(request);
}

/**
* 获取物联设备信息
*/
@GetMapping(value = "/info/{id}")
public JsonResult getInfo(@PathVariable("id") String id) {
return iotEquipmentService.getInfo(id);
}

/**
* 新增获取物联设备
*
* @param request
* @return
*/
@PostMapping("/add")
public JsonResult add(AddIotEquipmentRequest request) {
return iotEquipmentService.add(request);
}

/**
* 修改获取物联设备
*/
@PutMapping("/edit")
public JsonResult edit(EditIotEquipmentRequest request) {
return iotEquipmentService.edit(request);
}


/**
* 删除获取物联设备
*/
@DeleteMapping("/delete/{id}")
public JsonResult deletedById(@PathVariable("id") String id) {
return iotEquipmentService.deletedById(id);
}
}

+ 2
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/conver/InspectionFileConverMapper.java 查看文件

@@ -1,5 +1,6 @@
package com.tuoheng.admin.conver;

import com.tuoheng.admin.dto.InspectionFileExportExcelDto;
import com.tuoheng.admin.entity.InspectionFile;
import com.tuoheng.admin.entity.InspectionFileDistribution;
import com.tuoheng.admin.entity.InspectionFileExtend;
@@ -25,4 +26,5 @@ public interface InspectionFileConverMapper {

List<InspectionFileReportVo> fromInspectionFileListToInspectionFileHandleVoList(List<InspectionFile> inspectionFileList);

List<InspectionFileExportExcelDto> fromInspectionFileListToInspectionFileExportExcelDtoList(List<InspectionFile> inspectionFileList);
}

+ 24
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/conver/IotEquipmentConverMapper.java 查看文件

@@ -0,0 +1,24 @@
package com.tuoheng.admin.conver;

import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.request.iotequipment.AddIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.EditIotEquipmentRequest;
import com.tuoheng.admin.vo.IotEquipmentVo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

@Mapper
public interface IotEquipmentConverMapper {

IotEquipmentConverMapper INSTANCE = Mappers.getMapper(IotEquipmentConverMapper.class);

List<IotEquipmentVo> fromIotEquipmentToIotEquipmentVoList(List<IotEquipment> iotEquipmentList);

IotEquipmentVo fromIotEquipmentToIotEquipmentVo(IotEquipment iotEquipment);

IotEquipment fromAddIotEquipmentToIotEquipment(AddIotEquipmentRequest request);

IotEquipment fromEditIotEquipmentToIotEquipment(EditIotEquipmentRequest request);
}

+ 67
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/dto/InspectionFileExportExcelDto.java 查看文件

@@ -0,0 +1,67 @@
package com.tuoheng.admin.dto;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.alibaba.excel.converters.url.UrlImageConverter;
import lombok.Data;

import java.net.URL;

@Data
@HeadRowHeight(30)
@ContentRowHeight(150)
@ContentFontStyle()
public class InspectionFileExportExcelDto {

/**
* 序号
*/
@ExcelProperty(value = {"列号"}, index = 0)
private Integer sequence;

/**
* 问题类型
*/
@ExcelProperty(value = {"问题类型"}, index = 1)
private String questionDesc;

/**
* 问题图片
*/
@ExcelProperty(value = {"问题图片"}, index = 2, converter = UrlImageConverter.class)
private URL fileOriginal;

/**
* 标注图片
*/
@ExcelProperty(value = {"标注图片"}, index = 3, converter = UrlImageConverter.class)
private URL fileImage;

/**
* 位置
*/
@ExcelProperty(value = {"位置"}, index = 4)
private String location;

/**
* 所属路段
*/
@ExcelProperty(value = {"所属路段"}, index = 5)
private String roadName;

/**
* 所属高速
*/
@ExcelProperty(value = {"所属高速"}, index = 6)
private String sectionName;

/**
* 状态:5待确认 10已忽略 15已确认 20已生成工单 25问题已处理
*/
@ExcelProperty(value = {"状态"}, index = 7)
private String status;

}

+ 70
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/entity/IotEquipment.java 查看文件

@@ -0,0 +1,70 @@
package com.tuoheng.admin.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.tuoheng.common.core.common.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("th_iot_equipment")
public class IotEquipment extends BaseEntity {

/**
* 租户id
*/
private String tenantId;

/**
* 部门id
*/
private String deptId;

/**
* 设备编码
*/
private String code;

/**
* 设备名称
*/
private String name;

/**
* 公路ID
*/
private String roadId;

/**
* 路段ID
*/
private String sectionId;

/**
* 位置
*/
private String location;

/**
* 纬度
*/
private String latitude;

/**
* 经度
*/
private String longitude;

/**
* 监控播放地址
*/
private String playUrl;

/**
* 状态:0:禁用;1:启用;
*/
private Integer status;

}

+ 38
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/mapper/IotEquipmentMapper.java 查看文件

@@ -0,0 +1,38 @@
package com.tuoheng.admin.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.entity.InspectionFile;
import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.request.inspectionfile.QueryInspectionFilePageListByInspectionIdRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
* 物联设备
*
* @author 拓恒
* @since 2023-11-25
*/
public interface IotEquipmentMapper extends BaseMapper<IotEquipment> {

/**
* 查询物联设备分页列表
*
* @param request 物联设备查询实体
* @return 巡检物联设备集合
*/
Page<IotEquipment> selectPageList(@Param("page") IPage page, @Param("request") QueryIotEquipmentPageListRequest request);

/**
* 查询物联设备列表
*
* @param request 巡检任务查询实体
* @return 巡检任务集合
*/
List<IotEquipment> selectList(@Param("request") QueryIotEquipmentPageListRequest request);

}

+ 60
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/AddIotEquipmentRequest.java 查看文件

@@ -0,0 +1,60 @@
package com.tuoheng.admin.request.iotequipment;

import lombok.Data;

/**
* 添加物联设备请求实体
*
* @author wanjing
* @team tuoheng
* @date 2023-11-25
*/
@Data
public class AddIotEquipmentRequest {

/**
* 部门ID
*/
private String deptId;

/**
* 设备编码
*/
private String code;

/**
* 设备名称
*/
private String name;

/**
* 公路ID
*/
private String roadId;

/**
* 路段ID
*/
private String sectionId;

/**
* 位置
*/
private String location;

/**
* 纬度
*/
private String latitude;

/**
* 经度
*/
private String longitude;

/**
* 监控播放地址
*/
private String playUrl;

}

+ 65
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/EditIotEquipmentRequest.java 查看文件

@@ -0,0 +1,65 @@
package com.tuoheng.admin.request.iotequipment;

import lombok.Data;

/**
* 修改物联设备请求实体
*
* @author wanjing
* @team tuoheng
* @date 2023-11-25
*/
@Data
public class EditIotEquipmentRequest {

/**
* 设备ID
*/
private String id;

/**
* 部门ID
*/
private String deptId;

/**
* 设备编码
*/
private String code;

/**
* 设备名称
*/
private String name;

/**
* 公路ID
*/
private String roadId;

/**
* 路段ID
*/
private String sectionId;

/**
* 位置
*/
private String location;

/**
* 纬度
*/
private String latitude;

/**
* 经度
*/
private String longitude;

/**
* 监控播放地址
*/
private String playUrl;

}

+ 27
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/QueryIotEquipmentListRequest.java 查看文件

@@ -0,0 +1,27 @@
package com.tuoheng.admin.request.iotequipment;

import lombok.Data;

import java.util.List;

/**
* 查询物联设备请求实体
*
* @author wanjing
* @team tuoheng
* @date 2023-11-25
*/
@Data
public class QueryIotEquipmentListRequest {

/**
* 租户Id
*/
private String tenantId;

/**
* 部门Id list
*/
private List<String> deptIdList;

}

+ 43
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/request/iotequipment/QueryIotEquipmentPageListRequest.java 查看文件

@@ -0,0 +1,43 @@
package com.tuoheng.admin.request.iotequipment;

import com.tuoheng.common.core.common.BaseQuery;
import lombok.Data;

import java.util.List;

/**
* 查询物联设备分页请求实体
*
* @author wanjing
* @team tuoheng
* @date 2023-11-25
*/
@Data
public class QueryIotEquipmentPageListRequest extends BaseQuery {

/**
* 租户Id
*/
private String tenantId;

/**
* 部门Id
*/
private String deptId;

/**
* 公路名称
*/
private String roadName;

/**
* 路段名称
*/
private String sectionName;

/**
* 部门Id list
*/
private List<String> deptIdList;

}

+ 0
- 8
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/accident/verify/AccidentVerifyCompletedService.java 查看文件

@@ -3,32 +3,25 @@ package com.tuoheng.admin.service.accident.verify;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.constant.SystemConstant;
import com.tuoheng.admin.entity.Accident;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.entity.InspectionFile;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.AccidentStatusEnum;
import com.tuoheng.admin.enums.InspectionStatusEnum;
import com.tuoheng.admin.enums.InspectionTypeEnum;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.AccidentMapper;
import com.tuoheng.admin.mapper.InspectionFileMapper;
import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.admin.request.accident.AccidentVerifyCompletedRequest;
import com.tuoheng.admin.request.accident.AccidentVerifyRequest;
import com.tuoheng.admin.service.third.airport.DroneControlService;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
* 事故核实完成业务层处理
@@ -54,7 +47,6 @@ public class AccidentVerifyCompletedService {
private DroneControlService droneControlService;

/**
*
* 1、向机场推送返舱指令,无人机返回机场
* 2、修改该事故状态为完成
* 3、应急任务状态改为已完成

+ 25
- 8
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/accident/verify/AccidentVerifyService.java 查看文件

@@ -8,7 +8,10 @@ import com.tuoheng.admin.entity.Accident;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.entity.InspectionFile;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.*;
import com.tuoheng.admin.enums.AccidentStatusEnum;
import com.tuoheng.admin.enums.InspectionStatusEnum;
import com.tuoheng.admin.enums.InspectionTypeEnum;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.AccidentMapper;
import com.tuoheng.admin.mapper.InspectionFileMapper;
import com.tuoheng.admin.mapper.InspectionMapper;
@@ -16,11 +19,16 @@ import com.tuoheng.admin.request.accident.AccidentVerifyRequest;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.*;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

/**
* 事故核实业务层处理
@@ -42,6 +50,10 @@ public class AccidentVerifyService {
@Autowired
private InspectionFileMapper inspectionFileMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

/**
* 1、向机场起降平台推送指令,无人机前往事故发生地点,即获取拍摄到事故照片时所处的经纬度,并在事故地点上方悬停
* 2、修改该事故状态为处理中
@@ -190,13 +202,18 @@ public class AccidentVerifyService {
log.info("调用机场平台,无人机执行定点飞行: url:{}", url);
log.info("调用机场平台,无人机执行定点飞行: jsonObject:{}", jsonObject);

String airPortStr = HttpUtils.doSend(url, jsonObject, null, "POST");
if (StringUtils.isEmpty(airPortStr)) {
log.info("调用机场平台,无人机执行定点飞行:返回数据为空,飞行失败,jsonObject:{}", jsonObject);
throw new ServiceException("机场平台返回数据为空,飞行失败");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(jsonObject, headers);
ResponseEntity<JsonResult> response;
try {
response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
} catch (Exception e) {
log.error("调用机场,无人机执行定点飞行:机场接口返回数据异常, url:{}", url);
log.error("调用机场,无人机执行定点飞行:机场接口返回数据异常, httpEntity:{}", httpEntity);
throw new ServiceException("调用机场,无人机执行定点飞行:机场接口返回数据异常");
}

JsonResult jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
JsonResult jsonResult = response.getBody();
if (0 != jsonResult.getCode()) {
log.info("调用机场平台,无人机执行定点飞行:飞行失败,jsonResult:{}", jsonResult.getMsg());
throw new ServiceException("机场平台返回,飞行失败");

+ 27
- 13
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/index/IndexServiceImpl.java 查看文件

@@ -1,16 +1,16 @@
package com.tuoheng.admin.service.index;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.tuoheng.admin.constant.SystemConstant;
import com.tuoheng.admin.vo.AirportMsgVo;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JacksonUtil;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.math.BigDecimal;
import java.util.Objects;
@@ -21,19 +21,33 @@ import java.util.Objects;
*/
@Service
@Slf4j
public class IndexServiceImpl implements IndexService{
public class IndexServiceImpl implements IndexService {

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

@Override
public JsonResult getAirportMsg(Integer airportId) {
String url = CommonConfig.airportURL + SystemConstant.API_AIRPORT_STATUS;
String param = "airportId=" + airportId;
String result = HttpUtils.sendGet(url, param);
JsonResult jsonResult = JacksonUtil.json2pojo(result, JsonResult.class);
String url = UriComponentsBuilder.fromHttpUrl(CommonConfig.airportURL + SystemConstant.API_AIRPORT_STATUS)
.queryParam("airportId", airportId)
.toUriString();
JsonResult jsonResult;
try {
jsonResult = restTemplate.getForObject(url, JsonResult.class);
} catch (Exception e) {
log.info("获取机场状态,机场平台返回异常, url:{}", url);
return JsonResult.error("获取机场状态,机场平台返回异常");
}
if (0 != jsonResult.getCode()) {
log.info("获取机场状态,机场平台返回失败,jsonResult={}", jsonResult);
return JsonResult.error("获取机场状态,机场平台返回失败");
}

AirportMsgVo airportMsgVo = new AirportMsgVo();
JSONObject dataObject = (JSONObject) JSONObject.toJSON(jsonResult.getData());
JSONObject wthJson = dataObject.getJSONObject("WTH");
if(Objects.nonNull(wthJson)){
if (Objects.nonNull(wthJson)) {
JSONObject parmJson = wthJson.getJSONObject("parmNew");
BigDecimal hum = parmJson.getBigDecimal("Hum").divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP);
airportMsgVo.setHum(hum + "rh");
@@ -46,14 +60,14 @@ public class IndexServiceImpl implements IndexService{
.setWidrName(parmJson.getString("WDIRNAME"));
//用角度表示风向,是把圆周分成360度,北风(N)是0度(即360度),东风(E)是90度,南风(S)是180度,西风(W)是270度
BigDecimal hpa = parmJson.getBigDecimal("Hpa");
if(hpa != null){
if (hpa != null) {
BigDecimal mpa = hpa.divide(new BigDecimal(100000), 1, BigDecimal.ROUND_HALF_UP);
airportMsgVo.setHpa(mpa + "Mpa");
airportMsgVo.setHpa(hpa + "Mpa");
}
}
JSONObject tahJson = dataObject.getJSONObject("TAH");
if(Objects.nonNull(tahJson)){
if (Objects.nonNull(tahJson)) {
JSONObject parmJson = tahJson.getJSONObject("parmNew");
BigDecimal hum = parmJson.getBigDecimal("Hum").divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP);
airportMsgVo.setHum(hum + "rh");
@@ -61,7 +75,7 @@ public class IndexServiceImpl implements IndexService{
airportMsgVo.setTmp(tmp + "℃");
}
JSONObject mountJson = dataObject.getJSONObject("mount");
if(Objects.nonNull(mountJson)){
if (Objects.nonNull(mountJson)) {
airportMsgVo.setMountName(mountJson.getString("cameraName") + "、" +
mountJson.getString("megaphoneName") + "、" +
mountJson.getString("searchlightName")

+ 20
- 24
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspection/update/status/UpdateWaittStatusService.java 查看文件

@@ -15,10 +15,14 @@ import com.tuoheng.admin.service.third.dsp.IDspService;
import com.tuoheng.admin.utils.AirWeatherUtil;
import com.tuoheng.admin.vo.AirWeatherVO;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.List;
import java.util.Objects;
@@ -45,6 +49,10 @@ public class UpdateWaittStatusService {
@Autowired
private IDspService dspService;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

public void updateWaittStatus(Inspection inspection) {
Inspection inspectionUpdate = new Inspection();
inspectionUpdate.setId(inspection.getId());
@@ -101,42 +109,30 @@ public class UpdateWaittStatusService {
}

public JsonResult getWeather(String airportUrl, Integer airportId) {
log.info("获取天气信息begin");
String url = airportUrl + SystemConstant.API_AIRPORT_GET_WEATHER;
String param = "airportId=" + airportId;

log.info("获取天气信息, url={}", url);
log.info("获取天气信息, param={}", param);

String weatherStr = HttpUtils.sendGet(url, param);

log.info("获取天气信息, weatherStr1={}", weatherStr);

String url = UriComponentsBuilder.fromHttpUrl(CommonConfig.airportURL + SystemConstant.API_AIRPORT_GET_WEATHER)
.queryParam("airportId", airportId)
.toUriString();
JsonResult jsonResult;
try {
log.info("获取天气信息, weatherStr2={}", weatherStr);
jsonResult = JacksonUtil.json2pojo(weatherStr, JsonResult.class);

log.info("获取天气信息, jsonResult={}", jsonResult);

jsonResult = restTemplate.getForObject(url, JsonResult.class);
} catch (Exception e) {
log.info("获机场列表接口异常, url:{}", url);
throw new ServiceException("获机场列表接口异常");
}
try {
if (ObjectUtil.isEmpty(jsonResult) || Objects.requireNonNull(jsonResult).getCode() != 0) {
log.info("获取天气信息失败,返回为空或code不为0");
log.info("获取天气信息失败,url={}", url);
log.info("获取天气信息失败,param={}", param);
log.info("获取天气信息失败,返回为空或code为0");
return JsonResult.error(EditInspectionStatusCodeEnum.GET_WEATHER_FAILED.getCode(), EditInspectionStatusCodeEnum.GET_WEATHER_FAILED.getMsg());
}
if (ObjectUtil.isEmpty(jsonResult.getData())) {
log.info("获取天气信息,返回数据为空");
return JsonResult.success(new AirWeatherVO());
}
log.info("获取天气信息, jsonResult.getData={}", jsonResult.getData());
AirWeatherVO airWeatherVO = JSONObject.parseObject(JSONObject.toJSONString(jsonResult.getData()), AirWeatherVO.class);
log.info("获取天气信息,airWeatherVO={}", airWeatherVO);
return JsonResult.success(airWeatherVO);
} catch (Exception e) {
log.info("获取天气信息异常,url={}", url);
log.info("获取天气信息异常,param={}", param);
log.info("获取天气信息异常,e={}", e);
log.error("获取天气信息失败,url={}", url);
log.error("获取天气信息失败,异常!");
return JsonResult.error(EditInspectionStatusCodeEnum.GET_WEATHER_FAILED.getCode(), EditInspectionStatusCodeEnum.GET_WEATHER_FAILED.getMsg());
}
}

+ 20
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/IInspectionFileService.java 查看文件

@@ -98,4 +98,24 @@ public interface IInspectionFileService {
* @return
*/
JsonResult editQuestionType(String id, String questionCode);

/**
*
* 删除问题
*
* @param idList
*
* @return
*/
JsonResult deletedByIdList(List<String> idList);

/**
*
* 导出问题清单
*
* @param idList
*
* @return
*/
JsonResult exportExcleByIdList(List<String> idList);
}

+ 31
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/InspectionFileServiceImpl.java 查看文件

@@ -13,6 +13,8 @@ import com.tuoheng.admin.mapper.*;
import com.tuoheng.admin.query.InspectionFileQuery;
import com.tuoheng.admin.request.inspectionfile.*;
import com.tuoheng.admin.service.inspectionfile.confirm.InspectionFileConfirmService;
import com.tuoheng.admin.service.inspectionfile.delete.DeleteInspectionFileByIdListService;
import com.tuoheng.admin.service.inspectionfile.export.ExportInspectionFileByIdListService;
import com.tuoheng.admin.service.inspectionfile.handle.QueryInspectionFileHandleByInspectionFileIdService;
import com.tuoheng.admin.service.inspectionfile.ignore.InspectionFileIgnoreService;
import com.tuoheng.admin.service.inspectionfile.processing.InspectionFileProcessingService;
@@ -87,6 +89,12 @@ public class InspectionFileServiceImpl implements IInspectionFileService {
@Autowired
private QueryInspectionFileListByDeptUserTypeService queryInspectionFileListByDeptUserTypeService;

@Autowired
private DeleteInspectionFileByIdListService deleteInspectionFileByIdListService;

@Autowired
private ExportInspectionFileByIdListService exportInspectionFileByIdListService;

/**
* 问题类型和任务名称
*
@@ -295,4 +303,27 @@ public class InspectionFileServiceImpl implements IInspectionFileService {
public JsonResult editQuestionType(String id, String questionCode) {
return updateInspectionFileQuestionTypeService.update(id, questionCode);
}

/**
* 删除问题
*
* @param idList
* @return
*/
@Override
public JsonResult deletedByIdList(List<String> idList) {
return deleteInspectionFileByIdListService.deletedByIdList(idList);
}

/**
* 导出问题清单
*
* @param idList
* @return
*/
@Override
public JsonResult exportExcleByIdList(List<String> idList) {
return exportInspectionFileByIdListService.exportExcleByIdList(idList);
}

}

+ 73
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/delete/DeleteInspectionFileByIdListService.java 查看文件

@@ -0,0 +1,73 @@
package com.tuoheng.admin.service.inspectionfile.delete;

import cn.hutool.core.collection.CollectionUtil;
import com.tuoheng.admin.mapper.InspectionFileMapper;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* 修改任务问题类型业务层处理
*
* @author wanjing
* @team tuoheng
* @date 2022-12-16
*/
@Slf4j
@Service
public class DeleteInspectionFileByIdListService {

@Autowired
private InspectionFileMapper inspectionFileMapper;

/**
* 修改任务问题类型
*
* @return
*/
public JsonResult deletedByIdList(List<String> idList) {
log.info("进入删除任务问题接口");
String userId = CurrentUserUtil.getUserId();
JsonResult result = this.check(idList);
if (0 != result.getCode()) {
log.info("修改任务问题类型业务接口:校验失败:{}", result.getMsg());
return result;
}

for (String id : idList) {
Map<String, Object> map = new HashMap<>();
map.put("inspectionId", id);
map.put("mark", 0);
map.put("updateUser", userId);
map.put("updateTime", DateUtils.now());
Integer rowId = inspectionFileMapper.deleteLogicByMap(map);
if (rowId <= 0) {
log.info("删除任务问题失败:inspectionFileId:{}", id);
throw new ServiceException("删除任务问题失败");
}
}
return JsonResult.success();
}

/**
* 检查参数
*
* @param idList
* @return
*/
private JsonResult check(List<String> idList) {
if (CollectionUtil.isEmpty(idList)) {
throw new ServiceException("任务ID为空");
}
return JsonResult.success();
}

}

+ 113
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/export/ExportInspectionFileByIdListService.java 查看文件

@@ -0,0 +1,113 @@
package com.tuoheng.admin.service.inspectionfile.export;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.tuoheng.admin.constant.SystemConstant;
import com.tuoheng.admin.conver.InspectionFileConverMapper;
import com.tuoheng.admin.dto.InspectionFileExportExcelDto;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.entity.InspectionFile;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.InspectionFileMapper;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* 导出任务问题清单业务层处理
*
* @author wanjing
* @team tuoheng
* @date 2023-11-23
*/
@Slf4j
@Service
public class ExportInspectionFileByIdListService {

@Autowired
private InspectionFileMapper inspectionFileMapper;

/**
* 修改任务问题类型
*
* @return
*/
public JsonResult exportExcleByIdList(List<String> idList) {
log.info("进入导出任务问题清单接口");
User user = CurrentUserUtil.getUserInfo();
String userId = CurrentUserUtil.getUserId();
JsonResult result = this.check(idList);
if (0 != result.getCode()) {
log.info("导出任务问题清单:校验失败:{}", result.getMsg());
return result;
}

List<InspectionFile> inspectionFileList = inspectionFileMapper.selectList(Wrappers.<InspectionFile>lambdaQuery()
.eq(InspectionFile::getTenantId, user.getTenantId())
.in(InspectionFile::getId, idList)
.eq(InspectionFile::getMark, MarkEnum.VALID.getCode()));
if (CollectionUtil.isEmpty(inspectionFileList)) {
return JsonResult.success();
}

return JsonResult.success();
}

/**
* 检查参数
*
* @param idList
* @return
*/
private JsonResult check(List<String> idList) {
if (CollectionUtil.isEmpty(idList)) {
throw new ServiceException("任务ID为空");
}
return JsonResult.success();
}

/**
* 生成excel表格
*
* @param inspection
* @param inspectionFileList
* @param filePath
*
* @return
*/
public JsonResult easyExcel(Inspection inspection, List<InspectionFile> inspectionFileList, String filePath) {
log.info("文件输出目录及格式:filePathName={}",filePath);

List<InspectionFileExportExcelDto> inspectionFileExportExcelDtoList = InspectionFileConverMapper.INSTANCE.fromInspectionFileListToInspectionFileExportExcelDtoList(inspectionFileList);

List<List<String>> heads = new ArrayList<>();
String totalName = "项目名称:"+ inspection.getName();
String[] nameString = {"序号", "问题类型","问题图片", "标注图片", "位置", "所属路段", "所属高速", "状态"};
for (String excelName : nameString) {
heads.add(Arrays.asList(totalName, excelName));
}
//需要写出的表格(对应实体类)
try {
EasyExcel.write(filePath, InspectionFileExportExcelDto.class).sheet("问题清单数据")
.head(heads)
.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)) // 简单的列宽策略,列宽20
.doWrite(inspectionFileExportExcelDtoList); // 数据源
} catch (Exception e) {
log.info("生成数据导出excel异常");
throw new RuntimeException(e);
}
log.info("开始写入表格中");

return JsonResult.success();
}
}

+ 3
- 8
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/inspectionfile/query/QueryInspectionFilePageListService.java 查看文件

@@ -55,9 +55,9 @@ public class QueryInspectionFilePageListService {

public JsonResult getPageList(QueryInspectionFilePageListRequest request) {
log.info("进入查询任务问题分页列表业务, request:{}", request.toString());
String userId = CurrentUserUtil.getUserId();
String tenantId = CurrentUserUtil.getTenantId();
User user = CurrentUserUtil.getUserInfo();
String userId = user.getId();
String tenantId = user.getTenantId();
request.setTenantId(tenantId);

JsonResult result = this.check(request);
@@ -106,11 +106,6 @@ public class QueryInspectionFilePageListService {

/**
* 获取部门Id的查询范围
* 1)、deptId:如果传了值,查该部门的任务
* 2)、deptId:如果没有传值
* 2.1)、管理员:可查全部确认问题
* 2.2)、管理员/普通用户:本部门及子部门创建的任务中已确认问题
*
* @param deptId
* @return
*/

+ 47
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/IotEquipmentService.java 查看文件

@@ -0,0 +1,47 @@
package com.tuoheng.admin.service.iotequipment;

import com.tuoheng.admin.request.iotequipment.AddIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.EditIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentListRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest;
import com.tuoheng.common.core.utils.JsonResult;

public interface IotEquipmentService {

/**
* 查询物联设备分页列表
*/
JsonResult getPageList(QueryIotEquipmentPageListRequest request);

/**
* 查询物联设备列表
*/
JsonResult getList(QueryIotEquipmentListRequest request);

/**
* 获取物联设备信息
*/
JsonResult getInfo(String id);

/**
* 新增获取物联设备
*
* @param request
* @return
*/
JsonResult add(AddIotEquipmentRequest request);

/**
* 修改获取物联设备
*
* @param request
* @return
*/
JsonResult edit(EditIotEquipmentRequest request);

/**
* 删除获取物联设备
*/
JsonResult deletedById(String id);

}

+ 88
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/IotEquipmentServiceImpl.java 查看文件

@@ -0,0 +1,88 @@
package com.tuoheng.admin.service.iotequipment;

import com.tuoheng.admin.request.iotequipment.AddIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.EditIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentListRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest;
import com.tuoheng.admin.service.iotequipment.add.AddIotEquipmentService;
import com.tuoheng.admin.service.iotequipment.delete.DeleteEditIotEquipmentByIdService;
import com.tuoheng.admin.service.iotequipment.edit.EditIotEquipmentService;
import com.tuoheng.admin.service.iotequipment.query.QueryEditIotEquipmentByIdService;
import com.tuoheng.admin.service.iotequipment.query.QueryEditIotEquipmentListService;
import com.tuoheng.admin.service.iotequipment.query.QueryEditIotEquipmentPageListService;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class IotEquipmentServiceImpl implements IotEquipmentService {

private final QueryEditIotEquipmentPageListService queryEditIotEquipmentPageListService;

private final QueryEditIotEquipmentListService queryEditIotEquipmentListService;

private final QueryEditIotEquipmentByIdService queryEditIotEquipmentByIdService;

private final AddIotEquipmentService addIotEquipmentService;

private final EditIotEquipmentService editIotEquipmentService;

private final DeleteEditIotEquipmentByIdService deleteEditIotEquipmentByIdService;

/**
* 查询物联设备分页列表
*/
@Override
public JsonResult getPageList(QueryIotEquipmentPageListRequest request) {
return queryEditIotEquipmentPageListService.getPageList(request);
}

/**
* 查询物联设备列表
*/
@Override
public JsonResult getList(QueryIotEquipmentListRequest request) {
return queryEditIotEquipmentListService.getList(request);
}

/**
* 获取物联设备信息
*/
@Override
public JsonResult getInfo(String id) {
return queryEditIotEquipmentByIdService.getInfoById(id);
}

/**
* 新增获取物联设备
*
* @param request
* @return
*/
@Override
public JsonResult add(AddIotEquipmentRequest request) {
return addIotEquipmentService.add(request);
}

/**
* 修改获取物联设备
*
* @param request
* @return
*/
@Override
public JsonResult edit(EditIotEquipmentRequest request) {
return editIotEquipmentService.edit(request);
}

/**
* 删除获取物联设备
*/
@Override
public JsonResult deletedById(String id) {
return deleteEditIotEquipmentByIdService.deletedById(id);
}
}

+ 94
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/add/AddIotEquipmentService.java 查看文件

@@ -0,0 +1,94 @@
package com.tuoheng.admin.service.iotequipment.add;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.conver.IotEquipmentConverMapper;
import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.IotEquipmentMapper;
import com.tuoheng.admin.request.iotequipment.AddIotEquipmentRequest;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* 物联设备 业务类
*
* @author wanjing
* @since 2023-11-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class AddIotEquipmentService {

private final IotEquipmentMapper iotEquipmentMapper;

public JsonResult add(AddIotEquipmentRequest request) {
User user = CurrentUserUtil.getUserInfo();
JsonResult result = this.check(user.getTenantId(), request);
if (0 != result.getCode()) {
log.info("添加物联设备:校验失败:{}", result.getMsg());
return result;
}
IotEquipment iotEquipment = IotEquipmentConverMapper.INSTANCE.fromAddIotEquipmentToIotEquipment(request);
iotEquipment.setTenantId(user.getTenantId());
iotEquipment.setCreateUser(user.getId());
iotEquipment.setCreateTime(DateUtils.now());
Integer rowId = iotEquipmentMapper.insert(iotEquipment);
if (rowId <= 0) {
log.info("添加物联设备:失败:{}", result.getMsg());
return JsonResult.error("添加物联设备失败");
}
return JsonResult.success();
}

/**
* 检查参数
*
* @param request
* @return
*/
private JsonResult check(String tenantId, AddIotEquipmentRequest request) {
if (StringUtils.isEmpty(request.getCode())) {
throw new ServiceException("设备编码为空");
}
if (StringUtils.isEmpty(request.getName())) {
throw new ServiceException("设备名称为空");
}
if (StringUtils.isEmpty(request.getDeptId())) {
throw new ServiceException("部门Id为空");
}
if (StringUtils.isEmpty(request.getRoadId())) {
throw new ServiceException("高速为空");
}
if (StringUtils.isEmpty(request.getSectionId())) {
throw new ServiceException("路段为空");
}
if (StringUtils.isEmpty(request.getLocation())) {
throw new ServiceException("位置为空");
}
if (StringUtils.isEmpty(request.getLongitude()) || StringUtils.isEmpty(request.getLatitude())) {
throw new ServiceException("经纬度为空");
}
if (StringUtils.isEmpty(request.getPlayUrl())) {
throw new ServiceException("设备地址为空");
}
IotEquipment iotEquipment = iotEquipmentMapper.selectOne(new LambdaQueryWrapper<IotEquipment>()
.eq(IotEquipment::getTenantId, tenantId)
.eq(IotEquipment::getDeptId, request.getDeptId())
.eq(IotEquipment::getCode, request.getCode())
.eq(IotEquipment::getMark, MarkEnum.VALID.getCode()));
if (ObjectUtil.isNotEmpty(iotEquipment)) {
throw new ServiceException("该部门下已存在该编号设备");
}
return JsonResult.success();
}

}

+ 64
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/delete/DeleteEditIotEquipmentByIdService.java 查看文件

@@ -0,0 +1,64 @@
package com.tuoheng.admin.service.iotequipment.delete;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.IotEquipmentMapper;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* 物联设备 业务类
*
* @author wanjing
* @since 2023-11-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class DeleteEditIotEquipmentByIdService {

private final IotEquipmentMapper iotEquipmentMapper;

public JsonResult deletedById(String id) {
User user = CurrentUserUtil.getUserInfo();
JsonResult result = this.check(id);
if (0 != result.getCode()) {
log.info("删除物联设备:校验失败:{}", result.getMsg());
return result;
}
Integer rowId = iotEquipmentMapper.deleteById(id);
if (rowId <= 0) {
log.info("删除物联设备:失败:{}", result.getMsg());
return JsonResult.error("删除物联设备失败");
}
return JsonResult.success();
}

/**
* 检查参数
*
* @param id
* @return
*/
private JsonResult check(String id) {
if (StringUtils.isEmpty(id)) {
throw new ServiceException("设备Id码为空");
}
IotEquipment iotEquipment = iotEquipmentMapper.selectOne(new LambdaQueryWrapper<IotEquipment>()
.eq(IotEquipment::getId, id)
.eq(IotEquipment::getMark, MarkEnum.VALID.getCode()));
if (ObjectUtil.isEmpty(iotEquipment)) {
throw new ServiceException("该设备不存在");
}
return JsonResult.success(iotEquipment);
}

}

+ 100
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/edit/EditIotEquipmentService.java 查看文件

@@ -0,0 +1,100 @@
package com.tuoheng.admin.service.iotequipment.edit;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.conver.IotEquipmentConverMapper;
import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.IotEquipmentMapper;
import com.tuoheng.admin.request.iotequipment.AddIotEquipmentRequest;
import com.tuoheng.admin.request.iotequipment.EditIotEquipmentRequest;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* 物联设备 业务类
*
* @author wanjing
* @since 2023-11-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class EditIotEquipmentService {

private final IotEquipmentMapper iotEquipmentMapper;

public JsonResult edit(EditIotEquipmentRequest request) {
User user = CurrentUserUtil.getUserInfo();
JsonResult result = this.check(user.getTenantId(), request);
if (0 != result.getCode()) {
log.info("修改物联设备:校验失败:{}", result.getMsg());
return result;
}
IotEquipment iotEquipment = IotEquipmentConverMapper.INSTANCE.fromEditIotEquipmentToIotEquipment(request);
iotEquipment.setUpdateUser(user.getId());
iotEquipment.setUpdateTime(DateUtils.now());
Integer rowId = iotEquipmentMapper.updateById(iotEquipment);
if (rowId <= 0) {
log.info("修改物联设备:失败:{}", result.getMsg());
return JsonResult.error("修改物联设备失败");
}
return JsonResult.success();
}

/**
* 检查参数
*
* @param request
* @return
*/
private JsonResult check(String tenantId, EditIotEquipmentRequest request) {
if (StringUtils.isEmpty(request.getCode())) {
throw new ServiceException("设备编码为空");
}
if (StringUtils.isEmpty(request.getName())) {
throw new ServiceException("设备名称为空");
}
if (StringUtils.isEmpty(request.getDeptId())) {
throw new ServiceException("部门Id为空");
}
if (StringUtils.isEmpty(request.getRoadId())) {
throw new ServiceException("高速为空");
}
if (StringUtils.isEmpty(request.getSectionId())) {
throw new ServiceException("路段为空");
}
if (StringUtils.isEmpty(request.getLocation())) {
throw new ServiceException("位置为空");
}
if (StringUtils.isEmpty(request.getLongitude()) || StringUtils.isEmpty(request.getLatitude())) {
throw new ServiceException("经纬度为空");
}
if (StringUtils.isEmpty(request.getPlayUrl())) {
throw new ServiceException("设备地址为空");
}
IotEquipment iotEquipment = iotEquipmentMapper.selectOne(new LambdaQueryWrapper<IotEquipment>()
.eq(IotEquipment::getId, request.getId())
.eq(IotEquipment::getMark, MarkEnum.VALID.getCode()));
if (ObjectUtil.isEmpty(iotEquipment)) {
throw new ServiceException("该设备不存在");
}
iotEquipment = iotEquipmentMapper.selectOne(new LambdaQueryWrapper<IotEquipment>()
.eq(IotEquipment::getTenantId, tenantId)
.eq(IotEquipment::getDeptId, request.getDeptId())
.eq(IotEquipment::getCode, request.getCode())
.eq(IotEquipment::getMark, MarkEnum.VALID.getCode()));
if (ObjectUtil.isNotEmpty(iotEquipment)) {
throw new ServiceException("该部门下已存在该编号设备");
}
return JsonResult.success();
}

}

+ 78
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/query/QueryEditIotEquipmentByIdService.java 查看文件

@@ -0,0 +1,78 @@
package com.tuoheng.admin.service.iotequipment.query;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.conver.IotEquipmentConverMapper;
import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.entity.RoadInformation;
import com.tuoheng.admin.entity.Section;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.IotEquipmentMapper;
import com.tuoheng.admin.mapper.RoadInformationMapper;
import com.tuoheng.admin.mapper.SectionMapper;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.admin.vo.IotEquipmentVo;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* 物联设备 业务类
*
* @author wanjing
* @since 2023-11-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class QueryEditIotEquipmentByIdService {

private final IotEquipmentMapper iotEquipmentMapper;

private final RoadInformationMapper roadInformationMapper;

private final SectionMapper sectionMapper;

public JsonResult getInfoById(String id) {
User user = CurrentUserUtil.getUserInfo();
JsonResult result = this.check(id);
if (0 != result.getCode()) {
log.info("修改物联设备:校验失败:{}", result.getMsg());
return result;
}
IotEquipment iotEquipment = (IotEquipment) result.getData();

IotEquipmentVo iotEquipmentVo = IotEquipmentConverMapper.INSTANCE.fromIotEquipmentToIotEquipmentVo(iotEquipment);
if (StringUtils.isNotEmpty(iotEquipmentVo.getRoadId())) {
RoadInformation roadInformation = roadInformationMapper.selectById(iotEquipmentVo.getRoadId());
if (ObjectUtil.isNotEmpty(roadInformation)) {
iotEquipmentVo.setRoadName(roadInformation.getName());
}
}
return JsonResult.success(iotEquipmentVo);
}

/**
* 检查参数
*
* @param id
* @return
*/
private JsonResult check(String id) {
if (StringUtils.isEmpty(id)) {
throw new ServiceException("设备Id码为空");
}
IotEquipment iotEquipment = iotEquipmentMapper.selectOne(new LambdaQueryWrapper<IotEquipment>()
.eq(IotEquipment::getId, id)
.eq(IotEquipment::getMark, MarkEnum.VALID.getCode()));
if (ObjectUtil.isEmpty(iotEquipment)) {
throw new ServiceException("该设备不存在");
}
return JsonResult.success(iotEquipment);
}

}

+ 140
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/query/QueryEditIotEquipmentListService.java 查看文件

@@ -0,0 +1,140 @@
package com.tuoheng.admin.service.iotequipment.query;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.conver.IotEquipmentConverMapper;
import com.tuoheng.admin.entity.IotEquipment;
import com.tuoheng.admin.entity.RoadInformation;
import com.tuoheng.admin.entity.Section;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.DataPermissionEnum;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.DeptMapper;
import com.tuoheng.admin.mapper.IotEquipmentMapper;
import com.tuoheng.admin.mapper.RoadInformationMapper;
import com.tuoheng.admin.mapper.SectionMapper;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentListRequest;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.admin.vo.IotEquipmentVo;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
* 物联设备 业务类
*
* @author wanjing
* @since 2023-11-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class QueryEditIotEquipmentListService {

private final DeptMapper deptMapper;

private final IotEquipmentMapper iotEquipmentMapper;

private final RoadInformationMapper roadInformationMapper;

private final SectionMapper sectionMapper;

public JsonResult getList(QueryIotEquipmentListRequest request) {
User user = CurrentUserUtil.getUserInfo();
JsonResult result = this.check(request);
if (0 != result.getCode()) {
log.info("查询物联设备列表:校验失败:{}", result.getMsg());
return result;
}

// 获取部门Id的查询范围
List<String> deptIdList = this.getDeptIdList(user);
request.setDeptIdList(deptIdList);

List<IotEquipment> iotEquipmentList = iotEquipmentMapper.selectList(new LambdaQueryWrapper<IotEquipment>()
.eq(IotEquipment::getTenantId, user.getTenantId())
.in(CollectionUtil.isNotEmpty(deptIdList), IotEquipment::getDeptId, deptIdList)
.eq(IotEquipment::getMark, MarkEnum.VALID.getCode()));

List<IotEquipmentVo> iotEquipmentVoList = this.buildIotEquipmentVoList(iotEquipmentList);

return JsonResult.success(iotEquipmentVoList);
}

/**
* 检查参数
*
* @param request
* @return
*/
private JsonResult check(QueryIotEquipmentListRequest request) {
return JsonResult.success();
}

/**
* 获取部门Id的查询范围
*
* @param user
* @return
*/
private List<String> getDeptIdList(User user) {
List<String> deptIdList;
if (DataPermissionEnum.ALL.getCode() == user.getDataPermission()) {
return null;
} else if (DataPermissionEnum.DEPT_AND_SUB_DEPT.getCode() == user.getDataPermission()) {
deptIdList = deptMapper.selectAllChildListById(user.getDeptId());
return deptIdList;
} else if (DataPermissionEnum.DEPT.getCode() == user.getDataPermission()) {
deptIdList = new ArrayList<>();
deptIdList.add(user.getDeptId());
}
return null;
}

private List<IotEquipmentVo> buildIotEquipmentVoList(List<IotEquipment> iotEquipmentList) {
if (CollectionUtil.isEmpty(iotEquipmentList)) {
return null;
}
List<IotEquipmentVo> iotEquipmentVoList = IotEquipmentConverMapper.INSTANCE.fromIotEquipmentToIotEquipmentVoList(iotEquipmentList);
return iotEquipmentVoList;
}

/**
* 获取公路列表,放到map,减少循环次数
*
* @param iotEquipmentList
* @return
*/
private Map<String, RoadInformation> getRoadInformationMap(List<IotEquipment> iotEquipmentList) {
List<String> roadInformationIdList = iotEquipmentList.stream().map(o -> o.getRoadId()).collect(Collectors.toList());
List<RoadInformation> roadInformationList = roadInformationMapper.selectList(new LambdaQueryWrapper<RoadInformation>()
.in(RoadInformation::getId, roadInformationIdList)
.eq(RoadInformation::getMark, MarkEnum.VALID.getCode()));
Map<String, RoadInformation> roadInformationMap = roadInformationList.stream().collect(Collectors.toMap(RoadInformation::getId, Function.identity()));
return roadInformationMap;
}

/**
* 获取路段列表,放到map,减少循环次数
*
* @param iotEquipmentList
* @return
*/
private Map<String, Section> getSectionMap(List<IotEquipment> iotEquipmentList) {
List<String> sectionIdList = iotEquipmentList.stream().map(o -> o.getRoadId()).collect(Collectors.toList());
List<Section> roadInformationList = sectionMapper.selectList(new LambdaQueryWrapper<Section>()
.in(Section::getId, sectionIdList)
.eq(Section::getMark, MarkEnum.VALID.getCode()));
Map<String, Section> sectionMap = roadInformationList.stream().collect(Collectors.toMap(Section::getId, Function.identity()));
return sectionMap;
}
}

+ 179
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/iotequipment/query/QueryEditIotEquipmentPageListService.java 查看文件

@@ -0,0 +1,179 @@
package com.tuoheng.admin.service.iotequipment.query;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tuoheng.admin.conver.IotEquipmentConverMapper;
import com.tuoheng.admin.entity.*;
import com.tuoheng.admin.enums.DataPermissionEnum;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.enums.code.inspection.QueryInspectionPageListCodeEnum;
import com.tuoheng.admin.mapper.DeptMapper;
import com.tuoheng.admin.mapper.IotEquipmentMapper;
import com.tuoheng.admin.mapper.RoadInformationMapper;
import com.tuoheng.admin.mapper.SectionMapper;
import com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.admin.vo.IotEquipmentVo;
import com.tuoheng.admin.vo.accident.AccidentVo;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
* 物联设备 业务类
*
* @author wanjing
* @since 2023-11-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class QueryEditIotEquipmentPageListService {

private final DeptMapper deptMapper;

private final IotEquipmentMapper iotEquipmentMapper;

private final RoadInformationMapper roadInformationMapper;

private final SectionMapper sectionMapper;

public JsonResult getPageList(QueryIotEquipmentPageListRequest request) {
User user = CurrentUserUtil.getUserInfo();
JsonResult result = this.check(request);
if (0 != result.getCode()) {
log.info("查询物联设备分页列表:校验失败:{}", result.getMsg());
return result;
}

// 获取部门Id的查询范围
List<String> deptIdList = this.getDeptIdList(user, user.getDeptId());
request.setDeptIdList(deptIdList);

// 设置分页参数
IPage<IotEquipment> page = new Page<>(request.getPage(), request.getLimit());
// 查询结果
IPage<IotEquipment> pageData = iotEquipmentMapper.selectPageList(page, request);
if (null == pageData || pageData.getTotal() == 0) {
log.info("获取任务分页列表为空");
return JsonResult.success(null, QueryInspectionPageListCodeEnum.DATA_IS_FAILED.getMsg());
}

List<IotEquipmentVo> iotEquipmentVoList = this.buildIotEquipmentVoList(pageData.getRecords());
// 重写返回结果对象
IPage<IotEquipmentVo> pageDataVo = new Page<>();
pageDataVo.setPages(pageData.getPages());
pageDataVo.setCurrent(pageData.getCurrent());
pageDataVo.setSize(pageData.getSize());
pageDataVo.setTotal(pageData.getTotal());
pageDataVo.setRecords(iotEquipmentVoList);
return JsonResult.success(pageDataVo);
}

/**
* 检查参数
*
* @param request
* @return
*/
private JsonResult check(QueryIotEquipmentPageListRequest request) {
return JsonResult.success();
}

/**
* 获取部门Id的查询范围
*
* @param deptId
* @return
*/
private List<String> getDeptIdList(User user, String deptId) {
List<String> deptIdList = new ArrayList<>();
if (!StringUtils.isEmpty(deptId)) {
deptIdList.add(deptId);
return deptIdList;
}
if (DataPermissionEnum.ALL.getCode() == user.getDataPermission()) {
return null;
} else {
deptIdList = deptMapper.selectAllChildListById(user.getDeptId());
return deptIdList;
}
}

private List<IotEquipmentVo> buildIotEquipmentVoList(List<IotEquipment> iotEquipmentList) {
if (CollectionUtil.isEmpty(iotEquipmentList)) {
return null;
}
List<IotEquipmentVo> iotEquipmentVoList = IotEquipmentConverMapper.INSTANCE.fromIotEquipmentToIotEquipmentVoList(iotEquipmentList);

Map<String, Dept> deptMap = this.getDeptMap(iotEquipmentList);
Map<String, RoadInformation> roadInformationMap = this.getRoadInformationMap(iotEquipmentList);
Dept dept;
RoadInformation roadInformation;
for (IotEquipmentVo iotEquipmentVo : iotEquipmentVoList) {
if (ObjectUtil.isNotEmpty(deptMap)) {
dept = deptMap.get(iotEquipmentVo.getDeptId());
if (ObjectUtil.isNotEmpty(dept)) {
iotEquipmentVo.setDeptName(dept.getName());
}
}
if (ObjectUtil.isNotEmpty(roadInformationMap)) {
roadInformation = roadInformationMap.get(iotEquipmentVo.getRoadId());
if (ObjectUtil.isNotEmpty(roadInformation)) {
iotEquipmentVo.setRoadName(roadInformation.getName());
}
}
}

return iotEquipmentVoList;
}

/**
* 设置列表中每一个的部门名称
* 查询到的列表中的部门Id,作为部门id列表,查询所有的部门,该结果数据量不会太大,放到map中
*
* @param iotEquipmentList
* @return
*/
private Map<String, Dept> getDeptMap(List<IotEquipment> iotEquipmentList) {
if (CollectionUtil.isEmpty(iotEquipmentList)) {
return null;
}
List<String> deptIdList = iotEquipmentList.stream().map(o -> o.getDeptId()).collect(Collectors.toList());
List<Dept> deptList = deptMapper.selectListByIdList(deptIdList);
if (CollectionUtil.isEmpty(deptList)) {
return null;
}
Map<String, Dept> deptMap = deptList.stream().collect(Collectors.toMap(Dept::getId, Function.identity()));
return deptMap;
}

/**
*
* 获取公路列表,放到map,减少循环次数
*
* @param iotEquipmentList
* @return
*/
private Map<String, RoadInformation> getRoadInformationMap(List<IotEquipment> iotEquipmentList) {
List<String> roadInformationIdList = iotEquipmentList.stream().map(o -> o.getRoadId()).collect(Collectors.toList());
List<RoadInformation> roadInformationList = roadInformationMapper.selectList(new LambdaQueryWrapper<RoadInformation>()
.in(RoadInformation::getId, roadInformationIdList)
.eq(RoadInformation::getMark, MarkEnum.VALID.getCode()));
Map<String, RoadInformation> roadInformationMap = roadInformationList.stream().collect(Collectors.toMap(RoadInformation::getId, Function.identity()));
return roadInformationMap;
}

}

+ 18
- 9
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/DroneControlService.java 查看文件

@@ -5,13 +5,13 @@ import com.tuoheng.admin.constant.SystemConstant;
import com.tuoheng.admin.mapper.TenantMapper;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JacksonUtil;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
@@ -20,6 +20,10 @@ public class DroneControlService {
@Autowired
private TenantMapper tenantMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

public JsonResult execute(JSONObject jsonObject) {
log.info("进入调用机场平台,操作无人机, jsonObject={}", jsonObject);
String url = CommonConfig.airportURL + SystemConstant.API_AIRPORT_DRONE_CONTROL;
@@ -27,13 +31,18 @@ public class DroneControlService {
log.info("调用机场平台,操作无人机: url:{}", url);
log.info("调用机场平台,操作无人机: jsonObject:{}", jsonObject);

String airPortStr = HttpUtils.doSend(url, jsonObject, null, "POST");
log.info("调用机场平台,操作无人机: airPortStr:{}", airPortStr);
if (StringUtils.isEmpty(airPortStr)) {
log.info("调用机场平台,操作无人机:返回数据为空");
return JsonResult.error(-1, "机场平台返回数据为空");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(jsonObject, headers);
ResponseEntity<JsonResult> response;
try {
response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
} catch (Exception e) {
log.error("调用机场平台,操作无人机异常, url:{}", url);
log.error("调用机场平台,操作无人机异常, httpEntity:{}", httpEntity);
throw new ServiceException("调用机场平台,操作无人机异常");
}
JsonResult jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
JsonResult jsonResult = response.getBody();
if (0 != jsonResult.getCode()) {
log.info("调用机场平台,操作无人机:返回失败,jsonResult:{}", jsonResult.getMsg());
return JsonResult.error(-1, "机场平台返回失败");

+ 22
- 8
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/ExecuteTaskService.java 查看文件

@@ -10,12 +10,16 @@ import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.admin.mapper.TenantMapper;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
@@ -27,6 +31,10 @@ public class ExecuteTaskService {
@Autowired
private InspectionMapper inspectionMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

public JsonResult executeTask(String userId, Inspection inspection) {
log.info("进入调用机场平台方法,执行任务");
// 读取不同租户的机场平台url
@@ -43,12 +51,18 @@ public class ExecuteTaskService {
jsonObject.put("code", "gs"); // 与机场平台约定好的
jsonObject.put("tenantCode", tenant.getCode());

String airPortStr = HttpUtils.doSend(url, jsonObject, null, "POST");
if (StringUtils.isEmpty(airPortStr)) {
log.info("进入调用机场平台方法: url:{}", url);
log.info("进入调用机场平台方法: jsonObject:{}", jsonObject);
log.info("立即执行任务业务:机场接口返回数据为空,飞行失败,任务id:{},任务名称:{},机场id:{},机场名称:{}, 路线id:{},路线名称:{}",
inspection.getId(), inspection.getName(), inspection.getAirportId(), inspection.getAirportName(), inspection.getInspectionLine(), inspection.getInspectionLineName());

log.info("执行任务, 调用机场平台: url:{}", url);
log.info("执行任务, 调用机场平台: jsonObject:{}", jsonObject);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(jsonObject, headers);
try {
restTemplate.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
} catch (Exception e) {
log.info("执行任务, 调用机场平台:机场接口异常, url:{}", url);
log.info("执行任务, 调用机场平台:机场接口异常, httpEntity:{}", httpEntity);
return JsonResult.error(ExecuteInspectionCodeEnum.AIRPORT_RETURN_DATA_IS_NULL.getCode(), ExecuteInspectionCodeEnum.AIRPORT_RETURN_DATA_IS_NULL.getMsg());
}


+ 20
- 8
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/GetAirLineListService.java 查看文件

@@ -6,15 +6,15 @@ import com.tuoheng.admin.entity.Tenant;
import com.tuoheng.admin.enums.code.AriportCodeEnum;
import com.tuoheng.admin.mapper.TenantMapper;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.admin.vo.AirLineVO;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JacksonUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.Objects;

@@ -25,17 +25,29 @@ public class GetAirLineListService {
@Autowired
private TenantMapper tenantMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

public JsonResult getAirLineList(Integer droneId) {
//读取不同租户的机场平台url
Tenant tenant = tenantMapper.selectById(CurrentUserUtil.getTenantId());
if (ObjectUtil.isEmpty(tenant)) {
return JsonResult.error(AriportCodeEnum.GET_NO_TENANT.getCode(), AriportCodeEnum.GET_NO_TENANT.getMsg());
}
String url = CommonConfig.airportURL + SystemConstant.API_AIRPORT_LINE_LIST;
String param = "page=1&limit=100&droneId=" + droneId;
String airPortStr = HttpUtils.sendGet(url, param);
JsonResult<AirLineVO> jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
String url = UriComponentsBuilder.fromHttpUrl(CommonConfig.airportURL + SystemConstant.API_AIRPORT_LINE_LIST)
.queryParam("page", 1)
.queryParam("limit", 100)
.queryParam("droneId", droneId)
.toUriString();

JsonResult jsonResult;
try {
jsonResult = restTemplate.getForObject(url, JsonResult.class);
} catch (Exception e) {
log.info("获机航线列表接口异常, url:{}", url);
throw new ServiceException("获机航线列表接口异常");
}
if (ObjectUtil.isEmpty(jsonResult) || (!ObjectUtil.isEmpty(Objects.requireNonNull(jsonResult).getData()) && jsonResult.getCode() != 0)) {
return JsonResult.error(AriportCodeEnum.BAD_REQUEST.getCode(), AriportCodeEnum.BAD_REQUEST.getMsg());
}

+ 21
- 10
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/GetAirportListService.java 查看文件

@@ -7,13 +7,14 @@ import com.tuoheng.admin.enums.code.AriportCodeEnum;
import com.tuoheng.admin.mapper.TenantMapper;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JacksonUtil;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

@Slf4j
@Service
@@ -22,19 +23,29 @@ public class GetAirportListService {
@Autowired
private TenantMapper tenantMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

public JsonResult getAirportList() {
//读取不同租户的机场平台url
Tenant tenant = tenantMapper.selectById(CurrentUserUtil.getTenantId());

if (ObjectUtil.isEmpty(tenant)) {
return JsonResult.error(AriportCodeEnum.GET_NO_TENANT.getCode(), AriportCodeEnum.GET_NO_TENANT.getMsg());
}
String url = CommonConfig.airportURL + SystemConstant.API_AIRPORT_LIST;
String param = "page=1&limit=100&tenantCode=" + tenant.getCode();
String airPortStr = HttpUtils.sendGet(url, param);

JsonResult jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);

String url = UriComponentsBuilder.fromHttpUrl(CommonConfig.airportURL + SystemConstant.API_AIRPORT_LIST)
.queryParam("page", 1)
.queryParam("limit", 100)
.queryParam("tenantCode", tenant.getCode())
.toUriString();

JsonResult jsonResult;
try {
jsonResult = restTemplate.getForObject(url, JsonResult.class);
} catch (Exception e) {
log.info("获机场列表接口异常, url:{}", url);
throw new ServiceException("获机场列表接口异常");
}
if (ObjectUtil.isEmpty(jsonResult) || (!ObjectUtil.isEmpty(jsonResult.getData()) && jsonResult.getCode() != 0)) {
return JsonResult.error(AriportCodeEnum.BAD_REQUEST.getCode(), AriportCodeEnum.BAD_REQUEST.getMsg());
}

+ 23
- 8
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/PointFlightService.java 查看文件

@@ -14,11 +14,16 @@ import com.tuoheng.admin.mapper.TenantMapper;
import com.tuoheng.admin.request.accident.AccidentFlightRequest;
import com.tuoheng.admin.utils.CurrentUserUtil;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.*;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

/**
* @Author ChengWang
@@ -34,6 +39,10 @@ public class PointFlightService {
@Autowired
private TenantMapper tenantMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

@Transactional
public JsonResult pointFlight(AccidentFlightRequest request) {
log.info("执行应急飞行起飞,request={}", request);
@@ -98,15 +107,21 @@ public class PointFlightService {
log.info("调用机场,新无人机执行定点飞行:url:{}", url);
log.info("调用机场,新无人机执行定点飞行:jsonObject:{}", jsonObject);

String airPortStr = HttpUtils.doSend(url, jsonObject, null, "POST");
if (StringUtils.isEmpty(airPortStr)) {
log.info("新无人机执行定点飞行:机场接口返回数据为空,飞行失败,jsonObject:{}", jsonObject);
throw new ServiceException("机场接口返回数据为空,飞行失败");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(jsonObject, headers);
ResponseEntity<JsonResult> response;
try {
response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
} catch (Exception e) {
log.info("调用机场,新无人机执行定点飞行:机场接口返回数据异常, url:{}", url);
log.info("调用机场,新无人机执行定点飞行:机场接口返回数据异常, httpEntity:{}", httpEntity);
throw new com.aliyun.oss.ServiceException("机场接口返回数据为异常,飞行失败");
}
JsonResult jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
JsonResult jsonResult = response.getBody();
if (0 != jsonResult.getCode()) {
log.info("调用机场平台,无人机执行定点飞行:飞行失败,jsonResult:{}", jsonResult.getMsg());
throw new com.tuoheng.common.core.exception.ServiceException("机场平台返回,飞行失败");
log.info("调用机场,无人机执行定点飞行:飞行失败,jsonResult:{}", jsonResult.getMsg());
throw new com.tuoheng.common.core.exception.ServiceException("机场平台返回,新无人机执行定点飞行失败");
}
}


+ 19
- 9
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/airport/ReversalFlightService.java 查看文件

@@ -11,13 +11,13 @@ import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.admin.request.accident.ReversalFlightRequest;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JacksonUtil;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
* @Author ChengWang
@@ -30,6 +30,10 @@ public class ReversalFlightService {
@Autowired
private InspectionMapper inspectionMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

/**
* 应急飞行(回仓)
*
@@ -65,17 +69,23 @@ public class ReversalFlightService {
log.info("调用机场平台,无人机执行定点飞行返航:url:{}", url);
log.info("调用机场平台,原无人机执行定点飞行返航,jsonObject:{}", jsonObject);

String airPortStr = HttpUtils.doSend(url, jsonObject, null, "POST");
log.info("调用无人机平台,操作无人机:airPortStr:{}", airPortStr);
if (StringUtils.isEmpty(airPortStr)) {
log.info("原无人机执行定点飞行返航:机场接口返回数据为空,返航失败,jsonObject:{}", jsonObject);
throw new ServiceException("机场接口返回数据为空,返航失败");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(jsonObject, headers);
ResponseEntity<JsonResult> response;
try {
response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
} catch (Exception e) {
log.error("调用机场平台,无人机执行定点飞行返航异常, url:{}", url);
log.error("调用机场平台,无人机执行定点飞行返航异常, httpEntity:{}", httpEntity);
throw new ServiceException("调用机场平台,无人机执行定点飞行返航异常");
}
JsonResult jsonResult = JacksonUtil.json2pojo(airPortStr, JsonResult.class);
JsonResult jsonResult = response.getBody();
if (0 != jsonResult.getCode()) {
log.info("调用机场平台,无人机执行定点飞行:返航失败,jsonResult:{}", jsonResult.getMsg());
return JsonResult.error(-1, "机场平台返回失败");
}

log.info("调用无人机平台返航结束");
return JsonResult.success();
}

+ 35
- 14
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/dsp/DspServiceImpl.java 查看文件

@@ -2,21 +2,17 @@ package com.tuoheng.admin.service.third.dsp;

import com.alibaba.fastjson.JSONObject;
import com.tuoheng.admin.request.inspection.MissionStatusRequest;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Locale;
import java.util.Map;

@Slf4j
@Service
@@ -28,6 +24,10 @@ public class DspServiceImpl implements IDspService {
@Autowired
private StopAIService stopAIService;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

/**
* DSP服务API接口域名
*/
@@ -42,16 +42,37 @@ public class DspServiceImpl implements IDspService {
String url = String.format(Locale.ENGLISH, "%s/api/web/serviceInst/%s/application", dspDomainUrl, dspServiceInstId);
log.info("调用DSP服务, url:{}", url);
log.info("调用DSP服务, jsonObject:{}", jsonObject);
String result = SendPost.doPost(url, jsonObject, null);
log.info("调用DSP服务, result:{}", result);
return JSONObject.parseObject(result);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(jsonObject, headers);
ResponseEntity<JsonResult> response;
try {
response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
} catch (Exception e) {
log.error("调用DSP服务:DSP返回异常, url:{}", url);
log.error("调用DSP服务:DSP返回异常, httpEntity:{}", httpEntity);
throw new ServiceException("调用DSP服务:DSP返回异常");
}
JsonResult jsonResult = response.getBody();
if (0 != jsonResult.getCode()) {
log.info("调用DSP服务:DSP返回失败,jsonResult:{}", jsonResult.getMsg());
throw new ServiceException("调用DSP服务:DSP返回失败");
}
log.info("调用DSP服务, result:{}", jsonResult);
return JSONObject.parseObject(String.valueOf(jsonResult));
}

@Override
public JSONObject serviceStopApplication(JSONObject jsonObject) {
String url = dspDomainUrl + "/api/web/serviceInst/"+jsonObject.getString("requestId")+"/stop";
String result = HttpUtils.doSend(url, jsonObject, null,"PUT");
return JSONObject.parseObject(result);
String url = dspDomainUrl + "/api/web/serviceInst/" + jsonObject.getString("requestId") + "/stop";
ResponseEntity<JsonResult> response;
try {
response = restTemplate.exchange(url, HttpMethod.PUT, null, JsonResult.class);
} catch (Exception e) {
log.error("硬件停止后,停止AI分析异常!{}", e);
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "硬件停止后,停止AI分析异常!");
}
return JSONObject.parseObject(response.getBody().toString());
}

@Override

+ 19
- 3
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/dsp/StopAIService.java 查看文件

@@ -5,12 +5,18 @@ import com.alibaba.fastjson.JSONObject;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.enums.AiAnalyseStatusEnum;
import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
@@ -19,6 +25,10 @@ public class StopAIService {
@Autowired
private InspectionMapper inspectionMapper;

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;

/**
* DSP服务API接口域名
*/
@@ -63,8 +73,14 @@ public class StopAIService {
private JSONObject serviceStopApplication(JSONObject jsonObject) {
String url = dspDomainUrl + "/api/web/serviceInst/" + jsonObject.getString("requestId") + "/stop";
log.info("硬件停止后,停止AI分析,调用dsp url:{}", url);
String result = HttpUtils.doSend(url, jsonObject, null, "PUT");
HttpEntity httpEntity = new HttpEntity(jsonObject);
ResponseEntity<JsonResult> response = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, JsonResult.class);
if (response == null || !response.hasBody()) {
log.error("硬件停止后,停止AI分析,调用dsp,返回为空!");
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "硬件停止后,停止AI分析,调用dsp,返回为空");
}
JsonResult result = response.getBody();
log.info("硬件停止后,停止AI分析,调用dsp result:{}", result);
return JSONObject.parseObject(result);
return JSONObject.parseObject(result.toString());
}
}

+ 73
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/CustomCellWriteHandler.java 查看文件

@@ -0,0 +1,73 @@
package com.tuoheng.admin.utils.excel;

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.util.CollectionUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @Title:
* @description: 自动列宽
* @version: 1.0
**/
public class CustomCellWriteHandler extends AbstractColumnWidthStyleStrategy {
// 增加缓存 避免重复计算,影响性能
private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();

@Override
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 头部或者是数据行时
boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
if (needSetWidth) {
// 先尝试从缓存中获取
Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
if (maxColumnWidthMap == null) {
maxColumnWidthMap = new HashMap<>();
CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
}
Integer columnWidth = 20;
Integer columnIndex = cell.getColumnIndex();
if (2 == columnIndex || 3 == columnIndex) {
columnWidth = 75;
}
maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
}
}

private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
if (isHead) {
// return cell.getStringCellValue().getBytes().length;
return 20;
} else {
CellData cellData = cellDataList.get(0);
CellDataTypeEnum type = cellData.getType();
if (type == null) {
return -1;
} else {
// 根据数据类型,定义不同的单元格宽度
switch (type) {
case STRING:
// return cellData.getStringValue().getBytes().length;
return 20;
case BOOLEAN:
// return cellData.getBooleanValue().toString().getBytes().length;
return 20;
case NUMBER:
// return cellData.getNumberValue().toString().getBytes().length;
return 20;
default:
return -1;
}
}
}
}
}

+ 53
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/CustomCellWriteHeightConfig.java 查看文件

@@ -0,0 +1,53 @@
package com.tuoheng.admin.utils.excel;

import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import java.util.Iterator;
public class CustomCellWriteHeightConfig extends AbstractRowHeightStyleStrategy {
/**
* 默认高度
*/
private static final Integer DEFAULT_HEIGHT = 300;
@Override
protected void setHeadColumnHeight(Row row, int relativeRowIndex) {
}
@Override
protected void setContentColumnHeight(Row row, int relativeRowIndex) {
Iterator<Cell> cellIterator = row.cellIterator();
if (!cellIterator.hasNext()) {
return;
}
// 默认为 1行高度
int maxHeight = 10;
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();

System.out.println("----- " + cell.getCellTypeEnum());

if (cell.getCellTypeEnum() == CellType.STRING) {
String value = cell.getStringCellValue();
int len = value.length();
int num = 0;
if (len > 50) {
num = len % 50 > 0 ? len / 50 : len / 2 - 1;
}
if (num > 0) {
for (int i = 0; i < num; i++) {
value = value.substring(0, (i + 1) * 50 + i) + "\n" + value.substring((i + 1) * 50 + i, len + i);
}
}
if (value.contains("\n")) {
int length = value.split("\n").length;
maxHeight = Math.max(maxHeight, length) + 1;
}
}
}
row.setHeight((short) ((maxHeight) * DEFAULT_HEIGHT));
}
}

+ 74
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/CustomCellWriteWidthConfig.java 查看文件

@@ -0,0 +1,74 @@
package com.tuoheng.admin.utils.excel;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomCellWriteWidthConfig extends AbstractColumnWidthStyleStrategy {
private final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
@Override
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
boolean needSetWidth = isHead || !CollectionUtil.isEmpty(cellDataList);
if (needSetWidth) {
Map<Integer, Integer> maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>());
Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
// 单元格文本长度大于60换行
if (columnWidth >= 0) {
if (columnWidth > 60) {
columnWidth = 60;
}
Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
Sheet sheet = writeSheetHolder.getSheet();
sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
}
}
}
}
/**
* 计算长度
* @param cellDataList
* @param cell
* @param isHead
* @return
*/
private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
if (isHead) {
return cell.getStringCellValue().getBytes().length;
} else {
CellData<?> cellData = cellDataList.get(0);
CellDataTypeEnum type = cellData.getType();
if (type == null) {
return -1;
} else {
switch (type) {
case STRING:
// 换行符(数据需要提前解析好)
int index = cellData.getStringValue().indexOf("\n");
return index != -1 ?
cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1;
case BOOLEAN:
return cellData.getBooleanValue().toString().getBytes().length;
case NUMBER:
return cellData.getNumberValue().toString().getBytes().length;
default:
return -1;
}
}
}
}
}

+ 96
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/ImageModifyHandler.java 查看文件

@@ -0,0 +1,96 @@
package com.tuoheng.admin.utils.excel;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Objects;

/**
* 修改图像处理程序
*
* @author admin
* @date 2023/01/16
*/
public class ImageModifyHandler implements CellWriteHandler {
/**
* 后单元格数据转换
*
* @param writeSheetHolder 写单夹
* @param writeTableHolder 写表夹
* @param cellData 单元格数据
* @param cell 细胞
* @param head 头
* @param relativeRowIndex 相对行索引
* @param isHead 是头
*/
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
boolean noImageValue = Objects.isNull(cellData) || CollectionUtils.isEmpty(cellData.getImageDataList());
if (Objects.equals(Boolean.TRUE, isHead) || noImageValue) {
return;
}
Sheet sheet = cell.getSheet();
int mergeColumNum = getMergeColumNum(cell, sheet);
int mergeRowNum = getMergeRowNum(cell, sheet);
ImageData imageData = cellData.getImageDataList().get(0);
imageData.setRelativeLastRowIndex(mergeRowNum - 1);
imageData.setRelativeLastColumnIndex(mergeColumNum - 1);
imageData.setTop(10);
imageData.setBottom(10);
imageData.setLeft(10);
imageData.setRight(10);
CellWriteHandler.super.afterCellDataConverted(writeSheetHolder, writeTableHolder, cellData, cell, head, relativeRowIndex, isHead);
}


/**
* 得到合并行num
*
* @param cell 细胞
* @param sheet 表
* @return int
*/
public static int getMergeRowNum(Cell cell, Sheet sheet) {
int mergeSize = 1;
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
for (CellRangeAddress cellRangeAddress : mergedRegions) {
if (cellRangeAddress.isInRange(cell)) {
//获取合并的行数
mergeSize = cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow() + 1;
break;
}
}
return mergeSize;
}

/**
* 得到合并列num
*
* @param cell 细胞
* @param sheet 表
* @return int
*/
public static int getMergeColumNum(Cell cell, Sheet sheet) {
int mergeSize = 1;
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
for (CellRangeAddress cellRangeAddress : mergedRegions) {
if (cellRangeAddress.isInRange(cell)) {
//获取合并的列数
mergeSize = cellRangeAddress.getLastColumn() - cellRangeAddress.getFirstColumn() + 1;
break;
}
}
return mergeSize;
}

}

+ 106
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/ImageModifyHandler2.java 查看文件

@@ -0,0 +1,106 @@
package com.tuoheng.admin.utils.excel;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.util.StyleUtil;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;
import java.util.Objects;

/**
* 图像细胞编写处理程序
*
* @author admin
* @date 2023/01/13
*/
public class ImageModifyHandler2 implements CellWriteHandler {

@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 此处不处理表头,不处理不包含图像的
boolean noImageValue = Objects.isNull(cellData) || CollectionUtil.isEmpty(cellData.getImageDataList());
if (Objects.equals(Boolean.TRUE, isHead) || noImageValue) {
return;
}
cellData.setType(CellDataTypeEnum.EMPTY);
}

@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
if (CollectionUtil.isEmpty(cellDataList) || Objects.equals(Boolean.TRUE, isHead)) {
return;
}
// cellDataList 是list的原因是 填充的情况下 可能会多个写到一个单元格 但是如果普通写入只有一个
WriteCellData<?> writeCellData = cellDataList.get(0);
// 在afterCellDataConverted方法里面已经将CellDataType设置为EMPTY 此处不能用cellData.getType()来判断是否图片类型
if (Objects.isNull(writeCellData) || Objects.isNull(writeCellData.getImageDataList()) || writeCellData.getImageDataList().get(0) == null) {
return;
}
ImageData imageData = writeCellData.getImageDataList().get(0);

this.setImageValue(imageData, cell);

}

private void setImageValue(ImageData imageData, Cell cell) {
//获取当前单元格所在的sheet
Sheet sheet = cell.getRow().getSheet();
//获取当前sheet页中的所有合并单元格信息
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
//获取当前单元格的开始列号
int firstColumn = (short) cell.getColumnIndex();
//获取当前单元格的开始行号
int firstRow = cell.getRow().getRowNum();
//获取当前单元格的结束列号
int lastColumn = (short) (cell.getColumnIndex());
//获取当前单元格的结束行号
int lastRow = cell.getRow().getRowNum();
for (CellRangeAddress mergedRegion : mergedRegions) {
//判断当前单元格是否包含合并行或和并列 当前单元格的所有行号和列号都包含在合并域内 则认为当前单元格存在合并行或和并列
if (cell.getColumnIndex() >= mergedRegion.getFirstColumn() && cell.getColumnIndex() <= mergedRegion.getLastColumn() && cell.getRow().getRowNum() >= mergedRegion.getFirstRow() && cell.getRow().getRowNum() <= mergedRegion.getLastRow()) {
//获取合并域的开始行号
firstRow = mergedRegion.getFirstRow();
//获取合并域的结束行号
lastRow = mergedRegion.getLastRow();
//获取合并域的开始列号
firstColumn = mergedRegion.getFirstColumn();
//获取合并域的结束列号
lastColumn = mergedRegion.getLastColumn();
break;
}
}
imageData.setRelativeLastColumnIndex(lastColumn - 1);
imageData.setRelativeLastRowIndex(lastRow - 1);

int index = sheet.getWorkbook().addPicture(imageData.getImage(), HSSFWorkbook.PICTURE_TYPE_PNG);
Drawing<?> drawing = sheet.getDrawingPatriarch();
if (drawing == null) {
drawing = sheet.createDrawingPatriarch();
}
CreationHelper helper = sheet.getWorkbook().getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor();

// 图片边距:让图片不会填满整个单元格,与四周有一定边距
anchor.setDx1(StyleUtil.getCoordinate(2000));
anchor.setDx2(-StyleUtil.getCoordinate(2000));
anchor.setDy1(StyleUtil.getCoordinate(2000));
anchor.setDy2(-StyleUtil.getCoordinate(2000));

// 图片行列
anchor.setCol1(cell.getColumnIndex());
anchor.setCol2(cell.getColumnIndex() + (lastColumn - firstColumn + 1));
anchor.setRow1(cell.getRowIndex());
anchor.setRow2(cell.getRowIndex() + (lastRow - firstRow + 1));
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
drawing.createPicture(anchor, index);
}
}

+ 89
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/utils/excel/StyleUtils.java 查看文件

@@ -0,0 +1,89 @@
package com.tuoheng.admin.utils.excel;

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;

/**
* EasyExcel 样式工具类
*/
public class StyleUtils {

/**
* 标题样式
* @return
*/
public static WriteCellStyle getHeadStyle(){
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 背景颜色
// headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE1.getIndex());
// headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);

// 字体
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontName("宋体");//设置字体名字
headWriteFont.setFontHeightInPoints((short)14);//设置字体大小
headWriteFont.setBold(true);//字体加粗
headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;

// 样式
headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
headWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框;
headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;

headWriteCellStyle.setWrapped(true); //设置自动换行;

headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置垂直对齐的样式为居中对齐;
headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

return headWriteCellStyle;
}


/**
* 内容样式
* @return
*/
public static WriteCellStyle getContentStyle(){
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();

// 背景绿色
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
// contentWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
// contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);

// 设置字体
WriteFont contentWriteFont = new WriteFont();
contentWriteFont.setFontHeightInPoints((short) 12);//设置字体大小
contentWriteFont.setFontName("宋体"); //设置字体名字
contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;

//设置样式;
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框;
contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;

contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
contentWriteCellStyle.setWrapped(true); //设置自动换行;

// contentWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

return contentWriteCellStyle;
}
}

+ 112
- 0
tuoheng-service/tuoheng-admin/src/main/java/com/tuoheng/admin/vo/IotEquipmentVo.java 查看文件

@@ -0,0 +1,112 @@
package com.tuoheng.admin.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.tuoheng.common.core.common.BaseEntity;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Data
public class IotEquipmentVo extends BaseEntity {

/**
* 主键ID
*/
private String id;

/**
* 租户id
*/
private String tenantId;

/**
* 部门id
*/
private String deptId;

/**
* 部门名称
*/
private String deptName;

/**
* 设备编码
*/
private String code;

/**
* 设备名称
*/
private String name;

/**
* 公路ID
*/
private String roadId;

/**
* 公路名称
*/
private String roadName;

/**
* 路段ID
*/
private String sectionId;

/**
* 位置
*/
private String location;

/**
* 纬度
*/
private String latitude;

/**
* 经度
*/
private String longitude;

/**
* 监控播放地址
*/
private String playUrl;

/**
* 状态:0:禁用;1:启用;
*/
private Integer status;

/**
* 添加人
*/
private String createUser;

/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

/**
* 更新人
*/
private String updateUser;

/**
* 更新时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;

/**
* 有效标识
*/
private Integer mark;

}

+ 20
- 4
tuoheng-service/tuoheng-admin/src/main/resources/logback.xml 查看文件

@@ -22,9 +22,14 @@
<property name="logging.maxFileSize" value="40MB"/>

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${logging.pattern}</pattern>
<charset>${logging.charset}</charset>
<!-- <encoder>-->
<!-- <pattern>${logging.pattern}</pattern>-->
<!-- <charset>${logging.charset}</charset>-->
<!-- </encoder>-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>

@@ -52,8 +57,19 @@
<appender-ref ref="LOG_FILE" />
</appender>

<logger name="com.tuoheng" level="DEBUG" additivity="false">
<!--skywalking日志上报-->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>[th-waterway] %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>

<logger name="com.tuoheng" level="INFO" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="file.async" />
<appender-ref ref="grpc-log" />
</logger>
<!--log4jdbc -->
<logger name="jdbc.sqltiming" level="DEBUG" additivity="false">

+ 72
- 0
tuoheng-service/tuoheng-admin/src/main/resources/mapper/IotEquipmentMapper.xml 查看文件

@@ -0,0 +1,72 @@
<?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.tuoheng.admin.mapper.IotEquipmentMapper">

<resultMap type="com.tuoheng.admin.entity.IotEquipment" id="IotEquipmentResult">
<result property="id" column="id" />
<result property="tenantId" column="tenant_id" />
<result property="deptId" column="dept_id" />
<result property="code" column="code" />
<result property="name" column="name" />
<result property="roadId" column="road_id" />
<result property="sectionId" column="section_id" />
<result property="location" column="location" />
<result property="longitude" column="longitude" />
<result property="latitude" column="latitude" />
<result property="playUrl" column="play_url" />
<result property="status" column="status" />
<result property="createUser" column="create_user" />
<result property="createTime" column="create_time" />
<result property="updateUser" column="update_user" />
<result property="updateTime" column="update_time" />
<result property="mark" column="mark" />
</resultMap>


<sql id="Base_Column_List">
id, tenant_id, dept_id, code, name, road_id, section_id, location, longitude, latitude, play_url, status,
create_user, create_time, update_user, update_time, mark
</sql>

<sql id="selectThAccidentVo">
select id, tenant_id, dept_id, code, name, road_id, section_id, location, longitude, latitude, play_url, status,
create_user, create_time, update_user, update_time, mark
from th_iot_equipment
</sql>

<select id="selectPageList" parameterType="com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest" resultMap="IotEquipmentResult">
select <include refid="Base_Column_List"/>
from th_iot_equipment
<where>
<if test="1 == 1"> and mark = 1 </if>
<if test="request.tenantId != null and request.tenantId != ''"> and tenant_id = #{request.tenantId} </if>
<if test="request.sectionName != null and request.sectionName != ''"> and section_name = #{request.sectionName} </if>
<if test="request.deptIdList != null and request.deptIdList.size() > 0">
and dept_id in
<foreach item="deptId" collection="request.deptIdList" open="(" separator="," close=")">
#{deptId}
</foreach>
</if>
</where>
order by create_time desc
</select>

<select id="selectList" parameterType="com.tuoheng.admin.request.iotequipment.QueryIotEquipmentPageListRequest" resultMap="IotEquipmentResult">
select <include refid="Base_Column_List"/>
from th_iot_equipment
<where>
<if test="1 == 1"> and mark = 1 </if>
<if test="request.tenantId != null and request.tenantId != ''"> and tenant_id = #{request.tenantId} </if>
<if test="request.sectionName != null and request.sectionName != ''"> and section_name = #{request.sectionName} </if>
<if test="request.deptIdList != null and request.deptIdList.size() > 0">
and dept_id in
<foreach item="deptId" collection="request.deptIdList" open="(" separator="," close=")">
#{deptId}
</foreach>
</if>
</where>
order by create_time desc
</select>


</mapper>

+ 86
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/Test.java 查看文件

@@ -0,0 +1,86 @@
package com.tuoheng.admin;

import com.alibaba.fastjson.JSONObject;
import com.tuoheng.admin.enums.AiAnalyseTypeEnum;
import org.apache.commons.collections4.CollectionUtils;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Test {

public static void main(String[] args) throws ParseException {
Integer isLive = null;
boolean online_condition = AiAnalyseTypeEnum.ONLINE.getCode() == isLive;
boolean offline_condition = AiAnalyseTypeEnum.OFFLINE.getCode() == isLive;
System.out.println("online_condition = " + online_condition);
System.out.println("offline_condition = " + offline_condition);
}

public static void main2() {
List<String> list1 = buildList1();
List<String> list2 = buildList2();

//并集
Collection<String> union = CollectionUtils.union(list1, list2);

//交集
Collection<String> intersection = CollectionUtils.intersection(list1, list2);

//交集的补集
Collection<String> disjunction = CollectionUtils.disjunction(list1, list2);

//集合相减
Collection<String> subtract = CollectionUtils.subtract(list1, list2);

//集合相减
Collection<String> subtract2 = CollectionUtils.subtract(list2, list1);

System.out.println("并集:" + union);
System.out.println("交集" + intersection);
System.out.println("交集的补集" + disjunction);
System.out.println("集合相减" + subtract);
System.out.println("集合相减" + subtract2);
}

private static List<String> buildList1() {
List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
return list1;
}

private static List<String> buildList2() {
List<String> list2 = new ArrayList<>();
list2.add("b");
list2.add("e");
list2.add("d");
return list2;
}

private static List<String> jiao(List<String> oldList, List<String> newList) {
// 交集
oldList.retainAll(newList);
System.out.println(oldList.toString()); // b
return oldList;
}

private static List<String> bing(List<String> oldList, List<String> newList) {
// 交集
oldList.retainAll(newList);
System.out.println(oldList.toString()); // b

return oldList;
}

private static List<String> cha(List<String> oldList, List<String> newList) {
// 差集
oldList.retainAll(newList);
System.out.println(oldList.toString()); // b

return oldList;
}
}

+ 279
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/WordExportTable.java 查看文件

@@ -0,0 +1,279 @@
package com.tuoheng.admin;

import java.io.File;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGridCol;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import com.alibaba.fastjson.JSONObject;
public class WordExportTable {
public static final String driverUrl = "jdbc:mysql://127.0.0.1:3306/tuoheng_freeway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=false";
public static final String username = "root";
public static final String password = "123456";
/**
* 导出数据库需要与driverUrl中连接的数据库一致
*/
public static final String dataBase = "snowy-pub";

/**
* 不需要导出的表,可为null
*/
public static final String notTbales = "'op_roles','op_menus'";

/**
* 匹配前缀不导出,可为null
*/
public static final String notLike = "'sys_%'";
/**
* 文档标题
*/
public static final String title = "数据库设计详细说明书";
/**
* 输出文档地址
*/
public static final String path = "/apps/db/";
/**
* 输出文档名称
*/
public static final String fileName = "数据库设计详细说明书V1.0.0.docx";
public static void main(String[] args)throws Exception {
//Blank Document
XWPFDocument document= new XWPFDocument();
//添加标题
XWPFParagraph titleParagraph = document.createParagraph();
//设置段落居中
titleParagraph.setAlignment(ParagraphAlignment.CENTER);
XWPFRun titleParagraphRun = titleParagraph.createRun();
titleParagraphRun.setText(title);
titleParagraphRun.setColor("000000");
titleParagraphRun.setFontSize(20);
WordExportTable we = new WordExportTable();
List<JSONObject> list= we.getTables(dataBase);
for (JSONObject json : list) {
List<String[]> columns = we.getTablesDetail(dataBase, json.getString("name"));
addTable(document, json.getString("name"), json.getString("remark"), columns);
}
//Write the Document in file system
FileOutputStream out = new FileOutputStream(new File(path+fileName));
document.write(out);
out.close();
System.out.println("create_table document written success.");
}
private List<String[]> getTablesDetail(String schema, String tableName){
List<String[]> list = new ArrayList<>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection(driverUrl, username, password);
//定义sql语句 ?表示占位符
String sql = "SELECT COLUMN_NAME , COLUMN_TYPE , COLUMN_DEFAULT , IS_NULLABLE , COLUMN_COMMENT "
+" FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = ? and table_name = ? ";
//获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, schema);
preparedStatement.setString(2, tableName);
//向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
int i = 1;
//遍历查询结果集
while(resultSet.next()){
String[] str = new String[7];
str[0] = i+"";
str[1] = resultSet.getString("COLUMN_NAME");
str[2] = resultSet.getString("COLUMN_TYPE");
str[3] = resultSet.getString("COLUMN_DEFAULT");
str[4] = resultSet.getString("IS_NULLABLE");
str[5] = "";
str[6] = resultSet.getString("COLUMN_COMMENT");
list.add(str);
i++;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return list;
}
private List<JSONObject> getTables(String schema){
List<JSONObject> list = new ArrayList<>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection(driverUrl, username, password);
//定义sql语句 ?表示占位符
StringBuffer sql = new StringBuffer();
sql.append("select TABLE_NAME,TABLE_COMMENT from information_schema.tables where table_schema= ? ");
if(null != notLike){
sql.append(" AND table_name NOT LIKE "+notLike);
}
if(null != notTbales){
sql.append(" AND table_name NOT IN ("+notTbales+")");
}
//获取预处理statement
preparedStatement = connection.prepareStatement(sql.toString());
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, schema);
//向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//遍历查询结果集
while(resultSet.next()){
JSONObject j = new JSONObject();
j.put("name", resultSet.getString("TABLE_NAME"));
j.put("remark", resultSet.getString("TABLE_COMMENT"));
list.add(j);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return list;
}
private static void addTable(XWPFDocument document,String tableName,String remark, List<String[]> columns){
//两个表格之间加个换行
document.createParagraph().createRun().setText("\r");
// 标题1,1级大纲
document.createParagraph().createRun().setText(remark+" "+tableName);
//工作经历表格
XWPFTable ComTable = document.createTable();
// //列宽自动分割
// CTTblWidth comTableWidth = ComTable.getCTTbl().addNewTblPr().addNewTblW();
// comTableWidth.setType(STTblWidth.DXA);
// comTableWidth.setW(BigInteger.valueOf(9072));
CTTbl ttbl = ComTable.getCTTbl();
int[] COLUMN_WIDTHS = new int[] {572,2072,1372,872,672,672,2572};
CTTblGrid tblGrid = ttbl.getTblGrid() != null ? ttbl.getTblGrid()
: ttbl.addNewTblGrid();
for (int j = 0, len = COLUMN_WIDTHS.length; j < len; j++) {
CTTblGridCol gridCol = tblGrid.addNewGridCol();
gridCol.setW(new BigInteger(String.valueOf(COLUMN_WIDTHS[j])));
}
//表格第一行
XWPFTableRow comTableRowOne = ComTable.getRow(0);
setCellvalue(comTableRowOne.getCell(0), "序号");
setCellvalue(comTableRowOne.addNewTableCell(),"字段名");
setCellvalue(comTableRowOne.addNewTableCell(),"类型");
setCellvalue(comTableRowOne.addNewTableCell(),"默认值");
setCellvalue(comTableRowOne.addNewTableCell(),"是否可为空");
setCellvalue(comTableRowOne.addNewTableCell(),"是否主键");
setCellvalue(comTableRowOne.addNewTableCell(),"注释");
for (String[] str : columns) {
//表格第二行
XWPFTableRow comTableRowTwo = ComTable.createRow();
for (int j = 0; j < str.length; j++) {
if(j==0 || j==3 || j==4 || j==5){
setCellvalue(comTableRowTwo.getCell(j),str[j]);
}else{
comTableRowTwo.getCell(j).setText(str[j]);
}
}
}
}
private static void setCellvalue(XWPFTableCell cell, String text){
cell.setText(text);
//垂直居中
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
CTTc cttc = cell.getCTTc();
CTP ctp = cttc.getPList().get(0);
CTPPr ctppr = ctp.getPPr();
if (ctppr == null) {
ctppr = ctp.addNewPPr();
}
CTJc ctjc = ctppr.getJc();
if (ctjc == null) {
ctjc = ctppr.addNewJc();
}
//水平居中
ctjc.setVal(STJc.CENTER);
}
}

+ 15
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/DataAuthSelect.java 查看文件

@@ -0,0 +1,15 @@
package com.tuoheng.admin.data;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target(value = {ElementType.METHOD, ElementType.ANNOTATION_TYPE, TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataAuthSelect {

//数据类型 data_group_ref表中的 data_type 字段值
int type() default 0;

}

+ 22
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/DataPermission.java 查看文件

@@ -0,0 +1,22 @@
package com.tuoheng.admin.data;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* 数据权限验证注解
*/
@Documented
@Target({METHOD, ANNOTATION_TYPE, TYPE})
@Retention(RUNTIME)
public @interface DataPermission {

/**
* 是否要进行数据权限隔离
*/
boolean isPermission() default true;
}

+ 182
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/DataPermissionInterceptor.java 查看文件

@@ -0,0 +1,182 @@
package com.tuoheng.admin.data;

import cn.hutool.core.util.ClassUtil;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Slf4j
//@Component
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class DataPermissionInterceptor implements Interceptor {

//扫描的包路径(根据自己的项目路径来),这里是取的配置里的包路径
// @Value("${permission.package-path}")
// private String packagePath;

private String packagePath = "com.tuoheng.admin.mapper";

private final static String DEPT_ID = "dept_id";

private final static String USER_ID = "create_user";

private static List<String> classNames;

@Override
public Object intercept(Invocation invocation) throws Throwable {
try {

List<String> deptIds = new ArrayList<>();
deptIds.add("1");
deptIds.add("2");
deptIds.add("3");

//反射扫包会比较慢,这里做了个懒加载
if (classNames == null) {
synchronized (LazyInit.class) {
if (classNames == null) {
//扫描指定包路径下所有包含指定注解的类
Set<Class<?>> classSet = ClassUtil.scanPackageByAnnotation(packagePath, DataPermission.class);
if (classSet == null && classSet.size() == 0) {
classNames = new ArrayList<>();
} else {
//取得类全名
classNames = classSet.stream().map(Class::getName).collect(Collectors.toList());
}
}
}
}

// 拿到mybatis的一些对象
StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");

// mappedStatement.getId()为执行的mapper方法的全路径名,newId为执行的mapper方法的类全名
String newId = mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf("."));

// 如果不是指定的方法,直接结束拦截
if (!classNames.contains(newId)) {
return invocation.proceed();
}
String newName = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf(".") + 1, mappedStatement.getId().length());

//是否开启数据权限
boolean isPermi = true;
Class<?> clazz = Class.forName(newId);

//遍历方法
for (Method method : clazz.getDeclaredMethods()) {
//方法是否含有DataPermission注解,如果含有注解则将数据结果过滤
if (method.isAnnotationPresent(DataPermission.class) && newName.equals(method.getName())) {
DataPermission dataPermission = method.getAnnotation(DataPermission.class);
if (dataPermission != null) {
//不验证
if (!dataPermission.isPermission()) {
isPermi = false;
} else {
//开启验证
isPermi = true;
}
}
}
}

if (isPermi) {
// 获取到原始sql语句
String sql = statementHandler.getBoundSql().getSql();

// 解析并返回新的SQL语句,只处理查询sql
if (mappedStatement.getSqlCommandType().toString().equals("SELECT")) {
// String newSql = getNewSql(sql,deptIds,user.getUserId());
sql = getSql(sql, deptIds, 1L);
}

// 修改sql
metaObject.setValue("delegate.boundSql.sql", sql);
}
return invocation.proceed();
} catch (Exception e) {
log.error("数据权限隔离异常:", e);
return invocation.proceed();
}

}


/**
* 解析SQL语句,并返回新的SQL语句
* 注意,该方法使用了JSqlParser来操作SQL,该依赖包Mybatis-plus已经集成了。如果要单独使用,请先自行导入依赖
*
* @param sql 原SQL
* @return 新SQL
*/
private String getSql(String sql, List<String> deptIds, Long userId) {

try {
String condition = "";
String permissionSql = "(";
if (deptIds.size() > 0) {
for (String deptId : deptIds) {
if ("(".equals(permissionSql)) {
permissionSql = permissionSql + deptId;
} else {
permissionSql = permissionSql + "," + deptId;
}
}
permissionSql = permissionSql + ")";

// 修改原语句
condition = DEPT_ID + " in " + permissionSql;
} else {
condition = USER_ID + " = " + userId;
}

if (StringUtils.isBlank(condition)) {
return sql;
}

Select select = (Select) CCJSqlParserUtil.parse(sql);
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();

//取得原SQL的where条件
final Expression expression = plainSelect.getWhere();

//增加新的where条件
final Expression envCondition = CCJSqlParserUtil.parseCondExpression(condition);
if (expression == null) {
plainSelect.setWhere(envCondition);
} else {
AndExpression andExpression = new AndExpression(expression, envCondition);
plainSelect.setWhere(andExpression);
}
return plainSelect.toString();
} catch (JSQLParserException e) {
log.error("解析原SQL并构建新SQL错误:" + e);
return sql;
}
}
}

+ 17
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/data/LazyInit.java 查看文件

@@ -0,0 +1,17 @@
package com.tuoheng.admin.data;


import org.apache.kafka.common.resource.Resource;

public class LazyInit {

public static Resource resource;

public synchronized static Resource getResource() {
if (resource == null) {
resource = new Resource(null, null);
}
return resource;
}

}

+ 85
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/mapper/DeptMapperTest.java 查看文件

@@ -0,0 +1,85 @@
package com.tuoheng.admin.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.entity.Dept;
import com.tuoheng.admin.entity.Section;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class DeptMapperTest {

@Autowired
private DeptMapper deptMapper;

@Test
public void testSelectAllChildListByPid() {
String id = "a52c59563756fb96879b54ecb9b173f1";

String sql = buildSql();

// List<Dept> deptList = deptMapper.selectAllChildListById(id);
// for (Dept dept : deptList) {
// System.out.println(dept);
// }

List<String> deptIdList = deptMapper.selectAllChildListById(id);
for (String deptId : deptIdList) {
System.out.println(deptId);
}
}

@Test
public void testSelectAllChildListByPid2() {
List<Dept> deptList = new ArrayList<>();
Dept dept = new Dept();
dept.setId("32b8cbc4570250b67294f46c76a6c694");
dept.setPid("0");

deptList.add(dept);
queryChildDeptList(deptList, dept);

for (Dept d : deptList) {
System.out.println(d.getId() + "-" + d.getPid() + "-" + d.getName());
}
}

/**
* 递归查询子部门信息
* 1、递归算法,效率比较低,考虑时间数据量不会太多,后期可优化
* 2、另一方案,通过数据库查询,根据pid,查询该部门下所有子部门及子子部门数据
*/
private void queryChildDeptList(List<Dept> deptList, Dept parentDept) {
List<Dept> childDeptlist = deptMapper.selectList(new LambdaQueryWrapper<Dept>()
.eq(Dept::getTenantId, 0)
.eq(Dept::getPid, parentDept.getId())
.eq(Dept::getMark, 1));

for (Dept dept : childDeptlist ) {
queryChildDeptList(deptList, dept);
}
deptList.addAll(childDeptlist);
}

private String buildSql() {
String sql = "select id, tenant_id, name, code, fullname, type, pid, sort, note, create_user, create_time, update_user, update_time, mark\n" +
" from (\n" +
" select t1.id, t1.tenant_id, t1.name, t1.code, t1.fullname, t1.type, t1.pid, t1.sort, t1.note, t1.create_user, t1.create_time, t1.update_user, t1.update_time, t1.mark,\n" +
" IF(FIND_IN_SET(pid, @pids) > 0, @pids <![CDATA[ := ]]> CONCAT(@pids, ',',id), 0) AS ischild\n" +
" from (select id,pid,name from th_dept t where t.mark = 1) t1,\n" +
" (select @pids <![CDATA[ := ]]> '32b8cbc4570250b67294f46c76a6c694') t2\n" +
" ) t3\n" +
" where ischild like CONCAT('%', '32b8cbc4570250b67294f46c76a6c694', '%')";
return sql;
}

}

+ 27
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/mapper/SectionMapperTest.java 查看文件

@@ -0,0 +1,27 @@
package com.tuoheng.admin.mapper;

import com.tuoheng.admin.entity.Section;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class SectionMapperTest {

@Autowired
private SectionMapper sectionMapper;

@Test
public void testAdd() {
Section section = new Section();
section.setRoadId("1");
section.setSectionRange("123-456");
sectionMapper.insert(section);
}

}

+ 25
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/mapper/UserMapperTest.java 查看文件

@@ -0,0 +1,25 @@
package com.tuoheng.admin.mapper;

import com.tuoheng.admin.entity.Dept;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

@Autowired
private UserMapper userMapper;

@Test
public void testSelectListByCondition() {
}

}

+ 253
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/DeptServiceTest.java 查看文件

@@ -0,0 +1,253 @@
package com.tuoheng.admin.service;

import com.alibaba.fastjson.JSONObject;
import com.tuoheng.admin.entity.RoadInformation;
import com.tuoheng.admin.entity.Section;
import com.tuoheng.admin.mapper.RoadInformationMapper;
import com.tuoheng.admin.mapper.SectionMapper;
import com.tuoheng.admin.request.dept.AddDeptRequest;
import com.tuoheng.admin.dto.RoadSectionDto;
import com.tuoheng.admin.request.dept.EditDeptRequest;
import com.tuoheng.admin.service.dept.IDeptService;
import com.tuoheng.admin.service.dept.query.QueryListTreeService;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class DeptServiceTest {

@Autowired
private IDeptService deptService;

@Autowired
private QueryListTreeService queryListTreeService;

@Autowired
private RoadInformationMapper roadInformationMapper;

@Autowired
private SectionMapper sectionMapper;

@Value("${tuoheng.dsp-domain-url:}")
private String dspDomainUrl;

@Value("${tuoheng.dsp-service-inst-id:}")
private String dspServiceInstId;

@Test
public void testGetOneById() {
System.out.println("url = ");
}

@Test
public void testGetListTree() {
JsonResult result = queryListTreeService.getListTree();

log.info("-----> 获取部门树形列表:{}", result);
}

@Test
public void testAdd() {
AddDeptRequest addDeptRequest = new AddDeptRequest();
addDeptRequest.setPid("774630400fa782df1c0b38c582a9c468");
addDeptRequest.setName("拓恒-技术部-测试");

List<RoadSectionDto> roadSectionDtoList = build();
addDeptRequest.setRoadSectionDtoList(roadSectionDtoList);

JSONObject json = (JSONObject) JSONObject.toJSON(addDeptRequest);
log.info("-----> 新增部门:json={}", json);

JsonResult result = deptService.insert(addDeptRequest);
log.info("-----> 新增部门:{}", result);
}

private List<RoadSectionDto> build() {
List<RoadSectionDto> roadSectionDtoList = new ArrayList<>();
List<RoadInformation> roadInformationList = roadInformationMapper.selectList(null);
List<Section> sectionList = sectionMapper.selectList(null);
RoadSectionDto roadSectionDto = null;
List<Section> sectionListTmp;
for (RoadInformation roadInformation : roadInformationList) {
roadSectionDto = new RoadSectionDto();
sectionListTmp = new ArrayList<>();
for (Section section : sectionList) {
if (section.getRoadId().equals(roadInformation.getId())) {
sectionListTmp.add(section);
}
}
roadSectionDto.setRoad(roadInformation);
roadSectionDto.setSectionList(sectionListTmp);
roadSectionDtoList.add(roadSectionDto);
}
return roadSectionDtoList;
}

private List<RoadSectionDto> build2() {
List<RoadSectionDto> list = new ArrayList<>();

RoadSectionDto roadSectionDto = null;

RoadInformation road;
Section section;
List<Section> sectionList;
for (int i = 1; i < 4; i++) {
roadSectionDto = new RoadSectionDto();

road = new RoadInformation();
road.setId(i + 1 + "");
road.setCode("G2" + 1);

sectionList = new ArrayList<>();
for (int j = 1; j < 4; j++) {
section = new Section();
section.setId(i + j + "");
section.setRoadId(j + "");
section.setSectionRange(road.getCode() + "-" + j);
sectionList.add(section);
}
roadSectionDto.setRoad(road);
roadSectionDto.setSectionList(sectionList);

list.add(roadSectionDto);
}
return list;
}


@Test
public void testEdit() {
EditDeptRequest oldEeditDeptRequest = this.buildOldEditDeptRequest();

EditDeptRequest newEditDeptRequest = this.buildNewEditDeptRequest();

JSONObject oldEeditDeptRequestJson = (JSONObject) JSONObject.toJSON(oldEeditDeptRequest);
log.info("-----> 修改部门:json={}", oldEeditDeptRequestJson);


JSONObject newEeditDeptRequestJson = (JSONObject) JSONObject.toJSON(oldEeditDeptRequest);
log.info("-----> 修改部门:json={}", oldEeditDeptRequestJson);

// JsonResult result = deptService.update(oldEeditDeptRequest, newEditDeptRequest);
// log.info("-----> 修改部门:{}", result);
}

private EditDeptRequest buildOldEditDeptRequest() {
EditDeptRequest oldEeditDeptRequest = new EditDeptRequest();
oldEeditDeptRequest.setId("576f0c83faa8415148c5ee24d7da5fd3");
oldEeditDeptRequest.setPid("9e7f336d4fe1751fda497ba4cf860f37");
oldEeditDeptRequest.setName("技术部");

List<RoadSectionDto> roadSectionDtoList = new ArrayList<>();

RoadSectionDto roadSectionDto1 = this.buildRoadSectionDto1();
RoadSectionDto roadSectionDto2 = this.buildRoadSectionDto2();

roadSectionDtoList.add(roadSectionDto1);
roadSectionDtoList.add(roadSectionDto2);

oldEeditDeptRequest.setRoadSectionDtoList(roadSectionDtoList);

return oldEeditDeptRequest;
}

private EditDeptRequest buildNewEditDeptRequest() {
EditDeptRequest newEditDeptRequest = new EditDeptRequest();
newEditDeptRequest.setId("576f0c83faa8415148c5ee24d7da5fd3");
newEditDeptRequest.setPid("9e7f336d4fe1751fda497ba4cf860f37");
newEditDeptRequest.setName("技术部new");

List<RoadSectionDto> roadSectionDtoList = new ArrayList<>();

RoadSectionDto roadSectionDto1 = this.buildRoadSectionDto1();
RoadSectionDto roadSectionDto3 = this.buildRoadSectionDto3();

roadSectionDtoList.add(roadSectionDto1);
roadSectionDtoList.add(roadSectionDto3);

newEditDeptRequest.setRoadSectionDtoList(roadSectionDtoList);

return newEditDeptRequest;
}

private RoadSectionDto buildRoadSectionDto1() {
RoadSectionDto roadSectionDto = new RoadSectionDto();
RoadInformation roadInformation = new RoadInformation();
roadInformation.setId("1");
List<Section> sectionList = new ArrayList<>();
Section section1 = new Section();
section1.setId("1");
Section section2 = new Section();
section2.setId("2");
Section section3 = new Section();
section3.setId("3");

sectionList.add(section1);
sectionList.add(section2);
sectionList.add(section3);

roadSectionDto.setRoad(roadInformation);
roadSectionDto.setSectionList(sectionList);

return roadSectionDto;
}

private RoadSectionDto buildRoadSectionDto2() {
RoadSectionDto roadSectionDto = new RoadSectionDto();
RoadInformation roadInformation = new RoadInformation();
roadInformation.setId("2");
List<Section> sectionList = new ArrayList<>();
Section section1 = new Section();
section1.setId("4");
Section section2 = new Section();
section2.setId("5");
Section section3 = new Section();
section3.setId("6");

sectionList.add(section1);
sectionList.add(section2);
sectionList.add(section3);

roadSectionDto.setRoad(roadInformation);
roadSectionDto.setSectionList(sectionList);

return roadSectionDto;
}

private RoadSectionDto buildRoadSectionDto3() {
RoadSectionDto roadSectionDto = new RoadSectionDto();
RoadInformation roadInformation = new RoadInformation();
roadInformation.setId("4");
List<Section> sectionList = new ArrayList<>();
Section section = new Section();
section.setId("10");
sectionList.add(section);

roadSectionDto.setRoad(roadInformation);
roadSectionDto.setSectionList(sectionList);

return roadSectionDto;
}

@Test
public void testDelete() {
String id = "1";
JsonResult result = deptService.deleteById(id);
log.info("-----> 删除部门:{}", result);

}


}

+ 45
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/DspCallbackServiceTest.java 查看文件

@@ -0,0 +1,45 @@
package com.tuoheng.admin.service;

import com.alibaba.fastjson.JSONObject;
import com.tuoheng.admin.dto.RoadSectionDto;
import com.tuoheng.admin.entity.RoadInformation;
import com.tuoheng.admin.entity.Section;
import com.tuoheng.admin.mapper.RoadInformationMapper;
import com.tuoheng.admin.mapper.SectionMapper;
import com.tuoheng.admin.request.dept.AddDeptRequest;
import com.tuoheng.admin.request.dept.EditDeptRequest;
import com.tuoheng.admin.request.third.DspCallbackRequest;
import com.tuoheng.admin.service.dept.IDeptService;
import com.tuoheng.admin.service.dept.query.QueryListTreeService;
import com.tuoheng.admin.service.third.dsp.IDspCallbackService;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class DspCallbackServiceTest {

@Autowired
private IDspCallbackService dspCallbackService;

@Test
public void testGetOneById() {
String requestId = "dc96139337854ae78da7f20e144b3a9f";
DspCallbackRequest dspCallbackRequest = new DspCallbackRequest();
dspCallbackRequest.setAnalyseStatus(2);
dspCallbackRequest.setType(1);
dspCallbackService.saveCallbackData(requestId, dspCallbackRequest);
}

}

+ 263
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/InspectionFileServiceTest.java 查看文件

@@ -0,0 +1,263 @@
package com.tuoheng.admin.service;

import cn.hutool.core.util.RandomUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.tuoheng.admin.dto.InspectionFileExportExcelDto;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.entity.InspectionFile;
import com.tuoheng.admin.enums.*;
import com.tuoheng.admin.mapper.InspectionFileMapper;
import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.admin.request.inspectionfile.QueryInspectionFilePageListRequest;
import com.tuoheng.admin.service.inspectionfile.IInspectionFileService;
import com.tuoheng.admin.utils.excel.*;
import com.tuoheng.common.core.config.UploadFileConfig;
import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.CommonUtils;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class InspectionFileServiceTest {

@Autowired
private InspectionMapper inspectionMapper;

@Autowired
private InspectionFileMapper inspectionFileMapper;

@Autowired
private IInspectionFileService iInspectionFileService;

@Test
public void testPageList() {
QueryInspectionFilePageListRequest request = new QueryInspectionFilePageListRequest();
request.setKey("");
request.setQuestionCode("1");
request.setStatus(15);
request.setDeptId("");
request.setBeginTime(DateUtils.now());
request.setEndTime(DateUtils.now());
request.setPage(1);
request.setLimit(2);

JSONObject json = (JSONObject) JSONObject.toJSON(request);
log.info("-----> 获取分页列表请求参数:json={}", json);

JsonResult result = iInspectionFileService.getPageList(request);
System.out.println(">>>>>>>>>>>>>" + result);
}

@Test
public void testAddList() {
List<InspectionFile> thirstyQuestionFiles = new ArrayList<>();
InspectionFile inspectionFile;
for (int i = 1; i < 2; i++) {
inspectionFile = new InspectionFile();
inspectionFile.setQuestionCode(i + "");
inspectionFile.setTenantId("1");
inspectionFile.setInspectionId("1");
// 文件类型
inspectionFile.setFileType(FileTypeEnum.IMAGE.getCode());
// 文件编码
inspectionFile.setFileCode(inspectionFile.getFileCode());
// 文件名称
inspectionFile.setFileName(inspectionFile.getFileName());
//图片大小,单位MB,保留两位小数,目前没有获取图片大小的字段
inspectionFile.setFileSize(0.00);

// 问题图片审核状态
inspectionFile.setStatus(QuestionEnum.NOTREVIEWED.getCode());
// 问题图片来源
inspectionFile.setSource(SourceEnum.AI.getCode());
inspectionFile.setCreateUser("1"); // 设置默认用户
inspectionFile.setCreateTime(DateUtils.now());

if (0 == 1) {
inspectionFile.setMark(MarkEnum.NOTVALID.getCode());
log.info("修改问题mark值mark={}", inspectionFile.getMark());
}

thirstyQuestionFiles.add(inspectionFile);
}

String id = RandomUtil.randomString(36);
System.out.println(id);
System.out.println(id.length());

CommonUtils.batchOperate((x) -> inspectionFileMapper.addBatch(x), thirstyQuestionFiles, 1000);
}

@Test
public void testUpdate() {
//查询当前问题
InspectionFile entity = inspectionFileMapper.selectOne(new LambdaQueryWrapper<InspectionFile>()
.eq(InspectionFile::getId, "5l7pr9kuhfiuf8opi0h79qy2ghv6kb5093yq")
.eq(InspectionFile::getMark, 1));

LambdaUpdateWrapper<InspectionFile> qw = new LambdaUpdateWrapper<>();
qw.eq(InspectionFile::getId, entity.getId());
qw.eq(InspectionFile::getMark, 1);
qw.set(InspectionFile::getStatus, 15);
qw.set(InspectionFile::getCheckUser, "aa");
qw.set(InspectionFile::getCheckTime, DateUtils.now());
int count = inspectionFileMapper.update(entity, qw);
}

@Test
public void tesExport() {
Inspection inspection = inspectionMapper.selectOne(Wrappers.<Inspection>lambdaQuery()
.eq(Inspection::getId, 1)
.eq(Inspection::getMark, MarkEnum.VALID.getCode())
.last("limit 1"));
List<InspectionFile> inspectionFileList = inspectionFileMapper.selectList(Wrappers.<InspectionFile>lambdaQuery()
.eq(InspectionFile::getInspectionId, 1)
.eq(InspectionFile::getMark, MarkEnum.VALID.getCode())
.last("limit 1, 10"));


File fd = new File(UploadFileConfig.uploadFolder + "/inspectionFile");
//目录是否存在
if(!fd.exists()){
fd.mkdirs();
}
String fileName = inspection.getName()+"+"+inspection.getCode()+".xlsx";
// String filePath = "/data/java/tuoheng_waterway/inspectionFile/";
String filePath = UploadFileConfig.uploadFolder + "/inspectionFile/" + fileName;

try {
easyExcel(inspection, inspectionFileList, filePath);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}

}

public JsonResult easyExcel(Inspection inspection, List<InspectionFile> inspectionFileList, String filePath) throws MalformedURLException {
log.info("文件输出目录及格式:filePathName={}", filePath);

List<InspectionFileExportExcelDto> inspectionFileExportExcelDtoList = new ArrayList<>();
InspectionFile inspectionFile;
InspectionFileExportExcelDto inspectionFileExportExcelDto;
for (int i = 0; i < inspectionFileList.size(); i++) {
inspectionFile = inspectionFileList.get(i);
inspectionFileExportExcelDto = new InspectionFileExportExcelDto();
inspectionFileExportExcelDto.setSequence(i + 1);
inspectionFileExportExcelDto.setQuestionDesc(inspectionFile.getQuestionDesc());
inspectionFileExportExcelDto.setFileOriginal(new URL(CommonConfig.imageURL + inspectionFile.getFileOriginal()));
inspectionFileExportExcelDto.setFileImage(new URL(CommonConfig.imageURL + inspectionFile.getFileImage()));
inspectionFileExportExcelDto.setLocation(inspectionFile.getLongitude() + "," + inspectionFile.getLatitude());
inspectionFileExportExcelDto.setSectionName(inspection.getSectionName());
inspectionFileExportExcelDto.setRoadName(inspection.getRoadName());
if (InspectionFileStatusEnum.WAIT_CONFIRMED.getCode() == inspectionFile.getStatus()) {
inspectionFileExportExcelDto.setStatus("待确认");
} else if (InspectionFileStatusEnum.IGNORED.getCode() == inspectionFile.getStatus()) {
inspectionFileExportExcelDto.setStatus("已忽略");
} else if (InspectionFileStatusEnum.CONFIRMED.getCode() == inspectionFile.getStatus()) {
inspectionFileExportExcelDto.setStatus("已确认");
} else if (InspectionFileStatusEnum.GENERATE_ORDER.getCode() == inspectionFile.getStatus()) {
inspectionFileExportExcelDto.setStatus("已生成工单");
} else if (InspectionFileStatusEnum.PROCESSED.getCode() == inspectionFile.getStatus()) {
inspectionFileExportExcelDto.setStatus("已处理");
}
inspectionFileExportExcelDtoList.add(inspectionFileExportExcelDto);
}

List<List<String>> heads = new ArrayList<>();
String totalName = "疑似问题清单";

String totalName2 = "巡检任务:" + inspection.getName() + " 巡检时间:" + inspection.getInspectionTime();

String[] nameString = {"序号", "问题类型", "问题图片", "标注图片", "位置", "所属路段", "所属高速", "状态"};
for (String excelName : nameString) {
heads.add(Arrays.asList(totalName, totalName2, excelName));
}
//需要写出的表格(对应实体类)
try {

HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(StyleUtils.getHeadStyle(), StyleUtils.getContentStyle());

EasyExcel.write(filePath, InspectionFileExportExcelDto.class).sheet("问题清单数据")
.head(heads)
// .registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)) // 简单的列宽策略,列宽20
.registerWriteHandler(new CustomCellWriteHandler())
// .registerWriteHandler(new CustomCellWriteHeightConfig())
.registerWriteHandler(horizontalCellStyleStrategy)
.registerWriteHandler(new ImageModifyHandler())
.doWrite(inspectionFileExportExcelDtoList); // 数据源


// // 内容样式
// WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 水平居中
// contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // 垂直居中
// contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线
// contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
// contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
// contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
//
//
// //设计内容居中
// contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //设置内容自动换行
// contentWriteCellStyle.setWrapped(true);
//
// //设置头部样式
// WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// //设置头部标题居中
// headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
// HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
//
// // 将数据写进流,如果是响应流则写进header对应的文件里
// ExcelWriter excelWriter = EasyExcel.write(filePath, InspectionFileExportExcelDto.class).build();
//
// //指定sheet的名字和头信息
// WriteSheet writeSheet = EasyExcel.writerSheet(0, "日历导出")
// .head(heads)
// .registerWriteHandler(new SimpleColumnWidthStyleStrategy(20))
// .registerWriteHandler(horizontalCellStyleStrategy)
// .registerWriteHandler(new CustomCellWriteHandler())
//// .registerWriteHandler(new CustomCellWriteHeightConfig())
// .registerWriteHandler(new ImageModifyHandler())
// .build();
// //将数据真正写入excel中
// excelWriter.write(inspectionFileExportExcelDtoList, writeSheet);
// //千万别忘记finish 会帮忙关闭流
// excelWriter.finish();

} catch (Exception e) {
log.info("生成数据导出excel异常");
throw new RuntimeException(e);
}
log.info("开始写入表格中");

return JsonResult.success();
}
}

+ 148
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/InspectionServiceTest.java 查看文件

@@ -0,0 +1,148 @@
package com.tuoheng.admin.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.enums.MarkEnum;
import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.admin.request.inspection.AddInspectionRequest;
import com.tuoheng.admin.request.inspection.EditInspectionRequest;
import com.tuoheng.admin.request.inspection.MissionStatusRequest;
import com.tuoheng.admin.request.inspection.QueryInspectionPageListRequest;
import com.tuoheng.admin.service.inspection.IInspectionService;
import com.tuoheng.admin.service.inspection.update.status.UpdateFlightStatusService;
import com.tuoheng.common.core.utils.DateUtils;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class InspectionServiceTest {

@Autowired
private InspectionMapper inspectionMapper;

@Autowired
private IInspectionService iInspectionService;

@Autowired
private UpdateFlightStatusService updateFlightStatusService;

@Test
public void testPageList() {
QueryInspectionPageListRequest request = new QueryInspectionPageListRequest();
// request.setKey("1");
request.setAirportId(1); // 巡检机场id
request.setInspectionLine(1); // 巡检线路Id
request.setType(1); // 巡检任务类型: 1 临时巡检(目前只有该一种类型)
request.setStatus(5); // 任务状态 5任务待飞行 7飞行失败 10任务飞行中 15任务飞行完成
request.setInspectionType(1); // 1 无人机 2机场
request.setDeptId("");
request.setPage(1);
request.setLimit(2);

JSONObject json = (JSONObject) JSONObject.toJSON(request);
log.info("-----> 获取分页列表请求参数:json={}", json);

JsonResult result = iInspectionService.selectPageList(request);
System.out.println(">>>>>>>>>>>>>" + result);
}

@Test
public void testAdd() {
AddInspectionRequest request = new AddInspectionRequest();
request.setType(1);
request.setName("test-2022112501-11");
request.setRoadId("1");
request.setRoadName("G2");
request.setSectionId("1");
request.setSectionName("路段1");
request.setInspectionType(1);
request.setAirportId(1);
request.setAirportName("禄口-2022112501");
request.setInspectionLine(1);
request.setInspectionLineName("路线1");
request.setInspectionTime(DateUtils.now());

JSONObject json = (JSONObject) JSONObject.toJSON(request);
log.info("-----> 新增任务请求参数:json={}", json);

JsonResult result = iInspectionService.insert(request);
System.out.println(">>>>>>>>>>>>>" + result);
}

@Test
public void testEdit() {
EditInspectionRequest request = new EditInspectionRequest();
request.setId("54601a9f13236dd3b5151db5ebdb0794");
request.setType(1);
request.setName("test1");
request.setRoadId("1");
request.setSectionId("1");
request.setInspectionType(1);
request.setAirportId(1);
request.setAirportName("禄口1");
request.setInspectionLine(1);
request.setInspectionLineName("路线11");
request.setInspectionTime(DateUtils.now());
request.setNote("test");

JsonResult result = iInspectionService.update(request);
System.out.println(">>>>>>>>>>>>>" + result);
}

@Test
public void testDelete() {
String id = "e69b6f5050c9106dfa37fea1a5c3fc15";
JsonResult result = iInspectionService.deleteById(id);
System.out.println(">>>>>>>>>>>>>" + result);
}

@Test
public void testResubmit() {
EditInspectionRequest request = new EditInspectionRequest();
request.setId("1f2ed1f784eb36165785d5235350ef7d");
request.setCode("XJRW20221130092941");
request.setType(1);
request.setInspectionType(2);
request.setName("test1");
request.setRoadId("1");
request.setRoadName("G2");
request.setSectionId("1");
request.setSectionName("路段1");
request.setAirportId(1);
request.setAirportName("禄口1");
request.setInspectionLine(1);
request.setInspectionLineName("路线11");
request.setIsLive(1);
request.setStartLatitude("11");
request.setStartLongitude("11");
request.setEndLongitude("22");
request.setEndLatitude("22");
request.setInspectionTime(DateUtils.now());
request.setNote("test");

JSONObject json = (JSONObject) JSONObject.toJSON(request);
log.info("-----> 重新提交请求参数:json={}", json);

JsonResult result = iInspectionService.resubmit(request);
System.out.println(">>>>>>>>>>>>>" + result);
}

@Test
public void test22() {
Inspection inspection = inspectionMapper.selectOne(new LambdaQueryWrapper<Inspection>()
.eq(Inspection::getMark, MarkEnum.VALID.getCode())
.eq(Inspection::getId, "4fb3d92882b908a760b23f3b6431b32a")
.eq(Inspection::getInspectionLine, 55));
MissionStatusRequest missionStatusRequest = new MissionStatusRequest();
missionStatusRequest.setStatus(2);
updateFlightStatusService.updateFlightStatus(inspection, missionStatusRequest);
}
}

+ 80
- 0
tuoheng-service/tuoheng-admin/src/test/java/com/tuoheng/admin/service/UserServiceTest.java 查看文件

@@ -0,0 +1,80 @@
package com.tuoheng.admin.service;

import com.alibaba.fastjson.JSONObject;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.service.user.IUserService;
import com.tuoheng.common.core.utils.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

@Autowired
private IUserService userService;

@Test
public void testAdd() {
User user = User.builder().build()
.setCode("TH1001")
.setUsername("1001")
.setRealname("1001")
.setMobile("13812456325")
.setRoleId(1)
.setDeptId("1")
.setClientId("1")
.setNote("test");

JSONObject json = (JSONObject) JSONObject.toJSON(user);
log.info("-----> 新增用户:json={}", json);

JsonResult result = userService.add(user);
log.info("-----> 新增用户:{}", result);
}

@Test
public void testEdit() {
User user = User.builder().build()
.setId("4c188b54f5f8fb34f3b71a064f48c8af")
.setCode("TH1001")
.setRealname("1001111")
.setRoleId(2)
.setDeptId("2")
.setClientId("1,2")
.setNote("test1111");

JSONObject json = (JSONObject) JSONObject.toJSON(user);
log.info("-----> 修改用户:json={}", user);

JsonResult result = userService.edit(user);
log.info("-----> 修改用户:{}", result);
}

@Test
public void testResetPassword() {
String id = "";
JsonResult result = userService.resetPassword(id);
}

@Test
public void testDelete() {
String id = "1";
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
JsonResult result = userService.deleteByIdList(list);
log.info("-----> 删除用户:{}", result);

}


}

+ 0
- 1
tuoheng-service/tuoheng-miniprogram/src/main/java/com/tuoheng/miniprogram/service/impl/AirportServiceImpl.java 查看文件

@@ -5,7 +5,6 @@ import com.tuoheng.common.core.config.common.CommonConfig;
import com.tuoheng.common.core.utils.HttpUtils;
import com.tuoheng.common.core.utils.JacksonUtil;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import com.tuoheng.miniprogram.dao.TenantMapper;
import com.tuoheng.miniprogram.entity.Tenant;
import com.tuoheng.miniprogram.enums.AriportCodeEnum;

Loading…
取消
儲存