Compare commits

...

65 Commits

Author SHA1 Message Date
吴远 64df39fdd2 改动 1 month ago
吴远 8e8f5cbffb Merge branch 'wuyuan' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone into dev 1 month ago
杨威 2f78be2b4e Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 2651bfdeaa [feat] 1 month ago
袁强 3f7b3eb7ac 提交:feign 1 month ago
杨威 eb3b6364de [feat] 1 month ago
杨威 82903e136a [feat] 1 month ago
杨威 639dd1d056 [feat] 1 month ago
杨威 18a6858dfb [feat] 1 month ago
杨威 7486db2f68 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 b776c64d65 [feat] 1 month ago
袁强 6d90d193bd 提交:预警热力图 1 month ago
杨威 f5c4041894 [feat] 2 months ago
杨威 8aced047e5 [feat] 2 months ago
吴远 1f43d62910 改动 2 months ago
杨威 06ebc2a4ea [feat] 2 months ago
杨威 37f98c55a5 [feat] 2 months ago
杨威 f29808dfaf [feat] 2 months ago
杨威 993a9d44d7 Merge remote-tracking branch 'origin/dev' into dev 2 months ago
杨威 8a664019af [feat] 2 months ago
袁强 a3e6b0b2fa 提交:排序 2 months ago
吴远 ec7d7da18f 改动 2 months ago
吴远 1cf4aa57f3 1 2 months ago
吴远 579001a1a8 Merge branch 'wuyuan' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone 2 months ago
杨威 0bab96fa64 [feat] 2 months ago
杨威 98ee5beb61 [feat] 2 months ago
杨威 987006d305 [feat] 2 months ago
杨威 3fca31c79f [feat] 2 months ago
杨威 f2ddd94e5e [feat] 2 months ago
杨威 5ad384d2c0 [feat] 2 months ago
杨威 711c489a87 [feat] 2 months ago
杨威 cfa54467eb [feat] 2 months ago
吴远 d51c1bfb40 Merge branch 'dev' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone 2 months ago
杨威 3bf3345f7c [feat] 2 months ago
袁强 20c6fc5ca0 提交 2 months ago
杨威 5af411aab1 [feat] 2 months ago
杨威 a54cceef0d [feat] 2 months ago
杨威 5224a43389 [feat] 2 months ago
杨威 c9f0286fd8 [feat] 2 months ago
杨威 010341500b [feat] 2 months ago
杨威 bd1be26370 [feat] 2 months ago
杨威 7dafce3977 [feat] 2 months ago
吴远 97895d4aef Merge branch 'dev' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone 2 months ago
吴远 38758ec5b7 Merge branch 'master' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone 2 months ago
杨威 9a3ffebe7a [feat] 2 months ago
杨威 0099ad53ad [feat] 2 months ago
杨威 d88ba8b224 [feat] 2 months ago
袁强 6e066e4e90 提交:生成图片预警(多个) 2 months ago
袁强 a5b383a285 提交 2 months ago
杨威 f9eb07ce5e [feat] 2 months ago
袁强 def0122c5f 提交:图片比对问题 2 months ago
袁强 05b13a353c 提交:图片比对 2 months ago
杨威 07dd54ebfb [feat] 2 months ago
杨威 caae858c5a [feat] 2 months ago
杨威 06a836da05 [feat] 2 months ago
杨威 4590e47fd0 Merge remote-tracking branch 'origin/dev' into dev 2 months ago
杨威 e52025e9cf [feat] 2 months ago
吴远 6095947d8f Merge branch 'master' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone 2 months ago
吴远 fc55fa0267 改动 2 months ago
吴远 0f8f8603ba 改动 2 months ago
杨威 16b741290d [feat] 2 months ago
杨威 648fad0e8a [feat] 2 months ago
杨威 7321f972b0 [feat] 2 months ago
袁强 6e16e0a2bb 提交:图片比对修改 2 months ago
杨威 a17dc254d5 [feat] 2 months ago
  1. 6
      dk-api/api-system/src/main/java/org/dromara/system/api/model/LoginUser.java
  2. 2
      dk-auth/src/main/java/org/dromara/auth/DKAuthApplication.java
  3. 24
      dk-auth/src/main/java/org/dromara/auth/feign/FeignDeviceGroup.java
  4. 10
      dk-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java
  5. 3
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/media/api/IHttpMediaService.java
  6. 1
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/wayline/api/IHttpWaylineService.java
  7. 4
      dk-common/common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java
  8. 22
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java
  9. 22
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java
  10. 2
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java
  11. 4
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java
  12. 6
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java
  13. 5
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java
  14. 5
      dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java
  15. 17
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java
  16. 13
      dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java
  17. 134
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  18. 194
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java
  19. 83
      dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml
  20. 2
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml
  21. 15
      dk-modules/sample/src/main/java/org/dromara/sample/feign/BusinessTaskFeign.java
  22. 2
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessTaskFeign.java
  23. 19
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java
  24. 28
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceFlightRecordsController.java
  25. 82
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java
  26. 7
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/DeviceFlightRecordsMapper.java
  27. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceDTO.java
  28. 12
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceProDTO.java
  29. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceQrtzDTO.java
  30. 45
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceFlightRecordsEntity.java
  31. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceProEntity.java
  32. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/param/DeviceQueryParam.java
  33. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceFlightRecordsService.java
  34. 13
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java
  35. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceService.java
  36. 58
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceFlightRecordsServiceImpl.java
  37. 171
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java
  38. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceQrtzServiceImpl.java
  39. 14
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceServiceImpl.java
  40. 13
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
  41. 6
      dk-modules/sample/src/main/java/org/dromara/sample/media/controller/FileController.java
  42. 4
      dk-modules/sample/src/main/java/org/dromara/sample/media/controller/MediaController.java
  43. 3
      dk-modules/sample/src/main/java/org/dromara/sample/media/model/MediaFileEntity.java
  44. 4
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/IFileService.java
  45. 2
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/IMediaService.java
  46. 7
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/FileServiceImpl.java
  47. 8
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java
  48. 11
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/AiCompareController.java
  49. 14
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineFileController.java
  50. 39
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java
  51. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/WaylineFileDTO.java
  52. 3
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/WaylineJobDTO.java
  53. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineFileEntity.java
  54. 3
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineJobEntity.java
  55. 1
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IAiCompareService.java
  56. 7
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineFileService.java
  57. 4
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobService.java
  58. 17
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/AiCompareQueueServiceImpl.java
  59. 12
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/AiCompareServiceImpl.java
  60. 20
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java
  61. 15
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/SDKWaylineService.java
  62. 16
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineFileServiceImpl.java
  63. 10
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java
  64. 1
      dk-modules/sample/src/main/resources/mapper/AiCompareMapper.xml
  65. 8
      dk-modules/sample/src/main/resources/mapper/DeviceFlightRecordsMapper.xml
  66. 6
      dk-modules/sample/src/main/resources/mapper/DeviceQrtzMapper.xml
  67. 32
      dk-modules/sample/src/main/resources/mapper/IDeviceProMapper.xml
  68. 11
      dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java
  69. 4
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysMenuController.java
  70. 16
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysRoleController.java
  71. 10
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  72. 99
      dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysUserProVo.java
  73. 2
      dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java
  74. 5
      dk-modules/system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java
  75. 4
      dk-modules/system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
  76. 2
      dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelService.java
  77. 4
      dk-modules/system/src/main/java/org/dromara/system/service/ISysRoleService.java
  78. 4
      dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java
  79. 33
      dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLabelServiceImpl.java
  80. 2
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  81. 10
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  82. 13
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  83. 21
      dk-modules/system/src/main/resources/mapper/system/SysRoleMapper.xml
  84. 33
      dk-modules/system/src/main/resources/mapper/system/SysUserMapper.xml
  85. 5
      dk-modules/workflow/pom.xml
  86. 13
      dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java
  87. 4
      dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java
  88. 2
      dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java
  89. 2
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java
  90. 5
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java
  91. 79
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
  92. 83
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
  93. 7
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java
  94. 20
      dk-modules/workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml
  95. 5
      dk-modules/workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml
  96. 4
      dk-visual/nacos/src/main/resources/application.properties

6
dk-api/api-system/src/main/java/org/dromara/system/api/model/LoginUser.java

