272 lines
11 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|