public void GetRevoteGroupViews(HttpContext context, OleDbConnection conn)
        {
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);

            int iPrizeID = 0;

            if (!Int32.TryParse(context.Request["PrizeID"], out iPrizeID))
            {
                context.Response.Write("暂无奖项!");
                return;
            }

            Dal.Models.Prize prize = BLL.Prize.GetPrize(iPrizeID, conn);

            if (prize == null)
            {
                context.Response.Write("暂无奖项!");
                return;
            }

            var groupViews = BuildRevoteGroupViews(prize, expert, conn);

            context.Response.Write(JsonConvert.SerializeObject(groupViews.ToArray()));
        }
        private void RevotingVote(HttpContext context, OleDbConnection conn)
        {
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);
            OleDbTransaction    tran   = conn.BeginTransaction();

            try
            {
                int declarationId = 0;
                int revoteGroupId = 0;
                int recommended   = 0;
                int notRecommened = 0;
                int prizeId       = 0;
                if (!int.TryParse(context.Request["DeclarationID"], out declarationId) ||
                    !int.TryParse(context.Request["RevoteGroupId"], out revoteGroupId) ||
                    !int.TryParse(context.Request["RevoteRecommended"], out recommended) ||
                    !int.TryParse(context.Request["NotRevoteRecommended"], out notRecommened) ||
                    !int.TryParse(context.Request["PrizeId"], out prizeId))
                {
                    throw new Exception("参数错误!");
                }

                Dal.Models.Prize prize = BLL.Prize.GetPrize(prizeId, conn, tran);
                if (prize == null || prize.IsStopVote)
                {
                    throw new Exception("当前奖项及轮次已结束投票。");
                }

                Revote revote = new Revote();
                bool   saved  = revote.SaveRevotingVote(revoteGroupId, declarationId, recommended, notRecommened, expert.UserID.Value,
                                                        conn, tran);

                if (saved)
                {
                    tran.Commit();

                    var    revoteGroups = this.BuildRevoteGroupViews(prize, expert, conn);
                    string message      = "投票成功!";

                    var result = new { Views = revoteGroups, Message = message };

                    context.Response.Write(JsonConvert.SerializeObject(result));
                }
                else
                {
                    tran.Rollback();
                    context.Response.Write(JsonConvert.SerializeObject(new { Message = "投票错误" }));
                }
            }
            catch (Exception ex)
            {
                tran.Rollback();
                context.Response.Write(JsonConvert.SerializeObject(new { Message = ex.Message }));
            }
        }
        protected void btnEditUser_Click(object sender, EventArgs e)
        {
            OleDbConnection conn = new OleDbConnection(Dal.OleDbHlper.ConnectionString);

            conn.Open();

            // 获取当前活动
            string strActivityType = Session["ActivityType"].ToString();

            Dal.Models.Activity activity = BLL.Activity.GetActivity(strActivityType, conn);
            if (activity == null)
            {
                Response.Redirect("../Mutual/HomePage.aspx");
                return;
            }

            int iExpertId = 0;

            int.TryParse(Request["epid"], out iExpertId);
            Dal.Models.Expert expert = BLL.Expert.GetExpert(iExpertId, conn);
            expert.ExpertName    = txtExpertName.Text;
            expert.AcademicTitle = txtAcademicTitle.Text;
            expert.Profession    = txtProfession.Text;
            expert.Workplace     = txtWorkplace.Text;
            expert.IDType        = rbtnIDType.SelectedValue;
            expert.IDNumber      = txtIDNumber.Text;
            expert.Gender        = ddlGender.SelectedValue;
            expert.Email         = txtEmail.Text;
            expert.SpecialtyIDs  = checkeds.Value;

            OleDbTransaction tran = conn.BeginTransaction();

            try
            {
                BLL.Expert.UpdateExpert(expert, conn, tran);
                BLL.User.SetUserSpecialty(expert.UserID.Value, activity.ActivityID.Value, expert.SpecialtyIDs, conn, tran);
                tran.Commit();
                hdMsg.Value = "修改成功!";
            }
            catch (Exception ex)
            {
                tran.Rollback();
                conn.Close();
                hdMsg.Value = ex.Message;
                return;
            }
            conn.Close();
        }
        protected void btnCreateUser_Click(object sender, EventArgs e)
        {
            OleDbConnection conn = new OleDbConnection(Dal.OleDbHlper.ConnectionString);

            conn.Open();

            // 获取当前活动
            string strActivityType = Session["ActivityType"].ToString();

            Dal.Models.Activity activity = BLL.Activity.GetActivity(strActivityType, conn);
            if (activity == null)
            {
                Response.Redirect("../Mutual/HomePage.aspx");
                return;
            }
            OleDbTransaction tran = conn.BeginTransaction();

            Dal.Models.Expert   expert = new Dal.Models.Expert();
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)Session["UserInfo"];
            expert.ExpertName    = txtExpertName.Text;
            expert.AcademicTitle = txtAcademicTitle.Text;
            expert.Profession    = txtProfession.Text;
            expert.Workplace     = txtWorkplace.Text;
            expert.IDType        = rbtnIDType.SelectedValue;
            expert.IDNumber      = txtIDNumber.Text;
            expert.Gender        = ddlGender.SelectedValue;
            expert.Email         = txtEmail.Text;
            expert.SpecialtyIDs  = checkeds.Value;
            //string strDefaultPassword = System.Configuration.ConfigurationManager.AppSettings["DefaultPassword"];
            string strDefaultPassword = BLL.SysConstant.GetAppSettings("DefaultPassword", conn, tran);

            try
            {
                BLL.Expert.CreateExpert(expert, strDefaultPassword, user.UserID.Value, conn, tran);
                BLL.User.SetUserSpecialty(expert.UserID.Value, activity.ActivityID.Value, expert.SpecialtyIDs, conn, tran);
                tran.Commit();
                hdMsg.Value = "添加成功!";
                conn.Close();
            }
            catch (Exception ex)
            {
                tran.Rollback();
                conn.Close();
                hdMsg.Value = ex.Message;
                return;
            }
        }
        public void SubmitVote(HttpContext context, OleDbConnection conn)
        {
            int iPrizeID = 0;

            Int32.TryParse(context.Request["PrizeID"], out iPrizeID);
            Dal.Models.Prize    prize  = BLL.Prize.GetPrize(iPrizeID, conn);
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);

            if (prize == null || prize.IsStopVote)
            {
                context.Response.Write("当前奖项及轮次已结束投票。");
                return;
            }

            OleDbTransaction tran = conn.BeginTransaction();

            try
            {
                //根据专家和奖项获评奖项目
                List <Dal.Models.Vote> lstVote = BLL.Vote.GetVoteDeclarationList(expert, prize, conn, tran);

                //获取每个奖项的已评奖数量
                Dictionary <string, int> dicVote = new Dictionary <string, int>();

                //获取每个奖项未评奖数量
                Dictionary <string, int> dicRemain = new Dictionary <string, int>();

                GetLimit(prize, lstVote, ref dicVote, ref dicRemain);

                if (dicVote["Voted"] < lstVote.Count)
                {
                    throw new Exception("尚未完成投票,提交失败!");
                }

                BLL.Vote.SubmitVote(expert, prize, conn, tran);

                tran.Commit();
                context.Response.Write("提交成功!");
            }
            catch (Exception ex)
            {
                tran.Rollback();
                context.Response.Write(ex.Message);
            }
        }
        public void GetExpertVoteList(HttpContext context, OleDbConnection conn)
        {
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);

            int iPrizeID = 0;

            if (!Int32.TryParse(context.Request["PrizeID"], out iPrizeID))
            {
                context.Response.Write("暂无奖项!");
                return;
            }

            Dal.Models.Prize prize = BLL.Prize.GetPrize(iPrizeID, conn);

            if (prize == null)
            {
                context.Response.Write("暂无奖项!");
                return;
            }

            Dal.Models.Schedule schedule = BLL.Schedule.GetSpecialtySchedule(prize.SpecialtyID.Value, conn);

            if (schedule.IsVoteStart == false)
            {
                context.Response.Write("投票未开始或已经结束!");
            }
            else
            {
                //根据专家和奖项获评奖项目
                List <Dal.Models.Vote> lstVote = BLL.Vote.GetVoteDeclarationList(expert, prize, conn);
                lstVote = lstVote.OrderBy(d => d.BigOrdinal).ToList();

                //获取每个奖项的已评奖数量
                Dictionary <string, int> dicVote = new Dictionary <string, int>();

                //获取每个奖项未评奖数量
                Dictionary <string, int> dicRemain = new Dictionary <string, int>();

                GetLimit(prize, lstVote, ref dicVote, ref dicRemain);

                object[] obj = { prize, lstVote, dicVote, dicRemain };
                context.Response.Write(JsonConvert.SerializeObject(obj));
            }
        }
        private List <dynamic> BuildRevoteGroupViews(Dal.Models.Prize prize, Dal.Models.Expert expert, OleDbConnection conn)
        {
            BLL.Revote revote = new Revote();

            List <RevoteGroup> groups     = revote.GetRevoteGroups(prize, conn);
            List <dynamic>     groupViews = new List <dynamic>();

            foreach (var revoteGroup in groups)
            {
                int revoteGroupId = revoteGroup.RevoteGroupId;
                List <RevotePrizeLevel> awards      = revote.GetRevotePrizeLevelsByGroupId(revoteGroupId, conn);
                List <RevotingVoteView> votingViews = revote.GetRevotingVoteViews(revoteGroupId, expert.UserID.Value, conn);

                // 推荐票数 = 评选奖项总数-最低奖项数量
                // 举例,若评选2个一等奖,1个二等奖,则推荐票数为(2+1)-1=2
                // 若仅有一种奖项,则取该奖项的评选数量
                int recommended = awards.Count == 1
                    ? awards.Sum(a => a.LevelLimitNumber)
                    : awards.Sum(a => a.LevelLimitNumber) - awards.LastOrDefault().LevelLimitNumber;

                // 是否已提交, 当且仅当全部投票IsSubmit=true则视为该专家已经提交
                bool isSubmit = votingViews.TrueForAll(v => v.IsSubmit.HasValue && v.IsSubmit.Value);

                // 已投票
                int voted = votingViews.Count(v => v.RevoteRecommended.HasValue && v.RevoteRecommended.Value == 1);

                dynamic groupView = new
                {
                    RevoteGroupId = revoteGroupId,
                    VotingViews   = votingViews.ToArray(),
                    Info          = new
                    {
                        Awards      = awards.Select(a => a.ToAwardView()).ToArray <AwardView>(),
                        Recommended = recommended,
                        Voted       = voted,
                        IsSubmit    = isSubmit
                    }
                };

                groupViews.Add(groupView);
            }

            return(groupViews);
        }
        public void SubmitRevotingVote(HttpContext context, OleDbConnection conn)
        {
            int iPrizeID = 0;

            Int32.TryParse(context.Request["PrizeID"], out iPrizeID);
            Dal.Models.Prize    prize  = BLL.Prize.GetPrize(iPrizeID, conn);
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);

            if (prize == null || prize.IsStopVote)
            {
                context.Response.Write("当前奖项及轮次已结束投票。");
                return;
            }

            OleDbTransaction tran = conn.BeginTransaction();

            try
            {
                BLL.Revote revote = new Revote();

                RevotePrize last = revote.GetLastRevotePrize(prize, conn, tran);

                bool saved = revote.SubmitRevotingVote(expert.UserID.Value, last.RevotePrizeId, conn, tran);

                if (saved)
                {
                    tran.Commit();
                    context.Response.Write("提交成功!");
                }
                else
                {
                    tran.Commit();
                    context.Response.Write("提交错误!");
                }
            }
            catch (Exception ex)
            {
                tran.Rollback();
                context.Response.Write(ex.Message);
            }
        }
        private void BatchRevotingVote(HttpContext context, OleDbConnection conn)
        {
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);

            int prizeId = 0;
            int recommended, notRecommended;

            int.TryParse(context.Request["PrizeID"], out prizeId);
            int.TryParse(context.Request["Recommended"], out recommended);
            int.TryParse(context.Request["NotRecommended"], out notRecommended);

            Dal.Models.Prize prize = BLL.Prize.GetPrize(prizeId, conn);

            if (prize == null || prize.IsStopVote)
            {
                context.Response.Write("当前奖项及轮次已结束投票。");
                return;
            }
            BLL.Revote  revote      = new Revote();
            RevotePrize revotePrize = revote.GetLastRevotePrize(prize, conn);

            OleDbTransaction tran = conn.BeginTransaction();

            try
            {
                bool saved = revote.SaveBatchRevotingVotes(revotePrize.RevotePrizeId, expert.UserID.Value, recommended, notRecommended, conn, tran);

                tran.Commit();
                context.Response.Write(JsonConvert.SerializeObject("投票成功!"));
            }
            catch (Exception ex)
            {
                tran.Rollback();
                context.Response.Write(JsonConvert.SerializeObject(ex.Message));
            }
        }
        private void InitPage(OleDbConnection conn)
        {
            btnCreateUser.Visible = false;

            int iExpertId = 0;

            int.TryParse(Request["epid"], out iExpertId);
            if (iExpertId > 0)
            {
                try
                {
                    Dal.Models.UserInfo userinfo = (Dal.Models.UserInfo)Session["UserInfo"];
                    Dal.Models.Expert   expert   = BLL.Expert.GetExpert(iExpertId, conn);
                    if (userinfo.UserID == expert.UserID)
                    {
                        ddlSpecialty.Enabled  = false;
                        ddlSpecialty.Visible  = false;
                        listSpecialty.Visible = true;
                    }
                    else
                    {
                        userinfo = BLL.User.GetUserInfo(expert.UserID.Value, conn);
                    }
                    txtExpertName.Text       = expert.ExpertName;
                    txtUserName.Text         = userinfo.UserName;
                    txtAcademicTitle.Text    = expert.AcademicTitle;
                    txtProfession.Text       = expert.Profession;
                    txtWorkplace.Text        = expert.Workplace;
                    rbtnIDType.SelectedValue = expert.IDType;
                    txtIDNumber.Text         = expert.IDNumber;

                    //if (expert.IDType == "0901" && BLL.IDOperation.CheckIDCard18(expert.IDNumber))
                    //{
                    //    rbtnIDType.Enabled = false;
                    //    txtIDNumber.Enabled = false;
                    //}

                    txtEmail.Text           = userinfo.Email;
                    ddlGender.SelectedValue = expert.Gender;
                    if (expert.SpecialtyIDs != null && expert.SpecialtyIDs != "" && expert.SpecialtyNames != null && expert.SpecialtyNames != "")
                    {
                        string[] arrSpecialtyID = expert.SpecialtyIDs.Split(',');
                        expert.SpecialtyNames = expert.SpecialtyNames.Replace(",", ",");
                        string[] arrSpecialtyName = expert.SpecialtyNames.Split(',');
                        for (int i = 0; i < arrSpecialtyID.Length; i++)
                        {
                            listSpecialty.Items.Add(new System.Web.UI.WebControls.ListItem(arrSpecialtyName[i], arrSpecialtyID[i]));
                        }
                        checkeds.Value = string.Join(",", arrSpecialtyID);
                    }
                    hdMsg.Value = "";
                }
                catch (Exception ex)
                {
                    hdMsg.Value = ex.Message;
                }
            }
            Dal.Models.UserInfo user = (Dal.Models.UserInfo)Session["UserInfo"];
            if (user.UserType == "0805")
            {
                txtExpertName.Enabled = false;
                //ddlGender.Enabled = false;
                txtAcademicTitle.Enabled = false;
                txtProfession.Enabled    = false;
            }
        }
        private void BatchBallot(HttpContext context, OleDbConnection conn)
        {
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);

            int iPrizeID = 0;

            int.TryParse(context.Request["PrizeID"], out iPrizeID);
            string strVoteCode  = context.Request["VoteCode"];
            string strLevelCode = context.Request["LevelCode"];

            if (strLevelCode == "0404")
            {
                strLevelCode = "";
            }

            Dal.Models.Prize prize = BLL.Prize.GetPrize(iPrizeID, conn);

            if (prize == null || prize.IsStopVote)
            {
                context.Response.Write("当前奖项及轮次已结束投票。");
                return;
            }

            OleDbTransaction tran = conn.BeginTransaction();

            try
            {
                //根据专家和奖项获评奖项目
                List <Dal.Models.Vote> lstVote = BLL.Vote.GetVoteDeclarationList(expert, prize, conn, tran);

                //获取每个奖项的已评奖数量
                Dictionary <string, int> dicVote = new Dictionary <string, int>();

                //获取每个奖项未评奖数量
                Dictionary <string, int> dicRemain = new Dictionary <string, int>();

                GetLimit(prize, lstVote, ref dicVote, ref dicRemain);

                //if (strVoteCode == "0601" && (dicRemain["Recommended"] == 0
                //    || (strLevelCode == "0401" && dicRemain["FirstPrize"] == 0)
                //    || (strLevelCode == "0402" && dicRemain["SecondPrize"] == 0)
                //    || (strLevelCode == "0403" && dicRemain["ThirdPrize"] == 0)))
                //{
                //    throw new Exception("所投选项名额已满,请重新投票!");
                //}

                Dal.Models.Vote vote = new Dal.Models.Vote()
                {
                    UserID            = user.UserID.Value,
                    Votor             = expert.ExpertID.Value,
                    ActivityID        = prize.ActivityID.Value,
                    MultipleVoteRound = prize.MultipleVoteRound ?? 1,
                    VoteRound         = prize.MultipleVoteRound ?? 1,
                    IsSubmit          = false,
                    PrizeID           = prize.PrizeID.Value,
                    VoteCode          = strVoteCode,
                    PrizeLevelCode    = strLevelCode,
                    VoteType          = "0502"
                };

                BLL.Vote.BatchBallot(vote, conn, tran);

                tran.Commit();
                context.Response.Write(JsonConvert.SerializeObject("投票成功!"));
            }
            catch (Exception ex)
            {
                tran.Rollback();
                context.Response.Write(JsonConvert.SerializeObject(ex.Message));
            }
        }
        //public void FinishVote(HttpContext context, OleDbConnection conn)
        //{
        //    Dal.Models.UserInfo user = (Dal.Models.UserInfo)context.Session["UserInfo"];

        //    //Issubmit="1",是投票结果的状态为提交,专家不能再更改投票结果,投票时,此字段默认值为0
        //    string strIsSubmit = "1";

        //    //获取当前活动类型编码
        //    string strActivityType = context.Session["ActivityType"].ToString();

        //    //获取当前活动ID
        //    int iActivityID = BLL.Activity.GetActivity(strActivityType, conn).ActivityID.Value;

        //    //获取当前活动时间节点
        //    Dal.Models.Schedule schedule = BLL.Schedule.GetActivitySchedule(iActivityID, conn);

        //    //获取所有本次活动的奖项

        //    List<Dal.Models.Prize> lstPrize = BLL.Prize.GetPrizeList(user, strActivityType, "", conn);

        //    //修改Schedule的投票阶段
        //    BLL.Vote.UpdateScheduleVoteFinish(schedule.ScheduleID.Value, false, conn);

        //    foreach (var item in lstPrize)
        //    {
        //        List<Dal.Models.Vote> lstVote = BLL.Vote.GetActivityPrizeVoteList(item.PrizeID.Value, conn);
        //        foreach (var Vote in lstVote)
        //        {
        //            //修改Vote为已经提交
        //            BLL.Vote.SubmitVote(Vote.VoteID.Value, strIsSubmit, conn);
        //        }
        //    }
        //    context.Response.Write("投票已提交");
        //}

        private void Ballot(HttpContext context, OleDbConnection conn)
        {
            Dal.Models.UserInfo user   = (Dal.Models.UserInfo)context.Session["UserInfo"];
            Dal.Models.Expert   expert = BLL.Expert.GetExpertByUserID(user.UserID.Value, conn);
            OleDbTransaction    tran   = conn.BeginTransaction();

            try
            {
                int iDeclarationID     = 0;
                int iPrizeID           = 0;
                int iMultipleVoteRound = 0;
                if (!int.TryParse(context.Request["DeclarationID"], out iDeclarationID) ||
                    !int.TryParse(context.Request["PrizeID"], out iPrizeID) ||
                    !int.TryParse(context.Request["MultipleVoteRound"], out iMultipleVoteRound))
                {
                    throw new Exception("参数错误!");
                }

                Dal.Models.Prize prize = BLL.Prize.GetPrize(iPrizeID, conn, tran);
                if (prize == null || prize.IsStopVote)
                {
                    throw new Exception("当前奖项及轮次已结束投票。");
                }


                string strVoteCode  = context.Request["VoteCode"];
                string strLevelCode = context.Request["LevelCode"];
                if (strLevelCode == "0404")
                {
                    strLevelCode = "";
                }

                Dal.Models.Declaration decl = BLL.Declaration.GetDeclaration(iDeclarationID, conn, tran);
                if (decl.PrizeID != iPrizeID)
                {
                    throw new Exception("参数错误!");
                }

                prize = BLL.Prize.GetPrize(decl.AdjustedPrize.Value, conn, tran);
                if (prize.MultipleVoteRound != iMultipleVoteRound)
                {
                    throw new Exception("当前已进入新一轮投票,请重新进入本页面进行投票!");
                }

                Dal.Models.Vote vote = new Dal.Models.Vote()
                {
                    UserID            = user.UserID.Value,
                    Votor             = expert.ExpertID.Value,
                    DeclarationID     = iDeclarationID,
                    ActivityID        = decl.ActivityID.Value,
                    MultipleVoteRound = prize.MultipleVoteRound ?? 1,
                    RevoteCode        = prize.RevoteCode ?? "",
                    RevoteRound       = prize.RevoteRound ?? 0,
                    IsSubmit          = false,
                    PrizeID           = prize.PrizeID.Value,
                    VoteCode          = strVoteCode,
                    PrizeLevelCode    = strLevelCode,
                    VoteType          = "0502"
                };

                BLL.Vote.Ballot(vote, conn, tran);

                //根据专家和奖项获评奖项目
                List <Dal.Models.Vote> lstVote = BLL.Vote.GetVoteDeclarationList(expert, prize, conn, tran);

                //获取每个奖项的已评奖数量
                Dictionary <string, int> dicVote = new Dictionary <string, int>();

                //获取每个奖项未评奖数量
                Dictionary <string, int> dicRemain = new Dictionary <string, int>();

                GetLimit(prize, lstVote, ref dicVote, ref dicRemain);

                string Message = "";
                //if (strVoteCode == "0601" && (dicRemain["Recommended"] == 0
                //    || (strLevelCode == "0401" && dicRemain["FirstPrize"] == 0)
                //    || (strLevelCode == "0402" && dicRemain["SecondPrize"] == 0)
                //    || (strLevelCode == "0403" && dicRemain["ThirdPrize"] == 0)))
                //{
                //    Message = "所投选项名额已满,请注意!";
                //}
                //else
                //{
                Message = "投票成功!";
                //}

                tran.Commit();

                object[] obj = { prize, lstVote, dicVote, dicRemain, Message };

                context.Response.Write(JsonConvert.SerializeObject(obj));
            }
            catch (Exception ex)
            {
                tran.Rollback();
                context.Response.Write(JsonConvert.SerializeObject(new object[] { ex.Message }));
            }
        }