Church.Net.API/Church.Net.WebAPI/Logics/PastoralDomainLogic.cs
2024-05-02 15:24:13 -07:00

272 lines
11 KiB
C#

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;
using Church.Net.DAL.EFCoreDBF.Interface;
namespace WebAPI.Logics
{
public class PastoralDomainLogic : LogicBase<PastoralDomain>, ICrudLogic<PastoralDomain>
{
string[] weekTopics = new string[] { "真幸福", "真相大白", "萬世巨星", "幸福連線", "當上帝來敲門", "十字架的勝利", "釋放與自由", "幸福的教會" };
private readonly IServiceScopeFactory serviceScopeFactory;
private readonly ICrudDAL<CellGroupRoutineEvent> eventCrudDAL;
private readonly ICrudDAL<FamilyMember> memberCrudDAL;
private readonly ICrudDAL<AddressInfo> addressCrudDAL;
private readonly ICombinedKeyCrudDAL<PastoralDomainMembers> pastoralDomainMemberDAL;
private readonly ICrudDAL<HappinessWeek> weekCrudDAL;
private readonly ICrudDAL<HappinessBEST> bestCrudDAL;
private readonly ICrudDAL<HappinessTask> weekTaskCrudDAL;
private readonly ICrudDAL<HappinessCost> happinessCostCrudDAL;
private readonly ICrudDAL<Contribution> contributionCrudDAL;
public PastoralDomainLogic(
IServiceScopeFactory serviceScopeFactory,
LogicService logicService,
ICrudDAL<PastoralDomain> crudDAL,
ICrudDAL<CellGroupRoutineEvent> eventCrudDAL,
ICrudDAL<FamilyMember> memberCrudDAL,
ICrudDAL<AddressInfo> addressCrudDAL,
ICombinedKeyCrudDAL<PastoralDomainMembers> pastoralDomainMemberDAL,
ICrudDAL<HappinessWeek> weekCrudDAL,
ICrudDAL<HappinessBEST> bestCrudDAL,
ICrudDAL<HappinessTask> weekTaskCrudDAL,
ICrudDAL<Contribution> contributionCrudDALL,
ICrudDAL<HappinessCost> happinessCostCrudDAL
) : base(logicService, crudDAL)
{
this.serviceScopeFactory = serviceScopeFactory;
this.eventCrudDAL = eventCrudDAL;
this.memberCrudDAL = memberCrudDAL;
this.addressCrudDAL = addressCrudDAL;
this.pastoralDomainMemberDAL = pastoralDomainMemberDAL;
this.weekCrudDAL = weekCrudDAL;
this.bestCrudDAL = bestCrudDAL;
this.weekTaskCrudDAL = weekTaskCrudDAL;
this.happinessCostCrudDAL = happinessCostCrudDAL;
this.contributionCrudDAL = contributionCrudDALL;
}
#region override
public override IEnumerable<PastoralDomain> GetAll(Func<PastoralDomain, bool> filter = null)
{
var list = base.GetAll(filter);
foreach (var group in list)
{
if (!string.IsNullOrEmpty(group.ServiceAddressId))
{
group.ServiceAddress = addressCrudDAL.GetById(group.ServiceAddressId);
}
else
{
group.ServiceAddress = new AddressInfo();
}
if (group.Type == DomainType.HappinessGroup)
{
GetHappinessGroupInfo(group);
}
group.FamilyMembers =
memberCrudDAL.GetAllById(
pastoralDomainMemberDAL.GetAll(d => d.PastoralDomainId == group.Id).Select(d => d.FamilyMemberId).ToList()
).ToList();
group.Contributions = contributionCrudDAL.GetAll(d => d.GroupId == group.Id).ToList();
}
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)
{
PastoralDomain cellGroup;
if (domainId == null)
{
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;
}
}
else
{
cellGroup= crudDAL.GetById(domainId);
}
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)
{
var serviceLocalTime = cellGroup.ServiceTime.Value.ToUniversalTime().ToLocal(cellGroup.TimeZone);
var serviceWeekDay = serviceLocalTime.DayOfWeek;
var nextServiceTime = DateTimeHelper.GetNextWeekday(DateTimeHelper.Today(cellGroup.TimeZone), DayOfWeek.Friday)
.AddHours(serviceLocalTime.Hour).AddMinutes(serviceLocalTime.Minute);
_event = new CellGroupRoutineEvent()
{
Id = Format.Get33BaseGuid(),
Time = nextServiceTime.ToUtc(cellGroup.TimeZone),
Address = "1881 Forest Dr., Azusa, CA 91702",
Attendees = new List<CellGroupRoutineEventAttendee>(),
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<PastoralDomain> GetCurrentUserPastoralDomain()
{
if (!string.IsNullOrWhiteSpace(logicService.CurrentUserId))
{
var ids = pastoralDomainMemberDAL.GetAll(p => p.FamilyMemberId == logicService.CurrentUserId).Select(p => p.PastoralDomainId);
var list = crudDAL.GetAll(p => ids.Contains(p.Id));
foreach (var group in list)
{
if (group.Type == DomainType.HappinessGroup)
{
GetHappinessGroupInfo(group);
}
group.Contributions = contributionCrudDAL.GetAll(d => d.GroupId == group.Id).ToList();
}
return list;
}
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<HappinessWeek>();
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).OrderBy(t => t.Type).ToList();
week.Costs = happinessCostCrudDAL.GetAll(t => t.WeekId == week.Id).ToList();
}
group.Bests = bestCrudDAL.GetAll(b => b.GroupId == group.Id).OrderBy(b => b.Name).ToList();
}
}
}