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
0c5c9d31
Commit
0c5c9d31
authored
Aug 16, 2023
by
周亚武
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
工作时间计算接口
parent
006e4091
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
310 additions
and
7 deletions
+310
-7
attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/dingtalk/api/TalkApiController.java
...com/mortals/xhx/busiz/dingtalk/api/TalkApiController.java
+281
-5
attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/dingtalk/req/TimeReq.java
...main/java/com/mortals/xhx/busiz/dingtalk/req/TimeReq.java
+27
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
.../module/attendance/dingmsg/api/DingMessageController.java
+2
-2
No files found.
attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/dingtalk/api/TalkApiController.java
View file @
0c5c9d31
...
@@ -5,17 +5,23 @@ import com.dingtalk.api.DingTalkClient;
...
@@ -5,17 +5,23 @@ import com.dingtalk.api.DingTalkClient;
import
com.dingtalk.api.request.*
;
import
com.dingtalk.api.request.*
;
import
com.dingtalk.api.response.*
;
import
com.dingtalk.api.response.*
;
import
com.mortals.framework.annotation.UnAuth
;
import
com.mortals.framework.annotation.UnAuth
;
import
com.mortals.framework.common.Rest
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.Context
;
import
com.mortals.xhx.busiz.dingtalk.config.TalkConfiguration
;
import
com.mortals.xhx.busiz.dingtalk.config.TalkConfiguration
;
import
com.mortals.xhx.busiz.dingtalk.req.UserPageReq
;
import
com.mortals.xhx.busiz.dingtalk.req.*
;
import
com.mortals.xhx.busiz.dingtalk.req.CodeReq
;
import
com.mortals.xhx.busiz.dingtalk.req.LinkMessageReq
;
import
com.mortals.xhx.busiz.dingtalk.req.MobileReq
;
import
com.mortals.xhx.common.pdu.ApiRespPdu
;
import
com.mortals.xhx.common.pdu.ApiRespPdu
;
import
lombok.Data
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang.time.DateUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.List
;
import
java.math.BigDecimal
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
/**
/**
* 钉钉相关外部接口
* 钉钉相关外部接口
...
@@ -309,4 +315,274 @@ public class TalkApiController {
...
@@ -309,4 +315,274 @@ public class TalkApiController {
return
apiRespPdu
;
return
apiRespPdu
;
}
}
/**
* 根据两个日期计算其中的工作时间 返回单位小时
* @return
*/
@PostMapping
(
"/attendance/getTimeCount"
)
@UnAuth
public
Rest
<
Float
>
getUserInfoByCode
(
@RequestBody
TimeReq
timeReq
){
Rest
<
Float
>
ret
=
new
Rest
();
try
{
String
startTime
=
timeReq
.
getStartTime
();
String
endTime
=
timeReq
.
getEndTime
();
Date
startMoningStart
=
getDate
(
startTime
,
1
);
Date
startMoningEnd
=
getDate
(
startTime
,
2
);
Date
startAfternoonStart
=
getDate
(
startTime
,
3
);
Date
startAfternoonEnd
=
getDate
(
startTime
,
4
);
Date
endMoningStart
=
getDate
(
endTime
,
1
);
Date
endMoningEnd
=
getDate
(
endTime
,
2
);
Date
endAfternoonStart
=
getDate
(
endTime
,
3
);
Date
endAfternoonEnd
=
getDate
(
endTime
,
4
);
SimpleDateFormat
format
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
Date
start
=
format
.
parse
(
startTime
);
Date
end
=
format
.
parse
(
endTime
);
int
hours
=
1000
*
60
*
60
;
float
result
=
0
;
//若开始时间和结束时间是同一天
SimpleDateFormat
simple1
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
simple1
.
format
(
simple1
.
parse
(
startTime
)).
equals
(
simple1
.
format
(
simple1
.
parse
(
endTime
)));
if
(
simple1
.
format
(
simple1
.
parse
(
startTime
)).
equals
(
simple1
.
format
(
simple1
.
parse
(
endTime
)))){
//如果结束时间比上班时间早,或者结束时间比开始时间早 或者开始时间晚于下午下班时间,则出差时长为0
if
(
end
.
getTime
()
<=
startMoningStart
.
getTime
()
||
end
.
getTime
()<=
start
.
getTime
()
||
start
.
getTime
()>=
startAfternoonEnd
.
getTime
()
||
isHolidays
(
startTime
)){
result
=
0
;
System
.
out
.
println
(
"出差时长为:"
+
result
);
ret
.
setCode
(
Rest
.
FAIL
);
ret
.
setMsg
(
"时间不正确"
);
return
ret
;
}
//如果结束时间在上午时间段
if
(
end
.
getTime
()<=
startMoningEnd
.
getTime
()){
//判断开始时间是否早与上午上班时间
if
(
start
.
getTime
()<
startMoningStart
.
getTime
()){
result
=
(
end
.
getTime
()-
startMoningStart
.
getTime
()+
0
f
)/
hours
;
}
else
{
result
=
(
end
.
getTime
()-
start
.
getTime
()+
0
f
)/
hours
;
}
}
//如果结束时间在中午时间段
if
(
end
.
getTime
()>
startMoningEnd
.
getTime
()
&&
end
.
getTime
()<=
startAfternoonStart
.
getTime
()){
//如果开始时间在上午上班之前
if
(
start
.
getTime
()<=
startMoningStart
.
getTime
()){
result
=
4
;
}
else
if
(
start
.
getTime
()>
startMoningStart
.
getTime
()
&&
start
.
getTime
()<
startMoningEnd
.
getTime
()){
//开始时间在上午上班时间段
result
=
(
startMoningEnd
.
getTime
()-
start
.
getTime
()+
0
f
)/
hours
;
}
else
if
(
start
.
getTime
()>=
startMoningStart
.
getTime
())
{
//开始时间也在中午
result
=
0
;
}
}
//如果结束时间在下午上班时间段
if
(
end
.
getTime
()>
startAfternoonStart
.
getTime
()
&&
end
.
getTime
()<=
startAfternoonEnd
.
getTime
()){
if
(
start
.
getTime
()<=
startMoningStart
.
getTime
()){
//如果开始时间在上午上班之前
result
=
4
+
(
end
.
getTime
()-
startAfternoonStart
.
getTime
()+
0
f
)/
hours
;
}
else
if
(
start
.
getTime
()>
startMoningStart
.
getTime
()
&&
start
.
getTime
()<
startMoningEnd
.
getTime
())
{
//如果开始时间在上午上班时间
result
=
(
startMoningEnd
.
getTime
()-
start
.
getTime
()
+
end
.
getTime
()-
startAfternoonStart
.
getTime
()+
0
f
)/
hours
;
}
else
if
(
start
.
getTime
()>=
startMoningEnd
.
getTime
()
&&
start
.
getTime
()<=
startAfternoonStart
.
getTime
())
{
//开始时间在中午时间段
result
=
(
end
.
getTime
()
-
startAfternoonStart
.
getTime
()+
0
f
)/
hours
;
}
else
if
(
start
.
getTime
()>
startAfternoonStart
.
getTime
()){
//开始时间也在下午上班时间段
result
=
(
end
.
getTime
()-
start
.
getTime
()+
0
f
)/
hours
;
}
}
//如果结束时间在下午下班之后
if
(
end
.
getTime
()
>
startAfternoonEnd
.
getTime
()){
if
(
start
.
getTime
()
<=
startMoningStart
.
getTime
()){
//如果开始时间在上午上班之前
result
=
8
;
}
else
if
(
start
.
getTime
()>
startMoningStart
.
getTime
()
&&
start
.
getTime
()<
startMoningEnd
.
getTime
()){
//开始时间在上午上班时间段
result
=
4
+
(
startMoningEnd
.
getTime
()
-
start
.
getTime
()+
0
f
)/
hours
;
}
else
if
(
start
.
getTime
()>=
startMoningEnd
.
getTime
()
&&
start
.
getTime
()<=
startAfternoonStart
.
getTime
())
{
//如果开始时间在中午时间段
result
=
4
;
}
else
if
(
start
.
getTime
()>
startAfternoonStart
.
getTime
()
&&
start
.
getTime
()<
startAfternoonEnd
.
getTime
())
{
//开始时间在下午上班时间段
result
=
(
startAfternoonEnd
.
getTime
()-
start
.
getTime
()+
0
f
)/
hours
;
}
}
}
else
{
if
(
end
.
getTime
()<=
start
.
getTime
()
){
result
=
0
f
;
System
.
out
.
println
(
"出差时长为:"
+
result
);
ret
.
setCode
(
Rest
.
FAIL
);
ret
.
setMsg
(
"开始时间晚于结束时间!"
);
return
ret
;
}
//开始时间和结束时间不在同一天
float
startDayHours
=
getStartDayHours
(
start
,
startMoningStart
,
startMoningEnd
,
startAfternoonStart
,
startAfternoonEnd
);
float
endDayHours
=
8
-
getStartDayHours
(
end
,
endMoningStart
,
endMoningEnd
,
endAfternoonStart
,
endAfternoonEnd
);
//计算开始时间和结束时间之间隔了几天
int
days
=
getDays
(
startTime
,
endTime
);
float
daysHours
=
(
days
-
1
)*
8
;
result
=
daysHours
+
startDayHours
+
endDayHours
;
result
=
deleteHolidays
(
startTime
,
endTime
,
startDayHours
,
endDayHours
,
result
);
}
BigDecimal
bigResult
=
new
BigDecimal
(
result
);
float
finalResult
=
bigResult
.
setScale
(
1
,
BigDecimal
.
ROUND_HALF_UP
).
floatValue
();
System
.
out
.
println
(
"出差时长为:"
+
finalResult
);
ret
.
setCode
(
Rest
.
SUCCESS
);
ret
.
setData
(
finalResult
);
ret
.
setMsg
(
"成功!"
);
return
ret
;
}
catch
(
Exception
e
){
ret
.
setCode
(
Rest
.
FAIL
);
ret
.
setMsg
(
"日期格式不正确"
);
return
ret
;
}
}
//排除出差时长中的节假日时间 这里不考虑休息半天的情况
// 开始时间startTime 结束时间endTime 开始时间当前的时长startDayHours 结束时间当天的时长endDayHours 排除节假日之前的时长
//只有startTime 和endTime不在同一天才调用
private
static
float
deleteHolidays
(
String
startTime
,
String
endTime
,
float
startDayHours
,
float
endDayHours
,
float
hours
)
throws
ParseException
{
float
result
=
hours
+
0
f
;
SimpleDateFormat
format
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
//1判断startTime是否是节假日,周末
if
(
isHolidays
(
startTime
)){
result
=
result
-
startDayHours
;
}
//轮循开始时间到结束时间 当前时间
String
nowDate
=
startTime
;
do
{
nowDate
=
format
.
format
(
DateUtils
.
addDays
(
format
.
parse
(
nowDate
),
1
));
if
(
format
.
format
(
format
.
parse
(
nowDate
)).
equals
(
format
.
format
(
format
.
parse
(
endTime
)))){
break
;
}
if
(
isHolidays
(
nowDate
)){
result
=
result
-
8
;
}
}
while
(
true
);
//
if
(
isHolidays
(
endTime
)){
result
=
result
-
endDayHours
;
}
return
result
;
}
//判断一个日期是否是节假日 或者周末
private
static
boolean
isHolidays
(
String
time
)
throws
ParseException
{
String
queryCalenderSql
=
""
;
//IRowSet query = DbUtil.executeQuery(ctx, queryCalenderSql);
// if(query.next()){
// return true;
// }
//判断是否是周末
SimpleDateFormat
format
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
setTime
(
format
.
parse
(
time
));
if
(
cal
.
get
(
Calendar
.
DAY_OF_WEEK
)==
1
||
cal
.
get
(
Calendar
.
DAY_OF_WEEK
)==
7
){
return
true
;
}
return
false
;
}
private
static
int
getDays
(
String
startTime
,
String
endTime
)
throws
ParseException
{
//计算开始和结束时间之间相差的天数
int
result
=
0
;
SimpleDateFormat
format
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm"
);
Date
start
=
format
.
parse
(
startTime
);
Date
end
=
format
.
parse
(
endTime
);
Calendar
calStart
=
Calendar
.
getInstance
();
calStart
.
setTime
(
start
);
Calendar
calEnd
=
Calendar
.
getInstance
();
calEnd
.
setTime
(
end
);
int
startDay
=
calStart
.
get
(
Calendar
.
DAY_OF_YEAR
);
int
endDay
=
calEnd
.
get
(
Calendar
.
DAY_OF_YEAR
);
int
yearStart
=
calStart
.
get
(
Calendar
.
YEAR
);
int
yearEnd
=
calEnd
.
get
(
Calendar
.
YEAR
);
if
(
yearEnd
!=
yearStart
)
//不同年
{
int
timeDistance
=
0
;
for
(
int
i
=
yearStart
;
i
<
yearEnd
;
i
++)
{
if
(
i
%
4
==
0
&&
i
%
100
!=
0
||
i
%
400
==
0
)
//闰年
{
timeDistance
+=
366
;
}
else
//不是闰年
{
timeDistance
+=
365
;
}
}
System
.
out
.
println
(
timeDistance
+
(
endDay
-
startDay
));
result
=
timeDistance
+
(
endDay
-
startDay
);
}
else
//同一年
{
result
=
endDay
-
startDay
;
System
.
out
.
println
(
"判断day2 - day1 : "
+
(
endDay
-
startDay
));
//return day2-day1;
}
return
result
;
}
//计算开始时间那天的出差时长
private
static
float
getStartDayHours
(
Date
start
,
Date
moningStart
,
Date
moningEnd
,
Date
afternoonStart
,
Date
afternoonEnd
){
float
result
=
0
f
;
//开始时间早与上午上班时间
if
(
start
.
getTime
()<=
moningStart
.
getTime
()){
result
=
8
;
}
else
if
(
start
.
getTime
()>
moningStart
.
getTime
()
&&
start
.
getTime
()
<
moningEnd
.
getTime
()){
//开始时间在上午时间段
result
=
4
+
(
moningEnd
.
getTime
()-
start
.
getTime
()+
0
f
)/(
1000
*
60
*
60
);
}
else
if
(
start
.
getTime
()>=
moningEnd
.
getTime
()
&&
start
.
getTime
()<=
afternoonStart
.
getTime
())
{
//开始时间在中午时间段
result
=
4
;
}
else
if
(
start
.
getTime
()>
afternoonStart
.
getTime
()
&&
start
.
getTime
()<
afternoonEnd
.
getTime
()){
result
=
(
afternoonEnd
.
getTime
()
-
start
.
getTime
()+
0
f
)/(
1000
*
60
*
60
);
}
else
if
(
start
.
getTime
()>=
afternoonEnd
.
getTime
()){
result
=
0
;
}
return
result
;
}
//获取给定日期工作时间
private
static
Date
getDate
(
String
date
,
int
type
)
throws
ParseException
{
Calendar
calendar
=
Calendar
.
getInstance
();
SimpleDateFormat
format
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm"
);
calendar
.
setTime
(
format
.
parse
(
date
));
StringBuilder
result
=
new
StringBuilder
();
if
(
calendar
.
get
(
Calendar
.
MONTH
)<
9
){
result
.
append
(
calendar
.
get
(
Calendar
.
YEAR
)).
append
(
"-0"
);
}
else
{
result
.
append
(
calendar
.
get
(
Calendar
.
YEAR
)).
append
(
"-"
);
}
result
.
append
(
calendar
.
get
(
Calendar
.
MONTH
)+
1
).
append
(
"-"
);
result
.
append
(
calendar
.
get
(
Calendar
.
DATE
)).
append
(
" "
);
//1上午开始时间09:00 ;2上午结束时间12:00 3下午开始时间13:00 4下午结束时间18:00
switch
(
type
){
case
1
:
result
.
append
(
"09:00"
);
break
;
case
2
:
result
.
append
(
"12:00"
);
break
;
case
3
:
result
.
append
(
"13:00"
);
break
;
case
4
:
result
.
append
(
"18:00"
);
break
;
}
return
format
.
parse
(
String
.
valueOf
(
result
));
}
}
}
attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/dingtalk/req/TimeReq.java
0 → 100644
View file @
0c5c9d31
package
com.mortals.xhx.busiz.dingtalk.req
;
/**
* @author ZYW
* @date 2023-07-13 20:11
*/
public
class
TimeReq
{
String
startTime
;
String
endTime
;
public
String
getStartTime
()
{
return
startTime
;
}
public
void
setStartTime
(
String
startTime
)
{
this
.
startTime
=
startTime
;
}
public
String
getEndTime
()
{
return
endTime
;
}
public
void
setEndTime
(
String
endTime
)
{
this
.
endTime
=
endTime
;
}
}
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
View file @
0c5c9d31
...
@@ -170,7 +170,7 @@ public class DingMessageController {
...
@@ -170,7 +170,7 @@ public class DingMessageController {
switch
(
jsonArray
.
get
(
3
).
toString
()){
switch
(
jsonArray
.
get
(
3
).
toString
()){
case
"halfDay"
:
case
"halfDay"
:
case
"day"
:
case
"day"
:
leaveRecordEntity
.
setDuration
((
int
)
(
Float
.
parseFloat
(
jsonArray
.
get
(
2
).
toString
())*
60
*
60
*
9
));
//天转换成秒 一天工作时间9小时
leaveRecordEntity
.
setDuration
((
int
)
(
Float
.
parseFloat
(
jsonArray
.
get
(
2
).
toString
())*
60
*
60
*
8
));
//天转换成秒 一天工作时间9小时
leaveRecordEntity
.
setSourceDingTime
(
jsonArray
.
get
(
2
).
toString
()+
"天"
);
leaveRecordEntity
.
setSourceDingTime
(
jsonArray
.
get
(
2
).
toString
()+
"天"
);
break
;
break
;
default
:
//除了按天和半天计算的假期 其余都是按小时返回
default
:
//除了按天和半天计算的假期 其余都是按小时返回
...
@@ -638,7 +638,7 @@ public class DingMessageController {
...
@@ -638,7 +638,7 @@ public class DingMessageController {
* @return
* @return
*/
*/
private
float
converMillsToDays
(
long
milliseconds
){
private
float
converMillsToDays
(
long
milliseconds
){
float
days
=
((
float
)
milliseconds
)
/
(
60
*
60
*
9
);
float
days
=
((
float
)
milliseconds
)
/
(
60
*
60
*
8
);
return
days
;
return
days
;
}
}
...
...
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