Переглянути джерело

核销/可提现余额/余额展示

licailing 4 роки тому
батько
коміт
3e72ee5cc6

+ 5 - 0
src/main/java/com/izouma/jiashanxia/domain/CommissionRecord.java

@@ -42,6 +42,9 @@ public class CommissionRecord extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "支付方式", name = "payMethod")
     private PayMethod payMethod;
 
+    /*
+    订单id
+     */
     @Searchable
     @ApiModelProperty(value = "交易id", name = "transactionId")
     private String transactionId;
@@ -55,5 +58,7 @@ public class CommissionRecord extends BaseEntity implements Serializable {
     @NotFound(action = NotFoundAction.IGNORE)
     private User user;
 
+    private boolean isRefund;
+
     private Long fromUserId;
 }

+ 6 - 0
src/main/java/com/izouma/jiashanxia/domain/OrderInfo.java

@@ -97,6 +97,12 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "备注")
     private String remark;
 
+    @ApiModelProperty(value = "核销人")
+    private Long writeOffUserId;
+
+    @Transient
+    private String packageImg;
+
 //    @ApiModelProperty(value = "区分是哪种订单")
 //    @Enumerated(EnumType.STRING)
 //    private GoodType goodType;

+ 9 - 3
src/main/java/com/izouma/jiashanxia/domain/User.java

@@ -78,11 +78,17 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "可提现收益")
     private BigDecimal amount;
 
-    @ApiModelProperty(value = "暂存")
+//    @ApiModelProperty(value = "直卖收益")
+//    private BigDecimal promote;
+//
+//    @ApiModelProperty(value = "二级收益")
+//    private BigDecimal childPromote;
+
+    @ApiModelProperty(value = "待入账")
     private BigDecimal cacheAmount;
 
-    @ApiModelProperty(value = "已提现收益")
-    private BigDecimal withdraw;
+//    @ApiModelProperty(value = "已提现收益")
+//    private BigDecimal withdraw;
 
     private Long parent;
 

+ 4 - 1
src/main/java/com/izouma/jiashanxia/dto/WriteOffSaveVO.java

