Commit 0d753082 authored by 任国军's avatar 任国军

add generateReport

parent 253d033e
Pipeline #21760 passed with stage
in 12 seconds
...@@ -14,6 +14,21 @@ class ReportController extends Controller { ...@@ -14,6 +14,21 @@ class ReportController extends Controller {
const ret = await service.course.v5.report.getQuestionList(queryParams.cat_id); const ret = await service.course.v5.report.getQuestionList(queryParams.cat_id);
ctx.success(ret); ctx.success(ret);
} }
// 生成报告
async generateReport() {
const { ctx, service } = this;
const queryParams = ctx.request.body;
if (ctx.isEmpty(queryParams) || ctx.isEmpty(queryParams.data)) {
ctx.failed('data is empty');
}
if (ctx.isEmpty(queryParams) || ctx.isEmpty(queryParams.cat_id)) {
ctx.failed('cat_id is empty');
}
const ret = await service.course.v5.report.generateReport(queryParams);
ctx.success(ret);
}
} }
module.exports = ReportController; module.exports = ReportController;
'use strict';
const moment = require('moment');
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const CourseUserReport = app.classModel.define('course_user_report', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
user_uuid: STRING,
cat_id: INTEGER,
report_column_detail_ids: STRING,
answer: STRING,
status: INTEGER,
is_deleted: INTEGER,
created_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('created_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
updated_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('updated_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
}, {
timestamps: false,
tableName: 'course_user_report',
});
return CourseUserReport;
};
...@@ -17,6 +17,7 @@ module.exports = app => { ...@@ -17,6 +17,7 @@ module.exports = app => {
sub_title: STRING, sub_title: STRING,
selected_icon: STRING, selected_icon: STRING,
unselected_icon: STRING, unselected_icon: STRING,
tag: STRING,
status: INTEGER, status: INTEGER,
is_deleted: INTEGER, is_deleted: INTEGER,
sort: INTEGER, sort: INTEGER,
......
...@@ -18,6 +18,7 @@ module.exports = app => { ...@@ -18,6 +18,7 @@ module.exports = app => {
column: STRING, column: STRING,
column_option: INTEGER, column_option: INTEGER,
column_value: STRING, column_value: STRING,
column_score: INTEGER,
status: INTEGER, status: INTEGER,
is_deleted: INTEGER, is_deleted: INTEGER,
created_time: { created_time: {
......
...@@ -6,16 +6,14 @@ const moment = require('moment'); ...@@ -6,16 +6,14 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize; const { STRING, INTEGER, DATE } = app.Sequelize;
const CourseV5Column = app.classModel.define('course_v5_column', { const CourseV5AnswerToReportColumnDetail = app.classModel.define('course_v5_answer_to_report_column_detail', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
autoIncrement: true, autoIncrement: true,
}, },
first: STRING, answer_id: INTEGER,
second: STRING, report_column_detail_id: INTEGER,
column: STRING,
score: INTEGER,
status: INTEGER, status: INTEGER,
is_deleted: INTEGER, is_deleted: INTEGER,
created_time: { created_time: {
...@@ -36,9 +34,9 @@ module.exports = app => { ...@@ -36,9 +34,9 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_v5_column', tableName: 'course_v5_answer_to_report_column_detail',
}); });
return CourseV5Column; return CourseV5AnswerToReportColumnDetail;
}; };
...@@ -13,6 +13,7 @@ module.exports = app => { ...@@ -13,6 +13,7 @@ module.exports = app => {
autoIncrement: true, autoIncrement: true,
}, },
cat_id: INTEGER, cat_id: INTEGER,
age_id: INTEGER,
title: STRING, title: STRING,
style: INTEGER, style: INTEGER,
type: INTEGER, type: INTEGER,
......
'use strict';
const moment = require('moment');
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const CourseV5ReportColumn = app.classModel.define('course_v5_report_column', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
cat_id: INTEGER,
title: STRING,
status: INTEGER,
is_deleted: INTEGER,
sort: INTEGER,
created_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('created_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
updated_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('updated_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
}, {
timestamps: false,
tableName: 'course_v5_report_column',
});
return CourseV5ReportColumn;
};
'use strict';
const moment = require('moment');
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const CourseV5ReportColumnDetail = app.classModel.define('course_v5_report_column_detail', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
report_column_id: INTEGER,
content: STRING,
status: INTEGER,
is_deleted: INTEGER,
number: INTEGER,
created_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('created_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
updated_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('updated_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
}, {
timestamps: false,
tableName: 'course_v5_report_column_detail',
});
return CourseV5ReportColumnDetail;
};
'use strict'; 'use strict';
module.exports = app => { module.exports = app => {
const router = app.router.namespace(app.config.projectRootPath + '/course'); // const router = app.router.namespace(app.config.projectRootPath + '/course');
const loginAuth = app.middleware.loginAuth({ type: 'new' });// 登录中间件 // const loginAuth = app.middleware.loginAuth({ type: 'new' });// 登录中间件
const miniAuth = app.middleware.miniAuth();// 因为不跟现有的用户中心系统,所以使用单独的登录中间件 // const miniAuth = app.middleware.miniAuth();// 因为不跟现有的用户中心系统,所以使用单独的登录中间件
router.get('third', '/options', 'course.option.getOptions');// 筛选项 // router.get('third', '/options', 'course.option.getOptions');// 筛选项
router.post('third', '/address', miniAuth, 'course.location.getAddress');// 根据经纬度或ip获取地理位置信息 // router.post('third', '/address', miniAuth, 'course.location.getAddress');// 根据经纬度或ip获取地理位置信息
router.post('third', '/institutions', miniAuth, 'course.institution.institutionList');// 机构列表 // router.post('third', '/institutions', miniAuth, 'course.institution.institutionList');// 机构列表
router.get('third', '/institutions', miniAuth, 'course.institution.institutionList');// 机构列表 // router.get('third', '/institutions', miniAuth, 'course.institution.institutionList');// 机构列表
router.get('third', '/institution/:institution_id/:area_id', miniAuth, 'course.institution.institutionInfo');// 机构详情 // router.get('third', '/institution/:institution_id/:area_id', miniAuth, 'course.institution.institutionInfo');// 机构详情
router.post('third', '/classes', miniAuth, 'course.institution.classList');// 课程列表 // router.post('third', '/classes', miniAuth, 'course.institution.classList');// 课程列表
router.get('third', '/classes', miniAuth, 'course.institution.classList');// 课程列表 // router.get('third', '/classes', miniAuth, 'course.institution.classList');// 课程列表
router.get('third', '/class/:class_id', miniAuth, 'course.institution.classInfo');// 课程详情 // router.get('third', '/class/:class_id', miniAuth, 'course.institution.classInfo');// 课程详情
router.post('third', '/teachers', miniAuth, 'course.institution.teacherList');// 老师列表 // router.post('third', '/teachers', miniAuth, 'course.institution.teacherList');// 老师列表
router.get('third', '/teachers', miniAuth, 'course.institution.teacherList');// 老师详情 // router.get('third', '/teachers', miniAuth, 'course.institution.teacherList');// 老师详情
router.get('third', '/teacher/:teacher_id', miniAuth, 'course.institution.teacherInfo');// 老师详情 // router.get('third', '/teacher/:teacher_id', miniAuth, 'course.institution.teacherInfo');// 老师详情
router.post('third', '/user/auth', 'course.user.auth');// 微信授权登录 // router.post('third', '/user/auth', 'course.user.auth');// 微信授权登录
router.post('third', '/user/register_user', miniAuth, 'course.user.registerUserInfo');// 授权后注册用户 // router.post('third', '/user/register_user', miniAuth, 'course.user.registerUserInfo');// 授权后注册用户
router.get('third', '/user/baby', miniAuth, 'course.user.getBabyInfo');// 获取baby信息 // router.get('third', '/user/baby', miniAuth, 'course.user.getBabyInfo');// 获取baby信息
router.post('third', '/user/baby', miniAuth, 'course.user.saveBabyInfo');// 保存baby信息 // router.post('third', '/user/baby', miniAuth, 'course.user.saveBabyInfo');// 保存baby信息
router.delete('third', '/user/baby', miniAuth, 'course.user.delBabyInfo');// 删除baby信息 // router.delete('third', '/user/baby', miniAuth, 'course.user.delBabyInfo');// 删除baby信息
router.get('third', '/user/collection/institution', miniAuth, 'course.user.getCollectInstitutions');// 收藏的机构列表 // router.get('third', '/user/collection/institution', miniAuth, 'course.user.getCollectInstitutions');// 收藏的机构列表
router.post('third', '/user/collection/institution', miniAuth, 'course.user.collectInstitution');// 收藏机构 // router.post('third', '/user/collection/institution', miniAuth, 'course.user.collectInstitution');// 收藏机构
router.delete('third', '/user/collection/institution', miniAuth, 'course.user.delCollectInstitution');// 取消收藏机构 // router.delete('third', '/user/collection/institution', miniAuth, 'course.user.delCollectInstitution');// 取消收藏机构
router.get('third', '/wechat/callbackAction', 'course.wechat.check'); // router.get('third', '/wechat/callbackAction', 'course.wechat.check');
router.post('third', '/wechat/callbackAction', 'course.wechat.callbackAction'); // router.post('third', '/wechat/callbackAction', 'course.wechat.callbackAction');
router.post('third', '/wechat/test', 'course.wechat.test'); // router.post('third', '/wechat/test', 'course.wechat.test');
}; };
...@@ -20,11 +20,12 @@ module.exports = app => { ...@@ -20,11 +20,12 @@ module.exports = app => {
router.get('third', '/class/all', auth, 'course.v5.institution.getClassList');// 获取课程列表 router.get('third', '/class/all', auth, 'course.v5.institution.getClassList');// 获取课程列表
router.get('third', '/class/:class_id', auth, 'course.v5.institution.getClassInfo');// 获取课程详情 router.get('third', '/class/:class_id', auth, 'course.v5.institution.getClassInfo');// 获取课程详情
router.get('/third', '/collection/class/all', auth, 'course.v5.institution.getCollectionClassList');// 获取收藏课程列表 router.get('third', '/collection/class/all', auth, 'course.v5.institution.getCollectionClassList');// 获取收藏课程列表
router.post('/third', '/collection/class/:class_id', auth, 'course.v5.institution.collectClass');// 收藏课程 router.post('third', '/collection/class/:class_id', auth, 'course.v5.institution.collectClass');// 收藏课程
router.delete('third', '/collection/class/:class_id', auth, 'course.v5.institution.delCollectClass');// 取消收藏课程 router.delete('third', '/collection/class/:class_id', auth, 'course.v5.institution.delCollectClass');// 取消收藏课程
router.get('/third', '/article', 'course.v5.institution.getArticleByCategory');// 获取科普文章 router.get('third', '/article', 'course.v5.institution.getArticleByCategory');// 获取科普文章
router.get('/third', '/question/all', 'course.v5.report.getQuestionList');// 获取问题列表 router.get('third', '/question/all', 'course.v5.report.getQuestionList');// 获取问题列表
router.post('third', '/report', auth, 'course.v5.report.generateReport');// 生成报告
}; };
...@@ -4,13 +4,20 @@ ...@@ -4,13 +4,20 @@
const Service = require('egg').Service; const Service = require('egg').Service;
const R = require('ramda'); const R = require('ramda');
const _ = require('lodash'); const _ = require('lodash');
const moment = require('moment');
class ReportService extends Service { class ReportService extends Service {
// 获取问题列表 // 获取问题列表
async getQuestionList(catId) { async getQuestionList(catId) {
const { ctx } = this; const { ctx } = this;
const questionList = await ctx.classModel.V5.CourseV5Question.findAll({ where: { cat_id: catId, status: 1, is_deleted: 0 }, order: [[ 'sort', 'asc' ]] }); // 获取用户宝宝年龄段
const userBabyInfo = await ctx.classModel.V5.CourseV5UserBaby.findOne({ where: { user_uuid: ctx.userUuid, status: 1, is_deleted: 0 } });
if (ctx.isEmpty(userBabyInfo) || ctx.isEmpty(userBabyInfo.age)) {
ctx.failed('请先选择您的宝宝年龄');
}
const questionList = await ctx.classModel.V5.CourseV5Question.findAll({ where: { cat_id: catId, age_id: userBabyInfo.age, status: 1, is_deleted: 0 }, order: [[ 'sort', 'asc' ]] });
if (ctx.isEmpty(questionList)) { if (ctx.isEmpty(questionList)) {
return { list: [] }; return { list: [] };
} }
...@@ -39,6 +46,396 @@ class ReportService extends Service { ...@@ -39,6 +46,396 @@ class ReportService extends Service {
return ret; return ret;
} }
// 生成报告
async generateReport(input) {
const { ctx } = this;
const data = eval(input.data);
let answerIds = [];
for (const v of data) {
answerIds = _.concat(answerIds, v.answers);
}
const answerToReportColumnDetailList = await ctx.classModel.V5.CourseV5AnswerToReportColumnDetail.findAll({ where: { answer_id: { $in: answerIds }, status: 1, is_deleted: 0 }, attributes: [ 'report_column_detail_id' ] });
const reportColumnDetailIds = _.uniq(R.pluck('report_column_detail_id', answerToReportColumnDetailList));
const result = {
user_uuid: ctx.userUuid,
cat_id: input.cat_id,
report_column_detail_ids: JSON.stringify(reportColumnDetailIds),
answer: input.data,
};
const userReport = await ctx.classModel.V5.CourseUserReport.findOne({ where: { user_uuid: ctx.userUuid, cat_id: input.cat_id, status: 1, is_deleted: 0 } });
if (ctx.isEmpty(userReport)) {
await ctx.classModel.V5.CourseUserReport.findOrCreate({ where: { user_uuid: ctx.userUuid, cat_id: input.cat_id, status: 1, is_deleted: 0 }, defaults: result });
} else {
await ctx.classModel.V5.CourseUserReport.update(result, { where: { id: userReport.id } });
}
const report = await this.getReportByCategory(input.cat_id);
return report;
}
// 获取报告详情
async getReportByCategory(catId) {
const { ctx } = this;
const userReportInfo = await ctx.classModel.V5.CourseUserReport.findOne({ user_uuid: ctx.userUuid, cat_id: catId, status: 1, is_deleted: 0 });
if (ctx.isEmpty(userReportInfo)) {
ctx.failed('尚未生成报告');
}
let reportColumnDetailList = ctx.isEmpty(userReportInfo.report_column_detail_ids) ? [] : await ctx.classModel.V5.CourseV5ReportColumnDetail.findAll({ where: { id: { $in: eval(userReportInfo.report_column_detail_ids) }, status: 1, is_deleted: 0 }, attributes: [ 'id', 'report_column_id', 'content' ], raw: true });
const reportColumnList = await ctx.classModel.V5.CourseV5ReportColumn.findAll({ where: { id: { $in: R.pluck('report_column_id', reportColumnDetailList) } }, order: [[ 'sort', 'asc' ]], attributes: [ 'id', 'title' ], raw: true });
reportColumnDetailList = _.groupBy(reportColumnDetailList, 'report_column_id');
const report = [];
for (const v of reportColumnList) {
report.push({
id: v.id,
title: v.title,
content: ctx.isEmpty(reportColumnDetailList[v.id]) ? '' : reportColumnDetailList[v.id][0].content,
});
}
const tags = await this.getReportTags(userReportInfo);
const recommendClassList = await this.getRecommendClassListByReport(userReportInfo.answer);
const ret = {
tags,
report,
recommend_class_list: recommendClassList,
};
return ret;
}
// 获取标签
async getReportTags(report) {
const { ctx } = this;
const userBabyInfo = await ctx.classModel.V5.CourseV5UserBaby.findOne({ where: { user_uuid: ctx.userUuid, status: 1, is_deleted: 0 } });
const tags = [];
if (userBabyInfo.baby_sex === 1) {
tags.push('小王子');
} else {
tags.push('小公主');
}
if (!ctx.isEmpty(userBabyInfo.baby_age)) {
const age = await ctx.classModel.V5.CourseV5Age.findOne({ where: { id: userBabyInfo.baby_age }, attributes: [ 'name' ] });
if (!ctx.isEmpty(age)) {
tags.push(age.name);
}
}
if (!ctx.isEmpty(userBabyInfo.baby_birth)) {
let diffYear = moment().diff(userBabyInfo.baby_birth, 'years');
diffYear = diffYear > 0 ? diffYear : 1;
tags.push(`${diffYear}岁`);
}
// 问题对应的tag
const data = eval(report.answer);
let answerIds = [];
for (const v of data) {
answerIds = _.concat(answerIds, v.answers);
}
const tagList = await ctx.classModel.V5.CourseV5Answer.findAll({ where: { id: { $in: answerIds } }, attributes: [ 'tag' ] });
console.log(tagList);
for (const v of tagList) {
if (!ctx.isEmpty(v.tag)) {
tags.push(v.tag);
}
}
return tags;
}
// 获取推荐课程
async getRecommendClassListByReport(data) {
const { ctx } = this;
// const data = eval(input.data);
data = eval(data);
// 取出所有回答
let answerIds = [];
for (const v of data) {
answerIds = _.union(answerIds, v.answers);
}
// 获取所有回答筛选相关信息
const answerFilterList = await ctx.classModel.V5.CourseV5AnswerToFilter.findAll({ where: { answer_id: { $in: answerIds }, status: 1, is_deleted: 0 }, raw: true });
// 先做筛选
const where = await this.classFilter(answerFilterList);
let classList = await ctx.classModel.V5.CourseV5Class.findAll({ where, attributes: [ 'id', 'institution_id', 'name', 'logo', 'age', 'price', 'price_type', 'mode', 'time', 'class_amount', 'multi_classes', 'cycle', 'sort' ], raw: true });
// 格式化课程
classList = await this.formatClassList(classList);
// 然后进行打分
classList = await this.calcClassScore(classList, answerFilterList);
// 按照分数降序,价格升序的顺序排列
classList = _.orderBy(classList, [ 'score', 'filter_price' ], [ 'desc', 'asc' ]);
classList = classList.slice(0, 3);
return classList;
}
// 筛选课程
async classFilter(answerFilterList) {
const { ctx } = this;
const where = { status: 1, is_deleted: 0 };
let classIds = [];
let classFlag = false;
let tmpFilter = {};
let tmpClassList = [];
for (const v of answerFilterList) {
if (v.type === 1) {
// 判断是否是课程的额外字段
if (v.column_type === 1) { // 课程字段
switch (v.column) {
case 'price_filter':
where.price_filter = await this.getOptionValue(v);
break;
case 'price_type':
where.price_type = await this.getOptionValue(v);
break;
case 'mode':
where.mode = await this.getOptionValue(v);
break;
case 'time':
where.time = await this.getOptionValue(v);
break;
case 'class_amount':
where.class_amount = await this.getOptionValue(v);
break;
case 'multi_classes':
where.multi_classes = await this.getOptionValue(v);
break;
case 'cycle':
where.cycle = await this.getOptionValue(v);
break;
case 'type':
tmpFilter = { where: { type_id: await this.getOptionValue(v), status: 1, is_deleted: 0 }, attributes: [ 'class_id' ] };
tmpClassList = await ctx.classModel.V5.CourseV5ClassToType.findAll(tmpFilter);
classIds = classFlag ? _.union(classIds, R.pluck('class_id', tmpClassList)) : R.pluck('class_id', tmpClassList);
classFlag = true;
break;
case 'frequency':
tmpFilter = { where: { frequency_id: await this.getOptionValue(v), status: 1, is_deleted: 0 }, attributes: [ 'class_id' ] };
tmpClassList = await ctx.classModel.V5.CourseV5ClassToFrequency.findAll(tmpFilter);
classIds = classFlag ? _.union(classIds, R.pluck('class_id', tmpClassList)) : R.pluck('class_id', tmpClassList);
classFlag = true;
break;
default:
break;
}
} else if (v.column_type === 2) { // 额外字段
tmpFilter = { where: { column_id: v.column, value: await this.getOptionValue(v) }, attributes: [ 'class_id' ] };
tmpClassList = await ctx.classModel.V5.CourseV5ClassToColumn.findAll(tmpFilter);
classIds = classFlag ? _.union(classIds, R.pluck('class_id', tmpClassList)) : R.pluck('class_id', tmpClassList);
classFlag = true;
}
}
}
if (classFlag) {
where.id = { $in: classIds };
}
return where;
}
// 获取筛选项操作符和值处理后的数据
async getOptionValue(filter) {
let ret = {};
// 1:=;2:>;3:>=;4:<;5:<=;6:in;7:!=
switch (filter.column_option) {
case 1:
ret = filter.column_value;
break;
case 2:
ret = { $gt: filter.column_value };
break;
case 3:
ret = { $gte: filter.column_value };
break;
case 4:
ret = { $lt: filter.column_value };
break;
case 5:
ret = { $lte: filter.column_value };
break;
case 6:
ret = { $in: eval(filter.value) };
break;
case 7:
ret = { $not: filter.column_value };
break;
default:
break;
}
return ret;
}
// 格式化课程列表
async formatClassList(classList) {
const { ctx } = this;
const classIds = R.pluck('id', classList);
// 获取所有年龄段
let classToAge = await ctx.classModel.V5.CourseV5ClassToAge.findAll({ where: { class_id: { $in: classIds }, status: 1, is_deleted: 0 }, attributes: [ 'class_id', 'age_id' ] });
let ageList = await ctx.classModel.V5.CourseV5Age.findAll({ where: { id: { $in: R.pluck('age_id', classToAge) }, status: 1, is_deleted: 0 }, attributes: [ 'id', 'name' ] });
classToAge = _.groupBy(classToAge, 'class_id');
ageList = _.groupBy(ageList, 'id');
// 获取所有课程类型
let classToType = await ctx.classModel.V5.CourseV5ClassToType.findAll({ where: { class_id: { $in: classIds }, status: 1, is_deleted: 0 }, attributes: [ 'class_id', 'type_id' ] });
let typeList = await ctx.classModel.V5.CourseV5Type.findAll({ where: { id: { $in: R.pluck('type_id', classToType) }, status: 1, is_deleted: 0 }, attributes: [ 'id', 'name' ] });
classToType = _.groupBy(classToType, 'class_id');
typeList = _.groupBy(typeList, 'id');
// 获取所有授课频次
let classToFrequency = await ctx.classModel.V5.CourseV5ClassToFrequency.findAll({ where: { class_id: { $in: classIds }, status: 1, is_deleted: 0 }, attributes: [ 'class_id', 'frequency_id' ] });
let frequencyList = await ctx.classModel.V5.CourseV5Frequency.findAll({ where: { id: { $in: R.pluck('frequency_id', classToFrequency) }, status: 1, is_deleted: 0 }, attributes: [ 'id', 'name' ] });
classToFrequency = _.groupBy(classToFrequency, 'class_id');
frequencyList = _.groupBy(frequencyList, 'id');
// 获取所有额外字段
let classToColumn = await ctx.classModel.V5.CourseV5ClassToColumn.findAll({ where: { class_id: { $in: classIds }, status: 1, is_deleted: 0 }, attributes: [ 'class_id', 'column_id', 'value' ] });
let columnList = await ctx.classModel.V5.CourseV5Column.findAll({ where: { id: { $in: R.pluck('column_id', classToColumn) }, status: 1, is_deleted: 0 }, attributes: [ 'id', 'name' ] });
classToColumn = _.groupBy(classToColumn, 'class_id');
columnList = _.groupBy(columnList, 'id');
const ret = [];
for (const v of classList) {
const classAgeList = [];
if (!ctx.isEmpty(classToAge[v.id])) {
for (const j of classToAge[v.id]) {
if (!ctx.isEmpty(ageList[j.age_id])) {
classAgeList.push({
id: j.age_id,
name: ageList[j.age_id][0].name,
});
}
}
}
const classTypeList = [];
if (!ctx.isEmpty(classToType[v.id])) {
for (const j of classToType[v.id]) {
if (!ctx.isEmpty(typeList[j.type_id])) {
classTypeList.push({
id: j.type_id,
name: typeList[j.type_id][0].name,
});
}
}
}
const classFrequencyList = [];
if (!ctx.isEmpty(classToFrequency[v.id])) {
for (const j of classToFrequency[v.id]) {
if (!ctx.isEmpty(frequencyList[j.frequency_id])) {
classFrequencyList.push({
id: j.frequency_id,
name: frequencyList[j.frequency_id][0].name,
});
}
}
}
const classColumnList = [];
if (!ctx.isEmpty(classToColumn[v.id])) {
for (const j of classToColumn[v.id]) {
if (!ctx.isEmpty(columnList[j.column_id])) {
classColumnList.push({
id: j.column_id,
name: columnList[j.column_id][0].name,
value: j.value,
filter_key: `${j.column_id}---${j.value}`,
});
}
}
}
const tmpClass = v;
tmpClass.age_list = classAgeList;
tmpClass.type_list = classTypeList;
tmpClass.frequency_list = classFrequencyList;
tmpClass.column_list = classColumnList;
tmpClass.score = 0;
ret.push(tmpClass);
}
return ret;
}
// 计算所有公司评分
async calcClassScore(classList, answerFilterList) {
const { ctx } = this;
// 先获取所有评分筛选
let scoreFilterList = [];
for (const v of answerFilterList) {
if (v.type === 2) {
scoreFilterList.push({
column_type: v.column_value,
column: v.column,
column_value: v.column_value,
column_filter_key: `${v.column}---${v.column_value}`,
column_score: v.column_score,
});
}
}
scoreFilterList = _.groupBy(scoreFilterList, 'column_filter_key');
const ret = [];
for (const v of classList) {
const tmpClass = v;
// 先计算所有的额外字段
for (const j of v.column_list) {
if (!ctx.isEmpty(scoreFilterList[j.filter_key])) {
tmpClass.score += scoreFilterList[j.filter_key][0].column_score;
}
}
// 计算课程字段
// 年龄段
for (const j of v.age_list) {
if (!ctx.isEmpty(scoreFilterList[`age---${j.id}`])) {
tmpClass.score += scoreFilterList[`age---${j.id}`][0].column_score;
}
}
// 课程班型
for (const j of v.type_list) {
if (!ctx.isEmpty(scoreFilterList[`type---${j.id}`])) {
tmpClass.score += scoreFilterList[`type---${j.id}`][0].column_score;
}
}
// 授课频次
for (const j of v.frequency_list) {
if (!ctx.isEmpty(scoreFilterList[`frequency---${j.id}`])) {
tmpClass.score += scoreFilterList[`frequency---${j.id}`][0].column_score;
}
}
// 课程类型
if (!ctx.isEmpty(scoreFilterList[`price_type---${v.price_type}`])) {
tmpClass.score += scoreFilterList[`price_type---${v.price_type}`][0].column_score;
}
// 课程状态
if (!ctx.isEmpty(scoreFilterList[`mode---${v.mode}`])) {
tmpClass.score += scoreFilterList[`mode---${v.mode}`][0].column_score;
}
ret.push(tmpClass);
}
return ret;
}
} }
module.exports = ReportService; module.exports = ReportService;
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