Forráskód Böngészése

year.recharge活动代充渠道

zoujiajian 5 hónapja
szülő
commit
0ccf9480cd

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -808,6 +808,11 @@ public interface Constant {
 	 */
 	Long CHONG_AF_DIAN_CHANNEL_ID = 7L;
 
+    /**
+     * year.afdian
+     */
+    Long YEAR_AF_DIAN_CHANNEL_ID = 8L;
+
 	/**
 	 * Adobe 全家桶
 	 */

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -382,4 +382,11 @@ public class GoodsDonSku extends BaseEntity {
      * 是否开启订阅提醒
      */
     private Boolean isSubscribeAlert;
+
+    /**
+     * GPT代充类型
+     * 默认1 普通
+     * 2.活动代充类型
+     */
+    private Integer rechargeType;
 }

+ 74 - 0
netflix-dao/src/main/java/com/cyksj/model/response/recharge/YearAfDianCardKeyResp.java

@@ -0,0 +1,74 @@
+package com.cyksj.model.response.recharge;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class YearAfDianCardKeyResp {
+
+    private Boolean success;
+
+    private RespData data;
+
+    private ErrorInfo error;
+
+    @Getter
+    @Setter
+    public static class RespData {
+        public Cdk cdk;
+        public PlatformResult platformResult;
+    }
+
+    @Getter
+    @Setter
+    public static class Cdk {
+        public String code;
+        public String status;
+        public String expiresAt;
+    }
+
+    @Getter
+    @Setter
+    public static class PlatformResult {
+        public String platform;
+        public Data data;
+    }
+
+    @Getter
+    @Setter
+    public static class Data {
+        public Account account;
+    }
+
+    @Getter
+    @Setter
+    public static class Account {
+        public String email;
+        public String userId;
+        public String organizationId;
+        public boolean deactivated;
+        public String planType;
+        public String billingCycle;
+        public boolean willRenew;
+        public String renewDate;
+        public String gracePeriodEndDate;
+        public boolean hasPaymentMethod;
+        public boolean hasPurchaseHistory;
+        public boolean hasActiveSubscription;
+        public String subscriptionExpiresAt;
+        public SubscriptionPlan subscriptionPlan;
+    }
+
+    @Getter
+    @Setter
+    public static class ErrorInfo {
+        public String code;
+        private String message;
+    }
+
+    public static class SubscriptionPlan {
+        public String id;
+        public java.util.List<String> allowedModels;
+    }
+}

+ 61 - 0
netflix-dao/src/main/java/com/cyksj/model/response/recharge/YearAfDianTaskResp.java

@@ -0,0 +1,61 @@
+package com.cyksj.model.response.recharge;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class YearAfDianTaskResp {
+
+    public Boolean success;
+    public Data data;
+
+    @Getter
+    @Setter
+    public static class Data {
+        public Boolean success;
+        public String message;
+        public PlatformResult platformResult;
+    }
+
+    @Getter
+    @Setter
+    public static class PlatformResult {
+        public String platform;
+        public PlatformData data;
+    }
+
+    @Getter
+    @Setter
+    public static class PlatformData {
+        public Account account;
+    }
+
+    @Getter
+    @Setter
+    public static class Account {
+        public String email;
+        public String userId;
+        public String organizationId;
+        public Boolean deactivated;
+        public String planType;
+        public String billingCycle;
+        public Boolean willRenew;
+        public String renewDate;
+        public String gracePeriodEndDate;
+        public Boolean hasPaymentMethod;
+        public Boolean hasPurchaseHistory;
+        public Boolean hasActiveSubscription;
+        public String subscriptionExpiresAt;
+        public SubscriptionPlan subscriptionPlan;
+    }
+
+    @Getter
+    @Setter
+    public static class SubscriptionPlan {
+        public String id;
+        public List<Object> allowedModels;
+    }
+}

+ 37 - 3
netflix-service/src/main/java/com/cyksj/server/recharge/impl/GptProxyRechargeServiceImpl.java

@@ -26,6 +26,7 @@ import com.cyksj.service.chatgpt.GptUserRechargeRecordService;
 import com.cyksj.service.recharge.AfDianRechargeService;
 import com.cyksj.service.recharge.ChongAfDianRechargeService;
 import com.cyksj.service.recharge.GptRechargeCardKeyChannelService;
+import com.cyksj.service.recharge.YearAfDianRechargeService;
 import com.cyksj.service.user.UserBindRelationService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -67,6 +68,8 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 
 	private final ChongAfDianRechargeService chongAfDianRechargeService;
 
+    private final YearAfDianRechargeService yearAfDianRechargeService;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	private HttpRequest createBaseRequest(String url) {
@@ -170,6 +173,24 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
     }
 
     public TaskResult getTaskResult(String taskId) {
+        //特殊处理year活动代充 走通流程
+        if (StrUtil.isNotBlank(taskId) && taskId.contains("yhrgzc:")) {
+            GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+                    .eq(GroupsRelation::getGptTaskId, taskId)
+                    .last("limit 1"));
+            if (relation == null) {
+                return null;
+            }
+            TaskResult taskResult = new TaskResult();
+            taskResult.setStatus("recharging");
+            if (relation.getRechargeStatus() == GroupsRelation.RechargeStatus.complete) {
+                taskResult.setStatus("completed");
+            }
+            if (relation.getRechargeStatus() == GroupsRelation.RechargeStatus.recharge_error) {
+                taskResult.setStatus("failed");
+            }
+            return taskResult;
+        }
         log.info("开始查询任务结果: {}", taskId);
         try {
 	        GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
@@ -247,9 +268,16 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 		if (!b) {
 			throw BusinessRuntimeException.getInstance("确认充值中");
 		}
+        Integer subRechargeNum = 1;
+        Integer specificChannel = null;
+        //活动gpt代充类型
+        if (sku.getRechargeType() == 2) {
+            specificChannel = 8;
+            subRechargeNum = 12;
+        }
 		try {
 			int updateRemainNum = relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
-					.set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - 1)
+					.set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - subRechargeNum)
 					.eq(GroupsRelation::getId, relationId)
 					.eq(GroupsRelation::getUserId, relation.getUserId())
 					.eq(GroupsRelation::getRechargeRemainNum, rechargeRemainNum));
