Browse Source

训练营合并app接口完成

mac 2 years ago
parent
commit
055611e4a8
21 changed files with 418 additions and 30 deletions
  1. 2 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java
  2. 55 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/dto/kxsapp/ticket/LeaderByTicketDTO.java
  3. 10 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/feign/RemoteKxsProductService.java
  4. 1 1
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/feign/config/KxsProductFeignClientConfiguration.java
  5. 4 5
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsTicket.java
  6. 12 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/TicketController.java
  7. 9 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsTicketService.java
  8. 23 1
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsTicketServiceImpl.java
  9. 5 2
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsCampServiceImpl.java
  10. 29 0
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/leader/LeaderApplyDTO.java
  11. 23 0
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/leader/LeaderApplyInfoDTO.java
  12. 2 4
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/userAccount/WithdrawDepositDTO.java
  13. 27 9
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/KxsLeaderController.java
  14. 8 3
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/UserAccountController.java
  15. 1 1
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/mapper/KxsUserWithdrawalMapper.java
  16. 9 0
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsLeaderByOrderService.java
  17. 11 2
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserWithdrawalService.java
  18. 2 0
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsLeaderAccountLogServiceImpl.java
  19. 106 0
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsLeaderByOrderServiceImpl.java
  20. 77 2
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserWithdrawalServiceImpl.java
  21. 2 0
      kxs-user/kxs-user-biz/src/main/resources/mapper/KxsUserWithdrawalMapper.xml

+ 2 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java

@@ -91,7 +91,9 @@ public interface CommonConstants {
 	/**
 	 * KXS提现订单号前缀
 	 */
+	String KXS_LEADER_BY_PREFIX = "MZ";
 	String KXS_WITHDRAWAL_PREFIX = "BC";
+	String KXS_LEADER_WITHDRAWAL_PREFIX = "MZTX";
 
 	/**
 	 * KXS提现订单号前缀

+ 55 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/dto/kxsapp/ticket/LeaderByTicketDTO.java

@@ -0,0 +1,55 @@
+package com.kxs.product.api.dto.kxsapp.ticket;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 盟主兑换券兑换请求类
+ *
+ * @author 系统
+ * @since 2023-12-20 10:09:35
+ */
+@Data
+public class LeaderByTicketDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @Schema(description = "用户ID")
+    private Integer userId;
+
+    /**
+     * 数量
+     */
+    private Integer num;
+
+
+    /**
+     * 券码类型 0电签 1大pos
+     */
+    @Schema(description = "券码类型 0电签 1大pos")
+    private Integer ticketType;
+
+    /**
+     * 购买订单ID
+     */
+    @Schema(description = "购买订单ID")
+    private Integer orderId;
+
+
+    /**
+     * 盟主用户ID
+     */
+    @Schema(description = "盟主用户ID")
+    private Integer leaderId;
+
+
+}
+

+ 10 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/feign/RemoteKxsProductService.java

@@ -4,6 +4,7 @@ package com.kxs.product.api.feign;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.util.R;
 import com.kxs.product.api.dto.kxsapp.GetActivityMachineByIdAndTimeDTO;
+import com.kxs.product.api.dto.kxsapp.ticket.LeaderByTicketDTO;
 import com.kxs.product.api.model.*;
 import com.kxs.product.api.vo.kxsapp.shop.ShopOrderDetailVO;
 import com.kxs.product.api.vo.kxsapp.shop.ShopOrderGoodsUserVO;
@@ -203,4 +204,13 @@ public interface RemoteKxsProductService {
 	 */
 	@GetExchange("/machine/loadByPrePosBind30minute")
 	R<List<String>> loadByPrePosBind30minute(@RequestHeader(SecurityConstants.FROM) String fromIn);
+
+	/**
+	 * 盟主兑换券
+	 *
+	 * @param req    要求
+	 * @param fromIn 从中
+	 */
+	@PostExchange("/ticket/leaderByTicket")
+    R leaderByTicket(@RequestBody LeaderByTicketDTO req, @RequestHeader(SecurityConstants.FROM) String fromIn);
 }

+ 1 - 1
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/feign/config/KxsProductFeignClientConfiguration.java

