Commit e1d5b5b7 by 刘鑫

feat(改派距离查询): 新增改派根据距离查询工程师逻辑

1 parent ac7f53ee
...@@ -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;
......
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);
......
...@@ -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;
} }
...@@ -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)) {
//进行距离匹配TODO distance = 10.0D;
*/ }
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());
}
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;
return new ArrayList<>(engineerCodes1);
} }
private Set<String> searchEngineerByRecommend(OrderInfoEntity order, String recommend, String userId) { private Set<String> searchEngineerByRecommend(OrderInfoEntity order, String recommend, String userId) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!