@@ -16,6 +16,9 @@ import javax.persistence.*;
 @ApiModel(value = "核销记录保存")
 public class WriteOffSaveVO {
 
+    /*
+    余额类套餐 需要传此参数
+     */
     @ApiModelProperty(value = "被核销人")
     private Long userId;
 
@@ -23,7 +26,7 @@ public class WriteOffSaveVO {
     private Long writeOffUserId;
 
     /*
-    单次使用传订单号
+    单次使用传订单号即可
      */
     @ApiModelProperty(value = "订单号")
     private Long orderInfoId;

+ 2 - 1
src/main/java/com/izouma/jiashanxia/enums/TransactionType.java

@@ -2,7 +2,8 @@ package com.izouma.jiashanxia.enums;
 
 public enum TransactionType {
     WITHDRAW("提现"),
-    PROMOTE("推广新会员"),
+    PROMOTE("直卖收益"),
+    SELF_PURCHASE("自购返利"),
     CHILD_PROMOTE("二级推广新会员"),
 //    EXPERT("团长奖励"),
     MAKER("创客奖励"),

+ 2 - 0
src/main/java/com/izouma/jiashanxia/repo/CommissionRecordRepo.java

@@ -24,6 +24,8 @@ public interface CommissionRecordRepo extends JpaRepository<CommissionRecord, Lo
 
     List<CommissionRecord> findAllByUserIdAndTransactionTypeNot(Long userId, TransactionType type);
 
+    List<CommissionRecord> findAllByUserIdAndIsRefundFalse(Long userId);
+
     @Query("select sum(c.amount) from CommissionRecord c where c.userId = ?1 and c.transactionType = ?2")
     BigDecimal sumByUserId(Long userId, TransactionType type);
 }

+ 5 - 0
src/main/java/com/izouma/jiashanxia/repo/WithdrawRepo.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.repo;
 
 import com.izouma.jiashanxia.domain.Withdraw;
+import com.izouma.jiashanxia.enums.TransactionType;
 import com.izouma.jiashanxia.enums.WithdrawStatus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -8,6 +9,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -22,4 +24,7 @@ public interface WithdrawRepo extends JpaRepository<Withdraw, Long>, JpaSpecific
     List<Withdraw> findAllByStatus(WithdrawStatus status);
 
     List<Withdraw> findAllByStatusAndUserIdAndAuditTimeBetween(WithdrawStatus status, Long userId, LocalDateTime auditTime, LocalDateTime auditTime2);
+
+    @Query("select sum(c.amount) from Withdraw c where c.userId = ?1 and c.status = ?2")
+    BigDecimal sumByUserId(Long userId, WithdrawStatus status);
 }

+ 9 - 19
src/main/java/com/izouma/jiashanxia/service/CommissionRecordService.java

@@ -9,6 +9,7 @@ import com.izouma.jiashanxia.domain.Withdraw;
 import com.izouma.jiashanxia.dto.CommissionRecordDTO;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.AuthorityName;
+import com.izouma.jiashanxia.enums.Member;
 import com.izouma.jiashanxia.enums.PayMethod;
 import com.izouma.jiashanxia.enums.TransactionType;
 import com.izouma.jiashanxia.repo.CommissionRecordRepo;
@@ -143,6 +144,8 @@ public class CommissionRecordService {
 
         records.forEach(record -> {
             User user = userMap.get(record.getUserId());
+            record.setRefund(true);
+            commissionRecordRepo.save(record);
             if (ObjectUtil.isNotEmpty(user)) {
                 user.setCacheAmount(user.getCacheAmount().subtract(record.getAmount()));
                 // 保存佣金流水
@@ -175,25 +178,12 @@ public class CommissionRecordService {
             User user = userMap.get(record.getUserId());
             BigDecimal amount = record.getAmount();
             if (ObjectUtil.isNotEmpty(user)) {
-                user.setCacheAmount(user.getCacheAmount().subtract(amount));
-                user.setAmount(amount.add(user.getAmount()));
-                userRepo.save(user);
-//                switch (record.getTransactionType()) {
-//                    case PROMOTE:
-//                        user.setPromote(user.getPromote().add(amount));
-//                        userRepo.save(user);
-//                        break;
-//                    case GENERAL:
-//                        user.setGeneral(user.getGeneral().add(amount));
-//                        userRepo.save(user);
-//                        break;
-//                    case MAKER:
-//                        user.setMaker(user.getMaker().add(amount));
-//                        userRepo.save(user);
-//                        break;
-//                    default:
-//                        break;
-//                }
+                if (!TransactionType.CHILD_PROMOTE.equals(record.getTransactionType())
+                        || !Member.EXPERT.equals(user.getMember())) {
+                    user.setCacheAmount(user.getCacheAmount().subtract(amount));
+                    user.setAmount(amount.add(user.getAmount()));
+                    userRepo.save(user);
+                }
             }
         });
     }

+ 2 - 0
src/main/java/com/izouma/jiashanxia/service/ConsumptionService.java

@@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
 import java.math.BigDecimal;
 import java.util.Arrays;
 
@@ -82,6 +83,7 @@ public class ConsumptionService {
     /*
     回调
      */
+    @Transactional
     public void handleConsumptionNotify(WxPayOrderNotifyResult notifyResult) {
         JSONObject attach = JSONObject.parseObject(notifyResult.getAttach());
         Long orderId = attach.getLong("orderId");

+ 4 - 0
src/main/java/com/izouma/jiashanxia/service/CouponService.java

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.collection.CollUtil;
 import com.izouma.jiashanxia.domain.Coupon;
 import com.izouma.jiashanxia.domain.OrderInfo;
 import com.izouma.jiashanxia.domain.Package;
@@ -35,6 +36,9 @@ public class CouponService {
     public List<Coupon> chooseByOrder(Long orderInfoId) {
         OrderInfo orderInfo = orderInfoRepo.findById(orderInfoId).orElseThrow(new BusinessException("无订单"));
         Package aPackage = packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐"));
+        if (CollUtil.isEmpty(aPackage.getCouponId())){
+            return null;
+        }
         return couponRepo.findAllByIdInAndPeriodAfter(aPackage.getCouponId(), LocalDateTime.now());
     }
 }

+ 84 - 58
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -6,10 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.Package;
 import com.izouma.jiashanxia.domain.*;
-import com.izouma.jiashanxia.dto.CreateOrder;
-import com.izouma.jiashanxia.dto.OrderInfoDTO;
-import com.izouma.jiashanxia.dto.OrderInfoVO;
-import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.dto.*;
 import com.izouma.jiashanxia.enums.*;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.*;
@@ -35,19 +32,22 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class OrderInfoService {
 
-    private final OrderInfoRepo        orderInfoRepo;
-    private final PackageRepo          packageRepo;
-    private final PackageGoodsRepo     packageGoodsRepo;
-    private final UserRepo             userRepo;
-    private final SysConfigService     sysConfigService;
-    private final CommissionRecordRepo commissionRecordRepo;
-    private final UserPackageService   userPackageService;
-    private final CompanyRepo          companyRepo;
-    private final WithdrawService      withdrawService;
-    private final UserService          userService;
-    private final StockRepo            stockRepo;
-    private final SmsService           smsService;
-    private final ShoppingCartRepo     shoppingCartRepo;
+    private final OrderInfoRepo           orderInfoRepo;
+    private final PackageRepo             packageRepo;
+    private final PackageGoodsRepo        packageGoodsRepo;
+    private final UserRepo                userRepo;
+    private final SysConfigService        sysConfigService;
+    private final CommissionRecordRepo    commissionRecordRepo;
+    private final UserPackageService      userPackageService;
+    private final CompanyRepo             companyRepo;
+    private final WithdrawService         withdrawService;
+    private final UserService             userService;
+    private final StockRepo               stockRepo;
+    private final SmsService              smsService;
+    private final ShoppingCartRepo        shoppingCartRepo;
+    private final CommissionRecordService commissionRecordService;
+    private final CouponRepo              couponRepo;
+    private final UserCouponRepo          userCouponRepo;
 
     public Page<OrderInfo> all(PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
@@ -163,11 +163,6 @@ public class OrderInfoService {
         // 用户
         Long userId = order.getUserId();
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
-        // 设置用户为vip
-//        if (!user.isVip()) {
-//            user.setVip(true);
-//            userRepo.save(user);
-//        }
 
         // 加入套餐商品
         userPackageService.joinUserPackage(userId, setGoodsList, order.getNum(), PackageType.PERSONAL);
@@ -203,7 +198,6 @@ public class OrderInfoService {
 
         Long userId = order.getUserId();
 
-
         if (order.isRepeatedly()) {
             // 套餐内商品
             List<PackageGoods> packageGoodsList = packageGoodsRepo.findAllByPackageId(order.getPackageId());
@@ -320,7 +314,7 @@ public class OrderInfoService {
         BigDecimal amount = orderInfo.getPrice();
 
         // 无限级找创客/108将/团长
-//        this.makerGeneralDistribution(parentUser, amount, orderInfo.getId(), userId, aPackage);
+        this.makerGeneralDistribution(parentUser, amount, orderInfo.getId(), userId, aPackage);
 
         String transactionId = orderInfo.getId().toString();
 
@@ -338,7 +332,6 @@ public class OrderInfoService {
         }
         BigDecimal amount = orderInfo.getPrice();
 
-
         Package aPackage = packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐"));
         //团长直推钱
         BigDecimal headRatio = aPackage.getPersonalRatio0();
@@ -368,7 +361,7 @@ public class OrderInfoService {
                             .payMethod(PayMethod.YUE)
                             .fromUserId(userId)
                             .transactionType(TransactionType.PROMOTE)
-                            .transactionId(orderInfo.getTransactionId())
+                            .transactionId(orderInfo.getId().toString())
                             .build();
                     commissionRecordRepo.save(commissionRecord);
                 }
@@ -444,11 +437,14 @@ public class OrderInfoService {
             if (ObjectUtil.isNull(one)) {
                 return;
             }
+            this.getDistribution(orderInfo, one, 1, balanceAmount, aPackage, TransactionType.PROMOTE);
+        } else {
+            this.getDistribution(orderInfo, one, 1, balanceAmount, aPackage, TransactionType.SELF_PURCHASE);
         }
-        this.getDistribution(orderInfo, one, 1, balanceAmount, aPackage);
+
         two = this.getParent(one);
         if (ObjectUtil.isNotNull(two)) {
-            this.getDistribution(orderInfo, two, 2, balanceAmount, aPackage);
+            this.getDistribution(orderInfo, two, 2, balanceAmount, aPackage, TransactionType.CHILD_PROMOTE);
         }
 
     }
@@ -466,8 +462,8 @@ public class OrderInfoService {
     }
 
     // 用户得到的分销
-    private void getDistribution(OrderInfo orderInfo, User user, int level, BigDecimal balance, Package aPackage) {
-        BigDecimal amount;
+    private void getDistribution(OrderInfo orderInfo, User user, int level, BigDecimal balance, Package aPackage, TransactionType type) {
+        BigDecimal amount = BigDecimal.ZERO;
 
         boolean separateDis = aPackage.isSeparateDistribution();
         // 个人佣金流水
@@ -475,8 +471,8 @@ public class OrderInfoService {
                 .userId(user.getId())
                 .payMethod(PayMethod.YUE)
                 .fromUserId(orderInfo.getUserId())
-                .transactionType(TransactionType.PROMOTE)
-                .transactionId(orderInfo.getTransactionId())
+                .transactionType(type)
+                .transactionId(orderInfo.getId().toString())
                 .build();
 
         switch (user.getMember()) {
@@ -488,13 +484,8 @@ public class OrderInfoService {
                         BigDecimal personalRatio0 = sysConfigService.getBigDecimal("PERSONAL_RATIO_0");
                         amount = balance.multiply(personalRatio0);
                     }
-                    if (BigDecimal.ZERO.compareTo(amount) <= 0) {
-                        return;
-                    }
                     // 加用户余额
-                    user.setAmount(user.getAmount().add(amount));
-                    // 直推类型
-                    commission.setTransactionType(TransactionType.PROMOTE);
+//                    user.setAmount(user.getAmount().add(amount));
                 } else {
                     if (separateDis && ObjectUtil.isNotEmpty(aPackage.getPersonalRatio1())) {
                         amount = balance.multiply(aPackage.getPersonalRatio1());
@@ -502,15 +493,12 @@ public class OrderInfoService {
                         BigDecimal personalRatio1 = sysConfigService.getBigDecimal("PERSONAL_RATIO_1");
                         amount = balance.multiply(personalRatio1);
                     }
-                    if (BigDecimal.ZERO.compareTo(amount) <= 0) {
-                        return;
-                    }
                     // 二级收益暂存
-                    user.setCacheAmount(user.getCacheAmount().add(amount));
-                    // 间推类型
-                    commission.setTransactionType(TransactionType.CHILD_PROMOTE);
+//                    user.setCacheAmount(user.getCacheAmount().add(amount));
+                }
+                if (BigDecimal.ZERO.compareTo(amount) <= 0) {
+                    return;
                 }
-                userRepo.save(user);
                 commission.setAmount(amount);
                 commissionRecordRepo.save(commission);
                 break;
@@ -522,11 +510,6 @@ public class OrderInfoService {
                         BigDecimal personalRatio0 = sysConfigService.getBigDecimal("BIG_EXPERT_RATIO_0");
                         amount = balance.multiply(personalRatio0);
                     }
-                    if (BigDecimal.ZERO.compareTo(amount) <= 0) {
-                        return;
-                    }
-                    // 直推类型
-                    commission.setTransactionType(TransactionType.PROMOTE);
                 } else {
                     if (separateDis && ObjectUtil.isNotEmpty(aPackage.getBigExpertRatio1())) {
                         amount = balance.multiply(aPackage.getBigExpertRatio1());
@@ -534,20 +517,21 @@ public class OrderInfoService {
                         BigDecimal personalRatio1 = sysConfigService.getBigDecimal("BIG_EXPERT_RATIO_1");
                         amount = balance.multiply(personalRatio1);
                     }
-                    if (BigDecimal.ZERO.compareTo(amount) <= 0) {
-                        return;
-                    }
-                    // 间推类型
-                    commission.setTransactionType(TransactionType.CHILD_PROMOTE);
                 }
-                user.setAmount(user.getAmount().add(amount));
-                userRepo.save(user);
+                if (BigDecimal.ZERO.compareTo(amount) <= 0) {
+                    return;
+                }
+//                user.setAmount(user.getAmount().add(amount));
+//                userRepo.save(user);
                 commission.setAmount(amount);
                 commissionRecordRepo.save(commission);
                 break;
             default:
                 break;
         }
+        // 全部放代入帐
+        user.setCacheAmount(user.getCacheAmount().add(amount));
+        userRepo.save(user);
     }
 
     /*
@@ -618,7 +602,6 @@ public class OrderInfoService {
                 .transactionType(TransactionType.EMPLOYEES_PROMOTE)
                 .transactionId(transactionId)
                 .build());
-
     }
 
     /*
@@ -849,4 +832,47 @@ public class OrderInfoService {
         });
         return dto;
     }
+
+    /*
+   核销
+   */
+    public OrderInfo writeOff(Long id, Long writeOffUserId) {
+
+        // 核销订单类的
+        OrderInfo orderInfo = orderInfoRepo.findById(id)
+                .orElseThrow(new BusinessException("无订单"));
+
+        if (orderInfo.getUserId().equals(writeOffUserId)) {
+            throw new BusinessException("不可自己核销自己");
+        }
+
+        if (OrderInfoStatus.USED.equals(orderInfo.getStatus())) {
+            throw new BusinessException("已核销");
+        }
+
+        orderInfo.setStatus(OrderInfoStatus.USED);
+        orderInfo.setWriteOffUserId(writeOffUserId);
+        orderInfoRepo.save(orderInfo);
+
+        // 上级分销变 可提现
+        commissionRecordService.canWithdraw(id);
+
+        // 获得优惠券
+        Package aPackage = packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐"));
+        if (CollUtil.isNotEmpty(aPackage.getCouponId())) {
+            List<Coupon> coupons = couponRepo.findAllByIdInAndPeriodAfter(aPackage.getCouponId(), LocalDateTime
+                    .now());
+            if (CollUtil.isNotEmpty(coupons)) {
+                UserCoupon build = UserCoupon.builder()
+                        .period(coupons.get(0).getPeriod())
+                        .couponId(coupons.get(0).getId())
+                        .isUse(false)
+                        .userId(orderInfo.getUserId())
+                        .build();
+                userCouponRepo.save(build);
+            }
+        }
+        return orderInfo;
+    }
+
 }

+ 1 - 3
src/main/java/com/izouma/jiashanxia/service/OrderRefundService.java

@@ -131,7 +131,6 @@ public class OrderRefundService {
      * @param orderRefundId 申请退款ID
      * @param pass          是否通过
      */
-    @Transactional
     public void audit(Long orderRefundId, boolean pass) {
         // 退款记录
         OrderRefund refund = orderRefundRepo.findById(orderRefundId).orElseThrow(new BusinessException("无记录"));
@@ -147,9 +146,7 @@ public class OrderRefundService {
         if (pass) {
             String refundId = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
             refund.setStatus(RefundStatus.REFUNDING);
-//            if (StringUtils.isEmpty(refund.getRefundId())) {
             refund.setRefundId(refundId);
-//            }
             orderRefundRepo.save(refund);
             // 退款
             payRefund(orderInfo, refundId);
@@ -184,6 +181,7 @@ public class OrderRefundService {
         }
     }
 
+    @Transactional
     public void handleRefundNotify(WxPayRefundNotifyResult notifyResult) {
         OrderInfo orderInfo = orderInfoRepo.findByTransactionId(notifyResult.getReqInfo().getTransactionId());
 

+ 50 - 17
src/main/java/com/izouma/jiashanxia/service/UserService.java

@@ -11,6 +11,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.config.Constants;
 import com.izouma.jiashanxia.domain.Attractions;
+import com.izouma.jiashanxia.domain.CommissionRecord;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.dto.UserDTO;
 import com.izouma.jiashanxia.enums.Member;
@@ -19,11 +20,12 @@ import com.izouma.jiashanxia.dto.PromotionDTO;
 import com.izouma.jiashanxia.dto.UserRegister;
 import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.enums.TransactionType;
+import com.izouma.jiashanxia.enums.WithdrawStatus;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.AttractionsRepo;
 import com.izouma.jiashanxia.repo.CommissionRecordRepo;
-import com.izouma.jiashanxia.repo.OrderInfoRepo;
 import com.izouma.jiashanxia.repo.UserRepo;
+import com.izouma.jiashanxia.repo.WithdrawRepo;
 import com.izouma.jiashanxia.security.Authority;
 import com.izouma.jiashanxia.security.JwtTokenUtil;
 import com.izouma.jiashanxia.security.JwtUserFactory;
@@ -72,10 +74,10 @@ public class UserService {
     private final StorageService       storageService;
     private final JwtTokenUtil         jwtTokenUtil;
     private final CaptchaService       captchaService;
-    private final OrderInfoRepo        orderInfoRepo;
     private final CommissionRecordRepo commissionRecordRepo;
     private final AttractionsRepo      attractionsRepo;
     private final SysConfigService     sysConfigService;
+    private final WithdrawRepo         withdrawRepo;
 
     public Page<User> all(PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
@@ -174,7 +176,7 @@ public class UserService {
                     .teamFounder(false)
                     .sessionKey(sessionKey)
                     .member(Member.NORMAL)
-                    .withdraw(BigDecimal.ZERO)
+//                    .withdraw(BigDecimal.ZERO)
                     .cacheAmount(BigDecimal.ZERO)
                     .build();
             if (ObjectUtil.isNotEmpty(parent) && expert) {
@@ -251,7 +253,7 @@ public class UserService {
                     .teamFounder(false)
                     .wxAuthorized(true)
                     .member(Member.NORMAL)
-                    .withdraw(BigDecimal.ZERO)
+//                    .withdraw(BigDecimal.ZERO)
                     .cacheAmount(BigDecimal.ZERO)
                     .build();
             user = userRepo.save(user);
@@ -410,18 +412,49 @@ public class UserService {
 
     public Map<String, Object> overview(Long userId) {
         Map<String, Object> map = new HashMap<>();
-        map.put("orderCount", orderInfoRepo.countByUserId(userId));
-        BigDecimal empPromote = commissionRecordRepo.sumByUserId(userId, TransactionType.EMPLOYEES_PROMOTE);
-        BigDecimal promote = commissionRecordRepo.sumByUserId(userId, TransactionType.PROMOTE);
-        if (ObjectUtil.isNull(empPromote)) {
-            empPromote = BigDecimal.ZERO;
-        }
-        if (ObjectUtil.isNull(promote)) {
-            promote = BigDecimal.ZERO;
-        }
-        map.put("commission", empPromote.add(promote));
-        map.put("withdraw", commissionRecordRepo.sumByUserId(userId, TransactionType.WITHDRAW));
-        map.put("promote", userRepo.countByParentAndDelFalse(userId));
+        List<CommissionRecord> records = commissionRecordRepo.findAllByUserIdAndIsRefundFalse(userId);
+        Map<TransactionType, List<CommissionRecord>> typeListMap = records.stream()
+                .collect(Collectors.groupingBy(CommissionRecord::getTransactionType));
+        // 直卖
+        List<CommissionRecord> promoteRecord = typeListMap.get(TransactionType.PROMOTE);
+        BigDecimal promote = BigDecimal.ZERO;
+        if (CollUtil.isNotEmpty(promoteRecord)) {
+            promote = promoteRecord
+                    .stream()
+                    .map(CommissionRecord::getAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+        }
+
+        // 团队
+        List<CommissionRecord> childPromoteRecord = typeListMap.get(TransactionType.CHILD_PROMOTE);
+        BigDecimal childPromote = BigDecimal.ZERO;
+        if (CollUtil.isNotEmpty(childPromoteRecord)) {
+            childPromote = childPromoteRecord
+                    .stream()
+                    .map(CommissionRecord::getAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+        }
+        // 已提现
+        List<CommissionRecord> withdrawRecord = typeListMap.get(TransactionType.WITHDRAW);
+        BigDecimal withdraw = BigDecimal.ZERO;
+        if (CollUtil.isNotEmpty(withdrawRecord)) {
+            withdraw = withdrawRecord
+                    .stream()
+                    .map(CommissionRecord::getAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+        }
+        // 提现中
+        BigDecimal withdrawPending = withdrawRepo.sumByUserId(userId, WithdrawStatus.PENDING);
+        if (ObjectUtil.isNull(withdrawPending)) {
+            withdrawPending = BigDecimal.ZERO;
+        }
+        // 总收益
+        BigDecimal all = records.stream().map(CommissionRecord::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        map.put("promote", promote);
+        map.put("childPromote", childPromote);
+        map.put("withdraw", withdraw);
+        map.put("withdrawPending", withdrawPending);
+        map.put("all", all);
         return map;
     }
 
@@ -530,7 +563,7 @@ public class UserService {
             return;
         }
         // 已到最高级
-        if (Member.PARTNER.equals(member)){
+        if (Member.PARTNER.equals(member)) {
             return;
         }
 

+ 1 - 1
src/main/java/com/izouma/jiashanxia/service/WithdrawService.java

@@ -130,7 +130,7 @@ public class WithdrawService {
                     .transactionId("W" + withdrawId)
                     .build());
             withdrawRepo.save(withdraw);
-            user.setWithdraw(withdraw.getAmount().add(user.getWithdraw()));
+//            user.setWithdraw(withdraw.getAmount().add(user.getWithdraw()));
             userRepo.save(user);
             return;
         }

+ 7 - 2
src/main/java/com/izouma/jiashanxia/web/CouponController.java

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.web;
 
+import cn.hutool.core.collection.CollUtil;
 import com.izouma.jiashanxia.domain.Attractions;
 import com.izouma.jiashanxia.domain.Coupon;
 import com.izouma.jiashanxia.repo.AttractionsRepo;
@@ -75,8 +76,12 @@ public class CouponController extends BaseController {
      * @return 可选择的优惠券列表
      */
     @PostMapping("/chooseByOrder")
-    public List<Coupon> chooseByOrder(@RequestParam Long orderInfoId) {
-        return couponService.chooseByOrder(orderInfoId);
+    public Coupon chooseByOrder(@RequestParam Long orderInfoId) {
+        List<Coupon> coupons = couponService.chooseByOrder(orderInfoId);
+        if (CollUtil.isEmpty(coupons)){
+            return null;
+        }
+        return coupons.get(0);
     }
 }
 

+ 15 - 4
src/main/java/com/izouma/jiashanxia/web/OrderInfoController.java

@@ -6,7 +6,7 @@ import com.izouma.jiashanxia.dto.CreateOrder;
 import com.izouma.jiashanxia.dto.OrderInfoDTO;
 import com.izouma.jiashanxia.dto.OrderInfoVO;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
-import com.izouma.jiashanxia.enums.PayMethod;
+import com.izouma.jiashanxia.repo.PackageRepo;
 import com.izouma.jiashanxia.service.OrderInfoService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -29,8 +29,9 @@ import java.util.List;
 @RequestMapping("/orderInfo")
 @AllArgsConstructor
 public class OrderInfoController extends BaseController {
-    private OrderInfoService orderInfoService;
-    private OrderInfoRepo    orderInfoRepo;
+    private final OrderInfoService orderInfoService;
+    private final OrderInfoRepo    orderInfoRepo;
+    private final PackageRepo      packageRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -58,7 +59,10 @@ public class OrderInfoController extends BaseController {
 
     @GetMapping("/get/{id}")
     public OrderInfo get(@PathVariable Long id) {
-        return orderInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        OrderInfo orderInfo = orderInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        packageRepo.findById(orderInfo.getPackageId())
+                .ifPresent(aPackage -> orderInfo.setPackageImg(aPackage.getImg().get(0)));
+        return orderInfo;
     }
 
     @GetMapping("/getDTO/{id}")
@@ -119,5 +123,12 @@ public class OrderInfoController extends BaseController {
     public void userDel(@PathVariable Long id) {
         orderInfoRepo.userDelete(id);
     }
+
+    @PreAuthorize("hasAnyRole('ADMIN','WRITER')")
+    @PostMapping("/writeOff")
+    @ApiOperation("核销")
+    public OrderInfo writeOff(@RequestParam Long id, @RequestParam Long WriteOffUserId) {
+        return orderInfoService.writeOff(id, WriteOffUserId);
+    }
 }
 

+ 1 - 1
src/main/vue/src/components/PackageEdit.vue

@@ -252,7 +252,7 @@
                 </div>
             </el-form-item>
             <el-form-item label="核销赠送优惠券" prop="couponId">
-                <el-select multiple v-model="formData.couponId" class="select-width">
+                <el-select multiple v-model="formData.couponId" class="select-width" :multiple-limit="1">
                     <el-option v-for="item in coupons" :key="item.id" :label="item.name" :value="item.id">
                         <span style="float: left">{{ item.name }}</span>
                         <span style="float: right; color: #8492a6; font-size: 13px">{{ item.attractionsName }}</span>

+ 2 - 2
src/test/java/com/izouma/jiashanxia/service/UserPackageFlowServiceTest.java

@@ -31,9 +31,9 @@ public class UserPackageFlowServiceTest {
     public void test() {
 //        "userPackageId":577,
         userPackageFlowService.writeOff1(WriteOffSaveVO.builder()
-                .userId(125L)
+//                .userId(125L)
                 .writeOffUserId(1L)
-                .orderInfoId(929L)
+                .orderInfoId(1640L)
 //                .content("[{\"goodsInfoId\":27,\"num\":1}]")
 //                .type(PackageType.TEAM)
                 .build());

+ 5 - 0
src/test/java/com/izouma/jiashanxia/service/UserServiceTest.java

@@ -85,4 +85,9 @@ public class UserServiceTest {
         User user = userRepo.findById(1132L).orElseThrow(new BusinessException("无用户"));
         System.out.println(userService.getParent(916L, user));
     }
+
+    @Test
+    public void overview(){
+        System.out.println(userService.overview(916L));
+    }
 }