Browse Source

Merge remote-tracking branch 'origin/dev' into dev

nantong
杨威 1 month ago
parent
commit
61988570fe
  1. 3
      dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java
  2. 5
      dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java
  3. 15
      dk-common/common-excel/pom.xml
  4. 5
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java
  5. 2
      dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java
  6. 4
      dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java
  7. 139
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java
  8. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java
  9. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java
  10. 43
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java
  11. 17
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java
  12. 44
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java
  13. 109
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java
  14. 20
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
  15. 11
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java
  16. 10
      dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java
  17. 7
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java
  18. 5
      dk-modules/system/pom.xml
  19. 79
      dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java
  20. 113
      dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java
  21. 131
      dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java
  22. 58
      dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java
  23. 125
      dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java
  24. 239
      dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java
  25. 227
      dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java
  26. 25
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java
  27. 63
      dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java
  28. 76
      dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java
  29. 67
      dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java
  30. 71
      dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java
  31. 2
      dk-modules/system/src/main/java/org/dromara/system/domain/SysUploadFile.java
  32. 68
      dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiBo.java
  33. 84
      dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiErrorBo.java
  34. 73
      dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekBo.java
  35. 78
      dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekOssBo.java
  36. 93
      dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiErrorVo.java
  37. 77
      dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiVo.java
  38. 86
      dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekOssVo.java
  39. 86
      dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekVo.java
  40. 1
      dk-modules/system/src/main/java/org/dromara/system/dubbo/RemotePostServiceImpl.java
  41. 177
      dk-modules/system/src/main/java/org/dromara/system/listener/DjiApiErrorImportListener.java
  42. 15
      dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiErrorMapper.java
  43. 15
      dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiMapper.java
  44. 15
      dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekMapper.java
  45. 15
      dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekOssMapper.java
  46. 72
      dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiErrorService.java
  47. 69
      dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiService.java
  48. 69
      dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekOssService.java
  49. 69
      dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekService.java
  50. 146
      dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiErrorServiceImpl.java
  51. 133
      dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiServiceImpl.java
  52. 135
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekOssServiceImpl.java
  53. 135
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekServiceImpl.java
  54. 179
      dk-modules/system/src/main/java/org/dromara/system/utils/OssTianyiClientUtils.java
  55. 66
      dk-modules/system/src/main/java/org/dromara/system/utils/WeekNoUtil.java
  56. 7
      dk-modules/system/src/main/resources/mapper/djidev/DjiApiErrorMapper.xml
  57. 7
      dk-modules/system/src/main/resources/mapper/djidev/DjiApiMapper.xml
  58. 7
      dk-modules/system/src/main/resources/mapper/system/SiteWeekMapper.xml
  59. 7
      dk-modules/system/src/main/resources/mapper/system/SiteWeekOssMapper.xml
  60. 2
      pom.xml

3
dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java

@ -60,4 +60,7 @@ public interface DictService {
* @return dictValue为keydictLabel为值组成的Map
*/
Map<String, String> getAllDictByDictType(String dictType);
//获取字典下所有的字典值与标签 (key: 字典标签, value:字典键值)
Map<String, String> getAllDictMapByDictType(String dictType);
}

5
dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java

@ -86,4 +86,9 @@ public class DictServiceImpl implements DictService {
return StreamUtils.toMap(list, RemoteDictDataVo::getDictValue, RemoteDictDataVo::getDictLabel);
}
@Override
public Map<String, String> getAllDictMapByDictType(String dictType) {
List<RemoteDictDataVo> list = remoteDictService.selectDictDataByType(dictType);
return StreamUtils.toMap(list, RemoteDictDataVo::getDictLabel, RemoteDictDataVo::getDictValue);
}
}

15
dk-common/common-excel/pom.xml

@ -25,6 +25,21 @@
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<!-- easyexcel版本4.0.3时前台导出报错,配合以下包测试依旧异常-->
<!-- <dependency>-->
<!-- <groupId>commons-io</groupId>-->
<!-- <artifactId>commons-io</artifactId>-->
<!-- <version>2.12.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-compress</artifactId>-->
<!-- <version>1.21</version>-->
<!-- </dependency>-->
</dependencies>
</project>

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

