Commit e282a8a6 by 刘鑫

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

2 parents 287b5e76 1f8e5855
...@@ -5,6 +5,7 @@ public enum OrderPeaTagsEnum { ...@@ -5,6 +5,7 @@ public enum OrderPeaTagsEnum {
special("特殊时段"), special("特殊时段"),
cutoff("当日加单"), cutoff("当日加单"),
multipleOrders("一家多台"), multipleOrders("一家多台"),
transcend("超派"),
urgent("紧急"); urgent("紧急");
private String tag; private String tag;
......
...@@ -145,7 +145,6 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -145,7 +145,6 @@ public class DispatchServiceImpl implements DispatchService {
@Override @Override
public Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO) throws BusinessException { public Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO) throws BusinessException {
// 派工台技术员预约单列表 // 派工台技术员预约单列表
LocalDate date = TimeUtils.IsoDate2LocalDate(reqDTO.getDate()); LocalDate date = TimeUtils.IsoDate2LocalDate(reqDTO.getDate());
// 获取技能信息 // 获取技能信息
...@@ -182,6 +181,7 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -182,6 +181,7 @@ public class DispatchServiceImpl implements DispatchService {
skillGroupCodes.add(skill.getSkillGroupCode()); skillGroupCodes.add(skill.getSkillGroupCode());
} }
engineerCodes = engineerInfoDao.findByEngineerCodesBySkillCodes(engineerCodes, skillGroupCodes); engineerCodes = engineerInfoDao.findByEngineerCodesBySkillCodes(engineerCodes, skillGroupCodes);
engineerCodes = handleEngineerLeave(engineerCodes, date);
} }
// 获取技术员已指派单列表 // 获取技术员已指派单列表
...@@ -232,6 +232,38 @@ public class DispatchServiceImpl implements DispatchService { ...@@ -232,6 +232,38 @@ public class DispatchServiceImpl implements DispatchService {
return Result.success(res); return Result.success(res);
} }
/**
* 过滤请假工程师
*
* @param engineerCodes
* @param targetDate
* @return
*/
private List<String> handleEngineerLeave(List<String> engineerCodes, LocalDate targetDate) {
List engineerCodes2 = new ArrayList();
for (String engineerCode : engineerCodes) {
//获取工作队休息时间, 判定目标时间是否在工作队休息日中
Set<OrgTeamEntity> teams = orgTeamDao.selectTeamByEngineerCode(engineerCode);
if (!org.springframework.util.CollectionUtils.isEmpty(teams)) {
List<String> teamCommonWorkdaysOfWeek = teams.stream()
.map(team -> Arrays.asList(team.getWorkdays().split(",")))
.flatMap(Collection::stream)
.distinct()
.collect(Collectors.toList());
// 求多个工作队的公共空闲时间
final int dayOfWeek = targetDate.getDayOfWeek().getValue();
List<String> commonLeisureDayOfWeek = EngineerCalendarServiceImpl.ALL_WORK_DAY_OF_WEEK.stream().filter(day -> teamCommonWorkdaysOfWeek.stream().noneMatch(tDay -> Objects.equals(day, tDay)))
.collect(Collectors.toList());
if (!commonLeisureDayOfWeek.contains(String.valueOf(dayOfWeek))) {
engineerCodes2.add(engineerCode);
}
//求所有事程时间与工作队休息时间的并集
}
}
return engineerCodes2;
}
private void addOrderToItems(OrderInfoEntity o, List<DispatchEngineerOrderListResp.OrderInfo> items, HashMap<String, SkillInfoEntity> skillInfo, boolean isContinue) { private void addOrderToItems(OrderInfoEntity o, List<DispatchEngineerOrderListResp.OrderInfo> items, HashMap<String, SkillInfoEntity> skillInfo, boolean isContinue) {
DispatchEngineerOrderListResp.OrderInfo item = new DispatchEngineerOrderListResp.OrderInfo(); DispatchEngineerOrderListResp.OrderInfo item = new DispatchEngineerOrderListResp.OrderInfo();
item.setOrderId(o.getOrderId()); item.setOrderId(o.getOrderId());
......
...@@ -93,7 +93,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -93,7 +93,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
@Autowired @Autowired
private IUser user; private IUser user;
private final static List<String> ALL_WORK_DAY_OF_WEEK = List.of("1", "2", "3", "4", "5", "6", "7"); public final static List<String> ALL_WORK_DAY_OF_WEEK = List.of("1", "2", "3", "4", "5", "6", "7");
@Override @Override
public Result<?> getEngineersCalendar(EngineerCalendarDTO.Request req) { public Result<?> getEngineersCalendar(EngineerCalendarDTO.Request req) {
......
...@@ -10,6 +10,7 @@ import com.dituhui.pea.order.dto.EngineersGanttDTO; ...@@ -10,6 +10,7 @@ import com.dituhui.pea.order.dto.EngineersGanttDTO;
import com.dituhui.pea.order.dto.LabelValueDTO; import com.dituhui.pea.order.dto.LabelValueDTO;
import com.dituhui.pea.order.entity.*; import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.enums.OrderFlowEnum; import com.dituhui.pea.order.enums.OrderFlowEnum;
import com.dituhui.pea.order.enums.OrderPeaTagsEnum;
import com.dituhui.pea.order.enums.ServiceStatusEnum; import com.dituhui.pea.order.enums.ServiceStatusEnum;
import com.dituhui.pea.order.service.EngineerGanttService; import com.dituhui.pea.order.service.EngineerGanttService;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
...@@ -19,6 +20,8 @@ import org.apache.commons.lang3.StringUtils; ...@@ -19,6 +20,8 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
...@@ -100,22 +103,23 @@ public class EngineerGanttServiceImpl implements EngineerGanttService { ...@@ -100,22 +103,23 @@ public class EngineerGanttServiceImpl implements EngineerGanttService {
if (!order.getAppointmentStatus().equals(OrderFlowEnum.CONFIRM.name())) { if (!order.getAppointmentStatus().equals(OrderFlowEnum.CONFIRM.name())) {
slot.setBorderStyle("dashed"); // 未确认的指派,统一加上虚框 slot.setBorderStyle("dashed"); // 未确认的指派,统一加上虚框
} }
slots.add(slot); // 有在途时长先计算在途时间
if (order.getArriveElapsed() > 0) { if (order.getArriveElapsed() > 0 && order.getArriveDistance() > 0) {
// 有在途,起止时间,分别是订单的开始时间减去在途时间、订单的开始时间 // 有在途,起止时间,分别是订单的开始时间减去在途时间、订单的开始时间
slot = new EngineersGanttDTO.Slot(); EngineersGanttDTO.Slot slot2 = new EngineersGanttDTO.Slot();
if (checkOrderIsFinish(order.getServiceStatus())) { if (checkOrderIsFinish(order.getServiceStatus())) {
slot.setBtime(getHourMinute(order.getActualStartTime(), -order.getArriveElapsed())); slot2.setBtime(getHourMinute(order.getActualStartTime(), -order.getArriveElapsed()));
slot.setEtime(getHourMinute(order.getActualStartTime())); slot2.setEtime(getHourMinute(order.getActualStartTime()));
} else { } else {
slot.setBtime(getHourMinute(order.getPlanStartTime(), -order.getArriveElapsed())); slot2.setBtime(getHourMinute(order.getPlanStartTime(), -order.getArriveElapsed()));
slot.setEtime(getHourMinute(order.getPlanStartTime())); slot2.setEtime(getHourMinute(order.getPlanStartTime()));
} }
slot.setShapeSize("mini"); slot2.setShapeSize("mini");
slot.setBgColor(getColor("ONWAY")); slot2.setBgColor(getColor("ONWAY"));
slot.setTooltip(getOnwayTips(order)); slot2.setTooltip(getOnwayTips(order));
slots.add(slot); slots.add(slot2);
} }
slots.add(slot);
slots.sort(Comparator.comparing(EngineersGanttDTO.Slot::getBtime)); slots.sort(Comparator.comparing(EngineersGanttDTO.Slot::getBtime));
mapEngineers.put(order.getEngineerCode(), slots); mapEngineers.put(order.getEngineerCode(), slots);
} }
...@@ -211,7 +215,7 @@ public class EngineerGanttServiceImpl implements EngineerGanttService { ...@@ -211,7 +215,7 @@ public class EngineerGanttServiceImpl implements EngineerGanttService {
btime = getHourMinute(order.getPlanStartTime(), -order.getArriveElapsed()); btime = getHourMinute(order.getPlanStartTime(), -order.getArriveElapsed());
etime = getHourMinute(order.getPlanStartTime()); etime = getHourMinute(order.getPlanStartTime());
} }
tips.add(new LabelValueDTO().setLabel("在途路程").setValue(String.format("%s公里(千米)", order.getArriveDistance()))); tips.add(new LabelValueDTO().setLabel("在途路程").setValue(String.format("%s公里(千米)", BigDecimal.valueOf(order.getArriveDistance()).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP))));
tips.add(new LabelValueDTO().setLabel("在途时间").setValue(String.format("%s-%s", btime, etime))); tips.add(new LabelValueDTO().setLabel("在途时间").setValue(String.format("%s-%s", btime, etime)));
tips.add(new LabelValueDTO().setLabel("在途耗时").setValue(String.format("%s分钟", order.getArriveElapsed()))); tips.add(new LabelValueDTO().setLabel("在途耗时").setValue(String.format("%s分钟", order.getArriveElapsed())));
return tips; return tips;
...@@ -223,7 +227,7 @@ public class EngineerGanttServiceImpl implements EngineerGanttService { ...@@ -223,7 +227,7 @@ public class EngineerGanttServiceImpl implements EngineerGanttService {
tips.add(new LabelValueDTO().setLabel("工单号码").setValue(order.getOrderId())); tips.add(new LabelValueDTO().setLabel("工单号码").setValue(order.getOrderId()));
tips.add(new LabelValueDTO().setLabel("品牌/类型/技能").setValue(String.format("%s/%s/%s", order.getBrand(), order.getType(), order.getSkill()))); tips.add(new LabelValueDTO().setLabel("品牌/类型/技能").setValue(String.format("%s/%s/%s", order.getBrand(), order.getType(), order.getSkill())));
tips.add(new LabelValueDTO().setLabel("电话/地址").setValue(String.format("%s %s\n %s", order.getName(), order.getPhone(), order.getAddress()))); tips.add(new LabelValueDTO().setLabel("电话/地址").setValue(String.format("%s %s\n %s", order.getName(), order.getPhone(), order.getAddress())));
tips.add(new LabelValueDTO().setLabel("标签").setValue(order.getTags())); tips.add(new LabelValueDTO().setLabel("标签").setValue(getTags(order)));
tips.add(new LabelValueDTO().setLabel("耗时").setValue(String.format("%s分钟", order.getTakeTime()))); tips.add(new LabelValueDTO().setLabel("耗时").setValue(String.format("%s分钟", order.getTakeTime())));
tips.add(new LabelValueDTO().setLabel("期望时间").setValue(String.format("%s-%s", tips.add(new LabelValueDTO().setLabel("期望时间").setValue(String.format("%s-%s",
DateUtils.formatDateTime(order.getExpectTimeBegin(), "HH:mm"), DateUtils.formatDateTime(order.getExpectTimeEnd(), "HH:mm")))); DateUtils.formatDateTime(order.getExpectTimeBegin(), "HH:mm"), DateUtils.formatDateTime(order.getExpectTimeEnd(), "HH:mm"))));
...@@ -238,6 +242,29 @@ public class EngineerGanttServiceImpl implements EngineerGanttService { ...@@ -238,6 +242,29 @@ public class EngineerGanttServiceImpl implements EngineerGanttService {
return tips; return tips;
} }
private String getTags(OrderInfoEntity order) {
List<String> tagList = new ArrayList();
if (StringUtils.isNotBlank(order.getBeanTags())) {
tagList = Arrays.asList(order.getBeanTags().split(","));
}
if (order.getIsCutoff() == 1) {
tagList.add(OrderPeaTagsEnum.cutoff.getTag());
}
if (order.getIsSpecialTime() == 1) {
tagList.add(OrderPeaTagsEnum.special.getTag());
}
if (order.getTranscend() == 1) {
tagList.add(OrderPeaTagsEnum.transcend.getTag());
}
if (order.getBeanPriority().equals("1")) {
tagList.add(OrderPeaTagsEnum.urgent.getTag());
}
if (StringUtils.isNotBlank(order.getMultipleOrders())) {
tagList.add(OrderPeaTagsEnum.multipleOrders.getTag());
}
return String.join(",", tagList);
}
private boolean checkOrderIsFinish(String serviceStatus) { private boolean checkOrderIsFinish(String serviceStatus) {
String[] array = {"FINISHED", "UNFINISHED"}; String[] array = {"FINISHED", "UNFINISHED"};
......
...@@ -355,10 +355,12 @@ public class OrderCreateServiceImpl implements OrderCreateService { ...@@ -355,10 +355,12 @@ public class OrderCreateServiceImpl implements OrderCreateService {
// 处理超派 // 处理超派
entity.setTranscend(1); entity.setTranscend(1);
} }
Integer special = 0;
if (fendanResult.getCode().equals(StatusCodeEnum.FENDAN_IS_TRANSCEND_AND_SPECIAL.getCode())) { if (fendanResult.getCode().equals(StatusCodeEnum.FENDAN_IS_TRANSCEND_AND_SPECIAL.getCode())) {
// 处理超派和特殊时间 // 处理超派和特殊时间
entity.setTranscend(1); entity.setTranscend(1);
entity.setIsSpecialTime(1); entity.setIsSpecialTime(1);
special = 1;
} }
OrgBranchEntity branchEntity = orgBranchDao.findByCitycodeListLike("%" + adminDistrict.getResult().getSubNames().getCity() + "%"); OrgBranchEntity branchEntity = orgBranchDao.findByCitycodeListLike("%" + adminDistrict.getResult().getSubNames().getCity() + "%");
entity.setOrgClusterId(branchEntity.getClusterId()); entity.setOrgClusterId(branchEntity.getClusterId());
...@@ -368,7 +370,7 @@ public class OrderCreateServiceImpl implements OrderCreateService { ...@@ -368,7 +370,7 @@ public class OrderCreateServiceImpl implements OrderCreateService {
Integer cutoff = CommonUtil.isCutoff(entity.getExpectTimeBegin(), null); Integer cutoff = CommonUtil.isCutoff(entity.getExpectTimeBegin(), null);
entity.setIsCutoff(cutoff); entity.setIsCutoff(cutoff);
//发送通知分部消息 //发送通知分部消息
sendMsg(branchEntity.getBranchId(), orderId, entity.getExpectTimeBegin().toLocalDate(), tags, cutoff, 0); sendMsg(branchEntity.getBranchId(), orderId, entity.getExpectTimeBegin().toLocalDate(), tags, cutoff, special);
} else { } else {
// 根据分单工作队,填写clusterId/branchId/groupId/teamId等 // 根据分单工作队,填写clusterId/branchId/groupId/teamId等
OrgTeamInfo teamInfo = fendanResult.getResult(); OrgTeamInfo teamInfo = fendanResult.getResult();
......
...@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service; ...@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -519,7 +520,8 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -519,7 +520,8 @@ public class OrderInfoServiceImpl implements OrderInfoService {
continue; continue;
} }
DistanceDTO distanceDTO = roadResult.getResult(); DistanceDTO distanceDTO = roadResult.getResult();
int roadTime = distanceDTO.getTime() / 1000; // int roadTime = distanceDTO.getTime() / 60;
int roadTime = BigDecimal.valueOf(distanceDTO.getTime()).divide(BigDecimal.valueOf(60), 0, RoundingMode.HALF_UP).intValue();
// 先判断第一单开始时间 // 先判断第一单开始时间
if (i == 0 && orderSegment.getStart().compareTo(workStartTime.plusMinutes(takeTime + roadTime)) >= 0) { if (i == 0 && orderSegment.getStart().compareTo(workStartTime.plusMinutes(takeTime + roadTime)) >= 0) {
LocalDateTime planStartTime = handleLeaveTime(engineerLeaveTimeSlice, insertOrder.getExpectTimeBegin(), insertOrder.getExpectTimeEnd(), skillInfo.getTakeTime()); LocalDateTime planStartTime = handleLeaveTime(engineerLeaveTimeSlice, insertOrder.getExpectTimeBegin(), insertOrder.getExpectTimeEnd(), skillInfo.getTakeTime());
...@@ -564,10 +566,11 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -564,10 +566,11 @@ public class OrderInfoServiceImpl implements OrderInfoService {
if (!roadResult.getCode().equals(ResultEnum.SUCCESS.getCode())) { if (!roadResult.getCode().equals(ResultEnum.SUCCESS.getCode())) {
continue; continue;
} }
if (nestOrderSegment.getStart().minusMinutes(roadResult2.getResult().getTime() / 1000).compareTo(orderSegment.getEnd().plusMinutes(takeTime + roadTime)) >= 0) { int roadTime2 = BigDecimal.valueOf(roadResult2.getResult().getTime()).divide(BigDecimal.valueOf(60), 0, RoundingMode.HALF_UP).intValue();
// 判断工单开始时间 // 判断工单开始时间 todo 计算不准确 if (nestOrderSegment.getStart().minusMinutes(roadTime2).compareTo(planStartTime.plusMinutes(takeTime + roadTime)) >= 0) {
LocalDateTime planStartTime = insertOrder.getExpectTimeBegin().compareTo(orderSegment.getEnd().plusMinutes(roadTime)) >= 0 ? LocalDateTime planStartTime = insertOrder.getExpectTimeBegin().compareTo(orderSegment.getEnd().plusMinutes(roadTime)) >= 0 ?
insertOrder.getExpectTimeBegin() : orderSegment.getEnd().plusMinutes(roadTime); insertOrder.getExpectTimeBegin() : orderSegment.getEnd().plusMinutes(roadTime);
if (nestOrderSegment.getStart().minusMinutes(roadTime2).compareTo(planStartTime.plusMinutes(takeTime + roadTime)) >= 0) {
planStartTime = handleLeaveTime(engineerLeaveTimeSlice, planStartTime, insertOrder.getExpectTimeEnd(), skillInfo.getTakeTime()); planStartTime = handleLeaveTime(engineerLeaveTimeSlice, planStartTime, insertOrder.getExpectTimeEnd(), skillInfo.getTakeTime());
if (ObjectUtil.isNull(planStartTime)) { if (ObjectUtil.isNull(planStartTime)) {
return Result.failed(insertOrder); return Result.failed(insertOrder);
...@@ -579,7 +582,7 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -579,7 +582,7 @@ public class OrderInfoServiceImpl implements OrderInfoService {
insertOrder.setPlanEndTime(planStartTime.plusMinutes(skillInfo.getTakeTime())); insertOrder.setPlanEndTime(planStartTime.plusMinutes(skillInfo.getTakeTime()));
OrderInfoEntity nestOrder = orderInfoDao.getByOrderId(nestOrderSegment.getOrderId()); OrderInfoEntity nestOrder = orderInfoDao.getByOrderId(nestOrderSegment.getOrderId());
nestOrder.setArriveElapsed(roadResult2.getResult().getTime() / 1000); nestOrder.setArriveElapsed(roadTime2);
nestOrder.setArriveDistance(BigDecimal.valueOf(roadResult2.getResult().getDis() * 1000).intValue()); nestOrder.setArriveDistance(BigDecimal.valueOf(roadResult2.getResult().getDis() * 1000).intValue());
orderInfoDao.save(nestOrder); orderInfoDao.save(nestOrder);
return Result.success(insertOrder); return Result.success(insertOrder);
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!