编辑代码

/**
* 魏聪
* 2022-4-28
* 当选择了排课日期且是否生成排课明细等于是,根据上课类型和教师等生成排课明细
* 
* 2022-5-9
* 如果课程为空,则讲师也要清空
* 如果校区为空,则讲师、课程都要清空
* 5-11
* 1.当校区不为空时,查找该校区符合最低库存人数的课程,回写到课程列表字段里;
* 2.当校区、课程不为空时,查找符合等级、擅长课程、距离的讲师列表,回写到讲师列表字段里
* 0819
* 取消讲师不受排课限制
**/

  //新建UIEvent事件
UIEvent event = UIEvent.build(context) {}
log.info(context.data)
String is = context.data.field_kg7mF__c   //是否生成明细
String date = context.data.field_44c1g__c as String
log.info("==================== "+date)
String id = context.data._id as String
String type = context.data.field_191mC__c as String
String course = context.data.field_tP1kG__c as String  //课程
String teacher = context.data.field_0jhWj__c //讲师
String classroom = context.data.field_McOk7__c  //教室
String campus = context.data.field_cAn5H__c  //校区
String rule = context.data.field_2d5dZ__c as String  //规则
String school_name = null
def (Boolean errorSC,Map dataSC,String errorMessageSC) = Fx.object.findById("object_2bwgw__c",campus)
if( errorSC ){
  log.info("查找校区失败:"+errorMessageSC)
}else{
  school_name = dataSC.name as String
}
log.info("是否生成排课明细:"+is+" 上课类型:"+type+" 课程: "+course+" 讲师:"+teacher+"  教室:"+classroom+" 校区:"+campus)
event = UIEvent.build(context) {
    removeDetail "object_3s7hD__c" 
    log.info("删除")
}


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
    }
}
}


  
if( course != null ){
    //统计课程的待交付人数,回填
    def (Boolean error1,QueryResult data1,String errorMessage1) =
    Fx.object.find("object_4u6m4__c",[["field_Xi96P__c":school_name],["field_24gLB__c":course],["field_52Chj__c": Operator.NIN(["已交付"])]],100,0);
    if( error1 ){
      log.info("查找符合条件的课程交付列表失败:"+errorMessage1)
    }else{
      log.info((course)+" 课程的待交付人数为:"+(data1.total))
      event = UIEvent.build(context) {
        editMaster("field_wfLR2__c": data1.total) 
        // editMaster("field_0jhWj__c": null,"field_058VX__c": null)
      }
    }
  
}else{
  log.info("找课程")
  event = UIEvent.build(context) {
    //讲师、讲师名称列表
      editMaster("field_0jhWj__c": null,"field_058VX__c": null) 
    }
  if(campus != null){//当课程为空且校区不为空的时候,查找该校区满足最低库存人数的课程
    List productWithMin = []  //用于存储课程最低库存人数列表
    String productIds = null
    // if( flag == '1' ){
        //找排课规则的课程最低库存人数列表
        // def (Boolean errorMin,QueryResult dataMinQR,String errorMessageMin) =Fx.object.find("object_D9Ioy__c",[["field_83tbo__c":rule]],100,0);
        // if(errorMessageMin){
        //   log.info("最低库存人数列表查找失败:"+errorMessageMin)
        // }else{
        //   if( dataMinQR.size>0 ){
        //     List dataMin_list = dataMinQR.dataList as List
        //     dataMin_list.each{i ->
        //       Map tmp = i as Map
        //       Map productWithMin_map = [
        //         "product":tmp.field_i26a4__c as String,
        //         "min":tmp.field_ny6Jk__c as BigDecimal 
        //         ]
        //       productWithMin.add(productWithMin_map) 
        //     }
        //     log.info("整合后的课程最低库存人数列表:"+productWithMin)
        //   }else{
        //     log.info("该排课规则下最低库存人数列表数量为0")
        //   }
        // }
        Map productWithMin_map = [:]
        def dataMinQR = Fx.object.find("object_D9Ioy__c", //查询排课规则的课程最低库存人数列表
                     FQLAttribute.builder()
                        .columns(["_id", "name","field_i26a4__c","field_ny6Jk__c"]) //返回的数据id
                        .queryTemplate(QueryTemplate.AND(["field_83tbo__c": QueryOperator.EQ(rule)]))
                        .limit(100)
                        .build(),
                     SelectAttribute.builder().needCount(true).build()).result() as QueryResult
        log.info("查询排课规则的课程最低库存人数列表结果:"+dataMinQR.total)
        if( dataMinQR.size > 0 ){
            List dataMin_list = dataMinQR.dataList as List
            dataMin_list.each{i ->
              Map tmp = i as Map
              Map productWithMin_map1 = [
                "product":tmp.field_i26a4__c as String,
                "min":tmp.field_ny6Jk__c as BigDecimal 
                ]
              // productWithMin_map.put(tmp.field_i26a4__c as String ,tmp.field_ny6Jk__c as BigDecimal)//keys产品id,value最低库存人数
               productWithMin.add(productWithMin_map1) 
            }
            log.info("整合后的课程最低库存人数列表:"+productWithMin)
            // log.info("整合后的课程最低库存人数列表map:"+productWithMin_map)
        }else{
          log.info("没有找到排课规则的课程最低库存人数列表")
        }
        // def testRet = Fx.object.find("object_4u6m4__c",[["field_Xi96P__c":school_name],["field_52Chj__c": Operator.NIN(["已交付"])]],100,0);
        // log.info("total==>"+testRet[1]["total"])
        
        List productIdList = []
        Map groupMap = [:]
        if(productWithMin.size()>0){
          productWithMin.each{ i ->
            Map min_map = i as Map
            String productId = min_map.product
            productIdList.add(productId)
          }
          log.info("productIdList==>"+productIdList)
          
          List all = []  
          def closure  = {
            List list -> // 100
            //业务逻辑
            all.addAll(list)
          }
          def ret = Fx.object.find("object_4u6m4__c",[["field_Xi96P__c":school_name],["field_24gLB__c":QueryOperator.IN(productIdList)],["field_52Chj__c": Operator.NIN(["已交付"])]],closure);
          if (ret.isError()) {
            log.info(ret.message())
          }
          log.info("共计查询数据2:"+all.size())
          groupMap = all.groupBy{it["field_24gLB__c"]}
          
        }
        log.info("groupMap==>"+groupMap.keySet())
        
        
        if(productWithMin.size()>0){
          productWithMin.each{ i ->
          Map min_map = i as Map
            //查找课程交付列表里【所属校区】字段等于该排课列表校区的数据、【课程】为排课列表里的、【状态】等于未使用/上课中
          // def (Boolean error1,QueryResult data1,String errorMessage1) =
          // Fx.object.find("object_4u6m4__c",[["field_Xi96P__c":school_name],["field_24gLB__c":(min_map.product as String)],["field_52Chj__c": Operator.NIN(["已交付"])]],100,0);
          // if( error1 ){
          //   log.info("查找符合条件的课程交付列表失败:"+errorMessage1)
          // }else{
          //   log.info("待交付人数:"+data1.total)
          //   if( data1.size>=(min_map.min as BigDecimal) ){
          //     if( productIds == null ){
          //       productIds = min_map.product as String
          //     }else{
          //       productIds +=","+(min_map.product as String)
          //     }
          //     log.info("课程"+(min_map.product as String)+"符合最低库存数")
          //   }
          // }
          String currProductId = min_map.product as String
          log.info("currProductId==>"+currProductId)
          List currDataList = groupMap[currProductId] as List
          log.info("currDataList==>"+currDataList)
          Integer currSize = currDataList == null ? 0 : currDataList.size()
          log.info("currSize==>"+currSize)
          if( currSize >=(min_map.min as BigDecimal) ){
            if( productIds == null ){
              productIds = min_map.product as String
            }else{
              productIds +=","+(min_map.product as String)
            }
            log.info("课程"+(min_map.product as String)+"符合最低库存数")
          }
            
          }
          log.info("符合的课程列表:"+productIds)
          event = UIEvent.build(context) {
            editMaster("field_kf3fL__c": productIds) 
          }
        }
    // }
    
  }
}


