mh_jy_safe/APT.MicroApi/APT.SC.WebApi/Controllers/Api/WBController/WBOutsourceController.cs
2025-08-25 09:56:57 +08:00

570 lines
26 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Entities.OP;
using APT.BaseData.Domain.IServices.FM;
using APT.Infrastructure.Api;
using APT.Infrastructure.Core;
using APT.Migrations;
using APT.MS.Domain.Entities.WB;
using APT.Utility;
using Microsoft.AspNetCore.Mvc;
using System.Security.Cryptography;
using System.Collections.Generic;
using APT.BaseData.Domain.Enums;
using System.Linq;
using APT.BaseData.Domain.Entities;
using APT.MS.Domain.Enums;
namespace APT.SC.WebApi.Controllers.Api.WB
{
[Route("api/WB/WBOutsource")]
public class WBOutsourceController : AuthorizeApiController<T_WB_OUTSOURCE>
{
IFMNotificationTaskService NotificationTaskService { get; set; }
public WBOutsourceController(IFMNotificationTaskService notificationTaskService)
{
NotificationTaskService = notificationTaskService;
}
/// <summary>
/// 保存
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost, Route("FullUpdate")]
public JsonActionResult<bool> FullUpdate([FromBody] T_WB_OUTSOURCE entity)
{
return SafeExecute(() =>
{
if (!APT.Infrastructure.Api.AppContext.CurrentSession.UserID.HasValue)
{
throw new Exception("获取登录人员信息失败!");
}
if (entity.Nav_Tests == null || !entity.Nav_Tests.Any() || entity.Nav_Tests.Count() < 1)
{
throw new Exception("请录入题库!");
}
entity.USER_ID = APT.Infrastructure.Api.AppContext.CurrentSession.UserID.Value;
entity.CREATE_TIME = DateTime.Now;
var videos = entity.Nav_Videos;
entity.Nav_Videos = null;
var files = entity.Nav_Files;
entity.Nav_Files = null;
var tests = entity.Nav_Tests;
entity.Nav_Tests = null;
if (videos != null && videos.Any() && files != null && files.Any())
{
var vc = videos.Select(e => !e.IS_DELETED);
var fc = files.Select(e => !e.IS_DELETED);
if (vc != null && vc.Count() > 0 && fc != null && fc.Count() > 0)
throw new Exception("视频和文件不能同时存在!");
}
if (videos != null && videos.Any())
{
foreach (var item in videos)
{
item.Nav_Video = null;
}
}
List<int> listResultD = new List<int>() { 1, 2, 4, 8, 17 };
int rowIndex = 0;
int allScore = 0;
List<string> listAnswer = null;
foreach (var item in tests)
{
if (item.IS_DELETED)
{
continue;
}
rowIndex++;
if (item.ROW_NO == 0)
{
item.ROW_NO = rowIndex;
}
item.TRAINNAME = entity.NAME;
allScore += item.SCORE;
//ANSWER_SHOW
if (string.IsNullOrEmpty(item.ANSWER_SHOW))
{
throw new Exception("请输入行【" + rowIndex + "】的答案");
}
switch (item.TYPE)
{
case MS.Domain.Enums.SETestTypeEnum.:
//if (1 != item.ANSWER && 2 != item.ANSWER)
//{
// throw new Exception("行【" + rowIndex + "】的答案输入有误!【是:1 否:2 】");
//}
if (item.ANSWER_SHOW.Trim() == "A")
{
item.ANSWER = 1;
}
else if (item.ANSWER_SHOW.Trim() == "B")
{
item.ANSWER = 2;
}
else
{
throw new Exception("行" + rowIndex + "的答案【" + item.ANSWER_SHOW + "】输入有误【A/B】");
//throw new Exception("行【" + rowIndex + "】的答案输入有误!【是:1 否:2 】");
}
break;
case MS.Domain.Enums.SETestTypeEnum.:
item.ANSWER = 0;
switch (item.ANSWER_SHOW)
{
case "A":
item.ANSWER = 1;
break;
case "B":
item.ANSWER = 2;
break;
case "C":
item.ANSWER = 4;
break;
case "D":
item.ANSWER = 8;
break;
default:
break;
}
if (item.ANSWER == 0)
{
throw new Exception("行" + rowIndex + "的答案【" + item.ANSWER_SHOW + "】输入有误【A/B/C/D】");
}
//if (!listResultD.Contains(item.ANSWER))
//{
// throw new Exception("行【" + rowIndex + "】的答案输入有误【A:1, B:2, C:4, D:8】");
//}
break;
case MS.Domain.Enums.SETestTypeEnum.:
//if (item.ANSWER > 33)
//{
// throw new Exception("行【" + rowIndex + "】的答案输入有误组合【A:1, B:2, C:4, D:8, E:16】相加");
//}
item.ANSWER = 0;
if (item.ANSWER_SHOW.Contains(","))
{
listAnswer = item.ANSWER_SHOW.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (var itemA in listAnswer)
{
switch (itemA)
{
case "A":
item.ANSWER += 1;
break;
case "B":
item.ANSWER += 2;
break;
case "C":
item.ANSWER += 4;
break;
case "D":
item.ANSWER += 8;
break;
case "E":
item.ANSWER += 16;
break;
default:
throw new Exception("行" + rowIndex + "的答案【" + item.ANSWER_SHOW + "】输入有误【A,B,C,D,E】答案用[,]分割");
break;
}
}
if (item.ANSWER == 1 || item.ANSWER == 2 || item.ANSWER == 4 || item.ANSWER == 8 || item.ANSWER == 16)
{
throw new Exception("行" + rowIndex + "的答案【" + item.ANSWER_SHOW + "】输入有误【A/B/C/D/E】答案用[,]分割,并且不能重复!");
}
}
else
{
throw new Exception("行" + rowIndex + "的答案【" + item.ANSWER_SHOW + "】输入有误【A/B/C/D/E】答案用[,]分割");
}
break;
default:
break;
}
}
UnifiedCommit(() =>
{
UpdateEntityNoCommit(entity);
if (files != null && files.Any())
BantchSaveEntityNoCommit(files);
if (videos != null && videos.Any())
BantchSaveEntityNoCommit(videos);
if (tests != null && tests.Any())
BantchSaveEntityNoCommit(tests);
});
return true;
});
}
/// <summary>
/// 获得单条实体数据
/// </summary>
/// <param name="filter">过滤实体</param>
/// <returns></returns>
[HttpPost, Route("GetSuit")]
public JsonActionResult<T_WB_OUTSOURCE> GetSuit([FromBody] KeywordFilter filter)
{
return SafeExecute(() =>
{
var result = GetEntity<T_WB_OUTSOURCE>(null, filter, null);
if (result != null && result.Nav_Tests != null && result.Nav_Tests.Any())
{
foreach (var item in result.Nav_Tests)
{
if (item.TYPE == SETestTypeEnum.)
{
if (item.ANSWER == 1)
{
item.ANSWER_SHOW = "A";
}
else
{
item.ANSWER_SHOW = "B";
}
}
else if (item.TYPE == SETestTypeEnum.)
{
switch (item.ANSWER)
{
case 1:
item.ANSWER_SHOW = "A";
break;
case 2:
item.ANSWER_SHOW = "B";
break;
case 4:
item.ANSWER_SHOW = "C";
break;
case 8:
item.ANSWER_SHOW = "D";
break;
default:
break;
}
}
else //多选
{
switch (item.ANSWER)
{
case 1:
item.ANSWER_SHOW = "A";
break;
case 2:
item.ANSWER_SHOW = "B";
break;
case 3:
item.ANSWER_SHOW = "A,B";
break;
case 4:
item.ANSWER_SHOW = "C";
break;
case 5:
item.ANSWER_SHOW = "A,C";
break;
case 6:
item.ANSWER_SHOW = "B,C";
break;
case 7:
item.ANSWER_SHOW = "A,B,C";
break;
case 8:
item.ANSWER_SHOW = "D";
break;
case 9:
item.ANSWER_SHOW = "A,D";
break;
case 10:
item.ANSWER_SHOW = "B,D";
break;
case 11:
item.ANSWER_SHOW = "A,B,D";
break;
case 12:
item.ANSWER_SHOW = "C,D";
break;
case 13:
item.ANSWER_SHOW = "A,C,D";
break;
case 14:
item.ANSWER_SHOW = "B,C,D";
break;
case 15:
item.ANSWER_SHOW = "A,B,C,D";
break;
case 16:
item.ANSWER_SHOW = "E";
break;
case 17:
item.ANSWER_SHOW = "A,E";
break;
case 18:
item.ANSWER_SHOW = "B,E";
break;
case 19:
item.ANSWER_SHOW = "A,B,E";
break;
case 20:
item.ANSWER_SHOW = "C,E";
break;
case 21:
item.ANSWER_SHOW = "A,C,E";
break;
case 22:
item.ANSWER_SHOW = "B,C,E";
break;
case 23:
item.ANSWER_SHOW = "A,B,C,E";
break;
case 24:
item.ANSWER_SHOW = "D,E";
break;
case 25:
item.ANSWER_SHOW = "A,D,E";
break;
case 26:
item.ANSWER_SHOW = "B,D,E";
break;
case 27:
item.ANSWER_SHOW = "A,B,D,E";
break;
case 28:
item.ANSWER_SHOW = "C,D,E";
break;
case 29:
item.ANSWER_SHOW = "A,C,D,E";
break;
case 30:
item.ANSWER_SHOW = "B,C,D,E";
break;
case 31:
item.ANSWER_SHOW = "A,B,C,D,E";
break;
default:
break;
}
}
}
}
return result;
});
}
///// <summary>
///// 查询
///// </summary>
///// <param name="filter"></param>
///// <returns></returns>
//[HttpPost, Route("GetSource")]
//public JsonActionResult<T_WB_OUTSOURCE> GetSource([FromBody] KeywordFilter filter)
//{
// return SafeExecute<T_WB_OUTSOURCE>(() =>
// {
// var RECORD_ID = Guid.Empty;
// try
// {
// if (!string.IsNullOrEmpty(filter.Keyword))
// {
// RECORD_ID = new Guid(filter.Keyword);
// }
// }
// catch (Exception)
// {
// RECORD_ID = Guid.Empty;
// }
// if (RECORD_ID == Guid.Empty)
// {
// throw new Exception("获取传参有误!");
// }
// var record = GetEntity<T_WB_OUTSOURCE_TRAIN_RECORD>(e => e.ID == RECORD_ID && e.Nav_Parent.NAME != null, "Nav_Parent");
// if (record.Nav_Parent == null)
// {
// throw new Exception("获取安全培训指派信息失败!");
// }
// var source = GetEntity<T_WB_OUTSOURCE>(e => e.NAME == record.Nav_Parent.NAME && e.ENABLE_STATUS == FMEnableStatusEnum.启用, "Nav_Files.Nav_ImgFile");
// return source;
// });
//}
/// <summary>
/// 查询
/// 提交 答题路由 WB/WBOutsourceTrainRecord/SavePapers
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
[HttpPost, Route("GetSource")]
public JsonActionResult<T_WB_OUTSOURCE_TRAIN_RECORD_USERS> GetSource([FromBody] KeywordFilter filter)
{
return SafeExecute<T_WB_OUTSOURCE_TRAIN_RECORD_USERS>(() =>
{
var ORDER_ID = Guid.Empty;
try
{
if (!string.IsNullOrEmpty(filter.Keyword))
{
ORDER_ID = new Guid(filter.Keyword);
}
}
catch (Exception)
{
ORDER_ID = Guid.Empty;
}
if (ORDER_ID == Guid.Empty)
{
throw new Exception("获取传参有误!");
}
var result = GetEntity<T_WB_OUTSOURCE_TRAIN_RECORD_USERS>(ORDER_ID, "Nav_ListUserPaper.Nav_Test");
if (result.Nav_ListUserPaper != null && result.Nav_ListUserPaper.Any())
{
result.Nav_ListUserPaper = result.Nav_ListUserPaper.OrderBy(e => e.ROW_NO).ToList();
var listSourceID = result.Nav_ListUserPaper.Select(e => e.SOURCE_ID).Distinct();
var listSource = GetEntities<T_WB_OUTSOURCE>(e => listSourceID.Contains(e.ID), null, "Nav_Files.Nav_ImgFile");
foreach (var item in result.Nav_ListUserPaper)
{
item.Nav_Source = listSource.First(e => e.ID == item.SOURCE_ID);
}
}
return result;
});
}
/// <summary>
/// 交卷
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpPost, Route("SavePapers")]
public JsonActionResult<bool> SavePapers([FromBody] T_WB_OUTSOURCE_TRAIN_RECORD_USERS entity)
{
return SafeExecute(() =>
{
if (entity.SCORE.HasValue && entity.SCORE > 0)
{
throw new Exception("试卷已完成");
}
if (entity.Nav_ListUserPaper == null || entity.Nav_ListUserPaper.Count() == 0)
{
int onlineCount = entity.Nav_ListUserPaper.Where(e => e.IS_ONLINE).Count();
if (onlineCount > 0)
{
//有些可能 线上直接看视频 不需要做题
entity.SCORE = 100;//默认100分
}
else
{
throw new Exception("试卷不能为空");
}
}
else
{
foreach (var item in entity.Nav_ListUserPaper)
{
if (item.IS_ONLINE)
{
item.IS_WATCH = true;
}
}
entity.SCORE = 0;
var listSourceID = entity.Nav_ListUserPaper.Select(e => e.SOURCE_ID).Distinct();
var AllSCORE = 0;
foreach (var item in listSourceID)
{
AllSCORE += entity.Nav_ListUserPaper.Where(e => e.SOURCE_ID == item).Sum(e => e.SCORE.Value);
}
entity.SCORE = AllSCORE / listSourceID.Count();
}
//var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId;
//var userID = APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
//var users = GetEntities<T_WB_OUTSOURCE_TRAIN_RECORD_USERS>(t => t.PARENT_ID == entity.ID, new BaseFilter(orgId));
//var currUsers = users.Where(t => t.USER_ID == userID);
//foreach (var user in currUsers)
//{
// user.DEAL_STATUS = FOUserShiftStatusEnum.已处理;
// user.MODIFY_TIME = DateTime.Now;
//}
//var currUser = GetEntity<T_WB_OUTSOURCE_TRAIN_RECORD_USERS>(entity.ID);
entity.SIGN_STATUS = FOUserShiftStatusEnum.;//FOUserShiftStatusEnum.已处理; 考试 待老师 确认 后 也是需要再次确认
entity.DEAL_STATUS = ExamStatusEnum.;
entity.MODIFY_TIME = DateTime.Now;
T_WB_OUTSOURCE_TRAIN_RECORD Record = null;
//#region 如果时间超过了培训结束时间
////判断是否有别的 考试 变成超期无需处理
//#endregion
var unSign = GetEntity<T_WB_OUTSOURCE_TRAIN_RECORD_USERS>(e => e.PARENT_ID == entity.PARENT_ID && e.ID != entity.ID && e.DEAL_STATUS == 0);
//var todoCount = users.Count(t => t.DEAL_STATUS == 0);
//if (todoCount == 0)
T_FM_NOTIFICATION_TASK task = null;
if (unSign == null || unSign.ID == Guid.Empty)
{
Record = GetEntity<T_WB_OUTSOURCE_TRAIN_RECORD>(entity.PARENT_ID, "Nav_Parent.Nav_Project", "Nav_Parent.Nav_User");//, "Nav_Parent.Nav_Project" wyw 这个没必要再加入查询啊
Record.END_TIME = DateTime.Now;
if (Record.TRAIN_TYPE.IndexOf("1") > -1)
{
Record.ONLINE_END_TIME = Record.END_TIME;
Record.ONLINE_TOTAL_TIME = (int)Math.Ceiling((Record.ONLINE_END_TIME.Value - Record.ONLINE_START_TIME.Value).TotalHours);
Record.TOTAL_TIME = Record.ONLINE_TOTAL_TIME;//也加上吧
}
Record.STATUS = SETrainNotifyStatus.;// 签到完成;
if (!Record.Nav_Parent.USER_ID.HasValue)
{
throw new Exception("未获取到培训讲师信息,请联系管理员!");
}
if (Record.ISEND == false)
{
Record.ISEND = true;
//触发讲师确认
task = NotificationTaskService.InsertUserNoticeTaskModel(Record.Nav_Parent.Nav_Project.UNIT_NAME + "安全培训记录结果确认", Record.ID, Record.ORG_ID, (Guid)Record.Nav_Parent.USER_ID, Record.Nav_Parent.Nav_User.NAME, DateTime.Now, DateTime.Now.AddDays(7), 1, "WB048");
}
}
T_FM_NOTIFICATION_TASK finishNotice = null;
if (entity.TaskID != Guid.Empty)
finishNotice = NotificationTaskService.GetTaskFinishModel(entity.TaskID);
//#region 考试通过才能提交 所以考完直接设置分数 考试通过 可以被选作为 作业监护人等
//T_WB_REGISTER_2 LoginReg2 = GetEntity<T_WB_REGISTER_2>(e => e.USERID.HasValue && e.USERID == APT.Infrastructure.Api.AppContext.CurrentSession.UserID);
//if (LoginReg2 != null)
//{
// LoginReg2.SCORE = (double)entity.SCORE;
//}
//#endregion
entity.SIGN_STATUS = FOUserShiftStatusEnum.;//在线考试 默认签到
UnifiedCommit(() =>
{
if (entity != null)
UpdateEntity(entity);
if (finishNotice != null)
UpdateEntityNoCommit(finishNotice);
if (Record != null)
UpdateEntity(Record);
//if (currUsers != null)
// BantchUpdateEntity(currUsers, "DEAL_STATUS", "MODIFY_TIME");
BantchSaveEntityNoCommit(entity.Nav_ListUserPaper);
if (task != null)
UpdateEntity(task);
//if (LoginReg2 != null)
// UpdateEntity(LoginReg2);
});
return true;
});
}
}
}