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

fix

parent 3837d238
Pipeline #5722 passed with stage
in 16 seconds
......@@ -24,7 +24,8 @@ class OrderController extends Controller {
type: 'object', required: true,
rule: {
token: { type: 'string', required: true },
orderId: { type: 'string', required: true },
orderId: { type: 'string', required: false },
orderSn: { type: 'string', required: false }, // 老H5
appKey: { type: 'string', required: true },
timestamp: { type: 'string', required: true },
},
......@@ -46,11 +47,9 @@ class OrderController extends Controller {
async create() {
const { ctx, service } = this;
ctx.validate(this.createRule);
// const { appKey } = ctx.request.body.params;
const { appKey, userId, notifyUrl, backUrl } = ctx.request.body;
let { orderId } = ctx.request.body;
// const orderId = await service.signature.createOrderId(ctx.request.body);
orderId = orderId || ctx.helper.getUuid();
const toDbObj = {
orderId,
taskId: '',
......@@ -60,35 +59,56 @@ class OrderController extends Controller {
status: 'init',
notifyUrl: notifyUrl || (ctx.app.notifyMap.get(appKey) && ctx.app.notifyMap.get(appKey).notifyUrl) || '',
backUrl,
type: 'h5',
};
if (orderId) { // 老的H5
await service.order.update(toDbObj);
} else {
orderId = ctx.helper.getUuid();
toDbObj.orderId = orderId;
await service.order.create(toDbObj);
}
ctx.success({ orderId });
}
// 只根据订单号获取数据
// async show() {
// const { ctx, service } = this;
// ctx.validate(this.showRule);
// const { orderId, appKey } = ctx.params;
// await service.signature.signatureCheck(ctx.request.body);
// const data = await service.order.getOneByOrderId(orderId);
// if (data) {
// if (data.status === 'success') {
// const result = await service.storage.read(orderId, appKey);
// ctx.success(result);
// return;
// }
// ctx.success({
// status: data.status,
// });
// return;
// }
// ctx.fail('无此订单号');
// }
// 合作方获取订单数据
async partnerShow() {
const { ctx, service } = this;
try {
ctx.validate(this.showRule);
let { appKey, orderId, orderSn } = ctx.request.body.params;
orderId = orderId || orderSn;
const appKeyInfo = await service.partner.fetchInfo(appKey);
if (!(appKeyInfo && appKeyInfo.valid === true && appKeyInfo.enableHfData === true)) {
return ctx.fail('未开通此服务');
}
await service.signature.signatureCheck(ctx.request.body);
const data = await service.order.getOneByOrderId(orderId);
if (data) {
if (data.status === 'success') {
const result = await service.storage.read(orderId, appKey);
ctx.body = {
code: 0,
data: result,
};
return;
}
}
ctx.body = {
code: -1,
msg: '无此订单号',
};
} catch (err) {
ctx.logger.error('partnerShow', JSON.stringify(err));
ctx.status = 200;
if (err.code === 'invalid_param') {
ctx.body = { code: -1, msg: err.message || '' };
return;
}
ctx.body = { code: err.code || -1, msg: err.message || '' };
return;
}
}
async fetchOrderId() {
const { ctx, service } = this;
......@@ -103,6 +123,7 @@ class OrderController extends Controller {
notifyUrl: ctx.app.notifyMap.get(appKey) && ctx.app.notifyMap.get(appKey).notifyUrl || '',
appKey,
status: 'init',
type: 'h5',
});
ctx.body = {
code: 0,
......
......@@ -47,36 +47,6 @@ class PartnerController extends Controller {
}
}
async partnerShow() {
const { ctx, service } = this;
ctx.status = 200;
try {
ctx.validate(this.showRule);
const { orderId, appKey } = ctx.request.body.params;
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, appKey);
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;
}
}
async fetchAgreements() {
const { ctx, service } = this;
const { id } = ctx.params;
......
......@@ -8,13 +8,15 @@ class ScriptController extends Controller {
const { appKey } = ctx.query;
let limitScriptsList = false;
if (appKey) {
const ret = await service.partner.fetchScripts(appKey);
limitScriptsList = ret.scripts;
const ret = await service.partner.fetchInfo(appKey);
if (ret) {
limitScriptsList = ret.hfExcludeScripts;
}
}
let data = await service.scripts.fetchScripts();
if (limitScriptsList) {
data = data.filter(item => {
return limitScriptsList.includes(item.id);
return !(limitScriptsList.includes(item.id));
});
}
ctx.success(data);
......
......@@ -118,15 +118,15 @@ class TaskController extends Controller {
if (!order) {
throw new Error(`【taskId】:${taskId} 任务已经结束.`);
}
const { orderId, appkey } = order;
const { orderId, appKey, notifyUrl, userId } = order;
insertData.orderId = orderId;
insertData.cityName = insertData.location;
// TODO insertData.cityId -> cityName
insertData.taskId = taskId;
insertData.appKey = appkey;
insertData.appKey = appKey;
delete insertData.code;
await service.storage.write(insertData);
await service.partner.notify({ taskId, cb: order.notifyUrl, orderId: order.orderId, userId: order.userId, appKey: order.appKey });
await service.partner.notify({ taskId, notifyUrl, orderId, userId, appKey });
} catch (err) {
ctx.logger.err(`【controller/task/handleCallback err】:${err}${JSON.stringify(result)}`);
taskNote = {
......
......@@ -33,7 +33,7 @@ module.exports = app => {
sbRouter.get('/agreements/:id', controller.partner.fetchAgreements); // 查询协议
sbRouter.post('/getToken', controller.partner.getToken); // 合作方获取token
sbRouter.post('/getOrderSn', controller.order.fetchOrderId); // 合作方获取订单号(老版H5)
sbRouter.post('/getData', controller.partner.partnerShow); // 合作方获取订单数据
sbRouter.post('/getData', controller.order.partnerShow); // 合作方获取订单数据
sbRouter.post('/getCityConfig', controller.task.fetchCityConfig); // 合作方获取城市配置
sbRouter.get('/orderData/:appKey/:orderId', controller.order.orderShow); // 获取展示页面数据
};
......@@ -7,8 +7,8 @@ class CacheService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
const { taskPrefix } = config.lockKeys;
this.taskPrefix = taskPrefix;
const { redisTaskPrefix } = config.taskAPI;
this.taskPrefix = redisTaskPrefix;
}
/**
......
......@@ -58,7 +58,7 @@ class PartnerService extends Service {
});
ctx.logger.info(`【Partner】 fetchTheme ${url}`, ret.data);
if (ret.status === 200 && ret.data && ret.data.id === appKey) {
await this.app.cache.set(redisScriptsPrefix + appKey, JSON.stringify(ret.data), 7200);
await this.app.cache.set(redisScriptsPrefix + appKey, JSON.stringify(ret.data), 300);
}
return ret.data;
}
......@@ -66,7 +66,7 @@ class PartnerService extends Service {
// 查询结束后回调通知合作方
// 对于状态已经是成功的订单号不会在做通知
// orderId/userId/status
async notify({ taskId, cb, orderId, userId, appKey }) {
async notify({ taskId, cb, orderId, userId, appKey, status = 'success' }) {
const { ctx, service } = this;
if (!cb) {
if (ctx.app.notifyMap.has(appKey)) {
......@@ -86,7 +86,7 @@ class PartnerService extends Service {
try {
await ctx.curl(cb, {
method: 'POST',
data: { orderId, status: 'success', userId },
data: { orderSn: orderId, status, userId },
dataType: 'json',
contentType: 'json',
timeout: ['30s', '30s'],
......@@ -129,6 +129,36 @@ class PartnerService extends Service {
}
return ret.data;
}
// 获取合作方appKey开通的服务
async fetchInfo(appKey) {
const { ctx, partnerAPI: { fetchInfo, host, redisInfoPrefix } } = this;
if (appKey) {
const data = await this.app.redis.get(redisInfoPrefix + appKey);
if (data) {
try {
return JSON.parse(data);
} catch (err) {
ctx.logger.error('【Scripts】fetchInfo', redisInfoPrefix + appKey, 'result:', data, err);
await this.app.redis.del(redisInfoPrefix + appKey);
}
}
}
const ret = await ctx.curl(`${host + fetchInfo}`, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
method: 'GET',
data: {
appKey,
},
});
ctx.logger.info(`【Partner】 fetchTheme ${host + fetchInfo}?appKey=${appKey}`, ret.data);
if (ret.status === 200 && ret.data && ret.data.length > 0 && ret.data[0].appKey === appKey) {
await this.app.redis.set(redisInfoPrefix + appKey, JSON.stringify(ret.data[0]), 'EX', 300);
}
return ret.data[0];
}
}
module.exports = PartnerService;
......@@ -41,14 +41,27 @@ class ScriptsService extends Service {
return result.data;
}
async fetchOneScripts(scriptId) {
const { baseURL, fetchOneScriptUrl, ctx } = this;
const { baseURL, fetchOneScriptUrl, redisScriptListKey, ctx } = this;
const data = await this.app.redis.get(redisScriptListKey + scriptId);
if (data) {
try {
return JSON.parse(data);
} catch (err) {
ctx.logger.error('【Scripts】fetchOneScriptsFromRedis', 'result:', data, err);
await this.app.redis.del(redisScriptListKey + scriptId);
}
}
const result = await ctx.curl(baseURL + fetchOneScriptUrl + '/' + scriptId, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
if (result.data && (String(result.data.id) === scriptId)) {
await this.app.redis.set(redisScriptListKey + scriptId, JSON.stringify(result.data), 'EX', 60);
}
return result.data;
}
......@@ -74,7 +87,7 @@ class ScriptsService extends Service {
});
ctx.logger.info(`【Scripts】fetchParams,${baseURL + fetchParamsInfoUrl}`, 'result:', result.data);
if (result.data && result.data.length > 0) {
await this.app.redis.set(redisParamsKey, JSON.stringify(result.data), 'EX', 3000);
await this.app.redis.set(redisParamsKey, JSON.stringify(result.data), 'EX', 300);
}
return result.data;
}
......
......@@ -8,6 +8,7 @@ class WashDataService extends Service {
const { config } = this;
this.washUrl = config.washAPI.host + config.washAPI.washUrl;
}
async wash(data) {
const { app, washUrl, ctx } = this;
const rawdata = this._switchData(data);
......
......@@ -5,6 +5,10 @@ module.exports = appInfo => {
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1542452126322_5140';
config.logger = {
dir: '/jianbing/logs/shebao_h5_server',
};
config.projectRootPath = '/shebao_server';
// add your config here
config.middleware = ['requestLog', 'errorHandler', 'verifyAppKey'];
......
......@@ -21,6 +21,8 @@ module.exports = () => {
redisScriptsPrefix: 'DATA_SERVER_SHEBAO.SCRIPTS',
fetchAgreements: '',
redisAgreementsPrefix: 'DATA_SERVER_SHEBAO.AGREEMENTS',
fetchInfo: '',
redisInfoPrefix: 'DATA_SERVER_SHEBAO.PARTNERINFO',
};
config.scriptsAPI = {
......@@ -33,8 +35,9 @@ module.exports = () => {
fetchNoticeUrl: '/chaos/hf/notice',
fetchHubSeriptsUrl: '/chaos/hf/hubs',
fetchScriptByCityNameUrl: '/chaos/hf/city_scripts',
redisScriptsKey: 'URANUS.HF.SCRIPTS',
redisParamsKey: 'URANUS.HF.PARAMS',
redisScriptsKey: 'DATA_SERVER_SHEBAO.SCRIPTS',
redisParamsKey: 'DATA_SERVER_SHEBAO.PARAMS',
redisScriptListKey: 'DATA_SERVER_SHEBAO.SCRIPTLIST',
};
config.storageAPI = {
......
......@@ -5,24 +5,25 @@ module.exports = () => {
config.debug = false;
config.taskAPI = {
host: process.env.TASKAPI_HOST || 'http://tm.51gjj.com:4831',
host: process.env.TASKAPI_HOST,
fetchHubsUrl: '',
createTaskUrl: '/shebao/createSbTask',
fetchCodeUrl: '/shebao/getSbCode',
submitTaskUrl: '/shebao/loginSbWeb',
fetchTaskUrl: '/shebao/getSbData', // 获取该task状态
redisTaskPrefix: 'DATA_SERVER_SHEBAO.TASK',
};
config.partnerAPI = {
host: process.env.PARTNERAPI_HOST || 'https://dev-nginx.jianbing.com/zeus-api/v1',
host: process.env.PARTNERAPI_HOST,
fetchTheme: '/chaos/partners/theme',
fetchScripts: '/chaos/partners/scripts',
redisThemePrefix: 'URANUS.HF.PARNTERS.THEME',
redisScriptsPrefix: 'URANUS.HF.PARNTERS.SCRIPTS',
redisThemePrefix: 'DATA_SERVER_SHEBAO.PARNTERS.THEME',
redisScriptsPrefix: 'DATA_SERVER_SHEBAO.PARNTERS.SCRIPTS',
};
config.scriptsAPI = {
host: process.env.SCRIPTSAPI_HOST || 'https://dev-nginx.jianbing.com/zeus-api/v1',
host: process.env.SCRIPTSAPI_HOST,
fetchScriptsUrl: '/chaos/hf/two_dimension_array/queries',
fetchOneScriptUrl: '/chaos/hf/two_dimension_array/info',
fetchParamsInfoUrl: '/chaos/hf/login_param_map',
......@@ -31,12 +32,12 @@ module.exports = () => {
fetchNoticeUrl: '/chaos/hf/notice',
fetchHubSeriptsUrl: '/chaos/hf/hubs',
fetchScriptByCityNameUrl: '/chaos/hf/city_scripts',
redisScriptsKey: 'URANUS.HF.SCRIPTS',
redisParamsKey: 'URANUS.HF.PARAMS',
redisScriptsKey: 'DATA_SERVER_SHEBAO.SCRIPTS',
redisParamsKey: 'DATA_SERVER_SHEBAO.PARAMS',
};
config.storageAPI = {
host: process.env.STORAGEAPI_HOST || 'http://tv.51gjj.com:11252',
host: process.env.STORAGEAPI_HOST,
writeUrl: '/data',
readUrl: '/shebao',
writeType: 'shebao',
......@@ -44,12 +45,12 @@ module.exports = () => {
};
config.washAPI = {
host: process.env.WASHAPI_HOST || 'http://tt.51gjj.com:11101',
host: process.env.WASHAPI_HOST,
washUrl: '/si/analyzeSI',
};
config.signatureAPI = {
host: process.env.SIGNATUREAPI_HOST || 'http://tj3.51gjj.com:5118',
host: process.env.SIGNATUREAPI_HOST,
fetchTokenUrl: '/Access/GetToken',
fetchOrderIdUrl: '/Order/GetOrderSn',
signatureUrl: '/Access/SignValidityCheck',
......@@ -57,12 +58,11 @@ module.exports = () => {
signatureType: 'shebao',
};
config.lockKeys = {
config.redisKeys = {
fecthHub: 'NEWSB.HF.HUBS.LOCK',
fecteToken: 'NEWSB.HF.TOKEN.LOCK',
token: 'NEWSB.HF.TOKEN',
fecthParnters: 'NEWSB.PARNTERS.LOCK',
taskPrefix: 'NEWSB.TASK',
};
config.sequelize = {
......@@ -72,30 +72,30 @@ module.exports = () => {
delegate: 'model',
baseDir: 'model',
dialect: 'mysql',
host: process.env.MYSQL_PACHONG_HOST || 'rm-bp1272001633qc0x9.mysql.rds.aliyuncs.com',
database: process.env.MYSQL_DATA_SERVER_DB_NAME || 'data_service_dev',
username: process.env.MYSQL_USER || 'hexin',
password: process.env.MYSQL_PWD || 'gYUHszn9#q',
port: process.env.MYSQL_PORT || 3306,
host: process.env.MYSQL_PACHONG_HOST,
database: process.env.MYSQL_DATA_SERVER_DB_NAME,
username: process.env.MYSQL_USER,
password: process.env.MYSQL_PWD,
port: process.env.MYSQL_PORT,
}, {
// 东八时区
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,
host: process.env.MYSQL_PACHONG_HOST,
database: process.env.MYSQL_JAVA_DB_NAME,
username: process.env.MYSQL_USER,
password: process.env.MYSQL_PWD,
port: process.env.MYSQL_PORT,
}],
};
config.redis = {
client: {
port: 6379,
host: process.env.REDIS_HOST || '116.62.55.137',
password: process.env.REDIS_PWD || 'DEV8redis',
host: process.env.REDIS_HOST,
password: process.env.REDIS_PWD,
db: 0,
},
};
......
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