package cn.stylefeng.guns.modular.business.service.impl;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.ObjUtil;
|
import cn.hutool.json.JSONUtil;
|
import cn.stylefeng.guns.modular.business.dto.CourseOrderResponseDTO;
|
import cn.stylefeng.guns.modular.business.dto.CourseResponseDTO;
|
import cn.stylefeng.guns.modular.business.dto.ImPushDataDTO;
|
import cn.stylefeng.guns.modular.business.dto.request.CourseOrderRequest;
|
import cn.stylefeng.guns.modular.business.dto.request.CoursePlaceOrderRequest;
|
import cn.stylefeng.guns.modular.business.dto.request.OrderPayRequest;
|
import cn.stylefeng.guns.modular.business.entity.Course;
|
import cn.stylefeng.guns.modular.business.entity.CourseChapter;
|
import cn.stylefeng.guns.modular.business.entity.CourseOrder;
|
import cn.stylefeng.guns.modular.business.entity.CouserChapterLearningRate;
|
import cn.stylefeng.guns.modular.business.mapper.CourseOrderMapper;
|
import cn.stylefeng.guns.modular.business.service.*;
|
import cn.stylefeng.guns.utils.GeneralUtil;
|
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
import cn.stylefeng.roses.kernel.customer.modular.entity.Customer;
|
import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService;
|
import cn.stylefeng.roses.kernel.rule.enums.*;
|
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 课程订单信息 服务实现类
|
* </p>
|
*
|
* @author guohongjin
|
* @since 2024-01-02
|
*/
|
@Service
|
public class CourseOrderServiceImpl extends ServiceImpl<CourseOrderMapper, CourseOrder> implements ICourseOrderService {
|
|
@Autowired
|
private ICourseChapterService courseChapterService;
|
|
@Autowired
|
private ICouserChapterLearningRateService couserChapterLearningRateService;
|
|
@Autowired
|
private ICourseService courseService;
|
|
@Autowired
|
private CustomerService customerService;
|
|
@Autowired
|
private IImGroupService iImGroupService;
|
|
@Resource
|
private ImBizService imBizService;
|
|
|
@Override
|
public Page<CourseOrderResponseDTO> findCounseOrderPage(Page<CourseOrderResponseDTO> page, CourseOrderRequest courseOrderRequest) {
|
return this.baseMapper.findCounseOrderPage(page, courseOrderRequest);
|
}
|
|
@Override
|
public CourseOrderResponseDTO getCourseChapterInfoByOrderId(Long orderId) {
|
CourseOrder byId = this.getById(orderId);
|
CourseOrderResponseDTO courseOrderResponseDTO = BeanUtil.copyProperties(byId,CourseOrderResponseDTO.class);
|
//查询章节信息
|
List<CourseChapter> courseChapterList = this.courseChapterService.getAllByCourseId(courseOrderResponseDTO.getCourseId());
|
//查询章节学习进度
|
List<CouserChapterLearningRate> couserChapterLearningRates = this.couserChapterLearningRateService.list(new LambdaQueryWrapper<CouserChapterLearningRate>().eq(CouserChapterLearningRate::getCourseId,courseOrderResponseDTO.getCourseId())
|
.eq(CouserChapterLearningRate::getCourseOrderId,orderId));
|
Map<Long,CouserChapterLearningRate> learnMap = new HashMap<>();
|
if (CollectionUtil.isNotEmpty(couserChapterLearningRates)){
|
learnMap = couserChapterLearningRates.stream().collect(Collectors.toMap(CouserChapterLearningRate::getCourseChapterId, Function.identity()));
|
courseOrderResponseDTO.setStudyCourseChapter(learnMap.size());
|
}
|
//查询总课程章节
|
long totalChapter = this.courseChapterService.count(new LambdaQueryWrapper<CourseChapter>().eq(CourseChapter::getCourseId,courseOrderResponseDTO.getCourseId())
|
.eq(CourseChapter::getIsDelete,false).ne(CourseChapter::getParentId,0).isNotNull(CourseChapter::getMinuteNum));
|
courseOrderResponseDTO.setTotalCourseChapter(Integer.parseInt(totalChapter+""));
|
//处理课程学习进度
|
List<CourseResponseDTO.CourseChapterResponseDTO> courseChapterResponseDTOList = new ArrayList<>();
|
courseChapterResponseDTOList = turnChapterResponseDTO(courseChapterResponseDTOList,courseChapterList,learnMap);
|
courseOrderResponseDTO.setCourseChapterResponseDTOList(courseChapterResponseDTOList);
|
|
if (byId.getUserId()!=null) {
|
Customer byId1 = customerService.getById(byId.getUserId());
|
courseOrderResponseDTO.setUserName(byId1.getNickName());
|
}
|
if (byId.getCourseUserId()!=null) {
|
Customer byId1 = customerService.getById(byId.getCourseUserId());
|
courseOrderResponseDTO.setCourseName(byId1.getNickName());
|
}
|
if (byId.getTutoringUserId()!=null) {
|
Customer byId1 = customerService.getById(byId.getTutoringUserId());
|
courseOrderResponseDTO.setTutoringUserName(byId1.getNickName());
|
}
|
|
|
return courseOrderResponseDTO;
|
}
|
|
|
|
private List<CourseResponseDTO.CourseChapterResponseDTO> turnChapterResponseDTO(List<CourseResponseDTO.CourseChapterResponseDTO> courseChapterResponseDTOList,List<CourseChapter> courseChapterList,
|
Map<Long,CouserChapterLearningRate> learnMap){
|
if (CollectionUtil.isNotEmpty(courseChapterList)){
|
courseChapterResponseDTOList.addAll(BeanUtil.copyToList(courseChapterList,CourseResponseDTO.CourseChapterResponseDTO.class));
|
courseChapterResponseDTOList.forEach(courseChapterResponseDTO -> {
|
if (learnMap.get(courseChapterResponseDTO.getId()) != null){
|
CouserChapterLearningRate couserChapterLearningRate = learnMap.get(courseChapterResponseDTO.getId());
|
courseChapterResponseDTO.setLearnedTime(couserChapterLearningRate.getLearnedTime());
|
courseChapterResponseDTO.setTotalTime(couserChapterLearningRate.getTotalTime());
|
courseChapterResponseDTO.setLastStudyTime(couserChapterLearningRate.getLastStudyTime());
|
}
|
});
|
courseChapterList.stream().forEach(courseChapter -> {
|
if (CollectionUtil.isNotEmpty(courseChapter.getChildList())){
|
List<CourseResponseDTO.CourseChapterResponseDTO> courseChapterResponseDTOS = new ArrayList<>();
|
this.turnChapterResponseDTO(courseChapterResponseDTOS,courseChapter.getChildList(),learnMap);
|
courseChapterResponseDTOList.forEach(courseChapterResponseDTO -> {
|
if (courseChapterResponseDTO.getId().longValue() == courseChapter.getId().longValue()){
|
courseChapterResponseDTO.setChildCourseChapterResponseDTOList(courseChapterResponseDTOS);
|
}
|
});
|
}
|
});
|
return courseChapterResponseDTOList;
|
}
|
return null;
|
}
|
|
@Override
|
public CourseOrder createCourseOrder(CoursePlaceOrderRequest coursePlaceOrderRequest) {
|
Course course = this.courseService.getById(coursePlaceOrderRequest.getCourseId());
|
CourseOrder courseOrder = new CourseOrder();
|
courseOrder.setUserId(coursePlaceOrderRequest.getUserId());
|
courseOrder.setCourseId(coursePlaceOrderRequest.getCourseId());
|
courseOrder.setCreateUser(LoginContext.me().getLoginUser().getUserId());
|
//生成单号
|
courseOrder.setOrderNo(GeneralUtil.generateOrderNo(OrderTypeEnum.COURSE_ORDER));
|
|
courseOrder.setCourseJson(JSONUtil.toJsonStr(course));
|
courseOrder.setTotalTime(course.getTotalTime());
|
courseOrder.setLearnedTime(0l);
|
courseOrder.setOrderAmount(course.getPrice());
|
courseOrder.setPayAmount(courseOrder.getOrderAmount());
|
Customer customerOld = this.customerService.getById(coursePlaceOrderRequest.getUserId());
|
//是否是后台创建订单
|
|
if (customerOld.getClassWorkerId() != null){
|
courseOrder.setCourseUserId(customerOld.getClassWorkerId());
|
}else{
|
//幸福顾问
|
Customer worker = customerService.randomWorkerByLineStatusAndPost(ImStatusEnum.ON_LINE.getCode(), null, PostIdEnum.PO_11.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker != null){
|
courseOrder.setCourseUserId(worker.getCustomerId());
|
}else{
|
Customer worker3 = customerService.randomWorkerByLineStatusAndPost(null, null, PostIdEnum.PO_11.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker3 != null){
|
courseOrder.setCourseUserId(worker3.getCustomerId());
|
}
|
}
|
}
|
|
//课程辅导
|
Customer worker2 = customerService.randomWorkerByLineStatusAndPost(ImStatusEnum.ON_LINE.getCode(), null, PostIdEnum.PO_12.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker2 != null){
|
courseOrder.setTutoringUserId(worker2.getCustomerId());
|
}else{
|
Customer worker3 = customerService.randomWorkerByLineStatusAndPost(null, null, PostIdEnum.PO_12.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker3 != null){
|
courseOrder.setTutoringUserId(worker3.getCustomerId());
|
}
|
}
|
if (coursePlaceOrderRequest.getIsBack()){
|
Customer customer = this.customerService.getById(coursePlaceOrderRequest.getUserId());
|
courseOrder.setPhone(customer.getTelephone());
|
|
courseOrder.setPayTime(new Date());
|
courseOrder.setStatusFlag(1);
|
Date nowDate = new Date();
|
courseOrder.setEffectiveBeginTime(nowDate);
|
courseOrder.setEffectiveEndTime(DateUtil.endOfDay(DateUtil.offsetDay(nowDate,course.getCourseValidity())));
|
this.save(courseOrder);
|
//生成群聊
|
iImGroupService.createGroup(1,null,null,null,courseOrder.getCourseUserId(),courseOrder.getTutoringUserId(),courseOrder.getUserId(),courseOrder.getId());
|
UpdateWrapper<Course> courseUpdateWrapper = new UpdateWrapper<Course>().setSql(" buy_num = buy_num+1 ");
|
//添加购买人数
|
this.courseService.update(courseUpdateWrapper.lambda().eq(Course::getId,courseOrder.getCourseId()));
|
}else{
|
courseOrder.setPhone(coursePlaceOrderRequest.getPhone());
|
courseOrder.setPayType(coursePlaceOrderRequest.getPayType());
|
courseOrder.setStatusFlag(0);
|
this.save(courseOrder);
|
}
|
|
if (customerOld.getClassWorkerId() == null && courseOrder.getCourseUserId() != null){
|
customerOld.setClassWorkerId(courseOrder.getCourseUserId());
|
this.customerService.updateCustomerRemoveCache(customerOld);
|
// if (!coursePlaceOrderRequest.getIsBack()){
|
//
|
// // 推送消息内容
|
// String pushContent = "用户:"+customerOld.getNickName()+",有未支付的课程订单,";
|
// // IM推送数据json
|
// ImPushDataDTO pushData = ImPushDataDTO.builder()
|
// .type(ImPushTypeEnum.S_TO_W_TIP_COURSE_NOT_PAY.getCode())
|
// .objId(ObjUtil.toString(courseOrder.getId()))
|
// .title("通知")
|
// .content(pushContent)
|
//// .extra("去查看。")
|
// .build();
|
// // 发送预约提示
|
// imBizService.messageSendSystem(courseOrder.getUserId()+"", new String[]{customerOld.getClassWorkerId()+""}, pushData, ImUserTypeEnum.WORKER, PostIdEnum.PO_11, true);
|
//
|
// }
|
}
|
|
return courseOrder;
|
}
|
|
@Override
|
public void payCourseOrder(OrderPayRequest orderPayRequest) {
|
CourseOrder courseOrder = this.getOne(new LambdaQueryWrapper<CourseOrder>().eq(CourseOrder::getOrderNo,orderPayRequest.getOrderNo()));
|
if (courseOrder == null){
|
throw new ServiceException("订单号不存在!");
|
}
|
Course course = this.courseService.getById(courseOrder.getCourseId());
|
courseOrder.setTransactionNo(orderPayRequest.getTransactionNo());
|
courseOrder.setStatusFlag(1);
|
courseOrder.setPayTime(new Date());
|
courseOrder.setPayType(orderPayRequest.getPayType());
|
Customer customerOld = this.customerService.getById(courseOrder.getUserId());
|
if (courseOrder.getCourseUserId() == null){
|
//幸福顾问
|
if (customerOld.getClassWorkerId() != null){
|
courseOrder.setCourseUserId(customerOld.getClassWorkerId());
|
}else{
|
//幸福顾问
|
Customer worker = customerService.randomWorkerByLineStatusAndPost(ImStatusEnum.ON_LINE.getCode(), null, PostIdEnum.PO_11.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker != null){
|
courseOrder.setCourseUserId(worker.getCustomerId());
|
}else{
|
Customer worker3 = customerService.randomWorkerByLineStatusAndPost(null, null, PostIdEnum.PO_11.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker3 != null){
|
courseOrder.setCourseUserId(worker3.getCustomerId());
|
}
|
}
|
}
|
}
|
if (courseOrder.getTutoringUserId() == null) {
|
//课程辅导
|
Customer worker2 = customerService.randomWorkerByLineStatusAndPost(ImStatusEnum.ON_LINE.getCode(), null, PostIdEnum.PO_12.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker2 != null) {
|
courseOrder.setTutoringUserId(worker2.getCustomerId());
|
} else {
|
Customer worker3 = customerService.randomWorkerByLineStatusAndPost(null, null, PostIdEnum.PO_12.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode());
|
if (worker3 != null) {
|
courseOrder.setTutoringUserId(worker3.getCustomerId());
|
}
|
}
|
}
|
Date nowDate = new Date();
|
courseOrder.setEffectiveBeginTime(nowDate);
|
courseOrder.setEffectiveEndTime(DateUtil.endOfDay(DateUtil.offsetDay(nowDate,course.getCourseValidity())));
|
//生成群聊
|
iImGroupService.createGroup(1,null,null,null,courseOrder.getCourseUserId(),courseOrder.getTutoringUserId(),courseOrder.getUserId(),courseOrder.getId());
|
UpdateWrapper<Course> courseUpdateWrapper = new UpdateWrapper<Course>().setSql(" buy_num = buy_num+1 ");
|
//添加购买人数
|
this.courseService.update(courseUpdateWrapper.lambda().eq(Course::getId,courseOrder.getCourseId()));
|
this.updateById(courseOrder);
|
if (customerOld.getClassWorkerId() == null && courseOrder.getCourseUserId() != null){
|
customerOld.setClassWorkerId(courseOrder.getCourseUserId());
|
this.customerService.updateCustomerRemoveCache(customerOld);
|
}
|
}
|
|
@Override
|
public CourseOrder getCourseOrderByNo(String orderNo) {
|
return this.getOne(
|
Wrappers.<CourseOrder>lambdaQuery()
|
.eq(CourseOrder::getOrderNo, orderNo)
|
.last("limit 1")
|
);
|
|
}
|
}
|