/// <summary>
        /// 手动添加考勤记录
        /// </summary>
        public int AddStaffAttManually(int staffId, byte attType, string attTime, string attRemark)
        {
            var res = 0;
            List <SYS_Staff> allStaffs = (List <SYS_Staff>)GetSchoolEntities("staff");
            SYS_Staff        sObj      = allStaffs.Where(x => x.ID == staffId).FirstOrDefault();

            if (sObj != null)
            {
                DateTime           aTime = DateTime.Parse(attTime);
                SYS_StaffAttRecord sar   = new SYS_StaffAttRecord()
                {
                    SchoolId   = mlUser.School.ID,
                    MasterId   = staffId,
                    AttType    = attType,
                    AttTime    = aTime,
                    AttTimeStr = aTime.ToString("yyyyMMddHHmmssfff"),
                    AttWay     = (byte)AttWay.手动添加,
                    Remark     = attRemark
                };
                UnitOfWork.Repository <SYS_StaffAttRecord>().AddEntity(sar);

                //修改考勤状态
                if (attType == (byte)AttType.签出)
                {
                    sObj.AttStatus = (byte)CurrentAttStatus.离校;
                }
                else
                {
                    sObj.AttStatus = (byte)CurrentAttStatus.在校;
                }
                UnitOfWork.Repository <SYS_Staff>().UpdateEntity(sObj);

                res = UnitOfWork.CommitAsync().Result;
            }
            return(res);
        }
        /// <summary>
        /// 上传考勤数据
        /// </summary>
        /// <param name="token"></param>
        /// <param name="personType">人员类型1:学生,2:职工</param>
        /// <param name="attWay">考勤方式1:刷卡,2:二维码</param>
        public ModelJsonRet UploadAtt(int schoolId, byte personType, long personId, byte attWay, string cardNo, string dateTime, string deviceId, out long attId)
        {
            attId = 0;
            var res = 0;
            //byte[] byteArray = Convert.FromBase64String(token);
            //string tokenStr= Encoding.Default.GetString(byteArray);
            //var schoolId = int.Parse(tokenStr.Split(',')[0]);
            var school = UnitOfWork.Repository <SYS_School>().GetEntitiesAsync(x => x.ID == schoolId && x.Status == 1).Result.FirstOrDefault();

            if (school == null)
            {
                _mjr.errMsg = "验证失败或学校id不存在或该学校已注销";
                return(_mjr);
            }
            var attTime    = DateTime.ParseExact(dateTime, "yyyyMdHHmmssfff", System.Globalization.CultureInfo.InvariantCulture);
            var todayStart = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));

            if (personType == 1)//学生考勤
            {
                var stuObj = UnitOfWork.Repository <SYS_Student>().GetEntitiesAsync(x => x.SchoolId == schoolId && x.ID == personId).Result.FirstOrDefault();
                if (null == stuObj)
                {
                    _mjr.errMsg = "未找到学生ID";
                    return(_mjr);
                }
                var attType          = AttType.签入;
                var currentAttStatus = CurrentAttStatus.在校;
                //判断是签入还是签出
                var todayAttRecords = UnitOfWork.Repository <SYS_StudentAttRecord>().GetEntitiesAsync(x => x.AttTime > todayStart).Result;
                if (todayAttRecords.Count > 0 && todayAttRecords.Count % 2 == 1)
                {
                    attType          = AttType.签出;
                    currentAttStatus = CurrentAttStatus.离校;
                }

                SYS_StudentAttRecord stuAttRecord = new SYS_StudentAttRecord
                {
                    SchoolId   = school.ID,
                    MasterId   = personId,
                    AttWay     = attWay,
                    AttType    = (byte)attType,
                    AttTime    = attTime,
                    AttTimeStr = dateTime,
                };
                UnitOfWork.Repository <SYS_StudentAttRecord>().AddEntity(stuAttRecord);
                var addOk = UnitOfWork.CommitAsync().Result;
                if (addOk > 0)
                {
                    res   = addOk;
                    attId = stuAttRecord.ID;
                    //更新学生当前考勤状态
                    stuObj.AttStatus = (byte)currentAttStatus;
                    UnitOfWork.Repository <SYS_Student>().UpdateEntity(stuObj);

                    //推送考勤消息
                    List <FK_Stu_Parent> fks = UnitOfWork.Repository <FK_Stu_Parent>().GetEntitiesAsync(x => x.SchoolId == stuObj.SchoolId && x.StuId == stuObj.ID).Result;//查找学生家长
                    if (null != fks && fks.Count > 0)
                    {
                        var pWxPInfo  = UnitOfWork.Repository <Wx_PublicInfo>().GetEntitiesAsync(x => x.Type == 1).Result.FirstOrDefault();
                        var wxpInfoId = pWxPInfo == null?0: pWxPInfo.ID;
                        if (school.WxPublicInfoId != null && school.WxPublicInfoId > 0)
                        {
                            wxpInfoId = (int)school.WxPublicInfoId;
                        }
                        var wxPubInfo = UnitOfWork.Repository <Wx_PublicInfo>().GetEntitiesAsync(x => x.ID == wxpInfoId).Result.FirstOrDefault();
                        foreach (var fk in fks)
                        {
                            //推送消息
                            if (null != wxPubInfo)
                            {
                                // 需要从Cookie中获取
                                ModelWxMsg <ModelWmAttendance> wxMsg = new ModelWxMsg <ModelWmAttendance>();
                                wxMsg = JsonFileProvider.Instance.GetSettings <ModelWxMsg <ModelWmAttendance> >();
                                wxMsg.data.first.value = string.Format(wxMsg.data.first.value, (AttType)attType);
                                wxMsg.url    = mWxSetting.PubUrl_Host + "/WxRelated/Center/AttDetail?attId=" + stuAttRecord.ID;
                                wxMsg.touser = fk.OpenId;
                                wxMsg.data.keyword1.value = stuObj.StuName;
                                wxMsg.data.keyword2.value = attTime.ToString();
                                wxMsg.data.keyword3.value = school.SchoolName;
                                ModelWmResult wmResult = WXOAuthApiHelper.SendTmplMessage(wxPubInfo.AccessToken, wxMsg);
                                if (null == wmResult || wmResult.msgid <= 0)
                                {
                                    LogHelper.Error("推送错误:" + wmResult.errmsg);
                                }
                            }
                        }
                    }
                }
            }
            else if (personType == 2)//职工考勤
            {
                var staffObj = UnitOfWork.Repository <SYS_Staff>().GetEntitiesAsync(x => x.SchoolId == schoolId && x.ID == personId).Result.FirstOrDefault();
                if (null == staffObj)
                {
                    _mjr.errMsg = "未找到职工ID";
                    return(_mjr);
                }
                var attType          = AttType.签入;
                var currentAttStatus = CurrentAttStatus.在校;
                //判断是签入还是签出

                var todayAttRecords = UnitOfWork.Repository <SYS_StaffAttRecord>().GetEntitiesAsync(x => x.AttTime > todayStart).Result.ToList();
                if (todayAttRecords.Count > 0 && todayAttRecords.Count % 2 == 1)
                {
                    attType          = AttType.签出;
                    currentAttStatus = CurrentAttStatus.离校;
                }
                SYS_StaffAttRecord stuAttRecord = new SYS_StaffAttRecord
                {
                    SchoolId   = school.ID,
                    MasterId   = (int)personId,
                    AttWay     = attWay,
                    AttType    = (byte)attType,
                    AttTime    = attTime,
                    AttTimeStr = dateTime,
                };
                UnitOfWork.Repository <SYS_StaffAttRecord>().AddEntity(stuAttRecord);
                var addOk = UnitOfWork.CommitAsync().Result;
                if (addOk > 0)
                {
                    res   = addOk;
                    attId = stuAttRecord.ID;
                    //更新当前考勤状态
                    staffObj.AttStatus = (byte)currentAttStatus;
                    UnitOfWork.Repository <SYS_Staff>().UpdateEntity(staffObj);

                    //推送考勤消息
                    var pWxPInfo  = UnitOfWork.Repository <Wx_PublicInfo>().GetEntitiesAsync(x => x.Type == 1).Result.FirstOrDefault();
                    var wxpInfoId = pWxPInfo == null ? 0 : pWxPInfo.ID;
                    if (school.WxPublicInfoId != null && school.WxPublicInfoId > 0)
                    {
                        wxpInfoId = (int)school.WxPublicInfoId;
                    }
                    var wxPubInfo = UnitOfWork.Repository <Wx_PublicInfo>().GetEntitiesAsync(x => x.ID == wxpInfoId).Result.FirstOrDefault();
                    if (null != wxPubInfo && staffObj.OpenId != null && staffObj.OpenId.Length > 6)
                    {
                        // 需要从Cookie中获取
                        ModelWxMsg <ModelWmAttendance> wxMsg = new ModelWxMsg <ModelWmAttendance>();
                        wxMsg = JsonFileProvider.Instance.GetSettings <ModelWxMsg <ModelWmAttendance> >();
                        wxMsg.data.first.value = (AttType)attType + " 成功";
                        //wxMsg.url = mWxSetting.PubUrl_Host + "/WxRelated/Center/AttDetail?attId=" + stuAttRecord.ID;
                        wxMsg.touser = staffObj.OpenId;
                        wxMsg.data.keyword1.value = staffObj.StaffName;
                        wxMsg.data.keyword2.value = attTime.ToString();
                        wxMsg.data.keyword3.value = school.SchoolName;
                        ModelWmResult wmResult = WXOAuthApiHelper.SendTmplMessage(wxPubInfo.AccessToken, wxMsg);
                        if (null == wmResult || wmResult.msgid <= 0)
                        {
                            LogHelper.Error("推送错误:" + wmResult.errmsg);
                        }
                    }
                }
            }
            if (res > 0)
            {
                _mjr.code    = 1;
                _mjr.content = "ok";
                //RefreshEntities("stu");
                //RefreshEntities("staff");
            }
            return(_mjr);
        }