UNPKG

qrcode-framework

Version:

157 lines 10.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const sequelize_1 = require("sequelize"); const ErrorCode_1 = require("../common/ErrorCode"); const BaseService_1 = require("../core/BaseService"); const model_1 = require("../model"); const Task_1 = require("../util/Task"); class TaskService extends BaseService_1.default { async getTasks(type) { const now = Date.now(); const where = { deleted: false, status: 1, startAt: { [sequelize_1.Op.or]: [ { [sequelize_1.Op.is]: null, }, { [sequelize_1.Op.lte]: now, }, ], }, endAt: { [sequelize_1.Op.or]: [ { [sequelize_1.Op.is]: null, }, { [sequelize_1.Op.gte]: now, }, ], }, }; if (type !== undefined) { Object.assign(where, { rewardType: type, }); } const tasks = await model_1.Task.findAll({ where, }); return tasks; } /** * 获取用户完成任务的记录 * @param uid 用户uid * @param taskId 任务id * @param startAt 记录创建的时间有效节点,只有当记录的createdAt大于传入的参数值时,才认为是有效的 */ async getWithStartTime(uid, taskId, startAt) { const row = await model_1.TaskRecord.findAll({ where: { uid, taskId, createdAt: { [sequelize_1.Op.lt]: Date.now(), [sequelize_1.Op.gte]: startAt, }, }, }); return row.length ? row[0] : null; } /** * 更新任务状态 * @param uid 用户id * @param taskId 任务id * @param state 任务状态 */ async updateState(uid, taskId, state) { const user = await model_1.User.findByPk(uid, { include: [ { model: model_1.UserIntegral, as: 'integral', required: false, }, ], }); if (!user) { throw new ErrorCode_1.HttpError({ status: 400, errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND, message: '用户不存在', }); } const task = await model_1.Task.findByPk(taskId); if (!task || task.deleted || task.status !== model_1.TASK_STATUS.VALID) { throw new ErrorCode_1.HttpError({ message: '任务不存在', errorCode: ErrorCode_1.ERROR_CODE.COMMON.NOT_FOUND, status: 404, }); } const newStartTime = Task_1.calcTaskNewStartTime(task.startAt, task.period); if (!newStartTime) { throw new ErrorCode_1.HttpError({ message: '任务开启时间有异', errorCode: ErrorCode_1.ERROR_CODE.COMMON.DATA_ERROR, status: 400, }); } const item = await this.getWithStartTime(uid, taskId, newStartTime); if (item && item.state === model_1.TASK_STATE.GOT) { throw new ErrorCode_1.HttpError({ message: '任务已完成', errorCode: ErrorCode_1.ERROR_CODE.TASK.HAD_FINISHED, status: 400 }); } try { await global.sequelize.transaction(async (t) => { // 添加或更新任务记录 if (item) { item.set('state', state); await item.save({ transaction: t }); } else { await model_1.TaskRecord.create({ uid, taskId, state, }, { transaction: t, }); } if (state === model_1.TASK_STATE.GOT) { if (model_1.TASK_REWARD_TYPE.INTEGRAL === task.rewardType) { await Promise.all([ // 添加用户积分记录 model_1.UserIntegralRecord.create({ uid, value: task.reward, latestValue: user.integral.value, type: model_1.INTEGRAL_TYPE.TASK, description: '完成任务', meta: { uid, task, type: model_1.INTEGRAL_TYPE.TASK, des: `完成任务${task.title}`, }, }, { transaction: t, }), // 用户添加积分值 user.integral.increment({ value: task.reward }, { transaction: t, }), ]); } } }); } catch (e) { throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 }); } } } exports.default = TaskService; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFza1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJUYXNrU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUE2QjtBQUM3QixtREFBMEQ7QUFDMUQscURBQThDO0FBQzlDLG9DQVNrQjtBQUNsQix1Q0FBa0Q7QUFFbEQsTUFBcUIsV0FBWSxTQUFRLHFCQUFXO0lBQ3pDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBYTtRQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUc7WUFDVixPQUFPLEVBQUUsS0FBSztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFO2dCQUNMLENBQUMsY0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUNMO3dCQUNJLENBQUMsY0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUk7cUJBQ2hCO29CQUNEO3dCQUNJLENBQUMsY0FBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUc7cUJBQ2hCO2lCQUNKO2FBQ0o7WUFDRCxLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxjQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ0w7d0JBQ0ksQ0FBQyxjQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSTtxQkFDaEI7b0JBQ0Q7d0JBQ0ksQ0FBQyxjQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRztxQkFDaEI7aUJBQ0o7YUFDSjtTQUNKLENBQUM7UUFDRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztTQUNOO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFJLENBQUMsT0FBTyxDQUFDO1lBQzdCLEtBQUs7U0FDUixDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lB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