diff --git a/jituan/services/member_recharge.py b/jituan/services/member_recharge.py index e244251..18f657b 100644 --- a/jituan/services/member_recharge.py +++ b/jituan/services/member_recharge.py @@ -6,7 +6,7 @@ - formal_cishu=1:duoci_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