feat(spec-3): complete section 3.1/3.2/3.3 activity verify settlement, role_flags, and distribution_relations
这个提交包含在:
@@ -452,6 +452,42 @@ describe('ClientFeatures (TDD 测试套件: 用户端功能闭环)', () => {
|
||||
expect(wsContent).toContain('updateCompanionProfile');
|
||||
expect(wsContent).toContain('completeOrderApi');
|
||||
});
|
||||
|
||||
it('3.1 活动 4 位核销码必须建立 act:verify 缓存索引、执行 CAS 原子防重核销,并在核销后触发发起人费用清算与付费活动二级分润', () => {
|
||||
const repoPath = path.join(serverSrcDir, 'db', 'repository.ts');
|
||||
const content = fs.readFileSync(repoPath, 'utf-8');
|
||||
|
||||
expect(content).toContain('act:verify:');
|
||||
expect(content).toContain('WHERE id = ? AND checkin_status = 0');
|
||||
expect(content).toContain('settleActivityCheckinAndReferral');
|
||||
expect(content).toContain('活动核销费用清算');
|
||||
});
|
||||
|
||||
it('3.2 双身份架构必须维护 role_flags (1:玩家, 2:大神, 3:双身份) 并在抢单接口拦截未通过实名认证的大神档案', () => {
|
||||
const mysqlPath = path.join(serverSrcDir, 'db', 'mysql.ts');
|
||||
const mysqlContent = fs.readFileSync(mysqlPath, 'utf-8');
|
||||
expect(mysqlContent).toContain('role_flags');
|
||||
|
||||
const repoPath = path.join(serverSrcDir, 'db', 'repository.ts');
|
||||
const repoContent = fs.readFileSync(repoPath, 'utf-8');
|
||||
expect(repoContent).toContain('roleFlags');
|
||||
expect(repoContent).toContain('大神档案未通过实名认证审核,无法接单');
|
||||
});
|
||||
|
||||
it('3.3 分销裂变必须建立 distribution_relations 父子终身关联表,并支持小程序扫码/带参进入自动锁粉绑定', () => {
|
||||
const mysqlPath = path.join(serverSrcDir, 'db', 'mysql.ts');
|
||||
const mysqlContent = fs.readFileSync(mysqlPath, 'utf-8');
|
||||
expect(mysqlContent).toContain('CREATE TABLE IF NOT EXISTS distribution_relations');
|
||||
|
||||
const repoPath = path.join(serverSrcDir, 'db', 'repository.ts');
|
||||
const repoContent = fs.readFileSync(repoPath, 'utf-8');
|
||||
expect(repoContent).toContain('INSERT INTO distribution_relations');
|
||||
expect(repoContent).toContain('当前账号已终身绑定上级推荐人,不可重复修改绑定');
|
||||
|
||||
const indexVuePath = path.join(uniPagesDir, 'index', 'index.vue');
|
||||
const indexContent = fs.readFileSync(indexVuePath, 'utf-8');
|
||||
expect(indexContent).toContain('PENDING_INVITER_CODE');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户