username@email.com
2023-07-25 ded7ee4841b2b6006e00dde2da08b6cb6d81feed
zhengcaioa/zhengcaioa/Controllers/AdmManagement/SigninController.cs
@@ -11,6 +11,7 @@
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json.Linq;
using System.Transactions;
using System.Runtime.InteropServices;
namespace zhengcaioa.Controllers.AdmManagement
{
@@ -20,14 +21,26 @@
        private readonly IAdmSigninService _signinService;
        private readonly ISysAttachmentService _sysAttachmentService;
        private readonly IAdmAttendanceRuleService _attendanceRuleService;
        private readonly ILiaotianService _liaotianService;
        private readonly IWfRunProcessService _wfRunProcessService;
        private readonly IWfHistoryService _wfHistoryService;
        private readonly IWfNeeddeelService _wfNeeddeelService;
        private readonly IPltPageService _pltPageService;
        [CheckLogin]
        public SigninController(ILogger<SigninController> logger, IAdmSigninService signinService, ISysAttachmentService sysAttachmentService
            , IAdmAttendanceRuleService attendanceRuleService)
            , IAdmAttendanceRuleService attendanceRuleService, ILiaotianService liaotianService, IWfRunProcessService wfRunProcessService
            , IWfHistoryService wfHistoryService, IWfNeeddeelService wfNeeddeelService
             , IPltPageService pltPageService)
        {
            _logger = logger;
            _signinService = signinService;
            _sysAttachmentService = sysAttachmentService;
            _attendanceRuleService = attendanceRuleService;
            _liaotianService = liaotianService;
            _wfRunProcessService = wfRunProcessService;
            _wfHistoryService = wfHistoryService;
            _wfNeeddeelService = wfNeeddeelService;
            _pltPageService = pltPageService;
        }
        #region 考勤签到打卡
