OrderInfoService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.izouma.jiashanxia.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.izouma.jiashanxia.domain.*;
  7. import com.izouma.jiashanxia.domain.Package;
  8. import com.izouma.jiashanxia.dto.GoodsVO;
  9. import com.izouma.jiashanxia.dto.OrderInfoVO;
  10. import com.izouma.jiashanxia.dto.PageQuery;
  11. import com.izouma.jiashanxia.enums.OrderInfoStatus;
  12. import com.izouma.jiashanxia.enums.PayMethod;
  13. import com.izouma.jiashanxia.enums.TransactionType;
  14. import com.izouma.jiashanxia.exception.BusinessException;
  15. import com.izouma.jiashanxia.repo.*;
  16. import com.izouma.jiashanxia.utils.JpaUtils;
  17. import lombok.AllArgsConstructor;
  18. import org.springframework.data.domain.Page;
  19. import org.springframework.data.domain.PageImpl;
  20. import org.springframework.data.domain.Pageable;
  21. import org.springframework.stereotype.Service;
  22. import javax.persistence.criteria.Predicate;
  23. import java.math.BigDecimal;
  24. import java.time.LocalDateTime;
  25. import java.time.format.DateTimeFormatter;
  26. import java.util.ArrayList;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.Set;
  30. import java.util.stream.Collectors;
  31. @Service
  32. @AllArgsConstructor
  33. public class OrderInfoService {
  34. private OrderInfoRepo orderInfoRepo;
  35. private PackageRepo packageRepo;
  36. private PackageGoodsRepo packageGoodsRepo;
  37. private UserRepo userRepo;
  38. private SysConfigService sysConfigService;
  39. private CommissionRecordRepo commissionRecordRepo;
  40. private UserPackageService userPackageService;
  41. private CompanyRepo companyRepo;
  42. private WithdrawService withdrawService;
  43. private GoodsInfoRepo goodsInfoRepo;
  44. public Page<OrderInfo> all(PageQuery pageQuery) {
  45. return orderInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrderInfo.class), JpaUtils.toPageRequest(pageQuery));
  46. }
  47. /*
  48. 后台列表
  49. */
  50. public Page<OrderInfo> backAll(PageQuery pageQuery) {
  51. return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
  52. List<Predicate> and = JpaUtils.toPredicates(pageQuery, OrderInfo.class, root, criteriaQuery, criteriaBuilder);
  53. if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
  54. /* List<Predicate> or = new ArrayList<>();
  55. or.add(and.get(and.size() - 1));
  56. and.remove(and.get(and.size() - 1));
  57. or.add(criteriaBuilder.like(root.join("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
  58. and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));*/
  59. withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
  60. }
  61. return criteriaBuilder.and(and.toArray(new Predicate[0]));
  62. }), JpaUtils.toPageRequest(pageQuery));
  63. }
  64. /*
  65. 下订单
  66. */
  67. public OrderInfo createOrder(Long userId, Long packageId, PayMethod payMethod) {
  68. Package setInfo = packageRepo.findById(packageId).orElseThrow(new BusinessException("无套餐"));
  69. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  70. String localTime = df.format(LocalDateTime.now());
  71. String num = String.format("%05d", orderInfoRepo.orderNum() + 1);
  72. OrderInfo order = OrderInfo.builder()
  73. .packageId(packageId)
  74. .status(OrderInfoStatus.UNPAID)
  75. .userId(userId)
  76. .payMethod(payMethod)
  77. .orderNumber(localTime + num)
  78. .price(setInfo.getAmount())
  79. .name(setInfo.getName())
  80. .build();
  81. return orderInfoRepo.save(order);
  82. }
  83. /*
  84. 完成付款
  85. */
  86. public void completed(Long orderInfoId, String transactionId) {
  87. // 修改订单状态
  88. OrderInfo order = orderInfoRepo.findById(orderInfoId).orElseThrow(new BusinessException("无订单"));
  89. order.setStatus(OrderInfoStatus.PAID);
  90. order.setTransactionId(transactionId);
  91. order.setPaidAt(LocalDateTime.now());
  92. orderInfoRepo.save(order);
  93. // 套餐内商品
  94. List<PackageGoods> setGoodsList = packageGoodsRepo.findAllByPackageId(order.getPackageId());
  95. // 加入套餐商品
  96. Long userId = order.getUserId();
  97. userPackageService.joinUserPackage(userId, setGoodsList);
  98. User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
  99. if (user.getParent() != null) {
  100. // 上级分销
  101. this.distribution(userId, user.getParent(), transactionId);
  102. }
  103. }
  104. /*
  105. 取消订单
  106. */
  107. public OrderInfo cancelOrder(Long orderId) {
  108. OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
  109. if (OrderInfoStatus.PAID.equals(orderInfo.getStatus())) {
  110. throw new BusinessException("订单已支付,无法取消");
  111. } else if (OrderInfoStatus.CANCELLED.equals(orderInfo.getStatus())) {
  112. return orderInfo;
  113. }
  114. orderInfo.setStatus(OrderInfoStatus.CANCELLED);
  115. return orderInfoRepo.save(orderInfo);
  116. }
  117. /*
  118. 分销
  119. 又有团队,员工自己又购买了套餐,企业是否有收益?
  120. 企业拉员工,员工的上级是否改为企业领导人?
  121. 如果上级和企业不是一个人,收益如何算?
  122. */
  123. public void distribution(Long userId, Long parent, String transactionId) {
  124. User parentUser = userRepo.findById(parent).orElseThrow(new BusinessException("无用户"));
  125. // 判断是否可分享
  126. boolean flag = false;
  127. // 是否公司员工
  128. if (ObjectUtil.isNotEmpty(parentUser.getCompanyId())) {
  129. flag = true;
  130. // 公司可得分销
  131. this.companyDis(parentUser.getCompanyId(), transactionId, userId);
  132. }
  133. if (!flag) {
  134. // 是否购买了套餐
  135. // List<UserSet> parentSets = userSetRepo.findAllByUserId(parent);
  136. // if (CollUtil.isNotEmpty(parentSets)) {
  137. if (parentUser.getIsVip()) {
  138. flag = true;
  139. }
  140. }
  141. if (!flag) {
  142. return;
  143. }
  144. BigDecimal personalAmount = sysConfigService.getBigDecimal("PERSONAL_AMOUNT");
  145. parentUser.setAmount(parentUser.getAmount().add(personalAmount));
  146. userRepo.save(parentUser);
  147. // 个人佣金流水
  148. commissionRecordRepo.save(CommissionRecord.builder()
  149. .userId(parent)
  150. .amount(personalAmount)
  151. .payMethod(PayMethod.YUE)
  152. .fromUserId(userId)
  153. .transactionType(TransactionType.PROMOTE)
  154. .transactionId(transactionId)
  155. .build());
  156. }
  157. /*
  158. 公司分销
  159. */
  160. public void companyDis(Long companyId, String transactionId, Long userId) {
  161. Company company = companyRepo.findById(companyId).orElseThrow(new BusinessException("无企业"));
  162. // 用户余额
  163. User user = userRepo.findById(company.getUserId()).orElseThrow(new BusinessException("无用户"));
  164. BigDecimal companyAmount = sysConfigService.getBigDecimal("COMPANY_AMOUNT");
  165. user.setAmount(user.getAmount().add(companyAmount));
  166. userRepo.save(user);
  167. // 公司余额
  168. company.setAmount(company.getAmount().add(companyAmount));
  169. companyRepo.save(company);
  170. // 佣金流水
  171. commissionRecordRepo.save(CommissionRecord.builder()
  172. .userId(company.getUserId())
  173. .amount(companyAmount)
  174. .payMethod(PayMethod.YUE)
  175. .fromUserId(userId)
  176. .transactionType(TransactionType.EMPLOYEES_PROMOTE)
  177. .transactionId(transactionId)
  178. .build());
  179. }
  180. /*
  181. 用户订单
  182. */
  183. public Page<OrderInfoVO> my(Pageable pageable, Long userId, List<OrderInfoStatus> status) {
  184. return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
  185. List<Predicate> and = new ArrayList<>();
  186. and.add(criteriaBuilder.equal(root.get("userId"), userId));
  187. if (CollUtil.isNotEmpty(status)) {
  188. List<Predicate> or = new ArrayList<>();
  189. status.forEach(orderInfoStatus ->
  190. or.add(criteriaBuilder.equal(root.get("status"), orderInfoStatus))
  191. );
  192. and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
  193. }
  194. return criteriaBuilder.and(and.toArray(new Predicate[0]));
  195. }), pageable).map(this::toVo);
  196. // return new PageImpl<>(this.toVO(all), pageable, all.size());
  197. }
  198. public OrderInfoVO toVo(OrderInfo orderInfo) {
  199. OrderInfoVO vo = new OrderInfoVO();
  200. BeanUtil.copyProperties(orderInfo, vo);
  201. vo.setAPackage(packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐")));
  202. List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
  203. vo.setGoods(packageGoods);
  204. return vo;
  205. }
  206. public List<OrderInfoVO> toVO(List<OrderInfo> orderInfos) {
  207. List<OrderInfoVO> orderInfoVOS = new ArrayList<>();
  208. Set<Long> packageIds = orderInfos.stream().map(OrderInfo::getPackageId).collect(Collectors.toSet());
  209. Map<Long, Package> packageMap = packageRepo.findAllById(packageIds)
  210. .stream()
  211. .collect(Collectors.toMap(Package::getId, apackage -> apackage));
  212. // Map<Long, String> goodsMap = goodsInfoRepo.findAll()
  213. // .stream()
  214. // .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
  215. orderInfos.forEach(orderInfo -> {
  216. OrderInfoVO vo = new OrderInfoVO();
  217. BeanUtil.copyProperties(orderInfo, vo);
  218. vo.setAPackage(packageMap.get(orderInfo.getPackageId()));
  219. List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
  220. // List<GoodsVO> goodsVOS = new ArrayList<>();
  221. // packageGoods.forEach(goods -> {
  222. // goodsVOS.add(GoodsVO.builder()
  223. // .name(goodsMap.get(goods.getGoodsInfoId()))
  224. // .num(goods.getNum().longValue())
  225. // .build());
  226. // });
  227. vo.setGoods(packageGoods);
  228. orderInfoVOS.add(vo);
  229. });
  230. return orderInfoVOS;
  231. }
  232. }