Files
ZYZ/shared/domain/activityField/groupShopField.ts
2022-10-12 14:33:19 +08:00

175 lines
5.3 KiB
TypeScript

import { ActivityModelType } from '../../db/Activity';
import { ActivityGroupShopRecType } from '../../db/ActivityGroupShopRec';
import { ActivityGroupShopUserRecType } from '../../db/ActivityGroupShopUserRec';
import { ActivityBase } from './activityField';
// 数据库
interface GroupShopTimerInDb {
time: number; // 活动开始之后的时间
sum: number; // 如果次数不足sum次则强行设成sum次
}
interface GroupShopDiscountInDb {
id: number; // 折扣id
sum: number; // 累计购买次数
discount: number; // 显示折扣
price: number; // 真实价格
}
interface GroupShopItemInDb {
itemId: number; // 唯一id
id: number; // 物品id
count: number; // 一次购买能购买多少
max: number; // 单人可以购买多少次
price: number; // 无折扣单价
discount: GroupShopDiscountInDb[];
timers: GroupShopTimerInDb[]; // 定时器
}
interface GroupShopInDb {
items: GroupShopItemInDb[];
}
// 数据
class GroupShopTimer {
time: number; // 时间戳
itemId: number; // items唯一id
sum: number; // 如果次数不足sum次则强行设成sum次
constructor(beginTime: number, id: number, data: GroupShopTimerInDb) {
this.time = beginTime + data.time * 60 * 60 * 1000;
this.sum = data.sum;
this.itemId = id;
}
}
export class GroupShopDiscount {
id: number = 0; // 折扣唯一id
sum: number = 0; // 累计购买次数
discount: number = 0; // 显示折扣
price: number = 0; // 真实价格
constructor(price: number, data?: GroupShopDiscountInDb) {
if(data) {
this.id = data.id;
this.sum = data.sum;
this.discount = data.discount;
this.price = data.price;
} else {
this.price = price;
}
}
}
class GroupShopItem {
itemId: number; // 唯一id
id: number; // 物品id
count: number; // 一次购买能购买多少
max: number; // 单人可以购买多少次
price: number; // 无折扣单价
discount: GroupShopDiscount[] = [];
sum: number = 0; // 总价格
curDiscount: GroupShopDiscount;
hasBoughtCnt: number = 0; // 玩家购买次数
constructor(item: GroupShopItemInDb) {
this.itemId = item.itemId;
this.id = item.id;
this.count = item.count;
this.max = item.max;
this.price = item.price;
if(item.discount && item.discount.length > 0) {
for(let discount of item.discount) {
this.discount.push(new GroupShopDiscount(item.price, discount));
if(!this.curDiscount) this.curDiscount = new GroupShopDiscount(item.price, discount);
}
}
}
setSum(sum: number) {
this.sum = sum;
this.checkDiscountBySum(sum);
}
checkDiscountBySum(sum: number) {
for(let obj of this.discount) {
if(obj.sum > sum) break;
this.curDiscount = new GroupShopDiscount(this.price, obj);
}
}
setPlayerCnt(cnt: number) {
this.hasBoughtCnt = cnt;
}
checkBuyCnt(buyCnt: number) {
return this.hasBoughtCnt + buyCnt <= this.max;
}
getCurDiscount() {
return this.curDiscount? this.curDiscount: new GroupShopDiscount(this.price);
}
}
// 团购活动数据
export class GroupShopData extends ActivityBase {
items: GroupShopItem[] = [];
timer: GroupShopTimer[] = [];
private itemMap: Map<number, number> = new Map(); // id => index
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
super(activityData, createTime, serverTime);
this.initData(activityData.data)
}
public initData(data: string) {
let dataObj: GroupShopInDb = JSON.parse(data);
if(!dataObj.items || dataObj.items.length <= 0) return;
for(let item of dataObj.items) {
this.items.push(new GroupShopItem(item));
this.itemMap.set(item.itemId, this.items.length - 1);
if(item.timers && item.timers.length > 0) {
for(let timer of item.timers) {
this.timer.push(new GroupShopTimer(this.beginTime, item.itemId, timer));
}
}
}
}
public findItemById(itemId: number) {
let index = this.itemMap.get(itemId);
return this.items[index];
}
public setRecords(data: ActivityGroupShopRecType[]) {
for(let { itemId, sum } of data) {
let item = this.findItemById(itemId);
if(item) item.setSum(sum);
}
}
public incAllRecord(data: ActivityGroupShopRecType) {
if(!data) return false;
let item = this.findItemById(data.itemId);
let oldDiscountId = item.getCurDiscount().id;
item.setSum(data.sum);
let newDiscountId = item.getCurDiscount().id;
return oldDiscountId != newDiscountId;
}
public setPlayerRecord(data: ActivityGroupShopUserRecType[]) {
for(let { itemId, buyCnt } of data) {
let item = this.findItemById(itemId);
if(item) item.setPlayerCnt(buyCnt);
}
}
public getShowResult() {
return {
...this.getBaseKeys(),
items: this.items,
}
}
}