团购:基础接口
This commit is contained in:
174
shared/domain/activityField/groupShopField.ts
Normal file
174
shared/domain/activityField/groupShopField.ts
Normal file
@@ -0,0 +1,174 @@
|
||||
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 {
|
||||
id: number; // 唯一id
|
||||
gid: 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(id: number, data: GroupShopTimerInDb) {
|
||||
this.time = data.time;
|
||||
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 {
|
||||
id: number; // 唯一id
|
||||
gid: number; // 物品id
|
||||
count: number; // 一次购买能购买多少
|
||||
max: number; // 单人可以购买多少次
|
||||
price: number; // 无折扣单价
|
||||
discount: GroupShopDiscount[] = [];
|
||||
sum: number = 0; // 总价格
|
||||
curDiscount: GroupShopDiscount;
|
||||
hasBoughtCnt: number = 0; // 玩家购买次数
|
||||
|
||||
constructor(item: GroupShopItemInDb) {
|
||||
this.id = item.id;
|
||||
this.gid = item.gid;
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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.id, this.items.length - 1);
|
||||
if(item.timers && item.timers.length > 0) {
|
||||
for(let timer of item.timers) {
|
||||
this.timer.push(new GroupShopTimer(item.id, timer));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public findItemById(id: number) {
|
||||
let index = this.itemMap.get(id);
|
||||
return this.items[index];
|
||||
}
|
||||
|
||||
public setRecords(data: ActivityGroupShopRecType[]) {
|
||||
for(let { id, sum } of data) {
|
||||
let item = this.findItemById(id);
|
||||
if(item) item.setSum(sum);
|
||||
}
|
||||
}
|
||||
|
||||
public incAllRecord(data: ActivityGroupShopRecType) {
|
||||
if(!data) return false;
|
||||
let item = this.findItemById(data.id);
|
||||
let oldDiscountId = item.getCurDiscount().id;
|
||||
item.setSum(data.sum);
|
||||
let newDiscountId = item.getCurDiscount().id;
|
||||
return oldDiscountId != newDiscountId;
|
||||
}
|
||||
|
||||
|
||||
public setPlayerRecord(data: ActivityGroupShopUserRecType[]) {
|
||||
for(let { id, buyCnt } of data) {
|
||||
let item = this.findItemById(id);
|
||||
if(item) item.setPlayerCnt(buyCnt);
|
||||
}
|
||||
}
|
||||
public getShowResult() {
|
||||
return {
|
||||
...this.getBaseKeys(),
|
||||
items: this.items,
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user