/*-------------------------------------------------------------------------------------------
* 个人排行榜
* 创建:杨斌 2011-12-01
* 修改:杨斌 2012-01-21
* ----------------------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GeneralLib;
using Microsoft.Office.Interop.PowerPoint;
using DataTable = System.Data.DataTable;
namespace SunVoteARSPPT
{
public partial class FrmRankGroup : Form
{
///
/// 是否正在加载窗体
///
private bool IsLoading = false;
public FrmRankGroup()
{
InitializeComponent();
}
///
/// 初始化图表排行榜数据
/// 杨斌 2014-08-06
///
///
///
///
public FrmRankGroup(int mode, string showCol, int count, Slide sld)
{
InitializeComponent();
IsInitChart = true;
RankMode = mode;
RankShowCol = showCol;
RankCount = count;
NowSlide = sld;
}
///
/// 初始化图表排行榜数据
/// 杨斌 2015-06-10
///
///
///
///
///
///
public FrmRankGroup(int mode, string showCol, int count, bool isGroupMVP, Slide sld)
{
InitializeComponent();
IsInitChart = true;
RankMode = mode;
RankShowCol = showCol;
RankCount = count;
NowSlide = sld;
IsGroupMVP = isGroupMVP;
}
private bool IsInitChart = false;
private int RankMode = 0;
private string RankShowCol = "";
private int RankCount = 0;
private Slide NowSlide = null;
private bool IsGroupMVP = false;
//退出
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
///
/// 导出报表
///
///
///
private void btnExport_Click(object sender, EventArgs e)
{
ExportRank();
}
///
/// 全屏显示
///
///
///
private void btnShowFull_Click(object sender, EventArgs e)
{
FrmRank frmRank = new FrmRank(this.dgvRank);
//杨斌 2015-12-02
Form FDialogParent = Globals.SunVoteARSAddIn.frmVoteBar.FDialog;
Globals.SunVoteARSAddIn.frmVoteBar.FDialog = frmRank;
frmRank.WindowState = FormWindowState.Maximized;
frmRank.ShowDialog();
Globals.SunVoteARSAddIn.frmVoteBar.FDialog = FDialogParent;//杨斌 2015-12-02
}
///
/// 人员名单类
///
private RosterList Roster = new RosterList();
///
/// 窗体加载
///
///
///
private void FrmRankGroup_Load(object sender, EventArgs e)
{
IsLoading = true;
if (IsInitChart)
{
this.Hide();
this.ShowInTaskbar = false;
}
ResponseDB.UpdateSlideIndexToDB();
GlobalInfo.SysLanguage.SetLanguage(this.Name, this);
chkSelectAllSlide.Text = "";
lvwSlide.Columns[0].Text = "";//杨斌 2012-03-26
Roster.LoadRoster();
ControlOper.SetPosCheckBoxToListViewHead(lvwSlide, chkSelectAllSlide);//杨斌 2012-11-16
LoadSlide();
LoadGroupType();
LoadGroupItem();
LoadSortField();
//杨斌 2014-08-06
InitRankChart();
//ShowRankGroup();//杨斌 2014-08-06
chkBySpeed.Checked = false;//杨斌 2014-07-25
//IsLoading = false;//杨斌 2014-08-06
//杨斌 2014-07-25
List lstRadio = new List();
lstRadio.Add(GlobalInfo.IniCtlSystem.ReadString(this.Name, "OrderField", ""));
if (GlobalInfo.IniCtlSystem.ReadInt(this.Name, chkBySpeed.Name, 0) == 1)
lstRadio.Add(chkBySpeed.Name);
ControlOper.SetControlCheck(this, lstRadio);
//杨斌 2015-03-13
if (IsInitChart)
{
rbtByScore.Checked = true;
}
ShowRankGroup();
IsLoading = false;
}
public List GetRankGroupMVData()
{
List res = new List();
int colScore = dgvRank.Columns.Count - 1;
if (dgvRank.Columns.Contains("Score"))
colScore = dgvRank.Columns["Score"].Index;
for (int i = 0; i < dgvRank.Rows.Count; i++)
{
if (res.Count >= RankCount) break;
RankGroupMVPData item = new RankGroupMVPData();
item.rank = ConvertOper.Convert(dgvRank.Rows[i].Cells[0].Value.ToString()).ToInt;
item.group = dgvRank.Rows[i].Cells[1].Value.ToString();
if (cboGroupType.SelectedIndex >= 0)//杨斌 2015-08-10
{
if (dgvRank.Rows[i].Cells[2].Value != null)//杨斌 2015-08-10
item.name = dgvRank.Rows[i].Cells[2].Value.ToString();
else
item.name = "";
}
else
item.name = (i + 1).ToString();
item.score = ConvertOper.Convert(dgvRank.Rows[i].Cells[colScore].Value.ToString()).ToDouble;
res.Add(item);
}
return res;
}
///
/// 获取图表名次数据
/// 杨斌 2014-08-07
/// 杨斌 2015-03-06
///
///
public List GetRankChartData()
{
List res = new List();
int colScore = dgvRank.Columns.Count - 1;
if (dgvRank.Columns.Contains("Score"))
colScore = dgvRank.Columns["Score"].Index;
for (int i = 0; i < dgvRank.Rows.Count; i++)
{
if (res.Count >= RankCount) break;
RankChartData item = new RankChartData();
item.rank = ConvertOper.Convert(dgvRank.Rows[i].Cells[0].Value.ToString()).ToInt;
//杨斌 2014-12-01
if (cboGroupType.SelectedIndex >= 0)
item.name = dgvRank.Rows[i].Cells[1].Value.ToString();
else
item.name = (i + 1).ToString();
item.score = ConvertOper.Convert(dgvRank.Rows[i].Cells[colScore].Value.ToString()).ToDouble;
res.Add(item);
}
return res;
}
///
/// 初始化排行图表数据
/// 杨斌 2014-08-06
///
private void InitRankChart()
{
if (!IsInitChart) return;
Presentation pres = NowSlide.Parent as Presentation;
List lstSlideID = new List();
for (int i = 1; i <= NowSlide.SlideIndex; i++)
{
lstSlideID.Add("'" + pres.Slides[i].SlideID + "'");
}
int count = 0;
if (RankMode == 1)
{
for (int i = lvwSlide.Items.Count - 1; i >= 0; i--)
{
//if (count >= RankCount) break;
string id = lvwSlide.Items[i].Tag.ToString();
if ((lstSlideID.Contains(id)) && (count < 1))
{
lvwSlide.Items[i].Checked = true;
count++;
}
else
lvwSlide.Items[i].Checked = false;
}
}
else if (RankMode == 2)
{
TagSet tagSet = new TagSet(NowSlide.Tags);
string s = tagSet.LoadValue(TagKey.RankChartSetSlide, "").Value;
List lst = new List();
if (s.Length > 0)
{
string[] ary = s.Split(new char[] { ',' });
lst = ary.ToList();
}
for (int i = 0; i < lvwSlide.Items.Count; i++)
{
//if (count >= RankCount) break;
string id = lvwSlide.Items[i].Tag.ToString();
id = id.Replace("'", "");
lvwSlide.Items[i].Checked = (lst.Contains(id));
}
}
else
{
for (int i = 0; i < lvwSlide.Items.Count; i++)
{
//if (count >= RankCount) break;
string id = lvwSlide.Items[i].Tag.ToString();
if (lstSlideID.Contains(id))
{
lvwSlide.Items[i].Checked = true;
count++;
}
else
lvwSlide.Items[i].Checked = false;
}
}
cboGroupType.SelectedIndex = -1;//杨斌 2014-11-06
for (int i = 0; i < cboGroupType.Items.Count; i++)
{
if (cboGroupType.Items[i].ToString() == RankShowCol)
{
cboGroupType.SelectedIndex = i;
break;
}
}
chkBySpeed.Checked = false;
rbtByScore.Checked = true;
}
///
/// 查询的反馈题目类型
///
private const string cResponseType = "'Choice','Judge','Order','Number','Text'";//杨斌 2012-03-16
///
/// 加载反馈幻灯片信息
///
private void LoadSlide()
{
try
{
lvwSlide.Items.Clear();
//加载数据
string sql = "Select * From ST_Topic WHERE (((ST_Topic.TT_ID) IN(" + cResponseType + "))) Order By T_Index Asc";
GlobalInfo.DBOperation.OpenDataSet(sql);
DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
ListViewItem item = lvwSlide.Items.Add(row["T_Index"].ToString());
item.SubItems.Add(row["T_Title"].ToString());
item.Tag = "'" + row["T_ID"].ToString() + "'";//存放题目ID
}
GlobalInfo.DBOperation.CloseDataSet();
//全选
chkSelectAllSlide.Checked = (lvwSlide.Items.Count > 0);
ControlOper.SelectAllListViewItem(lvwSlide, chkSelectAllSlide.Checked);
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
}
private class GroupInfo
{
///
/// 分组类型,0=名单,1=反馈
///
public int type = 0;
///
/// 搜索的关键字,名单=RC_ID,反馈=T_ID
///
public string searchId = "";
}
///
/// 分组信息列表
///
private List ListGroupInfo = new List();
///
/// 加载名单字段
///
private void LoadGroupType()
{
try
{
cboGroupType.Items.Clear();
//加载名单字段
if (GlobalInfo.response.EnableList)
{
//cboGroupType.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "cboGroupType", "键盘型号"));
for (int i = 1; i < Roster.Columns.Count; i++)
{
cboGroupType.Items.Add(Roster.Columns[i].ColumnName);
GroupInfo info = new GroupInfo();
info.type = 0;
info.searchId = Roster.Columns[i].ColumnID.ToString();
ListGroupInfo.Add(info);
}
}
//加载分组反馈
string sql = "Select * From ST_Topic WHERE (((ST_Topic.TT_ID) IN('Group')) And (len(T_ID)<12)) Order By T_Index Asc";
GlobalInfo.DBOperation.OpenDataSet(sql);
DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
cboGroupType.Items.Add(row["T_Name"].ToString());
GroupInfo info = new GroupInfo();
info.type = 1;
info.searchId = row["T_ID"].ToString();
ListGroupInfo.Add(info);
}
GlobalInfo.DBOperation.CloseDataSet();
//选中默认字段-键盘编号
if (cboGroupType.Items.Count > 0)
cboGroupType.SelectedIndex = 0;
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
}
///
/// 加载分组选项
///
private void LoadGroupItem()
{
try
{
clbGroupItem.Items.Clear();
if (cboGroupType.SelectedIndex < 0) return;
string sql = "";
DataTable tb = null;
GroupInfo info = ListGroupInfo[cboGroupType.SelectedIndex];
if (info.type == 0)
{
sql = "SELECT Distinct ST_RosterValue.RV_Text" +
" FROM ST_RosterValue" +
" WHERE (((ST_RosterValue.RC_ID)=" + info.searchId + "))" +
" ORDER BY ST_RosterValue.RV_Text Asc";
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
clbGroupItem.Items.Add(row["RV_Text"].ToString());
}
GlobalInfo.DBOperation.CloseDataSet();
}
else
{
sql = "SELECT ST_TopicPar.TP_Value" +
" FROM ST_TopicPar" +
" WHERE (((ST_TopicPar.T_ID)='" + info.searchId + "') AND ((ST_TopicPar.TP_Name)='OptionCount'))";
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
int optionCount = 0;
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
optionCount = ConvertOper.Convert(row["TP_Value"].ToString()).ToInt;
}
GlobalInfo.DBOperation.CloseDataSet();
if (optionCount > 0)
{
sql = "SELECT ST_TopicPar.TP_Name, ST_TopicPar.TP_Value" +
" FROM ST_TopicPar" +
" WHERE (((ST_TopicPar.T_ID)='" + info.searchId + "'))" +
" ORDER BY ST_TopicPar.TP_Name";
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
//修正分组排行的组名排序问题,TP_Name是按字符串排序的。杨斌 2018-03-15
Dictionary dicGroupName = new Dictionary();
for (int i = 1; i <= optionCount; i++)
{
dicGroupName.Add("OptionText_" + i, null);
}
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
string name = row["TP_Name"].ToString();
if (dicGroupName.ContainsKey(name))
dicGroupName[name] = row["TP_Value"].ToString();
//if (name.Contains("OptionText_"))
//{
// clbGroupItem.Items.Add(row["TP_Value"].ToString());
//}
}
foreach (var v in dicGroupName)
{
if (v.Value != null)
clbGroupItem.Items.Add(v.Value);
}
GlobalInfo.DBOperation.CloseDataSet();
}
}
//全选
ControlOper.SelectAllCheckListBox(clbGroupItem, true);
chkSelectAllGroupItem.Checked = ((clbGroupItem.Items.Count > 0)
&& (clbGroupItem.CheckedItems.Count == clbGroupItem.Items.Count));
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
}
///
/// 加载名单字段
///
private void LoadRosterField()
{
try
{
cboRosterField.Items.Clear();
//加载名单字段
cboRosterField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "cboRosterField", "键盘型号"));
for (int i = 1; i < Roster.Columns.Count; i++)
{
cboRosterField.Items.Add(Roster.Columns[i].ColumnName);
}
//选中默认字段-键盘编号
cboRosterField.SelectedIndex = 0;
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
}
///
/// 加载排序字段
///
private void LoadSortField()
{
clbSortField.Items.Clear();
clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_AgvScore", "平均得分"));
clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_AgvCorrect", "平均答对题数"));
//clbSortField.Items.Add("平均正确率");
clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_AgvSpeed", "平均答题速度"));
clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_TotalScore", "总得分"));
clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_TotalCorrect", "总答对题数"));
//clbSortField.Items.Add("总正确率");
clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_TotalSpeed", "总答题速度"));
//选中默认字段-得分
clbSortField.SetItemChecked(0, true);
}
///
/// 评分排行数据结构
/// 创建:杨斌 2012-03-19
/// 修改:杨斌 2012-06-12
///
public class GroupRankData
{
public string group = "";//名单分组为字段值,反馈分组为选项内容
public int groupNo = 0;//若反馈分组,为题目选项序号
public double[] aryScore = null;//用来排序的数据,多列排序按优先级:得分/答对,速度
public double score = 0;
public double correctCount = 0;
public double correctRate = 0;
public double speed = 0;
public int groupCount = 0;//分组人数
public int rankNo;
public string vid = "";//名单id,杨斌 2015-06-11
public string keyId = "";//杨斌 2015-08-10
}
///
/// 自定义排序分组排行榜过程
/// 创建:杨斌 2012-03-21
///
///
///
///
private int CompareScoreRank(GroupRankData x, GroupRankData y)
{
int res = 0;
if (x.group.CompareTo(y.group) > 0)
res = 1;
if (x.group.CompareTo(y.group) < 0)
res = -1;
if (x.groupNo > y.groupNo)
res = 1;
if (x.groupNo < y.groupNo)
res = -1;
if (chkBySpeed.Checked)//杨斌 2018-03-15
{
if (x.speed > y.speed)
res = 1;
if (x.speed < y.speed)
res = -1;
}
for (int i = x.aryScore.Length - 1; i >= 0; i--)
{
if (x.aryScore[i] < y.aryScore[i])
res = 1;
if (x.aryScore[i] > y.aryScore[i])
res = -1;
}
return res;
}
///
/// 获取名单分组人数
/// 创建:杨斌 2012-03-23
///
///
public static TDictionary GetRosterGroupCount()
{
TDictionary res = new TDictionary();
try
{
string sql = "SELECT ST_RosterValue.RV_Text, Count(ST_RosterValue.RR_ID) AS RR_IDCount" +
" FROM ST_RosterColumn INNER JOIN ST_RosterValue ON ST_RosterColumn.RC_ID = ST_RosterValue.RC_ID" +
" WHERE (((ST_RosterColumn.RC_ID)=30))" +
" GROUP BY ST_RosterValue.RV_Text";
GlobalInfo.DBOperation.OpenDataSet(sql);
DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
string group = row["RV_Text"].ToString();
int count = ConvertOper.Convert(row["RR_IDCount"].ToString()).ToInt;
if (!res.Contains(group))
res.Add(group, count);
}
GlobalInfo.DBOperation.CloseDataSet();
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
return res;
}
///
/// 排行榜查询-小组成绩
/// 修改:杨斌 2012-06-12
///
private void ShowRankGroup()
{
try
{
dgvRank.Rows.Clear();
dgvRank.Columns.Clear();
dgvRank.Columns.Add("RankNo", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_0", "名次"));
if (cboGroupType.Text.Length > 0)
dgvRank.Columns.Add("RankName", cboGroupType.Text);
else
dgvRank.Columns.Add("RankName", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_1", "分组名称"));
if (IsGroupMVP)//杨斌 2015-06-10
{
if (cboGroupType.Items.Count >= 1)
dgvRank.Columns.Add("RosterName", cboGroupType.Items[0].ToString());
}
if (rbtByScore.Checked)
dgvRank.Columns.Add("Score", rbtByScore.Text);
if (rbtByCorrectRate.Checked)
dgvRank.Columns.Add("CorrectRate", rbtByCorrectRate.Text);
if (rbtByCorrectCount.Checked)
dgvRank.Columns.Add("CorrectCount", rbtByCorrectCount.Text);
if (rbtByCorrectCountSum.Checked)//杨斌 2013-04-02
dgvRank.Columns.Add("CorrectCountSum", rbtByCorrectCountSum.Text);
if (chkBySpeed.Checked)
dgvRank.Columns.Add("Speed", chkBySpeed.Text);
ControlOper.AutoSizeDataGridViewColumn(dgvRank);//列宽自动适应
if (lvwSlide.CheckedItems.Count < 1) return;
if (cboGroupType.SelectedIndex < 0) return;
if (clbGroupItem.CheckedItems.Count < 1) return;
dgvRank.Visible = false;
string sql = "";
DataTable tb = null;
//加载反馈人员的所属分组
TDictionary dicVoterGroup = new TDictionary();
GroupInfo info = ListGroupInfo[cboGroupType.SelectedIndex];
if (info.type == 0)
{
sql = "SELECT ST_Voter.V_ID, ST_RosterValue.RV_Text" +
" FROM ST_RosterColumn INNER JOIN (ST_Voter INNER JOIN ST_RosterValue ON ST_Voter.RR_ID = ST_RosterValue.RR_ID) ON ST_RosterColumn.RC_ID = ST_RosterValue.RC_ID" +
" WHERE (((ST_RosterColumn.RC_ID)=" + info.searchId + "))";
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
string vid = row["V_ID"].ToString();
string group = row["RV_Text"].ToString();
dicVoterGroup.Add(vid, group);
}
GlobalInfo.DBOperation.CloseDataSet();
}
else
{
sql = "SELECT ST_Response.V_ID, ST_Response.R_Result" +
" FROM ST_Response" +
" WHERE (((ST_Response.T_ID)='" + info.searchId + "'))";
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
string vid = row["V_ID"].ToString();
string group = row["R_Result"].ToString();
int i = group.IndexOf(",");
if (i >= 0)
{
group = group.Substring(0, i);
int index = ConvertOper.Convert(group).ToInt - 1;
group = this.clbGroupItem.Items[index].ToString();
}
dicVoterGroup.Add(vid, group);
}
GlobalInfo.DBOperation.CloseDataSet();
}
//题目筛选
string topicID = "";
string[] aryTopic = new string[lvwSlide.CheckedItems.Count];
for (int i = 0; i < lvwSlide.CheckedItems.Count; i++)
{
aryTopic[i] = lvwSlide.CheckedItems[i].Tag.ToString();
}
topicID = string.Join(",", aryTopic);
//加载反馈人员的得分数据
TDictionary dicVoterScore = new TDictionary();
//杨斌 2015-08-10
sql = "SELECT ST_Response.V_ID, Sum(ST_Response.R_Score) AS R_ScoreSum, Sum(ST_Response.R_Correct) AS R_CorrectSum, Sum(ST_Response.R_Speed) AS R_SpeedSum" +
" FROM ST_Response" +
" WHERE (((ST_Response.T_ID) In (" + topicID + ")))" +
" GROUP BY ST_Response.V_ID";
Dictionary dicVidToKeyId = new Dictionary();
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
string vid = row["V_ID"].ToString();
double scroe = ConvertOper.Convert(row["R_ScoreSum"].ToString()).ToDouble;
double correct = ConvertOper.Convert(row["R_CorrectSum"].ToString()).ToDouble;
double speed = ConvertOper.Convert(row["R_SpeedSum"].ToString()).ToDouble;
dicVoterScore.Add(vid, new double[] { scroe, correct, speed });
////杨斌 2015-08-10
//string keyId = row["R_KeypadID"].ToString();
//if (!dicVidToKeyId.ContainsKey(vid))
// dicVidToKeyId.Add(vid, keyId);
}
GlobalInfo.DBOperation.CloseDataSet();
//杨斌 2015-08-11
sql = "SELECT ST_Response.V_ID, ST_Response.R_KeypadID FROM ST_Response" +
" WHERE (((ST_Response.T_ID) In (" + topicID + ")))";
GlobalInfo.DBOperation.OpenDataSet(sql);
tb = GlobalInfo.DBOperation.DataSet.Tables[0];
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
string vid = row["V_ID"].ToString();
string keyId = row["R_KeypadID"].ToString();
if (!dicVidToKeyId.ContainsKey(vid))
dicVidToKeyId.Add(vid, keyId);
}
GlobalInfo.DBOperation.CloseDataSet();
//加载成绩数据
TDictionary dicRank = new TDictionary();
foreach (string vid in dicVoterGroup.Keys)
{
string group = dicVoterGroup[vid];
GroupRankData data = null;
if (clbGroupItem.CheckedItems.Contains(group))
{
if (!dicRank.Contains(group))
{
data = new GroupRankData();
dicRank.Add(group, data);
data.group = group;
data.aryScore = new double[1];
data.groupCount = 1;
}
else
{
data = dicRank[group];
data.groupCount++;
}
data.groupNo = clbGroupItem.CheckedItems.IndexOf(group) + 1;//杨斌 2018-03-15
if (dicVoterScore.Contains(vid))
{
if (IsGroupMVP)
{
double score = dicVoterScore[vid][0];
double speed = dicVoterScore[vid][2];
if ((data.score < score) || ((data.score == score) && (data.speed > speed)))
{
data.vid = vid;
data.score = score;
data.speed = speed;
data.correctCount = dicVoterScore[vid][1];
data.correctRate = dicVoterScore[vid][1];
}
//if (data.score < score)
//{
// data.score = score;
// //杨斌 2015-08-11
// if (data.correctCount < dicVoterScore[vid][1])
// data.correctCount = dicVoterScore[vid][1];
// if (data.correctRate < dicVoterScore[vid][1])
// data.correctRate = dicVoterScore[vid][1];
// if (data.speed > dicVoterScore[vid][2])
// data.speed = dicVoterScore[vid][2];
//}
}
else
{
data.score += dicVoterScore[vid][0];
data.correctCount += dicVoterScore[vid][1];
data.correctRate += dicVoterScore[vid][1];
data.speed += dicVoterScore[vid][2];
}
//data.correctCount += dicVoterScore[vid][1];
//data.correctRate += dicVoterScore[vid][1];
//data.speed += dicVoterScore[vid][2];
if (rbtByScore.Checked)
{
data.aryScore[0] = data.score;
}
else if (rbtByCorrectCount.Checked)
{
data.aryScore[0] = data.correctCount;
}
else if (rbtByCorrectCountSum.Checked)//杨斌 2013-04-02
{
data.aryScore[0] = data.correctCount;
}
else if (rbtByCorrectRate.Checked)
{
data.aryScore[0] = data.correctRate;
}
}
}
}
if (info.type == 0)//加载名单分组人数
{
TDictionary dicGroupCount = GetRosterGroupCount();
for (int i = 0; i < dicRank.Count; i++)
{
GroupRankData data = dicRank[i];
if (dicGroupCount.Contains(data.group))
data.groupCount = dicGroupCount[data.group];
}
}
if (IsGroupMVP)//杨斌 2015-06-10
{
for (int i = 0; i < dicRank.Count; i++)
{
dicRank[i].groupCount = 1;
}
}
//排序
List lstRank = new List();
for (int i = 0; i < dicRank.Count; i++)
{
if (rbtByScore.Checked)//小组得分是平均分。杨斌 2013-05-15
{
dicRank[i].score = dicRank[i].score / dicRank[i].groupCount;
dicRank[i].speed = dicRank[i].speed / dicRank[i].groupCount;//杨斌 2013-05-15
dicRank[i].aryScore[0] = dicRank[i].score;
}
else if (rbtByCorrectRate.Checked)
{
dicRank[i].correctRate = dicRank[i].correctRate / dicRank[i].groupCount;//答对总题数/分组人数=平均答对题数
dicRank[i].speed = dicRank[i].speed / dicRank[i].groupCount;//杨斌 2013-05-15
dicRank[i].aryScore[0] = dicRank[i].correctRate;
}
else if (rbtByCorrectCount.Checked)
{
dicRank[i].correctCount = dicRank[i].correctCount / dicRank[i].groupCount;//答对总题数/分组人数=平均答对题数
dicRank[i].speed = dicRank[i].speed / dicRank[i].groupCount;//杨斌 2013-05-15
dicRank[i].aryScore[0] = dicRank[i].correctCount;
}
else if (rbtByCorrectCountSum.Checked)//杨斌 2013-04-02
{
dicRank[i].correctCount = dicRank[i].correctCount;//答对总题数
dicRank[i].aryScore[0] = dicRank[i].correctCount;
}
lstRank.Add(dicRank[i]);
}
if (IsGroupMVP)//杨斌 2015-06-10。去掉0分数
{
for (int i = lstRank.Count - 1; i >= 0; i--)
{
if (lstRank[i].score <= 0)
lstRank.RemoveAt(i);
}
//杨斌 2015-08-11。下面块去掉
/* if (dicVoterGroup.Count > 0)
{
Dictionary dicRank2 = new Dictionary();
string[] aryVid = new string[dicVoterGroup.Count];
dicVoterGroup.Keys.CopyTo(aryVid, 0);
for (int i = 0; i < lstRank.Count; i++)
{
for (int n = 0; n < dicVoterGroup.Count; n++)
{
if (dicVoterGroup[n] == lstRank[i].group)
{
string vid = aryVid[n];
if ((dicVoterScore.Contains(vid))
&& (dicVoterScore[vid][0] == lstRank[i].score))
{
if (!dicRank2.ContainsKey(vid))
{
GroupRankData da = new GroupRankData();
da.vid = vid;
da.aryScore = lstRank[i].aryScore;
da.group = lstRank[i].group;
da.score = lstRank[i].score;
da.speed = lstRank[i].speed;//杨斌 2015-08-10
dicRank2.Add(vid, da);
}
//if (string.IsNullOrEmpty(lstRank[i].vid))
// lstRank[i].vid = vid;
//else
//{
// int m = i + 1;
// if (m > lstRank.Count - 1)
// {
// lstRank.Add(lstRank[i]);
// }
// else
// {
// lstRank.Insert(m, lstRank[i]);
// }
// lstRank[m].vid = vid;
// i++;
//}
}
}
}
}
lstRank = dicRank2.Values.ToList();
}
* */
}
lstRank.Sort(CompareScoreRank);
//去掉同组非最高的。杨斌 2015-08-10
Dictionary dicGroupTop = new Dictionary();
foreach (var v in lstRank)
{
if (!dicGroupTop.ContainsKey(v.group))
dicGroupTop.Add(v.group, v);
}
lstRank = dicGroupTop.Values.ToList();
//int countTopic = lvwSlide.CheckedItems.Count;
double countTopic = ResponseDB.GetSelItemAndHaveCorrect(lvwSlide);
int rankNo = 1;//排名
for (int i = 0; i < lstRank.Count; i++)
{
if (i > 0)
{
for (int j = 0; j < lstRank[i].aryScore.Length; j++)
{
if (lstRank[i].aryScore[j] != lstRank[i - 1].aryScore[j])
rankNo = i + 1;
}
if (chkBySpeed.Checked)//杨斌 2014-11-05
{
if (lstRank[i].speed != lstRank[i - 1].speed)
rankNo = i + 1;
}
}
lstRank[i].rankNo = rankNo;
dgvRank.Rows.Add();
dgvRank.Rows[i].Cells["RankNo"].Value = rankNo;
dgvRank.Rows[i].Cells["RankName"].Value = lstRank[i].group;
if (dgvRank.Columns.Contains("Score"))
{
dgvRank.Rows[i].Cells["Score"].Value = lstRank[i].score;
}
if (dgvRank.Columns.Contains("CorrectCount"))
{
dgvRank.Rows[i].Cells["CorrectCount"].Value = ConvertOper.Round45(lstRank[i].correctCount, 2);//杨斌 2013-04-02
}
if (dgvRank.Columns.Contains("CorrectCountSum"))//杨斌 2013-04-02
{
dgvRank.Rows[i].Cells["CorrectCountSum"].Value = lstRank[i].correctCount;
}
if (dgvRank.Columns.Contains("CorrectRate"))
{
dgvRank.Rows[i].Cells["CorrectRate"].Value = ConvertOper.GetPercent(lstRank[i].correctRate, countTopic, 2);
}
if (dgvRank.Columns.Contains("Speed"))
{
dgvRank.Rows[i].Cells["Speed"].Value = lstRank[i].speed;
}
if (dgvRank.Columns.Contains("RosterName"))//杨斌 2015-06-11
{
RosterRow row = Roster.GetRowByVoterID(lstRank[i].vid);//杨斌 2015-08-10
if (Roster.RosterEnabled)
{
if (row != null)
{
string rsName = row.Cells[1];
dgvRank.Rows[i].Cells["RosterName"].Value = rsName;
}
}
else
{
if (dicVidToKeyId.ContainsKey((lstRank[i].vid)))
dgvRank.Rows[i].Cells["RosterName"].Value = dicVidToKeyId[lstRank[i].vid];
else
dgvRank.Rows[i].Cells["RosterName"].Value = row.Cells[0];
}
}
}
ControlOper.SetGridRowH(dgvRank);//杨斌 2016-03-04
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
ControlOper.AutoSizeDataGridViewColumn(dgvRank);//列宽自动适应
dgvRank.Visible = true;
}
///
/// 排行榜查询-小组成绩
///
private void ShowRankGroupOld()
{
dgvRank.Visible = false;
try
{
dgvRank.Rows.Clear();
dgvRank.Columns.Clear();
//名次
dgvRank.Columns.Add("RankSort", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_0", "名次"));
//分组
if (cboRosterField.SelectedIndex >= 0)
{
dgvRank.Columns.Add("GroupValue", Roster.Columns[cboRosterField.SelectedIndex].ColumnName);
dgvRank.Columns.Add("GroupCount", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_1", "分组人数"));
}
//成绩
TDictionary DicSortField = new TDictionary();
const string cScoreSumAvg = "R_ScoreSumAvg";
const string cCorrectSumAvg = "R_CorrectSumAvg";
const string cSpeedSumAvg = "R_SpeedSumAvg";
const string cScoreSumSum = "R_ScoreSumSum";
const string cCorrectSumSum = "R_CorrectSumSum";
const string cSpeedSumSum = "R_SpeedSumSum";
if (clbSortField.CheckedItems.Count > 0)
{
if (clbSortField.GetItemChecked(0))
{
dgvRank.Columns.Add(cScoreSumAvg, clbSortField.Items[0].ToString());
DicSortField.Add(cScoreSumAvg, "Avg(RankVoter.R_ScoreSum)");
}
if (clbSortField.GetItemChecked(1))
{
dgvRank.Columns.Add(cCorrectSumAvg, clbSortField.Items[1].ToString());
DicSortField.Add(cCorrectSumAvg, "Avg(RankVoter.R_CorrectSum)");
}
if (clbSortField.GetItemChecked(2))
{
dgvRank.Columns.Add(cSpeedSumAvg, clbSortField.Items[2].ToString());
DicSortField.Add(cSpeedSumAvg, "Avg(RankVoter.R_SpeedSum)");
}
if (clbSortField.GetItemChecked(3))
{
dgvRank.Columns.Add(cScoreSumSum, clbSortField.Items[3].ToString());
DicSortField.Add(cScoreSumSum, "Sum(RankVoter.R_ScoreSum)");
}
if (clbSortField.GetItemChecked(4))
{
dgvRank.Columns.Add(cCorrectSumSum, clbSortField.Items[4].ToString());
DicSortField.Add(cCorrectSumSum, "Sum(RankVoter.R_CorrectSum)");
}
if (clbSortField.GetItemChecked(5))
{
dgvRank.Columns.Add(cSpeedSumSum, clbSortField.Items[5].ToString());
DicSortField.Add(cSpeedSumSum, "Sum(RankVoter.R_SpeedSum)");
}
}
//加载数据
if ((lvwSlide.CheckedItems.Count > 0) && (clbSortField.CheckedItems.Count > 0) && (cboRosterField.SelectedIndex >= 0))
{
string sql = "Select ";
string topicID = "";
string order = "";
string orderType = "";
int groupID = 0;
//成绩字段筛选
string[] keys = new string[DicSortField.Count];
DicSortField.Keys.CopyTo(keys, 0);
for (int i = 0; i < DicSortField.Count; i++)
{
if (order.Length > 0)
{
order += ", ";
sql += ", ";
}
switch (keys[i])
{
case cScoreSumAvg:
case cScoreSumSum:
case cCorrectSumAvg:
case cCorrectSumSum:
orderType = " DESC ";
break;
case cSpeedSumAvg:
case cSpeedSumSum:
orderType = " ASC ";
break;
}
order += DicSortField[i] + orderType;
sql += DicSortField[i] + " AS " + keys[i];
}
//题目筛选
string[] aryTopic = new string[lvwSlide.CheckedItems.Count];
for (int i = 0; i < lvwSlide.CheckedItems.Count; i++)
{
aryTopic[i] = lvwSlide.CheckedItems[i].Tag.ToString();
}
topicID = string.Join(",", aryTopic);
//分组字段筛选
if (cboRosterField.SelectedIndex >= 0)
{
groupID = Roster.Columns[cboRosterField.SelectedIndex].ColumnID;
}
string subSql = "Select Sum(ST_Response.R_Score) AS R_ScoreSum, Sum(ST_Response.R_Correct) AS R_CorrectSum, Sum(ST_Response.R_Speed) AS R_SpeedSum, ST_Voter.V_ID, ST_Voter.V_KeypadID, ST_Voter.RR_ID" +
" FROM ST_Topic INNER JOIN (ST_Voter INNER JOIN ST_Response ON ST_Voter.V_ID = ST_Response.V_ID) ON ST_Topic.T_ID = ST_Response.T_ID" +
" WHERE (((ST_Topic.TT_ID) IN(" + cResponseType + ")) AND ((ST_Topic.T_ID) In (" + topicID + ")))" +
" GROUP BY ST_Voter.V_ID, ST_Voter.V_KeypadID, ST_Voter.RR_ID";
sql += ", ST_RosterValue.RV_Text, Count(RankVoter.V_ID) AS GroupCount" +
" FROM (" + subSql + ") AS RankVoter INNER JOIN ST_RosterValue ON RankVoter.RR_ID = ST_RosterValue.RR_ID" +
" WHERE (((ST_RosterValue.RC_ID)=" + groupID + "))" +
" GROUP BY ST_RosterValue.RV_Text" +
" ORDER BY " + order;
GlobalInfo.DBOperation.OpenDataSet(sql);
DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0];
if (tb.Rows.Count > 0)
{
dgvRank.Rows.Add(tb.Rows.Count);
for (int iRow = 0; iRow < tb.Rows.Count; iRow++)
{
DataRow row = tb.Rows[iRow];
//名次
//dgvRank.Rows[iRow].Cells["RankSort"].Value = iRow + 1;
//分组
for (int i = 0; i < cboRosterField.Items.Count; i++)
{
dgvRank.Rows[iRow].Cells["GroupValue"].Value = row["RV_Text"].ToString();
dgvRank.Rows[iRow].Cells["GroupCount"].Value = row["GroupCount"].ToString();
}
bool isSame = (iRow > 0);
//成绩
if (DicSortField.Contains(cScoreSumAvg))
{
dgvRank.Rows[iRow].Cells[cScoreSumAvg].Value = tb.Rows[iRow][cScoreSumAvg];
if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cScoreSumAvg].ToString()).ToDouble
== ConvertOper.Convert(tb.Rows[iRow - 1][cScoreSumAvg].ToString()).ToDouble);
}
if (DicSortField.Contains(cCorrectSumAvg))
{
dgvRank.Rows[iRow].Cells[cCorrectSumAvg].Value = tb.Rows[iRow][cCorrectSumAvg];
if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cCorrectSumAvg].ToString()).ToDouble
== ConvertOper.Convert(tb.Rows[iRow - 1][cCorrectSumAvg].ToString()).ToDouble);
}
if (DicSortField.Contains(cSpeedSumAvg))
{
dgvRank.Rows[iRow].Cells[cSpeedSumAvg].Value = tb.Rows[iRow][cSpeedSumAvg];
if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cSpeedSumAvg].ToString()).ToDouble
== ConvertOper.Convert(tb.Rows[iRow - 1][cSpeedSumAvg].ToString()).ToDouble);
}
if (DicSortField.Contains(cScoreSumSum))
{
dgvRank.Rows[iRow].Cells[cScoreSumSum].Value = tb.Rows[iRow][cScoreSumSum];
if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cScoreSumSum].ToString()).ToDouble
== ConvertOper.Convert(tb.Rows[iRow - 1][cScoreSumSum].ToString()).ToDouble);
}
if (DicSortField.Contains(cCorrectSumSum))
{
dgvRank.Rows[iRow].Cells[cCorrectSumSum].Value = tb.Rows[iRow][cCorrectSumSum];
if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cCorrectSumSum].ToString()).ToDouble
== ConvertOper.Convert(tb.Rows[iRow - 1][cCorrectSumSum].ToString()).ToDouble);
}
if (DicSortField.Contains(cSpeedSumSum))
{
dgvRank.Rows[iRow].Cells[cSpeedSumSum].Value = tb.Rows[iRow][cSpeedSumSum];
if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cSpeedSumSum].ToString()).ToDouble
== ConvertOper.Convert(tb.Rows[iRow - 1][cSpeedSumSum].ToString()).ToDouble);
}
//名次
if (isSame)//并列
dgvRank.Rows[iRow].Cells["RankSort"].Value = dgvRank.Rows[iRow - 1].Cells["RankSort"].Value;
else//有差异
dgvRank.Rows[iRow].Cells["RankSort"].Value = iRow + 1;
}
}
GlobalInfo.DBOperation.CloseDataSet();
}
}
catch (Exception ex)
{
SystemLog.WriterLog(ex);
}
ControlOper.AutoSizeDataGridViewColumn(dgvRank);//列宽自动适应
dgvRank.Visible = true;
}
///
/// 导出排行榜
///
public void ExportRank()
{
this.Cursor = Cursors.WaitCursor;
string[,] aryTable = ControlOper.AryFromDataGrid(dgvRank);
ExcelOper.ExportArrayToExcel(aryTable, this.Text);
this.Cursor = Cursors.Default;
}
///
/// 选中查询的题目
///
///
///
private void lvwSlide_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if (IsLoading) return;
IsLoading = true;
chkSelectAllSlide.Checked = ((lvwSlide.CheckedItems.Count > 0) && (lvwSlide.CheckedItems.Count == lvwSlide.Items.Count));
IsLoading = false;
ShowRankGroup();
}
///
/// 全选题目
///
///
///
private void chkSelectAllSlide_CheckedChanged(object sender, EventArgs e)
{
if (IsLoading) return;
IsLoading = true;
ControlOper.SelectAllListViewItem(lvwSlide, chkSelectAllSlide.Checked);
IsLoading = false;
ShowRankGroup();
}
///
/// 选中查询的名单字段
///
///
///
private void clbRosterField_SelectedValueChanged(object sender, EventArgs e)
{
if (IsLoading) return;
ShowRankGroup();
}
///
/// 选中查询的分组字段
///
///
///
private void cboRosterField_SelectedIndexChanged(object sender, EventArgs e)
{
if (IsLoading) return;
ShowRankGroup();
}
///
/// 选中查询的排序字段
///
///
///
private void clbGroupItem_SelectedValueChanged(object sender, EventArgs e)
{
if (IsLoading) return;
IsLoading = true;
chkSelectAllGroupItem.Checked = ((clbGroupItem.CheckedItems.Count > 0) && (clbGroupItem.CheckedItems.Count == clbGroupItem.Items.Count));
IsLoading = false;
ShowRankGroup();
}
//选择分组类型
private void cboGroupType_SelectedIndexChanged(object sender, EventArgs e)
{
LoadGroupItem();
if (IsLoading) return;
ShowRankGroup();
}
//全选分组选项
private void chkSelectAllGroupItem_CheckedChanged(object sender, EventArgs e)
{
if (IsLoading) return;
IsLoading = true;
ControlOper.SelectAllCheckListBox(clbGroupItem, chkSelectAllGroupItem.Checked);
IsLoading = false;
ShowRankGroup();
}
//排序方式选择
private void OrderBy_CheckedChanged(object sender, EventArgs e)
{
if (IsLoading) return;
ShowRankGroup();
//杨斌 2014-07-25
Control ctrl = sender as Control;
if (ctrl is RadioButton)
GlobalInfo.IniCtlSystem.WriteValue(this.Name, "OrderField", ctrl.Name);
if (ctrl is CheckBox)
GlobalInfo.IniCtlSystem.WriteValue(this.Name, ctrl.Name, (ctrl as CheckBox).Checked ? 1 : 0);
}
//杨斌 2015-06-10
private void chkMVP_CheckedChanged(object sender, EventArgs e)
{
if (IsLoading) return;
IsGroupMVP = chkMVP.Checked;
ShowRankGroup();
}
}
}