|
@@ -1,18 +1,52 @@
|
|
|
package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
|
|
|
+import com.beust.jcommander.internal.Lists;
|
|
|
+import com.google.common.collect.Maps;
|
|
|
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
|
|
|
+import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
|
|
|
+import com.microsvc.toolkit.middleware.payment.common.api.entity.DivideReq;
|
|
|
+import com.microsvc.toolkit.middleware.payment.common.api.entity.DivideResp;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.VideoLessonPurchaseRecordDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
|
|
|
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentPaymentVo;
|
|
|
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
|
|
|
+import com.yonge.cooleshow.biz.dal.wrapper.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
|
|
|
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
|
|
|
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
|
|
|
+import com.yonge.cooleshow.common.enums.ESettlementFrom;
|
|
|
+import com.yonge.cooleshow.common.enums.EStatus;
|
|
|
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
|
|
|
+import com.yonge.toolset.base.exception.BizException;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.joda.time.DateTime;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
|
|
|
-import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
|
|
|
import com.yonge.cooleshow.biz.dal.mapper.PaymentDivMemberRecordMapper;
|
|
|
-import com.yonge.cooleshow.biz.dal.service.PaymentDivMemberRecordService;
|
|
|
+import org.springframework.transaction.annotation.Propagation;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 分账子账户记录表
|
|
@@ -22,12 +56,89 @@ import java.util.List;
|
|
|
@Service
|
|
|
public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMemberRecordMapper, PaymentDivMemberRecord> implements PaymentDivMemberRecordService {
|
|
|
|
|
|
- /**
|
|
|
+ @Autowired
|
|
|
+ private PaymentDivMemberService paymentDivMemberService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaymentMerchantConfigService paymentMerchantConfigService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TenantAccountRecordService tenantAccountRecordService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserOrderPaymentService userOrderPaymentService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaymentDivMemberRecordService paymentDivMemberRecordService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PlatformCashAccountRecordService platformCashAccountRecordService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserOrderService userOrderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserAccountService userAccountService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TeacherService teacherService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaymentServiceContext paymentServiceContext;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MusicSheetService musicSheetService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysConfigService sysConfigService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseScheduleStudentPaymentDao paymentDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseScheduleService courseScheduleService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseGroupService courseGroupService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ImUserFriendService imUserFriendService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private VideoLessonPurchaseRecordDao videoLessonPurchaseRecordDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserOrderDao userOrderDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private VideoLessonGroupDao videoLessonGroupDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private VideoLessonPurchaseRecordService videoLessonPurchaseRecordService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MemberPriceSettingsService memberPriceSettingsService;
|
|
|
+ @Autowired
|
|
|
+ private ActivityPlanService activityPlanService;
|
|
|
+
|
|
|
+ /**
|
|
|
* 查询详情
|
|
|
* @param id 详情ID
|
|
|
* @return PaymentDivMemberRecord
|
|
|
*/
|
|
|
- @Override
|
|
|
+ @Override
|
|
|
public PaymentDivMemberRecord detail(Long id) {
|
|
|
|
|
|
return baseMapper.selectById(id);
|
|
@@ -44,15 +155,15 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
|
|
|
|
|
|
return page.setRecords(baseMapper.selectPage(page, query));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 添加
|
|
|
* @param paymentDivMemberRecord PaymentDivMemberRecordWrapper.PaymentDivMemberRecord
|
|
|
* @return Boolean
|
|
|
*/
|
|
|
@Override
|
|
|
- public Boolean add(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord) {
|
|
|
-
|
|
|
+ public Boolean add(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord) {
|
|
|
+
|
|
|
return this.save(JSON.parseObject(paymentDivMemberRecord.jsonString(), PaymentDivMemberRecord.class));
|
|
|
}
|
|
|
|
|
@@ -76,4 +187,709 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
|
|
|
public PaymentDivMemberRecordWrapper.OrderDetailDto getOrderDetail(String orderNo,Long tenantId) {
|
|
|
return baseMapper.getOrderDetail(orderNo,tenantId);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 专辑分账
|
|
|
+ *
|
|
|
+ * @param userPaymentOrder 订单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void tenantAlbum(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 计算商品分账数据
|
|
|
+ if (userPaymentOrder.getOrderClient().equals(ClientEnum.STUDENT)) {
|
|
|
+
|
|
|
+ // 专辑金额
|
|
|
+ TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
|
|
|
+ .parseObject(userPaymentOrder.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
|
|
|
+
|
|
|
+ tenantdivMap.merge(-1L, tenantAlbumContent.getOriginalPrice(), BigDecimal::add);
|
|
|
+
|
|
|
+
|
|
|
+ BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice());
|
|
|
+
|
|
|
+ tenantdivMap.merge(userPaymentOrder.getTenantId(), tenantAmount, BigDecimal::add);
|
|
|
+ tenantdivMap.merge(-1L, tenantAmount, BigDecimal::subtract);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算老师分润数据 平台的真实收益
|
|
|
+ BigDecimal platformFee = tenantdivMap.getOrDefault(-1L,BigDecimal.ZERO);
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, platformFee);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 曲目分账
|
|
|
+ *
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void musicSheet(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ // 计算商品分账数据
|
|
|
+ // 曲目服务费比例
|
|
|
+ String musicSheetServiceFee = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
|
|
|
+ BigDecimal serviceFee = new BigDecimal(musicSheetServiceFee).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
|
|
|
+ //支付金额
|
|
|
+ BigDecimal actualPrice = userPaymentOrder.getActualPrice();
|
|
|
+ BigDecimal expectPrice = userPaymentOrder.getExpectPrice();
|
|
|
+
|
|
|
+ //服务费 原价的平台服务费 ,减去优惠券金额
|
|
|
+ BigDecimal serviceFeeAmount = expectPrice.multiply(serviceFee).subtract(userPaymentOrder.getCouponAmount()).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ if (serviceFeeAmount.compareTo(BigDecimal.ZERO) <0) {
|
|
|
+ serviceFeeAmount = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存购买记录
|
|
|
+ musicSheetService.addMusicSheetPurchaseRecord(userPaymentOrder, actualPrice, serviceFeeAmount);
|
|
|
+
|
|
|
+ // 曲目判断老师收入
|
|
|
+ if (userPaymentOrder.getOrderType().equals(OrderTypeEnum.MUSIC)) {
|
|
|
+ MusicSheet musicSheet = musicSheetService.getById(userPaymentOrder.getBizId());
|
|
|
+ if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
|
|
|
+
|
|
|
+ // 老师收入
|
|
|
+ BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
|
|
|
+
|
|
|
+ // 判断分润给机构 还是给老师
|
|
|
+ Teacher teacher = teacherService.getById(musicSheet.getUserId());
|
|
|
+ if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
|
|
|
+ // 分润给机构
|
|
|
+ tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
|
|
|
+ tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
|
|
|
+ serviceFeeAmount = tenantdivMap.get(-1L);
|
|
|
+ } else {
|
|
|
+ // 分润给老师
|
|
|
+ bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ serviceFeeAmount = actualPrice;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 消息通知
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
+ musicSheetService.sendBuyMessage(userPaymentOrder.getMerchId(), userPaymentOrder.getUserId(),
|
|
|
+ userPaymentOrder.getBizId(), userPaymentOrder.getOrderClient(), userPaymentOrder.getOrderType());
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap,bizMap, serviceFeeAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void practiceCourse(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ //服务费 原价的平台服务费 ,减去优惠券金额
|
|
|
+ BigDecimal serviceFeeAmount = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ log.info("buyPracticeCourseSuccess param:{}", JSON.toJSONString(userPaymentOrder));
|
|
|
+ String orderNo = userPaymentOrder.getOrderNo();
|
|
|
+ List<CourseScheduleStudentPaymentVo> paymentList = paymentDao.selectPaymentList(orderNo);
|
|
|
+ if (CollectionUtils.isEmpty(paymentList)) {
|
|
|
+ throw new BizException("订单不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //lock_改为0,课程组状态改为ING
|
|
|
+ List<Long> scheduleIds = paymentList.stream().map(CourseScheduleStudentPayment::getCourseId).collect(Collectors.toList());
|
|
|
+ courseScheduleService.getDao().updateLock(scheduleIds);
|
|
|
+ UpdateWrapper<CourseGroup> warp = new UpdateWrapper<>();
|
|
|
+ warp.set("status_", "ING").eq("id_", paymentList.get(0).getCourseGroupId());
|
|
|
+ courseGroupService.update(warp);
|
|
|
+
|
|
|
+ //查询陪练课服务费
|
|
|
+ String practiceServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE);
|
|
|
+ BigDecimal practiceServiceRate = new BigDecimal(practiceServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+ //写course_schedule_teacher_salary
|
|
|
+ Long teacherId = null;
|
|
|
+ Long studentId = null;
|
|
|
+ Date now = new Date();
|
|
|
+ List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
|
|
|
+ for (CourseScheduleStudentPaymentVo payment : paymentList) {
|
|
|
+ BigDecimal expectPrice = payment.getExpectPrice();//预计价格
|
|
|
+
|
|
|
+ CourseScheduleTeacherSalary teacherSalary = new CourseScheduleTeacherSalary();
|
|
|
+ teacherSalary.setTeacherId(payment.getTeacherId());
|
|
|
+ teacherSalary.setStudentId(payment.getUserId());
|
|
|
+ teacherSalary.setCourseScheduleId(payment.getCourseId());
|
|
|
+ teacherSalary.setCourseGroupType(payment.getCourseType());
|
|
|
+ teacherSalary.setCourseGroupId(payment.getCourseGroupId());
|
|
|
+ teacherSalary.setClassNum(payment.getClassNum());
|
|
|
+ teacherSalary.setExpectSalary(expectPrice);//预计薪水
|
|
|
+ BigDecimal actualSalary = expectPrice.subtract(expectPrice.multiply(practiceServiceRate)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ teacherSalary.setActualSalary(actualSalary);//实际薪水(扣除手续费)
|
|
|
+ teacherSalary.setReduceSalary(expectPrice.subtract(actualSalary));//扣除薪水 = 预计 - 实际
|
|
|
+ teacherSalary.setReduceSalaryRemark(SysConfigConstant.PRACTICE_SERVICE_FEE);//扣除原因
|
|
|
+ teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
|
|
|
+ teacherSalary.setCreateTime(now);
|
|
|
+
|
|
|
+ if (teacherSalary.getExpectSalary().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ teacherSalaryList.add(teacherSalary);
|
|
|
+ }
|
|
|
+
|
|
|
+ teacherId = payment.getTeacherId();
|
|
|
+ studentId = payment.getUserId();
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(teacherSalaryList)) {
|
|
|
+ courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
|
|
|
+ log.info("buyPracticeCourseSuccess ok");
|
|
|
+
|
|
|
+ // 老师收入总金额
|
|
|
+ BigDecimal teacherAmount = teacherSalaryList.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ // 判断分润给机构 还是给老师
|
|
|
+ Teacher teacher = teacherService.getById(teacherId);
|
|
|
+ if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
|
|
|
+ // 分润给机构
|
|
|
+ tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
|
|
|
+ tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
|
|
|
+ serviceFeeAmount = tenantdivMap.get(-1L);
|
|
|
+ } else {
|
|
|
+ // 分润给老师
|
|
|
+ bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
|
|
|
+ }
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+ Set<Long> studentIds = new HashSet();
|
|
|
+ studentIds.add(studentId);
|
|
|
+ try {
|
|
|
+ imUserFriendService.saveUserFriend(teacherId, studentIds);
|
|
|
+ log.info("保存用户通讯录成功,teacherId:{},studentIds:{}", teacherId, studentIds);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("保存用户通讯录失败,teacherId:{},studentIds:{},e:{}", teacherId, studentIds, e);
|
|
|
+ }
|
|
|
+
|
|
|
+ //消息推送
|
|
|
+ try {
|
|
|
+ courseScheduleService.practiceSend(paymentList.get(0).getTeacherId(), userPaymentOrder.getUserId(), paymentList.size() + "", orderNo);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("陪练课消息推送失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void liveCourse(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ //服务费 原价的平台服务费 ,减去优惠券金额
|
|
|
+ BigDecimal serviceFeeAmount = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ log.info("buyLiveCourseSuccess param :{}", JSON.toJSONString(userPaymentOrder));
|
|
|
+ String orderNo = userPaymentOrder.getOrderNo();
|
|
|
+ //更新课程组的购买人数+1
|
|
|
+ List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
|
|
|
+ .eq(CourseScheduleStudentPayment::getOrderNo, orderNo)
|
|
|
+ );
|
|
|
+ CourseScheduleStudentPayment studentPayment;
|
|
|
+ if (CollectionUtils.isEmpty(studentPaymentList)) {
|
|
|
+ log.info("buyLiveCourseSuccess >>> 订单不存在!orderParam: {}", JSON.toJSONString(userPaymentOrder));
|
|
|
+ throw new BizException("订单不存在");
|
|
|
+ } else {
|
|
|
+ studentPayment = studentPaymentList.get(0);
|
|
|
+ }
|
|
|
+ //课程组信息
|
|
|
+ CourseGroup courseGroup = courseGroupService.getOne(Wrappers.<CourseGroup>lambdaQuery()
|
|
|
+ .eq(CourseGroup::getId, studentPayment.getCourseGroupId()));
|
|
|
+ if (Objects.isNull(courseGroup)) {
|
|
|
+ log.info("buyLiveCourseSuccess >>> 课程组不存在!orderParam: {}", JSON.toJSONString(userPaymentOrder));
|
|
|
+ throw new BizException("课程组不存在");
|
|
|
+ }
|
|
|
+ //更新课程组的购买人数+1
|
|
|
+ courseGroupService.getDao().opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
|
|
|
+
|
|
|
+ // 课程组 人数 + 1
|
|
|
+ courseGroup.setPreStudentNum(courseGroup.getPreStudentNum() + 1);
|
|
|
+ //查询课程组课程列表
|
|
|
+ List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
|
|
|
+ .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
|
|
|
+ //课程总金额
|
|
|
+ BigDecimal totalExpectPrice = WrapperUtil.sumList(studentPaymentList, CourseScheduleStudentPayment::getExpectPrice);
|
|
|
+ //查询直播课服务费
|
|
|
+ String liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
|
|
|
+ BigDecimal liveServiceRate = new BigDecimal(liveServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
|
|
|
+ //总课酬 1 - (1 * 手续费率)
|
|
|
+ BigDecimal totalRatePrice = totalExpectPrice.subtract(totalExpectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ //获取每节课的实际课酬 key 课堂数 value 课酬
|
|
|
+ Map<Integer, BigDecimal> singerActualCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
|
|
|
+ //获取每节课的预计原课酬 key 课堂数 value 课酬
|
|
|
+ Map<Integer, BigDecimal> singerExpectCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalExpectPrice);
|
|
|
+ //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
|
|
|
+ Date now = new Date();
|
|
|
+ List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
|
|
|
+ courseList.forEach(course -> {
|
|
|
+ CourseScheduleTeacherSalary teacherSalary = new CourseScheduleTeacherSalary();
|
|
|
+ teacherSalary.setTeacherId(course.getTeacherId());
|
|
|
+ teacherSalary.setStudentId(studentPayment.getUserId());
|
|
|
+ teacherSalary.setCourseScheduleId(course.getId());
|
|
|
+ teacherSalary.setCourseGroupType(course.getType());
|
|
|
+ teacherSalary.setCourseGroupId(course.getCourseGroupId());
|
|
|
+ teacherSalary.setClassNum(course.getClassNum());
|
|
|
+ teacherSalary.setCreateTime(now);
|
|
|
+ teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
|
|
|
+ //预计课酬
|
|
|
+ BigDecimal ex = singerExpectCourseSalary.get(course.getClassNum());
|
|
|
+ //实际课酬
|
|
|
+ BigDecimal ac = singerActualCourseSalary.get(course.getClassNum());
|
|
|
+ teacherSalary.setExpectSalary(ex);
|
|
|
+ teacherSalary.setActualSalary(ac);
|
|
|
+ //预计课酬-实际课酬 = 扣除费用
|
|
|
+ teacherSalary.setReduceSalary(ex.subtract(ac));
|
|
|
+ //备注是为直播课手续费
|
|
|
+ teacherSalary.setReduceSalaryRemark(SysConfigConstant.LIVE_SERVICE_RATE);
|
|
|
+ if (teacherSalary.getExpectSalary().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ teacherSalaryList.add(teacherSalary);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if(CollectionUtils.isNotEmpty(teacherSalaryList)){
|
|
|
+ courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
|
|
|
+
|
|
|
+ // 老师收入总金额
|
|
|
+ BigDecimal teacherAmount = teacherSalaryList.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ // 判断分润给机构 还是给老师
|
|
|
+ Teacher teacher = teacherService.getById(courseGroup.getTeacherId());
|
|
|
+ if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
|
|
|
+ // 分润给机构
|
|
|
+ tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
|
|
|
+ tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
|
|
|
+ serviceFeeAmount = tenantdivMap.get(-1L);
|
|
|
+ } else {
|
|
|
+ // 分润给老师
|
|
|
+ bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
|
|
|
+ }
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
|
|
|
+ }
|
|
|
+ log.info("buyLiveCourseSuccess ok");
|
|
|
+ //课程购买成功后进行消息推送
|
|
|
+ courseGroupService.buyLiveSendMessage(studentPayment, courseGroup);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void videoCourse(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ //服务费 原价的平台服务费 ,减去优惠券金额
|
|
|
+ BigDecimal serviceFeeAmount = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ log.info("buyVideoCourseSuccess param:{}", JSON.toJSONString(userPaymentOrder));
|
|
|
+ String orderNo = userPaymentOrder.getOrderNo();
|
|
|
+ VideoLessonPurchaseRecord purchaseRecord = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
|
|
|
+ .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
|
|
|
+ if (purchaseRecord == null) {
|
|
|
+ throw new BizException("课程组购买记录不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询订单状态
|
|
|
+ UserOrder userOrder = userOrderDao.selectOne(Wrappers.<UserOrder>lambdaQuery()
|
|
|
+ .eq(UserOrder::getOrderNo, orderNo));
|
|
|
+ if (userOrder == null) {
|
|
|
+ throw new BizException("订单不存在!");
|
|
|
+ }
|
|
|
+ //修改支付状态
|
|
|
+ videoLessonPurchaseRecordDao.updateStatus(orderNo, OrderStatusEnum.PAID.getCode());
|
|
|
+ //查询组信息
|
|
|
+ VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
|
|
|
+ //记录流水
|
|
|
+
|
|
|
+ //查询视频课服务费
|
|
|
+ BigDecimal liveServiceRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
|
|
|
+ .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
|
|
|
+ //支付金额
|
|
|
+ BigDecimal expectPrice = userPaymentOrder.getExpectPrice();
|
|
|
+ //服务费
|
|
|
+ serviceFeeAmount = expectPrice.multiply(liveServiceRate).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ //老师入账金额
|
|
|
+ BigDecimal teacherAmount = expectPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ // 判断分润给机构 还是给老师
|
|
|
+ Teacher teacher = teacherService.getById(lessonGroup.getTeacherId());
|
|
|
+ if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
|
|
|
+ // 分润给机构
|
|
|
+ tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
|
|
|
+ tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
|
|
|
+ serviceFeeAmount = tenantdivMap.get(-1L);
|
|
|
+ } else {
|
|
|
+ // 分润给老师
|
|
|
+ bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
|
|
|
+ }
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ videoLessonPurchaseRecordService.videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
|
|
|
+
|
|
|
+ // 赠品曲目、专辑插入用户曲目购买记录表
|
|
|
+ List<CourseRelationMusicAlbum> musicAlbums = courseRelationMusicAlbumService.lambdaQuery()
|
|
|
+ .eq(CourseRelationMusicAlbum::getCourseGroupId, lessonGroup.getId())
|
|
|
+ .eq(CourseRelationMusicAlbum::getDelFlog, EStatus.ENABLE.getValue())
|
|
|
+ .eq(CourseRelationMusicAlbum::getUseRelationType, CourseRelationTypeEnum.GIFT)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ List<Long> giftIds = musicAlbums.stream()
|
|
|
+ .map(CourseRelationMusicAlbum::getId).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
+ Map<Long, Long> purchaseIdMap = Maps.newHashMap();
|
|
|
+ if (CollectionUtils.isNotEmpty(giftIds)) {
|
|
|
+
|
|
|
+ // 查询用户购买记录
|
|
|
+ purchaseIdMap = musicSheetPurchaseRecordService.lambdaQuery()
|
|
|
+ .eq(MusicSheetPurchaseRecord::getStudentId, userPaymentOrder.getUserId())
|
|
|
+ .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
|
|
|
+ .in(MusicSheetPurchaseRecord::getCourseMusicAlbumId, giftIds)
|
|
|
+ .list().stream()
|
|
|
+ .collect(Collectors.toMap(MusicSheetPurchaseRecord::getCourseMusicAlbumId, MusicSheetPurchaseRecord::getId, (o, n) -> n));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<CourseRelationWrapper.MusicAlbumRecord> musicAlbumRecords = com.google.common.collect.Lists.newArrayList();
|
|
|
+
|
|
|
+ for (CourseRelationMusicAlbum item : musicAlbums) {
|
|
|
+
|
|
|
+ musicAlbumRecords.add(CourseRelationWrapper.MusicAlbumRecord
|
|
|
+ .builder()
|
|
|
+ .clientType(userPaymentOrder.getOrderClient())
|
|
|
+ .musicSheetId(item.getMusicAlbumId())
|
|
|
+ .orderNo(userPaymentOrder.getOrderNo())
|
|
|
+ .purchasePrice(BigDecimal.ZERO)
|
|
|
+ .purchaseTime(DateTime.now().toDate())
|
|
|
+ .teacherId(userPaymentOrder.getMerchId())
|
|
|
+ .originalPrice(BigDecimal.ZERO)
|
|
|
+ .musicSheetServiceFee(BigDecimal.ZERO)
|
|
|
+ .orderStatus(OrderStatusEnum.PAID)
|
|
|
+ .studentId(userPaymentOrder.getUserId())
|
|
|
+ .purchaseType(PurchaseRecordTypeEnum.valueOf(item.getRelationType().getCode()))
|
|
|
+ .id(purchaseIdMap.get(item.getId()))
|
|
|
+ .courseMusicAlbumId(item.getId())
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(musicAlbumRecords)) {
|
|
|
+
|
|
|
+ List<MusicSheetPurchaseRecord> records = JSON.parseArray(JSON.toJSONString(musicAlbumRecords),
|
|
|
+ MusicSheetPurchaseRecord.class);
|
|
|
+
|
|
|
+ // 批量插入课程赠送曲目、专辑数据
|
|
|
+ musicSheetPurchaseRecordService.saveBatch(records, 30);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void vip(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ //服务费 原价的平台服务费 ,减去优惠券金额
|
|
|
+ BigDecimal serviceFeeAmount = userPaymentOrder.getActualPrice();
|
|
|
+
|
|
|
+ memberPriceSettingsService.orderSuccess(userPaymentOrder);
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public void activity(UserOrderDetailVo userPaymentOrder) {
|
|
|
+
|
|
|
+ // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
|
|
|
+
|
|
|
+ // 分账
|
|
|
+ Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
|
|
|
+ tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
|
|
|
+ // 分润
|
|
|
+ Map<Long,BigDecimal> teacherMap = new HashMap<>();
|
|
|
+ // 老师收入
|
|
|
+ Map<Long,BigDecimal> bizMap = new HashMap<>();
|
|
|
+
|
|
|
+ //服务费 原价的平台服务费 ,减去优惠券金额
|
|
|
+ BigDecimal serviceFeeAmount = userPaymentOrder.getActualPrice();
|
|
|
+
|
|
|
+ activityPlanService.orderSuccess(userPaymentOrder);
|
|
|
+
|
|
|
+ saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 写入数据库
|
|
|
+ private void saveData(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap, Map<Long, BigDecimal> teacherMap, Map<Long, BigDecimal> bizMap, BigDecimal platformFee) {
|
|
|
+ // 计算分润
|
|
|
+ teacherAmount(userPaymentOrder, tenantdivMap, teacherMap, platformFee);
|
|
|
+
|
|
|
+
|
|
|
+ // 判断金额是否和支付金额一致
|
|
|
+ BigDecimal totalAmount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ if (!totalAmount.equals(userPaymentOrder.getActualPrice())) {
|
|
|
+ log.error("分账金额不一致 orderNo:{} totalAmount:{} actualPrice:{}", userPaymentOrder.getOrderNo(), totalAmount, userPaymentOrder.getActualPrice());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 写入机构收支表
|
|
|
+ tenantDivRecord(userPaymentOrder, tenantdivMap);
|
|
|
+
|
|
|
+ // 写入平台
|
|
|
+ platformDivRecord(userPaymentOrder, tenantdivMap);
|
|
|
+
|
|
|
+ //写入老师收入
|
|
|
+ // 老师分润
|
|
|
+ for (Map.Entry<Long, BigDecimal> e : bizMap.entrySet()) {
|
|
|
+ Long k = e.getKey();
|
|
|
+ BigDecimal value = e.getValue();
|
|
|
+ if (value.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ teacherBizRecord(userPaymentOrder, k, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (Map.Entry<Long, BigDecimal> entry : teacherMap.entrySet()) {
|
|
|
+ BigDecimal v = entry.getValue();
|
|
|
+ teacherShare(userPaymentOrder, v);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 写入分账记录表
|
|
|
+ divRecord(userPaymentOrder, tenantdivMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void teacherBizRecord(UserOrderDetailVo userPaymentOrder, Long bizId, BigDecimal amount) {
|
|
|
+ //获取账期时间
|
|
|
+ Date accountPeriodTime = userOrderService.getAccountPeriodTime(userPaymentOrder);
|
|
|
+
|
|
|
+ //老师待入账
|
|
|
+ List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
|
|
|
+ List<PlatformCashAccountRecord> platformCashAccountRecords = new ArrayList<>();
|
|
|
+ UserAccountRecordDto dto = new UserAccountRecordDto(userPaymentOrder.getMerchId(), PostStatusEnum.WAIT, amount,
|
|
|
+ InOrOutEnum.IN, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().getCode()), bizId, userPaymentOrder.getGoodName(), userPaymentOrder.getOrderNo(),
|
|
|
+ userPaymentOrder.getUserId(), accountPeriodTime);
|
|
|
+ userAccountRecordDtos.add(dto);
|
|
|
+
|
|
|
+ // 插入平台账户 支出
|
|
|
+ PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
|
|
|
+ InOrOutEnum.OUT, PostStatusEnum.WAIT, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().getCode()), bizId,
|
|
|
+ userPaymentOrder.getOrderNo(), accountPeriodTime);
|
|
|
+ platformCashAccountRecords.add(platformCashAccountRecord);
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(userAccountRecordDtos)) {
|
|
|
+ userAccountService.accountRecord(userAccountRecordDtos);
|
|
|
+ platformCashAccountRecordService.saveBatch(platformCashAccountRecords);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void divRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
|
|
|
+ UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(null, userPaymentOrder.getOrderNo());
|
|
|
+
|
|
|
+ PaymentMerchantConfig merchantConfig = paymentMerchantConfigService.getByPaymentVendor(userPaymentOrder.getPaymentVendor());
|
|
|
+ List<PaymentDivMemberRecord> paymentDivMemberRecords = new ArrayList<>();
|
|
|
+ tenantdivMap.forEach((k, v)->{
|
|
|
+
|
|
|
+ if (v.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+
|
|
|
+ Boolean tenantEnterFlag = false;
|
|
|
+ // 执行分账
|
|
|
+ PaymentDivMember paymentDivMember = null;
|
|
|
+ String divideOrderNo = IdWorker.getIdStr();
|
|
|
+ BigDecimal feeAmt = BigDecimal.ZERO;
|
|
|
+ if (merchantConfig != null && newestPayment != null) {
|
|
|
+ paymentDivMember = paymentDivMemberService.getByAppIdAndTenantId(merchantConfig.getAppId(), userPaymentOrder.getTenantId());
|
|
|
+ if (paymentDivMember != null) {
|
|
|
+ // 执行分账逻辑
|
|
|
+ BasePaymentService paymentService = paymentServiceContext.getPaymentService(merchantConfig.getPaymentVendor());
|
|
|
+ DivideReq.DivMember divMember = DivideReq.DivMember.builder()
|
|
|
+ .memberId(paymentDivMember.getMemberId())
|
|
|
+ .amount(v)
|
|
|
+ .feeFlag("Y")
|
|
|
+ .build();
|
|
|
+ DivideReq divideReq = DivideReq.builder()
|
|
|
+ .transNo(newestPayment.getTransNo())
|
|
|
+ .orderNo(userPaymentOrder.getOrderNo())
|
|
|
+ .divideOrderNo(divideOrderNo)
|
|
|
+ .divideAmount(v)
|
|
|
+ .divMembers(Lists.newArrayList(divMember))
|
|
|
+ .build();
|
|
|
+ try {
|
|
|
+ DivideResp divide = paymentService.divide(divideReq);
|
|
|
+ feeAmt = divide.getFeeAmount();
|
|
|
+ tenantEnterFlag= true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("分账失败 分账对象 {} 分账数据 {} 分账订单号 {}", paymentDivMember, divideReq, divideOrderNo);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 写入机构分账记录表
|
|
|
+ PaymentDivMemberRecord paymentDivMemberRecord = PaymentDivMemberRecord.builder()
|
|
|
+ .tenantId(userPaymentOrder.getTenantId())
|
|
|
+ .appId(merchantConfig!=null?merchantConfig.getAppId():null)
|
|
|
+ .memberId(paymentDivMember !=null?paymentDivMember.getMemberId():null)
|
|
|
+ .orderNo(userPaymentOrder.getOrderNo())
|
|
|
+ .divOrderNo(divideOrderNo)
|
|
|
+ .transNo(newestPayment!=null?newestPayment.getTransNo():null)
|
|
|
+ .amount(v)
|
|
|
+ .tenantEnterFlag(tenantEnterFlag)
|
|
|
+ .status("SUCCESS")
|
|
|
+ .feeFlag(true)
|
|
|
+ .feeAmt(feeAmt)
|
|
|
+ .build();
|
|
|
+ paymentDivMemberRecords.add(paymentDivMemberRecord);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ paymentDivMemberRecordService.saveBatch(paymentDivMemberRecords);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void teacherShare(UserOrderDetailVo userPaymentOrder, BigDecimal shareFee) {
|
|
|
+ //获取账期时间
|
|
|
+ Date accountPeriodTime = userOrderService.getAccountPeriodTime(userPaymentOrder);
|
|
|
+ AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getGoodType().getCode() + "_SHARE");
|
|
|
+ if (null != bizTypeEnum) {
|
|
|
+ //插入分润老师账户变更记录-分润老师预收
|
|
|
+ HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
|
|
|
+ new UserAccountRecordDto(userPaymentOrder.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
|
|
|
+ bizTypeEnum, userPaymentOrder.getBizId(), bizTypeEnum.getMsg(), userPaymentOrder.getOrderNo(), userPaymentOrder.getUserId(), accountPeriodTime));
|
|
|
+ if (recomRecordRes.getStatus()) {
|
|
|
+ //插入平台预支
|
|
|
+ PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getRecomUserId(), shareFee,
|
|
|
+ InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, userPaymentOrder.getBizId(), userPaymentOrder.getOrderNo(), accountPeriodTime);
|
|
|
+ platformCashAccountRecordService.save(platformCashAccountRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void platformDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
|
|
|
+ // 写入平台收支表
|
|
|
+ PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), tenantdivMap.get(-1L),
|
|
|
+ InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.TENANT_ALBUM, userPaymentOrder.getBizId(),
|
|
|
+ userPaymentOrder.getOrderNo(), new Date());
|
|
|
+ platformCashAccountRecordService.save(platformCashAccountRecord);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void tenantDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
|
|
|
+ // 写入收支表
|
|
|
+ List<TenantAccountRecord> tenantAccountRecordList = new ArrayList<>();
|
|
|
+ tenantdivMap.forEach((tenantId, amount)->{
|
|
|
+ if (tenantId.equals(-1L)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getGoodType().getCode());
|
|
|
+
|
|
|
+ // 写入机构流水表
|
|
|
+ TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
|
|
|
+ .tenantId(userPaymentOrder.getTenantId())
|
|
|
+ .transAmount(amount)
|
|
|
+ .inOrOut(InOrOutEnum.IN.getCode())
|
|
|
+ .postStatus(PostStatusEnum.RECORDED.getCode())
|
|
|
+ .bizType(bizTypeEnum.getCode())
|
|
|
+ .bizId(userPaymentOrder.getBizId())
|
|
|
+ .bizName(userPaymentOrder.getGoodName())
|
|
|
+ .orderNo(userPaymentOrder.getOrderNo())
|
|
|
+ .build();
|
|
|
+ tenantAccountRecordList.add(tenantAccountRecord);
|
|
|
+ });
|
|
|
+ tenantAccountRecordService.saveBatch(tenantAccountRecordList);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 计算分润
|
|
|
+ private void teacherAmount(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap, Map<Long, BigDecimal> teacherMap, BigDecimal platformFee) {
|
|
|
+
|
|
|
+ if (platformFee.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //卖家不能分润自己 买家和分润人相同,不分润
|
|
|
+ if (null != userPaymentOrder.getRecomUserId() && userPaymentOrder.getRecomUserId() != 0
|
|
|
+ && !userPaymentOrder.getRecomUserId().equals(userPaymentOrder.getMerchId())
|
|
|
+ && !userPaymentOrder.getUserId().equals(userPaymentOrder.getRecomUserId())) {
|
|
|
+
|
|
|
+ //获取分润收益费率
|
|
|
+ BigDecimal shareFeeRate = userOrderService.getShareFreeByGoodType(userPaymentOrder.getGoodType()
|
|
|
+ , userPaymentOrder.getBizId());
|
|
|
+ //入老师账户
|
|
|
+ BigDecimal shareFee = platformFee.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ if (shareFee.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ // 判断分润给机构 还是给老师
|
|
|
+ Teacher teacher = teacherService.getById(userPaymentOrder.getRecomUserId());
|
|
|
+ if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
|
|
|
+ // 分润给机构
|
|
|
+ tenantdivMap.merge(teacher.getTenantId(), shareFee, BigDecimal::add);
|
|
|
+ tenantdivMap.merge(-1L, shareFee, BigDecimal::subtract);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // 分润给老师
|
|
|
+ teacherMap.merge(userPaymentOrder.getRecomUserId(), shareFee, BigDecimal::add);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|