@@ -77,7 +77,7 @@ public class KxsProductFeignClientConfiguration {
 	 */
 	@Bean
 	RemoteKxsProductService remoteKxsProductService(@Qualifier("kxsProductFeignClient") WebClient client) {
-		HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
+		HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).blockTimeout(ServiceNameConstants.REQ_TIMEOUT).build();
 		return factory.createClient(RemoteKxsProductService.class);
 	}
 

+ 4 - 5
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsTicket.java

@@ -1,10 +1,5 @@
 package com.kxs.product.api.model;
 
-import java.io.Serial;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -12,6 +7,10 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 /**
  * 客小爽券码表(KxsTicket)表实体类
  *

+ 12 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/TicketController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.common.core.util.R;
 import com.kxs.common.security.annotation.Inner;
+import com.kxs.product.api.dto.kxsapp.ticket.LeaderByTicketDTO;
 import com.kxs.product.api.dto.kxsapp.ticket.TicketTransferDTO;
 import com.kxs.product.api.dto.kxsapp.ticket.TicketTransferQuery;
 import com.kxs.product.api.model.KxsTicket;
@@ -135,6 +136,17 @@ public class TicketController {
         return R.ok(kxsTicketService.updateById(ticket));
     }
 
+    /**
+     * 盟主兑换券
+     *
+     * @param param 参数
+     */
+    @Inner
+    @PostMapping("/leaderByTicket")
+    public R leaderByTicket(@RequestBody LeaderByTicketDTO param) {
+
+        return R.ok(kxsTicketService.leaderByTicket(param));
+    }
 
 
 

+ 9 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsTicketService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.kxs.common.core.util.R;
 import com.kxs.product.api.dto.admin.ticket.SysTicketPageDTO;
+import com.kxs.product.api.dto.kxsapp.ticket.LeaderByTicketDTO;
 import com.kxs.product.api.model.KxsTicket;
 import com.kxs.product.api.vo.kxsapp.ticket.TicketListVO;
 
@@ -57,5 +58,13 @@ public interface KxsTicketService extends IService<KxsTicket> {
      * @return
      */
     List<KxsTicket> ticketPage(Page<KxsTicket> page, SysTicketPageDTO param);
+
+    /**
+     * 盟主兑换券
+     *
+     * @param param 参数
+     */
+    R leaderByTicket(LeaderByTicketDTO param);
+
 }
 

+ 23 - 1
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsTicketServiceImpl.java

@@ -12,6 +12,7 @@ import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.product.api.dto.admin.ticket.SysTicketPageDTO;
+import com.kxs.product.api.dto.kxsapp.ticket.LeaderByTicketDTO;
 import com.kxs.product.api.model.KxsBrand;
 import com.kxs.product.api.model.KxsMachine;
 import com.kxs.product.api.model.KxsShopOrder;
@@ -101,7 +102,7 @@ public class KxsTicketServiceImpl extends ServiceImpl<KxsTicketMapper, KxsTicket
 
     @Override
     public Boolean userBuyTicket(Long userId, Integer ticketType, Integer orderId, Integer number) {
-        //电签兑换券流程
+        //兑换券流程
         List<KxsTicket> kxsTickets = baseMapper.selectList( Wrappers.<KxsTicket>query().lambda()
                 .eq(KxsTicket::getUserId, 0)
                 .eq(KxsTicket::getTicketType, ticketType)
@@ -121,6 +122,26 @@ public class KxsTicketServiceImpl extends ServiceImpl<KxsTicketMapper, KxsTicket
         return Boolean.TRUE;
     }
 
+    @Override
+    public R leaderByTicket(LeaderByTicketDTO param) {
+        List<KxsTicket> kxsTickets = baseMapper.selectList( Wrappers.<KxsTicket>query().lambda()
+                .eq(KxsTicket::getUserId, 0)
+                .eq(KxsTicket::getTicketType, param.getTicketType())
+                .eq(KxsTicket::getStatus, TicketTypeEnum.CODE_UNUSED.getType()).last("limit " + param.getNum()));
+        if (kxsTickets == null || kxsTickets.size() != 3){
+            throw new GlobalCustomerException("劵码库存不足:" + (param.getTicketType() == 0 ? "电签": "大机"));
+        }
+        for (KxsTicket kxsTicket : kxsTickets) {
+            kxsTicket.setUserId(param.getUserId());
+            kxsTicket.setTicketAllotPath(CommonConstants.FAIL + "," + param.getUserId() + "," );
+            kxsTicket.setOrderId(param.getOrderId());
+            kxsTicket.setLeaderId(param.getLeaderId());
+            baseMapper.updateById(kxsTicket);
+        }
+        return R.ok();
+    }
+
+
     @Override
     public List<KxsTicket> ticketPage(Page<KxsTicket> page, SysTicketPageDTO param) {
         String userCode = param.getUserCode();
@@ -163,6 +184,7 @@ public class KxsTicketServiceImpl extends ServiceImpl<KxsTicketMapper, KxsTicket
         return list;
     }
 
+
     private List<Integer> getUserIds(String userCode,List<Integer> searchUserIds){
         UserSearchDTO userSearchDTO = new UserSearchDTO();
         userSearchDTO.setUserCode(userCode);

+ 5 - 2
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsCampServiceImpl.java

@@ -280,7 +280,6 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
                     .eq(KxsCampUser::getUserId, campUserId));
             kxsCampUser.setTeamOrderPool(NumberUtil.add(kxsCampUser.getTeamOrderPool(), amount));
             kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + number.intValue());