@ -1,7 +1,9 @@
package org.dromara.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
@ -421,6 +423,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
if (ObjectUtil.isEmpty(postVoList)) {
return ListUtil.empty();
@ -449,6 +452,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<StatObj> result = new ArrayList<>();
@ -503,6 +507,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<String> monthList = getLastSixMonths();

2
dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java

@ -39,7 +39,7 @@ public class TakeoffToPointParam {
@Range(min = 2, max = 1500)
@NotNull
private Double rthAltitude;
private Integer rthAltitude;
@NotNull
private RcLostActionEnum rcLostAction;

4
dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java

@ -196,9 +196,9 @@ public class ControlServiceImpl implements IControlService {
waylineJobEntity.setBeginTime(new Date());
waylineJobEntity.setStatus(WaylineJobStatusEnum.PENDING.getVal());
waylineJobEntity.setOutOfControlAction(OutOfControlActionEnum.RETURN_TO_HOME.getAction());
waylineJobEntity.setRthAltitude(Integer.parseInt(param.getRthAltitude().toString()));
waylineJobEntity.setRthAltitude(param.getRthAltitude());
waylineJobEntity.setMediaCount(0);
waylineJobEntity.setJobType(WaylineJobTypeEnum.PEOPLE_TASK.getType());
waylineJobEntity.setJobType(WaylineJobTypeEnum.INSTRUCT.getType());
TopicServicesResponse<ServicesReplyData> response = abstractControlService.takeoffToPoint(
SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class));
ServicesReplyData reply = response.getData();

139
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java

@ -1,6 +1,9 @@
package org.dromara.sample.manage.controller;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.seata.common.util.StringUtils;
@ -9,6 +12,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.implementation.bytecode.Throw;
import org.apache.commons.collections.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
@ -28,17 +32,24 @@ import org.dromara.common.sdk.mqtt.property.PropertySetPublish;
import org.dromara.common.sdk.mqtt.services.ServicesPublish;
import org.dromara.common.sdk.mqtt.services.ServicesReplyReceiver;
import org.dromara.common.sdk.mqtt.services.TopicServicesRequest;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.sample.common.util.Md5Utils;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.mapper.IDeviceStreamMapper;
import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceStreamEntity;
import org.dromara.sample.manage.service.IDeviceStreamService;
import org.dromara.sample.media.mapper.IFileMapper;
import org.dromara.system.api.RemoteConfigService;
import org.json.JSONObject;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;
import static org.apache.commons.compress.utils.ArchiveUtils.sanitize;
import static org.dromara.common.sdk.mqtt.MqttGatewayPublish.DEFAULT_RETRY_COUNT;
@ -69,6 +80,11 @@ public class MegaphoneController {
@DubboReference
private RemoteConfigService remoteConfigService;
@Resource
IDeviceStreamMapper deviceStreamMapper;
@Resource
private RemoteSystemFeign remoteSystemFeign;
/**
* 喊话器-开始播放文档对应遥控器的录音广播模式
* Get the topology list of all online devices in one workspace.
@ -247,6 +263,7 @@ public class MegaphoneController {
*/
@PostMapping("/{workspace_id}/getStreamIp")
@Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。")
@Transactional
public HttpResultResponse getStreamIp(@PathVariable("workspace_id") String workspaceId,
@RequestBody Map<String,Object>objectMap
) {
@ -254,18 +271,91 @@ public class MegaphoneController {
//发送mqtt
String s = remoteConfigService.selectStreamIp();
DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap);
if (StringUtils.isNotEmpty(param.getModel())){
String[] split = param.getModel().split(",");
for (String type : split){
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
List<DeviceStreamEntity> deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl()));
List<String> types = deviceStreamEntities.stream()
.map(DeviceStreamEntity::getStreamType)
.collect(Collectors.toList());
if (param.getOpen() == 1){
// deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl()));
if (StringUtils.isNotEmpty(param.getModel())){
String[] split = param.getModel().split(",");
if (CollectionUtils.isNotEmpty(types) && split.length > types.size()){
//加数据
for (String type : split){
if (!types.contains(type)){
DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity();
deviceStreamEntity.setStreamType(type);
deviceStreamEntity.setCreateTime(new Date());
deviceStreamEntity.setUpdateTime(new Date());
deviceStreamEntity.setRtmpUrl(param.getRtmpUrl());
deviceStreamMapper.insert(deviceStreamEntity);
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}else if (CollectionUtils.isNotEmpty(types) && split.length < types.size()){
//删数据
for (String type : types){
List<String> list1 = Arrays.asList(split);
if (!list1.contains(type)){
deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl())
.eq("stream_type", type));
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(2);
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}else {
for (String type : split){
DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity();
deviceStreamEntity.setStreamType(type);
deviceStreamEntity.setCreateTime(new Date());
deviceStreamEntity.setUpdateTime(new Date());
deviceStreamEntity.setRtmpUrl(param.getRtmpUrl());
deviceStreamMapper.insert(deviceStreamEntity);
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}
}
if (param.getOpen() == 2){
if (CollectionUtils.isNotEmpty(deviceStreamEntities)){
for (DeviceStreamEntity deviceStreamEntity: deviceStreamEntities){
deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", deviceStreamEntity.getRtmpUrl())
.eq("stream_type", deviceStreamEntity.getStreamType()));
List<String> list = new ArrayList<>();
list.add(deviceStreamEntity.getStreamType());
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}
return HttpResultResponse.success();
@ -296,6 +386,15 @@ public class MegaphoneController {
return HttpResultResponse.success(megaphoneDTO);
}
@GetMapping("/getStreamType")
@Operation(summary = "获取开启的算法类型。", description = "获取开启的算法类型。")
public HttpResultResponse<List<DeviceStreamEntity>> getStreamType(@RequestParam String rtmpUrl
) {
List<DeviceStreamEntity> deviceStreamEntities = deviceStreamMapper.selectList(new LambdaQueryWrapper<DeviceStreamEntity>().eq(DeviceStreamEntity::getRtmpUrl, rtmpUrl));
return HttpResultResponse.success(deviceStreamEntities);
}
/**
* 获取媒体流ip
@ -417,4 +516,20 @@ public class MegaphoneController {
// }
@GetMapping("/streams")
@Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。")
@Transactional
public HttpResultResponse<List<String>> streams (@RequestParam String deviceSn
) {
List<String> list = remoteSystemFeign.selectStreamType(deviceSn);
List<String> list1 = new ArrayList<>();
if (CollectionUtils.isNotEmpty(list)){
for (String s : list){
String[] split = s.split(",");
list1.add(split[2]);
}
}
return HttpResultResponse.success(list1);
}
}

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java

@ -91,4 +91,6 @@ public class PlayTextController {
}
}

15
dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java

@ -0,0 +1,15 @@
package org.dromara.sample.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.dromara.sample.manage.model.entity.DeviceStreamEntity;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
/**
*
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public interface IDeviceStreamMapper extends BaseMapper<DeviceStreamEntity> {
}

43
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java

@ -0,0 +1,43 @@
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.io.Serializable;
import java.util.Date;
/**
* The entity class of the device
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "manage_device_stream")
public class DeviceStreamEntity implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "rtmp_url")
private String rtmpUrl;
@TableField(value = "stream_type")
private String streamType;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

17
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java

@ -0,0 +1,17 @@
package org.dromara.sample.manage.service;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
import java.util.Map;
/**
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public interface IDeviceStreamService {
}

44
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java

@ -0,0 +1,44 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.Pagination;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.mapper.IPlayTextMapper;
import org.dromara.sample.manage.model.dto.StreamTypeDTO;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
import org.dromara.sample.manage.service.IDeviceStreamService;
import org.dromara.sample.manage.service.IPlayTextService;
import org.dromara.system.api.RemoteConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
/**
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Service
@Slf4j
@Transactional
public class DeviceStreamServiceImpl implements IDeviceStreamService {
}

109
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java

@ -1,23 +1,34 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.convert.Convert;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.dromara.common.rocketmq.producer.MessageProducerUtil;
import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum;
import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.livestream.*;
import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService;
import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.SDKManager;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.services.ServicesReplyData;
import org.dromara.common.sdk.mqtt.services.TopicServicesResponse;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.service.*;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -44,6 +55,21 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Autowired
private AbstractLivestreamService abstractLivestreamService;
@Resource
private MqttGatewayPublish gatewayPublish;
@Autowired
private IPlayTextService playTextService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IWaylineJobService waylineJobService;
@Resource
private RemoteSystemFeign remoteSystemFeign;
@Override
public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) {
@ -68,26 +94,23 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Override
public HttpResultResponse liveStart(LiveTypeDTO liveParam) {
// Check if this lens is available live.
HttpResultResponse<DeviceDTO> responseResult = this.checkBeforeLive(liveParam.getVideoId());
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult;
}
Boolean flag = deviceRedisService.checkDeviceVideo(liveParam.getVideoId().getDroneSn());
ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType());
url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId());
if (!flag) {
TopicServicesResponse<ServicesReplyData<String>> response = abstractLivestreamService.liveStartPush(
SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()),
new LiveStartPushRequest()
.setUrl(url)
.setUrlType(liveParam.getUrlType())
.setVideoId(liveParam.getVideoId())
.setVideoQuality(liveParam.getVideoQuality()));
if (!response.getData().getResult().isSuccess()) {
TopicServicesResponse<ServicesReplyData<String>> response = abstractLivestreamService.liveStartPush(
SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()),
new LiveStartPushRequest()
.setUrl(url)
.setUrlType(liveParam.getUrlType())
.setVideoId(liveParam.getVideoId())
.setVideoQuality(liveParam.getVideoQuality()));
if (!response.getData().getResult().isSuccess()) {
if(response.getData().getResult().getCode() != 513003){
return HttpResultResponse.error(response.getData().getResult());
}
}
@ -116,7 +139,42 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
default:
return HttpResultResponse.error(LiveErrorCodeEnum.URL_TYPE_NOT_SUPPORTED);
}
DeviceEntity deviceBySn = deviceService.getDeviceByChildSn(liveParam.getVideoId().getDroneSn());
if(deviceBySn != null){
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn());
Map<String,Object> reqMap = new HashMap<>();
if(runningWaylineJob.isPresent()) {
//开启ai推流
List<String> deviceSn = remoteSystemFeign.selectStreamType(deviceBySn.getDeviceSn());
if (CollectionUtils.isNotEmpty(deviceSn)){
ILivestreamUrl iLivestreamUrl = LiveStreamProperty.get(UrlTypeEnum.RTMP);
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId);
reqMap.put("jobId",waylineJobDTO.get().getJobId());
reqMap.put("jobName",waylineJobDTO.get().getJobName());
reqMap.put("deviceSn",deviceBySn.getDeviceSn());
reqMap.put("videoId",liveParam.getVideoId().getDroneSn().toString()+"-"+liveParam.getVideoId().getPayloadIndex().toString());
reqMap.put("url",iLivestreamUrl.toString());
playTextService.streamType(reqMap);
for (String s : deviceSn){
String[] split = s.split(",");
List<String> list = new ArrayList<>();
list.add(split[2]);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl("http://114.235.183.163");
disobeyDTO.setOpen(1);
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(liveParam.getVideoId().getDroneSn().toString()+"-"+liveParam.getVideoId().getPayloadIndex().toString());
gatewayPublish.publish("task/image/disobey/smoke",new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}
}
// MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",liveParam.getVideoId().getDroneSn(),liveParam.getVideoId().toString());
return HttpResultResponse.success(live);
}
@ -126,10 +184,25 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult;
}
TopicServicesResponse<ServicesReplyData> response = abstractLivestreamService.liveStopPush(
SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), new LiveStopPushRequest()
.setVideoId(videoId));
// //关闭ai推流
// List<String> deviceSn = remoteSystemFeign.selectStreamType(responseResult.getData().getDeviceSn());
// if (CollectionUtils.isNotEmpty(deviceSn)){
// for (String s : deviceSn){
// List<String> list = new ArrayList<>();
// list.add(s);
// DisobeyDTO disobeyDTO = new DisobeyDTO();
// disobeyDTO.setUrl(s);
// disobeyDTO.setOpen(2);
// disobeyDTO.setType(list);
// disobeyDTO.setRtmpUrl(videoId.toString());
// gatewayPublish.publish("task/image/disobey/smoke",new CommonTopicRequest<>()
// .setData(Objects.requireNonNull(disobeyDTO)),1);
// }
// }
if (!response.getData().getResult().isSuccess()) {
return HttpResultResponse.error(response.getData().getResult());
}

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

@ -181,15 +181,23 @@ public class SDKDeviceService extends AbstractDeviceService {
@Override
public void dockLiveStatusUpdate(TopicStateRequest<DockLiveStatus> request, MessageHeaders headers){
Optional<DeviceDTO> dockOnline = deviceRedisService.getDeviceOnline(request.getGateway());
/*Optional<DeviceDTO> dockOnline = deviceRedisService.getDeviceOnline(request.getGateway());
Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(dockOnline.get().getChildDeviceSn());
Optional<OsdDock> deviceOsd = deviceRedisService.getDeviceOsd(dockOnline.get().getDeviceSn(), OsdDock.class);
if(deviceOsd.get().getModeCode().getCode() != 4){
return;
}
if(!RedisOpsUtils.checkExist("video"+deviceOnline.get().getDeviceSn())){
return;
}
RedisOpsUtils.set("video"+deviceOnline.get().getDeviceSn(),60);
if(deviceOnline.isEmpty()){
return;
}
if(request.getData().getLiveStatus().size() == 0 ){
String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice();
deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn());
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString());
}
@ -197,10 +205,10 @@ public class SDKDeviceService extends AbstractDeviceService {
item.getVideoId().getDroneSn().equals(dockOnline.get().getChildDeviceSn()) && item.getStatus() == true).collect(Collectors.toList());
if(dockLiveStatusDataList.size() == 0){
String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice();
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString());
}
}*/
}
@Override
@ -221,11 +229,11 @@ public class SDKDeviceService extends AbstractDeviceService {
}
DeviceDTO device = deviceOpt.get();
String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice();
/*String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice();
if(!deviceRedisService.checkDeviceVideo(device.getDeviceSn())){
VideoId videoId = new VideoId(device.getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",device.getDeviceSn(),videoId.toString());
}
}*/
deviceRedisService.setDeviceOnline(device);
deviceRedisService.setDeviceOsd(from, request.getData());
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData());

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

@ -3,6 +3,7 @@ package org.dromara.sample.media.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.OsdDock;
import org.dromara.common.sdk.cloudapi.media.*;
import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService;
import org.dromara.common.sdk.mqtt.MqttReply;
@ -113,9 +114,17 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
String jobId = callback.getFile().getExt().getFlightId();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway());
if(deviceRedisService.getDeviceOsd(request.getGateway(), OsdDock.class).get().getModeCode().getCode() == 4){
DeviceDTO device = deviceOpt.get();
boolean isSave = parseMediaFile(callback, device);
if (!isSave) {
log.error("将文件保存到数据库失败,请手动检查数据。");
return null;
}
return new TopicEventsResponse<MqttReply>().setData(MqttReply.success());
}
MediaFileCountDTO mediaFileCount = mediaRedisService.getMediaCount(request.getGateway(), jobId);
List<DeviceQrtzFileEntity> deviceQrtzFileEntities = deviceQrtzFileMapper.selectList(new LambdaQueryWrapper<DeviceQrtzFileEntity>().eq(DeviceQrtzFileEntity::getDeviceSn, request.getGateway()).eq(DeviceQrtzFileEntity::getStatus, DeviceQrtzConstants.QRTZ_FILE_STATUS_2).eq(DeviceQrtzFileEntity::getWaylineId, mediaFileCount.getFileId()));
// duplicate data
if (deviceOpt.isEmpty()
|| (Objects.nonNull(mediaFileCount) && request.getBid().equals(mediaFileCount.getBid())

10
dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java

@ -72,14 +72,8 @@ public class RocketMqConsum implements RocketMQListener<MessageExt> {
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId);
reqMap.put("jobId",waylineJobDTO.get().getJobId());
reqMap.put("jobName",waylineJobDTO.get().getJobName());
reqMap.put("deviceSn",videoId.getDroneSn());
playTextService.streamType(reqMap);
}
liveStreamService.liveStop(videoId);
HttpResultResponse httpResultResponse = liveStreamService.liveStart(liveTypeDTO);
if (httpResultResponse.getCode() == 0 || httpResultResponse.getCode() == 513012 || httpResultResponse.getCode() == 513003){
reqMap.put("deviceSn:",videoId.getDroneSn());
// playTextService.streamType(reqMap);
}
deviceRedisService.setDeviceVideo(videoId.getDroneSn(),videoId);
}
}

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

@ -15,6 +15,7 @@ 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.enums.WaylineTaskStatusEnum;
import org.dromara.sample.wayline.model.param.CreateJobParam;
import org.dromara.sample.wayline.model.param.UpdateJobParam;
import org.dromara.sample.wayline.service.IFlightTaskService;
@ -120,6 +121,12 @@ public class WaylineJobController {
return HttpResultResponse.success();
}
public static void main(String[] args) {
WaylineTaskStatusEnum pause = WaylineTaskStatusEnum.RESUME;
System.out.println(pause.getVal());
}
@GetMapping("/{workspace_id}/getJobFileUrlByDeviceSn")
@Operation(summary = "根据设备查询飞行任务。", description = "根据设备查询飞行任务。")

5
dk-modules/system/pom.xml

@ -93,6 +93,11 @@
<artifactId>common-encrypt</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-oss</artifactId>
</dependency>
<!-- RuoYi Api System -->
<dependency>
<groupId>org.dromara</groupId>

79
dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java

@ -0,0 +1,79 @@
package org.dromara.system.config;
import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Minio 配置信息
*
* @author ruoyi
*/
@Configuration
@ConfigurationProperties(prefix = "osstianyi")
public class OssTianyiConfig
{
private String endPoint;
private String accessKey;
private String secretKey;
private String bucketName;
public String getEndPoint() {
return endPoint;
}
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
public String getAccessKey()
{
return accessKey;
}
public void setAccessKey(String accessKey)
{
this.accessKey = accessKey;
}
public String getSecretKey()
{
return secretKey;
}
public void setSecretKey(String secretKey)
{
this.secretKey = secretKey;
}
public String getBucketName()
{
return bucketName;
}
public void setBucketName(String bucketName)
{
this.bucketName = bucketName;
}
@Override
public String toString() {
return "OssTianyiConfig{" +
"endPoint='" + endPoint + '\'' +
", accessKey='" + accessKey + '\'' +
", secretKey='" + secretKey + '\'' +
", bucketName='" + bucketName + '\'' +
'}';
}
@Bean
public MinioClient getMinioClient()
{
// System.out.println("OssTianyiConfig");
// System.out.println("OssTianyiConfig" + endPoint);
System.out.println(toString());
return MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();
}
}

113
dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java

@ -0,0 +1,113 @@
package org.dromara.system.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.DjiApiVo;
import org.dromara.system.domain.bo.DjiApiBo;
import org.dromara.system.service.IDjiApiService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 大疆开发
* 前端访问路由地址为:/djidev/djiApi
*
* @author szs
* @date 2025-05-14
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/djiApi")
public class DjiApiController extends BaseController {
private final IDjiApiService djiApiService;
/**
* 查询大疆开发列表
*/
@SaCheckPermission("djidev:djiApi:list")
@GetMapping("/list")
public TableDataInfo<DjiApiVo> list(DjiApiBo bo, PageQuery pageQuery) {
return djiApiService.queryPageList(bo, pageQuery);
}
/**
* 导出大疆开发列表
*/
@SaCheckPermission("djidev:djiApi:export")
@Log(title = "大疆开发", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DjiApiBo bo, HttpServletResponse response) {
List<DjiApiVo> list = djiApiService.queryList(bo);
ExcelUtil.exportExcel(list, "大疆开发", DjiApiVo.class, response);
}
/**
* 获取大疆开发详细信息
*
* @param id 主键
*/
@SaCheckPermission("djidev:djiApi:query")
@GetMapping("/{id}")
public R<DjiApiVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(djiApiService.queryById(id));
}
/**
* 新增大疆开发
*/
@SaCheckPermission("djidev:djiApi:add")
@Log(title = "大疆开发", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DjiApiBo bo) {
//跟新版本次数
if(null == bo.getVersionCount()){
DjiApiBo bo1 = new DjiApiBo();
bo1.setDjiApiType(bo.getDjiApiType());
List<DjiApiVo> djiApiVos = djiApiService.queryList(bo1);
bo.setVersionCount(djiApiVos.size() +1);
}
return toAjax(djiApiService.insertByBo(bo));
}
/**
* 修改大疆开发
*/
@SaCheckPermission("djidev:djiApi:edit")
@Log(title = "大疆开发", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DjiApiBo bo) {
return toAjax(djiApiService.updateByBo(bo));
}
/**
* 删除大疆开发
*
* @param ids 主键串
*/
@SaCheckPermission("djidev:djiApi:remove")
@Log(title = "大疆开发", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(djiApiService.deleteWithValidByIds(List.of(ids), true));
}
}

131
dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java

@ -0,0 +1,131 @@
package org.dromara.system.controller;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.system.domain.vo.SysUserImportVo;
import org.dromara.system.listener.DjiApiErrorImportListener;
import org.dromara.system.listener.SysUserImportListener;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.DjiApiErrorVo;
import org.dromara.system.domain.bo.DjiApiErrorBo;
import org.dromara.system.service.IDjiApiErrorService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 大疆开发-错误码
* 前端访问路由地址为:/djidev/djiApiError
*
* @author szs
* @date 2025-05-14
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/djiApiError")
public class DjiApiErrorController extends BaseController {
private final IDjiApiErrorService djiApiErrorService;
/**
* 查询大疆开发-错误码列表
*/
@SaCheckPermission("djidev:djiApiError:list")
@GetMapping("/list")
public TableDataInfo<DjiApiErrorVo> list(DjiApiErrorBo bo, PageQuery pageQuery) {
return djiApiErrorService.queryPageList(bo, pageQuery);
}
/**
* 导出大疆开发-错误码列表
*/
@SaCheckPermission("djidev:djiApiError:export")
@Log(title = "大疆开发-错误码", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DjiApiErrorBo bo, HttpServletResponse response) {
List<DjiApiErrorVo> list = djiApiErrorService.queryList(bo);
ExcelUtil.exportExcel(list, "大疆开发-错误码", DjiApiErrorVo.class, response);
}
@Log(title = "大疆开发-错误码管理", businessType = BusinessType.IMPORT)
@SaCheckPermission("djidev:djiApiError:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
ExcelResult<DjiApiErrorVo> result = ExcelUtil.importExcel(file.getInputStream(), DjiApiErrorVo.class, new DjiApiErrorImportListener(updateSupport));
return R.ok(result.getAnalysis());
}
/**
* 获取导入模板
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "大疆开发-错误码数据", DjiApiErrorVo.class, response);
}
/**
* 获取大疆开发-错误码详细信息
*
* @param id 主键
*/
@SaCheckPermission("djidev:djiApiError:query")
@GetMapping("/{id}")
public R<DjiApiErrorVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(djiApiErrorService.queryById(id));
}
/**
* 新增大疆开发-错误码
*/
@SaCheckPermission("djidev:djiApiError:add")
@Log(title = "大疆开发-错误码", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DjiApiErrorBo bo) {
return toAjax(djiApiErrorService.insertByBo(bo));
}
/**
* 修改大疆开发-错误码
*/
@SaCheckPermission("djidev:djiApiError:edit")
@Log(title = "大疆开发-错误码", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DjiApiErrorBo bo) {
return toAjax(djiApiErrorService.updateByBo(bo));
}
/**
* 删除大疆开发-错误码
*
* @param ids 主键串
*/
@SaCheckPermission("djidev:djiApiError:remove")
@Log(title = "大疆开发-错误码", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(djiApiErrorService.deleteWithValidByIds(List.of(ids), true));
}
}

58
dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java

@ -0,0 +1,58 @@
package org.dromara.system.controller.ossTianyi;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.SysUploadFile;
import org.dromara.system.utils.OssTianyiClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
/**
* 系统上传文件Controller
*
* @author tom
* @date 2024-12-21
*/
@RestController
@RequestMapping("/ossTianyi")
public class OssTianyiController extends BaseController
{
@Autowired
private OssTianyiClientUtils ossTianyiClientUtils;
/**
* 查询系统上传文件列表 实际是上传接口
*/
@SaCheckPermission("file:sysUploadFile:list")
@GetMapping("/list")
public TableDataInfo list(SysUploadFile sysUploadFile)
{
String localFilePath = "D:\\123pan\\page.html";
try{
ossTianyiClientUtils.uploadFileTest("page.html","dev/temp",localFilePath);
}catch (Exception e){
e.printStackTrace();
}
return null;
}
@GetMapping("/upload")
public R<HashMap<String, Object>> upload(@RequestPart("file") MultipartFile file) {
try {
ossTianyiClientUtils.uploadFile( "dev/temp/"+file.getName(), file);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

125
dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java

@ -0,0 +1,125 @@
package org.dromara.system.controller.site;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.service.DictService;
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;
import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.domain.bo.SysNoticeBo;
import org.dromara.system.domain.vo.SysNoticeVo;
import org.dromara.system.service.ISysNoticeService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 公告 信息操作处理
*
* @author Lion Li
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/site")
public class SiteController extends BaseController {
private final ISysNoticeService noticeService;
private final DictService dictService;
@DubboReference
private final RemoteMessageService remoteMessageService;
//每周提供一次二维场地全貌图及工地视频。 以周为单位处理数据
//site/img/2005/xxxxxxx.png
//site/video/2025/
//todo 二维瓦片上传
//todo 二维瓦片批量上传 (按照周)
//todo 二维瓦片批量下载 (按照周)
//todo 二维瓦片访问 #按照 http://localhost:3308/tile/{z}/{x}/{y}.png 模式访问
//todo 工地视频上传
//todo 工地视频下载
/**
* 获取通知公告列表
*/
// @SaCheckPermission("system:notice:list")
@GetMapping("/list")
public TableDataInfo<SysNoticeVo> list(SysNoticeBo notice, PageQuery pageQuery) {
return noticeService.selectPageNoticeList(notice, pageQuery);
}
/**
* 根据通知公告编号获取详细信息
*
* @param noticeId 公告ID
*/
// @SaCheckPermission("system:notice:query")
@GetMapping(value = "/{noticeId}")
public R<SysNoticeVo> getInfo(@PathVariable Long noticeId) {
return R.ok(noticeService.selectNoticeById(noticeId));
}
/**
* 新增通知公告
*/
// @SaCheckPermission("system:notice:add")
@Log(title = "通知公告", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody SysNoticeBo notice) {
int rows = noticeService.insertNotice(notice);
if (rows <= 0) {
return R.fail();
}
String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType());
remoteMessageService.publishAll("[" + type + "] " + notice.getNoticeTitle());
return R.ok();
}
/**
* 修改通知公告
*/
// @SaCheckPermission("system:notice:edit")
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
@PutMapping
public R<Void> edit(@Validated @RequestBody SysNoticeBo notice) {
return toAjax(noticeService.updateNotice(notice));
}
/**
* 删除通知公告
*
* @param noticeIds 公告ID串
*/
// @SaCheckPermission("system:notice:remove")
@Log(title = "通知公告", businessType = BusinessType.DELETE)
@DeleteMapping("/{noticeIds}")
public R<Void> remove(@PathVariable Long[] noticeIds) {
return toAjax(noticeService.deleteNoticeByIds(noticeIds));
}
}

239
dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java

@ -0,0 +1,239 @@
package org.dromara.system.controller.site;
import java.util.Date;
import java.util.List;
import java.util.Map;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.service.DictService;
import org.dromara.common.dict.utils.DictUtils;
import org.dromara.system.api.RemoteDictService;
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
import org.dromara.system.domain.SiteWeek;
import org.dromara.system.domain.bo.SiteWeekOssBo;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.service.ISiteWeekOssService;
import org.dromara.system.service.ISysDictDataService;
import org.dromara.system.utils.OssTianyiClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.system.domain.bo.SiteWeekBo;
import org.dromara.system.service.ISiteWeekService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.utils.WeekNoUtil;
/**
* 工地日期周
* 前端访问路由地址为:/system/siteWeek
*
* @author szs
* @date 2025-05-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/siteWeek")
public class SiteWeekController extends BaseController {
private final ISiteWeekService siteWeekService;
// @Autowired
// private ISysDictDataService sysDictDataService;
// RemoteDictService
private final DictService dictService;
@Autowired
private ISiteWeekOssService siteWeekOssService;
@Autowired
private OssTianyiClientUtils ossTianyiClientUtils;
/**
* 查询工地日期周列表
*/
@SaCheckPermission("system:siteWeek:list")
@GetMapping("/list")
public TableDataInfo<SiteWeekVo> list(SiteWeekBo bo, PageQuery pageQuery) {
return siteWeekService.queryPageList(bo, pageQuery);
}
/**
* 导出工地日期周列表
*/
@SaCheckPermission("system:siteWeek:export")
@Log(title = "工地日期周", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SiteWeekBo bo, HttpServletResponse response) {
List<SiteWeekVo> list = siteWeekService.queryList(bo);
ExcelUtil.exportExcel(list, "工地日期周", SiteWeekVo.class, response);
}
/**
* 获取工地日期周详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:siteWeek:query")
@GetMapping("/{id}")
public R<SiteWeekVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(siteWeekService.queryById(id));
}
/**
* 新增工地日期周
*/
@SaCheckPermission("system:siteWeek:add")
@Log(title = "工地日期周", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SiteWeekBo bo) {
return toAjax(siteWeekService.insertByBo(bo));
}
@SaCheckPermission("system:siteWeek:add")
@Log(title = "工地日期周", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/autoAdd")
public R<SiteWeekVo> autoAdd(@Validated(AddGroup.class) @RequestBody SiteWeekBo bo) {
R<SiteWeekVo> siteWeekVo = autoAddSiteWeek();
return siteWeekVo;
}
private R<SiteWeekVo> autoAddSiteWeek() {
//新增时基于最新日期处理weekNo
//先查找当前周是否已存在数据库, 有》返回已有数据, 无》新建数据再返回
Date currentDate = new Date();
int weekNoByDate = WeekNoUtil.getWeekNoByDate(currentDate);
SiteWeekBo siteWeekBo = new SiteWeekBo();
siteWeekBo.setWeekNo((long) weekNoByDate);
List<SiteWeekVo> siteWeekVoList = siteWeekService.queryList(siteWeekBo);
SiteWeekVo siteWeekVo = null;
if (siteWeekVoList.size() > 0) {
return R.fail("当前周已存在,无法新增");
}else{
String dateStr = WeekNoUtil.generateDateStr(currentDate);
String dateFormatStr = DateUtil.format(currentDate, "yyyy-MM-dd");
siteWeekBo.setName(dateStr);
siteWeekBo.setNameTime(dateFormatStr);
//扩展默认字典配置 默认(tile/tileZip/img/video)
// List<SysDictDataVo> siteOssDirList = DictUtils.getDictCache("site_oss_dir");
/**
* 这里用dictService直接查是因为 RemoteDictDataVo SysDictDataVo 报错折中做法简单说就是 RemoteDictDataVo vo = siteOssDirList.get(0)就报错
* 报错如下
* class org.dromara.system.domain.vo.SysDictDataVo cannot be cast to class org.dromara.system.api.domain.vo.RemoteDictDataVo
* (org.dromara.system.domain.vo.SysDictDataVo and org.dromara.system.api.domain.vo.RemoteDictDataVo are in unnamed module of
* loader 'app')
*/
Map<String, String> siteOssDirMap = dictService.getAllDictMapByDictType("site_oss_dir");
siteWeekBo.setDirTile(siteOssDirMap.getOrDefault("二维地图","tile"));
siteWeekBo.setDirTileZip(siteOssDirMap.getOrDefault("二维地图压缩包","tileZip"));
siteWeekBo.setDirImg(siteOssDirMap.getOrDefault("图片","img"));
siteWeekBo.setDirVideo(siteOssDirMap.getOrDefault("视频","video"));
/*
for (int i = 0; i < siteOssDirList.size(); i++) {
switch (siteOssDirList.get(i).getDictLabel()){
case "二维地图":
siteWeekBo.setDirTile(siteOssDirList.get(i).getDictValue());
break;
case "二维地图压缩包":
siteWeekBo.setDirTileZip(siteOssDirList.get(i).getDictValue());
break;
case "图片":
siteWeekBo.setDirImg(siteOssDirList.get(i).getDictValue());
break;
case "视频":
siteWeekBo.setDirVideo(siteOssDirList.get(i).getDictValue());
break;
}
}*/
siteWeekService.insertByBo(siteWeekBo);
siteWeekVo = BeanUtil.copyProperties(siteWeekBo, SiteWeekVo.class);
}
return R.ok(siteWeekVo);
}
/**
* 修改工地日期周
*/
@SaCheckPermission("system:siteWeek:edit")
@Log(title = "工地日期周", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SiteWeekBo bo) {
return toAjax(siteWeekService.updateByBo(bo));
}
@SaCheckPermission("system:siteWeek:edit")
@Log(title = "更新工地日期周", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("changeKeepFlag")
public R<Void> changeKeepFlag(@Validated(EditGroup.class) @RequestBody SiteWeekBo bo) {
return toAjax(siteWeekService.updateByBo(bo));
}
/**
* 删除工地日期周
*
* @param ids 主键串
*/
@SaCheckPermission("system:siteWeek:remove")
@Log(title = "工地日期周", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
// Boolean result = siteWeekService.deleteWithValidByIds(List.of(ids), true);
Boolean result = true;
for (Long id : ids) {
SiteWeekOssBo siteWeekOssBo = new SiteWeekOssBo();
siteWeekOssBo.setSiteWeekId(id);
List<SiteWeekOssVo> siteWeekOssVoList = siteWeekOssService.queryList(siteWeekOssBo);
for (SiteWeekOssVo siteWeekOssVo : siteWeekOssVoList) {
try{
ossTianyiClientUtils.deleteFile(siteWeekOssVo.getUrl()); //minio删除文件
siteWeekOssService.deleteWithValidByIds(List.of(siteWeekOssVo.getId()),true); //工地周数据删除
}catch (Exception e){
result = false;
System.err.println("天翼oss文件删除失败"+ siteWeekOssVo.getUrl());
}
}
siteWeekService.deleteWithValidByIds(List.of(id),true);
}
return toAjax(result);
}
}

227
dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java

@ -0,0 +1,227 @@
package org.dromara.system.controller.site;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.ServletOutputStream;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.apache.poi.util.IOUtils;
import org.dromara.system.config.OssTianyiConfig;
import org.dromara.system.domain.bo.SiteWeekBo;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.system.service.ISiteWeekService;
import org.dromara.system.utils.OssTianyiClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.system.domain.bo.SiteWeekOssBo;
import org.dromara.system.service.ISiteWeekOssService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 工地周OSS对象存储
* 前端访问路由地址为:/system/siteWeekOss
*
* @author szs
* @date 2025-05-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/siteWeekOss")
public class SiteWeekOssController extends BaseController {
private final ISiteWeekOssService siteWeekOssService;
@Autowired
private ISiteWeekService siteWeekService;
@Autowired
private OssTianyiClientUtils ossTianyiClientUtils;
/**
* 查询工地周OSS对象存储列表
*/
@SaCheckPermission("system:siteWeekOss:list")
@GetMapping("/list")
public TableDataInfo<SiteWeekOssVo> list(SiteWeekOssBo bo, PageQuery pageQuery) {
return siteWeekOssService.queryPageList(bo, pageQuery);
}
/**
* 导出工地周OSS对象存储列表
*/
@SaCheckPermission("system:siteWeekOss:export")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SiteWeekOssBo bo, HttpServletResponse response) {
List<SiteWeekOssVo> list = siteWeekOssService.queryList(bo);
ExcelUtil.exportExcel(list, "工地周OSS对象存储", SiteWeekOssVo.class, response);
}
/**
* 获取工地周OSS对象存储详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:siteWeekOss:query")
@GetMapping("/{id}")
public R<SiteWeekOssVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(siteWeekOssService.queryById(id));
}
/**
* 新增工地周OSS对象存储
*/
@SaCheckPermission("system:siteWeekOss:add")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SiteWeekOssBo bo) {
return toAjax(siteWeekOssService.insertByBo(bo));
}
/**
* 修改工地周OSS对象存储
*/
@SaCheckPermission("system:siteWeekOss:edit")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SiteWeekOssBo bo) {
return toAjax(siteWeekOssService.updateByBo(bo));
}
// @Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "上传OSS对象存储",description = "上传OSS对象存储")
public R<SiteWeekOssBo> upload(@RequestPart("file") MultipartFile file, @RequestParam("siteWeekId") Long siteWeekId) {
if (ObjectUtil.isNull(file)) {
return R.fail("上传文件不能为空");
}
SiteWeekVo siteWeekVo = siteWeekService.queryById(siteWeekId);
//工地日期周默认上传路径
String baseUrl = siteWeekVo.getNameTime() + "/" + siteWeekVo.getDirTile() + "/";
//上传到minio
String fileUrl = baseUrl + file.getOriginalFilename();
ossTianyiClientUtils.uploadFile(fileUrl, file);
//记录到本地
SiteWeekOssBo siteWeekOssBo = new SiteWeekOssBo();
siteWeekOssBo.setSiteWeekId(siteWeekVo.getId());
siteWeekOssBo.setWeekNo(siteWeekVo.getWeekNo());
siteWeekOssBo.setFileName(file.getOriginalFilename());
siteWeekOssBo.setOriginalName(file.getOriginalFilename());
siteWeekOssBo.setFileSuffix(FileUtil.extName(file.getOriginalFilename()));
siteWeekOssBo.setUrl(fileUrl);
siteWeekOssBo.setService("tianyiOss");
Boolean uploadBo = siteWeekOssService.insertByBo(siteWeekOssBo);
// SysOssVo oss = iSysOssService.upload(file);
// SiteWeekOssBo uploadVo = new SiteWeekOssBo();
// uploadVo.setUrl(oss.getUrl());
// uploadVo.setFileName(oss.getOriginalName());
// uploadVo.setOssId(oss.getOssId().toString());
// return R.ok(uploadVo);
return R.ok(siteWeekOssBo);
}
/**
* 下载OSS对象存储
*
* @param id OSS对象ID
*/
@GetMapping("/download/{id}")
@Operation(summary = "下载OSS对象存储",description = "下载OSS对象存储")
public void download(@PathVariable Long id, HttpServletResponse response) throws IOException {
SiteWeekOssVo siteWeekOssVo = siteWeekOssService.queryById(id);
// InputStream inputStream = ossTianyiClientUtils.downloadFile(siteWeekOssVo.getUrl());
// String encodedFileName = URLEncoder.encode(siteWeekOssVo.getFileName(), "UTF-8").replaceAll("\\+", "%20");
// response.setContentType("application/octet-stream");
// response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
// response.setHeader("download-filename", encodedFileName);
// // 文件流复制
// try (ServletOutputStream outputStream = response.getOutputStream()) {
// IOUtils.copy(inputStream, outputStream);
// outputStream.flush();
// } finally {
// inputStream.close(); // 关闭流
// }
try (InputStream inputStream = ossTianyiClientUtils.downloadFile(siteWeekOssVo.getUrl())) {
// 文件名进行编码
String encodedFileName = URLEncoder.encode(siteWeekOssVo.getFileName(), "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/octet-stream");// 设置响应内容类型
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
// 获取响应输出流
ServletOutputStream outputStream = response.getOutputStream();
// 文件内容写入响应输出流
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
} catch (Exception e) {
throw new RuntimeException("下载有误");
}
}
/**
* 删除工地周OSS对象存储
*
* @param ids 主键串
*/
@SaCheckPermission("system:siteWeekOss:remove")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
// Boolean result = siteWeekOssService.deleteWithValidByIds(List.of(ids), true);
Boolean result = true;
for (Long id : ids) {
SiteWeekOssVo siteWeekOssVo = siteWeekOssService.queryById(id);
try{
ossTianyiClientUtils.deleteFile(siteWeekOssVo.getUrl()); //minio删除文件
siteWeekOssService.deleteWithValidByIds(List.of(id),true); //工地周数据删除
}catch (Exception e){
result = false;
System.err.println("天翼oss文件删除失败"+ siteWeekOssVo.getUrl());
}
}
return toAjax(result);
}
}

25
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java

@ -1,6 +1,7 @@
package org.dromara.system.controller.system;
import java.nio.file.CopyOption;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@ -18,17 +19,22 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.system.domain.SysSubmailConfigUser;
import org.dromara.system.domain.SysSubmailLog;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysSubmailConfigUserBo;
import org.dromara.system.domain.bo.SysSubmailLogBo;
import org.dromara.system.domain.vo.SysSubmailConfigUserVo;
import org.dromara.system.domain.vo.SysUserImportVo;
import org.dromara.system.listener.SysUserImportListener;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysSubmailConfigUserService;
import org.dromara.system.service.ISysSubmailLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -44,6 +50,7 @@ import org.dromara.system.domain.vo.SysSubmailConfigVo;
import org.dromara.system.domain.bo.SysSubmailConfigBo;
import org.dromara.system.service.ISysSubmailConfigService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 赛邮服务配置
@ -87,6 +94,18 @@ public class SysSubmailConfigController extends BaseController {
return sysSubmailConfigService.queryList(bo);
}
@SaCheckPermission("system:sysSubmailConfig:export")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
// ExcelResult<SysSubmailConfigVo> result = ExcelUtil.importExcel(file.getInputStream(), SysSubmailConfigVo.class, new SysUserImportListener(updateSupport));
System.out.println(file.getName());
return R.ok(null);
}
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "配置数据", SysSubmailConfigVo.class, response);
}
/**
* 导出赛邮服务配置列表
*/
@ -95,7 +114,11 @@ public class SysSubmailConfigController extends BaseController {
@PostMapping("/export")
public void export(SysSubmailConfigBo bo, HttpServletResponse response) {
List<SysSubmailConfigVo> list = sysSubmailConfigService.queryList(bo);
ExcelUtil.exportExcel(list, "赛邮服务配置", SysSubmailConfigVo.class, response);
// ExcelUtil.exportExcel(list, "赛邮服务配置", SysSubmailConfigVo.class, response);
List<SysSubmailConfigVo> listVo = MapstructUtils.convert(list, SysSubmailConfigVo.class);
// 导出方法
ExcelUtil.exportExcel(listVo, "赛邮服务数据", SysSubmailConfigVo.class, response);
}
/**

63
dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java

@ -0,0 +1,63 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 大疆开发对象 dji_api
*
* @author szs
* @date 2025-05-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("dji_api")
public class DjiApi extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 大疆api类型
*/
private String djiApiType;
/**
* 版本名称
*/
private String name;
/**
* 版本号
*/
private String nameVersionNo;
/**
* 版本次数
*/
private Integer versionCount;
/**
* 发步日期
*/
private Date timeRelease;
/**
* 备注
*/
private String remark;
}

