feat: 角色协议(勾选+阅读秒数+卡点)与冻结说明按身份返回

新增协议表/签署留痕、后台与小程序 API;去掉手写依赖;支持抢单/注册/提现等卡点配置。冻结问号文案按角色字典下发。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-26 20:22:12 +08:00
parent 6c96eb3bcb
commit fa6e679cbe
15 changed files with 834 additions and 35 deletions

View File

@@ -615,3 +615,60 @@ class FundRiskStatDaily(QModel):
indexes = [
models.Index(fields=['club_id', 'role', 'day'], name='idx_frsd_club_role_day'),
]
class ClubRoleAgreement(QModel):
"""俱乐部×身份用户协议(当前生效配置,发布时 version+1"""
ROLE_CHOICES = (
('dashou', '打手'),
('guanshi', '管事'),
('zuzhang', '组长'),
)
club_id = models.CharField(max_length=16, db_index=True)
role = models.CharField(max_length=16, choices=ROLE_CHOICES, db_index=True)
enabled = models.BooleanField(default=False, verbose_name='是否要求签署')
title = models.CharField(max_length=128, blank=True, default='', verbose_name='协议标题')
content_text = models.TextField(blank=True, default='', verbose_name='协议正文')
images_json = models.JSONField(default=list, blank=True, verbose_name='说明图片URL列表')
# 勾选前强制停留秒数0=可立即勾选
read_seconds = models.PositiveIntegerField(default=2, verbose_name='阅读秒数')
# 卡点开关qiangdan/register/tixian/invite按角色默认见服务层
gate_config = models.JSONField(default=dict, blank=True, verbose_name='签署卡点配置')
version = models.PositiveIntegerField(default=0, verbose_name='已发布版本号')
published_at = models.DateTimeField(null=True, blank=True)
updated_by = models.CharField(max_length=32, blank=True, default='')
CreateTime = models.DateTimeField(auto_now_add=True)
UpdateTime = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'club_role_agreement'
verbose_name = '角色协议'
unique_together = [['club_id', 'role']]
class ClubRoleAgreementSign(QModel):
"""用户签署某俱乐部某身份某版本协议的留痕(勾选确认,无手写图)。"""
club_id = models.CharField(max_length=16, db_index=True)
user_id = models.CharField(max_length=16, db_index=True, verbose_name='UserUID')
role = models.CharField(max_length=16, db_index=True)
agreement_id = models.BigIntegerField(db_index=True, default=0)
version = models.PositiveIntegerField(db_index=True)
title_snapshot = models.CharField(max_length=128, blank=True, default='')
content_snapshot = models.TextField(blank=True, default='')
images_snapshot = models.JSONField(default=list, blank=True)
# 兼容旧字段,新签署固定留空
sign_image_url = models.CharField(max_length=512, blank=True, default='')
client_meta = models.JSONField(default=dict, blank=True)
signed_at = models.DateTimeField(auto_now_add=True, db_index=True)
CreateTime = models.DateTimeField(auto_now_add=True)
UpdateTime = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'club_role_agreement_sign'
verbose_name = '角色协议签署记录'
unique_together = [['club_id', 'user_id', 'role', 'version']]
indexes = [
models.Index(fields=['user_id', 'role', 'version'], name='idx_cras_user_role_ver'),
models.Index(fields=['club_id', 'role', 'signed_at'], name='idx_cras_club_role_t'),
]