You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
3.9 KiB
C#

1 year ago
using Server.Factory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Utils;
using VM;
namespace Web
{
public class AutoCommit
{
public static AutoCommit Instance = new AutoCommit();
private TimerEvent autoCommitEvent;
private AutoCommit()
{
autoCommitEvent = new TimerEvent("未完成试卷自动提交", new TimeSpan(0, 1, 0), Commmit, null);
}
public void Init()
{
autoCommitEvent.Start();
}
private void Commmit()
{
var now = DateTime.Now;
var tarPapers = (from x in ExamCaches.PaperCache.Values
where now >= x.EndDate.AddMinutes(1) && x.Status == (int)ExamPaperStatus.Publish
select x).ToList();
if (tarPapers != null && tarPapers.Count > 0)
{
for (int i = 0; i < tarPapers.Count; i++)
{
var paperInfo = tarPapers[i];
var answerInfo = SvrFactory.Instance.ExamSvr.GetPaperForScore(tarPapers[i].Id);
//只处理未自己交卷的部分
var summaryInfo = answerInfo.UserSummary.Where(l => l.Status != (int)PaperUserSummaryStatus.Marked);
foreach (var tarSummary in summaryInfo)
{
//计算待评分值
var count = (from x in paperInfo.Details
join y in ExamCaches.QuestionCache on x.QuesionId equals y.Key
where y.Value.StructType == (int)StructType.Synopsis || y.Value.StructType == (int)StructType.Sketchy
join z in answerInfo.UserAnswerResult on x.QuesionId equals z.QuesionId
where z.Result != (int)PaperUserAnswerStatus.Init && z.UserId == tarSummary.UserId && z.UserScore == null
select x).Count();
if (count > 0)
{
tarSummary.UnScoredCount = count;
tarSummary.Score = 0;
tarSummary.Status = (int)PaperUserSummaryStatus.Submitted;
}
else
{
tarSummary.UnScoredCount = 0;
tarSummary.Score = (from x in answerInfo.UserAnswerResult
where x.UserId == tarSummary.UserId && x.UserScore.HasValue
select x.UserScore.Value).Sum();
tarSummary.Status = (int)PaperUserSummaryStatus.Marked;
}
if (!tarSummary.FinishDate.HasValue)
{
tarSummary.FinishDate = paperInfo.EndDate;
}
var res = SvrFactory.Instance.ExamSvr.UpdatePaperUserSummary(tarSummary);
if (!res)
{
throw new Exception("自动交卷算分更新用户得分失败1分钟后重试……");
}
}
if (answerInfo.UserSummary.Count(l => l.Status == (int)PaperUserSummaryStatus.Marked) == answerInfo.UserSummary.Count)
{
paperInfo.Status = (int)ExamPaperStatus.End;
if (SvrFactory.Instance.ExamSvr.UpdatePaper(paperInfo))
{
var cachePaperModel = ExamCaches.PaperCache[paperInfo.Id];
cachePaperModel.Status = (int)ExamPaperStatus.End;
}
}
}
}
}
}
}