@@ -297,13 +325,15 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 			GptRechargeCardKey gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class)
 					.eq(GptRechargeCardKey::getType, gptRechargeCardKeyType)
 					.eq(GptRechargeCardKey::getStatus, Boolean.FALSE)
-					.last("order by channel_id desc, rand() limit 1"));
+                    .eq(specificChannel != null, GptRechargeCardKey::getChannelId, specificChannel)
+                    .last("order by channel_id desc, rand() limit 1"));
 			//季、年付卡密不存在 从月付代充卡密中获取
 			if (gptRechargeCardKey == null && gptRechargeCardKeyType == 1) {
 				gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class)
 						.eq(GptRechargeCardKey::getType, 0)
 						.eq(GptRechargeCardKey::getStatus, Boolean.FALSE)
-						.last("order by channel_id desc, rand() limit 1"));
+                        .eq(specificChannel != null, GptRechargeCardKey::getChannelId, specificChannel)
+                        .last("order by channel_id desc, rand() limit 1"));
 			}
 			if (gptRechargeCardKey == null) {
 				setRechargeRelationStatusAutoError(relation);
@@ -331,6 +361,10 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 			if (channelId == Constant.CHONG_AF_DIAN_CHANNEL_ID) {
 				return chongAfDianRechargeService.confirmRecharge(relation, gptCardKey, null);
 			}
+            //year.afdian
+			if (channelId == Constant.YEAR_AF_DIAN_CHANNEL_ID) {
+				return yearAfDianRechargeService.confirmRecharge(relation, gptCardKey, null);
+			}
 			//校验卡密是否可用
 			CardKeyValidationResult cardKeyValidationResult = validateCardKey(gptCardKey);
 			if (!cardKeyValidationResult.getAvailable()) {

+ 38 - 3
netflix-service/src/main/java/com/cyksj/service/mange/gpt/impl/GptRechargeServiceImpl.java

@@ -28,6 +28,7 @@ import com.cyksj.service.mange.gpt.GptRechargeService;
 import com.cyksj.service.recharge.AfDianRechargeService;
 import com.cyksj.service.recharge.ChongAfDianRechargeService;
 import com.cyksj.service.recharge.GptRechargeCardKeyChannelService;
+import com.cyksj.service.recharge.YearAfDianRechargeService;
 import com.cyksj.service.user.UserBindRelationService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -77,6 +78,7 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
+    private final YearAfDianRechargeService yearAfDianRechargeService;
 
 	private HttpRequest createBaseRequest(String url) {
 		return HttpRequest.get(url)
@@ -150,9 +152,16 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 		if (!b) {
 			throw BusinessRuntimeException.getInstance("确认充值中");
 		}
+        Integer subRechargeNum = 1;
+        Integer specificChannel = null;
+        //活动gpt代充类型
+        if (sku.getRechargeType() == 2) {
+            specificChannel = 8;
+            subRechargeNum = 12;
+        }
 		try {
 			int updateRemainNum = relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
-					.set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - 1)
+					.set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - subRechargeNum)
 					.eq(GroupsRelation::getId, relationId)
 					.eq(GroupsRelation::getUserId, relation.getUserId())
 					.eq(GroupsRelation::getRechargeRemainNum, rechargeRemainNum));
@@ -196,13 +205,15 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 			GptRechargeCardKey gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class)
 					.eq(GptRechargeCardKey::getStatus, Boolean.FALSE)
 					.eq(GptRechargeCardKey::getType, gptRechargeCardKeyType)