76
dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java

@ -0,0 +1,76 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 大疆开发-错误码对象 dji_api_error
*
* @author szs
* @date 2025-05-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("dji_api_error")
public class DjiApiError extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 大疆APIId
*/
private Long djiApiId;
/**
* 大疆API版本
*/
private String djiApiName;
/**
* 错误码
*/
private String name;
/**
* 中文描述
*/
private String nameCn;
/**
* 英文描述
*/
private String nameEn;
/**
* 是否变更
*/
private String isChangeFlag;
/**
* 历史变更次数
*/
private Integer changeHistroyCount;
/**
* 历史变更Ids(,分隔)
*/
private String changeHistoryIds;
/**
* 大疆开发-错误码
*/
private String remark;
}

67
dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java

@ -0,0 +1,67 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 工地日期周对象 site_week
*
* @author szs
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("site_week")
public class SiteWeek extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 名称
*/
private String name;
/**
* 年月日名称
*/
private String nameTime;
/**
* 周编号
*/
private Long weekNo;
/**
* 周描述
*/
private String weekNoDescr;
/**
* 分组编号备用
*/
private Long groupNo;
private String dirTile;
private String dirTileZip;
private String dirImg;
private String dirVideo;
private String isKeepFlag; //是否保存(0正常 1停用)
/**
* 备注
*/
private String remark;
}

