Commit 6b753b65 by wangli

实现指派单

1 parent cd81c2ad
package com.alibaba.cloud.integration.order.service.impl;
import com.alibaba.cloud.integration.common.BusinessException;
import com.alibaba.cloud.integration.common.Result;
import com.alibaba.cloud.integration.order.dao.*;
import com.alibaba.cloud.integration.order.dto.DispatchEngineerOrderListResp;
......@@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
......@@ -190,8 +192,56 @@ public class DispatchServiceImpl implements DispatchService {
}
@Override
public Result<?> dispatchOrderConfirm(String engineerCode, List<String> orderIds) {
public Result<?> dispatchOrderConfirm(String engineerCode, List<String> orderIds) throws BusinessException {
// 派工台确认派单
EngineerInfo engineer = this.queryEngineer(engineerCode);
if (engineer == null) {
throw new BusinessException("技术员不存在");
}
List<OrderRequest> orders = this.queryOrderRequestByOrderIds(orderIds);
if (orders.isEmpty()) {
throw new BusinessException("订单号错误");
}
// 通过订单获取日期
Timestamp t = orders.get(0).getExpectTimeBegin();
String date = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(t.toLocalDateTime());
LambdaQueryWrapper<OrderAppointment> lqw = new LambdaQueryWrapper<>();
lqw.eq(OrderAppointment::getEngineerCode, engineerCode);
lqw.ge(OrderAppointment::getExpectStartTime, this.getTimestampFromDate(date, "00:00:00"));
lqw.lt(OrderAppointment::getExpectStartTime, this.getTimestampFromDate(date, "23:59:59"));
lqw.orderByAsc(OrderAppointment::getExpectStartTime);
List<OrderAppointment> orderAppointments = orderAppointmentMPDao.selectList(lqw);
// TODO,临时处理方案,后续调用派单引擎处理
OrderRequestScheduler scheduler = new OrderRequestScheduler();
List<LineSegment> results = scheduler.scheduler(orders, orderAppointments);
for (LineSegment r : results) {
String orderId = r.id;
Timestamp expectStartTime = scheduler.linePoint2Timestamp(r.start, date);
Timestamp expectEndTime = scheduler.linePoint2Timestamp(r.end, date);
OrderAppointment op = new OrderAppointment();
op.setOrderId(orderId);
op.setSuborderId(Long.toString(System.currentTimeMillis()));
op.setMainSub(1);
op.setEngineerCode(engineerCode);
op.setEngineerName(engineer.getName());
op.setEngineerAge("");
op.setEngineerPhone(engineer.getPhone());
op.setIsWorkshop(0);
op.setExpectStartTime(expectStartTime);
op.setExpectStartTime(expectEndTime);
op.setPreStatus("PRE");
op.setStatus("PRE");
orderAppointmentMPDao.insert(op);
}
return null;
}
......@@ -245,6 +295,12 @@ public class DispatchServiceImpl implements DispatchService {
return engineerInfoMPDao.selectList(lqw);
}
private EngineerInfo queryEngineer(String engineerCode) {
LambdaQueryWrapper<EngineerInfo> lqw = new LambdaQueryWrapper<>();
lqw.eq(EngineerInfo::getEngineerCode, engineerCode);
return engineerInfoMPDao.selectOne(lqw);
}
private List<String> queryOrgGroupIds(String levelType, List<String> levelIds) {
LambdaQueryWrapper<OrgGroup> lqw = new LambdaQueryWrapper<>();
lqw.in(levelType.equals("cluster"), OrgGroup::getClusterId, levelIds);
......@@ -333,4 +389,110 @@ class GroupTagOmit implements GroupTag {
public String getGroupTag(OrderRequest order) {
return "默认分类#5";
}
}
class LineSegment {
public String id;
public int start;
public int end;
public LineSegment(String id, int start, int end) {
this.id = id;
this.start = start;
this.end = end;
}
}
class Line {
public String id;
public int length;
public Line(String id, int length) {
this.id = id;
this.length = length;
}
}
class LineSegmentScheduler {
public List<LineSegment> scheduleLineSegments(List<LineSegment> used, List<Line> newTasks) {
used.sort(Comparator.comparingInt(a -> a.start));
List<LineSegment> result = new ArrayList<>();
for (Line task : newTasks) {
String taskId = task.id;
int taskLength = task.length;
boolean scheduled = false;
int startRange = 480;
int endRange = 1440;
if (!scheduled) {
for (int i = 0; i <= used.size(); i++) {
int start;
if (i == 0) {
start = startRange;
} else {
start = used.get(i - 1).end;
}
int end;
if (i == used.size() || used.get(i).start > endRange) {
end = endRange;
} else {
end = used.get(i).start;
}
if (end - start >= taskLength) {
int taskStart = start;
int taskEnd = start + taskLength;
LineSegment s = new LineSegment(taskId, taskStart, taskEnd);
result.add(s);
used.add(i, s);
break;
}
}
}
}
return result;
}
}
class OrderRequestScheduler {
public List<LineSegment> scheduler(List<OrderRequest> orderRequests, List<OrderAppointment> orderAppointments) {
List<LineSegment> used = new ArrayList<>();
for (OrderAppointment o : orderAppointments) {
LineSegment s = new LineSegment(o.getOrderId(),
this.Timestamp2LinePoint(o.getExpectStartTime()),
this.Timestamp2LinePoint(o.getExpectEndTime()));
used.add(s);
}
List<Line> newTasks = new ArrayList<>();
for (OrderRequest o : orderRequests) {
Line l = new Line(o.getOrderId(), 30);
}
return new LineSegmentScheduler().scheduleLineSegments(used, newTasks);
}
public int Timestamp2LinePoint(Timestamp t) {
LocalDateTime datetime = t.toLocalDateTime();
return datetime.getHour() * 60 + datetime.getMinute();
}
public Timestamp linePoint2Timestamp(int x, String date) {
int base = 60;
int hour = x / base;
int minute = x % base;
String datetime = String.format("%s %d:%d:00", date, hour, minute);
return Timestamp.valueOf(datetime);
}
}
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!