diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointSchedules/CreateAppointScheduleWithDetailInputDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointSchedules/CreateAppointScheduleWithDetailInputDto.cs new file mode 100644 index 0000000..f4cf9f5 --- /dev/null +++ b/src/Shentun.WebPeis.Application.Contracts/AppointSchedules/CreateAppointScheduleWithDetailInputDto.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.WebPeis.AppointSchedules +{ + public class CreateAppointScheduleWithDetailInputDto + { + /// + /// 开始日期 + /// + public string StartDate { get; set; } + + /// + /// 结束日期 + /// + public string EndDate { get; set; } + } +} diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointSchedules/UpdateAppointScheduleNumberLimitInputDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointSchedules/UpdateAppointScheduleNumberLimitInputDto.cs new file mode 100644 index 0000000..01f0f69 --- /dev/null +++ b/src/Shentun.WebPeis.Application.Contracts/AppointSchedules/UpdateAppointScheduleNumberLimitInputDto.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.WebPeis.AppointSchedules +{ + public class UpdateAppointScheduleNumberLimitInputDto + { + /// + /// 主键 + /// + public Guid AppointScheduleId { get; set; } + + /// + /// 上午数量限制 + /// + public int? AmNumberLimit { get; set; } + /// + /// 下午数量限制 + /// + public int? PmNumberLimit { get; set; } + } +} diff --git a/src/Shentun.WebPeis.Application/AppointScheduleTemplates/AppointScheduleTemplateAppService.cs b/src/Shentun.WebPeis.Application/AppointScheduleTemplates/AppointScheduleTemplateAppService.cs index 0f1a47a..34e406c 100644 --- a/src/Shentun.WebPeis.Application/AppointScheduleTemplates/AppointScheduleTemplateAppService.cs +++ b/src/Shentun.WebPeis.Application/AppointScheduleTemplates/AppointScheduleTemplateAppService.cs @@ -64,7 +64,7 @@ namespace Shentun.WebPeis.AppointScheduleTemplates var entListDto = entList.Select(s => new AppointScheduleTemplateDto { AmNumberLimit = s.AmNumberLimit, - AmStartTime = DataHelper.ConvertTimeOnlyToString(s.AmStopTime), + AmStartTime = DataHelper.ConvertTimeOnlyToString(s.AmStartTime), AmStopTime = DataHelper.ConvertTimeOnlyToString(s.AmStopTime), AppointScheduleTemplateId = s.AppointScheduleTemplateId, CreationTime = s.CreationTime, @@ -88,6 +88,7 @@ namespace Shentun.WebPeis.AppointScheduleTemplates /// /// /// + [HttpPost("api/app/AppointScheduleTemplate/CreateOrUpdateAppointScheduleTemplate")] public async Task> CreateOrUpdateAppointScheduleTemplateAsync(List input) { List entListDto = new List(); diff --git a/src/Shentun.WebPeis.Application/AppointSchedules/AppointScheduleAppService.cs b/src/Shentun.WebPeis.Application/AppointSchedules/AppointScheduleAppService.cs index 9b19b2a..6eb6feb 100644 --- a/src/Shentun.WebPeis.Application/AppointSchedules/AppointScheduleAppService.cs +++ b/src/Shentun.WebPeis.Application/AppointSchedules/AppointScheduleAppService.cs @@ -1,6 +1,8 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Shentun.WebPeis.AppointScheduleTimes; using Shentun.WebPeis.Models; +using Shentun.WebPeis.SysParmValues; using System; using System.Collections.Generic; using System.Linq; @@ -8,6 +10,7 @@ using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; +using static log4net.Appender.RollingFileAppender; namespace Shentun.WebPeis.AppointSchedules { @@ -15,16 +18,29 @@ namespace Shentun.WebPeis.AppointSchedules [Authorize] public class AppointScheduleAppService : ApplicationService { - private readonly IRepository _repository; + private readonly IRepository _appointScheduleRepository; + private readonly IRepository _appointScheduleTemplateRepository; + private readonly IRepository _appointScheduleTimeRepository; private readonly CacheService _cacheService; + private readonly AppointScheduleManager _appointScheduleManager; + private readonly AppointScheduleTimeManager _appointScheduleTimeManager; + private readonly SysParmValueManager _sysParmValueManager; - public AppointScheduleAppService(IRepository repository, - CacheService cacheService - ) + public AppointScheduleAppService(IRepository appointScheduleRepository, + CacheService cacheService, + AppointScheduleManager appointScheduleManager, + IRepository appointScheduleTemplateRepository, + IRepository appointScheduleTimeRepository, + AppointScheduleTimeManager appointScheduleTimeManager, + SysParmValueManager sysParmValueManager) { - _repository = repository; + _appointScheduleRepository = appointScheduleRepository; _cacheService = cacheService; - + _appointScheduleManager = appointScheduleManager; + _appointScheduleTemplateRepository = appointScheduleTemplateRepository; + _appointScheduleTimeRepository = appointScheduleTimeRepository; + _appointScheduleTimeManager = appointScheduleTimeManager; + _sysParmValueManager = sysParmValueManager; } /// /// 获取预约日期列表 @@ -67,5 +83,258 @@ namespace Shentun.WebPeis.AppointSchedules return appointScheduleDateDtos; } + + + /// + /// 生成预约日期计划 + /// + /// + [HttpPost("api/app/AppointSchedule/CreateAppointScheduleWithDetail")] + public async Task CreateAppointScheduleWithDetailAsync(CreateAppointScheduleWithDetailInputDto input) + { + + DateTime startDate = Convert.ToDateTime(input.StartDate).Date; + DateTime endDate = Convert.ToDateTime(input.EndDate).Date; + + //所有日期 + List dateTimes = DataHelper.GetAllDatesWithinRange(startDate, endDate); + + var appointScheduleTemplateList = await _appointScheduleTemplateRepository.GetListAsync(); + + foreach (var dateTime in dateTimes) + { + var weekId = (int)dateTime.DayOfWeek; + var appointScheduleTemplate = appointScheduleTemplateList.Where(m => m.WeekId == weekId).FirstOrDefault(); + if (appointScheduleTemplate != null) + { + + Guid appointScheduleId = GuidGenerator.Create(); + //有设置模板 + var createEntity = new AppointSchedule + { + AmNumberLimit = appointScheduleTemplate.AmNumberLimit, + AppointDate = dateTime, + AppointScheduleId = appointScheduleId, + PmNumberLimit = appointScheduleTemplate.PmNumberLimit, + SingleNumberLimit = appointScheduleTemplate.SingleNumberLimit + }; + + //如有存在当天的计划,并且有预约数量,就不处理 + createEntity = await _appointScheduleManager.CreateAsync(createEntity); + + bool isAddAppointScheduleTime = false; + + if (createEntity.AppointScheduleId == appointScheduleId) + { + //新增 + createEntity = await _appointScheduleRepository.InsertAsync(createEntity, true); + + isAddAppointScheduleTime = true; + + } + else + { + //修改 + createEntity = await _appointScheduleRepository.UpdateAsync(createEntity, true); + var isAppointScheduleTimeCount = await _appointScheduleTimeRepository.CountAsync(m => m.AppointScheduleId == createEntity.AppointScheduleId + && m.AppointNumber > 0); + if (isAppointScheduleTimeCount == 0) + { + isAddAppointScheduleTime = true; + //删除原有明细 + await _appointScheduleTimeRepository.DeleteAsync(d => d.AppointScheduleId == createEntity.AppointScheduleId, true); + } + } + + if (isAddAppointScheduleTime) + { + //增加明细计划 + + //获取系统参数 间隔时间 + var appointScheduleAm = await _sysParmValueManager.GetSysParmValueAsync(Guid.Parse("150da355-dfbf-466b-9697-355836a862c4"), "appoint_schedule_am"); + var appointSchedulePm = await _sysParmValueManager.GetSysParmValueAsync(Guid.Parse("150da355-dfbf-466b-9697-355836a862c4"), "appoint_schedule_pm"); + + if (appointScheduleTemplate.AmStartTime != null + && appointScheduleTemplate.AmStopTime != null + && appointScheduleTemplate.AmNumberLimit != 0) + { + + List insertAppointScheduleTimeList = new List(); + + //上午计划 + for (var date = appointScheduleTemplate.AmStartTime.Value; + date < appointScheduleTemplate.AmStopTime.Value; + date = date.AddMinutes(Convert.ToInt32(appointScheduleAm))) + { + + var appointScheduleTimeStopTime = date.AddMinutes(Convert.ToInt32(appointScheduleAm)); + if (appointScheduleTimeStopTime > appointScheduleTemplate.AmStopTime.Value) + appointScheduleTimeStopTime = appointScheduleTemplate.AmStopTime.Value; + var appointScheduleTimeEntity = new AppointScheduleTime + { + AppointNumber = 0, + StopTime = appointScheduleTimeStopTime, + AppointScheduleId = createEntity.AppointScheduleId, + AppointScheduleTimeId = GuidGenerator.Create(), + NumberLimit = 0, + StartTime = date + }; + + appointScheduleTimeEntity = _appointScheduleTimeManager.CreateAsync(appointScheduleTimeEntity); + + insertAppointScheduleTimeList.Add(appointScheduleTimeEntity); + } + + int numberLimit = appointScheduleTemplate.AmNumberLimit / insertAppointScheduleTimeList.Count; + + insertAppointScheduleTimeList.ForEach(f => f.NumberLimit = numberLimit); + + await _appointScheduleTimeRepository.InsertManyAsync(insertAppointScheduleTimeList); + } + + if (appointScheduleTemplate.PmStartTime != null && appointScheduleTemplate.PmStopTime != null) + { + //下午计划 + List insertAppointScheduleTimeList = new List(); + + //上午计划 + for (var date = appointScheduleTemplate.PmStartTime.Value; + date < appointScheduleTemplate.PmStopTime.Value; + date = date.AddMinutes(Convert.ToInt32(appointSchedulePm))) + { + + var appointScheduleTimeStopTime = date.AddMinutes(Convert.ToInt32(appointSchedulePm)); + if (appointScheduleTimeStopTime > appointScheduleTemplate.PmStopTime.Value) + appointScheduleTimeStopTime = appointScheduleTemplate.PmStopTime.Value; + var appointScheduleTimeEntity = new AppointScheduleTime + { + AppointNumber = 0, + StopTime = appointScheduleTimeStopTime, + AppointScheduleId = createEntity.AppointScheduleId, + AppointScheduleTimeId = GuidGenerator.Create(), + NumberLimit = 0, + StartTime = date + }; + + appointScheduleTimeEntity = _appointScheduleTimeManager.CreateAsync(appointScheduleTimeEntity); + + insertAppointScheduleTimeList.Add(appointScheduleTimeEntity); + } + + int numberLimit = appointScheduleTemplate.PmNumberLimit / insertAppointScheduleTimeList.Count; + + insertAppointScheduleTimeList.ForEach(f => f.NumberLimit = numberLimit); + + await _appointScheduleTimeRepository.InsertManyAsync(insertAppointScheduleTimeList); + } + } + + } + + } + } + + + /// + /// 修改某天计划的限制人数 + /// + /// + /// + [HttpPost("api/app/AppointSchedule/UpdateAppointScheduleNumberLimit")] + public async Task UpdateAppointScheduleNumberLimitAsync(UpdateAppointScheduleNumberLimitInputDto input) + { + var appointScheduleEnt = await _appointScheduleRepository.GetAsync(g => g.AppointScheduleId == input.AppointScheduleId); + + //上午截止时间 + var weekId = (int)appointScheduleEnt.AppointDate.DayOfWeek; + var amStopTime = (await _appointScheduleTemplateRepository.GetAsync(g => g.WeekId == weekId)).AmStopTime.Value; + + if (input.AmNumberLimit != null && appointScheduleEnt.AmNumberLimit != input.AmNumberLimit) + { + + //修改上午计划 + + int addNumberLimit = input.AmNumberLimit.Value - appointScheduleEnt.AmNumberLimit; + //增加人数 + var appointScheduleTimeList = await _appointScheduleTimeRepository.GetListAsync(m => m.AppointScheduleId == appointScheduleEnt.AppointScheduleId + && new DateTime(appointScheduleEnt.AppointDate.Year, + appointScheduleEnt.AppointDate.Month, + appointScheduleEnt.AppointDate.Day, + m.StartTime.Hour, + m.StartTime.Minute, + m.StartTime.Second) > DateTime.Now + && m.StartTime < amStopTime); + + if (addNumberLimit > 0) + { + //增加 + var numberLimit = addNumberLimit / appointScheduleTimeList.Count; + if (numberLimit > 0) + { + appointScheduleTimeList.ForEach(f => f.NumberLimit += numberLimit); + + await _appointScheduleTimeRepository.UpdateManyAsync(appointScheduleTimeList); + } + } + else + { + //增加 + var numberLimit = -addNumberLimit / appointScheduleTimeList.Count; + if (numberLimit > 0) + { + appointScheduleTimeList.ForEach(f => f.NumberLimit -= numberLimit); + + await _appointScheduleTimeRepository.UpdateManyAsync(appointScheduleTimeList); + } + } + + + + } + + + if (input.PmNumberLimit != null && appointScheduleEnt.PmNumberLimit != input.PmNumberLimit) + { + + //修改下午计划 + + int addNumberLimit = input.PmNumberLimit.Value - appointScheduleEnt.PmNumberLimit; + //增加人数 + var appointScheduleTimeList = await _appointScheduleTimeRepository.GetListAsync(m => m.AppointScheduleId == appointScheduleEnt.AppointScheduleId + && new DateTime(appointScheduleEnt.AppointDate.Year, + appointScheduleEnt.AppointDate.Month, + appointScheduleEnt.AppointDate.Day, + m.StartTime.Hour, + m.StartTime.Minute, + m.StartTime.Second) > DateTime.Now + &&m.StartTime> amStopTime); + + if (addNumberLimit > 0) + { + //增加 + var numberLimit = addNumberLimit / appointScheduleTimeList.Count; + if (numberLimit > 0) + { + appointScheduleTimeList.ForEach(f => f.NumberLimit += numberLimit); + + await _appointScheduleTimeRepository.UpdateManyAsync(appointScheduleTimeList); + } + } + else + { + //增加 + var numberLimit = -addNumberLimit / appointScheduleTimeList.Count; + if (numberLimit > 0) + { + appointScheduleTimeList.ForEach(f => f.NumberLimit -= numberLimit); + + await _appointScheduleTimeRepository.UpdateManyAsync(appointScheduleTimeList); + } + } + + + + } + } } } diff --git a/src/Shentun.WebPeis.Domain/AppointScheduleTimes/AppointScheduleTimeManager.cs b/src/Shentun.WebPeis.Domain/AppointScheduleTimes/AppointScheduleTimeManager.cs new file mode 100644 index 0000000..da422ab --- /dev/null +++ b/src/Shentun.WebPeis.Domain/AppointScheduleTimes/AppointScheduleTimeManager.cs @@ -0,0 +1,41 @@ +using Shentun.WebPeis.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace Shentun.WebPeis.AppointScheduleTimes +{ + public class AppointScheduleTimeManager : DomainService + { + + + public AppointScheduleTimeManager() + { + + } + + /// + /// 创建 + /// + /// + /// + public AppointScheduleTime CreateAsync( + AppointScheduleTime entity + ) + { + return new AppointScheduleTime + { + AppointNumber = entity.AppointNumber, + AppointSchedule = entity.AppointSchedule, + AppointScheduleId = entity.AppointScheduleId, + AppointScheduleTimeId = entity.AppointScheduleTimeId, + NumberLimit = entity.NumberLimit, + StartTime = entity.StartTime, + StopTime = entity.StopTime + }; + } + } +} diff --git a/src/Shentun.WebPeis.Domain/AppointSchedules/AppointScheduleManager.cs b/src/Shentun.WebPeis.Domain/AppointSchedules/AppointScheduleManager.cs new file mode 100644 index 0000000..3e08013 --- /dev/null +++ b/src/Shentun.WebPeis.Domain/AppointSchedules/AppointScheduleManager.cs @@ -0,0 +1,61 @@ +using Shentun.WebPeis.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Domain.Services; + +namespace Shentun.WebPeis.AppointSchedules +{ + public class AppointScheduleManager : DomainService + { + private readonly IRepository _appointScheduleRepository; + + public AppointScheduleManager( + IRepository appointScheduleRepository + ) + { + _appointScheduleRepository = appointScheduleRepository; + } + + /// + /// 创建 + /// + /// + /// + public async Task CreateAsync( + AppointSchedule entity + ) + { + DataHelper.CheckEntityIsNull(entity); + + var isAppointDate = await _appointScheduleRepository.FirstOrDefaultAsync(f => f.AppointDate == entity.AppointDate); + if (isAppointDate == null) + { + return new AppointSchedule + { + AmNumberLimit = entity.AmNumberLimit, + AppointDate = entity.AppointDate, + AppointScheduleId = entity.AppointScheduleId, + AppointScheduleTimes = entity.AppointScheduleTimes, + PmNumberLimit = entity.PmNumberLimit, + SingleNumberLimit = entity.SingleNumberLimit + }; + } + else + { + isAppointDate.AmNumberLimit = entity.AmNumberLimit; + isAppointDate.AppointDate = entity.AppointDate; + isAppointDate.AppointScheduleTimes = entity.AppointScheduleTimes; + isAppointDate.PmNumberLimit = entity.PmNumberLimit; + isAppointDate.SingleNumberLimit = entity.SingleNumberLimit; + + return isAppointDate; + } + } + + } +} diff --git a/src/Shentun.WebPeis.Domain/DataHelper.cs b/src/Shentun.WebPeis.Domain/DataHelper.cs index 4d2e04f..ea63e59 100644 --- a/src/Shentun.WebPeis.Domain/DataHelper.cs +++ b/src/Shentun.WebPeis.Domain/DataHelper.cs @@ -81,6 +81,22 @@ namespace Shentun.WebPeis } } + /// + /// 获取时间段的所有日期 + /// + /// + /// + /// + public static List GetAllDatesWithinRange(DateTime startDate, DateTime endDate) + { + var dates = new List(); + for (var date = startDate; date <= endDate; date = date.AddDays(1)) + { + dates.Add(date); + } + return dates; + } + /// /// 转换人民币大小金额 /// diff --git a/src/Shentun.WebPeis.Domain/Models/AppointSchedule.cs b/src/Shentun.WebPeis.Domain/Models/AppointSchedule.cs index a350e5d..890e733 100644 --- a/src/Shentun.WebPeis.Domain/Models/AppointSchedule.cs +++ b/src/Shentun.WebPeis.Domain/Models/AppointSchedule.cs @@ -13,7 +13,7 @@ public partial class AppointSchedule : AuditedEntity, IHasConcurrencyStamp /// /// 预约日期 /// - public DateTime? AppointDate { get; set; } + public DateTime AppointDate { get; set; } /// /// 上午数量限制 @@ -29,7 +29,7 @@ public partial class AppointSchedule : AuditedEntity, IHasConcurrencyStamp public int SingleNumberLimit { get; set; } - public string? ConcurrencyStamp { get; set; } + public string ConcurrencyStamp { get; set; } /// /// 主键 /// diff --git a/src/Shentun.WebPeis.Domain/Models/AppointScheduleTime.cs b/src/Shentun.WebPeis.Domain/Models/AppointScheduleTime.cs index 259ab07..d3cb223 100644 --- a/src/Shentun.WebPeis.Domain/Models/AppointScheduleTime.cs +++ b/src/Shentun.WebPeis.Domain/Models/AppointScheduleTime.cs @@ -18,28 +18,28 @@ public partial class AppointScheduleTime : AuditedEntity, IHasConcurrencyStamp /// 开始时间 /// - public TimeOnly? StartTime { get; set; } + public TimeOnly StartTime { get; set; } /// /// 结束时间 /// - public TimeOnly? StopTime { get; set; } + public TimeOnly StopTime { get; set; } /// /// 数量限制 /// - public int? NumberLimit { get; set; } + public int NumberLimit { get; set; } /// /// 已预约数 /// - public int? AppointNumber { get; set; } + public int AppointNumber { get; set; } public string? ConcurrencyStamp { get; set; } - public Guid? AppointScheduleId { get; set; } + public Guid AppointScheduleId { get; set; } public virtual AppointSchedule? AppointSchedule { get; set; } diff --git a/src/Shentun.WebPeis.EntityFrameworkCore/Configures/AppointScheduleConfigure.cs b/src/Shentun.WebPeis.EntityFrameworkCore/Configures/AppointScheduleConfigure.cs index d60cc36..c522492 100644 --- a/src/Shentun.WebPeis.EntityFrameworkCore/Configures/AppointScheduleConfigure.cs +++ b/src/Shentun.WebPeis.EntityFrameworkCore/Configures/AppointScheduleConfigure.cs @@ -37,7 +37,7 @@ namespace Shentun.WebPeis.Configures .HasColumnType("timestamp without time zone") .HasColumnName("last_modification_time"); entity.Property(e => e.LastModifierId).HasColumnName("last_modifier_id"); - entity.Property(e => e.AmNumberLimit).IsRequired().HasColumnName("number_limit"); + entity.Property(e => e.AmNumberLimit).IsRequired().HasColumnName("am_number_limit"); entity.Property(e => e.PmNumberLimit).IsRequired().HasColumnName("pm_number_limit"); entity.Property(e => e.SingleNumberLimit).IsRequired().HasColumnName("single_number_limit"); }