Commit 99e48267 by 刘鑫

Merge branch 'develop' of https://gitlab.dituhui.com/bsh/project/project into develop

2 parents 41e6e700 bb5efd87
...@@ -14,15 +14,11 @@ spring: ...@@ -14,15 +14,11 @@ spring:
uri: lb://project-gis uri: lb://project-gis
predicates: predicates:
- Path=/gis/** - Path=/gis/**
- id: district
uri: lb://project-district
predicates:
- Path=/district/**
- id: dispatch - id: dispatch
uri: lb://project-dispatch uri: lb://project-dispatch
predicates: predicates:
- Path=/dispatch/** - Path=/pea-dispatch/**
auth: auth:
path: /pea-user/**,/pea-role/**,/pea-order/**,/test/**,/v1/**,/gis/** # 需要认证的路边列表,多个用逗号连接 path: /pea-user/**,/pea-role/**,/pea-order/**,/test/**,/v1/**,/pea-dispatch/** # 需要认证的路边列表,多个用逗号连接
...@@ -26,6 +26,9 @@ public class PathController implements IPath { ...@@ -26,6 +26,9 @@ public class PathController implements IPath {
@Autowired @Autowired
OrderInfoRepository orderInfoRepository; OrderInfoRepository orderInfoRepository;
@Autowired
RoadDistanceUtils roadDistanceUtils;
@Override @Override
public Result<DistanceDTO> getRoadDistance(String fromOrderId, String toOrderId, Integer vehicleType) { public Result<DistanceDTO> getRoadDistance(String fromOrderId, String toOrderId, Integer vehicleType) {
try { try {
...@@ -46,13 +49,17 @@ public class PathController implements IPath { ...@@ -46,13 +49,17 @@ public class PathController implements IPath {
|| StringUtils.isEmpty(toOrders.get(0).getX()) || StringUtils.isEmpty(toOrders.get(0).getY())) { || StringUtils.isEmpty(toOrders.get(0).getX()) || StringUtils.isEmpty(toOrders.get(0).getY())) {
return Result.failure("missing coordinates"); return Result.failure("missing coordinates");
} }
float fromX = Float.parseFloat(fromOrders.get(0).getX()),
fromY = Float.parseFloat(fromOrders.get(0).getY()), toX = Float.parseFloat(toOrders.get(0).getX()),
toY = Float.parseFloat(toOrders.get(0).getY());
if (fromX < 1 || fromY < 1 || toX < 1 || toY < 1) {
System.out.println(fromX + "," + fromY + ";" + toX + "," + toY);
return Result.failure("invalid coordinates");
}
// 获取距离 // 获取距离
Distance distance = RoadDistanceUtils.getDistance( Distance distance = roadDistanceUtils.getDistance2(new Location(0L, null, null, fromX, fromY),
new Location(0L, Float.parseFloat(fromOrders.get(0).getX()), new Location(0L, null, null, toX, toY), vehicleType);
Float.parseFloat(fromOrders.get(0).getY())),
new Location(0L, Float.parseFloat(toOrders.get(0).getX()),
Float.parseFloat(toOrders.get(0).getY())),
vehicleType);
DistanceDTO dto = new DistanceDTO(); DistanceDTO dto = new DistanceDTO();
dto.setDis(distance.getDis()); dto.setDis(distance.getDis());
dto.setTime(distance.getTime()); dto.setTime(distance.getTime());
......
...@@ -10,11 +10,14 @@ import java.util.HashMap; ...@@ -10,11 +10,14 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.springframework.stereotype.Component;
import com.dituhui.pea.dispatch.pojo.Location; import com.dituhui.pea.dispatch.pojo.Location;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/** /**
* 路网组件<br> * 路网组件<br>
...@@ -24,6 +27,8 @@ import lombok.Data; ...@@ -24,6 +27,8 @@ import lombok.Data;
* @author gpzhang * @author gpzhang
* *
*/ */
@Component
@Slf4j
public class RoadDistanceUtils { public class RoadDistanceUtils {
public static String URL = "https://api.map.baidu.com/routematrix/v2/"; public static String URL = "https://api.map.baidu.com/routematrix/v2/";
...@@ -37,6 +42,40 @@ public class RoadDistanceUtils { ...@@ -37,6 +42,40 @@ public class RoadDistanceUtils {
/** /**
* 获取路网距离和时间<br> * 获取路网距离和时间<br>
*
* @param from
* @param to
* @param vehicleType 不能为空
* @return
*/
public Distance getDistance2(Location from, Location to, int vehicleType) {
try {
String key = from.getLongitude() + "," + from.getLatitude() + ";" + to.getLongitude() + ","
+ to.getLatitude() + "|" + vehicleType;
Distance distance = distanceCache.get(key);
if (null == distance) {
distance = getDistance(from.getLatitude() + "," + from.getLongitude(),
to.getLatitude() + "," + to.getLongitude(), vehicleType);
log.info(key + " " + distance);
if (null == distance) {
Distance dis = new Distance();
return dis;
} else {
distanceCache.put(key, distance);
}
return distance;
} else {
log.info(key + " from cache " + distance);
return distance;
}
} catch (Exception e) {
Distance dis = new Distance();
return dis;
}
}
/**
* 获取路网距离和时间<br>
* TODO 需要做成分布式缓存模式,这里会造成内存问题<br> * TODO 需要做成分布式缓存模式,这里会造成内存问题<br>
* TODO 调用方式需要改成批量调用方式 * TODO 调用方式需要改成批量调用方式
* *
...@@ -97,6 +136,7 @@ public class RoadDistanceUtils { ...@@ -97,6 +136,7 @@ public class RoadDistanceUtils {
} }
String text = requestGetAK(url, params); String text = requestGetAK(url, params);
System.out.println(url + " : " + gson.toJson(params) + " : " + text);
BDResult webResult = gson.fromJson(text, BDResult.class); BDResult webResult = gson.fromJson(text, BDResult.class);
float dis = webResult.getResult().get(0).getDistance().getValue() / 1000F; float dis = webResult.getResult().get(0).getDistance().getValue() / 1000F;
int time = webResult.getResult().get(0).getDuration().getValue(); int time = webResult.getResult().get(0).getDuration().getValue();
......
...@@ -26,7 +26,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; ...@@ -26,7 +26,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
*/ */
@SpringBootApplication @SpringBootApplication
@EnableScheduling @EnableScheduling
@EnableFeignClients(basePackages = {"com.dituhui.pea.user", "com.dituhui.pea.order"}) @EnableFeignClients(basePackages = {"com.dituhui.pea.user", "com.dituhui.pea.order", "com.dituhui.pea.dispatch"})
public class OrderServiceApplication { public class OrderServiceApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -236,6 +236,27 @@ public class PeaApiController { ...@@ -236,6 +236,27 @@ public class PeaApiController {
if (StringUtils.isBlank(request.getOrderId())) { if (StringUtils.isBlank(request.getOrderId())) {
return Result.failed(StatusCodeEnum.COMMON_PARAM_EMPTY); return Result.failed(StatusCodeEnum.COMMON_PARAM_EMPTY);
} }
if (StringUtils.isNotBlank(request.getBrand())) {
TypeCodeCheckTableEntity brand = tableCodeCheckDao.findByTypeAndCode("BRAND", request.getBrand());
if (Objects.isNull(brand)) {
throw new BusinessException("查询不到:" + request.getBrand() + "对应的品牌");
}
request.setBrand(brand.getName());
}
if (StringUtils.isNotBlank(request.getProductType())) {
TypeCodeCheckTableEntity type = tableCodeCheckDao.findByTypeAndCode("TYPE", request.getProductType());
if (Objects.isNull(type)) {
throw new BusinessException("查询不到:" + request.getProductType() + "对应的产品类型");
}
request.setProductType(type.getName());
}
if (StringUtils.isNotBlank(request.getServiceType())) {
TypeCodeCheckTableEntity skill = tableCodeCheckDao.findByTypeAndCode("SKILL", request.getServiceType());
if (Objects.isNull(skill)) {
throw new BusinessException("查询不到:" + request.getServiceType() + "对应的技能");
}
request.setServiceType(skill.getName());
}
return orderInfoService.orderStageChanged(request); return orderInfoService.orderStageChanged(request);
} }
......
...@@ -100,5 +100,9 @@ public class DispatchOrderListResp { ...@@ -100,5 +100,9 @@ public class DispatchOrderListResp {
* bean标签 * bean标签
*/ */
private String beanTags; private String beanTags;
private String x;
private String y;
} }
} }
package com.dituhui.pea.order.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class OrderSegment {
private String orderId;
private LocalDateTime start;
private LocalDateTime end;
private double x;
private double y;
private int takeTime;
private int elapsed;
private int distance;
public OrderSegment() {
}
public OrderSegment(LocalDateTime start, LocalDateTime end, double x, double y, int takeTime, int elapsed, int distance) {
this.start = start;
this.end = end;
this.x = x;
this.y = y;
this.takeTime = takeTime;
this.elapsed = elapsed;
this.distance = distance;
}
}
...@@ -96,6 +96,11 @@ public class OrderServiceDetailResp { ...@@ -96,6 +96,11 @@ public class OrderServiceDetailResp {
private String address; private String address;
private String date; private String date;
/**
* 是否超派,0否 1是,默认0
*/
private Integer transcend;
// //
// @Data // @Data
// @JsonInclude(JsonInclude.Include.NON_NULL) // @JsonInclude(JsonInclude.Include.NON_NULL)
......
...@@ -86,4 +86,22 @@ public class OrderServiceList { ...@@ -86,4 +86,22 @@ public class OrderServiceList {
*/ */
private String actualEndTime; private String actualEndTime;
/**
* bean同步地址id
*/
private String addressId;
/**
* 是否是cutoff,0否 1是 默认0
*/
private Integer isCutoff;
/**
* 改约原因
*/
private String reschedulingReason;
private String planStartTime;
private String planEndTime;
} }
...@@ -98,4 +98,14 @@ public class OrderInfo { ...@@ -98,4 +98,14 @@ public class OrderInfo {
* 是否是特殊时间段,0否 1是 默认0 * 是否是特殊时间段,0否 1是 默认0
*/ */
private Integer isSpecialTime; private Integer isSpecialTime;
/**
* 是否是cutoff,0否 1是 默认0
*/
private Integer isCutoff;
/**
* 改约原因
*/
private String reschedulingReason;
} }
\ No newline at end of file
...@@ -3,8 +3,13 @@ package com.dituhui.pea.order.service; ...@@ -3,8 +3,13 @@ package com.dituhui.pea.order.service;
import com.dituhui.pea.common.Result; import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dto.OrderReschedule; import com.dituhui.pea.order.dto.OrderReschedule;
import com.dituhui.pea.order.dto.param.OrderDTO; import com.dituhui.pea.order.dto.param.OrderDTO;
import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.OrderInfoEntity;
import com.dituhui.pea.order.entity.OrgTeamEntity;
import com.dituhui.pea.order.entity.SkillInfoEntity;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List;
/** /**
* 订单相关 * 订单相关
...@@ -51,4 +56,17 @@ public interface OrderInfoService { ...@@ -51,4 +56,17 @@ public interface OrderInfoService {
* @return * @return
*/ */
Result<?> orderReschedulingReason(); Result<?> orderReschedulingReason();
/**
* 根据工程师当日订单插入订单
*
* @param skillInfo 待指派订单技能
* @param engineerOrders 待指派工程师当日工单
* @param insertOrder 待指派订单
* @param orgTeam 待指派工程师团队
* @param engineer 指派工程师
* @return
*/
public Result<OrderInfoEntity> insterEngineerOrders(List<OrderInfoEntity> engineerOrders, OrderInfoEntity insertOrder, SkillInfoEntity skillInfo, OrgTeamEntity orgTeam, EngineerInfoEntity engineer);
} }
...@@ -3,6 +3,7 @@ package com.dituhui.pea.order.service.impl; ...@@ -3,6 +3,7 @@ package com.dituhui.pea.order.service.impl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
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.common.ResultEnum;
import com.dituhui.pea.enums.StatusCodeEnum; import com.dituhui.pea.enums.StatusCodeEnum;
import com.dituhui.pea.order.common.ListUtils; import com.dituhui.pea.order.common.ListUtils;
import com.dituhui.pea.order.common.TimeUtils; import com.dituhui.pea.order.common.TimeUtils;
...@@ -15,6 +16,7 @@ import com.dituhui.pea.order.entity.*; ...@@ -15,6 +16,7 @@ import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.enums.*; import com.dituhui.pea.order.enums.*;
import com.dituhui.pea.order.service.CommonService; import com.dituhui.pea.order.service.CommonService;
import com.dituhui.pea.order.service.DispatchService; import com.dituhui.pea.order.service.DispatchService;
import com.dituhui.pea.order.service.OrderInfoService;
import com.dituhui.pea.order.utils.CommonUtil; import com.dituhui.pea.order.utils.CommonUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
...@@ -69,6 +71,9 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -69,6 +71,9 @@ public class DispatchServiceImpl implements DispatchService {
@Autowired @Autowired
private CommonService commonService; private CommonService commonService;
@Autowired
private OrderInfoService orderInfoService;
@Transactional @Transactional
@Override @Override
public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) { public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) {
...@@ -275,7 +280,6 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -275,7 +280,6 @@ public class DispatchServiceImpl implements DispatchService {
@Override @Override
public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException { public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException {
// 派工台确认派单 // 派工台确认派单
LocalDate localDate = TimeUtils.IsoDate2LocalDate(date); LocalDate localDate = TimeUtils.IsoDate2LocalDate(date);
EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode); EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode);
...@@ -286,11 +290,11 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -286,11 +290,11 @@ public class DispatchServiceImpl implements DispatchService {
if (ListUtils.isEmpty(orders)) { if (ListUtils.isEmpty(orders)) {
return Result.failed("订单不存在"); return Result.failed("订单不存在");
} }
List<OrgTeamEngineerEntity> orgTeamEngineers = orgTeamEngineerDao.findByEngineerCode(engineer.getEngineerCode()); List<OrgTeamEngineerEntity> orgTeamEngineers = orgTeamEngineerDao.findByEngineerCode(engineer.getEngineerCode());
if (CollectionUtils.isEmpty(orgTeamEngineers)) { if (CollectionUtils.isEmpty(orgTeamEngineers)) {
return Result.failed(StatusCodeEnum.TEAM_UNMATCHED); return Result.failed(StatusCodeEnum.TEAM_UNMATCHED);
} }
//判断工程师订单当日工单时间安排
OrgTeamEntity byTeamId = orgTeamDao.getByTeamId(orgTeamEngineers.get(0).getTeamId()); OrgTeamEntity byTeamId = orgTeamDao.getByTeamId(orgTeamEngineers.get(0).getTeamId());
for (OrderInfoEntity entity : orders) { for (OrderInfoEntity entity : orders) {
...@@ -298,6 +302,14 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -298,6 +302,14 @@ public class DispatchServiceImpl implements DispatchService {
return Result.failed(String.format("订单已指派个技术员[%s], 不必重复指派给同一个技术员", engineer.getName())); return Result.failed(String.format("订单已指派个技术员[%s], 不必重复指派给同一个技术员", engineer.getName()));
} }
SkillInfoEntity skill = skillInfoDao.getByBrandAndTypeAndSkill(CommonUtil.fixBrand(entity.getBrand()), entity.getType(), entity.getSkill()); SkillInfoEntity skill = skillInfoDao.getByBrandAndTypeAndSkill(CommonUtil.fixBrand(entity.getBrand()), entity.getType(), entity.getSkill());
List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(localDate, engineer.getEngineerCode());
if (CollectionUtils.isNotEmpty(engineerOrders)) {
Result<OrderInfoEntity> entityResult = orderInfoService.insterEngineerOrders(engineerOrders, entity, skill, byTeamId, engineer);
if (!entityResult.getCode().equals(ResultEnum.SUCCESS.getCode())) {
return Result.failed("当前工程师工单已满");
}
entity = entityResult.getResult();
}
entity.setTakeTime(skill.getTakeTime()); entity.setTakeTime(skill.getTakeTime());
entity.setPlanStartTime(entity.getExpectTimeBegin()); entity.setPlanStartTime(entity.getExpectTimeBegin());
entity.setPlanEndTime(entity.getExpectTimeBegin().plusMinutes(skill.getTakeTime())); entity.setPlanEndTime(entity.getExpectTimeBegin().plusMinutes(skill.getTakeTime()));
...@@ -397,6 +409,8 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -397,6 +409,8 @@ public class DispatchServiceImpl implements DispatchService {
item.setIsSpecialTime(o.getIsSpecialTime()); item.setIsSpecialTime(o.getIsSpecialTime());
item.setBeanTags(o.getBeanTags()); item.setBeanTags(o.getBeanTags());
item.setIsCutoff(o.getIsCutoff()); item.setIsCutoff(o.getIsCutoff());
item.setX(o.getX());
item.setY(o.getY());
item.setOrgGroupName(groupMap.get(o.getOrgGroupId())); item.setOrgGroupName(groupMap.get(o.getOrgGroupId()));
if (isContinue && StringUtils.isNotEmpty(o.getMultipleOrders()) && !groupTagId.equals(OrderGroupEnum.five.getCode())) { if (isContinue && StringUtils.isNotEmpty(o.getMultipleOrders()) && !groupTagId.equals(OrderGroupEnum.five.getCode())) {
List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrdersAndOrderIdNot(o.getMultipleOrders(), o.getOrderId()); List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrdersAndOrderIdNot(o.getMultipleOrders(), o.getOrderId());
......
...@@ -146,7 +146,6 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -146,7 +146,6 @@ public class OrderAssignImpl implements OrderAssign {
@Override @Override
public Result<?> orderAssign(OrderAssignReq req) throws BusinessException { public Result<?> orderAssign(OrderAssignReq req) throws BusinessException {
// 服务单指派-指派提交 // 服务单指派-指派提交
OrderInfoEntity entity = orderInfoDao.getByOrderId(req.getOrderId()); OrderInfoEntity entity = orderInfoDao.getByOrderId(req.getOrderId());
if (entity == null) { if (entity == null) {
return Result.failed("订单不存在"); return Result.failed("订单不存在");
...@@ -158,16 +157,21 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -158,16 +157,21 @@ public class OrderAssignImpl implements OrderAssign {
if (CollectionUtils.isEmpty(orgTeamEngineers)) { if (CollectionUtils.isEmpty(orgTeamEngineers)) {
return Result.failed(StatusCodeEnum.TEAM_UNMATCHED); return Result.failed(StatusCodeEnum.TEAM_UNMATCHED);
} }
OrgTeamEntity byTeamId = orgTeamDao.getByTeamId(orgTeamEngineers.get(0).getTeamId());
if (entity != null && !entity.getAppointmentStatus().equals("NOT_ASSIGNED") && StringUtils.isNotBlank(entity.getEngineerCode()) && entity.getEngineerCode().equals(req.getEngineerCode())) { if (entity != null && !entity.getAppointmentStatus().equals("NOT_ASSIGNED") && StringUtils.isNotBlank(entity.getEngineerCode()) && entity.getEngineerCode().equals(req.getEngineerCode())) {
throw new BusinessException(String.format("订单已指派个技术员[%s], 不必重复指派给同一个技术员", engineer.getName())); throw new BusinessException(String.format("订单已指派个技术员[%s], 不必重复指派给同一个技术员", engineer.getName()));
} }
OrgTeamEntity byTeamId = orgTeamDao.getByTeamId(orgTeamEngineers.get(0).getTeamId());
SkillInfoEntity skill = skillInfoDao.getByBrandAndTypeAndSkill(CommonUtil.fixBrand(entity.getBrand()), entity.getType(), entity.getSkill()); SkillInfoEntity skill = skillInfoDao.getByBrandAndTypeAndSkill(CommonUtil.fixBrand(entity.getBrand()), entity.getType(), entity.getSkill());
entity.setTakeTime(skill.getTakeTime()); //判断工程师订单当日工单时间安排
entity.setPlanStartTime(entity.getExpectTimeBegin()); List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(entity.getDt(), engineer.getEngineerCode());
entity.setPlanEndTime(entity.getExpectTimeBegin().plusMinutes(skill.getTakeTime())); if (CollectionUtils.isNotEmpty(engineerOrders)) {
Result<OrderInfoEntity> entityResult = orderInfoService.insterEngineerOrders(engineerOrders, entity, skill, byTeamId, engineer);
if (!entityResult.getCode().equals(ResultEnum.SUCCESS.getCode())) {
return Result.failed("当前工程师工单已满");
}
entity = entityResult.getResult();
}
entity.setEngineerCode(engineer.getEngineerCode()); entity.setEngineerCode(engineer.getEngineerCode());
entity.setEngineerName(engineer.getName()); entity.setEngineerName(engineer.getName());
entity.setEngineerPhone(engineer.getPhone()); entity.setEngineerPhone(engineer.getPhone());
...@@ -177,8 +181,6 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -177,8 +181,6 @@ public class OrderAssignImpl implements OrderAssign {
entity.setOrgBranchId(byTeamId.getBranchId()); entity.setOrgBranchId(byTeamId.getBranchId());
entity.setOrgClusterId(byTeamId.getClusterId()); entity.setOrgClusterId(byTeamId.getClusterId());
orderInfoDao.save(entity); orderInfoDao.save(entity);
// entity.setEngineerCode(engineer.getEngineerCode());
// orderInfoDao.save(order);
// 工单变更登记 // 工单变更登记
commonService.addOrderEvent(entity.getOrderId(), "", "BEAN", "BEAN", OrderEventEnum.reassignment.getEvent(), commonService.addOrderEvent(entity.getOrderId(), "", "BEAN", "BEAN", OrderEventEnum.reassignment.getEvent(),
String.format(OrderEventEnum.reassignment.getMsg(), engineer.getName() + "-" + (ObjectUtil.isNotNull(byTeamId) ? byTeamId.getTeamName() : "")), String.format(OrderEventEnum.reassignment.getMsg(), engineer.getName() + "-" + (ObjectUtil.isNotNull(byTeamId) ? byTeamId.getTeamName() : "")),
......
...@@ -5,18 +5,21 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -5,18 +5,21 @@ import cn.hutool.core.util.ObjectUtil;
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.common.ResultEnum; import com.dituhui.pea.common.ResultEnum;
import com.dituhui.pea.dispatch.IPath;
import com.dituhui.pea.enums.StatusCodeEnum; import com.dituhui.pea.enums.StatusCodeEnum;
import com.dituhui.pea.order.common.TimeUtils; import com.dituhui.pea.order.common.TimeUtils;
import com.dituhui.pea.order.constant.OrderReschedulingReason; import com.dituhui.pea.order.constant.OrderReschedulingReason;
import com.dituhui.pea.order.dao.*; import com.dituhui.pea.order.dao.*;
import com.dituhui.pea.order.dto.MsgDTO; import com.dituhui.pea.order.dto.MsgDTO;
import com.dituhui.pea.order.dto.OrderReschedule; import com.dituhui.pea.order.dto.OrderReschedule;
import com.dituhui.pea.order.dto.OrderSegment;
import com.dituhui.pea.order.dto.param.*; import com.dituhui.pea.order.dto.param.*;
import com.dituhui.pea.order.entity.*; import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.enums.*; import com.dituhui.pea.order.enums.*;
import com.dituhui.pea.order.service.*; import com.dituhui.pea.order.service.*;
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.DistanceDTO;
import com.dituhui.pea.pojo.saas.req.AdministrativeDistrictReq; import com.dituhui.pea.pojo.saas.req.AdministrativeDistrictReq;
import com.dituhui.pea.pojo.saas.resp.AdministrativeDistrictResp; import com.dituhui.pea.pojo.saas.resp.AdministrativeDistrictResp;
import com.dituhui.pea.util.DateUtil; import com.dituhui.pea.util.DateUtil;
...@@ -28,8 +31,11 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -28,8 +31,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -64,6 +70,9 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -64,6 +70,9 @@ public class OrderInfoServiceImpl implements OrderInfoService {
@Autowired @Autowired
private OrgTeamDao orgTeamDao; private OrgTeamDao orgTeamDao;
@Autowired
private IPath pathService;
/** /**
* 新增订单处理一家多单逻辑 * 新增订单处理一家多单逻辑
...@@ -229,7 +238,9 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -229,7 +238,9 @@ public class OrderInfoServiceImpl implements OrderInfoService {
order.setExpectTimeBegin(expectBegin); order.setExpectTimeBegin(expectBegin);
order.setExpectTimeEnd(expectEnd); order.setExpectTimeEnd(expectEnd);
order.setExpectTimeDesc(req.getExpectDesc()); order.setExpectTimeDesc(req.getExpectDesc());
order.setTranscend(0);
order.setOrderStatus(OrderStatusEnum.RESCHEDULED.getCode()); order.setOrderStatus(OrderStatusEnum.RESCHEDULED.getCode());
order.setReschedulingReason(StringUtils.isNotBlank(req.getReschedulingReason()) ? req.getReschedulingReason() : order.getReschedulingReason());
boolean skillUpdate = false; boolean skillUpdate = false;
OrgGroupEntity orgGroupEntity = null; OrgGroupEntity orgGroupEntity = null;
if (StringUtils.isNotBlank(order.getOrgGroupId())) { if (StringUtils.isNotBlank(order.getOrgGroupId())) {
...@@ -295,7 +306,6 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -295,7 +306,6 @@ public class OrderInfoServiceImpl implements OrderInfoService {
} }
} }
} }
order.setReschedulingReason(StringUtils.isNotBlank(req.getReschedulingReason()) ? req.getReschedulingReason() : order.getReschedulingReason());
OrgGroupEntity groupEntity = orgGroupDao.getByGroupId(order.getOrgGroupId()); OrgGroupEntity groupEntity = orgGroupDao.getByGroupId(order.getOrgGroupId());
//是否今天 //是否今天
...@@ -354,6 +364,8 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -354,6 +364,8 @@ public class OrderInfoServiceImpl implements OrderInfoService {
order.setAppointmentMethod(AppointmentMethodEnum.MANUAL.name()); order.setAppointmentMethod(AppointmentMethodEnum.MANUAL.name());
order.setAppointmentStatus(OrderFlowEnum.INIT.name()); order.setAppointmentStatus(OrderFlowEnum.INIT.name());
sendMsg(order.getOrgBranchId(), order.getOrderId(), req.getExpectBegin()); sendMsg(order.getOrgBranchId(), order.getOrderId(), req.getExpectBegin());
} else {
order.setTranscend(1);
} }
} }
} else if (!isToday && !isBelong) { } else if (!isToday && !isBelong) {
...@@ -399,7 +411,8 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -399,7 +411,8 @@ public class OrderInfoServiceImpl implements OrderInfoService {
// 登记事件 // 登记事件
commonService.addOrderEvent(req.getOrderId(), "", req.getOperator(), req.getOperator(), OrderEventEnum.recontracting.getEvent(), commonService.addOrderEvent(req.getOrderId(), "", req.getOperator(), req.getOperator(), OrderEventEnum.recontracting.getEvent(),
String.format(OrderEventEnum.recontracting.getMsg(), engineerName + "-" + (ObjectUtil.isNotNull(orgTeamEntity) ? orgTeamEntity.getTeamName() : ""), String.format(OrderEventEnum.recontracting.getMsg(), engineerName + "-" + (ObjectUtil.isNotNull(orgTeamEntity) ? orgTeamEntity.getTeamName() : ""),
ObjectUtil.isNotNull(orgGroupEntity) ? orgGroupEntity.getGroupName() : "", req.getExpectBegin(), req.getReschedulingReason()), ""); ObjectUtil.isNotNull(orgGroupEntity) ? orgGroupEntity.getGroupName() : "", req.getExpectBegin(), req.getReschedulingReason()),
StringUtils.isNotBlank(req.getReschedulingReason()) ? "改约原因:" + req.getReschedulingReason() : "");
return Result.success(null); return Result.success(null);
} }
...@@ -414,6 +427,111 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -414,6 +427,111 @@ public class OrderInfoServiceImpl implements OrderInfoService {
return Result.success(OrderReschedulingReason.ReschedulingReasonMap); return Result.success(OrderReschedulingReason.ReschedulingReasonMap);
} }
/**
* 根据工程师当日订单插入订单
*
* @param skillInfo 待指派订单技能
* @param engineerOrders 待指派工程师当日工单
* @param insertOrder 待指派订单
* @param orgTeam 待指派工程师团队
* @param engineer 指派工程师
* @return
*/
@Transactional
@Override
public Result<OrderInfoEntity> insterEngineerOrders(List<OrderInfoEntity> engineerOrders, OrderInfoEntity insertOrder, SkillInfoEntity skillInfo, OrgTeamEntity orgTeam, EngineerInfoEntity engineer) {
int takeTime = skillInfo.getTakeTime();
// 获取客户期望时间段
LocalDateTime start = insertOrder.getExpectTimeBegin();
LocalDateTime end = insertOrder.getExpectTimeEnd();
// 获取团队工作起止时间
String[] teamWorkStartTime = orgTeam.getWorkOn().split(":");
String[] teamWorkEndTime = orgTeam.getWorkOff().split(":");
LocalDateTime startTeam = LocalDate.now().atTime(Integer.parseInt(teamWorkStartTime[0]), Integer.parseInt(teamWorkStartTime[1]), 0);
LocalDateTime endTeam = LocalDate.now().atTime(Integer.parseInt(teamWorkEndTime[0]), Integer.parseInt(teamWorkEndTime[1]), 0);
// 计算最早派工和最晚派工时间
LocalDateTime workStartTime = start.isAfter(startTeam) ? start : startTeam;
LocalDateTime workEndTime = end.isBefore(endTeam) ? end : endTeam;
// 订单工作时间顺序排序
List<OrderSegment> orderSegments = new ArrayList<>();
for (OrderInfoEntity orderInfo : engineerOrders) {
if (orderInfo.getOrderStatus().equals(OrderStatusEnum.CANCELED.getCode())) {
continue;
}
OrderSegment seg = new OrderSegment();
seg.setX(Double.parseDouble(orderInfo.getX()));
seg.setY(Double.parseDouble(orderInfo.getY()));
seg.setOrderId(orderInfo.getOrderId());
seg.setElapsed(orderInfo.getArriveElapsed());
seg.setDistance(orderInfo.getArriveDistance());
seg.setStart(orderInfo.getPlanStartTime());
seg.setEnd(orderInfo.getPlanEndTime());
orderSegments.add(seg);
}
// 没有单直接返回
if (CollectionUtils.isEmpty(orderSegments)) {
insertOrder.setTakeTime(skillInfo.getTakeTime());
insertOrder.setPlanStartTime(insertOrder.getExpectTimeBegin());
insertOrder.setPlanEndTime(insertOrder.getExpectTimeBegin().plusMinutes(skillInfo.getTakeTime()));
return Result.success(insertOrder);
}
orderSegments = orderSegments.stream().sorted(Comparator.comparing(OrderSegment::getStart)).collect(Collectors.toList());
for (int i = 0; i < orderSegments.size(); i++) {
OrderSegment orderSegment = orderSegments.get(i);
Result<DistanceDTO> roadResult = pathService.getRoadDistance(insertOrder.getOrderId(), orderSegment.getOrderId(), engineer.getVehicle());
if (!roadResult.getCode().equals(ResultEnum.SUCCESS.getCode())) {
continue;
}
DistanceDTO distanceDTO = roadResult.getResult();
int roadTime = distanceDTO.getTime() / 1000;
// 先判断第一单开始时间
if (i == 0 && orderSegment.getStart().minusHours(orderSegment.getElapsed()).compareTo(workStartTime.plusMinutes(takeTime + roadTime)) >= 0) {
insertOrder.setTakeTime(skillInfo.getTakeTime());
// insertOrder.setArriveDistance(roadTime);
// insertOrder.setArriveDistance(Integer.valueOf(String.valueOf(distanceDTO.getDis() * 1000)));
insertOrder.setPlanStartTime(insertOrder.getExpectTimeBegin());
insertOrder.setPlanEndTime(insertOrder.getExpectTimeBegin().plusMinutes(skillInfo.getTakeTime()));
OrderInfoEntity nestOrder = orderInfoDao.getByOrderId(orderSegment.getOrderId());
nestOrder.setArriveDistance(roadTime);
insertOrder.setArriveDistance(BigDecimal.valueOf(distanceDTO.getDis() * 1000).intValue());
orderInfoDao.save(nestOrder);
return Result.success(insertOrder);
}
// 判断当前是不是最后一单
if (i == orderSegments.size() - 1 && workEndTime.compareTo(orderSegment.getEnd().plusMinutes(takeTime + roadTime)) >= 0) {
insertOrder.setTakeTime(skillInfo.getTakeTime());
insertOrder.setArriveDistance(roadTime);
insertOrder.setArriveDistance(BigDecimal.valueOf(distanceDTO.getDis() * 1000).intValue());
insertOrder.setPlanStartTime(orderSegment.getEnd().plusMinutes(roadTime));
insertOrder.setPlanEndTime(orderSegment.getEnd().plusMinutes(takeTime + roadTime));
return Result.success(insertOrder);
}
// 当前单在中间
OrderSegment nestOrderSegment = orderSegments.get(i + 1);
Result<DistanceDTO> roadResult2 = pathService.getRoadDistance(nestOrderSegment.getOrderId(), insertOrder.getOrderId(), engineer.getVehicle());
if (!roadResult.getCode().equals(ResultEnum.SUCCESS.getCode())) {
continue;
}
if (nestOrderSegment.getStart().minusHours(roadResult2.getResult().getTime() / 1000).compareTo(orderSegment.getEnd().plusMinutes(takeTime + roadTime)) >= 0) {
insertOrder.setTakeTime(skillInfo.getTakeTime());
insertOrder.setArriveDistance(roadTime);
insertOrder.setArriveElapsed(BigDecimal.valueOf(distanceDTO.getDis() * 1000).intValue());
insertOrder.setPlanStartTime(orderSegment.getEnd().plusMinutes(roadTime));
insertOrder.setPlanEndTime(orderSegment.getEnd().plusMinutes(takeTime + roadTime));
OrderInfoEntity nestOrder = orderInfoDao.getByOrderId(nestOrderSegment.getOrderId());
nestOrder.setArriveDistance(roadResult2.getResult().getTime() / 1000);
nestOrder.setArriveElapsed(BigDecimal.valueOf(roadResult2.getResult().getDis() * 1000).intValue());
orderInfoDao.save(nestOrder);
return Result.success(insertOrder);
}
}
return Result.failed(insertOrder);
}
/** /**
* 订单重新分单 * 订单重新分单
* *
...@@ -424,7 +542,7 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -424,7 +542,7 @@ public class OrderInfoServiceImpl implements OrderInfoService {
*/ */
private OrderInfoEntity orderFendan(OrderInfoEntity order, OrderReschedule req, Location location) { private OrderInfoEntity orderFendan(OrderInfoEntity order, OrderReschedule req, Location location) {
order.setServiceStatus(ServiceStatusEnum.INIT.getCode()); order.setServiceStatus(ServiceStatusEnum.INIT.getCode());
if (StringUtils.isBlank(req.getDescription())) { if (StringUtils.isNotBlank(req.getDescription())) {
order.setDescription(order.getDescription()); order.setDescription(order.getDescription());
} }
//获取省市区 //获取省市区
...@@ -456,8 +574,11 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -456,8 +574,11 @@ public class OrderInfoServiceImpl implements OrderInfoService {
} else { } else {
// 根据分单工作队,填写clusterId/branchId/groupId/teamId等 // 根据分单工作队,填写clusterId/branchId/groupId/teamId等
OrgTeamInfo teamInfo = fendanResult.getResult(); OrgTeamInfo teamInfo = fendanResult.getResult();
order.setOrgClusterId(teamInfo.getClusterId());
order.setOrgGroupId(teamInfo.getGroupId()); order.setOrgGroupId(teamInfo.getGroupId());
order.setOrgTeamId(teamInfo.getTeamId()); order.setOrgTeamId(teamInfo.getTeamId());
order.setAppointmentMethod(AppointmentMethodEnum.AUTO_BATCH.name());
order.setAppointmentStatus(OrderFlowEnum.INIT.name());
//处理超派,特殊时间段 //处理超派,特殊时间段
// order.setIsSpecialTime(CommonUtil.isSpecial(order.getExpectTimeBegin().toLocalTime(), // order.setIsSpecialTime(CommonUtil.isSpecial(order.getExpectTimeBegin().toLocalTime(),
// order.getExpectTimeEnd().toLocalTime(), teamInfo.getWorkOn(), teamInfo.getWorkOff())); // order.getExpectTimeEnd().toLocalTime(), teamInfo.getWorkOn(), teamInfo.getWorkOff()));
......
...@@ -88,6 +88,7 @@ public class OrderServiceDetailImpl implements OrderServiceDetail { ...@@ -88,6 +88,7 @@ public class OrderServiceDetailImpl implements OrderServiceDetail {
res.setIsSpecialTime(order.getIsSpecialTime()); res.setIsSpecialTime(order.getIsSpecialTime());
res.setMultipleOrders(order.getMultipleOrders()); res.setMultipleOrders(order.getMultipleOrders());
res.setBeanTags(order.getBeanTags()); res.setBeanTags(order.getBeanTags());
res.setTranscend(order.getTranscend());
return Result.success(res); return Result.success(res);
} }
......
...@@ -157,9 +157,15 @@ public class OrderServiceListServiceImpl implements OrderServiceListService { ...@@ -157,9 +157,15 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
record.setMultipleOrders(o.getMultipleOrders()); record.setMultipleOrders(o.getMultipleOrders());
record.setTranscend(o.getTranscend()); record.setTranscend(o.getTranscend());
record.setIsSpecialTime(o.getIsSpecialTime()); record.setIsSpecialTime(o.getIsSpecialTime());
record.setAddressId(o.getAddressId());
record.setIsCutoff(o.getIsCutoff());
record.setReschedulingReason(o.getReschedulingReason());
record.setActualStartTime(ObjectUtil.isNull(o.getActualStartTime()) ? "" : TimeUtils.IsoTimestamp2DateTime(o.getActualStartTime())); record.setActualStartTime(ObjectUtil.isNull(o.getActualStartTime()) ? "" : TimeUtils.IsoTimestamp2DateTime(o.getActualStartTime()));
record.setActualEndTime(ObjectUtil.isNull(o.getActualEndTime()) ? "" : TimeUtils.IsoTimestamp2DateTime(o.getActualEndTime())); record.setActualEndTime(ObjectUtil.isNull(o.getActualEndTime()) ? "" : TimeUtils.IsoTimestamp2DateTime(o.getActualEndTime()));
record.setPlanStartTime(ObjectUtil.isNull(o.getPlanStartTime()) ? "" : TimeUtils.IsoTimestamp2DateTime(o.getPlanStartTime()));
record.setPlanEndTime(ObjectUtil.isNull(o.getPlanEndTime()) ? "" : TimeUtils.IsoTimestamp2DateTime(o.getPlanEndTime()));
if (StringUtils.isNotEmpty(o.getMultipleOrders())) { if (StringUtils.isNotEmpty(o.getMultipleOrders())) {
List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrdersAndOrderIdNot(o.getMultipleOrders(), o.getOrderId()); List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrdersAndOrderIdNot(o.getMultipleOrders(), o.getOrderId());
List<OrderServiceList> multipleItems = new ArrayList<>(); List<OrderServiceList> multipleItems = new ArrayList<>();
...@@ -223,6 +229,7 @@ public class OrderServiceListServiceImpl implements OrderServiceListService { ...@@ -223,6 +229,7 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
record.setAppointEngineerCodes(o.getAppointEngineerCodes()); record.setAppointEngineerCodes(o.getAppointEngineerCodes());
record.setMultipleOrders(o.getMultipleOrders()); record.setMultipleOrders(o.getMultipleOrders());
record.setTranscend(o.getTranscend()); record.setTranscend(o.getTranscend());
record.setAddressId(o.getAddressId());
return record; return record;
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!