Commit 28ad9ad9 by huluobin

update

parent 96716f27
...@@ -142,7 +142,7 @@ public interface ScheduleManageService extends IService<ScheduleManage> { ...@@ -142,7 +142,7 @@ public interface ScheduleManageService extends IService<ScheduleManage> {
IPage<LeisureScheduleServeResp> queryPageLeisureScheduleServe(LeisureScheduleServeQuery query); IPage<LeisureScheduleServeResp> queryPageLeisureScheduleServe(LeisureScheduleServeQuery query);
/** /**
* 查询美甲师不可用时间段 * 查询美甲师信息和美甲师不可用时间段
* *
* @param scheduledId 是否必传 否 * @param scheduledId 是否必传 否
* @param departmentId 店铺id * @param departmentId 店铺id
......
...@@ -62,7 +62,6 @@ import java.time.ZoneOffset; ...@@ -62,7 +62,6 @@ import java.time.ZoneOffset;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.gogirl.domain.order.serve.OrderServe.COMMENT_STATUS_NO; import static com.gogirl.domain.order.serve.OrderServe.COMMENT_STATUS_NO;
...@@ -108,74 +107,65 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -108,74 +107,65 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
String scheduleDate, String scheduleDate,
List<Integer> serveIdList) throws ParseException { List<Integer> serveIdList) throws ParseException {
//1.查询美甲师排班表 /*1.查询美甲师排班*/
List<StoreClassesTechnician> storeClassesTechnicianList = storeClassesTechnicianService.listClassesTechnician(scheduledId, departmentId, scheduleDate); List<StoreClassesTechnician> storeClassesTechnicianList = storeClassesTechnicianService.listClassesTechnician(scheduledId, departmentId, scheduleDate);
//过滤不能做服务的美甲师
if (ListUtil.isNotEmpty(serveIdList)) { if (ListUtil.isNotEmpty(serveIdList)) {
//美甲师能做哪些服务config查询 //美甲师能做哪些服务config查询
List<TechnicianServe> technicianServeList = technicianServeMapper.selectList(new LambdaQueryWrapper<TechnicianServe>().in(TechnicianServe::getServeId, serveIdList)); List<TechnicianServe> technicianServeList = technicianServeMapper.selectList(new LambdaQueryWrapper<TechnicianServe>().in(TechnicianServe::getServeId, serveIdList));
//过滤不能做服务的美甲师 storeClassesTechnicianList = storeClassesTechnicianList.stream().filter(storeClassesTechnician -> technicianServeList.stream().map(TechnicianServe::getTechnicianId).collect(Collectors.toList()).contains(storeClassesTechnician.getTechnicianManage().getId())).collect(Collectors.toList());
storeClassesTechnicianList = storeClassesTechnicianList.stream()
.filter(storeClassesTechnician ->
technicianServeList.stream().map(TechnicianServe::getTechnicianId).collect(Collectors.toList())
.contains(storeClassesTechnician.getTechnicianManage().getId()))
.collect(Collectors.toList());
} }
List<StoreTechnicianPeriod> storeTechnicianPeriodList = new ArrayList<>(); List<StoreTechnicianPeriod> storeTechnicianPeriodList = new ArrayList<>();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//一天开始的时间
long dayStartTime = simpleDateFormat.parse(scheduleDate + " 00:00:00").getTime();
//一天结束的时间
long dayEndTime = simpleDateFormat.parse(scheduleDate + " 23:59:59").getTime();
//遍历美甲师排班 获取每个美甲师的不可用时间段 //遍历美甲师排班 获取每个美甲师的不可用时间段
for (StoreClassesTechnician storeClassesTechnician : storeClassesTechnicianList) { for (StoreClassesTechnician storeClassesTechnician : storeClassesTechnicianList) {
//一天开始的时间 /*2、获取各个边界时间*/
long dayStartTime = simpleDateFormat.parse(scheduleDate + " 00:00:00").getTime();
//一天结束的时间
long dayEndTime = simpleDateFormat.parse(scheduleDate + " 23:59:59").getTime();
//上班开始时间str //上班开始时间str
String startTime = storeClassesTechnician.getClassesManage().getStartTime().toString(); String startTime = storeClassesTechnician.getClassesManage().getStartTime().toString();
//上班结束时间str //上班结束时间str
String endTime = storeClassesTechnician.getClassesManage().getEndTime().toString(); String endTime = storeClassesTechnician.getClassesManage().getEndTime().toString();
//上班开始时间 //上班开始时间
long workStartTime = simpleDateFormat.parse(scheduleDate + " " + startTime).getTime(); long workStartTime = simpleDateFormat.parse(scheduleDate + " " + startTime).getTime();
//上班结束时间 //上班结束时间
long workEndTime = simpleDateFormat.parse(scheduleDate + " " + endTime).getTime(); long workEndTime = simpleDateFormat.parse(scheduleDate + " " + endTime).getTime();
//最晚可预约时间 //最晚可预约时间
String latestScheduledTime = storeClassesTechnician.getClassesManage().getLatestScheduledTime().toString(); String latestScheduledTime = storeClassesTechnician.getClassesManage().getLatestScheduledTime().toString();
//美甲师正在服务的时间为不可用时间 /*3、已预约的时间不可用*/
List<ScheduleServe> scheduleServeList = storeClassesTechnician.getListScheduleServe(); List<ScheduleServe> scheduleServeList = storeClassesTechnician.getListScheduleServe();
List<Period> periodList = scheduleServeList.stream().map(scheduleServe -> new Period(scheduleServe.getStartTime().getTime(), scheduleServe.getEndTime().getTime())).collect(Collectors.toList());
//正在服务时间不可用 /*4、当前时间之前的时间不可用*/
List<Period> periodList = scheduleServeList.stream()
.map(scheduleServe -> new Period(scheduleServe.getStartTime().getTime(), scheduleServe.getEndTime().getTime()))
.collect(Collectors.toList());
//当前时间之前不可用
Period period2 = new Period(dayStartTime, System.currentTimeMillis()); Period period2 = new Period(dayStartTime, System.currentTimeMillis());
periodList.add(period2); periodList.add(period2);
//最晚可预约时间 /*5、如果开启了门店最晚预约时间,最晚可预约时间之后的时间不可用*/
if (StringUtils.isNotEmpty(latestScheduledTime) if (StringUtils.isNotEmpty(latestScheduledTime) && storeClassesTechnician.getClassesManage().getLatestScheduledTimeEnable() == 1) {
&& storeClassesTechnician.getClassesManage().getLatestScheduledTimeEnable() == 1) {
long latestScheduledTimeMills = simpleDateFormat.parse(scheduleDate + " " + latestScheduledTime).getTime(); long latestScheduledTimeMills = simpleDateFormat.parse(scheduleDate + " " + latestScheduledTime).getTime();
Period latestScheduledTimeMillsPeriod = new Period(latestScheduledTimeMills, dayEndTime); Period latestScheduledTimeMillsPeriod = new Period(latestScheduledTimeMills, dayEndTime);
periodList.add(latestScheduledTimeMillsPeriod); periodList.add(latestScheduledTimeMillsPeriod);
} }
//上班开始时间之前的时间不可用 /*6、上班开始时间之前的时间不可用*/
Period period3 = new Period(dayStartTime, workStartTime); Period period3 = new Period(dayStartTime, workStartTime);
periodList.add(period3); periodList.add(period3);
//请假时间不可用 /*7、请假时间不可用*/
List<Period> takeLeavePeriodList = takeLeaveEventMapper.selectList(new LambdaQueryWrapper<TakeLeaveEvent>() List<Period> takeLeavePeriodList = takeLeaveEventMapper.selectList(new LambdaQueryWrapper<TakeLeaveEvent>()
.eq(TakeLeaveEvent::getApplyTechnicianId, storeClassesTechnician.getTechnicianManage().getId()) .eq(TakeLeaveEvent::getApplyTechnicianId, storeClassesTechnician.getTechnicianManage().getId())
.eq(TakeLeaveEvent::getStatus, TakeLeaveEvent.STATUS_APPROVAL_PASS) .eq(TakeLeaveEvent::getStatus, TakeLeaveEvent.STATUS_APPROVAL_PASS)
...@@ -186,22 +176,14 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -186,22 +176,14 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
periodList.addAll(takeLeavePeriodList); periodList.addAll(takeLeavePeriodList);
//10点上班的 /*8、10点上班(早班)下班后时间不可用*/
if (startTime.equals("10:00:00")) { if (startTime.equals("10:00:00")) {
//下班后多久的时间是可用的
Period period4 = new Period(workEndTime, dayEndTime); Period period4 = new Period(workEndTime, dayEndTime);
periodList.add(period4); periodList.add(period4);
} }
StoreTechnician storeTechnician = storeClassesTechnician.getTechnicianManage(); /*9、构造返回值*/
StoreTechnicianPeriod storeTechnicianDTO = new StoreTechnicianPeriod( StoreTechnicianPeriod storeTechnicianDTO = new StoreTechnicianPeriod(periodList, storeClassesTechnician.getTechnicianManage());
periodList,
storeTechnician.getId(),
storeTechnician.getName(),
storeTechnician.getPicturePath(),
storeTechnician.getGrade()
);
storeTechnicianPeriodList.add(storeTechnicianDTO); storeTechnicianPeriodList.add(storeTechnicianDTO);
} }
...@@ -214,8 +196,8 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -214,8 +196,8 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
LocalDateTime serveStartTime, LocalDateTime serveStartTime,
LocalDateTime serveEndTime) throws ParseException { LocalDateTime serveEndTime) throws ParseException {
List<StoreTechnicianPeriod> storeTechnicianPeriodList = this.queryStoreTechnicianPeriod(null, departmentId, serveStartTime.toLocalDate().toString(), Lists.newArrayList(serveId)); List<StoreTechnicianPeriod> storeTechnicianPeriodList = this.queryStoreTechnicianPeriod(null, departmentId, serveStartTime.toLocalDate().toString(), Lists.newArrayList(serveId));
Period servePeriod = new Period(serveStartTime.toInstant(ZoneOffset.of("+8")).toEpochMilli(), Period servePeriod = new Period(serveStartTime.toInstant(ZoneOffset.of("+8")).toEpochMilli(), serveEndTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
serveEndTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
List<Integer> technicianIds = storeTechnicianPeriodList.stream().filter(storeTechnicianPeriod -> List<Integer> technicianIds = storeTechnicianPeriodList.stream().filter(storeTechnicianPeriod ->
!storeTechnicianPeriod.getPeriodList().stream().map(period -> period.conflict(servePeriod)) !storeTechnicianPeriod.getPeriodList().stream().map(period -> period.conflict(servePeriod))
.collect(Collectors.toList()).contains(true)) .collect(Collectors.toList()).contains(true))
...@@ -233,13 +215,10 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -233,13 +215,10 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//美甲师不可用日期列表 /*1、获取美甲师和美甲师不可用时间段*/
List<StoreTechnicianPeriod> storeTechnicianDTOList = this.queryStoreTechnicianPeriod(qry.getId(), List<StoreTechnicianPeriod> storeTechnicianDTOList = this.queryStoreTechnicianPeriod(qry.getId(), qry.getDepartmentId(), qry.getScheduleDate(), qry.getListScheduleServer().stream().map(ScheduleServeQuery::getServeId).collect(Collectors.toList()));
qry.getDepartmentId(),
qry.getScheduleDate(),
qry.getListScheduleServer().stream().map(ScheduleServeQuery::getServeId).collect(Collectors.toList()));
//查询时段 /*2、迭代出所有需要返回的时间节点*/
if (ListUtil.isEmpty(qry.getDateTimeList())) { if (ListUtil.isEmpty(qry.getDateTimeList())) {
long workStartTime = simpleDateFormat.parse(qry.getScheduleDate() + " 10:00:00").getTime(); long workStartTime = simpleDateFormat.parse(qry.getScheduleDate() + " 10:00:00").getTime();
long workEndTime = simpleDateFormat.parse(qry.getScheduleDate() + " 22:00:00").getTime(); long workEndTime = simpleDateFormat.parse(qry.getScheduleDate() + " 22:00:00").getTime();
...@@ -251,6 +230,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -251,6 +230,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
} }
qry.setDateTimeList(dateTimeList); qry.setDateTimeList(dateTimeList);
} }
//预约服务时长和图片 //预约服务时长和图片
qry.getListScheduleServer().forEach(scheduleServeQuery -> { qry.getListScheduleServer().forEach(scheduleServeQuery -> {
if (scheduleServeQuery.getProduceId() == null) { if (scheduleServeQuery.getProduceId() == null) {
...@@ -286,55 +266,46 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -286,55 +266,46 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
}); });
}); });
//线程池加速
ForkJoinPool myPool = new ForkJoinPool(qry.getDateTimeList().size()); ForkJoinPool myPool = new ForkJoinPool(qry.getDateTimeList().size());
List<IdleTimeDTO> idleTimeDTOList = new ArrayList<>(qry.getDateTimeList().size()); List<IdleTimeDTO> idleTimeDTOList = new ArrayList<>(qry.getDateTimeList().size());
myPool.submit(() -> { myPool.submit(() -> qry.getDateTimeList()
qry.getDateTimeList()
.forEach(dateTime -> {
AtomicLong time = new AtomicLong(System.currentTimeMillis()); .forEach(dateTime -> {
//每个主服务由不同的美甲师做,setter主服务的时间period
mainScheduleServeQueryLinkedList.forEach(mainServeDTO -> {
Period period = new Period();
period.setStartTime(dateTime);
period.setLength(mainServeDTO.getLengthTimeForEndTime().longValue() * 60000);
period.setEndTime(dateTime + period.getLength());
mainServeDTO.setPeriod(period);
});
//主服务深度克隆
List<ScheduleServeQuery> cloneMainServeDTOList = mainScheduleServeQueryLinkedList.stream().map(CloneUtil::deepClone).collect(Collectors.toList());
//美甲师深度克隆 //每个主服务由不同的美甲师做,setter主服务的时间period
List<StoreTechnicianPeriod> cloneStoreTechnicianDTOList = storeTechnicianDTOList.stream().map(CloneUtil::deepClone).collect(Collectors.toList()); mainScheduleServeQueryLinkedList.forEach(mainScheduleServeQuery -> {
Period period = new Period(dateTime, dateTime + mainScheduleServeQuery.getLengthTimeForEndTime().longValue() * 60000);
mainScheduleServeQuery.setPeriod(period);
});
//构造预约方案树🌲 //主服务深度克隆
TreeProgram treeProgram = this.rec(new LinkedList<>(cloneMainServeDTOList), cloneStoreTechnicianDTOList, TreeProgram.root()); Queue<ScheduleServeQuery> cloneMainServeDTOList = mainScheduleServeQueryLinkedList.stream().map(CloneUtil::deepClone).collect(Collectors.toCollection(LinkedList::new));
time.set(System.currentTimeMillis()); //美甲师深度克隆
List<StoreTechnicianPeriod> cloneStoreTechnicianDTOList = storeTechnicianDTOList.stream().map(CloneUtil::deepClone).collect(Collectors.toList());
List<TreeProgram> defaultNodes = new ArrayList<>(); //根据需要预约的服务和美甲师构造预约方案树🌲
TreeProgram treeProgram = this.buildTreeProgram(cloneMainServeDTOList, cloneStoreTechnicianDTOList, TreeProgram.root());
//构造默认美甲师 //构造默认美甲师
this.recDefault(defaultNodes, treeProgram); List<TreeProgram> defaultNodeList = new ArrayList<>();
time.set(System.currentTimeMillis()); this.buildDefaultNodeList(defaultNodeList, treeProgram);
IdleTimeDTO idleTimeDTO = new IdleTimeDTO(); IdleTimeDTO idleTimeDTO = new IdleTimeDTO();
idleTimeDTO.setDateTime(dateTime); idleTimeDTO.setDateTime(dateTime);
idleTimeDTO.setTime(new SimpleDateFormat("HH:mm").format(new Date(dateTime))); idleTimeDTO.setTime(new SimpleDateFormat("HH:mm").format(new Date(dateTime)));
/*关键信息 节点是否可用*/ /*关键信息 节点是否可用*/
idleTimeDTO.setStatus(!treeProgram.childNull()); idleTimeDTO.setStatus(!treeProgram.childNull());
idleTimeDTO.setTreeProgram(treeProgram); idleTimeDTO.setTreeProgram(treeProgram);
idleTimeDTO.setDefaultNodeList(defaultNodes); idleTimeDTO.setDefaultNodeList(defaultNodeList);
idleTimeDTOList.add(idleTimeDTO); idleTimeDTOList.add(idleTimeDTO);
}); })).get();
}).get();
myPool.shutdown(); myPool.shutdown();
...@@ -344,11 +315,12 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -344,11 +315,12 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
idleTimeDTO.setTreeProgram(null); idleTimeDTO.setTreeProgram(null);
}); });
} }
/*排序返回*/
return idleTimeDTOList.stream().sorted(Comparator.comparing(IdleTimeDTO::getTime)).collect(Collectors.toList()); return idleTimeDTOList.stream().sorted(Comparator.comparing(IdleTimeDTO::getTime)).collect(Collectors.toList());
} }
private void recDefault(List<TreeProgram> list, private void buildDefaultNodeList(List<TreeProgram> list,
TreeProgram parent) { TreeProgram parent) {
if (!CollectionUtils.isEmpty(parent.getChildList())) { if (!CollectionUtils.isEmpty(parent.getChildList())) {
TreeProgram treeProgram = new TreeProgram(); TreeProgram treeProgram = new TreeProgram();
TreeProgram defaultNode = parent.getChildList() TreeProgram defaultNode = parent.getChildList()
...@@ -366,87 +338,90 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -366,87 +338,90 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
treeProgram.setStoreTechnicianDTO(defaultNode.getStoreTechnicianDTO()); treeProgram.setStoreTechnicianDTO(defaultNode.getStoreTechnicianDTO());
list.add(treeProgram); list.add(treeProgram);
this.recDefault(list, defaultNode); this.buildDefaultNodeList(list, defaultNode);
} }
} }
private TreeProgram rec(Queue<ScheduleServeQuery> scheduleServeQueryList, private TreeProgram buildTreeProgram(Queue<ScheduleServeQuery> scheduleServeQueryList,
List<StoreTechnicianPeriod> storeTechnicians, List<StoreTechnicianPeriod> storeTechnicians,
TreeProgram parent) { TreeProgram parent) {
long time = System.currentTimeMillis();
final ScheduleServeQuery scheduleServeQuery = scheduleServeQueryList.poll(); final ScheduleServeQuery scheduleServeQuery = scheduleServeQueryList.poll();
List<TreeProgram> childList = Lists.newArrayList(); List<TreeProgram> childList = Lists.newArrayList();
//遍历每一个美甲师 //遍历每一个美甲师
storeTechnicians.forEach(storeTechnician -> { storeTechnicians.stream()
.filter(storeTechnicianPeriod -> {
//美甲师深度克隆 List<TechnicianServe> technicianServeList = technicianServeMapper.selectList(new LambdaQueryWrapper<TechnicianServe>().eq(TechnicianServe::getServeId, scheduleServeQuery.getServeId()));
List<TreeProgram> pathClone = parent.getPath().stream().map(CloneUtil::deepClone).filter(Objects::nonNull) return technicianServeList.stream().map(TechnicianServe::getTechnicianId).collect(Collectors.toList()).contains(storeTechnicianPeriod.getTechnicianId());
.collect(Collectors.toList()); })
.forEach(storeTechnician -> {
//包含当前美甲师的父节点list
List<ScheduleServeQuery> severedList = pathClone
.stream()
//根节点到当前节点和
.filter(node -> node.getStoreTechnicianDTO().getTechnicianId().equals(storeTechnician.getTechnicianId()))
.map(TreeProgram::getScheduleServeQuery)
.collect(Collectors.toList());
//美甲师深度克隆
List<TreeProgram> pathClone = parent.getPath().stream().map(CloneUtil::deepClone).filter(Objects::nonNull).collect(Collectors.toList());
TreeProgram t = CloneUtil.deepClone(parent); //包含当前美甲师的父节点list
List<StoreTechnicianPeriod> treeProgramList = Lists.newArrayList(); List<ScheduleServeQuery> severedList = pathClone
.stream()
//根节点到当前节点和
.filter(node -> node.getStoreTechnicianDTO().getTechnicianId().equals(storeTechnician.getTechnicianId()))
.map(TreeProgram::getScheduleServeQuery)
.collect(Collectors.toList());
while (t != null && t.getParent() != null) {
if (t.getStoreTechnicianDTO() != null) {
treeProgramList.add(t.getStoreTechnicianDTO());
}
t = t.getParent();
}
List<Integer> technicianIds = treeProgramList.stream().map(StoreTechnicianPeriod::getTechnicianId).collect(Collectors.toList());
Integer technicianId = storeTechnician.getTechnicianId();
boolean b = technicianIds.contains(technicianId);
//如果已经设置该美甲师的节点不为空 需要把当前节点的服务时间加上
TreeProgram node;
if (b) {
Long totalServeTime = severedList.stream()
.map(ScheduleServeQuery::getPeriod)
.map(Period::getLength)
.mapToLong(Long::longValue)
.sum();
ScheduleServeQuery scheduleServeQueryClone = CloneUtil.deepClone(scheduleServeQuery);
Period period = scheduleServeQueryClone.getPeriod();
period.setStartTime(period.getStartTime() + totalServeTime);
period.setEndTime(period.getEndTime() + totalServeTime);
node = new TreeProgram(storeTechnician, scheduleServeQueryClone, parent);
} else {
ScheduleServeQuery scheduleServeQueryClone = CloneUtil.deepClone(scheduleServeQuery);
node = new TreeProgram(storeTechnician, scheduleServeQueryClone, parent);
}
//判断该节点的路径是否满足要求
if (this.test(node.getPath())) {
//如果还有服务 继续构造子树 TreeProgram t = CloneUtil.deepClone(parent);
if (!CollectionUtils.isEmpty(scheduleServeQueryList)) { List<StoreTechnicianPeriod> treeProgramList = Lists.newArrayList();
Queue<ScheduleServeQuery> cloneScheduleServeQueryList = scheduleServeQueryList.stream().map(CloneUtil::deepClone).collect(Collectors.toCollection(LinkedList::new));
this.rec(cloneScheduleServeQueryList, storeTechnicians, node);
//如果构造的子树为空 while (t != null && t.getParent() != null) {
if (!node.childNull()) { if (t.getStoreTechnicianDTO() != null) {
childList.add(node); treeProgramList.add(t.getStoreTechnicianDTO());
}
t = t.getParent();
} }
} List<Integer> technicianIds = treeProgramList.stream().map(StoreTechnicianPeriod::getTechnicianId).collect(Collectors.toList());
//如果没有服务了 说明是叶子节点,直接添加 Integer technicianId = storeTechnician.getTechnicianId();
else {
childList.add(node); boolean b = technicianIds.contains(technicianId);
}
} //如果已经设置该美甲师的节点不为空 需要把当前节点的服务时间加上
}); TreeProgram node;
if (b) {
Long totalServeTime = severedList.stream()
.map(ScheduleServeQuery::getPeriod)
.map(Period::getLength)
.mapToLong(Long::longValue)
.sum();
ScheduleServeQuery scheduleServeQueryClone = CloneUtil.deepClone(scheduleServeQuery);
Period period = scheduleServeQueryClone.getPeriod();
period.setStartTime(period.getStartTime() + totalServeTime);
period.setEndTime(period.getEndTime() + totalServeTime);
node = new TreeProgram(storeTechnician, scheduleServeQueryClone, parent);
} else {
ScheduleServeQuery scheduleServeQueryClone = CloneUtil.deepClone(scheduleServeQuery);
node = new TreeProgram(storeTechnician, scheduleServeQueryClone, parent);
}
//判断该节点的路径是否满足要求
if (this.test(node.getPath())) {
//如果还有服务 继续构造子树
if (!CollectionUtils.isEmpty(scheduleServeQueryList)) {
Queue<ScheduleServeQuery> cloneScheduleServeQueryList = scheduleServeQueryList.stream().map(CloneUtil::deepClone).collect(Collectors.toCollection(LinkedList::new));
this.buildTreeProgram(cloneScheduleServeQueryList, storeTechnicians, node);
//如果构造的子树为空
if (!node.childNull()) {
childList.add(node);
}
}
//如果没有服务了 说明是叶子节点,直接添加
else {
childList.add(node);
}
}
});
parent.setChildList(childList); parent.setChildList(childList);
return parent; return parent;
...@@ -454,8 +429,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper, ...@@ -454,8 +429,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
private boolean test(List<TreeProgram> path) { private boolean test(List<TreeProgram> path) {
Map<StoreTechnicianPeriod, List<TreeProgram>> map = path.stream() Map<StoreTechnicianPeriod, List<TreeProgram>> map = path.stream().collect(Collectors.groupingBy(TreeProgram::getStoreTechnicianDTO));
.collect(Collectors.groupingBy(TreeProgram::getStoreTechnicianDTO));
List<TreeProgram> treePrograms = map.values().stream() List<TreeProgram> treePrograms = map.values().stream()
......
...@@ -24,7 +24,6 @@ import com.gogirl.infrastructure.common.util.StringUtils; ...@@ -24,7 +24,6 @@ import com.gogirl.infrastructure.common.util.StringUtils;
import com.gogirl.infrastructure.mapper.order.serve.OrderManageMapper; import com.gogirl.infrastructure.mapper.order.serve.OrderManageMapper;
import com.gogirl.infrastructure.mapper.order.serve.OrderRecordMapper; import com.gogirl.infrastructure.mapper.order.serve.OrderRecordMapper;
import com.gogirl.infrastructure.mapper.order.serve.OrderServeMapper; import com.gogirl.infrastructure.mapper.order.serve.OrderServeMapper;
import com.gogirl.infrastructure.mapper.order.serve.ScheduleManageMapper;
import com.gogirl.infrastructure.mapper.product.serve.BaseServeMapper; import com.gogirl.infrastructure.mapper.product.serve.BaseServeMapper;
import com.gogirl.infrastructure.mapper.store.store.StoreManageMapper; import com.gogirl.infrastructure.mapper.store.store.StoreManageMapper;
import com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceMapper; import com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceMapper;
...@@ -52,36 +51,40 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i ...@@ -52,36 +51,40 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
@Resource @Resource
private CustomerMapper customerMapper; private CustomerMapper customerMapper;
@Resource @Resource
private WechatService wechatService; private WechatService wechatService;
@Resource @Resource
private GogirlTokenService gogirlTokenService; private GogirlTokenService gogirlTokenService;
@Resource
private ScheduleManageMapper scheduleManageMapper;
@Resource @Resource
private CustomerDetailMapper customerDetailMapper; private CustomerDetailMapper customerDetailMapper;
@Resource @Resource
private CustomerBalanceMapper customerBalanceMapper; private CustomerBalanceMapper customerBalanceMapper;
@Resource @Resource
private QRCodeService qrCodeService; private QRCodeService qrCodeService;
@Resource @Resource
private StoreManageMapper storeManageMapper; private StoreManageMapper storeManageMapper;
@Resource @Resource
private OrderManageMapper orderManageMapper; private OrderManageMapper orderManageMapper;
@Resource @Resource
private OrderServeMapper orderServeMapper; private OrderServeMapper orderServeMapper;
@Resource @Resource
private BaseServeMapper baseServeMapper; private BaseServeMapper baseServeMapper;
@Resource @Resource
private OrderRecordMapper orderRecordMapper; private OrderRecordMapper orderRecordMapper;
@Resource @Resource
private CustomerDetailService customerDetailService; private CustomerDetailService customerDetailService;
@Resource @Resource
private OrderManageService orderManageService; private OrderManageService orderManageService;
......
package com.gogirl.shared.order; package com.gogirl.shared.order;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.gogirl.domain.store.store.StoreTechnician;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -23,11 +24,27 @@ public class StoreTechnicianPeriod implements Serializable { ...@@ -23,11 +24,27 @@ public class StoreTechnicianPeriod implements Serializable {
*/ */
private Integer technicianId; private Integer technicianId;
//美甲师姓名 /**
* 美甲师姓名
*/
private String name; private String name;
/**
* 美甲师头像
*/
private String picturePath; private String picturePath;
/**
* 美甲师级别
*/
private String grade; private String grade;
public StoreTechnicianPeriod(List<Period> periodList, StoreTechnician storeTechnician) {
this.periodList = periodList;
this.technicianId = storeTechnician.getId();
this.name = storeTechnician.getName();
this.picturePath = storeTechnician.getPicturePath();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment