Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
黄嘉阳
/
iot-platform-server
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
178103e2
authored
Nov 14, 2023
by
huangjy
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
fix:sa'as设备数据分析
parent
436e13c6
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
111 additions
and
27 deletions
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderService.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportDayServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportWeekServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderService.java
View file @
178103e2
...
...
@@ -70,6 +70,8 @@ public interface PlatElderService extends IService<PlatElder> {
void
batchEdit
(
PlatElderBatchEditDTOVO
dto
);
List
<
PlatElderListVO
>
listByElder
(
PlatElderQueryDTO
dto
);
PlatElder
getByDeviceId
(
String
deviceId
);
/*小程序*/
}
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportDayServiceImpl.java
View file @
178103e2
...
...
@@ -5,6 +5,7 @@ import com.makeit.dto.platform.elder.PlatElderReportDTO;
import
com.makeit.entity.platform.alarm.PlatAlarmRecord
;
import
com.makeit.entity.platform.alarm.PlatDayDurationRecord
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElderBreatheAnalysis
;
import
com.makeit.entity.platform.elder.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
...
...
@@ -26,7 +27,6 @@ import com.makeit.utils.time.LocalDateTimeUtils;
import
com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO
;
import
com.makeit.vo.platform.elder.realtime.PlatElderRealTimeHeartRespiratoryVO
;
import
com.makeit.vo.platform.elder.report.day.*
;
import
org.apache.commons.lang3.RandomUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
@@ -59,6 +59,8 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Autowired
private
PlatElderRealTimeService
platElderRealTimeService
;
@Autowired
private
PlatElderService
platElderService
;
private
static
LocalDateTime
dayStartNow
(
LocalDate
now
)
{
return
LocalDateTimeUtils
.
getDayStart
(
now
);
...
...
@@ -87,8 +89,16 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
String
nowString
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
).
format
(
now
);
String
elderId
=
platElderIdDTO
.
getElderId
();
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
PlatElderSleepAnalysis
platElderSleepAnalysis
=
platElderSleepAnalysisService
.
getOne
(
new
QueryWrapper
<
PlatElderSleepAnalysis
>().
lambda
()
.
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
elderId
)
.
eq
(
PlatElderSleepAnalysis:
:
getHappenDate
,
nowString
)
);
...
...
@@ -119,9 +129,15 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
List
<
PlatElderSleepDiagramVO
>
voList
;
String
nowString
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
).
format
(
now
);
String
elderId
=
platElderIdDTO
.
getElderId
();
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatElderSleep
>
sleepList
=
platElderSleepService
.
list
(
new
QueryWrapper
<
PlatElderSleep
>().
lambda
()
.
eq
(
PlatElderSleep:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderSleep:
:
getElderId
,
elderId
)
.
eq
(
PlatElderSleep:
:
getHappenDate
,
nowString
)
.
orderByAsc
(
PlatElderSleep:
:
getStartSleep
)
);
...
...
@@ -160,9 +176,15 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
PlatElderHeartRespiratoryEvaluationVO
platElderSleepEvaluationVO
=
new
PlatElderHeartRespiratoryEvaluationVO
();
String
nowString
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
).
format
(
now
);
String
elderId
=
platElderIdDTO
.
getElderId
();
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
PlatElderBreatheAnalysis
platElderSleepAnalysis
=
platElderBreatheAnalysisService
.
getOne
(
new
QueryWrapper
<
PlatElderBreatheAnalysis
>().
lambda
()
.
eq
(
PlatElderBreatheAnalysis:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderBreatheAnalysis:
:
getElderId
,
elderId
)
.
eq
(
PlatElderBreatheAnalysis:
:
getHappenDate
,
nowString
)
);
...
...
@@ -195,16 +217,22 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override
public
List
<
PlatElderHeartRespiratoryEvaluationRecordVO
>
heartRespiratoryExceptionRecordList
(
PlatElderReportDTO
platElderIdDTO
,
String
alarmType
,
LocalDateTime
start
,
LocalDateTime
end
)
{
PlatDevice
device
=
platElderRealTimeService
.
getBreathDevice
(
platElderIdDTO
.
getElderId
(),
platElderIdDTO
.
getDeviceId
());
String
elderId
=
platElderIdDTO
.
getElderId
();
PlatDevice
device
=
platElderRealTimeService
.
getBreathDevice
(
elderId
,
platElderIdDTO
.
getDeviceId
());
if
(
device
==
null
)
{
return
new
ArrayList
<>(
10
);
}
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatAlarmRecord
>
recordList
=
platAlarmRecordService
.
list
(
new
QueryWrapper
<
PlatAlarmRecord
>().
lambda
()
.
eq
(
PlatAlarmRecord:
:
getAlarmType
,
alarmType
)
.
eq
(
PlatAlarmRecord:
:
getDeviceId
,
device
.
getId
())
.
eq
(
PlatAlarmRecord:
:
getElderIds
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatAlarmRecord:
:
getElderIds
,
elderId
)
.
ge
(
PlatAlarmRecord:
:
getAlarmDate
,
start
)
.
le
(
PlatAlarmRecord:
:
getAlarmDate
,
end
)
...
...
@@ -269,19 +297,25 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override
public
List
<
PlatElderBehaviorExceptionRecordVO
>
behaviorExceptionRecordListInternal
(
PlatElderReportDTO
platElderIdDTO
,
LocalDateTime
start
,
LocalDateTime
end
)
{
List
<
PlatDevice
>
platDeviceList
=
platElderRealTimeService
.
getSpaceDevice
(
platElderIdDTO
.
getElderId
(),
platElderIdDTO
.
getDeviceId
());
List
<
PlatDevice
>
fallDeviceList
=
platElderRealTimeService
.
getFallDevice
(
platElderIdDTO
.
getElderId
(),
platElderIdDTO
.
getDeviceId
());
String
elderId
=
platElderIdDTO
.
getElderId
();
List
<
PlatDevice
>
platDeviceList
=
platElderRealTimeService
.
getSpaceDevice
(
elderId
,
platElderIdDTO
.
getDeviceId
());
List
<
PlatDevice
>
fallDeviceList
=
platElderRealTimeService
.
getFallDevice
(
elderId
,
platElderIdDTO
.
getDeviceId
());
platDeviceList
.
addAll
(
fallDeviceList
);
if
(
CollectionUtils
.
isEmpty
(
platDeviceList
))
{
return
new
ArrayList
<>(
10
);
}
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatAlarmRecord
>
recordList
=
platAlarmRecordService
.
list
(
new
QueryWrapper
<
PlatAlarmRecord
>().
lambda
()
.
eq
(
PlatAlarmRecord:
:
getAlarmType
,
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
BEHAVIOR
.
getValue
())
.
in
(
PlatAlarmRecord:
:
getDeviceId
,
StreamUtil
.
mapId
(
platDeviceList
,
PlatDevice:
:
getId
))
.
eq
(
PlatAlarmRecord:
:
getElderIds
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatAlarmRecord:
:
getElderIds
,
elderId
)
.
eq
(
PlatAlarmRecord:
:
getMisinformationFlag
,
CommonEnum
.
NO
.
getValue
())
.
ge
(
PlatAlarmRecord:
:
getAlarmDate
,
start
)
.
le
(
PlatAlarmRecord:
:
getAlarmDate
,
end
)
...
...
@@ -319,23 +353,30 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override
public
List
<
String
>
failRecordListInternal
(
PlatElderReportDTO
platElderIdDTO
,
LocalDateTime
start
,
LocalDateTime
end
)
{
List
<
PlatDevice
>
platDeviceList
=
platElderRealTimeService
.
getFallDevice
(
platElderIdDTO
.
getElderId
(),
platElderIdDTO
.
getDeviceId
());
String
elderId
=
platElderIdDTO
.
getElderId
();
List
<
PlatDevice
>
platDeviceList
=
platElderRealTimeService
.
getFallDevice
(
elderId
,
platElderIdDTO
.
getDeviceId
());
if
(
CollectionUtils
.
isEmpty
(
platDeviceList
))
{
return
new
ArrayList
<>(
10
);
}
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
);
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
String
>
voList
=
new
ArrayList
<>(
10
);
String
finalElderId
=
elderId
;
platDeviceList
.
forEach
(
e
->
{
List
<
PlatAlarmRecord
>
recordList
=
platAlarmRecordService
.
list
(
new
QueryWrapper
<
PlatAlarmRecord
>().
lambda
()
.
eq
(
PlatAlarmRecord:
:
getAlarmType
,
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
FALL
.
getValue
())
.
in
(
PlatAlarmRecord:
:
getDeviceId
,
StreamUtil
.
mapId
(
platDeviceList
,
PlatDevice:
:
getId
))
.
eq
(
PlatAlarmRecord:
:
getElderIds
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatAlarmRecord:
:
getElderIds
,
finalElderId
)
.
eq
(
PlatAlarmRecord:
:
getMisinformationFlag
,
CommonEnum
.
NO
.
getValue
())
.
ge
(
PlatAlarmRecord:
:
getAlarmDate
,
start
)
.
le
(
PlatAlarmRecord:
:
getAlarmDate
,
end
)
...
...
@@ -443,24 +484,31 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override
public
List
<
PlatElderBehaviorDistributionVO
>
behaviorDistributionInternal
(
PlatElderReportDTO
platElderIdDTO
,
List
<
LocalDate
>
nowList
)
{
List
<
PlatDevice
>
platDeviceList
=
platElderRealTimeService
.
getSpaceDevice
(
platElderIdDTO
.
getElderId
()
,
platElderIdDTO
.
getDeviceId
());
List
<
PlatDevice
>
fallDeviceList
=
platElderRealTimeService
.
getFallDevice
(
platElderIdDTO
.
getElderId
()
,
platElderIdDTO
.
getDeviceId
());
String
elderId
=
platElderIdDTO
.
getElderId
();
List
<
PlatDevice
>
platDeviceList
=
platElderRealTimeService
.
getSpaceDevice
(
elderId
,
platElderIdDTO
.
getDeviceId
());
List
<
PlatDevice
>
fallDeviceList
=
platElderRealTimeService
.
getFallDevice
(
elderId
,
platElderIdDTO
.
getDeviceId
());
platDeviceList
.
addAll
(
fallDeviceList
);
if
(
CollectionUtils
.
isEmpty
(
platDeviceList
))
{
return
new
ArrayList
<>(
10
);
}
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatElderBehaviorDistributionVO
>
voList
=
new
ArrayList
<>(
10
);
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyyMMdd"
);
List
<
PlatElderBehaviorDistributionVO
>
finalVoList
=
voList
;
String
finalElderId
=
elderId
;
platDeviceList
.
forEach
(
e
->
{
List
<
PlatDayDurationRecord
>
recordList
=
platDayDurationRecordService
.
list
(
new
QueryWrapper
<
PlatDayDurationRecord
>().
lambda
()
.
eq
(
PlatDayDurationRecord:
:
getDeviceId
,
e
.
getId
())
.
eq
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getElderId
()),
PlatDayDurationRecord:
:
getElderIds
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
StringUtils
.
isNotEmpty
(
finalElderId
),
PlatDayDurationRecord:
:
getElderIds
,
finalElderId
)
.
in
(
PlatDayDurationRecord:
:
getDay
,
StreamUtil
.
map
(
nowList
,
dateTimeFormatter:
:
format
))
);
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportWeekServiceImpl.java
View file @
178103e2
...
...
@@ -75,6 +75,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
@Autowired
private
PlatElderSleepAnalysisService
platElderSleepAnalysisService
;
@Autowired
private
PlatElderService
platElderService
;
private
LocalDateTime
weekStartDateTime
(
LocalDateTime
defaultTime
)
{
return
weekStartDateTime
(
LocalDate
.
now
().
minusDays
(
1
),
defaultTime
);
...
...
@@ -174,9 +176,15 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
public
PlatElderSleepEvaluationVO
sleepEvaluationInternal
(
PlatElderReportDTO
platElderIdDTO
,
LocalDate
weekStartDate
,
LocalDate
weekEndDate
)
{
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
String
elderId
=
platElderIdDTO
.
getElderId
();
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatElderSleepAnalysis
>
sleepAnalysisList
=
platElderSleepAnalysisService
.
list
(
new
QueryWrapper
<
PlatElderSleepAnalysis
>().
lambda
()
.
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
elderId
)
.
ge
(
PlatElderSleepAnalysis:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekStartDate
))
.
le
(
PlatElderSleepAnalysis:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekEndDate
))
);
...
...
@@ -239,15 +247,21 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
LocalDate
weekEndDate
=
weekEndDate
(
platElderIdDTO
.
getEndTime
());
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
String
elderId
=
platElderIdDTO
.
getElderId
();
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatElderSleep
>
sleepList
=
platElderSleepService
.
list
(
new
QueryWrapper
<
PlatElderSleep
>().
lambda
()
.
eq
(
PlatElderSleep:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderSleep:
:
getElderId
,
elderId
)
.
ge
(
PlatElderSleep:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekStartDate
))
.
le
(
PlatElderSleep:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekEndDate
))
);
List
<
PlatElderSleepAnalysis
>
sleepAnalysisList
=
platElderSleepAnalysisService
.
list
(
new
QueryWrapper
<
PlatElderSleepAnalysis
>().
lambda
()
.
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
elderId
)
.
ge
(
PlatElderSleepAnalysis:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekStartDate
))
.
le
(
PlatElderSleepAnalysis:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekEndDate
))
);
...
...
@@ -317,9 +331,15 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
public
PlatElderHeartRespiratoryEvaluationVO
heartRespiratoryEvaluationInternal
(
PlatElderReportDTO
platElderIdDTO
,
LocalDate
weekStartDate
,
LocalDate
weekEndDate
)
{
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
String
elderId
=
platElderIdDTO
.
getElderId
();
if
(
StringUtils
.
isNotEmpty
(
platElderIdDTO
.
getDeviceId
()))
{
PlatElder
platElder
=
platElderService
.
getByDeviceId
(
platElderIdDTO
.
getDeviceId
());
if
(
platElder
!=
null
)
{
elderId
=
platElder
.
getId
();
}
}
List
<
PlatElderBreatheAnalysis
>
breatheAnalyses
=
platElderBreatheAnalysisService
.
list
(
new
QueryWrapper
<
PlatElderBreatheAnalysis
>().
lambda
()
.
eq
(
PlatElderBreatheAnalysis:
:
getElderId
,
platElderIdDTO
.
getElderId
()
)
.
eq
(
PlatElderBreatheAnalysis:
:
getElderId
,
elderId
)
.
ge
(
PlatElderBreatheAnalysis:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekStartDate
))
.
le
(
PlatElderBreatheAnalysis:
:
getHappenDate
,
dateTimeFormatter
.
format
(
weekEndDate
))
);
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderServiceImpl.java
View file @
178103e2
...
...
@@ -25,6 +25,7 @@ import com.makeit.entity.platform.elder.PlatElderOtherInfo;
import
com.makeit.entity.platform.elder.PlatElderSocialRelation
;
import
com.makeit.entity.platform.space.PlatBed
;
import
com.makeit.entity.platform.space.PlatRoom
;
import
com.makeit.entity.platform.space.PlatRoomBedDevice
;
import
com.makeit.entity.platform.space.PlatSpace
;
import
com.makeit.enums.CodeMessageEnum
;
import
com.makeit.enums.CommonEnum
;
...
...
@@ -1191,6 +1192,19 @@ public class PlatElderServiceImpl extends ServiceImpl<PlatElderMapper, PlatElder
return
voList
;
}
@Override
public
PlatElder
getByDeviceId
(
String
deviceId
)
{
PlatRoomBedDevice
platRoomBedDevice
=
platRoomBedDeviceService
.
getOne
(
new
QueryWrapper
<
PlatRoomBedDevice
>().
lambda
()
.
eq
(
PlatRoomBedDevice:
:
getDeviceId
,
deviceId
)
.
last
(
"limit 1"
));
if
(
platRoomBedDevice
!=
null
&&
StringUtils
.
isNotEmpty
(
platRoomBedDevice
.
getBedId
()))
{
PlatElder
platElder
=
getOne
(
new
QueryWrapper
<
PlatElder
>().
lambda
()
.
eq
(
PlatElder:
:
getBedId
,
platRoomBedDevice
.
getBedId
()));
return
platElder
;
}
return
null
;
}
}
//TODO ywc 数据字典
//还有空间相关的没有 列表 详情 导入 导出
...
...
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