Commit 27d9e2bc authored by 罗超's avatar 罗超

Merge branch 'master' of http://gitlab.oytour.com/Kui2/education

parents 8f5363e5 c6735683
...@@ -3,6 +3,7 @@ using Edu.Common; ...@@ -3,6 +3,7 @@ using Edu.Common;
using Edu.Common.API; using Edu.Common.API;
using Edu.Common.Enum; using Edu.Common.Enum;
using Edu.Common.Enum.Customer; using Edu.Common.Enum.Customer;
using Edu.Common.Enum.User;
using Edu.Model.CacheModel; using Edu.Model.CacheModel;
using Edu.Repository.Customer; using Edu.Repository.Customer;
using Edu.Repository.User; using Edu.Repository.User;
...@@ -161,6 +162,8 @@ namespace Edu.Cache.User ...@@ -161,6 +162,8 @@ namespace Edu.Cache.User
DeptName = model.DeptName, DeptName = model.DeptName,
PostName = model.PostName, PostName = model.PostName,
Email = model.Email, Email = model.Email,
IsTenCccUser = model.IsTenCccUser,
IsCourseConsultant = (model != null && model.UserRole == UserRoleEnum.CourseConsultant) ? 1 : 0,
}; };
UserInfoSet(Cache.CacheKey.User_Login_Key + Id.ToString(), userInfo, Common.Config.JwtExpirTime); UserInfoSet(Cache.CacheKey.User_Login_Key + Id.ToString(), userInfo, Common.Config.JwtExpirTime);
} }
......
...@@ -57,5 +57,10 @@ namespace Edu.Model.Entity.Customer ...@@ -57,5 +57,10 @@ namespace Edu.Model.Entity.Customer
/// 删除状态(0-正常,1-禁用) /// 删除状态(0-正常,1-禁用)
/// </summary> /// </summary>
public DateStateEnum Status { get; set; } public DateStateEnum Status { get; set; }
/// <summary>
/// 跟进类型(见枚举)
/// </summary>
public Common.Enum.User.AssistTypeEnum AssistType { get; set; }
} }
} }
...@@ -216,5 +216,35 @@ namespace Edu.Model.Entity.User ...@@ -216,5 +216,35 @@ namespace Edu.Model.Entity.User
/// 学员真实电话号码 /// 学员真实电话号码
/// </summary> /// </summary>
public string StuRealMobile { get; set; } public string StuRealMobile { get; set; }
/// <summary>
/// 咨询日期
/// </summary>
public DateTime? ConsultDate { get; set; }
/// <summary>
/// 规划课程及报价
/// </summary>
public string PlanPrice { get; set; }
/// <summary>
/// 基本情况
/// </summary>
public string BaseCondition { get; set; }
/// <summary>
/// 需求点
/// </summary>
public string DemandPoint { get; set; }
/// <summary>
/// 抗拒点
/// </summary>
public string ResistPoint { get; set; }
/// <summary>
/// 咨询结果
/// </summary>
public string ConsultingResults { get; set; }
} }
} }
...@@ -19,5 +19,10 @@ namespace Edu.Model.ViewModel.Course ...@@ -19,5 +19,10 @@ namespace Edu.Model.ViewModel.Course
/// 章节编号 /// 章节编号
/// </summary> /// </summary>
public string QChapterIds { get; set; } public string QChapterIds { get; set; }
/// <summary>
/// 小于等于当前章节
/// </summary>
public int LessThanOrEqualChapterId { get; set; }
} }
} }
...@@ -14,5 +14,25 @@ namespace Edu.Model.ViewModel.Customer ...@@ -14,5 +14,25 @@ namespace Edu.Model.ViewModel.Customer
/// 学员编号【查询使用】 /// 学员编号【查询使用】
/// </summary> /// </summary>
public string QStuIds { get; set; } public string QStuIds { get; set; }
/// <summary>
/// 月份
/// </summary>
public string MonthStr { get; set; }
/// <summary>
/// 学员数量
/// </summary>
public int StuNum { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public string STime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string ETime { get; set; }
} }
} }
...@@ -14,5 +14,21 @@ namespace Edu.Model.ViewModel.Exam ...@@ -14,5 +14,21 @@ namespace Edu.Model.ViewModel.Exam
/// 单词考试详情 /// 单词考试详情
/// </summary> /// </summary>
public List<RB_StuWords_ExamDetail_Extend> ExamDetailList { get; set; } public List<RB_StuWords_ExamDetail_Extend> ExamDetailList { get; set; }
/// <summary>
/// 学习分钟数
/// </summary>
public string ExamMinutes
{
get
{
string str = "";
if (this.ExamStartTime != null && this.ExamEndTime != null)
{
str = Common.ConvertHelper.CalcMinutes(Convert.ToDateTime(this.ExamStartTime), Convert.ToDateTime(this.ExamEndTime)).ToString();
}
return str;
}
}
} }
} }
...@@ -285,6 +285,48 @@ namespace Edu.Model.ViewModel.User ...@@ -285,6 +285,48 @@ namespace Edu.Model.ViewModel.User
/// </summary> /// </summary>
public decimal CompleteHours { get; set; } public decimal CompleteHours { get; set; }
#region 统计数量
/// <summary>
/// 开始跟进时间
/// </summary>
public string SFTime { get; set; }
/// <summary>
/// 结束跟进时间
/// </summary>
public string EFTime { get; set; }
/// <summary>
/// 根进查询类型 1范围内有 2范围内没有s
/// </summary>
public int Q_FType { get; set; }
/// <summary>
/// 学习中数量
/// </summary>
public int StudyNum { get; set; }
/// <summary>
/// 毕业数量
/// </summary>
public int GraduateNum { get; set; }
/// <summary>
/// 停课数量
/// </summary>
public int SuspendNum { get; set; }
/// <summary>
/// 退学数量
/// </summary>
public int DropOutNum { get; set; }
/// <summary>
/// 报名情况 1已报名 2未成交
/// </summary>
public int Q_EnrollState { get; set; }
#endregion
/// <summary> /// <summary>
/// 是否存在课程顾问(1-存在,2-不存在) /// 是否存在课程顾问(1-存在,2-不存在)
/// </summary> /// </summary>
......
...@@ -207,11 +207,6 @@ namespace Edu.Module.Course ...@@ -207,11 +207,6 @@ namespace Edu.Module.Course
/// </summary> /// </summary>
private readonly RB_Class_FeedBackRepository class_FeedBackRepository = new RB_Class_FeedBackRepository(); private readonly RB_Class_FeedBackRepository class_FeedBackRepository = new RB_Class_FeedBackRepository();
/// <summary>
/// 学员单词预习仓储层对象
/// </summary>
private readonly RB_StuWords_PrepRepository stuWords_PrepRepository = new RB_StuWords_PrepRepository();
/// <summary> /// <summary>
/// 获取班级列表 /// 获取班级列表
/// </summary> /// </summary>
...@@ -4918,15 +4913,6 @@ namespace Edu.Module.Course ...@@ -4918,15 +4913,6 @@ namespace Edu.Module.Course
{ {
ReviewNum = course_WordsRepository.GetCourseWordsNum(courseId, ReviewCourseNo, groupId); ReviewNum = course_WordsRepository.GetCourseWordsNum(courseId, ReviewCourseNo, groupId);
} }
decimal TotalScore = 0;
if (Stu_Account_Id > 0)
{
TotalScore= stuWords_PrepRepository.GetStuWordsPrepScoreRepository(new RB_StuWords_Prep_Extend()
{
CourseId = courseId,
Stu_Account_Id = Stu_Account_Id
});
}
return new return new
{ {
NextWord = NextNum, NextWord = NextNum,
...@@ -4934,7 +4920,7 @@ namespace Edu.Module.Course ...@@ -4934,7 +4920,7 @@ namespace Edu.Module.Course
ReviewWord = ReviewNum, ReviewWord = ReviewNum,
ReviewCourseNo, ReviewCourseNo,
CourseId = courseId, CourseId = courseId,
TotalScore ClassId=classId,
}; };
} }
......
...@@ -57,6 +57,11 @@ namespace Edu.Module.Exam ...@@ -57,6 +57,11 @@ namespace Edu.Module.Exam
QChapterIds = ChapterId + "," + NextChapterId QChapterIds = ChapterId + "," + NextChapterId
}); });
var totalList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend()
{
CourseId = CourseId,
LessThanOrEqualChapterId = ChapterId,
})?.OrderBy(qitem => Guid.NewGuid())?.ToList();
var reviewList = list?.Where(qitem => qitem.ChapterId == ChapterId)?.OrderBy(qitem => Guid.NewGuid())?.ToList(); var reviewList = list?.Where(qitem => qitem.ChapterId == ChapterId)?.OrderBy(qitem => Guid.NewGuid())?.ToList();
var prepList = list?.Where(qitem => qitem.ChapterId == NextChapterId)?.OrderBy(qitem => Guid.NewGuid())?.ToList(); var prepList = list?.Where(qitem => qitem.ChapterId == NextChapterId)?.OrderBy(qitem => Guid.NewGuid())?.ToList();
List<object> reviewGroupList = new List<object>(); List<object> reviewGroupList = new List<object>();
...@@ -66,15 +71,16 @@ namespace Edu.Module.Exam ...@@ -66,15 +71,16 @@ namespace Edu.Module.Exam
{ {
for (var i = 0; i < reviewList.Count; i++) for (var i = 0; i < reviewList.Count; i++)
{ {
var titleRandomNum= Common.ConvertHelper.CreateRandomNum(); var titleRandomNum = Common.ConvertHelper.CreateRandomNum();
var tempWords = reviewList[i]; var tempWords = reviewList[i];
var count = totalList?.Where(qitem => qitem.Id != tempWords.Id)?.Count()??0;
// reviewGroupList.Add(CreateSingleModule(tempWords,totalList));
//选择题 //选择题
if (titleRandomNum % 2 == 0) if (titleRandomNum % 2 == 0)
{ {
var tempList = reviewList.Where(qitem => qitem.Id != tempWords.Id)?.Take(3)?.ToList(); if (count > 2)
if (tempList != null && tempList.Count > 2)
{ {
reviewGroupList.Add(CreateSingleModule(tempWords, tempList)); reviewGroupList.Add(CreateSingleModule(tempWords, totalList));
} }
else else
{ {
...@@ -124,7 +130,7 @@ namespace Edu.Module.Exam ...@@ -124,7 +130,7 @@ namespace Edu.Module.Exam
} }
else else
{ {
title = string.Format("根据中文意思【{0}】,填写单词.", item.ChineseMean); title = string.Format("根据中文意思【{0}】,填写单词.", item.ChineseMean);
} }
} }
...@@ -132,7 +138,7 @@ namespace Edu.Module.Exam ...@@ -132,7 +138,7 @@ namespace Edu.Module.Exam
{ {
if (!string.IsNullOrEmpty(item.ChineseMean)) if (!string.IsNullOrEmpty(item.ChineseMean))
{ {
title = string.Format("根据中文意思【{0}】,填写单词.", item.ChineseMean); title = string.Format("根据中文意思【{0}】,填写单词.", item.ChineseMean);
} }
else else
...@@ -140,8 +146,8 @@ namespace Edu.Module.Exam ...@@ -140,8 +146,8 @@ namespace Edu.Module.Exam
title = string.Format("根据日语书写【{0}】,填写单词.", item.WordWrite); title = string.Format("根据日语书写【{0}】,填写单词.", item.WordWrite);
} }
} }
var fillinObj= new var fillinObj = new
{ {
QuestionTypeName = "填空题", QuestionTypeName = "填空题",
QuestionTypeId = 3, QuestionTypeId = 3,
...@@ -155,7 +161,7 @@ namespace Edu.Module.Exam ...@@ -155,7 +161,7 @@ namespace Edu.Module.Exam
item.WordWrite, item.WordWrite,
item.ChineseMean, item.ChineseMean,
item.FileUrl, item.FileUrl,
IsTrue=0, IsTrue = 0,
}; };
return fillinObj; return fillinObj;
} }
...@@ -164,33 +170,17 @@ namespace Edu.Module.Exam ...@@ -164,33 +170,17 @@ namespace Edu.Module.Exam
/// 创建单选题 /// 创建单选题
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public object CreateSingleModule(RB_Course_Words_Extend item,List<RB_Course_Words_Extend> chooseList) public object CreateSingleModule(RB_Course_Words_Extend item, List<RB_Course_Words_Extend> totalList)
{ {
string title = "我是问题"; string title = "我是问题";
int randNum = Common.ConvertHelper.CreateRandomNum(); int randNum = Common.ConvertHelper.CreateRandomNum();
List<optionItem> options = new List<optionItem>(); List<optionItem> options = new List<optionItem>();
var tempList = totalList?.OrderBy(qitem => Guid.NewGuid())?.ToList();
switch (randNum) switch (randNum)
{ {
//根据单词选择中文意思 //根据单词选择中文意思
case 0: case 0:
title = string.Format("请选择【{0}】单词的正确中文意思.", item.WordContent); title = CreateDefaultQuestion(item, tempList, options);
options.Add(new optionItem()
{
Content = item.ChineseMean,
IsAnswer = true,
Name = "",
ShowName = ""
});
foreach (var cItem in chooseList)
{
options.Add(new optionItem()
{
Content = cItem.ChineseMean,
IsAnswer = false,
Name = "",
ShowName = "",
});
}
break; break;
//根据中文意思选择单词 //根据中文意思选择单词
case 1: case 1:
...@@ -202,62 +192,88 @@ namespace Edu.Module.Exam ...@@ -202,62 +192,88 @@ namespace Edu.Module.Exam
Name = "", Name = "",
ShowName = "" ShowName = ""
}); });
foreach (var cItem in chooseList) for (var i = 0; i < 3; i++)
{ {
var cItem = tempList[i];
options.Add(new optionItem() options.Add(new optionItem()
{ {
Content = cItem.WordContent, Content = !string.IsNullOrEmpty(cItem.WordContent)
? cItem.WordContent
: (totalList?.FirstOrDefault(qitem => qitem.Id != item.Id &&!string.IsNullOrEmpty(qitem.WordContent))?.WordContent ?? ""),
IsAnswer = false, IsAnswer = false,
Name = "", Name = "",
ShowName = "", ShowName = "",
}); });
} }
break; break;
//根据日语书写选择中文意思 //根据日语书写选择中文意思
case 2: case 2:
title = item.WordWrite; if (!string.IsNullOrEmpty(item.WordWrite) && !string.IsNullOrEmpty(item.WordContent))
title = string.Format("请选择【{0}】所对应的单词.", item.WordWrite);
options.Add(new optionItem()
{
Content = item.WordContent,
IsAnswer = true,
Name = "",
ShowName = ""
});
foreach (var cItem in chooseList)
{ {
title = string.Format("请选择【{0}】所对应的单词.", item.WordWrite);
options.Add(new optionItem() options.Add(new optionItem()
{ {
Content = cItem.WordContent, Content = item.WordContent,
IsAnswer = false, IsAnswer = true,
Name = "", Name = "",
ShowName = "", ShowName = ""
}); });
for (var i = 0; i < 3; i++)
{
var cItem = tempList[i];
options.Add(new optionItem()
{
Content = !string.IsNullOrEmpty(cItem.WordContent)
? cItem.WordContent :
(totalList?.FirstOrDefault(qitem => qitem.Id != item.Id&&!string.IsNullOrEmpty(qitem.WordContent))?.WordContent ?? ""),
IsAnswer = false,
Name = "",
ShowName = "",
});
}
}
else
{
title = CreateDefaultQuestion(item, totalList, options);
} }
break; break;
//根据中文意思选日语书写 //根据中文意思选日语书写
case 3: case 3:
title = string.Format("请选择【{0}】所对应日语书写.", item.ChineseMean); if (!string.IsNullOrEmpty(item.WordWrite)&&!string.IsNullOrEmpty(item.ChineseMean))
options.Add(new optionItem()
{
Content = item.WordWrite,
IsAnswer = true,
Name = "",
ShowName = ""
});
foreach (var cItem in chooseList)
{ {
title = string.Format("请选择【{0}】所对应日语书写.", item.ChineseMean);
options.Add(new optionItem() options.Add(new optionItem()
{ {
Content = cItem.WordWrite, Content = item.WordWrite,
IsAnswer = false, IsAnswer = true,
Name = "", Name = "",
ShowName = "", ShowName = ""
}); });
for (var i = 0; i < 3; i++)
{
var cItem = tempList[i];
options.Add(new optionItem()
{
Content = !string.IsNullOrEmpty(cItem.WordWrite)
? cItem.WordWrite
:(totalList?.FirstOrDefault(qitem => qitem.Id != item.Id &&!string.IsNullOrEmpty(qitem.WordWrite))?.WordWrite ?? ""),
IsAnswer = false,
Name = "",
ShowName = "",
});
}
}
else
{
title = CreateDefaultQuestion(item, totalList, options);
} }
break; break;
} }
options = options?.OrderBy(qitem => Guid.NewGuid())?.ToList(); options = options?.OrderBy(qitem => Guid.NewGuid())?.ToList();
string Answer = ""; string Answer = "";
for (var j = 1; j <= options.Count; j++) for (var j = 1; j <= options.Count; j++)
{ {
...@@ -288,6 +304,38 @@ namespace Edu.Module.Exam ...@@ -288,6 +304,38 @@ namespace Edu.Module.Exam
return singleObj; return singleObj;
} }
/// <summary>
/// 生成默认的选择题
/// </summary>
/// <param name="item"></param>
/// <param name="totalList"></param>
/// <param name="options"></param>
/// <returns></returns>
public string CreateDefaultQuestion(RB_Course_Words_Extend item, List<RB_Course_Words_Extend> totalList, List<optionItem> options)
{
string title = string.Format("请选择【{0}】单词的正确中文意思.", item.WordContent);
options.Add(new optionItem()
{
Content = item.ChineseMean,
IsAnswer = true,
Name = "",
ShowName = ""
});
for (var i = 0; i < 3; i++)
{
var cItem = totalList[i];
options.Add(new optionItem()
{
Content = !string.IsNullOrEmpty(cItem.ChineseMean) ? cItem.ChineseMean :
(totalList?.FirstOrDefault(qitem =>qitem.Id!=item.Id && !string.IsNullOrEmpty(qitem.ChineseMean))?.ChineseMean ?? ""),
IsAnswer = false,
Name = "",
ShowName = "",
});
}
return title;
}
/// <summary> /// <summary>
/// 单词学习或复习 /// 单词学习或复习
/// </summary> /// </summary>
...@@ -295,18 +343,18 @@ namespace Edu.Module.Exam ...@@ -295,18 +343,18 @@ namespace Edu.Module.Exam
/// <param name="ChapterId">当前章节编号</param> /// <param name="ChapterId">当前章节编号</param>
/// <param name="ReviewChapterId">复习章节编号</param> /// <param name="ReviewChapterId">复习章节编号</param>
/// <returns></returns> /// <returns></returns>
public object GetStudyCourseWords(int CourseId, int ChapterId, int ReviewChapterId,int Stu_Account_Id) public object GetStudyCourseWords(int CourseId, int ChapterId, int ReviewChapterId, int Stu_Account_Id)
{ {
List<object> list = new List<object>(); List<object> list = new List<object>();
List<object> reviewList = new List<object>(); List<object> reviewList = new List<object>();
var dataList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend() var dataList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend()
{ {
CourseId = CourseId, CourseId = CourseId,
QChapterIds = ChapterId+","+ ReviewChapterId QChapterIds = ChapterId + "," + ReviewChapterId
}); });
if (dataList != null && dataList.Count > 0) if (dataList != null && dataList.Count > 0)
{ {
foreach (var item in dataList.Where(qitem=>qitem.ChapterId==ChapterId)) foreach (var item in dataList.Where(qitem => qitem.ChapterId == ChapterId))
{ {
list.Add(new list.Add(new
{ {
...@@ -376,7 +424,7 @@ namespace Edu.Module.Exam ...@@ -376,7 +424,7 @@ namespace Edu.Module.Exam
var wordsList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend() var wordsList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend()
{ {
CourseId = model.CourseId, CourseId = model.CourseId,
QChapterIds = model.ChapterId+","+model.ReviewCourseChapterId QChapterIds = model.ChapterId + "," + model.ReviewCourseChapterId
}); });
//当前章节单词总数 //当前章节单词总数
var currentChapterCount = wordsList?.Where(qitem => qitem.ChapterId == model.ChapterId)?.Count() ?? 0; var currentChapterCount = wordsList?.Where(qitem => qitem.ChapterId == model.ChapterId)?.Count() ?? 0;
...@@ -402,7 +450,7 @@ namespace Edu.Module.Exam ...@@ -402,7 +450,7 @@ namespace Edu.Module.Exam
else else
{ {
fileds.Add(nameof(RB_StuWords_Prep_Extend.ReviewNum), model.ReviewNum); fileds.Add(nameof(RB_StuWords_Prep_Extend.ReviewNum), model.ReviewNum);
model.StudyNum =oldModel.PrepNum+ model.ReviewNum; model.StudyNum = oldModel.PrepNum + model.ReviewNum;
} }
fileds.Add(nameof(RB_StuWords_Prep_Extend.StudyNum), model.StudyNum); fileds.Add(nameof(RB_StuWords_Prep_Extend.StudyNum), model.StudyNum);
model.Score = GetScoreModule(model.PrepNum, currentChapterCount); model.Score = GetScoreModule(model.PrepNum, currentChapterCount);
...@@ -438,16 +486,16 @@ namespace Edu.Module.Exam ...@@ -438,16 +486,16 @@ namespace Edu.Module.Exam
int score = 0; int score = 0;
if (TotalNum > 0) if (TotalNum > 0)
{ {
var progress= Convert.ToDecimal(StartNum) / Convert.ToDecimal(TotalNum) * 100; var progress = Convert.ToDecimal(StartNum) / Convert.ToDecimal(TotalNum) * 100;
if (progress > 0 && progress <= 33) if (progress > 0 && progress <= 33)
{ {
score = 1; score = 1;
} }
if (progress > 33 && progress < 70) if (progress > 34 && progress < 66)
{ {
score = 2; score = 2;
} }
if (progress >= 70) if (progress >= 66)
{ {
score = 3; score = 3;
} }
...@@ -530,5 +578,16 @@ namespace Edu.Module.Exam ...@@ -530,5 +578,16 @@ namespace Edu.Module.Exam
} }
return flag; return flag;
} }
/// <summary>
/// 获取学员单词考试列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_StuWords_Exam_Extend> GetStuWordsExamListModule(RB_StuWords_Exam_Extend query)
{
var list = stuWords_ExamRepository.GetStuWordsExamListRepository(query);
return list;
}
} }
} }
...@@ -815,5 +815,34 @@ namespace Edu.Module.User ...@@ -815,5 +815,34 @@ namespace Edu.Module.User
studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), item.StuId)); studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), item.StuId));
} }
} }
/// <summary>
/// 更新学员咨询信息
/// </summary>
/// <param name="demodel"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
public string SetStudentConsultResults(RB_Student_ViewModel demodel, UserInfo userInfo)
{
Dictionary<string, object> keyValues = new Dictionary<string, object>() {
{ nameof(RB_Student_ViewModel.ConsultDate), demodel.ConsultDate},
{ nameof(RB_Student_ViewModel.PlanPrice), demodel.PlanPrice},
{ nameof(RB_Student_ViewModel.BaseCondition), demodel.BaseCondition},
{ nameof(RB_Student_ViewModel.DemandPoint), demodel.DemandPoint},
{ nameof(RB_Student_ViewModel.ResistPoint), demodel.ResistPoint},
{ nameof(RB_Student_ViewModel.ConsultingResults), demodel.ConsultingResults},
{ nameof(RB_Student_ViewModel.UpdateBy), userInfo.Id},
{ nameof(RB_Student_ViewModel.UpdateTime), DateTime.Now}
};
List<WhereHelper> wheres = new List<WhereHelper>() {
new WhereHelper(){
FiledName = nameof(RB_Student_ViewModel.StuId),
FiledValue = demodel.StuId,
OperatorEnum =OperatorEnum.Equal
}
};
bool flag = studentRepository.Update(keyValues, wheres);
return flag ? "" : "出错了,请联系管理员";
}
} }
} }
using Edu.AOP.CustomerAttribute;
using Edu.Common.Enum;
using Edu.Common.Enum.System;
using Edu.Common.Enum.User;
using Edu.Common.Plugin;
using Edu.Model.CacheModel;
using Edu.Model.ViewModel.Customer;
using Edu.Model.ViewModel.Mall;
using Edu.Model.ViewModel.User;
using Edu.Repository.Customer;
using Edu.Repository.Mall;
using Edu.Repository.Reserve;
using Edu.Repository.System;
using Edu.Repository.User;
using System;
using System.Collections.Generic;
using System.Linq;
using VT.FW.DB;
namespace Edu.Module.User
{
/// <summary>
/// 学生统计处理类
/// </summary>
public class StudentStatModule
{
/// <summary>
/// 学生仓储层对象
/// </summary>
private readonly RB_StudentRepository studentRepository = new RB_StudentRepository();
/// <summary>
/// 学员订单关联表仓储层
/// </summary>
private readonly RB_Student_OrderGuestRepository student_OrderGuestRepository = new RB_Student_OrderGuestRepository();
/// <summary>
/// 学员跟进
/// </summary>
private readonly RB_Student_FollowRepository followRepository = new RB_Student_FollowRepository();
#region 学员跟进
/// <summary>
/// 学员跟进分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="demodel"></param>
/// <returns></returns>
public object GetStudentFollowUpPageList(int pageIndex, int pageSize, out long count, RB_Student_ViewModel demodel)
{
object Robj = new object();
var slist = student_OrderGuestRepository.GetStudentFollowUpPageList(pageIndex, pageSize, out count, demodel);
if (slist.Any()) {
string stuIds = string.Join(",", slist.Select(x => x.StuId));
//查询学生每月的跟进情况
var flist = followRepository.GetStudentFollowUpMonthList(stuIds, demodel.Group_Id);
//查询续课 学员介绍
var xlist = followRepository.GetStudentRenewMonthList(stuIds, demodel.Group_Id);//续费
var zlist = followRepository.GetStudentIntroductionMonthList(stuIds, demodel.Group_Id);//转介绍
//查询汇总数据
var TotalData = student_OrderGuestRepository.GetStudentFollowUpStat(demodel);
List<object> RList = new List<object>();
foreach (var item in slist) {
//组合所有的月份
var MonthList = flist.Where(x => x.StuId == item.StuId).Select(x => x.MonthStr).ToList();
MonthList.AddRange(xlist.Where(x => x.StuId == item.StuId).Select(x => x.MonthStr).ToList());
MonthList.AddRange(zlist.Where(x => x.StuId == item.StuId).Select(x => x.MonthStr).ToList());
MonthList = MonthList.Distinct().OrderBy(x => x).ToList();
List<object> MonthObjList = new List<object>();
foreach (var month in MonthList) {
var xmodel = xlist.Where(x => x.StuId == item.StuId && x.MonthStr == month).FirstOrDefault();
var zmodel = zlist.Where(x => x.StuId == item.StuId && x.MonthStr == month).FirstOrDefault();
var teacherModel = flist.Where(x => x.StuId == item.StuId && x.MonthStr == month && x.AssistType == AssistTypeEnum.Teacher).FirstOrDefault();
var consultantModel = flist.Where(x => x.StuId == item.StuId && x.MonthStr == month && x.AssistType == AssistTypeEnum.CourseAdviser).FirstOrDefault();
MonthObjList.Add(new
{
Month = month,
IsRenew = xmodel != null ? 1 : 2,
IntroductionNum = zmodel?.StuNum ?? 0,
Teacher = teacherModel?.Remark ?? "",
TeacherTime = teacherModel?.CreateTime.ToString("yyyy-MM-dd HH:mm") ?? "",
Consultant = consultantModel?.Remark ?? "",
ConsultantTime = consultantModel?.CreateTime.ToString("yyyy-MM-dd HH:mm") ?? ""
});
}
var StuObj = new
{
item.StuId,
item.StuName,
item.StuTel,
item.StuRealMobile,
ContractSTime = item.followUpTime,
item.CourseName,
JapanBaseInfo = item.JapanBaseInfo.ToName(),
item.StuBirthStr,
item.StuGuestState,
StuGuestStateName = item.StuGuestState.ToName(),
MonthList = MonthObjList
};
RList.Add(StuObj);
}
Robj = new
{
RList,
Stat = new
{
StuTNum = TotalData.OrderCount,
RenewNum = TotalData.RenewOrderCount,
NewNum = TotalData.OrderCount - TotalData.RenewOrderCount,
TotalData.StudyNum,
TotalData.GraduateNum,
TotalData.SuspendNum,
TotalData.DropOutNum
}
};
}
return Robj;
}
#endregion
#region 客人咨询
/// <summary>
/// 获取客人咨询分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="demodel"></param>
/// <returns></returns>
public object GetStudentConsultPageList(int pageIndex, int pageSize, out long count, RB_Student_ViewModel demodel)
{
List<object> RList = new List<object>();
var slist = student_OrderGuestRepository.GetStudentConsultPageList(pageIndex, pageSize, out count, demodel);
if (slist.Any()) {
string stuIds = string.Join(",", slist.Select(x => x.StuId));
//查询学员最近的一条跟进记录
var flist = followRepository.GetStudentFollowUpLatelyList(stuIds, demodel.Group_Id);
foreach (var item in slist) {
var fmodel = flist.Where(x => x.StuId == item.StuId).FirstOrDefault();
RList.Add(new
{
item.StuId,
item.StuName,
item.StuBirthStr,
item.StuTel,
item.StuRealMobile,
item.StuAddress,
item.StuChannelName,
EnrollState = item.Q_EnrollState,
item.CourseId,
item.CourseName,
ConsultDate = item.ConsultDate.HasValue ? item.ConsultDate.Value.ToString("yyyy-MM-dd") : "",
item.PlanPrice,
item.BaseCondition,
item.DemandPoint,
item.ResistPoint,
item.ConsultingResults,
JapanBaseInfo = item.JapanBaseInfo.ToName(),
FUTime = fmodel?.CreateTime.ToString("yyyy-MM-dd HH:mm") ?? "",
FURemark = fmodel?.Remark ?? ""
});
}
}
return RList;
}
#endregion
}
}
...@@ -86,6 +86,10 @@ WHERE 1=1 ...@@ -86,6 +86,10 @@ WHERE 1=1
{ {
builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Course_Words_Extend.ChapterId), query.QChapterIds); builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Course_Words_Extend.ChapterId), query.QChapterIds);
} }
if (query.LessThanOrEqualChapterId > 0)
{
builder.AppendFormat(" AND A.{0}<={1} ", nameof(RB_Course_Words_Extend.ChapterId), query.LessThanOrEqualChapterId);
}
} }
return Get<RB_Course_Words_Extend>(builder.ToString()).ToList(); return Get<RB_Course_Words_Extend>(builder.ToString()).ToList();
} }
......
...@@ -40,6 +40,14 @@ WHERE 1=1 ...@@ -40,6 +40,14 @@ WHERE 1=1
{ {
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Student_Follow_Extend.StuId), query.StuId); builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Student_Follow_Extend.StuId), query.StuId);
} }
if (!string.IsNullOrEmpty(query.STime))
{
builder.AppendFormat(" AND A.{0} >='{1}' ", nameof(RB_Student_Follow_Extend.CreateTime), query.STime);
}
if (!string.IsNullOrEmpty(query.ETime))
{
builder.AppendFormat(" AND A.{0} <='{1} 23:59:59' ", nameof(RB_Student_Follow_Extend.CreateTime), query.ETime);
}
} }
builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Student_Follow_Extend.Id)); builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Student_Follow_Extend.Id));
return GetPage<RB_Student_Follow_Extend>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList(); return GetPage<RB_Student_Follow_Extend>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
...@@ -78,5 +86,75 @@ WHERE 1=1 ...@@ -78,5 +86,75 @@ WHERE 1=1
builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Student_Follow_Extend.Id)); builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Student_Follow_Extend.Id));
return Get<RB_Student_Follow_Extend>(builder.ToString()).ToList(); return Get<RB_Student_Follow_Extend>(builder.ToString()).ToList();
} }
/// <summary>
/// 获取学员跟进月度列表
/// </summary>
/// <param name="stuIds"></param>
/// <param name="group_Id"></param>
/// <returns></returns>
public List<RB_Student_Follow_Extend> GetStudentFollowUpMonthList(string stuIds, int group_Id)
{
string sql = $@"SELECT f.*,f1.Remark,f1.CreateTime FROM
(SELECT StuId,AssistType,DATE_FORMAT(CreateTime,'%Y-%m') as MonthStr,MAX(Id) AS Id FROM rb_student_follow WHERE Group_Id ={group_Id} and `Status` =0 and StuId in ({stuIds}) and AssistType in(2,4)
GROUP BY StuId,AssistType,DATE_FORMAT(CreateTime,'%Y-%m')
) f
INNER JOIN rb_student_follow f1 on f.Id = f1.Id
";
return Get<RB_Student_Follow_Extend>(sql).ToList();
}
/// <summary>
/// 获取学员续费月度列表
/// </summary>
/// <param name="stuIds"></param>
/// <param name="group_Id"></param>
/// <returns></returns>
public List<RB_Student_Follow_Extend> GetStudentRenewMonthList(string stuIds, int group_Id)
{
string sql = $@"SELECT s.StuId,DATE_FORMAT(o.CreateTime,'%Y-%m') AS MonthStr FROM rb_student s
INNER JOIN rb_student_orderguest sog on s.StuId = sog.Student_Id
INNER JOIN rb_order o on sog.OrderId = o.OrderId
INNER JOIN rb_order_guest og on og.Id = sog.GuestId
where s.Group_Id ={group_Id} and s.`Status` =0 and sog.`Status` =0 and o.OrderState <>3 and (o.RenewOrderId >0 or og.RenewState =2) and s.StuId in({stuIds})
GROUP BY s.StuId,DATE_FORMAT(o.CreateTime,'%Y-%m')
";
return Get<RB_Student_Follow_Extend>(sql).ToList();
}
/// <summary>
/// 获取学员介绍月度列表
/// </summary>
/// <param name="stuIds"></param>
/// <param name="group_Id"></param>
/// <returns></returns>
public List<RB_Student_Follow_Extend> GetStudentIntroductionMonthList(string stuIds, int group_Id)
{
string sql = $@"SELECT s.StuSourceId as StuId,DATE_FORMAT(o.CreateTime,'%Y-%m') AS MonthStr,COUNT(0) AS StuNum FROM rb_student s
INNER JOIN rb_student_orderguest sog on s.StuId = sog.Student_Id
INNER JOIN rb_order o on sog.OrderId = o.OrderId
INNER JOIN rb_order_guest og on og.Id = sog.GuestId
where s.Group_Id ={group_Id} and s.`Status` =0 and sog.`Status` =0 and o.OrderState <>3 and s.StuSource =4 and s.StuSourceId in({stuIds})
GROUP BY s.StuSourceId,DATE_FORMAT(o.CreateTime,'%Y-%m')
";
return Get<RB_Student_Follow_Extend>(sql).ToList();
}
/// <summary>
/// 获取学员最近的一条跟进记录
/// </summary>
/// <param name="stuIds"></param>
/// <param name="group_Id"></param>
/// <returns></returns>
public List<RB_Student_Follow_Extend> GetStudentFollowUpLatelyList(string stuIds, int group_Id)
{
string sql = $@"SELECT f.*,f1.Remark,f1.CreateTime FROM
(SELECT StuId,AssistType,MAX(Id) AS Id FROM rb_student_follow WHERE Group_Id ={group_Id} and `Status` =0 and StuId in ({stuIds}) and AssistType =2
GROUP BY StuId,AssistType
) f
INNER JOIN rb_student_follow f1 on f.Id = f1.Id
";
return Get<RB_Student_Follow_Extend>(sql).ToList();
}
} }
} }
...@@ -49,5 +49,41 @@ WHERE 1=1 ...@@ -49,5 +49,41 @@ WHERE 1=1
} }
return GetPage<RB_StuWords_Exam_Extend>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList(); return GetPage<RB_StuWords_Exam_Extend>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
} }
/// <summary>
/// 获取学员单词考试列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_StuWords_Exam_Extend> GetStuWordsExamListRepository(RB_StuWords_Exam_Extend query)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.*
FROM RB_StuWords_Exam AS A
WHERE 1=1
");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_StuWords_Exam_Extend.Group_Id), query.Group_Id);
}
if (query.Stu_Account_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_StuWords_Exam_Extend.Stu_Account_Id), query.Stu_Account_Id);
}
if (query.CourseId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_StuWords_Exam_Extend.CourseId), query.CourseId);
}
if (query.ChapterId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_StuWords_Exam_Extend.ChapterId), query.ChapterId);
}
}
return Get<RB_StuWords_Exam_Extend>(builder.ToString()).ToList();
}
} }
} }
...@@ -1218,7 +1218,8 @@ order by a.ClassDate desc limit 1"; ...@@ -1218,7 +1218,8 @@ order by a.ClassDate desc limit 1";
/// <returns></returns> /// <returns></returns>
public List<RB_Class_Plan_ViewModel> GetStudyClassPlanList(int classId, int groupId) public List<RB_Class_Plan_ViewModel> GetStudyClassPlanList(int classId, int groupId)
{ {
string sql = $@"SELECT a.*,(select count(0) from rb_class_plan p where p.`Status`=0 and p.Group_Id ={groupId} and p.ClassId ={classId} and p.ClassDate < a.ClassDate) as LessonPlanNum string sql = $@"
SELECT a.*,(select count(0) from rb_class_plan p where p.`Status`=0 and p.Group_Id ={groupId} and p.ClassId ={classId} and p.ClassDate <= a.ClassDate) as LessonPlanNum
FROM rb_class_plan as a FROM rb_class_plan as a
WHERE a.`Status`=0 and a.Group_Id ={groupId} and a.ClassId ={classId} WHERE a.`Status`=0 and a.Group_Id ={groupId} and a.ClassId ={classId}
and a.ClassDate <='{Common.ConvertHelper.FormatDate(DateTime.Now)} 23:59:59' and a.ClassDate <='{Common.ConvertHelper.FormatDate(DateTime.Now)} 23:59:59'
......
...@@ -811,14 +811,15 @@ WHERE g.`Status` =0 and g.Group_Id ={groupId} and o.OrderState <>3 and o.OrderTy ...@@ -811,14 +811,15 @@ WHERE g.`Status` =0 and g.Group_Id ={groupId} and o.OrderState <>3 and o.OrderTy
/// <returns></returns> /// <returns></returns>
public RB_Order_Guest_Extend GetOrderGusetHoursInfo(int guestId, int classId) public RB_Order_Guest_Extend GetOrderGusetHoursInfo(int guestId, int classId)
{ {
string sql = $@"select A.* ,gc.AbsenceNum,gc.LeaveNum string sql = $@"
SELECT A.* ,IFNULL(gc.AbsenceNum,0) AS AbsenceNum,IFNULL(gc.LeaveNum,0) AS LeaveNum
FROM RB_Order_Guest AS A FROM RB_Order_Guest AS A
inner JOIN ( LEFT JOIN (
SELECT OrderGuestId,SUM(CASE CheckStatus WHEN 1 THEN 1 ELSE 0 END) AS AbsenceNum,SUM(CASE CheckStatus WHEN 2 THEN 1 ELSE 0 END) AS LeaveNum SELECT OrderGuestId,SUM(CASE CheckStatus WHEN 1 THEN 1 ELSE 0 END) AS AbsenceNum,SUM(CASE CheckStatus WHEN 2 THEN 1 ELSE 0 END) AS LeaveNum
FROM rb_class_check FROM rb_class_check
WHERE `Status`=0 and CheckStatus <>0 and ClassId ={classId} GROUP BY OrderGuestId WHERE `Status`=0 and CheckStatus <>0 and ClassId ={classId} GROUP BY OrderGuestId
) AS gc on gc.OrderGuestId=a.Id ) AS gc on gc.OrderGuestId=a.Id
where A.Id ={guestId} WHERE A.Id ={guestId}
"; ";
return Get<RB_Order_Guest_Extend>(sql).FirstOrDefault(); return Get<RB_Order_Guest_Extend>(sql).FirstOrDefault();
} }
......
...@@ -163,7 +163,7 @@ WHERE 1=1 ...@@ -163,7 +163,7 @@ WHERE 1=1
} }
} }
return GetPage<RB_Student_OrderGuest_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList(); return GetPage<RB_Student_OrderGuest_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
} }
/// <summary> /// <summary>
/// 根据退课编号查询学员信息 /// 根据退课编号查询学员信息
...@@ -219,5 +219,322 @@ WHERE og.Status =0 and g.`Status` =0 and o.Group_Id ={group_Id} and o.OrderState ...@@ -219,5 +219,322 @@ WHERE og.Status =0 and g.`Status` =0 and o.Group_Id ={group_Id} and o.OrderState
ORDER BY {(Type == 1 ? "c.OpenTime asc" : "c.OpenTime desc")} LIMIT 1"; ORDER BY {(Type == 1 ? "c.OpenTime asc" : "c.OpenTime desc")} LIMIT 1";
return Get<RB_Student_OrderGuest_ViewModel>(sql).FirstOrDefault(); return Get<RB_Student_OrderGuest_ViewModel>(sql).FirstOrDefault();
} }
#region 学员跟进
/// <summary>
/// 获取学员跟进分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="demodel"></param>
/// <returns></returns>
public List<RB_Student_ViewModel> GetStudentFollowUpPageList(int pageIndex, int pageSize, out long count, RB_Student_ViewModel demodel)
{
DynamicParameters parameters = new DynamicParameters();
string where = " 1=1 and s.Status =0 ";
if (demodel.Group_Id > 0) {
where += $" and s.{nameof(RB_Student_ViewModel.Group_Id)} ={demodel.Group_Id}";
}
if (!string.IsNullOrEmpty(demodel.StuName)) {
where += $" and s.{nameof(RB_Student_ViewModel.StuName)} like @StuName";
parameters.Add("StuName", "%" + demodel.StuName + "%");
}
if (!string.IsNullOrEmpty(demodel.StuRealMobile)) {
where += $" and s.{nameof(RB_Student_ViewModel.StuRealMobile)} like @StuRealMobile";
parameters.Add("StuRealMobile", "%" + demodel.StuRealMobile + "%");
}
if (!string.IsNullOrEmpty(demodel.QQ))
{
where += $" and s.{nameof(RB_Student_ViewModel.QQ)} like @QQ";
parameters.Add("QQ", "%" + demodel.QQ + "%");
}
if (!string.IsNullOrEmpty(demodel.WeChatNo))
{
where += $" and s.{nameof(RB_Student_ViewModel.WeChatNo)} like @WeChatNo";
parameters.Add("WeChatNo", "%" + demodel.WeChatNo + "%");
}
if (demodel.StuType > 0)
{
where += $" and s.{nameof(RB_Student_ViewModel.StuType)} ={demodel.StuType}";
}
if (demodel.StuGuestState > 0)
{
where += $" and org.GuestState ={(int)demodel.StuGuestState}";
}
if (!string.IsNullOrEmpty(demodel.SFTime) && !string.IsNullOrEmpty(demodel.EFTime))
{
if (demodel.Q_FType == 1)
{
where += $" and f.Id is not null";
}
else
{
where += $" and f.Id is null";
}
}
if (demodel.BelongType > 0)
{
//全部
if (demodel.BelongType == 1)
{
where += $@" AND (s.CreateBy={demodel.CreateBy} OR s.StuId IN (SELECT StuId FROM rb_student_assist WHERE AssistId ={demodel.CreateBy} AND `Status`=0))";
}
//我负责的
else if (demodel.BelongType == 2)
{
where += $" AND s.{nameof(RB_Student_ViewModel.CreateBy)} ={demodel.CreateBy} ";
}
//我协同的
else if (demodel.BelongType == 3)
{
where += $" AND s.StuId IN (SELECT StuId FROM rb_student_assist WHERE AssistId ={demodel.CreateBy} AND `Status`=0) ";
}
//我下属的
else if (demodel.BelongType == 4)
{
if (demodel.CreateIds != null && demodel.CreateIds.Count > 0)
{
string createIds = string.Join(",", demodel.CreateIds);
if (!string.IsNullOrEmpty(createIds))
{
where += $" AND (s.{nameof(RB_Student_ViewModel.CreateBy)} IN({createIds}) OR s.StuId IN (SELECT StuId FROM rb_student_assist WHERE AssistId IN({createIds}) AND `Status`=0)) ";
}
}
else
{
where += $" AND s.{nameof(RB_Student_ViewModel.CreateBy)} ={demodel.CreateBy} ";
}
}
}
else
{
if (demodel.CreateBy > 0)
{
where += $" AND s.{nameof(RB_Student_ViewModel.CreateBy)} ={demodel.CreateBy} ";
}
}
string sql = $@"SELECT s.StuId,s.StuName,s.StuTel,s.StuRealMobile,s.QQ,DATE_FORMAT(ec.CreateTime,'%Y-%m-%d') as followUpTime,c.CourseId,c.CourseName,s.JapanBaseInfo,s.StuBirth,org.GuestState as StuGuestState
FROM rb_student s
INNER JOIN rb_student_orderguest og on og.Student_Id = s.StuId
INNER JOIN (SELECT og.Student_Id,MAX(og.Id) as Id FROM rb_student_orderguest og
INNER JOIN rb_order o on og.OrderId = o.OrderId
WHERE o.OrderState <>3 GROUP BY og.Student_Id) stu on og.Id = stu.Id and og.Student_Id = s.StuId
INNER JOIN rb_order_guest org on org.Id = og.GuestId
INNER JOIN rb_order o on og.OrderId = o.OrderId
INNER JOIN rb_course c on o.CourseId = c.CourseId
LEFT JOIN rb_education_contract ec on ec.GuestId = og.GuestId";
if (!string.IsNullOrEmpty(demodel.SFTime) && !string.IsNullOrEmpty(demodel.EFTime)) {
//增加跟进链表
sql += $@"LEFT JOIN rb_student_follow f on s.StuId = f.StuId and f.`Status` =0 and f.CreateTime >='{demodel.SFTime}' and f.CreateTime <='{demodel.EFTime} 23:59:59'";
}
sql += $" where {where} ";
if ((!string.IsNullOrEmpty(demodel.SFTime) && !string.IsNullOrEmpty(demodel.EFTime)))
{
sql += $" GROUP BY s.StuId";
}
sql += $" order by s.StuId desc";
return GetPage<RB_Student_ViewModel>(pageIndex, pageSize, out count, sql, parameters).ToList();
}
/// <summary>
/// 获取人数统计
/// </summary>
/// <param name="demodel"></param>
/// <returns></returns>
public RB_Student_ViewModel GetStudentFollowUpStat(RB_Student_ViewModel demodel) {
DynamicParameters parameters = new DynamicParameters();
string where = " 1=1 and s.Status =0 ";
if (demodel.Group_Id > 0)
{
where += $" and s.{nameof(RB_Student_ViewModel.Group_Id)} ={demodel.Group_Id}";
}
if (!string.IsNullOrEmpty(demodel.StuName))
{
where += $" and s.{nameof(RB_Student_ViewModel.StuName)} like @StuName";
parameters.Add("StuName", "%" + demodel.StuName + "%");
}
if (!string.IsNullOrEmpty(demodel.StuRealMobile))
{
where += $" and s.{nameof(RB_Student_ViewModel.StuRealMobile)} like @StuRealMobile";
parameters.Add("StuRealMobile", "%" + demodel.StuRealMobile + "%");
}
if (!string.IsNullOrEmpty(demodel.QQ))
{
where += $" and s.{nameof(RB_Student_ViewModel.QQ)} like @QQ";
parameters.Add("QQ", "%" + demodel.QQ + "%");
}
if (!string.IsNullOrEmpty(demodel.WeChatNo))
{
where += $" and s.{nameof(RB_Student_ViewModel.WeChatNo)} like @WeChatNo";
parameters.Add("WeChatNo", "%" + demodel.WeChatNo + "%");
}
if (demodel.StuType > 0)
{
where += $" and s.{nameof(RB_Student_ViewModel.StuType)} ={demodel.StuType}";
}
if (demodel.StuGuestState > 0)
{
where += $" and org.GuestState ={(int)demodel.StuGuestState}";
}
if (!string.IsNullOrEmpty(demodel.SFTime) && !string.IsNullOrEmpty(demodel.EFTime))
{
if (demodel.Q_FType == 1)
{
where += $" and f.Id is not null";
}
else
{
where += $" and f.Id is null";
}
}
string sql = $@"
select count(0) as OrderCount,sum(case when t.RenewState = 1 then 1 else 0 end) AS RenewOrderCount,
SUM(CASE WHEN t.StuGuestState =1 THEN 1 ELSE 0 END) AS StudyNum,
SUM(CASE WHEN t.StuGuestState =2 THEN 1 ELSE 0 END) AS DropOutNum,
SUM(CASE WHEN t.StuGuestState =5 THEN 1 ELSE 0 END) AS SuspendNum,
SUM(CASE WHEN t.StuGuestState =7 THEN 1 ELSE 0 END) AS GraduateNum
from(
SELECT s.StuId,s.StuName,s.StuTel,s.StuRealMobile,s.QQ,ec.CreateTime,c.CourseId,c.CourseName,s.JapanBaseInfo,s.StuBirth,org.GuestState as StuGuestState,
case when o.RenewOrderId >0 or org.RenewState =2 then 1 else 0 end AS RenewState
FROM rb_student s
{(demodel.IsQueryMyStu == 1 ? "INNER JOIN rb_student_assist sa on s.StuId = sa.StuId and sa.`Status` =0 and sa.AssistId =" + demodel.CreateBy : "")}
INNER JOIN rb_student_orderguest og on og.Student_Id = s.StuId
INNER JOIN (SELECT og.Student_Id,MAX(og.Id) as Id FROM rb_student_orderguest og
INNER JOIN rb_order o on og.OrderId = o.OrderId
WHERE o.OrderState <>3 GROUP BY og.Student_Id) stu on og.Id = stu.Id and og.Student_Id = s.StuId
INNER JOIN rb_order_guest org on org.Id = og.GuestId
INNER JOIN rb_order o on og.OrderId = o.OrderId
INNER JOIN rb_course c on o.CourseId = c.CourseId
LEFT JOIN rb_education_contract ec on ec.GuestId = og.GuestId";
if (!string.IsNullOrEmpty(demodel.SFTime) && !string.IsNullOrEmpty(demodel.EFTime))
{
//增加跟进链表
sql += $@"LEFT JOIN rb_student_follow f on s.StuId = f.StuId and f.`Status` =0 and f.CreateTime >='{demodel.SFTime}' and f.CreateTime <='{demodel.EFTime} 23:59:59'";
}
sql += $" where {where} ";
if ((!string.IsNullOrEmpty(demodel.SFTime) && !string.IsNullOrEmpty(demodel.EFTime)) || demodel.IsQueryMyStu == 1)
{
sql += $" GROUP BY s.StuId";
}
sql += $" order by s.StuId desc)t";
return Get<RB_Student_ViewModel>(sql, parameters).FirstOrDefault();
}
/// <summary>
/// 获取学员咨询分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="demodel"></param>
/// <returns></returns>
public List<RB_Student_ViewModel> GetStudentConsultPageList(int pageIndex, int pageSize, out long count, RB_Student_ViewModel demodel)
{
DynamicParameters parameters = new DynamicParameters();
string where = " 1=1 and s.Status =0 ";
if (demodel.Group_Id > 0)
{
where += $" and s.{nameof(RB_Student_ViewModel.Group_Id)} ={demodel.Group_Id}";
}
if (!string.IsNullOrEmpty(demodel.StuName))
{
where += $" and s.{nameof(RB_Student_ViewModel.StuName)} like @StuName";
parameters.Add("StuName", "%" + demodel.StuName + "%");
}
if (!string.IsNullOrEmpty(demodel.StuRealMobile))
{
where += $" and s.{nameof(RB_Student_ViewModel.StuRealMobile)} like @StuRealMobile";
parameters.Add("StuRealMobile", "%" + demodel.StuRealMobile + "%");
}
if (!string.IsNullOrEmpty(demodel.QQ))
{
where += $" and s.{nameof(RB_Student_ViewModel.QQ)} like @QQ";
parameters.Add("QQ", "%" + demodel.QQ + "%");
}
if (!string.IsNullOrEmpty(demodel.WeChatNo))
{
where += $" and s.{nameof(RB_Student_ViewModel.WeChatNo)} like @WeChatNo";
parameters.Add("WeChatNo", "%" + demodel.WeChatNo + "%");
}
if (demodel.StuType > 0)
{
where += $" and s.{nameof(RB_Student_ViewModel.StuType)} ={demodel.StuType}";
}
if (demodel.StuGuestState > 0)
{
where += $" and org.GuestState ={(int)demodel.StuGuestState}";
}
if (demodel.Q_EnrollState > 0) {
if (demodel.Q_EnrollState == 1)
{
where += $" and o.OrderId is not null";
}
else {
where += $" and o.OrderId is null";
}
}
if (demodel.BelongType > 0)
{
//全部
if (demodel.BelongType == 1)
{
where += $@" AND (s.CreateBy={demodel.CreateBy} OR s.StuId IN (SELECT StuId FROM rb_student_assist WHERE AssistId ={demodel.CreateBy} AND `Status`=0))";
}
//我负责的
else if (demodel.BelongType == 2)
{
where += $" AND s.{nameof(RB_Student_ViewModel.CreateBy)} ={demodel.CreateBy} ";
}
//我协同的
else if (demodel.BelongType == 3)
{
where += $" AND s.StuId IN (SELECT StuId FROM rb_student_assist WHERE AssistId ={demodel.CreateBy} AND `Status`=0) ";
}
//我下属的
else if (demodel.BelongType == 4)
{
if (demodel.CreateIds != null && demodel.CreateIds.Count > 0)
{
string createIds = string.Join(",", demodel.CreateIds);
if (!string.IsNullOrEmpty(createIds))
{
where += $" AND (s.{nameof(RB_Student_ViewModel.CreateBy)} IN({createIds}) OR s.StuId IN (SELECT StuId FROM rb_student_assist WHERE AssistId IN({createIds}) AND `Status`=0)) ";
}
}
else
{
where += $" AND s.{nameof(RB_Student_ViewModel.CreateBy)} ={demodel.CreateBy} ";
}
}
}
else
{
if (demodel.CreateBy > 0)
{
where += $" AND s.{nameof(RB_Student_ViewModel.CreateBy)} ={demodel.CreateBy} ";
}
}
string sql = $@"SELECT s.*,case when o.OrderId is null then 2 else 1 end as Q_EnrollState,og.GuestState,c.CourseId,c.CourseName,ch.Name as StuChannelName
FROM rb_student s
LEFT JOIN (
SELECT sog.Student_Id,MAX(og.Id) AS GuestId FROM rb_student_orderguest sog
INNER JOIN rb_order o on sog.OrderId = o.OrderId
INNER JOIN rb_order_guest og on sog.GuestId = og.Id
WHERE o.Group_Id =100000 and sog.`Status` =0 and o.OrderState <>3 and og.`Status` =0 GROUP BY sog.Student_Id
) ot on s.StuId = ot.Student_Id
LEFT JOIN rb_order_guest og on ot.GuestId = og.Id
LEFT JOIN rb_order o on og.OrderId = o.OrderId
LEFT JOIN rb_course c on o.CourseId = c.CourseId
LEFT JOIN rb_channel ch on s.StuChannel = ch.Id
WHERE 1=1
GROUP BY s.StuId order by s.StuId desc";
return GetPage<RB_Student_ViewModel>(pageIndex, pageSize, out count, sql, parameters).ToList();
}
#endregion
} }
} }
...@@ -55,20 +55,27 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -55,20 +55,27 @@ namespace Edu.WebApi.Controllers.Applet
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public ApiResult GetMyCenterInfo() { public ApiResult GetMyCenterInfo()
{
var userInfo = base.AppletUserInfo; var userInfo = base.AppletUserInfo;
var accountModel = accountModule.GetAccountListModule(new RB_Account_ViewModel() { Group_Id = userInfo.Group_Id, Id = userInfo.Id, AccountType = Common.Enum.User.AccountTypeEnum.Student }).FirstOrDefault(); var accountModel = accountModule.GetAccountListModule(new RB_Account_ViewModel() { Group_Id = userInfo.Group_Id, Id = userInfo.Id, AccountType = Common.Enum.User.AccountTypeEnum.Student }).FirstOrDefault();
if (accountModel == null) { return ApiResult.Failed("账号不存在"); } if (accountModel == null)
{
return ApiResult.Failed("账号不存在");
}
//获取学生信息 //获取学生信息
var stuModel = studentModule.GetStudentListModule(new RB_Student_ViewModel() { Group_Id = userInfo.Group_Id, StuId = accountModel.AccountId }).FirstOrDefault(); var stuModel = studentModule.GetStudentListModule(new RB_Student_ViewModel() { Group_Id = userInfo.Group_Id, StuId = accountModel.AccountId }).FirstOrDefault();
if (stuModel == null) { return ApiResult.Failed("账号不存在"); } if (stuModel == null)
{
return ApiResult.Failed("账号不存在");
}
//获取协助人员 //获取协助人员
List<object> RAssistList = new List<object>(); List<object> RAssistList = new List<object>();
//首先获取学员的创建人 (市场经理) //首先获取学员的创建人 (市场经理)
if (stuModel.EnterID > 0) if (stuModel.CreateBy > 0)
{ {
var EnterModel = UserReidsCache.GetUserLoginInfo(stuModel.EnterID); var EnterModel = UserReidsCache.GetUserLoginInfo(stuModel.CreateBy);
RAssistList.Add(new RAssistList.Add(new
{ {
AssistId = stuModel.EnterID, AssistId = stuModel.EnterID,
...@@ -79,7 +86,8 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -79,7 +86,8 @@ namespace Edu.WebApi.Controllers.Applet
}); });
} }
var assistList = studentModule.GetStuAssistListModule(accountModel.AccountId); var assistList = studentModule.GetStuAssistListModule(accountModel.AccountId);
foreach (var item in assistList) { foreach (var item in assistList)
{
var empModel = accountModule.GetEmployeeInfo(item.AssistId); var empModel = accountModule.GetEmployeeInfo(item.AssistId);
RAssistList.Add(new RAssistList.Add(new
{ {
...@@ -116,7 +124,8 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -116,7 +124,8 @@ namespace Edu.WebApi.Controllers.Applet
LearningInfo.ClassName LearningInfo.ClassName
}; };
} }
else { else
{
CourseInfo = new CourseInfo = new
{ {
State = 2//没有课程信息 State = 2//没有课程信息
......
...@@ -54,7 +54,7 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -54,7 +54,7 @@ namespace Edu.WebApi.Controllers.Applet
/// <summary> /// <summary>
/// 试卷处理类对象 /// 试卷处理类对象
/// </summary> /// </summary>
private readonly Module.Exam.PaperModule paperModule = AOP.AOPHelper.CreateAOPObject<Module.Exam.PaperModule>(); private readonly PaperModule paperModule = AOP.AOPHelper.CreateAOPObject<PaperModule>();
/// <summary> /// <summary>
/// 学习园地处理类对象 /// 学习园地处理类对象
/// </summary> /// </summary>
...@@ -318,6 +318,7 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -318,6 +318,7 @@ namespace Edu.WebApi.Controllers.Applet
NextCourseNo=0, NextCourseNo=0,
ReviewCourseNo=0, ReviewCourseNo=0,
CourseId=0, CourseId=0,
ClassId=0,
}; };
} }
...@@ -481,7 +482,8 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -481,7 +482,8 @@ namespace Edu.WebApi.Controllers.Applet
NextCourseNo=0, NextCourseNo=0,
ReviewWord = 0, ReviewWord = 0,
ReviewCourseNo=0, ReviewCourseNo=0,
CourseId = CourseId CourseId,
ClassId,
}; };
} }
...@@ -543,6 +545,13 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -543,6 +545,13 @@ namespace Edu.WebApi.Controllers.Applet
Group_Id = appletUserInfo.Group_Id, Group_Id = appletUserInfo.Group_Id,
Stu_Account_Id = appletUserInfo.Id Stu_Account_Id = appletUserInfo.Id
}); });
//单词测试列表
var wordsExamList = courseExamModule.GetStuWordsExamListModule(new RB_StuWords_Exam_Extend()
{
ClassId = ClassId,
CourseId=CourseId,
Stu_Account_Id= appletUserInfo.Id
});
//组装数据 //组装数据
var RList = new List<object>(); var RList = new List<object>();
foreach (var item in ctList) foreach (var item in ctList)
...@@ -553,9 +562,16 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -553,9 +562,16 @@ namespace Edu.WebApi.Controllers.Applet
decimal StudyProgress = 0; decimal StudyProgress = 0;
if (tempPrepWords != null && tempPrepWords.TotalNum > 0) if (tempPrepWords != null && tempPrepWords.TotalNum > 0)
{ {
StudyProgress = Math.Round(Convert.ToDecimal(tempPrepWords.StudyNum) / Convert.ToDecimal(tempPrepWords.TotalNum) * 100, 2); ; StudyProgress = (int)(Convert.ToDecimal(tempPrepWords.StudyNum) / Convert.ToDecimal(tempPrepWords.TotalNum) * 100);
} }
int Num = 1; int Num = 1;
decimal Score = 0;//单词测试得分
if (wordsExamList != null && wordsExamList.Count > 0)
{
Score = wordsExamList?.Where(qitem => qitem.ChapterId.ToString() == item.ChapterNo)?.OrderByDescending(qitem => qitem.CreateTime)?.FirstOrDefault()?.Score ?? 0;
}
RList.Add(new RList.Add(new
{ {
planModel?.ClassPlanId, planModel?.ClassPlanId,
...@@ -568,8 +584,11 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -568,8 +584,11 @@ namespace Edu.WebApi.Controllers.Applet
x.VideoUrl x.VideoUrl
}), }),
ChapterTree = item, ChapterTree = item,
Score=tempPrepWords?.Score??0, Score,
StudyProgress, StudyProgress,
ClassId,
CourseId,
item.ChapterNo,
NextChapterNo = chapterTreeList.Where(x => Convert.ToInt32(x.ChapterNo) > Convert.ToInt32(item.ChapterNo)).OrderBy(x => Convert.ToInt32(x.ChapterNo)).FirstOrDefault()?.ChapterNo ?? "" NextChapterNo = chapterTreeList.Where(x => Convert.ToInt32(x.ChapterNo) > Convert.ToInt32(item.ChapterNo)).OrderBy(x => Convert.ToInt32(x.ChapterNo)).FirstOrDefault()?.ChapterNo ?? ""
}); });
} }
......
...@@ -154,7 +154,12 @@ namespace Edu.WebApi.Controllers.Applet ...@@ -154,7 +154,12 @@ namespace Edu.WebApi.Controllers.Applet
} }
var flag = courseExamModule.SubmitStuWordsExamModule(model); var flag = courseExamModule.SubmitStuWordsExamModule(model);
return flag ? ApiResult.Success(data: model) : ApiResult.Failed(); return flag ? ApiResult.Success(data: new
{
model.Id,
model.Score,
model.ExamMinutes
}) : ApiResult.Failed();
} }
} }
} }
...@@ -138,6 +138,8 @@ namespace Edu.WebApi.Controllers.Customer ...@@ -138,6 +138,8 @@ namespace Edu.WebApi.Controllers.Customer
var query = new RB_Student_Follow_Extend() var query = new RB_Student_Follow_Extend()
{ {
StuId = base.ParmJObj.GetInt("StuId"), StuId = base.ParmJObj.GetInt("StuId"),
STime = base.ParmJObj.GetStringValue("STime"),
ETime = base.ParmJObj.GetStringValue("ETime"),
}; };
query.Group_Id = base.UserInfo.Group_Id; query.Group_Id = base.UserInfo.Group_Id;
var data = customerStudentModule.GetStudentFollowPageModule(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query); var data = customerStudentModule.GetStudentFollowPageModule(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query);
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Edu.AOP;
using Edu.Cache.User;
using Edu.Cache.WeChat;
using Edu.Common.API;
using Edu.Common.Plugin;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.Sell;
using Edu.Model.ViewModel.User;
using Edu.Module.Course;
using Edu.Module.User;
using Edu.Repository.Course;
using Edu.WebApi.Filter;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace Edu.WebApi.Controllers.User
{
[Route("api/[controller]/[action]")]
[ApiExceptionFilter]
[ApiController]
[EnableCors("AllowCors")]
public class StudentStatController : BaseController
{
/// <summary>
/// 学员统计
/// </summary>
private readonly StudentStatModule studentStatModule = new StudentStatModule();
#region 学员跟进
/// <summary>
/// 获取学员根据分页列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetStudentFollowUpPageList() {
var userInfo = base.UserInfo;
ResultPageModel pmodel = JsonHelper.DeserializeObject<ResultPageModel>(base.RequestParm.Msg.ToString());
RB_Student_ViewModel demodel = JsonHelper.DeserializeObject<RB_Student_ViewModel>(base.RequestParm.Msg.ToString());
demodel.Group_Id = userInfo.Group_Id;
demodel.CreateBy = userInfo.Id;
var list = studentStatModule.GetStudentFollowUpPageList(pmodel.PageIndex, pmodel.PageSize, out long count, demodel);
pmodel.Count = count;
pmodel.PageData = list;
return ApiResult.Success("", pmodel);
}
#endregion
#region 客人咨询
/// <summary>
/// 获取学员咨询分页列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetStudentConsultPageList()
{
var userInfo = base.UserInfo;
ResultPageModel pmodel = JsonHelper.DeserializeObject<ResultPageModel>(base.RequestParm.Msg.ToString());
RB_Student_ViewModel demodel = JsonHelper.DeserializeObject<RB_Student_ViewModel>(base.RequestParm.Msg.ToString());
demodel.Group_Id = userInfo.Group_Id;
if (demodel.IsQueryMyStu == 1)
{
demodel.CreateBy = userInfo.Id;
}
var list = studentStatModule.GetStudentConsultPageList(pmodel.PageIndex, pmodel.PageSize, out long count, demodel);
pmodel.Count = count;
pmodel.PageData = list;
return ApiResult.Success("", pmodel);
}
#endregion
}
}
...@@ -1249,6 +1249,12 @@ namespace Edu.WebApi.Controllers.User ...@@ -1249,6 +1249,12 @@ namespace Edu.WebApi.Controllers.User
extModel.StuNeedsName, extModel.StuNeedsName,
extModel.StuRealMobile, extModel.StuRealMobile,
extModel.CustomerName, extModel.CustomerName,
extModel.PlanPrice,
extModel.BaseCondition,
extModel.DemandPoint,
extModel.ResistPoint,
extModel.ConsultingResults,
ConsultDate = extModel.ConsultDate.HasValue ? extModel.ConsultDate.Value.ToString("yyyy-MM-dd") : "",
}; };
return ApiResult.Success(data: obj); return ApiResult.Success(data: obj);
} }
...@@ -1341,6 +1347,28 @@ namespace Edu.WebApi.Controllers.User ...@@ -1341,6 +1347,28 @@ namespace Edu.WebApi.Controllers.User
return flag ? ApiResult.Success() : ApiResult.Failed(); return flag ? ApiResult.Success() : ApiResult.Failed();
} }
/// <summary>
/// 保存学生咨询结果
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetStudentConsultResults() {
var userInfo = base.UserInfo;
RB_Student_ViewModel demodel = JsonHelper.DeserializeObject<RB_Student_ViewModel>(base.RequestParm.Msg.ToString());
if (demodel.StuId <= 0) {
return ApiResult.ParamIsNull("请传递学员ID");
}
string msg = studentModule.SetStudentConsultResults(demodel, userInfo);
if (msg == "")
{
return ApiResult.Success();
}
else {
return ApiResult.Failed(msg);
}
}
#endregion #endregion
#region 管理者管理 #region 管理者管理
......
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