|
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.google.common.collect.Lists;
|
|
|
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
|
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
|
import com.yonge.cooleshow.biz.dal.constant.CourseConstant;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
|
|
@@ -36,6 +37,7 @@ import com.yonge.toolset.base.page.PageInfo;
|
|
|
import com.yonge.toolset.base.string.MessageFormatter;
|
|
|
import com.yonge.toolset.mybatis.support.PageUtil;
|
|
|
import com.yonge.toolset.payment.core.util.SpringBeansUtil;
|
|
|
+import com.yonge.toolset.payment.util.DistributedLock;
|
|
|
import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
|
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
@@ -121,6 +123,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
|
|
|
@Autowired
|
|
|
private StudentService studentService;
|
|
|
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisCacheService redisCacheService;
|
|
|
+
|
|
|
@Override
|
|
|
public CourseGroupDao getDao() {
|
|
|
return this.baseMapper;
|
|
@@ -1539,31 +1545,15 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
|
|
|
@Override
|
|
|
public void closeCourseGroup(CourseGroup courseGroup) {
|
|
|
try {
|
|
|
+ // 关闭未支付的订单
|
|
|
+ userPaymentCoreService.closeCourseGroupOrder(courseGroup.getId());
|
|
|
+
|
|
|
+
|
|
|
List<CourseScheduleStudentPayment> list = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
|
|
|
- .eq(CourseScheduleStudentPayment::getCourseGroupId, courseGroup.getId()));
|
|
|
+ .eq(CourseScheduleStudentPayment::getCourseGroupId, courseGroup.getId()));
|
|
|
Set<Long> userIds = list.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
|
|
|
if (courseGroup.getPreStudentNum() >= courseGroup.getMixStudentNum() && courseGroup.getStatus().equals(CourseGroupEnum.APPLY.getCode())) {
|
|
|
- //人数达标则修改课程组为进行中状态
|
|
|
- courseGroup.setStatus(CourseGroupEnum.ING.getCode());
|
|
|
- List<Long> noGroupJoinUserIds = Lists.newArrayList();
|
|
|
- //创建群聊 并添加人员到群中
|
|
|
- String imGroupId = imGroupService.autoCreate(courseGroup.getId(), courseGroup.getType(), noGroupJoinUserIds);
|
|
|
-
|
|
|
- // 排除未进群的学生
|
|
|
- if (CollectionUtils.isNotEmpty(noGroupJoinUserIds)) {
|
|
|
- noGroupJoinUserIds.forEach(userIds::remove);
|
|
|
- }
|
|
|
- // 更新已进群用户身份
|
|
|
- imGroupMemberService.initGroupMembers(imGroupId, userIds, ImGroupMemberRoleType.STUDENT);
|
|
|
- //添加老师进群
|
|
|
- imGroupMemberService.initGroupMembers(imGroupId, Collections.singleton(courseGroup.getTeacherId()), ImGroupMemberRoleType.TEACHER);
|
|
|
- courseGroup.setImGroupId(imGroupId);
|
|
|
-
|
|
|
- // 小组课成课推送
|
|
|
- if (courseGroup.getType().equals(CourseScheduleEnum.GROUP.getCode())) {
|
|
|
- // 极光-消息推送-老师端-通知老师小组课程组成课
|
|
|
- sendGroupSuccessMessage(courseGroup,true);
|
|
|
- }
|
|
|
+ groupSuccess(courseGroup);
|
|
|
} else {
|
|
|
//人数未达标则修改课程组为取消状态
|
|
|
courseGroup.setStatus(CourseGroupEnum.CANCEL.getCode());
|
|
@@ -1591,9 +1581,9 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
|
|
|
this.sendStudentMessage(userIds, courseGroup);
|
|
|
}
|
|
|
|
|
|
+ courseGroup.setUpdatedTime(new Date());
|
|
|
+ this.updateById(courseGroup);
|
|
|
}
|
|
|
- courseGroup.setUpdatedTime(new Date());
|
|
|
- this.updateById(courseGroup);
|
|
|
} catch (Exception e) {
|
|
|
log.error("closeCourseGroup error >>> courseGroup: {} ", JSON.toJSONString(courseGroup));
|
|
|
log.error("closeCourseGroup error >>> ", e);
|
|
@@ -1601,6 +1591,48 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void groupSuccess(CourseGroup courseGroup){
|
|
|
+
|
|
|
+
|
|
|
+ List<CourseScheduleStudentPayment> list = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
|
|
|
+ .eq(CourseScheduleStudentPayment::getCourseGroupId, courseGroup.getId()));
|
|
|
+ Set<Long> userIds = list.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
|
|
|
+
|
|
|
+ if (courseGroup.getPreStudentNum() < courseGroup.getMixStudentNum() || !courseGroup.getStatus().equals(CourseGroupEnum.APPLY.getCode())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //人数达标则修改课程组为进行中状态
|
|
|
+ courseGroup.setStatus(CourseGroupEnum.ING.getCode());
|
|
|
+ List<Long> noGroupJoinUserIds = Lists.newArrayList();
|
|
|
+ //创建群聊 并添加人员到群中
|
|
|
+ String imGroupId = null;
|
|
|
+ try {
|
|
|
+ imGroupId = imGroupService.autoCreate(courseGroup.getId(), courseGroup.getType(), noGroupJoinUserIds);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("创建群聊失败,{}", JSON.toJSONString(courseGroup),e);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排除未进群的学生
|
|
|
+ if (CollectionUtils.isNotEmpty(noGroupJoinUserIds)) {
|
|
|
+ noGroupJoinUserIds.forEach(userIds::remove);
|
|
|
+ }
|
|
|
+ // 更新已进群用户身份
|
|
|
+ imGroupMemberService.initGroupMembers(imGroupId, userIds, ImGroupMemberRoleType.STUDENT);
|
|
|
+ //添加老师进群
|
|
|
+ imGroupMemberService.initGroupMembers(imGroupId, Collections.singleton(courseGroup.getTeacherId()), ImGroupMemberRoleType.TEACHER);
|
|
|
+ courseGroup.setImGroupId(imGroupId);
|
|
|
+
|
|
|
+ courseGroup.setUpdatedTime(new Date());
|
|
|
+ this.updateById(courseGroup);
|
|
|
+ // 小组课成课推送
|
|
|
+ if (courseGroup.getType().equals(CourseScheduleEnum.GROUP.getCode())) {
|
|
|
+ // 极光-消息推送-老师端-通知老师小组课程组成课
|
|
|
+ sendGroupSuccessMessage(courseGroup,true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void sendGroupSuccessMessage(CourseGroup courseGroup,boolean success) {
|
|
|
// 老师
|
|
|
SysUser sysUser = sysUserService.getByUserId(courseGroup.getTeacherId());
|
|
@@ -1673,32 +1705,44 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
|
|
|
Collection<UserOrder> userOrders = mapByOrderNos.values();
|
|
|
|
|
|
for (UserOrder order : userOrders) {
|
|
|
- try {
|
|
|
|
|
|
- // 直播课成课失败退款,只退课程费用,不退畅学卡
|
|
|
- UserOrderVo detail = userOrderService.detail(order.getId());
|
|
|
+ // 任务执行锁
|
|
|
+ String lockName = redisCacheService.getPaymentCacheKey(order.getOrderNo());
|
|
|
+ DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
|
|
|
|
|
|
- List<Long> orderDetailIds = new ArrayList<>();
|
|
|
- if (CollectionUtils.isNotEmpty(detail.getOrderDetailList())) {
|
|
|
- detail.getOrderDetailList().stream()
|
|
|
- .filter(orderDetail -> orderDetail.getGoodType() == GoodTypeEnum.LIVE || orderDetail.getGoodType() == GoodTypeEnum.GROUP)
|
|
|
- .filter(orderDetail -> orderDetail.getBizId().equals(courseGroup.getId()))
|
|
|
- .forEach(orderDetail -> orderDetailIds.add(orderDetail.getId()));
|
|
|
- }
|
|
|
- if (order.getPaymentVersion().equals(EPaymentVersion.V1)) {
|
|
|
- userOrderRefundService.orderRefund(order.getOrderNo(), CourseScheduleEnum.valueOf(courseGroup.getType()).getMsg() +"成课失败退款");
|
|
|
- } else {
|
|
|
- userPaymentCoreService.refundPayment(order.getOrderNo(),CourseScheduleEnum.valueOf(courseGroup.getType()).getMsg() +"成课失败退款", orderDetailIds);
|
|
|
- }
|
|
|
+ try {
|
|
|
+ if (order.getStatus() == OrderStatusEnum.WAIT_PAY || order.getStatus() == OrderStatusEnum.PAYING) {
|
|
|
+ // 取消订单
|
|
|
+ userPaymentCoreService.cancelPayment(JwtUserInfo.builder().userId(order.getUserId().toString()).clientType(ClientEnum.STUDENT.getCode()).build(),order.getOrderNo());
|
|
|
+ } else if (order.getStatus() == OrderStatusEnum.PAID) {
|
|
|
+
|
|
|
+ // 直播课成课失败退款,只退课程费用,不退畅学卡
|
|
|
+ UserOrderVo detail = userOrderService.detail(order.getId());
|
|
|
+
|
|
|
+ List<Long> orderDetailIds = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(detail.getOrderDetailList())) {
|
|
|
+ detail.getOrderDetailList().stream()
|
|
|
+ .filter(orderDetail -> orderDetail.getGoodType() == GoodTypeEnum.LIVE || orderDetail.getGoodType() == GoodTypeEnum.GROUP)
|
|
|
+ .filter(orderDetail -> orderDetail.getBizId().equals(courseGroup.getId()))
|
|
|
+ .forEach(orderDetail -> orderDetailIds.add(orderDetail.getId()));
|
|
|
+ }
|
|
|
+ if (order.getPaymentVersion().equals(EPaymentVersion.V1)) {
|
|
|
+ userOrderRefundService.orderRefund(order.getOrderNo(), CourseScheduleEnum.valueOf(courseGroup.getType()).getMsg() + "成课失败退款");
|
|
|
+ } else {
|
|
|
+ userPaymentCoreService.refundPayment(order.getOrderNo(), CourseScheduleEnum.valueOf(courseGroup.getType()).getMsg() + "成课失败退款", orderDetailIds);
|
|
|
+ }
|
|
|
|
|
|
- //退还优惠券
|
|
|
- if (orderDetailIds.size() == detail.getOrderDetailList().size()) {
|
|
|
- couponInfoService.updateUserOrderCouponInfo(CouponOrderWrapper.builder().orderNo(order.getOrderNo()).reset(true).build());
|
|
|
+ //退还优惠券
|
|
|
+ if (orderDetailIds.size() == detail.getOrderDetailList().size()) {
|
|
|
+ couponInfoService.updateUserOrderCouponInfo(CouponOrderWrapper.builder().orderNo(order.getOrderNo()).reset(true).build());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("成课失败退款 退款失败,退款订单号 {}", order);
|
|
|
+ log.error("成课失败退款 退款失败", e);
|
|
|
}
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("成课失败退款 退款失败,退款订单号 {}", order);
|
|
|
- log.error("成课失败退款 退款失败", e);
|
|
|
- }
|
|
|
+
|
|
|
+ }, 10L, TimeUnit.SECONDS);
|
|
|
}
|
|
|
}
|
|
|
|