OrderInfoService.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package com.izouma.jiashanxia.service;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.izouma.jiashanxia.domain.*;
  5. import com.izouma.jiashanxia.domain.Package;
  6. import com.izouma.jiashanxia.dto.PageQuery;
  7. import com.izouma.jiashanxia.enums.OrderInfoStatus;
  8. import com.izouma.jiashanxia.enums.PayMethod;
  9. import com.izouma.jiashanxia.enums.TransactionType;
  10. import com.izouma.jiashanxia.exception.BusinessException;
  11. import com.izouma.jiashanxia.repo.*;
  12. import com.izouma.jiashanxia.utils.JpaUtils;
  13. import lombok.AllArgsConstructor;
  14. import org.springframework.data.domain.Page;
  15. import org.springframework.stereotype.Service;
  16. import javax.persistence.criteria.Predicate;
  17. import java.math.BigDecimal;
  18. import java.time.LocalDateTime;
  19. import java.time.format.DateTimeFormatter;
  20. import java.util.List;
  21. @Service
  22. @AllArgsConstructor
  23. public class OrderInfoService {
  24. private OrderInfoRepo orderInfoRepo;
  25. private PackageRepo packageRepo;
  26. private PackageGoodsRepo packageGoodsRepo;
  27. private UserRepo userRepo;
  28. private SysConfigService sysConfigService;
  29. private CommissionRecordRepo commissionRecordRepo;
  30. private UserPackageService userPackageService;
  31. private CompanyRepo companyRepo;
  32. private WithdrawService withdrawService;
  33. public Page<OrderInfo> all(PageQuery pageQuery) {
  34. return orderInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrderInfo.class), JpaUtils.toPageRequest(pageQuery));
  35. }
  36. /*
  37. 后台列表
  38. */
  39. public Page<OrderInfo> backAll(PageQuery pageQuery) {
  40. return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
  41. List<Predicate> and = JpaUtils.toPredicates(pageQuery, OrderInfo.class, root, criteriaQuery, criteriaBuilder);
  42. if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
  43. /* List<Predicate> or = new ArrayList<>();
  44. or.add(and.get(and.size() - 1));
  45. and.remove(and.get(and.size() - 1));
  46. or.add(criteriaBuilder.like(root.join("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
  47. and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));*/
  48. withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
  49. }
  50. return criteriaBuilder.and(and.toArray(new Predicate[0]));
  51. }), JpaUtils.toPageRequest(pageQuery));
  52. }
  53. /*
  54. 下订单
  55. */
  56. public OrderInfo creatOrder(Long userId, Long setInfoId, PayMethod payMethod) {
  57. Package setInfo = packageRepo.findById(setInfoId).orElseThrow(new BusinessException("无套餐"));
  58. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  59. String localTime = df.format(LocalDateTime.now());
  60. String num = String.format("%05d", orderInfoRepo.orderNum() + 1);
  61. OrderInfo order = OrderInfo.builder()
  62. .setMealId(setInfoId)
  63. .status(OrderInfoStatus.UNPAID)
  64. .userId(userId)
  65. .payMethod(payMethod)
  66. .orderNumber(localTime + num)
  67. .price(setInfo.getAmount())
  68. .name(setInfo.getName())
  69. .build();
  70. return orderInfoRepo.save(order);
  71. }
  72. /*
  73. 完成付款
  74. */
  75. public void completed(Long orderInfoId, String transactionId) {
  76. // 修改订单状态
  77. OrderInfo order = orderInfoRepo.findById(orderInfoId).orElseThrow(new BusinessException("无订单"));
  78. order.setStatus(OrderInfoStatus.PAID);
  79. order.setTransactionId(transactionId);
  80. order.setPaidAt(LocalDateTime.now());
  81. orderInfoRepo.save(order);
  82. // 套餐内商品
  83. List<PackageGoods> setGoodsList = packageGoodsRepo.findAllBySetMealId(order.getSetMealId());
  84. // 加入套餐商品
  85. Long userId = order.getUserId();
  86. userPackageService.joinUserSet(userId, setGoodsList);
  87. User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
  88. if (user.getParent() != null) {
  89. // 上级分销
  90. this.distribution(userId, user.getParent(), transactionId);
  91. }
  92. }
  93. /*
  94. 取消订单
  95. */
  96. public OrderInfo cancelOrder(Long orderId) {
  97. OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
  98. if (OrderInfoStatus.PAID.equals(orderInfo.getStatus())) {
  99. throw new BusinessException("订单已支付,无法取消");
  100. } else if (OrderInfoStatus.CANCELLED.equals(orderInfo.getStatus())) {
  101. return orderInfo;
  102. }
  103. orderInfo.setStatus(OrderInfoStatus.CANCELLED);
  104. return orderInfoRepo.save(orderInfo);
  105. }
  106. /*
  107. 分销
  108. 又有团队,员工自己又购买了套餐,企业是否有收益?
  109. 企业拉员工,员工的上级是否改为企业领导人?
  110. 如果上级和企业不是一个人,收益如何算?
  111. */
  112. public void distribution(Long userId, Long parent, String transactionId) {
  113. User parentUser = userRepo.findById(parent).orElseThrow(new BusinessException("无用户"));
  114. // 判断是否可分享
  115. boolean flag = false;
  116. // 是否公司员工
  117. if (ObjectUtil.isNotEmpty(parentUser.getCompanyId())) {
  118. flag = true;
  119. // 公司可得分销
  120. this.companyDis(parentUser.getCompanyId(), transactionId, userId);
  121. }
  122. if (!flag) {
  123. // 是否购买了套餐
  124. // List<UserSet> parentSets = userSetRepo.findAllByUserId(parent);
  125. // if (CollUtil.isNotEmpty(parentSets)) {
  126. if (parentUser.getIsVip()) {
  127. flag = true;
  128. }
  129. }
  130. if (!flag) {
  131. return;
  132. }
  133. BigDecimal personalAmount = sysConfigService.getBigDecimal("PERSONAL_AMOUNT");
  134. parentUser.setAmount(parentUser.getAmount().add(personalAmount));
  135. userRepo.save(parentUser);
  136. // 个人佣金流水
  137. commissionRecordRepo.save(CommissionRecord.builder()
  138. .userId(parent)
  139. .amount(personalAmount)
  140. .payMethod(PayMethod.YUE)
  141. .fromUserId(userId)
  142. .transactionType(TransactionType.PROMOTE)
  143. .transactionId(transactionId)
  144. .build());
  145. }
  146. /*
  147. 公司分销
  148. */
  149. public void companyDis(Long companyId, String transactionId, Long userId) {
  150. Company company = companyRepo.findById(companyId).orElseThrow(new BusinessException("无企业"));
  151. // 用户余额
  152. User user = userRepo.findById(company.getUserId()).orElseThrow(new BusinessException("无用户"));
  153. BigDecimal companyAmount = sysConfigService.getBigDecimal("COMPANY_AMOUNT");
  154. user.setAmount(user.getAmount().add(companyAmount));
  155. userRepo.save(user);
  156. // 公司余额
  157. company.setAmount(company.getAmount().add(companyAmount));
  158. companyRepo.save(company);
  159. // 佣金流水
  160. commissionRecordRepo.save(CommissionRecord.builder()
  161. .userId(company.getUserId())
  162. .amount(companyAmount)
  163. .payMethod(PayMethod.YUE)
  164. .fromUserId(userId)
  165. .transactionType(TransactionType.EMPLOYEES_PROMOTE)
  166. .transactionId(transactionId)
  167. .build());
  168. }
  169. }