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 94f72061
authored
Oct 29, 2023
by
刘鑫
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(单个工程师容量): 时间切片计算以及时间切片查询
1 parent
949a10fe
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
72 additions
and
21 deletions
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/scheduler/CalcEngineerCapacityScheduler.java
View file @
94f7206
package
com
.
dituhui
.
pea
.
order
.
scheduler
;
import
cn.hutool.core.collection.CollectionUtil
;
import
com.dituhui.pea.order.common.DateUtils
;
import
com.dituhui.pea.order.dao.*
;
import
com.dituhui.pea.order.entity.*
;
import
com.dituhui.pea.order.common.jackson.DateUtil
;
import
com.dituhui.pea.order.dao.CapacityEngineerCalendarDao
;
import
com.dituhui.pea.order.dao.CapacityEngineerStatDao
;
import
com.dituhui.pea.order.dao.EngineerBusinessDao
;
import
com.dituhui.pea.order.dao.EngineerInfoDao
;
import
com.dituhui.pea.order.dao.EngineerSliceUsedCapacityDao
;
import
com.dituhui.pea.order.dao.OrderInfoDao
;
import
com.dituhui.pea.order.dao.TimeSliceDao
;
import
com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity
;
import
com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity
;
import
com.dituhui.pea.order.entity.CapacityEngineerStatEntity
;
import
com.dituhui.pea.order.entity.EngineerBusinessEntity
;
import
com.dituhui.pea.order.entity.EngineerInfoEntity
;
import
com.dituhui.pea.order.entity.OrderInfoEntity
;
import
com.dituhui.pea.order.entity.TimeSliceEntity
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -14,7 +28,14 @@ import org.springframework.stereotype.Component;
import
java.time.Duration
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.time.LocalTime
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
@Slf4j
...
...
@@ -36,6 +57,10 @@ public class CalcEngineerCapacityScheduler {
private
EngineerBusinessDao
engineerBusinessDao
;
@Autowired
private
EngineerInfoDao
engineerInfoDao
;
@Autowired
private
TimeSliceDao
timeSliceDao
;
@Autowired
private
EngineerSliceUsedCapacityDao
engineerSliceUsedCapacityDao
;
@Scheduled
(
cron
=
"${scheduler.calc-engineer-capacity.cron-expr}"
)
public
void
run
()
{
...
...
@@ -58,9 +83,21 @@ public class CalcEngineerCapacityScheduler {
}
private
void
calcOneEngineer
(
String
date
,
String
engineerCode
)
{
CapacityEngineerStatEntity
statEntity
=
capacityEngineerStatDao
.
getByWorkdayAndEngineerCode
(
date
,
engineerCode
);
if
(
statEntity
==
null
)
{
log
.
error
(
"错误:日期[{}]技术员[{}]容量尚未初始化,忽略退出!"
,
date
,
engineerCode
);
return
;
}
Set
<
String
>
ss
=
Set
.
of
(
"CANCELED"
,
"RESCHEDULED"
);
List
<
OrderInfoEntity
>
orders
=
orderInfoDao
.
findByDtAndEngineerCode
(
DateUtils
.
localDateFromStr
(
date
),
engineerCode
);
// 根据capacity_engineer_calendar和order_info,来确定当天剩下的最大连续时间区块;
EngineerBusinessEntity
businessEntity
=
engineerBusinessDao
.
getByEngineerCode
(
engineerCode
);
//TODO 就算单小时时间段工程师技能已用容量存储至时间切片工程师时间表内
//查询时间片容量
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
.
findByWorkdayAndEngineerCode
(
date
,
engineerCode
);
int
used
=
orders
.
stream
().
map
(
e
->
{
if
(
ss
.
contains
(
e
.
getOrderStatus
()))
{
return
0
;
...
...
@@ -71,13 +108,8 @@ public class CalcEngineerCapacityScheduler {
long
cnt
=
orders
.
stream
()
.
filter
(
e
->
!
ss
.
contains
(
e
.
getOrderStatus
()))
.
count
();
long
max
=
getMaxRemainBlock
(
date
,
engineerCode
,
orders
);
long
max
=
getMaxRemainBlock
(
date
,
engineerCode
,
orders
,
businessEntity
);
log
.
info
(
"正在处理: 日期[{}]技术员[{}]容量相关信息 ==> used:{}, orderCnt:{}, maxDuration:{}"
,
date
,
engineerCode
,
used
,
cnt
,
max
);
CapacityEngineerStatEntity
statEntity
=
capacityEngineerStatDao
.
getByWorkdayAndEngineerCode
(
date
,
engineerCode
);
if
(
statEntity
==
null
)
{
log
.
error
(
"错误:日期[{}]技术员[{}]容量尚未初始化,忽略退出!"
,
date
,
engineerCode
);
return
;
}
statEntity
.
setOrderCount
((
int
)
cnt
);
statEntity
.
setCapUsed
(
used
);
statEntity
.
setCapLeft
(
statEntity
.
getCapTotal
()
-
used
);
...
...
@@ -85,10 +117,8 @@ public class CalcEngineerCapacityScheduler {
statEntity
.
setUpdateTime
(
LocalDateTime
.
now
());
capacityEngineerStatDao
.
save
(
statEntity
);
}
private
long
getMaxRemainBlock
(
String
date
,
String
engineerCode
,
List
<
OrderInfoEntity
>
orders
)
{
private
long
getMaxRemainBlock
(
String
date
,
String
engineerCode
,
List
<
OrderInfoEntity
>
orders
,
EngineerBusinessEntity
businessEntity
)
{
// 根据capacity_engineer_calendar和order_info,来确定当天剩下的最大连续时间区块;
EngineerBusinessEntity
businessEntity
=
engineerBusinessDao
.
getByEngineerCode
(
engineerCode
);
LocalDateTime
startTime
=
DateUtils
.
localDateTimeFromStr
(
String
.
format
(
"%s %s:00"
,
date
,
businessEntity
.
getWorkOn
()));
LocalDateTime
endTime
=
DateUtils
.
localDateTimeFromStr
(
String
.
format
(
"%s %s:00"
,
date
,
businessEntity
.
getWorkOff
()));
...
...
project-order/src/main/java/com/dituhui/pea/order/service/impl/CapacityQueryServiceImpl.java
View file @
94f7206
...
...
@@ -6,11 +6,24 @@ import com.dituhui.pea.order.common.CapacityUtils;
import
com.dituhui.pea.order.common.DateUtils
;
import
com.dituhui.pea.order.common.EngineerUtils
;
import
com.dituhui.pea.order.common.SaasUtils
;
import
com.dituhui.pea.order.dao.*
;
import
com.dituhui.pea.order.dao.CapacityEngineerStatDao
;
import
com.dituhui.pea.order.dao.EngineerInfoDao
;
import
com.dituhui.pea.order.dao.EngineerSkillDao
;
import
com.dituhui.pea.order.dao.EngineerSliceUsedCapacityDao
;
import
com.dituhui.pea.order.dao.MapBlockInfoDao
;
import
com.dituhui.pea.order.dao.OrgTeamDao
;
import
com.dituhui.pea.order.dao.SkillInfoDao
;
import
com.dituhui.pea.order.dao.TimeSliceDao
;
import
com.dituhui.pea.order.dto.CapacityOrderQueryDTO
;
import
com.dituhui.pea.order.dto.param.CapacityQueryDTO
;
import
com.dituhui.pea.order.dto.param.Location
;
import
com.dituhui.pea.order.entity.*
;
import
com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity
;
import
com.dituhui.pea.order.entity.CapacityEngineerStatEntity
;
import
com.dituhui.pea.order.entity.EngineerInfoEntity
;
import
com.dituhui.pea.order.entity.EngineerSkillEntity
;
import
com.dituhui.pea.order.entity.MapBlockInfoEntity
;
import
com.dituhui.pea.order.entity.OrgTeamEntity
;
import
com.dituhui.pea.order.entity.SkillInfoEntity
;
import
com.dituhui.pea.order.feign.ISaaSRemoteService
;
import
com.dituhui.pea.order.service.CapacityQueryService
;
import
com.dituhui.pea.pojo.fendan.FendanDTO
;
...
...
@@ -25,6 +38,7 @@ import org.springframework.stereotype.Service;
import
java.time.LocalDate
;
import
java.time.temporal.ChronoUnit
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
...
...
@@ -55,6 +69,10 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
private
EngineerInfoDao
engineerInfoDao
;
@Autowired
private
MapBlockInfoDao
mapBlockInfoDao
;
@Autowired
private
TimeSliceDao
timeSliceDao
;
@Autowired
private
EngineerSliceUsedCapacityDao
engineerSliceUsedCapacityDao
;
@Override
public
Result
<?>
matchCapacityData
(
List
<
CapacityQueryDTO
.
Service
>
services
,
Location
location
,
LocalDate
beginDate
,
LocalDate
endDate
)
{
...
...
@@ -81,7 +99,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
.
collect
(
Collectors
.
toList
());
final
String
groupId
=
groupIdList
.
get
(
0
);
//3. 查询分站下拥有对应技能的工程师(排重)
todo
技能码转换为对应的技能汉字
//3. 查询分站下拥有对应技能的工程师(排重) 技能码转换为对应的技能汉字
List
<
CapacityQueryDTO
.
Service
>
convertServices
=
services
;
List
<
SkillInfoEntity
>
querySkillGroup
=
new
ArrayList
<>();
Set
<
EngineerInfoEntity
>
allFulfillEngineer
=
Sets
.
newConcurrentHashSet
();
...
...
@@ -97,23 +115,26 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
}
log
.
info
(
"[matchCapacityData]【符合技能要求的工程师总数为:{} 个】"
,
allFulfillEngineer
.
size
());
//TODO 计算所有查询技能的所需耗时 (querySkillGroup)
//计算所有查询技能的所需耗时 (querySkillGroup)
int
totalTakeTime
=
querySkillGroup
.
stream
()
.
mapToInt
(
SkillInfoEntity:
:
getTakeTime
)
.
sum
();
//TODO 查询单个工程师日期范围内的技能容量信息 后加和汇总
return
null
;
}
private
List
<?>
getEngineerOneDay
(
String
engineerCode
,
String
date
)
{
List
<
CapacityEngineerSliceUsedEntity
>
engineerTimeSlice
=
engineerSliceUsedCapacityDao
.
findByWorkdayAndEngineerCode
(
date
,
engineerCode
);
return
Collections
.
emptyList
();
}
@Override
public
<
E
>
E
queryEngineerCapacity
(
String
engineerCode
,
LocalDate
date
)
{
return
null
;
}
//TODO 计算单个工程师 单日 多技能容量
private
void
reckonEngineerDaySkillsVolume
(
LocalDate
date
,
EngineerInfoEntity
engineerInfo
)
{
//TODO
}
@Override
public
Result
<?>
queryMatchCapacityData
(
CapacityOrderQueryDTO
.
Request
reqDTO
)
{
// 单条容量查询
...
...
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