Commit 64bb2879 authored by 李尚科's avatar 李尚科

fix

parent 87d5f470
Pipeline #13984 passed with stage
in 43 seconds
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
const moment = require('moment'); const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM, FLOAT } = app.Sequelize;
const CourseArea = app.prometheusModel.define('course_area', { const CourseArea = app.prometheusModel.define('course_area', {
id: { id: {
...@@ -16,6 +16,8 @@ module.exports = app => { ...@@ -16,6 +16,8 @@ module.exports = app => {
name: STRING, name: STRING,
address: STRING, address: STRING,
phone: STRING, phone: STRING,
lat: DECIMAL,
lng: DECIMAL,
status: ENUM('offline', 'online'), status: ENUM('offline', 'online'),
is_deleted: INTEGER, is_deleted: INTEGER,
created_time: { created_time: {
......
...@@ -6,6 +6,9 @@ const moment = require('moment'); ...@@ -6,6 +6,9 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseArea = app.prometheusModel.define('course_area');
const CourseInstitution = app.prometheusModel.define('course_institution', { const CourseInstitution = app.prometheusModel.define('course_institution', {
id: { id: {
type: INTEGER, type: INTEGER,
...@@ -40,6 +43,13 @@ module.exports = app => { ...@@ -40,6 +43,13 @@ module.exports = app => {
tableName: 'course_institution', tableName: 'course_institution',
}); });
CourseInstitution.hasMany(CourseArea, {
foreignKey: {
name: 'institution_id',
allowNull: false
}
});
CourseInstitution.one = async (data) => { CourseInstitution.one = async (data) => {
const attributes = data.attributes ? data.attributes : {}; const attributes = data.attributes ? data.attributes : {};
const where = data.where ? data.where : {}; const where = data.where ? data.where : {};
......
...@@ -7,8 +7,8 @@ const moment = require('moment'); ...@@ -7,8 +7,8 @@ const moment = require('moment');
class InstitutionService extends Service { class InstitutionService extends Service {
//机构列表页 //机构列表页
async getInstitutions(input) { async getInstitutions(input) {
const { ctx } = this; const { ctx } = this;
const { cat, age, institution } = input; const { cat, age, institution } = input;
...@@ -33,9 +33,14 @@ class InstitutionService extends Service { ...@@ -33,9 +33,14 @@ class InstitutionService extends Service {
if (institution) { if (institution) {
where.corner = { $ne: '' }; where.corner = { $ne: '' };
} }
const institutions = await ctx.prometheusModel.CourseInstitution.all({ where }); const include = [{ model: ctx.prometheusModel.CourseArea, where: { status: 1, is_deleted: 0 }, attributes: ['id', 'institution_id', 'name', 'address', 'lat', 'lng'] }];
const ret = await this.formatInstitutions(institutions); const attributes = ['id', 'name', 'type', 'image', 'establishment_time', 'class_type', 'teacher_count', 'teacher_experience', 'corner', 'min_age', 'max_age', 'price', 'characteristic',];
const institutions = await ctx.prometheusModel.CourseInstitution.findAll({ attributes, include, where });
const institution_area_list = await this.getInstitutionAreaList(institutions);
const area_lbs = await this.computeDistance(institution_area_list);
const institution_areas = await this.findShortestDistanceAreas(institution_area_list, area_lbs);
const ret = await this.formatInstitutions(institution_areas);
return ret; return ret;
} }
...@@ -125,6 +130,114 @@ class InstitutionService extends Service { ...@@ -125,6 +130,114 @@ class InstitutionService extends Service {
} }
async getInstitutionAreaList(institutions) {
const { ctx } = this;
const ret = [];
for (let i in institutions) {
let institution = institutions[i];
if (!institution.course_areas || institution.course_areas.length === 0) continue;
const course_areas = institution.course_areas;
for (let j in course_areas) {
const course_area = course_areas[j];
ret.push({
id: institution.id,
name: institution.name,
type: institution.type,
image: institution.image,
establishment_time: institution.establishment_time,
class_type: institution.class_type,
teacher_count: institution.teacher_count,
teacher_experience: institution.teacher_experience,
corner: institution.corner,
min_age: institution.min_age,
max_age: institution.max_age,
price: institution.price,
characteristic: institution.characteristic,
area_id: course_area.id,
area_name: course_area.name,
area_address: course_area.address,
lat: course_area.lat,
lng: course_area.lng,
});
}
}
return ret;
}
//distance=3km
async computeDistance(lbs_array, distance = 3) {
const { ctx } = this;
const from = { lat: '30.291210', lng: '120.068642' };
const driving_results = await ctx.service.course.lbs.getLBSDistance('driving', from, lbs_array);
const walking_results = await ctx.service.course.lbs.getLBSDistance('walking', from, lbs_array);
const drivings = driving_results.results.map(item => {
const distance = (item.distance / 1000).toFixed(1);
const duration = Math.ceil(item.duration / 60);
return { distance: distance, duration: duration }
});
const walkings = walking_results.results.map(item => {
const distance = (item.distance / 1000).toFixed(2);
const duration = Math.ceil(item.distance / 80);
return { distance: distance, duration: duration }
});
const results = [];
for (let i in lbs_array) {
let lbs = lbs_array[i];
const driving = drivings[i];
const walking = walkings[i];
const lbs_distance = driving.distance > distance ? driving : walking;
const travel_method = driving.distance > distance ? 'driving' : 'walking';
results.push({
lat: lbs.lat,
lng: lbs.lng,
distance: lbs_distance.distance,
duration: lbs_distance.duration,
travel_method,
});
}
return results;
}
async findShortestDistanceAreas(institution_areas, areas_list) {
const { ctx } = this;
const ret = [];
const institution_lbs = await this.computeDistance(areas_list);
for (let i in areas_list) {
let area = areas_list[i];
let institution_area = institution_areas[i];
const lbs = institution_lbs[i];
const area_name = institution_area.area_name;
const distance = lbs.distance;
const duration = lbs.duration;
let travel_tips = `${area_name},距我${distance}km,开车${duration}分钟`;
if (lbs.travel_method === 'walking') {
travel_tips = `${area_name},距我${distance}km,步行${duration}分钟`;
}
// area.distance = distance;
// area.duration = duration;
// area.travel_tips = travel_tips;
institution_area.distance = distance;
institution_area.duration = duration;
institution_area.travel_tips = travel_tips;
ret.push(institution_area);
}
return ret;
}
async formatInstitutions(institutions) { async formatInstitutions(institutions) {
if (!Array.isArray(institutions) || institutions.length === 0) { if (!Array.isArray(institutions) || institutions.length === 0) {
...@@ -133,10 +246,13 @@ class InstitutionService extends Service { ...@@ -133,10 +246,13 @@ class InstitutionService extends Service {
const ret = []; const ret = [];
for (let i in institutions) { for (let i in institutions) {
const institution = institutions[i]; const institution = institutions[i];
// const course_areas = institution.course_areas;
// if (!course_areas || course_areas.length === 0) continue;
const age_tag = institution.min_age + '-' + institution.max_age + '岁'; const age_tag = institution.min_age + '-' + institution.max_age + '岁';
const build_time = moment().format('YYYY') - institution.establishment_time; const build_time = moment().format('YYYY') - institution.establishment_time;
const tags = [age_tag, institution.class_type, '成立' + build_time + '年']; const tags = [age_tag, institution.class_type, '成立' + build_time + '年'];
const photo_album = institution.image.split(';'); const photo_album = institution.image.split(';');
ret.push({ ret.push({
id: institution.id, id: institution.id,
name: institution.name, name: institution.name,
...@@ -150,8 +266,8 @@ class InstitutionService extends Service { ...@@ -150,8 +266,8 @@ class InstitutionService extends Service {
max_age: institution.max_age, max_age: institution.max_age,
price: institution.price, price: institution.price,
tags, tags,
area_id: 1,//校区id TODO area_id: institution.area_id,//校区id TODO
travel_tips: 'XXXXX', //TODO travel_tips: institution.travel_tips, //TODO
characteristic: institution.characteristic, characteristic: institution.characteristic,
}); });
} }
......
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