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 e1d5b5b7
authored
Nov 15, 2023
by
刘鑫
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(改派距离查询): 新增改派根据距离查询工程师逻辑
1 parent
ac7f53ee
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
132 additions
and
22 deletions
project-order/src/main/java/com/dituhui/pea/order/controller/OrderAssignController.java
project-order/src/main/java/com/dituhui/pea/order/dao/EngineerSkillGroupDao.java
project-order/src/main/java/com/dituhui/pea/order/dto/param/RecommendEngineersReq.java
project-order/src/main/java/com/dituhui/pea/order/service/impl/OrderAssignImpl.java
project-order/src/main/java/com/dituhui/pea/order/controller/OrderAssignController.java
View file @
e1d5b5b
...
@@ -2,7 +2,6 @@ package com.dituhui.pea.order.controller;
...
@@ -2,7 +2,6 @@ package com.dituhui.pea.order.controller;
import
com.dituhui.pea.common.BusinessException
;
import
com.dituhui.pea.common.BusinessException
;
import
com.dituhui.pea.common.Result
;
import
com.dituhui.pea.common.Result
;
import
com.dituhui.pea.order.common.TimeUtils
;
import
com.dituhui.pea.order.dto.OrderAssignReq
;
import
com.dituhui.pea.order.dto.OrderAssignReq
;
import
com.dituhui.pea.order.dto.OrderReschedule
;
import
com.dituhui.pea.order.dto.OrderReschedule
;
import
com.dituhui.pea.order.dto.OrderRevokeAssign
;
import
com.dituhui.pea.order.dto.OrderRevokeAssign
;
...
@@ -10,10 +9,12 @@ import com.dituhui.pea.order.dto.param.RecommendEngineersReq;
...
@@ -10,10 +9,12 @@ import com.dituhui.pea.order.dto.param.RecommendEngineersReq;
import
com.dituhui.pea.order.service.OrderAssign
;
import
com.dituhui.pea.order.service.OrderAssign
;
import
com.dituhui.pea.order.service.OrderInfoService
;
import
com.dituhui.pea.order.service.OrderInfoService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
...
...
project-order/src/main/java/com/dituhui/pea/order/dao/EngineerSkillGroupDao.java
View file @
e1d5b5b
package
com
.
dituhui
.
pea
.
order
.
dao
;
package
com
.
dituhui
.
pea
.
order
.
dao
;
import
com.dituhui.pea.order.entity.EngineerSkillGroupEntity
;
import
com.dituhui.pea.order.entity.EngineerSkillGroupEntity
;
import
com.dituhui.pea.order.entity.SkillGroupEntity
;
import
org.hibernate.annotations.Where
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.stereotype.Repository
;
import
java.util.List
;
import
java.util.List
;
@Where
(
clause
=
" status = 1"
)
public
interface
EngineerSkillGroupDao
extends
JpaRepository
<
EngineerSkillGroupEntity
,
Integer
>
{
public
interface
EngineerSkillGroupDao
extends
JpaRepository
<
EngineerSkillGroupEntity
,
Integer
>
{
List
<
EngineerSkillGroupEntity
>
findByEngineerCode
(
String
engineerCode
);
List
<
EngineerSkillGroupEntity
>
findByEngineerCode
(
String
engineerCode
);
...
...
project-order/src/main/java/com/dituhui/pea/order/dto/param/RecommendEngineersReq.java
View file @
e1d5b5b
...
@@ -5,9 +5,24 @@ import lombok.Data;
...
@@ -5,9 +5,24 @@ import lombok.Data;
@Data
@Data
public
class
RecommendEngineersReq
{
public
class
RecommendEngineersReq
{
/**
* 工单ID
*/
private
String
orderId
;
private
String
orderId
;
/**
* 待补充doc
*/
private
String
key
;
private
String
key
;
private
String
distance
;
/**
* 距离范围(单位:KM), 不传默认10.0 KM
*/
private
Double
distance
;
/**
* 待补充doc
*/
private
String
recommend
;
private
String
recommend
;
/**
* 待补充doc
*/
private
String
userId
;
private
String
userId
;
}
}
project-order/src/main/java/com/dituhui/pea/order/service/impl/OrderAssignImpl.java
View file @
e1d5b5b
...
@@ -5,14 +5,45 @@ import com.dituhui.pea.common.BusinessException;
...
@@ -5,14 +5,45 @@ import com.dituhui.pea.common.BusinessException;
import
com.dituhui.pea.common.Result
;
import
com.dituhui.pea.common.Result
;
import
com.dituhui.pea.common.ResultEnum
;
import
com.dituhui.pea.common.ResultEnum
;
import
com.dituhui.pea.enums.StatusCodeEnum
;
import
com.dituhui.pea.enums.StatusCodeEnum
;
import
com.dituhui.pea.order.common.DateUtils
;
import
com.dituhui.pea.order.common.OrderAssignCheck
;
import
com.dituhui.pea.order.common.OrderAssignCheck
;
import
com.dituhui.pea.order.common.Stapial4jUtil
;
import
com.dituhui.pea.order.common.TimeUtils
;
import
com.dituhui.pea.order.common.TimeUtils
;
import
com.dituhui.pea.order.dao.*
;
import
com.dituhui.pea.order.dao.EngineerBusinessDao
;
import
com.dituhui.pea.order.dto.*
;
import
com.dituhui.pea.order.dao.EngineerInfoDao
;
import
com.dituhui.pea.order.dao.EngineerSkillGroupDao
;
import
com.dituhui.pea.order.dao.OrderInfoDao
;
import
com.dituhui.pea.order.dao.OrgBranchDao
;
import
com.dituhui.pea.order.dao.OrgGroupDao
;
import
com.dituhui.pea.order.dao.OrgTeamDao
;
import
com.dituhui.pea.order.dao.OrgTeamEngineerDao
;
import
com.dituhui.pea.order.dao.SkillInfoDao
;
import
com.dituhui.pea.order.dto.LabelValueDTO
;
import
com.dituhui.pea.order.dto.MsgDTO
;
import
com.dituhui.pea.order.dto.OrderAssignRecommendResp
;
import
com.dituhui.pea.order.dto.OrderAssignReq
;
import
com.dituhui.pea.order.dto.OrderReschedule
;
import
com.dituhui.pea.order.dto.TimeLineDTO
;
import
com.dituhui.pea.order.dto.param.Location
;
import
com.dituhui.pea.order.dto.param.RecommendEngineersReq
;
import
com.dituhui.pea.order.dto.param.RecommendEngineersReq
;
import
com.dituhui.pea.order.entity.*
;
import
com.dituhui.pea.order.entity.EngineerBusinessEntity
;
import
com.dituhui.pea.order.enums.*
;
import
com.dituhui.pea.order.entity.EngineerInfoEntity
;
import
com.dituhui.pea.order.service.*
;
import
com.dituhui.pea.order.entity.EngineerSkillGroupEntity
;
import
com.dituhui.pea.order.entity.OrderInfoEntity
;
import
com.dituhui.pea.order.entity.OrgTeamEngineerEntity
;
import
com.dituhui.pea.order.entity.OrgTeamEntity
;
import
com.dituhui.pea.order.entity.SkillInfoEntity
;
import
com.dituhui.pea.order.enums.AppointmentMethodEnum
;
import
com.dituhui.pea.order.enums.OrderEventEnum
;
import
com.dituhui.pea.order.enums.OrderFlowEnum
;
import
com.dituhui.pea.order.enums.OrderStatusEnum
;
import
com.dituhui.pea.order.enums.ServiceStatusEnum
;
import
com.dituhui.pea.order.service.CapacityQueryService
;
import
com.dituhui.pea.order.service.CommonService
;
import
com.dituhui.pea.order.service.FendanService
;
import
com.dituhui.pea.order.service.MsgService
;
import
com.dituhui.pea.order.service.OrderAssign
;
import
com.dituhui.pea.order.service.OrderInfoService
;
import
com.dituhui.pea.order.utils.CommonUtil
;
import
com.dituhui.pea.order.utils.CommonUtil
;
import
com.dituhui.pea.order.utils.OrderUtil
;
import
com.dituhui.pea.order.utils.OrderUtil
;
import
com.dituhui.pea.pojo.user.OrgInfo
;
import
com.dituhui.pea.pojo.user.OrgInfo
;
...
@@ -29,8 +60,17 @@ import javax.persistence.criteria.CriteriaBuilder;
...
@@ -29,8 +60,17 @@ import javax.persistence.criteria.CriteriaBuilder;
import
javax.persistence.criteria.CriteriaQuery
;
import
javax.persistence.criteria.CriteriaQuery
;
import
javax.persistence.criteria.Predicate
;
import
javax.persistence.criteria.Predicate
;
import
javax.persistence.criteria.Root
;
import
javax.persistence.criteria.Root
;
import
java.math.BigDecimal
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.Comparator
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
@Service
@Service
...
@@ -85,6 +125,9 @@ public class OrderAssignImpl implements OrderAssign {
...
@@ -85,6 +125,9 @@ public class OrderAssignImpl implements OrderAssign {
@Autowired
@Autowired
private
IUser
userService
;
private
IUser
userService
;
@Autowired
private
EngineerBusinessDao
engineerBusinessDao
;
@Transactional
@Transactional
@Override
@Override
public
Result
<?>
getOrderAssignRecommendEngineers
(
RecommendEngineersReq
req
)
{
public
Result
<?>
getOrderAssignRecommendEngineers
(
RecommendEngineersReq
req
)
{
...
@@ -96,6 +139,7 @@ public class OrderAssignImpl implements OrderAssign {
...
@@ -96,6 +139,7 @@ public class OrderAssignImpl implements OrderAssign {
String
date
=
TimeUtils
.
IsoLocalDate2String
(
order
.
getDt
());
String
date
=
TimeUtils
.
IsoLocalDate2String
(
order
.
getDt
());
// 获取符合筛选条件的技术员
// 获取符合筛选条件的技术员
//FIXME 改造本方法 让其支持标签返回
List
<
String
>
engineerCodes
=
this
.
searchEngineerCodes
(
order
,
req
.
getDistance
(),
req
.
getKey
(),
req
.
getRecommend
(),
req
.
getUserId
());
List
<
String
>
engineerCodes
=
this
.
searchEngineerCodes
(
order
,
req
.
getDistance
(),
req
.
getKey
(),
req
.
getRecommend
(),
req
.
getUserId
());
List
<
EngineerInfoEntity
>
engineers
=
engineerInfoDao
.
findByEngineerCodeIn
(
engineerCodes
);
List
<
EngineerInfoEntity
>
engineers
=
engineerInfoDao
.
findByEngineerCodeIn
(
engineerCodes
);
...
@@ -119,6 +163,7 @@ public class OrderAssignImpl implements OrderAssign {
...
@@ -119,6 +163,7 @@ public class OrderAssignImpl implements OrderAssign {
List
<
OrderInfoEntity
>
orders
=
orderInfoDao
.
findAllByDtAndOrderIdIn
(
order
.
getDt
(),
orderIds
);
List
<
OrderInfoEntity
>
orders
=
orderInfoDao
.
findAllByDtAndOrderIdIn
(
order
.
getDt
(),
orderIds
);
orderTips
=
this
.
packOrderTips
(
orders
);
orderTips
=
this
.
packOrderTips
(
orders
);
}
}
//todo 获取工程师不同位置
OrderAssignRecommendResp
.
Engineer
item
=
new
OrderAssignRecommendResp
.
Engineer
();
OrderAssignRecommendResp
.
Engineer
item
=
new
OrderAssignRecommendResp
.
Engineer
();
...
@@ -253,7 +298,7 @@ public class OrderAssignImpl implements OrderAssign {
...
@@ -253,7 +298,7 @@ public class OrderAssignImpl implements OrderAssign {
return
order
;
return
order
;
}
}
private
List
<
String
>
searchEngineerCodes
(
OrderInfoEntity
order
,
String
distance
,
String
key
,
String
recommend
,
String
userId
)
{
private
List
<
String
>
searchEngineerCodes
(
OrderInfoEntity
order
,
Double
distance
,
String
key
,
String
recommend
,
String
userId
)
{
Set
<
String
>
engineerCodes1
=
this
.
searchEngineerByRecommend
(
order
,
recommend
,
userId
);
Set
<
String
>
engineerCodes1
=
this
.
searchEngineerByRecommend
(
order
,
recommend
,
userId
);
if
(
engineerCodes1
.
isEmpty
())
{
if
(
engineerCodes1
.
isEmpty
())
{
log
.
info
(
"recommend:{}筛选条件未找到技术员"
,
recommend
);
log
.
info
(
"recommend:{}筛选条件未找到技术员"
,
recommend
);
...
@@ -290,14 +335,67 @@ public class OrderAssignImpl implements OrderAssign {
...
@@ -290,14 +335,67 @@ public class OrderAssignImpl implements OrderAssign {
return
new
ArrayList
<>();
return
new
ArrayList
<>();
}
}
/*
// 获取工程师位置(准实时位置)并进行距离判定, distance如果为空值 默认10KM
if (StringUtils.isEmpty(distance)) {
double
orderLongitude
=
Double
.
parseDouble
(
order
.
getX
());
return new ArrayList<>(engineerCodes1);
double
orderLatitude
=
Double
.
parseDouble
(
order
.
getY
());
if
(
Objects
.
isNull
(
distance
))
{
distance
=
10.0
D
;
}
final
BigDecimal
finalDistance
=
BigDecimal
.
valueOf
(
distance
);
return
engineerCodes1
.
stream
()
.
filter
(
engineerCode
->
{
Location
location
=
engineerDateLocation
(
engineerCode
);
BigDecimal
orderAndEngineerDistance
=
BigDecimal
.
valueOf
(
Stapial4jUtil
.
getDistance
(
location
.
getLongitude
(),
location
.
getLatitude
(),
orderLongitude
,
orderLatitude
));
return
orderAndEngineerDistance
.
compareTo
(
finalDistance
)
<=
0
;
}).
collect
(
Collectors
.
toList
());
}
}
//进行距离匹配TODO
*/
return
new
ArrayList
<>(
engineerCodes1
);
private
Location
engineerDateLocation
(
String
engineerCode
)
{
final
LocalDate
currentDate
=
LocalDate
.
now
();
List
<
OrderInfoEntity
>
engineerDateOrderList
=
orderInfoDao
.
getEngineerDateOrder
(
engineerCode
,
DateUtils
.
formatDate
(
currentDate
));
Set
<
String
>
ss
=
Set
.
of
(
"CANCELED"
,
"RESCHEDULED"
);
engineerDateOrderList
=
engineerDateOrderList
.
stream
()
.
filter
(
e
->
!
ss
.
contains
(
e
.
getOrderStatus
()))
.
collect
(
Collectors
.
toList
());
Location
location
=
new
Location
();
//查询工程师已开始的工单
Optional
<
OrderInfoEntity
>
startedOrder
=
engineerDateOrderList
.
stream
()
.
filter
(
e
->
Objects
.
equals
(
"STARTED"
,
e
.
getServiceStatus
()))
.
max
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getPlanStartTime
));
if
(
startedOrder
.
isPresent
())
{
OrderInfoEntity
startedOrderInfo
=
startedOrder
.
get
();
location
.
setAddress
(
startedOrderInfo
.
getAddress
());
location
.
setLongitude
(
Double
.
parseDouble
(
startedOrderInfo
.
getX
()));
location
.
setLatitude
(
Double
.
parseDouble
(
startedOrderInfo
.
getY
()));
return
location
;
}
//如果没有已开始的工单 查询 最后一个已完成工单
Optional
<
OrderInfoEntity
>
finishedOrder
=
engineerDateOrderList
.
stream
()
.
filter
(
e
->
Objects
.
equals
(
"FINISHED"
,
e
.
getServiceStatus
()))
.
max
(
Comparator
.
comparing
(
OrderInfoEntity:
:
getActualEndTime
));
if
(
finishedOrder
.
isPresent
())
{
OrderInfoEntity
finishedOrderInfo
=
finishedOrder
.
get
();
location
.
setAddress
(
finishedOrderInfo
.
getAddress
());
location
.
setLongitude
(
Double
.
parseDouble
(
finishedOrderInfo
.
getX
()));
location
.
setLatitude
(
Double
.
parseDouble
(
finishedOrderInfo
.
getY
()));
}
else
{
// 如果都没有, 则获取工程师出发地址
EngineerBusinessEntity
byEngineerCode
=
engineerBusinessDao
.
getByEngineerCode
(
engineerCode
);
location
.
setAddress
(
byEngineerCode
.
getAddress
());
location
.
setLongitude
(
StringUtils
.
isNotBlank
(
byEngineerCode
.
getX
())
?
Double
.
parseDouble
(
byEngineerCode
.
getX
())
:
0.0
);
location
.
setLatitude
(
StringUtils
.
isNotBlank
(
byEngineerCode
.
getY
())
?
Double
.
parseDouble
(
byEngineerCode
.
getY
())
:
0.0
);
}
return
location
;
}
}
private
Set
<
String
>
searchEngineerByRecommend
(
OrderInfoEntity
order
,
String
recommend
,
String
userId
)
{
private
Set
<
String
>
searchEngineerByRecommend
(
OrderInfoEntity
order
,
String
recommend
,
String
userId
)
{
...
...
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