71
dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java

@ -0,0 +1,71 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 工地周OSS对象存储对象 site_week_oss
*
* @author szs
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("site_week_oss")
public class SiteWeekOss extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 工地周id
*/
private Long siteWeekId;
/**
* 周编号
*/
private Long weekNo;
/**
* 文件名
*/
private String fileName;
/**
* 原名
*/
private String originalName;
/**
* 文件后缀名
*/
private String fileSuffix;
/**
* URL地址
*/
private String url;
/**
* 备注
*/
private String remark;
/**
* 服务商
*/
private String service;
}

2
dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java → dk-modules/system/src/main/java/org/dromara/system/domain/SysUploadFile.java

@ -1,4 +1,4 @@
package org.dromara.sample.storage.domain;
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;

68
dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiBo.java

@ -0,0 +1,68 @@
package org.dromara.system.domain.bo;
import org.dromara.system.domain.DjiApi;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 大疆开发业务对象 dji_api
*
* @author szs
* @date 2025-05-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = DjiApi.class, reverseConvertGenerate = false)
public class DjiApiBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 大疆api类型
*/
@NotBlank(message = "大疆api类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String djiApiType;
/**
* 版本名称
*/
@NotBlank(message = "版本名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 版本号
*/
@NotBlank(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class })
private String nameVersionNo;
/**
* 版本次数
*/
// @NotNull(message = "版本次数不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer versionCount;
/**
* 发步日期
*/
@NotNull(message = "发步日期不能为空", groups = { AddGroup.class, EditGroup.class })
private Date timeRelease;
/**
* 备注
*/
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

84
dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiErrorBo.java

@ -0,0 +1,84 @@
package org.dromara.system.domain.bo;
import org.dromara.system.domain.DjiApiError;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 大疆开发-错误码业务对象 dji_api_error
*
* @author szs
* @date 2025-05-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = DjiApiError.class, reverseConvertGenerate = false)
public class DjiApiErrorBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 大疆APIId
*/
@NotNull(message = "大疆APIId不能为空", groups = { AddGroup.class, EditGroup.class })
private Long djiApiId;
/**
* 大疆API版本
*/
// @NotBlank(message = "大疆API版本不能为空", groups = { AddGroup.class, EditGroup.class })
private String djiApiName;
/**
* 错误码
*/
@NotBlank(message = "错误码不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 中文描述
*/
@NotBlank(message = "中文描述不能为空", groups = { AddGroup.class, EditGroup.class })
private String nameCn;
/**
* 英文描述
*/
// @NotBlank(message = "英文描述不能为空", groups = { AddGroup.class, EditGroup.class })
private String nameEn;
/**
* 是否变更
*/
// @NotBlank(message = "是否变更不能为空", groups = { AddGroup.class, EditGroup.class })
private String isChangeFlag;
/**
* 历史变更次数
*/
// @NotNull(message = "历史变更次数不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer changeHistroyCount;
/**
* 历史变更Ids(,分隔)
*/
// @NotBlank(message = "历史变更Ids(,分隔)不能为空", groups = { AddGroup.class, EditGroup.class })
private String changeHistoryIds;
/**
* 大疆开发-错误码
*/
// @NotBlank(message = "大疆开发-错误码不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

73
dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekBo.java

@ -0,0 +1,73 @@
package org.dromara.system.domain.bo;
import org.dromara.system.domain.SiteWeek;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 工地日期周业务对象 site_week
*
* @author szs
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = SiteWeek.class, reverseConvertGenerate = false)
public class SiteWeekBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 名称
*/
// @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 年月日名称
*/
// @NotBlank(message = "年月日名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String nameTime;
/**
* 周编号
*/
// @NotNull(message = "周编号不能为空", groups = { AddGroup.class, EditGroup.class })
private Long weekNo;
/**
* 周描述
*/
// @NotBlank(message = "周描述不能为空", groups = { AddGroup.class, EditGroup.class })
private String weekNoDescr;
/**
* 分组编号备用
*/
// @NotNull(message = "分组编号(备用)不能为空", groups = { AddGroup.class, EditGroup.class })
private Long groupNo;
private String dirTile;//瓦片路径
private String dirTileZip;//瓦片压缩包
private String dirImg;//图片路径
private String dirVideo;//视频路径
private String isKeepFlag; //是否保存(0正常 1停用)
/**
* 备注
*/
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

