Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
yangxiujun
/
paidan_demo
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 528a7d76
authored
Oct 30, 2023
by
刘鑫
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor(容量对外接口): 添加多线程执行单日任务
1 parent
4517df72
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
32 deletions
project-order/src/main/java/com/dituhui/pea/order/common/CapacityUtils.java
project-order/src/main/java/com/dituhui/pea/order/scheduler/CalcEngineerCapacityScheduler.java
project-order/src/main/java/com/dituhui/pea/order/service/impl/CapacityQueryServiceImpl.java
project-order/src/main/java/com/dituhui/pea/order/common/CapacityUtils.java
View file @
528a7d7
...
...
@@ -20,6 +20,9 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.OptionalLong
;
import
java.util.concurrent.ExecutionException
;
import
java.util.concurrent.ForkJoinPool
;
import
java.util.concurrent.ForkJoinTask
;
import
java.util.stream.Collectors
;
@Component
...
...
@@ -72,17 +75,23 @@ public class CapacityUtils {
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
,
LocalDate
date
,
int
totalTakeTime
)
{
ArrayList
<
CapacityQueryDTO
.
Segment
>
segments
=
new
ArrayList
<>();
//半天容量
for
(
TimeSliceEntity
targetTimeSlice
:
typeTimeSlice
)
{
final
LocalTime
targetStartTime
=
LocalTime
.
parse
(
targetTimeSlice
.
getStart
(),
DateUtil
.
TIME_FORMATTER
);
final
LocalTime
targetEndTime
=
LocalTime
.
parse
(
targetTimeSlice
.
getEnd
(),
DateUtil
.
TIME_FORMATTER
);
CapacityQueryDTO
.
Segment
segment
=
caculateTargetTimeSlice
(
totalTakeTime
,
targetTimeSlice
.
getName
(),
engineerTimeSlice
,
targetStartTime
,
targetEndTime
,
date
);
segments
.
add
(
segment
);
ForkJoinPool
forkJoinPool
=
new
ForkJoinPool
(
Runtime
.
getRuntime
().
availableProcessors
());
//容量
ForkJoinTask
<
List
<
CapacityQueryDTO
.
Segment
>>
fork
=
forkJoinPool
.
submit
(()
->
typeTimeSlice
.
parallelStream
()
.
map
(
targetTimeSlice
->
{
final
LocalTime
targetStartTime
=
LocalTime
.
parse
(
targetTimeSlice
.
getStart
(),
DateUtil
.
TIME_FORMATTER
);
final
LocalTime
targetEndTime
=
LocalTime
.
parse
(
targetTimeSlice
.
getEnd
(),
DateUtil
.
TIME_FORMATTER
);
return
caculateTargetTimeSlice
(
totalTakeTime
,
targetTimeSlice
.
getName
(),
engineerTimeSlice
,
targetStartTime
,
targetEndTime
,
date
);
}).
collect
(
Collectors
.
toList
())).
fork
();
try
{
return
fork
.
get
();
}
catch
(
InterruptedException
|
ExecutionException
e
)
{
throw
new
RuntimeException
(
e
);
}
finally
{
forkJoinPool
.
shutdown
();
}
return
segments
;
}
public
static
CapacityQueryDTO
.
Segment
caculateTargetTimeSlice
(
int
totalTakeTime
,
String
timeSliceName
,
...
...
@@ -90,7 +99,7 @@ public class CapacityUtils {
LocalTime
targetStartTime
,
LocalTime
targetEndTime
,
LocalDate
targetDate
)
{
List
<
CapacityEngineerSliceUsedEntity
>
collect
=
engineerTimeSlice
.
s
tream
().
filter
(
t
->
{
List
<
CapacityEngineerSliceUsedEntity
>
collect
=
engineerTimeSlice
.
parallelS
tream
().
filter
(
t
->
{
TimeSliceEntity
timeSlice
=
t
.
getTimmeSlice
();
LocalTime
sliceStartHour
=
LocalTime
.
parse
(
timeSlice
.
getStart
(),
DateUtil
.
TIME_FORMATTER
);
LocalTime
sliceEndHour
=
LocalTime
.
parse
(
timeSlice
.
getEnd
(),
DateUtil
.
TIME_FORMATTER
);
...
...
project-order/src/main/java/com/dituhui/pea/order/scheduler/CalcEngineerCapacityScheduler.java
View file @
528a7d7
...
...
@@ -33,6 +33,7 @@ import java.util.ArrayList;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Set
;
import
java.util.concurrent.TimeUnit
;
import
java.util.stream.Collectors
;
...
...
@@ -123,7 +124,12 @@ public class CalcEngineerCapacityScheduler {
final
TimeSliceEntity
timeSlice
=
sliceCap
.
getTimmeSlice
();
LocalTime
sliceStartLocalTime
=
LocalTime
.
parse
(
timeSlice
.
getStart
(),
DateUtil
.
TIME_FORMATTER
);
LocalTime
sliceEndLocalTime
=
LocalTime
.
parse
(
timeSlice
.
getEnd
(),
DateUtil
.
TIME_FORMATTER
);
long
lengthOfLeave
=
sliceCap
.
getCapTotal
();
if
(
Objects
.
isNull
(
sliceCap
.
getCapTotal
())
||
0
==
sliceCap
.
getCapTotal
())
{
log
.
info
(
"-----------------》工程师{}的时间片总容量为0, 跳过容量计算"
,
engineerCode
);
continue
;
}
long
totalUseTime
=
0
;
long
maxDuration
=
0
;
for
(
OrderInfoEntity
order
:
orders
)
{
LocalTime
planStartTime
=
order
.
getPlanStartTime
().
toLocalTime
();
LocalTime
planEndTime
=
order
.
getPlanEndTime
().
toLocalTime
();
...
...
@@ -135,22 +141,26 @@ public class CalcEngineerCapacityScheduler {
boolean
contains
=
ss
.
contains
(
order
.
getOrderStatus
());
//请假时间仅落在当前时间段内, 当前时间段请假时长为 请假结束时间- 请假开始时间
if
(
startIn
&&
DateTimeUtil
.
isIn
(
planEndTime
,
sliceStartLocalTime
,
sliceEndLocalTime
))
{
l
engthOfLeave
=
contains
?
lengthOfLeave
-
DateTimeUtil
.
betweenTwoTime
(
planStartTime
,
planEndTime
,
TimeUnit
.
MINUTES
)
:
lengthOfLeave
+
DateTimeUtil
.
betweenTwoTime
(
planStartTime
,
planEndTime
,
TimeUnit
.
MINUTES
)
;
l
ong
useTime
=
DateTimeUtil
.
betweenTwoTime
(
planStartTime
,
planEndTime
,
TimeUnit
.
MINUTES
);
totalUseTime
=
contains
?
totalUseTime
+
useTime
:
totalUseTime
-
useTime
;
}
else
if
(
startIn
&&
endAfter
)
{
//落在当前时间段和下一个时间段
l
engthOfLeave
=
contains
?
lengthOfLeave
-
DateTimeUtil
.
betweenTwoTime
(
planStartTime
,
sliceEndLocalTime
,
TimeUnit
.
MINUTES
)
:
lengthOfLeave
+
DateTimeUtil
.
betweenTwoTime
(
planStartTime
,
sliceEndLocalTime
,
TimeUnit
.
MINUTES
)
;
l
ong
useTime
=
DateTimeUtil
.
betweenTwoTime
(
planStartTime
,
sliceEndLocalTime
,
TimeUnit
.
MINUTES
);
totalUseTime
=
contains
?
totalUseTime
+
useTime
:
totalUseTime
-
useTime
;
}
else
if
(
planStartTime
.
isBefore
(
sliceStartLocalTime
)
&&
endAfter
)
{
l
engthOfLeave
=
contains
?
lengthOfLeave
-
DateTimeUtil
.
betweenTwoTime
(
sliceStartLocalTime
,
sliceEndLocalTime
,
TimeUnit
.
MINUTES
):
lengthOfLeave
+
DateTimeUtil
.
betweenTwoTime
(
sliceStartLocalTime
,
sliceEndLocalTime
,
TimeUnit
.
MINUTES
)
;
l
ong
usedTime
=
DateTimeUtil
.
betweenTwoTime
(
sliceStartLocalTime
,
sliceEndLocalTime
,
TimeUnit
.
MINUTES
);
totalUseTime
=
contains
?
totalUseTime
+
usedTime
:
totalUseTime
-
usedTime
;
}
}
sliceCap
.
setCapLeft
(
lengthOfLeave
);
if
(
totalUseTime
<
0
)
{
totalUseTime
=
0
;
}
sliceCap
.
setCapLeft
(
sliceCap
.
getCapTotal
()
-
totalUseTime
);
sliceCap
.
setMaxDuration
(
sliceCap
.
getCapTotal
()
-
totalUseTime
);
}
engineerSliceUsedCapacityDao
.
saveAll
(
engineerTimeSlice
);
}
...
...
project-order/src/main/java/com/dituhui/pea/order/service/impl/CapacityQueryServiceImpl.java
View file @
528a7d7
...
...
@@ -52,6 +52,7 @@ import java.util.Objects;
import
java.util.Set
;
import
java.util.concurrent.ArrayBlockingQueue
;
import
java.util.concurrent.Callable
;
import
java.util.concurrent.CopyOnWriteArrayList
;
import
java.util.concurrent.ExecutionException
;
import
java.util.concurrent.Future
;
import
java.util.concurrent.Semaphore
;
...
...
@@ -134,10 +135,11 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
.
mapToInt
(
SkillInfoEntity:
:
getTakeTime
)
.
sum
();
//查询单个工程师日期范围内的技能容量信息 后加和汇总
List
<
TimeSliceEntity
>
halfDayTypeTimeSlice
=
timeSliceDao
.
findByType
(
"HALF_DAY"
);
List
<
TimeSliceEntity
>
allDayTypeTimeSlice
=
timeSliceDao
.
findByType
(
"ALL_DAY"
);
List
<
TimeSliceEntity
>
timeSliceEntities
=
sliceTime
(
LocalDate
.
now
(),
LocalTime
.
of
(
8
,
0
),
LocalTime
.
of
(
18
,
0
));
CopyOnWriteArrayList
<
TimeSliceEntity
>
halfDayTypeTimeSlice
=
new
CopyOnWriteArrayList
<>(
timeSliceDao
.
findByType
(
"HALF_DAY"
));
CopyOnWriteArrayList
<
TimeSliceEntity
>
allDayTypeTimeSlice
=
new
CopyOnWriteArrayList
<>(
timeSliceDao
.
findByType
(
"ALL_DAY"
));
CopyOnWriteArrayList
<
TimeSliceEntity
>
timeSliceEntities
=
new
CopyOnWriteArrayList
<>(
sliceTime
(
LocalDate
.
now
(),
LocalTime
.
of
(
8
,
0
),
LocalTime
.
of
(
18
,
0
)));
LocalDate
currentDate
=
beginDate
;
//定义返回值
...
...
@@ -187,7 +189,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
SkillInfoEntity
skillInfo
=
skillInfoDao
.
getByBrandAndTypeAndSkill
(
service
.
getBrand
(),
service
.
getProductType
(),
service
.
getServiceType
());
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
ArrayList
<>();
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
CopyOnWrite
ArrayList
<>();
for
(
EngineerInfoEntity
engineerInfo
:
engineerInfoEntities
)
{
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
.
findByWorkdayAndEngineerCode
(
DateTimeUtil
.
formatDate
(
targetDate
),
engineerInfo
.
getEngineerCode
());
...
...
@@ -225,7 +227,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
service
.
getProductType
(),
service
.
getServiceType
());
return
CapacityUtils
.
caculateTargetTimeSlice
(
skillInfo
.
getTakeTime
(),
"时间段"
,
engineerTimeSlice
,
startTime
,
endTime
,
date
);
new
CopyOnWriteArrayList
<>(
engineerTimeSlice
)
,
startTime
,
endTime
,
date
);
}
@Override
...
...
@@ -309,10 +311,10 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
class
Task
implements
Callable
<
CapacityQueryDTO
.
Data
>
{
private
Set
<
EngineerInfoEntity
>
allFulfillEngineer
;
private
LocalDate
currentDate
;
private
List
<
TimeSliceEntity
>
halfDayTypeTimeSlice
;
private
CopyOnWriteArray
List
<
TimeSliceEntity
>
halfDayTypeTimeSlice
;
private
int
totalTakeTime
;
private
List
<
TimeSliceEntity
>
allDayTypeTimeSlice
;
private
List
<
TimeSliceEntity
>
timeSliceEntities
;
private
CopyOnWriteArray
List
<
TimeSliceEntity
>
allDayTypeTimeSlice
;
private
CopyOnWriteArray
List
<
TimeSliceEntity
>
timeSliceEntities
;
private
Semaphore
semaphore
;
@Override
...
...
@@ -334,7 +336,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
List
<
TimeSliceEntity
>
halfDayTypeTimeSlice
,
int
totalTakeTime
,
List
<
TimeSliceEntity
>
allDayTypeTimeSlice
,
List
<
TimeSliceEntity
>
timeSliceEntities
)
{
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
ArrayList
<>();
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
CopyOnWrite
ArrayList
<>();
for
(
EngineerInfoEntity
engineerInfo
:
allFulfillEngineer
)
{
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
.
findByWorkdayAndEngineerCode
(
DateTimeUtil
.
formatDate
(
currentDate
),
engineerInfo
.
getEngineerCode
());
...
...
Write
Preview
Markdown
is supported
Attach a file
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 post a comment