@@ -83,12 +96,88 @@
        /// <param name="signinType">10早上上班  11早上下班  20下午上班   21下午下班   30加班上班  31加班下班</param>
        /// <returns></returns>
        [CheckLogin]
        public string Save(string id,int signinType)
        {
            ResultEntity resultEntity = _signinService.save(id, signinType);
        public string Save(string id,int signinType,string mac)
        {
            ResultEntity resultEntity = new ResultEntity();
            resultEntity.Result = false;
            try
            {
                if (string.IsNullOrEmpty(mac))
                {
                    resultEntity = _signinService.save(id, signinType);
                }
                else
                {
                    var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
                    if(curentuser.IpMac == mac)
                    {
                        //var mac = GetClientMAC(GetClientIP());
                    }
                    else
                    {
                        resultEntity.Message = "打卡电脑检查不匹配。";
                    }
                }
            }
            catch(Exception er)
            { }
            return JsonConvert.SerializeObject(resultEntity);
        }
        [DllImport("Iphlpapi.dll")]
        private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
        [DllImport("Ws2_32.dll")]
        private static extern Int32 inet_addr(string ip);
        private string GetClientIP()
        {
            HttpContextAccessor context = new HttpContextAccessor();
            var ip = context.HttpContext?.Connection.RemoteIpAddress.ToString();
            var mac = GetClientMAC(ip);
            var str = "IP:" + ip + "   ,MAC:" + mac;
            return str;
        }
        private string GetClientMAC(string ip)
        {
            string mac_dest = string.Empty;
            try
            {
                Int32 ldest = inet_addr(ip); //目的地的ip
                Int32 lhost = inet_addr(""); //服务器的ip
                Int64 macinfo = new Int64();
                Int32 len = 6;
                int res = SendARP(ldest, 0, ref macinfo, ref len);
                string mac_src = macinfo.ToString("X");
                while (mac_src.Length < 12)
                {
                    mac_src = mac_src.Insert(0, "0");
                }
                for (int i = 0; i < 11; i++)
                {
                    if (0 == (i % 2))
                    {
                        if (i == 10)
                        {
                            mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2));
                        }
                        else
                        {
                            mac_dest = "-" + mac_dest.Insert(0, mac_src.Substring(i, 2));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return mac_dest;
        }
        /// <summary>
        /// 取得今天签到信息
@@ -115,21 +204,185 @@
            search.userId = curentuser.Id;
            return JsonConvert.SerializeObject(_signinService.SearchByPaging(search));
        }
        /// <summary>
        /// 我的考勤记录
        /// </summary>
        /// <returns></returns>
        [CheckLogin]
        public IActionResult SigninAll(string id)
        {
            JArray jar = new JArray();
            for (var i = 1; i <= 12; i++)
            {
                var jo = string.Format("\"code\":{0},  \"label\":\"{1}月\" ", i, i);
                jar.Add(JObject.Parse("{" + jo + "}"));
            }
            ViewBag.month = jar;
            JArray Year = new JArray();
            for (var i = -1; i < 2; i++)
            {
                var jo = string.Format("\"code\":{0},  \"label\":\"{0}年\" ", DateTime.Now.Year + i);
                Year.Add(JObject.Parse("{" + jo + "}"));
            }
            ViewBag.year = Year;
            ViewBag.userid = id;
            List<ActionEntity> actionlist = new List<ActionEntity>();
            ActionEntity actionEntity = new ActionEntity();
            actionEntity.OpenType = 0;
            actionEntity.ActionUrl = "";
            actionEntity.ActionFun = "Search";
            actionEntity.PageIco = "fa fa-search";
            actionEntity.ActionName = "查询";
            actionlist.Add(actionEntity);
            ViewData["ActionInfo"] = actionlist;
            return View();
        }
        /// <summary>
        /// 取得考勤记录
        /// </summary>
        /// <returns></returns>
        [CheckLogin]
        public string GetSigninListAll(AdmSignInDTOSearch search)
        {
            //var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            //search.userId = curentuser.Id;
            return JsonConvert.SerializeObject(_signinService.SearchByPaging(search));
        }
        #endregion
        #region 请假与销假
         public IActionResult AskLeave(string signinId)
        public IActionResult AskLeave(string id="", string StratTimeName = "", string EndTimeName = "")
        {
            ViewBag.SigninId = signinId;
            AdmAskLeaveDTO admAskLeaveDTO = _signinService.GetAskLeave(signinId);
            if (admAskLeaveDTO.StratTime.Equals(DateTime.MinValue))
            var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            ViewData["curentuser"] = curentuser;
            AdmAttendanceRuleDTO admAttendanceRuleDTO = _attendanceRuleService.Get("");
            AdmAskLeaveDTO admAskLeaveDTO = new AdmAskLeaveDTO();
            if (!string.IsNullOrEmpty(id))
            {
                admAskLeaveDTO.StratTime = DateTime.Now;
                admAskLeaveDTO = _signinService.GetAskLeave(id);
                admAskLeaveDTO.StratTimeName = admAskLeaveDTO.StratTime.Value.ToString("yyyy-MM-dd HH:mm");
                admAskLeaveDTO.EndTimeName = admAskLeaveDTO.EndTime.Value.ToString("yyyy-MM-dd HH:mm");
            }
            if (admAskLeaveDTO.EndTime.Equals(DateTime.MinValue))
            else
            {
                admAskLeaveDTO.EndTime = DateTime.Now;
                admAskLeaveDTO.CreaterName = curentuser.UserName;
                admAskLeaveDTO.Tittle = "请假申请(" + curentuser.UserName + ")";
                if (!string.IsNullOrWhiteSpace(StratTimeName))
                {
                    DateTime StratTimeName1;
                    if (DateTime.TryParse(StratTimeName, out StratTimeName1))
                    {
                        admAskLeaveDTO.StratTimeName = StratTimeName1.AddHours(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
                    }
                }
                else
                {
                    admAskLeaveDTO.StratTimeName = DateTime.Now.Date.AddHours(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
                }
                if (!string.IsNullOrWhiteSpace(EndTimeName))
                {
                    DateTime EndTimeName1;
                    if (DateTime.TryParse(EndTimeName, out EndTimeName1))
                    {
                        admAskLeaveDTO.EndTimeName = EndTimeName1.AddHours(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
                    }
                }
                else
                {
                    admAskLeaveDTO.EndTimeName = DateTime.Now.Date.AddHours(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
                }
                AdmAskLeaveDTO admAsk = jisianChecktime(DateTime.Parse(admAskLeaveDTO.StratTimeName), DateTime.Parse(admAskLeaveDTO.EndTimeName));
                admAskLeaveDTO.LaveDay = admAsk.LaveDay;
                admAskLeaveDTO.LavehHour = admAsk.LavehHour;
            }
            ViewData.Model = admAskLeaveDTO;
            ResultDataEntity<SysAttachmentDTO> results = new ResultDataEntity<SysAttachmentDTO>();
            if (!string.IsNullOrEmpty(id))
            {
                SysAttachmentDTOSearch searchEntity = new SysAttachmentDTOSearch();
                searchEntity.page = 1;
                searchEntity.rows = 1000;
                searchEntity.AttObj = "AskLeave";
                searchEntity.AttObjid = id;
                results = _sysAttachmentService.SearchByPaging(searchEntity);
            }
            ViewBag.attachment = results;
            ViewData["Lavetype"] = _liaotianService.GetSYScode("ADM_AskLeave", "Lavetype");
            string shifoubiaoji = "A";
            string sifoudangqian = "A";
            string dangqianbuzhou = "提交";
            var lishiyijian = new  List<WfHistoryDTO>();
            //流程相关
            if (!string.IsNullOrEmpty(id))
            {
              var wfRunProcessDTO  =  _wfRunProcessService.GetList(id,"01").FirstOrDefault();
                if (wfRunProcessDTO == null)
                {
                    shifoubiaoji = "D";
                    sifoudangqian = "D";
                }
                else
                {
                    dangqianbuzhou = wfRunProcessDTO.Step;
                    //查询审批进度
                    lishiyijian = _wfHistoryService.GetListshenpi(wfRunProcessDTO.Id);
                    if(wfRunProcessDTO.Step != "提交")
                    {
                        shifoubiaoji = "D";
                    }
                    //查询待办
                    var chaxundaiban = _wfNeeddeelService.GetListTracking(wfRunProcessDTO.Id, wfRunProcessDTO.Step).Where(x=>x.DeelUserId == curentuser.Id).ToList();
                    if(chaxundaiban!=null && chaxundaiban.Count > 0)
                    {
                        sifoudangqian = "A";
                    }
                    else
                    {
                        sifoudangqian = "D";
                    }
                }
            }
            ViewBag.shifoubiaoji = shifoubiaoji;
            ViewBag.sifoudangqian = sifoudangqian;
            ViewBag.lishiyijian = lishiyijian;
            ViewBag.dangqianbuzhou = dangqianbuzhou;
            return View();
        }
@@ -141,49 +394,601 @@
            var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            ViewData["curentuser"] = curentuser;
            admAsk.RecStatus = "A";
            if (String.IsNullOrEmpty(admAsk.Id))
            ResultEntity resultEntity = new ResultEntity();
            resultEntity.Result = false;
            if(admAsk.Step == "提交")
            {
                admAsk.Creater = curentuser.Id;
                admAsk.Createtime = DateTime.Now;
                //请假时间不能重叠
              //var qingjia  =   _signinService.GetAskLeaveChongdie(curentuser.Id, admAsk.StratTime.Value, admAsk.EndTime.Value);
              //  if (qingjia.Count > 0)
              //  {
              //      resultEntity.Result = false;
              //      resultEntity.Message = "该时间段已经有请假!";
              //      return JsonConvert.SerializeObject(resultEntity);
              //  }
            ////请假超过三天,必须提前三天以上请假!
            //    if (admAsk.LaveDay.Value >= 3 && admAsk.StratTime.Value.Date < DateTime.Now.Date.AddDays(3))
            //    {
            //        resultEntity.Result = false;
            //        resultEntity.Message = "请假超过三天,必须提前三天以上请假!";
            //        return JsonConvert.SerializeObject(resultEntity);
            //    }
                //请假超过七天,必须提前七天以上请假!
                if (admAsk.LaveDay.Value >= 7 && admAsk.StratTime.Value.Date < DateTime.Now.Date.AddDays(7))
                {
                    resultEntity.Result = false;
                    resultEntity.Message = "请假超过七天,必须提前七天以上请假!";
                    return JsonConvert.SerializeObject(resultEntity);
                }
            }
            else
            if (String.IsNullOrEmpty(admAsk.Id))
                {
                    admAsk.Creater = curentuser.Id;
                    admAsk.Createtime = DateTime.Now;
                }
                else
                {
                    admAsk.Modifier = curentuser.Id;
                    admAsk.Modifytime = DateTime.Now;
                }
            using (TransactionScope scope = new TransactionScope())
            {
                admAsk.Modifier = curentuser.Id;
                admAsk.Modifytime = DateTime.Now;
                if (admAsk.Step == "提交")
                {
                    resultEntity = _signinService.SaveAskLeave(admAsk);
                    if (resultEntity.Result == false)
                    {
                        return JsonConvert.SerializeObject(resultEntity);
                    }
                    string[] Filepaths = admAsk.Filepath;
                    if (Filepaths != null && Filepaths.Length > 0)
                    {
                        for (int i = 0; i < Filepaths.Length; i++)
                        {
                            if (string.IsNullOrEmpty(admAsk.attachmentid[i]))
                            {
                                SysAttachmentDTO sysAttachmentDTO = new SysAttachmentDTO();
                                //sysAttachmentDTO.Id =
                                sysAttachmentDTO.AttObj = "AskLeave";
                                sysAttachmentDTO.AttObjid = admAsk.Id;
                                sysAttachmentDTO.Filefullname = admAsk.Filefullname[i];
                                sysAttachmentDTO.Filepath = admAsk.Filepath[i];
                                sysAttachmentDTO.Creater = curentuser.Id;
                                sysAttachmentDTO.Modifier = curentuser.Id;
                                sysAttachmentDTO.Createtime = DateTime.Now;
                                sysAttachmentDTO.Modifytime = sysAttachmentDTO.Createtime;
                                resultEntity = _sysAttachmentService.save(sysAttachmentDTO);
                                if (resultEntity.Result == false)
                                {
                                    return JsonConvert.SerializeObject(resultEntity);
                                }
                            }
                        }
                    }
                }
                //发起流程相关
                resultEntity = _wfRunProcessService.WfAskLeave(admAsk.Id, admAsk.Step, admAsk.Tongguojujue, curentuser.Id, admAsk.Content, admAsk.Tittle, "v1");
                scope.Complete();
            }
             ResultEntity resultEntity = _signinService.SaveAskLeave(admAsk);
            return JsonConvert.SerializeObject(resultEntity);
             
        }
        public IActionResult AskLeaveOff(string signinId)
        [CheckLogin]
        [HttpPost]
        public string Checktime(DateTime StratTime, DateTime EndTime)
        {
            ViewBag.SigninId = signinId;
            AdmAskLeaveOffDTO admAskLeaveOffDTO = _signinService.GetAskLeaveOff(signinId);
            if (admAskLeaveOffDTO.StratTime.Equals(DateTime.MinValue))
            ResultEntity<AdmAskLeaveDTO> resultEntity = new ResultEntity<AdmAskLeaveDTO>();
            if (EndTime<= StratTime)
            {
                admAskLeaveOffDTO.StratTime = DateTime.Now;
                resultEntity.Result = false;
                resultEntity.Message = "开始时间不能大于结束时间";
                return JsonConvert.SerializeObject(resultEntity);
            }
            if (admAskLeaveOffDTO.EndTime.Equals(DateTime.MinValue))
            AdmAskLeaveDTO admAsk = jisianChecktime( StratTime, EndTime);
            resultEntity.Result = true;
            resultEntity.DataInfo = admAsk;
            return JsonConvert.SerializeObject(resultEntity);
        }
        public AdmAskLeaveDTO jisianChecktime(DateTime StratTime, DateTime EndTime)
        {
            //string dateDiff = null;
            AdmAttendanceRuleDTO admAttendanceRuleDTO =  _attendanceRuleService.Get("");
            var admAttendanceRulesDtlDTOs = _attendanceRuleService.GetDtlList("");
            var jiejiari = admAttendanceRulesDtlDTOs.Where(x=>x.Name== "jiejiari").ToList();
            var tiaoxiuri = admAttendanceRulesDtlDTOs.Where(x => x.Name == "tiaoxiuri").ToList();
            var jiabanri = admAttendanceRulesDtlDTOs.Where(x => x.Name == "jiabanri").ToList();
            //每天的考勤时间点
            string[] WorkingStart = admAttendanceRuleDTO.WorkingStart.Split('.');
            int WorkingStarthour = int.Parse(WorkingStart[0]);
            int WorkingStartmin = int.Parse(WorkingStart[1]);
            string[] WorkingEnd = admAttendanceRuleDTO.WorkingEnd.Split('.');
            int WorkingEndhour = int.Parse(WorkingEnd[0]);
            int WorkingEndmin = int.Parse(WorkingEnd[1]);
            string[] OffworkStart = admAttendanceRuleDTO.OffworkStart.Split('.');
            int OffworkStarthour = int.Parse(OffworkStart[0]);
            int OffworkStartmin = int.Parse(OffworkStart[1]);
            string[] OffworkEnd = admAttendanceRuleDTO.OffworkEnd.Split('.');
            int OffworkEndhour = int.Parse(OffworkEnd[0]);
            int OffworkEndmin = int.Parse(OffworkEnd[1]);
            //请假开始时间上班时间
            DateTime StratTimeWorkingStart = StratTime.Date.AddHours(WorkingStarthour).AddMinutes(WorkingStartmin);
            DateTime StratTimeWorkingEnd = StratTime.Date.AddHours(WorkingEndhour).AddMinutes(WorkingEndmin);
            DateTime StratTimeOffworkStart = StratTime.Date.AddHours(OffworkStarthour).AddMinutes(OffworkStartmin);
            DateTime StratTimeOffworkEnd = StratTime.Date.AddHours(OffworkEndhour).AddMinutes(OffworkEndmin);
            //请假结束时间上班时间
            DateTime EndTimeWorkingStart = EndTime.Date.AddHours(WorkingStarthour).AddMinutes(WorkingStartmin);
            DateTime EndTimeWorkingEnd = EndTime.Date.AddHours(WorkingEndhour).AddMinutes(WorkingEndmin);
            DateTime EndTimeOffworkStart = EndTime.Date.AddHours(OffworkStarthour).AddMinutes(OffworkStartmin);
            DateTime EndTimeOffworkEnd = EndTime.Date.AddHours(OffworkEndhour).AddMinutes(OffworkEndmin);
            //上班时间
            TimeSpan shangwu = StratTimeWorkingEnd.Subtract(StratTimeWorkingStart);
            TimeSpan xiawu = StratTimeOffworkEnd.Subtract(StratTimeOffworkStart);
            int shangbanshijian = shangwu.Hours * 60 + shangwu.Minutes + xiawu.Hours * 60 + xiawu.Minutes;
            int LavehTime = 0;
            TimeSpan ts = EndTime.Subtract(StratTime);
            for(int i=0;i<= ts.Days;i++)
            {
                admAskLeaveOffDTO.EndTime = DateTime.Now;
                if (i == 0)
                {
                    //是否上班日期
                    if ((int)StratTime.Date.DayOfWeek >= admAttendanceRuleDTO.WeekStart && (int)StratTime.Date.DayOfWeek <= admAttendanceRuleDTO.WeekEnd)
                    {
                        //是否节假日
                        if (jiejiari.Exists(x => x.ValueStart <= StratTime.Date && x.ValueEnd >= StratTime.Date))
                        {
                            LavehTime += 0;
                        }
                        else
                        {
                            if (StratTime <= StratTimeWorkingStart)
                            {
                                LavehTime += shangbanshijian;
                            }
                            else if (StratTime <= StratTimeWorkingEnd)
                            {
                                TimeSpan shangwu1 = StratTimeWorkingEnd.Subtract(StratTime);
                                TimeSpan xiawu1 = StratTimeOffworkEnd.Subtract(StratTimeOffworkStart);
                                LavehTime += shangwu1.Hours * 60 + shangwu1.Minutes + xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (StratTime <= StratTimeOffworkStart)
                            {
                                TimeSpan xiawu1 = StratTimeOffworkEnd.Subtract(StratTimeOffworkStart);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (StratTime <= StratTimeOffworkEnd)
                            {
                                TimeSpan xiawu1 = StratTimeOffworkEnd.Subtract(StratTime);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                        }
                    }
                    else
                    {
                        //是否调休日  调休日需要上班
                        if (tiaoxiuri.Exists(x => x.ValueStart <= StratTime.Date && x.ValueEnd >= StratTime.Date)
                            || jiabanri.Exists(x => x.ValueStart <= StratTime.Date && x.ValueEnd >= StratTime.Date))
                        {
                            if (StratTime <= StratTimeWorkingStart)
                            {
                                LavehTime += shangbanshijian;
                            }
                            else if (StratTime <= StratTimeWorkingEnd)
                            {
                                TimeSpan shangwu1 = StratTimeWorkingEnd.Subtract(StratTime);
                                TimeSpan xiawu1 = StratTimeOffworkEnd.Subtract(StratTimeOffworkStart);
                                LavehTime += shangwu1.Hours * 60 + shangwu1.Minutes + xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (StratTime <= StratTimeOffworkStart)
                            {
                                TimeSpan xiawu1 = StratTimeOffworkEnd.Subtract(StratTimeOffworkStart);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (StratTime <= StratTimeOffworkEnd)
                            {
                                TimeSpan xiawu1 = StratTimeOffworkEnd.Subtract(StratTime);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                        }
                        else
                        {
                            LavehTime += 0;
                        }
                    }
                }
                if(i == ts.Days)
                {
                    //是否上班日期
                    if ((int)EndTime.Date.DayOfWeek >= admAttendanceRuleDTO.WeekStart && (int)EndTime.Date.DayOfWeek <= admAttendanceRuleDTO.WeekEnd)
                    {
                        //是否节假日
                        if (jiejiari.Exists(x => x.ValueStart <= EndTime.Date && x.ValueEnd >= EndTime.Date))
                        {
                            LavehTime += 0;
                        }
                        else
                        {
                            if ( EndTime >= EndTimeOffworkEnd)
                            {
                                LavehTime += shangbanshijian;
                            }
                            else if (EndTime >= EndTimeOffworkStart)
                            {
                                TimeSpan shangwu1 = EndTimeWorkingEnd.Subtract(EndTimeWorkingStart);
                                TimeSpan xiawu1 = EndTime.Subtract(EndTimeOffworkStart);
                                LavehTime += shangwu1.Hours * 60 + shangwu1.Minutes + xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (EndTime >= EndTimeWorkingEnd)
                            {
                                TimeSpan xiawu1 = EndTimeWorkingEnd.Subtract(EndTimeWorkingStart);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (EndTime >= EndTimeWorkingStart)
                            {
                                TimeSpan xiawu1 = EndTime.Subtract(EndTimeWorkingStart);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                        }
                    }
                    else
                    {
                        //是否调休日  调休日需要上班
                        if (tiaoxiuri.Exists(x => x.ValueStart <= EndTime.Date && x.ValueEnd >= EndTime.Date)
                            || jiabanri.Exists(x => x.ValueStart <= EndTime.Date && x.ValueEnd >= EndTime.Date))
                        {
                            if (EndTime >= EndTimeOffworkEnd)
                            {
                                LavehTime += shangbanshijian;
                            }
                            else if (EndTime >= EndTimeOffworkStart)
                            {
                                TimeSpan shangwu1 = EndTimeWorkingEnd.Subtract(EndTimeWorkingStart);
                                TimeSpan xiawu1 = EndTime.Subtract(EndTimeOffworkStart);
                                LavehTime += shangwu1.Hours * 60 + shangwu1.Minutes + xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (EndTime >= EndTimeWorkingEnd)
                            {
                                TimeSpan xiawu1 = EndTimeWorkingEnd.Subtract(EndTimeWorkingStart);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                            else if (EndTime >= EndTimeWorkingStart)
                            {
                                TimeSpan xiawu1 = EndTime.Subtract(EndTimeWorkingStart);
                                LavehTime += xiawu1.Hours * 60 + xiawu1.Minutes;
                            }
                        }
                        else
                        {
                            LavehTime += 0;
                        }
                    }
                }
                if(i != 0 && i != ts.Days)
                {
                    DateTime dateTimenow = StratTime.AddDays(i).Date;
                    //是否上班日期
                    if ((int)dateTimenow.Date.DayOfWeek >= admAttendanceRuleDTO.WeekStart && (int)dateTimenow.Date.DayOfWeek <= admAttendanceRuleDTO.WeekEnd)
                    {
                        //是否假期 假期不上班
                        if (jiejiari.Exists(x => x.ValueStart <= dateTimenow.Date && x.ValueEnd >= dateTimenow.Date))
                        {
                            LavehTime += 0;
                        }
                        else
                        {
                            LavehTime += shangbanshijian;
                        }
                    }
                    else
                    {
                        //是否调休日  调休日需要上班
                        if (tiaoxiuri.Exists(x => x.ValueStart <= dateTimenow.Date && x.ValueEnd >= dateTimenow.Date)
                            || jiabanri.Exists(x => x.ValueStart <= dateTimenow.Date && x.ValueEnd >= dateTimenow.Date))
                        {
                            LavehTime += shangbanshijian;
                        }
                        else
                        {
                            LavehTime += 0;
                        }
                    }
                }
                if(ts.Days == 0)
                { //是否上班日期
                    if ((int)StratTime.Date.DayOfWeek >= admAttendanceRuleDTO.WeekStart && (int)StratTime.Date.DayOfWeek <= admAttendanceRuleDTO.WeekEnd)
                    {
                        //是否节假日
                        if (jiejiari.Exists(x => x.ValueStart <= StratTime.Date && x.ValueEnd >= StratTime.Date))
                        {
                            LavehTime -= 0;
                        }
                        else
                        {
                            LavehTime -= shangbanshijian;
                        }
                    }
                    else
                    {
                        //是否调休日  调休日需要上班
                        if (tiaoxiuri.Exists(x => x.ValueStart <= StratTime.Date && x.ValueEnd >= StratTime.Date)
                            || jiabanri.Exists(x => x.ValueStart <= StratTime.Date && x.ValueEnd >= StratTime.Date))
                        {
                            LavehTime -= shangbanshijian;
                        }
                        else
                        {
                            LavehTime -= 0;
                        }
                    }
                }
            }
            //dateDiff = ts.Days.ToString() + "天"
            //        + ts.Hours.ToString() + "小时"
            //        + ts.Minutes.ToString() + "分钟"
            //        + ts.Seconds.ToString() + "秒";
            //string ssss  = (EndTime - StratTime).ToString();
            AdmAskLeaveDTO admAsk = new AdmAskLeaveDTO();
            admAsk.LaveDay = (int)(LavehTime/shangbanshijian);
            int  lefthour = (int)(LavehTime % shangbanshijian);
            admAsk.LavehHour = lefthour / 60;
            if (lefthour % 60>0)
            {
                admAsk.LavehHour += 1;
            }
            return admAsk;
        }
        public IActionResult AskLeaveOff(string id = "", string StratTimeName = "", string EndTimeName = "")
        {
            var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            ViewData["curentuser"] = curentuser;
            AdmAttendanceRuleDTO admAttendanceRuleDTO = _attendanceRuleService.Get("");
            AdmAskLeaveOffDTO askLeaveOffDTO = new AdmAskLeaveOffDTO();
            if (!string.IsNullOrEmpty(id))
            {
                askLeaveOffDTO = _signinService.GetAskLeaveOff(id);
                askLeaveOffDTO.StratTimeName =askLeaveOffDTO.StratTime.Value.ToString("yyyy-MM-dd HH:mm") ;
                askLeaveOffDTO.EndTimeName = askLeaveOffDTO.EndTime.Value.ToString("yyyy-MM-dd HH:mm");
            }
            else
            {
                askLeaveOffDTO.CreaterName = curentuser.UserName;
                askLeaveOffDTO.Tittle = "销假申请(" + curentuser.UserName +")";
            if (!string.IsNullOrWhiteSpace(StratTimeName))
            {
                DateTime StratTimeName1;
                if (DateTime.TryParse(StratTimeName, out StratTimeName1))
                {
                    askLeaveOffDTO.StratTimeName = StratTimeName1.AddHours(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
                }
            }
            else
            {
                askLeaveOffDTO.StratTimeName = DateTime.Now.Date.AddHours(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.WorkingStart.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
            }
            if (!string.IsNullOrWhiteSpace(EndTimeName))
            {
                DateTime EndTimeName1;
                if (DateTime.TryParse(EndTimeName, out EndTimeName1))
                {
                    askLeaveOffDTO.EndTimeName = EndTimeName1.AddHours(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
                }
            }
            else
            {
                askLeaveOffDTO.EndTimeName = DateTime.Now.Date.AddHours(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[0])).AddMinutes(double.Parse(admAttendanceRuleDTO.OffworkEnd.Split('.')[1])).ToString("yyyy-MM-dd HH:mm");
            }
            }
            ResultDataEntity<SysAttachmentDTO> results = new ResultDataEntity<SysAttachmentDTO>();
            if (!string.IsNullOrEmpty(signinId))
            if (!string.IsNullOrEmpty(id))
            {
                SysAttachmentDTOSearch searchEntity = new SysAttachmentDTOSearch();
                searchEntity.page = 1;
                searchEntity.rows = 1000;
                searchEntity.AttObj = "AskLeaveOff";
                searchEntity.AttObjid = signinId;
                searchEntity.AttObjid = id;
                results = _sysAttachmentService.SearchByPaging(searchEntity);
            }
            ViewBag.attachment = results;
            ViewData["Lavetype"] = _liaotianService.GetSYScode("ADM_AskLeaveOff", "Lavetype");
            ViewData.Model = askLeaveOffDTO;
            string shifoubiaoji = "A";
            string sifoudangqian = "A";
            string dangqianbuzhou = "提交";
            var lishiyijian = new List<WfHistoryDTO>();
            //流程相关
            if (!string.IsNullOrEmpty(id))
            {
                var wfRunProcessDTO = _wfRunProcessService.GetList(id, "02").FirstOrDefault();
                if (wfRunProcessDTO == null)
                {
                    shifoubiaoji = "D";
                    sifoudangqian = "D";
                }
                else
                {
                    dangqianbuzhou = wfRunProcessDTO.Step;
                    //查询审批进度
                    lishiyijian = _wfHistoryService.GetListshenpi(wfRunProcessDTO.Id);
                    if (wfRunProcessDTO.Step != "提交")
                    {
                        shifoubiaoji = "D";
                    }
                    //查询待办
                    var chaxundaiban = _wfNeeddeelService.GetListTracking(wfRunProcessDTO.Id, wfRunProcessDTO.Step).Where(x => x.DeelUserId == curentuser.Id).ToList();
                    if (chaxundaiban != null && chaxundaiban.Count > 0)
                    {
                        sifoudangqian = "A";
                    }
                    else
                    {
                        sifoudangqian = "D";
                    }
                }
            ViewData.Model = admAskLeaveOffDTO;
            }
            ViewBag.shifoubiaoji = shifoubiaoji;
            ViewBag.sifoudangqian = sifoudangqian;
            ViewBag.lishiyijian = lishiyijian;
            ViewBag.dangqianbuzhou = dangqianbuzhou;
            return View();
        }
@@ -192,6 +997,8 @@
            var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            ViewData["curentuser"] = curentuser;
            leaveOff.RecStatus = "A";
            ////未挂审批流,提交直接通过
            //leaveOff.ShenpiStatus = "A";
            if (String.IsNullOrEmpty(leaveOff.Id))
            {
                leaveOff.Creater = curentuser.Id;
@@ -199,34 +1006,75 @@
            }
            leaveOff.Modifier = curentuser.Id;
            leaveOff.Modifytime = DateTime.Now;
            ResultEntity resultEntity = new ResultEntity();
            resultEntity.Result = false;
            ResultEntity resultEntity = _signinService.SaveAskLeaveOff(leaveOff);
            string[] Filepaths = leaveOff.Filepath;
            if(Filepaths!=null&& Filepaths.Length > 0)
            if (leaveOff.Step == "提交")
            {
                for(int i=0;i< Filepaths.Length; i++)
                //请假时间不能重叠
                var qingjia = _signinService.GetAskLeaveOffChongdie(curentuser.Id, leaveOff.StratTime.Value, leaveOff.EndTime.Value);
                if (qingjia.Count > 0)
                {
                    if (string.IsNullOrEmpty(leaveOff.attachmentid[i]))
                    {
                        SysAttachmentDTO sysAttachmentDTO = new SysAttachmentDTO();
                        //sysAttachmentDTO.Id =
                        sysAttachmentDTO.AttObj = "AskLeaveOff";
                        sysAttachmentDTO.AttObjid = leaveOff.SigninId;
                        sysAttachmentDTO.Filefullname = leaveOff.Filefullname[i];
                        sysAttachmentDTO.Filepath = leaveOff.Filepath[i];
                        sysAttachmentDTO.Creater = curentuser.Id;
                        sysAttachmentDTO.Modifier = curentuser.Id;
                        sysAttachmentDTO.Createtime = DateTime.Now;
                        sysAttachmentDTO.Modifytime = sysAttachmentDTO.Createtime;
                        resultEntity = _sysAttachmentService.save(sysAttachmentDTO);
                    }
                    resultEntity.Result = false;
                    resultEntity.Message = "该时间段已经有销假!";
                    return JsonConvert.SerializeObject(resultEntity);
                }
                //销假必须三天以内
                if (leaveOff.EndTime.Value.Date < DateTime.Now.Date.AddDays(-4))
                {
                    resultEntity.Result = false;
                    resultEntity.Message = "请在72小时内进行销假处理,超过72小时无法提交";
                    return JsonConvert.SerializeObject(resultEntity);
                }
            }
            using (TransactionScope scope = new TransactionScope())
            {
                if (leaveOff.Step == "提交")
                {
                    resultEntity = _signinService.SaveAskLeaveOff(leaveOff);
                    if (resultEntity.Result == false)
                    {
                        return JsonConvert.SerializeObject(resultEntity);
                    }
                    string[] Filepaths = leaveOff.Filepath;
                    if (Filepaths != null && Filepaths.Length > 0)
                    {
                        for (int i = 0; i < Filepaths.Length; i++)
                        {
                            if (string.IsNullOrEmpty(leaveOff.attachmentid[i]))
                            {
                                SysAttachmentDTO sysAttachmentDTO = new SysAttachmentDTO();
                                //sysAttachmentDTO.Id =
                                sysAttachmentDTO.AttObj = "AskLeaveOff";
                                sysAttachmentDTO.AttObjid = leaveOff.Id;
                                sysAttachmentDTO.Filefullname = leaveOff.Filefullname[i];
                                sysAttachmentDTO.Filepath = leaveOff.Filepath[i];
                                sysAttachmentDTO.Creater = curentuser.Id;
                                sysAttachmentDTO.Modifier = curentuser.Id;
                                sysAttachmentDTO.Createtime = DateTime.Now;
                                sysAttachmentDTO.Modifytime = sysAttachmentDTO.Createtime;
                                resultEntity = _sysAttachmentService.save(sysAttachmentDTO);
                                if (resultEntity.Result == false)
                                {
                                    return JsonConvert.SerializeObject(resultEntity);
                                }
                            }
                        }
                    }
                }
                resultEntity = _wfRunProcessService.WfAskLeaveOff(leaveOff.Id, leaveOff.Step, leaveOff.Tongguojujue, curentuser.Id, leaveOff.Content, leaveOff.Tittle, "v1");
                scope.Complete();
            }
            
@@ -240,6 +1088,12 @@
        #region 考勤规则
        public IActionResult AttendanceRule()
        {
            var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            ViewData["curentuser"] = curentuser;
            var pageEntities = _pltPageService.GetUserPage(curentuser.Id, "/Signin/AttendanceRule/");
            var pageEntities2 = pageEntities.Where(x => x.PageMethod == "02").ToList();
            ViewData["ActionInfo2"] = pageEntities2;
            AdmAttendanceRuleDTO admAttendanceRuleDTO =  _attendanceRuleService.Get("");
            admAttendanceRuleDTO.admAttendanceRulesDtlDTOs = _attendanceRuleService.GetDtlList("");
@@ -252,11 +1106,29 @@
            ResultEntity resultEntity = new ResultEntity();
            dto.Holiday = "1";
            dto.Rest = "1";
            if (dto.WorkingStart.IndexOf(".") < 0)
            {
                dto.WorkingStart += ".00";
            }
            if (dto.WorkingEnd.IndexOf(".") < 0)
            {
                dto.WorkingEnd += ".00";
            }
            if (dto.OffworkStart.IndexOf(".") < 0)
            {
                dto.OffworkStart += ".00";
            }
            if (dto.OffworkEnd.IndexOf(".") < 0)
            {
                dto.OffworkEnd += ".00";
            }
            resultEntity.Result = false;
            var curentuser = JsonConvert.DeserializeObject<PltUser>(HttpContext.Session.GetString("User"));
            ViewData["curentuser"] = curentuser;
            using (TransactionScope scope = new TransactionScope())
            {
                dto.FullAttendance = 0;
                dto.AbsenteeismPayment2 = 0;
                dto.RecStatus = "A";
                if (String.IsNullOrEmpty(dto.Id))
                {
@@ -277,8 +1149,8 @@
                    {
                        AdmAttendanceRulesDtlDTO admAttendanceRulesDtlDTO = new AdmAttendanceRulesDtlDTO();
                        admAttendanceRulesDtlDTO.Pid = dto.Id;
                        admAttendanceRulesDtlDTO.ValueStart = dto.holiday_s[i];
                        admAttendanceRulesDtlDTO.ValueEnd = dto.holiday_e[i];
                        admAttendanceRulesDtlDTO.ValueStart = DateTime.Parse(dto.holiday_s[i]);
                        admAttendanceRulesDtlDTO.ValueEnd = DateTime.Parse(dto.holiday_e[i]);
                        admAttendanceRulesDtlDTO.Name = "jiejiari";
                        admAttendanceRulesDtlDTO.RecStatus = "A";
                        admAttendanceRulesDtlDTO.Creater = curentuser.Id;
@@ -295,8 +1167,8 @@
                    {
                        AdmAttendanceRulesDtlDTO admAttendanceRulesDtlDTO = new AdmAttendanceRulesDtlDTO();
                        admAttendanceRulesDtlDTO.Pid = dto.Id;
                        admAttendanceRulesDtlDTO.ValueStart = dto.rest_s[i];
                        admAttendanceRulesDtlDTO.ValueEnd = dto.rest_e[i];
                        admAttendanceRulesDtlDTO.ValueStart = DateTime.Parse(  dto.rest_s[i]);
                        admAttendanceRulesDtlDTO.ValueEnd = DateTime.Parse(dto.rest_e[i]);
                        admAttendanceRulesDtlDTO.Name = "tiaoxiuri";
                        admAttendanceRulesDtlDTO.RecStatus = "A";
                        admAttendanceRulesDtlDTO.Creater = curentuser.Id;
@@ -308,6 +1180,27 @@
                       
                }
                for (int i = 0; i < dto.jiaban_s.Length; i++)
                {
                    if (!String.IsNullOrEmpty(dto.jiaban_s[i]) && !String.IsNullOrEmpty(dto.jiaban_e[i]))
                    {
                        AdmAttendanceRulesDtlDTO admAttendanceRulesDtlDTO = new AdmAttendanceRulesDtlDTO();
                        admAttendanceRulesDtlDTO.Pid = dto.Id;
                        admAttendanceRulesDtlDTO.ValueStart = DateTime.Parse(dto.jiaban_s[i]);
                        admAttendanceRulesDtlDTO.ValueEnd = DateTime.Parse(dto.jiaban_e[i]);
                        admAttendanceRulesDtlDTO.Name = "jiabanri";
                        admAttendanceRulesDtlDTO.RecStatus = "A";
                        admAttendanceRulesDtlDTO.Creater = curentuser.Id;
                        admAttendanceRulesDtlDTO.Createtime = DateTime.Now;
                        admAttendanceRulesDtlDTO.Modifier = admAttendanceRulesDtlDTO.Creater;
                        admAttendanceRulesDtlDTO.Modifytime = admAttendanceRulesDtlDTO.Createtime;
                        resultEntity = _attendanceRuleService.saveDtl(admAttendanceRulesDtlDTO);
                    }
                }
                scope.Complete();
            }