Ejemplo n.º 1
0
        public IHttpActionResult GetEmpDatePlan([FromBody] EmpPlanFilter request)
        {
            var response = service.GetDatePlan(request);

            return(Ok(response));
        }
        public BaseResponse <List <EmpPlanModel> > GetDatePlan(EmpPlanFilter request)
        {
            BaseResponse <List <EmpPlanModel> > response = new BaseResponse <List <EmpPlanModel> >();
            List <EmpPlanModel> epList = new List <EmpPlanModel>();
            var taskRepository         = unitOfWork.GetRepository <DC_Task>();
            var orderRepository        = unitOfWork.GetRepository <DC_ServiceOrder>();

            var    user             = base.unitOfWork.GetRepository <SYS_User>().dbSet;
            var    ur               = base.unitOfWork.GetRepository <SYS_UserRelation>().dbSet;
            var    employee         = base.unitOfWork.GetRepository <ORG_Employee>().dbSet;
            string userRelationType = Enum.GetName(typeof(UserRelationType), UserRelationType.UserEmployee);
            var    query            = from sysUser in user
                                      join emprelation in ur on new { sysUser.UserID, RelationType = userRelationType, IsDeleted = false } equals new { emprelation.UserID, emprelation.RelationType, emprelation.IsDeleted } into eurd
            from y in eurd.DefaultIfEmpty()
            join empl in employee on new { Id = y.RelationID, IsDeleted = false } equals new { Id = empl.EmployeeID, empl.IsDeleted } into ee
            from epd in ee.DefaultIfEmpty()
            where sysUser.IsDeleted == false
                   select new { user = sysUser, emp = ee };

            query = query.Where(w => w.user.ORG_Organization.Any(a => a.OrganizationID == request.OrganizationID));
            query = query.Where(w => w.user.SYS_Role.Any(a => a.RoleNo != "R100" && a.RoleNo != "R001" && a.RoleNo != "R003"));
            var userList = query.ToList();

            for (var i = 0; i < 5; i++)
            {
                var timeStep      = 0.5;
                var startTime     = 8d;
                var endTime       = 18;
                var isAllFullBook = true;

                var                     curDateTime      = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).AddDays(i);
                var                     curStartTime     = startTime;
                var                     curEndTime       = curStartTime + request.Quantity * request.Unit;
                var                     curStartDateTime = curDateTime.AddHours(curStartTime);
                var                     curEndDateTime   = curDateTime.AddHours(curEndTime);
                EmpPlanModel            ep                = new EmpPlanModel();
                List <EmpPlanDateModel> epdList           = new List <EmpPlanDateModel>();
                var                     userFressTimeList = new List <BeTimeModel>();

                for (var m = 0; m < userList.Count; m++)
                {
                    var emp = userList[m].emp.FirstOrDefault();
                    if (emp == null)
                    {
                        continue;
                    }
                    var q = from task in taskRepository.dbSet.Where(a => a.EmployeeId == emp.EmployeeID && (a.Status == "Assign" || a.Status == "Execution"))
                            join order in orderRepository.dbSet on task.ServiceOrderID equals order.ServiceOrderID
                            select new
                    {
                        ServiceName     = task.ServiceName,
                        AppointmentTime = task.AppointmentTime,
                        Quantity        = order.Quantity
                    };
                    var userJobTimeList = new List <BeTimeModel>();
                    if (q != null && q.Count() > 0)
                    {
                        var tempList = q.ToList();
                        var list     = tempList.Where(a => a.AppointmentTime.Date.CompareTo(curDateTime.Date) == 0).ToList();
                        list.ForEach((a) =>
                        {
                            DateTime taskStartTime;
                            DateTime taskEndTime;
                            if (a.ServiceName == "家政服务" || a.ServiceName == "陪聊")
                            {
                                taskStartTime = a.AppointmentTime;
                                taskEndTime   = a.AppointmentTime.AddHours(a.Quantity.Value);
                            }
                            else
                            {
                                taskStartTime = a.AppointmentTime;
                                taskEndTime   = curDateTime.AddHours(endTime);
                            }
                            userJobTimeList.Add(new BeTimeModel
                            {
                                BeginTime = taskStartTime,
                                EndTime   = taskEndTime
                            });
                        });
                    }

                    UnionTime(userJobTimeList);
                    DateTime freeTimeStart = curDateTime.AddHours(startTime);
                    DateTime freeTimeEnd;
                    userJobTimeList.ForEach(a =>
                    {
                        freeTimeEnd = a.BeginTime;
                        userFressTimeList.Add(new BeTimeModel
                        {
                            BeginTime = freeTimeStart,
                            EndTime   = freeTimeEnd
                        });
                        freeTimeStart = a.EndTime;
                    });
                    freeTimeEnd = curDateTime.AddHours(endTime);
                    userFressTimeList.Add(new BeTimeModel
                    {
                        BeginTime = freeTimeStart,
                        EndTime   = freeTimeEnd
                    });
                }

                do
                {
                    var q = userFressTimeList.Where(a => a.BeginTime.CompareTo(curStartDateTime) <= 0 && a.EndTime.CompareTo(curEndDateTime) >= 0);
                    EmpPlanDateModel epd = new EmpPlanDateModel()
                    {
                        TimeStart  = curStartDateTime.ToShortTimeString(),
                        TimeEnd    = curEndDateTime.ToShortTimeString(),
                        IsFullBook = curStartDateTime.CompareTo(DateTime.Now) < 0?true: q.Count() == 0
                    };
                    if (!epd.IsFullBook)
                    {
                        isAllFullBook = false;
                    }
                    epdList.Add(epd);
                    curStartTime    += timeStep;
                    curEndTime       = curStartTime + request.Quantity * request.Unit;
                    curStartDateTime = curDateTime.AddHours(curStartTime);
                    curEndDateTime   = curDateTime.AddHours(curEndTime);
                } while (curStartTime <= endTime);

                ep.BookDate        = curDateTime.ToString("yyyy-MM-dd");
                ep.EmpPlanDateList = epdList;
                ep.IsFullBook      = isAllFullBook;
                epList.Add(ep);
            }

            response.Data = epList;
            return(response);
        }