Groovy-按雇主、角色、项目文档ID和证书筛选列表



我正试图找出如何根据雇主、角色、项目文档ID以及是否经过认证来筛选将进入下拉菜单的用户列表。我只将满足所有要求的用户显示在列表中。我无法使代码正确编译。我用了太多如果?有更好的写法吗?感谢您提前提供的帮助。

我正在尝试按雇主、角色和如果他们有有效的认证。

def assign_roles() {
    List documentAuthors = []
    List fieldTechnicians = []
    ProjectDocument projectDocument = ProjectDocument.get(params.id)
    Project project = Project.get(params.projectId)
    User authUser = docRegService.authenticatedUser
    def published_document = CertificationHistoryHeader.findAllByUserAndPublishedDocument(user, published_document)
    String employerAdminCertifier = CertifierDocument.findByDocument(projectDocument ? .document ? .document) ? .certifier.name
    EmployerUser.findAllByEmployer(authUser.employer) * .user.each {
      User user - >
        if (CertifierDocument.findByDocument(projectDocument ? .document ? .document) ? .certifier.name == employerAdminCertifier) {
          if (latest.action in [CertHistoryActions.CERTIFIED.toString(), CertHistoryActions.RE_CERTIFIED.toString()])
            if (user.hasRole(Roles.ROLE_DOCUMENT_AUTHOR.toString())) {
              documentAuthors.add(user)
            }
          if (user.hasRole(Roles.ROLE_FIELD_TECH.toString())) {
            fieldTechnicians.add(user)
          }
        }
    }

嗯,您确实有语法错误。在安全导航运算符(?.)、排列运算符(*.)中不能有空格,在声明闭包参数(->)时也不能有空格。至于更好的写作方式,这里是我的观点版本:

def assign_roles() {
    List documentAuthors = []
    List fieldTechnicians = []
    ProjectDocument projectDocument = ProjectDocument.get(params.id)
    Project project = Project.get(params.projectId)
    User authUser = docRegService.authenticatedUser
    def published_document = CertificationHistoryHeader.findAllByUserAndPublishedDocument(user, published_document)
    String employerAdminCertifier = CertifierDocument.findByDocument(projectDocument?.document?.document)?.certifier.name  
    def isValidAction = latest.action in [CertHistoryActions.CERTIFIED.toString(), CertHistoryActions.RE_CERTIFIED.toString()]
    if(CertifierDocument.findByDocument(projectDocument?.document?.document)?.certifier.name == employerAdminCertifier)) {
        EmployerUser.findAllByEmployer(authUser.employer)*.user.each { User user ->
            def roles = EmployerUser.where {
                /* 
                 * A query to get all of the user's roles.
                 * This will depend on how EmployerUser and role domain classes are associated.
                 * The list can be limited to the two roles you're looking for.
                 */
            }.list()
            if(isValidAction && roles.contains(Roles.ROLE_DOCUMENT_AUTHOR)) {
                documentAuthors.add(user)
            }
            if(roles.contains(Roles.ROLE_FIELD_TECH)) {
                fieldTechnicians.add(user)
            }
        }    
    }
}

user循环中的大多数条件似乎与用户无关,所以我没有为每个用户评估它们,而是在循环之前做一次。这本身就清理了循环中条件的使用方式。事实上,如果不满足employerAdminCertifier条件,我将跳过整个循环。

然后,我不再调用user.hasRoles()两次,而是运行一个查询来获取用户的角色。然后使用生成的列表。这样可以减少数据库调用。

最新更新