-					.last("order by channel_id desc, rand() limit 1"));
+                    .eq(specificChannel != null, GptRechargeCardKey::getChannelId, specificChannel)
+                    .last("order by channel_id desc, rand() limit 1"));
 			//季、年付卡密不存在 从月付代充卡密中获取
 			if (gptRechargeCardKey == null && gptRechargeCardKeyType == 1) {
 				gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class)
 						.eq(GptRechargeCardKey::getType, 0)
 						.eq(GptRechargeCardKey::getStatus, Boolean.FALSE)
-						.last("order by channel_id desc, rand() limit 1"));
+                        .eq(specificChannel != null, GptRechargeCardKey::getChannelId, specificChannel)
+                        .last("order by channel_id desc, rand() limit 1"));
 			}
 			if (gptRechargeCardKey == null) {
 				throw BusinessRuntimeException.getInstance("无可用卡密");
@@ -228,6 +239,12 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 				relation.setCardKey(gptCardKey);
 				return chongAfDianRechargeService.confirmRecharge(relation, gptCardKey, cmsUser);
 			}
+
+            if (gptRechargeCardKey.getChannelId() == Constant.YEAR_AF_DIAN_CHANNEL_ID) {
+                req.setCmsUser(cmsUser);
+                relation.setCardKey(gptCardKey);
+                return yearAfDianRechargeService.confirmRecharge(relation, gptCardKey, cmsUser);
+            }
 			//校验卡密是否可用
 			CardKeyValidationResult cardKeyValidationResult = validateCardKey(gptCardKey);
 			if (!cardKeyValidationResult.getAvailable()) {
@@ -262,6 +279,24 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 	}
 
 	public TaskResult getTaskResult(String taskId) {
+        //特殊处理year活动代充 走通流程
+        if (StrUtil.isNotBlank(taskId) && taskId.contains("yhrgzc:")) {
+            GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+                    .eq(GroupsRelation::getGptTaskId, taskId)
+                    .last("limit 1"));
+            if (relation == null) {
+                return null;
+            }
+            TaskResult taskResult = new TaskResult();
+            taskResult.setStatus("recharging");
+            if (relation.getRechargeStatus() == GroupsRelation.RechargeStatus.complete) {
+                taskResult.setStatus("completed");
+            }
+            if (relation.getRechargeStatus() == GroupsRelation.RechargeStatus.recharge_error) {
+                taskResult.setStatus("failed");
+            }
+            return taskResult;
+        }
 		log.info("开始查询任务结果: {}", taskId);
 		try {
 			GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/recharge/YearAfDianRechargeService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.recharge;
+
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.response.recharge.YearAfDianCardKeyResp;
+
+public interface YearAfDianRechargeService {
+    YearAfDianCardKeyResp validateCardKey(String cardKey, String accessToken) throws Exception;
+
+    String confirmRecharge(GroupsRelation relation, String cardKey, CmsUser user);
+}

+ 244 - 0
netflix-service/src/main/java/com/cyksj/service/recharge/impl/YearAfDianRechargeServiceImpl.java

@@ -0,0 +1,244 @@
+package com.cyksj.service.recharge.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.*;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.response.recharge.YearAfDianCardKeyResp;
+import com.cyksj.model.response.recharge.YearAfDianTaskResp;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.chatgpt.GptUserRechargeRecordService;
+import com.cyksj.service.recharge.GptRechargeCardKeyChannelService;
+import com.cyksj.service.recharge.YearAfDianRechargeService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class YearAfDianRechargeServiceImpl implements YearAfDianRechargeService {
+    private final GptRechargeCardKeyChannelService gptRechargeCardKeyChannelService;
+
+    private final GroupsRelationMapper relationMapper;
+
+    private final GroupsMapper groupsMapper;
+
+    private final GoodsDonSkuMapper skuMapper;
+
+    private final RedisService redisService;
+
+    private final OrderDonMapper orderDonMapper;
+
+    private final GptRechargeCardKeyMapper gptRechargeCardKeyMapper;
+
+    private final GptUserRechargeRecordService gptUserRechargeRecordService;
+
+    private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
+
+    @Override
+    public YearAfDianCardKeyResp validateCardKey(String cardKey, String accessToken) throws Exception {
+        String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(cardKey);
+        String url = BASE_URL + "/verify";
+
+        JSONObject params = new JSONObject();
+        params.putOpt("cdk", cardKey);
+        JSONObject platformCredential = new JSONObject();
+        platformCredential.putOpt("platform", "chatgpt");
+        platformCredential.putOpt("data", Jsons.parseObject(accessToken, JSONObject.class));
+        params.putOpt("platformCredential", platformCredential);
+
+        HttpResponse response = HttpRequest.post(url)
+                .body(params.toString())
+                .execute();
+        log.info("year.afdian验证卡密结果:{}", response.body());
+        YearAfDianCardKeyResp data = Jsons.parseObject(response.body(), YearAfDianCardKeyResp.class);
+        return data;
+    }
+
+
+    @Override
+    public String confirmRecharge(GroupsRelation relation, String gptCardKey, CmsUser cmsUser) {
+        Long relationId = relation.getId();
+        //校验卡密是否可用
+        YearAfDianCardKeyResp yearAfDianCardKeyResp = null;
+        try {
+            yearAfDianCardKeyResp = validateCardKey(gptCardKey, relation.getGptToken());
+        } catch (Exception e) {
+            if (cmsUser == null) {
+                throw BusinessRuntimeException.getInstance("系统繁忙,请重试");
+            }
+            throw BusinessRuntimeException.getInstance("卡密:{0}错误", gptCardKey);
+        }
+        if (!yearAfDianCardKeyResp.getSuccess()) {
+            if (cmsUser == null) {
+                throw BusinessRuntimeException.getInstance("系统繁忙,请重试");
+            }
+            throw BusinessRuntimeException.getInstance(yearAfDianCardKeyResp.getError().getMessage());
+        }
+        if (!"unused".equals(yearAfDianCardKeyResp.getData().getCdk().getStatus())) {
+            log.error("卡密:{}已被使用", gptCardKey);
+            if (cmsUser == null) {
+                throw BusinessRuntimeException.getInstance("系统繁忙,请重试");
+            }
+            throw BusinessRuntimeException.getInstance("卡密:{0}已被使用", gptCardKey);
+        }
+        String accessToken = relation.getGptToken();
+        String rechargeAccount = relation.getAccount();
+        //提交任务返回状态
+        Boolean success = false;
+        try {
+            success = submitTask(gptCardKey, accessToken);
+        } catch (Exception e) {
+            setRechargeRelationStatusAutoError(relation);
+            if (cmsUser == null) {
+                throw BusinessRuntimeException.getInstance("充值失败,请联系客服开通");
+            }
+            throw BusinessRuntimeException.getInstance("充值失败,{0}", e.getMessage());
+        }
+        String operator = null;
+        if (cmsUser != null) {
+            operator = cmsUser.getNickname();
+        }
+        String password = relation.getPassword();
+        String taskId = "yhrgzc:" + RandomUtil.randomNumbers(20);
+        relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
+                //记录代充账号
+                .set(GroupsRelation::getAccount, rechargeAccount)
+                //记录操作人员
+                .set(GroupsRelation::getOperator, operator)
+                //密码
+                .set(StrUtil.isNotBlank(password), GroupsRelation::getPassword, password)
+                .set(GroupsRelation::getRechargeStatus, GroupsRelation.RechargeStatus.recharging)
+                .set(GroupsRelation::getCardKey, gptCardKey)
+                .set(GroupsRelation::getGptToken, accessToken)
+                .set(GroupsRelation::getGptTaskId, taskId)
+                .eq(GroupsRelation::getId, relationId));
+        relation.setRechargeStatus(GroupsRelation.RechargeStatus.recharging);
+        resetGroupsRelationRechargeStatus(relation, success, rechargeAccount);
+        return taskId;
+    }
+
+    private Boolean submitTask(String cardKey, String accessToken) {
+        log.info("开始提交year.afdian任务 - 卡密: {}", cardKey);
+        try {
+            String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(cardKey);
+            String url = BASE_URL + "/redeem";
+
+            JSONObject requestBody = new JSONObject();
+            requestBody.putOpt("cdk", cardKey);
+            requestBody.putOpt("confirm", true);
+            JSONObject platformCredential = new JSONObject();
+            platformCredential.putOpt("platform", "chatgpt");
+            platformCredential.putOpt("data", Jsons.parseObject(accessToken, JSONObject.class));
+            requestBody.putOpt("platformCredential", platformCredential);
+
+            HttpResponse response = HttpRequest.post(url)
+                    .setConnectionTimeout(10000)
+                    .body(requestBody.toString())
+                    .execute();
+            String body = response.body();
+            log.info("year.afdian任务提交响应: {}", body);
+
+            YearAfDianTaskResp yearAfDianTaskResp = Jsons.parseObject(body, YearAfDianTaskResp.class);
+            Boolean success = yearAfDianTaskResp.getSuccess();
+            return success;
+
+        } catch (Exception e) {
+            log.error("提交任务失败: {}", e.getMessage(), e);
+            throw new RuntimeException("提交任务失败: " + e.getMessage(), e);
+        }
+    }
+
+
+
+    /**
+     * 设置代充自动充值异常
+     */
+    public void setRechargeRelationStatusAutoError(GroupsRelation relation) {
+        TASK_EXECUTOR.execute(() -> {
+            relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
+                    .set(GroupsRelation::getAccount, relation.getAccount())
+                    .set(GroupsRelation::getGptToken, relation.getGptToken())
+                    .set(GroupsRelation::getRechargeStatus, GroupsRelation.RechargeStatus.recharge_error)
+                    .eq(GroupsRelation::getId, relation.getId()));
+        });
+    }
+
+    /**
+     * 更新代充状态
+     */
+    private void resetGroupsRelationRechargeStatus(GroupsRelation relation, Boolean taskStatus, String result) {
+        GroupsRelation.RechargeStatus rechargeStatus;
+        if (taskStatus) {
+            rechargeStatus = GroupsRelation.RechargeStatus.complete;
+        } else {
+            rechargeStatus = GroupsRelation.RechargeStatus.recharge_error;
+        }
+        String taskId = relation.getGptTaskId();
+        if (relation != null && relation.getRechargeStatus() == GroupsRelation.RechargeStatus.recharging) {
+            Integer rechargeRemainNum = relation.getRechargeRemainNum();
+            String cardKey = relation.getCardKey();
+            GptRechargeCardKey gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class).eq(GptRechargeCardKey::getCardKey, cardKey).last("limit 1"));
+            if (rechargeStatus == GroupsRelation.RechargeStatus.recharge_error) {
+                if (gptRechargeCardKey != null) {
+                    gptRechargeCardKeyMapper.update(null, Wrappers.lambdaUpdate(GptRechargeCardKey.class).set(GptRechargeCardKey::getStatus, Boolean.FALSE).set(GptRechargeCardKey::getOrderId, null).set(GptRechargeCardKey::getOrderNo, null).eq(GptRechargeCardKey::getId, gptRechargeCardKey.getId()).eq(GptRechargeCardKey::getStatus, Boolean.TRUE));
+                }
+            }
+            if (rechargeStatus == GroupsRelation.RechargeStatus.recharge_error) {
+                if (!redisService.setNx(RedisService.key.GPT_RECHARGE_RECOVER_KEY.getName() + taskId, taskId, RedisService.key.GPT_RECHARGE_RECOVER_KEY.getTimeout())) {
+                    return;
+                }
+            }
+            Date startTime = relation.getStartTime();
+            DateTime expiryTime = null;
+            if (rechargeStatus == GroupsRelation.RechargeStatus.complete && startTime == null) {
+                GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+                if (groupsTrips != null) {
+                    startTime = DateTime.now();
+                    GoodsDonSku sku = skuMapper.selectById(groupsTrips.getSkuId());
+                    if (sku.getDays() != null && sku.getDays() > 0) {
+                        expiryTime = DateUtil.offsetDay(startTime, sku.getDays());
+                    } else {
+                        expiryTime = DateUtil.offsetMonth(startTime, sku.getMonths());
+                    }
+                }
+            }
+            Integer rechargeNum = 12;
+            String rechargeErrorInfo = null;
+            if (rechargeStatus == GroupsRelation.RechargeStatus.recharge_error) {
+                rechargeErrorInfo = result;
+            }
+            relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class).set(rechargeStatus == GroupsRelation.RechargeStatus.recharge_error, GroupsRelation::getRechargeRemainNum, rechargeRemainNum + rechargeNum).set(GroupsRelation::getRechargeStatus, rechargeStatus).set(expiryTime != null, GroupsRelation::getStartTime, startTime).set(expiryTime != null, GroupsRelation::getExpiryTime, expiryTime).set(StrUtil.isNotEmpty(rechargeErrorInfo), GroupsRelation::getRechargeErrorInfo, rechargeErrorInfo).eq(GroupsRelation::getId, relation.getId()).le(GroupsRelation::getRechargeRemainNum, relation.getRechargeNum()).eq(GroupsRelation::getRechargeStatus, GroupsRelation.RechargeStatus.recharging));
+            //记录代充记录
+            if (rechargeStatus == GroupsRelation.RechargeStatus.complete) {
+                String remark = "自动代充";
+                if (StrUtil.isNotBlank(relation.getOperator())) {
+                    remark = "后台自动代充";
+                }
+                gptUserRechargeRecordService.recordGptUserRechargeNum(relation.getUserId(), relation.getId(), relation.getAccount(), -rechargeNum, relation.getOperator(), remark);
+                //修改对应订单状态
+                if (gptRechargeCardKey != null) {
+                    Long orderId = gptRechargeCardKey.getOrderId();
+                    OrderDon orderDon = orderDonMapper.selectById(orderId);
+                    if (orderDon != null && orderDon.getStatus() == OrderDon.Status.hasPayment) {
+                        orderDon.setStatus(OrderDon.Status.complete);
+                        orderDonMapper.updateById(orderDon);
+                    }
+
+                }
+            }
+        }
+    }
+}

