lazhen
2024-06-12 0d6690da8177b3dab9a714dbb9ec3e3344631e9a
_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl
@@ -33,21 +33,75 @@
  Date periodStartDate_i,
  Number nrOfOccurrences_i,
  Date periodEndDate_i,
  LibCal_Calendars subscribers_i
  LibCal_Calendars subscribers_i,
  Boolean ismultiple
) as LibCal_Event
{
  Description: 'Create and/or update an Event and its LeadingParticipation, based on information from the UI.'
  TextBody:
  [*
    event := LibCal_Event::CreateUpdateFromUI( owner_i, participation_i, subject_i, description_i, type_i, capacity_i, category_i, isDefault_i,
    //事件创建二开方法
    //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 := selectobject( owner_i, Event, event, event.Subject() = subject_i
                     and event.StartTimeOfDay() = startTimeOfDay_i
                     and event.EndTimeOfDay() = endTimeOfDay_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() );
        }
      }
      //修改旧事件的间隔
      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 );
    event.EventType( relset, eventtype_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,
                                      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 );
    }
    if( not isnull( event ) ){
      event.EventType( relset, eventtype_i );
    }
    
    return event;
  *]