Bläddra i källkod

afdian 代充API

zoujiajian 6 månader sedan
förälder
incheckning
a5ae11ad83

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

@@ -790,4 +790,6 @@ public interface Constant {
 	 * 商品订阅邮件模板
 	 */
 	String GOODS_SUBSCRIBE_ALERT_EMAIL_MSG = "您好,您关注的%s已上线,登录网站https://nf.video/buy/%s 看看吧";
+
+	Long AF_DIAN_CHANNEL_ID = 6L;
 }

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/request/GroupsRelationRechargeReq.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.request;
 
+import com.cyksj.model.entity.CmsUser;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -24,4 +25,6 @@ public class GroupsRelationRechargeReq {
 	private String accessToken;
 
 	private String password;
+
+	private CmsUser cmsUser;
 }

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/response/recharge/AfDianCardKeyResp.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.response.recharge;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: AfDianCardKeyResp
+ * 创建者: JavaZou
+ * 创建时间:2026/1/26 18:18
+ */
+@Getter
+@Setter
+public class AfDianCardKeyResp {
+
+	/**
+	 * key
+	 */
+	private String code;
+
+	/**
+	 * false未使用
+	 */
+	private Boolean used;
+}

+ 39 - 0
netflix-dao/src/main/java/com/cyksj/model/response/recharge/AfDianTaskStatusResp.java

@@ -0,0 +1,39 @@
+package com.cyksj.model.response.recharge;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: AfDianTaskStatusResp
+ * 创建者: JavaZou
+ * 创建时间:2026/1/27 10:22
+ */
+@Getter
+@Setter
+public class AfDianTaskStatusResp {
+
+	/**
+	 * 卡密key
+	 */
+	private String cdk;
+
+	private String message;
+
+	/**
+	 * 执行状态
+	 * true排队中
+	 * false 已成功
+	 */
+	private Boolean pending;
+
+	/**
+	 * 任务状态
+	 */
+	private Boolean success;
+
+	/**
+	 * 任务id
+	 */
+	private String task_id;
+}

+ 15 - 2
netflix-service/src/main/java/com/cyksj/server/recharge/impl/GptProxyRechargeServiceImpl.java

@@ -23,6 +23,7 @@ import com.cyksj.server.recharge.dto.TaskResult;
 import com.cyksj.server.recharge.dto.TaskSubmitResult;
 import com.cyksj.server.recharge.dto.TokenParseResult;
 import com.cyksj.service.chatgpt.GptUserRechargeRecordService;
+import com.cyksj.service.recharge.AfDianRechargeService;
 import com.cyksj.service.recharge.GptRechargeCardKeyChannelService;
 import com.cyksj.service.user.UserBindRelationService;
 import lombok.RequiredArgsConstructor;
@@ -61,6 +62,8 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 
 	private final GptRechargeCardKeyChannelService gptRechargeCardKeyChannelService;
 
+	private final AfDianRechargeService afDianRechargeService;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	private HttpRequest createBaseRequest(String url) {
@@ -173,6 +176,10 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 		        return null;
 	        }
 	        String cardKey = relation.getCardKey();
+	        GptRechargeCardKey gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class).eq(GptRechargeCardKey::getCardKey, cardKey).last("limit 1"));
+	        if (gptRechargeCardKey.getChannelId() == Constant.AF_DIAN_CHANNEL_ID) {
+		        return afDianRechargeService.getTaskResult(taskId);
+	        }
 	        String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(cardKey);
 	        String url = BASE_URL + "/tasks/" + taskId;
             HttpResponse response = createBaseRequest(url)
@@ -284,13 +291,13 @@ 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 rand() limit 1"));
+					.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 rand() limit 1"));
+						.last("order by channel_id desc, rand() limit 1"));
 			}
 			if (gptRechargeCardKey == null) {
 				setRechargeRelationStatusAutoError(relation);
@@ -307,6 +314,12 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 				throw BusinessRuntimeException.getInstance("充值失败,请联系客服开通");
 			}
 			String gptCardKey = gptRechargeCardKey.getCardKey();
