Commit a23710e5 authored by 何娜's avatar 何娜

taxApi new

parent a1489e62
'use strict';
module.exports = {
write: true,
prefix: '^',
plugin: 'autod-egg',
test: [
'test',
'benchmark',
],
dep: [
'egg',
'egg-scripts',
],
devdep: [
'egg-ci',
'egg-bin',
'egg-mock',
'autod',
'autod-egg',
'eslint',
'eslint-config-egg',
'webstorm-disable-index',
],
exclude: [
'./test/fixtures',
'./dist',
],
};
{
"extends": [
"eslint-config-egg"
],
"parserOptions": {
"ecmaFeatures": {
"experimentalObjectRestSpread": true
}
},
"rules": {
"indent": ["error", 2],
"array-bracket-spacing": ["error", "never"],
"linebreak-style": "off"
}
}
\ No newline at end of file
logs/
npm-debug.log
yarn-error.log
node_modules/
package-lock.json
yarn.lock
coverage/
.idea/
run/
.DS_Store
*.sw*
*.un~
variables:
DOCKER_REGISTRY: 't-docker.51gjj.com'
before_script:
- docker login -u pengtianzi -p 4dc8b3a4d91fa7fa $DOCKER_REGISTRY
stages:
- pre_deploy
build_docker_image:
stage: pre_deploy
script:
- export IMAGE_TAG=${CI_COMMIT_TAG:-latest}
- docker build -t $DOCKER_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAG .
- docker push $DOCKER_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAG
tags:
- docker-image-builder
sudo: false
language: node_js
node_js:
- '8'
install:
- npm i npminstall && npminstall
script:
- npm run ci
after_script:
- npminstall codecov && codecov
FROM t-docker.51gjj.com/tools/node:8.12.0
ENV LANG C.UTF-8
ENV NODE_ENV production
ENV PATH $PATH:/usr/local/node/bin/
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN yarn config set registry "https://registry.npm.taobao.org/"
RUN yarn install
COPY . /usr/src/app
EXPOSE 7001
CMD [ "yarn", "docker" ]
# gjj_api
公积金API查询服务
## QuickStart
<!-- add docs here for user -->
see [egg docs][egg] for more detail.
### Development
```bash
$ npm i
$ npm run dev
$ open http://localhost:7001/
```
### Deploy
```bash
$ npm start
$ npm stop
```
### npm scripts
- Use `npm run lint` to check code style.
- Use `npm test` to run unit test.
- Use `npm run autod` to auto detect dependencies upgrade, see [autod](https://www.npmjs.com/package/autod) for more detail.
[egg]: https://eggjs.org
\ No newline at end of file
# gjj_api_server
公积金API认证服务
## 快速入门
<!-- 在此次添加使用文档 -->
如需进一步了解,参见 [egg 文档][egg]
### 本地开发
```bash
$ npm i
$ npm run dev
$ open http://localhost:7001/
```
### 部署
```bash
$ npm start
$ npm stop
```
### 单元测试
- [egg-bin] 内置了 [mocha], [thunk-mocha], [power-assert], [istanbul] 等框架,让你可以专注于写单元测试,无需理会配套工具。
- 断言库非常推荐使用 [power-assert]
- 具体参见 [egg 文档 - 单元测试](https://eggjs.org/zh-cn/core/unittest)
### 内置指令
- 使用 `npm run lint` 来做代码风格检查。
- 使用 `npm test` 来执行单元测试。
- 使用 `npm run autod` 来自动检测依赖更新,详细参见 [autod](https://www.npmjs.com/package/autod)
[egg]: https://eggjs.org
'use strict';
const Controller = require('egg').Controller;
class OrderController extends Controller {
constructor(ctx) {
super(ctx);
this.showRule = {
sign: 'string',
params: {
type: 'object',
rule: {
token: 'string',
orderSn: {
type: 'string',
format: /^(\w{8})-(\w{4})-(\w{4})-(\w{4})-(\w{12})$/,
message: '订单号格式错误',
},
appKey: 'string',
timestamp: 'string',
},
},
};
this.fetchRule = {
signParams: {
type: 'object',
rule: {
sign: 'string',
params: {
type: 'object',
rule: {
appKey: 'string',
timestamp: 'string',
token: 'string',
},
},
}
},
cityId: 'string'
};
}
//拉取数据接口
async partnerShow() {
const { ctx, service } = this;
try {
ctx.validate(this.showRule);
const { appKey, orderSn } = ctx.request.body.params;
// await service.signature.signatureCheck(ctx.request.body);
let data = await service.cache.get({ key: orderSn });
let result = { code: 2, msg: '任务还在执行或未输入', data: {} };
if (data) {
if (data.status === 'success') {
const result = await service.storage.read(orderSn, appKey);
ctx.body = {
code: 0,
data: result
};
return;
} else if (data.note) {
result = data.note;
}
ctx.body = result;
return;
}
} catch (err) {
ctx.logger.error('partnerShow', err);
ctx.status = 200;
if (err.code == 'invalid_param') {
return ctx.body = { code: -1, msg: err.message || '' };
}
return ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
//创建订单号接口
async fetchOrderId() {
const { ctx, service } = this;
try {
ctx.validate(this.fetchRule);
const { appKey } = ctx.request.body.signParams.params;
const { cityId } = ctx.request.body;
const orderId = await service.signature.createOrderId(ctx.request.body.signParams);
const taskId = await service.task.create(cityId);
await service.order.create({
orderId,
taskId,
cityId: cityId,
notifyUrl: ctx.app.notifyMap.get(appKey) && ctx.app.notifyMap.get(appKey).notifyUrl || '',
appKey: appKey,
status: 'init',
});
ctx.body = {
code: 0,
data: {
orderSn: orderId
},
msg: ''
}
} catch (err) {
ctx.logger.error('fetchOrderId', err);
ctx.status = 200;
if (err.code == 'invalid_param') {
return ctx.body = { code: -1, msg: err.message || '' };
}
if (/[a-zA-Z]+/.test(err.message)) {
return ctx.body = { code: err.code || -1, msg: '系统错误, 请稍后再试' };
}
return ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
}
module.exports = OrderController;
'use strict';
const Controller = require('egg').Controller;
class TaskController extends Controller {
constructor(ctx) {
super(ctx);
this.createRule = {
scriptId: 'number',
orderId: 'string',
};
this.submitRule = {
orderSn: {
type: 'string',
format: /^(\w{8})-(\w{4})-(\w{4})-(\w{4})-(\w{12})$/,
message: 'orderSn格式错误',
},
params: {
type: 'object',
rule: {
phone: { type: 'string', format: /^1\d{10}$/, required: false, message: '手机号格式错误' },
ID: { type: 'string', format: /^\d{14}(\d{3})?[\dXx]$/, required: false, message: '身份证格式错误' },
},
}
};
this.fetchCaptureRule = {
orderSn: {
type: 'string',
format: /^(\w{8})-(\w{4})-(\w{4})-(\w{4})-(\w{12})$/,
message: 'orderSn格式错误',
},
type: { type: 'enum', values: ['code', 'phone_code'] },
};
this.taskIdRule = {
taskId: { type: 'string', format: /\d+/ },
};
this.cityListRule = {
sign: 'string',
params: {
type: 'object',
rule: {
token: 'string',
appKey: 'string',
timestamp: 'string',
},
},
};
}
//创建任务接口
async create() {
const { ctx, service } = this;
ctx.validate(this.createRule);
const { scriptId } = ctx.request.body;
const taskId = await service.task.create(scriptId);
ctx.success({ taskId });
}
//提交任务接口
async submit() {
const { ctx, service, config } = this;
try {
ctx.validate(this.submitRule);
const { orderSn } = ctx.request.body;
let order = await service.cache.get({ key: orderSn });
if (order.status == 'success' || order.status == 'failure') {
return ctx.body = {
code: -1,
msg: '此任务已结束'
}
}
await service.cache.set({
key: orderSn, value: {
status: 'submit',
note: { code: 3, msg: '任务已提交', data: { data: null, loginParam: null, cityId: order.cityId, orderSn } },
}
});
await service.task.submit({
taskId: order.taskId,
data: ctx.request.body.params,
callbackUrl: config.callbackUrl,
});
ctx.body = {
msg: null,
code: 0,
data: {
cityId: order.cityId,
orderSn
}
};
} catch (err) {
ctx.logger.error('submit', err);
ctx.status = 200;
if (err.code == 'invalid_param') {
return ctx.body = { code: -1, msg: err.message || '' };
}
if (/[a-zA-Z]+/.test(err.message)) {
return ctx.body = { code: err.code || -1, msg: '系统错误, 请稍后再试' };
}
return ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
//获取验证码接口
async fetchCapture() {
const { ctx, service } = this;
try {
ctx.validate(this.fetchCaptureRule);
const { type, orderSn } = ctx.request.body;
const order = await service.cache.get({ key: orderSn });
if (order.status == 'success' || order.status == 'failure') {
return ctx.body = {
code: -1,
msg: '此任务已结束'
}
}
const result = await service.task.fetchCapture({
taskId: order.taskId,
type,
});
delete result.taskId;
ctx.body = {
code: 0,
data: { ...result, orderSn }
};
} catch (err) {
ctx.logger.error('submit', err);
ctx.status = 200;
if (err.code == 'invalid_param') {
return ctx.body = { code: -1, msg: err.message || '' };
}
if (/[a-zA-Z]+/.test(err.message)) {
return ctx.body = { code: err.code || -1, msg: '系统错误, 请稍后再试' };
}
return ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
//任务回调接口
async handleCallback() {
const { ctx, service } = this;
const { taskId } = ctx.request.body;
const result = await service.task.fetchTask({ taskId });
ctx.success();
const order = await service.order.getOneByTaskId(taskId);
if (!order) {
ctx.logger.error('handleCallback', taskId, '未查询到此任务');
return
}
const { orderId, appKey, cityId } = order;
let taskNote = {
status: 'init',
note: { code: 2, msg: '任务正在执行', data: { data: null, loginParam: null, cityId, orderSn: orderId } },
};
switch (result.code) {
case -1:
case 106:
case 102:
case 204:
taskNote = {
status: 'failure',
note: { code: -1, msg: result.msg, data: { data: null, loginParam: null, cityId, orderSn: orderId } },
};
await service.cache.set({
key: orderId,
value: taskNote,
});
await service.partner.notice(order);
break;
case 1:
taskNote = {
status: 'next',
note: { code: 1, msg: null, data: { data: null, loginParam: result.loginParam, cityId, orderSn: orderId } },
};
await service.cache.set({
key: orderId,
value: taskNote,
});
await service.partner.notice(order);
break;
case 110:
taskNote = {
status: 'query',
note: { code: 110, msg: '任务提交成功', data: { data: null, loginParam: null, cityId, orderSn: orderId } },
};
break;
case 0:
taskNote = {
status: 'success',
note: { code: 0, msg: '任务成功', data: { data: null, loginParam: null, cityId, orderSn: orderId } },
};
try {
const insertData = await service.washData.wash(result);
insertData.orderId = orderId;
insertData.cityName = await service.scripts.fetchScriptName(insertData.cid);
insertData.taskId = Number(taskId);
insertData.appKey = appKey;
delete insertData.code;
await service.storage.write(insertData);
await service.cache.set({
key: orderId,
value: taskNote,
});
await service.partner.notice(order);
} catch (err) {
ctx.logger.error('handleCallback', err, JSON.stringify(result));
taskNote = {
status: 'failure',
note: { code: -1, msg: '系统错误', data: { data: null, loginParam: null, cityId: order.cityId, orderSn: order.orderId } },
};
}
break;
default:
ctx.logger.warn('handleCallback', JSON.stringify(result));
break;
}
}
//获取城市配置
async cityConfigs() {
const {ctx, service} = this;
const result = await service.task.getCityList();
ctx.success({
code: 0,
data: result
});
}
}
module.exports = TaskController;
'use strict';
const Controller = require('egg').Controller;
class TokenController extends Controller {
constructor(ctx) {
super(ctx);
this.createRule = {
sign: 'string',
params: {
type: 'object',
rule: {
appKey: 'string',
timestamp: 'string',
},
},
};
}
//获取token
async partnerCreate() {
const { ctx, service } = this;
try {
ctx.validate(this.createRule);
const token = await service.signature.createToken(ctx.request.body);
return ctx.body = {
code: 0,
data: { token },
msg: ''
}
} catch (err) {
ctx.logger.error('partnerCreate', err);
ctx.status = 200;
if (err.code == 'invalid_param') {
return ctx.body = { code: -1, msg: err.message || '' };
}
return ctx.body = { code: err.code || -1, msg: err.message || '' };
}
}
}
module.exports = TokenController;
'use strict';
const NODE_CACHE = Symbol('Context#NodeCache');
const NodeCache = require('node-cache');
class Cache {
constructor(app) {
this.app = app;
this.name = 'unknown-cache';
}
async val(key, next, ttl) {
let data = await this.get(key);
if (data) {
return data;
}
data = await next(key);
await this.set(key, data, ttl);
return data;
}
async get(key) {
const startTime = +new Date();
const ret = await this._get(key);
let jsonText = JSON.stringify(ret);
if (jsonText === undefined) {
jsonText = 'undefined';
} else if (jsonText.length >= 128) {
if (/^\{/.test(jsonText)) {
jsonText = '{...}';
} else if (/^\[/.test(jsonText)) {
jsonText = '[...]';
} else {
jsonText = jsonText.substr(0, 125) + '...';
}
}
this.app.logger.info(`[cache] get (${+new Date() - startTime}ms) ${this.name}.${key}: ${jsonText}`);
return ret;
}
async set(key, value, ttl = 60) {
this.app.logger.info(`[cache] set (ms)${this.name}.${key}: ${value}`);
return await this._set(key, value, ttl);
}
async del(key){
return await this._del(key)
}
}
class NodeCacheWrap extends Cache {
constructor(app) {
super(app);
this.cache = new NodeCache();
this.name = 'node-cache';
}
async _get(key) {
return this.cache.get(key);
}
async _set(key, value, ttl) {
const { cache } = this;
value = JSON.parse(JSON.stringify(value));
if (ttl > 0) {
cache.set(key, value, ttl);
} else {
cache.set(key, value);
}
}
async _del(key){
const { cache } = this;
cache.del(key);
}
}
module.exports = {
get cache() {
if (!this[NODE_CACHE]) {
this[NODE_CACHE] = new NodeCacheWrap(this);
}
return this[NODE_CACHE];
},
};
'use strict';
module.exports = {
success(data = false) {
const method = this.request.method.toLowerCase();
if (method === 'get') {
this.status = 200;
this.body = data || {};
} else if (method === 'post') {
this.status = 201;
this.body = data || {};
} else if (method === 'put' || method === 'delete') {
this.status = data ? 200 : 204;
this.body = data ? data : '';
} else {
this.status = 204;
this.body = '';
}
},
fail(error = '') {
this.status = 400;
this.body = {
error,
};
},
};
'use strict';
const querystring = require('querystring');
const crypto = require('crypto');
function process(params) {
const keys = Object.keys(params)
.filter(key => {
return (
params[key] !== undefined &&
params[key] !== '' &&
['appSecret', 'partner_key', 'sign', 'key'].indexOf(key) < 0
);
})
.sort();
const result = {};
for (const key of keys) {
result[key] = params[key];
}
return result;
}
module.exports.buildRequestBody = function(params, needNonceStr = false) {
const { app } = this;
const { appKey, appSecret } = app.config.GJJ_OpenAPI;
params = params || {};
params.appKey = appKey;
params.timestamp = Date.now();
if (needNonceStr) {
params.nonce_str = this.genRandomStr(16);
}
const signStr = this.paramSign(appSecret, params);
return { sign: signStr, params };
};
module.exports.genRandomStr = function(length) {
return crypto.randomBytes(length).toString('hex');
};
module.exports.paramSign = function(appSecret, params) {
if (!params) {
const err = new Error('parameter params missing');
err.name = 'ParameterSignError';
throw err;
}
if (!appSecret) {
const err = new Error('parameter appSecret missing');
err.name = 'ParamSignError';
throw err;
}
const newParams = process(params);
let query = querystring.stringify(newParams);
query += '&appSecret=' + appSecret;
const signStr = crypto
.createHash('md5')
.update(query)
.digest('hex')
.toUpperCase();
return signStr;
};
\ No newline at end of file
'use strict';
module.exports = (options, app) => {
return async function errorHandler(ctx, next) {
try {
if(ctx.request.method == 'POST'){
app.logger.info(JSON.stringify(ctx.request.body));
}
await next();
} catch (err) {
// 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志
ctx.app.emit('error', err, ctx);
const status = err.status || 500;
// 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
const error = status === 500 && ctx.app.config.env === 'prod'
? 'Internal Server Error'
: err.message;
// 从 error 对象上读出各个属性,设置到响应中
ctx.fail(error);
if (status === 422) {
ctx.body.detail = err.errors;
}
ctx.status = status;
}
};
};
'use strict';
module.exports = (options, app) => {
return async function(ctx, next) {
const { request } = ctx;
const { header } = request;
const ipStr = header['x-real-ip'] || header['x-forwarded-for'];
if (ipStr) {
request.ip = ipStr;
}
const start = new Date();
let ms = 0;
await next();
ms = new Date() - start;
app.logger.info(
`[middleware-response-time](${ms}ms) ${request.method} ${request.protocol}://${request.ip}${
request.originalUrl
} ${ctx.response.status}`
);
};
};
'use strict';
module.exports = app => {
const { DataTypes } = app.Sequelize;
const cusDatas = app.model.define('cusDatas', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true,
field: 'id',
},
orderId: {
type: DataTypes.STRING(255),
allowNull: false,
defaultValue: '',
primaryKey: true,
field: 'orderId',
},
appKey: {
type: DataTypes.STRING(255),
allowNull: false,
field: 'appKey',
},
type: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'type',
},
date: {
type: DataTypes.DATE,
allowNull: true,
defaultValue: app.Sequelize.literal('CURRENT_TIMESTAMP'),
field: 'date',
},
text1: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text1',
},
text2: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text2',
},
text3: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text3',
},
text4: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text4',
},
date1: {
type: DataTypes.DATE,
allowNull: true,
field: 'date1',
},
date2: {
type: DataTypes.DATE,
allowNull: true,
field: 'date2',
},
},
{
tableName: 'cus_data',
timestamps: false,
});
return cusDatas;
}
\ No newline at end of file
'use strict';
module.exports = app => {
const { DataTypes } = app.Sequelize;
const taskStatsu = app.model.define('taskStatsu', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true,
field: 'id',
},
orderId: {
type: DataTypes.STRING(255),
allowNull: false,
defaultValue: '',
primaryKey: true,
field: 'orderId',
},
taskId: {
type: DataTypes.STRING(255),
allowNull: false,
defaultValue: '',
field: 'taskId',
},
userId: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'userId',
},
cityId: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'cityId',
},
appkey: {
type: DataTypes.STRING(255),
allowNull: false,
field: 'appKey',
},
notifyUrl: {
type: DataTypes.STRING(500),
allowNull: true,
defaultValue: '',
field: 'notifyUrl',
},
callbackUrl: {
type: DataTypes.STRING(255),
allowNull: false,
defaultValue: '',
field: 'callbackUrl',
},
status: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'status',
},
note: {
type: DataTypes.STRING(8000),
allowNull: true,
defaultValue: '',
field: 'note',
get() {
const note = this.getDataValue('note');
if (note) {
try {
return JSON.parse(note);
} catch (error) {
return {};
}
}
return {};
},
set(val) {
this.setDataValue('note', JSON.stringify(val));
},
},
created_at: {
type: DataTypes.DATE,
allowNull: true,
defaultValue: app.Sequelize.literal('CURRENT_TIMESTAMP'),
field: 'createDate',
},
updated_at: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: app.Sequelize.literal('CURRENT_TIMESTAMP'),
field: 'updateDate',
},
text1: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text1',
},
text2: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text2',
},
text3: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: '',
field: 'text3',
},
}, {
tableName: 'taxh5_status',
// timestamps: false,
});
return taskStatsu;
};
'use strict';
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app;
const taxRouter = router.namespace(app.config.projectRootPath);
taxRouter.post('/getToken', controller.token.partnerCreate);// 合作方创建token
taxRouter.post('/getorderSn', controller.order.fetchOrderId);// 合作方获取订单号
taxRouter.get('/getCity', controller.task.cityConfigs);// 获取城市基础配置项
taxRouter.post('/getCode', controller.task.fetchCapture);// 获取验证码
taxRouter.post('/query', controller.task.submit);// 提交任务查询参数
taxRouter.post('/getData', controller.order.partnerShow);// 合作方获取订单数据
taxRouter.post('/callback', controller.task.handleCallback); // 处理回调结果,不对外
taxRouter.get('/helpInfo', controller.task.fetchCapture);// 获取帮助信息
};
'use strict';
module.exports = {
schedule: {
interval: '5m', // 5分钟间隔
type: 'all', // 所有woker
immediate: true,
},
async task(ctx) {
try {
const { host, customerUrl } = ctx.app.config.signatureAPI;
const notifyMap = new Map();
const ret = await ctx.curl(host + customerUrl, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
// ctx.logger.info(JSON.stringify(ret.data));
if (ret.data.code == '0') {
ret.data.data.customerList.map(customer => {
if ('callBackUrl' in customer) {
notifyMap.set(customer.appKey, { notifyUrl: customer.callBackUrl });
}
});
ctx.app.notifyMap = notifyMap;
}
} catch (e) {
ctx.logger.error('【schedule/notifyUrlTask】catch error:', JSON.stringify(e));
}
}
}
\ No newline at end of file
'use strict';
const Service = require('egg').Service;
class CacheService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
const { taskPrefix } = config.lockKeys;
this.taskPrefix = taskPrefix;
}
/**
* 将orderId状态缓存到redis和数据库
* @param {Object} key orderId
* - value: 状态 提示信息 status 、note={}
* - exprie: 过期时间
*/
async set({ key, value = {}, exprie = 300 }) {
const { ctx, app, taskPrefix } = this;
const data = await app.redis.get(taskPrefix + key);
if (!data || (data && data.status !== 'success')) {
await app.redis.set(taskPrefix + key, JSON.stringify(value), 'EX', exprie);
}
const order = await ctx.model.TaskStatus.findOne({
where: { orderId: key },
});
if (order && order.status !== 'success') {
await order.update({ ...value });
} else {
ctx.logger.error('【Cache】set no order or already success', key);
}
ctx.logger.info(`【Cache】set ${key} value:`, JSON.stringify(value));
}
/**
* 获取orderSn状态 优先redis
* @param {Object} key orderSn
* @return {Object} status note
*/
async get({ key }) {
const { ctx, app, taskPrefix } = this;
const data = await app.redis.get(taskPrefix + key);
if (data) {
ctx.logger.info(`【Cache】get From redis ${key} data:`, data);
return JSON.parse(data);
}
const order = await ctx.model.TaskStatus.findOne({
where: { orderId: key },
});
if (order) {
ctx.logger.info(`【Cache】get From Model ${key} order:`, JSON.stringify({ status: order.status, note: order.note }));
return order;
}
ctx.logger.error(`【Cache】get No Result ${key} `);
this.ctx.throw(400, { message: '无此订单号' });
}
}
module.exports = CacheService;
'use strict';
const Service = require('egg').Service;
class OrderService extends Service {
async getOneByOrderId(orderId) {
const { ctx } = this;
const order = await ctx.model.TaskStatus.findOne({
where: { orderId },
});
return order;
}
async getOneByTaskId(taskId) {
const { ctx } = this;
const order = await ctx.model.TaskStatus.findOne({
where: { taskId },
});
return order;
}
async create(params) {
const { ctx } = this;
await ctx.model.TaskStatus.create(params);
return;
}
async update(params) {
const { ctx } = this;
const order = await ctx.model.TaskStatus.findAll({
where: { orderId: params.orderId },
order: [['createDate', 'DESC']],
});
if (order.length === 0) {
ctx.throw(400, { message: 'no order' });
return;
}
for (const item of order) {
if (item.status === 'success') {
ctx.throw(400, { message: 'orderId success' });
return;
}
}
const { appKey, taskId, notifyUrl, backUrl, userId } = order[0];
if (taskId) {
await ctx.model.TaskStatus.create({ appKey, status: 'init', notifyUrl, backUrl, userId, ...params })
} else {
await order[0].update(params);
}
return order[0];
}
}
module.exports = OrderService;
'use strict';
const Service = require('egg').Service;
class PartnerService extends Service {
constructor(ctx) {
super(ctx);
const { config: { partnerAPI } } = this;
this.partnerAPI = partnerAPI;
}
async notice(order) {
const { ctx } = this;
const { orderId, notifyUrl, notice } = order;
if (notifyUrl && notice !== '1') {
const ret = await ctx.curl(notifyUrl, {
charset: 'utf-8',
timeout: ['30s', '30s'],
contentType: 'json',
method: 'POST',
data: {
orderSn: orderId
},
}
)
ctx.logger.info(`【Partner】 notice ${notifyUrl}`, 'orderId:', orderId, 'result:', ret.status, JSON.stringify(ret.data));
if (ret.status == 200) {
await order.update({ notice: '1' });
}
}
return;
}
}
module.exports = PartnerService;
'use strict';
const Service = require('egg').Service;
class ScriptsService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
const { scriptsAPI, cityListAPI } = config;
this.cityListAPI = cityListAPI;
this.scriptsAPI = scriptsAPI;
this.baseURL = scriptsAPI.host;
this.fetchScriptsUrl = scriptsAPI.fetchScriptsUrl;
this.fetchOneScriptUrl = scriptsAPI.fetchOneScriptUrl;
this.fetchParamsInfoUrl = scriptsAPI.fetchParamsInfoUrl;
this.fetchHelpUrl = scriptsAPI.fetchHelpUrl;
this.redisScriptsKey = scriptsAPI.redisScriptsKey;
this.redisParamsKey = scriptsAPI.redisParamsKey;
this.redisScriptListKey = scriptsAPI.redisScriptListKey;
}
async fetchScripts() {
const { baseURL, fetchScriptsUrl, redisScriptsKey, ctx } = this;
const data = await this.app.redis.get(redisScriptsKey);
if (data) {
try {
return JSON.parse(data);
} catch (err) {
ctx.logger.error('【Scripts】fetchScriptsFromRedis', 'result:', data, err);
await this.app.redis.del(redisScriptsKey);
}
}
const result = await ctx.curl(baseURL + fetchScriptsUrl, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
ctx.logger.info(`【Scripts】fetchScripts,${baseURL + fetchScriptsUrl}`, 'result:', result.data);
if (result.data && result.data.length > 0) {
await this.app.redis.set(redisScriptsKey, JSON.stringify(result.data), 'EX', 300);
}
return result.data;
}
async fetchOneScripts(scriptId) {
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;
}
async fetchParams(refresh = false) {
const { baseURL, fetchParamsInfoUrl, redisParamsKey, ctx } = this;
if (!refresh) {
const data = await this.app.redis.get(redisParamsKey);
if (data) {
try {
return JSON.parse(data);
} catch (err) {
ctx.logger.error('【Scripts】fetchParams', 'result:', data, err);
await this.app.redis.del(redisParamsKey);
}
}
}
const result = await ctx.curl(baseURL + fetchParamsInfoUrl, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
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', 300);
}
return result.data;
}
async fetchHelp(scriptId) {
const { baseURL, scriptsAPI: { fetchHelpUrl }, ctx } = this;
const result = await ctx.curl(baseURL + fetchHelpUrl + '/' + scriptId, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
return result.data;
}
async fetchQueryButton(scriptId) {
const { baseURL, scriptsAPI: { fetchQueryButtonUrl }, ctx } = this;
const result = await ctx.curl(baseURL + fetchQueryButtonUrl + '/' + scriptId, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
return result.data;
}
async fetchNotice(scriptId) {
const { baseURL, scriptsAPI: { fetchNoticeUrl }, ctx } = this;
const result = await ctx.curl(baseURL + fetchNoticeUrl + '/' + scriptId, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
return result.data;
}
async fetchHubSeripts(hubId) {
const { baseURL, scriptsAPI: { fetchHubSeriptsUrl }, ctx } = this;
const result = await ctx.curl(baseURL + fetchHubSeriptsUrl + '/' + hubId + '/scripts', {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
return result.data;
}
async fetchCityFormIp() {
const { ctx } = this;
const { ip } = ctx.request;
ctx.logger.info(ctx.request);
const url = `https://api.map.baidu.com/location/ip?ak=3TBenWOhPygtFFazaR5kSibU&ip=${ip}`;
const result = await ctx.curl(url, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
if (result.data.status === 0) {
return result.data.content.address_detail.city;
}
ctx.logger.error('fetchCityFormIp', url, JSON.stringify(result.data));
return '北京市';
}
async fetchScriptByCityName(name) {
const { baseURL, scriptsAPI: { fetchScriptByCityNameUrl }, ctx } = this;
const result = await ctx.curl(baseURL + fetchScriptByCityNameUrl + '?name=' + encodeURIComponent(name) + '&type=query', {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
ctx.logger.info(`fetchScriptByCityName,${baseURL + fetchScriptByCityNameUrl + '?name=' + name}`, 'result:', JSON.stringify(result.data));
return result.data;
}
async fetchScriptIdByIp() {
const city = await this.fetchCityFormIp();
const scriptList = await this.fetchScriptByCityName(city);
return scriptList;
}
async fetchScriptName(scriptId) {
try {
const city = await this.fetchOneScripts(scriptId);
return city.name || '未知';
} catch (err) {
return '未知';
}
}
async fetchScriptList() {
const { cityListAPI, ctx } = this;
const result = await ctx.curl(cityListAPI, {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
});
ctx.logger.info(`fetchScriptList,${cityListAPI}`, 'result:', JSON.stringify(result.data));
return result.data;
}
}
module.exports = ScriptsService;
'use strict';
const Service = require('egg').Service;
class SignatureService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
const { signatureAPI, lockKeys } = config;
this.baseURL = signatureAPI.host;
this.fetchTokenUrl = signatureAPI.fetchTokenUrl;
this.fetchOrderIdUrl = signatureAPI.fetchOrderIdUrl;
this.signatureUrl = signatureAPI.signatureUrl;
this.signatureType = signatureAPI.signatureType;
this.LOCK_KEY = lockKeys.fecteToken;
this.SCRIPTS_KEY = lockKeys.token;
}
_request(url, opts) {
const { ctx, baseURL } = this;
url = `${baseURL}${url}`;
opts = {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
...opts,
};
ctx.logger.info('signnature', url, opts);
return ctx.curl(url, opts);
}
_checkSuccess(result) {
if (result.status !== 200) {
const errorMsg = result.data && result.data.error_msg ? result.data.error_msg : 'unknown error';
this.ctx.throw(result.status, errorMsg);
}
if (result.data.code !== 0) {
this.ctx.throw(400, { message: result.data.msg, code: result.data.code });
}
}
async createToken(params) {
const { fetchTokenUrl, ctx } = this;
const result = await this._request(fetchTokenUrl, {
method: 'post',
data: params,
contentType: 'json',
});
ctx.logger.info('【Signature】createToken params', JSON.stringify(params), 'result:', JSON.stringify(result.data));
this._checkSuccess(result);
return result.data.data.token;
}
async createOrderId(params) {
const { fetchOrderIdUrl, ctx, signatureType } = this;
const result = await this._request(fetchOrderIdUrl, {
method: 'post',
data: { ...params, type: signatureType },
contentType: 'json',
});
ctx.logger.info('【Signature】createOrderId params', JSON.stringify(params), 'result:', JSON.stringify(result.data));
this._checkSuccess(result);
return result.data.data.orderSn;
}
async signatureCheck(params) {
const { signatureUrl, signatureType, ctx } = this;
const result = await this._request(signatureUrl, {
method: 'post',
data: { ...params, type: signatureType },
contentType: 'json',
});
ctx.logger.info('【Signature】signatureCheck params', JSON.stringify(params), 'result:', JSON.stringify(result.data));
this._checkSuccess(result);
return result.data.data;
}
}
module.exports = SignatureService;
'use strict';
const Service = require('egg').Service;
class StorageService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
const { storageAPI } = config;
this.baseURL = storageAPI.host;
this.writeUrl = storageAPI.writeUrl;
this.readUrl = storageAPI.readUrl;
this.writeType = storageAPI.writeType;
this.readDataKey = storageAPI.readDataKey;
}
_request(url, opts) {
const { ctx, baseURL } = this;
url = `${baseURL}${url}`;
opts = {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
...opts,
};
return ctx.curl(url, opts);
}
async write(data) {
const { writeUrl, writeType, ctx } = this;
const result = await this._request(writeUrl, {
method: 'post',
data: { ...data, serviceType: writeType },
contentType: 'json',
});
ctx.logger.info(`【Storage】write url:${writeUrl} params`, JSON.stringify({ ...data, serviceType: writeType }), 'result:', JSON.stringify(result.data));
if (result.data.code !== '0') {
throw new Error('存储数据出错');
}
return;
}
async read(orderId, appKey) {
const { readUrl, readDataKey, ctx } = this;
const result = await this._request(`${readUrl}/${orderId}`, {
method: 'get',
contentType: 'json',
});
ctx.logger.info(`【Storage】read url:${readUrl}/${orderId} write result:`, JSON.stringify(result.data));
if (result && result.data && result.data.code !== 0) {
ctx.logger.error(`storageAPI read ${readUrl}/${orderId}`, JSON.stringify(result.data));
ctx.throw(400, { message: result.data.msg });
}
await ctx.model.Cusdata.create({
appKey,
orderId,
type: 'gjj'
})
return result.data.data[readDataKey];
}
}
module.exports = StorageService;
'use strict';
const Service = require('egg').Service;
class TaskService extends Service {
constructor(ctx) {
super(ctx);
const {config} = this;
const {taskAPI, LOCK_KEY} = config;
this.baseURL = taskAPI.host;
this.newbaseURL = taskAPI.newhost;
this.createTaskUrl = taskAPI.createTaskUrl;
this.submitTaskUrl = taskAPI.submitTaskUrl;
this.fetchCodeUrl = taskAPI.fetchCodeUrl;
this.fetchTaskUrl = taskAPI.fetchTaskUrl;
this.cityConfigUrl = taskAPI.cityConfigUrl;
this.LOCK_KEY = LOCK_KEY;
}
_request(url, type, opts) {
const {ctx, baseURL, newbaseURL} = this;
url = (type === 'gsgj') ? `${newbaseURL}${url}` : `${baseURL}${url}`;
opts = {
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
contentType: 'json',
...opts,
};
ctx.logger.info('_request', url, type);
return ctx.curl(url, opts);
}
_checkSuccess(result) {
if (result.status !== 200) {
const errorMsg = result.data && result.data.error_msg ? result.data.error_msg : 'unknown error';
this.ctx.throw(result.status, errorMsg);
}
if (result.data.code !== 0) {
this.ctx.throw(400, {message: result.data.msg, code: result.data.code});
}
}
async create(data) {
const {createTaskUrl, ctx} = this;
const result = await this._request(createTaskUrl, ctx.app.channelType, {
method: 'post',
data: {cityId: data},
});
ctx.logger.info(`【Task】create ${createTaskUrl} cityId: ${data} result:`, JSON.stringify(result.data));
ctx.logger.info('channelType', ctx.app.channelType);
this._checkSuccess(result);
return result.data.data.taskId;
}
async fetchCapture({taskId, type}) {
const {fetchCodeUrl, ctx} = this;
let channelType = taskId.length > 20 ? 'gsgj' : '51gs';
const result = await this._request(fetchCodeUrl, channelType, {
method: 'post',
data: {
taskId,
type,
},
});
ctx.logger.info(`【Task】fetchCapture ${fetchCodeUrl} params`, JSON.stringify({
taskId,
type,
}), result.data.code);
this._checkSuccess(result);
return result.data.data;
}
async submit(data) {
const {submitTaskUrl, ctx} = this;
let channelType = data.taskId.length > 20 ? 'gsgj' : '51gs';
const result = await this._request(submitTaskUrl, channelType, {
method: 'post',
data,
});
ctx.logger.info(`【Task】submit ${submitTaskUrl} params`, JSON.stringify(data), JSON.stringify(result.data));
this._checkSuccess(result);
return result;
}
async fetchTask(data) {
const {fetchTaskUrl, ctx} = this;
let channelType = data.taskId.length > 20 ? 'gsgj' : '51gs';
const result = await this._request(fetchTaskUrl, channelType, {
method: 'post',
data,
});
ctx.logger.info(`【Task】fetchTask ${fetchTaskUrl} params`, JSON.stringify(data), JSON.stringify(result.data));
return result.data;
}
async getCityList() {
const {cityConfigUrl, ctx} = this;
let cityLists = [];//对外城市列表
let cityTypeLists = [];//不对外城市列表,含渠道(51/管家)
let newCityMap = new Map();
const newret = await this._request(cityConfigUrl, 'gsgj', {method: 'get'});
ctx.logger.info(`【Task】getCityList params gsgj`, newret.status, newret.data.data.length);
this._checkSuccess(newret);
newret.data.data.map(Prov => {
Prov.citys.map(city => {
newCityMap.set(String(city.id), city)
})
});
const ret = await this._request(cityConfigUrl, '51gs', {method: 'get'});
ctx.logger.info(`【Task】getCityList params 51gs`, ret.status, ret.data.data.length);
this._checkSuccess(ret);
ret.data.data.map(Prov => {
let newProv = {provinceName: Prov.provinceName, citys: []};
Prov.citys.map(city => {
city.type = "51gs";
if (city.state === -1 && newCityMap.get(String(city.id)) && newCityMap.get(String(city.id)).state === 1) {
city = newCityMap.get(String(city.id));
city.type = "gsgj";
ctx.logger.info('city', city)
}
if (city.state != 1) {
city.state = -1;
}
newProv.citys.push({
province: city.province,
name: city.name,
id: city.id,
state: city.state,
queryParam: city.queryParam
});
cityTypeLists.push({
province: city.province,
name: city.name,
id: city.id,
state: city.state,
type: city.type,
});
});
cityLists.push(newProv);
});
ctx.app.cityTypeLists = cityTypeLists;
// ctx.logger.info('-------------', JSON.stringify(ctx.app.cityTypeLists))
return cityLists;
}
}
module.exports = TaskService;
'use strict';
const Service = require('egg').Service;
class WashDataService extends Service {
constructor(ctx) {
super(ctx);
const { config } = this;
this.washUrl = config.washAPI.host + config.washAPI.washUrl;
this.clearGjj = ['ID', 'phone', 'birthday', 'email', 'address', 'card', 'deposit_base', 'person_rate', 'company_rate', 'marriage', 'sex', 'company_id'];
this.clearLoan = ['name', 'ID', 'warning_rate', 'fund_date', 'bank', 'phone', 'address', 'past_due', 'past_principle', 'past_interest', 'past_period', 'history_past_period', 'history_past_amount', 'assure_style', 'house_type', 'debit_account', 'left_period'];
}
async wash(data) {
const { app, washUrl, ctx } = this;
const rawdata = this._switchData(data);
const washData = await app.curl(washUrl,
{
charset: 'utf-8',
timeout: ['30s', '30s'],
dataType: 'json',
data: rawdata,
method: 'post',
contentType: 'json',
});
if (washData.status !== 200) {
ctx.logger.error(`【washData】url${washUrl} ,params`, rawdata, washData);
throw new Error('清洗数据出错');
}
if (washData.data.code !== 0) {
ctx.logger.error(`【washData】url${washUrl} ,params`, rawdata, washData.data);
throw new Error('清洗数据出错');
}
washData.data.data.general_analyzed_data.overdueClassify = {};
washData.data.data.general_analyzed_data.loanClassify = {};
washData.data.data.general_analyzed_data.blacklist = {};
return washData.data;
}
_switchData(data) {
const tmp = data.data;
const bar = {};
bar.taskId = tmp.taskId;
bar.cityId = tmp.cityId;
bar.data = JSON.parse(tmp.data);
bar.orderID = 'ttt';
bar.appKey = '';
return bar;
}
dealData(data, passID = false) {
const { clearGjj, clearLoan } = this;
delete data.data.general_analyzed_data;
for (let gjjItem of data.data.gjj_data) {
for (let text of clearGjj) {
if (!(passID && text == 'ID')) {
delete gjjItem.gjj_brief[text];
}
}
delete gjjItem.gjj_account_analyzed_data;
}
for (let loanItem of data.data.loan_data) {
for (let text of clearLoan) {
delete loanItem.loan_brief[text];
}
}
return data;
}
}
module.exports = WashDataService;
environment:
matrix:
- nodejs_version: '8'
install:
- ps: Install-Product node $env:nodejs_version
- npm i npminstall && node_modules\.bin\npminstall
test_script:
- node --version
- npm --version
- npm run test
build: off
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAkh7eUVgeY17P4Q4p6ORhHMwQjIXf7Xvmol1Hm969lRv4LPGb
AOpcZ7MjAm41th2eaajOyMkuKOcPymzGFusZlteLq34iUrYwPUGt55GvMMs2uuCb
iDYOFXt6hXMMa06PyTRukQbhCyzld/Ndhm9YvE+Y7X+C6f/mnzAGbfIftV/nEjgZ
3l1CHv96gACzO8z3ALe6MgHBxBF5LyS2b+++v6vd9V+kCPFI8x0AE9GZz1+QOAvO
w+uSd6j6NcLuH8aWaAyXuT1jubUQZtLnp3TqaSS2Md0UOJCQUfdanDWdempzo+E9
f5tWC8xEjthLsS9DZruzyF1FoSmxJkeOScmcZQIDAQABAoIBAARdk7rObSn+3SsW
Jz5kBFq95gisv0HzH7LeIpOPlg5sZX/CQCVI2zXl7jfWXxhvzhnOB0+MYyqprJkZ
otlwcLVG/09CV3gtJUfPPIjcm2VTzPDMYRkytD0EEWcHRum10SnrvRnsILEayEhL
JxIrJXWK00DVPG4NTTCYWLjUMQpUJWNsXVs/t8bX6c1utViJo3cR/5obQWrNXNYM
qHUfeUHInthHQOhv26dSSAzbDNg2m8tVYyDQc8bNd7MPyMLQvlS9YeFezviP6iV6
oMjI5cLJHQLYBTeiGz4tMSo3r4He9Ib3+yfP5KRqi6ZgZ4gtp0Of3CZCckB5HyTP
GDuvXIkCgYEA7Ct9osme4NWljtczzX6vLdwlNXmLws0t4W77MaN3ZCKxkAR7Ti1j
pBSbgsuFgto1jeXmK8VyLpdu0Aa/vkgBjSxhfhNW6AO+rJGH4mAavuygBTvrlOdv
uWIrbe2tCKa3e86weoyp8YEwCpghFKzVeluSGHyOo47jgyTCwQ0rB8cCgYEAnmPA
5obf+nJyJ6BdqW7NPvuWnUl5+wjUeTum9+Iu00H+quoUjmFWMi6H2OrNC0lvkJRp
TXXE4kYL0K818HvKHbJsQt2CBqUceZ3BcRcEl0MjLntuOH+AK1yFJYCpTcJhVKwR
46mWmImrpVDsT0JuQSmcK1y56I3HqwICtEsN8nMCgYEAsydOuBWAe4g2fgQMHP/T
/dL5OvaIKe8htdhNn1skr4aN8fUkYKqX4plrWq3vCtNjOtBCacPvGR7xBceI3tya
qLAZCN282GY214vSa8yBnYG85huNWzixjQzGay6YS27E05t4To60QCrC+dZridaO
XrJmQkMCpVo4hnx1bKMDmHMCgYATyA+aevPUOqDpNA0ekRkPKarI4Blc8eBfd8TF
prkEZ3Sf8fY5RgzW3ZrXy5NqOnS1kOOJ6hB51he5q3hIHZ3DkboVq8aGf+6Lfdlf
/2jyX08wiffdFId0Yuy6H1SFwqYXRhpB3bdSO7d1QSMSTxCoEMNRYxZQ5gwu3mRq
Egme4wKBgQDM4HREYYu7w7pAJqMnuJQB1BXkJxzg5+ywtNir3ywl8GCn7RPe4VVF
IrGtRXGDPuuxlhcxIaKICs5Cz1XRsqHl8K+coeAKzPXbIh4r/XUigOmUGETmE3vH
g0EYqpMDU40ezdkG3CaxtDlBiyC2gx/lj8rK8rYFcVkzFg1V75HFtQ==
-----END RSA PRIVATE KEY-----
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIFyTCCBLGgAwIBAgIQUE20dduC0RvXQL5iw5XxEjANBgkqhkiG9w0BAQsFADBE
MQswCQYDVQQGEwJDTjEaMBgGA1UECgwRV29TaWduIENBIExpbWl0ZWQxGTAXBgNV
BAMMEFdvU2lnbiBPViBTU0wgQ0EwHhcNMTcwMzIxMTE0NzM4WhcNMTkwMzIxMTE0
NzM4WjB6MQswCQYDVQQGEwJDTjEtMCsGA1UECgwk5p2t5bee54WO6aW8572R57uc
5oqA5pyv5pyJ6ZmQ5YWs5Y+4MRIwEAYDVQQHDAnmna3lt57luIIxEjAQBgNVBAgM
Cea1meaxn+ecgTEUMBIGA1UEAwwLKi41MWdqai5jb20wggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQCSHt5RWB5jXs/hDino5GEczBCMhd/te+aiXUeb3r2V
G/gs8ZsA6lxnsyMCbjW2HZ5pqM7IyS4o5w/KbMYW6xmW14urfiJStjA9Qa3nka8w
yza64JuINg4Ve3qFcwxrTo/JNG6RBuELLOV3812Gb1i8T5jtf4Lp/+afMAZt8h+1
X+cSOBneXUIe/3qAALM7zPcAt7oyAcHEEXkvJLZv776/q931X6QI8UjzHQAT0ZnP
X5A4C87D65J3qPo1wu4fxpZoDJe5PWO5tRBm0uendOppJLYx3RQ4kJBR91qcNZ16
anOj4T1/m1YLzESO2EuxL0Nmu7PIXUWhKbEmR45JyZxlAgMBAAGjggJ/MIICezAM
BgNVHRMBAf8EAjAAMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly93b3NpZ24uY3Js
LmNlcnR1bS5wbC93b3NpZ24tb3ZjYS5jcmwwdwYIKwYBBQUHAQEEazBpMC4GCCsG
AQUFBzABhiJodHRwOi8vd29zaWduLW92Y2Eub2NzcC1jZXJ0dW0uY29tMDcGCCsG
AQUFBzAChitodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvd29zaWduLW92Y2Eu
Y2VyMB8GA1UdIwQYMBaAFKETVNxWcywngsrIhO/uvwD9X6tWMB0GA1UdDgQWBBQx
Tqk5iXll02OPy0mts+ag5oVvXTAOBgNVHQ8BAf8EBAMCBaAwggEgBgNVHSAEggEX
MIIBEzAIBgZngQwBAgIwggEFBgwqhGgBhvZ3AgUBDAIwgfQwgfEGCCsGAQUFBwIC
MIHkMB8WGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjADAgEBGoHAVXNhZ2Ugb2Yg
dGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdHJpY3RseSBzdWJqZWN0ZWQgdG8gdGhlIENF
UlRVTSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudCAoQ1BTKSBpbmNv
cnBvcmF0ZWQgYnkgcmVmZXJlbmNlIGhlcmVpbiBhbmQgaW4gdGhlIHJlcG9zaXRv
cnkgYXQgaHR0cHM6Ly93d3cuY2VydHVtLnBsL3JlcG9zaXRvcnkuMB0GA1UdJQQW
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAhBgNVHREEGjAYggsqLjUxZ2pqLmNvbYIJ
NTFnamouY29tMA0GCSqGSIb3DQEBCwUAA4IBAQARCLMq8pjDahV05zThImTR9i4j
vfaYxfdQLJP5DyCbiCNi8Lu67XeOXkEaW1UqQ0/qtH39PHppBwobwdP/Au9rwQhU
VLbVP1G32Sg4u6Hs4PvQCnuVvmcsAoDEDXQ6cjLX/jDh4AYAuCCOja3PhVJWWpI4
uQlGEsupuM8mAkqjc4Cy+v7uIRUCjDdcHUR3x3oC5GgKUGEwj0BbW6xEqiHPoYZz
tfE0DQoLAsxvIQBx437XFzxgjp6soq2mtCh38L3rgUnKO8acfZA1h0FgFsK4rQZP
lTUZD1iP6a+ofU1usVlGoLfqhwc7mS7D5yo9mcdN8HxUQuPtjoRQ0sM1asql
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEtTCCA52gAwIBAgIRAO8FGnQaHZQJ/KXkZA+NPJswDQYJKoZIhvcNAQELBQAw
fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTAeFw0xNjExMDkwODMzNDRa
Fw0yNjExMDkwODMzNDRaMEQxCzAJBgNVBAYTAkNOMRowGAYDVQQKDBFXb1NpZ24g
Q0EgTGltaXRlZDEZMBcGA1UEAwwQV29TaWduIE9WIFNTTCBDQTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKRzU7QtbSdi6uUiqewzx81eEdrg0RROHTs1
eXndSwxxUAVDC+FPYvpgWc+bYMVjUJQEIP+SNzsIGvB/YoabRoN7cLBDzPTgYnW8
Pl/wYWXuGNyr1E7bV9Fec37HlvhE39Ntwp31gjMFwTOZ7Zw0QzS7w9PjO4A4anwb
maBJgrRa3GFSgoJ+WIr5brQ6hEgm7rKRNPx6L9Sj2aSl/EWRPPv73j5xeWGcgOPp
U+8eZmqpX+XfCl34o5OQJWi/F7bACetVhvFtWGuLNcZ0eYwU13jOEx3NNsILzIYP
oWJztxd3aPkQOX6cNbJGTvLRcfmGDM0ASq3/BsCrR0o/ruCcd6cCAwEAAaOCAWYw
ggFiMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFKETVNxWcywngsrIhO/u
vwD9X6tWMB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C84oQ3RnX3MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0fBC4w
LDAqoCigJoYkaHR0cDovL3N1YmNhLmNybC5jZXJ0dW0ucGwvY3RuY2EuY3JsMGsG
CCsGAQUFBwEBBF8wXTAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2Vy
dHVtLmNvbTAxBggrBgEFBQcwAoYlaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBs
L2N0bmNhLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0
cDovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBCwUAA4IBAQCLBeq0MMgd
qULSuAua1YwHNgbFAAnMXd9iiSxbIKoSfYKsrFggNCFX73ex4b64iIhQ2BBr82/B
MNpC4rEvnr1x0oFv8DBO1GYimQaq8E9hjnO1UYYEPelVsykOpnDLklTsBZ4vhhq/
hq1mbs+6G+vsAjO9jVnuxP6toOTNBqvURRumMF0P165MoFdh0kzSjUts+1d8Llnb
DJaZht0O19k1ZdBBmPD3cwbTI+tChOELAVt4Nb5dDGPWqSxc5Nl2j95T3aK1KL2d
2vV16DSVShJIz04QHatcJlNZLJDbSu70c5fPU8YiJdRpfkubANAmwcDB+uNhtYz+
zEji0KnE2oNA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEtDCCA5ygAwIBAgIRAJOShUABZXFflH8oj+/JmygwDQYJKoZIhvcNAQELBQAw
PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG
A1UEAxMJQ2VydHVtIENBMB4XDTA4MTAyMjEyMDczN1oXDTI3MDYxMDEwNDYzOVow
fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAOP7faNyusLwyRSH9WsBTuFuQAe6bSddf/dbLbNax1Ff
q6QypmGHtm4PhtIwApf412lXoRg5XWpkecYBWaw8MUo4fNIE0kso6CBfOweizE1z
2/OuT8dW1Vqnlon686to1COGWSfPCSe8rG5ygxwwct/gounS4XR1Gb0qnnsVVAQb
10M5rVUoxeIau/TA5K44STPMdoWfOUXSpJ7yEoxR+HzkLX/1rF/rFp+xLdG6zJFC
d0wlyZA4b9vwzPuOHpdZPtVgTuYFKO1JeRNLukjbL/ly0znK/h/YNHL1tEDPMQHD
7N4RLRddH7hQ0V4Zp2neBzMoylCV+adUy1SGUEWp+UkCAwEAAaOCAWswggFnMA8G
A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAh2zcsH/yT2xc3tu5C84oQ3RnX3MFIG
A1UdIwRLMEmhQqRAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNw
LiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQYIDAQAgMA4GA1UdDwEB/wQEAwIB
BjAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9jYS5jcmww
aAYIKwYBBQUHAQEEXDBaMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1j
ZXJ0dW0uY29tMC4GCCsGAQUFBzAChiJodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0u
cGwvY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQGCCsGAQUFBwIBFhhodHRw
Oi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQELBQADggEBAI3m/UBmo0yc
p6uh2oTdHDAH5tvHLeyDoVbkHTwmoaUJK+h9Yr6ydZTdCPJ/KEHkgGcCToqPwzXQ
1aknKOrS9KsGhkOujOP5iH3g271CgYACEnWy6BdxqyGVMUZCDYgQOdNv7C9C6kBT
Yr/rynieq6LVLgXqM6vp1peUQl4E7Sztapx6lX0FKgV/CF1mrWHUdqx1lpdzY70a
QVkppV4ig8OLWfqaova9ML9yHRyZhpzyhTwd9yaWLy75ArG1qVDoOPqbCl60BMDO
TjksygtbYvBNWFA0meaaLNKQ1wmB1sCqXs7+0vehukvZ1oaOGR+mBkdCcuBWCgAc
eLmNzJkEN0k=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST-----
MIIBhDCB7gIBADBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEh
MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB
AQUAA4GNADCBiQKBgQDCG2+xd72ZIC4vpb3Eb0WY6itr0n1ZPCR/lI0UFT16RExI
35Bs/GWcxHWUzEEGweVgeMzRITOmj5bZt3pfMY5XkON4bKmKynONLeNamPYB2bNu
qd7Hl4uy1N6NLTNl4NdWhwgjPxXgSs26FFybgdaVKOXQhSqUSLxfp+2bj1NohQID
AQABoAAwDQYJKoZIhvcNAQELBQADgYEAgo9TpXS0aTB41gEB29/+vP5I+Dttc3i5
T1IHZBiLwZudCShy5ZCDTks195BXbgTQOKDtEQkuzUE4L9L1PkXsLBE3Zvy3S5VF
loXGPBP6iDJjR559QzakAn8dJVV6I+9J3ryoOdN4vyzo1puU8eFnmfsJ57NFk6sX
mf8kdYd0XYo=
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE-----
MIICATCCAWoCCQDstPb/4nzmRjANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMB4XDTE3MDUxMTA5MzEzN1oXDTE4MDUxMTA5MzEzN1owRTELMAkG
A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0
IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwhtv
sXe9mSAuL6W9xG9FmOora9J9WTwkf5SNFBU9ekRMSN+QbPxlnMR1lMxBBsHlYHjM
0SEzpo+W2bd6XzGOV5DjeGypispzjS3jWpj2Admzbqnex5eLstTejS0zZeDXVocI
Iz8V4ErNuhRcm4HWlSjl0IUqlEi8X6ftm49TaIUCAwEAATANBgkqhkiG9w0BAQsF
AAOBgQAR4K4Ny36Tnc6jZM4pGRywgcMpjIdBuAhIxexadM1DL1jmUIE0spSK4S8S
60RC387DEa5u2x1NyB0wRaeF6bDgNhVJisglfMuu6QS262XHG4WhVmV5vm06c+ET
0RZv9TqrEjuvWXPHNFU7zvvFMFAj4Y7nxgB2zx9OrSKCCesB3g==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDCG2+xd72ZIC4vpb3Eb0WY6itr0n1ZPCR/lI0UFT16RExI35Bs
/GWcxHWUzEEGweVgeMzRITOmj5bZt3pfMY5XkON4bKmKynONLeNamPYB2bNuqd7H
l4uy1N6NLTNl4NdWhwgjPxXgSs26FFybgdaVKOXQhSqUSLxfp+2bj1NohQIDAQAB
AoGBAKWI5F4CccyupvS3cfidtErOGS2gmomJQs8SjqW732vv5uaW0gI/1SA2Ytf8
wM/Ud5soKfOHTxcSiWEumcuo5WvEmoNHXJfunVErnYG4Ph2FsiBihL2wPrGnq0E5
XZnX0ZNwcBw+dvfDXKiAq4QOrSyldtNuQuw3bZZ+5DOZkgSZAkEA/b69YTjNszX7
9KDiWtIeu5dw6mkzrdL3+M8DpQk1E7ndLKbKKdZMavd/OHkjbJoMriVy57TLz8HL
OtV6GnEo0wJBAMPVBcnlI8A78mEf4/m6SoazTPV1FQfZknC1rKIo1qSNtP/RcjoW
dnK9Ar4dnmuUvKXKoYKlCFcmERNeo7c80kcCQAYBUJwPaxbVrTvR3umFVYLdB6gU
i0uO1Z2G0LBEMoRf/rMC03//+VkCuHkOrN7yGmC4tCp1pekpzfR7fuNHUE8CQQCw
aAia4kreNCIW079tih7wUDwXMK0NMTT1SvKD8P3Jpc1SVL3tDacNnK4HzG6Uwptd
TbdIFJn6x1PCexJHUgapAkB7Jvoweu9Jja1arukVWHIKZbqM3Hmh1GjgkuxoKeZW
ZoaC/ASM0rsc9XHUaSuQjAlwDk/H47vgEuxXu2BklGrJ
-----END RSA PRIVATE KEY-----
module.exports = {
StorageHost:"http://tv.51gjj.com:11250",
SignHost:'http://tj2.51gjj.com:5118',
TaskHost:'http://ts1.51gjj.com:6824',
newTaskHost:'http://tt.51gjj.com:7001',
callbackUrl:'https://t.51gjj.com/IncomeTaxAPI/result',
signType:'incometax',
database: {
"connectionLimit" : 50,
"host": "rm-bp1272001633qc0x9.mysql.rds.aliyuncs.com",
"user": "hexin",
"password": "gYUHszn9#q",
"database": "node_gjj"
},
port: 10017,
log4jsConfig: {
"appenders": {
"console": {
"type": "console"
},
"default": {
"type": "dateFile",
"filename": "./logs/",
"alwaysIncludePattern": true,
"pattern": "IITAPI-yyyyMMdd.log"
}
},
"categories": {
"default": {
"appenders":["console", "default"],
"level": "trace"
}
},
"replaceConsole": true
},
};
'use strict';
module.exports = appInfo => {
const config = exports = {};
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1542452126322_5141';
// add your config here
config.middleware = ['requestLog', 'errorHandler'];
// 是否启用csrf安全
config.security = {
csrf: {
enable: false,
},
domainWhiteList: [],
};
config.cors = {
origin: '*',
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
credentials: true,
};
return config;
};
'use strict';
module.exports = () => {
const config = exports = {};
config.debug = true;
config.projectRootPath = '/taxapi';
config.redis = {
client: {
port: 6379,
host: '116.62.55.137',
password: 'DEV8redis',
db: 0,
},
};
config.taskAPI = {
host: 'http://tm.51gjj.com:6824',
newhost: 'http://tt.51gjj.com:7001',
fetchHubsUrl: '',
createTaskUrl: '/IncomeTax/createItTask',
fetchCodeUrl: '/IncomeTax/getItCode',
submitTaskUrl: '/IncomeTax/loginItWeb',
fetchTaskUrl: '/IncomeTax/getItData',
cityConfigUrl: '/IncomeTax/getItSetting'
};
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 = {
host: 'https://dev-nginx.jianbing.com/zeus-api/v1',
fetchScriptsUrl: '/chaos/it/two_dimension_array/queries',
fetchOneScriptUrl: '/chaos/it/two_dimension_array/info',
fetchParamsInfoUrl: '/chaos/it/login_param_map',
fetchQueryButtonUrl: '/chaos/it/query_button',
fetchHelpUrl: '/chaos/it/help',
fetchNoticeUrl: '/chaos/it/notice',
fetchHubSeriptsUrl: '/chaos/it/hubs',
fetchScriptByCityNameUrl: '/chaos/it/city_scripts',
redisScriptsKey: 'URANUS.IT.SCRIPTS',
redisParamsKey: 'URANUS.IT.PARAMS',
};
config.storageAPI = {
host: 'http://tv.51gjj.com:11252',
writeUrl: '/data',
readUrl: '/IncomeTax',
writeType: 'incomeTax',
readDataKey: 'incometaxData',
};
config.washAPI = {
host: '',
washUrl: '',
};
config.signatureAPI = {
host: 'http://tj3.51gjj.com:5118',
fetchTokenUrl: '/Access/GetToken',
fetchOrderIdUrl: '/Order/GetOrderSn',
signatureUrl: '/Access/SignValidityCheck',
fetchParnterUrl: '',
signatureType: 'incomeTax',
customerUrl: '/customer/query'
};
config.lockKeys = {
fecthHub: 'URANUS.IT.HUBS.LOCK',
fecteToken: 'URANUS.IT.TOKEN.LOCK',
token: 'URANUS.IT.TOKEN',
fecthParnters: 'URANUS.PARNTERS.LOCK',
taskPrefix: 'URANUS.TASK',
};
config.sequelize = {
datasources: [{
// 东八时区
timezone: '+08:00',
delegate: 'model',
baseDir: 'model',
dialect: 'mysql',
host: 'rm-bp1272001633qc0x9o.mysql.rds.aliyuncs.com',
database: 'data_service_dev',
username: 'hexin',
password: 'gYUHszn9#q',
port: 3306,
}],
};
// config.GJJ_OpenAPI = {
// appKey: '60670203E411FD62BA9E953CFB73F881',
// appSecret: '0BDD1ECC147503C477563E5C1438C366D70E4F80',
// };
config.callbackUrl = 'https://dev-nginx.jianbing.com/taxh5/callback';
return config;
};
'use strict';
module.exports = () => {
const config = exports = {};
config.debug = true;
config.logger = {
dir: '/jianbing/logs/taxapi',
};
config.projectRootPath = '/taxapi';
config.redis = {
client: {
port: 6379,
host: process.env.REDIS_HOST,
password: process.env.REDIS_PWD,
db: 0,
},
};
config.taskAPI = {
host: process.env.TASKAPI_HOST,
newhost: 'http://tt.51gjj.com:7001',
fetchHubsUrl: '',
createTaskUrl: '/IncomeTax/createItTask',
fetchCodeUrl: '/IncomeTax/getItCode',
submitTaskUrl: '/IncomeTax/loginItWeb',
fetchTaskUrl: '/IncomeTax/getItData',
cityConfigUrl: '/IncomeTax/getItSetting'
};
config.partnerAPI = {
host: process.env.PARTNERAPI_HOST,
fetchTheme: '/chaos/theme',
fetchScripts: '/chaos/partners/scripts',
fetchAgreements: '/chaos/agreements',
redisThemePrefix: 'URANUS.HF.PARNTERS.THEME',
redisScriptsPrefix: 'URANUS.HF.PARNTERS.SCRIPTS',
redisAgreementsPrefix: 'URANUS.HF.PARNTERS.Agreements',
fetchInfo: '/chaos/partner',
redisInfoPrefix:'URANUS.HF.PARNTERS.Info',
};
config.scriptsAPI = {
host: 'https://dev-nginx.jianbing.com/zeus-api/v1',
fetchScriptsUrl: '/chaos/hf/two_dimension_array/queries',
fetchOneScriptUrl: '/chaos/hf/two_dimension_array/info',
fetchParamsInfoUrl: '/chaos/hf/login_param_map',
fetchQueryButtonUrl: '/chaos/hf/query_button',
fetchHelpUrl: '/chaos/hf/help',
fetchNoticeUrl: '/chaos/hf/notice',
fetchHubSeriptsUrl: '/chaos/hf/hubs',
fetchScriptByCityNameUrl: '/chaos/hf/city_scripts',
redisScriptsKey: 'DATA_SERVER_SHEBAO.SCRIPTS',
redisParamsKey: 'DATA_SERVER_SHEBAO.PARAMS',
redisScriptListKey: 'DATA_SERVER_SHEBAO.SCRIPTLIST',
};
config.storageAPI = {
host: process.env.STORAGEAPI_HOST,
writeUrl: '/data',
readUrl: '/IncomeTax',
writeType: 'incomeTax',
readDataKey: 'incometaxData',
};
config.washAPI = {
host: '',
washUrl: '',
};
config.signatureAPI = {
host: process.env.SIGNATUREAPI_HOST,
fetchTokenUrl: '/Access/GetToken',
fetchOrderIdUrl: '/Order/GetOrderSn',
signatureUrl: '/Access/SignValidityCheck',
fetchParnterUrl: '',
signatureType: 'incomeTax',
customerUrl: '/customer/query',
};
config.lockKeys = {
fecthHub: 'NEWSB.HF.HUBS.LOCK',
fecteToken: 'NEWSB.HF.TOKEN.LOCK',
token: 'NEWSB.HF.TOKEN',
fecthParnters: 'NEWSB.PARNTERS.LOCK',
taskPrefix: 'NEWSB.TASK',
};
config.sequelize = {
datasources: [{
// 东八时区
timezone: '+08:00',
delegate: 'model',
baseDir: 'model',
dialect: 'mysql',
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,
}],
};
config.callbackUrl = process.env.CALLBACK_URL;
return config;
};
\ No newline at end of file
'use strict';
// had enabled by egg
// exports.static = true;
exports.mysql = {
enable: false,
package: 'egg-mysql',
};
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
};
exports.redis = {
enable: true,
package: 'egg-redis',
};
exports.routerPlus = {
enable: true,
package: 'egg-router-plus',
};
exports.cors = {
enable: true,
package: 'egg-cors',
};
exports.validate = {
enable: true,
package: 'egg-validate',
};
const signAPI=require('../services/ValidationAPI');
module.exports={
async getToken(ctx){
try{
console.log(ctx.request.body)
let tokenObj= await signAPI.getToken(ctx.request.body);
ctx.body=tokenObj
}catch (err){
console.error(err)
ctx.body={code:-1,msg:"服务出错"}
}
},
};
\ No newline at end of file
This diff is collapsed.
const path = require('path');
const Koa = require('koa');
const convert = require('koa-convert');
const views = require('koa-views');
const koaStatic = require('koa-static');
const bodyParser = require('koa-bodyparser');
var cors = require('koa-cors');
const util = require('util');
const cleanLog = require('./utils/cheanLog');
const log = require('./utils/log');
const koaLogger = require('koa-logger');
const config = require('./config');
const routers = require('./routers/index');
const app = new Koa();
// app.use((ctx)=>{
// console.log(ctx.headers);
// })
app.use(cors());
// 配置控制台日志中间件
app.use(koaLogger());
// 配置ctx.body解析中间件
app.use(bodyParser());
// 配置静态资源加载中间件
app.use(koaStatic(
path.join(__dirname , './public/')
));
app.use(async (ctx, next) => {
const token = ctx.header.authorization // 获取jwt
let payload;
if (token) {
try {
payload = await verify(token.split(' ')[1], secret) // // 解密,获取payload
console.log('payload',payload);
console.log(ctx.path)
if(config.authData[ctx.path]){
if(!config.authData[ctx.path].includes(payload.auth)){
ctx.status = 403;
ctx.body={status:'无权限'}
return
}
}
}catch (err){
console.log(err)
}
}
await next()
})
// 配置服务端模板渲染引擎中间件
app.use(views(path.join(__dirname, './views'), {
extension: 'ejs'
}));
// 初始化路由中间件
app.use(routers.routes()).use(routers.allowedMethods());
// 监听启动端口
app.listen( config.port )
log.info(`the server is start at port ${config.port}`);
cleanLog();
// console.log(`the server is start at port ${config.port}`);
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "IIT",
"name": "tax_api",
"version": "1.0.0",
"description": "对接API服务web服务",
"main": "index.js",
"description": "个税API认证服务",
"private": true,
"dependencies": {
"egg": "^2.2.1",
"egg-cors": "^2.1.1",
"egg-mysql": "^3.0.0",
"egg-redis": "^2.3.0",
"egg-router-plus": "^1.3.0",
"egg-scripts": "^2.5.0",
"egg-sequelize": "^4.2.0",
"egg-validate": "^2.0.2",
"mysql2": "^1.6.4",
"node-cache": "^4.2.0",
"node-uuid": "^1.4.8",
"uuid": "^3.3.2"
},
"devDependencies": {
"autod": "^3.0.1",
"autod-egg": "^1.0.0",
"egg-bin": "^4.3.5",
"egg-ci": "^1.8.0",
"egg-mock": "^3.14.0",
"eslint": "^4.11.0",
"eslint-config-egg": "^6.0.0",
"webstorm-disable-index": "^1.2.0"
},
"engines": {
"node": ">=8.9.0"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"start": "egg-scripts start --daemon --title=egg-server-gjj_api_server",
"stop": "egg-scripts stop --title=egg-server-gjj_api_server",
"docker": "eggctl start --title=egg-server-gjj_api_serverr",
"dev": "egg-bin dev --port 7002",
"debug": "egg-bin debug",
"test": "npm run lint -- --fix && npm run test-local",
"test-local": "egg-bin test",
"cov": "egg-bin cov",
"lint": "eslint .",
"ci": "npm run lint && npm run cov",
"autod": "autod"
},
"keywords": [
"koa"
],
"author": "HAYWAEL",
"license": "ISC",
"dependencies": {
"ali-oss": "^5.2.0",
"antd-mobile": "^2.1.8",
"antd-mobile-demo-data": "^0.2.0",
"array-tree-filter": "^2.1.0",
"ejs": "^2.5.5",
"jsonwebtoken": "^8.2.1",
"koa": "^2.5.0",
"koa-bodyparser": "^3.2.0",
"koa-cors": "0.0.16",
"koa-jwt": "^3.3.1",
"koa-logger": "^3.0.0",
"koa-mysql-session": "0.0.2",
"koa-router": "^7.0.1",
"koa-send": "^3.2.0",
"koa-session-minimal": "^3.0.3",
"koa-static": "^3.0.0",
"koa-views": "^5.2.0",
"log4js": "^2.6.0",
"moment": "^2.22.1",
"mysql": "^2.15.0",
"node-schedule": "^1.3.0",
"rc-form": "^2.2.0",
"request": "^2.85.0"
}
"ci": {
"version": "8"
},
"repository": {
"type": "git",
"url": ""
},
"author": "jd",
"license": "MIT"
}
{
"name" : "IITAPITest", // 应用名称
"script" : "./index.js", // 实际启动脚本
"cwd" : "./" // 当前工作路径
// "watch": [ // 监控变化的目录,一旦变化,自动重启
// "bin",
// "routers"
// ],
// "ignore_watch" : [ // 从监控目录中排除
// "node_modules",
// "logs",
// "public"
// ],
// "watch_options": {
// "followSymlinks": false
// },
// "error_file" : "./logs/app-err.log", // 错误日志路径
// "out_file" : "./logs/app-out.log" // 普通日志路径
// "env": {
// "NODE_ENV": "production" // 环境参数,当前指定为生产环境
// }
}
{
"name" : "nsbapi", // 应用名称
"script" : "./sbapi.js", // 实际启动脚本
"cwd" : "./", // 当前工作路径
"node_args" : "--max-old-space-size=3000"
// "watch": [ // 监控变化的目录,一旦变化,自动重启
// "bin",
// "routers"
// ],
// "ignore_watch" : [ // 从监控目录中排除
// "node_modules",
// "logs",
// "public"
// ],
// "watch_options": {
// "followSymlinks": false
// },
// "error_file" : "./logs/app-err.log", // 错误日志路径
// "out_file" : "./logs/app-out.log" // 普通日志路径
// "env": {
// "NODE_ENV": "production" // 环境参数,当前指定为生产环境
// }
}
This diff is collapsed.
![logo](media/logo_43.png)
# 个税API服务接口文档
>查询本文档你将能了解到:
- 创建任务API
- 如何拉取数据
- 常见问题及解决方案
[开始查看](#文档更新说明)
<footer>
<span>杭州煎饼网络技术有限公司 版权所有 &copy;2017 </span>
<span>由51公积金管家数据部门提供支持 </span>
</footer>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个税API接口文档</title>
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<style>
.markdown-section{
margin-left: 20px;
}
</style>
</head>
<body>
<div id="app"></div>
</body>
<script>
window.$docsify = {
name: '个税API接口文档',
themeColor: '#439df8',
coverpage: true,
maxLevel: 2,
externalLinkTarget: '_self',
auto2top: true,
plugins: [
function (hook) {
var footer = [
'<hr/>',
'<footer>',
'<span>杭州煎饼网络技术有限公司 版权所有 &copy;2017 </span>',
'<span> 由51公积金管家数据部门提供支持 </span>',
'</footer>'
].join('')
hook.afterEach(function (html) {
return html + footer
})
}
]
}
</script>
<script src="doc/vendor/docsify.js"></script>
<script src="//unpkg.com/prismjs/components/prism-bash.js"></script>
<script src="//unpkg.com/prismjs/components/prism-json.js"></script>
</html>
This diff is collapsed.
(function(Prism) {
var insideString = {
variable: [
// Arithmetic Environment
{
pattern: /\$?\(\([\s\S]+?\)\)/,
inside: {
// If there is a $ sign at the beginning highlight $(( and )) as variable
variable: [{
pattern: /(^\$\(\([\s\S]+)\)\)/,
lookbehind: true
},
/^\$\(\(/,
],
number: /\b-?(?:0x[\dA-Fa-f]+|\d*\.?\d+(?:[Ee]-?\d+)?)\b/,
// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
operator: /--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,
// If there is no $ sign at the beginning highlight (( and )) as punctuation
punctuation: /\(\(?|\)\)?|,|;/
}
},
// Command Substitution
{
pattern: /\$\([^)]+\)|`[^`]+`/,
inside: {
variable: /^\$\(|^`|\)$|`$/
}
},
/\$(?:[a-z0-9_#\?\*!@]+|\{[^}]+\})/i
],
};
Prism.languages.bash = {
'shebang': {
pattern: /^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,
alias: 'important'
},
'comment': {
pattern: /(^|[^"{\\])#.*/,
lookbehind: true
},
'string': [
//Support for Here-Documents https://en.wikipedia.org/wiki/Here_document
{
pattern: /((?:^|[^<])<<\s*)(?:"|')?(\w+?)(?:"|')?\s*\r?\n(?:[\s\S])*?\r?\n\2/g,
lookbehind: true,
greedy: true,
inside: insideString
},
{
pattern: /(["'])(?:\\\\|\\?[^\\])*?\1/g,
greedy: true,
inside: insideString
}
],
'variable': insideString.variable,
// Originally based on http://ss64.com/bash/
'function': {
pattern: /(^|\s|;|\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|npm|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\s|;|\||&)/,
lookbehind: true
},
'keyword': {
pattern: /(^|\s|;|\||&)(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\s|;|\||&)/,
lookbehind: true
},
'boolean': {
pattern: /(^|\s|;|\||&)(?:true|false)(?=$|\s|;|\||&)/,
lookbehind: true
},
'operator': /&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,
'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];]/
};
var inside = insideString.variable[1].inside;
inside['function'] = Prism.languages.bash['function'];
inside.keyword = Prism.languages.bash.keyword;
inside.boolean = Prism.languages.bash.boolean;
inside.operator = Prism.languages.bash.operator;
inside.punctuation = Prism.languages.bash.punctuation;
})(Prism);
Prism.languages.json = {
'property': /"(?:\\.|[^\\"])*"(?=\s*:)/ig,
'string': /"(?!:)(?:\\.|[^\\"])*"(?!:)/g,
'number': /\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee][+-]?\d+)?)\b/g,
'punctuation': /[{}[\]);,]/g,
'operator': /:/g,
'boolean': /\b(true|false)\b/gi,
'null': /\bnull\b/gi
};
Prism.languages.jsonp = Prism.languages.json;
This diff is collapsed.
(function () {
'use strict';
/*
* medium-zoom v0.2.0
* Medium zoom on your images in vanilla JavaScript
* Copyright 2017 Francois Chalifour
* https://github.com/francoischalifour/medium-zoom
* MIT License
*/function __$styleInject(a,b){if('undefined'==typeof document){ return b; }a=a||'';var c=document.head||document.getElementsByTagName('head')[0],d=document.createElement('style');return d.type='text/css',c.appendChild(d),d.styleSheet?d.styleSheet.cssText=a:d.appendChild(document.createTextNode(a)),b}function createCommonjsModule(a,b){return b={exports:{}},a(b,b.exports),b.exports}var _extends=Object.assign||function(a){for(var b,c=1;c<arguments.length;c++){ for(var d in b=arguments[c],b){ Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d]); } }return a}; var toConsumableArray=function(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b<a.length;b++){ c[b]=a[b]; }return c}return Array.from(a)}; var mediumZoom_1=createCommonjsModule(function(a){var b=['IMG'],c=[27,81],d=function(a){return b.includes(a.tagName)},e=function(a){return a.naturalWidth!==a.width},f=function(a){return NodeList.prototype.isPrototypeOf(a)||HTMLCollection.prototype.isPrototypeOf(a)},g=function(a){return a&&1===a.nodeType};a.exports=function(a){var h=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},i=h.margin,j=void 0===i?0:i,k=h.background,l=void 0===k?'#fff':k,m=h.scrollOffset,n=void 0===m?48:m,o=h.metaClick,p=function(a){var b=a.getBoundingClientRect(),c=b.top,d=b.left,e=b.width,f=b.height,g=a.cloneNode(),h=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,i=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return g.removeAttribute('id'),g.style.position='absolute',g.style.top=c+h+'px',g.style.left=d+i+'px',g.style.width=e+'px',g.style.height=f+'px',g.style.transform='',g},q=function(){if(C.template){ if(C.template.dispatchEvent(new Event('show')),D=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,E=!0,C.zoomed=p(C.template),document.body.appendChild(B),document.body.appendChild(C.zoomed),requestAnimationFrame(function(){document.body.classList.add('medium-zoom--open');}),C.template.style.visibility='hidden',C.zoomed.classList.add('medium-zoom-image--open'),C.zoomed.addEventListener('click',r),C.zoomed.addEventListener('transitionend',u),C.template.getAttribute('data-zoom-target')){C.zoomedHd=C.zoomed.cloneNode(),C.zoomedHd.src=C.zoomed.getAttribute('data-zoom-target'),C.zoomedHd.onerror=function(){clearInterval(a),console.error('Unable to reach the zoom image target '+C.zoomedHd.src),C.zoomedHd=null,y();};var a=setInterval(function(){C.zoomedHd.naturalWidth&&(clearInterval(a),C.zoomedHd.classList.add('medium-zoom-image--open'),C.zoomedHd.addEventListener('click',r),document.body.appendChild(C.zoomedHd),y());},10);}else { y(); } }},r=function a(){var b=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0,c=function(){E||!C.template||(C.template.dispatchEvent(new Event('hide')),E=!0,document.body.classList.remove('medium-zoom--open'),C.zoomed.style.transform='',C.zoomedHd&&(C.zoomedHd.style.transform='',C.zoomedHd.removeEventListener('click',a)),C.zoomed.removeEventListener('click',a),C.zoomed.addEventListener('transitionend',v));};0<b?setTimeout(c,b):c();},s=function(a){C.template?r():(C.template=a?a.target:A[0],q());},t=function(a){return(a.metaKey||a.ctrlKey)&&z.metaClick?window.open(a.target.getAttribute('data-original')||a.target.parentNode.href||a.target.src,'_blank'):void(a.preventDefault(),s(a))},u=function a(){E=!1,C.zoomed.removeEventListener('transitionend',a),C.template.dispatchEvent(new Event('shown'));},v=function a(){C.template&&(C.template.style.visibility='',document.body.removeChild(C.zoomed),C.zoomedHd&&document.body.removeChild(C.zoomedHd),document.body.removeChild(B),C.zoomed.classList.remove('medium-zoom-image--open'),E=!1,C.zoomed.removeEventListener('transitionend',a),C.template.dispatchEvent(new Event('hidden')),C.template=null,C.zoomed=null,C.zoomedHd=null);},w=function(){if(!E&&C.template){var a=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(D-a)>z.scrollOffset&&r(150);}},x=function(a){c.includes(a.keyCode||a.which)&&r();},y=function(){var a=Math.min;if(C.template){var b=window.innerWidth,c=window.innerHeight,d=b-2*z.margin,e=c-2*z.margin,f=C.zoomedHd||C.template,g=f.naturalWidth,h=void 0===g?d:g,i=f.naturalHeight,j=void 0===i?e:i,k=f.getBoundingClientRect(),l=k.top,m=k.left,n=k.width,o=k.height,p=a(h,d)/n,q=a(j,e)/o,r=a(p,q)||1,s=(-m+(d-n)/2+z.margin)/r,t=(-l+(e-o)/2+z.margin)/r,u='scale('+r+') translate3d('+s+'px, '+t+'px, 0)';C.zoomed.style.transform=u,C.zoomedHd&&(C.zoomedHd.style.transform=u);}},z={margin:j,background:l,scrollOffset:n,metaClick:void 0===o||o};a instanceof Object&&_extends(z,a);var A=function(a){try{return Array.isArray(a)?a.filter(d):f(a)?[].concat(toConsumableArray(a)).filter(d):g(a)?[a].filter(d):'string'==typeof a?[].concat(toConsumableArray(document.querySelectorAll(a))).filter(d):[].concat(toConsumableArray(document.querySelectorAll(b.map(function(a){return a.toLowerCase()}).join(',')))).filter(e)}catch(a){throw new TypeError('The provided selector is invalid.\nExpects a CSS selector, a Node element, a NodeList, an HTMLCollection or an array.\nSee: https://github.com/francoischalifour/medium-zoom')}}(a),B=function(a){var b=document.createElement('div');return b.classList.add('medium-zoom-overlay'),b.style.backgroundColor=a,b}(z.background),C={template:null,zoomed:null,zoomedHd:null},D=0,E=!1;return A.forEach(function(a){a.classList.add('medium-zoom-image'),a.addEventListener('click',t);}),B.addEventListener('click',r),document.addEventListener('scroll',w),document.addEventListener('keyup',x),window.addEventListener('resize',r),{show:s,hide:r,toggle:s,update:function(){var a=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};return a.background&&(B.style.backgroundColor=a.background),_extends(z,a)},addEventListeners:function(a,b){A.forEach(function(c){c.addEventListener(a,b);});},detach:function(){var a=function a(){var b=new Event('detach');A.forEach(function(a){a.classList.remove('medium-zoom-image'),a.removeEventListener('click',t),a.dispatchEvent(b);}),A.splice(0,A.length),B.removeEventListener('click',r),document.removeEventListener('scroll',w),document.removeEventListener('keyup',x),window.removeEventListener('resize',r),C.zoomed&&C.zoomed.removeEventListener('transitionend',a);};C.zoomed?(r(),C.zoomed.addEventListener('transitionend',requestAnimationFrame(a))):a();},images:A,options:z}};});__$styleInject('.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--open .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s}.medium-zoom-image--open{position:relative;z-index:1;cursor:pointer;cursor:zoom-out;will-change:transform}',void 0);var src=mediumZoom_1;
function install (hook) {
var zoom;
hook.doneEach(function (_) {
if (zoom) {
zoom.detach();
}
zoom = src('img:not(.emoji):not([data-no-zoom])');
});
}
$docsify.plugins = [].concat(install, $docsify.plugins);
}());
const router = require('koa-router')();
const taskController=require('./../controllers/task')
const signController=require('./../controllers/sign')
const routers = router
.get('getCity',taskController.getCity)
.get('getHelpInfo',taskController.getHelpInfo)
.post('getOrderSn',taskController.createTask)
.post('getCode',taskController.getCode)
.post('query',taskController.query)
.post('getData',taskController.getData)
.post('result',taskController.result)
.post('getToken',signController.getToken)
.post('getIncomeProve',taskController.getIncomeProve)
module.exports = routers;
\ No newline at end of file
const router = require('koa-router')();
const home = require('./home');
router.use('/IncomeTaxAPI/', home.routes(), home.allowedMethods());
module.exports = router
\ No newline at end of file
const request = require('request');
const config = require('../config');
const StorageHost = config.StorageHost;
const
setStorageUrl=StorageHost+'/data',
getStorageUrl=StorageHost+'/IncomeTax/';
exports.dataStorage=(params)=>{
return new Promise(function (resolve, reject) {
let options = {
url: setStorageUrl,
method: 'POST',
json: true,
body: params,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
return resolve({ code: -1, msg: '数据库服务器出错'});
} else {
return resolve(b);
}
});
});
};
exports.readData=(orderSn)=>{
return new Promise(function (resolve, reject) {
let url =getStorageUrl + orderSn;
let options = {
url: url,
gzip: true
};
request(options, (e, r, b) => {
if (e) {
return resolve({ code: -1, msg: '数据库服务器出错'});
} else {
return resolve(b);
}
});
});
};
\ No newline at end of file
const request = require('request');
const config = require('../config');
const SignHost = config.SignHost;
const
signUrl=SignHost+'/Access/SignValidityCheck',
tokenUrl=SignHost+'/Access/GetToken',
orderSnUrl=SignHost+'/Order/GetOrderSn',
getPartner=SignHost+'/customer/query';
/*获取Token*/
exports.getToken=(params)=>{
return new Promise((resolve,reject)=>{
let errMsg = {code: 3000, msg: '签名校验服务出错'};
let options = {
url: tokenUrl,
method: 'POST',
json: true,
body: params,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
console.error('[func getToken]',params,e);
resolve(errMsg);
} else {
if (b.code == 0) {
resolve(b);
} else {
console.error('[func getToken]',params,b);
errMsg = {code: 3000, msg: b.msg};
resolve(errMsg);
}
}
});
});
};
/*获取订单号*/
exports.getOrderSn=(params)=>{
return new Promise((resolve,reject)=>{
let errMsg = {code: 3000, msg: '签名校验服务出错'};
let options = {
url: orderSnUrl,
method: 'POST',
json: true,
body: params,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
console.error('[func getOrderSn]',params,e);
resolve(errMsg);
} else {
if (b.code == 0) {
resolve(b);
} else {
console.error('[func getOrderSn]',params,b);
errMsg = {code: 3000, msg:b.msg};
resolve(errMsg);
}
}
});
});
};
/*验证签名*/
exports.signValidation=(params)=>{
return new Promise((resolve, reject) => {
params.type=config.signType;
let options = {
url: signUrl,
method: 'POST',
json: true,
body: params,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, vb) => {
if (e) {
console.error('[reGJJ][signValidityCheck] signValidityCheck error: ' ,e);
reject({code:-1,msg:'验签服务器出错'});
} else {
if (vb.code === 0) {
resolve(vb);
} else {
reject(vb);
}
}
});
});
};
/*获取合作方信息*/
exports.getCallbackMap=()=>{
return new Promise(function (resolve, reject) {
request({url:getPartner,gzip:true},(e,r,b)=>{
if(e){
console.error('getCityList');
console.error(e);
return reject(e);
}else{
return resolve(b);
}
});
});
};
const request=require('request')
const db=require('./../utils/db-util');
const signAPI=require('./ValidationAPI')
const taskAPI=require('./taskAPI');
const log=require('../utils/log');
let cityList=[];
let orderSnMap = new Map();
let CustomerMap= new Map();
let cityMap=new Map();
let helpInfo=[];
let newCityMap=new Map()
function getCityList() {
taskAPI.getCityList("gsgj").then(Row=>{
Row=JSON.parse(Row);
Row.data.map(Prov=>{
Prov.citys.map(city=>{
newCityMap.set(String(city.id),city)
})
});
taskAPI.getCityList("51gs").then(Row51=>{
Row51=JSON.parse(Row51);
cityList=[];
Row51.data.map(Prov=>{
let newProv = { provinceName: Prov.provinceName, citys: [] };
Prov.citys.map(city=>{
city.type="51gs";
if(city.state===-1&&newCityMap.get(String(city.id))&&newCityMap.get(String(city.id)).state!==-1){
city=newCityMap.get(String(city.id))
city.type="gsgj";
console.log(city)
}
cityMap.set(String(city.id),city)
if (city.state === 1 || city.state === -1) {
newProv.citys.push({
province: city.province,
name: city.name,
id: city.id,
state: city.state,
queryParam: city.queryParam
});
}
})
cityList.push(newProv)
});
})
}).catch(err=>{
log.error(err)
})
}
function getHelpInfo() {
db.QueryHelpInfo([['cid','city','help']]).then(Rows=>{
if(Rows.length>0){
helpInfo=Rows;
}else{
log.error("getHelpInfo")
}
}).catch(err=>{
log.error(err)
})
}
function getCustomer() {
signAPI.getCallbackMap().then(b=>{
b = JSON.parse(b);
if (b.code === 0) {
b.data.customerList.map(customer => {
if ('callBackUrl' in customer) {
CustomerMap.set(customer.appKey, customer.callBackUrl);
}
});
}
}).catch(err=>{
cosnole.error(err)
})
}
function getCustomerByAppKey(appKey) {
if(CustomerMap.has(appKey)){
return CustomerMap.get(appKey)
}else{
log.error("noCus",appKey)
return ""
}
}
getHelpInfo()
getCityList();
getCustomer();
setInterval(function () {
getCityList();
getCustomer();
getHelpInfo();
},1000*60*3);
function RCityList() {
return cityList
}
function RHelpInfo() {
return helpInfo
}
function getTaskByOrderSn(orderSn) {
return new Promise((resolve, reject) => {
if (orderSnMap.has(orderSn)) {
return resolve(orderSnMap.get(orderSn));
} else {
db.QueryFromStatus([['status', 'note', 'appKey', 'taskId'], orderSn]).then(Rows => {
if (Rows.length > 0) {
Rows[0].note = JSON.parse(Rows[0].note);
resolve(Rows[0]);
} else {
reject();
}
});
}
});
}
async function getapiTaskByOrderSn(orderSn) {
try {
let rows = await db.QueryFromStatus([['status', 'note', 'appKey', 'taskId'], orderSn]);
log.info("getapiTaskByOrderSn", rows);
return rows;
} catch (e) {
log.error("getapiTaskByOrderSn", e);
return [];
}
}
async function getH5TaskByOrderSn(orderSn) {
try {
let rows = await db.QueryFromH5Status([['status', 'appKey', 'taskId'], orderSn]);
log.info("getH5TaskByOrderSn", rows);
return rows;
} catch (e) {
log.error("getH5TaskByOrderSn", e);
return [];
}
}
function setOrderSnMap(key, values) {
values.time = new Date().getTime();
if (orderSnMap.has(key)) {
orderSnMap.get(key).status = values.status;
orderSnMap.get(key).note = values.note;
orderSnMap.get(key).taskId = values.taskId;
orderSnMap.get(key).time = values.time;
} else {
orderSnMap.set(key, values)
}
}
function ServerSideCall(appKey,data) {
let url=getCustomerByAppKey(appKey);
return new Promise((resolve, reject) => {
let options = {
url: url,
method: 'POST',
json: true,
body: data,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
log.error('callbackParams' + JSON.stringify(options));
log.error(e);
resolve();
} else {
log.info('callbackParams' + JSON.stringify(options));
log.info(b);
resolve();
}
});
});
}
function getCityById(centerId) {
if(cityMap.has(String(centerId))){
return cityMap.get(String(centerId))
}else{
log.error("centerId",centerId,cityMap)
return {}
}
}
exports.cityList=RCityList;
exports.helpInfo=RHelpInfo;
exports.setOrderSnMap=setOrderSnMap;
exports.getTaskByOrderSn = getTaskByOrderSn;
exports.getH5TaskByOrderSn = getH5TaskByOrderSn;
exports.getapiTaskByOrderSn = getapiTaskByOrderSn;
exports.getCustomerByAppKey=getCustomerByAppKey;
exports.ServerSideCall=ServerSideCall;
exports.getCityById=getCityById;
const request = require('request');
const config = require('../config');
const TaskHost = config.TaskHost;
const newTaskHost = config.newTaskHost;
const log=require('../utils/log');
// const staticVari=require('./staticVari');
const
cityListUrl = TaskHost + '/IncomeTax/getItSetting',
createTaskUrl = TaskHost + '/IncomeTax/createItTask',
getCodeUrl = TaskHost + '/IncomeTax/getItCode',
submitParamsUrl = TaskHost + '/IncomeTax/loginItWeb',
getDataUrl = TaskHost + '/IncomeTax/getItData';
const
cityListUrlNew = newTaskHost + '/IncomeTax/getItSetting',
createTaskUrlNew = newTaskHost + '/IncomeTax/createItTask',
getCodeUrlNew = newTaskHost + '/IncomeTax/getItCode',
submitParamsUrlNew = newTaskHost + '/IncomeTax/loginItWeb',
getDataUrlNew = newTaskHost + '/IncomeTax/getItData';
/*获取城市列表*/
exports.getCityList=(type)=> {
return new Promise(function (resolve, reject) {
request({url:type==="gsgj"?cityListUrlNew:cityListUrl,gzip:true},(e,r,b)=>{
if(e){
log.error('getCityList');
log.error(e);
return reject(e);
}else{
if(b){
return resolve(b);
}else{
log.error(r.statusCode);
}
}
});
});
};
/*创建任务*/
exports.createTask=(cityId,type)=> {
let errMsg = {code: 500, msg: '创建任务服务出错'};
return new Promise(function (resolve, reject) {
let form_data = {cityId: cityId};
let options = {
url: type==="gsgj"?createTaskUrlNew:createTaskUrl,
method: 'POST',
json: true,
body: form_data,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
log.error(e);
log.error('[createTask err]',JSON.stringify(options));
reject(errMsg);
} else {
if (b&&b.code === 0) {
resolve(b.data.taskId);
} else {
console.log('createTask err' , JSON.stringify(options),JSON.stringify(b));
reject(b);
}
}
});
});
};
/*获取验证码*/
exports.getCode=(params)=>{
return new Promise((resolve,reject)=>{
let errMsg={code:-1,msg:'服务器出错'};
let options = {
url: params.taskId.length>20?getCodeUrlNew:getCodeUrl,
method: 'POST',
json: true,
body: params,
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
console.error('getCode',e);
resolve(errMsg);
} else {
if (b&&b.code === 0) {
resolve(b);
log.info(JSON.stringify(options))
log.info(b)
} else {
log.error('[getImgCode]ErrReq:' + JSON.stringify(params) + 'Res:' + JSON.stringify(b));
resolve(b);
}
}
});
});
};
/*提交参数*/
exports.submitParams=(params) =>{
let errMsg = {code: -1, msg: '服务器错误'};
return new Promise(function (resolve, reject) {
let options = {
url: params.taskId.length>20?submitParamsUrlNew:submitParamsUrl,
method: 'POST',
json: true,
body: params,
headers: {
'content-type': 'application/json'
}
};
log.info(JSON.stringify(options))
request(options, (e, r, b) => {
if (e) {
log.error('[GJJ][/ajax/commitParams]提交任务请求失败');
log.error(e);
resolve(errMsg);
} else {
if (b&&b.code === 0) {
resolve(b);
} else {
console.error('提交任务出错Req:+' + JSON.stringify(params) + ' Res: ' + JSON.stringify(b));
resolve(b);
}
}
});
});
};
/*拉取数据*/
exports.getData=(taskId)=>{
return new Promise((resolve,reject)=>{
let options = {
url:taskId.length>20?getDataUrlNew:getDataUrl,
method: 'POST',
json: true,
body: { taskId: taskId },
headers: {
'content-type': 'application/json'
}
};
request(options, (e, r, b) => {
if (e) {
console.error(e);
reject(e);
} else {
if(b){
resolve(b);
}else{
reject(r.statusCode)
}
}
});
});
};
'use strict';
const { app, assert } = require('egg-mock/bootstrap');
describe('test/app/controller/home.test.js', () => {
it('should assert', function* () {
const pkg = require('../../../package.json');
assert(app.config.keys.startsWith(pkg.name));
// const ctx = app.mockContext({});
// yield ctx.service.xx();
});
it('should GET /', () => {
return app.httpRequest()
.get('/')
.expect('hi, egg')
.expect(200);
});
});
const fs = require('fs');
const moment = require('moment');
const schedule = require('node-schedule');
const log = require('./log');
function getFileName(path) {
return new Promise((resolve, reject) => {
fs.readdir(path, (err, files) => {
if (err) {
reject(err);
} else {
resolve(files);
}
});
});
}
function removeFile(path) {
return new Promise((resolve, reject) => {
fs.unlink(path, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
function removeOverdueLogFile(eachFileName) {
let result = /IITAPI-(\d{8}).log/.exec(eachFileName);
if (null !== result) {
let date = moment(result[1], 'YYYYMMDD');
if (date.isValid() && moment().subtract(3, 'd').isAfter(date)) {
try {
removeFile(`./logs/${eachFileName}`);
log.info('删除三天前日志');
log.info(`${eachFileName}`);
} catch(e) {
log.error('删除日志失败');
log.error(e);
}
}
}
}
async function cleanLogFile() {
let filesName = await getFileName('./logs');
for (let eachFileName of filesName) {
removeOverdueLogFile(eachFileName);
}
}
function cleanLogEveryDay() {
schedule.scheduleJob('00 00 4 * * *', cleanLogFile);
}
module.exports = cleanLogEveryDay;
\ No newline at end of file
const config = require('./../config');
const mysql = require("mysql")
const pool = mysql.createPool(config.database)
let query = function( sql, values ) {
return new Promise(( resolve, reject ) => {
pool.getConnection(function(err, connection) {
if (err) {
resolve( err )
} else {
connection.query(sql, values, ( err, rows) => {
if ( err ) {
reject( err )
} else {
resolve( rows )
}
connection.release()
})
}
})
})
};
let selectUser = function( values ) {
let _sql = "SELECT ?? FROM adminuser WHERE ?? = ?"
return query( _sql, values )
}
let insertUser = function( values ) {
let _sql = "INSERT INTO adminuser set ?"
return query( _sql, values )
}
let insertObj = function( values ) {
let _sql = "INSERT INTO iit_status set ?"
return query( _sql, values )
}
let getCity=function (values) {
let _sql = "SELECT ?? FROM adminuser "
return query( _sql, values )
}
let updateData = function( values ) {
let _sql = "UPDATE iit_status SET ? WHERE orderId = ?"
return query( _sql, values )
}
let selectPartnerList = function( values ) {
let _sql = "SELECT ?? FROM admin_partner "
return query( _sql, values )
};
let QueryFromStatus = function (values) {
let _sql = "SELECT ?? FROM iit_status WHERE orderId = ?"
return query( _sql, values )
};
let QueryHelpInfo = function (values) {
let _sql = "SELECT ?? FROM iit_help "
return query( _sql, values )
};
let QueryFromH5Status = function (values) {
let _sql = "SELECT ?? FROM iith5_status WHERE orderId = ? and `status`= 'success'"
return query( _sql, values )
};
module.exports = {
query,
selectUser,
insertUser,
selectPartnerList,
getCity,
insertObj,
updateData,
QueryFromStatus,
QueryHelpInfo,
QueryFromH5Status
}
const log4js = require('log4js');
const config = require('../config');
log4js.configure(config.log4jsConfig);
module.exports = log4js.getLogger();
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<div id="app">hello</div>
</body>
</html>
\ No newline at end of file
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