Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
attendance-performance-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
attendance-performance-platform
Commits
54203264
Commit
54203264
authored
Mar 20, 2024
by
赵啸非
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改考勤绩效记录汇总
parent
a3d92a04
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
179 additions
and
290 deletions
+179
-290
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordErrorServiceImpl.java
...ndance/service/impl/AttendanceRecordErrorServiceImpl.java
+110
-145
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordHikServiceImpl.java
...tendance/service/impl/AttendanceRecordHikServiceImpl.java
+1
-137
attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/PerformEffectRecordService.java
...hx/module/perform/service/PerformEffectRecordService.java
+8
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformEffectRecordServiceImpl.java
.../perform/service/impl/PerformEffectRecordServiceImpl.java
+6
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/web/PerformEffectRecordController.java
...xhx/module/perform/web/PerformEffectRecordController.java
+48
-0
attendance-performance-manager/src/test/java/com/mortals/httpclient/attendance/AttendanceRecordErrorController.http
...ttpclient/attendance/AttendanceRecordErrorController.http
+2
-2
attendance-performance-manager/src/test/java/com/mortals/httpclient/system.http
...-manager/src/test/java/com/mortals/httpclient/system.http
+4
-6
No files found.
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordErrorServiceImpl.java
View file @
54203264
...
@@ -52,18 +52,8 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
...
@@ -52,18 +52,8 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
@Autowired
@Autowired
private
AttendanceClassDetailService
classDetailService
;
private
AttendanceClassDetailService
classDetailService
;
@Autowired
private
AttendanceClassService
attendanceClassService
;
@Autowired
@Autowired
private
PerformAttendRecordService
performAttendRecordService
;
private
PerformAttendRecordService
performAttendRecordService
;
@Autowired
private
ApiWebPerformController
apiWebPerformController
;
@Autowired
private
StaffService
staffService
;
@Autowired
private
AttendanceStatService
attendanceStatService
;
@Autowired
@Autowired
private
ICacheService
cacheService
;
private
ICacheService
cacheService
;
@Autowired
@Autowired
...
@@ -99,92 +89,37 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
...
@@ -99,92 +89,37 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
@Override
@Override
protected
void
updateAfter
(
AttendanceRecordErrorEntity
entity
,
Context
context
)
throws
AppException
{
protected
void
updateAfter
(
AttendanceRecordErrorEntity
entity
,
Context
context
)
throws
AppException
{
if
(
YesNoEnum
.
YES
.
getValue
()
==
entity
.
getProcessStatus
())
{
if
(
YesNoEnum
.
YES
.
getValue
()
==
entity
.
getProcessStatus
())
{
entity
=
this
.
get
(
entity
.
getId
());
entity
=
this
.
get
(
entity
.
getId
());
//判断后打绩效
//判断后打绩效
String
ruleCode
=
""
;
if
(
ErrorStatusEnum
.
早退
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getErrorDateTime
())
&&
!
ObjectUtils
.
isEmpty
(
entity
.
getGoOffDateTime
()))
{
//判断时间差定义
Long
earlyMin
=
DateUtil
.
between
(
entity
.
getErrorDateTime
(),
entity
.
getGoOffDateTime
(),
DateUnit
.
MINUTE
);
if
(
earlyMin
>=
0L
&&
earlyMin
<
5L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1002"
;
}
if
(
earlyMin
>=
5L
&&
earlyMin
<
60L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1004"
;
}
if
(
earlyMin
>=
60L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1006"
;
}
}
else
{
ruleCode
=
"ATTEND1002"
;
}
}
else
if
(
ErrorStatusEnum
.
迟到
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getErrorDateTime
())
&&
!
ObjectUtils
.
isEmpty
(
entity
.
getGoOffDateTime
()))
{
Long
lateMin
=
DateUtil
.
between
(
entity
.
getErrorDateTime
(),
entity
.
getGoOffDateTime
(),
DateUnit
.
MINUTE
);
String
ruleCode
=
getRuleCode
(
entity
);
if
(
lateMin
>=
0L
&&
lateMin
<
5L
)
{
//迟到5分钟内
ruleCode
=
"ATTEND1001"
;
}
if
(
lateMin
>=
5L
&&
lateMin
<
60L
)
{
//迟到5-60
ruleCode
=
"ATTEND1003"
;
}
if
(
lateMin
>=
60L
)
{
//迟到60分钟以上
ruleCode
=
"ATTEND1005"
;
}
}
else
{
//早退5分钟内
ruleCode
=
"ATTEND1001"
;
}
}
else
if
(
ErrorStatusEnum
.
缺卡
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
ruleCode
=
"ATTEND1007"
;
}
if
(!
ObjectUtils
.
isEmpty
(
ruleCode
))
{
if
(!
ObjectUtils
.
isEmpty
(
ruleCode
))
{
AttendSaveReq
attendSaveReq
=
new
AttendSaveReq
();
saveAttendPerformRecord
(
context
,
entity
,
ruleCode
);
attendSaveReq
.
setAttendanceGroupId
(
entity
.
getAttendanceGroupId
());
attendSaveReq
.
setAttendanceGroupName
(
entity
.
getAttendanceGroupName
());
attendSaveReq
.
setAttendanceDate
(
entity
.
getActualAttendanceDateTime
());
attendSaveReq
.
setErrorTime
(
entity
.
getErrorDateTime
());
attendSaveReq
.
setGoOffTimeStr
(
entity
.
getGoOrOff
());
attendSaveReq
.
setActualAttendTime
(
entity
.
getActualAttendanceDateTime
());
attendSaveReq
.
setErrorResult
(
entity
.
getRemark
());
attendSaveReq
.
setTitle
(
"考勤"
);
attendSaveReq
.
setHappenTime
(
entity
.
getErrorDateTime
());
attendSaveReq
.
setRuleCode
(
ruleCode
);
attendSaveReq
.
setStaffId
(
entity
.
getStaffId
());
performAttendRecordService
.
saveAttend
(
attendSaveReq
,
context
);
}
}
//异常处理后重新汇总考勤 context!=null时表示页面调用的修改,自动执行处理任务调用时context为null,无需立即汇总
//异常处理后重新汇总考勤 context!=null时表示页面调用的修改,自动执行处理任务调用时context为null,无需立即汇总
if
(
StringUtils
.
isNotEmpty
(
entity
.
getProcessResult
())&&
context
!=
null
)
{
if
(
StringUtils
.
isNotEmpty
(
entity
.
getProcessResult
())
&&
context
!=
null
)
{
AttendanceSummaryQuery
query
=
new
AttendanceSummaryQuery
();
AttendanceSummaryQuery
query
=
new
AttendanceSummaryQuery
();
query
.
setStaffId
(
entity
.
getStaffId
());
query
.
setStaffId
(
entity
.
getStaffId
());
query
.
setSummaryTime
(
DateUtils
.
getStrDate
(
entity
.
getErrorDateTime
()));
query
.
setSummaryTime
(
DateUtils
.
getStrDate
(
entity
.
getErrorDateTime
()));
// AttendSummaryThread summaryThread = new AttendSummaryThread(attendanceStatService, query);
// AttendSummaryThread summaryThread = new AttendSummaryThread(attendanceStatService, query);
// ThreadPool.getInstance().execute(summaryThread);
// ThreadPool.getInstance().execute(summaryThread);
cacheService
.
lpush
(
KEY_ATTENDANCE_STAT_CACHE
,
query
);
cacheService
.
lpush
(
KEY_ATTENDANCE_STAT_CACHE
,
query
);
}
}
}
}
}
}
@Override
@Override
public
boolean
errorConfirm
(
Long
errorId
)
{
public
boolean
errorConfirm
(
Long
errorId
)
{
boolean
result
=
true
;
boolean
result
=
true
;
AttendanceRecordErrorEntity
errorEntity
=
this
.
get
(
errorId
);
AttendanceRecordErrorEntity
errorEntity
=
this
.
get
(
errorId
);
if
(
errorEntity
!=
null
)
{
if
(
errorEntity
!=
null
)
{
AttendanceLeaveRecordQuery
query
=
new
AttendanceLeaveRecordQuery
();
AttendanceLeaveRecordQuery
query
=
new
AttendanceLeaveRecordQuery
();
query
.
setEndTimeStart
(
DateUtils
.
getStrDate
(
errorEntity
.
getErrorDateTime
()));
query
.
setEndTimeStart
(
DateUtils
.
getStrDate
(
errorEntity
.
getErrorDateTime
()));
query
.
setLeavePersonId
(
errorEntity
.
getStaffId
());
query
.
setLeavePersonId
(
errorEntity
.
getStaffId
());
query
.
setAuditResult
(
AppealResultEnum
.
通过
.
getValue
());
query
.
setAuditResult
(
AppealResultEnum
.
通过
.
getValue
());
AttendanceLeaveRecordEntity
leaveRecordEntity
=
attendanceLeaveRecordService
.
selectOne
(
query
);
AttendanceLeaveRecordEntity
leaveRecordEntity
=
attendanceLeaveRecordService
.
selectOne
(
query
);
if
(
leaveRecordEntity
!=
null
)
{
if
(
leaveRecordEntity
!=
null
)
{
result
=
false
;
result
=
false
;
}
}
}
}
...
@@ -197,9 +132,9 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
...
@@ -197,9 +132,9 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
query
.
setErrorDateTimeStart
(
DateUtils
.
getStrDate
(
date
));
query
.
setErrorDateTimeStart
(
DateUtils
.
getStrDate
(
date
));
query
.
setErrorDateTimeEnd
(
DateUtils
.
getStrDate
(
date
));
query
.
setErrorDateTimeEnd
(
DateUtils
.
getStrDate
(
date
));
List
<
AttendanceRecordErrorEntity
>
list
=
this
.
find
(
query
);
List
<
AttendanceRecordErrorEntity
>
list
=
this
.
find
(
query
);
if
(
CollectionUtils
.
isNotEmpty
(
list
))
{
if
(
CollectionUtils
.
isNotEmpty
(
list
))
{
list
.
stream
().
forEach
(
item
->
{
list
.
stream
().
forEach
(
item
->
{
if
(
errorConfirm
(
item
.
getId
()))
{
if
(
errorConfirm
(
item
.
getId
()))
{
AttendanceRecordErrorEntity
updateEntity
=
new
AttendanceRecordErrorEntity
();
AttendanceRecordErrorEntity
updateEntity
=
new
AttendanceRecordErrorEntity
();
updateEntity
.
setId
(
item
.
getId
());
updateEntity
.
setId
(
item
.
getId
());
updateEntity
.
setProcessStatus
(
1
);
updateEntity
.
setProcessStatus
(
1
);
...
@@ -210,7 +145,7 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
...
@@ -210,7 +145,7 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
updateEntity
.
setRemark
(
"系统自动处理"
);
updateEntity
.
setRemark
(
"系统自动处理"
);
updateEntity
.
setUpdateTime
(
new
Date
());
updateEntity
.
setUpdateTime
(
new
Date
());
updateEntity
.
setUpdateUserId
(
1
l
);
updateEntity
.
setUpdateUserId
(
1
l
);
this
.
update
(
updateEntity
,
null
);
this
.
update
(
updateEntity
,
null
);
}
}
});
});
}
}
...
@@ -225,79 +160,24 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
...
@@ -225,79 +160,24 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
query
.
setErrorDateTimeEnd
(
day
);
query
.
setErrorDateTimeEnd
(
day
);
List
<
AttendanceRecordErrorEntity
>
list
=
this
.
find
(
query
);
List
<
AttendanceRecordErrorEntity
>
list
=
this
.
find
(
query
);
if
(
CollectionUtils
.
isNotEmpty
(
list
))
{
if
(
CollectionUtils
.
isNotEmpty
(
list
))
{
log
.
info
(
"重新生成["
+
day
+
"]已处理的绩效考勤核查数据....."
);
log
.
info
(
"重新生成["
+
day
+
"]已处理的绩效考勤核查数据....."
);
for
(
AttendanceRecordErrorEntity
entity
:
list
)
{
for
(
AttendanceRecordErrorEntity
entity
:
list
)
{
// if (YesNoEnum.YES.getValue() == entity.getProcessStatus()) {
// if (YesNoEnum.YES.getValue() == entity.getProcessStatus()) {
//判断后打绩效
//判断后打绩效
String
ruleCode
=
""
;
String
ruleCode
=
getRuleCode
(
entity
);
if
(
ErrorStatusEnum
.
早退
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
if
(!
ObjectUtils
.
isEmpty
(
ruleCode
))
{
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getErrorDateTime
())
&&
!
ObjectUtils
.
isEmpty
(
entity
.
getGoOffDateTime
()))
{
saveAttendPerformRecord
(
context
,
entity
,
ruleCode
);
//判断时间差定义
Long
earlyMin
=
DateUtil
.
between
(
entity
.
getErrorDateTime
(),
entity
.
getGoOffDateTime
(),
DateUnit
.
MINUTE
);
if
(
earlyMin
>=
0L
&&
earlyMin
<
5L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1002"
;
}
if
(
earlyMin
>=
5L
&&
earlyMin
<
60L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1004"
;
}
if
(
earlyMin
>=
60L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1006"
;
}
}
else
{
ruleCode
=
"ATTEND1002"
;
}
}
else
if
(
ErrorStatusEnum
.
迟到
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getErrorDateTime
())
&&
!
ObjectUtils
.
isEmpty
(
entity
.
getGoOffDateTime
()))
{
Long
lateMin
=
DateUtil
.
between
(
entity
.
getErrorDateTime
(),
entity
.
getGoOffDateTime
(),
DateUnit
.
MINUTE
);
if
(
lateMin
>=
0L
&&
lateMin
<
5L
)
{
//迟到5分钟内
ruleCode
=
"ATTEND1001"
;
}
if
(
lateMin
>=
5L
&&
lateMin
<
60L
)
{
//迟到5-60
ruleCode
=
"ATTEND1003"
;
}
if
(
lateMin
>=
60L
)
{
//迟到60分钟以上
ruleCode
=
"ATTEND1005"
;
}
}
else
{
//早退5分钟内
ruleCode
=
"ATTEND1001"
;
}
}
else
if
(
ErrorStatusEnum
.
缺卡
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
ruleCode
=
"ATTEND1007"
;
}
if
(!
ObjectUtils
.
isEmpty
(
ruleCode
))
{
AttendSaveReq
attendSaveReq
=
new
AttendSaveReq
();
attendSaveReq
.
setAttendanceGroupId
(
entity
.
getAttendanceGroupId
());
attendSaveReq
.
setAttendanceGroupName
(
entity
.
getAttendanceGroupName
());
attendSaveReq
.
setAttendanceDate
(
entity
.
getActualAttendanceDateTime
());
attendSaveReq
.
setErrorTime
(
entity
.
getErrorDateTime
());
attendSaveReq
.
setGoOffTimeStr
(
entity
.
getGoOrOff
());
attendSaveReq
.
setActualAttendTime
(
entity
.
getActualAttendanceDateTime
());
attendSaveReq
.
setErrorResult
(
entity
.
getRemark
());
attendSaveReq
.
setTitle
(
"考勤"
);
attendSaveReq
.
setHappenTime
(
entity
.
getErrorDateTime
());
attendSaveReq
.
setRuleCode
(
ruleCode
);
attendSaveReq
.
setStaffId
(
entity
.
getStaffId
());
performAttendRecordService
.
saveAttend
(
attendSaveReq
,
context
);
}
}
}
}
}
// }
}
// }
}
}
log
.
info
(
"从新生成已处理的绩效考勤核查数据,执行完成....."
);
log
.
info
(
"从新生成已处理的绩效考勤核查数据,执行完成....."
);
}
}
private
List
<
String
>
getDatesBetween
(
String
startDateStr
,
String
endDateStr
)
{
private
List
<
String
>
getDatesBetween
(
String
startDateStr
,
String
endDateStr
)
{
DateTimeFormatter
formatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
DateTimeFormatter
formatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
LocalDate
startDate
=
LocalDate
.
parse
(
startDateStr
,
formatter
);
LocalDate
startDate
=
LocalDate
.
parse
(
startDateStr
,
formatter
);
...
@@ -328,11 +208,96 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
...
@@ -328,11 +208,96 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
query
.
setStaffId
(
attendanceRecordErrorEntity
.
getStaffId
());
query
.
setStaffId
(
attendanceRecordErrorEntity
.
getStaffId
());
query
.
setErrorTime
(
attendanceRecordErrorEntity
.
getErrorDateTime
());
query
.
setErrorTime
(
attendanceRecordErrorEntity
.
getErrorDateTime
());
List
<
PerformAttendRecordEntity
>
delAttendRecords
=
performAttendRecordService
.
find
(
query
,
context
);
List
<
PerformAttendRecordEntity
>
delAttendRecords
=
performAttendRecordService
.
find
(
query
,
context
);
if
(!
ObjectUtils
.
isEmpty
(
delAttendRecords
))
{
if
(!
ObjectUtils
.
isEmpty
(
delAttendRecords
))
{
Long
[]
delIds
=
delAttendRecords
.
stream
().
map
(
i
->
i
.
getId
()).
toArray
(
Long
[]::
new
);
Long
[]
delIds
=
delAttendRecords
.
stream
().
map
(
i
->
i
.
getId
()).
toArray
(
Long
[]::
new
);
performAttendRecordService
.
remove
(
delIds
,
context
);
performAttendRecordService
.
remove
(
delIds
,
context
);
log
.
info
(
"删除考勤记录成功,size:{}"
,
delIds
.
length
);
log
.
info
(
"删除考勤记录成功,size:{}"
,
delIds
.
length
);
}
}
}
@Override
protected
void
saveAfter
(
List
<
AttendanceRecordErrorEntity
>
list
,
Context
context
)
throws
AppException
{
super
.
saveAfter
(
list
,
context
);
if
(!
ObjectUtils
.
isEmpty
(
list
))
{
log
.
info
(
"生成绩效考勤核查数据....."
);
for
(
AttendanceRecordErrorEntity
entity
:
list
)
{
// if (YesNoEnum.YES.getValue() == entity.getProcessStatus()) {
//判断后打绩效
String
ruleCode
=
getRuleCode
(
entity
);
if
(!
ObjectUtils
.
isEmpty
(
ruleCode
))
{
saveAttendPerformRecord
(
context
,
entity
,
ruleCode
);
}
}
}
}
private
void
saveAttendPerformRecord
(
Context
context
,
AttendanceRecordErrorEntity
entity
,
String
ruleCode
)
{
AttendSaveReq
attendSaveReq
=
new
AttendSaveReq
();
attendSaveReq
.
setAttendanceGroupId
(
entity
.
getAttendanceGroupId
());
attendSaveReq
.
setAttendanceGroupName
(
entity
.
getAttendanceGroupName
());
attendSaveReq
.
setAttendanceDate
(
entity
.
getActualAttendanceDateTime
());
attendSaveReq
.
setErrorTime
(
entity
.
getErrorDateTime
());
attendSaveReq
.
setGoOffTimeStr
(
entity
.
getGoOrOff
());
attendSaveReq
.
setActualAttendTime
(
entity
.
getActualAttendanceDateTime
());
attendSaveReq
.
setErrorResult
(
entity
.
getRemark
());
attendSaveReq
.
setTitle
(
"考勤"
);
attendSaveReq
.
setHappenTime
(
entity
.
getErrorDateTime
());
attendSaveReq
.
setRuleCode
(
ruleCode
);
attendSaveReq
.
setStaffId
(
entity
.
getStaffId
());
performAttendRecordService
.
saveAttend
(
attendSaveReq
,
context
);
}
private
static
String
getRuleCode
(
AttendanceRecordErrorEntity
entity
)
{
String
ruleCode
=
""
;
if
(
ErrorStatusEnum
.
早退
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getErrorDateTime
())
&&
!
ObjectUtils
.
isEmpty
(
entity
.
getGoOffDateTime
()))
{
//判断时间差定义
Long
earlyMin
=
DateUtil
.
between
(
entity
.
getErrorDateTime
(),
entity
.
getGoOffDateTime
(),
DateUnit
.
MINUTE
);
if
(
earlyMin
>=
0L
&&
earlyMin
<
5L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1002"
;
}
if
(
earlyMin
>=
5L
&&
earlyMin
<
60L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1004"
;
}
if
(
earlyMin
>=
60L
)
{
//早退5分钟内
ruleCode
=
"ATTEND1006"
;
}
}
else
{
ruleCode
=
"ATTEND1002"
;
}
}
else
if
(
ErrorStatusEnum
.
迟到
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getErrorDateTime
())
&&
!
ObjectUtils
.
isEmpty
(
entity
.
getGoOffDateTime
()))
{
Long
lateMin
=
DateUtil
.
between
(
entity
.
getErrorDateTime
(),
entity
.
getGoOffDateTime
(),
DateUnit
.
MINUTE
);
if
(
lateMin
>=
0L
&&
lateMin
<
5L
)
{
//迟到5分钟内
ruleCode
=
"ATTEND1001"
;
}
if
(
lateMin
>=
5L
&&
lateMin
<
60L
)
{
//迟到5-60
ruleCode
=
"ATTEND1003"
;
}
if
(
lateMin
>=
60L
)
{
//迟到60分钟以上
ruleCode
=
"ATTEND1005"
;
}
}
else
{
//早退5分钟内
ruleCode
=
"ATTEND1001"
;
}
}
}
else
if
(
ErrorStatusEnum
.
缺卡
.
getValue
()
==
DataUtil
.
converStr2Int
(
entity
.
getProcessResult
(),
3
))
{
ruleCode
=
"ATTEND1007"
;
}
}
return
ruleCode
;
}
}
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordHikServiceImpl.java
View file @
54203264
...
@@ -257,7 +257,6 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
...
@@ -257,7 +257,6 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
attendanceRecordEntity
.
setId
(
recordEntity
.
getId
());
attendanceRecordEntity
.
setId
(
recordEntity
.
getId
());
attendanceRecordEntity
.
setUpdateTime
(
new
Date
());
attendanceRecordEntity
.
setUpdateTime
(
new
Date
());
attendanceRecordEntity
.
setUpdateUserId
(
this
.
getContextUserId
(
context
));
attendanceRecordEntity
.
setUpdateUserId
(
this
.
getContextUserId
(
context
));
updateList
.
add
(
attendanceRecordEntity
);
updateList
.
add
(
attendanceRecordEntity
);
// attendanceRecordService.update(attendanceRecordEntity, context);
// attendanceRecordService.update(attendanceRecordEntity, context);
}
else
{
}
else
{
...
@@ -378,6 +377,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
...
@@ -378,6 +377,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
attendanceRecordEntity
.
setClassName
(
attendanceClassDetailEntity
==
null
?
""
:
attendanceClassDetailEntity
.
getClassName
());
attendanceRecordEntity
.
setClassName
(
attendanceClassDetailEntity
==
null
?
""
:
attendanceClassDetailEntity
.
getClassName
());
}
}
//生成异常记录
//生成异常记录
log
.
info
(
"开始生成异常考勤记录"
);
genErrorAttendRecord
(
context
,
dateStr
,
attendanceRecordEntity
,
detailEntityList
);
genErrorAttendRecord
(
context
,
dateStr
,
attendanceRecordEntity
,
detailEntityList
);
if
(!
ObjectUtils
.
isEmpty
(
detailEntityList
))
{
if
(!
ObjectUtils
.
isEmpty
(
detailEntityList
))
{
attendanceRecordEntity
.
setAttendanceRecordDetailList
(
detailEntityList
);
attendanceRecordEntity
.
setAttendanceRecordDetailList
(
detailEntityList
);
...
@@ -497,8 +497,6 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
...
@@ -497,8 +497,6 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
if
(
OffWorkResultEnum
.
迟到
.
getValue
()
==
recordDetailEntity
.
getOffWorkResult
())
{
if
(
OffWorkResultEnum
.
迟到
.
getValue
()
==
recordDetailEntity
.
getOffWorkResult
())
{
errorEntity
.
setErrorStatus
(
ErrorStatusEnum
.
迟到
.
getValue
());
errorEntity
.
setErrorStatus
(
ErrorStatusEnum
.
迟到
.
getValue
());
}
}
errorEntityList
.
add
(
errorEntity
);
errorEntityList
.
add
(
errorEntity
);
}
}
...
@@ -509,140 +507,6 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
...
@@ -509,140 +507,6 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
}
}
}
}
private
Boolean
checkDouble
(
List
<
AttendanceRecordErrorEntity
>
errorEntityList
,
AttendanceRecordErrorEntity
checkError
)
{
//检测 新加 的错误 是否存在与列表中
boolean
bool
=
true
;
for
(
AttendanceRecordErrorEntity
error
:
errorEntityList
)
{
//
//if(error.getStaffId()==checkError.getStaffId()&&error.getShiftsId()=)
}
return
bool
;
}
private
void
checkAttendGroupByOne
(
AttendanceRecordEntity
attendanceRecordEntity
,
List
<
AttendanceRecordDetailEntity
>
detailEntityList
,
Date
attendanceDate
,
AttendanceGroupStaffEntity
attendanceGroupStaffEntity
,
Context
context
)
{
//查询考勤组
AttendanceGroupEntity
attendanceGroupEntity
=
attendanceGroupService
.
get
(
attendanceGroupStaffEntity
.
getGroupId
(),
context
);
attendanceRecordEntity
.
setAttendanceGroupId
(
attendanceGroupEntity
==
null
?
0L
:
attendanceGroupEntity
.
getId
());
attendanceRecordEntity
.
setAttendanceGroupName
(
attendanceGroupEntity
==
null
?
""
:
attendanceGroupEntity
.
getGroupName
());
//查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制
AttendanceWorkAbstract
workAbstract
=
AttendanceWorkAbstract
.
newType
(
attendanceGroupEntity
.
getType
());
CommonData
commonData
=
new
CommonData
();
commonData
.
setAttendanceGroupEntity
(
attendanceGroupEntity
);
commonData
.
setAttendanceDate
(
attendanceDate
);
commonData
.
setDetailEntityList
(
detailEntityList
);
commonData
.
setStaffId
(
attendanceRecordEntity
.
getStaffId
());
workAbstract
.
doHandleWork
(
commonData
);
/*
AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(new AttendanceGroupFixedworkQuery()
.groupId(attendanceGroupEntity.getId()));
//判断当前考勤日期为周几
String week = this.getWeek(attendanceDate);
//log.info("week:{}", week);
//通过考勤日期的星期拿到班次id.
if (ObjectUtils.isEmpty(attendanceGroupFixedworkEntity)) {
log.info("attendanceGroupFixedworkEntity is null ! groupId:{}", attendanceGroupEntity.getId());
return;
}
//获取当前日期的详细班次
Long weekClassId = this.getWeekClassId(attendanceGroupFixedworkEntity, week);
//log.info("weekClassId:{}", weekClassId);
//weekClassId为-1 则不在考勤
if (weekClassId == -1L) {
//跳过本次循环
return;
}
//获取班次信息
AttendanceClassEntity attendanceClassEntity = attendanceClassService.get(weekClassId);
if (ObjectUtils.isEmpty(attendanceClassEntity)) {
log.info("attendanceClassEntity is null ,weekClassId:{}", weekClassId);
return;
}
//List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassDetailService.find(new AttendanceClassDetailQuery().classId(attendanceClassEntity.getId()));
//获取当前班的多个班次,一个班次为一个上下班时间段
List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassEntity.getAttendanceClassDetailList();
Integer orderNum = 0;
//构造数据
if (ObjectUtils.isEmpty(detailEntityList)) {
//遍历班次 构建详细考勤数据
for (AttendanceClassDetailEntity classDetailEntity : attendanceClassDetailEntities) {
orderNum++;
AttendanceRecordDetailEntity recordDetailEntity = new AttendanceRecordDetailEntity();
recordDetailEntity.setShiftsId(classDetailEntity.getId());
recordDetailEntity.setShiftsName(classDetailEntity.getClassName());
recordDetailEntity.setGoWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOffWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOrderNum(orderNum);
detailEntityList.add(recordDetailEntity);
}
}
for (AttendanceClassDetailEntity classDetail : attendanceClassDetailEntities) {
//计算区间范围
//上班打卡前时间
Date goWorkDateBefore = DateUtil.offsetMinute(classDetail.getGoWorkDate(), -classDetail.getGoWorkDateBefore());
//上班打卡后时间
Date goWorkDateAfter = DateUtil.offsetMinute(classDetail.getGoWorkDate(), classDetail.getGoWorkDateAfter());
// 下班打卡前时间
Date offWorkDateBefore = DateUtil.offsetMinute(classDetail.getOffWorkDate(), -classDetail.getOffWorkDateBefore());
//下班打卡后时间
Date offWorkDateAfter = DateUtil.offsetMinute(classDetail.getOffWorkDate(), classDetail.getOffWorkDateAfter());
//判断考勤时间是否在上班打卡区间内 true 在 false 不在 格式化时间
//String currDate = DateUtil.formatTime(attendanceDate);
Date curDateTime = DateUtil.parseTime(DateUtil.formatTime(attendanceDate)).toJdkDate();
boolean goInTime = DateUtil.isIn(curDateTime, goWorkDateBefore, goWorkDateAfter);
//判断考勤时间是否在下班打卡区间内
boolean offInTime = DateUtil.isIn(curDateTime, offWorkDateBefore, offWorkDateAfter);
if (goInTime == false && offInTime == false) {
log.info("考勤时间不在上班区间与下班区间中,不做处理!attendDate:{}", DateUtil.formatDateTime(attendanceDate));
continue;
}
if (goInTime) {
//如果是上班打卡区间范围,判断是否迟到
boolean inTime = DateUtil.isIn(curDateTime, goWorkDateBefore, classDetail.getGoWorkDate());
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setGoWorkDate(attendanceDate);
}
}
} else {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.迟到.getValue());
attendanceRecordDetailEntity.setGoWorkDate(attendanceDate);
}
}
}
}
if (offInTime) {
boolean inTime = DateUtil.isIn(curDateTime, classDetail.getOffWorkDate(), offWorkDateAfter);
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setOffWorkDate(attendanceDate);
}
}
} else {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId() == classDetail.getId()) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.早退.getValue());
attendanceRecordDetailEntity.setOffWorkDate(attendanceDate);
}
}
}
}
}*/
}
public
String
getWeek
(
Date
date
)
{
public
String
getWeek
(
Date
date
)
{
// Get the day of the week (1 = Sunday, 2 = Monday, ..., 7 = Saturday)
// Get the day of the week (1 = Sunday, 2 = Monday, ..., 7 = Saturday)
int
dayOfWeek
=
DateUtil
.
dayOfWeek
(
date
);
int
dayOfWeek
=
DateUtil
.
dayOfWeek
(
date
);
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/PerformEffectRecordService.java
View file @
54203264
package
com.mortals.xhx.module.perform.service
;
package
com.mortals.xhx.module.perform.service
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.Context
;
import
com.mortals.framework.service.ICRUDService
;
import
com.mortals.framework.service.ICRUDService
;
import
com.mortals.xhx.module.perform.model.PerformEffectRecordEntity
;
import
com.mortals.xhx.module.perform.model.PerformEffectRecordEntity
;
import
com.mortals.xhx.module.perform.dao.PerformEffectRecordDao
;
import
com.mortals.xhx.module.perform.dao.PerformEffectRecordDao
;
import
com.mortals.xhx.module.perform.model.PerformEffectRecordQuery
;
import
org.springframework.web.bind.annotation.RequestBody
;
/**
/**
* PerformEffectRecordService
* PerformEffectRecordService
*
*
...
@@ -23,4 +27,8 @@ public interface PerformEffectRecordService extends ICRUDService<PerformEffectRe
...
@@ -23,4 +27,8 @@ public interface PerformEffectRecordService extends ICRUDService<PerformEffectRe
*/
*/
void
updateProcessStatus
(
Long
id
,
Integer
status
)
throws
AppException
;
void
updateProcessStatus
(
Long
id
,
Integer
status
)
throws
AppException
;
void
syncEffectRecord
(
PerformEffectRecordQuery
query
,
Context
context
);
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformEffectRecordServiceImpl.java
View file @
54203264
...
@@ -5,6 +5,7 @@ import com.mortals.xhx.common.utils.BeanUtil;
...
@@ -5,6 +5,7 @@ import com.mortals.xhx.common.utils.BeanUtil;
import
com.mortals.xhx.module.check.model.CheckEffectRecordEntity
;
import
com.mortals.xhx.module.check.model.CheckEffectRecordEntity
;
import
com.mortals.xhx.module.check.service.CheckEffectRecordService
;
import
com.mortals.xhx.module.check.service.CheckEffectRecordService
;
import
com.mortals.xhx.module.perform.model.PerformComplainRecordEntity
;
import
com.mortals.xhx.module.perform.model.PerformComplainRecordEntity
;
import
com.mortals.xhx.module.perform.model.PerformEffectRecordQuery
;
import
com.mortals.xhx.module.perform.model.PerformRulesEntity
;
import
com.mortals.xhx.module.perform.model.PerformRulesEntity
;
import
com.mortals.xhx.module.perform.service.PerformRulesService
;
import
com.mortals.xhx.module.perform.service.PerformRulesService
;
import
com.mortals.xhx.module.perform.service.PerformStaffConfService
;
import
com.mortals.xhx.module.perform.service.PerformStaffConfService
;
...
@@ -113,4 +114,9 @@ public class PerformEffectRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
...
@@ -113,4 +114,9 @@ public class PerformEffectRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
dao
.
update
(
update
);
dao
.
update
(
update
);
}
}
@Override
public
void
syncEffectRecord
(
PerformEffectRecordQuery
query
,
Context
context
)
{
}
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/web/PerformEffectRecordController.java
View file @
54203264
package
com.mortals.xhx.module.perform.web
;
package
com.mortals.xhx.module.perform.web
;
import
cn.hutool.core.date.DateTime
;
import
cn.hutool.core.date.DateUnit
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.date.DateUtil
;
import
com.mortals.framework.annotation.UnAuth
;
import
com.mortals.framework.common.Rest
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.OrderCol
;
import
com.mortals.framework.model.OrderCol
;
import
com.mortals.framework.web.BaseCRUDJsonBodyMappingController
;
import
com.mortals.framework.web.BaseCRUDJsonBodyMappingController
;
...
@@ -7,10 +11,14 @@ import com.mortals.xhx.base.system.param.service.ParamService;
...
@@ -7,10 +11,14 @@ import com.mortals.xhx.base.system.param.service.ParamService;
import
com.mortals.xhx.base.system.user.model.UserQuery
;
import
com.mortals.xhx.base.system.user.model.UserQuery
;
import
com.mortals.xhx.base.system.user.service.UserService
;
import
com.mortals.xhx.base.system.user.service.UserService
;
import
com.mortals.xhx.common.code.*
;
import
com.mortals.xhx.common.code.*
;
import
com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery
;
import
com.mortals.xhx.module.dept.model.DeptQuery
;
import
com.mortals.xhx.module.dept.model.DeptQuery
;
import
com.mortals.xhx.module.dept.service.DeptService
;
import
com.mortals.xhx.module.dept.service.DeptService
;
import
com.mortals.xhx.module.perform.model.PerformEffectRecordQuery
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StopWatch
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
...
@@ -42,6 +50,7 @@ import static com.mortals.framework.ap.SysConstains.*;
...
@@ -42,6 +50,7 @@ import static com.mortals.framework.ap.SysConstains.*;
*/
*/
@RestController
@RestController
@RequestMapping
(
"perform/effect/record"
)
@RequestMapping
(
"perform/effect/record"
)
@Slf4j
public
class
PerformEffectRecordController
extends
BaseCRUDJsonBodyMappingController
<
PerformEffectRecordService
,
PerformEffectRecordEntity
,
Long
>
{
public
class
PerformEffectRecordController
extends
BaseCRUDJsonBodyMappingController
<
PerformEffectRecordService
,
PerformEffectRecordEntity
,
Long
>
{
@Autowired
@Autowired
...
@@ -87,4 +96,43 @@ public class PerformEffectRecordController extends BaseCRUDJsonBodyMappingContro
...
@@ -87,4 +96,43 @@ public class PerformEffectRecordController extends BaseCRUDJsonBodyMappingContro
//query.setHappenTimeEnd(DateUtil.formatDate(query.getCreateTime()));
//query.setHappenTimeEnd(DateUtil.formatDate(query.getCreateTime()));
}
}
}
}
@PostMapping
(
value
=
"/sync"
)
@UnAuth
public
Rest
<
String
>
syncEffectRecord
(
@RequestBody
PerformEffectRecordQuery
query
)
{
Rest
<
String
>
ret
=
new
Rest
();
Map
<
String
,
Object
>
model
=
new
HashMap
();
Context
context
=
this
.
getContext
();
String
busiDesc
=
"查询"
+
this
.
getModuleDesc
();
int
code
=
1
;
try
{
//天数区间分段计算
DateTime
attendStart
=
DateUtil
.
parseDate
(
query
.
getHappenTimeStart
());
DateTime
attendEnd
=
DateUtil
.
parseDate
(
query
.
getHappenTimeEnd
());
Long
compare
=
DateUtil
.
between
(
attendEnd
,
attendStart
,
DateUnit
.
DAY
);
StopWatch
stopWatch
=
new
StopWatch
(
"stopwatch attend1"
);
log
.
info
(
"效能同步计算天数区间:{}"
,
compare
);
for
(
int
i
=
0
;
i
<=
compare
.
intValue
();
i
++)
{
DateTime
curDate
=
DateUtil
.
offsetDay
(
attendStart
,
i
);
log
.
info
(
"效能同步记录日期:{}"
,
curDate
.
toDateStr
());
stopWatch
.
start
(
"执行本地方法"
);
stopWatch
.
stop
();
log
.
info
(
"效能同步记录日期:{} 完成,耗时:{}ms"
,
curDate
.
toDateStr
(),
stopWatch
.
getLastTaskTimeMillis
());
}
model
.
put
(
"message_info"
,
busiDesc
+
"成功"
);
this
.
recordSysLog
(
this
.
request
,
busiDesc
+
" 【成功】"
);
}
catch
(
Exception
e
)
{
code
=
-
1
;
this
.
doException
(
this
.
request
,
busiDesc
,
model
,
e
);
model
.
put
(
"message_info"
,
e
.
getMessage
());
}
this
.
init
(
model
,
context
);
ret
.
setCode
(
code
);
ret
.
setMsg
(
model
.
get
(
"message_info"
)
==
null
?
""
:
model
.
remove
(
"message_info"
).
toString
());
return
ret
;
}
}
}
\ No newline at end of file
attendance-performance-manager/src/test/java/com/mortals/httpclient/attendance/AttendanceRecordErrorController.http
View file @
54203264
...
@@ -19,8 +19,8 @@ POST {{baseUrl}}/attendance/record/error/doReprocess
...
@@ -19,8 +19,8 @@ POST {{baseUrl}}/attendance/record/error/doReprocess
Content-Type: application/json
Content-Type: application/json
{
{
"errorDateTimeStart":"2024-0
1
-01",
"errorDateTimeStart":"2024-0
2
-01",
"errorDateTimeEnd":"2024-0
1-30
"
"errorDateTimeEnd":"2024-0
2-29
"
}
}
...
...
attendance-performance-manager/src/test/java/com/mortals/httpclient/system.http
View file @
54203264
...
@@ -34,17 +34,15 @@ Content-Type: application/json
...
@@ -34,17 +34,15 @@ Content-Type: application/json
###海康考勤打卡记录计算
###海康考勤打卡记录计算
POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
Authorization: {{authToken}}
Content-Type: application/json
Content-Type: application/json
{
{
"attendanceDateStart":"2024-0
3
-01",
"attendanceDateStart":"2024-0
2
-01",
"attendanceDateEnd":"2024-0
3-13
"
"attendanceDateEnd":"2024-0
2-02
"
}
}
###海康考勤打卡记录计算1
###海康考勤打卡记录计算1
POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
Authorization: {{authToken}}
Content-Type: application/json
Content-Type: application/json
{
{
...
@@ -77,10 +75,10 @@ Content-Type: application/json
...
@@ -77,10 +75,10 @@ Content-Type: application/json
###考勤汇总计算
###考勤汇总计算
POST {{baseUrl}}/
/
attendance/stat/summary
POST {{baseUrl}}/attendance/stat/summary
Content-Type: application/json
Content-Type: application/json
{"summaryTimeStart":"2024-03-
01","summaryTimeEnd":"2024-03-13
"}
{"summaryTimeStart":"2024-03-
15","summaryTimeEnd":"2024-03-15
"}
###短信设置编辑
###短信设置编辑
...
...
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