优化积分流水写入为昵称优先并覆盖打劫/保释场景

This commit is contained in:
liuwei
2026-04-20 11:44:26 +08:00
parent 00f874665d
commit 64e7e82712
2 changed files with 67 additions and 20 deletions

View File

@@ -321,8 +321,16 @@ class PointsDBOperator(BaseDBOperator):
self.LOG.error(f"扣除用户积分失败: {e}")
return False, {"error": str(e)}
def transfer_points(self, from_user_id: str, to_user_id: str, group_id: str,
points: int, description: str = None) -> Tuple[bool, Dict]:
def transfer_points(
self,
from_user_id: str,
to_user_id: str,
group_id: str,
points: int,
description: str = None,
from_user_name: str = None,
to_user_name: str = None,
) -> Tuple[bool, Dict]:
"""
转移积分从一个用户到另一个用户
@@ -332,6 +340,8 @@ class PointsDBOperator(BaseDBOperator):
group_id: 群组ID
points: 积分数量
description: 描述
from_user_name: 转出用户展示名(可选,优先用于流水描述)
to_user_name: 转入用户展示名(可选,优先用于流水描述)
Returns:
(成功标志, 结果信息)
@@ -340,10 +350,15 @@ class PointsDBOperator(BaseDBOperator):
return False, {"error": "积分必须为正数"}
try:
# 流水描述统一使用“昵称优先ID兜底”策略
# 1. 业务层可显式传入昵称;
# 2. 未传时回落到 user_id确保兼容旧调用方。
from_display_name = str(from_user_name or from_user_id)
to_display_name = str(to_user_name or to_user_id)
# 先扣除转出用户积分
success, result = self.deduct_points(
from_user_id, group_id, points,
PointSource.TRADE, f"转账给用户 {to_user_id}: {description}"
PointSource.TRADE, f"转账给用户 {to_display_name}: {description}"
)
if not success:
@@ -352,14 +367,14 @@ class PointsDBOperator(BaseDBOperator):
# 再增加转入用户积分
success, to_result = self.add_points(
to_user_id, group_id, points,
PointSource.TRADE, f"收到用户 {from_user_id} 的转账: {description}"
PointSource.TRADE, f"收到用户 {from_display_name} 的转账: {description}"
)
if not success:
# 如果增加失败,回滚扣除操作
self.add_points(
from_user_id, group_id, points,
PointSource.TRADE, f"转账失败退回: {description}"
PointSource.TRADE, f"转账失败退回: {description}",
)
return False, to_result
@@ -634,7 +649,14 @@ class PointsDBOperator(BaseDBOperator):
self.LOG.error(f"检查用户在押状态失败: {e}")
return None
def bailout_user(self, prisoner_id: str, bailout_user_id: str, group_id: str) -> Tuple[bool, str]:
def bailout_user(
self,
prisoner_id: str,
bailout_user_id: str,
group_id: str,
prisoner_name: str = None,
bailout_user_name: str = None,
) -> Tuple[bool, str]:
"""保释用户
Returns:
(bool, str): (是否成功, 错误信息)
@@ -647,7 +669,13 @@ class PointsDBOperator(BaseDBOperator):
# 扣除保释金
success, result = self.transfer_points(
bailout_user_id, "SYSTEM", group_id, 30, "保释金"
bailout_user_id,
"SYSTEM",
group_id,
30,
f"{str(prisoner_name or prisoner_id)}支付保释金",
from_user_name=bailout_user_name,
to_user_name="系统",
)
if not success:
return False, result.get("error", "保释失败")
@@ -662,4 +690,4 @@ class PointsDBOperator(BaseDBOperator):
return True, "保释成功"
except Exception as e:
self.LOG.error(f"保释用户失败: {e}")
return False, f"保释失败: {str(e)}"
return False, f"保释失败: {str(e)}"