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 6e04d794
authored
Oct 26, 2023
by
huangjinxin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix:格式化代码
1 parent
b9ee0b92
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
593 additions
and
593 deletions
project-order/src/main/java/com/dituhui/pea/order/service/impl/DispatchServiceImpl.java
project-order/src/main/java/com/dituhui/pea/order/service/impl/DispatchServiceImpl.java
View file @
6e04d79
...
...
@@ -28,9 +28,9 @@ import java.util.*;
import
java.util.stream.Collectors
;
interface
GroupTag
{
// 订单分类tag
// 订单分类tag
String
getGroupTag
(
OrderInfoEntity
order
);
String
getGroupTag
(
OrderInfoEntity
order
);
}
...
...
@@ -38,625 +38,625 @@ interface GroupTag {
@Service
public
class
DispatchServiceImpl
implements
DispatchService
{
@Autowired
private
OrderInfoDao
orderInfoDao
;
@Autowired
private
OrgTeamDao
orgTeamDao
;
@Autowired
private
EngineerInfoDao
engineerInfoDao
;
@Autowired
private
SkillInfoDao
skillInfoDao
;
@Autowired
private
CapacityEngineerStatDao
capacityEngineerStatDao
;
@Autowired
private
EntityManager
entityManager
;
@Transactional
@Override
public
Result
<?>
getDispatchOrderList
(
DispatchOrderListReq
reqDTO
)
{
// 获取派工台订单列表
// 获取技能信息
HashMap
<
String
,
SkillInfoEntity
>
skillInfo
=
this
.
querySkillInfo
();
// 获取工单列表
List
<
OrderInfoEntity
>
orders
=
this
.
queryOrders
(
reqDTO
);
// 获取分组标签
GroupTag
gt
=
new
GroupTagFactory
().
getGroupTag
(
reqDTO
.
getGroupTagId
());
List
<
DispatchOrderListResp
.
Order
>
items
=
new
ArrayList
<>();
for
(
OrderInfoEntity
o
:
orders
)
{
DispatchOrderListResp
.
Order
item
=
new
DispatchOrderListResp
.
Order
();
item
.
setOrderId
(
o
.
getOrderId
());
item
.
setDescription
(
String
.
format
(
"%s:%s-%s-%s\n%s:%s-%s-%s"
,
o
.
getOrderId
(),
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
(),
o
.
getName
(),
o
.
getCity
(),
o
.
getCounty
(),
o
.
getAddress
()));
item
.
setBrand
(
o
.
getBrand
());
item
.
setType
(
o
.
getType
());
item
.
setSkill
(
o
.
getSkill
());
item
.
setFaultDescribe
(
o
.
getFaultDescribe
());
item
.
setApplyNote
(
o
.
getApplyNote
());
String
key
=
String
.
format
(
"%s%s%s"
,
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
());
SkillInfoEntity
skill
=
skillInfo
.
get
(
key
);
if
(
skill
!=
null
)
{
item
.
setDuration
(
skill
.
getTakeTime
());
item
.
setSkillCategory
(
skill
.
getSkillCategory
());
item
.
setTypeCategory
(
skill
.
getTypeCategory
());
}
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
item
.
setCity
(
o
.
getCity
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setProvince
(
o
.
getProvince
());
item
.
setCity
(
o
.
getCity
());
item
.
setCounty
(
o
.
getCounty
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
item
.
setExpectTimeDesc
(
o
.
getExpectTimeDesc
());
item
.
setSource
(
o
.
getSource
());
item
.
setDispatcher
(
o
.
getDispatcher
());
item
.
setAppointmentType
(
o
.
getAppointmentMethod
());
item
.
setAppointmentStatus
(
o
.
getAppointmentStatus
());
item
.
setOrderStatus
(
o
.
getOrderStatus
());
item
.
setServiceStatus
(
o
.
getServiceStatus
());
item
.
setCreateTime
(
TimeUtils
.
IsoLocalDateTime2String
(
o
.
getCreateTime
()));
String
[]
tags
=
gt
.
getGroupTag
(
o
).
split
(
"#"
);
item
.
setGroupTag
(
tags
[
0
]);
// 设置tag名称
item
.
setGroupWeight
(
Integer
.
parseInt
(
tags
[
1
]));
// 设置tag权重
items
.
add
(
item
);
}
DispatchOrderListResp
res
=
new
DispatchOrderListResp
();
res
.
setOrders
(
items
);
return
Result
.
success
(
res
);
}
@Transactional
@Override
public
Result
<?>
getDispatchEngineerOrderList
(
DispatchEngineerOrderListReq
reqDTO
)
throws
BusinessException
{
// 派工台技术员预约单列表
LocalDate
date
=
TimeUtils
.
IsoDate2LocalDate
(
reqDTO
.
getDate
());
// 获取技能信息
HashMap
<
String
,
SkillInfoEntity
>
skillInfo
=
this
.
querySkillInfo
();
// 获取teamIds
List
<
String
>
teamIds
=
this
.
queryOrgTeamIds
(
reqDTO
.
getLevelType
(),
reqDTO
.
getLevelValue
(),
reqDTO
.
getBranchIds
(),
reqDTO
.
getGroupIds
(),
reqDTO
.
getTeamIds
());
if
(
teamIds
.
isEmpty
())
{
throw
new
BusinessException
(
"大区/分部/小组组织结构配置可能错误或缺失,请联系管理员/研发"
);
}
// 获取engineer列表
List
<
EngineerInfoEntity
>
engineers
=
this
.
queryEngineers
(
teamIds
,
reqDTO
.
getEngineerCodes
(),
reqDTO
.
getKey
());
if
(
engineers
.
isEmpty
())
{
// 该group下没有技术员,返回空
log
.
warn
(
"没有找到技术员"
);
DispatchEngineerOrderListResp
res
=
new
DispatchEngineerOrderListResp
();
List
<
DispatchEngineerOrderListResp
.
EngineerInfo
>
egs
=
new
ArrayList
<>();
res
.
setEngineers
(
egs
);
return
Result
.
success
(
res
);
}
// 获取engineerCodes
List
<
String
>
engineerCodes
=
engineers
.
stream
().
map
(
EngineerInfoEntity:
:
getEngineerCode
).
collect
(
Collectors
.
toList
());
// 获取技术员已指派单列表
Map
<
String
,
List
<
OrderInfoEntity
>>
engineerOrders
=
this
.
queryEngineerOrders
(
engineerCodes
,
date
);
// 获取技术员的容量
HashMap
<
String
,
CapacityEngineerStatEntity
>
engineerCap
=
this
.
queryCapacityEngineerStat
(
engineerCodes
,
reqDTO
.
getDate
());
// 获取技术员已指派单列表
List
<
DispatchEngineerOrderListResp
.
EngineerInfo
>
egs
=
new
ArrayList
<>();
for
(
EngineerInfoEntity
e
:
engineers
)
{
List
<
DispatchEngineerOrderListResp
.
OrderInfo
>
items
=
new
ArrayList
<>();
// 技术员已指派的订单列表
List
<
OrderInfoEntity
>
records
=
engineerOrders
.
getOrDefault
(
e
.
getEngineerCode
(),
new
ArrayList
<>());
for
(
OrderInfoEntity
o
:
records
)
{
DispatchEngineerOrderListResp
.
OrderInfo
item
=
new
DispatchEngineerOrderListResp
.
OrderInfo
();
item
.
setOrderId
(
o
.
getOrderId
());
item
.
setDescription
(
String
.
format
(
"%s:%s-%s-%s\n%s:%s-%s-%s"
,
o
.
getOrderId
(),
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
(),
o
.
getName
(),
o
.
getCity
(),
o
.
getCounty
(),
o
.
getAddress
()));
item
.
setBrand
(
o
.
getBrand
());
item
.
setType
(
o
.
getType
());
item
.
setSkill
(
o
.
getSkill
());
item
.
setFaultDescribe
(
o
.
getFaultDescribe
());
item
.
setApplyNote
(
o
.
getApplyNote
());
String
key
=
String
.
format
(
"%s%s%s"
,
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
());
SkillInfoEntity
skill
=
skillInfo
.
get
(
key
);
if
(
skill
!=
null
)
{
item
.
setDuration
(
skill
.
getTakeTime
());
item
.
setSkillCategory
(
skill
.
getSkillCategory
());
item
.
setTypeCategory
(
skill
.
getTypeCategory
());
}
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
item
.
setCity
(
o
.
getCity
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setProvince
(
o
.
getProvince
());
item
.
setCity
(
o
.
getCity
());
item
.
setCounty
(
o
.
getCounty
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
String
time
=
TimeUtils
.
localDateTime2String
(
o
.
getPlanStartTime
(),
"HH:mm"
);
String
timeSlot
=
this
.
parseTimeSlot
(
o
.
getPlanStartTime
());
item
.
setExpectTimeDesc
(
String
.
format
(
"%s/%s"
,
time
,
timeSlot
));
item
.
setSource
(
o
.
getSource
());
item
.
setDispatcher
(
o
.
getDispatcher
());
item
.
setAppointmentType
(
o
.
getAppointmentMethod
());
item
.
setAppointmentStatus
(
o
.
getAppointmentStatus
());
item
.
setOrderStatus
(
o
.
getOrderStatus
());
// 订单状态
item
.
setServiceStatus
(
o
.
getServiceStatus
());
item
.
setOrderStatusDesc
(
OrderStatus
.
valueOf
(
o
.
getOrderStatus
()).
getDescription
());
item
.
setCreateTime
(
TimeUtils
.
IsoLocalDateTime2String
(
o
.
getCreateTime
()));
items
.
add
(
item
);
}
// 获取容量
int
capUsed
=
0
;
int
capTotal
=
0
;
String
capacityStatus
=
"less"
;
CapacityEngineerStatEntity
cap
=
engineerCap
.
get
(
e
.
getEngineerCode
());
if
(
cap
!=
null
)
{
capUsed
=
cap
.
getCapUsed
();
capTotal
=
cap
.
getCapTotal
();
if
(
capTotal
>
0
&&
(
float
)
capUsed
/
capTotal
<
0.8
)
{
capacityStatus
=
"normal"
;
}
}
DispatchEngineerOrderListResp
.
EngineerInfo
eg
=
new
DispatchEngineerOrderListResp
.
EngineerInfo
();
eg
.
setOrders
(
items
);
eg
.
setEngineerCode
(
e
.
getEngineerCode
());
eg
.
setEngineerName
(
e
.
getName
());
eg
.
setGrade
(
e
.
getGrade
());
eg
.
setCapacity
(
String
.
format
(
"%d/%d"
,
capUsed
,
capTotal
));
eg
.
setCapacityStatus
(
capacityStatus
);
egs
.
add
(
eg
);
}
DispatchEngineerOrderListResp
res
=
new
DispatchEngineerOrderListResp
();
res
.
setEngineers
(
egs
);
return
Result
.
success
(
res
);
}
@Transactional
@Override
public
Result
<?>
dispatchOrderConfirm
(
String
engineerCode
,
String
date
,
List
<
String
>
orderIds
)
throws
BusinessException
{
// 派工台确认派单
LocalDate
localDate
=
TimeUtils
.
IsoDate2LocalDate
(
date
);
EngineerInfoEntity
engineer
=
engineerInfoDao
.
getByEngineerCode
(
engineerCode
);
if
(
engineer
==
null
)
{
throw
new
BusinessException
(
"技术员不存在"
);
}
List
<
OrderInfoEntity
>
orders
=
orderInfoDao
.
findAllByDtAndOrderIdIn
(
localDate
,
orderIds
);
if
(
ListUtils
.
isEmpty
(
orders
))
{
throw
new
BusinessException
(
"订单不存在"
);
}
// 已经指派的订单
List
<
OrderInfoEntity
>
engineerOrders
=
orderInfoDao
.
findByDtAndEngineerCode
(
localDate
,
engineerCode
);
engineerOrders
.
sort
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getPlanStartTime
));
// 按照planStartTime排序
List
<
OrderInfoEntity
>
orderAppointments
=
engineerOrders
.
stream
()
.
filter
(
o
->
o
.
getOrderStatus
().
equals
(
"NORMAL"
))
.
collect
(
Collectors
.
toList
());
// 过滤,只有NORMAL订单才需要处理,取消订单不需要处理
// TODO,临时处理方案,后续调用派单引擎处理
OrderRequestScheduler
scheduler
=
new
OrderRequestScheduler
();
List
<
LineSegment
>
results
=
scheduler
.
scheduler
(
orders
,
orderAppointments
);
for
(
LineSegment
r
:
results
)
{
String
orderId
=
r
.
id
;
LocalDateTime
planStartTime
=
scheduler
.
linePoint2DateTime
(
r
.
start
,
date
);
LocalDateTime
planEndTime
=
scheduler
.
linePoint2DateTime
(
r
.
end
,
date
);
CriteriaBuilder
criteriaBuilder
=
entityManager
.
getCriteriaBuilder
();
CriteriaUpdate
<
OrderInfoEntity
>
update
=
criteriaBuilder
.
createCriteriaUpdate
(
OrderInfoEntity
.
class
);
Root
<
OrderInfoEntity
>
root
=
update
.
from
(
OrderInfoEntity
.
class
);
update
.
set
(
root
.
get
(
"planStartTime"
),
planStartTime
);
update
.
set
(
root
.
get
(
"planEndTime"
),
planEndTime
);
update
.
set
(
root
.
get
(
"appointmentStatus"
),
"CONFIRM"
);
update
.
set
(
root
.
get
(
"appointmentMethod"
),
"MANUAL"
);
update
.
set
(
root
.
get
(
"engineerCode"
),
engineerCode
);
update
.
where
(
criteriaBuilder
.
equal
(
root
.
get
(
"orderId"
),
orderId
),
criteriaBuilder
.
equal
(
root
.
get
(
"dt"
),
localDate
)
);
entityManager
.
createQuery
(
update
).
executeUpdate
();
}
return
Result
.
success
(
null
);
}
private
List
<
OrderInfoEntity
>
queryOrders
(
DispatchOrderListReq
reqDTO
)
{
// 获取服务单列表
CriteriaBuilder
criteriaBuilder
=
entityManager
.
getCriteriaBuilder
();
CriteriaQuery
<
OrderInfoEntity
>
criteriaQuery
=
criteriaBuilder
.
createQuery
(
OrderInfoEntity
.
class
);
Root
<
OrderInfoEntity
>
root
=
criteriaQuery
.
from
(
OrderInfoEntity
.
class
);
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"dt"
),
TimeUtils
.
IsoDate2LocalDate
(
reqDTO
.
getDate
())));
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"appointmentStatus"
),
"INIT"
));
String
levelType
=
reqDTO
.
getLevelType
();
String
levelValue
=
reqDTO
.
getLevelValue
();
if
(
"cluster"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orgClusterId"
),
levelValue
));
}
else
if
(
"branch"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orgBranchId"
),
levelValue
));
}
else
if
(
"group"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orgGroupId"
),
levelValue
));
}
// 筛选项
if
(
StringUtils
.
isNotEmpty
(
reqDTO
.
getPhone
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"phone"
),
reqDTO
.
getPhone
()));
}
if
(
StringUtils
.
isNotEmpty
(
reqDTO
.
getOrderId
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orderId"
),
reqDTO
.
getOrderId
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getBranchIds
()))
{
predicates
.
add
(
root
.
get
(
"orgBranchId"
).
in
(
reqDTO
.
getBranchIds
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getGroupIds
()))
{
predicates
.
add
(
root
.
get
(
"orgGroupId"
).
in
(
reqDTO
.
getGroupIds
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getTeamIds
()))
{
predicates
.
add
(
root
.
get
(
"orgTeamId"
).
in
(
reqDTO
.
getTeamIds
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getAppointmentType
()))
{
predicates
.
add
(
root
.
get
(
"appointmentMethod"
).
in
(
reqDTO
.
getAppointmentType
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getPriorities
()))
{
List
<
Integer
>
p
=
reqDTO
.
getPriorities
();
if
(
p
.
contains
(
0
)
&&
p
.
contains
(
1
))
{
predicates
.
add
(
criteriaBuilder
.
ge
(
root
.
get
(
"priority"
),
1
));
}
else
if
(
p
.
contains
(
0
)
&&
!
p
.
contains
(
1
))
{
predicates
.
add
(
criteriaBuilder
.
le
(
root
.
get
(
"priority"
),
1
));
}
else
if
(
p
.
contains
(
1
)
&&
!
p
.
contains
(
0
))
{
predicates
.
add
(
criteriaBuilder
.
ge
(
root
.
get
(
"priority"
),
5
));
}
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getEngineerCodes
()))
{
Predicate
engineerCodePredicate
=
root
.
get
(
"engineerCode"
).
in
(
reqDTO
.
getEngineerCodes
());
Predicate
engineerCodeSubPredicate
=
root
.
get
(
"engineerCodeSub"
).
in
(
reqDTO
.
getEngineerCodes
());
predicates
.
add
(
criteriaBuilder
.
or
(
engineerCodePredicate
,
engineerCodeSubPredicate
));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getTypeCategory
()))
{
Subquery
<
OrderInfoEntity
>
typeCategorySubquery
=
criteriaQuery
.
subquery
(
OrderInfoEntity
.
class
);
Root
<
SkillInfoEntity
>
skillInfoRoot
=
typeCategorySubquery
.
from
(
SkillInfoEntity
.
class
);
typeCategorySubquery
.
select
(
root
)
.
where
(
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"brand"
),
root
.
get
(
"brand"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"type"
),
root
.
get
(
"type"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"skill"
),
root
.
get
(
"skill"
)),
skillInfoRoot
.
get
(
"typeCategory"
).
in
(
reqDTO
.
getTypeCategory
())
);
predicates
.
add
(
criteriaBuilder
.
exists
(
typeCategorySubquery
));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getSkillCategory
()))
{
Subquery
<
OrderInfoEntity
>
skillCategorySubquery
=
criteriaQuery
.
subquery
(
OrderInfoEntity
.
class
);
Root
<
SkillInfoEntity
>
skillInfoRoot
=
skillCategorySubquery
.
from
(
SkillInfoEntity
.
class
);
skillCategorySubquery
.
select
(
root
)
// 注意这里的 select 使用主查询的 root
.
where
(
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"brand"
),
root
.
get
(
"brand"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"type"
),
root
.
get
(
"type"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"skill"
),
root
.
get
(
"skill"
)),
skillInfoRoot
.
get
(
"skillCategory"
).
in
(
reqDTO
.
getSkillCategory
())
);
predicates
.
add
(
criteriaBuilder
.
exists
(
skillCategorySubquery
));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getGroupCategory
()))
{
Subquery
<
OrderInfoEntity
>
skillGroupCategorySubquery
=
criteriaQuery
.
subquery
(
OrderInfoEntity
.
class
);
Root
<
SkillInfoEntity
>
skillInfoRoot
=
skillGroupCategorySubquery
.
from
(
SkillInfoEntity
.
class
);
skillGroupCategorySubquery
.
select
(
root
)
// 注意这里的 select 使用主查询的 root
.
where
(
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"brand"
),
root
.
get
(
"brand"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"type"
),
root
.
get
(
"type"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"skill"
),
root
.
get
(
"skill"
)),
skillInfoRoot
.
get
(
"groupCategory"
).
in
(
reqDTO
.
getGroupCategory
())
);
predicates
.
add
(
criteriaBuilder
.
exists
(
skillGroupCategorySubquery
));
}
criteriaQuery
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
]));
return
entityManager
.
createQuery
(
criteriaQuery
).
getResultList
();
}
private
Map
<
String
,
List
<
OrderInfoEntity
>>
queryEngineerOrders
(
List
<
String
>
engineerCodes
,
LocalDate
date
)
{
// 获取工程师服务单列表
List
<
OrderInfoEntity
>
records
=
orderInfoDao
.
findByDtAndEngineerCodeIn
(
date
,
engineerCodes
);
// 排序
records
.
sort
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getEngineerCode
));
records
.
sort
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getPlanStartTime
));
//过滤
List
<
OrderInfoEntity
>
orders
=
records
.
stream
()
.
filter
(
r
->
r
.
getOrderStatus
().
equals
(
"NORMAL"
))
.
collect
(
Collectors
.
toList
());
return
orders
.
stream
().
collect
(
Collectors
.
groupingBy
(
OrderInfoEntity:
:
getEngineerCode
));
}
public
List
<
EngineerInfoEntity
>
queryEngineers
(
List
<
String
>
teamIds
,
List
<
String
>
engineerCodes
,
String
key
)
{
CriteriaBuilder
criteriaBuilder
=
entityManager
.
getCriteriaBuilder
();
CriteriaQuery
<
EngineerInfoEntity
>
criteriaQuery
=
criteriaBuilder
.
createQuery
(
EngineerInfoEntity
.
class
);
Root
<
EngineerInfoEntity
>
root
=
criteriaQuery
.
from
(
EngineerInfoEntity
.
class
);
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"beanStatus"
),
1
));
if
(
ListUtils
.
isNotEmpty
(
engineerCodes
))
{
predicates
.
add
(
root
.
get
(
"engineerCode"
).
in
(
engineerCodes
));
}
Subquery
<
Integer
>
teamSubquery
=
criteriaQuery
.
subquery
(
Integer
.
class
);
Root
<
OrgTeamEngineerEntity
>
teamRoot
=
teamSubquery
.
from
(
OrgTeamEngineerEntity
.
class
);
teamSubquery
.
select
(
criteriaBuilder
.
literal
(
1
))
.
where
(
criteriaBuilder
.
equal
(
teamRoot
.
get
(
"engineerCode"
),
root
.
get
(
"engineerCode"
)),
teamRoot
.
get
(
"teamId"
).
in
(
teamIds
)
);
predicates
.
add
(
criteriaBuilder
.
exists
(
teamSubquery
));
if
(
StringUtils
.
isNotEmpty
(
key
))
{
predicates
.
add
(
criteriaBuilder
.
or
(
criteriaBuilder
.
like
(
root
.
get
(
"phone"
),
"%"
+
key
+
"%"
),
criteriaBuilder
.
like
(
root
.
get
(
"name"
),
"%"
+
key
+
"%"
),
criteriaBuilder
.
like
(
root
.
get
(
"engineerCode"
),
"%"
+
key
+
"%"
)
));
}
criteriaQuery
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
]));
criteriaQuery
.
orderBy
(
criteriaBuilder
.
asc
(
root
.
get
(
"name"
)));
return
entityManager
.
createQuery
(
criteriaQuery
).
getResultList
();
}
private
List
<
String
>
queryOrgTeamIds
(
String
levelType
,
String
levelIds
,
List
<
String
>
branchIds
,
List
<
String
>
groupIds
,
List
<
String
>
teamIds
)
{
Specification
<
OrgTeamEntity
>
specification
=
(
root
,
query
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
if
(
"cluster"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
in
(
root
.
get
(
"clusterId"
)).
value
(
levelIds
));
}
else
if
(
"branch"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
in
(
root
.
get
(
"branchId"
)).
value
(
levelIds
));
}
else
if
(
"group"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
in
(
root
.
get
(
"groupId"
)).
value
(
levelIds
));
}
if
(
ListUtils
.
isNotEmpty
(
branchIds
))
{
predicates
.
add
(
root
.
get
(
"branchId"
).
in
(
branchIds
));
}
if
(
ListUtils
.
isNotEmpty
(
groupIds
))
{
predicates
.
add
(
root
.
get
(
"groupId"
).
in
(
groupIds
));
}
if
(
ListUtils
.
isNotEmpty
(
teamIds
))
{
predicates
.
add
(
root
.
get
(
"teamId"
).
in
(
teamIds
));
}
return
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
0
]));
};
List
<
OrgTeamEntity
>
teams
=
orgTeamDao
.
findAll
(
specification
);
return
teams
.
stream
().
map
(
OrgTeamEntity:
:
getTeamId
).
collect
(
Collectors
.
toList
());
}
private
HashMap
<
String
,
Integer
>
querySkillTakeTime
()
{
HashMap
<
String
,
Integer
>
map
=
new
HashMap
<>();
List
<
SkillInfoEntity
>
records
=
skillInfoDao
.
findAll
();
for
(
SkillInfoEntity
r
:
records
)
{
String
key
=
String
.
format
(
"%s%s%s"
,
r
.
getBrand
(),
r
.
getType
(),
r
.
getSkill
());
map
.
put
(
key
,
r
.
getTakeTime
());
}
return
map
;
}
private
HashMap
<
String
,
SkillInfoEntity
>
querySkillInfo
()
{
HashMap
<
String
,
SkillInfoEntity
>
map
=
new
HashMap
<>();
List
<
SkillInfoEntity
>
records
=
skillInfoDao
.
findAll
();
for
(
SkillInfoEntity
r
:
records
)
{
String
key
=
String
.
format
(
"%s%s%s"
,
r
.
getBrand
(),
r
.
getType
(),
r
.
getSkill
());
map
.
put
(
key
,
r
);
}
return
map
;
}
private
HashMap
<
String
,
CapacityEngineerStatEntity
>
queryCapacityEngineerStat
(
List
<
String
>
engineerCodes
,
String
date
)
{
List
<
CapacityEngineerStatEntity
>
records
=
capacityEngineerStatDao
.
getByWorkdayAndEngineerCodeIn
(
date
,
engineerCodes
);
HashMap
<
String
,
CapacityEngineerStatEntity
>
map
=
new
HashMap
<>();
for
(
CapacityEngineerStatEntity
r
:
records
)
{
map
.
put
(
r
.
getEngineerCode
(),
r
);
}
return
map
;
}
private
String
parseTimeSlot
(
LocalDateTime
t
)
{
String
h
=
TimeUtils
.
localDateTime2String
(
t
,
"HH"
);
Integer
hour
=
Integer
.
parseInt
(
h
);
if
(
hour
<=
12
)
{
return
"上午"
;
}
else
if
(
hour
<=
18
)
{
return
"下午"
;
}
else
{
return
"晚上"
;
}
}
@Autowired
private
OrderInfoDao
orderInfoDao
;
@Autowired
private
OrgTeamDao
orgTeamDao
;
@Autowired
private
EngineerInfoDao
engineerInfoDao
;
@Autowired
private
SkillInfoDao
skillInfoDao
;
@Autowired
private
CapacityEngineerStatDao
capacityEngineerStatDao
;
@Autowired
private
EntityManager
entityManager
;
@Transactional
@Override
public
Result
<?>
getDispatchOrderList
(
DispatchOrderListReq
reqDTO
)
{
// 获取派工台订单列表
// 获取技能信息
HashMap
<
String
,
SkillInfoEntity
>
skillInfo
=
this
.
querySkillInfo
();
// 获取工单列表
List
<
OrderInfoEntity
>
orders
=
this
.
queryOrders
(
reqDTO
);
// 获取分组标签
GroupTag
gt
=
new
GroupTagFactory
().
getGroupTag
(
reqDTO
.
getGroupTagId
());
List
<
DispatchOrderListResp
.
Order
>
items
=
new
ArrayList
<>();
for
(
OrderInfoEntity
o
:
orders
)
{
DispatchOrderListResp
.
Order
item
=
new
DispatchOrderListResp
.
Order
();
item
.
setOrderId
(
o
.
getOrderId
());
item
.
setDescription
(
String
.
format
(
"%s:%s-%s-%s\n%s:%s-%s-%s"
,
o
.
getOrderId
(),
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
(),
o
.
getName
(),
o
.
getCity
(),
o
.
getCounty
(),
o
.
getAddress
()));
item
.
setBrand
(
o
.
getBrand
());
item
.
setType
(
o
.
getType
());
item
.
setSkill
(
o
.
getSkill
());
item
.
setFaultDescribe
(
o
.
getFaultDescribe
());
item
.
setApplyNote
(
o
.
getApplyNote
());
String
key
=
String
.
format
(
"%s%s%s"
,
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
());
SkillInfoEntity
skill
=
skillInfo
.
get
(
key
);
if
(
skill
!=
null
)
{
item
.
setDuration
(
skill
.
getTakeTime
());
item
.
setSkillCategory
(
skill
.
getSkillCategory
());
item
.
setTypeCategory
(
skill
.
getTypeCategory
());
}
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
item
.
setCity
(
o
.
getCity
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setProvince
(
o
.
getProvince
());
item
.
setCity
(
o
.
getCity
());
item
.
setCounty
(
o
.
getCounty
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
item
.
setExpectTimeDesc
(
o
.
getExpectTimeDesc
());
item
.
setSource
(
o
.
getSource
());
item
.
setDispatcher
(
o
.
getDispatcher
());
item
.
setAppointmentType
(
o
.
getAppointmentMethod
());
item
.
setAppointmentStatus
(
o
.
getAppointmentStatus
());
item
.
setOrderStatus
(
o
.
getOrderStatus
());
item
.
setServiceStatus
(
o
.
getServiceStatus
());
item
.
setCreateTime
(
TimeUtils
.
IsoLocalDateTime2String
(
o
.
getCreateTime
()));
String
[]
tags
=
gt
.
getGroupTag
(
o
).
split
(
"#"
);
item
.
setGroupTag
(
tags
[
0
]);
// 设置tag名称
item
.
setGroupWeight
(
Integer
.
parseInt
(
tags
[
1
]));
// 设置tag权重
items
.
add
(
item
);
}
DispatchOrderListResp
res
=
new
DispatchOrderListResp
();
res
.
setOrders
(
items
);
return
Result
.
success
(
res
);
}
@Transactional
@Override
public
Result
<?>
getDispatchEngineerOrderList
(
DispatchEngineerOrderListReq
reqDTO
)
throws
BusinessException
{
// 派工台技术员预约单列表
LocalDate
date
=
TimeUtils
.
IsoDate2LocalDate
(
reqDTO
.
getDate
());
// 获取技能信息
HashMap
<
String
,
SkillInfoEntity
>
skillInfo
=
this
.
querySkillInfo
();
// 获取teamIds
List
<
String
>
teamIds
=
this
.
queryOrgTeamIds
(
reqDTO
.
getLevelType
(),
reqDTO
.
getLevelValue
(),
reqDTO
.
getBranchIds
(),
reqDTO
.
getGroupIds
(),
reqDTO
.
getTeamIds
());
if
(
teamIds
.
isEmpty
())
{
throw
new
BusinessException
(
"大区/分部/小组组织结构配置可能错误或缺失,请联系管理员/研发"
);
}
// 获取engineer列表
List
<
EngineerInfoEntity
>
engineers
=
this
.
queryEngineers
(
teamIds
,
reqDTO
.
getEngineerCodes
(),
reqDTO
.
getKey
());
if
(
engineers
.
isEmpty
())
{
// 该group下没有技术员,返回空
log
.
warn
(
"没有找到技术员"
);
DispatchEngineerOrderListResp
res
=
new
DispatchEngineerOrderListResp
();
List
<
DispatchEngineerOrderListResp
.
EngineerInfo
>
egs
=
new
ArrayList
<>();
res
.
setEngineers
(
egs
);
return
Result
.
success
(
res
);
}
// 获取engineerCodes
List
<
String
>
engineerCodes
=
engineers
.
stream
().
map
(
EngineerInfoEntity:
:
getEngineerCode
).
collect
(
Collectors
.
toList
());
// 获取技术员已指派单列表
Map
<
String
,
List
<
OrderInfoEntity
>>
engineerOrders
=
this
.
queryEngineerOrders
(
engineerCodes
,
date
);
// 获取技术员的容量
HashMap
<
String
,
CapacityEngineerStatEntity
>
engineerCap
=
this
.
queryCapacityEngineerStat
(
engineerCodes
,
reqDTO
.
getDate
());
// 获取技术员已指派单列表
List
<
DispatchEngineerOrderListResp
.
EngineerInfo
>
egs
=
new
ArrayList
<>();
for
(
EngineerInfoEntity
e
:
engineers
)
{
List
<
DispatchEngineerOrderListResp
.
OrderInfo
>
items
=
new
ArrayList
<>();
// 技术员已指派的订单列表
List
<
OrderInfoEntity
>
records
=
engineerOrders
.
getOrDefault
(
e
.
getEngineerCode
(),
new
ArrayList
<>());
for
(
OrderInfoEntity
o
:
records
)
{
DispatchEngineerOrderListResp
.
OrderInfo
item
=
new
DispatchEngineerOrderListResp
.
OrderInfo
();
item
.
setOrderId
(
o
.
getOrderId
());
item
.
setDescription
(
String
.
format
(
"%s:%s-%s-%s\n%s:%s-%s-%s"
,
o
.
getOrderId
(),
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
(),
o
.
getName
(),
o
.
getCity
(),
o
.
getCounty
(),
o
.
getAddress
()));
item
.
setBrand
(
o
.
getBrand
());
item
.
setType
(
o
.
getType
());
item
.
setSkill
(
o
.
getSkill
());
item
.
setFaultDescribe
(
o
.
getFaultDescribe
());
item
.
setApplyNote
(
o
.
getApplyNote
());
String
key
=
String
.
format
(
"%s%s%s"
,
o
.
getBrand
(),
o
.
getType
(),
o
.
getSkill
());
SkillInfoEntity
skill
=
skillInfo
.
get
(
key
);
if
(
skill
!=
null
)
{
item
.
setDuration
(
skill
.
getTakeTime
());
item
.
setSkillCategory
(
skill
.
getSkillCategory
());
item
.
setTypeCategory
(
skill
.
getTypeCategory
());
}
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
item
.
setCity
(
o
.
getCity
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setProvince
(
o
.
getProvince
());
item
.
setCity
(
o
.
getCity
());
item
.
setCounty
(
o
.
getCounty
());
item
.
setAddress
(
o
.
getAddress
());
item
.
setName
(
o
.
getName
());
item
.
setPhone
(
o
.
getPhone
());
String
time
=
TimeUtils
.
localDateTime2String
(
o
.
getPlanStartTime
(),
"HH:mm"
);
String
timeSlot
=
this
.
parseTimeSlot
(
o
.
getPlanStartTime
());
item
.
setExpectTimeDesc
(
String
.
format
(
"%s/%s"
,
time
,
timeSlot
));
item
.
setSource
(
o
.
getSource
());
item
.
setDispatcher
(
o
.
getDispatcher
());
item
.
setAppointmentType
(
o
.
getAppointmentMethod
());
item
.
setAppointmentStatus
(
o
.
getAppointmentStatus
());
item
.
setOrderStatus
(
o
.
getOrderStatus
());
// 订单状态
item
.
setServiceStatus
(
o
.
getServiceStatus
());
item
.
setOrderStatusDesc
(
OrderStatus
.
valueOf
(
o
.
getOrderStatus
()).
getDescription
());
item
.
setCreateTime
(
TimeUtils
.
IsoLocalDateTime2String
(
o
.
getCreateTime
()));
items
.
add
(
item
);
}
// 获取容量
int
capUsed
=
0
;
int
capTotal
=
0
;
String
capacityStatus
=
"less"
;
CapacityEngineerStatEntity
cap
=
engineerCap
.
get
(
e
.
getEngineerCode
());
if
(
cap
!=
null
)
{
capUsed
=
cap
.
getCapUsed
();
capTotal
=
cap
.
getCapTotal
();
if
(
capTotal
>
0
&&
(
float
)
capUsed
/
capTotal
<
0.8
)
{
capacityStatus
=
"normal"
;
}
}
DispatchEngineerOrderListResp
.
EngineerInfo
eg
=
new
DispatchEngineerOrderListResp
.
EngineerInfo
();
eg
.
setOrders
(
items
);
eg
.
setEngineerCode
(
e
.
getEngineerCode
());
eg
.
setEngineerName
(
e
.
getName
());
eg
.
setGrade
(
e
.
getGrade
());
eg
.
setCapacity
(
String
.
format
(
"%d/%d"
,
capUsed
,
capTotal
));
eg
.
setCapacityStatus
(
capacityStatus
);
egs
.
add
(
eg
);
}
DispatchEngineerOrderListResp
res
=
new
DispatchEngineerOrderListResp
();
res
.
setEngineers
(
egs
);
return
Result
.
success
(
res
);
}
@Transactional
@Override
public
Result
<?>
dispatchOrderConfirm
(
String
engineerCode
,
String
date
,
List
<
String
>
orderIds
)
throws
BusinessException
{
// 派工台确认派单
LocalDate
localDate
=
TimeUtils
.
IsoDate2LocalDate
(
date
);
EngineerInfoEntity
engineer
=
engineerInfoDao
.
getByEngineerCode
(
engineerCode
);
if
(
engineer
==
null
)
{
throw
new
BusinessException
(
"技术员不存在"
);
}
List
<
OrderInfoEntity
>
orders
=
orderInfoDao
.
findAllByDtAndOrderIdIn
(
localDate
,
orderIds
);
if
(
ListUtils
.
isEmpty
(
orders
))
{
throw
new
BusinessException
(
"订单不存在"
);
}
// 已经指派的订单
List
<
OrderInfoEntity
>
engineerOrders
=
orderInfoDao
.
findByDtAndEngineerCode
(
localDate
,
engineerCode
);
engineerOrders
.
sort
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getPlanStartTime
));
// 按照planStartTime排序
List
<
OrderInfoEntity
>
orderAppointments
=
engineerOrders
.
stream
()
.
filter
(
o
->
o
.
getOrderStatus
().
equals
(
"NORMAL"
))
.
collect
(
Collectors
.
toList
());
// 过滤,只有NORMAL订单才需要处理,取消订单不需要处理
// TODO,临时处理方案,后续调用派单引擎处理
OrderRequestScheduler
scheduler
=
new
OrderRequestScheduler
();
List
<
LineSegment
>
results
=
scheduler
.
scheduler
(
orders
,
orderAppointments
);
for
(
LineSegment
r
:
results
)
{
String
orderId
=
r
.
id
;
LocalDateTime
planStartTime
=
scheduler
.
linePoint2DateTime
(
r
.
start
,
date
);
LocalDateTime
planEndTime
=
scheduler
.
linePoint2DateTime
(
r
.
end
,
date
);
CriteriaBuilder
criteriaBuilder
=
entityManager
.
getCriteriaBuilder
();
CriteriaUpdate
<
OrderInfoEntity
>
update
=
criteriaBuilder
.
createCriteriaUpdate
(
OrderInfoEntity
.
class
);
Root
<
OrderInfoEntity
>
root
=
update
.
from
(
OrderInfoEntity
.
class
);
update
.
set
(
root
.
get
(
"planStartTime"
),
planStartTime
);
update
.
set
(
root
.
get
(
"planEndTime"
),
planEndTime
);
update
.
set
(
root
.
get
(
"appointmentStatus"
),
"CONFIRM"
);
update
.
set
(
root
.
get
(
"appointmentMethod"
),
"MANUAL"
);
update
.
set
(
root
.
get
(
"engineerCode"
),
engineerCode
);
update
.
where
(
criteriaBuilder
.
equal
(
root
.
get
(
"orderId"
),
orderId
),
criteriaBuilder
.
equal
(
root
.
get
(
"dt"
),
localDate
)
);
entityManager
.
createQuery
(
update
).
executeUpdate
();
}
return
Result
.
success
(
null
);
}
private
List
<
OrderInfoEntity
>
queryOrders
(
DispatchOrderListReq
reqDTO
)
{
// 获取服务单列表
CriteriaBuilder
criteriaBuilder
=
entityManager
.
getCriteriaBuilder
();
CriteriaQuery
<
OrderInfoEntity
>
criteriaQuery
=
criteriaBuilder
.
createQuery
(
OrderInfoEntity
.
class
);
Root
<
OrderInfoEntity
>
root
=
criteriaQuery
.
from
(
OrderInfoEntity
.
class
);
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"dt"
),
TimeUtils
.
IsoDate2LocalDate
(
reqDTO
.
getDate
())));
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"appointmentStatus"
),
"INIT"
));
String
levelType
=
reqDTO
.
getLevelType
();
String
levelValue
=
reqDTO
.
getLevelValue
();
if
(
"cluster"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orgClusterId"
),
levelValue
));
}
else
if
(
"branch"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orgBranchId"
),
levelValue
));
}
else
if
(
"group"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orgGroupId"
),
levelValue
));
}
// 筛选项
if
(
StringUtils
.
isNotEmpty
(
reqDTO
.
getPhone
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"phone"
),
reqDTO
.
getPhone
()));
}
if
(
StringUtils
.
isNotEmpty
(
reqDTO
.
getOrderId
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"orderId"
),
reqDTO
.
getOrderId
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getBranchIds
()))
{
predicates
.
add
(
root
.
get
(
"orgBranchId"
).
in
(
reqDTO
.
getBranchIds
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getGroupIds
()))
{
predicates
.
add
(
root
.
get
(
"orgGroupId"
).
in
(
reqDTO
.
getGroupIds
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getTeamIds
()))
{
predicates
.
add
(
root
.
get
(
"orgTeamId"
).
in
(
reqDTO
.
getTeamIds
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getAppointmentType
()))
{
predicates
.
add
(
root
.
get
(
"appointmentMethod"
).
in
(
reqDTO
.
getAppointmentType
()));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getPriorities
()))
{
List
<
Integer
>
p
=
reqDTO
.
getPriorities
();
if
(
p
.
contains
(
0
)
&&
p
.
contains
(
1
))
{
predicates
.
add
(
criteriaBuilder
.
ge
(
root
.
get
(
"priority"
),
1
));
}
else
if
(
p
.
contains
(
0
)
&&
!
p
.
contains
(
1
))
{
predicates
.
add
(
criteriaBuilder
.
le
(
root
.
get
(
"priority"
),
1
));
}
else
if
(
p
.
contains
(
1
)
&&
!
p
.
contains
(
0
))
{
predicates
.
add
(
criteriaBuilder
.
ge
(
root
.
get
(
"priority"
),
5
));
}
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getEngineerCodes
()))
{
Predicate
engineerCodePredicate
=
root
.
get
(
"engineerCode"
).
in
(
reqDTO
.
getEngineerCodes
());
Predicate
engineerCodeSubPredicate
=
root
.
get
(
"engineerCodeSub"
).
in
(
reqDTO
.
getEngineerCodes
());
predicates
.
add
(
criteriaBuilder
.
or
(
engineerCodePredicate
,
engineerCodeSubPredicate
));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getTypeCategory
()))
{
Subquery
<
OrderInfoEntity
>
typeCategorySubquery
=
criteriaQuery
.
subquery
(
OrderInfoEntity
.
class
);
Root
<
SkillInfoEntity
>
skillInfoRoot
=
typeCategorySubquery
.
from
(
SkillInfoEntity
.
class
);
typeCategorySubquery
.
select
(
root
)
.
where
(
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"brand"
),
root
.
get
(
"brand"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"type"
),
root
.
get
(
"type"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"skill"
),
root
.
get
(
"skill"
)),
skillInfoRoot
.
get
(
"typeCategory"
).
in
(
reqDTO
.
getTypeCategory
())
);
predicates
.
add
(
criteriaBuilder
.
exists
(
typeCategorySubquery
));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getSkillCategory
()))
{
Subquery
<
OrderInfoEntity
>
skillCategorySubquery
=
criteriaQuery
.
subquery
(
OrderInfoEntity
.
class
);
Root
<
SkillInfoEntity
>
skillInfoRoot
=
skillCategorySubquery
.
from
(
SkillInfoEntity
.
class
);
skillCategorySubquery
.
select
(
root
)
// 注意这里的 select 使用主查询的 root
.
where
(
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"brand"
),
root
.
get
(
"brand"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"type"
),
root
.
get
(
"type"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"skill"
),
root
.
get
(
"skill"
)),
skillInfoRoot
.
get
(
"skillCategory"
).
in
(
reqDTO
.
getSkillCategory
())
);
predicates
.
add
(
criteriaBuilder
.
exists
(
skillCategorySubquery
));
}
if
(
ListUtils
.
isNotEmpty
(
reqDTO
.
getGroupCategory
()))
{
Subquery
<
OrderInfoEntity
>
skillGroupCategorySubquery
=
criteriaQuery
.
subquery
(
OrderInfoEntity
.
class
);
Root
<
SkillInfoEntity
>
skillInfoRoot
=
skillGroupCategorySubquery
.
from
(
SkillInfoEntity
.
class
);
skillGroupCategorySubquery
.
select
(
root
)
// 注意这里的 select 使用主查询的 root
.
where
(
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"brand"
),
root
.
get
(
"brand"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"type"
),
root
.
get
(
"type"
)),
criteriaBuilder
.
equal
(
skillInfoRoot
.
get
(
"skill"
),
root
.
get
(
"skill"
)),
skillInfoRoot
.
get
(
"groupCategory"
).
in
(
reqDTO
.
getGroupCategory
())
);
predicates
.
add
(
criteriaBuilder
.
exists
(
skillGroupCategorySubquery
));
}
criteriaQuery
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
]));
return
entityManager
.
createQuery
(
criteriaQuery
).
getResultList
();
}
private
Map
<
String
,
List
<
OrderInfoEntity
>>
queryEngineerOrders
(
List
<
String
>
engineerCodes
,
LocalDate
date
)
{
// 获取工程师服务单列表
List
<
OrderInfoEntity
>
records
=
orderInfoDao
.
findByDtAndEngineerCodeIn
(
date
,
engineerCodes
);
// 排序
records
.
sort
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getEngineerCode
));
records
.
sort
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getPlanStartTime
));
//过滤
List
<
OrderInfoEntity
>
orders
=
records
.
stream
()
.
filter
(
r
->
r
.
getOrderStatus
().
equals
(
"NORMAL"
))
.
collect
(
Collectors
.
toList
());
return
orders
.
stream
().
collect
(
Collectors
.
groupingBy
(
OrderInfoEntity:
:
getEngineerCode
));
}
public
List
<
EngineerInfoEntity
>
queryEngineers
(
List
<
String
>
teamIds
,
List
<
String
>
engineerCodes
,
String
key
)
{
CriteriaBuilder
criteriaBuilder
=
entityManager
.
getCriteriaBuilder
();
CriteriaQuery
<
EngineerInfoEntity
>
criteriaQuery
=
criteriaBuilder
.
createQuery
(
EngineerInfoEntity
.
class
);
Root
<
EngineerInfoEntity
>
root
=
criteriaQuery
.
from
(
EngineerInfoEntity
.
class
);
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"beanStatus"
),
1
));
if
(
ListUtils
.
isNotEmpty
(
engineerCodes
))
{
predicates
.
add
(
root
.
get
(
"engineerCode"
).
in
(
engineerCodes
));
}
Subquery
<
Integer
>
teamSubquery
=
criteriaQuery
.
subquery
(
Integer
.
class
);
Root
<
OrgTeamEngineerEntity
>
teamRoot
=
teamSubquery
.
from
(
OrgTeamEngineerEntity
.
class
);
teamSubquery
.
select
(
criteriaBuilder
.
literal
(
1
))
.
where
(
criteriaBuilder
.
equal
(
teamRoot
.
get
(
"engineerCode"
),
root
.
get
(
"engineerCode"
)),
teamRoot
.
get
(
"teamId"
).
in
(
teamIds
)
);
predicates
.
add
(
criteriaBuilder
.
exists
(
teamSubquery
));
if
(
StringUtils
.
isNotEmpty
(
key
))
{
predicates
.
add
(
criteriaBuilder
.
or
(
criteriaBuilder
.
like
(
root
.
get
(
"phone"
),
"%"
+
key
+
"%"
),
criteriaBuilder
.
like
(
root
.
get
(
"name"
),
"%"
+
key
+
"%"
),
criteriaBuilder
.
like
(
root
.
get
(
"engineerCode"
),
"%"
+
key
+
"%"
)
));
}
criteriaQuery
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
]));
criteriaQuery
.
orderBy
(
criteriaBuilder
.
asc
(
root
.
get
(
"name"
)));
return
entityManager
.
createQuery
(
criteriaQuery
).
getResultList
();
}
private
List
<
String
>
queryOrgTeamIds
(
String
levelType
,
String
levelIds
,
List
<
String
>
branchIds
,
List
<
String
>
groupIds
,
List
<
String
>
teamIds
)
{
Specification
<
OrgTeamEntity
>
specification
=
(
root
,
query
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
if
(
"cluster"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
in
(
root
.
get
(
"clusterId"
)).
value
(
levelIds
));
}
else
if
(
"branch"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
in
(
root
.
get
(
"branchId"
)).
value
(
levelIds
));
}
else
if
(
"group"
.
equals
(
levelType
))
{
predicates
.
add
(
criteriaBuilder
.
in
(
root
.
get
(
"groupId"
)).
value
(
levelIds
));
}
if
(
ListUtils
.
isNotEmpty
(
branchIds
))
{
predicates
.
add
(
root
.
get
(
"branchId"
).
in
(
branchIds
));
}
if
(
ListUtils
.
isNotEmpty
(
groupIds
))
{
predicates
.
add
(
root
.
get
(
"groupId"
).
in
(
groupIds
));
}
if
(
ListUtils
.
isNotEmpty
(
teamIds
))
{
predicates
.
add
(
root
.
get
(
"teamId"
).
in
(
teamIds
));
}
return
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
0
]));
};
List
<
OrgTeamEntity
>
teams
=
orgTeamDao
.
findAll
(
specification
);
return
teams
.
stream
().
map
(
OrgTeamEntity:
:
getTeamId
).
collect
(
Collectors
.
toList
());
}
private
HashMap
<
String
,
Integer
>
querySkillTakeTime
()
{
HashMap
<
String
,
Integer
>
map
=
new
HashMap
<>();
List
<
SkillInfoEntity
>
records
=
skillInfoDao
.
findAll
();
for
(
SkillInfoEntity
r
:
records
)
{
String
key
=
String
.
format
(
"%s%s%s"
,
r
.
getBrand
(),
r
.
getType
(),
r
.
getSkill
());
map
.
put
(
key
,
r
.
getTakeTime
());
}
return
map
;
}
private
HashMap
<
String
,
SkillInfoEntity
>
querySkillInfo
()
{
HashMap
<
String
,
SkillInfoEntity
>
map
=
new
HashMap
<>();
List
<
SkillInfoEntity
>
records
=
skillInfoDao
.
findAll
();
for
(
SkillInfoEntity
r
:
records
)
{
String
key
=
String
.
format
(
"%s%s%s"
,
r
.
getBrand
(),
r
.
getType
(),
r
.
getSkill
());
map
.
put
(
key
,
r
);
}
return
map
;
}
private
HashMap
<
String
,
CapacityEngineerStatEntity
>
queryCapacityEngineerStat
(
List
<
String
>
engineerCodes
,
String
date
)
{
List
<
CapacityEngineerStatEntity
>
records
=
capacityEngineerStatDao
.
getByWorkdayAndEngineerCodeIn
(
date
,
engineerCodes
);
HashMap
<
String
,
CapacityEngineerStatEntity
>
map
=
new
HashMap
<>();
for
(
CapacityEngineerStatEntity
r
:
records
)
{
map
.
put
(
r
.
getEngineerCode
(),
r
);
}
return
map
;
}
private
String
parseTimeSlot
(
LocalDateTime
t
)
{
String
h
=
TimeUtils
.
localDateTime2String
(
t
,
"HH"
);
Integer
hour
=
Integer
.
parseInt
(
h
);
if
(
hour
<=
12
)
{
return
"上午"
;
}
else
if
(
hour
<=
18
)
{
return
"下午"
;
}
else
{
return
"晚上"
;
}
}
}
class
GroupTagFactory
{
public
GroupTag
getGroupTag
(
String
groupTagId
)
{
if
(
groupTagId
.
equals
(
"0"
))
{
return
new
GroupTagUrgency
();
}
else
{
return
new
GroupTagOmit
();
}
}
public
GroupTag
getGroupTag
(
String
groupTagId
)
{
if
(
groupTagId
.
equals
(
"0"
))
{
return
new
GroupTagUrgency
();
}
else
{
return
new
GroupTagOmit
();
}
}
}
class
GroupTagUrgency
implements
GroupTag
{
// 根据紧急程度来分组
public
String
getGroupTag
(
OrderInfoEntity
order
)
{
String
s
=
order
.
getTags
();
if
(
s
==
null
)
{
return
"正常#1"
;
}
if
(
s
.
contains
(
"VIP"
)
||
s
.
contains
(
"财产损失"
))
{
return
"超急#10"
;
}
else
if
(
s
.
contains
(
"自保点"
)
||
s
.
contains
(
"紧急"
))
{
return
"紧急#8"
;
}
else
if
(
s
.
contains
(
"3天前单"
)
||
s
.
contains
(
"同地址多单"
)
||
s
.
contains
(
"超重需多人"
))
{
return
"一般#5"
;
}
else
{
return
"正常#1"
;
}
}
// 根据紧急程度来分组
public
String
getGroupTag
(
OrderInfoEntity
order
)
{
String
s
=
order
.
getTags
();
if
(
s
==
null
)
{
return
"正常#1"
;
}
if
(
s
.
contains
(
"VIP"
)
||
s
.
contains
(
"财产损失"
))
{
return
"超急#10"
;
}
else
if
(
s
.
contains
(
"自保点"
)
||
s
.
contains
(
"紧急"
))
{
return
"紧急#8"
;
}
else
if
(
s
.
contains
(
"3天前单"
)
||
s
.
contains
(
"同地址多单"
)
||
s
.
contains
(
"超重需多人"
))
{
return
"一般#5"
;
}
else
{
return
"正常#1"
;
}
}
}
class
GroupTagOmit
implements
GroupTag
{
public
String
getGroupTag
(
OrderInfoEntity
order
)
{
return
"默认分类#5"
;
}
public
String
getGroupTag
(
OrderInfoEntity
order
)
{
return
"默认分类#5"
;
}
}
class
LineSegment
{
public
String
id
;
public
int
start
;
public
int
end
;
public
String
id
;
public
int
start
;
public
int
end
;
public
LineSegment
(
String
id
,
int
start
,
int
end
)
{
this
.
id
=
id
;
this
.
start
=
start
;
this
.
end
=
end
;
}
public
LineSegment
(
String
id
,
int
start
,
int
end
)
{
this
.
id
=
id
;
this
.
start
=
start
;
this
.
end
=
end
;
}
}
class
Line
{
public
String
id
;
public
int
length
;
public
String
id
;
public
int
length
;
public
Line
(
String
id
,
int
length
)
{
this
.
id
=
id
;
this
.
length
=
length
;
}
public
Line
(
String
id
,
int
length
)
{
this
.
id
=
id
;
this
.
length
=
length
;
}
}
class
LineSegmentScheduler
{
public
List
<
LineSegment
>
scheduleLineSegments
(
List
<
LineSegment
>
used
,
List
<
Line
>
newTasks
)
{
used
.
sort
(
Comparator
.
comparingInt
(
a
->
a
.
start
));
List
<
LineSegment
>
result
=
new
ArrayList
<>();
for
(
Line
task
:
newTasks
)
{
String
taskId
=
task
.
id
;
int
taskLength
=
task
.
length
;
boolean
scheduled
=
false
;
int
startRange
=
480
;
int
endRange
=
1440
;
if
(!
scheduled
)
{
for
(
int
i
=
0
;
i
<=
used
.
size
();
i
++)
{
int
start
;
if
(
i
==
0
)
{
start
=
startRange
;
}
else
{
start
=
used
.
get
(
i
-
1
).
end
;
}
int
end
;
if
(
i
==
used
.
size
()
||
used
.
get
(
i
).
start
>
endRange
)
{
end
=
endRange
;
}
else
{
end
=
used
.
get
(
i
).
start
;
}
if
(
end
-
start
>=
taskLength
)
{
int
taskStart
=
start
;
int
taskEnd
=
start
+
taskLength
;
LineSegment
s
=
new
LineSegment
(
taskId
,
taskStart
,
taskEnd
);
result
.
add
(
s
);
used
.
add
(
i
,
s
);
break
;
}
}
}
}
return
result
;
}
public
List
<
LineSegment
>
scheduleLineSegments
(
List
<
LineSegment
>
used
,
List
<
Line
>
newTasks
)
{
used
.
sort
(
Comparator
.
comparingInt
(
a
->
a
.
start
));
List
<
LineSegment
>
result
=
new
ArrayList
<>();
for
(
Line
task
:
newTasks
)
{
String
taskId
=
task
.
id
;
int
taskLength
=
task
.
length
;
boolean
scheduled
=
false
;
int
startRange
=
480
;
int
endRange
=
1440
;
if
(!
scheduled
)
{
for
(
int
i
=
0
;
i
<=
used
.
size
();
i
++)
{
int
start
;
if
(
i
==
0
)
{
start
=
startRange
;
}
else
{
start
=
used
.
get
(
i
-
1
).
end
;
}
int
end
;
if
(
i
==
used
.
size
()
||
used
.
get
(
i
).
start
>
endRange
)
{
end
=
endRange
;
}
else
{
end
=
used
.
get
(
i
).
start
;
}
if
(
end
-
start
>=
taskLength
)
{
int
taskStart
=
start
;
int
taskEnd
=
start
+
taskLength
;
LineSegment
s
=
new
LineSegment
(
taskId
,
taskStart
,
taskEnd
);
result
.
add
(
s
);
used
.
add
(
i
,
s
);
break
;
}
}
}
}
return
result
;
}
}
class
OrderRequestScheduler
{
public
List
<
LineSegment
>
scheduler
(
List
<
OrderInfoEntity
>
orderRequests
,
List
<
OrderInfoEntity
>
orderAppointments
)
{
List
<
LineSegment
>
used
=
new
ArrayList
<>();
for
(
OrderInfoEntity
o
:
orderAppointments
)
{
LineSegment
s
=
new
LineSegment
(
o
.
getOrderId
(),
this
.
localTime2LinePoint
(
o
.
getPlanStartTime
()),
this
.
localTime2LinePoint
(
o
.
getPlanEndTime
()));
used
.
add
(
s
);
}
List
<
Line
>
newTasks
=
new
ArrayList
<>();
for
(
OrderInfoEntity
o
:
orderRequests
)
{
if
(!
o
.
getAppointmentStatus
().
equals
(
"INIT"
))
{
continue
;
}
Line
t
=
new
Line
(
o
.
getOrderId
(),
30
);
newTasks
.
add
(
t
);
}
if
(
newTasks
.
isEmpty
())
{
List
<
LineSegment
>
empty
=
new
ArrayList
<>();
return
empty
;
}
LineSegmentScheduler
scheduler
=
new
LineSegmentScheduler
();
return
scheduler
.
scheduleLineSegments
(
used
,
newTasks
);
}
public
int
localTime2LinePoint
(
LocalDateTime
datetime
)
{
return
datetime
.
getHour
()
*
60
+
datetime
.
getMinute
();
}
public
LocalDateTime
linePoint2DateTime
(
int
x
,
String
date
)
{
int
base
=
60
;
int
hour
=
x
/
base
;
int
minute
=
x
%
base
;
String
datetime
=
String
.
format
(
"%s %02d:%02d:00"
,
date
,
hour
,
minute
);
return
TimeUtils
.
IsoDateTime2LocalDateTime
(
datetime
);
}
public
List
<
LineSegment
>
scheduler
(
List
<
OrderInfoEntity
>
orderRequests
,
List
<
OrderInfoEntity
>
orderAppointments
)
{
List
<
LineSegment
>
used
=
new
ArrayList
<>();
for
(
OrderInfoEntity
o
:
orderAppointments
)
{
LineSegment
s
=
new
LineSegment
(
o
.
getOrderId
(),
this
.
localTime2LinePoint
(
o
.
getPlanStartTime
()),
this
.
localTime2LinePoint
(
o
.
getPlanEndTime
()));
used
.
add
(
s
);
}
List
<
Line
>
newTasks
=
new
ArrayList
<>();
for
(
OrderInfoEntity
o
:
orderRequests
)
{
if
(!
o
.
getAppointmentStatus
().
equals
(
"INIT"
))
{
continue
;
}
Line
t
=
new
Line
(
o
.
getOrderId
(),
30
);
newTasks
.
add
(
t
);
}
if
(
newTasks
.
isEmpty
())
{
List
<
LineSegment
>
empty
=
new
ArrayList
<>();
return
empty
;
}
LineSegmentScheduler
scheduler
=
new
LineSegmentScheduler
();
return
scheduler
.
scheduleLineSegments
(
used
,
newTasks
);
}
public
int
localTime2LinePoint
(
LocalDateTime
datetime
)
{
return
datetime
.
getHour
()
*
60
+
datetime
.
getMinute
();
}
public
LocalDateTime
linePoint2DateTime
(
int
x
,
String
date
)
{
int
base
=
60
;
int
hour
=
x
/
base
;
int
minute
=
x
%
base
;
String
datetime
=
String
.
format
(
"%s %02d:%02d:00"
,
date
,
hour
,
minute
);
return
TimeUtils
.
IsoDateTime2LocalDateTime
(
datetime
);
}
}
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