using ChivaXR;
using ChivaXR.Op;
using I2.Loc;
using QFramework;
using Sirenix.OdinInspector;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public enum ErrorReason
{
SelectWrongTool,
SelectWrongTarget,
AnswerWrong
}
public class ExamManagerForPC : MonoBehaviour
{
public static ExamManagerForPC instance;
///
/// 考试代理
///
public ExamProxy m_ExamProxy;
///
/// 记录考试时长
///
private int m_RecordExamDuration;
///
/// 开始时间
///
private DateTime m_StartTime;
///
/// 结束时间
///
private DateTime m_EndTime;
///
/// 允许错误次数
///
public int m_maxErrorCount;
private ProcessElement currentProcessElement;
#region 场景配置模块
[BoxGroup("场景配置模块", CenterLabel = true, Order = 0), GUIColor(0, 1, 0, 0.6f)]
[Button("1.获取流程信息")]
public void GetEaxmProcessElements()
{
List processElements = ProcessManagement.Instance.processes;
if (m_examProcessElements == null)
{
m_examProcessElements = new List();
}
////临时转存,用户数据恢复
List tmpExamProcessElements = m_examProcessElements;
//重建考试信息列表
m_examProcessElements = new List();
foreach (var item in processElements)
{
ExamProcessElement examProcessElement = tmpExamProcessElements.Find(t => t.elementDescript == item.processBase.GetPBDescribe());
if (examProcessElement != null)
{
m_examProcessElements.Add(examProcessElement);
}
else
{
StepListProxy tmpProxy = DAL.Instance.Get();
OperationStepDataInfo tmpInfo = tmpProxy.GetOpStepDataInfoById(item.stepID);
m_examProcessElements.Add(new ExamProcessElement()
{
id = item.stepID,
elementDescript = item.processBase.GetPBDescribe(),
stepName = tmpInfo.stepName
});
}
}
}
[BoxGroup("场景配置模块", CenterLabel = true, Order = 0), GUIColor(0, 1, 0, 0.6f)]
[Button("2.将所有的CurvedUI和箭头置为禁用(不影响编辑器跳步)")]
public void GetCurvedUIAndDiasable()
{
//将环形UI置为禁用状态
List processElements = ProcessManagement.Instance.processes;
//将箭头提示置为禁用状态
JianTouManager.Instance.SetJianTouActive(false);
}
[BoxGroup("场景配置模块", CenterLabel = true, Order = 0), GUIColor(0, 1, 0, 0.6f)]
[Button("3、初始化流程分数")]
public void SetEaxmProcessScore()
{
if (m_examProcessElements.Count <= 0)
{
return;
}
foreach (var item in m_examProcessElements)
{
if (m_examProcessElements.Count <= 100)
{
item.scores = 1;
}
else
{
//item.scores = 100 / examProcessElements.Count;
item.scores = 0.5f;
}
}
RefreshScore();
}
#endregion
[Space(5)]
#region 配分模块
[BoxGroup("配分模块", CenterLabel = true, Order = 1)]
///
/// 考试信息
///
[TableList(MaxScrollViewHeight = 20)]
public List m_examProcessElements;
[BoxGroup("配分模块", CenterLabel = true, Order = 1)]
[LabelText("配置总分"), GUIColor(0, 1, 1, 1)]
[Sirenix.OdinInspector.ReadOnly]
public float examSetTotalScore;
[BoxGroup("配分模块", CenterLabel = true, Order = 1)]
[Button("刷新总设定分数")]
public void RefreshScore()
{
examSetTotalScore = 0;
foreach (var item in m_examProcessElements)
{
examSetTotalScore += item.scores;
}
}
#endregion
[Space(5)]
#region 成绩模块
[BoxGroup("成绩模块", CenterLabel = true, Order = 3)]
[LabelText("最终得分"), GUIColor(1, 0.92f, 0.016f, 1)]
[Sirenix.OdinInspector.ReadOnly]
public float score;
[Space(5)]
[BoxGroup("考试时长", CenterLabel = true, Order = 4)]
[LabelText("考试时长(分钟)"), GUIColor(1, 0.1f, 0.016f, 1)]
public int examTime;
#endregion
///
/// 是否上传结果
///
private bool m_ResultUpload = false;
///
/// 服务器下发的分数
///
private float m_DistributeScores;
private void Awake()
{
instance = this;
GetEaxmProcessElements();
GetCurvedUIAndDiasable();
//如果没有读到考试数据自动非分/手动配分
AutoEaxmProcessScore();
Init();
}
public void Init()
{
ProcessManagement.Instance.processElementActiveEvent += ProcessElementActive;
ProcessManagement.Instance.processElementDisActiveEvent += ProcessElementDisActive;
ProcessManagement.Instance.processFinishEvent += ExamFinish;
m_ExamProxy = DAL.Instance.Get();
m_ExamProxy.StartExam();
m_StartTime = DateTime.Now;
}
///
/// 步骤进入
///
///
private void ProcessElementActive(ProcessElement element)
{
currentProcessElement = element;
}
///
/// 步骤退出
///
///
private void ProcessElementDisActive(ProcessElement element)
{
JianTouManager.instance.SetJianTouActive(false);
ExamProcessElement tmpElement = m_examProcessElements.Find(t => t.elementDescript == currentProcessElement.processBase.GetPBDescribe());
if (tmpElement.finish == false)
{
tmpElement.finish = true;
tmpElement.result = tmpElement.faultCount > 0 ? false : true;
tmpElement.operationTime = DateTime.Now;
}
SetelementScore();
}
///
/// 自动配分
///
public void AutoEaxmProcessScore()
{
if (m_examProcessElements.Count <= 0)
{
return;
}
int score = 200 / m_examProcessElements.Count;
int count = 200 % m_examProcessElements.Count;
for (int i = 0; i < m_examProcessElements.Count; i++)
{
if (count > i) m_examProcessElements[i].scores = ((float)score + 1) / 2;
else m_examProcessElements[i].scores = (float)score / 2;
}
RefreshScore();
}
public float GetDistributeScores(StepInfoManager stepInfoManager)
{
float tmpScore = 0;
for (int i = 0; i < m_examProcessElements.Count; i++)
{
m_examProcessElements[i].scores = stepInfoManager.S[i];
}
foreach (var item in stepInfoManager.S)
{
tmpScore += item;
}
RefreshScore();
return tmpScore;
}
///
/// 根据接收到的数据进行分数填充
///
public void ExamProcessScoreByReceiveData(StepInfoManager stepInfoManager)
{
for (int i = 0; i < m_examProcessElements.Count; i++)
{
m_examProcessElements[i].scores = float.Parse(stepInfoManager.S[i].ToString());
}
}
///
/// 记录操作错误
///
public void RecordFault(int processId, ErrorReason errorReason)
{
ExamProcessElement tmpElement = m_examProcessElements.Find(t => t.id == processId);
if (tmpElement != null)
{
tmpElement.errorReason = errorReason.ToString();
tmpElement.faultCount++;
m_maxErrorCount--;
UIKit.GetPanel().ExamInfo.ErrorCount.text = "x" + m_maxErrorCount.ToString();
if (m_maxErrorCount <= 0)
{
ExamFinish();
}
string screenShotName = DateTime.UtcNow.Ticks.ToString();
Debug.Log(screenShotName);
StartCoroutine(ScrrenCapture(new Rect(0, 0, Screen.width, Screen.height), 0, screenShotName, tmpElement));
}
LocalizedString stepName = processId + "stepName";
string wrongErrson = "操作错误";
switch (errorReason)
{
case ErrorReason.SelectWrongTool:
if (LocalizationManager.CurrentLanguage == "Chinese")
{
wrongErrson = "工器具错误";
}
else
{
wrongErrson = "ToolError";
}
break;
case ErrorReason.SelectWrongTarget:
if (LocalizationManager.CurrentLanguage == "Chinese")
{
wrongErrson = "操作点错误";
}
else
{
wrongErrson = "OperationError";
}
break;
}
UIKit.GetPanel().ExamInfo.ShowWrongInfo("" + stepName + " : " + wrongErrson);
}
///
/// 分数结算
///
private float SetelementScore()
{
score = 0;
foreach (var item in m_examProcessElements)
{
if (item.finish == true && item.result == true)
{
score += item.scores;
}
}
//StopAllCoroutines();
return score;
}
///
/// 上传考核结果
///
public void UploadExamResult()
{
ExamProxy examProxy = DAL.Instance.Get();
examProxy.UpLoadExamResult(SetelementScore());
m_ResultUpload = true;
}
///
/// 成绩展示
///
public void ExamFinish()
{
m_EndTime = DateTime.Now;
CountExamDuration();
if (UIKit.GetPanel())
{
UIKit.GetPanel().ExamEnd(m_examProcessElements, SetelementScore(), m_RecordExamDuration);
}
ProcessManagement.Instance.StopCurrentProcess();
if (!m_ResultUpload)
{
UploadExamResult();
}
if (UIKit.GetPanel())
{
UIKit.GetPanel().Clear();
}
}
///
/// 统计考试时长
///
private void CountExamDuration()
{
// 记录结束时的时间
DateTime finishTime = DateTime.Now;
m_RecordExamDuration = (int)(finishTime - m_ExamProxy.startTime).TotalSeconds;
}
private void OnDisable()
{
ProcessManagement.Instance.processElementActiveEvent -= ProcessElementActive;
ProcessManagement.Instance.processElementActiveEvent -= ProcessElementDisActive;
ProcessManagement.Instance.processFinishEvent -= ExamFinish;
}
Texture2D screenShot;//保存截取的纹理
IEnumerator ScrrenCapture(Rect rect, int a, string screenShotName, ExamProcessElement examProcessElement)
{
Debug.Log("截图:" + screenShotName);
screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
yield return new WaitForSeconds(0.5f);
yield return new WaitForEndOfFrame();
screenShot.ReadPixels(rect, 0, 0);
screenShot.Apply();
//推送
//PushHelper.InitBasicData();
//StartCoroutine(PushHelper.SendFileStreamPushRequest(screenShot, screenShotName, (result, msg, flag, cmnAttachId) =>
//{
// if (!result)
// {
// Debug.LogError(msg);
// }
// else
// {
// Debug.Log("考试模块图片上传成功" + cmnAttachId.data.cmnAttachId);
// examProcessElement.screenshotList.Add(cmnAttachId.data.cmnAttachId);
// }
// examProcessElement.m_UpLoading.Remove(screenShotName);
//}));
examProcessElement.m_UpLoading.Add(screenShotName);
}
///
/// 获取该ID的分数
///
///
///
public float GetScoreById(int id)
{
float tmpScore = 0;
//PullProxy tmpPullProxy = DAL.Instance.Get();
//StepInfoManager tmpStepInfoManager = tmpPullProxy.GetExamStepInfoManager();
//if (tmpStepInfoManager == null)
//{
// tmpScore = m_examProcessElements[id - 1].scores;
//}
//else
//{
// tmpScore = tmpStepInfoManager.S[id - 1];
//}
return tmpScore;
}
///
/// 获取总分比值
///
public float GetTotalScore()
{
float tmpTotalScore = 0;
foreach (var item in m_examProcessElements)
{
if (item.finish && item.result)
{
tmpTotalScore += item.scores;
}
}
if (m_DistributeScores == 0)
{
return tmpTotalScore / examSetTotalScore;
}
else
{
float ratio = (float)tmpTotalScore / (float)examSetTotalScore;
return ratio;
}
}
///
/// 是否上传完成
///
///
public bool IsFinishUpLoad()
{
foreach (var item in m_examProcessElements)
{
if (item.m_UpLoading.Count > 0)
{
return false;
}
}
return true;
}
}