using BLL;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
namespace FineUIPro.Web.ZHGL.RealName
{
    public partial class SynchroSet : PageBase
    {
        /// 
        /// 用户编辑页面
        /// 
        /// 
        /// 
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ///权限
                this.GetButtonPower();
                ProjectService.InitAllProjectShortNameDropDownList(this.drpProject, this.CurrUser.UserId, false);
                if (!string.IsNullOrEmpty(this.CurrUser.LoginProjectId))
                {
                    this.drpProject.SelectedValue = this.CurrUser.LoginProjectId;
                    this.drpProject.Readonly = true;
                }
                if (this.CurrUser.UserId == Const.hfnbdId)
                {
                    this.btnDataProcess.Hidden = false;
                }
                this.SetPage();
            }
        }
        /// 
        /// 保存按钮
        /// 
        /// 
        /// 
        protected void btnSave_Click(object sender, EventArgs e)
        {
            Model.RealName_SynchroSet newSynchroSet = new Model.RealName_SynchroSet
            {
                UnitId = Const.UnitId_TCC,
                ApiUrl = Funs.RealNameApiUrl,
                ClientId = this.txtclientId.Text.Trim(),
                UserName = this.txtUserName.Text.Trim(),
                Password = this.txtword.Text.Trim(),
                Intervaltime = Funs.GetNewInt(this.txtintervaltime.Text.Trim()),
            };
            newSynchroSet.ProCode = ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
            BLL.SynchroSetService.SaveSynchroSet(newSynchroSet);
            ShowNotify("保存成功!", MessageBoxIcon.Success);
        }
        /// 
        /// 连接测试
        /// 
        /// 
        /// 
        protected void btnConnect_Click(object sender, EventArgs e)
        {
            Model.RealName_SynchroSet newSynchroSet = new Model.RealName_SynchroSet
            {
                UnitId = Const.UnitId_TCC,
                ApiUrl = Funs.RealNameApiUrl,
                ClientId = this.txtclientId.Text.Trim(),
                UserName = this.txtUserName.Text.Trim(),
                Password = this.txtword.Text.Trim(),
                Intervaltime = Funs.GetNewInt(this.txtintervaltime.Text.Trim()),
            };
            newSynchroSet.ProCode = ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
            if (!string.IsNullOrEmpty(SynchroSetService.SaveToken(newSynchroSet)))
            {
                ShowNotify("连接成功!", MessageBoxIcon.Success);
            }
            else
            {
                Alert.ShowInParent("连接失败", MessageBoxIcon.Warning);
            }
        }
        #region 获取按钮权限
        /// 
        /// 获取按钮权限
        /// 
        /// 
        /// 
        private void GetButtonPower()
        {
            string menuId = !string.IsNullOrEmpty(this.CurrUser.LoginProjectId) ? Const.RealNameSynchroSetMenuId : Const.ServerRealNameSynchroSetMenuId;
            var buttonList = BLL.CommonService.GetAllButtonList(this.CurrUser.LoginProjectId, this.CurrUser.UserId, menuId);
            if (buttonList.Count() > 0)
            {
                if (buttonList.Contains(BLL.Const.BtnSave))
                {
                    this.btnSave.Hidden = false;
                    this.btnConnect.Hidden = false;
                    this.btnCompany.Hidden = false;
                    this.btnCompany.Hidden = false;
                    this.btnProCollCompany.Hidden = false;
                    this.btnCollTeam.Hidden = false;
                    this.btnPersons.Hidden = false;
                    this.btnAttendance.Hidden = false;
                }
            }
        }
        #endregion
        /// 
        /// 推送参建企业
        /// 
        /// 
        /// 
        protected void btnCompany_Click(object sender, EventArgs e)
        {
            ShowNotify(BLL.SynchroSetService.PushCollCompany(), MessageBoxIcon.Information);
        }
        /// 
        /// 推送项目参建单位
        /// 
        /// 
        /// 
        protected void btnProCollCompany_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            string proCode = BLL.ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null)
            {
                message += ("项目" + getRProjects.ProCode + SynchroSetService.PushProCollCompany(getRProjects.ProCode));
                ShowNotify(message, MessageBoxIcon.Information);
            }
            else
            {
                ShowNotify("当前项目还没有与实名制对接!", MessageBoxIcon.Information);
            }
        }
        /// 
        /// 推送施工队
        /// 
        /// 
        /// 
        protected void btnCollTeam_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            string proCode = BLL.ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null)
            {
                message += ("项目" + getRProjects.ProCode + SynchroSetService.PushCollTeam(getRProjects.ProCode));
                ShowNotify(message, MessageBoxIcon.Information);
            }
            else
            {
                ShowNotify("当前项目还没有与实名制对接!", MessageBoxIcon.Information);
            }
        }
        /// 
        /// 推送人员信息
        /// 
        /// 
        /// 
        protected void btnPersons_Click(object sender, EventArgs e)
        {
            //string add ="新增"+ BLL.SynchroSetService.PushPersons(Const.BtnAdd,null) ?? "";
            //string update ="更新"+ BLL.SynchroSetService.PushPersons(Const.BtnModify,null) ?? "";
            //ShowNotify(add+"|"+ update, MessageBoxIcon.Information);
            string message = string.Empty;
            string proCode = BLL.ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null)
            {
                message += ("项目" + getRProjects.ProCode + "新增" + BLL.SynchroSetService.PushPersons(Const.BtnAdd, getRProjects.ProCode, null) ?? "");
                message += ("|更新" + BLL.SynchroSetService.PushPersons(Const.BtnModify, getRProjects.ProCode, null) ?? "");
                ShowNotify(message, MessageBoxIcon.Information);
            }
            else
            {
                ShowNotify("当前项目还没有与实名制对接!", MessageBoxIcon.Information);
            }
        }
        /// 
        /// 推送考勤
        /// 
        /// 
        /// 
        protected void btnAttendance_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            string proCode = BLL.ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null)
            {
                message += ("项目" + getRProjects.ProCode + SynchroSetService.PushAttendance(getRProjects.ProCode));
                ShowNotify(message, MessageBoxIcon.Information);
            }
            else
            {
                ShowNotify("当前项目还没有与实名制对接!", MessageBoxIcon.Information);
            }
        }
        /// 
        ///  切换项目
        /// 
        /// 
        /// 
        protected void drpProject_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.SetPage();
        }
        /// 
        /// 
        /// 
        protected void SetPage()
        {
            this.txtclientId.Text = string.Empty;
            this.txtUserName.Text = string.Empty;
            this.txtword.Text = string.Empty;
            this.txtapiUrl.Text = Funs.RealNameApiUrl;
            this.txtintervaltime.Text = ConfigurationManager.AppSettings["Intervaltime"];
            var getpro = Funs.DB.Base_Project.FirstOrDefault(x => x.ProjectId == this.drpProject.SelectedValue);
            if (getpro != null)
            {
                if (!string.IsNullOrEmpty(getpro.ContractNo))
                {
                    var getSynchroSet = SynchroSetService.GetSynchroSetByUnitId(Const.UnitId_TCC, getpro.ContractNo);
                    if (getSynchroSet != null)
                    {
                        this.txtapiUrl.Text = Funs.RealNameApiUrl;
                        this.txtclientId.Text = getSynchroSet.ClientId;
                        this.txtUserName.Text = getSynchroSet.UserName;
                        this.txtword.Text = getSynchroSet.Password;
                        if (string.IsNullOrEmpty(this.txtintervaltime.Text))
                        {
                            this.txtintervaltime.Text = getSynchroSet.Intervaltime.ToString();
                        }
                    }
                }
                this.lbProjectInfo.Text = "项目:" + getpro.ProjectName + ";项目号:" + getpro.ProjectCode + ";合同号:" + getpro.ContractNo + "。";
            }
        }
        #region 按身份证推送或删除考勤
        /// 
        /// 按身份证推送
        /// 
        /// 
        /// 
        protected void btnPushData_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            string idText = this.txtIdentityCard.Text.Trim();
            if (!string.IsNullOrEmpty(idText))
            {
                string proCode = ProjectService.GetContractNoByProjectId(this.drpProject.SelectedValue);
                var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
                if (getRProjects != null && !string.IsNullOrEmpty(getRProjects.ProCode))
                {
                    var getList = returnCardList();
                    if (getList != null && getList.Count > 0)
                    {
                        foreach (var item in getList)
                        {
                            message += ("项目" + getRProjects.ProCode + "新增" + BLL.SynchroSetService.PushPersonsByIdentityCard(Const.BtnAdd, getRProjects.ProCode, item) ?? "");
                            message += ("|更新" + BLL.SynchroSetService.PushPersonsByIdentityCard(Const.BtnModify, getRProjects.ProCode, item) ?? "");
                        }
                        ShowNotify(message, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    ShowNotify("当前项目还没有与实名制对接!", MessageBoxIcon.Information);
                }
            }
        }
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            var getList = returnCardList();
            if (getList != null && getList.Count > 0)
            {
                foreach (var item in getList)
                {
                    var realPersonInOutNow = Funs.DB.RealName_PersonInOutNow.Where(x => x.IdcardNumber == item);
                    if (realPersonInOutNow.Count() > 0)
                    {
                        Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(realPersonInOutNow);
                        Funs.DB.SubmitChanges();
                    }
                }
            }
        }
        private List returnCardList()
        {
            List getList = new List();
            string idText = this.txtIdentityCard.Text.Trim();
            if (!string.IsNullOrEmpty(idText))
            {
                idText = idText.Replace(",", ",").Replace("(条)", "").Replace(";", ";").Replace("(", "(").Replace(")", ")");
                if (idText.Contains("("))
                {
                    var getData = Funs.GetStrListByStr(idText, ';');
                    foreach (var itemD in getData)
                    {
                        if (!string.IsNullOrEmpty(itemD))
                        {
                            var a = itemD.Split('(');
                            if (a.Count() > 1)
                            {
                                var b = a[1].Split(')');
                                if (b.Count() > 1)
                                {
                                    getList.Add(b[0]);
                                }
                            }
                        }
                    }
                }
                else
                {
                    getList = Funs.GetStrListByStr(idText, ',');
                }                
            }
            return getList;
        }
        #endregion
        /// 
        /// 
        /// 
        /// 
        /// 
        protected void btnDataProcess_Click(object sender, EventArgs e)
        {
            int delCount = 0;
            try
            {
                var result = (from x in Funs.DB.RealName_PersonInOutNow
                              select new
                              {
                                  x.ProjectId,
                                  date = x.ChangeTime.Value.Date,
                                  x.IdcardNumber,
                                  x.IsIn
                              }).Distinct();
                foreach (var item in result)
                {
                    var getDateRecords = from x in Funs.DB.RealName_PersonInOutNow
                                         where x.ProjectId == item.ProjectId && x.ChangeTime.Value >= item.date.Date && x.ChangeTime.Value < item.date.Date.AddDays(1)
                                         && x.IdcardNumber == item.IdcardNumber
                                         select x;
                    var getInRecords = getDateRecords.Where(x => x.IsIn == true);
                    if (getInRecords.Count() > 1)
                    {
                        DateTime? minChangeTime = getInRecords.Min(x => x.ChangeTime);
                        var getDeleteInR = from x in getInRecords
                                           where x.ChangeTime != minChangeTime
                                           select x;
                        if (getDeleteInR.Count() > 0)
                        {
                            delCount += getDeleteInR.Count();
                            Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(getDeleteInR);
                            Funs.DB.SubmitChanges();
                        }
                    }
                    var getOutRecords = getDateRecords.Where(x => x.IsIn == false);
                    if (getOutRecords.Count() > 1)
                    {
                        DateTime? maxChangeTime = getOutRecords.Max(x => x.ChangeTime);
                        var getDeleteOutR = from x in getOutRecords
                                            where x.ChangeTime != maxChangeTime
                                            select x;
                        if (getDeleteOutR.Count() > 0)
                        {
                            delCount += getDeleteOutR.Count();
                            Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(getDeleteOutR);
                            Funs.DB.SubmitChanges();
                        }
                    }
                    if (delCount >= 1000)
                    {
                        Alert.ShowInTop("已清理" + delCount.ToString(), MessageBoxIcon.Success);
                        return;
                    }
                }
                Alert.ShowInTop("已清理" + delCount.ToString(), MessageBoxIcon.Success);
            }
            catch (Exception ex)
            {
                Alert.ShowInTop("已清理" + delCount.ToString(), MessageBoxIcon.Success);
                return;
            }
        }
        protected void btnAllPushData_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            int count = 0;
            string projectId = this.drpProject.SelectedValue;
            string proCode = ProjectService.GetContractNoByProjectId(projectId);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null && !string.IsNullOrEmpty(getRProjects.ProCode))
            {
                var getIdentityCards = (from x in Funs.DB.SitePerson_Person
                                        join v in Funs.DB.ProjectData_TeamGroup on x.TeamGroupId equals v.TeamGroupId
                                        join pu in Funs.DB.Project_ProjectUnit on new { x.UnitId, x.ProjectId } equals new { pu.UnitId, pu.ProjectId }
                                        where x.ProjectId == projectId && x.IsCardNoOK == true && pu.IsSynchro == true
                                              && v.TeamId.HasValue && !x.RealNameAddTime.HasValue 
                                              && x.HeadImage != null && x.HeadImage.Length >0
                                        select x.IdentityCard).Take(100);
                foreach (var item in getIdentityCards)
                {
                    string mes = BLL.SynchroSetService.PushPersonsByIdentityCard(Const.BtnAdd, getRProjects.ProCode, item) ?? "";
                    if (mes.Contains("不合法"))
                    {
                        message += ("身份证号码" + item + "新增失败" + mes);
                    }
                    else
                    {
                        count++;
                    }
                }
            }
            SynchroSetService.InsertRealNamePushLog(projectId, proCode, "单条批量推送(增加)", "完成", null, message, null, null);
            if (string.IsNullOrEmpty(message))
            {
                ShowNotify("同步完成!" + count.ToString() + "条", MessageBoxIcon.Success);
            }
            else
            {
                Alert.ShowInParent("同步完成!" + count.ToString() + "条;" + message, MessageBoxIcon.Warning);
            }
        }
        protected void btnUpdate_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            int count = 0;
            string projectId = this.drpProject.SelectedValue;
            string proCode = ProjectService.GetContractNoByProjectId(projectId);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null && !string.IsNullOrEmpty(getRProjects.ProCode))
            {
                var getIdentityCards = (from x in Funs.DB.SitePerson_Person
                                        join v in Funs.DB.ProjectData_TeamGroup on x.TeamGroupId equals v.TeamGroupId
                                        join pu in Funs.DB.Project_ProjectUnit on new { x.UnitId, x.ProjectId } equals new { pu.UnitId, pu.ProjectId }
                                        where x.ProjectId == projectId
                                          && v.TeamId.HasValue && x.IsCardNoOK == true && v.TeamId.HasValue
                                          && !x.RealNameUpdateTime.HasValue && x.RealNameAddTime.HasValue
                                          && pu.IsSynchro == true
                                        select x.IdentityCard).Take(100);
                foreach (var item in getIdentityCards)
                {
                    string mes = BLL.SynchroSetService.PushPersonsByIdentityCard(Const.BtnModify, getRProjects.ProCode, item) ?? "";
                    if (mes.Contains("不合法"))
                    {
                        message += ("身份证号码" + item + "更新失败" + mes);
                    }
                    else
                    {
                        count++;
                    }
                }
            }
            SynchroSetService.InsertRealNamePushLog(projectId, proCode, "单条批量推送(更新)", "完成", null, message, null, null);
            if (string.IsNullOrEmpty(message))
            {
                ShowNotify("同步完成!" + count.ToString() + "条", MessageBoxIcon.Success);
            }
            else
            {
                Alert.ShowInParent("同步完成!" + count.ToString() + "条;" + message, MessageBoxIcon.Warning);
            }
        }
        protected void btnKQ_Click(object sender, EventArgs e)
        {
            string message = string.Empty;
            int count = 0;
            string projectId = this.drpProject.SelectedValue;
            string proCode = ProjectService.GetContractNoByProjectId(projectId);
            var getRProjects = Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode);
            if (getRProjects != null && !string.IsNullOrEmpty(getRProjects.ProCode))
            {
                try
                {
                    string sucess = string.Empty;
                    string code = string.Empty;
                    string url = Funs.RealNameApiUrl + "/foreignApi/accept/attendance";
                    var getDataLists = from x in Funs.DB.RealName_PersonInOutNow
                                       join p in Funs.DB.SitePerson_Person on x.PersonId equals p.PersonId
                                       where x.IdcardNumber != null && x.IdcardType != null && x.ChangeTime.HasValue
                                       && p.RealNameAddTime.HasValue && x.ProjectId == projectId
                                       select x;
                    foreach (var item in getDataLists)
                    {
                        var listObject = new
                        {
                            list = new
                            {
                                proCode,
                                name = item.Name,
                                idcardType = item.IdcardType,
                                idcardNumber = item.IdcardNumber,
                                checkType = item.CheckType,
                                checkTime = item.ChangeTime,
                                dierction = (item.IsIn == true ? "JINCHANG_JINCHU" : "TUICHANG_JINCHU"),
                                checkWay = item.CheckWay,
                                checkLocation = item.CheckLocation,
                                longitude = item.Longitude,
                                latitude = item.Latitude
                            }
                        };
                        Hashtable newToken = new Hashtable
                    {
                      { "token", SynchroSetService.getaccess_token(proCode) }
                    };
                        var returndata = BLL.APIGetHttpService.OutsideHttp(url, "POST", null, newToken, JsonConvert.SerializeObject(listObject));
                        string mes = string.Empty;
                        if (!string.IsNullOrEmpty(returndata))
                        {
                            JObject obj = JObject.Parse(returndata);
                            mes = obj["message"].ToString();
                            code = obj["code"].ToString();
                            sucess = obj["success"].ToString();
                            if (obj["success"] != null && Convert.ToBoolean(obj["success"].ToString()))
                            {
                                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                                {
                                    var getPersonInOutNow = db.RealName_PersonInOutNow.FirstOrDefault(x => x.PersonInOutId == item.PersonInOutId);
                                    if (getPersonInOutNow != null)
                                    {
                                        //getPersonInOutNow.RealNamePushTime = DateTime.Now;
                                        db.RealName_PersonInOutNow.DeleteOnSubmit(getPersonInOutNow);
                                        db.SubmitChanges();
                                    }
                                }
                            }
                            else
                            {
                                message += item.IdcardNumber + mes ?? "出入记录异常!";
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    ErrLogInfo.WriteLog(ex, "推送考勤数据", "SynchroSetService.PushAttendance");
                    message += ex.Message;
                }
                if (string.IsNullOrEmpty(message))
                {
                    ShowNotify("同步完成!" + count.ToString() + "条", MessageBoxIcon.Success);
                }
                else
                {
                    Alert.ShowInParent("同步完成!" + count.ToString() + "条;" + message, MessageBoxIcon.Warning);
                }
            }
        }       
    }
}