Commit af74c909 by Ren Ping

Merge remote-tracking branch 'origin/develop' into develop

2 parents 39c7d181 8d77e4b3
package com.dituhui.pea.dispatch.constraint; package com.dituhui.pea.dispatch.constraint;
import java.util.List;
import org.optaplanner.core.api.score.buildin.hardsoftlong.HardSoftLongScore; import org.optaplanner.core.api.score.buildin.hardsoftlong.HardSoftLongScore;
import org.optaplanner.core.api.score.stream.Constraint; import org.optaplanner.core.api.score.stream.Constraint;
import org.optaplanner.core.api.score.stream.ConstraintFactory; import org.optaplanner.core.api.score.stream.ConstraintFactory;
...@@ -54,9 +56,31 @@ public class DispatchConstraintProvider implements ConstraintProvider { ...@@ -54,9 +56,31 @@ public class DispatchConstraintProvider implements ConstraintProvider {
protected Constraint technicianTimeWindowsMatch(ConstraintFactory factory) { protected Constraint technicianTimeWindowsMatch(ConstraintFactory factory) {
return factory.forEach(Technician.class).filter( return factory.forEach(Technician.class).filter(
// EndTime ==0 表示不起作用 technician -> {
technician -> technician.getEndTime() > 0 && technician.getOffWorkTime() > technician.getEndTime()) boolean ret = false;
.penalizeLong(HardSoftLongScore.ONE_HARD, technician -> 1) // 单子的服务时间都在时间窗口内
int[][] timeWindows = technician.getTimeWindows();
List<Customer> customers = technician.getCustomerList();
if (null != timeWindows && timeWindows.length > 0 && null != customers && customers.size() > 0) {
for (Customer customer : customers) {
Integer arrivalTime = customer.getArrivalTime();
if (arrivalTime != null && arrivalTime > 0) {
boolean in = false;
for (int[] window : timeWindows) {
if (window[0] <= arrivalTime && window[1] >= arrivalTime) {
in = true;
break;
}
}
if (!in) {
// 到达时间在日历窗口外,惩罚得分
ret = true;
}
}
}
}
return ret;
}).penalizeLong(HardSoftLongScore.ONE_HARD, technician -> 1)
.asConstraint(ConstraintNameEnum.technicianTimeWindowsMatch.name()); .asConstraint(ConstraintNameEnum.technicianTimeWindowsMatch.name());
} }
......
...@@ -26,8 +26,16 @@ public class Technician { ...@@ -26,8 +26,16 @@ public class Technician {
private Depot depot; private Depot depot;
// 上班时间窗 分钟480-1080 8-18点 // 上班时间窗 分钟480-1080 8-18点
private int startTime; // private int startTime;
private int endTime; // private int endTime;
/**
* 上班多时间窗
* 时间窗格式:[[起始时间段1,结束时间段1],[起始时间段2,结束时间段2]...]
* 时间格式:从0点开始的分钟数,如早上8点为480.
*/
private int[][] timeWindows;
// 技能 // 技能
private Set<String> skills; private Set<String> skills;
...@@ -59,8 +67,7 @@ public class Technician { ...@@ -59,8 +67,7 @@ public class Technician {
this.id = id; this.id = id;
this.code = code; this.code = code;
this.depot = depot; this.depot = depot;
this.startTime = startTime; this.timeWindows = new int[][] { new int[] { startTime, endTime } };
this.endTime = endTime;
this.skills = skills; this.skills = skills;
this.preferredlocationDistanceMap = preferredlocationDistanceMap; this.preferredlocationDistanceMap = preferredlocationDistanceMap;
this.preferredlocation = preferredlocation; this.preferredlocation = preferredlocation;
...@@ -71,8 +78,7 @@ public class Technician { ...@@ -71,8 +78,7 @@ public class Technician {
this.id = id; this.id = id;
this.code = code; this.code = code;
this.depot = depot; this.depot = depot;
this.startTime = startTime; this.timeWindows = new int[][] { new int[] { startTime, endTime } };
this.endTime = endTime;
this.skills = skills; this.skills = skills;
this.maxCount = maxCount; this.maxCount = maxCount;
this.maxMinute = maxMinute; this.maxMinute = maxMinute;
...@@ -85,8 +91,7 @@ public class Technician { ...@@ -85,8 +91,7 @@ public class Technician {
this.id = id; this.id = id;
this.code = code; this.code = code;
this.depot = depot; this.depot = depot;
this.startTime = startTime; this.timeWindows = new int[][] { new int[] { startTime, endTime } };
this.endTime = endTime;
this.skills = skills; this.skills = skills;
this.maxCount = maxCount; this.maxCount = maxCount;
this.maxMinute = maxMinute; this.maxMinute = maxMinute;
...@@ -208,8 +213,8 @@ public class Technician { ...@@ -208,8 +213,8 @@ public class Technician {
@Override @Override
public String toString() { public String toString() {
return "Technician{" + "id=" + id + ", code='" + code + '\'' + ", depot=" + depot + ", startTime=" + startTime return "Technician{" + "id=" + id + ", code='" + code + '\'' + ", depot=" + depot + ", timeWindows=" + timeWindows
+ ", endTime=" + endTime + ", skills=" + skills + ", maxCount=" + maxCount + ", maxMinute=" + maxMinute + ", skills=" + skills + ", maxCount=" + maxCount + ", maxMinute=" + maxMinute
+ ", maxDistanceMeter=" + maxDistanceMeter + '}'; + ", maxDistanceMeter=" + maxDistanceMeter + '}';
} }
} }
...@@ -63,7 +63,7 @@ public class DispatchSolutionUtils { ...@@ -63,7 +63,7 @@ public class DispatchSolutionUtils {
AtomicInteger totalNum = new AtomicInteger(0); AtomicInteger totalNum = new AtomicInteger(0);
solution.getTechnicianList().forEach(technician -> { solution.getTechnicianList().forEach(technician -> {
System.out.printf("技术员%s(%s) [%s,%s]%n", technician.getId(), technician.getCode(), System.out.printf("技术员%s(%s) [%s,%s]%n", technician.getId(), technician.getCode(),
printTime(technician.getStartTime()), printTime(technician.getEndTime())); printTime(technician.getTimeWindows()[0][0]), printTime(technician.getTimeWindows()[0][1]));
totalNum.addAndGet(technician.getCustomerList().size()); totalNum.addAndGet(technician.getCustomerList().size());
for (Customer customer : technician.getCustomerList()) { for (Customer customer : technician.getCustomerList()) {
Customer previousCustomer = customer.getPreviousCustomer(); Customer previousCustomer = customer.getPreviousCustomer();
......
...@@ -257,10 +257,13 @@ public class CapacityUtils { ...@@ -257,10 +257,13 @@ public class CapacityUtils {
long remain = collect.stream().mapToLong(CapacityEngineerSliceUsedEntity::getCapLeft).sum(); long remain = collect.stream().mapToLong(CapacityEngineerSliceUsedEntity::getCapLeft).sum();
segment.setRemain(remain); segment.setRemain(remain);
segment.setStatus(totalTakeTime <= maxDuration ? 1 : 0); segment.setStatus(totalTakeTime <= maxDuration ? 1 : 0);
long totalCapacity = collect.stream().mapToLong(CapacityEngineerSliceUsedEntity::getCapTotal).sum();
segment.setTotalCapacity(totalCapacity);
} else { } else {
segment.setMaxDuration(0); segment.setMaxDuration(0);
segment.setRemain(0); segment.setRemain(0);
segment.setStatus(0); segment.setStatus(0);
segment.setTotalCapacity(0);
} }
return segment; return segment;
} }
......
...@@ -2,16 +2,24 @@ package com.dituhui.pea.order.controller; ...@@ -2,16 +2,24 @@ 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.dto.OrderCreateReqDTO; import com.dituhui.pea.order.dto.param.CapacityQueryDTO;
import com.dituhui.pea.order.dto.CapacityOrderQueryDTO;
import com.dituhui.pea.order.dto.param.OrderDTO; import com.dituhui.pea.order.dto.param.OrderDTO;
import com.dituhui.pea.order.service.OrderCreateService;
import com.dituhui.pea.order.service.CapacityQueryService; import com.dituhui.pea.order.service.CapacityQueryService;
import com.dituhui.pea.order.service.OrderCreateService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
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.ZoneId;
/**
* 工单接口
*/
@RestController @RestController
@RequestMapping("/pea-order") @RequestMapping("/pea-order")
public class OrderCreateController { public class OrderCreateController {
...@@ -44,14 +52,18 @@ public class OrderCreateController { ...@@ -44,14 +52,18 @@ public class OrderCreateController {
return res; return res;
} }
/**
* 改约容量查询
*
* @param reqDTO 查询参数
* @return 返回日期范围内的容量信息
*/
@PostMapping("/order/service/capacity/query") @PostMapping("/order/service/capacity/query")
public Result<?> capacityQuery(@Validated @RequestBody CapacityOrderQueryDTO.Request reqDTO) { public Result<CapacityQueryDTO.Result> capacityQuery(@Validated @RequestBody CapacityQueryDTO.Request reqDTO) {
Result<?> res = null; //查询日期起止参数限制为一月
try { LocalDate startDate = reqDTO.getBeginDate().toInstant().atZone(ZoneId.of("+8")).toLocalDate();
res = capacityQueryService.queryMatchCapacityData(reqDTO); LocalDate endDate = reqDTO.getEndDate().toInstant().atZone(ZoneId.of("+8")).toLocalDate();
} catch (BusinessException e) {
return Result.failed(e.getMessage()); return capacityQueryService.matchCapacityData(reqDTO, reqDTO.getServices(), reqDTO.getLocation(), startDate, endDate);
}
return res;
} }
} }
...@@ -91,6 +91,8 @@ public class OrderServiceDetailResp { ...@@ -91,6 +91,8 @@ public class OrderServiceDetailResp {
*/ */
private String multipleOrders; private String multipleOrders;
private String beanTags;
@Data @Data
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public static class OrderDetail { public static class OrderDetail {
......
...@@ -165,6 +165,11 @@ public class CapacityQueryDTO { ...@@ -165,6 +165,11 @@ public class CapacityQueryDTO {
* 剩余容量 * 剩余容量
*/ */
private long remain; private long remain;
/**
* 区间总容量
*/
private long totalCapacity;
} }
......
...@@ -77,4 +77,8 @@ public class OrgBranchEntity { ...@@ -77,4 +77,8 @@ public class OrgBranchEntity {
* 帐号状态(0无效 1有效) * 帐号状态(0无效 1有效)
*/ */
private Integer status = 1; private Integer status = 1;
/**
* 账号中心部门id
*/
private String bsDeptId;
} }
...@@ -70,4 +70,8 @@ public class OrgClusterEntity { ...@@ -70,4 +70,8 @@ public class OrgClusterEntity {
* 最长配件保留时长(天) * 最长配件保留时长(天)
*/ */
private Integer reserveTimeMax = 0; private Integer reserveTimeMax = 0;
/**
* 账号中心部门id
*/
private String bsDeptId;
} }
...@@ -121,4 +121,9 @@ public class OrgGroupEntity { ...@@ -121,4 +121,9 @@ public class OrgGroupEntity {
* 帐号状态(0无效 1有效) * 帐号状态(0无效 1有效)
*/ */
private Integer status = 1; private Integer status = 1;
/**
* 账号中心部门id
*/
private String bsDeptId;
} }
...@@ -305,6 +305,9 @@ public class OrderAssignImpl implements OrderAssign { ...@@ -305,6 +305,9 @@ public class OrderAssignImpl implements OrderAssign {
} else if (recommend.equals("group")) { } else if (recommend.equals("group")) {
levelType = "group"; levelType = "group";
levelValue = order.getOrgGroupId(); levelValue = order.getOrgGroupId();
} else if (recommend.equals("all")) {
levelType = "cluster";
levelValue = order.getOrgClusterId();
} else { } else {
return new HashSet<>(); return new HashSet<>();
} }
......
...@@ -93,6 +93,7 @@ public class OrderServiceDetailImpl implements OrderServiceDetail { ...@@ -93,6 +93,7 @@ public class OrderServiceDetailImpl implements OrderServiceDetail {
res.setIsCutoff(order.getIsCutoff()); res.setIsCutoff(order.getIsCutoff());
res.setIsSpecialTime(order.getIsSpecialTime()); res.setIsSpecialTime(order.getIsSpecialTime());
res.setMultipleOrders(order.getMultipleOrders()); res.setMultipleOrders(order.getMultipleOrders());
res.setBeanTags(order.getBeanTags());
return Result.success(res); return Result.success(res);
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!