Commit 09a61ee5 by huluobin

Merge branch 'master' into 3.8

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