| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- package com.izouma.jiashanxia.service;
- import cn.hutool.core.bean.BeanUtil;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.util.ObjectUtil;
- import cn.hutool.core.util.StrUtil;
- import com.izouma.jiashanxia.domain.*;
- import com.izouma.jiashanxia.domain.Package;
- import com.izouma.jiashanxia.dto.GoodsVO;
- import com.izouma.jiashanxia.dto.OrderInfoVO;
- import com.izouma.jiashanxia.dto.PageQuery;
- import com.izouma.jiashanxia.enums.OrderInfoStatus;
- import com.izouma.jiashanxia.enums.PayMethod;
- import com.izouma.jiashanxia.enums.TransactionType;
- import com.izouma.jiashanxia.exception.BusinessException;
- import com.izouma.jiashanxia.repo.*;
- import com.izouma.jiashanxia.utils.JpaUtils;
- import lombok.AllArgsConstructor;
- import org.springframework.data.domain.Page;
- import org.springframework.data.domain.PageImpl;
- import org.springframework.data.domain.Pageable;
- import org.springframework.stereotype.Service;
- import javax.persistence.criteria.Predicate;
- import java.math.BigDecimal;
- import java.time.LocalDateTime;
- import java.time.format.DateTimeFormatter;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.stream.Collectors;
- @Service
- @AllArgsConstructor
- public class OrderInfoService {
- private OrderInfoRepo orderInfoRepo;
- private PackageRepo packageRepo;
- private PackageGoodsRepo packageGoodsRepo;
- private UserRepo userRepo;
- private SysConfigService sysConfigService;
- private CommissionRecordRepo commissionRecordRepo;
- private UserPackageService userPackageService;
- private CompanyRepo companyRepo;
- private WithdrawService withdrawService;
- private GoodsInfoRepo goodsInfoRepo;
- public Page<OrderInfo> all(PageQuery pageQuery) {
- return orderInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrderInfo.class), JpaUtils.toPageRequest(pageQuery));
- }
- /*
- 后台列表
- */
- public Page<OrderInfo> backAll(PageQuery pageQuery) {
- return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
- List<Predicate> and = JpaUtils.toPredicates(pageQuery, OrderInfo.class, root, criteriaQuery, criteriaBuilder);
- if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
- /* List<Predicate> or = new ArrayList<>();
- or.add(and.get(and.size() - 1));
- and.remove(and.get(and.size() - 1));
- or.add(criteriaBuilder.like(root.join("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
- and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));*/
- withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
- }
- return criteriaBuilder.and(and.toArray(new Predicate[0]));
- }), JpaUtils.toPageRequest(pageQuery));
- }
- /*
- 下订单
- */
- public OrderInfo createOrder(Long userId, Long packageId, PayMethod payMethod) {
- Package setInfo = packageRepo.findById(packageId).orElseThrow(new BusinessException("无套餐"));
- DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
- String localTime = df.format(LocalDateTime.now());
- String num = String.format("%05d", orderInfoRepo.orderNum() + 1);
- OrderInfo order = OrderInfo.builder()
- .packageId(packageId)
- .status(OrderInfoStatus.UNPAID)
- .userId(userId)
- .payMethod(payMethod)
- .orderNumber(localTime + num)
- .price(setInfo.getAmount())
- .name(setInfo.getName())
- .build();
- return orderInfoRepo.save(order);
- }
- /*
- 完成付款
- */
- public void completed(Long orderInfoId, String transactionId) {
- // 修改订单状态
- OrderInfo order = orderInfoRepo.findById(orderInfoId).orElseThrow(new BusinessException("无订单"));
- order.setStatus(OrderInfoStatus.PAID);
- order.setTransactionId(transactionId);
- order.setPaidAt(LocalDateTime.now());
- orderInfoRepo.save(order);
- // 套餐内商品
- List<PackageGoods> setGoodsList = packageGoodsRepo.findAllByPackageId(order.getPackageId());
- // 加入套餐商品
- Long userId = order.getUserId();
- userPackageService.joinUserPackage(userId, setGoodsList);
- User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
- if (user.getParent() != null) {
- // 上级分销
- this.distribution(userId, user.getParent(), transactionId);
- }
- }
- /*
- 取消订单
- */
- public OrderInfo cancelOrder(Long orderId) {
- OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
- if (OrderInfoStatus.PAID.equals(orderInfo.getStatus())) {
- throw new BusinessException("订单已支付,无法取消");
- } else if (OrderInfoStatus.CANCELLED.equals(orderInfo.getStatus())) {
- return orderInfo;
- }
- orderInfo.setStatus(OrderInfoStatus.CANCELLED);
- return orderInfoRepo.save(orderInfo);
- }
- /*
- 分销
- 又有团队,员工自己又购买了套餐,企业是否有收益?
- 企业拉员工,员工的上级是否改为企业领导人?
- 如果上级和企业不是一个人,收益如何算?
- */
- public void distribution(Long userId, Long parent, String transactionId) {
- User parentUser = userRepo.findById(parent).orElseThrow(new BusinessException("无用户"));
- // 判断是否可分享
- boolean flag = false;
- // 是否公司员工
- if (ObjectUtil.isNotEmpty(parentUser.getCompanyId())) {
- flag = true;
- // 公司可得分销
- this.companyDis(parentUser.getCompanyId(), transactionId, userId);
- }
- if (!flag) {
- // 是否购买了套餐
- // List<UserSet> parentSets = userSetRepo.findAllByUserId(parent);
- // if (CollUtil.isNotEmpty(parentSets)) {
- if (parentUser.getIsVip()) {
- flag = true;
- }
- }
- if (!flag) {
- return;
- }
- BigDecimal personalAmount = sysConfigService.getBigDecimal("PERSONAL_AMOUNT");
- parentUser.setAmount(parentUser.getAmount().add(personalAmount));
- userRepo.save(parentUser);
- // 个人佣金流水
- commissionRecordRepo.save(CommissionRecord.builder()
- .userId(parent)
- .amount(personalAmount)
- .payMethod(PayMethod.YUE)
- .fromUserId(userId)
- .transactionType(TransactionType.PROMOTE)
- .transactionId(transactionId)
- .build());
- }
- /*
- 公司分销
- */
- public void companyDis(Long companyId, String transactionId, Long userId) {
- Company company = companyRepo.findById(companyId).orElseThrow(new BusinessException("无企业"));
- // 用户余额
- User user = userRepo.findById(company.getUserId()).orElseThrow(new BusinessException("无用户"));
- BigDecimal companyAmount = sysConfigService.getBigDecimal("COMPANY_AMOUNT");
- user.setAmount(user.getAmount().add(companyAmount));
- userRepo.save(user);
- // 公司余额
- company.setAmount(company.getAmount().add(companyAmount));
- companyRepo.save(company);
- // 佣金流水
- commissionRecordRepo.save(CommissionRecord.builder()
- .userId(company.getUserId())
- .amount(companyAmount)
- .payMethod(PayMethod.YUE)
- .fromUserId(userId)
- .transactionType(TransactionType.EMPLOYEES_PROMOTE)
- .transactionId(transactionId)
- .build());
- }
- /*
- 用户订单
- */
- public Page<OrderInfoVO> my(Pageable pageable, Long userId, List<OrderInfoStatus> status) {
- return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
- List<Predicate> and = new ArrayList<>();
- and.add(criteriaBuilder.equal(root.get("userId"), userId));
- if (CollUtil.isNotEmpty(status)) {
- List<Predicate> or = new ArrayList<>();
- status.forEach(orderInfoStatus ->
- or.add(criteriaBuilder.equal(root.get("status"), orderInfoStatus))
- );
- and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
- }
- return criteriaBuilder.and(and.toArray(new Predicate[0]));
- }), pageable).map(this::toVo);
- // return new PageImpl<>(this.toVO(all), pageable, all.size());
- }
- public OrderInfoVO toVo(OrderInfo orderInfo) {
- OrderInfoVO vo = new OrderInfoVO();
- BeanUtil.copyProperties(orderInfo, vo);
- vo.setAPackage(packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐")));
- List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
- vo.setGoods(packageGoods);
- return vo;
- }
- public List<OrderInfoVO> toVO(List<OrderInfo> orderInfos) {
- List<OrderInfoVO> orderInfoVOS = new ArrayList<>();
- Set<Long> packageIds = orderInfos.stream().map(OrderInfo::getPackageId).collect(Collectors.toSet());
- Map<Long, Package> packageMap = packageRepo.findAllById(packageIds)
- .stream()
- .collect(Collectors.toMap(Package::getId, apackage -> apackage));
- // Map<Long, String> goodsMap = goodsInfoRepo.findAll()
- // .stream()
- // .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
- orderInfos.forEach(orderInfo -> {
- OrderInfoVO vo = new OrderInfoVO();
- BeanUtil.copyProperties(orderInfo, vo);
- vo.setAPackage(packageMap.get(orderInfo.getPackageId()));
- List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
- // List<GoodsVO> goodsVOS = new ArrayList<>();
- // packageGoods.forEach(goods -> {
- // goodsVOS.add(GoodsVO.builder()
- // .name(goodsMap.get(goods.getGoodsInfoId()))
- // .num(goods.getNum().longValue())
- // .build());
- // });
- vo.setGoods(packageGoods);
- orderInfoVOS.add(vo);
- });
- return orderInfoVOS;
- }
- }
|