-            kxsCampUserService.updateById(kxsCampUser);
 
             KxsCampBonusLog kxsCampBonusLog = new KxsCampBonusLog();
             kxsCampBonusLog.setCampId(kxsCamp.getId());
@@ -310,11 +309,15 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
                     throw new GlobalCustomerException("用户"+user.getId()+"盟主兑换券已经兑换过5组,无法继续加入统计");
                 }
                 long subCount = 5 - bonusLog.getSourceNum();
-                kxsCampBonusLog.setSourceNum(param.getBuyCount() > subCount ? (int) subCount : param.getBuyCount());
+                int addCount = param.getBuyCount() > subCount ? (int) subCount : param.getBuyCount();
+                kxsCampBonusLog.setSourceNum(addCount);
+                kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + addCount);
                 kxsCampBonusLog.setSourceType(CampSourceTypeEnum.S_MZQ.getType());
                 kxsCampBonusLog.setRemark("盟主兑换-" + param.getOrderNo());
             }
             campBonusLogService.save(kxsCampBonusLog);
+            kxsCampUserService.updateById(kxsCampUser);
+
             log.info("用户/上级{}参加训练营{},订单ID{}, 奖金池{},订单数{}", param.getUserId(), kxsCamp.getId(), param.getId(), kxsCamp.getBonusPool(), kxsCamp.getOrderNum());
         }
 

+ 29 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/leader/LeaderApplyDTO.java

@@ -0,0 +1,29 @@
+package com.kxs.user.api.dto.kxsapp.leader;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 盟主 兑换机具券 DTO
+ *
+ * @author 没秃顶的码农
+ * @date 2024-01-11
+ */
+@Data
+public class LeaderApplyDTO {
+
+    /**
+     * 申请数量
+     */
+    @NotNull(message = "申请数量不能为空")
+    private Integer byNum;
+
+    /**
+     * 申请json数据[{'type':1,'num':'10'}]
+     */
+    private List<LeaderApplyInfoDTO> byData;
+
+}
+

+ 23 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/leader/LeaderApplyInfoDTO.java

@@ -0,0 +1,23 @@
+package com.kxs.user.api.dto.kxsapp.leader;
+
+import lombok.Data;
+
+/**
+ * 申请补货 详细 DTO
+ *
+ * @author 没秃顶的码农
+ * @date 2024-01-12
+ */
+@Data
+public class LeaderApplyInfoDTO {
+
+    /**
+     * 1电签 2大机
+     */
+    private Integer type;
+
+    /**
+     * 数量
+     */
+    private Integer num;
+}

+ 2 - 4
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/userAccount/WithdrawDepositDTO.java

@@ -1,6 +1,7 @@
 package com.kxs.user.api.dto.kxsapp.userAccount;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
