feat: 角色协议(勾选+阅读秒数+卡点)与冻结说明按身份返回
新增协议表/签署留痕、后台与小程序 API;去掉手写依赖;支持抢单/注册/提现等卡点配置。冻结问号文案按角色字典下发。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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'),
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user