+
+			Long channelId = gptRechargeCardKey.getChannelId();
+			//AF dian
+			if (channelId == Constant.AF_DIAN_CHANNEL_ID) {
+				return afDianRechargeService.confirmRecharge(relation, null);
+			}
 			//校验卡密是否可用
 			CardKeyValidationResult cardKeyValidationResult = validateCardKey(gptCardKey);
 			if (!cardKeyValidationResult.getAvailable()) {

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

@@ -25,6 +25,7 @@ import com.cyksj.server.recharge.dto.TaskSubmitResult;
 import com.cyksj.server.recharge.dto.TokenParseResult;
 import com.cyksj.service.chatgpt.GptUserRechargeRecordService;
 import com.cyksj.service.mange.gpt.GptRechargeService;
+import com.cyksj.service.recharge.AfDianRechargeService;
 import com.cyksj.service.recharge.GptRechargeCardKeyChannelService;
 import com.cyksj.service.user.UserBindRelationService;
 import lombok.RequiredArgsConstructor;
@@ -69,6 +70,8 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 
 	private final GptRechargeCardKeyChannelService gptRechargeCardKeyChannelService;
 
+	private final AfDianRechargeService afDianRechargeService;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 
@@ -190,13 +193,13 @@ 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 rand() limit 1"));
+					.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 rand() limit 1"));
+						.last("order by channel_id desc, rand() limit 1"));
 			}
 			if (gptRechargeCardKey == null) {
 				throw BusinessRuntimeException.getInstance("无可用卡密");
@@ -210,6 +213,10 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 			if (update == 0) {
 				throw BusinessRuntimeException.getInstance("无可用卡密");
 			}
+			if (gptRechargeCardKey.getChannelId() == Constant.AF_DIAN_CHANNEL_ID) {
+				req.setCmsUser(cmsUser);
+				return afDianRechargeService.confirmRecharge(relation, cmsUser);
+			}
 			String gptCardKey = gptRechargeCardKey.getCardKey();
 			//校验卡密是否可用
 			CardKeyValidationResult cardKeyValidationResult = validateCardKey(gptCardKey);
@@ -253,7 +260,12 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 			if (relation == null) {
 				return null;
 			}
-			String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(relation.getCardKey());
+			String cardKey = relation.getCardKey();
+			GptRechargeCardKey gptRechargeCardKey = gptRechargeCardKeyMapper.selectOne(Wrappers.lambdaQuery(GptRechargeCardKey.class).eq(GptRechargeCardKey::getCardKey, cardKey).last("limit 1"));
+			if (gptRechargeCardKey.getChannelId() == Constant.AF_DIAN_CHANNEL_ID) {
+				return afDianRechargeService.getTaskResult(taskId);
+			}
+			String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(cardKey);
 			String url = BASE_URL + "/tasks/" + taskId;
 			HttpResponse response = createBaseRequest(url)
 					.execute();

+ 21 - 0
netflix-service/src/main/java/com/cyksj/service/recharge/AfDianRechargeService.java

@@ -0,0 +1,21 @@
+package com.cyksj.service.recharge;
+
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.response.recharge.AfDianCardKeyResp;
+import com.cyksj.server.recharge.dto.TaskResult;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: AfDianRechargeService
+ * 创建者: JavaZou
+ * 创建时间:2026/1/26 18:16
+ */
+public interface AfDianRechargeService {
+
+	AfDianCardKeyResp afDianValidateCardKey(String cardKey) throws Exception;
+
+	String confirmRecharge(GroupsRelation relation, CmsUser user);
+
+	TaskResult getTaskResult(String taskId);
+}

+ 294 - 0
netflix-service/src/main/java/com/cyksj/service/recharge/impl/AfDianRechargeServiceImpl.java

@@ -0,0 +1,294 @@
+package com.cyksj.service.recharge.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+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.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.response.recharge.AfDianCardKeyResp;
+import com.cyksj.model.response.recharge.AfDianTaskStatusResp;
+import com.cyksj.redis.RedisService;
+import com.cyksj.server.recharge.dto.TaskResult;
+import com.cyksj.server.recharge.dto.TokenParseResult;
+import com.cyksj.service.chatgpt.GptUserRechargeRecordService;
+import com.cyksj.service.recharge.AfDianRechargeService;
+import com.cyksj.service.recharge.GptRechargeCardKeyChannelService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: AfDianRechargeServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2026/1/26 18:16
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class AfDianRechargeServiceImpl implements AfDianRechargeService {
+	private final GptRechargeCardKeyChannelService gptRechargeCardKeyChannelService;
+
+	private final CmsUserMapper cmsUserMapper;
+
+	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 AfDianCardKeyResp afDianValidateCardKey(String cardKey) throws Exception {
+		String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(null);
+		String url = BASE_URL + "/cdks/public/check";
+
+		JSONObject params = new JSONObject();
+		params.putOpt("code", cardKey);
+		HttpResponse response = HttpRequest.post(url)
+				.body(params.toString())
+				.execute();
+		AfDianCardKeyResp afDianCardKeyResp = Jsons.parseObject(response.body(), AfDianCardKeyResp.class);
+		return afDianCardKeyResp;
+	}
+
+	@Override
+	public String confirmRecharge(GroupsRelation relation, CmsUser cmsUser) {
+		Long relationId = relation.getId();
+		String gptCardKey = relation.getCardKey();
+		//校验卡密是否可用
+		AfDianCardKeyResp afDianCardKeyResp = null;
+		try {
+			afDianCardKeyResp = afDianValidateCardKey(gptCardKey);
+		} catch (Exception e) {
+			throw BusinessRuntimeException.getInstance("系统繁忙,请重试");
+		}
+		if (afDianCardKeyResp.getUsed()) {
+			log.error("卡密:{}已被使用", gptCardKey);
+			throw BusinessRuntimeException.getInstance("系统繁忙,请重试");
+		}
+		String accessToken = relation.getGptToken();
+		String rechargeAccount = relation.getAccount();
+		//提交任务
+		String taskId = null;
+		try {
+			taskId = submitTask(gptCardKey, accessToken);
+		} catch (Exception e) {
+			setRechargeRelationStatusAutoError(relation);
+			throw BusinessRuntimeException.getInstance("充值错误");
+		}
+
+		String password = relation.getPassword();
+		relationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
+				//记录代充账号
+				.set(GroupsRelation::getAccount, rechargeAccount)
+				//记录操作人员
+				.set(cmsUser != null, GroupsRelation::getOperator, cmsUser.getNickname())
+				//密码
+				.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));
+		return taskId;
+	}
+
+	private String submitTask(String cardKey, String accessToken) {
+		log.info("开始提交afdian任务 - 卡密: {}", cardKey);
+		try {
+			String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(cardKey);
+			String url = BASE_URL + "/stocks/public/outstock";
+			JSONObject requestBody = new JSONObject();
+			requestBody.put("cdk", cardKey);
+			requestBody.put("user", accessToken);
+
+			HttpResponse response = HttpRequest.post(url)
+					.setConnectionTimeout(10000)
+					.body(requestBody.toString())
+					.execute();
+			String body = response.body();
+			log.info("任务提交响应: {}", body);
+
+			return body;
+		} catch (Exception e) {
+			log.error("提交任务失败: {}", e.getMessage(), e);
+			throw new RuntimeException("提交任务失败: " + e.getMessage(), e);
+		}
+	}
+
+	@Override
+	public TaskResult getTaskResult(String taskId) {
+		log.info("开始查询任务结果: {}", taskId);
+		try {
+			GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGptTaskId, taskId).last("limit 1"));
+			if (relation == null) {
+				return null;
+			}
+			String cardKey = relation.getCardKey();
+			String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(cardKey);
+			String url = BASE_URL + "/stocks/public/outstock/" + taskId;
+			HttpResponse response = HttpRequest.get(url).setConnectionTimeout(10000).execute();
+
+			String body = response.body();
+			log.info("任务查询响应: {}", body);
+
+			AfDianTaskStatusResp taskStatusResp = Jsons.parseObject(body, AfDianTaskStatusResp.class);
+			//任务不存在
+			if (StrUtil.isEmpty(taskStatusResp.getTask_id())) {
+				return null;
+			}
+			Boolean pending = taskStatusResp.getPending();
+
+			Boolean status = taskStatusResp.getSuccess();
+			String resultResult = taskStatusResp.getMessage();
+			//更新代充状态
+			resetGroupsRelationRechargeStatus(relation, pending, status, resultResult);
+
+			TaskResult taskResult = new TaskResult();
+			if (status && !pending) {
+				taskResult.setStatus("completed");
+			} else taskResult.setStatus("failed");
+			return taskResult;
+		} catch (Exception e) {
+			log.error("获取任务结果失败: {}", e.getMessage(), e);
+			throw new RuntimeException("获取任务结果失败: " + e.getMessage(), e);
+		}
+	}
+
+	public static void main(String[] args) throws Exception {
+		String url = "https://cz.afdian.org/api" + "/stocks/public/outstock/" + "9fae51b5-344c-46e5-839d-c470c32f1abb";
+		HttpResponse response = HttpRequest.get(url).setConnectionTimeout(10000).execute();
+
+		String body = response.body();
+		System.out.println(body);
+		AfDianTaskStatusResp taskStatusResp = Jsons.parseObject(body, AfDianTaskStatusResp.class);
+		System.out.println(Jsons.toJson(taskStatusResp));
+	}
+
+	/**
+	 * 设置代充自动充值异常
+	 */
+	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()));
+		});
+	}
+
+	public TokenParseResult parseToken(String accessToken) {
+		log.info("开始验证凭证: {}", accessToken.substring(0, Math.min(20, accessToken.length())) + "...");
+		try {
+			String BASE_URL = gptRechargeCardKeyChannelService.getCardKeyDomain(null);
+			String url = BASE_URL + "/parse-token";
+			JSONObject requestBody = new JSONObject();
+			requestBody.put("access_token", accessToken);
+
+			HttpResponse response = HttpRequest.post(url)
+					.header("accept", "application/json, text/plain, */*")
+					.header("accept-language", "zh-CN,zh;q=0.9,en;q=0.8")
+					.header("content-type", "application/json")
+					.header("origin", "https://www.ow520.com")
+					.header("referer", "https://www.ow520.com/")
+					.header("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
+					.body(requestBody.toString())
+					.execute();
+			String body = response.body();
+			log.info("凭证验证响应: {}", body);
+
+			JSONObject jsonResponse = JSONUtil.parseObj(body);
+			TokenParseResult result = new TokenParseResult(
+					jsonResponse.getStr("message"),
+					jsonResponse.getBool("success")
+			);
+			log.info("凭证验证结果: {}", result);
+			return result;
+		} catch (Exception e) {
+			log.error("验证凭证失败: {}", e.getMessage(), e);
+			throw new RuntimeException("验证凭证失败: " + e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 更新代充状态
+	 */
+	private void resetGroupsRelationRechargeStatus(GroupsRelation relation, Boolean pending, Boolean status, String result) {
+		GroupsRelation.RechargeStatus rechargeStatus;
+		if (status && !pending) {
+			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());
+					}
+				}
+			}
+			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 + 1).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) {
+				gptUserRechargeRecordService.recordGptUserRechargeNum(relation.getUserId(), relation.getId(), relation.getAccount(), -1, null, "自动代充");
+				//修改对应订单状态
+				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);
+					}
+				}
+			}
+		}
+	}
+}