public async Task <IActionResult> CreateCopyScheduleAsync([FromBody] CreateCopyScheduleRequestDto requestDto) { var biz = new DoctorScheduleBiz(); requestDto.ScheduleDates = requestDto.ScheduleDates.Select(a => a.Date).ToList(); var checkTheSameMonth = requestDto.ScheduleDates.Select(a => a.Date.AddDays(1 - a.Day)).Distinct().Count() > 1; if (checkTheSameMonth) { return(Failed(ErrorCode.UserData, "不能跨月选择应用到的日期")); } if (requestDto.Details.All(a => a.Doctors == null || !a.Doctors.Any())) { return(Failed(ErrorCode.UserData, "至少需要有一个时段内存在医生排班")); } #region 班次模板基础数据检测 var newTemplateModel = await new DoctorWorkshifTemplateBiz().GetAsync(requestDto.TemplateGuid); if (newTemplateModel == null) { return(Failed(ErrorCode.UserData, "传入的班次模板模板数据未找到")); } var workshiftDetailModels = await new DoctorWorkshiftDetailBiz().GetModelsByTemplateGuidAsync(requestDto.TemplateGuid); if (!workshiftDetailModels.Any()) { return(Failed(ErrorCode.UserData, "班次模板下未找到详细的班次数据")); } var invalidWorkshiftDetailIds = new List <string>(); var checkWorkshiftDetailIds = requestDto.Details.All(a => { var checkRes = workshiftDetailModels.FirstOrDefault(b => b.WorkshiftDetailGuid == a.WorkshiftDetailGuid); if (checkRes == null) { invalidWorkshiftDetailIds.Add(a.WorkshiftDetailGuid); } return(checkRes != null); }); if (!checkWorkshiftDetailIds) { return(Failed(ErrorCode.UserData, $"班次guid[{string.Join(",", invalidWorkshiftDetailIds.Distinct())}])非法,未在数据库查找到")); } #endregion var checkWhetherScheduleModel = await biz.GetModelsByScheduleDatesAsync(requestDto.ScheduleDates, UserID); var hasScheudleDates = requestDto.ScheduleDates.Intersect(checkWhetherScheduleModel.Select(a => a.ScheduleDate)); if (hasScheudleDates.Count() > 0) { return(Failed(ErrorCode.UserData, $"[{string.Join(",", hasScheudleDates.Select(a => a.ToString("yyyy/MM/dd")))}]已有排班")); } var oneDate = requestDto.ScheduleDates.FirstOrDefault(); var startDate = oneDate.Date.AddDays(1 - oneDate.Day); var hasCycle = true; var cycle = await new DoctorScheduleCycleBiz().GetHospitalCycleByStartDateAsync(UserID, startDate); if (cycle == null) { hasCycle = false; cycle = new DoctorScheduleCycleModel { CycleGuid = Guid.NewGuid().ToString("N"), HospitalGuid = UserID, StartDate = startDate, EndDate = startDate.AddMonths(1).AddDays(-1), CreatedBy = UserID, LastUpdatedBy = UserID, OrgGuid = string.Empty }; } List <DoctorScheduleModel> modelsOneDay = new List <DoctorScheduleModel>(); List <DoctorScheduleModel> models = new List <DoctorScheduleModel>(); //先创建一天的排班数据 foreach (var item in requestDto.Details) { modelsOneDay.AddRange(item.Doctors.Select(a => new DoctorScheduleModel { ScheduleGuid = Guid.NewGuid().ToString("N"), HospitalGuid = UserID, TemplateGuid = requestDto.TemplateGuid, ScheduleDate = oneDate, CycleGuid = cycle.CycleGuid, WorkshiftDetailGuid = item.WorkshiftDetailGuid, DoctorGuid = a.DoctorGuid, AppointmentLimit = item.AppointmentLimit.Value, AppointmentQuantity = 0, CreatedBy = UserID, LastUpdatedBy = UserID, OrgGuid = string.Empty })); } //将排班数据复制到其他日期上 requestDto.ScheduleDates.ForEach(a => { var oneDayData = modelsOneDay.Select(m => m.Clone() as DoctorScheduleModel).ToList(); oneDayData.ForEach(m => { m.ScheduleGuid = Guid.NewGuid().ToString("N"); m.ScheduleDate = a.Date; }); models.AddRange(oneDayData); }); var result = await biz.CreateCopyScheduleAsync(models, cycle, hasCycle); return(result ? Success() : Failed(ErrorCode.DataBaseError, "提交排班数据失败")); }
/// <summary> /// 新增或复制排班数据 /// </summary> /// <returns></returns> public async Task <bool> CreateCopyScheduleAsync(List <DoctorScheduleModel> models, DoctorScheduleCycleModel cycleModel, bool hasCycle) { return(await MySqlHelper.TransactionAsync(async (conn, trans) => { models.InsertBatch(conn); if (!hasCycle) { await conn.InsertAsync <string, DoctorScheduleCycleModel>(cycleModel); } return true; })); }