lihongji
2024-07-26 23f7cd51d607dead573dfa5b251d402d502111a2
_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl
@@ -41,55 +41,39 @@
  TextBody:
  [*
    //事件创建二开方法
    //info( startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, recurrenceInterval_i, patternType_i
    //      , patternDaily_IsEveryWeekday_i, periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i );
    //查询是否已有同名事件
    //查询是否已有同名在批量界面创建的事件s
    event := selectobject( owner_i, Event, event, event.Subject() = subject_i 
                     and event.StartTimeOfDay() = startTimeOfDay_i
                     and event.EndTimeOfDay() = endTimeOfDay_i
                     and event.EventType() = eventtype_i );
                           and event.EventType() = eventtype_i );
    //只有通过批量创建界面且已有同名事件进入下面操作
    if( ismultiple and not isnull( event ) ){
      startdate := startDate_i;
      enddate   := startDate_i;
      dates := construct( Dates );
      dates.Add( startDate_i );
      //获取旧事件的开始事件和结束事件,以及所有时间点
      traverse( event, Participation.ExplicitTimeInterval, eti ){
        if( startdate > eti.Start().Date() ){
          startdate := eti.Start().Date();
        }
        if( enddate < eti.Start().Date() ) {
          enddate := eti.Start().Date();
        }
        if( not exists( dates, Elements, e, e = eti.Start().Date() ) ){
          dates.Add( eti.Start().Date() );
      event.IsMultiple( true );
      lp        := event.LeadingParticipation();
      timezone  := lp.Calendar().GetTimeZone();
      starttime := startDate_i.DateTime( timezone ).AddAsPeriod( timezone, startTimeOfDay_i );
      endtime   := endDate_i.DateTime( timezone ).AddAsPeriod( timezone, endTimeOfDay_i );
      etis      := selectset( lp, Subscription.ExplicitTimeInterval, eti, true );
    //  startDate := starttime.Date( timezone );
    //  endDate   := endtime.Date( timezone ) - ifexpr( endtime = endtime.StartOfDay( timezone ), 1, 0 );
      leadingETI := selectobject( lp, ExplicitTimeInterval, eti, eti.Start() = starttime and eti.End() = endtime );
      if( isnull( leadingETI ) ){
        leadingETI := lp.CreateTimeInterval( starttime, endtime, event.Capacity() );
      }
      lp.AddSubscribers( subscribers_i, true );
      if( not isnull( leadingETI ) ){
        traverse( lp, Subscription, subscription, subscribers_i.Find( subscription.Calendar() ) >= 0 ){
          traverse( subscription, ExplicitTimeInterval, eti, etis.Find( eti ) < 0 ){
            eti.Delete();
          }
          subscribingETI := subscription.CreateTimeInterval( starttime, endtime, event.Capacity() );
          if( not isnull( subscribingETI ) ){
            subscribingETI.LeadingETI( relset, leadingETI );
          }
        }
      }
      //修改旧事件的间隔
      nrOfOccurrences_i := enddate - startdate + 1;
      startDate_i := startdate;
      endDate_i   := startdate;
      periodStartDate_i := startdate;
      periodEndDate_i := enddate;
    //  info( startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, recurrenceInterval_i, patternType_i
    //      , patternDaily_IsEveryWeekday_i, periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i );
      event := LibCal_Event::CreateUpdateFromUI( owner_i, event.LeadingParticipation(), subject_i, description_i, type_i, capacity_i, category_i, isDefault_i,
                                      startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i,
                                      isRecurring_i, recurrenceInterval_i,
                                      patternType_i, patternDaily_IsEveryWeekday_i, patternWeekly_Weekdays_i,
                                      patternMonthly_IsDay_i, patternMonthly_Day_i, patternMonthly_WeekOfMonth_i, patternMonthly_DayOfWeek_i,
                                      patternYearly_IsDate_i, patternYearly_Month_i, patternYearly_Day_i, patternYearly_WeekOfMonth_i, patternYearly_DayOfWeek_i,
                                      periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i, subscribers_i );
      //删掉不需要的时间点
      timeIntervals := construct( LibCal_ExplicitTimeIntervals );
      traverse( event, Participation.ExplicitTimeInterval, eti ){
    //    info( '------------------------------', eti.Start(), eti.End(), exists( dates, Elements, e, e = eti.Start().Date() ), '------------------', dates.Find( eti.Start().Date() ) );
        if( dates.Find( eti.Start().Date() ) < 0 ){
          timeIntervals.Add( eti );
        }
      }
      LibCal_ExplicitTimeInterval::Delete( timeIntervals, true );
    } else {
      event := LibCal_Event::CreateUpdateFromUI( owner_i, participation_i, subject_i, description_i, type_i, capacity_i, category_i, isDefault_i, 
                                      startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, 
@@ -97,8 +81,9 @@
                                      patternType_i, patternDaily_IsEveryWeekday_i, patternWeekly_Weekdays_i, 
                                      patternMonthly_IsDay_i, patternMonthly_Day_i, patternMonthly_WeekOfMonth_i, patternMonthly_DayOfWeek_i,
                                      patternYearly_IsDate_i, patternYearly_Month_i, patternYearly_Day_i, patternYearly_WeekOfMonth_i, patternYearly_DayOfWeek_i,
                                      periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i, subscribers_i );
                                      periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i, subscribers_i, ismultiple );
    }
    if( not isnull( event ) ){
      event.EventType( relset, eventtype_i );
    }