ソースを参照

fix codex 抵扣升级

zoujiajian 3 ヶ月 前
コミット
dedad7288b

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CodexDeductRecord.java

@@ -25,4 +25,6 @@ public class CodexDeductRecord extends BaseEntity{
 	 * 抵扣状态 默认false
 	 */
 	private Boolean status;
+
+    private Integer extendsDays;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/response/CodexDeductResp.java

@@ -20,4 +20,10 @@ public class CodexDeductResp {
 	 * 是否可抵扣
 	 */
 	private Boolean isDeduct = Boolean.TRUE;
+
+
+    /**
+     * 超出部分可延长天数
+     */
+    private Integer extendsDays;
 }

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/codex/CodexService.java

@@ -61,7 +61,7 @@ public interface CodexService {
 
     ClaudeCodeResp createOrUpdateCodexUserPackageApi(Long userId, String planName, Integer openaiDailyLimit, Integer openaiQuota, Date expiryTime) throws Exception;
 
-    CodexDeductResp getDeductMoney(Long userId, Long relationId);
+    CodexDeductResp getDeductMoney(Long userId, Long relationId, Long upgradeSkuId);
 
     OrderDon deductSubmitOrder(CodexUpgradePayReq payReq) throws Exception;
 

+ 28 - 11
netflix-service/src/main/java/com/cyksj/service/codex/impl/CodexServiceImpl.java

@@ -158,7 +158,7 @@ public class CodexServiceImpl implements CodexService {
 	}
 
 	@Override
-	public CodexDeductResp getDeductMoney(Long userId, Long relationId) {
+    public CodexDeductResp getDeductMoney(Long userId, Long relationId, Long upgradeSkuId) {
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
 		CodexDeductResp codexDeductResp = new CodexDeductResp();
 		List<Long> sendCodexSkuIds = skuMapper.selectList(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, Constant.CLAUDE_CODE_GOODS_ID).eq(GoodsDonSku::getIsCodex, Boolean.TRUE)).stream().map(GoodsDonSku::getId).collect(Collectors.toList());
@@ -174,6 +174,11 @@ public class CodexServiceImpl implements CodexService {
 				return codexDeductResp;
 			}
 		}
+        GoodsDonSku upgradeSku = skuMapper.selectById(upgradeSkuId);
+        if (upgradeSku.getGoodsId() != Constant.CLAUDE_CODE_GOODS_ID) {
+            codexDeductResp.setDeductMoney(BigDecimal.ZERO);
+            return codexDeductResp;
+        }
 		MapBuilder builder = MapUtils.builder();
 		if (relationId != null) {
 			builder.field(GroupsRelationMirrorView::getId, relationId);
@@ -183,16 +188,14 @@ public class CodexServiceImpl implements CodexService {
 				.field(GroupsRelationMirrorView::getUserId, userIdList).op(Operator.InList)
 				.field(GroupsRelationMirrorView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan)
 				.build());
-		BigDecimal deductMoney;
 		if (groupsRelationMirrorView == null || groupsRelationMirrorView.getExpiryTime().before(DateTime.now())) {
-			deductMoney = BigDecimal.ZERO;
-		} else {
+            codexDeductResp.setDeductMoney(BigDecimal.ZERO);
+        } else {
 			relationId = groupsRelationMirrorView.getId();
 			CodexUser codexUser = codexUserMapper.selectOne(Wrappers.lambdaQuery(CodexUser.class).eq(CodexUser::getRelationId, relationId).last("limit 1"));
 			Assert.notNull(codexUser, "系统异常,请联系客服");
-			deductMoney = getFinalDeductMoney(relationId, groupsRelationMirrorView.getSkuId(), codexUser.getRenewSkuId(), codexUser.getRenewOrderId(), codexUser.getRenewExpiryTime(), groupsRelationMirrorView.getStartTime(), groupsRelationMirrorView.getExpiryTime(), DateTime.now(), userIdList);
+            codexDeductResp = getFinalDeductMoney(relationId, groupsRelationMirrorView.getSkuId(), codexUser.getRenewSkuId(), codexUser.getRenewOrderId(), codexUser.getRenewExpiryTime(), groupsRelationMirrorView.getStartTime(), groupsRelationMirrorView.getExpiryTime(), DateTime.now(), userIdList, upgradeSku);
 		}
-		codexDeductResp.setDeductMoney(deductMoney);
 		return codexDeductResp;
 	}
 
@@ -202,13 +205,14 @@ public class CodexServiceImpl implements CodexService {
 		Long userId = payReq.getUserId();
 		//codex 车票id
 		Long relationId = payReq.getRelationId();
-		CodexDeductResp codexDeductResp = getDeductMoney(userId, relationId);
+        CodexDeductResp codexDeductResp = getDeductMoney(userId, relationId, payReq.getSkuId());
 		if (!codexDeductResp.getIsDeduct()) {
 			throw BusinessRuntimeException.getInstance("你存在claude code 无法抵扣");
 		}
 		//抵扣金额
 		BigDecimal deductMoney = codexDeductResp.getDeductMoney();
-		Long skuId = payReq.getSkuId();
+        Integer extendsDays = codexDeductResp.getExtendsDays();
+        Long skuId = payReq.getSkuId();
 
 		GoodsDonSku sku = skuMapper.selectById(skuId);
 		if (sku == null || sku.getGoodsId() != Constant.CLAUDE_CODE_GOODS_ID || !sku.getIsCodex()) {
@@ -279,6 +283,7 @@ public class CodexServiceImpl implements CodexService {
 			codexDeductRecord.setCcRelationId(ccRelationId);
 			codexDeductRecord.setOrderId(orderDon.getId());
 			codexDeductRecord.setRelationId(relationId);
+            codexDeductRecord.setExtendsDays(extendsDays);
 			codexDeductRecordMapper.insert(codexDeductRecord);
 		} finally {
 			if (redisService.hasKey(cacheKye)) {
@@ -472,7 +477,7 @@ public class CodexServiceImpl implements CodexService {
 		return relation;
 	}
 
-	public BigDecimal getFinalDeductMoney(Long relationId, Long relationSkuId, Long renewSkuId, Long renewOrderId, Date renewExpiryTime, Date relationStartTime, Date relationExpiryTime, DateTime now, List<Long> userIdList) {
+    public CodexDeductResp getFinalDeductMoney(Long relationId, Long relationSkuId, Long renewSkuId, Long renewOrderId, Date renewExpiryTime, Date relationStartTime, Date relationExpiryTime, DateTime now, List<Long> userIdList, GoodsDonSku upgradeSku) {
 		BigDecimal deductMoney = BigDecimal.ZERO;
 		//一个月当30天算单价 往上取整
 		//续费规格
@@ -563,13 +568,25 @@ public class CodexServiceImpl implements CodexService {
 
 			}
 		}
-		if (relationExpiryTime.after(now)) {
+        CodexDeductResp codexDeductResp = new CodexDeductResp();
+        if (relationExpiryTime.after(now)) {
 			//该车票抵扣金额
 			BigDecimal deductMoneyFromTicket = getDeductMoneyFromTicket(relationId, userIdList, relationSkuId, now, relationStartTime, relationExpiryTime);
 			deductMoney = deductMoney.add(deductMoneyFromTicket);
 		}
+        //超出可抵扣的金额 直接返回
+        if (deductMoney.compareTo(upgradeSku.getPrice()) >= 0) {
+            BigDecimal overMoney = deductMoney.subtract(upgradeSku.getPrice());
+            //超过抵扣金额可换延长会员多少天
+            //每天单价
+            BigDecimal daySingle = upgradeSku.getPrice().divide(BigDecimal.valueOf(upgradeSku.getMonths())).divide(BigDecimal.valueOf(30), 0, RoundingMode.DOWN);
+            //超出部分可换取多少天 低于每天单价为0天
+            BigDecimal extendsDays = overMoney.divide(daySingle, 0, RoundingMode.UP);
+            codexDeductResp.setExtendsDays(extendsDays.intValue());
+        }
 		log.info("codex车票id:{}最终到期时间为:{}车票可返回 抵扣金额:{}", relationId, DateUtil.format(relationExpiryTime, "yyyy-MM-dd HH:mm:ss"), deductMoney);
-		return deductMoney;
+        codexDeductResp.setDeductMoney(deductMoney);
+		return codexDeductResp;
 	}
 
 	private Retryer<ClaudeCodeResp> getApiRetryer(int wait, int stop) {

+ 23 - 17
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -3197,23 +3197,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			return;
 		}
 
-		//codex 抵扣
-		CodexDeductRecord codexDeductRecord = codexDeductRecordMapper.selectOne(Wrappers.lambdaQuery(CodexDeductRecord.class).eq(CodexDeductRecord::getOrderId, orderDon.getId()).last("limit 1"));
-		if (codexDeductRecord != null) {
-			//codex 抵扣车票id
-			Long relationId = codexDeductRecord.getRelationId();
-			//清除codex 抵扣的车票
-			groupRelationClearService.clearTicket(groupsRelationMapper.selectById(relationId), UserTicketClearedRecord.Source.codex_deduct);
-			//是否需要清除cc 无赠送codex
-			Long ccRelationId = codexDeductRecord.getCcRelationId();
-			if (ccRelationId != null) {
-				//清除codex 抵扣的车票
-				groupRelationClearService.clearTicket(groupsRelationMapper.selectById(ccRelationId), UserTicketClearedRecord.Source.codex_deduct);
-			}
-			codexDeductRecord.setStatus(Boolean.TRUE);
-			codexDeductRecordMapper.updateById(codexDeductRecord);
-		}
-
 		if (orderDon.getIsNoLogin() != null && orderDon.getIsNoLogin()) {
 			orderDon.setStatus(OrderDon.Status.hasPayment);
 		}
@@ -3480,6 +3463,29 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 
+        //codex 抵扣
+        CodexDeductRecord codexDeductRecord = codexDeductRecordMapper.selectOne(Wrappers.lambdaQuery(CodexDeductRecord.class).eq(CodexDeductRecord::getOrderId, orderDon.getId()).last("limit 1"));
+        if (codexDeductRecord != null) {
+            //codex 抵扣车票id
+            Long relationId = codexDeductRecord.getRelationId();
+            //清除codex 抵扣的车票
+            groupRelationClearService.clearTicket(groupsRelationMapper.selectById(relationId), UserTicketClearedRecord.Source.codex_deduct);
+            //是否需要清除cc 无赠送codex
+            Long ccRelationId = codexDeductRecord.getCcRelationId();
+            if (ccRelationId != null) {
+                //清除codex 抵扣的车票
+                groupRelationClearService.clearTicket(groupsRelationMapper.selectById(ccRelationId), UserTicketClearedRecord.Source.codex_deduct);
+            }
+            codexDeductRecord.setStatus(Boolean.TRUE);
+            //延长
+            if (codexDeductRecord.getExtendsDays() != null && codexDeductRecord.getExtendsDays() > 0) {
+                GroupsRelation newRelation = groupsRelationMapper.selectById(orderDon.getRelationId());
+                newRelation.setExpiryTime(DateUtil.offsetDay(newRelation.getExpiryTime(), codexDeductRecord.getExtendsDays()));
+                groupsRelationMapper.updateById(newRelation);
+            }
+            codexDeductRecordMapper.updateById(codexDeductRecord);
+        }
+
 		if (orderDon.getOrderType() == 1 && sku.getIsDown()) {
 			try {
 				GroupsRelation relation = groupsRelationMapper.selectById(orderDon.getRelationId());

+ 3 - 3
netflix-web/src/main/java/com/cyksj/web/controller/codex/CodexController.java

@@ -160,10 +160,10 @@ public class CodexController {
     /**
      * 抵扣车票金额
      */
-    @GetMapping("/get/deduct/money")
-    public Result<CodexDeductResp> getDeductMoney() {
+    @GetMapping("/get/deduct/money/{relationId}/{upgradeSkuId}")
+    public Result<CodexDeductResp> getDeductMoney(@PathVariable Long relationId, @PathVariable Long upgradeSkuId) {
         long userId = StpUserUtil.getLoginIdAsLong();
-        CodexDeductResp codexDeductResp = codexService.getDeductMoney(userId, null);
+        CodexDeductResp codexDeductResp = codexService.getDeductMoney(userId, relationId, upgradeSkuId);
         return GatewayResponse.SUCCESS.newBuilder().toResult(codexDeductResp);
     }