@@ -20,7 +21,7 @@ public class WithdrawDepositDTO {
      * 申请金额
      */
     @Schema(description = "申请金额")
-    @NotBlank(message = "申请金额不能为空")
+    @DecimalMin(value = "100", message = "提现最低金额100元")
     private BigDecimal applyAmount;
 
 
@@ -31,7 +32,4 @@ public class WithdrawDepositDTO {
     @NotBlank(message = "支付密码不能为空")
     private String payPwd;
 
-
-
-
 }

+ 27 - 9
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/KxsLeaderController.java

@@ -3,19 +3,14 @@ package com.kxs.user.biz.controller.kxsapp;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.common.core.util.R;
 import com.kxs.system.api.dto.kxsapp.leader.LeaderAccountLogDTO;
-import com.kxs.user.api.dto.kxsapp.user.UserMyUserListDTO;
+import com.kxs.user.api.dto.kxsapp.leader.LeaderApplyDTO;
+import com.kxs.user.api.dto.kxsapp.userAccount.WithdrawDepositDTO;
 import com.kxs.user.api.model.KxsLeaderAccountLog;
-import com.kxs.user.api.model.KxsUser;
-import com.kxs.user.biz.service.KxsLeaderAccountLogService;
-import com.kxs.user.biz.service.KxsLeaderAmountLogService;
-import com.kxs.user.biz.service.KxsLeaderService;
-import com.kxs.user.biz.service.KxsUserAmountService;
+import com.kxs.user.biz.service.*;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springdoc.core.annotations.ParameterObject;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * KXS 盟主控制器
@@ -31,6 +26,8 @@ public class KxsLeaderController {
     private final KxsLeaderService kxsLeaderService;
     private final KxsUserAmountService kxsUserAmountService;
     private final KxsLeaderAccountLogService kxsLeaderAccountLogService;
+    private final KxsUserWithdrawalService kxsUserWithdrawalService;
+    private final KxsLeaderByOrderService kxsLeaderByOrderService;
 
     /**
      * 盟主信息
@@ -54,4 +51,25 @@ public class KxsLeaderController {
         return R.ok(kxsLeaderAccountLogService.accountPage(page, param));
     }
 
+    /**
+     * 兑换机具券
+     */
+    @PostMapping("/byCode")
+    public R byCode(@RequestBody LeaderApplyDTO param) {
+
+        return kxsLeaderByOrderService.byTicketCode(param);
+    }
+
+    /**
+     * 盟主中心-发起提现
+     *
+     * @param param 实体对象
+     * @return 盟主中心-发起提现
+     */
+    @PostMapping("/leaderCash")
+    public R leaderCash(@Valid @RequestBody WithdrawDepositDTO param) {
+
+        return kxsUserWithdrawalService.leaderCash(param);
+    }
+
 }

+ 8 - 3
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/UserAccountController.java

@@ -11,6 +11,7 @@ import com.kxs.user.api.dto.kxsapp.userAccount.UserAmountVariationListDTO;
 import com.kxs.user.api.dto.kxsapp.userAccount.WithdrawDepositDTO;
 import com.kxs.user.api.model.KxsUserAdvance;
 import com.kxs.user.api.model.KxsUserAmountLog;
+import com.kxs.user.api.model.KxsUserWithdrawal;
 import com.kxs.user.api.vo.kxsapp.userAccount.UserAmountVariationListVO;
 import com.kxs.user.api.vo.kxsapp.userAccount.WithdrawListVO;
 import com.kxs.common.core.constant.enums.UserAdvanceStatusEnum;
@@ -49,7 +50,7 @@ public class UserAccountController {
      * @return 我的钱包-发起提现
      */
     @PostMapping("/withdrawDeposit")
-    public R withdrawDeposit(@RequestBody WithdrawDepositDTO param) {
+    public R withdrawDeposit(@Valid @RequestBody WithdrawDepositDTO param) {
 
         return kxsUserWithdrawalService.withdrawDeposit(param);
     }
@@ -86,8 +87,12 @@ public class UserAccountController {
      * @return 我的钱包-提现记录
      */
     @GetMapping("/withdrawList")
-    public R withdrawList(@ParameterObject Page<WithdrawListVO> page) {
-        return R.ok(kxsUserWithdrawalService.withdrawListPage(page));
+    public R withdrawList(@ParameterObject Page<WithdrawListVO> page, @ParameterObject KxsUserWithdrawal param) {
+
+        if(param.getWithdrawalType() == null){
+            return R.failed("withdrawalType 提现类型不能为空");
+        }
+        return R.ok(kxsUserWithdrawalService.withdrawListPage(page, param));
     }
 
 

+ 1 - 1
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/mapper/KxsUserWithdrawalMapper.java

@@ -21,7 +21,7 @@ import java.util.List;
 @Mapper
 public interface KxsUserWithdrawalMapper extends BaseMapper<KxsUserWithdrawal> {
 
-    IPage<WithdrawListVO> getByPage(Page<WithdrawListVO> page);
+    IPage<WithdrawListVO> getByPage(Page<WithdrawListVO> page, @Param("param") KxsUserWithdrawal param);
 
     /**
      * 分页查询用户提现申请表

+ 9 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsLeaderByOrderService.java

@@ -1,6 +1,8 @@
 package com.kxs.user.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.kxs.common.core.util.R;
+import com.kxs.user.api.dto.kxsapp.leader.LeaderApplyDTO;
 import com.kxs.user.api.model.KxsLeaderByOrder;
 
 /**
@@ -11,5 +13,12 @@ import com.kxs.user.api.model.KxsLeaderByOrder;
  */
 public interface KxsLeaderByOrderService extends IService<KxsLeaderByOrder> {
 
+    /**
+     * 兑换机具券
+     *
+     * @param param 参数
+     * @return {@link R}
+     */
+    R byTicketCode(LeaderApplyDTO param);
 }
 

+ 11 - 2
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserWithdrawalService.java

@@ -33,10 +33,11 @@ public interface KxsUserWithdrawalService extends IService<KxsUserWithdrawal> {
     /**
      * 提现列表分页
      *
-     * @param page 页
+     * @param page  页
+     * @param param
      * @return {@link IPage}<{@link WithdrawListVO}>
      */
-    IPage<WithdrawListVO> withdrawListPage(Page<WithdrawListVO> page);
+    IPage<WithdrawListVO> withdrawListPage(Page<WithdrawListVO> page, KxsUserWithdrawal param);
 
     /**
      * 提现详情
@@ -53,5 +54,13 @@ public interface KxsUserWithdrawalService extends IService<KxsUserWithdrawal> {
      * @return
      */
     List<SysUserWithdrawalPageVO> userWithdrawalPage(Page page, SysUserWithdrawalPageDTO param);
+
+    /**
+     * 盟主提现
+     *
+     * @param param 参数
+     * @return {@link R}
+     */
+    R leaderCash(WithdrawDepositDTO param);
 }
 

+ 2 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsLeaderAccountLogServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.system.api.dto.kxsapp.leader.LeaderAccountLogDTO;
 import com.kxs.user.biz.mapper.KxsLeaderAccountLogMapper;
 import com.kxs.user.api.model.KxsLeaderAccountLog;
@@ -26,6 +27,7 @@ public class KxsLeaderAccountLogServiceImpl extends ServiceImpl<KxsLeaderAccount
     public IPage<KxsLeaderAccountLog> accountPage(Page<KxsLeaderAccountLog> page, LeaderAccountLogDTO param) {
 
         LambdaQueryWrapper<KxsLeaderAccountLog> query = Wrappers.lambdaQuery();
+        query.eq(KxsLeaderAccountLog::getUserId, SecurityUtils.getUser().getId());
         query.eq(KxsLeaderAccountLog::getTradeMonth, param.getTradeMonth());
         if(StrUtil.isNotBlank(param.getKind())){
             query.eq(KxsLeaderAccountLog::getKind, param.getKind());

+ 106 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsLeaderByOrderServiceImpl.java

@@ -1,10 +1,34 @@
 package com.kxs.user.biz.service.impl;
 
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.NumberUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.core.constant.SecurityConstants;
+import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.common.core.util.R;
+import com.kxs.common.security.util.SecurityUtils;
+import com.kxs.product.api.dto.kxsapp.ticket.LeaderByTicketDTO;
+import com.kxs.product.api.feign.RemoteKxsProductService;
+import com.kxs.user.api.dto.kxsapp.leader.LeaderApplyDTO;
+import com.kxs.user.api.dto.kxsapp.leader.LeaderApplyInfoDTO;
+import com.kxs.user.api.model.KxsPartner;
+import com.kxs.user.api.model.KxsUserAmount;
+import com.kxs.user.biz.constant.enums.UserErrorTypeEnum;
 import com.kxs.user.biz.mapper.KxsLeaderByOrderMapper;
 import com.kxs.user.api.model.KxsLeaderByOrder;
+import com.kxs.user.biz.mapper.KxsPartnerMapper;
+import com.kxs.user.biz.mapper.KxsUserAmountMapper;
 import com.kxs.user.biz.service.KxsLeaderByOrderService;
+import io.seata.spring.annotation.GlobalTransactional;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Optional;
 
 /**
  * 盟主兑换订单表(KxsLeaderByOrder)表服务实现类
@@ -13,7 +37,89 @@ import org.springframework.stereotype.Service;
  * @since 2024-07-18 14:51:20
  */
 @Service("kxsLeaderByOrderService")
+@RequiredArgsConstructor
 public class KxsLeaderByOrderServiceImpl extends ServiceImpl<KxsLeaderByOrderMapper, KxsLeaderByOrder> implements KxsLeaderByOrderService {
 
+    /**
+     * 盟主储蓄金兑换一组对应的储蓄金
+     */
+    private final Integer LEADER_CODE_AMOUNT = 400;
+
+    private final KxsUserAmountMapper kxsUserAmountMapper;
+
+    private final KxsPartnerMapper kxsPartnerMapper;
+
+    private final RemoteKxsProductService remoteKxsProductService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @GlobalTransactional
+    public R byTicketCode(LeaderApplyDTO param) {
+
+        Long userId = SecurityUtils.getUser().getId();
+        // 获取盟主信息
+        KxsUserAmount userAmount = kxsUserAmountMapper.selectById(userId);
+        Optional.ofNullable(userAmount).orElseThrow(() -> new GlobalCustomerException("盟主信息不存在"));
+        BigDecimal leaderAmt = userAmount.getLeaderReserve();
+        KxsPartner kxsPartner = kxsPartnerMapper.selectById(userId);
+        if(kxsPartner != null){
+            leaderAmt = NumberUtil.add(userAmount.getLeaderBalanceAmount(), kxsPartner.getWithdrawalAmount());
+        }
+        //兑换所需额度
+        BigDecimal amount = NumberUtil.mul(param.getByNum(), LEADER_CODE_AMOUNT);
+        //验证余额
+        if (leaderAmt.compareTo(amount) < 0) {
+            return R.failed("余额不足");
+        }
+
+
+        String orderSn = CommonConstants.KXS_LEADER_BY_PREFIX + IdUtil.getSnowflakeNextIdStr();
+        KxsLeaderByOrder byOrder = new KxsLeaderByOrder();
+
+        //申请的明细数据
+        List<LeaderApplyInfoDTO> applyData = param.getByData();
+
+
+        byOrder.setUserId(userId.intValue());
+        byOrder.setOrderSn(orderSn);
+        byOrder.setByNum(param.getByNum());
+        byOrder.setByData(JSON.toJSONString(applyData));
+        baseMapper.insert(byOrder);
+
+        //盟主额度充足 扣除盟主余额
+        if(amount.compareTo(userAmount.getLeaderReserve()) <= 0){
+            userAmount.setLeaderReserve(NumberUtil.sub(userAmount.getLeaderReserve(), amount));
+        }else if(kxsPartner != null){
+            //需要扣除运营中心的额度
+            BigDecimal subPartnerAmt = NumberUtil.sub(amount, userAmount.getLeaderReserve());
+            //扣除运营中心的额度
+            kxsPartner.setAmount(NumberUtil.sub(kxsPartner.getAmount(), subPartnerAmt));
+            kxsPartnerMapper.updateById(kxsPartner);
+            userAmount.setLeaderReserve(BigDecimal.ZERO);
+        }
+        kxsUserAmountMapper.updateById(userAmount);
+
+        //发放机具券
+        for (LeaderApplyInfoDTO applyDatum : applyData) {
+            LeaderByTicketDTO req = new LeaderByTicketDTO();
+
+            req.setUserId(userId.intValue());
+            req.setTicketType(applyDatum.getType() - 1);
+            if(req.getTicketType() == 0){
+                req.setNum(applyDatum.getNum() * 3);
+            }else{
+                req.setNum(applyDatum.getNum() * 2);
+            }
+            req.setOrderId(byOrder.getId());
+            req.setLeaderId(userId.intValue());
+            R res = remoteKxsProductService.leaderByTicket(req, SecurityConstants.FROM_IN);
+            if(res.getStatus() != 1){
+                throw new GlobalCustomerException(res.getMsg());
+            }
+        }
+
+        return R.ok(Boolean.TRUE);
+    }
 }
 

+ 77 - 2
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserWithdrawalServiceImpl.java

@@ -9,21 +9,27 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.user.api.dto.admin.userWithdrawal.SysUserWithdrawalPageDTO;
 import com.kxs.user.api.dto.kxsapp.userAccount.WithdrawDepositDTO;
+import com.kxs.user.api.model.KxsPartner;
 import com.kxs.user.api.model.KxsUserAmount;
 import com.kxs.user.api.model.KxsUserBank;
 import com.kxs.user.api.vo.admin.userWithdrawal.SysUserWithdrawalPageVO;
+import com.kxs.user.api.vo.kxsapp.totalDebt.TotalDebtDetailVO;
 import com.kxs.user.api.vo.kxsapp.userAccount.WithdrawDetailVO;
 import com.kxs.user.api.vo.kxsapp.userAccount.WithdrawListVO;
 import com.kxs.user.biz.constant.enums.UserErrorTypeEnum;
 import com.kxs.user.biz.constant.enums.WithdrawalStatusEnum;
+import com.kxs.user.biz.constant.enums.WithdrawalTypeEnum;
+import com.kxs.user.biz.mapper.KxsPartnerMapper;
 import com.kxs.user.biz.mapper.KxsUserAmountMapper;
 import com.kxs.user.biz.mapper.KxsUserBankMapper;
 import com.kxs.user.biz.mapper.KxsUserWithdrawalMapper;
 import com.kxs.user.api.model.KxsUserWithdrawal;
+import com.kxs.user.biz.service.KxsTotalDebtService;
 import com.kxs.user.biz.service.KxsUserService;
 import com.kxs.user.biz.service.KxsUserWithdrawalService;
 import lombok.RequiredArgsConstructor;
@@ -32,6 +38,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -50,6 +57,10 @@ public class KxsUserWithdrawalServiceImpl extends ServiceImpl<KxsUserWithdrawalM
 
     private final KxsUserAmountMapper userAmountMapper;
 
+    private final KxsPartnerMapper kxsPartnerMapper;
+
+    private final KxsTotalDebtService kxsTotalDebtService;
+
     /**
      * 税费比例
      */
@@ -136,8 +147,71 @@ public class KxsUserWithdrawalServiceImpl extends ServiceImpl<KxsUserWithdrawalM
     }
 
     @Override
-    public IPage<WithdrawListVO> withdrawListPage(Page<WithdrawListVO> page) {
-        IPage<WithdrawListVO> byPage = baseMapper.getByPage(page);
+    @Transactional(rollbackFor = Exception.class)
+    public R leaderCash(WithdrawDepositDTO param) {
+        Long userId = SecurityUtils.getUser().getId();
+
+        if (!kxsUserService.checkPayPwd(param.getPayPwd())) {
+            return R.failed(UserErrorTypeEnum.PWD_ERROR.getDescription());
+        }
+        //查询银行卡
+        KxsUserBank userBank = userBankMapper.selectOne(Wrappers.<KxsUserBank>lambdaQuery().eq(KxsUserBank::getUserId, userId));
+        if(userBank == null){
+            return R.failed(UserErrorTypeEnum.NOT_REAL.getDescription());
+        }
+
+        //TODO 目前没合并表之前查询两个的余额
+        KxsUserAmount userAmount = userAmountMapper.selectOne(Wrappers.<KxsUserAmount>lambdaQuery().eq(KxsUserAmount::getUserId, userId).last("FOR UPDATE"));
+        KxsPartner kxsPartner = kxsPartnerMapper.selectByPartner(userId.intValue(), LocalDateTime.now());
+        BigDecimal leaderAmt = userAmount.getLeaderBalanceAmount();
+        if(kxsPartner != null){
+            leaderAmt = NumberUtil.add(userAmount.getLeaderBalanceAmount(), kxsPartner.getWithdrawalAmount());
+        }
+        //余额减去预扣款金额
+        TotalDebtDetailVO detail = kxsTotalDebtService.detail();
+        if(detail != null){
+            leaderAmt = NumberUtil.sub(leaderAmt, detail.getTotalDebt());
+        }
+        //验证余额
+        if (leaderAmt.compareTo(param.getApplyAmount()) < 0) {
+            return R.failed(UserErrorTypeEnum.NOT_SUFFICIENT_FUNDS.getDescription());
+        }
+
+        //订单号
+        String orderSn = CommonConstants.KXS_LEADER_WITHDRAWAL_PREFIX + IdUtil.getSnowflakeNextIdStr();
+        KxsUserWithdrawal kxsUserWithdrawal = new KxsUserWithdrawal();
+        kxsUserWithdrawal.setUserId(userId.intValue());
+        kxsUserWithdrawal.setApplyNo(orderSn);
+        kxsUserWithdrawal.setWithdrawalType(WithdrawalTypeEnum.LEADER.getType());
+        kxsUserWithdrawal.setBankCode(userBank.getBankCode());
+        kxsUserWithdrawal.setBankName(userBank.getBankName());
+        kxsUserWithdrawal.setApplyAmount(param.getApplyAmount());
+        baseMapper.insert(kxsUserWithdrawal);
+
+        //如果提现金额<=盟主提现金额则直接扣除盟主提现金额
+        if(param.getApplyAmount().compareTo(userAmount.getLeaderBalanceAmount()) <= 0){
+            //可用余额减少
+            userAmount.setLeaderBalanceAmount(NumberUtil.sub(userAmount.getLeaderBalanceAmount(), param.getApplyAmount()));
+        }else if(kxsPartner != null){
+            //否则扣除盟主余额后还需扣除运营中心的金额
+            BigDecimal subPartnerAmt = NumberUtil.sub(param.getApplyAmount(), userAmount.getLeaderBalanceAmount());
+            kxsPartner.setWithdrawalAmount(NumberUtil.sub(kxsPartner.getWithdrawalAmount(), subPartnerAmt));
+
+            userAmount.setLeaderBalanceAmount(BigDecimal.ZERO);
+            kxsPartnerMapper.updateById(kxsPartner);
+        }else{
+            throw new GlobalCustomerException("可提现余额不足");
+        }
+        userAmountMapper.updateById(userAmount);
+
+        return R.ok(Boolean.TRUE);
+    }
+    @Override
+    public IPage<WithdrawListVO> withdrawListPage(Page<WithdrawListVO> page, KxsUserWithdrawal param) {
+
+        param.setUserId(SecurityUtils.getUser().getId().intValue());
+
+        IPage<WithdrawListVO> byPage = baseMapper.getByPage(page, param);
 
         for (WithdrawListVO record : byPage.getRecords()) {
             String statusNo = EnumUtil.getFieldBy(WithdrawalStatusEnum::getDescription, WithdrawalStatusEnum::getType, record.getStatus());
@@ -176,5 +250,6 @@ public class KxsUserWithdrawalServiceImpl extends ServiceImpl<KxsUserWithdrawalM
     }
 
 
+
 }
 

+ 2 - 0
kxs-user/kxs-user-biz/src/main/resources/mapper/KxsUserWithdrawalMapper.xml

@@ -34,6 +34,8 @@
         select a.*, CONCAT(a.bank_name,'(', a.bank_code,')') as title  from kxs_user_withdrawal a
         <where>
             a.del_flag = 0
+            a.user_id = #{param.userId}
+            a.withdrawal_type = #{param.withdrawalType}
         </where>
         order by  a.create_time desc
     </select>