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 58ab96d5
authored
Oct 30, 2023
by
刘鑫
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor(工作队容量): 修改为单技能
1 parent
4f138650
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
41 additions
and
54 deletions
project-order/src/main/java/com/dituhui/pea/order/common/jackson/DateUtil.java
project-order/src/main/java/com/dituhui/pea/order/service/CapacityQueryService.java
project-order/src/main/java/com/dituhui/pea/order/service/impl/CapacityQueryServiceImpl.java
project-order/src/main/java/com/dituhui/pea/order/common/jackson/DateUtil.java
View file @
58ab96d
...
@@ -503,8 +503,6 @@ public class DateUtil {
...
@@ -503,8 +503,6 @@ public class DateUtil {
/**
/**
* 按照分钟切割时间区间
* 按照分钟切割时间区间
*
*
*/
*/
public
static
List
<
DateSplit
>
splitByMinute
(
Date
startTime
,
Date
endTime
,
int
intervalMinutes
)
{
public
static
List
<
DateSplit
>
splitByMinute
(
Date
startTime
,
Date
endTime
,
int
intervalMinutes
)
{
if
(
endTime
.
getTime
()
<=
startTime
.
getTime
())
{
if
(
endTime
.
getTime
()
<=
startTime
.
getTime
())
{
...
@@ -539,13 +537,19 @@ public class DateUtil {
...
@@ -539,13 +537,19 @@ public class DateUtil {
/**
/**
* 按照小时切割时间区间
* 按照小时切割时间区间
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param intervalHours 时间片大小 (小时)
* @param splitAdjacency 相邻时间片间隔(小时),此值必须小于等于 'intervalHours' 值且大于等于0
* @return 返回对应的时间片
*/
*/
public
static
List
<
DateSplit
>
splitByHour
(
Date
startTime
,
Date
endTime
,
int
intervalHours
)
{
public
static
List
<
DateSplit
>
splitByHour
(
Date
startTime
,
Date
endTime
,
int
intervalHours
,
int
splitAdjacency
)
{
if
(
endTime
.
getTime
()
<=
startTime
.
getTime
())
{
if
(
endTime
.
getTime
()
<=
startTime
.
getTime
())
{
return
Collections
.
emptyList
();
return
Collections
.
emptyList
();
}
}
List
<
DateSplit
>
dateSplits
=
new
ArrayList
<>(
24
);
List
<
DateSplit
>
dateSplits
=
new
ArrayList
<>(
60
);
DateSplit
param
=
new
DateSplit
();
DateSplit
param
=
new
DateSplit
();
param
.
setStartDateTime
(
startTime
);
param
.
setStartDateTime
(
startTime
);
...
@@ -561,7 +565,7 @@ public class DateUtil {
...
@@ -561,7 +565,7 @@ public class DateUtil {
dateSplits
.
add
(
new
DateSplit
(
param
.
getStartDateTime
(),
param
.
getEndDateTime
()));
dateSplits
.
add
(
new
DateSplit
(
param
.
getStartDateTime
(),
param
.
getEndDateTime
()));
startTime
=
addHours
(
startTime
,
intervalHours
);
startTime
=
addHours
(
startTime
,
splitAdjacency
);
if
(
startTime
.
getTime
()
>=
endTime
.
getTime
())
{
if
(
startTime
.
getTime
()
>=
endTime
.
getTime
())
{
break
;
break
;
}
}
...
@@ -575,9 +579,11 @@ public class DateUtil {
...
@@ -575,9 +579,11 @@ public class DateUtil {
private
static
Date
addMinute
(
Date
date
,
int
minute
)
{
private
static
Date
addMinute
(
Date
date
,
int
minute
)
{
return
add
(
date
,
Calendar
.
MINUTE
,
minute
);
return
add
(
date
,
Calendar
.
MINUTE
,
minute
);
}
}
private
static
Date
addHours
(
Date
date
,
int
hours
)
{
private
static
Date
addHours
(
Date
date
,
int
hours
)
{
return
add
(
date
,
Calendar
.
HOUR_OF_DAY
,
hours
);
return
add
(
date
,
Calendar
.
HOUR_OF_DAY
,
hours
);
}
}
private
static
Date
add
(
final
Date
date
,
final
int
calendarField
,
final
int
amount
)
{
private
static
Date
add
(
final
Date
date
,
final
int
calendarField
,
final
int
amount
)
{
final
Calendar
c
=
Calendar
.
getInstance
();
final
Calendar
c
=
Calendar
.
getInstance
();
c
.
setTime
(
date
);
c
.
setTime
(
date
);
...
...
project-order/src/main/java/com/dituhui/pea/order/service/CapacityQueryService.java
View file @
58ab96d
...
@@ -28,13 +28,13 @@ public interface CapacityQueryService {
...
@@ -28,13 +28,13 @@ public interface CapacityQueryService {
* 根据工作队,时间段,技能、品牌,服务类型查容量
* 根据工作队,时间段,技能、品牌,服务类型查容量
*
*
* @param teamId 工作队
* @param teamId 工作队
* @param service
s
服务技能信息, 包含品牌, 产品类型, 服务技能--汉字
* @param service 服务技能信息, 包含品牌, 产品类型, 服务技能--汉字
* @param targetDate 时间段对应的日期
* @param targetDate 时间段对应的日期
* @param startTime 开始时间
* @param startTime 开始时间
* @param endTime 结束时间
* @param endTime 结束时间
* @return 日期对应时间段工作队容量
* @return 日期对应时间段工作队容量
*/
*/
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
List
<
CapacityQueryDTO
.
Service
>
services
,
LocalDate
targetDate
,
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
CapacityQueryDTO
.
Service
service
,
LocalDate
targetDate
,
LocalTime
startTime
,
LocalTime
endTime
);
LocalTime
startTime
,
LocalTime
endTime
);
/**
/**
...
@@ -45,7 +45,7 @@ public interface CapacityQueryService {
...
@@ -45,7 +45,7 @@ public interface CapacityQueryService {
* @param targetDate 查询容量的日期
* @param targetDate 查询容量的日期
* @return 工作队指定日期的容量
* @return 工作队指定日期的容量
*/
*/
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
List
<
CapacityQueryDTO
.
Service
>
services
,
LocalDate
targetDate
);
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
CapacityQueryDTO
.
Service
service
,
LocalDate
targetDate
);
/**
/**
* 查询单个工程师指定日期的容量状态
* 查询单个工程师指定日期的容量状态
...
...
project-order/src/main/java/com/dituhui/pea/order/service/impl/CapacityQueryServiceImpl.java
View file @
58ab96d
...
@@ -3,6 +3,7 @@ package com.dituhui.pea.order.service.impl;
...
@@ -3,6 +3,7 @@ package com.dituhui.pea.order.service.impl;
import
com.dituhui.pea.common.Result
;
import
com.dituhui.pea.common.Result
;
import
com.dituhui.pea.enums.StatusCodeEnum
;
import
com.dituhui.pea.enums.StatusCodeEnum
;
import
com.dituhui.pea.order.common.CapacityUtils
;
import
com.dituhui.pea.order.common.CapacityUtils
;
import
com.dituhui.pea.order.common.DateSplit
;
import
com.dituhui.pea.order.common.DateUtils
;
import
com.dituhui.pea.order.common.DateUtils
;
import
com.dituhui.pea.order.common.EngineerUtils
;
import
com.dituhui.pea.order.common.EngineerUtils
;
import
com.dituhui.pea.order.common.SaasUtils
;
import
com.dituhui.pea.order.common.SaasUtils
;
...
@@ -43,6 +44,7 @@ import java.time.LocalDateTime;
...
@@ -43,6 +44,7 @@ import java.time.LocalDateTime;
import
java.time.LocalTime
;
import
java.time.LocalTime
;
import
java.time.temporal.ChronoUnit
;
import
java.time.temporal.ChronoUnit
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Objects
;
import
java.util.OptionalLong
;
import
java.util.OptionalLong
;
...
@@ -211,71 +213,36 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
...
@@ -211,71 +213,36 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
}
}
@Override
@Override
public
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
List
<
CapacityQueryDTO
.
Service
>
services
,
public
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
CapacityQueryDTO
.
Service
service
,
LocalDate
targetDate
,
LocalTime
startTime
,
LocalTime
endTime
)
{
LocalDate
targetDate
,
LocalTime
startTime
,
LocalTime
endTime
)
{
List
<
SkillInfoEntity
>
querySkillGroup
=
new
ArrayList
<>();
Set
<
EngineerInfoEntity
>
engineerInfoEntities
=
engineerInfoDao
.
listByBrandAndTypeAndSkillAndTeamId
(
service
.
getBrand
(),
Set
<
EngineerInfoEntity
>
allFulfillEngineer
=
Sets
.
newConcurrentHashSet
();
service
.
getProductType
(),
service
.
getServiceType
(),
teamId
);
for
(
CapacityQueryDTO
.
Service
service
:
services
)
{
Set
<
EngineerInfoEntity
>
engineerInfoEntities
=
engineerInfoDao
.
listByBrandAndTypeAndSkillAndTeamId
(
service
.
getBrand
(),
service
.
getProductType
(),
service
.
getServiceType
(),
teamId
);
//查询对应的技能信息
//查询对应的技能信息
SkillInfoEntity
skillInfo
=
skillInfoDao
.
getByBrandAndTypeAndSkill
(
service
.
getBrand
(),
SkillInfoEntity
skillInfo
=
skillInfoDao
.
getByBrandAndTypeAndSkill
(
service
.
getBrand
(),
service
.
getProductType
(),
service
.
getServiceType
());
service
.
getProductType
(),
service
.
getServiceType
());
querySkillGroup
.
add
(
skillInfo
);
allFulfillEngineer
.
addAll
(
engineerInfoEntities
);
}
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
ArrayList
<>();
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
ArrayList
<>();
for
(
EngineerInfoEntity
engineerInfo
:
allFulfillEngineer
)
{
for
(
EngineerInfoEntity
engineerInfo
:
engineerInfoEntities
)
{
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
.
findByWorkdayAndEngineerCode
(
DateTimeUtil
.
formatDate
(
targetDate
),
engineerInfo
.
getEngineerCode
());
.
findByWorkdayAndEngineerCode
(
DateTimeUtil
.
formatDate
(
targetDate
),
engineerInfo
.
getEngineerCode
());
allEngineerTimeSlice
.
addAll
(
engineerTimeSlice
);
allEngineerTimeSlice
.
addAll
(
engineerTimeSlice
);
}
}
log
.
info
(
"[matchCapacityData]【符合技能要求的工程师总数为:{} 个】"
,
allFulfillEngineer
.
size
());
log
.
info
(
"[matchCapacityData]【符合技能要求的工程师总数为:{} 个】"
,
engineerInfoEntities
.
size
());
//计算所有查询技能的所需耗时 (querySkillGroup)
final
int
totalTakeTime
=
querySkillGroup
.
stream
()
.
mapToInt
(
SkillInfoEntity:
:
getTakeTime
)
.
sum
();
return
caculateTargetTimeSlice
(
totalTakeTime
,
"时间段"
,
allEngineerTimeSlice
,
startTime
,
endTime
,
targetDate
);
return
caculateTargetTimeSlice
(
skillInfo
.
getTakeTime
()
,
"时间段"
,
allEngineerTimeSlice
,
startTime
,
endTime
,
targetDate
);
}
}
@Override
@Override
public
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
List
<
CapacityQueryDTO
.
Service
>
services
,
LocalDate
targetDate
)
{
public
CapacityQueryDTO
.
Segment
queryCapacityByTeam
(
String
teamId
,
CapacityQueryDTO
.
Service
service
,
LocalDate
targetDate
)
{
List
<
SkillInfoEntity
>
querySkillGroup
=
new
ArrayList
<>();
Set
<
EngineerInfoEntity
>
allFulfillEngineer
=
Sets
.
newConcurrentHashSet
();
for
(
CapacityQueryDTO
.
Service
service
:
services
)
{
Set
<
EngineerInfoEntity
>
engineerInfoEntities
=
engineerInfoDao
.
listByBrandAndTypeAndSkillAndTeamId
(
service
.
getBrand
(),
service
.
getProductType
(),
service
.
getServiceType
(),
teamId
);
//查询对应的技能信息
SkillInfoEntity
skillInfo
=
skillInfoDao
.
getByBrandAndTypeAndSkill
(
service
.
getBrand
(),
service
.
getProductType
(),
service
.
getServiceType
());
querySkillGroup
.
add
(
skillInfo
);
allFulfillEngineer
.
addAll
(
engineerInfoEntities
);
}
List
<
CapacityEngineerSliceUsedEntity
>
allEngineerTimeSlice
=
new
ArrayList
<>();
for
(
EngineerInfoEntity
engineerInfo
:
allFulfillEngineer
)
{
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
.
findByWorkdayAndEngineerCode
(
DateTimeUtil
.
formatDate
(
targetDate
),
engineerInfo
.
getEngineerCode
());
allEngineerTimeSlice
.
addAll
(
engineerTimeSlice
);
}
log
.
info
(
"[matchCapacityData]【符合技能要求的工程师总数为:{} 个】"
,
allFulfillEngineer
.
size
());
//计算所有查询技能的所需耗时 (querySkillGroup)
final
int
totalTakeTime
=
querySkillGroup
.
stream
()
.
mapToInt
(
SkillInfoEntity:
:
getTakeTime
)
.
sum
();
//获取工作队信息
//获取工作队信息
OrgTeamEntity
team
=
orgTeamDao
.
getByTeamId
(
teamId
);
OrgTeamEntity
team
=
orgTeamDao
.
getByTeamId
(
teamId
);
String
workOn
=
String
.
format
(
"%s:00"
,
team
.
getWorkOn
());
String
workOn
=
String
.
format
(
"%s:00"
,
team
.
getWorkOn
());
String
workOff
=
String
.
format
(
"%s:00"
,
team
.
getWorkOff
());
String
workOff
=
String
.
format
(
"%s:00"
,
team
.
getWorkOff
());
LocalTime
startTime
=
LocalTime
.
parse
(
workOn
,
DateUtil
.
TIME_FORMATTER
);
LocalTime
startTime
=
LocalTime
.
parse
(
workOn
,
DateUtil
.
TIME_FORMATTER
);
LocalTime
endTime
=
LocalTime
.
parse
(
workOff
,
DateUtil
.
TIME_FORMATTER
);
LocalTime
endTime
=
LocalTime
.
parse
(
workOff
,
DateUtil
.
TIME_FORMATTER
);
return
queryCapacityByTeam
(
teamId
,
service
,
targetDate
,
startTime
,
endTime
);
return
caculateTargetTimeSlice
(
totalTakeTime
,
"时间段"
,
allEngineerTimeSlice
,
startTime
,
endTime
,
targetDate
);
}
}
@Override
@Override
...
@@ -423,4 +390,18 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
...
@@ -423,4 +390,18 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
return
brand
;
return
brand
;
}
}
}
}
/**
* 进行时间切片工作
*
* @return 返回相邻间隔的时间段, 相邻时间片跨度一小时, 时间片跨度自定义
*/
private
List
<
TimeSliceEntity
>
sliceTime
(
LocalDate
date
,
LocalTime
startTime
,
LocalTime
endTime
)
{
LocalDateTime
start
=
LocalDateTime
.
of
(
date
,
startTime
);
LocalDateTime
end
=
LocalDateTime
.
of
(
date
,
endTime
);
List
<
DateSplit
>
dateSplits
=
DateUtil
.
splitByHour
(
DateUtil
.
toDate
(
start
),
DateUtil
.
toDate
(
end
),
2
,
1
);
return
Collections
.
emptyList
();
}
}
}
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