78
dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekOssBo.java

@ -0,0 +1,78 @@
package org.dromara.system.domain.bo;
import org.dromara.system.domain.SiteWeekOss;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 工地周OSS对象存储业务对象 site_week_oss
*
* @author szs
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = SiteWeekOss.class, reverseConvertGenerate = false)
public class SiteWeekOssBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 工地周id
*/
@NotNull(message = "工地周id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long siteWeekId;
/**
* 周编号
*/
@NotNull(message = "周编号不能为空", groups = { AddGroup.class, EditGroup.class })
private Long weekNo;
/**
* 文件名
*/
@NotBlank(message = "文件名不能为空", groups = { AddGroup.class, EditGroup.class })
private String fileName;
/**
* 原名
*/
@NotBlank(message = "原名不能为空", groups = { AddGroup.class, EditGroup.class })
private String originalName;
/**
* 文件后缀名
*/
@NotBlank(message = "文件后缀名不能为空", groups = { AddGroup.class, EditGroup.class })
private String fileSuffix;
/**
* URL地址
*/
@NotBlank(message = "URL地址不能为空", groups = { AddGroup.class, EditGroup.class })
private String url;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 服务商
*/
@NotBlank(message = "服务商不能为空", groups = { AddGroup.class, EditGroup.class })
private String service;
}

93
dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiErrorVo.java

