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, "提交排班数据失败"));
        }
Exemple #2
0
 /// <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;
     }));
 }