Commit e5db8927 authored by 高诸锋's avatar 高诸锋

fix

parent 0bfcae7d
Pipeline #3890 passed with stage
in 2 seconds
...@@ -17,7 +17,7 @@ class OrderController extends Controller { ...@@ -17,7 +17,7 @@ class OrderController extends Controller {
type: 'object', type: 'object',
rule: { rule: {
token: 'string', token: 'string',
orderSn: 'string', orderId: 'string',
appKey: 'string', appKey: 'string',
timestamp: 'string', timestamp: 'string',
}, },
......
...@@ -3,10 +3,21 @@ ...@@ -3,10 +3,21 @@
const Controller = require('egg').Controller; const Controller = require('egg').Controller;
class PartnerController extends Controller { class PartnerController extends Controller {
// constructor(ctx) { constructor(ctx) {
// super(ctx); super(ctx);
this.showRule = {
// } sign: { type: 'string', required: true },
type: { type: 'string', required: false },
params: {
type: 'object', required: true, rule: {
appKey: { type: 'string', required: true },
timestamp: { type: 'string', required: true },
token: { type: 'string', required: true },
orderId: { type: 'string', required: true },
},
},
};
}
async show() { async show() {
const { ctx, service } = this; const { ctx, service } = this;
...@@ -18,6 +29,53 @@ class PartnerController extends Controller { ...@@ -18,6 +29,53 @@ class PartnerController extends Controller {
} }
ctx.fail('尚未配置主题'); ctx.fail('尚未配置主题');
} }
async getToken() {
const { ctx, service } = this;
ctx.status = 200;
try {
ctx.validate(this.createRule);
const token = await service.signature.createTokenForPartner(ctx.request.body);
ctx.body = { code: 0, data: token };
} catch (err) {
if (err.code === 'invalid_param') {
ctx.body = { code: -1, message: err.message || '' };
return;
}
ctx.body = { code: err.code || -1, message: err.message || '' };
return;
}
}
async partnerShow() {
const { ctx, service } = this;
ctx.status = 200;
try {
ctx.validate(this.showRule);
const orderId = ctx.request.body.params.orderId;
await service.signature.signatureCheck(ctx.request.body);
const data = await service.order.getOneByOrderId(orderId);
if (data && data.status === 'success') {
const result = await service.storage.read(orderId);
ctx.body = {
code: 0,
data: result,
};
return;
}
ctx.body = {
code: -1,
message: '无此订单号',
};
} catch (err) {
if (err.code === 'invalid_param') {
ctx.body = { code: -1, message: err.message || '' };
return;
}
ctx.body = { code: err.code || -1, message: err.message || '' };
return;
}
}
} }
module.exports = PartnerController; module.exports = PartnerController;
...@@ -30,6 +30,7 @@ class ScriptController extends Controller { ...@@ -30,6 +30,7 @@ class ScriptController extends Controller {
const data = await service.scripts.fetchOneScripts(scriptId); const data = await service.scripts.fetchOneScripts(scriptId);
ctx.success(data); ctx.success(data);
} }
async fetchParamsInfo() { async fetchParamsInfo() {
const { ctx, service } = this; const { ctx, service } = this;
const { refresh = false } = ctx.query; const { refresh = false } = ctx.query;
......
...@@ -74,6 +74,7 @@ class TaskController extends Controller { ...@@ -74,6 +74,7 @@ class TaskController extends Controller {
ctx.success(data); ctx.success(data);
} }
// 处理模拟器回调知
async handleCallback() { async handleCallback() {
const { ctx, service } = this; const { ctx, service } = this;
const { taskId } = ctx.request.body; const { taskId } = ctx.request.body;
...@@ -114,7 +115,7 @@ class TaskController extends Controller { ...@@ -114,7 +115,7 @@ class TaskController extends Controller {
const insertData = await service.washData.wash(result); const insertData = await service.washData.wash(result);
const order = await service.order.getOneByTaskId(taskId); const order = await service.order.getOneByTaskId(taskId);
if (!order) { if (!order) {
throw new Error('任务已经结束了'); throw new Error(`【taskId】:${taskId} 任务已经结束.`);
} }
const { orderId, appkey } = order; const { orderId, appkey } = order;
insertData.orderId = orderId; insertData.orderId = orderId;
...@@ -123,6 +124,7 @@ class TaskController extends Controller { ...@@ -123,6 +124,7 @@ class TaskController extends Controller {
insertData.appKey = appkey; insertData.appKey = appkey;
delete insertData.code; delete insertData.code;
await service.storage.write(insertData); await service.storage.write(insertData);
await service.partner.notify({ taskId, cb: order.callbackUrl, orderId: order.orderId, userId: order.userId });
} catch (err) { } catch (err) {
ctx.logger.error('handleCallback', err, result); ctx.logger.error('handleCallback', err, result);
taskNote = { taskNote = {
......
'use strict'; 'use strict';
const REDIS_CACHE = Symbol('Context#RedisCache');
const NODE_CACHE = Symbol('Context#NodeCache'); const NODE_CACHE = Symbol('Context#NodeCache');
const NodeCache = require('node-cache'); const NodeCache = require('node-cache');
const INCR_SCRIPT = 'return redis.call("INCR", ARGV[1])';
class Cache { class Cache {
constructor(app) { constructor(app) {
this.app = app; this.app = app;
this.name = 'unknown-cache'; this.name = 'unknown-cache';
this.app.redis.defineCommand('INCR', {
numberOfKeys: 0,
lua: INCR_SCRIPT,
});
} }
async val(key, next, ttl) { async val(key, next, ttl) {
...@@ -51,33 +45,10 @@ class Cache { ...@@ -51,33 +45,10 @@ class Cache {
this.app.logger.info(`【Cache Set】(${+new Date() - startTime}ms) Key: ${key} value: ${JSON.stringify(value)}`); this.app.logger.info(`【Cache Set】(${+new Date() - startTime}ms) Key: ${key} value: ${JSON.stringify(value)}`);
return; return;
} }
}
class RedisCacheWrap extends Cache {
constructor(app, redis) {
super(app);
this.redis = redis;
this.name = 'redis-cache';
}
async _get(key) { async del(key) {
const { redis } = this; if (key) {
let value = await redis.get(key); return await this._del(key);
if (value === null) {
value = undefined;
}
if (value) {
value = JSON.parse(value);
}
return value;
}
async _set(key, value, ttl) {
const { redis } = this;
value = JSON.stringify(value);
if (ttl > 0) {
await redis.set(key, value, 'EX', ttl);
} else {
await redis.set(key, value);
} }
} }
} }
...@@ -92,6 +63,7 @@ class NodeCacheWrap extends Cache { ...@@ -92,6 +63,7 @@ class NodeCacheWrap extends Cache {
async _get(key) { async _get(key) {
return this.cache.get(key); return this.cache.get(key);
} }
async _set(key, value, ttl) { async _set(key, value, ttl) {
const { cache } = this; const { cache } = this;
value = JSON.parse(JSON.stringify(value)); value = JSON.parse(JSON.stringify(value));
...@@ -101,15 +73,13 @@ class NodeCacheWrap extends Cache { ...@@ -101,15 +73,13 @@ class NodeCacheWrap extends Cache {
cache.set(key, value); cache.set(key, value);
} }
} }
async _del(key) {
return this.cache.del(key);
}
} }
module.exports = { module.exports = {
get memcache() {
if (!this[REDIS_CACHE]) {
this[REDIS_CACHE] = new RedisCacheWrap(this, this.redis);
}
return this[REDIS_CACHE];
},
get cache() { get cache() {
if (!this[NODE_CACHE]) { if (!this[NODE_CACHE]) {
this[NODE_CACHE] = new NodeCacheWrap(this); this[NODE_CACHE] = new NodeCacheWrap(this);
......
...@@ -8,7 +8,7 @@ module.exports = app => { ...@@ -8,7 +8,7 @@ module.exports = app => {
const sbRouter = app.router.namespace(app.config.projectRootPath); const sbRouter = app.router.namespace(app.config.projectRootPath);
sbRouter.post('/tasks', controller.task.create); // 创建任务 sbRouter.post('/tasks', controller.task.create); // 创建任务
sbRouter.get('/tasks/:taskId', controller.task.show); // 获取任务状态 sbRouter.get('/tasks/:taskId', controller.task.show); // 获取任务状态 前端轮询的接口
sbRouter.post('/tasks/:taskId/submit', controller.task.submit); // 提交任务参数 sbRouter.post('/tasks/:taskId/submit', controller.task.submit); // 提交任务参数
sbRouter.post('/tasks/:taskId/capture', controller.task.fetchCapture); // 获取验证码 sbRouter.post('/tasks/:taskId/capture', controller.task.fetchCapture); // 获取验证码
...@@ -34,5 +34,6 @@ module.exports = app => { ...@@ -34,5 +34,6 @@ module.exports = app => {
// 这个接口之后会移除掉 // 这个接口之后会移除掉
sbRouter.get('/orders', controller.order.fetchOrderId); sbRouter.get('/orders', controller.order.fetchOrderId);
sbRouter.post('/getToken', controller.token.createForPartner); sbRouter.post('/getToken', controller.partner.getToken);
sbRouter.post('/getData', controller.partner.partnerShow);
}; };
...@@ -55,7 +55,7 @@ class CacheService extends Service { ...@@ -55,7 +55,7 @@ class CacheService extends Service {
return { status: order.status, note: order.note }; return { status: order.status, note: order.note };
} }
ctx.logger.error(`【Cache】get No Result ${key}`); ctx.logger.error(`【Cache】get No Result ${key}`);
ctx.throw.error(400, { message: 'no taskId' }); ctx.throw(400, { message: 'no taskId' });
} }
} }
......
...@@ -10,6 +10,7 @@ class OrderService extends Service { ...@@ -10,6 +10,7 @@ class OrderService extends Service {
}); });
return order; return order;
} }
async getOneByTaskId(taskId) { async getOneByTaskId(taskId) {
const { ctx } = this; const { ctx } = this;
const order = await ctx.model.TaskStatus.findOne({ const order = await ctx.model.TaskStatus.findOne({
......
...@@ -12,13 +12,13 @@ class PartnerService extends Service { ...@@ -12,13 +12,13 @@ class PartnerService extends Service {
async fetchTheme(appKey) { async fetchTheme(appKey) {
const { ctx, partnerAPI: { fetchTheme, host, redisThemePrefix } } = this; const { ctx, partnerAPI: { fetchTheme, host, redisThemePrefix } } = this;
if (appKey) { if (appKey) {
const data = await this.app.redis.get(redisThemePrefix + appKey); const data = await this.app.cache.get(redisThemePrefix + appKey);
if (data) { if (data) {
try { try {
return JSON.parse(data); return JSON.parse(data);
} catch (err) { } catch (err) {
ctx.logger.error('【Scripts】fetchParams', redisThemePrefix + appKey, 'result:', data, err); ctx.logger.error('【Scripts】fetchParams', redisThemePrefix + appKey, 'result:', data, err);
await this.app.redis.del(redisThemePrefix + appKey); await this.app.cache.del(redisThemePrefix + appKey);
} }
} }
} }
...@@ -30,7 +30,7 @@ class PartnerService extends Service { ...@@ -30,7 +30,7 @@ class PartnerService extends Service {
}); });
ctx.logger.info(`【Partner】 fetchTheme ${host + fetchTheme}/${appKey}`, ret.data); ctx.logger.info(`【Partner】 fetchTheme ${host + fetchTheme}/${appKey}`, ret.data);
if (ret.status === 200 && ret.data && ret.data.id === appKey) { if (ret.status === 200 && ret.data && ret.data.id === appKey) {
await this.app.redis.set(redisThemePrefix + appKey, JSON.stringify(ret.data), 'EX', 7200); await this.app.cache.set(redisThemePrefix + appKey, JSON.stringify(ret.data), 7200);
} }
return ret.data; return ret.data;
} }
...@@ -39,13 +39,13 @@ class PartnerService extends Service { ...@@ -39,13 +39,13 @@ class PartnerService extends Service {
const { ctx, partnerAPI: { fetchScripts, host, redisScriptsPrefix } } = this; const { ctx, partnerAPI: { fetchScripts, host, redisScriptsPrefix } } = this;
if (appKey) { if (appKey) {
const data = await this.app.redis.get(redisScriptsPrefix + appKey); const data = await this.app.cache.get(redisScriptsPrefix + appKey);
if (data) { if (data) {
try { try {
return JSON.parse(data); return JSON.parse(data);
} catch (err) { } catch (err) {
ctx.logger.error('【Partner】 fetchScripts', redisScriptsPrefix + appKey, 'result:', data, err); ctx.logger.error('【Partner】 fetchScripts', redisScriptsPrefix + appKey, 'result:', data, err);
await this.app.redis.del(redisScriptsPrefix + appKey); await this.app.cache.del(redisScriptsPrefix + appKey);
} }
} }
} }
...@@ -58,10 +58,48 @@ class PartnerService extends Service { ...@@ -58,10 +58,48 @@ class PartnerService extends Service {
}); });
ctx.logger.info(`【Partner】 fetchTheme ${url}`, ret.data); ctx.logger.info(`【Partner】 fetchTheme ${url}`, ret.data);
if (ret.status === 200 && ret.data && ret.data.id === appKey) { if (ret.status === 200 && ret.data && ret.data.id === appKey) {
await this.app.redis.set(redisScriptsPrefix + appKey, JSON.stringify(ret.data), 'EX', 7200); await this.app.cache.set(redisScriptsPrefix + appKey, JSON.stringify(ret.data), 7200);
} }
return ret.data; return ret.data;
} }
// 查询结束后回调通知合作方
// 对于状态已经是成功的订单号不会在做通知
// orderId/userId/status
async notify({ taskId, cb, orderId, userId }) {
const { ctx, service } = this;
if (!cb) {
ctx.logger.info(`【orderId】:${orderId} 没有回调地址`);
return;
}
const data = await service.cache.get({ key: taskId });
if (data && data.status === 'success') {
ctx.logger.info(`【taskId】:${taskId} 模拟器多次通知任务成功情况`);
return;
}
if (data) {
try {
await ctx.curl(cb, {
method: 'POST',
data: { orderId, status: 'success', userId },
dataType: 'json',
contentType: 'json',
timeout: ['30s', '30s'],
});
ctx.model.TaskStatus.update(
{ notice: 1 },
{ where: { taskId } }
);
} catch (e) { // 回调失败
ctx.logger.error(`【cb】:${cb} 回调通知失败`);
ctx.model.TaskStatus.update(
{ notice: 0 },
{ where: { taskId } }
);
}
}
}
} }
module.exports = PartnerService; module.exports = PartnerService;
...@@ -48,7 +48,7 @@ class StorageService extends Service { ...@@ -48,7 +48,7 @@ class StorageService extends Service {
method: 'get', method: 'get',
contentType: 'json', contentType: 'json',
}); });
ctx.logger.info(`【Storage】read url:${readUrl}/${orderId} write result:`, result.data); ctx.logger.info(`【Storage】read url:${readUrl}/${orderId}`);
if (result && result.data && result.data.code !== 0) { if (result && result.data && result.data.code !== 0) {
ctx.logger.error(`storageAPI read ${readUrl}/${orderId}`, result.data); ctx.logger.error(`storageAPI read ${readUrl}/${orderId}`, result.data);
......
...@@ -77,6 +77,7 @@ class TaskService extends Service { ...@@ -77,6 +77,7 @@ class TaskService extends Service {
this._checkSuccess(result); this._checkSuccess(result);
return result.data.data; return result.data.data;
} }
async submit(data) { async submit(data) {
const { taskAPI, ctx } = this; const { taskAPI, ctx } = this;
const { submitTaskUrl } = taskAPI; const { submitTaskUrl } = taskAPI;
...@@ -89,6 +90,7 @@ class TaskService extends Service { ...@@ -89,6 +90,7 @@ class TaskService extends Service {
this._checkSuccess(result); this._checkSuccess(result);
return result; return result;
} }
async fetchTask(data) { async fetchTask(data) {
const { taskAPI, ctx } = this; const { taskAPI, ctx } = this;
const { fetchTaskUrl } = taskAPI; const { fetchTaskUrl } = taskAPI;
......
...@@ -4,14 +4,6 @@ module.exports = () => { ...@@ -4,14 +4,6 @@ module.exports = () => {
const config = exports = {}; const config = exports = {};
config.debug = true; config.debug = true;
config.redis = {
client: {
port: 6379,
host: '127.0.0.1',
password: 'DEV8redis',
db: 0,
},
};
config.taskAPI = { config.taskAPI = {
host: 'http://tm.51gjj.com:4831', host: 'http://tm.51gjj.com:4831',
fetchHubsUrl: '', fetchHubsUrl: '',
......
...@@ -2,23 +2,23 @@ ...@@ -2,23 +2,23 @@
module.exports = () => { module.exports = () => {
const config = exports = {}; const config = exports = {};
config.debug = true; config.debug = false;
config.redis = {
client: {
port: 6379,
host: process.env.REDIS_HOST,
password: 'DEV8redis',
db: 0,
},
};
config.taskAPI = { config.taskAPI = {
host: 'http://tm.51gjj.com:4831', host: 'http://tm.51gjj.com:4831',
fetchHubsUrl: '', fetchHubsUrl: '',
createTaskUrl: '/gjjServices/createGjjTask', createTaskUrl: '/shebao/createSbTask',
fetchCodeUrl: '/gjjServices/queryGjjCode', fetchCodeUrl: '/shebao/getSbCode',
submitTaskUrl: '/gjjServices/queryGjj', submitTaskUrl: '/shebao/loginSbWeb',
fetchTaskUrl: '/gjjServices/getGjjData', fetchTaskUrl: '/shebao/getSbData', // 获取该task状态
};
config.partnerAPI = {
host: 'https://dev-nginx.jianbing.com/zeus-api/v1',
fetchTheme: '/chaos/partners/theme',
fetchScripts: '/chaos/partners/scripts',
redisThemePrefix: 'URANUS.HF.PARNTERS.THEME',
redisScriptsPrefix: 'URANUS.HF.PARNTERS.SCRIPTS',
}; };
config.scriptsAPI = { config.scriptsAPI = {
...@@ -38,14 +38,14 @@ module.exports = () => { ...@@ -38,14 +38,14 @@ module.exports = () => {
config.storageAPI = { config.storageAPI = {
host: 'http://tv.51gjj.com:11252', host: 'http://tv.51gjj.com:11252',
writeUrl: '/data', writeUrl: '/data',
readUrl: '/gjj', readUrl: '/shebao',
writeType: 'gjj', writeType: 'shebao',
readDataKey: 'gjjData', readDataKey: 'shebaoData',
}; };
config.washAPI = { config.washAPI = {
host: 'http://tt.51gjj.com:11101', host: 'http://tt.51gjj.com:11101',
washUrl: '/gjj/analyzeGjj', washUrl: '/si/analyzeSI',
}; };
config.signatureAPI = { config.signatureAPI = {
...@@ -54,25 +54,16 @@ module.exports = () => { ...@@ -54,25 +54,16 @@ module.exports = () => {
fetchOrderIdUrl: '/Order/GetOrderSn', fetchOrderIdUrl: '/Order/GetOrderSn',
signatureUrl: '/Access/SignValidityCheck', signatureUrl: '/Access/SignValidityCheck',
fetchParnterUrl: '', fetchParnterUrl: '',
signatureType: 'gjj', signatureType: 'shebao',
};
config.partnerAPI = {
host: 'https://dev-nginx.jianbing.com/zeus-api/v1',
fetchTheme: '/chaos/partners/theme',
fetchScripts: '/chaos/partners/scripts',
redisThemePrefix: 'URANUS.HF.PARNTERS.THEME',
redisScriptsPrefix: 'URANUS.HF.PARNTERS.SCRIPTS',
}; };
config.lockKeys = { config.lockKeys = {
fecthHub: 'URANUS.HF.HUBS.LOCK', fecthHub: 'NEWSB.HF.HUBS.LOCK',
fecteToken: 'URANUS.HF.TOKEN.LOCK', fecteToken: 'NEWSB.HF.TOKEN.LOCK',
token: 'URANUS.HF.TOKEN', token: 'NEWSB.HF.TOKEN',
fecthParnters: 'URANUS.PARNTERS.LOCK', fecthParnters: 'NEWSB.PARNTERS.LOCK',
taskPrefix: 'URANUS.HFH5.TASK', taskPrefix: 'NEWSB.TASK',
}; };
config.projectRootPath = '';
config.sequelize = { config.sequelize = {
datasources: [{ datasources: [{
...@@ -81,20 +72,31 @@ module.exports = () => { ...@@ -81,20 +72,31 @@ module.exports = () => {
delegate: 'model', delegate: 'model',
baseDir: 'model', baseDir: 'model',
dialect: 'mysql', dialect: 'mysql',
host: 'rm-bp1272001633qc0x9.mysql.rds.aliyuncs.com', host: process.env.MYSQL_PACHONG_HOST || 'rm-bp1272001633qc0x9.mysql.rds.aliyuncs.com',
database: 'nodetest', database: process.env.MYSQL_DATA_SERVER_DB_NAME || 'data_service_dev',
username: 'hexin', username: process.env.MYSQL_USER || 'hexin',
password: 'gYUHszn9#q', password: process.env.MYSQL_PWD || 'gYUHszn9#q',
port: 3306, port: process.env.MYSQL_PORT || 3306,
}, {
// 东八时区
timezone: '+08:00',
delegate: 'cusPro',
baseDir: 'model',
dialect: 'mysql',
host: process.env.MYSQL_PACHONG_HOST || 'rm-bp1272001633qc0x9.mysql.rds.aliyuncs.com',
database: process.env.MYSQL_JAVA_DB_NAME || 'java_open_platform',
username: process.env.MYSQL_USER || 'hexin',
password: process.env.MYSQL_PWD || 'gYUHszn9#q',
port: process.env.MYSQL_PORT || 3306,
}], }],
}; };
config.GJJ_OpenAPI = { config.SB_OpenAPI = {
appKey: '9FBBA75BBFC24401AA6A76AEFC277346', appKey: '60670203E411FD62BA9E953CFB73F881',
appSecret: 'D7FEA664E0CD4336BEAA1B3569393A301DBB6995', appSecret: '0BDD1ECC147503C477563E5C1438C366D70E4F80',
}; };
config.callbackUrl = 'https://dev-nginx.jianbing.com/hf_h5_server/callback'; config.callbackUrl = 'http://ti.51gjj.com:7001/shebao_server/callback';
return config; return config;
}; };
...@@ -14,7 +14,7 @@ exports.sequelize = { ...@@ -14,7 +14,7 @@ exports.sequelize = {
}; };
exports.redis = { exports.redis = {
enable: true, enable: false,
package: 'egg-redis', package: 'egg-redis',
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment