Files
ZYZ/shared/domain/activityField/bindPhoneField.ts
2023-04-12 20:47:35 +08:00

158 lines
4.8 KiB
TypeScript

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 {
iosLink: string; // 论坛外链
androidLink: string; // 安卓外链
public setLink(link: LinkType) {
this.iosLink = link.link;
this.androidLink = link.androidLink;
}
}
// 数据
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
}
}
}