diff --git a/src/controllers/games/data copy.js b/src/controllers/games/data copy.js new file mode 100644 index 0000000..8348e33 --- /dev/null +++ b/src/controllers/games/data copy.js @@ -0,0 +1,231 @@ +// 获取单个游戏广告位 +import {Router} from 'express' +import axios from 'axios' +import config from '../../../config/config' + +const router = new Router() + +const gameReportApiUrl = config.game_report + +// 获取游戏日报 +router.get('/report', async (req, res, next) => { + // 权限判断 + const hasPerm = + req.user.permissions.includes(`${req.query.uid}-readable`) || + req.user.permissions.includes(`${req.query.uid}-edit`) || + req.user.permissions.includes(`${req.query.uid}-publish`) || + req.user.permissions.includes(`games-writeable`) + if (!hasPerm) { + res.status(403).send({ + errcode: 1, + errmsg: '用户无此游戏数据查看权限!', + }) + return + } + + const query = req.query + const game_id = parseInt(query.game_id) + const platform_id = parseInt(query.platform_id) + const date = query.date + const isNew = parseInt(query.isNew) + + try { + const categoryRes = await axios({ + url: gameReportApiUrl, + method: 'get', + params: { + c: 'Ops', + a: 'descField', + body: JSON.stringify({ + gameid: game_id, + channel: platform_id, + }), + }, + }) + + if (categoryRes.data.errcode === 0) { + const categoryInfo = categoryRes.data.result + const category = [] + for (const key in categoryInfo) { + if (categoryInfo.hasOwnProperty(key)) { + category.push(key) + } + } + + if (category.length === 0) { + res.send({ + errcode: 404, + errmsg: '暂无数据!', + }) + return + } + + const getDataArr = [] + + category.map(item => { + getDataArr.push( + getCategoryData(item, date, isNew, game_id, platform_id) + ) + }) + + const dataArr = await Promise.all(getDataArr) + const allData = Object.assign(...dataArr) + + const result = {} + + for (const key in categoryInfo) { + if (categoryInfo.hasOwnProperty(key)) { + const cate = categoryInfo[key] + result[key] = [] + + for (let i = 0; i < cate.length; i++) { + const field = cate[i] + const fieldName = field.name + if (fieldName.endsWith('_%')) { + let idx = 1 + let tempName = fieldName.replace(/%/, idx) + while (allData[tempName]) { + const obj = JSON.parse(JSON.stringify(field)) + obj.name = tempName + obj.explan += `_${idx}` + obj.value = allData[tempName] + result[key].push(obj) + idx++ + tempName = fieldName.replace(/%/, idx) + } + } else { + field.value = allData[fieldName] + result[key].push(field) + } + } + } + } + + res.send({ + errcode: 0, + result: result, + }) + } else { + res.send({ + errcode: categoryRes.errcode, + errmsg: categoryRes.errmsg, + }) + return + } + } catch (err) { + next(err) + } +}) + +function getCategoryData(cateName, date, is_new, game_id, platform_id) { + return new Promise(async (resolve, reject) => { + const dataRes = await axios({ + url: gameReportApiUrl, + method: 'get', + params: { + c: 'Ops', + a: 'gameReport', + body: JSON.stringify({ + gameid: game_id, + channel: platform_id, + times: date, + is_new: is_new, + category: cateName, + }), + }, + }) + + if (dataRes.data.errcode === 0) { + const data = dataRes.data.result + resolve(data) + } else { + reject({ + errcode: 404, + errmsg: '数据获取失败,暂无数据!', + }) + } + }) +} + +// 获取游戏数据(画图表用) +router.get('/game-data', async (req, res, next) => { + // 权限判断 + const hasPerm = + req.user.permissions.includes(`${req.query.uid}-readable`) || + req.user.permissions.includes(`${req.query.uid}-edit`) || + req.user.permissions.includes(`${req.query.uid}-publish`) || + req.user.permissions.includes(`games-writeable`) + if (!hasPerm) { + res.status(403).send({ + errcode: 1, + errmsg: '用户无此游戏数据查看权限!', + }) + return + } + const query = req.query + console.log(query) + const gameid = parseInt(query.gameid) + const channelid = parseInt(query.channelid) + const ad_channelid = query.ad_channelid + const method = query.method + const time_partice = parseInt(query.time_partice) + const time_begin = query.isNew + const time_end = query.isNew + + try { + // TODO: 接口对接 + // const searchRes = await axios({ + // url: gameReportApiUrl, + // method: 'get', + // params: { + // c: 'Ops', + // a: 'descField', + // body: JSON.stringify({ + // gameid: game_id, + // channel: platform_id, + // }), + // }, + // }) + + // if (searchRes.data.errcode === 0) { + // res.send({ + // errcode: 0, + // errmsg: '', + // message: { + // totoal: 2, + // result: [ + // { + // '2019-08-01 01:00:00': 100, + // '2019-08-01 02:00:00': 120, + // }, + // ], + // }, + // }) + // } else { + // res.send({ + // errcode: searchRes.errcode, + // errmsg: searchRes.errmsg, + // }) + // } + + + // TODO: 数据示例 + res.send({ + errcode: 0, + errmsg: '', + message: { + totoal: 2, + result: [ + { + '2019-08-01 01:00:00': 100, + '2019-08-01 02:00:00': 120, + }, + ], + }, + }) + } catch (err) { + next(err) + } +}) + +export default router diff --git a/src/controllers/games/data.js b/src/controllers/games/data.js index 1b5fdfe..fa1ca04 100644 --- a/src/controllers/games/data.js +++ b/src/controllers/games/data.js @@ -1,6 +1,9 @@ // 获取单个游戏广告位 import {Router} from 'express' import axios from 'axios' + +import GameItem from '../../models/admin/GameItem' + import config from '../../../config/config' const router = new Router() @@ -27,120 +30,162 @@ router.get('/report', async (req, res, next) => { /* 权限验证 end */ const query = req.query - const game_id = parseInt(query.game_id) - const platform_id = parseInt(query.platform_id) + const game_id = query.game_id + const platform_id = query.platform_id const date = query.date - const isNew = parseInt(query.isNew) try { + const categoryInfo = {} + const methods = [] + const result = [] + const itemList = {} + const dataOpt = { + gameid: game_id, + channelid: platform_id, + times: date, + } + + // 获取道具列表 + const itemListRes = await GameItem.find({game_id: game_id}) + itemListRes.forEach(item => { + itemList[item.item_id] = item.item_name + }) + + // 请求数据分类及字段定义 const categoryRes = await axios({ url: gameReportApiUrl, method: 'get', params: { c: 'Ops', - a: 'descField', - body: JSON.stringify({ - gameid: game_id, - channel: platform_id, - }), + a: 'getmethods', + gameid: game_id, + channelid: platform_id, }, }) + const category = categoryRes.data.result - if (categoryRes.data.errcode === 0) { - const categoryInfo = categoryRes.data.result - const category = [] - for (const key in categoryInfo) { - if (categoryInfo.hasOwnProperty(key)) { - category.push(key) - } + category.map(item => { + if (!categoryInfo[item.methods]) { + categoryInfo[item.methods] = {} + categoryInfo[item.methods].fields = {} + categoryInfo[item.methods].fields_order = {} + categoryInfo[item.methods].order = '' + categoryInfo[item.methods].method_name = item.method_display + methods.push(item.methods) } - if (category.length === 0) { - res.send({ - errcode: 404, - errmsg: '暂无数据!', + if (item.need_sort) categoryInfo[item.methods].order = item.fields + + categoryInfo[item.methods].fields[item.fields] = item.comment + categoryInfo[item.methods].fields_order[item.fields] = item.sort_num + }) + + // 请求各类数据 + const getMethodDataArr = [] + methods.forEach(method => { + getMethodDataArr.push(getMethodData(method, dataOpt)) + }) + + const methodDataRes = await Promise.all(getMethodDataArr) + methodDataRes.forEach(item => { + const methodData = categoryInfo[item.method] + + // // 排序 + if (methodData.order) { + const orderField = methodData.order + item.data.sort(function(a, b) { + a = JSON.parse(a) + b = JSON.parse(b) + return a[orderField] >= b[orderField] ? 1 : -1 }) - return + } else { + item.data.sort() } - const getDataArr = [] + const fields_name = [] + const records = [] - category.map(item => { - getDataArr.push( - getCategoryData(item, date, isNew, game_id, platform_id) - ) - }) - - const dataArr = await Promise.all(getDataArr) - const allData = Object.assign(...dataArr) - - const result = {} - - for (const key in categoryInfo) { - if (categoryInfo.hasOwnProperty(key)) { - const cate = categoryInfo[key] - result[key] = [] - - for (let i = 0; i < cate.length; i++) { - const field = cate[i] - const fieldName = field.name - if (fieldName.endsWith('_%')) { - let idx = 1 - let tempName = fieldName.replace(/%/, idx) - while (allData[tempName]) { - const obj = JSON.parse(JSON.stringify(field)) - obj.name = tempName - obj.explan += `_${idx}` - obj.value = allData[tempName] - result[key].push(obj) - idx++ - tempName = fieldName.replace(/%/, idx) - } + if (item.data[0]) { + const record = JSON.parse(item.data[0]) + for (const key in record) { + if (record.hasOwnProperty(key)) { + const idx = methodData.fields_order[key] + if (idx) { + const field_name = + key === 'item_id' ? '道具名称/ID' : methodData.fields[key] + fields_name[idx] + ? fields_name.splice(idx, 0, field_name) + : (fields_name[idx] = field_name) } else { - field.value = allData[fieldName] - result[key].push(field) + fields_name.push(field_name) } } } + fields_name.splice(0, 1) } - res.send({ - errcode: 0, - result: result, + item.data.forEach(d => { + d = JSON.parse(d) + const record = [] + for (const key in d) { + if (d.hasOwnProperty(key)) { + const val = key === 'item_id' ? itemList[d[key]] || d[key] : d[key] + const idx = methodData.fields_order[key] + + // 若idx为0 不处理排序,直接push + if (idx) { + record[idx] ? record.splice(idx, 0, val) : (record[idx] = val) + } else { + record.push(val) + } + } + } + record.splice(0, 1) + records.push(record) }) - } else { - res.send({ - errcode: categoryRes.errcode, - errmsg: categoryRes.errmsg, + + result.push({ + method: item.method, + method_name: methodData.method_name, + fields_name: fields_name, + records: records, }) - return - } + }) + + res.send({ + errcode: 0, + // categoryInfo: categoryInfo, + // methods: methods, + // methodDataRes: methodDataRes, + result: result, + }) } catch (err) { + console.log(err) next(err) } }) -function getCategoryData(cateName, date, is_new, game_id, platform_id) { +function getMethodData(method, opt) { return new Promise(async (resolve, reject) => { const dataRes = await axios({ url: gameReportApiUrl, method: 'get', params: { c: 'Ops', - a: 'gameReport', - body: JSON.stringify({ - gameid: game_id, - channel: platform_id, - times: date, - is_new: is_new, - category: cateName, - }), + a: 'getreport', + gameid: opt.gameid, + channelid: opt.channelid, + times: opt.times, + methods: method, }, }) if (dataRes.data.errcode === 0) { const data = dataRes.data.result - resolve(data) + resolve({ + data: data, + method: method, + }) } else { reject({ errcode: 404, diff --git a/src/models/admin/GameInfo.js b/src/models/admin/GameInfo.js index 963975e..35a1301 100644 --- a/src/models/admin/GameInfo.js +++ b/src/models/admin/GameInfo.js @@ -11,6 +11,7 @@ const GameInfo = new mongoose.Schema( game_name_en: {type: String}, game_id: {type: String}, game_type: {type: String}, + game_size: {type: String, default: '512*1024'}, game_icon: {type: String}, platforms: [{type: Object}], recommendation: {type: Object},