From 0d934f7287506ef5efcbe275007194d83ae9880a Mon Sep 17 00:00:00 2001 From: wangzhiwei Date: Tue, 14 Apr 2026 21:38:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(account):=20=E6=B7=BB=E5=8A=A0=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=AD=97=E6=AE=B5=E5=92=8C=E8=B0=83=E7=94=A8ID?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在AccountFrozen实体和DTO中添加question字段用于记录用户问题或需求 - 在AccountTransaction实体中添加callId字段用于关联冻结单调用 - 更新数据库映射文件中的查询和插入语句以支持新增字段 - 在账户冻结服务中实现question字段的赋值逻辑 - 在冻结单释放时将question和callId传递到交易记录中 - 添加数据库表结构变更SQL脚本为account_frozen表增加question字段 - 添加数据库表结构变更SQL脚本为account_transaction表增加call_id字段及索引 - 在用户注册流程中实现邀请奖励机制为被邀请用户赠送积分 --- db/alter_account_frozen_add_question.sql | 5 +++++ db/alter_account_transaction_add_call_id.sql | 9 +++++++++ .../com/kexue/skills/entity/AccountFrozen.java | 3 +++ .../kexue/skills/entity/AccountTransaction.java | 3 +++ .../kexue/skills/entity/dto/AccountFrozenDto.java | 3 +++ .../service/impl/AccountFrozenServiceImpl.java | 11 +++++++++++ .../skills/service/impl/SysUserServiceImpl.java | 15 +++++++++++++++ src/main/resources/mapper/AccountFrozenMapper.xml | 8 +++++--- .../resources/mapper/AccountTransactionMapper.xml | 12 ++++++++---- 9 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 db/alter_account_frozen_add_question.sql create mode 100644 db/alter_account_transaction_add_call_id.sql diff --git a/db/alter_account_frozen_add_question.sql b/db/alter_account_frozen_add_question.sql new file mode 100644 index 0000000..0d031b3 --- /dev/null +++ b/db/alter_account_frozen_add_question.sql @@ -0,0 +1,5 @@ +-- 为 account_frozen 表添加 question 字段 +-- 用于记录用户的问题或需求 + +ALTER TABLE `account_frozen` +ADD COLUMN `question` text DEFAULT NULL COMMENT '对应回答的问题或需求' AFTER `model_name`; diff --git a/db/alter_account_transaction_add_call_id.sql b/db/alter_account_transaction_add_call_id.sql new file mode 100644 index 0000000..0517128 --- /dev/null +++ b/db/alter_account_transaction_add_call_id.sql @@ -0,0 +1,9 @@ +-- 为 account_transaction 表添加 call_id 字段 +-- 用于关联冻结单释放时的调用ID + +ALTER TABLE `account_transaction` +ADD COLUMN `call_id` varchar(100) DEFAULT NULL COMMENT '调用ID,关联冻结单' AFTER `business_type`; + +-- 添加索引以提高查询性能 +ALTER TABLE `account_transaction` +ADD INDEX `idx_call_id` (`call_id`); diff --git a/src/main/java/com/kexue/skills/entity/AccountFrozen.java b/src/main/java/com/kexue/skills/entity/AccountFrozen.java index 26463f7..cdf807c 100644 --- a/src/main/java/com/kexue/skills/entity/AccountFrozen.java +++ b/src/main/java/com/kexue/skills/entity/AccountFrozen.java @@ -38,6 +38,9 @@ public class AccountFrozen extends BaseEntity implements Serializable { @Schema(description ="模型名称") private String modelName; + @Schema(description ="对应回答的问题或需求") + private String question; + @Schema(description ="冻结金额/张数/次数/分钟") private BigDecimal frozenAmount; diff --git a/src/main/java/com/kexue/skills/entity/AccountTransaction.java b/src/main/java/com/kexue/skills/entity/AccountTransaction.java index 1aee812..a40ceb5 100644 --- a/src/main/java/com/kexue/skills/entity/AccountTransaction.java +++ b/src/main/java/com/kexue/skills/entity/AccountTransaction.java @@ -56,6 +56,9 @@ public class AccountTransaction extends BaseEntity implements Serializable { @Schema(description ="业务类型") private String businessType; + @Schema(description ="调用ID,关联冻结单") + private String callId; + @Schema(description ="交易备注") private String remark; diff --git a/src/main/java/com/kexue/skills/entity/dto/AccountFrozenDto.java b/src/main/java/com/kexue/skills/entity/dto/AccountFrozenDto.java index 03e83a9..4f34071 100644 --- a/src/main/java/com/kexue/skills/entity/dto/AccountFrozenDto.java +++ b/src/main/java/com/kexue/skills/entity/dto/AccountFrozenDto.java @@ -24,6 +24,9 @@ public class AccountFrozenDto { @Schema(description ="模型名称") private String modelName; + @Schema(description ="对应回答的问题或需求") + private String question; + @Schema(description ="冻结金额/张数/次数/分钟") private BigDecimal frozenAmount; diff --git a/src/main/java/com/kexue/skills/service/impl/AccountFrozenServiceImpl.java b/src/main/java/com/kexue/skills/service/impl/AccountFrozenServiceImpl.java index b3b8154..93103cc 100644 --- a/src/main/java/com/kexue/skills/service/impl/AccountFrozenServiceImpl.java +++ b/src/main/java/com/kexue/skills/service/impl/AccountFrozenServiceImpl.java @@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; +import java.util.Objects; /** * 账户冻结单服务实现 @@ -135,6 +136,9 @@ public class AccountFrozenServiceImpl implements AccountFrozenService { accountFrozen.setSessionId(accountFrozenDto.getSessionId()); accountFrozen.setCallId(accountFrozenDto.getCallId()); accountFrozen.setModelName(accountFrozenDto.getModelName()); + if(Objects.nonNull(accountFrozenDto.getQuestion())){ + accountFrozen.setQuestion(accountFrozenDto.getQuestion()); + } accountFrozen.setFrozenAmount(finalFrozenAmount); accountFrozen.setFrozenType(accountFrozenDto.getFrozenType()); accountFrozen.setStatus("RESERVED"); @@ -261,6 +265,13 @@ public class AccountFrozenServiceImpl implements AccountFrozenService { transaction.setBusinessType("frozen_release"); // 冻结单释放 transaction.setRemark("冻结单释放扣减: " + accountFrozen.getFrozenId()); transaction.setIsExpense(1); // 支出 + transaction.setQuestion(accountFrozen.getQuestion()); + if(Objects.nonNull(accountFrozen.getQuestion())){ + transaction.setQuestion(accountFrozen.getQuestion()); + } + if(Objects.nonNull(accountFrozen.getCallId())){ + transaction.setCallId(accountFrozen.getCallId()); // 设置调用ID + } // 如果是token消费,记录token信息 if (accountReleaseDto.getUsageInputTokens() != null && accountReleaseDto.getUsageOutputTokens() != null) { diff --git a/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java b/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java index e4e1a16..28cfd76 100644 --- a/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java @@ -1030,6 +1030,9 @@ public class SysUserServiceImpl implements SysUserService { "invite", "邀请用户注册赠送" ); + + // 给被邀请人(新用户)也赠送100积分作为邀请奖励 + // 注意:这里先不执行,等账户创建后再执行 } // 设置固定salt为666666 @@ -1073,6 +1076,18 @@ public class SysUserServiceImpl implements SysUserService { "注册赠送" ); + // 如果有邀请码,额外赠送100积分作为邀请奖励 + if (inviteCode != null && !inviteCode.isEmpty()) { + accountService.addGiftBalance( + sysUser.getUserId(), + BigDecimal.valueOf(100), + "gift_" + System.currentTimeMillis(), + null, + "invite_reward", + "通过邀请码注册赠送" + ); + } + return sysUser; } diff --git a/src/main/resources/mapper/AccountFrozenMapper.xml b/src/main/resources/mapper/AccountFrozenMapper.xml index 93c91c8..defc619 100644 --- a/src/main/resources/mapper/AccountFrozenMapper.xml +++ b/src/main/resources/mapper/AccountFrozenMapper.xml @@ -9,6 +9,7 @@ + @@ -23,7 +24,7 @@ - frozen_id, account_transaction_id, user_id, call_id, session_id, model_name, frozen_amount, + frozen_id, account_transaction_id, user_id, call_id, session_id, model_name, question, frozen_amount, frozen_type, final_amount, usage_input_tokens, usage_output_tokens, usage_total_tokens, finalize_reason, status, expire_at, create_time, update_time @@ -37,11 +38,11 @@ insert into account_frozen - (frozen_id, account_transaction_id, user_id, call_id, session_id, model_name, frozen_amount, + (frozen_id, account_transaction_id, user_id, call_id, session_id, model_name, question, frozen_amount, frozen_type, final_amount, usage_input_tokens, usage_output_tokens, usage_total_tokens, finalize_reason, status, expire_at, create_time, update_time) values - (#{frozenId}, #{accountTransactionId}, #{userId}, #{callId}, #{sessionId}, #{modelName}, #{frozenAmount}, + (#{frozenId}, #{accountTransactionId}, #{userId}, #{callId}, #{sessionId}, #{modelName}, #{question}, #{frozenAmount}, #{frozenType}, #{finalAmount}, #{usageInputTokens}, #{usageOutputTokens}, #{usageTotalTokens}, #{finalizeReason}, #{status}, #{expireAt}, #{createTime}, #{updateTime}) @@ -54,6 +55,7 @@ call_id = #{callId}, session_id = #{sessionId}, model_name = #{modelName}, + question = #{question}, frozen_amount = #{frozenAmount}, frozen_type = #{frozenType}, final_amount = #{finalAmount}, diff --git a/src/main/resources/mapper/AccountTransactionMapper.xml b/src/main/resources/mapper/AccountTransactionMapper.xml index 465bf4d..eeb7f19 100644 --- a/src/main/resources/mapper/AccountTransactionMapper.xml +++ b/src/main/resources/mapper/AccountTransactionMapper.xml @@ -15,6 +15,7 @@ + @@ -34,7 +35,7 @@ select transaction_id, user_id, user_name, transaction_type, amount, before_balance, after_balance, status, - transaction_no, pay_type, business_id, business_type, remark, is_expense, input_token, output_token, + transaction_no, pay_type, business_id, business_type, call_id, remark, is_expense, input_token, output_token, total_tokens, model_name, question, income_type, create_time, update_time, create_by, update_by, delete_flag from account_transaction @@ -82,7 +83,7 @@ select transaction_id, user_id, user_name, transaction_type, amount, before_balance, after_balance, status, - transaction_no, pay_type, business_id, business_type, remark, is_expense, input_token, output_token, + transaction_no, pay_type, business_id, business_type, call_id, remark, is_expense, input_token, output_token, total_tokens, model_name, question, income_type, create_time, update_time, create_by, update_by, delete_flag from account_transaction where user_id = #{userId}