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:
uri: lb://project-gis
predicates:
- Path=/gis/**
- id: district
uri: lb://project-district
predicates:
- Path=/district/**
- id: dispatch
uri: lb://project-dispatch
predicates:
- Path=/dispatch/**
- Path=/pea-dispatch/**
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 {
@Autowired
OrderInfoRepository orderInfoRepository;
@Autowired
RoadDistanceUtils roadDistanceUtils;
@Override
public Result<DistanceDTO> getRoadDistance(String fromOrderId, String toOrderId, Integer vehicleType) {
try {
......@@ -46,13 +49,17 @@ public class PathController implements IPath {
|| StringUtils.isEmpty(toOrders.get(0).getX()) || StringUtils.isEmpty(toOrders.get(0).getY())) {
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(
new Location(0L, Float.parseFloat(fromOrders.get(0).getX()),
Float.parseFloat(fromOrders.get(0).getY())),
new Location(0L, Float.parseFloat(toOrders.get(0).getX()),
Float.parseFloat(toOrders.get(0).getY())),
vehicleType);
Distance distance = roadDistanceUtils.getDistance2(new Location(0L, null, null, fromX, fromY),
new Location(0L, null, null, toX, toY), vehicleType);
DistanceDTO dto = new DistanceDTO();
dto.setDis(distance.getDis());
dto.setTime(distance.getTime());
......
......@@ -10,11 +10,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.dituhui.pea.dispatch.pojo.Location;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* 路网组件<br>
......@@ -24,6 +27,8 @@ import lombok.Data;
* @author gpzhang
*
*/
@Component
@Slf4j
public class RoadDistanceUtils {
public static String URL = "https://api.map.baidu.com/routematrix/v2/";
......@@ -37,6 +42,40 @@ public class RoadDistanceUtils {
/**
* 获取路网距离和时间<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 调用方式需要改成批量调用方式
*
......@@ -97,6 +136,7 @@ public class RoadDistanceUtils {
}
String text = requestGetAK(url, params);
System.out.println(url + " : " + gson.toJson(params) + " : " + text);
BDResult webResult = gson.fromJson(text, BDResult.class);
float dis = webResult.getResult().get(0).getDistance().getValue() / 1000F;
int time = webResult.getResult().get(0).getDuration().getValue();
......
......@@ -26,7 +26,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
*/
@SpringBootApplication
@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 static void main(String[] args) {
......
......@@ -153,7 +153,7 @@ public class PeaApiController {
@RequestParam("beginDate") Date beginDate,
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
Date endDate) {
Date endDate) {
CapacityQueryDTO.PersonalResult result = capacityQueryService.queryEngineerCapacity(engineerCode,
beginDate.toInstant().atZone(ZoneId.of("+8")).toLocalDate(),
......@@ -236,6 +236,27 @@ public class PeaApiController {
if (StringUtils.isBlank(request.getOrderId())) {
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);
}
......
......@@ -100,5 +100,9 @@ public class DispatchOrderListResp {
* bean标签
*/
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 {
private String address;
private String date;
/**
* 是否超派,0否 1是,默认0
*/
private Integer transcend;
//
// @Data
// @JsonInclude(JsonInclude.Include.NON_NULL)
......
......@@ -86,4 +86,22 @@ public class OrderServiceList {
*/
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 {
* 是否是特殊时间段,0否 1是 默认0
*/
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;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dto.OrderReschedule;
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.util.List;
/**
* 订单相关
......@@ -51,4 +56,17 @@ public interface OrderInfoService {
* @return
*/
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;
import cn.hutool.core.util.ObjectUtil;
import com.dituhui.pea.common.BusinessException;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.common.ResultEnum;
import com.dituhui.pea.enums.StatusCodeEnum;
import com.dituhui.pea.order.common.ListUtils;
import com.dituhui.pea.order.common.TimeUtils;
......@@ -15,6 +16,7 @@ import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.enums.*;
import com.dituhui.pea.order.service.CommonService;
import com.dituhui.pea.order.service.DispatchService;
import com.dituhui.pea.order.service.OrderInfoService;
import com.dituhui.pea.order.utils.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
......@@ -69,6 +71,9 @@ public class DispatchServiceImpl implements DispatchService {
@Autowired
private CommonService commonService;
@Autowired
private OrderInfoService orderInfoService;
@Transactional
@Override
public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) {
......@@ -275,7 +280,6 @@ public class DispatchServiceImpl implements DispatchService {
@Override
public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException {
// 派工台确认派单
LocalDate localDate = TimeUtils.IsoDate2LocalDate(date);
EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode);
......@@ -286,11 +290,11 @@ public class DispatchServiceImpl implements DispatchService {
if (ListUtils.isEmpty(orders)) {
return Result.failed("订单不存在");
}
List<OrgTeamEngineerEntity> orgTeamEngineers = orgTeamEngineerDao.findByEngineerCode(engineer.getEngineerCode());
if (CollectionUtils.isEmpty(orgTeamEngineers)) {
return Result.failed(StatusCodeEnum.TEAM_UNMATCHED);
}
//判断工程师订单当日工单时间安排
OrgTeamEntity byTeamId = orgTeamDao.getByTeamId(orgTeamEngineers.get(0).getTeamId());
for (OrderInfoEntity entity : orders) {
......@@ -298,6 +302,14 @@ public class DispatchServiceImpl implements DispatchService {
return Result.failed(String.format("订单已指派个技术员[%s], 不必重复指派给同一个技术员", engineer.getName()));
}
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.setPlanStartTime(entity.getExpectTimeBegin());
entity.setPlanEndTime(entity.getExpectTimeBegin().plusMinutes(skill.getTakeTime()));
......@@ -397,6 +409,8 @@ public class DispatchServiceImpl implements DispatchService {
item.setIsSpecialTime(o.getIsSpecialTime());
item.setBeanTags(o.getBeanTags());
item.setIsCutoff(o.getIsCutoff());
item.setX(o.getX());
item.setY(o.getY());
item.setOrgGroupName(groupMap.get(o.getOrgGroupId()));
if (isContinue && StringUtils.isNotEmpty(o.getMultipleOrders()) && !groupTagId.equals(OrderGroupEnum.five.getCode())) {
List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrdersAndOrderIdNot(o.getMultipleOrders(), o.getOrderId());
......
......@@ -146,7 +146,6 @@ public class OrderAssignImpl implements OrderAssign {
@Override
public Result<?> orderAssign(OrderAssignReq req) throws BusinessException {
// 服务单指派-指派提交
OrderInfoEntity entity = orderInfoDao.getByOrderId(req.getOrderId());
if (entity == null) {
return Result.failed("订单不存在");
......@@ -158,16 +157,21 @@ public class OrderAssignImpl implements OrderAssign {
if (CollectionUtils.isEmpty(orgTeamEngineers)) {
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())) {
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());
entity.setTakeTime(skill.getTakeTime());
entity.setPlanStartTime(entity.getExpectTimeBegin());
entity.setPlanEndTime(entity.getExpectTimeBegin().plusMinutes(skill.getTakeTime()));
//判断工程师订单当日工单时间安排
List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(entity.getDt(), 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.setEngineerCode(engineer.getEngineerCode());
entity.setEngineerName(engineer.getName());
entity.setEngineerPhone(engineer.getPhone());
......@@ -177,8 +181,6 @@ public class OrderAssignImpl implements OrderAssign {
entity.setOrgBranchId(byTeamId.getBranchId());
entity.setOrgClusterId(byTeamId.getClusterId());
orderInfoDao.save(entity);
// entity.setEngineerCode(engineer.getEngineerCode());
// orderInfoDao.save(order);
// 工单变更登记
commonService.addOrderEvent(entity.getOrderId(), "", "BEAN", "BEAN", OrderEventEnum.reassignment.getEvent(),
String.format(OrderEventEnum.reassignment.getMsg(), engineer.getName() + "-" + (ObjectUtil.isNotNull(byTeamId) ? byTeamId.getTeamName() : "")),
......
......@@ -88,6 +88,7 @@ public class OrderServiceDetailImpl implements OrderServiceDetail {
res.setIsSpecialTime(order.getIsSpecialTime());
res.setMultipleOrders(order.getMultipleOrders());
res.setBeanTags(order.getBeanTags());
res.setTranscend(order.getTranscend());
return Result.success(res);
}
......
......@@ -157,9 +157,15 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
record.setMultipleOrders(o.getMultipleOrders());
record.setTranscend(o.getTranscend());
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.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())) {
List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrdersAndOrderIdNot(o.getMultipleOrders(), o.getOrderId());
List<OrderServiceList> multipleItems = new ArrayList<>();
......@@ -223,6 +229,7 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
record.setAppointEngineerCodes(o.getAppointEngineerCodes());
record.setMultipleOrders(o.getMultipleOrders());
record.setTranscend(o.getTranscend());
record.setAddressId(o.getAddressId());
return record;
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!