Commit 60584193 authored by 任国军's avatar 任国军

fix loanrecommend

parent a24500e8
'use strict';
const moment = require('moment');
module.exports = app => {
const { INTEGER, DATE, TEXT } = app.Sequelize;
const LogLoanRecommend = app.huodongModel.define('log_loan_recommend', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
user_sid: INTEGER,
type: INTEGER,
need_smart_recommend: INTEGER,
is_smart_recommend: INTEGER,
pass_rate_list: TEXT,
business_list: TEXT,
c_class_list: TEXT,
common_loan_list: TEXT,
page_type: INTEGER,
is_run_pass_rate: INTEGER,
created_time: {
type: DATE,
get() {
const date = this.getDataValue('created_time');
return (date && date.toString() !== 'Invalid Date') ? moment(date).format('YYYY-MM-DD HH:mm:ss') : '0000-00-00 00:00:00';
},
},
}, {
timestamps: false,
tableName: 'log_loan_recommend',
});
return LogLoanRecommend;
};
'use strict';
const Service = require('egg').Service;
const R = require('ramda');
const moment = require('moment');
class ProductService extends Service {
......@@ -210,7 +211,7 @@ class ProductService extends Service {
// 获取推荐列表,按照ABC分组顺序推荐
async getBusinessRecommendList(limit, location = 'list') {
const { ctx, service } = this;
const { ctx } = this;
const userId = ctx.userId;
const R = require('ramda');
const recommendSort = function(a, b) {
......@@ -222,8 +223,65 @@ class ProductService extends Service {
const commonLoanList = await this.getCommonBusinessList();
ret = this.formatLoanList(R.take(limit)(R.sort(recommendSort)(commonLoanList)));
} else {
// 日志
const log = {
user_sid: ctx.oldUserId,
type: 2,
need_smart_recommend: 0,
is_smart_recommend: 0,
pass_rate_list: '',
business_list: '',
c_class_list: '',
common_loan_list: '',
page_type: location === 'list' ? 2 : 1,
is_run_pass_rate: 0,
created_time: moment(Date()).format('YYYY-MM-DD HH:mm:ss'),
};
// 先获取分组
const classList = await this.getBusinessClassList();
// 获取开关状态,判断是自动推荐or手动推荐orABTest
const keyword = location === 'list' ? 'config_list_smart_recommend' : 'config_loan_smart_recommend';
const ruleSetting = await this.app.huodongModel.Setting.findOne({ where: { keyword } });
const rule = Number(ruleSetting.value);
console.log('rule: ' + String(rule));
// 是否需要计算模型
let isNeedCalc = false;
switch (rule) {
case 1:
isNeedCalc = true;
break;
case 2:
isNeedCalc = false;
classList.class_C = R.map(function(e) {
e.class = 'C';
e.rule = rule;
e.hasPassRate = 0;
e.needCalc = 0;
return e;
})(classList.class_C);
break;
case 3:
// 根据时间戳毫秒来判断,偶数为A,奇数为B
if (Number(moment().milliseconds()) % 2 === 0) {
isNeedCalc = true;
} else {
classList.class_C = R.map(function(e) {
e.class = 'C';
e.rule = rule;
e.hasPassRate = 0;
e.needCalc = 0;
return e;
})(classList.class_C);
}
break;
default:
break;
}
log.type = rule;
let result = [];
// 先取A
if (classList.hasOwnProperty('class_A') && !ctx.isEmpty(classList.class_A)) {
......@@ -248,50 +306,7 @@ class ProductService extends Service {
if (result.length < limit) {
// 判断C组是否有值
if (classList.hasOwnProperty('class_C') && !ctx.isEmpty(classList.class_C)) {
// 获取开关状态,判断是自动推荐or手动推荐orABTest
const keyword = location === 'list' ? 'config_list_smart_recommend' : 'config_loan_smart_recommend';
const ruleSetting = await this.app.huodongModel.Setting.findOne({ where: { keyword } });
const rule = Number(ruleSetting.value);
console.log('rule: ' + String(rule));
// 是否需要计算模型
let isNeedCalc = false;
let userInfo = {};
switch (rule) {
case 1:
isNeedCalc = true;
break;
case 2:
isNeedCalc = false;
classList.class_C = R.map(function(e) {
e.class = 'C';
e.rule = rule;
e.hasPassRate = 0;
e.needCalc = 0;
return e;
})(classList.class_C);
break;
case 3:
// 获取不到手机号则默认使用手动推荐
isNeedCalc = false;
// 获取用户手机号,根据手机号末尾判断是否自动推荐
userInfo = await service.user.get_user(ctx.appUserId);
if (!ctx.isEmpty(userInfo) && !ctx.isEmpty(userInfo.user) && !ctx.isEmpty(userInfo.user.phone) && (Number(userInfo.user.phone) % 2 === 0)) {
isNeedCalc = true;
} else {
classList.class_C = R.map(function(e) {
e.class = 'C';
e.rule = rule;
e.hasPassRate = 0;
e.needCalc = 0;
return e;
})(classList.class_C);
}
break;
default:
break;
}
if (isNeedCalc || rule) {
if (isNeedCalc || rule === 3) {
const businessArr = R.pluck('business_id')(classList.class_C);
const passRateList = await this.getBusinessPassRate(businessArr);
if (!ctx.isEmpty(passRateList)) {
......@@ -299,7 +314,7 @@ class ProductService extends Service {
e.class = 'C';
e.rule = rule;
e.hasPassRate = 0;
e.needCalc = 1;
e.needCalc = (isNeedCalc || (isNeedCalc && rule === 3)) ? 1 : 0;
e.pass_rate = 0;
return e;
})(classList.class_C);
......@@ -316,29 +331,40 @@ class ProductService extends Service {
const passRateSort = function(a, b) {
return b.pass_rate - a.pass_rate;
};
classList.class_C = R.sort(passRateSort)(classList.class_C);
if (isNeedCalc || (isNeedCalc && rule === 3)) {
classList.class_C = R.sort(passRateSort)(classList.class_C);
log.is_smart_recommend = 1;
} else {
classList.class_C = R.sort(recommendSort)(classList.class_C);
}
log.c_class_list = R.pluck('business_id')(classList.class_C).join(',');
log.is_run_pass_rate = 1;
} else {
// 模型计算参数不够,仍然采用手动推荐
classList.class_C = R.sort(recommendSort)(classList.class_C);
classList.class_C = R.map(function(e) {
e.class = 'C';
e.rule = rule;
e.hasPassRate = 0;
e.needCalc = 1;
e.needCalc = (isNeedCalc || (isNeedCalc && rule === 3)) ? 1 : 0;
return e;
})(classList.class_C);
isNeedCalc = false;
}
}
if (!isNeedCalc) {
const tmp = R.sort(recommendSort)(classList.class_C);
classList.class_C = tmp;
} else {
classList.class_C = R.sort(recommendSort)(classList.class_C);
log.c_class_list = R.pluck('business_id')(classList.class_C).join(',');
}
}
}
result = R.insertAll(result.length, R.take(limit - result.length)(classList.class_C))(result);
ret = await this.formatLoanList(result);
// 处理log
log.need_smart_recommend = isNeedCalc ? 1 : 0;
log.business_list = R.pluck('business_id')(result).join(',');
await this.app.huodongModel.LogLoanRecommend.create(log);
}
return ret;
......
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