From b52e17989a9b698bbc9fdeda551f551258ef0322 Mon Sep 17 00:00:00 2001 From: yulixing Date: Wed, 14 Aug 2019 20:25:25 +0800 Subject: [PATCH 1/3] get data --- src/controllers/games/data copy.js | 231 +++++++++++++++++++++++++++++ src/controllers/games/data.js | 170 +++++++++++---------- 2 files changed, 323 insertions(+), 78 deletions(-) create mode 100644 src/controllers/games/data copy.js 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 8348e33..65fe0be 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() @@ -24,120 +27,133 @@ router.get('/report', async (req, res, next) => { } 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].method_name = item.method_display + methods.push(item.methods) } - if (category.length === 0) { - res.send({ - errcode: 404, - errmsg: '暂无数据!', + categoryInfo[item.methods][item.fields] = item.comment + }) + + // 请求各类数据 + const getMethodDataArr = [] + methods.forEach(method => { + getMethodDataArr.push(getMethodData(method, dataOpt)) + }) + + const methodDataRes = await Promise.all(getMethodDataArr) + methodDataRes.forEach(item => { + const methodData = [] + + // 道具排序 + if (item.method === 'items_produce' || item.method === 'items_consum') { + item.data.sort(function(a, b) { + a = JSON.parse(a) + b = JSON.parse(b) + if (a.item_id >= b.item_id) { + return 1 + } else if (a.item_id < b.item_id) { + return -1 + } }) - 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) + item.data.forEach(d => { + const obj = {} + d = JSON.parse(d) + for (const key in d) { + if (d.hasOwnProperty(key)) { + const ele = d[key] + if (key !== 'name' && categoryInfo[item.method][key]) { + if (key === 'item_id') { + obj['道具名称'] = itemList[ele] + ? `${itemList[ele]}(${ele})` + : ele + } else { + obj[categoryInfo[item.method][key]] = ele } - } else { - field.value = allData[fieldName] - result[key].push(field) + } else if (key === 'name') { + obj.name = ele } } } - } + methodData.push(obj) + }) - res.send({ - errcode: 0, - result: result, + result.push({ + method: item.method, + method_name: categoryInfo[item.method].method_name, + method_data: methodData, }) - } else { - res.send({ - errcode: categoryRes.errcode, - errmsg: categoryRes.errmsg, - }) - return - } + }) + + res.send({ + errcode: 0, + 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, @@ -163,7 +179,6 @@ router.get('/game-data', async (req, res, next) => { return } const query = req.query - console.log(query) const gameid = parseInt(query.gameid) const channelid = parseInt(query.channelid) const ad_channelid = query.ad_channelid @@ -208,7 +223,6 @@ router.get('/game-data', async (req, res, next) => { // }) // } - // TODO: 数据示例 res.send({ errcode: 0, From 2c390df47d53da1c14a0ef18dd77fd20bd52b63d Mon Sep 17 00:00:00 2001 From: yulixing Date: Fri, 16 Aug 2019 16:46:17 +0800 Subject: [PATCH 2/3] data/report --- src/controllers/games/data.js | 85 +++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/src/controllers/games/data.js b/src/controllers/games/data.js index 65fe0be..acdf632 100644 --- a/src/controllers/games/data.js +++ b/src/controllers/games/data.js @@ -64,11 +64,17 @@ router.get('/report', async (req, res, next) => { 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) } - categoryInfo[item.methods][item.fields] = item.comment + 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 }) // 请求各类数据 @@ -79,52 +85,75 @@ router.get('/report', async (req, res, next) => { const methodDataRes = await Promise.all(getMethodDataArr) methodDataRes.forEach(item => { - const methodData = [] + const methodData = categoryInfo[item.method] - // 道具排序 - if (item.method === 'items_produce' || item.method === 'items_consum') { + // // 排序 + if (methodData.order) { + const orderField = methodData.order item.data.sort(function(a, b) { a = JSON.parse(a) b = JSON.parse(b) - if (a.item_id >= b.item_id) { - return 1 - } else if (a.item_id < b.item_id) { - return -1 - } + return a[orderField] >= b[orderField] ? 1 : -1 }) + } else { + item.data.sort() } - item.data.forEach(d => { - const obj = {} - d = JSON.parse(d) - for (const key in d) { - if (d.hasOwnProperty(key)) { - const ele = d[key] - if (key !== 'name' && categoryInfo[item.method][key]) { - if (key === 'item_id') { - obj['道具名称'] = itemList[ele] - ? `${itemList[ele]}(${ele})` - : ele - } else { - obj[categoryInfo[item.method][key]] = ele - } - } else if (key === 'name') { - obj.name = ele + const fields_name = [] + const records = [] + + 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 { + fields_name.push(field_name) } } } - methodData.push(obj) + fields_name.splice(0, 1) + } + + 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) }) result.push({ method: item.method, - method_name: categoryInfo[item.method].method_name, - method_data: methodData, + method_name: methodData.method_name, + fields_name: fields_name, + records: records, }) }) res.send({ errcode: 0, + // categoryInfo: categoryInfo, + // methods: methods, + // methodDataRes: methodDataRes, result: result, }) } catch (err) { From 5f2ebd3983892391074ddddaf862f2cdb0c670fc Mon Sep 17 00:00:00 2001 From: yulixing Date: Mon, 19 Aug 2019 14:32:39 +0800 Subject: [PATCH 3/3] gameinfo game_size --- src/models/admin/GameInfo.js | 1 + 1 file changed, 1 insertion(+) 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},