List去重、遍历循环类属性和值、数组比较、集合根据属性倒叙

/// <summary>
        /// 获取员工全年考核记录   2018年5月23日
        /// </summary>
        /// <param name="queryStr"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult GetList(string queryStr)
        {
            try
            {
                string CustodyId = "";
                DateTime d1 = DateTime.Now;
                string DateYear = d1.Year.ToString();
                string DateMonth = d1.Month.ToString();
                if (queryStr == "")
                {
                    CustodyId = LoginInfo.CustodyId.Split(',')[0];
                }
                else
                {
                    CustodyId = queryStr.Split('&')[0].Split('=')[1];
                    DateYear = queryStr.Split('&')[1].Split('=')[1].Split('-')[0];
                }
                //获取全年考勤记录
                SqlQuery sq = new Select().From<VPeople_MouthAttendance>()
                    .Where(VPeople_MouthAttendance.Columns.CustodyId).IsEqualTo(CustodyId)
                    .And(VPeople_MouthAttendance.Columns.Year).IsEqualTo(DateYear);
                List<VPeople_MouthAttendance> list = sq.ExecuteTypedList<VPeople_MouthAttendance>();
                List<UserInfo> ulist = new List<UserInfo>();
                //将拥有记录的人员录入
                foreach (var item in list)
                {
                    UserInfo UI = new UserInfo();
                    UI.UserID = item.UserId;
                    ulist.Add(UI);
                }
                //将拥有记录的人员去重
                List<UserInfo> NoUlist = ulist.Where((x, i) => ulist.FindIndex(z => z.UserID == x.UserID) == i).ToList();
                //循环去重后的集合
                foreach (var item in NoUlist)
                {
                    int YearNum = 0;
                    int YearChuQinNum = 0;
                    //定义月考勤集合
                    List<YearKaoqin> YKlist = new List<YearKaoqin>();                   
                    //循环全年考勤记录
                    foreach (var UserItem in list)
                    {                       
                        //如果全年考勤记录用户ID等于去重后的ID便记录
                        if (UserItem.UserId == item.UserID)
                        {
                            item.Name = UserItem.Name;
                            //月考勤记录类
                            YearKaoqin YKQ = new YearKaoqin();
                            YKQ.Month =int.Parse(UserItem.Month);
                            PropertyInfo[] propertys = UserItem.GetType().GetProperties();
                            int Num = 0;
                            int ChuQinNum = 0;
                            //遍历循环类属性和值
                            foreach (PropertyInfo property in propertys)
                            {                               
                                object value = property.GetValue(UserItem, null);
                                for (int i = 1; i <= 31; i++)
                                {
                                    string N = "Day" + i + "Name";
                                    if (property.Name == N && value != null)
                                    {
                                        //出勤+1
                                        if (value.ToString() == "出勤")
                                        {
                                            Num++;
                                            YearNum++;
                                        }
                                    }
                                    //不为空便为值班 应当出勤+1
                                    if (property.Name == "Expr" + i && value != null)
                                    {
                                        ChuQinNum++;
                                        YearChuQinNum++;
                                    }
                                }
                                YKQ.MonthChuqin = ChuQinNum.ToString();
                                YKQ.ActualChuqin = Num.ToString();
                                //如果出勤 值班为0 出勤率为0
                                if (Num <= 0| ChuQinNum<=0)
                                {
                                    YKQ.MonthChuqinLv = "0";
                                }
                                else
                                {
                                    decimal ChuQinLv = Math.Round(decimal.Parse(YKQ.ActualChuqin) / decimal.Parse(YKQ.MonthChuqin) * 100, 2);
                                    YKQ.MonthChuqinLv = ChuQinLv.ToString();
                                }
                            }
                            item.YearChuqin = YearChuQinNum.ToString();
                            item.YearActualChuqin = YearNum.ToString();
                            if (YearNum <= 0 | YearChuQinNum <= 0)
                            {
                                item.YearChuqinLv = "0";
                            }
                            else
                            {
                                decimal ChuQinLv = Math.Round(decimal.Parse(item.YearActualChuqin) / decimal.Parse(item.YearChuqin) * 100, 2);
                                item.YearChuqinLv = ChuQinLv.ToString();
                            }
                            YKlist.Add(YKQ);
                            item.Ykaoqin = YKlist;
                        }
                    }
                }
                //如果人员考勤不足12个月补足其他月份
                foreach (var item in NoUlist)
                {
                    if (item.Ykaoqin.Count<12)
                    {
                        List<YearKaoqin> YKlist = new List<YearKaoqin>();
                        //获取已存在的月份
                        int[] SameMonth = (from info in item.Ykaoqin select info.Month).ToArray();
                        //定义12个月份
                        int[] Data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
                        //两个数组比较取考勤记录中没有的月份
                        int[] arrAdd = Data.Except(SameMonth).ToArray();
                        //循环数组中的月份加入记录表
                        foreach (var Month in arrAdd)
                        {
                            YearKaoqin YK = new YearKaoqin();
                            YK.Month = Month;
                            YK.MonthChuqin = "0";
                            YK.ActualChuqin = "0";
                            YK.MonthChuqinLv = "0";
                            YKlist.Add(YK);
                        }
                        YKlist.AddRange(item.Ykaoqin);
                        //集合按照月份进行排序
                        item.Ykaoqin = YKlist.OrderBy(x => x.Month).ToList();
                    }                                        
                }
                var json = new
                {
                    total = NoUlist.Count,
                    rows = NoUlist.Select((r, i) => new
                    {
                        Name= r.Name,
                        UserID=r.UserID,
                        YearChuqin=r.YearChuqin,
                        YearActualChuqin=r.YearActualChuqin,
                        YearChuqinLv= r.YearChuqinLv,
                        Ykaoqin =r.Ykaoqin.Select((n, l) => new
                        {
                            Month= n.Month,
                            MonthChuqin=n.MonthChuqin,
                            ActualChuqin=n.ActualChuqin,
                            MonthChuqinLv=n.MonthChuqinLv,
                        })
                    })
                };

                return Json(json);
            }
            catch (Exception e)
            {
                throw;
            }
        }             
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值