using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BLL
{
    /// 
    /// 考勤
    /// 
    public static class DoorServerService
    {
        public static Model.SGGLDB db = Funs.DB;
        /// 
        /// 根据主键获取事故类型
        /// 
        /// 
        /// 
        public static Model.T_d_EmployInOutRecord GetEmployInOutRecordById(string id)
        {
            return Funs.DB.T_d_EmployInOutRecord.FirstOrDefault(e => e.NewID == id);
        }
        #region 根据出入记录 写入考勤记录
        /// 
        ///  根据出入记录 写入考勤记录
        /// 
        public static void InsertEmployInOutRecord(Model.t_d_facerecordItem drecord,Model.SitePerson_Person getPerson)
        {
            if (drecord.DateTimeRecord.HasValue && !string.IsNullOrEmpty(getPerson.PersonName))
            {
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    Model.T_d_EmployInOutRecord newInOutRecord = new Model.T_d_EmployInOutRecord
                    {
                        NewID = SQLHelper.GetNewID(),
                        ProjectId = drecord.ProjectId,
                        InstallationName = ProjectService.GetProjectNameByProjectId(drecord.ProjectId),
                        RecordDate = drecord.DateTimeRecord.Value.Date,
                        IDCardNo = drecord.IDCardNo,
                    };
                    ////获取人员                 
                    if (getPerson != null)
                    {
                        newInOutRecord.UnitId = getPerson.UnitId;
                        newInOutRecord.UnitName = UnitService.GetUnitNameByUnitId(getPerson.UnitId);
                        newInOutRecord.DepartmentID = getPerson.TeamGroupId;
                        newInOutRecord.DepartName = TeamGroupService.GetTeamGroupNameByTeamGroupId(getPerson.TeamGroupId);
                        newInOutRecord.EmployNO = getPerson.CardNo;
                        newInOutRecord.EmployName = getPerson.PersonName;
                        newInOutRecord.Nation = getPerson.Nation;
                        newInOutRecord.NationName = BasicDataService.GetDictNameByDictCode(getPerson.Nation);
                        newInOutRecord.PostId = getPerson.WorkPostId;
                        newInOutRecord.PostName = WorkPostService.getWorkPostNameById(getPerson.WorkPostId);
                    }
                    else
                    {
                        newInOutRecord.EmployName = drecord.EmployName;
                        newInOutRecord.UnitId = null;
                        newInOutRecord.PostId = null;
                    }
                    #region 上下班时间
                    ///上午上班 8
                    DateTime TWorkIn1 = drecord.DateTimeRecord.Value.Date.AddHours(8);
                    ///上午下班 12:30
                    DateTime TOffDuty1 = drecord.DateTimeRecord.Value.Date.AddHours(12).AddMinutes(30);
                    ///下午上班 1:30
                    DateTime TWorkIn2 = drecord.DateTimeRecord.Value.Date.AddHours(13).AddMinutes(30);
                    ///下午下班 7
                    DateTime TOffDuty2 = drecord.DateTimeRecord.Value.Date.AddHours(19);
                    if (drecord.InOrOut == "进门")
                    {
                        ///上午上班
                        if (drecord.DateTimeRecord < TOffDuty1)
                        {
                            newInOutRecord.WorkIn1 = drecord.DateTimeRecord;
                        }
                        else if (drecord.DateTimeRecord < TOffDuty2)
                        {
                            newInOutRecord.WorkIn2 = drecord.DateTimeRecord;
                        }
                        else
                        {
                            newInOutRecord.WorkIn3 = drecord.DateTimeRecord;
                        }
                    }
                    else
                    {
                        ///上午下班
                        if (drecord.DateTimeRecord < TWorkIn2)
                        {
                            newInOutRecord.OffDuty1 = drecord.DateTimeRecord;
                        }
                        else if (drecord.DateTimeRecord < TOffDuty2.AddHours(1))
                        {
                            newInOutRecord.OffDuty2 = drecord.DateTimeRecord;
                        }
                        else
                        {
                            newInOutRecord.OffDuty3 = drecord.DateTimeRecord;
                        }
                    }
                    #endregion
                    bool isInsert = false;
                    var getInOutRecord = db.T_d_EmployInOutRecord.FirstOrDefault(x => x.ProjectId == drecord.ProjectId && x.IDCardNo == drecord.IDCardNo && x.RecordDate == drecord.DateTimeRecord.Value.Date);
                    if (getInOutRecord == null)
                    {
                        isInsert = true;
                    }
                    if (isInsert)
                    {
                        newInOutRecord.ManHours = 4;
                        newInOutRecord.ManOverHours = 0;
                        db.T_d_EmployInOutRecord.InsertOnSubmit(newInOutRecord);
                        db.SubmitChanges();
                    }
                    else
                    {
                        #region 计算人工时
                        if (newInOutRecord.WorkIn1.HasValue && (!getInOutRecord.WorkIn1.HasValue || getInOutRecord.WorkIn1 > newInOutRecord.WorkIn1))
                        {
                            getInOutRecord.WorkIn1 = newInOutRecord.WorkIn1;
                        }
                        if (newInOutRecord.WorkIn2.HasValue && (!getInOutRecord.WorkIn2.HasValue || getInOutRecord.WorkIn2 > newInOutRecord.WorkIn2))
                        {
                            getInOutRecord.WorkIn2 = newInOutRecord.WorkIn2;
                        }
                        if (newInOutRecord.WorkIn3.HasValue && (!getInOutRecord.WorkIn3.HasValue || getInOutRecord.WorkIn3 > newInOutRecord.WorkIn3))
                        {
                            getInOutRecord.WorkIn3 = newInOutRecord.WorkIn3;
                        }
                        if (newInOutRecord.OffDuty1.HasValue && (!getInOutRecord.OffDuty1.HasValue || getInOutRecord.OffDuty1 < newInOutRecord.OffDuty1))
                        {
                            getInOutRecord.OffDuty1 = newInOutRecord.OffDuty1;
                        }
                        if (newInOutRecord.OffDuty2.HasValue && (!getInOutRecord.OffDuty2.HasValue || getInOutRecord.OffDuty2 < newInOutRecord.OffDuty2))
                        {
                            getInOutRecord.OffDuty2 = newInOutRecord.OffDuty2;
                        }
                        if (newInOutRecord.OffDuty3.HasValue && (!getInOutRecord.OffDuty3.HasValue || getInOutRecord.OffDuty3 < newInOutRecord.OffDuty3))
                        {
                            getInOutRecord.OffDuty3 = newInOutRecord.OffDuty3;
                        }
                        int m1 = 0;
                        if (getInOutRecord.WorkIn1.HasValue || getInOutRecord.OffDuty1.HasValue)
                        {
                            m1 = 240;
                            if (getInOutRecord.WorkIn1.HasValue && getInOutRecord.OffDuty1.HasValue && getInOutRecord.OffDuty1> getInOutRecord.WorkIn1)
                            {
                                m1 = Convert.ToInt32((getInOutRecord.OffDuty1 - getInOutRecord.WorkIn1).Value.TotalMinutes);
                                if (m1 < 0)
                                {
                                    m1 = 0;
                                }
                            }
                        }
                        int m2 = 0;
                        if (getInOutRecord.WorkIn2.HasValue || getInOutRecord.OffDuty2.HasValue)
                        {
                            m2 = 240;
                            if (getInOutRecord.WorkIn2.HasValue && getInOutRecord.OffDuty2.HasValue && getInOutRecord.OffDuty2 > getInOutRecord.WorkIn2)
                            {
                                m2 = Convert.ToInt32((getInOutRecord.OffDuty2 - getInOutRecord.WorkIn2).Value.TotalMinutes);
                                if (m2 < 0)
                                {
                                    m2 =0;
                                }
                            }
                        }
                        int m3 = 0;
                        if (getInOutRecord.WorkIn3.HasValue || getInOutRecord.OffDuty3.HasValue)
                        {
                            m3 = 240;
                            if (getInOutRecord.WorkIn3.HasValue && getInOutRecord.OffDuty3.HasValue && getInOutRecord.OffDuty3 > getInOutRecord.WorkIn3) 
                            {
                                m3 = Convert.ToInt32((getInOutRecord.OffDuty3 - getInOutRecord.WorkIn3).Value.TotalMinutes);
                                if (m3 < 0)
                                {
                                    m3 =0;
                                }
                            }
                        }
                        #endregion
                        getInOutRecord.ManHours = Convert.ToInt32(Math.Ceiling((m1 + m2 + m3) * 1.0 / 60));
                        getInOutRecord.ManOverHours = Convert.ToInt32(Math.Ceiling(m3 * 1.0 / 60));
                        db.SubmitChanges();
                    }
                }
            }
        }
        #endregion
        #region 获取单位信息
        /// 
        ///  获取单位信息
        /// 
        ///             
        public static Model.T_d_department GetSupDep(string projectId, int? departmentID, int ParentID)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDep =db.T_d_department.FirstOrDefault(x => x.ProjectId == projectId && x.DepartmentID == departmentID);
                if (getDep != null)
                {
                    if (getDep.ParentID == ParentID)
                    {
                        return getDep;
                    }
                    else
                    {
                        return GetSupDep(projectId, getDep.ParentID, ParentID);
                    }
                }
                else
                {
                    return null;
                }
            }
        }
        #endregion
    }
}