+ 8 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -661,20 +661,26 @@ public class CmsOrderController {
 					relation.setExpiryTime(expiryTime);
 				}
 				relationMapper.updateById(relation);
+                //GPT代充
+                Integer subRechargeNum = 1;
+                GoodsDonSku goodsDonSku = skuMapper.selectById(orderDon.getSkuId());
+                if (goodsDonSku.getRechargeType() == 2) {
+                    subRechargeNum = 12;
+                }
 				//GPT代充
 				if (orderDon.getGoodsId() == Constant.GPT_RECHARGE_GOODS_ID) {
 					//扣除次数
 					Integer rechargeRemainNum = relation.getRechargeRemainNum();
 					if (rechargeRemainNum != null && rechargeRemainNum > 0) {
 						int update = relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
-								.set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - 1)
+								.set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - subRechargeNum)
 								.eq(GroupsRelation::getId, relationId)
 								.eq(GroupsRelation::getRechargeRemainNum, rechargeRemainNum));
 						if (update == 0) {
 							throw BusinessRuntimeException.getInstance("更新用户代充剩余次数失败,请重试");
 						}
 						//记录gpt代充记录
-						gptUserRechargeRecordService.recordGptUserRechargeNum(relation.getUserId(), relation.getId(), relation.getAccount(), -1, cmsUser != null ? cmsUser.getNickname() : null, "客服手动充值");
+						gptUserRechargeRecordService.recordGptUserRechargeNum(relation.getUserId(), relation.getId(), relation.getAccount(), -subRechargeNum, cmsUser != null ? cmsUser.getNickname() : null, "客服手动充值");
 					}
 				}
 			}

