diff --git a/game-server/app/servers/activity/handler/thirtyDaysHandler.ts b/game-server/app/servers/activity/handler/thirtyDaysHandler.ts new file mode 100644 index 000000000..5dc95fbb7 --- /dev/null +++ b/game-server/app/servers/activity/handler/thirtyDaysHandler.ts @@ -0,0 +1,121 @@ +import { Application, BackendSession } from 'pinus'; +import { resResult } from '../../../pubUtils/util'; +import { STATUS, ACTIVITY_RESOURCES_TYPE, ACTIVITY_TYPE } from '../../../consts'; +import { getPlayerThirtyDaysData, thirtyDaysActivity } from '../../../services/thirtyDaysService'; +import { ThirtyDaysItem, ThirtyDaysPointItem } from '../../../domain/activityField/thirtyDaysField'; +import { addItems, createHeroes } from '../../../services/rewardService'; +import { ActivityThirtyDaysModel } from '../../../db/ActivityThirtyDays'; +import { ActivityThirtyDaysPointRewardModel } from '../../../db/ActivityThirtyDaysPointReward'; + +export default function (app: Application) { + return new thirtyDaysHandler(app); +} + +export class thirtyDaysHandler { + constructor(private app: Application) { + } + + /************************30天大目标****************************/ + + /** + * @description 获取30目标活动数据 + * @param {{ }} msg + * @param {BackendSession} session + * @memberof thirtyDaysHandler + */ + async getThirtyDaysActivity(msg: {}, session: BackendSession) { + const { } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + + let playerData = await thirtyDaysActivity(ACTIVITY_TYPE.THIRTY_DAYS, serverId, roleId); + + if (!playerData) return resResult(STATUS.ACTIVITY_THIRTY_DAYS_END); + + return resResult(STATUS.SUCCESS, playerData); + } + + /** + * @description 获取30天完成任务的奖励 + * @param {{ activityId: number, pageIndex: number, cellIndex: number}} msg + * @param {BackendSession} session + * @memberof thirtyDaysHandler + */ + async getThirtyDaysCellReward(msg: { activityId: number, pageIndex: number, cellIndex: number }, session: BackendSession) { + const { activityId, pageIndex, cellIndex } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + const funcs: number[] = session.get('funcs'); + + let playerData = await getPlayerThirtyDaysData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + let thirtyDaysItemData: ThirtyDaysItem = playerData.findThirtyDaysItem(pageIndex, cellIndex); + if (!thirtyDaysItemData) { + return resResult(STATUS.ACTIVITY_DATA_ERROR); + } + if (!thirtyDaysItemData.isComplete) {//未完成任务 + return resResult(STATUS.ACTIVITY_TASK_UNCOMPLETED); + } + if (thirtyDaysItemData.isReceive) {//已经领取过 + return resResult(STATUS.ACTIVITY_REWARDED); + } + + await ActivityThirtyDaysModel.addRecord(activityId, roleId, pageIndex, cellIndex); + let reward = thirtyDaysItemData.goodReward(); + let goods = await addItems(roleId, roleName, sid, reward); + let heroReward = thirtyDaysItemData.heroReward(); + let addHeros = []; + if (heroReward.length > 0) { + let heroResult = await createHeroes(roleId, roleName, sid, serverId, funcs, heroReward); + goods = goods.concat(heroResult.goods) + addHeros = addHeros.concat(heroResult.heroes); + } + + return resResult(STATUS.SUCCESS, { goods, addHeros }); + } + + /** + * @description 点数兑换奖励 + * @param {{ activityId: number, cellIndex: number}} msg + * @param {BackendSession} session + * @memberof thirtyDaysHandler + */ + async getThirtyDaysPointReward(msg: { activityId: number, cellIndex: number }, session: BackendSession) { + const { activityId, cellIndex } = msg; + const roleId = session.get('roleId'); + const serverId = session.get('serverId'); + const sid = session.get('sid'); + const roleName = session.get('roleName'); + const funcs: number[] = session.get('funcs'); + + let playerData = await getPlayerThirtyDaysData(activityId, serverId, roleId) + if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); + + let thirtyDaysPointItemData: ThirtyDaysPointItem = playerData.findThirtyDaysPointItem(cellIndex); + if (!thirtyDaysPointItemData) { + return resResult(STATUS.ACTIVITY_DATA_ERROR); + } + if (playerData.totalPoint - playerData.consumePoint < thirtyDaysPointItemData.consumePoint) {//点数不足 + return resResult(STATUS.ACTIVITY_NO_POINT); + } + if (thirtyDaysPointItemData.isReceive) {//已经领取过 + return resResult(STATUS.ACTIVITY_REWARDED); + } + + await ActivityThirtyDaysPointRewardModel.addRecord(activityId, roleId, cellIndex); + let reward = thirtyDaysPointItemData.goodReward(); + let goods = await addItems(roleId, roleName, sid, reward); + let heroReward = thirtyDaysPointItemData.heroReward(); + let addHeros = []; + if (heroReward.length > 0) { + let heroResult = await createHeroes(roleId, roleName, sid, serverId, funcs, heroReward); + goods = goods.concat(heroResult.goods) + addHeros = addHeros.concat(heroResult.heroes); + } + + return resResult(STATUS.SUCCESS, { goods, addHeros }); + } +} diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 099ddc533..d25c4684c 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -15,6 +15,7 @@ import { calculatetopLineup } from '../../../pubUtils/playerCe'; import { PvpDefenseModel } from '../../../db/PvpDefense'; import { Attribute } from '../../../domain/roleField/attribute'; import { checkTaskWithHero, checkTask } from '../../../services/taskService'; +import { accomplishTask } from '../../../pubUtils/taskUtil'; export default function (app: Application) { return new HeroHandler(app); @@ -255,6 +256,9 @@ export class HeroHandler { // 任务 await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.HERO_STAR_UP, hero); await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.HERO_QUALITY_STAR_UP, hero); + //成长任务 + let dicHero = gameData.hero.get(hero.hid); + await accomplishTask(roleId, TASK_TYPE.HERO_QUALITY_STAR_UP, 1, { quality: dicHero.quality, star: hero.star }); } const curHero = { diff --git a/game-server/app/services/thirtyDaysService.ts b/game-server/app/services/thirtyDaysService.ts new file mode 100644 index 000000000..d5762264a --- /dev/null +++ b/game-server/app/services/thirtyDaysService.ts @@ -0,0 +1,71 @@ +import { ACTIVITY_TYPE, TASK_TYPE } from '../consts'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; +import { ActivityThirtyDaysModel, ActivityThirtyDaysModelType } from '../db/ActivityThirtyDays'; +import { ActivityBuyRecordsModel, ActivityBuyRecordsModelType } from '../db/ActivityBuyRecords'; +import { RoleModel } from '../db/Role'; +import { ThirtyDaysData, ThirtyDaysItem } from '../domain/activityField/thirtyDaysField'; +import { ActivityThirtyDaysPointRewardModel, ActivityThirtyDaysPointRewardModelType } from '../db/ActivityThirtyDaysPointReward'; + +/** + * 获取活动数据 + * + * @param {number} serverId 区Id + * @param {number} type 活动类型 ACTIVITY_TYPE + * @param {string} roleId 角色Id + * + */ + +export async function thirtyDaysActivity(type: number, serverId: number, roleId: string) { + let activityArray: ActivityModelType[] = await ActivityModel.findActivityByType(type, true) + activityArray = activityArray.sort((a, b) => { + return a.acvitityId - b.acvitityId + }); + for (let i = 0; i < activityArray.length; i++) { + let activityData = activityArray[i]; + let playerData = await getPlayerThirtyDaysData(activityData.acvitityId, serverId, roleId); + if (!playerData.isComplete()) { + return playerData; + } + } + + return null +} + +/** + * 玩家活动数据 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function getPlayerThirtyDaysData(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(activityId, roleId); + let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId); + + let playerData = new ThirtyDaysData(activityData); + playerData.setPlayerRecords(playerRecords); + playerData.setPlayerPointRecords(playerPointRecords); + return playerData; +} + +/** + * 活动任务添加统计次数 + * + * @param {number} serverId 区Id + * @param {number} activityId 活动Id + * @param {string} roleId 角色Id + * + */ +export async function addPlayerThirtyDaysTask(activityId: number, serverId: number, roleId: string) { + let activityData: ActivityModelType = await ActivityModel.findActivity(activityId, true); + let playerRecords: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.findData(activityId, roleId); + let playerPointRecords: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.findData(activityId, roleId); + + let playerData = new ThirtyDaysData(activityData); + playerData.setPlayerRecords(playerRecords); + playerData.setPlayerPointRecords(playerPointRecords); + return playerData; +} + diff --git a/shared/consts/constModules/activityConst.ts b/shared/consts/constModules/activityConst.ts index c33aa8e14..1bcb1ee9f 100644 --- a/shared/consts/constModules/activityConst.ts +++ b/shared/consts/constModules/activityConst.ts @@ -16,6 +16,7 @@ export enum ACTIVITY_TYPE { GROWTH_FUND_TOWER_VIP = 9, // 镇念塔成长基金(高阶) GROWTH_FUND_MAIN_ELITE = 10, // 精英成长基金 GROWTH_FUND_MAIN_ELITE_VIP = 11, // 精英成长基金(高阶) + THIRTY_DAYS = 12, // 30日目标活动 } /** diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 9f02bc91f..fcca55f25 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -337,7 +337,7 @@ export const STATUS = { ACTIVITY_MISSING: { code: 50000, simStr: '活动丢失' }, ACTIVITY_DATA_ERROR: { code: 50001, simStr: '数据错误' }, ACTIVITY_TASK_UNCOMPLETED: { code: 50002, simStr: '任务还未完成' }, - ACTIVITY_NO_POINT: { code: 50003, simStr: '奖章不足' }, + ACTIVITY_NO_POINT: { code: 50003, simStr: '积分不足' }, ACTIVITY_REWARDED: { code: 50004, simStr: '已经领取过' }, ACTIVITY_TIME_ERROR: { code: 50005, simStr: '时间错误' }, ACTIVITY_MAX_COUNT: { code: 50006, simStr: '已经到最大次数' }, @@ -347,7 +347,8 @@ export const STATUS = { ACTIVITY_DAY_INDEX_OVER: { code: 50010, simStr: '心急吃不了热豆腐' }, ACTIVITY_EXPIRE: { code: 50011, simStr: '活动到期,刷新' }, ACTIVITY_GROWTH_FUND_END: { code: 50012, simStr: '成长基金活动结束' }, - ACTIVITY_NEED_BUY: { code: 50012, simStr: '成长基金需要购买' }, + ACTIVITY_NEED_BUY: { code: 50013, simStr: '成长基金需要购买' }, + ACTIVITY_THIRTY_DAYS_END: { code: 50014, simStr: '30日活动结束' }, // GM后台相关状态 60000 - 69999 GM_ERR_PASSWORD: { code: 60001, simStr: '账号或密码错误' }, GM_MISS_API: { code: 60002, simStr: '未找到该接口' }, diff --git a/shared/db/ActivityThirtyDays.ts b/shared/db/ActivityThirtyDays.ts new file mode 100644 index 000000000..f22b961a8 --- /dev/null +++ b/shared/db/ActivityThirtyDays.ts @@ -0,0 +1,74 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 30天目标活动 +*/ +@index({ roleId: 1 }) + +export default class ActivityThirtyDays extends BaseModel { + @prop({ required: true }) + acvitityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + pageIndex: number; // 第几页 + @prop({ required: true }) + cellIndex: number; // 第*页的第几个奖励 + @prop({ required: true }) + type: number; // 任务类型 + @prop({ required: true }) + totalCount: number; // 累计达成次数 + @prop({ required: true }) + isReceive: boolean; // 是否领取过奖励 + + + //添加领取记录 + public static async addRecord(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number, lean = true) { + let result: ActivityThirtyDaysModelType = await ActivityThirtyDaysModel.findOneAndUpdate({ roleId, acvitityId, pageIndex, cellIndex }, + { $set: { isReceive: true } }, { upsert: true, new: true }).lean(lean); + return result; + } + + //根据活动统计完成任务次数 + public static async addTaskCount(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number, type: number, addCount: number, lean = true) { + let result: ActivityThirtyDaysModelType = await ActivityThirtyDaysModel.findOneAndUpdate({ roleId, acvitityId, pageIndex, cellIndex, type }, + { $inc: { totalCount: addCount } }, { upsert: true, new: true }).lean(lean); + return result; + } + + //根据活动统计完成任务次数 + public static async setTaskCount(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number, type: number, count: number, lean = true) { + let result: ActivityThirtyDaysModelType = await ActivityThirtyDaysModel.findOneAndUpdate({ roleId, acvitityId, pageIndex, cellIndex, type }, + { $set: { totalCount: count } }, { upsert: true, new: true }).lean(lean); + return result; + } + + //根据活动id查询活动数据 + public static async findData(acvitityId: number, roleId: string, lean = true) { + let result: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.find({ roleId, acvitityId }).lean(lean); + return result; + } + + //查询第几页的活动数据 + public static async findDataBypageIndex(acvitityId: number, roleId: string, pageIndex: number, lean = true) { + let result: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.find({ roleId, acvitityId, pageIndex }).lean(lean); + return result; + } + + //查询第*页的某个的活动数据 + public static async findDataByCellIndex(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number, lean = true) { + let result: ActivityThirtyDaysModelType[] = await ActivityThirtyDaysModel.find({ roleId, acvitityId, pageIndex, cellIndex }).lean(lean); + return result; + } + + //删除活动领取记录 + public static async deleteActivity(acvitityId: number, roleId: string, pageIndex: number, cellIndex: number) { + await ActivityThirtyDaysModel.deleteMany({ roleId, acvitityId, pageIndex, cellIndex }); + } +} + +export const ActivityThirtyDaysModel = getModelForClass(ActivityThirtyDays); + +export interface ActivityThirtyDaysModelType extends Pick, keyof ActivityThirtyDays> { } +export type ActivityThirtyDaysModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/db/ActivityThirtyDaysPointReward.ts b/shared/db/ActivityThirtyDaysPointReward.ts new file mode 100644 index 000000000..a1df419f5 --- /dev/null +++ b/shared/db/ActivityThirtyDaysPointReward.ts @@ -0,0 +1,48 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; + +/** + * 30天目标活动-点数兑换奖励记录 +*/ +@index({ roleId: 1 }) + +export default class ActivityThirtyDaysPointReward extends BaseModel { + @prop({ required: true }) + acvitityId: number; // 活动Id + @prop({ required: true }) + roleId: string; // 用户Id + @prop({ required: true }) + cellIndex: number; // 第几个奖励 + @prop({ required: true }) + isReceive: boolean; // 是否领取过奖励 + + + //添加领取记录 + public static async addRecord(acvitityId: number, roleId: string, cellIndex: number, lean = true) { + let result: ActivityThirtyDaysPointRewardModelType = await ActivityThirtyDaysPointRewardModel.findOneAndUpdate({ roleId, acvitityId, cellIndex }, + { $set: { isReceive: true } }, { upsert: true, new: true }).lean(lean); + return result; + } + + //根据活动id查询活动数据 + public static async findData(acvitityId: number, roleId: string, lean = true) { + let result: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.find({ roleId, acvitityId }).lean(lean); + return result; + } + + //第几个活动数据 + public static async findDataByCellIndex(acvitityId: number, roleId: string, cellIndex: number, lean = true) { + let result: ActivityThirtyDaysPointRewardModelType[] = await ActivityThirtyDaysPointRewardModel.find({ roleId, acvitityId, cellIndex }).lean(lean); + return result; + } + + //删除活动领取记录 + public static async deleteActivity(acvitityId: number, roleId: string, cellIndex: number) { + await ActivityThirtyDaysPointRewardModel.deleteMany({ roleId, acvitityId, cellIndex }); + } +} + +export const ActivityThirtyDaysPointRewardModel = getModelForClass(ActivityThirtyDaysPointReward); + +export interface ActivityThirtyDaysPointRewardModelType extends Pick, keyof ActivityThirtyDaysPointReward> { } +export type ActivityThirtyDaysPointRewardModelTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/domain/activityField/thirtyDaysField.ts b/shared/domain/activityField/thirtyDaysField.ts new file mode 100644 index 000000000..6bb5659a1 --- /dev/null +++ b/shared/domain/activityField/thirtyDaysField.ts @@ -0,0 +1,217 @@ +import { TASK_TYPE, ACTIVITY_RESOURCES_TYPE, ACTIVITY_TYPE } from '../../consts'; +import { ActivityModelType } from '../../db/Activity'; +import { ActivityThirtyDaysModelType } from '../../db/ActivityThirtyDays'; +import { ActivityThirtyDaysPointRewardModelType } from '../../db/ActivityThirtyDaysPointReward'; +import { RewardInter } from '../../pubUtils/interface'; +import { parseGoodStrWithType, parseHeroStrWithType, splitString } from '../../pubUtils/util'; +import { CreateHeroParam } from '../roleField/hero'; +import { ActivityBase } from './activityField'; + +// 30天目标每个点兑换奖励的数据 +export class ThirtyDaysPointItem { + cellIndex: number; // 第几个,从1开始 + consumePoint: number; //消费点数 + reward: string; //任务奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + expiredReward: string; //过期任务奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + + isReceive: boolean = false; //是否领取过奖励 + + + constructor(data: any) { + this.cellIndex = data.cellIndex; + this.consumePoint = data.consumePoint; + this.reward = data.reward; + this.expiredReward = data.expiredReward; + + } + + public heroReward(): CreateHeroParam[] { + let rewardArray = []; + let rewardData = this.reward.split('|').filter(obj => { return obj && obj != '' }); + for (let objStr of rewardData) { + let reward = parseHeroStrWithType(objStr); + rewardArray.push(reward); + } + return rewardArray.filter(obj => { return obj && obj.type == ACTIVITY_RESOURCES_TYPE.HERO }) + } + + public goodReward(): RewardInter[] { + let rewardArray = []; + let rewardData = this.reward.split('|').filter(obj => { return obj && obj != '' }); + for (let objStr of rewardData) { + let reward = parseGoodStrWithType(objStr); + rewardArray.push(reward); + } + return rewardArray.filter(obj => { return obj && obj.type == ACTIVITY_RESOURCES_TYPE.GOODS }) + } + +} + +// 30天目标每个奖励的数据 +export class ThirtyDaysItem { + pageIndex: number; // 第几页,从1开始 + cellIndex: number; // 第几个,从1开始 + name: string; //名称 + taskType: number; // 任务类型 dic_zyz_taskType.json + taskParam: string; //任务数据 dic_zyz_taskType.json + taskParamArray: Array; //任务数据 dic_zyz_taskType.json + reward: string; //任务奖励,格式:1&3&1(类型&id&数量) 类型定义:1.英雄,2.物品 + point: number; // 任务达成获得的奖励点,只在当前活动中有用,虚拟 + + + isComplete: boolean = false; //是否完成任务 + isReceive: boolean = false; //是否领取过奖励 + + + constructor(data: any, pageIndex: number) { + this.pageIndex = pageIndex; + this.cellIndex = data.cellIndex; + this.name = data.name; + this.taskType = data.taskType; + this.taskParam = data.taskParam; + this.reward = data.reward; + this.point = data.point; + + this.taskParamArray = splitString(data.taskParam, '&') + } + + public heroReward(): CreateHeroParam[] { + let rewardArray = []; + let rewardData = this.reward.split('|').filter(obj => { return obj && obj != '' }); + for (let objStr of rewardData) { + let reward = parseHeroStrWithType(objStr); + rewardArray.push(reward); + } + return rewardArray.filter(obj => { return obj && obj.type == ACTIVITY_RESOURCES_TYPE.HERO }) + } + + public goodReward(): RewardInter[] { + let rewardArray = []; + let rewardData = this.reward.split('|').filter(obj => { return obj && obj != '' }); + for (let objStr of rewardData) { + let reward = parseGoodStrWithType(objStr); + rewardArray.push(reward); + } + return rewardArray.filter(obj => { return obj && obj.type == ACTIVITY_RESOURCES_TYPE.GOODS }) + } + + public canReceive(): boolean { + return !this.isReceive; + } +} + +// 30天目标每个标签页的数据 +export class ThirtyDaysPage { + pageIndex: number; // 第几页,从1开始 + name: string; //名称 + item: Array; //ThirtyDaysItem每项奖励和任务内容 + constructor(data: any) { + this.pageIndex = data.pageIndex; + this.name = data.name; + this.item = []; + for (let obj of data.item) { + this.item.push(new ThirtyDaysItem(obj, data.pageIndex)); + } + } +} + +// 30天任务活动数据 +export class ThirtyDaysData extends ActivityBase { + name: string = '';//活动名称 + days: number = 0;//活动周期天数 + list: Array = [];//任务完成奖励 + pointRewardList: Array = [];//点数兑换奖励 + totalPoint: number = 0;//总共点数 + consumePoint: number = 0;//消耗掉的点数 + + public findTaskByType(type: number) { + let task = []; + for (let i = 0; i < this.list.length; i++) { + let items = this.list[i].item; + for (let itemData of items) { + if (itemData.taskType == type) { + task.push(itemData); + } + } + } + return task; + } + + //全部领取完成 + public isComplete() { + for (let i = 0; i < this.list.length; i++) { + let items = this.list[i].item; + for (let itemData of items) { + if (!itemData.isReceive) { + return false + } + } + } + return true; + } + + //点数兑换的奖励内容 + public findThirtyDaysPointItem(cellIndex: number): ThirtyDaysPointItem { + let index = this.pointRewardList.findIndex(obj => { return obj && obj.cellIndex == cellIndex }) + return (index != -1) ? this.pointRewardList[index] : null; + } + + //完成的任务奖励内容 + public findThirtyDaysItem(pageIndex: number, cellIndex: number): ThirtyDaysItem { + let listIndex = this.list.findIndex(obj => { return obj && obj.pageIndex == pageIndex }); + if (listIndex != -1) { + let itemIndex = this.list[listIndex].item.findIndex(obj => { return obj && obj.cellIndex == cellIndex }); + if (itemIndex != -1) { + return this.list[listIndex].item[itemIndex]; + } + } + return null; + } + + //解析玩家点数兑换领取记录 + public setPlayerPointRecords(data: ActivityThirtyDaysPointRewardModelType[]) { + this.consumePoint = 0; + for (let obj of this.pointRewardList) { + let index = data.findIndex(record => { return obj.cellIndex == record.cellIndex }) + if (index != -1) { + this.consumePoint += obj.consumePoint; + obj.isReceive = data[index].isReceive; + } + } + } + + //解析玩家任务领取记录 + public setPlayerRecords(data: ActivityThirtyDaysModelType[]) { + this.totalPoint = 0; + for (let record of data) { + let itemData = this.findThirtyDaysItem(record.pageIndex, record.cellIndex) + if (itemData) { + this.totalPoint += itemData.point; + itemData.isReceive = record.isReceive; + itemData.isComplete = record.totalCount >= itemData.taskParamArray[0]; + } + } + } + + + public initData(data: string) { + let dataObj = JSON.parse(data); + this.name = dataObj.name; + this.days = dataObj.days; + + let pointRewardData = dataObj.pointRewardData; + for (let obj of pointRewardData) { + this.pointRewardList.push(new ThirtyDaysPointItem(obj)) + } + + let arr = dataObj.data; + for (let obj of arr) { + this.list.push(new ThirtyDaysPage(obj)) + } + } + + constructor(activityData: ActivityModelType) { + super(activityData) + this.initData(activityData.data) + } +} \ No newline at end of file diff --git a/shared/pubUtils/taskUtil.ts b/shared/pubUtils/taskUtil.ts index 8a01ba86d..28eba4097 100644 --- a/shared/pubUtils/taskUtil.ts +++ b/shared/pubUtils/taskUtil.ts @@ -15,6 +15,8 @@ import { ActivityModel, ActivityModelType } from '../db/Activity'; import { ACTIVITY_TYPE } from '../consts/constModules/activityConst'; import { ActivityGrowthModel } from '../db/ActivityGrowth'; import { ActivityDailyChallengesModel } from '../db/ActivityDailyChallenges'; +import { ThirtyDaysData } from '../domain/activityField/thirtyDaysField'; +import { ActivityThirtyDaysModel } from '../db/ActivityThirtyDays'; @@ -423,7 +425,7 @@ export async function checkTaskRec(roleId: string, type: number, group: number, break; } console.log('****isMatch', isMatch, checkHistory, type, taskType, group, count) - if(param.isDebug) { + if (param.isDebug) { isMatch = true; } @@ -514,6 +516,22 @@ export async function accomplishTask(roleId: string, taskType: TASK_TYPE, count: } } + //30天任务统计 + allActivity = await ActivityModel.findOpenActivityByType(ACTIVITY_TYPE.THIRTY_DAYS, new Date()); + for (let activity of allActivity) { + let thirtyDaysActivity = new ThirtyDaysData(activity); + let taskArray = thirtyDaysActivity.findTaskByType(taskType); + for (let task of taskArray) { + let addCount = isComplete(roleId, task.taskType, task.taskParam, count, parma); + if (addCount) { + if (taskType == TASK_TYPE.ROLE_LV || taskType == TASK_TYPE.ROLE_TITLE) { + await ActivityThirtyDaysModel.setTaskCount(thirtyDaysActivity.activityId, roleId, task.pageIndex, task.cellIndex, task.taskType, addCount); + } else { + await ActivityThirtyDaysModel.addTaskCount(thirtyDaysActivity.activityId, roleId, task.pageIndex, task.cellIndex, task.taskType, addCount); + } + } + } + } } /** @@ -544,6 +562,9 @@ export function isComplete(roleId: string, taskType: TASK_TYPE, taskParam: strin case TASK_TYPE.HERO_NUM: addCount = count; break; + case TASK_TYPE.HERO_QUALITY_STAR_UP://herocount&quality&star& + addCount = (param[1] == paramObj.quality) && (param[2] == paramObj.star) ? count : 0; + break; case TASK_TYPE.ROLE_TITLE://重置数据 addCount = param[0] <= count ? count : 0; break; @@ -592,7 +613,7 @@ export function isComplete(roleId: string, taskType: TASK_TYPE, taskParam: strin */ export async function getCreateUserFuncs(dataFuncs: number[], lv: number) { let addFuncs: number[] = []; - for(let [id, dicFunSwitch] of gameData.funcsSwitch) { + for (let [id, dicFunSwitch] of gameData.funcsSwitch) { if (dataFuncs.includes(id)) continue; // 已开启过了 if (dicFunSwitch && lv >= dicFunSwitch.param) {