Commit 5c225a7c authored by 李尚科's avatar 李尚科
parents ff713391 6a141bdc
Pipeline #10203 passed with stage
in 4 seconds
'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'; 'use strict';
const Service = require('egg').Service; const Service = require('egg').Service;
const R = require('ramda'); const R = require('ramda');
const moment = require('moment');
class ProductService extends Service { class ProductService extends Service {
...@@ -139,7 +140,7 @@ class ProductService extends Service { ...@@ -139,7 +140,7 @@ class ProductService extends Service {
return products; return products;
} }
products = products_results.data.ret; products = products_results.data.ret;
products.sort(function (x, y) { return x['recommend_sorter'] - y['recommend_sorter'] }); products.sort(function(x, y) { return x.recommend_sorter - y.recommend_sorter; });
products = await this.formatProducts(products); products = await this.formatProducts(products);
return products; return products;
...@@ -212,7 +213,7 @@ class ProductService extends Service { ...@@ -212,7 +213,7 @@ class ProductService extends Service {
// 获取推荐列表,按照ABC分组顺序推荐 // 获取推荐列表,按照ABC分组顺序推荐
async getBusinessRecommendList(limit, location = 'list') { async getBusinessRecommendList(limit, location = 'list') {
const { ctx, service } = this; const { ctx } = this;
const userId = ctx.userId; const userId = ctx.userId;
const R = require('ramda'); const R = require('ramda');
const recommendSort = function(a, b) { const recommendSort = function(a, b) {
...@@ -224,8 +225,65 @@ class ProductService extends Service { ...@@ -224,8 +225,65 @@ class ProductService extends Service {
const commonLoanList = await this.getCommonBusinessList(); const commonLoanList = await this.getCommonBusinessList();
ret = this.formatLoanList(R.take(limit)(R.sort(recommendSort)(commonLoanList))); ret = this.formatLoanList(R.take(limit)(R.sort(recommendSort)(commonLoanList)));
} else { } 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(); 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 = []; let result = [];
// 先取A // 先取A
if (classList.hasOwnProperty('class_A') && !ctx.isEmpty(classList.class_A)) { if (classList.hasOwnProperty('class_A') && !ctx.isEmpty(classList.class_A)) {
...@@ -250,50 +308,7 @@ class ProductService extends Service { ...@@ -250,50 +308,7 @@ class ProductService extends Service {
if (result.length < limit) { if (result.length < limit) {
// 判断C组是否有值 // 判断C组是否有值
if (classList.hasOwnProperty('class_C') && !ctx.isEmpty(classList.class_C)) { if (classList.hasOwnProperty('class_C') && !ctx.isEmpty(classList.class_C)) {
// 获取开关状态,判断是自动推荐or手动推荐orABTest if (isNeedCalc || rule === 3) {
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) {
const businessArr = R.pluck('business_id')(classList.class_C); const businessArr = R.pluck('business_id')(classList.class_C);
const passRateList = await this.getBusinessPassRate(businessArr); const passRateList = await this.getBusinessPassRate(businessArr);
if (!ctx.isEmpty(passRateList)) { if (!ctx.isEmpty(passRateList)) {
...@@ -301,7 +316,7 @@ class ProductService extends Service { ...@@ -301,7 +316,7 @@ class ProductService extends Service {
e.class = 'C'; e.class = 'C';
e.rule = rule; e.rule = rule;
e.hasPassRate = 0; e.hasPassRate = 0;
e.needCalc = 1; e.needCalc = (isNeedCalc || (isNeedCalc && rule === 3)) ? 1 : 0;
e.pass_rate = 0; e.pass_rate = 0;
return e; return e;
})(classList.class_C); })(classList.class_C);
...@@ -318,29 +333,40 @@ class ProductService extends Service { ...@@ -318,29 +333,40 @@ class ProductService extends Service {
const passRateSort = function(a, b) { const passRateSort = function(a, b) {
return b.pass_rate - a.pass_rate; 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 { } else {
// 模型计算参数不够,仍然采用手动推荐 // 模型计算参数不够,仍然采用手动推荐
classList.class_C = R.sort(recommendSort)(classList.class_C);
classList.class_C = R.map(function(e) { classList.class_C = R.map(function(e) {
e.class = 'C'; e.class = 'C';
e.rule = rule; e.rule = rule;
e.hasPassRate = 0; e.hasPassRate = 0;
e.needCalc = 1; e.needCalc = (isNeedCalc || (isNeedCalc && rule === 3)) ? 1 : 0;
return e; return e;
})(classList.class_C); })(classList.class_C);
isNeedCalc = false;
} }
} } else {
classList.class_C = R.sort(recommendSort)(classList.class_C);
if (!isNeedCalc) { log.c_class_list = R.pluck('business_id')(classList.class_C).join(',');
const tmp = R.sort(recommendSort)(classList.class_C);
classList.class_C = tmp;
} }
} }
} }
result = R.insertAll(result.length, R.take(limit - result.length)(classList.class_C))(result); result = R.insertAll(result.length, R.take(limit - result.length)(classList.class_C))(result);
ret = await this.formatLoanList(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; 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