Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
GeoFlyApi
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
GeoFly
GeoFlyApi
Commits
49f175dc
Commit
49f175dc
authored
Sep 27, 2025
by
gdj
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加飞行时长统计
parent
a84e02dc
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
288 additions
and
6 deletions
+288
-6
sample/src/main/java/com/dji/sample/manage/dao/IDeviceDetailMapper.java
+12
-0
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDetailCacheDTO.java
+21
-0
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDetailCountDTO.java
+20
-0
sample/src/main/java/com/dji/sample/manage/model/entity/DeviceDetailEntity.java
+41
-0
sample/src/main/java/com/dji/sample/manage/service/IDeviceDetailService.java
+18
-0
sample/src/main/java/com/dji/sample/manage/service/impl/DeviceDetailServiceImpl.java
+168
-0
sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
+8
-6
No files found.
sample/src/main/java/com/dji/sample/manage/dao/IDeviceDetailMapper.java
0 → 100644
View file @
49f175dc
package
com
.
dji
.
sample
.
manage
.
dao
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dji.sample.manage.model.entity.DeviceDetailEntity
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* @author guan
*/
@Mapper
public
interface
IDeviceDetailMapper
extends
BaseMapper
<
DeviceDetailEntity
>
{
}
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDetailCacheDTO.java
0 → 100644
View file @
49f175dc
package
com
.
dji
.
sample
.
manage
.
model
.
dto
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @author guan
*/
@Data
public
class
DeviceDetailCacheDTO
implements
Serializable
{
private
String
deviceSn
;
private
String
type
;
private
String
value
;
private
Boolean
isSave
;
}
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDetailCountDTO.java
0 → 100644
View file @
49f175dc
package
com
.
dji
.
sample
.
manage
.
model
.
dto
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
/**
* @author guan
*/
@Data
public
class
DeviceDetailCountDTO
implements
Serializable
{
private
BigDecimal
totalFlightSorties
;
private
BigDecimal
totalFlightDistance
;
private
BigDecimal
totalFlightTime
;
}
sample/src/main/java/com/dji/sample/manage/model/entity/DeviceDetailEntity.java
0 → 100644
View file @
49f175dc
package
com
.
dji
.
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
;
/**
*
* @author guan
*/
@Data
@TableName
(
"manage_device_detail"
)
public
class
DeviceDetailEntity
implements
Serializable
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
@TableField
(
value
=
"device_sn"
)
private
String
deviceSn
;
@TableField
(
value
=
"type"
)
private
String
type
;
@TableField
(
value
=
"init_value"
)
private
String
initValue
;
@TableField
(
value
=
"cur_value"
)
private
String
curValue
;
@TableField
(
value
=
"create_time"
,
fill
=
FieldFill
.
INSERT
)
private
Long
createTime
;
@TableField
(
value
=
"update_time"
,
fill
=
FieldFill
.
INSERT_UPDATE
)
private
Long
updateTime
;
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/service/IDeviceDetailService.java
0 → 100644
View file @
49f175dc
package
com
.
dji
.
sample
.
manage
.
service
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dji.sample.manage.model.dto.DeviceDetailCountDTO
;
import
com.dji.sample.manage.model.entity.DeviceDetailEntity
;
import
com.dji.sdk.cloudapi.device.OsdDockDrone
;
import
java.util.List
;
/**
* @author guan
*/
public
interface
IDeviceDetailService
extends
IService
<
DeviceDetailEntity
>
{
void
saveDeviceOsd
(
String
deviceSn
,
OsdDockDrone
osdDockDrone
);
DeviceDetailCountDTO
searchList
(
List
<
String
>
deviceSnList
);
}
sample/src/main/java/com/dji/sample/manage/service/impl/DeviceDetailServiceImpl.java
0 → 100644
View file @
49f175dc
package
com
.
dji
.
sample
.
manage
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.dji.sample.component.redis.RedisConst
;
import
com.dji.sample.component.redis.RedisOpsUtils
;
import
com.dji.sample.manage.dao.IDeviceDetailMapper
;
import
com.dji.sample.manage.model.dto.DeviceDTO
;
import
com.dji.sample.manage.model.dto.DeviceDetailCacheDTO
;
import
com.dji.sample.manage.model.dto.DeviceDetailCountDTO
;
import
com.dji.sample.manage.model.entity.DeviceDetailEntity
;
import
com.dji.sample.manage.service.IDeviceDetailService
;
import
com.dji.sdk.cloudapi.device.DeviceDomainEnum
;
import
com.dji.sdk.cloudapi.device.OsdDockDrone
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
static
com
.
dji
.
sample
.
component
.
redis
.
RedisConst
.*;
/**
* @author guan
*/
@Service
public
class
DeviceDetailServiceImpl
extends
ServiceImpl
<
IDeviceDetailMapper
,
DeviceDetailEntity
>
implements
IDeviceDetailService
{
@Override
public
void
saveDeviceOsd
(
String
deviceSn
,
OsdDockDrone
osdDockDrone
)
{
// 保存
Double
totalFlightDistance
=
osdDockDrone
.
getTotalFlightDistance
();
Integer
totalFlightSorties
=
osdDockDrone
.
getTotalFlightSorties
();
Float
totalFlightTime
=
osdDockDrone
.
getTotalFlightTime
();
if
(
totalFlightDistance
!=
null
)
{
// 飞行总里程
DeviceDetailCacheDTO
totalFlightDistanceDTO
=
new
DeviceDetailCacheDTO
();
totalFlightDistanceDTO
.
setDeviceSn
(
deviceSn
);
totalFlightDistanceDTO
.
setIsSave
(
false
);
totalFlightDistanceDTO
.
setType
(
"total_flight_distance"
);
totalFlightDistanceDTO
.
setValue
(
String
.
valueOf
(
totalFlightDistance
));
RedisOpsUtils
.
set
(
DEVICE_TOTAL_FLIGHT_DISTANCE_PREFIX
+
deviceSn
,
totalFlightDistanceDTO
);
}
if
(
totalFlightSorties
!=
null
)
{
// 飞行总架次
DeviceDetailCacheDTO
totalFlightSortiesDTO
=
new
DeviceDetailCacheDTO
();
totalFlightSortiesDTO
.
setDeviceSn
(
deviceSn
);
totalFlightSortiesDTO
.
setIsSave
(
false
);
totalFlightSortiesDTO
.
setType
(
"total_flight_sorties"
);
totalFlightSortiesDTO
.
setValue
(
String
.
valueOf
(
totalFlightSorties
));
RedisOpsUtils
.
set
(
DEVICE_TOTAL_FLIGHT_SORTIES_PREFIX
+
deviceSn
,
totalFlightSortiesDTO
);
}
if
(
totalFlightTime
!=
null
)
{
// 飞行总航时
DeviceDetailCacheDTO
totalFlightTimeDTO
=
new
DeviceDetailCacheDTO
();
totalFlightTimeDTO
.
setDeviceSn
(
deviceSn
);
totalFlightTimeDTO
.
setIsSave
(
false
);
totalFlightTimeDTO
.
setType
(
"total_flight_time"
);
totalFlightTimeDTO
.
setValue
(
String
.
valueOf
(
totalFlightTime
));
RedisOpsUtils
.
set
(
DEVICE_TOTAL_FLIGHT_TIME_PREFIX
+
deviceSn
,
totalFlightTimeDTO
);
}
}
@Override
public
DeviceDetailCountDTO
searchList
(
List
<
String
>
deviceSnList
)
{
DeviceDetailCountDTO
deviceDetailCountDTO
=
new
DeviceDetailCountDTO
();
deviceDetailCountDTO
.
setTotalFlightSorties
(
BigDecimal
.
ZERO
);
deviceDetailCountDTO
.
setTotalFlightDistance
(
BigDecimal
.
ZERO
);
deviceDetailCountDTO
.
setTotalFlightTime
(
BigDecimal
.
ZERO
);
// 查询数据
LambdaQueryWrapper
<
DeviceDetailEntity
>
wrapper
=
new
LambdaQueryWrapper
<>();
wrapper
.
in
(
DeviceDetailEntity:
:
getDeviceSn
,
deviceSnList
);
List
<
DeviceDetailEntity
>
detailEntities
=
this
.
list
(
wrapper
);
if
(
CollectionUtils
.
isEmpty
(
detailEntities
))
{
return
deviceDetailCountDTO
;
}
Map
<
String
,
List
<
DeviceDetailEntity
>>
deviceDetailMap
=
detailEntities
.
stream
().
collect
(
Collectors
.
groupingBy
(
DeviceDetailEntity:
:
getType
));
List
<
DeviceDetailEntity
>
totalFlightDistanceList
=
deviceDetailMap
.
getOrDefault
(
"total_flight_distance"
,
new
ArrayList
<>());
List
<
DeviceDetailEntity
>
totalFlightSortiesList
=
deviceDetailMap
.
getOrDefault
(
"total_flight_sorties"
,
new
ArrayList
<>());
List
<
DeviceDetailEntity
>
totalFlightTimeList
=
deviceDetailMap
.
getOrDefault
(
"total_flight_time"
,
new
ArrayList
<>());
if
(!
CollectionUtils
.
isEmpty
(
totalFlightDistanceList
))
{
BigDecimal
num
=
BigDecimal
.
ZERO
;
for
(
DeviceDetailEntity
deviceDetailEntity
:
totalFlightDistanceList
)
{
num
=
num
.
add
(
new
BigDecimal
(
deviceDetailEntity
.
getCurValue
()));
}
deviceDetailCountDTO
.
setTotalFlightDistance
(
num
);
}
if
(!
CollectionUtils
.
isEmpty
(
totalFlightSortiesList
))
{
BigDecimal
num
=
BigDecimal
.
ZERO
;
for
(
DeviceDetailEntity
deviceDetailEntity
:
totalFlightSortiesList
)
{
num
=
num
.
add
(
new
BigDecimal
(
deviceDetailEntity
.
getCurValue
()));
}
deviceDetailCountDTO
.
setTotalFlightSorties
(
num
);
}
if
(!
CollectionUtils
.
isEmpty
(
totalFlightTimeList
))
{
BigDecimal
num
=
BigDecimal
.
ZERO
;
for
(
DeviceDetailEntity
deviceDetailEntity
:
totalFlightTimeList
)
{
num
=
num
.
add
(
new
BigDecimal
(
deviceDetailEntity
.
getCurValue
()));
}
deviceDetailCountDTO
.
setTotalFlightTime
(
num
);
}
return
deviceDetailCountDTO
;
}
/**
* 定时器 10分钟保存一次数据 每 600 秒执行一次
*/
@Scheduled
(
fixedRate
=
600000
)
public
void
syncSaveDeviceDetailData
()
{
// 查询redis 获取数据
int
start
=
RedisConst
.
DEVICE_DETAIL_PREFIX
.
length
();
Set
<
String
>
allKeys
=
RedisOpsUtils
.
getAllKeys
(
RedisConst
.
DEVICE_DETAIL_PREFIX
+
"*"
);
Iterator
<
String
>
iterator
=
allKeys
.
iterator
();
while
(
iterator
.
hasNext
())
{
String
key
=
iterator
.
next
();
DeviceDetailCacheDTO
value
=
(
DeviceDetailCacheDTO
)
RedisOpsUtils
.
get
(
key
);
if
(
value
.
getIsSave
())
{
continue
;
}
value
.
setIsSave
(
true
);
RedisOpsUtils
.
set
(
key
,
value
);
// 查询数据库是否存在数据
LambdaQueryWrapper
<
DeviceDetailEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
DeviceDetailEntity:
:
getType
,
value
.
getType
());
queryWrapper
.
eq
(
DeviceDetailEntity:
:
getDeviceSn
,
value
.
getDeviceSn
());
List
<
DeviceDetailEntity
>
deviceDetailEntities
=
this
.
list
(
queryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
deviceDetailEntities
))
{
// 新增
DeviceDetailEntity
deviceDetailEntity
=
new
DeviceDetailEntity
();
deviceDetailEntity
.
setDeviceSn
(
value
.
getDeviceSn
());
deviceDetailEntity
.
setType
(
value
.
getType
());
deviceDetailEntity
.
setInitValue
(
value
.
getValue
());
deviceDetailEntity
.
setCurValue
(
value
.
getValue
());
deviceDetailEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceDetailEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
this
.
save
(
deviceDetailEntity
);
}
else
{
// 修改
DeviceDetailEntity
dbDetailEntity
=
deviceDetailEntities
.
get
(
0
);
LambdaUpdateWrapper
<
DeviceDetailEntity
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
updateWrapper
.
eq
(
DeviceDetailEntity:
:
getId
,
dbDetailEntity
.
getId
());
updateWrapper
.
set
(
DeviceDetailEntity:
:
getCurValue
,
value
.
getValue
());
updateWrapper
.
set
(
DeviceDetailEntity:
:
getUpdateTime
,
System
.
currentTimeMillis
());
this
.
update
(
updateWrapper
);
}
}
}
}
sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
View file @
49f175dc
...
...
@@ -10,10 +10,7 @@ import com.dji.sample.manage.model.dto.DeviceDTO;
import
com.dji.sample.manage.model.dto.DevicePayloadReceiver
;
import
com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum
;
import
com.dji.sample.manage.model.param.DeviceQueryParam
;
import
com.dji.sample.manage.service.IDeviceDictionaryService
;
import
com.dji.sample.manage.service.IDevicePayloadService
;
import
com.dji.sample.manage.service.IDeviceRedisService
;
import
com.dji.sample.manage.service.IDeviceService
;
import
com.dji.sample.manage.service.*
;
import
com.dji.sample.uom.UOMDroneFlightRecordDTO
;
import
com.dji.sample.uom.UOMRecordService
;
import
com.dji.sdk.cloudapi.device.*
;
...
...
@@ -32,8 +29,7 @@ import org.apache.commons.lang3.BooleanUtils;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.messaging.MessageHeaders
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.util.*
;
import
java.math.RoundingMode
;
import
java.time.LocalDateTime
;
...
...
@@ -70,6 +66,9 @@ public class SDKDeviceService extends AbstractDeviceService {
@Autowired
private
UOMRecordService
uomRecordService
;
@Autowired
private
IDeviceDetailService
deviceDetailService
;
private
static
final
ScheduledExecutorService
recordExecutor
=
Executors
.
newScheduledThreadPool
(
4
);
private
static
final
Map
<
String
,
Long
>
lastRecordTimeMap
=
new
ConcurrentHashMap
<>();
private
static
final
long
MIN_RECORD_INTERVAL
=
1000
;
// 1秒间隔
...
...
@@ -193,6 +192,9 @@ public class SDKDeviceService extends AbstractDeviceService {
DeviceDTO
device
=
deviceOpt
.
get
();
deviceRedisService
.
setDeviceOnline
(
device
);
deviceRedisService
.
setDeviceOsd
(
from
,
request
.
getData
());
// 存放数据
deviceDetailService
.
saveDeviceOsd
(
from
,
request
.
getData
());
// 3. 带频率控制的记录上报
submitRecordWithRateLimit
(
device
,
request
);
// new Thread(() -> {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment