Commit 3bf5db3f by 刘鑫

feat(改派推荐工程师): 新增推荐工程师标签支持

1 parent 40064b6c
...@@ -11,7 +11,6 @@ import java.util.List; ...@@ -11,7 +11,6 @@ import java.util.List;
@Repository @Repository
@Where(clause = "status = 1")
public interface OrgTeamEngineerDao extends JpaRepository<OrgTeamEngineerEntity, Integer> { public interface OrgTeamEngineerDao extends JpaRepository<OrgTeamEngineerEntity, Integer> {
@Query("select t from OrgTeamEngineerEntity t where t.teamId = :teamId and t.status=1") @Query("select t from OrgTeamEngineerEntity t where t.teamId = :teamId and t.status=1")
......
package com.dituhui.pea.order.dto; package com.dituhui.pea.order.dto;
import com.dituhui.pea.order.enums.TestimonialsEngineerTag;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
...@@ -14,7 +15,10 @@ public class OrderAssignRecommendResp { ...@@ -14,7 +15,10 @@ public class OrderAssignRecommendResp {
private String engineerCode; private String engineerCode;
private String engineerName; private String engineerName;
private String location; private String location;
private String distanceDesc; /**
* 工程师标签
*/
private TestimonialsEngineerTag distanceDesc;
private String timeDesc; private String timeDesc;
private String desc; private String desc;
private String startTime; private String startTime;
......
...@@ -2,6 +2,7 @@ package com.dituhui.pea.order.entity; ...@@ -2,6 +2,7 @@ package com.dituhui.pea.order.entity;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.hibernate.annotations.Where;
import javax.persistence.*; import javax.persistence.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -10,6 +11,7 @@ import java.util.Date; ...@@ -10,6 +11,7 @@ import java.util.Date;
@Entity @Entity
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@Where(clause = "status = 1")
@Table(name = "org_team_engineer") @Table(name = "org_team_engineer")
public class OrgTeamEngineerEntity { public class OrgTeamEngineerEntity {
......
package com.dituhui.pea.order.enums;
import lombok.Getter;
/**
* 推荐工程师标签
*/
@Getter
public enum TestimonialsEngineerTag {
/**
* 队内 ,和工单现有人员同属一个小队
*/
TEAM,
/**
* 周边, 不同队 但在10KM内
*/
PERIPHERAL,
/**
* 搜索, 通过搜索出来的人
*/
SEARCH;
}
...@@ -38,6 +38,7 @@ import com.dituhui.pea.order.enums.OrderEventEnum; ...@@ -38,6 +38,7 @@ import com.dituhui.pea.order.enums.OrderEventEnum;
import com.dituhui.pea.order.enums.OrderFlowEnum; import com.dituhui.pea.order.enums.OrderFlowEnum;
import com.dituhui.pea.order.enums.OrderStatusEnum; import com.dituhui.pea.order.enums.OrderStatusEnum;
import com.dituhui.pea.order.enums.ServiceStatusEnum; import com.dituhui.pea.order.enums.ServiceStatusEnum;
import com.dituhui.pea.order.enums.TestimonialsEngineerTag;
import com.dituhui.pea.order.service.CapacityQueryService; import com.dituhui.pea.order.service.CapacityQueryService;
import com.dituhui.pea.order.service.CommonService; import com.dituhui.pea.order.service.CommonService;
import com.dituhui.pea.order.service.FendanService; import com.dituhui.pea.order.service.FendanService;
...@@ -48,6 +49,9 @@ import com.dituhui.pea.order.utils.CommonUtil; ...@@ -48,6 +49,9 @@ 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;
import com.dituhui.pea.user.IUser; import com.dituhui.pea.user.IUser;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -69,6 +73,7 @@ import java.util.Comparator; ...@@ -69,6 +73,7 @@ import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
...@@ -140,14 +145,21 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -140,14 +145,21 @@ 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<TempEngineer> engineerLocationList = this.searchEngineerCodes(order, req.getDistance(), req.getKey(), req.getRecommend(), req.getUserId());
List<String> engineerCodes = engineerLocationList.stream().map(TempEngineer::getEngineerCode).collect(Collectors.toList());
Map<String, TempEngineer> engineerDistanceMap = engineerLocationList.stream().collect(Collectors.toMap(
TempEngineer::getEngineerCode,
a -> a,
(k1, k2) -> k1));
List<EngineerInfoEntity> engineers = engineerInfoDao.findByEngineerCodeIn(engineerCodes); List<EngineerInfoEntity> engineers = engineerInfoDao.findByEngineerCodeIn(engineerCodes);
List<OrderAssignRecommendResp.Engineer> items = new ArrayList<>(); List<OrderAssignRecommendResp.Engineer> items = new ArrayList<>();
final String orgTeamId = order.getOrgTeamId();
final BigDecimal judgeDistance = new BigDecimal("10");
for (EngineerInfoEntity engineer : engineers) { for (EngineerInfoEntity engineer : engineers) {
OrderAssignCheck.Result result = orderAssignCheck.orderAssignCheck(req.getOrderId(), order.getDt(), engineer.getEngineerCode()); final String engineerCode = engineer.getEngineerCode();
OrderAssignCheck.Result result = orderAssignCheck.orderAssignCheck(req.getOrderId(), order.getDt(), engineerCode);
log.info("指派检查结果:{}", result); log.info("指派检查结果:{}", result);
if (result.getIndex() < 0) { if (result.getIndex() < 0) {
continue; continue;
...@@ -155,7 +167,7 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -155,7 +167,7 @@ public class OrderAssignImpl implements OrderAssign {
// 获取已技术员已指派订单列表 // 获取已技术员已指派订单列表
List<OrderInfoEntity> orderAppointments = orderInfoDao.findByEngineerCodeAndDtAndAppointmentStatusIn( List<OrderInfoEntity> orderAppointments = orderInfoDao.findByEngineerCodeAndDtAndAppointmentStatusIn(
engineer.getEngineerCode(), order.getDt(), List.of(OrderFlowEnum.CONFIRM.name()), null); engineerCode, order.getDt(), List.of(OrderFlowEnum.CONFIRM.name()), null);
// 获取订单tips // 获取订单tips
HashMap<String, List<LabelValueDTO>> orderTips = new HashMap<>(); HashMap<String, List<LabelValueDTO>> orderTips = new HashMap<>();
...@@ -164,8 +176,6 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -164,8 +176,6 @@ 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();
OrderAssignRecommendResp.InsertInfo insertInfo = new OrderAssignRecommendResp.InsertInfo(); OrderAssignRecommendResp.InsertInfo insertInfo = new OrderAssignRecommendResp.InsertInfo();
...@@ -173,11 +183,23 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -173,11 +183,23 @@ public class OrderAssignImpl implements OrderAssign {
insertInfo.setTimeDesc(String.format("+%d分钟", result.getAdditionElapsed())); insertInfo.setTimeDesc(String.format("+%d分钟", result.getAdditionElapsed()));
insertInfo.setDistanceDesc(String.format("+%d公里", result.getAdditionDistance() / 1000)); insertInfo.setDistanceDesc(String.format("+%d公里", result.getAdditionDistance() / 1000));
item.setEngineerCode(engineer.getEngineerCode()); TestimonialsEngineerTag engineerTag;
//标签判定
//判定当前工程师是否在队内, 否则判定是否在10KM内, 否则
TempEngineer tempEngineer = engineerDistanceMap.get(engineerCode);
if (Objects.nonNull(orgTeamEngineerDao.findByTeamIdAndEngineerCode(orgTeamId, engineerCode))) {
engineerTag = TestimonialsEngineerTag.TEAM;
} else if (tempEngineer.getDistance().compareTo(judgeDistance) <= 0) {
engineerTag = TestimonialsEngineerTag.PERIPHERAL;
} else {
engineerTag = TestimonialsEngineerTag.SEARCH;
}
item.setEngineerCode(engineerCode);
item.setEngineerName(engineer.getName()); item.setEngineerName(engineer.getName());
item.setLocation(String.format("%s,%s", order.getX(), order.getY())); item.setLocation(String.format("%s,%s", order.getX(), order.getY()));
item.setInsertInfo(insertInfo); item.setInsertInfo(insertInfo);
item.setDistanceDesc(""); item.setDistanceDesc(engineerTag);
item.setTimeDesc(""); item.setTimeDesc("");
int index = result.getIndex() + 1; int index = result.getIndex() + 1;
...@@ -299,7 +321,7 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -299,7 +321,7 @@ public class OrderAssignImpl implements OrderAssign {
return order; return order;
} }
private List<String> searchEngineerCodes(OrderInfoEntity order, Double distance, String key, String recommend, String userId) { private List<TempEngineer> 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);
...@@ -339,20 +361,37 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -339,20 +361,37 @@ public class OrderAssignImpl implements OrderAssign {
// 获取工程师位置(准实时位置)并进行距离判定, distance如果为空值 默认10KM // 获取工程师位置(准实时位置)并进行距离判定, distance如果为空值 默认10KM
double orderLongitude = Double.parseDouble(order.getX()); double orderLongitude = Double.parseDouble(order.getX());
double orderLatitude = Double.parseDouble(order.getY()); double orderLatitude = Double.parseDouble(order.getY());
if (Objects.nonNull(distance)) {
final BigDecimal finalDistance = BigDecimal.valueOf(distance); //均计算距离
return engineerCodes1.stream() List<TempEngineer> result = engineerCodes1.stream()
.filter(engineerCode -> { .map(engineerCode -> {
Location location = engineerDateLocation(engineerCode); Location location = engineerDateLocation(engineerCode);
BigDecimal orderAndEngineerDistance = BigDecimal.valueOf(Stapial4jUtil.getDistance(location.getLongitude(), location.getLatitude(), BigDecimal orderAndEngineerDistance = BigDecimal.valueOf(Stapial4jUtil.getDistance(location.getLongitude(), location.getLatitude(),
orderLongitude, orderLatitude)); orderLongitude, orderLatitude));
return orderAndEngineerDistance.compareTo(finalDistance) <= 0; return new TempEngineer(engineerCode, orderAndEngineerDistance);
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} // 距离过滤
if (Objects.nonNull(distance)) {
final BigDecimal finalDistance = BigDecimal.valueOf(distance);
return new ArrayList<>(engineerCodes1); // return ;
result = result.stream().filter(t -> t.getDistance().compareTo(finalDistance) <= 0).collect(Collectors.toList());
}
return result;
}
@Setter
@Getter
@AllArgsConstructor
class TempEngineer {
/**
* 工程师编号
*/
private String engineerCode;
/**
* 距离 (KM)
*/
private BigDecimal distance;
} }
private Location engineerDateLocation(String engineerCode) { private Location engineerDateLocation(String engineerCode) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!