using Church.Net.DAL.EFCoreDBF; using Church.Net.Entity; using Church.Net.Utility; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System; using WebAPI.Logics.Core; using WebAPI.Logics.Interface; using System.Linq; using Microsoft.Extensions.DependencyInjection; using System.Text.RegularExpressions; namespace WebAPI.Logics { public class PastoralDomainLogic : LogicBase, ICrudLogic { string[] weekTopics = new string[] { "真幸福", "真相大白", "萬世巨星", "幸福連線", "當上帝來敲門", "十字架的勝利", "釋放與自由", "幸福的教會" }; private readonly IServiceScopeFactory serviceScopeFactory; private readonly ICrudDAL eventCrudDAL; private readonly ICombinedKeyCrudDAL attendeeCrudDAL; private readonly ICrudDAL memberCrudDAL; private readonly ICrudDAL addressCrudDAL; private readonly ICombinedKeyCrudDAL pastoralDomainMemberDAL; private readonly ICrudDAL weekCrudDAL; private readonly ICrudDAL bestCrudDAL; private readonly ICrudDAL weekTaskCrudDAL; public PastoralDomainLogic( IServiceScopeFactory serviceScopeFactory, LogicService logicService, ICrudDAL crudDAL, ICrudDAL eventCrudDAL, ICombinedKeyCrudDAL attendeeCrudDAL, ICrudDAL memberCrudDAL, ICrudDAL addressCrudDAL, ICombinedKeyCrudDAL pastoralDomainMemberDAL, ICrudDAL weekCrudDAL, ICrudDAL bestCrudDAL, ICrudDAL weekTaskCrudDAL ) : base(logicService, crudDAL) { this.serviceScopeFactory = serviceScopeFactory; this.eventCrudDAL = eventCrudDAL; this.attendeeCrudDAL = attendeeCrudDAL; this.memberCrudDAL = memberCrudDAL; this.addressCrudDAL = addressCrudDAL; this.pastoralDomainMemberDAL = pastoralDomainMemberDAL; this.weekCrudDAL = weekCrudDAL; this.bestCrudDAL = bestCrudDAL; this.weekTaskCrudDAL = weekTaskCrudDAL; } #region override public override IEnumerable GetAll(Func filter = null) { var list = base.GetAll(filter); foreach (var item in list) { if (!string.IsNullOrEmpty(item.ServiceAddressId)) { item.ServiceAddress = addressCrudDAL.GetById(item.ServiceAddressId); } else { item.ServiceAddress = new AddressInfo(); } if (item.Type == DomainType.HappinessGroup) { GetHappinessGroupInfo(item); } } return list; } public override void BeforeCreate(PastoralDomain entity) { addressCrudDAL.CreateOrUpdate(entity.ServiceAddress); entity.ServiceAddressId = entity.ServiceAddress.Id; } public override void BeforeUpdate(PastoralDomain entity) { addressCrudDAL.CreateOrUpdate(entity.ServiceAddress); entity.ServiceAddressId = entity.ServiceAddress.Id; } #endregion public CellGroupRoutineEvent GetComingEvent(string domainId = null) { if (domainId == null) { var cellGroup = GetCurrentUserCellGroup(); if (cellGroup != null) { domainId = cellGroup.Id; var _event = eventCrudDAL.GetDbSet().OrderByDescending(e => e.Time) .Include(e => e.Attendees).Include(e => e.Prayers) .Where(e => e.PastoralDomainId == domainId).FirstOrDefault(); return _event; } } if (domainId != null) { var _event = eventCrudDAL.GetDbSet().Where(e => e.PastoralDomainId == domainId && e.Time >= DateTime.UtcNow) .Include(e => e.Attendees).Include(e => e.Prayers).FirstOrDefault(); if (_event == null) { _event = new CellGroupRoutineEvent() { Id = Format.Get33BaseGuid(), Time = DateTimeHelper.GetNextWeekday(DateTime.Today, DayOfWeek.Friday).AddHours(19).AddMinutes(30), Address = "1881 Forest Dr., Azusa, CA 91702", Attendees = new List(), PastoralDomainId = domainId }; eventCrudDAL.Create(_event); } return _event; } return null; } public CellGroupRoutineEvent GetLastEvent(string domainId = null) { if (domainId == null) { var cellGroup = GetCurrentUserCellGroup(); if (cellGroup != null) { domainId = cellGroup.Id; var _event = eventCrudDAL.GetDbSet().OrderByDescending(e => e.Time) .Include(e => e.Attendees).Include(e => e.Prayers) .Where(e => e.PastoralDomainId == domainId).FirstOrDefault(); return _event; } } if (domainId != null) { var _event = eventCrudDAL.GetDbSet().OrderByDescending(e => e.Time) .Include(e => e.Attendees).Include(e => e.Prayers) .Where(e => e.PastoralDomainId == domainId).FirstOrDefault(); return _event; } return null; } public string GetMemberFirstNameById(string memberId) { return memberCrudDAL.GetById(memberId)?.FirstName; } public IEnumerable GetCurrentUserPastoralDomain() { if (!string.IsNullOrWhiteSpace(logicService.CurrentUserId)) { var ids = pastoralDomainMemberDAL.GetAll(p => p.FamilyMemberId == logicService.CurrentUserId).Select(p => p.PastoralDomainId); return crudDAL.GetAll(p => ids.Contains(p.Id)); } return null; } public PastoralDomain GetCurrentUserCellGroup() { if (!string.IsNullOrWhiteSpace(logicService.CurrentUserId)) { var ids = pastoralDomainMemberDAL.GetAll(p => p.FamilyMemberId == logicService.CurrentUserId).Select(p => p.PastoralDomainId); return crudDAL.GetAll(p => ids.Contains(p.Id) && p.Type == DomainType.CellGroup).FirstOrDefault(); } return null; } public int UpdateWeekInfo(HappinessWeek value) { if (value.UpdateRestWeekDate) { var list = weekCrudDAL.GetAll(week => week.SEQ >= value.SEQ && week.GroupId == value.GroupId).OrderBy(w => w.SEQ).ToList(); var tempDate = new DateTime(value.Date.Year, value.Date.Month, value.Date.Day, value.Date.Hour, value.Date.Minute, value.Date.Second); int count = 0; foreach (var week in list) { week.Date = tempDate.AddDays(count * 7); week.Address = value.Address; week.CityAndZipCode = value.CityAndZipCode; week.InvitationText = value.InvitationText; count++; } return weekCrudDAL.UpdateRange(list); } return weekCrudDAL.CreateOrUpdate(value); } private HappinessWeek GetHappinessWeek(PastoralDomain group, int weekNo) { return new HappinessWeek() { GroupId = group.Id, Address = group.ServiceAddress.Address, CityAndZipCode = group.ServiceAddress.GetCSZ(), Date = group.ServiceTime.Value.AddDays(7 * (weekNo - 1)), SEQ = weekNo }; } public void GetHappinessGroupInfo(PastoralDomain group) { group.HappinessWeeks = weekCrudDAL.GetAll(w => w.GroupId == group.Id).OrderBy(w => w.SEQ).ToList(); if (group.HappinessWeeks == null || group.HappinessWeeks.Count() == 0) { group.HappinessWeeks = new List(); for (int i = 1; i <= 8; i++) { var week = GetHappinessWeek(group, i); group.HappinessWeeks.Add(week); weekCrudDAL.CreateOrUpdate(week); } } foreach (var week in group.HappinessWeeks) { week.Topic = weekTopics[week.SEQ - 1]; week.Tasks = weekTaskCrudDAL.GetAll(t => t.WeekId == week.Id).ToList(); } group.Bests = bestCrudDAL.GetAll(b => b.GroupId == group.Id).ToList(); } } }