if(campus==null){
  event = UIEvent.build(context) { 
    //讲师、教室、讲师名称、课程清空
    editMaster("field_0jhWj__c": '',"field_McOk7__c":'',"field_058VX__c":'',"field_tP1kG__c":'') 
  }
}

if( classroom!=null ){
  event = UIEvent.build(context) { 
    //课程必填
    editMasterFields "field_tP1kG__c" readOnly(false) required(true) 
  }
}

if( is != null && is !='N' && course!=null && date !=null && date!= '' && type != null ){
  List range = []  //用来存储上课时间段
  List mx = []  //用来存储排课明细
  Map filed = [:]
  if( type == 'option1' ){//假期班
    filed.put( "field_7EvY1__c",  "option1")
  }else if( type == '41kF2bA90' ){  //晚班
    filed.put( "field_7EvY1__c",  "74Jd02odv")
  }else if( type  == 'zUruzKt48' ){  //周末版
    filed.put( "field_7EvY1__c",  "oBkvYr4n1")
  }else if( type == 'v5je8Abp9' ){  //集训班
    filed.put( "field_7EvY1__c",  "6jS5p63r2")
  }else if( type == 'Z1merEEkq' ){   //企业内训
    filed.put( "field_7EvY1__c",  "Z1merEEkq")
  }else if(type=='xrfji11Kj'){  //服务大课
     filed.put( "field_7EvY1__c",  "xrfji11Kj")
  }
  def ret = Fx.object.find("object_7V42U__c",  [filed,["field_5bB1P__c":course]], 50,  0)
  if( ret[0] ){
    log.info("查找上课时间段失败:"+ret[2])
  }else{
    log.info("查找到上课时间段:"+ret[1])
    if( (ret[1] as QueryResult).size>0 ){
      range = (ret[1] as QueryResult).dataList
      range = range.sort(true)
    }else{
      event =  UIEvent.build(context) {
          remind Remind.Alert("没有找到对应课程、上课类型的上课时间段!请重新选择")
      }
      return event
    }
  }
  event = UIEvent.build(context) {
  List data_list = date.split(',') as List //把日期字符串分割为数组
  data_list=data_list.sort(true)
  if( data_list!=null ){
    log.info("排课天数:"+data_list.size())
    editMaster("field_jjtcI__c":data_list.size())
    data_list.each{i ->
      String tmp = i as String
      Date start =Date.of(tmp)
      long startDate_long = start.toTimestamp()
      range.each{i1 ->
        Map tmp_map = i1 as Map
        long rule_start_long = 0
        long rule_end_long = 0
        if((tmp_map.field_BZ0yh__c  as Time)!=null&&(tmp_map.field_d4c6m__c as Time)!=null ){
          rule_start_long = (tmp_map.field_BZ0yh__c  as Time).toTimestamp() as long
          rule_end_long = (tmp_map.field_d4c6m__c as Time).toTimestamp() as long
        }
        
        long start_long = rule_start_long+startDate_long+3600000*8
        long end_long = rule_end_long+startDate_long+3600000*8
        BigDecimal  stay = (end_long-start_long)/3600000 
        
        // log.info("上课时间段"+(tmp_map.field_d4c6m__c).class+(tmp_map.field_BZ0yh__c).class)
        addDetail "object_3s7hD__c" set(
          "record_type":"default__c",
          "field_57T2e__c": start_long,
          "field_9o2QQ__c": end_long,
          // "field_90O77__c":tmp_map.field_BZ0yh__c,    //开始时间
          // "field_vR04f__c":tmp_map.field_d4c6m__c, //结束时间
          "field_dX12n__c":start,    //上课日期
          "field_kGmGb__c":id,     //排课列表
          "field_h2pR4__c":course,     //课程
          "field_4sD21__c": campus  ,//校区
          // "field_4sD21__c__r": campus_r  ,//校区
          "field_2HQd3__c": classroom  ,//教室
          "field_HLros__c": teacher,//讲师名称
          "field_D4n22__c":stay //课时数
          )
        
      }
    }//明细循环
       addDetail "object_3s7hD__c" set(
          "record_type":"default__c",
          "field_kGmGb__c":id,     //排课列表
          "field_4sD21__c": campus  ,//校区
          )
  }else{
    log.info("时间为空!")
  }
 }
}

return event