+ 7 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupRelationController.java

@@ -273,19 +273,24 @@ public class CmsGroupRelationController {
         }
         groupsRelationMapper.updateById(relation);
         //GPT代充
+        Integer subRechargeNum = 1;
+        GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
+        if (goodsDonSku.getRechargeType() == 2) {
+            subRechargeNum = 12;
+        }
         if (orderDon != null) {
             //扣除次数
             Integer rechargeRemainNum = relation.getRechargeRemainNum();
             if (rechargeRemainNum != null && rechargeRemainNum > 0) {
                 int update = groupsRelationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
-                        .set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - 1)
+                        .set(GroupsRelation::getRechargeRemainNum, rechargeRemainNum - subRechargeNum)
                         .eq(GroupsRelation::getId, relationId)
                         .eq(GroupsRelation::getRechargeRemainNum, rechargeRemainNum));
                 if (update == 0) {
                     throw BusinessRuntimeException.getInstance("更新用户代充剩余次数失败,请重试");
                 }
                 //记录gpt代充记录
-                gptUserRechargeRecordService.recordGptUserRechargeNum(relation.getUserId(), relation.getId(), relation.getAccount(), -1, cmsUser != null ? cmsUser.getNickname() : null, "客服手动充值");
+                gptUserRechargeRecordService.recordGptUserRechargeNum(relation.getUserId(), relation.getId(), relation.getAccount(), -subRechargeNum, cmsUser != null ? cmsUser.getNickname() : null, "客服手动充值");
             }
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult("状态修改成功");