@ -135,6 +135,12 @@ public class LoginUser implements Serializable {
*/
private List<PostDTO> posts;
/**
* 设备sn权限集合
*/
private List<String> deviceList;
/**
* 获取登录id
*/

2
dk-auth/src/main/java/org/dromara/auth/DKAuthApplication.java

@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 认证授权中心
@ -12,6 +13,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
* @author ruoyi
*/
@EnableDubbo
@EnableFeignClients
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DKAuthApplication {
public static void main(String[] args) {

24
dk-auth/src/main/java/org/dromara/auth/feign/FeignDeviceGroup.java

@ -0,0 +1,24 @@
package org.dromara.auth.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@FeignClient(name = "gateway",path = "sample")
public interface FeignDeviceGroup {
@GetMapping("/manage/api/v1/device/group/feign/user")
public List<Integer> listDeviceGroup(@RequestParam("userId") Long userId);
@GetMapping("/manage/api/v1/device/group/feign/device")
public List<String> listDevice(@RequestParam("userId") Long userId);
@GetMapping("/device/flight/count")
public Map<String,Integer> getDevices();
}

10
dk-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java

@ -3,10 +3,12 @@ package org.dromara.auth.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.ListUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.auth.domain.vo.LoginVo;
import org.dromara.auth.feign.FeignDeviceGroup;
import org.dromara.auth.form.PasswordLoginBody;
import org.dromara.auth.properties.CaptchaProperties;
import org.dromara.auth.service.IAuthStrategy;
@ -26,8 +28,12 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 密码认证策略
*
@ -45,6 +51,9 @@ public class PasswordAuthStrategy implements IAuthStrategy {
@DubboReference
private RemoteUserService remoteUserService;
@Autowired
FeignDeviceGroup feignDeviceGroup;
@Override
public LoginVo login(String body, RemoteClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
@ -73,6 +82,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
// 生成token
LoginHelper.login(loginUser, model);

3
dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/media/api/IHttpMediaService.java

@ -70,9 +70,10 @@ public interface IHttpMediaService {
value = "{\"code\": 0, \"message\":\"success\", \"data\": \"media/DJI_20220831151616_0004_W_Waypoint4.JPG\"}"
)})))
@PostMapping(PREFIX + "/workspaces/{workspace_id}/upload-callback")
@PostMapping(PREFIX + "/workspaces/{workspace_id}/{pro_id}/upload-callback")
HttpResultResponse<String> mediaUploadCallback(
@PathVariable(name = "workspace_id") String workspaceId,
@PathVariable(name = "pro_id") Integer proId,
@Valid @RequestBody MediaUploadCallbackRequest request,
HttpServletRequest req, HttpServletResponse rsp);

1
dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/wayline/api/IHttpWaylineService.java

@ -48,6 +48,7 @@ public interface IHttpWaylineService {
HttpResultResponse<PaginationData<GetWaylineListResponse>> getWaylineList(
@Valid @ParameterObject GetWaylineListRequest request,
@PathVariable(name = "workspace_id") String workspaceId,
@PathVariable(name = "proIds") List<Integer> proIds,
HttpServletRequest req, HttpServletResponse rsp);
/**

4
dk-common/common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java

@ -175,6 +175,10 @@ public class EncryptUtils {
return keyMap;
}
public static void main(String[] args) {
Map<String, String> map = generateRsaKey();
System.out.println(map);
}
/**
* sm2公钥加密
*

22
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java

@ -1,5 +1,6 @@
package org.dromara.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@ -9,6 +10,8 @@ import org.dromara.business.domain.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.business.service.IBusinessAlertService;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
@ -52,6 +55,25 @@ public class BusinessAlertController extends BaseController {
return R.ok(businessAlertService.getTodoBusinessAlert(alertId));
}
@Operation(summary ="根据经纬度获取历史预警",description = "根据经纬度获取历史预警")
@GetMapping("/alert/listHandleHistory")
public R<List<BusinessAlert>> listHandleHistory(
@RequestParam(value = "lng",required = false) String lng,
@RequestParam(value ="lat",required = false) String lat,
@RequestParam("createTime") String createTime) {
return R.ok(businessAlertService.listHandleHistory(lng,lat,createTime));
}
@SaCheckPermission("business:alert:delete")
@Log(title = "删除预警", businessType = BusinessType.DELETE)
@Operation(summary ="删除预警",description = "删除预警")
@GetMapping("/alert/{alertId}/delete")
public R<Boolean> deleteFalseAlert(@PathVariable("alertId") Long alertId) {
return R.ok(businessAlertService.deleteFalseAlert(alertId));
}
/**
* 查询全部预警/待办/已完成/忽略
*/

22
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java

@ -142,6 +142,27 @@ public class BusinessAlertStatisticsController extends BaseController {
return R.ok(businessAlertService.cityListAlert(businessAlertBo));
}
/**
* 预警信息-资规/农水-热力图
* @param businessAlertBo
* @return
*/
@Operation(summary="预警信息-资规/农水-标签分组", description="预警信息-资规/农水-标签分组")
@GetMapping(value = "/alert/heatList")
public R<Map<String,Object>> heatList(BusinessAlertBo businessAlertBo) {
return R.ok(businessAlertService.heatList(businessAlertBo));
}
/**
* 预警信息-城管/环保-热力图
* @param businessAlertBo
* @return
*/
@Operation(summary="预警信息-城管/环保/住建-标签分组", description="预警信息-城管/环保/住建-标签分组")
@GetMapping(value = "/city/alert/heatList")
public R<Map<String, Object>> cityHeatList(BusinessAlertBo businessAlertBo) {
return R.ok(businessAlertService.cityHeatList(businessAlertBo));
}
//饼图显示每个月根据部门
@Operation(summary="根据月份显示预警个数", description="根据月份显示预警个数")
@ -177,6 +198,7 @@ public class BusinessAlertStatisticsController extends BaseController {
@Operation(summary="预警对比统计(预警状态)", description="预警对比统计(预警状态)")
@GetMapping(value = "/compare/status/count")
public R<List<Map<String, Object>>> countAlertStatusCompare(BusinessAlertBo businessAlertBo) {
return R.ok(statisticsService.countAlertStatusCompare(businessAlertBo));
}

2
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java

@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.business.domain.bo.BusinessTaskBo;
import org.dromara.business.domain.vo.BusinessTaskVo;
import org.dromara.business.service.IBusinessTaskService;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -45,6 +46,7 @@ public class BusinessTaskController extends BaseController {
/**
* 查询工单预约列表
*/
@ApiEncrypt(response=true)
@SaCheckPermission("business:task:list")
@GetMapping("/list")
public TableDataInfo<BusinessTaskVo> list(BusinessTaskBo bo, PageQuery pageQuery) {

4
dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java

@ -59,12 +59,12 @@ public class BusinessAlert {
/**
* 纬度
*/
private Float lat;
private String lat;
/**
* 精度
*/
private Float lng;
private String lng;
/**
* 标签名-

6
dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java

@ -41,6 +41,9 @@ public class BusinessAlertBo {
*/
private String images;
private String startTime;
private String endTime;
/**
* 预警类型
@ -235,9 +238,6 @@ public class BusinessAlertBo {
*/
private Integer dateType;
private String startTime;
private String endTime;
private String aiName;
private Integer businessType;

5
dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java

@ -63,12 +63,12 @@ public class BusinessAlertVo implements Serializable {
/**
* 纬度
*/
private Float lat;
private String lat;
/**
* 精度
*/
private Float lng;
private String lng;
/**
* 标签名-
@ -190,6 +190,7 @@ public class BusinessAlertVo implements Serializable {
* 忽略原因
*/
private String ignoringCause;
private Integer value;
/**
* 来源0平台 1小程序

5
dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java

@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@FeignClient(name = "gateway",path = "sample")
public interface FeignDeviceGroup {
@ -17,4 +18,8 @@ public interface FeignDeviceGroup {
@GetMapping("/manage/api/v1/device/group/feign/device")
public List<String> listDevice(@RequestParam("userId") Long userId);
@GetMapping("/device/flight/count")
public Map<String,Integer> getDevices();
}

17
dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java

@ -29,7 +29,7 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
@DataPermission(
@DataColumn(key = "deptName", value = "t.dept_id")
)
Page<BusinessAlert> pageAlertFinish(@Param("page") Page<BusinessAlert> page,@Param("ew") QueryWrapper<BusinessAlert> ew);
Page<BusinessAlert> pageBusinessAlertHandle(@Param("page") Page<BusinessAlert> page,@Param("ew") QueryWrapper<BusinessAlert> ew);
/**
* 处理中
@ -47,6 +47,13 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
)
Page<BusinessAlert> pageBusinessAlertCancel(@Param("page") Page<BusinessAlert> page,@Param("ew") QueryWrapper<BusinessAlert> ew);
@DataPermission(
@DataColumn(key = "deptName", value = "t.dept_id")
)
Page<BusinessAlert> pageBusinessAlertFinish(@Param("page") Page<BusinessAlert> page, @Param("ew") QueryWrapper<BusinessAlert> wrapper);
@DataPermission(
@DataColumn(key = "deptName", value = "t.dept_id")
)
@ -89,6 +96,7 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
List<BusinessAlert> listAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime);
List<BusinessAlertVo> heatList(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime);
List<Map<String,Object>> countStreetRateAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime,@Param("deptIdList") List<Long> deptIdList);
Map<String, Object> streetRateTopAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime,@Param("deptIdList") List<Long> deptIdList);
@ -101,4 +109,11 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
Map<String, Object> listAppAlertCount(@Param("param") BusinessAlertBo businessAlertBo);
List<BusinessAlert> listHandleHistory(@Param("lng") String lng, @Param("lat") String lat,@Param("createTime") String createTime);
List<Map<String, Object>> listOneDepartAlert(@Param("param") BusinessAlertBo businessAlertBo);
List<Map<String, Object>> listOneDepartAlertStatus(@Param("param") BusinessAlertBo businessAlertBo);
}

13
dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java

@ -22,11 +22,13 @@ public interface IBusinessAlertService {
TableDataInfo<BusinessAlert> pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertHandle(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertAll(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertCancel(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery);
/**
* 新增预警任务
*
@ -72,9 +74,11 @@ public interface IBusinessAlertService {
TableDataInfo<BusinessAlert> getInfo(BusinessAlertBo bo, PageQuery pageQuery, String alertCode);
Map<String,Object> listAlert(BusinessAlertBo businessAlertBo);
Map<String,Object> heatList(BusinessAlertBo businessAlertBo);
Map<String, Object> cityListAlert(BusinessAlertBo businessAlertBo);
Map<String, Object> cityHeatList(BusinessAlertBo businessAlertBo);
List<BusinessAlertVo> listVerifyAlert(RemoteBusinessAlertBo businessAlertBo);
Boolean deleteAlert(List<Long> alertIdList);
@ -84,4 +88,9 @@ public interface IBusinessAlertService {
List<BusinessAlert> listTodoAlert(BusinessAlertBo businessAlertBo);
BusinessAlert getTodoBusinessAlert(Long alertId);
Boolean deleteFalseAlert(Long alertId);
List<BusinessAlert> listHandleHistory(String lng, String lat, String createTime);
}

134
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java

@ -21,6 +21,7 @@ import org.dromara.business.utils.BatchProcessorUtil;
import org.dromara.business.utils.MinioUntil;
import org.dromara.business.utils.constants.MinIOConstants;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.FormatsType;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
@ -119,6 +120,11 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
alert.setHandleType(BusinessStatusEnum.VERIFY.getStatus());
BeanUtils.copyProperties(alert, businessAlert);
//查询历史预警
List<BusinessAlert> businessAlertList = this.listHandleHistory(alert.getLng(), alert.getLat(), DateUtils.parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, alert.getCreateTime()));
businessAlert.setHandleNum(businessAlertList.size());
return businessAlert;
}).toList();
@ -278,11 +284,10 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return new TableDataInfo<>();
}
wrapper.notIn("t.flowStatus", BusinessStatusEnum.CANCEL.getStatus());
wrapper.eq("t.handle_type",BusinessStatusEnum.FINISH.getStatus());
wrapper.apply(" EXISTS(select * from dk_workflow.flow_his_task ht where ht.approver ='" + LoginHelper.getUserId() + "' and ht.instance_id = t.instanceId)");
Page<BusinessAlert> page = this.baseMapper.pageAlertFinish(pageQuery.build(), wrapper);
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertFinish(pageQuery.build(), wrapper);
try {
page.getRecords().forEach(businessAlertVo->{
@ -302,7 +307,6 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return TableDataInfo.build(page);
}
/**
* 查询当前用户待办预警
* @param bo
@ -354,6 +358,39 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<BusinessAlert> pageBusinessAlertHandle(BusinessAlertBo bo, PageQuery pageQuery) {
QueryWrapper<BusinessAlert> wrapper = buildQueryWrapper(bo);
if (ObjectUtil.isEmpty(wrapper)){
return new TableDataInfo<>();
}
wrapper.notIn("t.flowStatus", BusinessStatusEnum.CANCEL.getStatus());
wrapper.apply(" EXISTS(select * from dk_workflow.flow_his_task ht where ht.approver ='" + LoginHelper.getUserId() + "' and ht.instance_id = t.instanceId)");
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertHandle(pageQuery.build(), wrapper);
try {
page.getRecords().forEach(businessAlertVo->{
businessAlertVo.setHandleType(null);
if (businessAlertVo.getBusinessType() == 2){
businessAlertVo.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlertVo.getImages(), 3600).toString());
}else {
businessAlertVo.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getImages(), 3600).toString());
businessAlertVo.setMaxImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getMaxImages(), 3600).toString());
businessAlertVo.setMaxMateSourceImgUrl(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getMaxMateSourceImgUrl(), 3600).toString());
businessAlertVo.setMateSourceImgUrl(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getMateSourceImgUrl(), 3600).toString());
}
});
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return TableDataInfo.build(page);
}
/**
* 构建wrapper
@ -380,15 +417,24 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
//排除状态为验证状态预警
wrapper.ne("t.handle_type", BusinessStatusEnum.VERIFY.getStatus());
wrapper.eq("t.del_flag", 0);
if (ObjectUtil.isNotEmpty(bo.getHandleType())){
wrapper.eq("t.handle_type", bo.getHandleType());
}
if (ObjectUtil.isNotEmpty(bo.getDeptId())){
wrapper.eq("t.dept_id", bo.getDeptId());
}
if (ObjectUtil.isNotEmpty(bo.getJobName())){
wrapper.like("t.job_name", bo.getJobName());
}
if (ObjectUtil.isNotEmpty(bo.getLabelEn())){
wrapper.eq("t.label_en", bo.getLabelEn());
}
if (ObjectUtil.isNotEmpty(bo.getStartTime()) && ObjectUtil.isNotEmpty(bo.getEndTime())){
wrapper.ge("DATE_FORMAT(t.create_time, '%Y-%m-%d')", bo.getStartTime());
wrapper.le("DATE_FORMAT(t.create_time, '%Y-%m-%d')", bo.getEndTime());
@ -490,6 +536,32 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
}
@Override
public Map<String, Object> heatList(BusinessAlertBo businessAlertBo) {
Map<String,Object> result = new HashMap<>();
/* //生成近一周开始时间、结束时间
List<String> dayList = getLastSixDays();
String startTime = dayList.get(dayList.size() - 1);
String endTime = dayList.get(0);
result.put("date", startTime + "~" + endTime);*/
//查看的是总览的预警信息
if (ObjectUtil.isEmpty(businessAlertBo.getPostCode())) {
List<BusinessAlertVo> businessAlerts = this.baseMapper.heatList(businessAlertBo, businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
Map<String, List<BusinessAlertVo>> listMap = businessAlerts.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
result.putAll(listMap);
return result;
}
//不是空的话查看是对应各局的
businessAlertBo.setAiLabelEnList(List.of(businessAlertBo.getLabelEn()));
List<BusinessAlertVo> alertList = this.baseMapper.heatList(businessAlertBo,businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
Map<String, List<BusinessAlertVo>> listMap = alertList.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
result.putAll(listMap);
return result;
}
@Override
public Map<String, Object> cityListAlert(BusinessAlertBo businessAlertBo) {
if (ObjectUtil.hasEmpty(businessAlertBo.getPostCode(),businessAlertBo.getAiName())) {
@ -556,6 +628,28 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return infoMap;
}
@Override
public Map<String, Object> cityHeatList(BusinessAlertBo businessAlertBo) {
if (ObjectUtil.hasEmpty(businessAlertBo.getPostCode(),businessAlertBo.getAiName())) {
throw new ServiceException("参数为空!");
}
Map<String,Object> infoMap = new HashMap<>();
//不是空的话查看是对应各局的
List<RemoteAiLabelPostVo> postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), LoginHelper.getDeptId());
Map<String, List<RemoteAiLabelPostVo>> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName));
if (ObjectUtil.isEmpty(postVoList)){
return infoMap;
}
businessAlertBo.setAiLabelEnList(aiNameMap.get(businessAlertBo.getAiName()).stream().map(RemoteAiLabelPostVo::getLabelEn).distinct().toList());
List<BusinessAlertVo> alertList = this.baseMapper.heatList(businessAlertBo, businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
Map<String, List<BusinessAlertVo>> listMap = alertList.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
infoMap.putAll(listMap);
return infoMap;
}
@Override
public List<BusinessAlertVo> listVerifyAlert(RemoteBusinessAlertBo businessAlertBo) {
LambdaQueryWrapper<BusinessAlert> wrapper = new LambdaQueryWrapper<>();
@ -647,6 +741,38 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return businessAlert;
}
@Override
public Boolean deleteFalseAlert(Long alertId) {
LambdaUpdateWrapper<BusinessAlert> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(BusinessAlert::getId, alertId);
wrapper.set(BusinessAlert::getDelFlag,1);
return this.baseMapper.update(wrapper) > 0;
}
@Override
public List<BusinessAlert> listHandleHistory(String lng, String lat, String createTime) {
if (ObjectUtil.hasEmpty(lng, lat)) {
return ListUtil.empty();
}
List<BusinessAlert> businessAlerts = this.baseMapper.listHandleHistory(lng, lat, createTime);
try {
businessAlerts.forEach(businessAlert -> {
if (businessAlert.getBusinessType() == 2){
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlert.getImages(), 3600).toString());
}else {
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getImages(), 3600).toString());
businessAlert.setMaxImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMaxImages(), 3600).toString());
}
});
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return businessAlerts;
}
public static void main(String[] args) {
System.out.println(getLastSixDays());

194
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java

@ -3,6 +3,7 @@ package org.dromara.business.service.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.bo.BusinessAlertBo;
@ -12,6 +13,7 @@ import org.dromara.business.mapper.BusinessAlertMapper;
import org.dromara.business.service.IBusinessAlertService;
import org.dromara.business.service.IBusinessAlertStatisticsService;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.mybatis.enums.DataScopeType;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.RemoteDataScopeService;
@ -44,6 +46,7 @@ import static org.dromara.common.core.constant.Constants.FLY_COUNT;
*
*预警统计Service业务层处理
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatisticsService {
@ -97,8 +100,21 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
businessAlertBo.setDeptId(String.valueOf(LoginHelper.getDeptId()));
businessAlertBo.setAiLabelEnList(getAiLabel(businessAlertBo.getPostCode()).stream().map(RemoteAiLabelPostVo::getLabelEn).collect(Collectors.toList()));
List<Map<String, Object>> mapList = baseMapper.listDepartAlert(businessAlertBo);
//判断是否存在下级
Long deptId = LoginHelper.getDeptId();
List<RemoteDeptVo> remoteDeptVoList = Optional.ofNullable(remoteDeptService.selectListByParentId(String.valueOf(deptId)))
.orElse(Collections.emptyList())
.stream()
.filter(p -> !p.getDeptId().equals(deptId))
.collect(Collectors.toList());
//排除自己如果没有下级则默认使用下边的逻辑查询
if (ObjectUtil.isEmpty(remoteDeptVoList)) {
List<Map<String, Object>> mapList = baseMapper.listOneDepartAlert(businessAlertBo);
return mapList.stream().map(data -> new StatObj(data.get("deptName") + "", Long.parseLong(data.get("total") + ""),"deptId",data.get("deptId"))).collect(Collectors.toList());
}
//如果有则使用这个查询
List<Map<String, Object>> mapList = baseMapper.listDepartAlert(businessAlertBo);
return mapList.stream().map(data -> new StatObj(data.get("deptName") + "", Long.parseLong(data.get("total") + ""),"deptId",data.get("deptId"))).collect(Collectors.toList());
}
@ -131,6 +147,33 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
businessAlertBo.setDeptId(String.valueOf(LoginHelper.getDeptId()));
businessAlertBo.setAiLabelEnList(getAiLabel(businessAlertBo.getPostCode()).stream().map(RemoteAiLabelPostVo::getLabelEn).collect(Collectors.toList()));
//判断是否存在下级
Long deptId = LoginHelper.getDeptId();
List<RemoteDeptVo> remoteDeptVoList = Optional.ofNullable(remoteDeptService.selectListByParentId(String.valueOf(deptId)))
.orElse(Collections.emptyList())
.stream()
.filter(p -> !p.getDeptId().equals(deptId))
.collect(Collectors.toList());
//排除自己如果没有下级则默认使用下边的逻辑查询
if (ObjectUtil.isEmpty(remoteDeptVoList)) {
List<Map<String, Object>> mapList = baseMapper.listOneDepartAlertStatus(businessAlertBo);
return mapList.stream()
.map(map -> new StatObj(
Objects.toString(map.get("deptName")),
List.of(
new StatObj("total", map.get("total")),
new StatObj("todoCount", map.get("todoCount")),
new StatObj("finishCount", map.get("finishCount")),
new StatObj("cancelCount", map.get("cancelCount"))
),"deptId",map.get("deptId")
))
.collect(Collectors.toList());
}
//如果有下级则使用下方方法
List<Map<String, Object>> mapList = baseMapper.listDepartAlertStatus(businessAlertBo);
return mapList.stream()
@ -186,57 +229,58 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//----------------------------------------------获取飞行总架次、总时长----------------------------------------------
//获取飞行总架次、总时长
//获取机场信息根据当前登录人
List<String> deviceSnList = ObjectUtil.isNotEmpty(feignDeviceGroup.listDevice(LoginHelper.getUserId()))?feignDeviceGroup.listDevice(LoginHelper.getUserId()):ListUtil.empty();
// List<String> deviceSnList = ObjectUtil.isNotEmpty(feignDeviceGroup.listDevice(LoginHelper.getUserId()))?feignDeviceGroup.listDevice(LoginHelper.getUserId()):ListUtil.empty();
//过滤redis中用户所拥有的设备
Map<String, Object> countMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_COUNT))
.map(map -> map.entrySet().stream()
.filter(entry -> deviceSnList.contains(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
.orElse(new HashMap<>());
int flyCount;
if (ObjectUtil.isNotEmpty(countMap)){
flyCount = countMap.values().stream()
.filter(Objects::nonNull)
.mapToInt(value -> {
if (value instanceof Number) {
return ((Number) value).intValue();
}
return 0;
})
.sum();
} else {
flyCount = 0;
}
// Map<String, Object> countMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_COUNT))
// .map(map -> map.entrySet().stream()
// .filter(entry -> deviceSnList.contains(entry.getKey()))
// .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
// .orElse(new HashMap<>());
// int flyCount;
//
// if (ObjectUtil.isNotEmpty(countMap)){
// flyCount = countMap.values().stream()
// .filter(Objects::nonNull)
// .mapToInt(value -> {
// if (value instanceof Number) {
// return ((Number) value).intValue();
// }
// return 0;
// })
// .sum();
// } else {
// flyCount = 0;
// }
//过滤redis中用户所拥有的设备
Map<String, Object> accTimeMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_ACC_TIME))
.map(map -> map.entrySet().stream()
.filter(entry -> deviceSnList.contains(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
.orElse(new HashMap<>());
double flyAccTime;
if (ObjectUtil.isNotEmpty(accTimeMap)) {
flyAccTime = accTimeMap.values().stream()
.filter(Objects::nonNull)
.mapToDouble(value -> {
if (value instanceof Number) {
return ((Number) value).doubleValue();
}
return 0.0;
})
.sum();
} else {
flyAccTime = 0.0;
}
// Map<String, Object> accTimeMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_ACC_TIME))
// .map(map -> map.entrySet().stream()
// .filter(entry -> deviceSnList.contains(entry.getKey()))
// .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
// .orElse(new HashMap<>());
//
//
// double flyAccTime;
//
// if (ObjectUtil.isNotEmpty(accTimeMap)) {
// flyAccTime = accTimeMap.values().stream()
// .filter(Objects::nonNull)
// .mapToDouble(value -> {
// if (value instanceof Number) {
// return ((Number) value).doubleValue();
// }
// return 0.0;
// })
// .sum();
// } else {
// flyAccTime = 0.0;
// }
//----------------------------------------------获取飞行总架次、总时长----------------------------------------------
Map<String, Integer> devices = feignDeviceGroup.getDevices();
Map<String, Object> panel = baseMapper.countPanelAlert(businessAlertBo);
@ -245,8 +289,8 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
ObjectUtil.isEmpty(panel.get("total"))?0:panel.get("total"),
ObjectUtil.isEmpty(panel.get("finishCount"))?0:panel.get("finishCount"),
ObjectUtil.isEmpty(panel.get("cancelCount"))?0:panel.get("cancelCount"),
flyCount,
flyAccTime);
ObjectUtil.isEmpty(devices.get("flyCount"))?0:devices.get("flyCount"),
ObjectUtil.isEmpty(devices.get("flyAccTime"))?0:devices.get("flyAccTime"));
}
@Override
@ -596,14 +640,15 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
switch (dateType) {
case 0:
LocalDate today = LocalDate.now();
LocalDate startDate = today.minusMonths(6)
.with(TemporalAdjusters.firstDayOfMonth());
// 获取当前日期
LocalDate localDate = LocalDate.now();
// 计算当前日期的六个月前的日期
LocalDate sixMonthsAgo = localDate.minusMonths(6);
LocalDate endDate = today.with(TemporalAdjusters.lastDayOfMonth());
result.put("startTime", sixMonthsAgo.format(formatter));
result.put("endTime", localDate.format(formatter));
result.put("startTime",startDate.format(formatter));
result.put("endTime",endDate.format(formatter));
break;
case 1: // 年
LocalDate currentDate = LocalDate.now();
@ -774,20 +819,37 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
}
private void createPermissions(BusinessAlertBo businessAlertBo) {
Long roleId = Optional.ofNullable(LoginHelper.getLoginUser())
.map(LoginUser::getRoles)
.filter(roles -> !roles.isEmpty())
.map(List::getFirst)
.map(RoleDTO::getRoleId)
.orElse(null);
String roleCustom = remoteDataScopeService.getRoleCustom(roleId);
if (roleCustom.equalsIgnoreCase("-1")){
try {
RoleDTO roleDTO = LoginHelper.getLoginUser().getRoles().getFirst();
//自定义权限
if (roleDTO.getDataScope().equalsIgnoreCase(DataScopeType.CUSTOM.getCode())){
String roleCustom = remoteDataScopeService.getRoleCustom(roleDTO.getRoleId());
if (roleCustom.equalsIgnoreCase("-1")){
businessAlertBo.setDeptIdList(ListUtil.empty());
}else {
businessAlertBo.setDeptIdList(Arrays.stream(roleCustom.split(","))
.map(Long::parseLong)
.collect(Collectors.toList()));
}
} else if (roleDTO.getDataScope().equalsIgnoreCase(DataScopeType.DEPT_AND_CHILD.getCode())) {
//部门及其以下
String deptAndChild = remoteDataScopeService.getDeptAndChild(LoginHelper.getDeptId());
if (deptAndChild.equalsIgnoreCase("-1")){
businessAlertBo.setDeptIdList(ListUtil.empty());
}else {
businessAlertBo.setDeptIdList(Arrays.stream(deptAndChild.split(","))
.map(Long::parseLong)
.collect(Collectors.toList()));
}
} else if (roleDTO.getDataScope().equalsIgnoreCase(DataScopeType.DEPT.getCode())) {
//本部门
businessAlertBo.setDeptIdList(List.of(LoginHelper.getDeptId()));
}
} catch (Exception e) {
businessAlertBo.setDeptIdList(ListUtil.empty());
}else {
businessAlertBo.setDeptIdList(Arrays.stream(roleCustom.split(","))
.map(Long::parseLong)
.collect(Collectors.toList()));
log.error(e.getMessage(),e);
}
}
}

83
dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml

@ -6,6 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="searchSql">
and ba.handle_type != 'verify'
and ba.del_flag = '0'
<if test="param.aiLabelEnList != null and param.aiLabelEnList.size > 0">
and ba.label_en in
<foreach collection="param.aiLabelEnList" item="item" open="(" close=")" separator=",">
@ -15,6 +16,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="param.createTime != null and param.createTime != ''">
and DATE_FORMAT(ba.create_time,'%Y-%m-%d') = #{param.createTime}
</if>
<if test="param.startTime != null and param.startTime != ''">
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') >= #{param.startTime} ]]>
</if>
<if test="param.endTime != null and param.endTime != ''">
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') <= #{param.endTime} ]]>
</if>
<if test="param.deptIdList != null and param.deptIdList.size > 0">
and ba.dept_id in
<foreach collection="param.deptIdList" item="item" open="(" close=")" separator=",">
@ -30,6 +37,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="pageBusinessAlertFinish" resultType="org.dromara.business.domain.BusinessAlert">
select t.* from (select
ba.*
from dk_business.business_alert ba) t
${ew.getCustomSqlSegment}
</select>
<select id="pageBusinessAlertCancel" resultType="org.dromara.business.domain.BusinessAlert">
select t.* from (
select
@ -43,7 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="pageAlertFinish" resultType="org.dromara.business.domain.BusinessAlert">
<select id="pageBusinessAlertHandle" resultType="org.dromara.business.domain.BusinessAlert">
select t.* from (
select
ba.*,
@ -518,6 +532,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
warning_summary ws
LEFT JOIN business_alert ba ON ws.label_en = ba.label_en
and ba.handle_type != 'verify'
and ba.del_flag = '0'
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') >= #{startTime} ]]>
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') <= #{endTime} ]]>
and ws.label_en in
@ -834,6 +849,72 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="listHandleHistory" resultType="org.dromara.business.domain.BusinessAlert">
SELECT job_name,max_images,images,create_time,id,handle_type,del_flag,ST_Distance_Sphere(point(lng, lat), point(#{lng},#{lat})) AS distance,business_type
FROM business_alert
WHERE <![CDATA[ create_time >= DATE_SUB(#{createTime}, INTERVAL 60 DAY) ]]>
AND <![CDATA[ create_time < #{createTime} ]]>
and del_flag = 0
HAVING <![CDATA[ distance <= 30 ]]>
ORDER BY create_time desc
</select>
<select id="listOneDepartAlert" resultType="java.util.Map">
SELECT
dc.dept_id AS deptId,
dc.dept_name AS deptName,
COALESCE(COUNT(ba.id), 0) AS total
FROM
(select dept_id,dept_name from dk_cloud.sys_dept sd where sd.dept_id = #{param.deptId}) dc
LEFT JOIN business_alert ba ON ba.dept_id = dc.dept_id
<include refid="searchSql"></include>
GROUP BY
dc.dept_id,dc.dept_name
</select>
<select id="listOneDepartAlertStatus" resultType="java.util.Map">
SELECT
dc.dept_id AS deptId,
dc.dept_name AS deptName,
COALESCE(COUNT(ba.id), 0) AS total,
IFNULL(SUM(ba.handle_type = 'waiting'), 0) AS todoCount,
IFNULL(SUM(ba.handle_type = 'finish'), 0) AS finishCount,
IFNULL(SUM(ba.handle_type = 'cancel'), 0) AS cancelCount
FROM
(select dept_id,dept_name from dk_cloud.sys_dept sd where sd.dept_id = #{param.deptId}) dc
LEFT JOIN business_alert ba ON ba.dept_id = dc.dept_id
<include refid="searchSql"></include>
GROUP BY
dc.dept_id,dc.dept_name
</select>
<select id="heatList" resultType="org.dromara.business.domain.vo.BusinessAlertVo">
SELECT
temp.label_en AS labelEn,
temp.label_cn as labelCn,
bl.lat AS lat,
bl.lng AS lng,
COUNT(*) AS value
FROM
(
SELECT
ba.label_en,
ba.label_cn
FROM
dk_business.business_alert ba
GROUP BY
ba.label_en, ba.label_cn
) temp
INNER JOIN
business_alert bl ON temp.label_en = bl.label_en
AND bl.lat IS NOT NULL
<where>
<include refid="searchSql"></include>
</where>
GROUP BY
temp.label_en,temp.label_cn, bl.lat, bl.lng
HAVING
<![CDATA[ ST_Distance_Sphere(POINT(lng, lat), POINT(bl.lng, bl.lat)) <= 30 ]]>
</select>
</mapper>

2
dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml

@ -91,7 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</when>
</choose>
</where>
order by t.status,t.create_time desc
order by t.create_time desc
</select>
<select id="queryBusinessTask" resultMap="businessTaskMap">
SELECT

15
dk-modules/sample/src/main/java/org/dromara/sample/feign/BusinessTaskFeign.java

@ -1,15 +0,0 @@
package org.dromara.sample.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "gateway",path = "business")
public interface BusinessTaskFeign {
@PostMapping("/update/status")
void updateTaskStatus(@RequestParam String waylineId,
@RequestParam String status,
@RequestParam(required = false) String jobId,
@RequestParam(required = false) String jobName);
}

2
dk-modules/sample/src/main/java/org/dromara/sample/fegin/RemoteBusinessTaskFeign.java → dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessTaskFeign.java

@ -1,4 +1,4 @@
package org.dromara.sample.fegin;
package org.dromara.sample.feign;
import org.dromara.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;

19
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java

@ -9,6 +9,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import org.dromara.sample.manage.service.IDeviceProService;
import org.dromara.sample.manage.service.IDeviceService;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j;
@ -37,6 +38,10 @@ public class DeviceController {
@Autowired
private IDeviceService deviceService;
@Autowired
private IDeviceProService deviceProService;
/**
* 获取一个工作区中所有在线设备的列表
* Get the topology list of all online devices in one workspace.
@ -45,8 +50,8 @@ public class DeviceController {
@GetMapping("/{workspace_id}/devices")
@Operation(summary = "获取一个工作区中所有在线设备的列表。", description = "获取一个工作区中所有在线设备的列表")
public HttpResultResponse<List<DeviceDTO>> getDevices(@PathVariable("workspace_id") String workspaceId,
@RequestParam(name = "nickname",required = false) String nickname) {
List<DeviceDTO> devicesList = deviceService.getDevicesTopoForWeb(workspaceId,nickname);
@RequestParam(name = "nickname",required = false) String nickname,@RequestParam(name = "proIds",required = false) List<Integer> proIds) {
List<DeviceDTO> devicesList = deviceService.getDevicesTopoForWeb(workspaceId,nickname,proIds);
return HttpResultResponse.success(devicesList);
}
@ -92,9 +97,9 @@ public class DeviceController {
@PathVariable("workspace_id") String workspaceId,Integer domain,
@RequestParam(name = "pageNum", defaultValue = "1") Long page,
@RequestParam(name = "pageSize", defaultValue = "10") Long pageSize,
@RequestParam(name = "nickname",required = false) String nickname) {
LoginUser loginUser = LoginHelper.getLoginUser();
PaginationData<DeviceDTO> devices = deviceService.getBoundDevicesWithDomain(workspaceId, page, pageSize, domain,nickname);
@RequestParam(name = "nickname",required = false) String nickname,
@RequestParam(name = "proIds",required = false) List<Integer> proIds) {
PaginationData<DeviceDTO> devices = deviceService.getBoundDevicesWithDomain(workspaceId, page, pageSize, domain,nickname,proIds);
return HttpResultResponse.success(devices);
}
@ -119,7 +124,7 @@ public class DeviceController {
* @param deviceSn
* @return
*/
@PutMapping("/devices/{device_sn}")
@PutMapping("/{workspace_id}/devices/{device_sn}")
@Operation(summary = "更新设备信息。", description = "更新设备信息。")
public HttpResultResponse updateDevice(@RequestBody DeviceDTO device,
@PathVariable("workspace_id") String workspaceId,
@ -136,7 +141,7 @@ public class DeviceController {
* @return
*/
@Operation(summary = "设备离线固件升级任务。", description = "设备离线固件升级任务。")
@PostMapping("/devices/ota")
@PostMapping("/{workspace_id}/devices/ota")
public HttpResultResponse createOtaJob(@PathVariable("workspace_id") String workspaceId,
@RequestBody List<DeviceFirmwareUpgradeDTO> upgradeDTOS) {
return deviceService.createDeviceOtaJob(workspaceId, upgradeDTOS);

28
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceFlightRecordsController.java

@ -0,0 +1,28 @@
package org.dromara.sample.manage.controller;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sample.manage.service.IDeviceFlightRecordsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@Slf4j
@RequestMapping("/device/flight")
public class DeviceFlightRecordsController {
@Autowired
private IDeviceFlightRecordsService deviceFlightRecordsService;
@GetMapping("/count")
public Map<String,Integer> getDevices() {
log.info("----------------------------开始调用feign接口查询项目组----------------------------");
Map<String, Integer> deviceFlightCount = deviceFlightRecordsService.getDeviceFlightCount();
log.info("----------------------------调用feign接口查询项目组结束----------------------------");
return deviceFlightCount;
}
}

82
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java

@ -49,6 +49,17 @@ public class DeviceProController {
return HttpResultResponse.success(devices);
}
/**
* 查询项目组下拉列表
* @return
*/
@Operation(summary = "查询项目组下拉列表", description = "查询项目组下拉列表")
@GetMapping("/list")
public HttpResultResponse<List<DeviceProEntity>> listDevicePro(){
return HttpResultResponse.success(deviceProService.listDevicePro());
}
//2、添加项目组
/**
* 新增/更新项目
@ -65,8 +76,8 @@ public class DeviceProController {
//3、删除项目组
@Operation(summary = "删除项目组。", description = "删除项目组。")
@DeleteMapping("/delete")
public HttpResultResponse<Boolean> deleteDevicePro(@RequestBody List<Integer> ids) {
return HttpResultResponse.success(deviceProService.deleteIds(ids));
public HttpResultResponse<Boolean> deleteDevicePro(Integer id) {
return HttpResultResponse.success(deviceProService.deleteIds(List.of(id)));
}
/**
@ -80,35 +91,62 @@ public class DeviceProController {
return HttpResultResponse.success(deviceProService.updateDeviceProUser(userEntity,proId));
}
@Operation(summary = "查询项目人员。", description = "查询项目人员")
@GetMapping("/{proId}/user/page")
public HttpResultResponse<PaginationData<DeviceProUserEntity>> pageProUser(@PathVariable Integer proId,
@RequestParam(value = "searchValue",required = false) String searchValue,
@RequestParam(name = "pageNum", defaultValue = "1") Long page,
@RequestParam(name = "pageSize", defaultValue = "10") Long pageSize) {
Page<DeviceProUserEntity> pageQuery = new Page<>(page, pageSize);
return HttpResultResponse.success(deviceProService.pageProUser(searchValue,proId,pageQuery));
}
@Operation(summary = "删除项目人员", description = "删除项目人员")
@DeleteMapping("/{proId}/{proUserId}/user/delete")
public HttpResultResponse<Boolean> deleteProUser(@PathVariable Integer proId,
@PathVariable Long proUserId) {
return HttpResultResponse.success(deviceProService.deleteProUser(proUserId,proId));
}
/**
* 设备绑定项目组
* 开启配置
* @param proId
* @return
*/
@Operation(summary = "设备绑定项目组", description = "设备绑定项目组")
@PostMapping("/bind")
public HttpResultResponse<Boolean> updateDevice(@RequestBody Dict dict) {
return HttpResultResponse.success(deviceProService.updateDevice(dict));
@Operation(summary = "开启配置", description = "开启配置")
@PostMapping("/enable/{proId}")
public HttpResultResponse<Boolean> enablePro(@PathVariable("proId") Integer proId) {
return HttpResultResponse.success(deviceProService.enablePro(proId));
}
/**
* 根据人员获取项目组(feign调用接口)
* 关闭配置
* @param proId
* @return
*/
@GetMapping("/feign/user")
public List<Integer> listDeviceGroup(@RequestParam("userId") Long userId) {
log.info("----------------------------开始调用feign接口查询项目组----------------------------");
List<Integer> result = deviceProService.listDeviceGroup(userId);
log.info("----------------------------调用feign接口查询项目组结束----------------------------");
return result;
@Operation(summary = "关闭配置", description = "关闭配置")
@PostMapping("/disable/{proId}")
public HttpResultResponse<Boolean> disablePro(@PathVariable("proId") Integer proId) {
return HttpResultResponse.success(deviceProService.disablePro(proId));
}
/**
* 根据人员获取当前人员所拥有的机场(feign调用接口)
* 根据人员获取项目组
*/
@GetMapping("/feign/device")
public List<String> listDevice(@RequestParam("userId") Long userId) {
log.info("----------------------------开始调用feign接口查询项目所属机场----------------------------");
List<String> result = deviceProService.listDevice(userId);
log.info("----------------------------调用feign接口查询项目组所属机场----------------------------");
return result;
}
// @GetMapping("/list/pro")
// public HttpResultResponse<List<Integer>> listDeviceGroup(@RequestParam("userId") Long userId) {
// List<Integer> result = deviceProService.listDeviceGroup(userId);
// return HttpResultResponse.success(result);
// }
/**
* 根据人员获取项目组
*/
@GetMapping("/list/user/pro")
public HttpResultResponse<List<DeviceProEntity>> listUserGroup() {
List<DeviceProEntity> result = deviceProService.listUserGroup();
return HttpResultResponse.success(result);
}
}

7
dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/DeviceFlightRecordsMapper.java

@ -0,0 +1,7 @@
package org.dromara.sample.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
public interface DeviceFlightRecordsMapper extends BaseMapper<DeviceFlightRecordsEntity> {
}

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceDTO.java

@ -102,7 +102,7 @@ public class DeviceDTO {
private String tenantId;
@Schema(description = "项目ID")
private String proId;
private Integer proId;
@Schema(description = "项目ID")
private DeviceProEntity deviceProEntity;

12
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceProDTO.java

@ -43,5 +43,15 @@ public class DeviceProDTO {
/**
分配人员
*/
private Integer userId;
private Long userId;
/**
* 设备组编码
*/
private String bind_code;
/**
* 设备组名称
*/
private String pro_name;
}

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceQrtzDTO.java

@ -96,4 +96,6 @@ public class DeviceQrtzDTO {
private String deptName;
private List<Long>deptIds;
private List<Integer> proIds;
}

45
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceFlightRecordsEntity.java

@ -0,0 +1,45 @@
package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "device_flight_records")
public class DeviceFlightRecordsEntity {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 机场sn
*/
private String deviceSn;
/**
* 飞行总架次
*/
private Integer flyCount;
/**
* 飞行总时长
*/
private Integer flyAccTime;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceProEntity.java

@ -37,7 +37,7 @@ public class DeviceProEntity extends BaseEntity implements Serializable {
private String bindCode;
@TableField(value = "bind_type")
private Integer bindType;
private Boolean bindType;
@TableField(value = "workspace_id")
private String workspaceId;

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/param/DeviceQueryParam.java

@ -35,4 +35,6 @@ public class DeviceQueryParam {
private boolean orderBy;
private boolean isAsc;
private List<Integer> proIds;
}

15
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceFlightRecordsService.java

@ -0,0 +1,15 @@
package org.dromara.sample.manage.service;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
import java.util.List;
import java.util.Map;
public interface IDeviceFlightRecordsService {
void saveDeviceFlight(DeviceFlightRecordsEntity deviceFlightRecords);
Map<String,Integer> getDeviceFlightCount();
}

13
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java

@ -43,4 +43,17 @@ public interface IDeviceProService {
List<Integer> listDeviceGroup(Long userId);
List<String> listDevice(Long userId);
List<DeviceProEntity> listDevicePro();
Boolean enablePro(Integer proId);
Boolean disablePro(Integer proId);
PaginationData<DeviceProUserEntity> pageProUser(String searchValue, Integer proId,Page<DeviceProUserEntity> pageQuery);
Boolean deleteProUser(Long proUserId, Integer proId);
List<DeviceProEntity> listUserGroup();
}

4
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceService.java

@ -66,7 +66,7 @@ public interface IDeviceService {
* @param workspaceId
* @return
*/
List<DeviceDTO> getDevicesTopoForWeb(String workspaceId,String nickname);
List<DeviceDTO> getDevicesTopoForWeb(String workspaceId,String nickname,List<Integer> proIds);
/**
@ -129,7 +129,7 @@ public interface IDeviceService {
* @param domain
* @return
*/
PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page, Long pageSize, Integer domain,String nickname);
PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page, Long pageSize, Integer domain,String nickname,List<Integer> proIds);
/**
* Unbind device base on device's sn.

58
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceFlightRecordsServiceImpl.java

@ -0,0 +1,58 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.sample.manage.mapper.DeviceFlightRecordsMapper;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
import org.dromara.sample.manage.service.IDeviceFlightRecordsService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class DeviceFlightRecordsServiceImpl extends ServiceImpl<DeviceFlightRecordsMapper,DeviceFlightRecordsEntity> implements IDeviceFlightRecordsService {
@Override
public void saveDeviceFlight(DeviceFlightRecordsEntity deviceFlightRecords) {
//查询之前的数据
DeviceFlightRecordsEntity deviceFlightRecordsEntities = this.baseMapper.selectOne(new LambdaQueryWrapper<DeviceFlightRecordsEntity>().eq(DeviceFlightRecordsEntity::getDeviceSn,deviceFlightRecords.getDeviceSn()));
if (ObjectUtil.isNotEmpty(deviceFlightRecordsEntities)) {
deviceFlightRecordsEntities.setFlyCount(deviceFlightRecordsEntities.getFlyCount() + deviceFlightRecords.getFlyCount());
deviceFlightRecordsEntities.setFlyAccTime(deviceFlightRecordsEntities.getFlyAccTime() + deviceFlightRecords.getFlyAccTime());
this.updateById(deviceFlightRecordsEntities);
}else {
this.save(deviceFlightRecords);
}
}
@Override
public Map<String,Integer> getDeviceFlightCount() {
Map<String,Integer> resultMap = new HashMap<>();
List<DeviceFlightRecordsEntity> deviceFlightRecordsEntities = this.baseMapper.selectList(new LambdaQueryWrapper<>());
int flyCount = deviceFlightRecordsEntities.stream()
.map(DeviceFlightRecordsEntity::getFlyCount)
.reduce(0, Integer::sum);
int flyAccTime = deviceFlightRecordsEntities.stream()
.map(DeviceFlightRecordsEntity::getFlyAccTime)
.reduce(0, Integer::sum);
resultMap.put("flyCount",flyCount);
resultMap.put("flyAccTime",flyAccTime);
return resultMap;
}
}

171
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java

@ -58,7 +58,9 @@ import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.model.receiver.BasicDeviceProperty;
import org.dromara.sample.manage.service.*;
import org.dromara.sample.websocket.service.IWebSocketMessageService;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -88,7 +90,6 @@ public class DeviceProServiceImpl implements IDeviceProService {
@Autowired
private IDeviceProUserMapper deviceProUserMapper;
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public PaginationData<DeviceProEntity> listDeviceProEntityMap(Page page, DeviceProDTO deviceProDTO) {
@ -100,10 +101,13 @@ public class DeviceProServiceImpl implements IDeviceProService {
@Override
public Boolean updateDevicePro(DeviceProEntity deviceProEntity) {
if(ObjectUtil.isNotEmpty(deviceProEntity.getId())){
DeviceProEntity devicePro = deviceProMapper.selectById(deviceProEntity.getId());
BeanUtils.copyProperties(deviceProEntity, devicePro);
return deviceProMapper.updateById(deviceProEntity) > 0 ;
}else {
deviceProEntity.setDeptName(LoginHelper.getDeptName());
deviceProEntity.setNickName(LoginHelper.getUsername());
deviceProEntity.setNickName(LoginHelper.getLoginUser().getNickname());
return deviceProMapper.insert(deviceProEntity) > 0;
}
}
@ -119,10 +123,6 @@ public class DeviceProServiceImpl implements IDeviceProService {
});
//todo人员是否要删除
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().in(DeviceProUserEntity::getDeviceProId, ids));
return deviceProMapper.deleteByIds(ids)>0;
}
@ -130,76 +130,16 @@ public class DeviceProServiceImpl implements IDeviceProService {
@Transactional(rollbackFor = Exception.class)
public Boolean updateDeviceProUser(List<DeviceProUserEntity> userEntity,Integer proId) {
try {
//获取项目组信息
DeviceProEntity deviceProEntity = deviceProMapper.selectOne(new LambdaQueryWrapper<DeviceProEntity>().eq(DeviceProEntity::getId, proId));
//查询之前项目所属的人员信息
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
List<DeviceProUserEntity> difference = new ArrayList<>();
// 判断两个集合的差值(基于 userId)
difference = proUserEntityList.stream()
.filter(proUser -> userEntity.stream()
.noneMatch(user -> user.getUserId().equals(proUser.getUserId())))
List<DeviceProUserEntity> different = userEntity.stream()
.filter(user -> proUserEntityList.stream().noneMatch(u -> u.getUserId().equals(user.getUserId())))
.toList();
//--------------------------------------------缓存相关操作----------------------------------------------------------------
//人员如果解绑了项目删除缓存数据
difference.forEach(proUserEntity -> {
//删除人员项目组信息
List<Object> projects = RedisUtils.getCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()));
List<Map> projectList = projects.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
//删除人员中所拥有的当前的项目组,然后构建新的存入redis
List<Map> deviceProEntities = projectList.stream().filter(p -> !Integer.valueOf(p.get("id") + "").equals(proId)).toList();
//删除
RedisUtils.deleteObject(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()));
//重新插入
RedisUtils.setCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()),deviceProEntities);
//删除人员所拥有的设备信息
List<Object> cacheList = RedisUtils.getCacheList(String.format(Constants.PRO_DEVICE, proUserEntity.getUserId()));
List<Map> deviceList = cacheList.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
//过滤除了这个删除的项目组之外的设备
deviceList = deviceList.stream().filter(p-> !Integer.valueOf(p.get("proId") + "").equals(proId)).toList();
//删除
RedisUtils.deleteObject(String.format(Constants.PRO_DEVICE, proUserEntity.getUserId()));
RedisUtils.setCacheList(String.format(Constants.PRO_DEVICE, proUserEntity.getUserId()),deviceList);
});
//--------------------------------------------缓存相关操作----------------------------------------------------------------
//先清除原来的项目组成员
deviceProUserMapper.delete(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
if (ObjectUtil.isNotEmpty(userEntity)) {
if (ObjectUtil.isNotEmpty(different)){
//添加新的项目组成员
deviceProUserMapper.insert(userEntity);
//更新缓存记录
userEntity.forEach(proUserEntity -> {
List<Object> projects = RedisUtils.getCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()));
List<Map> projectList = projects.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
if (!projectList.stream().anyMatch(p-> Integer.valueOf(p.get("id") + "").equals(proUserEntity.getDeviceProId()))){
Map proMap = objectMapper.convertValue(deviceProEntity, Map.class);
RedisUtils.addCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()), proMap);
}
});
deviceProUserMapper.insert(different);
}
return true;
@ -229,29 +169,11 @@ public class DeviceProServiceImpl implements IDeviceProService {
wrapper.set(DeviceEntity::getProId, proId);
wrapper.eq(DeviceEntity::getId, deviceId);
if (deviceMapper.update(wrapper) > 0) {
DeviceEntity deviceEntity = deviceMapper.selectOne(new LambdaQueryWrapper<DeviceEntity>().eq(DeviceEntity::getId, deviceId));
//根据proid获取人员用于存储人员的设备权限
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
proUserEntityList.forEach(deviceProUserEntity -> {
List<Object> devices = RedisUtils.getCacheList(String.format(Constants.PRO_DEVICE, deviceProUserEntity.getUserId()));
List<Map> deviceList = devices.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
if (!deviceList.stream().anyMatch(p-> Integer.valueOf(p.get("id") + "").equals(deviceEntity.getId()))){
Map deviceMap = objectMapper.convertValue(deviceEntity, Map.class);
RedisUtils.addCacheList(String.format(Constants.PRO_DEVICE, deviceProUserEntity.getUserId()), deviceMap);
}
});
}
return deviceMapper.update(wrapper) > 0;
} catch (Exception e) {
return false;
}
return true;
}
/**
@ -268,6 +190,8 @@ public class DeviceProServiceImpl implements IDeviceProService {
List<Integer> proIdList = proUserEntityList.stream().map(DeviceProUserEntity::getDeviceProId).distinct().toList();
LambdaQueryWrapper<DeviceProEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(DeviceProEntity::getId, proIdList);
//查询是否启用的设备组
queryWrapper.eq(DeviceProEntity::getBindType,1);
return deviceProMapper.selectList(queryWrapper).stream().map(DeviceProEntity::getId).distinct().toList();
}
@ -295,6 +219,73 @@ public class DeviceProServiceImpl implements IDeviceProService {
return ListUtil.empty();
}
@Override
public List<DeviceProEntity> listDevicePro() {
return deviceProMapper.selectList(new LambdaQueryWrapper<DeviceProEntity>());
}
@Override
public Boolean enablePro(Integer proId) {
LambdaUpdateWrapper<DeviceProEntity> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(DeviceProEntity::getId, proId);
wrapper.set(DeviceProEntity::getBindType,1);
return this.deviceProMapper.update(wrapper) > 0;
}
@Override
public Boolean disablePro(Integer proId) {
LambdaUpdateWrapper<DeviceProEntity> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(DeviceProEntity::getId, proId);
wrapper.set(DeviceProEntity::getBindType,0);
return this.deviceProMapper.update(wrapper) > 0;
}
@Override
public PaginationData<DeviceProUserEntity> pageProUser(String searchValue, Integer proId,Page<DeviceProUserEntity> pageQuery) {
LambdaQueryWrapper<DeviceProUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeviceProUserEntity::getDeviceProId,proId);
if (ObjectUtil.isNotEmpty(searchValue)){
wrapper.like(DeviceProUserEntity::getNickName,searchValue);
}
Page<DeviceProUserEntity> pagination = deviceProUserMapper.selectPage(pageQuery, wrapper);
return new PaginationData<DeviceProUserEntity>(pagination.getRecords(), new Pagination(pagination.getCurrent(), pagination.getSize(), pagination.getTotal()));
}
@Override
public Boolean deleteProUser(Long proUserId, Integer proId) {
LambdaQueryWrapper<DeviceProUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeviceProUserEntity::getDeviceProId,proId);
wrapper.eq(DeviceProUserEntity::getId,proUserId);
return deviceProUserMapper.delete(wrapper) > 0;
}
@Override
public List<DeviceProEntity> listUserGroup() {
Long userId = LoginHelper.getUserId();
LambdaQueryWrapper<DeviceProUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeviceProUserEntity::getUserId,userId);
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(proUserEntityList)){
List<Integer> proIdList = proUserEntityList.stream().map(DeviceProUserEntity::getDeviceProId).distinct().toList();
LambdaQueryWrapper<DeviceProEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(DeviceProEntity::getId, proIdList);
//查询是否启用的设备组
queryWrapper.eq(DeviceProEntity::getBindType,1);
return deviceProMapper.selectList(queryWrapper);
}
return ListUtil.empty();
}
@Override
public Boolean saveAndUpdate(DeviceProEntity entity) {
boolean flag = true;

4
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceQrtzServiceImpl.java

@ -13,7 +13,7 @@ import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.cloudapi.wayline.*;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.sample.fegin.RemoteBusinessTaskFeign;
import org.dromara.sample.feign.RemoteBusinessTaskFeign;
import org.dromara.sample.manage.mapper.IDeviceQrtzDateMapper;
import org.dromara.sample.manage.mapper.IDeviceQrtzFileMapper;
import org.dromara.sample.manage.mapper.IDeviceQrtzMapper;
@ -239,6 +239,7 @@ public class DeviceQrtzServiceImpl implements IDeviceQrtzService {
entity.setWaylineId(e.getWaylineId());
entity.setWaylineName(e.getWaylineName());
entity.setSort(e.getSort());
entity.setDeviceSn(e.getDeviceSn());
entity.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_1);
entity.setExecDate(Convert.toDate(endDate));
LoginUser loginUser = LoginHelper.getLoginUser();
@ -327,6 +328,7 @@ public class DeviceQrtzServiceImpl implements IDeviceQrtzService {
HttpResultResponse httpResultResponse = flightTaskService.publishFlightTask(device.getWorkspaceId(), createJobParam, deviceQrtzFileEntity.getNickName());
if(httpResultResponse.getCode() == 0){
deviceQrtzFileEntity.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_2);
deviceQrtzFileEntity.setFlightDate(new Date());
deviceQrtzFileMapper.updateById(deviceQrtzFileEntity);
continue;
}

14
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceServiceImpl.java

@ -1,5 +1,6 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -220,21 +221,24 @@ public class DeviceServiceImpl implements IDeviceService {
}
})
.eq(StringUtils.hasText(param.getWorkspaceId()),
DeviceEntity::getWorkspaceId, param.getWorkspaceId())
DeviceEntity::getWorkspaceId, param.getWorkspaceId())
.eq(param.getBoundStatus() != null, DeviceEntity::getBoundStatus, param.getBoundStatus())
.in(ObjectUtil.isAllNotEmpty(param.getProIds()),
DeviceEntity::getDeviceSn, param.getProIds())
.orderBy(param.isOrderBy(),
param.isAsc(), DeviceEntity::getId))
param.isAsc(), DeviceEntity::getId))
.stream()
.map(this::deviceEntityConvertToDTO)
.collect(Collectors.toList());
}
@Override
public List<DeviceDTO> getDevicesTopoForWeb(String workspaceId,String nickname) {
public List<DeviceDTO> getDevicesTopoForWeb(String workspaceId,String nickname,List<Integer> proIds) {
List<DeviceDTO> devicesList = this.getDevicesByParams(
DeviceQueryParam.builder()
.workspaceId(workspaceId)
.domains(List.of(DeviceDomainEnum.REMOTER_CONTROL.getDomain(), DeviceDomainEnum.DOCK.getDomain()))
.proIds(proIds)
.build());
devicesList.stream()
@ -494,13 +498,14 @@ public class DeviceServiceImpl implements IDeviceService {
@Override
public PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page,
Long pageSize, Integer domain,String nickname) {
Long pageSize, Integer domain,String nickname,List<Integer> proIds) {
Page<DeviceEntity> pagination = mapper.selectPage(new Page<>(page, pageSize),
new LambdaQueryWrapper<DeviceEntity>()
.eq(DeviceEntity::getDomain, domain)
.eq(DeviceEntity::getWorkspaceId, workspaceId)
.eq(DeviceEntity::getBoundStatus, true)
.in(ObjectUtil.isAllNotEmpty(proIds),DeviceEntity::getProId, proIds)
.eq(org.dromara.common.core.utils.StringUtils.isNotEmpty(nickname),DeviceEntity::getNickname,nickname));
List<DeviceDTO> devicesList = pagination.getRecords().stream().map(this::deviceEntityConvertToDTO)
.peek(device -> {
@ -710,6 +715,7 @@ public class DeviceServiceImpl implements IDeviceService {
.compatibleStatus(dto.getFirmwareStatus() == null ? null :
DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != dto.getFirmwareStatus())
.deviceDesc(dto.getDeviceDesc())
.proId(dto.getProId() == null ? null : dto.getProId())
.build();
}
}

13
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java

@ -2,6 +2,7 @@ package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.sdk.cloudapi.device.*;
import org.dromara.common.sdk.cloudapi.device.api.AbstractDeviceService;
import org.dromara.common.sdk.cloudapi.psdk.PsdkUiResource;
@ -30,12 +31,15 @@ import org.springframework.util.StringUtils;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import static org.dromara.common.core.constant.Constants.FLY_COUNT;
/**
* @author sean
* @version 1.7
@ -156,6 +160,13 @@ public class SDKDeviceService extends AbstractDeviceService {
}
DeviceDTO device = deviceOpt.get();
if(request.getData().getLatitude() != null && request.getData().getLongitude() != null
&& ((deviceOpt.get().getLatitude() == null && deviceOpt.get().getLongitude() == null)) || (request.getData().getLatitude() != deviceOpt.get().getLatitude() && request.getData().getLongitude() != deviceOpt.get().getLongitude())){
deviceOpt.get().setLatitude(request.getData().getLatitude());
deviceOpt.get().setLongitude(request.getData().getLongitude());
deviceRedisService.setDeviceOnline(deviceOpt.get());
deviceService.updateDevice(deviceOpt.get());
}
if (StringUtils.hasText(device.getChildDeviceSn())) {
deviceService.getDeviceBySn(device.getChildDeviceSn()).ifPresent(device::setChildren);
}
@ -165,13 +176,13 @@ public class SDKDeviceService extends AbstractDeviceService {
&& request.getData().getDroneChargeState().getCapacityPercent() >= 80 && (remainUpload != null && remainUpload == 0)){
deviceQrtzService.getDeviceQrtzFileEntity(device);
}
deviceRedisService.setDeviceOnline(device);
fillDockOsd(from, request.getData());
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DOCK_OSD, from, request.getData());
}
@Override
public void osdDockDrone(TopicOsdRequest<OsdDockDrone> request, MessageHeaders headers) {
String from = request.getFrom();

6
dk-modules/sample/src/main/java/org/dromara/sample/media/controller/FileController.java

@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.util.List;
/**
* @author sean
@ -37,8 +38,9 @@ public class FileController {
@Operation(summary = "根据工作区id获取此工作区中所有媒体文件的信息。", description = "根据工作区id获取此工作区中所有媒体文件的信息。")
public HttpResultResponse<PaginationData<MediaFileDTO>> getFilesList(@RequestParam(name = "pageNum", defaultValue = "1") Long page,
@RequestParam(name = "pageSize", defaultValue = "10") Long pageSize,
@PathVariable(name = "workspace_id") String workspaceId) {
PaginationData<MediaFileDTO> filesList = fileService.getMediaFilesPaginationByWorkspaceId(workspaceId, page, pageSize);
@PathVariable(name = "workspace_id") String workspaceId,
@RequestParam(name = "pro_ids",required = false) List<Integer> proIds) {
PaginationData<MediaFileDTO> filesList = fileService.getMediaFilesPaginationByWorkspaceId(workspaceId, page, pageSize,proIds);
return HttpResultResponse.success(filesList);
}

4
dk-modules/sample/src/main/java/org/dromara/sample/media/controller/MediaController.java

@ -52,8 +52,8 @@ public class MediaController implements IHttpMediaService {
* @return
*/
@Override
public HttpResultResponse<String> mediaUploadCallback( String workspaceId, @Valid MediaUploadCallbackRequest request, HttpServletRequest req, HttpServletResponse rsp) {
mediaService.saveMediaFile(workspaceId, request);
public HttpResultResponse<String> mediaUploadCallback( String workspaceId,Integer proId, @Valid MediaUploadCallbackRequest request, HttpServletRequest req, HttpServletResponse rsp) {
mediaService.saveMediaFile(workspaceId, request,proId);
return HttpResultResponse.success(request.getObjectKey());
}

3
dk-modules/sample/src/main/java/org/dromara/sample/media/model/MediaFileEntity.java

@ -111,5 +111,8 @@ public class MediaFileEntity implements Serializable {
@TableField("file_index")
private Integer fileIndex;
@TableField("pro_id")
private Integer proId;
}

4
dk-modules/sample/src/main/java/org/dromara/sample/media/service/IFileService.java

@ -29,7 +29,7 @@ public interface IFileService {
* @param file
* @return
*/
Integer saveFile(String workspaceId, MediaUploadCallbackRequest file, FlightTask flightTask);
Integer saveFile(String workspaceId, MediaUploadCallbackRequest file, FlightTask flightTask,Integer proId);
/**
* Query information about all files in this workspace based on the workspace id.
@ -45,7 +45,7 @@ public interface IFileService {
* @param pageSize
* @return
*/
PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, long page, long pageSize);
PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, long page, long pageSize,List<Integer> proIds);
/**
* Get the download address of the file.

2
dk-modules/sample/src/main/java/org/dromara/sample/media/service/IMediaService.java

@ -26,7 +26,7 @@ public interface IMediaService {
* @param file
* @return
*/
Integer saveMediaFile(String workspaceId, MediaUploadCallbackRequest file);
Integer saveMediaFile(String workspaceId, MediaUploadCallbackRequest file,Integer proId);
/**
* Query tiny fingerprints about all files in this workspace based on the workspace id.

7
dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/FileServiceImpl.java

@ -1,6 +1,7 @@
package org.dromara.sample.media.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -65,10 +66,11 @@ public class FileServiceImpl implements IFileService {
}
@Override
public Integer saveFile(String workspaceId, MediaUploadCallbackRequest file, FlightTask flightTask) {
public Integer saveFile(String workspaceId, MediaUploadCallbackRequest file, FlightTask flightTask,Integer proId) {
MediaFileEntity fileEntity = this.fileUploadConvertToEntity(file,flightTask);
fileEntity.setWorkspaceId(workspaceId);
fileEntity.setFileId(UUID.randomUUID().toString());
fileEntity.setProId(proId);
fileEntity.setFileType(fileEntity.getFileName().substring( fileEntity.getFileName().lastIndexOf(".")+1));
if(!fileEntity.getFileType().equals("DAT")){
fileEntity.setFileStatus(fileEntity.getFileName().substring( fileEntity.getFileName().lastIndexOf("_")+1, fileEntity.getFileName().lastIndexOf(".")));
@ -91,11 +93,12 @@ public class FileServiceImpl implements IFileService {
}
@Override
public PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, long page, long pageSize) {
public PaginationData<MediaFileDTO> getMediaFilesPaginationByWorkspaceId(String workspaceId, long page, long pageSize,List<Integer> proIds) {
Page<MediaFileEntity> pageData = mapper.selectPage(
new Page<MediaFileEntity>(page, pageSize),
new LambdaQueryWrapper<MediaFileEntity>()
.eq(MediaFileEntity::getWorkspaceId, workspaceId)
.in(ObjectUtil.isAllNotEmpty(proIds),MediaFileEntity::getProId, proIds)
.orderByDesc(MediaFileEntity::getId));
List<MediaFileDTO> records = pageData.getRecords()
.stream()

8
dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java

@ -79,8 +79,8 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
}
@Override
public Integer saveMediaFile(String workspaceId, MediaUploadCallbackRequest file) {
return fileService.saveFile(workspaceId, file,null);
public Integer saveMediaFile(String workspaceId, MediaUploadCallbackRequest file,Integer proId) {
return fileService.saveFile(workspaceId, file,null,proId);
}
@Override
@ -122,7 +122,7 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
&& request.getTid().equals(mediaFileCount.getTid()))) {
if(CollectionUtils.isEmpty(deviceQrtzFileEntities)){
deviceQrtzFileEntities.stream().forEach(item->{
item.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_2);
item.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_3);
});
deviceQrtzFileMapper.updateById(deviceQrtzFileEntities,100);
}
@ -180,7 +180,7 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
file.setPath(objectKey.substring(Optional.of(objectKey.indexOf("mediafile"))
.filter(index -> index > 0).map(index -> index++).orElse(0),
objectKey.lastIndexOf("/")));
Integer fileFlag = fileService.saveFile(device.getWorkspaceId(), file, callback.getFlightTask());
Integer fileFlag = fileService.saveFile(device.getWorkspaceId(), file, callback.getFlightTask(),device.getProId());
return fileFlag> 0;
}

11
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/AiCompareController.java

@ -136,7 +136,16 @@ public class AiCompareController extends BaseController {
public R<Void> edit(@Validated(EditGroup.class) @RequestBody Map<String,Object> bo) {
return toAjax(aiCompareService.update(bo));
}
/**
* 状态更改
*/
@SaCheckPermission("sample:compare:add")
@Log(title = "状态更改", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@GetMapping("/updateStatus")
public R<Void> updateStatus(Long id) {
return toAjax(aiCompareService.updateStatus(id));
}
/**
* 画框

14
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineFileController.java

@ -1,6 +1,7 @@
package org.dromara.sample.wayline.controller;
import io.seata.common.util.CollectionUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
@ -14,6 +15,8 @@ import org.dromara.common.sdk.cloudapi.wayline.*;
import org.dromara.common.sdk.cloudapi.wayline.api.IHttpWaylineService;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.manage.mapper.IDeviceProUserMapper;
import org.dromara.sample.manage.service.IDeviceProService;
import org.dromara.sample.wayline.model.dto.WaylineFileDTO;
import org.dromara.sample.wayline.model.entity.AudioFileEntity;
import org.dromara.sample.wayline.model.entity.WaylineFileEntity;
@ -46,6 +49,9 @@ public class WaylineFileController implements IHttpWaylineService {
@Autowired
private IWaylineFileService waylineFileService;
@Autowired
private IDeviceProService deviceProService;
/**
* 根据waylineID删除工作区中的wayline文件
* Delete the wayline file in the workspace according to the wayline id.
@ -67,13 +73,13 @@ public class WaylineFileController implements IHttpWaylineService {
*/
@PostMapping("${url.wayline.prefix}${url.wayline.version}/workspaces/{workspace_id}/waylines/file/{deviceSn}/upload")
@Operation(summary = "导入kmz航路文件。", description = "导入kmz航路文件。")
public HttpResultResponse importKmzFile(@PathVariable(name = "workspace_id") String workspaceId,HttpServletRequest request, MultipartFile file,@PathVariable(name = "deviceSn") String deviceSn) {
public HttpResultResponse importKmzFile(@PathVariable(name = "workspace_id") String workspaceId,HttpServletRequest request, MultipartFile file,@PathVariable(name = "deviceSn") String deviceSn,@PathVariable(name = "proId") Integer proId) {
if (Objects.isNull(file)) {
return HttpResultResponse.error("未收到文件。");
}
LoginUser loginUser = LoginHelper.getLoginUser();
String creator = loginUser.getUsername();
waylineFileService.importKmzFile(file, workspaceId, creator,deviceSn);
waylineFileService.importKmzFile(file, workspaceId, creator,deviceSn,proId);
return HttpResultResponse.success();
}
@ -86,8 +92,8 @@ public class WaylineFileController implements IHttpWaylineService {
* @return
*/
@Override
public HttpResultResponse<PaginationData<GetWaylineListResponse>> getWaylineList(@Valid GetWaylineListRequest request,String workspaceId, HttpServletRequest req, HttpServletResponse rsp) {
PaginationData<GetWaylineListResponse> data = waylineFileService.getWaylinesByParam(workspaceId, request);
public HttpResultResponse<PaginationData<GetWaylineListResponse>> getWaylineList(@Valid GetWaylineListRequest request,String workspaceId,List<Integer> proIds, HttpServletRequest req, HttpServletResponse rsp) {
PaginationData<GetWaylineListResponse> data = waylineFileService.getWaylinesByParam(workspaceId, request,proIds);
return HttpResultResponse.success(data);
}

39
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java

@ -3,27 +3,39 @@ package org.dromara.sample.wayline.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.dromara.business.api.domain.vo.RemoteBusinessAlertVo;
import org.dromara.common.core.domain.R;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress;
import org.dromara.common.sdk.cloudapi.wayline.WaylineJobTypeEnum;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.media.model.MediaFileDTO;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.model.entity.WaylineFileEntity;
import org.dromara.sample.wayline.model.param.CreateJobParam;
import org.dromara.sample.wayline.model.param.UpdateJobParam;
import org.dromara.sample.wayline.service.IFlightTaskService;
import org.dromara.sample.wayline.service.IWaylineFileService;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.dromara.sample.wayline.service.impl.WaylineFileServiceImpl;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import static org.bouncycastle.asn1.x500.style.RFC4519Style.name;
/**
* @author sean
@ -41,6 +53,11 @@ public class WaylineJobController {
@Autowired
private IFlightTaskService flighttaskService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IWaylineFileService waylineFileService;
/**
* Create a wayline task for the Dock.
* @param request
@ -67,8 +84,10 @@ public class WaylineJobController {
@Operation(summary = "查询工作区中的所有作业。。", description = "查询工作区中的所有作业。")
public HttpResultResponse<PaginationData<WaylineJobDTO>> getJobs(@RequestParam(name = "pageNum", defaultValue = "1") Long page,
@RequestParam(name = "pageSize", defaultValue = "10") Long pageSize,
@PathVariable(name = "workspace_id") String workspaceId) {
PaginationData<WaylineJobDTO> data = waylineJobService.getJobsByWorkspaceId(workspaceId, page, pageSize);
@PathVariable(name = "workspace_id") String workspaceId,
@RequestParam(name = "proId") List<Integer> proIds,
@RequestParam(name = "name") String name) {
PaginationData<WaylineJobDTO> data = waylineJobService.getJobsByWorkspaceId(workspaceId, page, pageSize,proIds,name);
return HttpResultResponse.success(data);
}
@ -107,6 +126,22 @@ public class WaylineJobController {
return HttpResultResponse.success();
}
@GetMapping("/{workspace_id}/getJobFileUrlByDeviceSn")
@Operation(summary = "根据设备查询飞行任务。", description = "根据设备查询飞行任务。")
public void getJobFileUrlByDeviceSn(@PathVariable(name = "workspace_id") String workspaceId,
@RequestParam(name = "device_sn") String deviceSn, HttpServletRequest req, HttpServletResponse rsp) {
try {
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceSn);
if(runningWaylineJob.isEmpty())return;
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobId(workspaceId, jobId);
if(waylineJobDTO.isEmpty())return;
URL url = waylineFileService.getObjectUrl(workspaceId, waylineJobDTO.get().getFileId());
rsp.sendRedirect(url.toString());
} catch (IOException | SQLException e) {
e.printStackTrace();
}
}

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/WaylineFileDTO.java

@ -47,4 +47,6 @@ public class WaylineFileDTO {
private Integer fileNo;
private Integer proId;
}

3
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/WaylineJobDTO.java

@ -10,6 +10,7 @@ import org.dromara.common.sdk.cloudapi.wayline.TaskTypeEnum;
import org.dromara.common.sdk.cloudapi.wayline.WaylineTypeEnum;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author sean
@ -72,4 +73,6 @@ public class WaylineJobDTO {
private String parentId;
private ProgressExtBreakPoint breakPoint;
private List<Integer> proIds;
}

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineFileEntity.java

@ -69,4 +69,6 @@ public class WaylineFileEntity implements Serializable {
@TableField(exist = false)
private String deviceName;
@TableField("pro_id")
private Integer proId;
}

3
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineJobEntity.java

@ -94,4 +94,7 @@ public class WaylineJobEntity implements Serializable {
@TableField(exist = false)
private ProgressExtBreakPoint breakPoint;
@TableField("pro_id")
private Integer proId;
}

1
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IAiCompareService.java

@ -23,6 +23,7 @@ public interface IAiCompareService {
Boolean update(Map<String,Object> compareDTO);
Boolean updateStatus(Long id);
AiCompareEntity getInfo(Long id);
List<AiCompareMediaFileDTO> queryById(Long id);

7
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineFileService.java

@ -5,6 +5,7 @@ import org.dromara.common.sdk.cloudapi.wayline.GetWaylineListResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.wayline.model.dto.WaylineFileDTO;
import org.dromara.sample.wayline.model.entity.AudioFileEntity;
import org.dromara.sample.wayline.model.entity.WaylineFileEntity;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
@ -26,7 +27,7 @@ public interface IWaylineFileService {
* @param param
* @return
*/
PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param);
PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param,List<Integer> proIds);
/**
* Query the information of this wayline file according to the wayline file id.
@ -83,10 +84,12 @@ public interface IWaylineFileService {
* @param creator
* @return
*/
void importKmzFile(MultipartFile file, String workspaceId, String creator,String deviceSn);
void importKmzFile(MultipartFile file, String workspaceId, String creator,String deviceSn,Integer proId);
String getWaylineIdByFileId(Integer fileId);
WaylineFileEntity getWaylineFileByWaylineId(Integer waylineId);
/**
* Perform paging queries based on query parameters.

4
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobService.java

@ -28,7 +28,7 @@ public interface IWaylineJobService {
* @param endTime The time the job ended.
* @return
*/
Optional<WaylineJobDTO> createWaylineJob(CreateJobParam param, String workspaceId, String username, Date beginTime, Date endTime);
Optional<WaylineJobDTO> createWaylineJob(CreateJobParam param, String workspaceId, String username, Date beginTime, Date endTime, Integer proId);
/**
* Create a sub-task based on the information of the parent task.
@ -69,7 +69,7 @@ public interface IWaylineJobService {
* @param pageSize
* @return
*/
PaginationData<WaylineJobDTO> getJobsByWorkspaceId(String workspaceId, long page, long pageSize);
PaginationData<WaylineJobDTO> getJobsByWorkspaceId(String workspaceId, long page, long pageSize,List<Integer> proIds,String name);
/**
* Query the wayline execution status of the dock.

17
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/AiCompareQueueServiceImpl.java

@ -1,43 +1,28 @@
package org.dromara.sample.wayline.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.tdunning.math.stats.Sort;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.poi.ss.formula.functions.T;
import org.dromara.business.api.RemoteBusinessTaskService;
import org.dromara.common.core.constant.AiCompareStatusConstants;
import org.dromara.common.core.constant.BusinessConstants;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.sample.fegin.RemoteBusinessTaskFeign;
import org.dromara.sample.feign.RemoteBusinessTaskFeign;
import org.dromara.sample.media.mapper.IFileMapper;
import org.dromara.sample.media.model.MediaFileEntity;
import org.dromara.sample.wayline.mapper.IAiCompareQueueMapper;
import org.dromara.sample.wayline.mapper.IWaylineJobMapper;
import org.dromara.sample.wayline.model.dto.AiCompareDTO;
import org.dromara.sample.wayline.model.dto.AiCompareQueueDTO;
import org.dromara.sample.wayline.model.entity.AiCompareEntity;
import org.dromara.sample.wayline.model.entity.AiCompareQueueEntity;
import org.dromara.sample.wayline.model.entity.WaylineJobEntity;
import org.dromara.sample.wayline.service.IAiCompareQueueService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @auther yq

12
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/AiCompareServiceImpl.java

@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -185,6 +186,16 @@ public class AiCompareServiceImpl implements IAiCompareService {
return i>0;
}
@Override
public Boolean updateStatus(Long id) {
AiCompareEntity aiCompareEntity = aiCompareMapper.selectById(id);
if(aiCompareEntity!=null&& ObjectUtil.equals(aiCompareEntity.getStatus(),AiCompareStatusConstants.COMPARE_STATUS_2)){
aiCompareEntity.setStatus(AiCompareStatusConstants.COMPARE_STATUS_4);
return aiCompareMapper.updateById(aiCompareEntity)>0;
}
return true;
}
@Override
public AiCompareEntity getInfo(Long id) {
return aiCompareMapper.selectById(id);
@ -233,6 +244,7 @@ public class AiCompareServiceImpl implements IAiCompareService {
@Override
public Boolean alert(Map<String,Object>map) {
AiCompareAlertDTO compareAlertDTO = Convert.convert(AiCompareAlertDTO.class,map);
aiComparePlateMapper.update(new LambdaUpdateWrapper<AiComparePlateEntity>().eq(AiComparePlateEntity::getFileId,compareAlertDTO.getFileId()).set(AiComparePlateEntity::getPatternName,compareAlertDTO.getDiscernImgUrl()));
List<RemoteBusinessAlertVo> handleList = compareAlertDTO.getHandleList();
return businessAlertService.saveBusinessAlert(handleList);
}

20
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java

@ -241,8 +241,14 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
if (TaskTypeEnum.IMMEDIATE != param.getTaskType() && endTime < System.currentTimeMillis()) {
continue;
}
Optional<WaylineJobDTO> waylineJobOpt = waylineJobService.createWaylineJob(param, workspaceId, loginUser.getUsername(), new Date(beginTime), new Date(endTime));
Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(param.getDockSn());
if(deviceOnline.isEmpty()){
throw new SQLException("机场信息不存在");
}
if(deviceOnline.get().getProId() == null){
throw new SQLException("项目组不存在");
}
Optional<WaylineJobDTO> waylineJobOpt = waylineJobService.createWaylineJob(param, workspaceId, loginUser.getUsername(), new Date(beginTime), new Date(endTime),deviceOnline.get().getProId());
if (waylineJobOpt.isEmpty()) {
throw new SQLException("无法创建路线作业。");
}
@ -273,8 +279,14 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
if (TaskTypeEnum.IMMEDIATE != param.getTaskType() && endTime < System.currentTimeMillis()) {
continue;
}
Optional<WaylineJobDTO> waylineJobOpt = waylineJobService.createWaylineJob(param, workspaceId, username, new Date(beginTime), new Date(endTime));
Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(param.getDockSn());
if(deviceOnline.isEmpty()){
throw new SQLException("机场信息不存在");
}
if(deviceOnline.get().getProId() == null){
throw new SQLException("项目组不存在");
}
Optional<WaylineJobDTO> waylineJobOpt = waylineJobService.createWaylineJob(param, workspaceId, username, new Date(beginTime), new Date(endTime),deviceOnline.get().getProId());
if (waylineJobOpt.isEmpty()) {
throw new SQLException("无法创建路线作业。");
}

15
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/SDKWaylineService.java

@ -3,6 +3,7 @@ package org.dromara.sample.wayline.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.constant.DeviceQrtzConstants;
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone;
import org.dromara.common.sdk.cloudapi.wayline.*;
import org.dromara.common.sdk.cloudapi.wayline.api.AbstractWaylineService;
import org.dromara.common.sdk.mqtt.MqttReply;
@ -16,8 +17,10 @@ import org.dromara.sample.common.error.CommonErrorEnum;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.mapper.IDeviceQrtzFileMapper;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
import org.dromara.sample.manage.model.entity.DeviceQrtzFileEntity;
import org.dromara.sample.manage.model.enums.UserTypeEnum;
import org.dromara.sample.manage.service.IDeviceFlightRecordsService;
import org.dromara.sample.manage.service.IDeviceRedisService;
import org.dromara.sample.media.model.MediaFileCountDTO;
import org.dromara.sample.media.service.IMediaRedisService;
@ -71,6 +74,9 @@ public class SDKWaylineService extends AbstractWaylineService {
@Autowired
private IWebSocketMessageService webSocketMessageService;
@Autowired
private IDeviceFlightRecordsService deviceFlightRecordsService;
@Override
public TopicEventsResponse<MqttReply> deviceExitHomingNotify(TopicEventsRequest<DeviceExitHomingNotify> request, MessageHeaders headers) {
return super.deviceExitHomingNotify(request, headers);
@ -105,7 +111,14 @@ public class SDKWaylineService extends AbstractWaylineService {
.completedTime(LocalDateTime.now())
.mediaCount(output.getExt().getMediaCount())
.build();
Optional<OsdDockDrone> deviceOsd = deviceRedisService.getDeviceOsd(deviceOpt.get().getChildDeviceSn(), OsdDockDrone.class);
Integer totalFlightSorties = deviceOsd.get().getTotalFlightSorties();
Float totalFlightTime = deviceOsd.get().getTotalFlightTime();
DeviceFlightRecordsEntity deviceFlightRecords = new DeviceFlightRecordsEntity();
deviceFlightRecords.setDeviceSn(response.getGateway());
deviceFlightRecords.setFlyCount(totalFlightSorties);
deviceFlightRecords.setFlyAccTime(totalFlightTime.intValue());
deviceFlightRecordsService.saveDeviceFlight(deviceFlightRecords);
// record the update of the media count.
if (Objects.nonNull(job.getMediaCount()) && job.getMediaCount() != 0) {
mediaRedisService.setMediaCount(response.getGateway(), job.getJobId(),

16
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineFileServiceImpl.java

@ -78,7 +78,7 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
private RemoteFileService remoteFileService;
@Override
public PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param) {
public PaginationData<GetWaylineListResponse> getWaylinesByParam(String workspaceId, GetWaylineListRequest param,List<Integer> proIds) {
// Paging Query
Page<WaylineFileEntity> page = mapper.selectPage(
new Page<WaylineFileEntity>(param.getPage(), param.getPageSize()),
@ -103,6 +103,9 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
.and(ObjectUtil.isNotEmpty(param.getDeviceSn()), wrapper -> {
wrapper.eq(WaylineFileEntity::getDeviceSn, param.getDeviceSn()).or();
})
.and(ObjectUtil.isAllNotEmpty(proIds), wrapper -> {
wrapper.in(WaylineFileEntity::getProId, proIds).or();
})
.like(Objects.nonNull(param.getKey()), WaylineFileEntity::getName, param.getKey())
// There is a risk of SQL injection
.last(Objects.nonNull(param.getOrderBy()), " order by " + param.getOrderBy().toString()));
@ -203,7 +206,7 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
}
@Override
public void importKmzFile(MultipartFile file, String workspaceId, String creator,String deviceSn) {
public void importKmzFile(MultipartFile file, String workspaceId, String creator,String deviceSn,Integer proId) {
Optional<WaylineFileDTO> waylineFileOpt = validKmzFile(file);
if (waylineFileOpt.isEmpty()) {
throw new RuntimeException("文件格式不正确。");
@ -230,6 +233,7 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
}else {
waylineFile.setFileNo(1);
}
waylineFile.setProId(proId);
this.saveWaylineFile(workspaceId, waylineFile);
} catch (IOException e) {
e.printStackTrace();
@ -244,6 +248,13 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
return waylineId;
}
@Override
public WaylineFileEntity getWaylineFileByWaylineId(Integer waylineId) {
return mapper.selectOne(
new LambdaQueryWrapper<WaylineFileEntity>()
.eq(WaylineFileEntity::getId, waylineId));
}
@Override
public PaginationData<GetWaylineListResponse> getWaylinesByParamNew(String workspaceId, GetWaylineListRequest param) {
Page<WaylineFileEntity> waylineFileEntityPage = new Page<>(param.getPage(), param.getPageSize());
@ -466,6 +477,7 @@ public class WaylineFileServiceImpl implements IWaylineFileService {
.favorited(file.getFavorited())
.sign(file.getSign())
.deviceSn(file.getDeviceSns().get(0))
.proId(file.getProId())
.build();
}

10
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java

@ -1,5 +1,6 @@
package org.dromara.sample.wayline.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -12,6 +13,7 @@ import org.dromara.common.sdk.cloudapi.device.OsdDockDrone;
import org.dromara.common.sdk.cloudapi.wayline.*;
import org.dromara.common.sdk.common.Pagination;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.exception.CloudSDKException;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.service.IDeviceRedisService;
@ -35,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.sql.SQLException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
@ -81,7 +84,7 @@ public class WaylineJobServiceImpl implements IWaylineJobService {
}
@Override
public Optional<WaylineJobDTO> createWaylineJob(CreateJobParam param, String workspaceId, String username, Date beginTime, Date endTime) {
public Optional<WaylineJobDTO> createWaylineJob(CreateJobParam param, String workspaceId, String username, Date beginTime, Date endTime,Integer proId) {
if (Objects.isNull(param)) {
return Optional.empty();
}
@ -103,6 +106,7 @@ public class WaylineJobServiceImpl implements IWaylineJobService {
.rthAltitude(param.getRthAltitude())
.mediaCount(0)
.breakPoint(param.getBreakPoint())
.proId(proId)
.build();
return insertWaylineJob(jobEntity);
@ -154,11 +158,13 @@ public class WaylineJobServiceImpl implements IWaylineJobService {
}
@Override
public PaginationData<WaylineJobDTO> getJobsByWorkspaceId(String workspaceId, long page, long pageSize) {
public PaginationData<WaylineJobDTO> getJobsByWorkspaceId(String workspaceId, long page, long pageSize,List<Integer> proIds,String name) {
Page<WaylineJobEntity> pageData = mapper.selectPage(
new Page<WaylineJobEntity>(page, pageSize),
new LambdaQueryWrapper<WaylineJobEntity>()
.eq(WaylineJobEntity::getWorkspaceId, workspaceId)
.like(WaylineJobEntity::getName, name).or().like(WaylineJobEntity::getWaylineName,name)
.in(ObjectUtil.isAllNotEmpty(proIds),WaylineJobEntity::getProId,proIds)
.orderByDesc(WaylineJobEntity::getId));
List<WaylineJobDTO> records = pageData.getRecords()
.stream()

1
dk-modules/sample/src/main/resources/mapper/AiCompareMapper.xml

@ -10,6 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="listMediaFile" resultType="org.dromara.sample.wayline.model.dto.AiCompareMediaFileDTO">
SELECT
ai.id as compareId,
mf.file_index,
mf.file_id,
mf.file_name,

8
dk-modules/sample/src/main/resources/mapper/DeviceFlightRecordsMapper.xml

@ -0,0 +1,8 @@
<?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="org.dromara.sample.manage.mapper.DeviceFlightRecordsMapper">
</mapper>

6
dk-modules/sample/src/main/resources/mapper/DeviceQrtzMapper.xml

@ -43,6 +43,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</if>
<if test="condition.proIds.size > 0">
AND wd.pro_id in
<foreach item="proId" collection="condition.proIds" open="(" separator="," close=")">
#{proId}
</foreach>
</if>
order by wdq.status asc, wdq.create_time desc
</select>
<select id="calendarList" resultType="java.util.Map"></select>

32
dk-modules/sample/src/main/resources/mapper/IDeviceProMapper.xml

@ -4,15 +4,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.sample.manage.mapper.IDeviceProMapper">
<resultMap id="listDeviceProEntityMap" type="org.dromara.sample.manage.model.entity.DeviceProEntity">
<result column="pro_id" property="id" jdbcType="VARCHAR"/>
<result column="pro_name" property="proName" jdbcType="VARCHAR"/>
<result column="bind_code" property="bindCode" jdbcType="VARCHAR"/>
<result column="bind_type" property="bindType" jdbcType="VARCHAR"/>
<result column="pro_id" property="id"/>
<result column="pro_name" property="proName"/>
<result column="bind_code" property="bindCode"/>
<result column="bind_type" property="bindType"/>
<result column="nick_name" property="nickName"/>
<result column="create_time" property="createTime"/>
<collection property="deviceProUserEntityList" ofType="org.dromara.sample.manage.model.entity.DeviceProUserEntity">
<result column="pro_user_id" property="id"/>
<result column="device_pro_id" property="deviceProId"/>
<result column="user_id" property="userId"/>
<result column="nick_name" property="nickName"/>
<result column="user_name" property="userName"/>
</collection>
<collection property="deviceEntityList" ofType="org.dromara.sample.manage.model.entity.DeviceEntity">
<result column="device_id" property="id"/>
@ -33,10 +35,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
dp.pro_name,
dp.bind_code,
dp.bind_type,
dpu.user_id pro_user_id,
dp.nick_name,
dp.create_time,
dpu.id pro_user_id,
dpu.device_pro_id,
dpu.user_id,
dpu.nick_name,
dpu.user_name,
d.id device_id,
d.device_sn,
d.device_name,
@ -52,17 +56,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN manage_device d ON dp.id = d.pro_id
LEFT JOIN manage_device_pro_user dpu ON dp.id = dpu.device_pro_id
<where>
<if test="condition.deviceSn != null and condition.deviceSn != ''">
and d.device_sn like concat(concat('%',#{condition.deviceSn}),'%')
<if test="condition.bind_code != null and condition.bind_code != ''">
and dp.bind_code like concat(concat('%',#{condition.bind_code}),'%')
</if>
<if test="condition.deviceName != null and condition.deviceName != ''">
and d.device_name like concat(concat('%',#{condition.deviceName}),'%')
</if>
<if test="condition.nickname != null and condition.nickname != ''">
and dpu.nickname like concat(concat('%',#{condition.nickname}),'%')
</if>
<if test="condition.userId != null and condition.userId != ''">
and dpu.user_id = #{condition.userId}
<if test="condition.pro_name != null and condition.pro_name != ''">
and dp.pro_name like concat(concat('%',#{condition.pro_name}),'%')
</if>
</where>
</select>

11
dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java

@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -56,6 +57,16 @@ public class AiLabelController extends BaseController {
return aiLabelService.allList();
}
/**
* 下拉框集合
*/
@GetMapping("/{postCode}/list")
public List<AiLabelVo> listPostCodeLabel(@PathVariable("postCode") String postCode) {
return aiLabelService.selectLabelByList(postCode);
}
/**
* 导出ai 识别类型列表

4
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysMenuController.java

@ -9,6 +9,7 @@ import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
@ -42,8 +43,9 @@ public class SysMenuController extends BaseController {
*
* @return 路由信息
*/
// @ApiEncrypt(response=true)
@GetMapping("/{platformType}/getRouters")
public R<List<RouterVo>> getRouters(@PathVariable String platformType) {
public R<List<RouterVo>> getRouters(@PathVariable String platformType) {
List<SysMenu> menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId(),platformType);
return R.ok(menuService.buildMenus(menus));
}

16
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysRoleController.java

@ -1,6 +1,7 @@
package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
@ -9,6 +10,8 @@ import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysRoleBo;
@ -226,5 +229,18 @@ public class SysRoleController extends BaseController {
selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo()));
return R.ok(selectVo);
}
/**
* 获取对应角色部门树列表
*
*/
@GetMapping(value = "/user/list")
public R<List<SysUser>> listRoleUser() {
String roleName = "dispose";
List<SysUser> userList = roleService.getUserIno(roleName);
return R.ok(userList);
}
}

10
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@ -64,6 +64,16 @@ public class SysUserController extends BaseController {
return userService.selectPageUserList(user, pageQuery);
}
/**
* 查询全部用户不分页
* @param user
* @return
*/
@GetMapping("/all/list")
public R<List<SysUserVo>> allList(SysUserBo user) {
return R.ok(userService.allList(user));
}
/**
* 导出用户列表
*/

99
dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysUserProVo.java

@ -0,0 +1,99 @@
package org.dromara.system.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.sensitive.annotation.Sensitive;
import org.dromara.common.sensitive.core.SensitiveStrategy;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.system.domain.SysUser;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 用户信息视图对象 sys_user
*
* @author Michelle.Chung
*/
@Data
public class SysUserProVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 租户ID
*/
private String tenantId;
/**
* 部门ID
*/
private Long deptId;
/**
* 用户账号
*/
private String userName;
/**
* 用户昵称
*/
private String nickName;
/**
* 用户类型sys_user系统用户
*/
private String userType;
/**
* 手机号码
*/
private String phonenumber;
/**
* 用户性别0男 1女 2未知
*/
private String sex;
/**
* 帐号状态0正常 1停用
*/
private String status;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
/**
* 部门名
*/
private String deptName;
/**
* 平台名称
*/
private String productName;
}

2
dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java

@ -309,7 +309,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
*/
@Override
public List<RemoteUserVo> selectListByIds(List<Long> userIds) {
List<SysUserVo> sysUserVos = userService.selectUserByIds(userIds, null);
List<SysUserVo> sysUserVos = userService.selectFlwByIds(userIds, null);
return MapstructUtils.convert(sysUserVos, RemoteUserVo.class);
}

5
dk-modules/system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java

@ -8,6 +8,7 @@ import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysRoleVo;
import java.util.List;
@ -59,4 +60,8 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRole, SysRoleVo> {
*/
List<SysRoleVo> selectRolesByUserId(Long userId);
@DataPermission({
@DataColumn(key = "deptName", value = "su.dept_id"),
})
List<SysUser> getUserIno(@Param("roleName") String roleName);
}

4
dk-modules/system/src/main/java/org/dromara/system/mapper/SysUserMapper.java

@ -9,6 +9,7 @@ import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo;
@ -91,4 +92,7 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
List<SysUserVo> selectFlwByIds(@Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
List<SysUserVo> allList(@Param("param") SysUserBo user);
}

2
dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelService.java

@ -74,4 +74,6 @@ public interface IAiLabelService {
List<AiLabel> queryListByLabel(List<Long> labelIds);
String getFlowCode(String labelCode);
List<AiLabelVo> selectLabelByList(String postCode);
}

4
dk-modules/system/src/main/java/org/dromara/system/service/ISysRoleService.java

@ -2,6 +2,8 @@ package org.dromara.system.service;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.vo.SysRoleVo;
@ -197,4 +199,6 @@ public interface ISysRoleService {
void cleanOnlineUserByRole(Long roleId);
List<SysUser> getUserIno(String roleName);
}

4
dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java

@ -271,4 +271,8 @@ public interface ISysUserService {
List<SysUserVo> selectUserByUserIds(List<Long> userIds);
List<SysUserVo> assignUserSelect(Long deptId);
List<SysUserVo> selectFlwByIds(List<Long> userIds, Long deptId);
List<SysUserVo> allList(SysUserBo user);
}

33
dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLabelServiceImpl.java

@ -1,5 +1,6 @@
package org.dromara.system.service.impl;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@ -9,6 +10,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo;
import org.dromara.system.domain.vo.AiLabelPostVo;
import org.dromara.system.domain.vo.SysPostVo;
import org.dromara.system.service.IAiLabelPostService;
import org.dromara.system.service.ISysPostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.system.domain.bo.AiLabelBo;
import org.dromara.system.domain.vo.AiLabelVo;
@ -20,6 +27,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* ai 识别类型Service业务层处理
@ -33,6 +41,12 @@ public class AiLabelServiceImpl implements IAiLabelService {
private final AiLabelMapper baseMapper;
@Autowired
private ISysPostService sysPostService;
@Autowired
private IAiLabelPostService aiLabelPostService;
/**
* 查询ai 识别类型
*
@ -148,4 +162,23 @@ public class AiLabelServiceImpl implements IAiLabelService {
public String getFlowCode(String labelCode) {
return this.baseMapper.selectOne(new LambdaQueryWrapper<AiLabel>().eq(AiLabel::getLabelEn, labelCode)).getFlowCode();
}
@Override
public List<AiLabelVo> selectLabelByList(String postCode) {
SysPostVo sysPostVo = sysPostService.selectLableByList(postCode,null);
if(sysPostVo != null){
List<AiLabelPostVo> postVoList = aiLabelPostService.queryListByLabel(sysPostVo.getPostId());
return postVoList.stream()
.map(aiLabel -> {
AiLabelVo aiLabelVo = new AiLabelVo();
aiLabelVo.setLabelId(aiLabel.getLabelId());
aiLabelVo.setLabelEn(aiLabel.getLabelEn());
aiLabelVo.setLabelCn(aiLabel.getLabelCn());
aiLabelVo.setAiName(aiLabel.getAiName());
return aiLabelVo;
})
.collect(Collectors.toList());
}
return ListUtil.empty();
}
}

2
dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@ -152,7 +152,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
@Override
public List<SysDeptVo> selectDeptByIds(List<Long> deptIds) {
return baseMapper.selectDeptList(new LambdaQueryWrapper<SysDept>()
.select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getLeader)
.select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getLeader,SysDept::getParentId)
.eq(SysDept::getStatus, UserConstants.DEPT_NORMAL)
.in(CollUtil.isNotEmpty(deptIds), SysDept::getDeptId, deptIds));
}

10
dk-modules/system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java

@ -22,10 +22,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.model.LoginUser;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysRoleDept;
import org.dromara.system.domain.SysRoleMenu;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.*;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.mapper.SysRoleDeptMapper;
@ -511,4 +508,9 @@ public class SysRoleServiceImpl implements ISysRoleService {
}
});
}
@Override
public List<SysUser> getUserIno(String roleName) {
return this.baseMapper.getUserIno(roleName);
}
}

13
dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@ -576,6 +576,19 @@ public class SysUserServiceImpl implements ISysUserService {
.in(ObjectUtil.isNotNull(departIdList), SysUser::getDeptId, departIdList));
}
@Override
public List<SysUserVo> selectFlwByIds(List<Long> userIds, Long deptId) {
return baseMapper.selectFlwByIds(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber).eq(SysUser::getStatus, UserConstants.USER_NORMAL)
.eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId)
.in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
}
@Override
public List<SysUserVo> allList(SysUserBo user) {
return baseMapper.allList(user);
}
/**
* 通过用户ID查询用户账户
*

21
dk-modules/system/src/main/resources/mapper/system/SysRoleMapper.xml

@ -56,4 +56,25 @@
WHERE r.del_flag = '0' and r.role_id = #{roleId}
</select>
<select id="getUserIno" resultType="org.dromara.system.domain.SysUser">
SELECT
su.*
FROM
sys_user su
WHERE
su.user_id IN (
SELECT
sur.user_id
FROM
sys_user_role sur
WHERE
sur.role_id IN (
SELECT
role_id
FROM
sys_role sr
WHERE
sr.role_key = #{roleName}))
</select>
</mapper>

33
dk-modules/system/src/main/resources/mapper/system/SysUserMapper.xml

@ -83,4 +83,37 @@
${ew.getCustomSqlSegment}
</select>
<select id="selectFlwByIds" resultMap="SysUserResult">
select
<if test="ew.getSqlSelect != null">
${ew.getSqlSelect}
</if>
<if test="ew.getSqlSelect == null">
u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.product_name
</if>
from sys_user u
${ew.getCustomSqlSegment}
</select>
<select id="allList" resultType="org.dromara.system.domain.vo.SysUserProVo">
select
u.user_id as userId, u.dept_id as deptId, u.nick_name as nickName, u.user_name as userName, u.email as email, u.phonenumber, u.sex,
u.status , u.create_by as createBy, u.create_time as createTime, u.remark,sd.dept_name deptName
from sys_user u left JOIN sys_dept sd on u.dept_id = sd.dept_id
<where>
u.del_flag = '0'
<if test="param.nickName != null and param.nickName != ''">
and u.nick_name like concat('%',#{param.nickName},'%')
</if>
<if test="param.userName != null and param.userName != ''">
and u.user_name like concat('%',#{param.userName},'%')
</if>
<if test="param.deptId != null and param.deptId != ''">
and u.dept_id = #{param.deptId}
</if>
</where>
</select>
</mapper>

5
dk-modules/workflow/pom.xml

@ -118,6 +118,11 @@
<artifactId>api-system</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-encrypt</artifactId>
</dependency>
</dependencies>
<build>

13
dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java

@ -1,5 +1,6 @@
package org.dromara.workflow.controller;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -50,6 +51,10 @@ public class FlwTaskController extends BaseController {
@PostMapping("/startWorkFlow")
public R<RemoteStartProcessReturn> startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) {
RemoteStartProcessReturn startProcessReturn = flwTaskService.startWorkFlow(startProcessBo);
//加签
flwTaskService.addSign(startProcessReturn.getProcessInstanceId());
return R.ok("提交成功", startProcessReturn);
}
@ -62,7 +67,13 @@ public class FlwTaskController extends BaseController {
@RepeatSubmit()
@PostMapping("/completeTask")
public R<Void> completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) {
return toAjax(flwTaskService.completeTask(completeTaskBo));
String instanceId = flwTaskService.completeTask(completeTaskBo);
if (ObjectUtil.isNotEmpty(instanceId)){
return toAjax(flwTaskService.addSign(Long.valueOf(instanceId)));
}
return toAjax(true);
}
/**

4
dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java

@ -7,6 +7,8 @@ import org.apache.ibatis.annotations.Param;
import org.dromara.workflow.domain.bo.FlowInstanceBo;
import org.dromara.workflow.domain.vo.FlowInstanceVo;
import java.util.List;
/**
* 实例信息Mapper接口
*
@ -24,4 +26,6 @@ public interface FlwInstanceMapper {
*/
Page<FlowInstanceVo> selectInstanceList(@Param("page") Page<FlowInstanceVo> page, @Param(Constants.WRAPPER) Wrapper<FlowInstanceBo> queryWrapper);
List<FlowInstanceVo> listInsByDefinition(@Param("definitionId") Long definitionId);
}

2
dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java

@ -57,4 +57,6 @@ public interface FlwTaskMapper {
*/
Page<FlowTaskVo> getTaskCopyByPage(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) QueryWrapper<FlowTaskBo> queryWrapper);
List<String> getPermissionFlag(@Param("definitionId") Long definitionId,
@Param("nodeCode") String nodeCode, @Param("nodeType") Integer nodeType);
}

2
dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java

@ -156,4 +156,6 @@ public interface IFlwInstanceService {
* @return 结果
*/
boolean processInvalid(FlowInvalidBo bo);
Boolean batchAddSign(Long definitionId);
}

5
dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java

@ -37,7 +37,7 @@ public interface IFlwTaskService {
* @param completeTaskBo 办理任务参数
* @return 结果
*/
boolean completeTask(CompleteTaskBo completeTaskBo);
String completeTask(CompleteTaskBo completeTaskBo);
/**
* 查询当前用户的待办任务
@ -223,4 +223,7 @@ public interface IFlwTaskService {
* @return 节点
*/
FlowNode getByNodeCode(String nodeCode, Long definitionId);
Boolean addSign(Long instanceId);
}

79
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java

@ -46,15 +46,19 @@ import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.FlowCancelBo;
import org.dromara.workflow.domain.bo.FlowInstanceBo;
import org.dromara.workflow.domain.bo.FlowInvalidBo;
import org.dromara.workflow.domain.bo.TaskOperationBo;
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
import org.dromara.workflow.domain.vo.FlowInstanceVo;
import org.dromara.workflow.domain.vo.FlowVariableVo;
import org.dromara.workflow.handler.FlowProcessEventHandler;
import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwInstanceMapper;
import org.dromara.workflow.mapper.FlwTaskMapper;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.BatchProcessorUtil;
import org.dromara.workflow.utils.MinioUntil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -78,12 +82,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
private final ChartService chartService;
private final TaskService taskService;
private final FlowHisTaskMapper flowHisTaskMapper;
private final FlwTaskMapper flwTaskMapper;
private final FlowInstanceMapper flowInstanceMapper;
private final FlowProcessEventHandler flowProcessEventHandler;
private final IFlwTaskService flwTaskService;
private final FlwInstanceMapper flwInstanceMapper;
private final FlwCategoryMapper flwCategoryMapper;
private final IFlwCommonService flwCommonService;
private final IFlwTaskAssigneeService flwTaskAssigneeService;
@DubboReference
private RemoteFileService remoteFileService;
@ -460,4 +466,77 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
throw new ServiceException(e.getMessage());
}
}
@Override
public Boolean batchAddSign(Long definitionId) {
try {
List<FlowInstanceVo> instanceList = flwInstanceMapper.listInsByDefinition(definitionId);
if (ObjectUtil.isEmpty(instanceList)) {
return true;
}
//根据实例id查询所有的可执行的任务
List<Long> insIdList = instanceList.stream().map(FlowInstanceVo::getId).distinct().toList();
List<FlowTask> flowTasks = flwTaskService.selectByInstIdList(insIdList);
//拿到任务之后进行批量加签
int startIndex = 0;
int batchSize = 1000;
boolean flag = BatchProcessorUtil.processBatches(flowTasks, batchSize, startIndex, batch -> {
batch.forEach(flowTask1 -> {
//判断是否有人员,进行加签
//获取当前任务的办理人
List<RemoteUserVo> currentTaskUser = flwTaskService.currentTaskAllUser(flowTask1.getId());
Instance ins = insService.getById(flowTask1.getInstanceId());
//根据配置的人员查询系统中的用户
String nodeCode = ins.getNodeCode();
Integer nodeType = ins.getNodeType();
List<String> permissionUser = flwTaskMapper.getPermissionFlag(definitionId,nodeCode,nodeType);
String first = permissionUser.getFirst();
List<RemoteUserVo> totalUser = new ArrayList<>();
if (ObjectUtil.isNotEmpty(first)){
String[] split = first.split("@@");
for (String handleFlag : split) {
if (!handleFlag.equals("${handler}")){
List<RemoteUserVo> remoteUserVos = flwTaskAssigneeService.fetchUsersByStorageId(handleFlag);
totalUser.addAll(remoteUserVos);
}
}
}
//比较差值
List<RemoteUserVo> different = totalUser.stream()
.filter(user -> currentTaskUser.stream().noneMatch(u -> u.getUserId().equals(user.getUserId())))
.toList();
List<String> userIds = different.stream()
.map(RemoteUserVo::getUserId)
.distinct()
.map(String::valueOf)
.toList();
//加签
if (ObjectUtil.isNotEmpty(userIds)){
TaskOperationBo taskOperationBo = new TaskOperationBo();
taskOperationBo.setUserIds(userIds);
taskOperationBo.setTaskId(flowTask1.getId());
flwTaskService.taskOperation(taskOperationBo,"addSignature");
}
});
});
return flag;
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
return false;
}
}
}

83
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -41,6 +42,7 @@ import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.MessageTypeEnum;
import org.dromara.workflow.common.enums.TaskAssigneeEnum;
import org.dromara.workflow.common.enums.TaskAssigneeType;
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.*;
@ -159,7 +161,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean completeTask(CompleteTaskBo completeTaskBo) {
public String completeTask(CompleteTaskBo completeTaskBo) {
try {
// 获取任务ID并查询对应的流程任务和实例信息
Long taskId = completeTaskBo.getTaskId();
@ -217,7 +219,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
//设置下一环节处理人
setNextHandler(ins.getId());
return true;
return String.valueOf(ins.getId());
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new ServiceException(e.getMessage());
@ -713,9 +715,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Task task = taskService.getById(taskId);
FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId());
if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) {
if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException(task.getNodeName() + "不是会签节点!");
}
// if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
// throw new ServiceException(task.getNodeName() + "不是会签节点!");
// }
}
// 设置任务状态并执行对应的任务操作
switch (taskOperation) {
@ -864,7 +866,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
completeTaskBo.setTaskId(taskId);
completeTaskBo.setMessageType(List.of(MessageTypeEnum.SYSTEM_MESSAGE.getCode()));
IFlwTaskService service = applicationContext.getBean(IFlwTaskService.class);
return service.completeTask(completeTaskBo);
service.completeTask(completeTaskBo);
return true;
}
/**
@ -880,4 +883,72 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
.eq(FlowNode::getDefinitionId, definitionId));
}
@Override
public Boolean addSign(Long instanceId) {
try {
List<FlowTask> flowTasks = selectByInstId(instanceId);
FlowTask flowTask1 = flowTasks.getFirst();
//判断是否有人员,进行加签
//获取当前任务的办理人
List<RemoteUserVo> currentTaskUser = currentTaskAllUser(flowTask1.getId());
FlowTask flowTask = flowTaskMapper.selectById(flowTask1.getId());
if (ObjectUtil.isNull(flowTask)) {
throw new ServiceException("流程任务不存在或任务已审批!");
}
Instance ins = insService.getById(flowTask.getInstanceId());
//根据配置的人员查询系统中的用户
Long definitionId = ins.getDefinitionId();
String nodeCode = ins.getNodeCode();
Integer nodeType = ins.getNodeType();
List<String> permissionUser = this.flwTaskMapper.getPermissionFlag(definitionId,nodeCode,nodeType);
String first = permissionUser.getFirst();
List<RemoteUserVo> totalUser = new ArrayList<>();
if (ObjectUtil.isNotEmpty(first)){
String[] split = first.split("@@");
for (String handleFlag : split) {
if (!handleFlag.equals("${handler}")){
List<RemoteUserVo> remoteUserVos = flwTaskAssigneeService.fetchUsersByStorageId(handleFlag);
totalUser.addAll(remoteUserVos);
}
}
}
//比较差值
List<RemoteUserVo> different = totalUser.stream()
.filter(user -> currentTaskUser.stream().noneMatch(u -> u.getUserId().equals(user.getUserId())))
.toList();
List<String> userIds = different.stream()
.map(RemoteUserVo::getUserId)
.distinct()
.map(String::valueOf)
.toList();
//加签
if (ObjectUtil.isNotEmpty(userIds)){
TaskOperationBo taskOperationBo = new TaskOperationBo();
taskOperationBo.setUserIds(userIds);
taskOperationBo.setTaskId(flowTask1.getId());
IFlwTaskService flwTaskService = applicationContext.getBean(IFlwTaskService.class);
flwTaskService.taskOperation(taskOperationBo,"addSignature");
}
return true;
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
return false;
}
}
}

7
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java

@ -136,7 +136,7 @@ public class WorkflowServiceImpl implements WorkflowService {
*/
@Override
public boolean completeTask(RemoteCompleteTask completeTask) {
return flwTaskService.completeTask(BeanUtil.toBean(completeTask, CompleteTaskBo.class));
return ObjectUtil.isNotEmpty(flwTaskService.completeTask(BeanUtil.toBean(completeTask, CompleteTaskBo.class)));
}
/**
@ -160,7 +160,10 @@ public class WorkflowServiceImpl implements WorkflowService {
public Boolean startWorkFlowBatch(List<RemoteStartProcess> startProcess) {
try {
startProcess.forEach(startProcessBo -> {
flwTaskService.startWorkFlow(BeanUtil.toBean(startProcessBo, StartProcessBo.class));
RemoteStartProcessReturn startProcessReturn = flwTaskService.startWorkFlow(BeanUtil.toBean(startProcessBo, StartProcessBo.class));
//加签
flwTaskService.addSign(startProcessReturn.getProcessInstanceId());
});
} catch (Exception e) {
return false;

20
dk-modules/workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml

@ -33,4 +33,24 @@
${ew.getCustomSqlSegment}
</select>
<select id="listInsByDefinition" resultMap="FlowInstanceResult">
select fi.id,
fi.create_time,
fi.update_time,
fi.tenant_id,
fi.del_flag,
fi.definition_id,
fi.business_id,
fi.node_type,
fi.node_code,
fi.node_name,
fi.variable,
fi.flow_status,
fi.activity_status,
fi.create_by,
fi.ext
from flow_instance fi
where fi.definition_id = #{definitionId}
</select>
</mapper>

5
dk-modules/workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml

@ -112,4 +112,9 @@
) t
${ew.getCustomSqlSegment}
</select>
<select id="getPermissionFlag" resultType="java.lang.String">
select fn.permission_flag from flow_node fn where fn.definition_id = #{definitionId} and fn.node_type = #{nodeType} and fn.node_code = #{nodeCode} and fn.del_flag = '0'
</select>
</mapper>

4
dk-visual/nacos/src/main/resources/application.properties

@ -40,9 +40,9 @@ spring.sql.init.platform=mysql
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/dk_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
db.url.0=jdbc:mysql://114.235.183.147:3306/dk_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
db.user.0=root
db.password.0=123456
db.password.0=dkcy@yf
### the maximum retry times for push
nacos.config.push.maxRetryTime=50

Loading…
Cancel
Save