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
58f8cd80
Commit
58f8cd80
authored
Dec 28, 2023
by
姬鋆屾
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
http://gitlab.scsmile.cn/zxf/attendance-performance-platform
parents
c5684aa6
494272f1
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
234 additions
and
83 deletions
+234
-83
attendance-performance-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
.../java/com/mortals/xhx/base/login/web/LoginController.java
+17
-14
attendance-performance-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
...er/src/main/java/com/mortals/xhx/common/key/RedisKey.java
+3
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncDoorsEventAfterTaskImpl.java
.../mortals/xhx/daemon/task/SyncDoorsEventAfterTaskImpl.java
+15
-7
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/AttendanceStatService.java
.../xhx/module/attendance/service/AttendanceStatService.java
+4
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceStatServiceImpl.java
...le/attendance/service/impl/AttendanceStatServiceImpl.java
+150
-9
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordController.java
...xhx/module/attendance/web/AttendanceRecordController.java
+45
-53
No files found.
attendance-performance-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
View file @
58f8cd80
...
...
@@ -190,7 +190,10 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
JSONObject
data
=
new
JSONObject
();
String
token
=
authTokenService
.
getToken
(
request
);
HomeStatInfo
homeStatInfo
=
new
HomeStatInfo
();
HomeStatInfo
homeStatInfo
=
cacheService
.
get
(
RedisKey
.
KEY_HOME_STAT_CACHE
,
HomeStatInfo
.
class
);
/* HomeStatInfo homeStatInfo = new HomeStatInfo();
StaffQuery staffQuery = new StaffQuery();
...
...
@@ -207,8 +210,8 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
homeStatInfo.setTotalDeptNum(totalDeptNum);
AttendanceRecordHikQuery hikQuery = new AttendanceRecordHikQuery();
/* hikQuery.setAttendanceDateStart(DateUtil.beginOfMonth(new Date()).toDateStr());
hikQuery.setAttendanceDateEnd(DateUtil.today()); */
*/
/* hikQuery.setAttendanceDateStart(DateUtil.beginOfMonth(new Date()).toDateStr());
hikQuery.setAttendanceDateEnd(DateUtil.today()); */
/*
hikQuery.setAttendanceDateStart(DateUtil.yesterday().toDateStr());
hikQuery.setAttendanceDateEnd(DateUtil.yesterday().toDateStr());
...
...
@@ -222,17 +225,17 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
//获取当月打卡人数,如果存在
/* Long totalCache = cacheService.hget(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.format(new Date(), "yyyy-MM"), Long.class);
*/
/* Long totalCache = cacheService.hget(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.format(new Date(), "yyyy-MM"), Long.class);
if (ObjectUtils.isEmpty(totalCache)) {
totalCache = recordHikService.find(hikQuery).parallelStream().map(item -> item.getStaffId()).distinct().count();
cacheService.hset(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.format(new Date(), "yyyy-MM"), totalCache);
}*/
}*/
/*
/* Long totalCache = cacheService.hget(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.yesterday().toDateStr(), Long.class);
*/
/* Long totalCache = cacheService.hget(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.yesterday().toDateStr(), Long.class);
if (ObjectUtils.isEmpty(totalCache)) {
totalCache = recordHikService.find(hikQuery).parallelStream().map(item -> item.getStaffId()).distinct().count();
cacheService.hset(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.yesterday().toDateStr(), totalCache);
}*/
}*/
/*
//迟到次数
...
...
@@ -260,14 +263,14 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
.count();
/* AttendanceVacationRecordQuery vacationRecordQuery = new AttendanceVacationRecordQuery();
*/
/* AttendanceVacationRecordQuery vacationRecordQuery = new AttendanceVacationRecordQuery();
vacationRecordQuery.setCreateTimeStart(DateUtil.beginOfMonth(new Date()).toDateStr());
vacationRecordQuery.setCreateTimeEnd(DateUtil.today());
int levealPersonNum = vacationRecordService.count(vacationRecordQuery, getContext());*/
int levealPersonNum = vacationRecordService.count(vacationRecordQuery, getContext());*/
/*
AttendanceLeaveRecordQuery leaveRecordQuery = new AttendanceLeaveRecordQuery();
/* leaveRecordQuery.setCreateTimeStart(DateUtil.beginOfMonth(new Date()).toDateStr());
leaveRecordQuery.setCreateTimeEnd(DateUtil.today());*/
*/
/* leaveRecordQuery.setCreateTimeStart(DateUtil.beginOfMonth(new Date()).toDateStr());
leaveRecordQuery.setCreateTimeEnd(DateUtil.today());*/
/*
leaveRecordQuery.setCreateTimeStart(DateUtil.yesterday().toDateStr());
leaveRecordQuery.setCreateTimeEnd(DateUtil.yesterday().toDateStr());
leaveRecordQuery.setProcessStatus(ProcessStatusEnum.已处理.getValue());
...
...
@@ -275,12 +278,12 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
//总打卡记录
/* long totalAttend = attendanceRecordEntities.parallelStream().flatMap(item -> item.getAttendanceRecordDetailList().parallelStream()).count();
*/
/* long totalAttend = attendanceRecordEntities.parallelStream().flatMap(item -> item.getAttendanceRecordDetailList().parallelStream()).count();
long lackOfCardsAttend = attendanceRecordEntities.parallelStream()
.flatMap(item -> item.getAttendanceRecordDetailList().stream())
.filter(f -> GoWorkResultEnum.缺卡.getValue() == f.getGoWorkResult() || OffWorkResultEnum.缺卡.getValue() == f.getOffWorkResult())
.count();*/
.count();*/
/*
//异常考勤记录
//未考勤
// long noAtt=lackOfCards;
...
...
@@ -298,7 +301,7 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
homeStatInfo.setLatePersonNum(beLate);
homeStatInfo.setLeftEarlyPersonNum(leaveEarly);
homeStatInfo.setMissCardPersonNum(lackOfCards);
homeStatInfo
.
setAttendPersonNum
(
totalAttendPersonNum
);
homeStatInfo.setAttendPersonNum(totalAttendPersonNum);
*/
data
.
put
(
"homeStat"
,
homeStatInfo
);
data
.
put
(
"token"
,
token
);
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
View file @
58f8cd80
...
...
@@ -26,4 +26,7 @@ public class RedisKey {
/** 考勤统计 **/
public
static
final
String
KEY_ATTENDANCE_STAT_CACHE
=
"attendance:stat"
;
public
static
final
String
KEY_HOME_STAT_CACHE
=
"attendance:home:stat"
;
}
attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncDoorsEventAfterTaskImpl.java
View file @
58f8cd80
...
...
@@ -15,6 +15,7 @@ import com.mortals.xhx.common.code.YesNoEnum;
import
com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity
;
import
com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery
;
import
com.mortals.xhx.module.attendance.service.AttendanceRecordHikService
;
import
com.mortals.xhx.module.attendance.service.AttendanceStatService
;
import
com.mortals.xhx.module.hik.door.model.req.door.DoorEventReq
;
import
com.mortals.xhx.module.hik.door.model.rsp.door.DoorEventDataInfo
;
import
com.mortals.xhx.module.hik.door.service.IHikDoorService
;
...
...
@@ -46,23 +47,30 @@ public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService {
@Autowired
private
IHikDoorService
hikDoorService
;
@Autowired
private
AttendanceStatService
attendanceStatService
;
@Override
public
void
excuteTask
(
ITask
task
)
throws
AppException
{
// syncDoorEvents();
// syncDoorEvents();
//判断时间段 不在时间段的 不做计算
//早上9点 子晚上8点 计算
Date
beginDateTime
=
DateUtil
.
parseDateTime
(
DateUtil
.
today
()+
" 09:00:00"
);
Date
endDateTime
=
DateUtil
.
parseDateTime
(
DateUtil
.
today
()+
" 20:30:00"
);
Date
beginDateTime
=
DateUtil
.
parseDateTime
(
DateUtil
.
today
()
+
" 09:00:00"
);
Date
endDateTime
=
DateUtil
.
parseDateTime
(
DateUtil
.
today
()
+
" 20:30:00"
);
boolean
in
=
DateUtil
.
isIn
(
new
Date
(),
beginDateTime
,
endDateTime
);
if
(
in
)
{
calculateAttendByDay
();
}
if
(
in
)
{
calculateAttendByDay
();
}
//统计当日
log
.
info
(
"统计当日考勤"
);
attendanceStatService
.
homeStat
(
null
);
log
.
info
(
"统计当日考勤结束"
);
}
private
void
calculateAttendByDay
()
{
Context
context
=
new
Context
();
UserEntity
userEntity
=
new
UserEntity
();
...
...
@@ -115,7 +123,7 @@ public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService {
doorEventReq
.
setPageNo
(
i
);
doorEventReq
.
setPageSize
(
1000
);
doorEventsRest
=
hikDoorService
.
getDoorEvents
(
doorEventReq
);
// log.info("doorEventsRest:{} msg:{},page:{}", doorEventsRest.getCode(), doorEventsRest.getMsg(), doorEventReq.getPageNo());
// log.info("doorEventsRest:{} msg:{},page:{}", doorEventsRest.getCode(), doorEventsRest.getMsg(), doorEventReq.getPageNo());
getDoorEvents
(
doorEventsRest
);
}
}
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/AttendanceStatService.java
View file @
58f8cd80
...
...
@@ -24,4 +24,8 @@ public interface AttendanceStatService extends ICRUDService<AttendanceStatEntity
void
doAttendanceSummary
(
AttendanceSummaryQuery
query
);
Result
<
AttendanceStatEntity
>
findExt
(
AttendanceSummaryQuery
params
,
PageInfo
pageInfo
,
Context
context
)
throws
AppException
;
void
homeStat
(
Context
context
)
throws
AppException
;
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceStatServiceImpl.java
View file @
58f8cd80
package
com.mortals.xhx.module.attendance.service.impl
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.mortals.framework.model.PageInfo
;
import
com.mortals.framework.model.Result
;
import
com.mortals.framework.service.ICacheService
;
import
com.mortals.framework.util.DateUtils
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.xhx.common.code.GoWorkResultEnum
;
import
com.mortals.xhx.common.code.LeaveTypeEnum
;
import
com.mortals.xhx.common.code.OffWorkResultEnum
;
import
com.mortals.xhx.common.code.ProcessStatusEnum
;
import
com.mortals.xhx.common.key.RedisKey
;
import
com.mortals.xhx.common.pdu.HomeStatInfo
;
import
com.mortals.xhx.common.utils.BeanUtil
;
import
com.mortals.xhx.module.attendance.dao.AttendanceSummaryDao
;
import
com.mortals.xhx.module.attendance.model.AttendanceStaffStatEntity
;
import
com.mortals.xhx.module.attendance.model.AttendanceStaffStatQuery
;
import
com.mortals.xhx.module.attendance.model.AttendanceStatQuery
;
import
com.mortals.xhx.module.attendance.model.*
;
import
com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery
;
import
com.mortals.xhx.module.attendance.model.vo.ErrorSummaryVo
;
import
com.mortals.xhx.module.attendance.model.vo.LeaveSummaryVo
;
import
com.mortals.xhx.module.attendance.model.vo.VacationBalanceSummaryVo
;
import
com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService
;
import
com.mortals.xhx.module.attendance.service.AttendanceRecordService
;
import
com.mortals.xhx.module.attendance.service.AttendanceStaffStatService
;
import
com.mortals.xhx.module.dept.model.DeptQuery
;
import
com.mortals.xhx.module.dept.service.DeptService
;
import
com.mortals.xhx.module.holiday.model.HolidayEntity
;
import
com.mortals.xhx.module.holiday.model.HolidayQuery
;
import
com.mortals.xhx.module.holiday.service.HolidayService
;
import
com.mortals.xhx.module.staff.model.StaffQuery
;
import
com.mortals.xhx.module.staff.service.StaffService
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.cache.CacheProperties
;
import
org.springframework.stereotype.Service
;
import
com.mortals.framework.service.impl.AbstractCRUDServiceImpl
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.Context
;
import
com.mortals.xhx.module.attendance.dao.AttendanceStatDao
;
import
com.mortals.xhx.module.attendance.model.AttendanceStatEntity
;
import
com.mortals.xhx.module.attendance.service.AttendanceStatService
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.util.Arrays
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -52,6 +64,19 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
@Autowired
private
HolidayService
holidayService
;
@Autowired
private
StaffService
staffService
;
@Autowired
private
DeptService
deptService
;
@Autowired
private
AttendanceRecordService
recordService
;
@Autowired
private
AttendanceLeaveRecordService
leaveRecordService
;
@Autowired
private
ICacheService
cacheService
;
@Override
protected
void
findAfter
(
AttendanceStatEntity
entity
,
Context
context
,
List
<
AttendanceStatEntity
>
list
)
throws
AppException
{
// DateUtil.parse(entity.getStartTime()).year();
...
...
@@ -169,12 +194,12 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
holidayQuery
.
setStartTimeStart
(
query
.
getSummaryTime
());
holidayQuery
.
setStartTimeEnd
(
query
.
getSummaryTime
());
HolidayEntity
holidayEntity
=
holidayService
.
selectOne
(
holidayQuery
);
if
(
holidayEntity
!=
null
)
{
if
(
holidayEntity
.
getWorkorholiday
()==
0
)
{
if
(
holidayEntity
!=
null
)
{
if
(
holidayEntity
.
getWorkorholiday
()
==
0
)
{
//特定节假日
isReturn
=
true
;
}
}
else
{
}
else
{
//判断是否为周末
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
DateUtils
.
StrToDate
(
query
.
getSummaryTime
()));
...
...
@@ -189,7 +214,7 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
//当天不统计
isReturn
=
true
;
}
if
(
isReturn
)
{
if
(
isReturn
)
{
return
;
}
log
.
info
(
"开始汇总["
+
query
.
getSummaryTime
()
+
"]考勤....."
);
...
...
@@ -231,7 +256,7 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
if
(
temp
!=
null
)
{
BeanUtils
.
copyProperties
(
item
,
temp
,
BeanUtil
.
getNullPropertyNames
(
item
));
temp
.
setGoTimes
(
0
);
//默认只要有异常考勤,当天就不算全勤
if
(
item
.
getMorningTimes
()>
0
)
{
if
(
item
.
getMorningTimes
()
>
0
)
{
temp
.
setNonCompliancePunch
(
new
BigDecimal
(
item
.
getMorningTimes
()));
}
this
.
dao
.
update
(
temp
);
...
...
@@ -432,4 +457,120 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
return
result
;
}
@Override
public
void
homeStat
(
Context
context
)
throws
AppException
{
HomeStatInfo
homeStatInfo
=
new
HomeStatInfo
();
StaffQuery
staffQuery
=
new
StaffQuery
();
staffQuery
.
setStatusNotList
(
Arrays
.
asList
(
3
));
int
totalPersonNum
=
staffService
.
count
(
staffQuery
,
context
);
homeStatInfo
.
setTotalPersonNum
(
totalPersonNum
);
staffQuery
.
setSource
(
1
);
Integer
totalAttendPersonNum
=
staffService
.
count
(
staffQuery
,
context
);
int
totalDeptNum
=
deptService
.
count
(
new
DeptQuery
(),
context
);
homeStatInfo
.
setTotalDeptNum
(
totalDeptNum
);
AttendanceRecordHikQuery
hikQuery
=
new
AttendanceRecordHikQuery
();
/* hikQuery.setAttendanceDateStart(DateUtil.beginOfMonth(new Date()).toDateStr());
hikQuery.setAttendanceDateEnd(DateUtil.today()); */
hikQuery
.
setAttendanceDateStart
(
DateUtil
.
yesterday
().
toDateStr
());
hikQuery
.
setAttendanceDateEnd
(
DateUtil
.
yesterday
().
toDateStr
());
AttendanceRecordQuery
attendanceRecordQuery
=
new
AttendanceRecordQuery
();
// attendanceRecordQuery.setAttendanceDateStart(DateUtil.beginOfMonth(new Date()).toDateStr());
//attendanceRecordQuery.setAttendanceDateEnd(DateUtil.today());
attendanceRecordQuery
.
setAttendanceDateStart
(
DateUtil
.
yesterday
().
toDateStr
());
attendanceRecordQuery
.
setAttendanceDateEnd
(
DateUtil
.
yesterday
().
toDateStr
());
List
<
AttendanceRecordEntity
>
attendanceRecordEntities
=
recordService
.
find
(
attendanceRecordQuery
);
//获取当月打卡人数,如果存在
/* Long totalCache = cacheService.hget(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.format(new Date(), "yyyy-MM"), Long.class);
if (ObjectUtils.isEmpty(totalCache)) {
totalCache = recordHikService.find(hikQuery).parallelStream().map(item -> item.getStaffId()).distinct().count();
cacheService.hset(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.format(new Date(), "yyyy-MM"), totalCache);
}*/
/* Long totalCache = cacheService.hget(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.yesterday().toDateStr(), Long.class);
if (ObjectUtils.isEmpty(totalCache)) {
totalCache = recordHikService.find(hikQuery).parallelStream().map(item -> item.getStaffId()).distinct().count();
cacheService.hset(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.yesterday().toDateStr(), totalCache);
}*/
//迟到次数
long
beLate
=
attendanceRecordEntities
.
parallelStream
()
.
flatMap
(
item
->
item
.
getAttendanceRecordDetailList
().
stream
())
.
filter
(
f
->
GoWorkResultEnum
.
迟到
.
getValue
()
==
f
.
getGoWorkResult
()
||
OffWorkResultEnum
.
迟到
.
getValue
()
==
f
.
getOffWorkResult
())
.
map
(
i
->
i
.
getStaffId
())
.
distinct
()
.
count
();
//早退次数
long
leaveEarly
=
attendanceRecordEntities
.
parallelStream
()
.
flatMap
(
item
->
item
.
getAttendanceRecordDetailList
().
stream
())
.
filter
(
f
->
GoWorkResultEnum
.
早退
.
getValue
()
==
f
.
getGoWorkResult
()
||
OffWorkResultEnum
.
早退
.
getValue
()
==
f
.
getOffWorkResult
())
.
map
(
i
->
i
.
getStaffId
())
.
distinct
()
.
count
();
//缺卡次数
long
lackOfCards
=
attendanceRecordEntities
.
parallelStream
()
.
flatMap
(
item
->
item
.
getAttendanceRecordDetailList
().
stream
())
.
filter
(
f
->
GoWorkResultEnum
.
缺卡
.
getValue
()
==
f
.
getGoWorkResult
()
||
OffWorkResultEnum
.
缺卡
.
getValue
()
==
f
.
getOffWorkResult
())
.
map
(
i
->
i
.
getStaffId
())
.
distinct
()
.
count
();
/* AttendanceVacationRecordQuery vacationRecordQuery = new AttendanceVacationRecordQuery();
vacationRecordQuery.setCreateTimeStart(DateUtil.beginOfMonth(new Date()).toDateStr());
vacationRecordQuery.setCreateTimeEnd(DateUtil.today());
int levealPersonNum = vacationRecordService.count(vacationRecordQuery, getContext());*/
AttendanceLeaveRecordQuery
leaveRecordQuery
=
new
AttendanceLeaveRecordQuery
();
/* leaveRecordQuery.setCreateTimeStart(DateUtil.beginOfMonth(new Date()).toDateStr());
leaveRecordQuery.setCreateTimeEnd(DateUtil.today());*/
leaveRecordQuery
.
setCreateTimeStart
(
DateUtil
.
yesterday
().
toDateStr
());
leaveRecordQuery
.
setCreateTimeEnd
(
DateUtil
.
yesterday
().
toDateStr
());
leaveRecordQuery
.
setProcessStatus
(
ProcessStatusEnum
.
已处理
.
getValue
());
int
levealPersonNum
=
leaveRecordService
.
count
(
leaveRecordQuery
,
context
);
//总打卡记录
/* long totalAttend = attendanceRecordEntities.parallelStream().flatMap(item -> item.getAttendanceRecordDetailList().parallelStream()).count();
long lackOfCardsAttend = attendanceRecordEntities.parallelStream()
.flatMap(item -> item.getAttendanceRecordDetailList().stream())
.filter(f -> GoWorkResultEnum.缺卡.getValue() == f.getGoWorkResult() || OffWorkResultEnum.缺卡.getValue() == f.getOffWorkResult())
.count();*/
//异常考勤记录
//未考勤
// long noAtt=lackOfCards;
long
att
=
totalAttendPersonNum
-
lackOfCards
;
// long att = totalAttend - lackOfCardsAttend;
if
(
att
!=
0L
)
{
BigDecimal
bigDecimal
=
new
BigDecimal
(
att
).
divide
(
new
BigDecimal
(
totalAttendPersonNum
),
4
,
BigDecimal
.
ROUND_CEILING
).
multiply
(
new
BigDecimal
(
100
)).
setScale
(
2
,
BigDecimal
.
ROUND_CEILING
);
homeStatInfo
.
setAttendRadio
(
bigDecimal
.
toString
()
+
"%"
);
}
else
{
homeStatInfo
.
setAttendRadio
(
"0%"
);
}
homeStatInfo
.
setLevealPersonNum
(
levealPersonNum
);
homeStatInfo
.
setLatePersonNum
(
beLate
);
homeStatInfo
.
setLeftEarlyPersonNum
(
leaveEarly
);
homeStatInfo
.
setMissCardPersonNum
(
lackOfCards
);
homeStatInfo
.
setAttendPersonNum
(
totalAttendPersonNum
);
cacheService
.
set
(
RedisKey
.
KEY_HOME_STAT_CACHE
,
JSON
.
toJSONString
(
homeStatInfo
));
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordController.java
View file @
58f8cd80
package
com.mortals.xhx.module.attendance.web
;
import
cn.hutool.core.collection.ListUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.ReflectUtil
;
import
com.alibaba.fastjson.JSONObject
;
...
...
@@ -50,6 +51,9 @@ import java.io.IOException;
import
java.io.InputStream
;
import
java.lang.reflect.Field
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.function.Function
;
import
java.util.function.Predicate
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -338,16 +342,55 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
super
.
doListBefore
(
query
,
model
,
context
);
}
static
<
T
>
Predicate
<
T
>
distinctByKey
(
Function
<?
super
T
,
?>
keyExtractor
)
{
Map
<
Object
,
Boolean
>
seen
=
new
ConcurrentHashMap
<>();
//putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。
//如果返回null表示添加数据成功(不重复),不重复(null==null :TRUE)
return
t
->
seen
.
putIfAbsent
(
keyExtractor
.
apply
(
t
),
Boolean
.
TRUE
)
==
null
;
}
@Override
protected
int
doListAfter
(
AttendanceRecordEntity
query
,
Map
<
String
,
Object
>
model
,
Context
context
)
throws
AppException
{
List
<
AttendanceRecordEntity
>
list
=
(
List
<
AttendanceRecordEntity
>)
model
.
get
(
KEY_RESULT_DATA
);
//求出列表中最多detail 的 添加动态列
List
<
AttendanceRecordDetailEntity
>
collect
=
list
.
parallelStream
()
.
flatMap
(
item
->
item
.
getAttendanceRecordDetailList
().
stream
())
.
distinct
(
)
.
filter
(
distinctByKey
(
f
->
f
.
getOrderNum
())
)
.
sorted
(
Comparator
.
comparingInt
(
AttendanceRecordDetailEntity:
:
getOrderNum
))
.
collect
(
Collectors
.
toList
());
//list.parallelStream().collect(Collectors.groupingBy())
List
<
AttDsyncColumn
>
dsyncColumns
=
new
ArrayList
<>();
/* for (int i = 1; i <= collect.size(); i++) {
AttDsyncColumn attDsyncColumn = new AttDsyncColumn();
attDsyncColumn.setName(String.format("上班%s打卡时间", i));
attDsyncColumn.setProperty("goWorkDate");
attDsyncColumn.setOrderNum(i);
dsyncColumns.add(attDsyncColumn);
attDsyncColumn = new AttDsyncColumn();
attDsyncColumn.setName(String.format("上班%s打卡结果", i));
attDsyncColumn.setProperty("goWorkResult");
attDsyncColumn.setOrderNum(i);
dsyncColumns.add(attDsyncColumn);
attDsyncColumn = new AttDsyncColumn();
attDsyncColumn.setName(String.format("下班%s打卡时间", i));
attDsyncColumn.setProperty("offWorkDate");
attDsyncColumn.setOrderNum(i);
dsyncColumns.add(attDsyncColumn);
attDsyncColumn = new AttDsyncColumn();
attDsyncColumn.setName(String.format("下班%s打卡结果",i));
attDsyncColumn.setProperty("offWorkResult");
attDsyncColumn.setOrderNum(i);
dsyncColumns.add(attDsyncColumn);
}*/
collect
.
forEach
(
item
->
{
AttDsyncColumn
attDsyncColumn
=
new
AttDsyncColumn
();
attDsyncColumn
.
setName
(
String
.
format
(
"上班%s打卡时间"
,
item
.
getOrderNum
()));
...
...
@@ -391,7 +434,7 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
return
null
;
}).
filter
(
f
->
f
!=
null
).
collect
(
Collectors
.
toList
());
if
(
ObjectUtils
.
isEmpty
(
addDetailList
))
{
if
(
!
ObjectUtils
.
isEmpty
(
addDetailList
))
{
recordEntity
.
getAttendanceRecordDetailList
().
addAll
(
addDetailList
);
List
<
AttendanceRecordDetailEntity
>
orderList
=
recordEntity
.
getAttendanceRecordDetailList
().
stream
().
sorted
(
Comparator
.
comparingInt
(
AttendanceRecordDetailEntity:
:
getOrderNum
))
.
collect
(
Collectors
.
toList
());
...
...
@@ -399,57 +442,6 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
}
}
model
.
put
(
"dyncColumns"
,
dsyncColumns
);
/* //出勤情况
//总人数
Integer total = (Integer)model.get("total");
//未出勤
Integer noAtt = 0;
//迟到
Integer beLate = 0;
//早退
Integer leaveEarly = 0;
//缺卡
Integer lackOfCards = 0;
for (AttendanceRecordEntity attendanceRecordEntity : list) {
boolean a = true;
for (AttendanceRecordDetailEntity item : attendanceRecordEntity.getAttendanceRecordDetailList()) {
if (item.getGoWorkResult()==3){
lackOfCards=lackOfCards+1;
}
if (item.getGoWorkResult()==4){
beLate = beLate+1;
}
if (item.getOffWorkResult()==3){
lackOfCards=lackOfCards+1;
}
if (item.getOffWorkResult()==5){
leaveEarly = leaveEarly +1;
}
if (item.getGoWorkResult()!=3 || item.getOffWorkResult()!=3){
a = false;
}
}
if (a){
noAtt = noAtt+1;
}
}
String attPercentage = "";
if (total!=0){
float l = ((total - noAtt) / total)*100;
attPercentage =l+"%";
}else {
attPercentage = "0";
}
AttendanceStatus attendanceStatus = new AttendanceStatus();
attendanceStatus.setNeedAttNum(total);
attendanceStatus.setAttPercentage(attPercentage);
attendanceStatus.setNoAtt(noAtt);
attendanceStatus.setBeLate(beLate);
attendanceStatus.setLeaveEarly(leaveEarly);
attendanceStatus.setLackOfCards(lackOfCards);
model.put("attendanceStatus",attendanceStatus);*/
return
super
.
doListAfter
(
query
,
model
,
context
);
}
...
...
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