using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Server.Factory;
using System.Threading;
using System.Threading.Tasks;
using Utils;
using VM;
namespace Web
{
public class MvcApplication : System.Web.HttpApplication
{
#pragma warning disable CS0414 // 字段“MvcApplication.isGetP2P”已被赋值,但从未使用过它的值
bool isGetP2P = false;
#pragma warning restore CS0414 // 字段“MvcApplication.isGetP2P”已被赋值,但从未使用过它的值
bool isCalcScore = false;
AssessmentCalculationBLL assessmentCalculationBLL = new AssessmentCalculationBLL();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalFilters.Filters.Add(new IdentifyPermission());
GlobalFilters.Filters.Add(new ExceptionAttribute());
Initialize();
//定时更新考核状态
double time_1 = AppSettingsHelper.GetIntByKey("Time1", 3) * 60 * 1000;//3分钟
double time_2 = AppSettingsHelper.GetIntByKey("Time2", 60) * 60 * 1000;//60分钟
double time_3 = AppSettingsHelper.GetIntByKey("Time3", 180) * 60 * 1000;//180分钟
double time_5 = AppSettingsHelper.GetIntByKey("Time5", 30) * 60 * 1000;//一小时一次,但星期天的晚上才执行
#region 3分钟执行一次
//System.Timers.Timer timer_1 = new System.Timers.Timer();
//timer_1.Enabled = true;
//timer_1.Interval = time_1;//3分钟执行一次
//timer_1.Start();
//timer_1.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed);
#endregion
////////#region 60分钟执行一次 原本就被注释掉
////////System.Timers.Timer timer_2 = new System.Timers.Timer();
////////timer_2.Enabled = true;
////////timer_2.Interval = time_2; //1小时执行一次
////////timer_2.Start();
////////timer_2.Elapsed += new System.Timers.ElapsedEventHandler(Timer2_Elapsed);
////////#endregion
#region 180分钟执行一次
//System.Timers.Timer timer_3 = new System.Timers.Timer();
//timer_3.Enabled = true;
//timer_3.Interval = time_3; //3小时执行一次
//timer_3.Start();
//timer_3.Elapsed += new System.Timers.ElapsedEventHandler(Timer3_Elapsed);
#endregion
#region 1天一次
//System.Timers.Timer timer_5 = new System.Timers.Timer();
//timer_5.Enabled = true;
//timer_5.Interval = time_5;
//timer_5.Start();
//timer_5.Elapsed += new System.Timers.ElapsedEventHandler(Timer5_Elapsed);
#endregion
//////////////第一次启动时,异步获取P2P数据 原本就被注释掉
////////////if (!isGetP2P)
////////////{
//////////// Task.Run(() =>
//////////// {
//////////// P2PHelper p2p = new P2PHelper();
//////////// p2p.AddBlukP2PProduce();
//////////// });
//////////// isGetP2P = true;
////////////}
}
#region 定时器事件
///
/// Time1定时器方法(默认5分钟执行)
///
///
///
private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!isCalcScore)
{
AutoCommitTrainExam();
}
}
/////
///// Time2定时器方法(默认60分钟执行)
/////
/////
/////
//private void Timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
//{
// // 得到 hour minute second 如果等于某个值就开始执行某个程序。
// int intHour = e.SignalTime.Hour;
// int intMinute = e.SignalTime.Minute;
// int intSecond = e.SignalTime.Second;
// // 定制时间; 比如 在01:30 :00 的时候执行某个函数
// int iHour = 1;
// //晚上1点更新,只判断销售
// if (intHour == iHour)
// {
// P2PHelper p2p = new P2PHelper();
// p2p.AddBlukP2PProduce();
// isGetP2P = true;
// }
//}
///
/// Time3定时器方法(默认180分钟执行)
///
///
///
private void Timer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
#region 定时清理Question假删
//获取假删数据
List delete_question_list = ExamCaches.QuestionCache.Values.Where(x => x.Status == (int)QuestionStauts.Delete).Select(x => x.Id).ToList();
if (delete_question_list != null && delete_question_list.Count > 0)
{
//在数据库内进行查找,删除未组卷的,并把对应Id集合返回
List remove_question_list = SvrFactory.Instance.ExamSvr.RemoveQuestion(delete_question_list);
//清除未组卷的缓存
if (remove_question_list != null && remove_question_list.Count > 0)
{
foreach (var item in remove_question_list)
{
ExamCaches.QuestionCache.SyncCache(item, null, true);
}
}
}
#endregion
}
///
/// 备份数据库
///
private void Timer5_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
TrainingCaches.P2PProductList1.Clear();
TrainingCaches.P2PProductList1 = new SynchronisedDictionary(x => x.Id, SvrFactory.Instance.TrainingSvr.GetP2PProductbyCache());
//星期几,0表示星期天
int week = (int)e.SignalTime.DayOfWeek;
int ihour = e.SignalTime.Hour;
int iminu = e.SignalTime.Minute;
//星期天凌晨2点
if (week == 0 && (ihour == 2 && (iminu >= 0 && iminu <= 30)))
{
//DataInit.DelFolderBakFile();
//备份数据库
DataInit.CreateDataBak();
}
}
#endregion
#region 私有方法
///
/// 销售机会/实训考核自动提交
///
private void AutoCommitTrainExam()
{
if (TrainingCaches.ExamIDList != null && TrainingCaches.ExamIDList.Count > 0)
{
//建立副本
List tempList = new List();
tempList.AddRange(TrainingCaches.ExamIDList);
foreach (int item in tempList)
{
var train = TrainingBLL.GetTrainExam(item);
//若实训已结束
if (train != null && train.EndDate.AddMinutes(1) <= DateTime.Now)
{
isCalcScore = true;
if (train.ExamTypeId == (int)ExamineType.TrainingEvaluation)
{
#region 实训考核
//参与考试,但未提交试卷的
var accessList = TrainingCaches.EntryAssessmentList.Where(x => x.TrainExamId == train.Id).ToList();
if (accessList != null && accessList.Count > 0)
{
#region 算分并提交试卷
//考核模块列表
List ExamModuleList = TrainingCaches.ExamModuleList.GetList();
//考核点列表
List ExamPointList = TrainingCaches.ExamPointList.GetList();
//循环每个未手动交卷学生
foreach (var access in accessList)
{
//建议书
var proposal = ProposalBLL.GetProposal(train.Id, access.UserId);
if (proposal == null)
{
#region 只进入考试,然后什么都没干
proposal = new ProposalVM();
proposal.TrainExamId = train.Id;
proposal.UserId = access.UserId;
proposal.ProposalName = "";
proposal.ProposalNum = NumHelper.Instance.GetNum(NumberType.Proposal);
proposal.CreateDate = DateTime.Now;
//保存建议书
proposal.Id = SvrFactory.Instance.TrainingSvr.AddProposal(proposal);
//添加成功
if (proposal.Id > 0)
{
TrainingCaches.ProposalCache.SyncCache(proposal.Id, proposal, false);
}
#endregion
}
#region 算分
//循环考核点算分
AssessmentResultsVM model = new AssessmentResultsVM();
foreach (var train_item in train.TrainExamDetail)
{
var detailInfo = assessmentCalculationBLL.AssessmentCalculation(train_item, proposal, ExamModuleList, ExamPointList);
if (detailInfo != null)
{
AssessmentResultsDetailVM assessmentResultsDetail = new AssessmentResultsDetailVM();
assessmentResultsDetail.AssessmentResultsId = detailInfo.AssessmentResultsId;
assessmentResultsDetail.ExamPointType = detailInfo.ExamPointType;
assessmentResultsDetail.ModularId = detailInfo.ModularId;
assessmentResultsDetail.AssessmentPoint = detailInfo.AssessmentPoint;
assessmentResultsDetail.Status = detailInfo.Status;
assessmentResultsDetail.Score = detailInfo.Score;
assessmentResultsDetail.ReferAnswer = detailInfo.ReferAnswer;
assessmentResultsDetail.StuAnswer = detailInfo.StuAnswer;
model.DetailList.Add(assessmentResultsDetail);
}
}
model.UserId = access.UserId;
model.ClassId = access.ClassId;
model.TrainExamId = train.Id;
model.TotalScore = train.TrainExamDetail.Sum(x => x.Score);//考核总分
model.SubjectiveResults = 0;
model.CreateTime = DateTime.Now;
if (model.DetailList != null && model.DetailList.Count > 0)
{
//客观成绩
model.ObjectiveResults = model.DetailList.Where(x => x.Status == (int)IsCorrect.Correct).Sum(x => x.Score);
}
var train_exampoint_list = train.TrainExamDetail.Select(x => x.ExamPointId).ToList();
int SubjectiveNum = ExamPointList.Count(x => train_exampoint_list.Contains(x.Id) && x.ExamPointType == (int)ExamPointType.Subjective);
//当存在主观题时,将考核状态更新为待评分,否则为已评分
proposal.UpdateDate = DateTime.Now;
if (SubjectiveNum > 0)
{
model.TrainExamStatus = (int)ExaminationStatus.WaitScore;
proposal.Status = (int)ProposalStatus.UnAudited;
}
else
{
model.TrainExamStatus = (int)ExaminationStatus.AlreadyScore;
proposal.Status = (int)ProposalStatus.Audited;
}
#endregion
#region 保存
//保存成绩
if (SvrFactory.Instance.TrainingSvr.AddAssessmentResults(model))
{
//更新建议书
SvrFactory.Instance.TrainingSvr.UpdateProposal(proposal);
//更新考核结束时间
access.EndTime = train.EndDate;
if (SvrFactory.Instance.TrainingSvr.UpdateEntryAssessment(access))
{
//成功则移除缓存
TrainingCaches.EntryAssessmentList.RemoveAll(x => x.TrainExamId == train.Id && x.UserId == access.UserId);
}
}
#endregion
}
#endregion
}
#endregion
}
#region 校验是否存在未评分列表,不存在则可以更新考核状态
List count = SvrFactory.Instance.TrainingSvr.CountTrainExamStatus(item);
//重现获取最新的销售机会/实训考核
train = SvrFactory.Instance.TrainingSvr.GetTrainExam(item);
bool isChange = false;
if (count[0] <= 0 && count[1] > 0)
{
//未评数量小于等于0,已评数量大于0
train.TrainExamStatus = (int)TrainExamStatu.AlreadGrade;
isChange = true;
}
else if (count[0] <= 0 && count[1] <= 0)
{
//未评数量小于等于0,已评数量小于等于0
//没有人提交销售机会/实训考核,不显示
train.TrainExamStatus = (int)TrainExamStatu.NoShow;
isChange = true;
}
else
{
//未评数量大于0
//不用处理
}
if (isChange)
{
if (SvrFactory.Instance.TrainingSvr.UpdateTrainExam(train))
{
TrainingCaches.ExamIDList.RemoveAll(x => x == train.Id);
#region 销售机会根据分数,潜在客户转已有客户
if (train.ExamTypeId == (int)ExamineType.SalesOpportunities)
{
SvrFactory.Instance.TrainingSvr.UpdateCustomerTypeList(train.Id);
}
#endregion
}
}
#endregion
}
}
isCalcScore = false;
}
}
#endregion
private void Initialize()
{
//启动WCF服务
while (!SvrFactory.Instance.Initialize())
{
Thread.Sleep(50);//这里必须等WCF连接上
}
//初始化缓存
StructureCaches.Init();
ResourceCaches.Init();
ExamCaches.Init();
TrainingCaches.Init();
//初始化缓存定时清理
CacheCleaner.Instance.Init();
//初始化自动提交定时器
AutoCommit.Instance.Init();
//DataInit.DelFolderBakFile();
DataInit.CreateDataBak();
}
}
}