@ -0,0 +1,93 @@
package org.dromara.system.domain.vo;
import org.dromara.system.domain.DjiApiError;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 大疆开发-错误码视图对象 dji_api_error
*
* @author szs
* @date 2025-05-14
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = DjiApiError.class)
public class DjiApiErrorVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "ID")
private Long id;
/**
* 大疆APIId
*/
@ExcelProperty(value = "大疆APIId")
private Long djiApiId;
/**
* 大疆API版本
*/
@ExcelProperty(value = "大疆API版本")
private String djiApiName;
/**
* 错误码
*/
@ExcelProperty(value = "错误码")
private String name;
/**
* 中文描述
*/
@ExcelProperty(value = "中文描述")
private String nameCn;
/**
* 英文描述
*/
@ExcelProperty(value = "英文描述")
private String nameEn;
/**
* 是否变更
*/
@ExcelProperty(value = "是否变更", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_yes_no")
private String isChangeFlag;
/**
* 历史变更次数
*/
@ExcelProperty(value = "历史变更次数")
private Integer changeHistroyCount;
/**
* 历史变更Ids(,分隔)
*/
@ExcelProperty(value = "历史变更Ids(,分隔)")
private String changeHistoryIds;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

77
dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiVo.java

@ -0,0 +1,77 @@
package org.dromara.system.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.system.domain.DjiApi;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 大疆开发视图对象 dji_api
*
* @author szs
* @date 2025-05-14
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = DjiApi.class)
public class DjiApiVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "ID")
private Long id;
/**
* 大疆api类型
*/
@ExcelProperty(value = "大疆api类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "dji_api_type")
private String djiApiType;
/**
* 版本名称
*/
@ExcelProperty(value = "版本名称")
private String name;
/**
* 版本号
*/
@ExcelProperty(value = "版本号")
private String nameVersionNo;
/**
* 版本次数
*/
@ExcelProperty(value = "版本次数")
private Integer versionCount;
/**
* 发步日期
*/
@ExcelProperty(value = "发步日期")
private Date timeRelease;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

86
dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekOssVo.java

@ -0,0 +1,86 @@
package org.dromara.system.domain.vo;
import org.dromara.system.domain.SiteWeekOss;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 工地周OSS对象存储视图对象 site_week_oss
*
* @author szs
* @date 2025-05-10
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = SiteWeekOss.class)
public class SiteWeekOssVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "ID")
private Long id;
/**
* 工地周id
*/
@ExcelProperty(value = "工地周id")
private Long siteWeekId;
/**
* 周编号
*/
@ExcelProperty(value = "周编号")
private Long weekNo;
/**
* 文件名
*/
@ExcelProperty(value = "文件名")
private String fileName;
/**
* 原名
*/
@ExcelProperty(value = "原名")
private String originalName;
/**
* 文件后缀名
*/
@ExcelProperty(value = "文件后缀名")
private String fileSuffix;
/**
* URL地址
*/
@ExcelProperty(value = "URL地址")
private String url;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 服务商
*/
@ExcelProperty(value = "服务商")
private String service;
}

86
dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekVo.java

@ -0,0 +1,86 @@
package org.dromara.system.domain.vo;
import org.dromara.system.domain.SiteWeek;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 工地日期周视图对象 site_week
*
* @author szs
* @date 2025-05-10
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = SiteWeek.class)
public class SiteWeekVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "ID")
private Long id;
/**
* 名称
*/
@ExcelProperty(value = "名称")
private String name;
/**
* 年月日名称
*/
@ExcelProperty(value = "年月日名称")
private String nameTime;
/**
* 周编号
*/
@ExcelProperty(value = "周编号")
private Long weekNo;
/**
* 周描述
*/
@ExcelProperty(value = "周描述")
private String weekNoDescr;
/**
* 分组编号备用
*/
@ExcelProperty(value = "分组编号", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "备=用")
private Long groupNo;
@ExcelProperty(value = "瓦片路径")
private String dirTile;
@ExcelProperty(value = "瓦片压缩包")
private String dirTileZip;
@ExcelProperty(value = "图片路径")
private String dirImg;
@ExcelProperty(value = "视频路径")
private String dirVideo;
@ExcelProperty(value = "是否保存")
private String isKeepFlag; //是否保存(0正常 1停用)
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

1
dk-modules/system/src/main/java/org/dromara/system/dubbo/RemotePostServiceImpl.java

@ -40,6 +40,7 @@ public class RemotePostServiceImpl implements RemotePostService {
remotePostVo.setPostId(aiLabel.getPostId());
remotePostVo.setPostName(aiLabel.getPostName());
remotePostVo.setPostCode(aiLabel.getPostCode());
remotePostVo.setStatus(aiLabel.getStatus());
return remotePostVo;
})
.collect(Collectors.toList());

177
dk-modules/system/src/main/java/org/dromara/system/listener/DjiApiErrorImportListener.java

