Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
5
51business
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
方斌
51business
Commits
60584193
Commit
60584193
authored
Jul 04, 2019
by
任国军
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix loanrecommend
parent
a24500e8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
110 additions
and
54 deletions
+110
-54
logLoanRecommend.js
app/model/huodong/logLoanRecommend.js
+30
-0
product.js
app/service/gjj/product.js
+80
-54
No files found.
app/model/huodong/logLoanRecommend.js
0 → 100644
View file @
60584193
'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
;
};
app/service/gjj/product.js
View file @
60584193
'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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment