编辑代码

/**
*魏聪
*2022-6-30
* 1.编辑保存前,将主表中的排课日期和明细表中的排课日期对齐;
* 小课、大课业务类型:
* 2.寻找讲师不能参与排课的日期,与当前的日期做比较,校验是否已排课
* 3.期数限制
* 4.周五六日同城
**/

//排课规则
String rule = context.data.field_2d5dZ__c as String
//业务类型
String record_type = context.data.record_type as String 
//数据id
String id = context.data._id as String
//上课讲师(查找)
String teacherID = context.data.field_0jhWj__c as String
//当前用户id
String opuserid=context.userId as String 


Map result = [:]
List resultList = [] 
Map date = [:]
long now = (Date.now() as Date).toTimestamp()

String flag = '0'  //判断是否要阻断
String making_people = context.userId as String
//查询当前用户的内部角色
def(boolean errorP, List dataP, String messageP) = Fx.auth.user.getRolesByUsers(1, [making_people])
if (errorP) {
  log.info("error: " + messageP)
} else {
  log.info(dataP)
  dataP.find{i ->
    Map tmp_people = i as Map
    //写死判断角色
    if(tmp_people.containsValue("61302c0bbc2704167c5e2628")||tmp_people.containsValue("61302c370c2ec51a396f1f2c")||tmp_people.containsValue("61302c43a6b9516fc5930d79" )){   //如果是教研员
      flag = '2'
      log.info("教务员/大项目专员/大项目经理在操作该页面!")
      return true
    }else{
      flag = '1'
      log.info("校长在操作该页面")
    }
    if(tmp_people.containsValue("627db5503e048974906fd874")){
      flag = '1'
      log.info("受控的角色操作了页面")
      return true
    }
}
}


//保存前对明细里的日期和排课日期里的日期做对比,保持排课日期的值和明细里的值相同
List details = context.details["object_3s7hD__c"] as  List  //排课明细
  // log.info(details)
  //排课明细中的所有日期
  List details_date = []
  details.each{i ->   //从排课明细中取出日期
    Map details_tmp = i as Map
    details_date.add(details_tmp.field_dX12n__c)
  }
  log.info("从排课明细中取出日期:"+details_date)
  details_date = Fx.utils.listUnique(details_date)  //去重
  log.info("去重(从排课明细中取出)的日期:"+details_date)
  String details_date_str = ''
  //时间拼接成逗号分隔的格式
  details_date.eachWithIndex{ item,int index ->
    String tmp = item as String
    if( index == 0 ){
      details_date_str = tmp
    }else{
      details_date_str+=","+tmp
    }
   
  }
  log.info("排课明细里的日期提取为字符串:"+details_date_str)
context.data.field_44c1g__c = details_date_str //排课日期
context.data.field_jjtcI__c =  details_date.size()  //排课天数
 
//保存前对排课明细里的排课日期与讲师请假日期做对比
// if( record_type == 'default__c' || record_type == 'record_Penno__c'){
if( record_type == 'default__c'){
  log.info("业务类型为:小课/大课")
  FindAttribute findAttribute = FindAttribute.builder()
    .useCurrentIdentity(false)
    .forceQueryFromDB(false)
    .build()
  def (Boolean errorR,Map dataR,String errorMessageR) = Fx.object.findById('object_317OI__c',  rule)
  if( errorR ){
    log.info(errorMessageR)
  }else{
      log.info("排课规则:"+dataR)                                 //排课规则
      date.put("startTime", dataR.field_ymsnR__c as String)       //开始时间
      date.put("endTime", dataR.field_7325N__c as String)         //结束时间
      date.put("continuousDates", dataR.field_BKi6y__c as String) //不能连续上课天数
      log.info(date)
  }
    
  log.info("时间范围:"+date)
if(date!=null && date.startTime!=null && date.endTime!=null && date.continuousDates!=null){
  long ruleStartLong = (Date.of(date.startTime as String) as Date).toTimestamp() as long
  long ruleEndLong = (Date.of(date.endTime as String) as Date).toTimestamp() as long
  //1.找讲师请假,请假开始日期小于排课结束日期且请假结束日期大于排课开始日期的、非解锁状态的请假   ["field_nUJ12__c": Operator.LTE(ruleEndLong)],["field_GO0j3__c": Operator.GTE(ruleStartLong)],
  def (Boolean error1,QueryResult data1,String errorMessage1) =
  Fx.object.find("object_uLDSo__c",[["field_GO0j3__c": Operator.GTE(ruleStartLong)],["field_9ktFj__c":teacherID],["life_status":Operator.NE("invalid")],["field_u72Hj__c":Operator.NE("Unlock")]],["create_time":1], 100, 0, findAttribute);
  if( error1 ){
    log.info(errorMessage1)
  }else{
    if( data1.size>0 ){
      log.info("找到"+data1.size+"条讲师请假")
      data1.dataList.each{i ->
      log.info("====")
        Map tmp = i as Map
        Date tmp_start = (tmp.field_nUJ12__c as DateTime).toDate()//初始化为Date,去掉小时
        Date tmp_end = (tmp.field_GO0j3__c as DateTime).toDate()
        long thisStartLong = tmp_start.toTimestamp()  //请假开始日期
        long thisEndLong = tmp_end.toTimestamp()  //请假结束日期
        log.info("开始日期:"+tmp_start+"  结束日期:"+tmp_end)
        Range range = Ranges.of(1,30)
        Date cannotDate = Date.of(tmp_start as String) as Date //不能参与的开始时间,先等于排课开始日期
        resultList.add(cannotDate as String)
            //获取排课开始日期~排课结束日期
        range.each{
          long cannotDateLong = cannotDate.toTimestamp()
            if( cannotDateLong < thisEndLong ){//s2~e2
                cannotDate = cannotDate+1.days
                resultList.add(cannotDate as String)
              }
            } 
          log.info((tmp.name as String)+"在排课规则范围内的讲师请假日期(排课开始日期~排课结束日期):"+resultList)
      }
      log.info("总的讲师请假日期集合:"+resultList)
    }
  }
  //1.找讲师请假END
List pk = [] 
  //2.找已经参与的排课明细(排课规则日期范围内的、不是本张单据的、除了作废外的)
  def (Boolean error2,QueryResult data2,String errorMessage2) =
  Fx.object.find("object_3s7hD__c",[["field_kGmGb__c":Operator.NE(id)],["life_status":Operator.NIN(["invalid"])],["field_dX12n__c": Operator.LTE(ruleEndLong)],["field_dX12n__c": Operator.GTE(ruleStartLong)],["field_HLros__c":teacherID]],["create_time":1], 100, 0, findAttribute);
  if( error2 ){
    log.info(errorMessage2)
  }else{
    if(data2.size>0){
      log.info("共找到"+data2.size+"条排课明细")
      data2.dataList.eachWithIndex { i, int index ->
        Map tmp = i as Map
        log.info("=======")
        Date cannotDate = tmp.field_dX12n__c as Date //不能参与的开始时间,先等于请假开始日期
        log.info("主属性="+tmp.name)
        log.info("参与排课的日期:"+cannotDate)
        pk.add(cannotDate as String)
        // if( index == data2.size -1 ){
        //   Date cannotDate1 = cannotDate+1.days //不能参与的开始时间,先等于请假开始日期
        //   pk.add(cannotDate1 as String)        
        // }
      }
      log.info("讲师参与排课的日期:"+pk)
    }else{
      log.info("在规则内没有排课明细")
    }
  }
    resultList = (resultList + pk).sort(true) 
    resultList = Fx.utils.listUnique(resultList)  
    log.info("最终日期:"+resultList)
  }
  if(teacherID == '627caeca72b3950001377d94'){   //待确认的讲师不找排课
    resultList = []
  }
    List date_str_list = resultList
    log.info("讲师不能上课日期:"+date_str_list)
    List intersect_list = []
    date_str_list.each{i ->
      if( details_date_str.contains(i as String) ){
        log.info(i as String)
        intersect_list.add(i as String)
      }
    }
  log.info("交集日期:"+intersect_list)
    if(intersect_list!=null&&intersect_list.size()>0){
      intersect_list = Fx.utils.listUnique(intersect_list)
        if(opuserid=="1007"){
          
        }else{
          return ["error":true, "errorMessage":"讲师在"+intersect_list+"请假/已有排课,请修改排课明细的日期!", "block":true ]//同一天两个课【不能】排一个讲师
     
        }
        //  return ["error":true, "errorMessage":"讲师在"+intersect_list+"请假/已有排课,请修改排课明细的日期!", "block":false ]//同一天两个课【能】排一个讲师
    }
    
  /*******************************判断该校区是否有期数限制***************************************/
  // String rule = context.data.field_2d5dZ__c
  String isX = 'N'
  String course = context.data.field_tP1kG__c as String   //课程id
  String school = context.data.field_cAn5H__c as String //上课校区
  String school_level = context.data.field_Pzj6M__c as String
  APIResult ret = Fx.object.findOne("ProductObj", //查询客户对象
            FQLAttribute.builder()
                .columns(["_id", "name","field_B5b0b__c"]) //返回的数据id
                .queryTemplate( QueryTemplate.AND(["_id": QueryOperator.EQ(course)] ))
                .build(),
            SelectAttribute.builder()
                .needInvalid(false)
                .build());
  if(ret.isError()){
    log.info(ret.message());
  }else{
    log.info(ret.data)
    //field_B5b0b__c 产品大类
    if( ((ret.data as Map).field_B5b0b__c as String )=='Z3tuqWYM8'){
      isX = 'Y'
    }
  }
  if( school_level!=null &&school_level == "A+" ){
    school_level =  "AA"
  }
  log.info("校区等级:"+school_level)
  //object_tcZ0f__c 课程期数
  def (Boolean error,QueryResult data,String errorMessage) =
  Fx.object.find("object_tcZ0f__c",[["field_S3bYK__c":rule],["field_SN6AR__c": Operator.EQ(school_level)]],10,0);
  if( error ){
    log.info("查找课程期数失败:"+errorMessage)
  }else{
    log.info("查找对应校区等级的课程期数:"+data.total)
    if( data.total>0 ){
      log.info("有对应的课程期数限制:"+data)
      Map tmp = data.dataList[0] as Map
      BigDecimal dz_quota = tmp.field_51I61__c as BigDecimal  //可排期数
      BigDecimal others_quota = tmp.field_J2ql9__c as BigDecimal  //可排期数
    log.info("当众讲话可排期数:"+dz_quota+"   其他可排:"+others_quota)
      //查找已创建的排课列表
      def (Boolean error12,QueryResult data12,String errorMessage12) =
      Fx.object.find("object_G2aY4__c",[["field_2d5dZ__c":rule],["field_cAn5H__c": Operator.EQ(school)],["_id":Operator.NE(context.data._id as String)],["field_tP1kG__c":Operator.EQ(course)]],10,0);
      if( error12 ){
        log.info("查找课程期数失败:"+errorMessage12)
      }else{
        log.info("查找已排课表:"+data12)
          if( course == "612d9a2a2a65980001f062bf" &&  (data12.total as BigDecimal)>= dz_quota ){
            log.info("当众讲话已达规则下可排课额度")
            return ["error":true, "errorMessage":"您校区的《当众讲话》已达本月的排课次数上限,不允许再排课!", "block":true ]
          }else if(course != "612d9a2a2a65980001f062bf" && isX =='Y' &&  (data12.total as BigDecimal)>= others_quota){
            log.info("已达规则下可排课额度")
            return ["error":true, "errorMessage":"您校区的《其他小课》已达本月的排课次数上限,不允许再排课!", "block":true ]
          }else{
            log.info("没有已排课表")
          }
      }
    }else{
      log.info("没有对应的课程期数限制")
    }
  }
  /*******************************END判断该校区是否有期数限制***************************************/
/********************************改周五六日同城,如果规则是同城,则限制,否则不限制********************************************/
  Boolean isSameCity = false
  //排课规则object_317OI__c
  //周五六日是否同城field_23Kq4__c
  APIResult retRule = Fx.object.find("object_317OI__c", //查询客户对象
            FQLAttribute.builder()
                .columns(["_id", "field_23Kq4__c"]) //返回的数据id
                .queryTemplate( QueryTemplate.AND(["_id": QueryOperator.EQ(rule)] ))
                .build(),
            SelectAttribute.builder()
                .needInvalid(false) //是否需要返回作废数据
                .build());
  if(retRule.isError()){
      log.info(retRule.message());
  }else{
    log.info(retRule.data)
    if( (retRule.data as QueryResult).size>0 ){
      isSameCity = ((retRule.data as QueryResult).dataList[0] as Map).field_23Kq4__c as Boolean
    }
  }
  
  
if(details_date !=null && details_date!=[]&& teacherID!=null && teacherID!='627caeca72b3950001377d94'&&isSameCity){
  List days_flag = []
  int days_count = 0
  List date_list = details_date
  date_list.each{i ->
    Date tmp_date = Date.of(i as String)
    if( (tmp_date.dayOfWeek as int) == 5){
      days_flag.add(["50":tmp_date])
      days_count+=1
    }else if((tmp_date.dayOfWeek as int) == 6){
      days_flag.add(["60":tmp_date])
      days_count+=1
    }else if((tmp_date.dayOfWeek as int) == 7){
      days_flag.add(["70":tmp_date])
      days_count+=1
    }
  }
  List find_days = []
  if( days_count!=0||days_count!=3 ){
    if( days_count == 1 ){
      log.info("选了三天中的一天")
      int dayOfWeek_tmp_int = 0
      List dayOfWeek_tmp = []
      days_flag.each{i ->
        dayOfWeek_tmp.add(((i as Map).keys() as List)[0] )
      }
      
      dayOfWeek_tmp.each{i1 ->    //找最大的日期是周几
        if( (i1 as int)>dayOfWeek_tmp_int ){
          dayOfWeek_tmp_int = i1 as int
        }
      }
      switch(dayOfWeek_tmp_int){
        case 50: 
          List dayOfWeek_date_list = days_flag.collect{x ->x["50"]} as List
          find_days.add((dayOfWeek_date_list[0] as Date)+1.days)
          find_days.add((dayOfWeek_date_list[0] as Date)+2.days)
          break;
        case 60: 
          List dayOfWeek_date_list = days_flag.collect{x ->x["60"]}
          find_days.add((dayOfWeek_date_list[0] as Date)+1.days)
          find_days.add((dayOfWeek_date_list[0] as Date)-1.days)
          break;
        case 70: 
          List dayOfWeek_date_list = days_flag.collect{x ->x["70"]}
          find_days.add((dayOfWeek_date_list[0] as Date)-1.days)
          find_days.add((dayOfWeek_date_list[0] as Date)-2.days)
          break;
        default:  break;

      }
      
    }
    if( days_count == 2 ){
      log.info("选了三天中的两天")
      List dayOfWeek_tmp = []
      days_flag.each{i ->
        dayOfWeek_tmp.add(((i as Map).keys() as List)[0] )
      }
      int dayOfWeek_tmp_int = 0
      dayOfWeek_tmp.each{i1 ->    //找最大的日期是周几
        dayOfWeek_tmp_int += (i1 as int)
      }
      log.info("天数总和:"+dayOfWeek_tmp_int+"   days_flag:"+days_flag)
      switch(dayOfWeek_tmp_int){
        case 110:   //说明选的是周五周六
          List dayOfWeek_date_list = days_flag.collect{x ->x["60"]}
          log.info("110时取出的日期:"+dayOfWeek_date_list)
          //因为collect取出来的日期是【null,2022-09-03】这样的格式,如果直接读取会报错,必须要找到非空的元素
          dayOfWeek_date_list.find{ i2 ->
            if( (i2 as Date)!=null ){//非空,则读取元素
              find_days.add(((i2 as Date)+1.days).toTimestamp() as long)  //找周日的日期
              return true
            }
          }
          break;
        case 120: //说明选的是周五周日
          List dayOfWeek_date_list = days_flag.collect{x ->x["50"]}
          log.info("120时取出的日期:"+dayOfWeek_date_list)
          //因为collect取出来的日期是【null,2022-09-03】这样的格式,如果直接读取会报错,必须要找到非空的元素
          dayOfWeek_date_list.find{ i2 ->
            if( (i2 as Date)!=null ){//非空,则读取元素
              find_days.add(((i2 as Date)+1.days).toTimestamp() as long) //找周六的日期
              return true
            }
          }
          break;
        case 130: //说明选的是周日周六
          List dayOfWeek_date_list = days_flag.collect{x ->x["60"]}
          log.info("130时取出的日期:"+dayOfWeek_date_list)
          //因为collect取出来的日期是【null,2022-09-03】这样的格式,如果直接读取会报错,必须要找到非空的元素
          dayOfWeek_date_list.find{ i2 ->
            if( (i2 as Date)!=null ){//非空,则读取元素
                find_days.add(((i2 as Date)-1.days).toTimestamp() as long) //找周五的日期
                return true
            }
          }
          break;
        default:  break;

      }      
    }
    log.info("需要查找的日期:"+find_days+'讲师:'+teacherID)

    if(find_days!=null&&find_days!=[]&&find_days.size()>0){
        //查询ltc
        APIResult ret0 = Fx.object.find("object_3s7hD__c", //查询排课明细对象
            FQLAttribute.builder()
                .columns(["field_4sD21__c","name"]) //返回的数据id
                .queryTemplate( QueryTemplate.AND(["field_HLros__c": QueryOperator.EQ(teacherID)],["field_dX12n__c":Operator.IN(find_days)] ))
                .build(),
            SelectAttribute.builder()
                .needInvalid(false) //是否需要返回作废数据
                .build());
        if(ret0.isError()){
            log.info(ret0.message());
        }else{
          log.info("周五周六周日的排课明细"+ret0.data)
          QueryResult qr = ret0.data as QueryResult
          String city_standard = ''
          if( qr.size>0 ){
            //查询根据ltc查询ltc详细信息
            APIResult ret1 = Fx.object.findOne("object_2bwgw__c", //查询本次排课中的校区对象
                FQLAttribute.builder()
                    .columns(["field_kx487__c"]) //返回的数据id
                    .queryTemplate( QueryTemplate.AND(["_id": QueryOperator.EQ(school)] ))
                    .build(),
                SelectAttribute.builder()
                    .needInvalid(false) //是否需要返回作废数据
                    .build());
            if(ret1.isError()){
                log.info(ret1.message());
            }else{
              log.info("校区"+school+"的城市为:"+ret1.data)
              city_standard = (ret1.data as Map).field_kx487__c  as String 
            }
            List pk_dayOfWeek = (qr.dataList as List)
            String flag_1 = 'Y'
            List campus_dayOfWeek = pk_dayOfWeek.collect{x ->x["field_4sD21__c"]} as List
            campus_dayOfWeek.find{i2 ->
              APIResult ret2 = Fx.object.findOne("object_2bwgw__c", //查询周五六日校区对象
                  FQLAttribute.builder()
                      .columns(["name","field_kx487__c"]) //返回的数据id
                      .queryTemplate( QueryTemplate.AND(["_id": QueryOperator.EQ(i2 as String)] ))
                      .build(),
                  SelectAttribute.builder()
                      .needInvalid(false) //是否需要返回作废数据
                      .build());
              if(ret2.isError()){
                  log.info(ret2.message());
              }else{
                log.info("周五六日排课校区的城市为:"+ret2.data)
                String city= (ret2.data as Map)."field_kx487__c" as String
                log.info("city:"+city+"  city_standard:"+city_standard)
                if( city!=null && city!=''&& !city.contains(city_standard)){
                  if((city.contains('484')&&city_standard.contains('479'))||(city.contains('479')&&city_standard.contains('484'))){
                    log.info("广佛")
                  }else{
                    flag_1 = 'N'
                      return true
                  }
                  }else{
                    log.info("城市为空或城市相等!")
                }
              }
    
            }
            if( flag_1 == 'N' ){
            //  return ["error":true, "errorMessage":"该老师在周五/六/日已有其他城市的排课!请修改排课日期!", "block":true ]
            }
          }else{
            log.info("周五六日暂时无多个城市的情况")
          }
        }
    }
    }else{
      log.info("没有选到周五周六日")
    }
  
  }

}else{
  log.info("其他类型的排课,不对日期、期数做校验")
}

// 排课验证擅长课程

String skjs = context.data.field_9mq1d__c  //讲师姓名
log.info(skjs)

String pkmc = context.data.field_tP1kG__c //排课课程名称

log.info("排课课程名称:"+pkmc)

//查询讲师信息表
def js = Fx.object.find("object_q4TS1__c",[["name":skjs]],10, 0)
if(js[0]){
  log.info("查询失败,原因:"+ js[2])
}else{
//  log.info("查询到的列表数据:"+ js[1])
}


List jsids1 = js[1]["dataList"]["_id"] as List //ID
String jsids = jsids1[0] as String

log.info("讲师ID:"+jsids)



//查询擅长课程
def sckc = Fx.object.find("object_QKrk8__c",[["field_NwaBP__c":jsids]],50, 0)
if(sckc[0]){
  log.info("查询失败,原因:"+ sckc[2])
}else{
//  log.info("查询到的列表数据:"+ sckc[1])
}

String record = context.data.record_type //业务类型

String RS = context.data.field_oVkl9__c //讲师确认到课人数


List A = sckc[1]["dataList"] as List
List jssckc = []
A.each{
   itemA ->
    String kcmc = itemA["field_r0j45__c"]
    jssckc.add(kcmc)
}
log.info("取出擅长课程:"+jssckc)

Boolean a = jssckc.containsAll(pkmc)

log.info(a)

if( a == false && jsids != "627caeca72b3950001377d94" && record == "default__c" && RS == null ){
  return ["error":true, "errorMessage":"该老师擅长课程没有这门课,请检查该老师的擅长课程!", "block":true ]
}


//排课验证距离

//查找距离表 是否符合授课范围 Y=是 N= 否
String JiaoShi=context.data.field_McOk7__c as String 
def jl = Fx.object.find("object_01jMZ__c",[["field_a6sO9__c":jsids,"field_1zrM6__c":JiaoShi]],100, 0)
if(jl[0]){
  log.info("查询失败,原因:"+ jl[2])
}else{
//  log.info("查询到的列表数据:"+ jl[1])
}

List jsjl1 = jl[1]["dataList"]["field_87mAQ__c"] as List //ID
String jsjl = jsjl1[0] as String

log.info("授课范围:"+jsjl)



if( jsjl != "Y" && jsids != "627caeca72b3950001377d94" && record == "default__c" && RS == null ){
  return ["error":true, "errorMessage":"该老师授课距离不够,请检查该老师的授课距离!", "block":true ]  
}