@ -0,0 +1,177 @@
package org.dromara.system.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.excel.core.ExcelListener;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.bo.DjiApiBo;
import org.dromara.system.domain.bo.DjiApiErrorBo;
import org.dromara.system.domain.vo.DjiApiErrorVo;
import org.dromara.system.domain.vo.DjiApiVo;
import org.dromara.system.service.IDjiApiErrorService;
import org.dromara.system.service.IDjiApiService;
import java.util.List;
/**
* 系统用户自定义导入
*
* @author Lion Li
*/
@Slf4j
public class DjiApiErrorImportListener extends AnalysisEventListener<DjiApiErrorVo> implements ExcelListener<DjiApiErrorVo> {
private final IDjiApiErrorService djiApiErrorService;
private final IDjiApiService djiApiService;
private final Boolean isUpdateSupport;
private final Long operUserId;
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
private final StringBuilder failureMsg = new StringBuilder();
public DjiApiErrorImportListener(Boolean isUpdateSupport) {
this.djiApiErrorService = SpringUtils.getBean(IDjiApiErrorService.class);
this.djiApiService = SpringUtils.getBean(IDjiApiService.class);
this.isUpdateSupport = isUpdateSupport;
this.operUserId = LoginHelper.getUserId();
}
@Override
public void invoke(DjiApiErrorVo apiErrVo, AnalysisContext context) {
if(StrUtil.isEmpty(apiErrVo.getDjiApiName())){
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("大疆开发API 不存在,请检查大疆API");
return;
}
//检查大疆API编号是否存在
DjiApiBo djiApiBo = new DjiApiBo();
djiApiBo.setName(apiErrVo.getDjiApiName());
List<DjiApiVo> djiApiVoList = djiApiService.queryList(djiApiBo);
if(djiApiVoList.size()<=0){
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("大疆开发API ").append(apiErrVo.getDjiApiName()).append(" 不存在,请检查大疆API");
}else{
DjiApiVo djiApiVo = djiApiVoList.get(0);
//上次的版本
DjiApiVo djiApiVoOld = null;
if(djiApiVo.getVersionCount() >= 2){
int versionCountOld = djiApiVo.getVersionCount() - 1;
DjiApiBo djiApiBoOld = new DjiApiBo();
djiApiBoOld.setDjiApiType(djiApiVo.getDjiApiType());
djiApiBoOld.setVersionCount(versionCountOld);
List<DjiApiVo> djiApiVoOldList = djiApiService.queryList(djiApiBoOld);
if(djiApiVoOldList.size() > 0){
djiApiVoOld = djiApiVoOldList.get(0);
}
}
DjiApiErrorBo apiErrorBo = new DjiApiErrorBo();
apiErrorBo.setDjiApiId(djiApiVo.getId());
apiErrorBo.setName(apiErrVo.getName());
DjiApiErrorVo djiApiErrorVo = this.djiApiErrorService.selectOneApiErrorByInfo(apiErrorBo);
try {
// 验证是否存在这个用户
if (ObjectUtil.isNull(djiApiErrorVo)) {
DjiApiErrorBo apiErrBo = BeanUtil.toBean(apiErrVo, DjiApiErrorBo.class);
apiErrBo.setDjiApiId(djiApiVo.getId());
apiErrBo.setDjiApiName(djiApiVo.getName());
ValidatorUtils.validate(apiErrBo);
apiErrBo.setCreateBy(operUserId);
//找历史记录,查看上一个版本是否不同
if(null != djiApiVoOld){
DjiApiErrorBo lastErrBo = new DjiApiErrorBo();
lastErrBo.setDjiApiId(djiApiVoOld.getId());
lastErrBo.setName(apiErrVo.getName());
DjiApiErrorVo lastErrVo = djiApiErrorService.selectOneApiErrorByInfo(lastErrBo);
if(StrUtil.equals(lastErrVo.getNameCn(),apiErrVo.getNameCn())){
apiErrBo.setIsChangeFlag("N");
}else {
apiErrBo.setIsChangeFlag("Y");
}
}
djiApiErrorService.insertByBo(apiErrBo);
successNum++;
successMsg.append("<br/>").append(successNum).append("、错误码 ").append(apiErrBo.getName()).append(" 导入成功");
} else if (isUpdateSupport) {
Long apiErrVoId = djiApiErrorVo.getId();
DjiApiErrorBo apiErrBo = BeanUtil.toBean(apiErrVo, DjiApiErrorBo.class);
apiErrBo.setId(apiErrVoId);
ValidatorUtils.validate(apiErrBo);
apiErrBo.setUpdateBy(operUserId);
djiApiErrorService.updateByBo(apiErrBo);
successNum++;
successMsg.append("<br/>").append(successNum).append("、错误码 ").append(apiErrBo.getName()).append(" 更新成功");
} else {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("、错误码 ").append(djiApiErrorVo.getName()).append(" 已存在");
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、错误码 " + HtmlUtil.cleanHtmlTag(apiErrVo.getName()) + " 导入失败:";
String message = e.getMessage();
if (e instanceof ConstraintViolationException cvException) {
message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", ");
}
failureMsg.append(msg).append(message);
log.error(msg, e);
}
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public ExcelResult<DjiApiErrorVo> getExcelResult() {
return new ExcelResult<DjiApiErrorVo>() {
@Override
public String getAnalysis() {
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<DjiApiErrorVo> getList() {
return null;
}
@Override
public List<String> getErrorList() {
return null;
}
};
}
}

15
dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiErrorMapper.java

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.system.domain.DjiApiError;
import org.dromara.system.domain.vo.DjiApiErrorVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 大疆开发-错误码Mapper接口
*
* @author szs
* @date 2025-05-14
*/
public interface DjiApiErrorMapper extends BaseMapperPlus<DjiApiError, DjiApiErrorVo> {
}

15
dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiMapper.java

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.system.domain.DjiApi;
import org.dromara.system.domain.vo.DjiApiVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 大疆开发Mapper接口
*
* @author szs
* @date 2025-05-14
*/
public interface DjiApiMapper extends BaseMapperPlus<DjiApi, DjiApiVo> {
}

15
dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekMapper.java

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.system.domain.SiteWeek;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 工地日期周Mapper接口
*
* @author szs
* @date 2025-05-10
*/
public interface SiteWeekMapper extends BaseMapperPlus<SiteWeek, SiteWeekVo> {
}

15
dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekOssMapper.java

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.system.domain.SiteWeekOss;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 工地周OSS对象存储Mapper接口
*
* @author szs
* @date 2025-05-10
*/
public interface SiteWeekOssMapper extends BaseMapperPlus<SiteWeekOss, SiteWeekOssVo> {
}

72
dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiErrorService.java

@ -0,0 +1,72 @@
package org.dromara.system.service;
import org.dromara.system.domain.DjiApiError;
import org.dromara.system.domain.vo.DjiApiErrorVo;
import org.dromara.system.domain.bo.DjiApiErrorBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 大疆开发-错误码Service接口
*
* @author szs
* @date 2025-05-14
*/
public interface IDjiApiErrorService {
/**
* 查询大疆开发-错误码
*
* @param id 主键
* @return 大疆开发-错误码
*/
DjiApiErrorVo queryById(Long id);
/**
* 分页查询大疆开发-错误码列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 大疆开发-错误码分页列表
*/
TableDataInfo<DjiApiErrorVo> queryPageList(DjiApiErrorBo bo, PageQuery pageQuery);
/**
* 查询符合条件的大疆开发-错误码列表
*
* @param bo 查询条件
* @return 大疆开发-错误码列表
*/
List<DjiApiErrorVo> queryList(DjiApiErrorBo bo);
/**
* 新增大疆开发-错误码
*
* @param bo 大疆开发-错误码
* @return 是否新增成功
*/
Boolean insertByBo(DjiApiErrorBo bo);
/**
* 修改大疆开发-错误码
*
* @param bo 大疆开发-错误码
* @return 是否修改成功
*/
Boolean updateByBo(DjiApiErrorBo bo);
/**
* 校验并批量删除大疆开发-错误码信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
DjiApiErrorVo selectOneApiErrorByInfo(DjiApiErrorBo apiErrorBo);
}

69
dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiService.java

@ -0,0 +1,69 @@
package org.dromara.system.service;
import org.dromara.system.domain.DjiApi;
import org.dromara.system.domain.vo.DjiApiVo;
import org.dromara.system.domain.bo.DjiApiBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 大疆开发Service接口
*
* @author szs
* @date 2025-05-14
*/
public interface IDjiApiService {
/**
* 查询大疆开发
*
* @param id 主键
* @return 大疆开发
*/
DjiApiVo queryById(Long id);
/**
* 分页查询大疆开发列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 大疆开发分页列表
*/
TableDataInfo<DjiApiVo> queryPageList(DjiApiBo bo, PageQuery pageQuery);
/**
* 查询符合条件的大疆开发列表
*
* @param bo 查询条件
* @return 大疆开发列表
*/
List<DjiApiVo> queryList(DjiApiBo bo);
/**
* 新增大疆开发
*
* @param bo 大疆开发
* @return 是否新增成功
*/
Boolean insertByBo(DjiApiBo bo);
/**
* 修改大疆开发
*
* @param bo 大疆开发
* @return 是否修改成功
*/
Boolean updateByBo(DjiApiBo bo);
/**
* 校验并批量删除大疆开发信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

69
dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekOssService.java

@ -0,0 +1,69 @@
package org.dromara.system.service;
import org.dromara.system.domain.SiteWeekOss;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.system.domain.bo.SiteWeekOssBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 工地周OSS对象存储Service接口
*
* @author szs
* @date 2025-05-10
*/
public interface ISiteWeekOssService {
/**
* 查询工地周OSS对象存储
*
* @param id 主键
* @return 工地周OSS对象存储
*/
SiteWeekOssVo queryById(Long id);
/**
* 分页查询工地周OSS对象存储列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 工地周OSS对象存储分页列表
*/
TableDataInfo<SiteWeekOssVo> queryPageList(SiteWeekOssBo bo, PageQuery pageQuery);
/**
* 查询符合条件的工地周OSS对象存储列表
*
* @param bo 查询条件
* @return 工地周OSS对象存储列表
*/
List<SiteWeekOssVo> queryList(SiteWeekOssBo bo);
/**
* 新增工地周OSS对象存储
*
* @param bo 工地周OSS对象存储
* @return 是否新增成功
*/
Boolean insertByBo(SiteWeekOssBo bo);
/**
* 修改工地周OSS对象存储
*
* @param bo 工地周OSS对象存储
* @return 是否修改成功
*/
Boolean updateByBo(SiteWeekOssBo bo);
/**
* 校验并批量删除工地周OSS对象存储信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

69
dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekService.java

@ -0,0 +1,69 @@
package org.dromara.system.service;
import org.dromara.system.domain.SiteWeek;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.system.domain.bo.SiteWeekBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 工地日期周Service接口
*
* @author szs
* @date 2025-05-10
*/
public interface ISiteWeekService {
/**
* 查询工地日期周
*
* @param id 主键
* @return 工地日期周
*/
SiteWeekVo queryById(Long id);
/**
* 分页查询工地日期周列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 工地日期周分页列表
*/
TableDataInfo<SiteWeekVo> queryPageList(SiteWeekBo bo, PageQuery pageQuery);
/**
* 查询符合条件的工地日期周列表
*
* @param bo 查询条件
* @return 工地日期周列表
*/
List<SiteWeekVo> queryList(SiteWeekBo bo);
/**
* 新增工地日期周
*
* @param bo 工地日期周
* @return 是否新增成功
*/
Boolean insertByBo(SiteWeekBo bo);
/**
* 修改工地日期周
*
* @param bo 工地日期周
* @return 是否修改成功
*/
Boolean updateByBo(SiteWeekBo bo);
/**
* 校验并批量删除工地日期周信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

146
dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiErrorServiceImpl.java

@ -0,0 +1,146 @@
package org.dromara.system.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
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.domain.SysUser;
import org.springframework.stereotype.Service;
import org.dromara.system.domain.bo.DjiApiErrorBo;
import org.dromara.system.domain.vo.DjiApiErrorVo;
import org.dromara.system.domain.DjiApiError;
import org.dromara.system.mapper.DjiApiErrorMapper;
import org.dromara.system.service.IDjiApiErrorService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 大疆开发-错误码Service业务层处理
*
* @author szs
* @date 2025-05-14
*/
@RequiredArgsConstructor
@Service
public class DjiApiErrorServiceImpl implements IDjiApiErrorService {
private final DjiApiErrorMapper baseMapper;
/**
* 查询大疆开发-错误码
*
* @param id 主键
* @return 大疆开发-错误码
*/
@Override
public DjiApiErrorVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询大疆开发-错误码列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 大疆开发-错误码分页列表
*/
@Override
public TableDataInfo<DjiApiErrorVo> queryPageList(DjiApiErrorBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<DjiApiError> lqw = buildQueryWrapper(bo);
Page<DjiApiErrorVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的大疆开发-错误码列表
*
* @param bo 查询条件
* @return 大疆开发-错误码列表
*/
@Override
public List<DjiApiErrorVo> queryList(DjiApiErrorBo bo) {
LambdaQueryWrapper<DjiApiError> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<DjiApiError> buildQueryWrapper(DjiApiErrorBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<DjiApiError> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getDjiApiId() != null, DjiApiError::getDjiApiId, bo.getDjiApiId());
lqw.like(StringUtils.isNotBlank(bo.getDjiApiName()), DjiApiError::getDjiApiName, bo.getDjiApiName());
lqw.like(StringUtils.isNotBlank(bo.getName()), DjiApiError::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getNameCn()), DjiApiError::getNameCn, bo.getNameCn());
lqw.eq(StringUtils.isNotBlank(bo.getNameEn()), DjiApiError::getNameEn, bo.getNameEn());
lqw.eq(StringUtils.isNotBlank(bo.getIsChangeFlag()), DjiApiError::getIsChangeFlag, bo.getIsChangeFlag());
lqw.eq(bo.getChangeHistroyCount() != null, DjiApiError::getChangeHistroyCount, bo.getChangeHistroyCount());
lqw.eq(StringUtils.isNotBlank(bo.getChangeHistoryIds()), DjiApiError::getChangeHistoryIds, bo.getChangeHistoryIds());
return lqw;
}
/**
* 新增大疆开发-错误码
*
* @param bo 大疆开发-错误码
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(DjiApiErrorBo bo) {
DjiApiError add = MapstructUtils.convert(bo, DjiApiError.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改大疆开发-错误码
*
* @param bo 大疆开发-错误码
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(DjiApiErrorBo bo) {
DjiApiError update = MapstructUtils.convert(bo, DjiApiError.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DjiApiError entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除大疆开发-错误码信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
public DjiApiErrorVo selectOneApiErrorByInfo(DjiApiErrorBo apiErrorBo) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<DjiApiError>()
.eq(DjiApiError::getDjiApiId, apiErrorBo.getDjiApiId())
.eq(DjiApiError::getName,apiErrorBo.getName()));
}
}

133
dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiServiceImpl.java

@ -0,0 +1,133 @@
package org.dromara.system.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
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.springframework.stereotype.Service;
import org.dromara.system.domain.bo.DjiApiBo;
import org.dromara.system.domain.vo.DjiApiVo;
import org.dromara.system.domain.DjiApi;
import org.dromara.system.mapper.DjiApiMapper;
import org.dromara.system.service.IDjiApiService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 大疆开发Service业务层处理
*
* @author szs
* @date 2025-05-14
*/
@RequiredArgsConstructor
@Service
public class DjiApiServiceImpl implements IDjiApiService {
private final DjiApiMapper baseMapper;
/**
* 查询大疆开发
*
* @param id 主键
* @return 大疆开发
*/
@Override
public DjiApiVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询大疆开发列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 大疆开发分页列表
*/
@Override
public TableDataInfo<DjiApiVo> queryPageList(DjiApiBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<DjiApi> lqw = buildQueryWrapper(bo);
Page<DjiApiVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的大疆开发列表
*
* @param bo 查询条件
* @return 大疆开发列表
*/
@Override
public List<DjiApiVo> queryList(DjiApiBo bo) {
LambdaQueryWrapper<DjiApi> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<DjiApi> buildQueryWrapper(DjiApiBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<DjiApi> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getDjiApiType()), DjiApi::getDjiApiType, bo.getDjiApiType());
lqw.like(StringUtils.isNotBlank(bo.getName()), DjiApi::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getNameVersionNo()), DjiApi::getNameVersionNo, bo.getNameVersionNo());
lqw.eq(bo.getVersionCount() != null, DjiApi::getVersionCount, bo.getVersionCount());
lqw.eq(bo.getTimeRelease() != null, DjiApi::getTimeRelease, bo.getTimeRelease());
return lqw;
}
/**
* 新增大疆开发
*
* @param bo 大疆开发
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(DjiApiBo bo) {
DjiApi add = MapstructUtils.convert(bo, DjiApi.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改大疆开发
*
* @param bo 大疆开发
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(DjiApiBo bo) {
DjiApi update = MapstructUtils.convert(bo, DjiApi.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DjiApi entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除大疆开发信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

135
dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekOssServiceImpl.java

@ -0,0 +1,135 @@
package org.dromara.system.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
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.springframework.stereotype.Service;
import org.dromara.system.domain.bo.SiteWeekOssBo;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.system.domain.SiteWeekOss;
import org.dromara.system.mapper.SiteWeekOssMapper;
import org.dromara.system.service.ISiteWeekOssService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 工地周OSS对象存储Service业务层处理
*
* @author szs
* @date 2025-05-10
*/
@RequiredArgsConstructor
@Service
public class SiteWeekOssServiceImpl implements ISiteWeekOssService {
private final SiteWeekOssMapper baseMapper;
/**
* 查询工地周OSS对象存储
*
* @param id 主键
* @return 工地周OSS对象存储
*/
@Override
public SiteWeekOssVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询工地周OSS对象存储列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 工地周OSS对象存储分页列表
*/
@Override
public TableDataInfo<SiteWeekOssVo> queryPageList(SiteWeekOssBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SiteWeekOss> lqw = buildQueryWrapper(bo);
Page<SiteWeekOssVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的工地周OSS对象存储列表
*
* @param bo 查询条件
* @return 工地周OSS对象存储列表
*/
@Override
public List<SiteWeekOssVo> queryList(SiteWeekOssBo bo) {
LambdaQueryWrapper<SiteWeekOss> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<SiteWeekOss> buildQueryWrapper(SiteWeekOssBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SiteWeekOss> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getSiteWeekId() != null, SiteWeekOss::getSiteWeekId, bo.getSiteWeekId());
lqw.eq(bo.getWeekNo() != null, SiteWeekOss::getWeekNo, bo.getWeekNo());
lqw.like(StringUtils.isNotBlank(bo.getFileName()), SiteWeekOss::getFileName, bo.getFileName());
lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SiteWeekOss::getOriginalName, bo.getOriginalName());
lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SiteWeekOss::getFileSuffix, bo.getFileSuffix());
lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SiteWeekOss::getUrl, bo.getUrl());
lqw.eq(StringUtils.isNotBlank(bo.getService()), SiteWeekOss::getService, bo.getService());
return lqw;
}
/**
* 新增工地周OSS对象存储
*
* @param bo 工地周OSS对象存储
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(SiteWeekOssBo bo) {
SiteWeekOss add = MapstructUtils.convert(bo, SiteWeekOss.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改工地周OSS对象存储
*
* @param bo 工地周OSS对象存储
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(SiteWeekOssBo bo) {
SiteWeekOss update = MapstructUtils.convert(bo, SiteWeekOss.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(SiteWeekOss entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除工地周OSS对象存储信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

135
dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekServiceImpl.java

@ -0,0 +1,135 @@
package org.dromara.system.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
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.springframework.stereotype.Service;
import org.dromara.system.domain.bo.SiteWeekBo;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.system.domain.SiteWeek;
import org.dromara.system.mapper.SiteWeekMapper;
import org.dromara.system.service.ISiteWeekService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 工地日期周Service业务层处理
*
* @author szs
* @date 2025-05-10
*/
@RequiredArgsConstructor
@Service
public class SiteWeekServiceImpl implements ISiteWeekService {
private final SiteWeekMapper baseMapper;
/**
* 查询工地日期周
*
* @param id 主键
* @return 工地日期周
*/
@Override
public SiteWeekVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询工地日期周列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 工地日期周分页列表
*/
@Override
public TableDataInfo<SiteWeekVo> queryPageList(SiteWeekBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SiteWeek> lqw = buildQueryWrapper(bo);
Page<SiteWeekVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的工地日期周列表
*
* @param bo 查询条件
* @return 工地日期周列表
*/
@Override
public List<SiteWeekVo> queryList(SiteWeekBo bo) {
LambdaQueryWrapper<SiteWeek> lqw = buildQueryWrapper(bo);
lqw.orderByDesc(BaseEntity::getCreateTime);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<SiteWeek> buildQueryWrapper(SiteWeekBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SiteWeek> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getName()), SiteWeek::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getNameTime()), SiteWeek::getNameTime, bo.getNameTime());
lqw.eq(bo.getWeekNo() != null, SiteWeek::getWeekNo, bo.getWeekNo());
lqw.eq(StringUtils.isNotBlank(bo.getWeekNoDescr()), SiteWeek::getWeekNoDescr, bo.getWeekNoDescr());
lqw.eq(bo.getGroupNo() != null, SiteWeek::getGroupNo, bo.getGroupNo());
return lqw;
}
/**
* 新增工地日期周
*
* @param bo 工地日期周
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(SiteWeekBo bo) {
SiteWeek add = MapstructUtils.convert(bo, SiteWeek.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改工地日期周
*
* @param bo 工地日期周
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(SiteWeekBo bo) {
SiteWeek update = MapstructUtils.convert(bo, SiteWeek.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(SiteWeek entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除工地日期周信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

179
dk-modules/system/src/main/java/org/dromara/system/utils/OssTianyiClientUtils.java

@ -0,0 +1,179 @@
package org.dromara.system.utils;
import cn.hutool.core.io.FileUtil;
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.Item;
import org.dromara.system.config.OssTianyiConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@Component
public class OssTianyiClientUtils {
private static MinioClient minioClient;
// private static String endPoint = "https://jiangsu-10.zos.ctyun.cn"; //地域节点,可访问
// // private static String endPoint = "https://dk-ty-oss-bucket.jiangsu-10.zos.ctyun.cn"; //说是桶的域名地址,支持公网访问ZOS,实测报错
// private static String minioAccessKey = "22e3f37368a242b38f4f25d98c9baf1f";
// private static String minioSecretKey = "0d858850666248e59830d9a596847062";
// private static String bucketName = "dk-ty-oss-bucket";
// private String bucketName = "dkossbucket";
private String objectName = "page.html";
//注意,天翼云里默认路径就是文件名,不需要在前面加根路径/
private String filePath = "dev/temp/";
private String fileDir = "dev";
@Autowired
OssTianyiConfig ossTianyiConfig;
@Autowired
public OssTianyiClientUtils(OssTianyiConfig ossTianyiConfig) {
this.ossTianyiConfig = ossTianyiConfig;
init();
}
private void init() {
this.minioClient = MinioClient.builder()
.endpoint(ossTianyiConfig.getEndPoint())
.credentials(ossTianyiConfig.getAccessKey(), ossTianyiConfig.getSecretKey())
.build();
}
/**
* 天翼云OSS初始化采用S3 Compatible Storage
*/
// public void tianyiOssInit() {
// minioClient = MinioClient.builder()
// .endpoint(ossTianyiConfig.getEndPoint())
// .credentials(ossTianyiConfig.getAccessKey(), ossTianyiConfig.getSecretKey())
// .build();
// }
/**
* 文件上传 (固定)
*/
public void uploadFileTest(String objectName, String filePath, String localFilePath) throws Exception {
File file = new File(localFilePath);
BufferedInputStream inputStream = FileUtil.getInputStream(file);
String contentType = Files.probeContentType(file.toPath());
if (contentType == null) {
contentType = "application/octet-stream";
}
PutObjectArgs args = PutObjectArgs.builder()
.bucket(ossTianyiConfig.getBucketName())
.object(filePath + objectName)
.stream(inputStream, FileUtil.size(file), -1)
.contentType(contentType)
.build();
minioClient.putObject(args);
}
public void uploadFile(String fileUrl, MultipartFile file) {
try {
PutObjectArgs args = PutObjectArgs.builder()
.bucket(ossTianyiConfig.getBucketName())
.object( fileUrl) //路径 /dev/temp/page.png
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build();
minioClient.putObject(args);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件删除
*/
public void deleteFile( String objectName) throws Exception {
minioClient.removeObject(
RemoveObjectArgs.builder()
.bucket(ossTianyiConfig.getBucketName())
.object(objectName)
.build());
}
/**
* 文件下载
*/
public InputStream downloadFile( String objectUrl) {
InputStream inputStream = null;
try {
inputStream = minioClient.getObject(
GetObjectArgs.builder()
.bucket(ossTianyiConfig.getBucketName())
.object(objectUrl)
.build()
);
} catch (Exception e) {
throw new RuntimeException(e);
}
// FileUtil.writeFromStream(inputStream, new File(downloadPath));
return inputStream;
}
/**
* 文件列表
* @param prefix
*/
public void listFiles( String prefix) {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket(ossTianyiConfig.getBucketName())
.prefix(prefix)
.recursive(true)
.build()
);
try {
for (Result<Item> result : results) {
try {
// System.out.println("文件名:" + result.get().objectName()); // 获取对象名称(文件路径)
System.out.println(result.get().objectName()); // 获取对象名称(文件路径)
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
System.err.println("文件读取异常: " + e.getMessage());
}
}
// public void updateFile(String bucketName, String objectName, String filePath, String localFilePath) throws Exception {
// uploadFile(bucketName, objectName, filePath, localFilePath);
// }
// public static void main(String[] args) throws Exception {
// String localFilePath = "D:\\123pan\\page.html";
//
// tianyiOssInit("", "", "");
// uploadFile(bucketName, objectName, filePath, localFilePath);//正常
//// deleteFile(bucketName, filePath + objectName);//正常
//// listFiles(bucketName, fileDir + "/"); // 正常
//
//// downloadFile(bucketName, filePath + objectName, "D:\\123pan\\downloaded_page.html"); //正常
//
// }
}

66
dk-modules/system/src/main/java/org/dromara/system/utils/WeekNoUtil.java

@ -0,0 +1,66 @@
package org.dromara.system.utils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* WeekNo生成工具基于固定日期计算1970年1月1日
* 测试结果2025-05-10号距离固定日期为2889周
*/
public class WeekNoUtil {
// 设置参考点(ISO周:2023年第1周开始的周一)
// private static final String REFERENCE_DATE_STR = "2023-01-02 00:00:00";
private static final String REFERENCE_DATE_STR = "1970-01-01 00:00:00";
public static int getWeekNoByDate(Date date) {
DateTime inputDate = DateUtil.date(date);
DateTime referenceDate = DateUtil.parse(REFERENCE_DATE_STR, "yyyy-MM-dd HH:mm:ss");
// 获取参考日所在的周一
DateTime refMonday = DateUtil.beginOfWeek(referenceDate);
DateTime inputMonday = DateUtil.beginOfWeek(inputDate);
// 计算两个周一之间的周数差值
long weeks = DateUtil.between(inputMonday, refMonday, DateUnit.WEEK);
// 周差 + 1,得到 weekNo
return (int) weeks + 1;
}
public static int getWeekNoByStr(String dateStr) {
DateTime inputDate = DateUtil.parse(dateStr, "yyyy-MM-dd HH:mm:ss");
DateTime referenceDate = DateUtil.parse(REFERENCE_DATE_STR, "yyyy-MM-dd HH:mm:ss");
// 获取参考日所在的周一
DateTime refMonday = DateUtil.beginOfWeek(referenceDate);
DateTime inputMonday = DateUtil.beginOfWeek(inputDate);
// 计算两个周一之间的周数差值
long weeks = DateUtil.between(inputMonday, refMonday, DateUnit.WEEK);
// 周差 + 1,得到 weekNo
return (int) weeks + 1;
}
public static String generateDateStr(Date currentDate) {
int year = DateUtil.year(currentDate);
int month = DateUtil.month(currentDate);
int weekofMonth = DateUtil.weekOfMonth(currentDate);
String name = year + "年" + month + "月" + weekofMonth + "周";
return name;
}
/* public static void main(String[] args) {
String now = DateUtil.now(); // 当前时间
int weekNo = getWeekNoByStr(now);
System.out.println("当前周No:" + weekNo);
int weekNoD = getWeekNoByDate(new Date());
System.out.println("当前周No:" + weekNoD);
}*/
}

7
dk-modules/system/src/main/resources/mapper/djidev/DjiApiErrorMapper.xml

@ -0,0 +1,7 @@
<?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.system.mapper.DjiApiErrorMapper">
</mapper>

7
dk-modules/system/src/main/resources/mapper/djidev/DjiApiMapper.xml

@ -0,0 +1,7 @@
<?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.system.mapper.DjiApiMapper">
</mapper>

7
dk-modules/system/src/main/resources/mapper/system/SiteWeekMapper.xml

@ -0,0 +1,7 @@
<?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.system.mapper.SiteWeekMapper">
</mapper>

7
dk-modules/system/src/main/resources/mapper/system/SiteWeekOssMapper.xml

@ -0,0 +1,7 @@
<?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.system.mapper.SiteWeekOssMapper">
</mapper>

2
pom.xml

@ -28,7 +28,7 @@
<swagger.core.version>2.2.22</swagger.core.version>
<springdoc.version>2.6.0</springdoc.version>
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
<easyexcel.version>4.0.3</easyexcel.version>
<easyexcel.version>3.3.2</easyexcel.version>
<hutool.version>5.8.31</hutool.version>
<redisson.version>3.37.0</redisson.version>
<lock4j.version>2.2.7</lock4j.version>

Loading…
Cancel
Save