using Competition.Common.Util;
using CompetitionAPI.api.unity;
using CompetitionAPI.Util;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System.Collections.Generic;
namespace CompetitionAPI.Controllers.unity
{
[Route("unity/[controller]")]
[ApiController]
public class WriteUserOperationTicketController : Controller
{
Competition.Mysql.BLL.pow_user_exam user_exam_bll = new Competition.Mysql.BLL.pow_user_exam();
Competition.Mysql.BLL.pow_exam exam_bll = new Competition.Mysql.BLL.pow_exam();
Competition.Mysql.BLL.pow_user_operation_ticket bll_pow_user_operation_ticket = new Competition.Mysql.BLL.pow_user_operation_ticket();
Competition.Mysql.BLL.pow_exam_operation_ticket bll_pow_exam_operation_ticket = new Competition.Mysql.BLL.pow_exam_operation_ticket();
Competition.Mysql.BLL.pow_achievement bll_pow_achievement = new Competition.Mysql.BLL.pow_achievement();
Competition.Mysql.BLL.admin_user bll_admin_User = new Competition.Mysql.BLL.admin_user();
public WriteUserOperationTicketController()
{
}
///
/// 操作票写入接口
///
///
///
[Authorize]
[HttpPost]
[APIFilter]
public JsonResult Index([FromForm] WriteUserOperationTicketRequest req)
{
try
{
if (string.IsNullOrEmpty(req.data))
{
return Json(Tool.GetJsonWithCode(APICode.Fail, "data参数不能为空"));
}
if (string.IsNullOrEmpty(req.ExamId))
{
return Json(Tool.GetJsonWithCode(APICode.Fail, "ExamId参数不能为空"));
}
if (string.IsNullOrEmpty(req.Type))
{
return Json(Tool.GetJsonWithCode(APICode.Fail, "Type参数不能为空"));
}
if (string.IsNullOrEmpty(req.UserId))
{
return Json(Tool.GetJsonWithCode(APICode.Fail, "UserId参数不能为空"));
}
var user_exam_model = user_exam_bll.GetModelList(" ExamId='" + req.ExamId + "' and UserId='" + req.UserId + "' ").FirstOrDefault();
if (user_exam_model != null)
{
//if (user_exam_model.Status == "已结束")
//{
// return Json(Tool.GetJsonWithCode(APICode.Fail, "考生考试已结束"));
//}
}
else
{
return Json(Tool.GetJsonWithCode(APICode.Fail, "考生考试信息不存在"));
}
var achievement = bll_pow_achievement.GetModelList(" ExamId='" + req.ExamId + "' and UserId='" + req.UserId + "' ").FirstOrDefault();
if (null == achievement)
{
return Json(Tool.GetJsonWithCode(APICode.Fail, "考生成绩数据不存在"));
}
//用户操作ticket
var list_user_operation_ticket = JsonConvert.DeserializeObject>(req.data);
var qry = string.Format(" ExamId='{0}' and Type='{1}' and LENGTH(Content)>0 ", req.ExamId, req.Type);
var list_exam_operation_ticket = bll_pow_exam_operation_ticket.GetModelList(qry).OrderBy(s => s.SerialNumber).ToList();
int total_score = 5;
var list_TicketId_HasScore = new List();
var list = new List();
var score = Compute(ref total_score, out list, list_TicketId_HasScore, list_user_operation_ticket, list_exam_operation_ticket);
list_user_operation_ticket = list_user_operation_ticket.OrderBy(a => a.SerialNumber).ToList();
for (int i = 0; i < list.Count; i++)
{
var item = list[i];
var model = new Competition.Mysql.Model.pow_user_operation_ticket();
model.UserOperationTicketId = Guid.NewGuid().ToString("N");
model.UserId = req.UserId;
model.ExamId = req.ExamId;
model.OperationTicketId = item.OperationTicketId;
model.Type = req.Type;
model.SerialNumber = i + 1; // int.Parse(item.SerialNumber);
model.Content = item.Content;
if (item.ExamOperationTicketId == "2")
{
model.IsSelect = "0"; //是否选择 0:未选择,1:已选择
}
else
{
model.IsSelect = "1"; //是否选择 0:未选择,1:已选择
}
model.IsScore = list_TicketId_HasScore.Contains(item.Content) ? "0" : "1"; //是否扣分 0:否,1:是
model.CreateTime = DateTime.Now;
bll_pow_user_operation_ticket.Add(model);
}
var details_model = new Competition.Mysql.Model.pow_achievement_details();
details_model.DetailsId = Guid.NewGuid().ToString("N");
details_model.AchievementId = achievement.AchievementId;
details_model.ItemName = req.Type + "操作票选择";
details_model.ItemizedScore = total_score;
details_model.Type = req.Type + "操作票";
details_model.CreateTime = DateTime.Now;
details_model.TotalScore = 5;
bll_pow_achievement.OperationAddUpdateData(new List() { details_model }, achievement.AchievementId, total_score);
return Json(Tool.GetJsonWithCode(APICode.Success, "操作票总分:" + total_score));
}
catch (Exception ex)
{
LogHelper.WriteLog(ex.Message + ",行号:" + ex.StackTrace);
return Json(Tool.GetJsonWithCode(APICode.Fail, "发生错误,请联系管理员。"));
}
}
private int Compute(ref int total, out List list, List list_TicketId_HasScore, List list_user_operation_ticket, List list_exam_operation_ticket)
{
list = new List();
var distance = 0;
for (int i = 0; i < list_exam_operation_ticket.Count; i++)
{
var item_exam = list_exam_operation_ticket[i];
var item_user = list_user_operation_ticket.FirstOrDefault(s => s.Content == item_exam.Content);
if (item_user != null)
{
var user_Index = list_user_operation_ticket.IndexOf(item_user);
if (i != user_Index)
{
distance = distance + 1;
}
else
{
list_TicketId_HasScore.Add(item_exam.Content);
}
list.Add(new OperationTicketData() { ExamOperationTicketId = "1", OperationTicketId = item_exam.OperationTicketId, Type = item_exam.Type, Content = item_exam.Content });
}
}
//多选 用户操作票里有,答案操作票里没有
var CaseNumberList = list_exam_operation_ticket.Select(s => s.Content).ToArray();
var DifferentData = list_user_operation_ticket.Where(s => !CaseNumberList.Contains(s.Content)).ToList();
if (DifferentData.Count() > 0)
{
distance = distance + DifferentData.Count();
list.AddRange(DifferentData);
}
//少选 答案操作票里有,用户操作票里没有
var localCaseNumberList = list_user_operation_ticket.Select(s => s.Content).ToArray();
var FieldCaseData = list_exam_operation_ticket.Where(s => !localCaseNumberList.Contains(s.Content)).ToList();
if (FieldCaseData.Count() > 0)
{
distance = distance + FieldCaseData.Count();
var new_list = (from f in FieldCaseData
select new OperationTicketData() { ExamOperationTicketId = "2", OperationTicketId = f.OperationTicketId, Type = f.Type, Content = f.Content }).ToList();
list.AddRange(new_list);
}
total = total - distance;
if (total <= 0)
{
total = 0;
}
return total;
}
///
/// 计算操作票得分
///
/// 总分
/// 保存未扣分项
/// 用户操作票
/// 答案操作票
///
private int ComputeTicketScore(ref int total, List list_TicketId_HasScore, List list_user_operation_ticket, List list_exam_operation_ticket)
{
for (int i = 0; i < list_exam_operation_ticket.Count; i++)
{
var item_exam = list_exam_operation_ticket[i];
var item_user = list_user_operation_ticket.FirstOrDefault(s => s.OperationTicketId == item_exam.OperationTicketId);
//没找到答案 扣1分
if (null == item_user)
{
total--;
if (total <= 0)
{
return 0;
}
continue;
}
//找到答案 扣除距离分
var exam_index = i;
var user_Index = list_user_operation_ticket.IndexOf(item_user);
var distance = user_Index - exam_index;
//不扣分项
if (distance == 0)
{
list_TicketId_HasScore.Add(item_user.OperationTicketId);
}
total = total - distance;
if (total <= 0)
{
return 0;
}
//剩余用户答案
var remain_user_operation_ticket = new List();
for (var jindex = user_Index + 1; jindex < list_user_operation_ticket.Count; jindex++)
{
remain_user_operation_ticket.Add(list_user_operation_ticket[jindex]);
}
//剩余标准答案
var remain_exam_operation_ticket = new List();
for (var e_index = exam_index + 1; e_index < list_exam_operation_ticket.Count; e_index++)
{
remain_exam_operation_ticket.Add(list_exam_operation_ticket[e_index]);
}
//多余的用户操作票扣分
if (remain_exam_operation_ticket.Count <= 0)
{
total = total - remain_user_operation_ticket.Count;
if (total <= 0)
{
return 0;
}
}
return ComputeTicketScore(ref total, list_TicketId_HasScore, remain_user_operation_ticket, remain_exam_operation_ticket);
}
return total;
}
}
}