Browse Source

/user/company/credit/bill/repay调整部分传参处理内容为变更授信额度逻辑

FengChaoYu 1 day ago
parent
commit
d204745f6b

+ 5 - 4
mall-server-api/src/main/java/com/gree/mall/manager/controller/member/UserCompanyCreditController.java

@@ -17,6 +17,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.integration.redis.util.RedisLockRegistry;
 import org.springframework.web.bind.annotation.*;
 
@@ -88,12 +89,12 @@ public class UserCompanyCreditController {
 
 
     @PostMapping("/repay")
-    @ApiOperation(value = "恢复商户授信额度")
+    @ApiOperation(value = "恢复商户授信额度或额度调整")
     public ResponseHelper repay(
-            @ApiParam(value = "账单id(不传就记当期还款)") @RequestParam(required = false) String billId,
+            @ApiParam(value = "账单id(不传,授信记录id必传)") @RequestParam(required = false) String billId,
             @ApiParam(value = "授信记录id(账单id不传,此必传)") @RequestParam(required = false) String userCompanyCreditId,
-            @ApiParam(value = "还款金额", required = true) @RequestParam BigDecimal amount) throws Exception {
-        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_COMMON + billId);
+            @ApiParam(value = "还款金额或调整授信额度", required = true) @RequestParam BigDecimal amount) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_COMMON + (StringUtils.isNotBlank(billId) ? billId : userCompanyCreditId));
         if(!obtain.tryLock(10, TimeUnit.SECONDS)){
             return ResponseHelper.error("系统繁忙,请稍后再试");
         }

+ 40 - 4
mall-server-api/src/main/java/com/gree/mall/manager/logic/user/UserCompanyCreditLogic.java

@@ -19,6 +19,7 @@ import com.gree.mall.manager.plus.entity.OrderInfo;
 import com.gree.mall.manager.plus.entity.UserCompanyCredit;
 import com.gree.mall.manager.plus.entity.UserCompanyCreditBill;
 import com.gree.mall.manager.plus.entity.UserCompanyCreditBillItem;
+import com.gree.mall.manager.plus.service.UserCompanyCreditBillItemService;
 import com.gree.mall.manager.plus.service.UserCompanyCreditBillService;
 import com.gree.mall.manager.plus.service.UserCompanyCreditService;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
@@ -33,6 +34,7 @@ import org.springframework.transaction.support.TransactionSynchronization;
 import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
@@ -48,6 +50,7 @@ public class UserCompanyCreditLogic {
     private final LockQueryMapper lockQueryMapper;
     private final UserCompanyCreditService userCompanyCreditService;
     private final UserCompanyCreditBillService userCompanyCreditBillService;
+    private final UserCompanyCreditBillItemService userCompanyCreditBillItemService;
 
     public IPage<UserCompanyCreditBillVO> list(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -110,18 +113,51 @@ public class UserCompanyCreditLogic {
             creditBill.setStatus(newRemainingAmount.compareTo(BigDecimal.ZERO) == 0 ? UserCreditBillStatusEnum.REPAID.getKey() : UserCreditBillStatusEnum.REPAYMENT.getKey())
                     .setRemainingAmount(newRemainingAmount)
                     .updateById();
+
+            // 恢复使用额度
+            this.repay(null, userId, companyWechatId, amount, billId);
         } else {
-            final UserCompanyCredit userCompanyCredit = userCompanyCreditService.getById(userCompanyCreditId);
+            UserCompanyCredit userCompanyCredit = userCompanyCreditService.getById(userCompanyCreditId);
             if (!userCompanyCredit.getCompanyWechatId().equals(adminUser.getCompanyWechatId())) {
                 throw new RemoteServiceException("请使用商户账号");
             }
 
             userId = userCompanyCredit.getUserId();
             companyWechatId = userCompanyCredit.getCompanyWechatId();
-        }
 
-        // 恢复使用额度
-        this.repay(null, userId, companyWechatId, amount, billId);
+            userCompanyCredit = lockQueryMapper.queryExistUserCompanyCredit(companyWechatId, userId);
+
+            // 旧授信额度
+            final BigDecimal oldCreditLimit = userCompanyCredit.getCreditLimit();
+
+            // 检查是加还是减额度
+            if (amount.compareTo(oldCreditLimit) > 0) {
+                // 增加额度处理
+                final BigDecimal addCreditLimit = amount.subtract(oldCreditLimit);
+                userCompanyCredit.setCreditLimit(amount)
+                        .setAvailableCredit(userCompanyCredit.getAvailableCredit().add(addCreditLimit))
+                        .updateById();
+            } else if (amount.compareTo(oldCreditLimit) < 0) {
+                // 减少额度处理
+
+                // 减少的额度是否低于当前已使用的授信额度
+                final List<UserCompanyCreditBillItem> billItems = userCompanyCreditBillItemService.lambdaQuery()
+                        .select(UserCompanyCreditBillItem::getAmount)
+                        .eq(UserCompanyCreditBillItem::getCompanyWechatId, userCompanyCredit.getCompanyWechatId())
+                        .eq(UserCompanyCreditBillItem::getUserId, userCompanyCredit.getUserId())
+                        .eq(UserCompanyCreditBillItem::getTransactionType, TransactionTypeEnum.CONSUMPTION.getKey())
+                        .isNull(UserCompanyCreditBillItem::getRepaymentBillId)
+                        .list();
+
+                final BigDecimal useCreditAmount = billItems.stream().map(UserCompanyCreditBillItem::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+                if (useCreditAmount.compareTo(amount) > 0) {
+                    throw new RemoteServiceException("当前账期已使用授信额度" + useCreditAmount + ", 设置失败!");
+                }
+
+                userCompanyCredit.setCreditLimit(amount)
+                        .updateById();
+            }
+        }
     }
 
     /**