using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BLL
{
    /// 
    /// 人员信息
    /// 
    public static class PersonInOutService
    {
        public static Model.SGGLDB db = Funs.DB;
        /// 
        /// 根据主键获取人员出入场信息
        /// 
        /// 
        /// 
        public static Model.SitePerson_PersonInOut GetPersonInOutById(string PersonInOutId)
        {
            return Funs.DB.SitePerson_PersonInOut.FirstOrDefault(e => e.PersonInOutId == PersonInOutId);
        }
        /// 
        /// 根据人员id 出入时间取记录
        /// 
        /// 人员id
        /// 出入场时间
        /// 出/入 true-入;false-出
        /// 
        public static Model.SitePerson_PersonInOut GetPersonInOutByTimePersonId(string personId, DateTime ChangeTime, bool isIn)
        {
            return Funs.DB.SitePerson_PersonInOut.FirstOrDefault(x => x.PersonId == personId && x.ChangeTime == ChangeTime && x.IsIn == isIn);
        }
        
        /// 
        ///  插入当日出入记录表
        /// 
        /// 
        public static void InsertPersonInOutNowNow(Model.SitePerson_PersonInOutNow PersonInOut)
        {
            Model.SGGLDB db = Funs.DB;        
            var getNow = db.SitePerson_PersonInOutNow.FirstOrDefault(x => x.PersonInOutId == PersonInOut.PersonInOutId);
            if (getNow == null)
            {
                Model.SitePerson_PersonInOutNow newPersonInOut = new Model.SitePerson_PersonInOutNow
                {
                    PersonInOutId = PersonInOut.PersonInOutId,
                    ProjectId = PersonInOut.ProjectId,
                    UnitId = PersonInOut.UnitId,
                    PersonId = PersonInOut.PersonId,
                    IsIn = PersonInOut.IsIn,
                    ChangeTime = PersonInOut.ChangeTime,
                    WorkPostId = PersonInOut.WorkPostId,
                    PostType = PersonInOut.PostType,
                    ProCode = PersonInOut.ProCode,
                    Name = PersonInOut.Name,
                    IdcardType = PersonInOut.IdcardType ?? "SHENFEN_ZHENGJIAN",
                    IdcardNumber = PersonInOut.IdcardNumber,
                    CheckType = "ZHENGCHANG_KAOQINLEIBIE",
                    CheckWay = "FACE_FANGSHI",
                };
                db.SitePerson_PersonInOutNow.InsertOnSubmit(newPersonInOut);
                db.SubmitChanges();
                /// 监理 业主 不进入
                var getPUnit = db.Project_ProjectUnit.FirstOrDefault(x => x.ProjectId == newPersonInOut.ProjectId && x.UnitId == newPersonInOut.UnitId);
                if (getPUnit.UnitType != Const.ProjectUnitType_3 && getPUnit.UnitType != Const.ProjectUnitType_4)
                {
                    var getRealNameP = db.RealName_Project.FirstOrDefault(x => x.ProCode == newPersonInOut.ProCode);
                    if (getRealNameP != null)
                    {
                        Model.RealName_PersonInOutNow newR = new Model.RealName_PersonInOutNow
                        {
                            PersonInOutId = newPersonInOut.PersonInOutId,
                            ProjectId = newPersonInOut.ProjectId,
                            UnitId = newPersonInOut.UnitId,
                            PersonId = newPersonInOut.PersonId,
                            IsIn = newPersonInOut.IsIn,
                            ChangeTime = newPersonInOut.ChangeTime,
                            WorkPostId = newPersonInOut.WorkPostId,
                            PostType = newPersonInOut.PostType,
                            ProCode = newPersonInOut.ProCode,
                            Name = newPersonInOut.Name,
                            IdcardType = newPersonInOut.IdcardType ?? "SHENFEN_ZHENGJIAN",
                            IdcardNumber = newPersonInOut.IdcardNumber,
                            CheckType = "ZHENGCHANG_KAOQINLEIBIE",
                            CheckWay = "FACE_FANGSHI",
                        };
                        db.RealName_PersonInOutNow.InsertOnSubmit(newR);
                        db.SubmitChanges();
                    }
                }
            }
          
            var getLastList = from x in db.SitePerson_PersonInOutNow
                              where x.ChangeTime <= PersonInOut.ChangeTime.Value.AddHours(-48)
                              select x;
            if (getLastList.Count() > 0)
            {
                db.SitePerson_PersonInOutNow.DeleteAllOnSubmit(getLastList);
                db.SubmitChanges();
            }
        }
        /// 
        /// 根据人员主键删除一个人员出入场记录
        /// 
        /// 
        public static void DeletePersonInOutByPersonId(string personId)
        {
            Model.SGGLDB db = Funs.DB;
            var personInOut = from x in db.SitePerson_PersonInOut where x.PersonId == personId select x;
            if (personInOut.Count() > 0)
            {
                db.SitePerson_PersonInOut.DeleteAllOnSubmit(personInOut);              
                db.SubmitChanges();
            }
            var rpersonInOut = from x in db.RealName_PersonInOutNow where x.PersonId == personId select x;
            if (rpersonInOut.Count() > 0)
            {
                db.RealName_PersonInOutNow.DeleteAllOnSubmit(rpersonInOut);
                db.SubmitChanges();
            }
        }
        
        /// 
        /// 身份证号码发生变化时 修改实名制出入记录
        /// 
        /// 
        public static void UpdateRealNameInOut(string personId, string oldCardNo, string newIdCardNo)
        {
            Model.SGGLDB db = Funs.DB;
            var personInOuts = from x in db.RealName_PersonInOutNow
                               where x.PersonId == personId && x.IdcardNumber == oldCardNo
                               select x;
            if (personInOuts.Count() > 0)
            {
                foreach (var item in personInOuts)
                {
                    item.IdcardNumber = newIdCardNo;
                    db.SubmitChanges();
                }
            }
        }
        /// 
        ///  获取出入记录人工时
        /// 
        /// 
        public static List getWorkPostStatistic(List getAllPersonInOutList)
        {
            Model.SGGLDB db = Funs.DB;
            List reports = new List();           
          
            var getUnitIdList = getAllPersonInOutList.Select(x => x.UnitId).Distinct();
            foreach (var uitem in getUnitIdList)
            {
                var getU = getAllPersonInOutList.Where(x => x.UnitId == uitem);
                var getWorkPostIdList = getU.Select(x => x.WorkPostId).Distinct();
                foreach (var witem in getWorkPostIdList)
                {
                    var getW = getU.Where(x => x.WorkPostId == witem);
                    Model.WorkPostStatisticItem newWItem = new Model.WorkPostStatisticItem
                    {
                        ID = SQLHelper.GetNewID(),
                        UnitId = uitem,
                        UnitName = UnitService.GetUnitNameByUnitId(uitem),
                        WorkPostId = witem,
                        WorkPostName = WorkPostService.getWorkPostNameById(witem),
                        PersonCount = getW.Select(x => x.PersonId).Distinct().Count(),
                        UnitWorkPostID = uitem + "|" + witem,
                    };
                    reports.Add(newWItem);
                }
            }
            return reports;
        }
    }
}