fix: 会员首次充值积分加满10分,后续充值不再加分

体验会员原仅加5分且正式会员会重复加分;改为首次充值会员(任意类型)补满至10分,此后任意会员充值不再增加积分。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-10 01:45:50 +08:00
parent 390202b9e4
commit 2a99e2ea10

View File

@@ -6,7 +6,7 @@
- formal_cishu=1duoci_fenhong 或 club 默认正式分成。
- formal_cishu>=2仅 duoci_fenhong无配置则不分。
- 体验单:固定 trial_guanshifc / trial_zuzhangfc终身仅可购 1 次。
- 积分:体验 +5正式 +5体验后或直接至 10未买过体验封顶 10
- 积分:首次充值会员(体验/正式均可)加满至 10此后任意会员充值不再加分
- 履约(回调/轮询/余额)均二次校验体验资格;分红失败回滚事务。
财务:每笔成功履约必须 czjilu.zhuangtai=3 + 收支入账record_wechat_income_once
@@ -50,8 +50,6 @@ MEMBER_FAILED_STATUS = 8
MEMBER_CANCELLED_STATUS = 2
ENTITLEMENT_REVOKED_MARKER = '权益已撤销'
MEMBER_JIFEN_CAP = 10
MEMBER_JIFEN_TRIAL_GRANT = 5
MEMBER_JIFEN_FORMAL_GRANT = 5
class MemberRechargeError(Exception):
@@ -145,6 +143,19 @@ def has_formal_member_purchase(yonghuid, huiyuan_id, club_id, exclude_dingdan_id
return False
def has_any_prior_paid_member_recharge(yonghuid, exclude_dingdan_id=None):
"""是否已有成功支付的会员充值单(任意会员类型;不含后台赠送 jine=0"""
qs = Czjilu.query.filter(
yonghuid=yonghuid,
leixing=MEMBER_LEIXING,
zhuangtai=MEMBER_PAID_STATUS,
jine__gt=0,
)
if exclude_dingdan_id:
qs = qs.exclude(dingdan_id=exclude_dingdan_id)
return qs.exists()
def _sync_trial_usage_flags(yonghuid, huiyuan_id, club_id):
"""根据 czjilu 历史回填 huiyuangoumai.has_used_trial。"""
goumai = Huiyuangoumai.query.filter(
@@ -581,7 +592,7 @@ def _apply_member_fenhong(order, huiyuan, formal_cishu=None, trial_guanshi_fc=No
def _apply_member_purchase_jifen(yonghuid, is_trial, huiyuan_id, club_id, current_dingdan_id=None):
"""
会员购积分:体验 +5正式 +5体验后或直接到 10未买过体验封顶 10
会员购积分:首次充值会员(体验/正式/任意类型)加满至 10此后不再加分
"""
try:
dashou = UserDashou.query.get(user__UserUID=yonghuid)
@@ -593,17 +604,14 @@ def _apply_member_purchase_jifen(yonghuid, is_trial, huiyuan_id, club_id, curren
if current >= MEMBER_JIFEN_CAP:
return current
if is_trial:
delta = min(MEMBER_JIFEN_TRIAL_GRANT, MEMBER_JIFEN_CAP - current)
else:
had_trial = has_paid_trial_purchase(
yonghuid, huiyuan_id, club_id, exclude_dingdan_id=current_dingdan_id,
if has_any_prior_paid_member_recharge(yonghuid, exclude_dingdan_id=current_dingdan_id):
logger.info(
'会员购积分跳过(非首次充值) yonghu=%s is_trial=%s huiyuan=%s jifen=%s',
yonghuid, is_trial, huiyuan_id, current,
)
if had_trial:
delta = min(MEMBER_JIFEN_FORMAL_GRANT, MEMBER_JIFEN_CAP - current)
else:
delta = MEMBER_JIFEN_CAP - current
return current
delta = MEMBER_JIFEN_CAP - current
if delta <= 0:
return current