Browse Source

生成计划

master
wxd 1 year ago
parent
commit
141cbd30e9
  1. 19
      src/Shentun.WebPeis.Application.Contracts/AppointSchedules/CreateAppointScheduleWithDetailInputDto.cs
  2. 23
      src/Shentun.WebPeis.Application.Contracts/AppointSchedules/UpdateAppointScheduleNumberLimitInputDto.cs
  3. 3
      src/Shentun.WebPeis.Application/AppointScheduleTemplates/AppointScheduleTemplateAppService.cs
  4. 281
      src/Shentun.WebPeis.Application/AppointSchedules/AppointScheduleAppService.cs
  5. 41
      src/Shentun.WebPeis.Domain/AppointScheduleTimes/AppointScheduleTimeManager.cs
  6. 61
      src/Shentun.WebPeis.Domain/AppointSchedules/AppointScheduleManager.cs
  7. 16
      src/Shentun.WebPeis.Domain/DataHelper.cs
  8. 4
      src/Shentun.WebPeis.Domain/Models/AppointSchedule.cs
  9. 10
      src/Shentun.WebPeis.Domain/Models/AppointScheduleTime.cs
  10. 2
      src/Shentun.WebPeis.EntityFrameworkCore/Configures/AppointScheduleConfigure.cs

19
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
{
/// <summary>
/// 开始日期
/// </summary>
public string StartDate { get; set; }
/// <summary>
/// 结束日期
/// </summary>
public string EndDate { get; set; }
}
}

23
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
{
/// <summary>
/// 主键
/// </summary>
public Guid AppointScheduleId { get; set; }
/// <summary>
/// 上午数量限制
/// </summary>
public int? AmNumberLimit { get; set; }
/// <summary>
/// 下午数量限制
/// </summary>
public int? PmNumberLimit { get; set; }
}
}

3
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
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/AppointScheduleTemplate/CreateOrUpdateAppointScheduleTemplate")]
public async Task<List<AppointScheduleTemplateDto>> CreateOrUpdateAppointScheduleTemplateAsync(List<CreateAppointScheduleTemplateDto> input)
{
List<AppointScheduleTemplateDto> entListDto = new List<AppointScheduleTemplateDto>();

281
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<AppointSchedule> _repository;
private readonly IRepository<AppointSchedule> _appointScheduleRepository;
private readonly IRepository<AppointScheduleTemplate> _appointScheduleTemplateRepository;
private readonly IRepository<AppointScheduleTime> _appointScheduleTimeRepository;
private readonly CacheService _cacheService;
private readonly AppointScheduleManager _appointScheduleManager;
private readonly AppointScheduleTimeManager _appointScheduleTimeManager;
private readonly SysParmValueManager _sysParmValueManager;
public AppointScheduleAppService(IRepository<AppointSchedule> repository,
CacheService cacheService
)
public AppointScheduleAppService(IRepository<AppointSchedule> appointScheduleRepository,
CacheService cacheService,
AppointScheduleManager appointScheduleManager,
IRepository<AppointScheduleTemplate> appointScheduleTemplateRepository,
IRepository<AppointScheduleTime> appointScheduleTimeRepository,
AppointScheduleTimeManager appointScheduleTimeManager,
SysParmValueManager sysParmValueManager)
{
_repository = repository;
_appointScheduleRepository = appointScheduleRepository;
_cacheService = cacheService;
_appointScheduleManager = appointScheduleManager;
_appointScheduleTemplateRepository = appointScheduleTemplateRepository;
_appointScheduleTimeRepository = appointScheduleTimeRepository;
_appointScheduleTimeManager = appointScheduleTimeManager;
_sysParmValueManager = sysParmValueManager;
}
/// <summary>
/// 获取预约日期列表
@ -67,5 +83,258 @@ namespace Shentun.WebPeis.AppointSchedules
return appointScheduleDateDtos;
}
/// <summary>
/// 生成预约日期计划
/// </summary>
/// <returns></returns>
[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<DateTime> 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<AppointScheduleTime> insertAppointScheduleTimeList = new List<AppointScheduleTime>();
//上午计划
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<AppointScheduleTime> insertAppointScheduleTimeList = new List<AppointScheduleTime>();
//上午计划
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);
}
}
}
}
}
/// <summary>
/// 修改某天计划的限制人数
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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);
}
}
}
}
}
}

41
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()
{
}
/// <summary>
/// 创建
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
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
};
}
}
}

61
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<AppointSchedule> _appointScheduleRepository;
public AppointScheduleManager(
IRepository<AppointSchedule> appointScheduleRepository
)
{
_appointScheduleRepository = appointScheduleRepository;
}
/// <summary>
/// 创建
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AppointSchedule> 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;
}
}
}
}

16
src/Shentun.WebPeis.Domain/DataHelper.cs

@ -81,6 +81,22 @@ namespace Shentun.WebPeis
}
}
/// <summary>
/// 获取时间段的所有日期
/// </summary>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public static List<DateTime> GetAllDatesWithinRange(DateTime startDate, DateTime endDate)
{
var dates = new List<DateTime>();
for (var date = startDate; date <= endDate; date = date.AddDays(1))
{
dates.Add(date);
}
return dates;
}
/// <summary>
/// 转换人民币大小金额
/// </summary>

4
src/Shentun.WebPeis.Domain/Models/AppointSchedule.cs

@ -13,7 +13,7 @@ public partial class AppointSchedule : AuditedEntity, IHasConcurrencyStamp
/// <summary>
/// 预约日期
/// </summary>
public DateTime? AppointDate { get; set; }
public DateTime AppointDate { get; set; }
/// <summary>
/// 上午数量限制
@ -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; }
/// <summary>
/// 主键
/// </summary>

10
src/Shentun.WebPeis.Domain/Models/AppointScheduleTime.cs

@ -18,28 +18,28 @@ public partial class AppointScheduleTime : AuditedEntity, IHasConcurrencyStamp
/// 开始时间
/// </summary>
public TimeOnly? StartTime { get; set; }
public TimeOnly StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public TimeOnly? StopTime { get; set; }
public TimeOnly StopTime { get; set; }
/// <summary>
/// 数量限制
/// </summary>
public int? NumberLimit { get; set; }
public int NumberLimit { get; set; }
/// <summary>
/// 已预约数
/// </summary>
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; }

2
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");
}

Loading…
Cancel
Save