import { pick } from 'underscore'; import { BIND_PHONE_STATUS, SNS_LINK_TYPE } from '../../consts'; import { ActivityModelType } from '../../db/Activity'; import { ActivityBindPhoneRewardType } from '../../db/ActivityBindPhoneReward'; import { LinkType } from '../../db/Link'; import { UserType } from '../../db/User'; import { ActivityBase } from './activityField'; import { ActivityPublicAccountCodeType } from '../../db/ActivityPublicAccountCode'; // 数据库 interface PageDataInDb { pageIndex: number; pageName: string; type: number; rewards: string; } interface BindPhoneDataInDb { pages: PageDataInDb[]; } class PageData { pageIndex: number; pageName: string; type: number; constructor(pageData: PageDataInDb) { this.pageIndex = pageData.pageIndex; this.pageName = pageData.pageName; this.type = pageData.type; } } class WXGroupPage extends PageData { link: string = ''; // 微信群外链 qrCodeLink: string = ''; // 微信群二维码 public setLink(link: LinkType) { this.link = link.link; this.qrCodeLink = link.qrCodeLink; } } class BindPhonePage extends PageData { rewards: string; // 绑定手机后能有的奖励 status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未绑定 1-已绑定 3-已领取 constructor(pageData: PageDataInDb) { super(pageData); this.rewards = pageData.rewards; } public setBindPhoneStatus(user: UserType, data: ActivityBindPhoneRewardType) { if(user && user.channelInfo && user.channelInfo.is_phone_bind == 1) this.status = BIND_PHONE_STATUS.HAS_BIND; if(data) this.status = data.status; } } class WXPublicAccountPage extends PageData { qrCodeLink: string; // 公众号二维码 rewards: string; // 口令能有的奖励 giftCode: string; // 加密后的口令 status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未使用 1-可领取 2-已领取 constructor(pageData: PageDataInDb) { super(pageData); this.rewards = pageData.rewards; } public setLink(link: LinkType) { this.qrCodeLink = link.qrCodeLink; } public setEncodeGiftCode(giftCode: string) { this.giftCode = giftCode; } public setPlayerRecord(playerRecord: ActivityPublicAccountCodeType) { if(!playerRecord) return; this.status = playerRecord.hasReceived? BIND_PHONE_STATUS.RECEIVED: BIND_PHONE_STATUS.HAS_BIND; } public getShowResult() { return pick(this, ['pageIndex', 'pageName', 'type', 'qrCodeLink', 'rewards', 'giftCode', 'status']); } } class BBSPage extends PageData { link: string; // 论坛外链 public setLink(link: LinkType) { this.link = link.link; } } // 数据 export class BindPhoneData extends ActivityBase { wxGroup: WXGroupPage; bindPhone: BindPhonePage; wxPublicAccount: WXPublicAccountPage; bbs: BBSPage; constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { super(activityData, createTime, serverTime); this.initData(activityData.data); } public initData(data: string) { let dataObj: BindPhoneDataInDb = JSON.parse(data); for(let pageData of (dataObj?.pages||[])) { switch(pageData.type) { case SNS_LINK_TYPE.WX_GROUP: { this.wxGroup = new WXGroupPage(pageData); break; } case SNS_LINK_TYPE.BIND_PHONE: { this.bindPhone = new BindPhonePage(pageData); break; } case SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT: { this.wxPublicAccount = new WXPublicAccountPage(pageData); break; } case SNS_LINK_TYPE.BBS: { this.bbs = new BBSPage(pageData); break; } } } } public setLinks(links: LinkType[]) { for(let link of links) { switch (link.type) { case SNS_LINK_TYPE.WX_GROUP: { this.wxGroup.setLink(link); break; } case SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT: { this.wxPublicAccount.setLink(link); break; } case SNS_LINK_TYPE.BBS: { this.bbs.setLink(link); break; } } } } public getShowResult() { let pages: any[] = []; if(this.wxGroup) pages.push(this.wxGroup); if(this.bindPhone) pages.push(this.bindPhone); if(this.wxPublicAccount) pages.push(this.wxPublicAccount.getShowResult()); if(this.bbs) pages.push(this.bbs); return { ...this.getBaseKeys(), pages } } }