import java.util.ArrayList
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.bc.project.ProjectCreationData
import com.atlassian.jira.bc.project.ProjectService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.project.AssigneeTypes
import com.atlassian.jira.project.type.ProjectTypeKey
import com.atlassian.jira.project.*
import com.atlassian.jira.issue.*
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.config.IssueTypeSchemeService
import com.atlassian.jira.issue.fields.config.manager.PrioritySchemeManager
import com.atlassian.jira.issue.security.IssueSecuritySchemeService
import groovy.json.JsonOutput
import com.atlassian.jira.security.roles.ProjectRoleManager
import com.atlassian.jira.bc.projectroles.ProjectRoleService
import com.opensymphony.workflow.InvalidInputException
import com.atlassian.greenhopper.web.rapid.view.RapidViewHelper
import com.onresolve.scriptrunner.runner.customisers.JiraAgileBean
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
// 1. 加载 Jira Agile 插件
@WithPlugin("com.pyxis.greenhopper.jira")
// 2. 注入 RapidViewHelper Bean
@JiraAgileBean
RapidViewHelper rapidViewHelper


def customFieldManager = ComponentAccessor.getCustomFieldManager()
def projectManager = ComponentAccessor.getProjectManager()
def projectService = ComponentAccessor.getComponent(ProjectService)
def projectRoleManager = ComponentAccessor.getComponent(ProjectRoleManager)
def projectRoleService = ComponentAccessor.getComponentOfType(ProjectRoleService.class)
def issueTypeSchemeService = ComponentAccessor.getComponent(IssueTypeSchemeService)
def workflowSchemeManager = ComponentAccessor.getWorkflowSchemeManager()
def issueTypeScreenSchemeManager = ComponentAccessor.getIssueTypeScreenSchemeManager()
def permissionSchemeManager = ComponentAccessor.getPermissionSchemeManager()
def notificationSchemeManager = ComponentAccessor.getNotificationSchemeManager()
def prioritySchemeManager = ComponentAccessor.getComponentOfType(PrioritySchemeManager.class)
def fieldLayoutManager = ComponentAccessor.getFieldLayoutManager()
def issueSecuritySchemeService = ComponentAccessor.getComponent(IssueSecuritySchemeService)
def versionManager = ComponentAccessor.getVersionManager()
def pluginAccessor = ComponentAccessor.getPluginAccessor()
def projectPropertiesManager = ComponentAccessor.getOSGiComponentInstanceOfType(
    pluginAccessor.getClassLoader().findClass("com.tse.jira.projectproperties.plugin.api.ProjectPropertiesAOMgr")
)
def loggedInUser = ComponentAccessor.jiraAuthenticationContext.loggedInUser

// 获取自定义字段
def projectNameField = customFieldManager.getCustomFieldObject("customfield_10700")
def ecuCategoryField = customFieldManager.getCustomFieldObject("customfield_10800")
def tcuSoftwareLayerField = customFieldManager.getCustomFieldObject("customfield_10801")
def mcuSoftwareLayerField = customFieldManager.getCustomFieldObject("customfield_10802")
def supplierInvolvedField = customFieldManager.getCustomFieldObject("customfield_10803")
def workSplitField = customFieldManager.getCustomFieldObject("customfield_10804")

// ... 获取其他字段的值
//def issue = ComponentAccessor.getIssueManager().getIssueObject("PM-1")
// 获取自定义字段值
def projectName = issue.getCustomFieldValue(projectNameField) as String
def ecuCategory = issue.getCustomFieldValue(ecuCategoryField) as Option
if (ecuCategory == null) {
   return
}

/********************Create Base Project Start*************************************/
// Create System Project
def createSystemProject_return = createSystemProject(issue,
    projectName,
    loggedInUser,
    projectService,
    projectManager,
    projectRoleManager,
    projectRoleService,
    customFieldManager,
    issueTypeSchemeService,
    issueTypeScreenSchemeManager,
    workflowSchemeManager,
    permissionSchemeManager,
    issueSecuritySchemeService,
    prioritySchemeManager,
    notificationSchemeManager,
    rapidViewHelper,
    projectPropertiesManager,
    fieldLayoutManager
)
log.error('Create System Project:'+createSystemProject_return)

// Create HW Main Project
def createHwMainProject_return = createHwMainProject(issue,
    projectName,
    ecuCategory,
    loggedInUser,
    projectService,
    projectManager,
    projectRoleManager,
    projectRoleService,
    customFieldManager,
    issueTypeSchemeService,
    issueTypeScreenSchemeManager,
    workflowSchemeManager,
    permissionSchemeManager,
    issueSecuritySchemeService,
    prioritySchemeManager,
    notificationSchemeManager,
    versionManager,
    rapidViewHelper,
    fieldLayoutManager
)
log.error('Create HW Main Project:'+createHwMainProject_return)

// Create Calibration Project
def createCalibrationProject_return = createCalibrationProject(issue,
    projectName,
    loggedInUser,
    projectService,
    projectManager,
    projectRoleManager,
    projectRoleService,
    customFieldManager,
    issueTypeSchemeService,
    issueTypeScreenSchemeManager,
    workflowSchemeManager,
    permissionSchemeManager,
    issueSecuritySchemeService,
    prioritySchemeManager,
    notificationSchemeManager,
    rapidViewHelper,
    fieldLayoutManager
)
// log.error('Create Calibration Project:'+createCalibrationProject_return)

// Create Task Management Project
def createTaskManagementProject_return = createTaskManagementProject(issue,
    projectName,
    loggedInUser,
    projectService,
    projectManager,
    projectRoleManager,
    projectRoleService,
    customFieldManager,
    issueTypeSchemeService,
    issueTypeScreenSchemeManager,
    workflowSchemeManager,
    permissionSchemeManager,
    issueSecuritySchemeService,
    prioritySchemeManager,
    notificationSchemeManager,
    rapidViewHelper,
    fieldLayoutManager
)
log.error('Create Task Management Project:'+createTaskManagementProject_return)
//throw new InvalidInputException(createSystemProject_return+'/n'+createSwMainProject_return)
/********************Create Base Project End*************************************/

/********************Create Sub Project Start*************************************/
def tcuSoftwareLayer = issue.getCustomFieldValue(tcuSoftwareLayerField) as Option
def mcuSoftwareLayer = issue.getCustomFieldValue(mcuSoftwareLayerField) as Option
def supplierInvolved = issue.getCustomFieldValue(supplierInvolvedField) as Option
def workSplit = issue.getCustomFieldValue(workSplitField) as Option
// 子项目属性
def subMap = new HashMap()
subMap.put("subproject.tcu.asw", false)
subMap.put("subproject.tcu.bsw.supplier", false)
subMap.put("subproject.mcu.asw", false)
subMap.put("subproject.mcu.bsw", false)
subMap.put("subproject.mcu.bsw.supplier", false)
// BSW MODE
def bswMode = null
if (ecuCategory.getValue() == 'MCU' || ecuCategory.getValue() == 'TCU & MCU' ) {
   if (mcuSoftwareLayer == null) {
      return
   }
   if (mcuSoftwareLayer.getValue() == 'BSW' || mcuSoftwareLayer.getValue() == 'ASW & BSW') {
      if (supplierInvolved != null && supplierInvolved.getValue() == 'No') {
         bswMode = "INHOUSE"
      }
      if (workSplit != null && workSplit.getValue() == 'Yes') {
         bswMode = "HYBRID"
      }
      if (workSplit != null && workSplit.getValue() == 'No') {
         bswMode = "SUPPLIER"
      }
   }
}


if (ecuCategory.getValue() == 'TCU' || ecuCategory.getValue() == 'TCU & MCU') {
   if (tcuSoftwareLayer == null) {
      return
   }
   if (tcuSoftwareLayer.getValue() == 'ASW' || tcuSoftwareLayer.getValue() == 'ASW & BSW' ) {
      // Create TCU ASW Project
      def createTcuAswProject_return = createTcuAswProject(issue,
         projectName,
         loggedInUser,
         projectService,
         projectManager,
         projectRoleManager,
         projectRoleService,
         customFieldManager,
         issueTypeSchemeService,
         issueTypeScreenSchemeManager,
         workflowSchemeManager,
         permissionSchemeManager,
         issueSecuritySchemeService,
         prioritySchemeManager,
         notificationSchemeManager,
         versionManager,
         rapidViewHelper,
         fieldLayoutManager
      )
      subMap.put("subproject.tcu.asw", true)
      log.error('Create TCU ASW Project:'+createTcuAswProject_return)
   }
   if (tcuSoftwareLayer.getValue() == 'BSW' || tcuSoftwareLayer.getValue() == 'ASW & BSW' ) {
      // Create TCU BSW Supplier Project
      def createTcuBswSupplierProject_return = createTcuBswSupplierProject(issue,
         projectName,
         loggedInUser,
         projectService,
         projectManager,
         projectRoleManager,
         projectRoleService,
         customFieldManager,
         issueTypeSchemeService,
         issueTypeScreenSchemeManager,
         workflowSchemeManager,
         permissionSchemeManager,
         issueSecuritySchemeService,
         prioritySchemeManager,
         notificationSchemeManager,
         versionManager,
         rapidViewHelper,
         fieldLayoutManager
      )
      subMap.put("subproject.tcu.bsw.supplier", true)
      log.error('Create TCU BSW Supplier Project:'+createTcuBswSupplierProject_return)
   }
}
if (ecuCategory.getValue() == 'MCU' || ecuCategory.getValue() == 'TCU & MCU' ) {
   if (mcuSoftwareLayer == null) {
      return
   }
   if (mcuSoftwareLayer.getValue() == 'ASW' || mcuSoftwareLayer.getValue() == 'ASW & BSW') {
      // Create MCU ASW Project
      def createMcuAswProject_return = createMcuAswProject(issue,
         projectName,
         loggedInUser,
         projectService,
         projectManager,
         projectRoleManager,
         projectRoleService,
         customFieldManager,
         issueTypeSchemeService,
         issueTypeScreenSchemeManager,
         workflowSchemeManager,
         permissionSchemeManager,
         issueSecuritySchemeService,
         prioritySchemeManager,
         notificationSchemeManager,
         versionManager,
         rapidViewHelper,
         fieldLayoutManager
      )
      subMap.put("subproject.mcu.asw", true)
      log.error('Create MCU ASW Project:'+createMcuAswProject_return)
   }
   if ((mcuSoftwareLayer.getValue() == 'BSW' || mcuSoftwareLayer.getValue() == 'ASW & BSW') && 
      ((supplierInvolved != null && supplierInvolved.getValue() == 'No') || (workSplit != null && workSplit.getValue() == 'Yes'))
      ) {
      // Create MCU BSW Project
      def createMcuBswProject_return = createMcuBswProject(issue,
         projectName,
         loggedInUser,
         projectService,
         projectManager,
         projectRoleManager,
         projectRoleService,
         customFieldManager,
         issueTypeSchemeService,
         issueTypeScreenSchemeManager,
         workflowSchemeManager,
         permissionSchemeManager,
         issueSecuritySchemeService,
         prioritySchemeManager,
         notificationSchemeManager,
         versionManager,
         rapidViewHelper,
         fieldLayoutManager
      )
      subMap.put("subproject.mcu.bsw", true)
      log.error('Create MCU BSW Project:'+createMcuBswProject_return)
   }
   if ((mcuSoftwareLayer.getValue() == 'BSW' && supplierInvolved != null && supplierInvolved.getValue() == 'Yes') || 
        (mcuSoftwareLayer.getValue() == 'ASW & BSW' && supplierInvolved != null && supplierInvolved.getValue() == 'Yes') ) {
      //Create MCU BSW Supplier Project
      def createMcuBswSupplierProject_return = createMcuBswSupplierProject(issue,
         projectName,
         loggedInUser,
         projectService,
         projectManager,
         projectRoleManager,
         projectRoleService,
         customFieldManager,
         issueTypeSchemeService,
         issueTypeScreenSchemeManager,
         workflowSchemeManager,
         permissionSchemeManager,
         issueSecuritySchemeService,
         prioritySchemeManager,
         notificationSchemeManager,
         versionManager,
         rapidViewHelper,
         fieldLayoutManager
      )
      subMap.put("subproject.mcu.bsw.supplier", true)
      log.error('Create MCU BSW Supplier Project:'+createMcuBswSupplierProject_return)
   }

}
/********************Create Sub Project End*************************************/
// 最后创建,因为需要获取子项目值
// Create SW Main Project
def createSwMainProject_return = createSwMainProject(issue,
    projectName,
    ecuCategory,
    loggedInUser,
    subMap,
    bswMode,
    projectService,
    projectManager,
    projectRoleManager,
    projectRoleService,
    customFieldManager,
    issueTypeSchemeService,
    issueTypeScreenSchemeManager,
    workflowSchemeManager,
    permissionSchemeManager,
    issueSecuritySchemeService,
    prioritySchemeManager,
    notificationSchemeManager,
    versionManager,
    rapidViewHelper,
    projectPropertiesManager,
    fieldLayoutManager
)
log.error('Create SW Main Project:'+createSwMainProject_return)

// Create System Project
def String createSystemProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def rapidViewHelper,
    def projectPropertiesManager,
    def fieldLayoutManager
){
   // System Project Manager
   def systemProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10701")
   def projectLeader = issue.getCustomFieldValue(systemProjectManagerField) as ApplicationUser
   // SYS Project Team
   def systemProjectTeamField = customFieldManager.getCustomFieldObject("customfield_10702")
   def systemProjectTeam = issue.getCustomFieldValue(systemProjectTeamField) as List<ApplicationUser>
   // SYS PDM
   def systemPDMField = customFieldManager.getCustomFieldObject("customfield_10703")
   def systemPDM = issue.getCustomFieldValue(systemPDMField) as ApplicationUser
   // SYS QA
   def systemQAField = customFieldManager.getCustomFieldObject("customfield_10704")
   def systemQA = issue.getCustomFieldValue(systemQAField) as ApplicationUser
   // SYS CCB
   def systemCCBField = customFieldManager.getCustomFieldObject("customfield_10706")
   def systemCCB = issue.getCustomFieldValue(systemCCBField) as List<ApplicationUser>
   // SYS Test Engineer
   def systemTestEngineerField = customFieldManager.getCustomFieldObject("customfield_10707")
   def systemTestEngineer = issue.getCustomFieldValue(systemTestEngineerField) as ApplicationUser
   // 创建项目
   def resultMap = createProject(projectName+" SYS",
            "SYS"+projectName,
            "SYS Main Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create System Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_pdm = projectRoleManager.getProjectRole("SYS PDM")
   if (projectRole_pdm != null && systemPDM != null) {
        def pm_users = [systemPDM.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pdm, project, projectRoleService)
   }

   def projectRole_qa = projectRoleManager.getProjectRole("SYS QA")
   if (projectRole_qa != null && systemQA != null) {
        def pm_users = [systemQA.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_qa, project, projectRoleService)
   }

   def projectRole_spt = projectRoleManager.getProjectRole("SYS Project Team")
   if (projectRole_spt != null && systemProjectTeam != null) {
        def pm_users = [] as Set
        for (def user:systemProjectTeam) {
           pm_users.add(user.getKey())
        }
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_spt, project, projectRoleService)
   }

   def projectRole_ccb = projectRoleManager.getProjectRole("SYS CCB")
   if (projectRole_ccb != null && systemCCB != null) {
        def pm_users = [] as Set
        for (def user:systemCCB) {
           pm_users.add(user.getKey())
        }
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_ccb, project, projectRoleService)
   }

   def projectRole_sce = projectRoleManager.getProjectRole("SYS Chief Engineer")
   if (projectRole_sce != null) {
        def groups = ['SYS Chief Engineer'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_sce, project, projectRoleService)
   }

   def projectRole_ste = projectRoleManager.getProjectRole("SYS Test Engineer")
   if (projectRole_ste != null && systemTestEngineer != null) {
        def pm_users = [systemTestEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_ste, project, projectRoleService)
   }
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   // 创建项目属性
   def projectKey = project.getKey()
   projectPropertiesManager.addProjectProperty(project, "sys.subproject.sw", projectName)
   projectPropertiesManager.addProjectProperty(project, "sys.subproject.hw", "HW"+projectName)
   return "Successfully Created System Project"
}

// Create SW Main Project
def String createSwMainProject(
    def issue,
    def projectName,
    def ecuCategory,
    def loggedInUser,
    def subMap,
    def bswMode,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def projectPropertiesManager,
    def fieldLayoutManager
){
   // SW Main Project Manager
   def swMainProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10708")
   def projectLeader = issue.getCustomFieldValue(swMainProjectManagerField) as ApplicationUser
   // SW Main Chief Engineer
   def swMainChiefEngineerField = customFieldManager.getCustomFieldObject("customfield_10709")
   def swMainChiefEngineer = issue.getCustomFieldValue(swMainChiefEngineerField) as ApplicationUser
   // SYS Project Team
   def systemProjectTeamField = customFieldManager.getCustomFieldObject("customfield_10702")
   def systemProjectTeam = issue.getCustomFieldValue(systemProjectTeamField) as List<ApplicationUser>
   // 项目分类 /Main Project (MCU only)/Main Project (MCU & TCU)
   def projectCategory = null
   if (ecuCategory.getValue() == 'TCU') {
      projectCategory = 'Main Project (TCU only)'
   } else if (ecuCategory.getValue() == 'MCU') {
      projectCategory = 'Main Project (MCU only)'
   } else if (ecuCategory.getValue() == 'TCU & MCU') {
      projectCategory = 'Main Project (MCU & TCU)'
   }
   // 创建项目
   def resultMap = createProject(
            projectName,
            projectName,
            projectCategory,
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create SW Main Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_ce = projectRoleManager.getProjectRole("Chief Engineers")
   if (projectRole_ce != null && swMainChiefEngineer != null) {
        def pm_users = [swMainChiefEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_ce, project, projectRoleService)
   }

   def projectRole_spt = projectRoleManager.getProjectRole("SYS Project Team")
   if (projectRole_spt != null && systemProjectTeam != null) {
        def pm_users = [] as Set
        for (def user:systemProjectTeam) {
           pm_users.add(user.getKey())
        }
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_spt, project, projectRoleService)
   }

   def projectRole_developers = projectRoleManager.getProjectRole("Developers")
   if (projectRole_developers != null) {
        def groups = ['SW Development'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_developers, project, projectRoleService)
   }

   def projectRole_qr = projectRoleManager.getProjectRole("Quality Review")
   if (projectRole_qr != null) {
        def groups = ['Quality Review'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_qr, project, projectRoleService)
   }

   // 创建版本
   createSwProjectVersion(issue, project, customFieldManager, versionManager)

   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   // 创建项目属性
   if (subMap.get("subproject.tcu.asw") == true) {
      projectPropertiesManager.addProjectProperty(project, "subproject.tcu.asw", projectName + "TCUASW")
   }
   if (subMap.get("subproject.tcu.bsw.supplier") == true) {
      projectPropertiesManager.addProjectProperty(project, "subproject.tcu.bsw.supplier", projectName + "TCUBSWSUP")
   }
   if (subMap.get("subproject.mcu.asw") == true) {
      projectPropertiesManager.addProjectProperty(project, "subproject.mcu.asw", projectName + "MCUASW")
   }
   if (subMap.get("subproject.mcu.bsw") == true) {
      projectPropertiesManager.addProjectProperty(project, "subproject.mcu.bsw", projectName + "MCUBSW")
   }
   if (subMap.get("subproject.mcu.bsw.supplier") == true) {
      projectPropertiesManager.addProjectProperty(project, "subproject.mcu.bsw.supplier", projectName + "MCUBSWSUP")
   }
   if (bswMode != null) {
      projectPropertiesManager.addProjectProperty(project, "BSW_MODE", bswMode)
   }
   return "Successfully Created SW Main Project"
}

// Create HW Main Project
def String createHwMainProject(
    def issue,
    def projectName,
    def ecuCategory,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // HW Main Project Manager
   def hwMainProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10712")
   def projectLeader = issue.getCustomFieldValue(hwMainProjectManagerField) as ApplicationUser
   // HW Project Engineer
   def hwProjectEngineerField = customFieldManager.getCustomFieldObject("customfield_10713")
   def hwProjectEngineer = issue.getCustomFieldValue(hwProjectEngineerField) as ApplicationUser
   // HW Platform Engineer
   def hwPlatformEngineerField = customFieldManager.getCustomFieldObject("customfield_10714")
   def hwPlatformEngineer = issue.getCustomFieldValue(hwPlatformEngineerField) as ApplicationUser
   // HW Main Released Version
   def hwMainReleasedVersionField = customFieldManager.getCustomFieldObject("customfield_10715")
   def hwMainReleasedVersion = issue.getCustomFieldValue(hwMainReleasedVersionField) as String
   // HW Main Unreleased Version
   def hwMainUnreleasedVersionField = customFieldManager.getCustomFieldObject("customfield_10716")
   def hwMainUnreleasedVersion = issue.getCustomFieldValue(hwMainUnreleasedVersionField) as String
   // SYS Project Team
   def systemProjectTeamField = customFieldManager.getCustomFieldObject("customfield_10702")
   def systemProjectTeam = issue.getCustomFieldValue(systemProjectTeamField) as List<ApplicationUser>

   // 创建项目
   def resultMap = createProject(
            projectName+' HW',
            'HW'+projectName,
            'HW Main Project',
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create HW Main Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_hpe = projectRoleManager.getProjectRole("HW Project Engineer")
   if (projectRole_hpe != null && hwProjectEngineer != null) {
        def pm_users = [hwProjectEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_hpe, project, projectRoleService)
   }
   
   def projectRole_hpep = projectRoleManager.getProjectRole("HW Platform Engineer")
   if (projectRole_hpep != null && hwPlatformEngineer != null) {
        def pm_users = [hwPlatformEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_hpep, project, projectRoleService)
   }

   def projectRole_spt = projectRoleManager.getProjectRole("SYS Project Team")
   if (projectRole_spt != null && systemProjectTeam != null) {
        def pm_users = [] as Set
        for (def user:systemProjectTeam) {
           pm_users.add(user.getKey())
        }
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_spt, project, projectRoleService)
   }

   // 创建版本
   if (hwMainReleasedVersion != null) {
      versionManager.createVersion(hwMainReleasedVersion, null, null, null, project.getId(), null, true)
   }
   if (hwMainUnreleasedVersion != null) {
      versionManager.createVersion(hwMainUnreleasedVersion, null, null, null, project.getId(), null, false)
   }
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created HW Main Project"
}

// Create Calibration Project
def String createCalibrationProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Calibration Project Manager
   def calibrationProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10717")
   def projectLeader = issue.getCustomFieldValue(calibrationProjectManagerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+" Calibration",
            "CAL"+projectName,
            "Calibration Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create Calibration Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_ac = projectRoleManager.getProjectRole("ASW calibration")
   if (projectRole_ac != null) {
        def groups = ['TCU Calibration Section 1','TCU Calibration Section 2','TCU Calibration Section 3'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_ac, project, projectRoleService)
   }

   def projectRole_crgl1 = projectRoleManager.getProjectRole("CAL Review Group - Level 1")
   if (projectRole_crgl1 != null) {
        def groups = ['1st Review Group Section 1','1st Review Group Section 2','1st Review Group Section 3'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_crgl1, project, projectRoleService)
   }

   def projectRole_crgl2 = projectRoleManager.getProjectRole("CAL Review Group - Level 2")
   if (projectRole_crgl2 != null) {
        def groups = ['2nd Review Group Section 1','2nd Review Group Section 2','2nd Review Group Section 3'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_crgl2, project, projectRoleService)
   }
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created Calibration Project"
}

// Create Task Management Project
def String createTaskManagementProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Task Management Project Manager
   def taskManagementProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10718")
   def projectLeader = issue.getCustomFieldValue(taskManagementProjectManagerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+" Task Management",
            "TM"+projectName,
            "Task Management",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create Task Management Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_creators = projectRoleManager.getProjectRole("Creators")
   if (projectRole_creators != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_creators, project, projectRoleService)
   }
   if (projectRole_creators != null) {
        //def pm_users = ["Cong Qiang", "Guo Chao", "Hao Jie", "Li Jianhui", "Qin Junchao", "Zhang Peng", "Zhao Tongtong"] as Set
        //createProjectRoleByUser(loggedInUser, pm_users, projectRole_creators, project, projectRoleService)
   }

   def projectRole_contributors = projectRoleManager.getProjectRole("Contributors")
   if (projectRole_contributors != null) {
        def groups = ['SW Department'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_contributors, project, projectRoleService)
   }
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created Task Management Project"
}

// Create TCU ASW Project
def String createTcuAswProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Project Manager/TCU ASW
   def tcuAswProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10805")
   def projectLeader = issue.getCustomFieldValue(tcuAswProjectManagerField) as ApplicationUser
   // Chief Engineer/TCU ASW
   def tcuAswChiefEngineerField = customFieldManager.getCustomFieldObject("customfield_10810")
   def tcuAswChiefEngineer = issue.getCustomFieldValue(tcuAswChiefEngineerField) as ApplicationUser
   // Calibration Project Manager/TCU ASW
   def tcuAswCalibrationProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10824")
   def tcuAswCalibrationProjectManager = issue.getCustomFieldValue(tcuAswCalibrationProjectManagerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+"-TCU ASW",
            projectName+"TCUASW",
            "TCU ASW Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create TCU ASW Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_cpm = projectRoleManager.getProjectRole("CAL Project Managers")
   if (projectRole_cpm != null && tcuAswCalibrationProjectManager != null) {
        def pm_users = [tcuAswCalibrationProjectManager.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_cpm, project, projectRoleService)
   }

   def projectRole_ce = projectRoleManager.getProjectRole("Chief Engineers")
   if (projectRole_ce != null && tcuAswChiefEngineer != null) {
        def pm_users = [tcuAswChiefEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_ce, project, projectRoleService)
   }

   def projectRole_developers = projectRoleManager.getProjectRole("Developers")
   if (projectRole_developers != null) {
        def groups = ['SW Department'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_developers, project, projectRoleService)
   }

   def projectRole_qr = projectRoleManager.getProjectRole("Quality Review")
   if (projectRole_qr != null) {
        def groups = ['Quality Review'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_qr, project, projectRoleService)
   }
   // 创建版本
   createSwProjectVersion(issue, project, customFieldManager, versionManager)
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created TCU ASW Project"
}

// Create TCU BSW Supplier Project
def String createTcuBswSupplierProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Project Manager/TCU BSW SPL
   def tcuBswSPLProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10806")
   def projectLeader = issue.getCustomFieldValue(tcuBswSPLProjectManagerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+"-TCU BSW (Supplier)",
            projectName+"TCUBSWSUP",
            "TCU BSW Supplier Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create TCU BSW Supplier Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }
   // 创建版本
   createSwProjectVersion(issue, project, customFieldManager, versionManager)
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created TCU BSW Supplier Project"
}

// Create MCU ASW Project
def String createMcuAswProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Project Manager/MCU ASW
   def mcuAswProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10807")
   def projectLeader = issue.getCustomFieldValue(mcuAswProjectManagerField) as ApplicationUser
   // Chief Engineer/MCU ASW
   def mcuAswChiefEngineerField = customFieldManager.getCustomFieldObject("customfield_10812")
   def mcuAswChiefEngineer = issue.getCustomFieldValue(mcuAswChiefEngineerField) as ApplicationUser
   // Calibration Project Manager/MCU ASW
   def mcuAswCalibrationProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10825")
   def mcuAswCalibrationProjectManager = issue.getCustomFieldValue(mcuAswCalibrationProjectManagerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+"-MCU ASW",
            projectName+"MCUASW",
            "MCU ASW Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create MCU ASW Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_cpm = projectRoleManager.getProjectRole("CAL Project Managers")
   if (projectRole_cpm != null && mcuAswCalibrationProjectManager != null) {
        def pm_users = [mcuAswCalibrationProjectManager.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_cpm, project, projectRoleService)
   }

   def projectRole_ce = projectRoleManager.getProjectRole("Chief Engineers")
   if (projectRole_ce != null && mcuAswChiefEngineer != null) {
        def pm_users = [mcuAswChiefEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_ce, project, projectRoleService)
   }

   def projectRole_developers = projectRoleManager.getProjectRole("Developers")
   if (projectRole_developers != null) {
        def groups = ['SW Department'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_developers, project, projectRoleService)
   }

   def projectRole_qr = projectRoleManager.getProjectRole("Quality Review")
   if (projectRole_qr != null) {
        def groups = ['Quality Review'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_qr, project, projectRoleService)
   }
   // 创建版本
   createSwProjectVersion(issue, project, customFieldManager, versionManager)
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created MCU ASW Project"
}
// Create MCU BSW Project
def String createMcuBswProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Project Manager/MCU BSW
   def mcuBswProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10808")
   def projectLeader = issue.getCustomFieldValue(mcuBswProjectManagerField) as ApplicationUser
   // Chief Engineer/MCU BSW
   def mcuBswChiefEngineerField = customFieldManager.getCustomFieldObject("customfield_10813")
   def mcuBswChiefEngineer = issue.getCustomFieldValue(mcuBswChiefEngineerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+"-MCU BSW",
            projectName+"MCUBSW",
            "MCU BSW Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create MCU BSW Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }

   def projectRole_ce = projectRoleManager.getProjectRole("Chief Engineers")
   if (projectRole_ce != null && mcuBswChiefEngineer != null) {
        def pm_users = [mcuBswChiefEngineer.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_ce, project, projectRoleService)
   }

   def projectRole_developers = projectRoleManager.getProjectRole("Developers")
   if (projectRole_developers != null) {
        def groups = ['SW Department'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_developers, project, projectRoleService)
   }

   def projectRole_qr = projectRoleManager.getProjectRole("Quality Review")
   if (projectRole_qr != null) {
        def groups = ['Quality Review'] as Set
        createProjectRoleByGroup(loggedInUser, groups, projectRole_qr, project, projectRoleService)
   }
   // 创建版本
   createSwProjectVersion(issue, project, customFieldManager, versionManager)
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created MCU BSW Project"
}

// Create MCU BSW Supplier Project
def String createMcuBswSupplierProject(
    def issue,
    def projectName,
    def loggedInUser,
    def projectService,
    def projectManager,
    def projectRoleManager,
    def projectRoleService,
    def customFieldManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def versionManager,
    def rapidViewHelper,
    def fieldLayoutManager
){
   // Project Manager/MCU BSW SPL
   def mcuBswSPLProjectManagerField = customFieldManager.getCustomFieldObject("customfield_10809")
   def projectLeader = issue.getCustomFieldValue(mcuBswSPLProjectManagerField) as ApplicationUser
   // Chief Engineer/MCU BSW SPL
   def mcuBswSPLChiefEngineerField = customFieldManager.getCustomFieldObject("customfield_10814")
   def mcuBswSPLChiefEngineer = issue.getCustomFieldValue(mcuBswSPLChiefEngineerField) as ApplicationUser
   
   // 创建项目
   def resultMap = createProject(
            projectName+"-MCU BSW (Supplier)",
            projectName+"MCUBSWSUP",
            "MCU BSW Supplier Project",
            10301L, //issueTypeId
            10201L, //workflowSchemeId
            10101L, //issueTypeScreenSchemeId
            10100L, //permissionSchemeId
            10000L, //issueSecuritySchemeId
            10800L, //prioritySchemeId
            10000L, //notificationSchemeId
            10100L, //fieldConfigSchemeId
            projectLeader,
            loggedInUser,
            projectService,
            projectManager,
            issueTypeSchemeService,
            issueTypeScreenSchemeManager,
            workflowSchemeManager,
            permissionSchemeManager,
            issueSecuritySchemeService,
            prioritySchemeManager,
            notificationSchemeManager,
            fieldLayoutManager
   )
   Project project = resultMap.get("project")
   if (project == null) {
      return "Failed to Create MCU BSW Supplier Project:" + resultMap.get("msg")
   }
   // 创建用户和角色    
   def projectRole_pm = projectRoleManager.getProjectRole("Project Managers")
   if (projectRole_pm != null && projectLeader != null) {
        def pm_users = [projectLeader.getKey()] as Set
        createProjectRoleByUser(loggedInUser, pm_users, projectRole_pm, project, projectRoleService)
   }
   // 创建版本
   createSwProjectVersion(issue, project, customFieldManager, versionManager)
   // 创建kanban
   rapidViewHelper.createRapidViewForPreset(
      loggedInUser, 
      project.getKey()+' Kanban Board', 
      [project.getId().toString()] as Set, 
      'kanban'
   )
   return "Successfully Created MCU BSW Supplier Project"
}

// create base project
def HashMap createProject(
    String projectName,
    String projectKey,
    String projectCategoryName,
    Long issueTypeId,
    Long workflowSchemeId,
    Long issueTypeScreenSchemeId,
    Long permissionSchemeId,
    Long issueSecuritySchemeId,
    Long prioritySchemeId,
    Long notificationSchemeId,
    Long fieldConfigSchemeId,
    ApplicationUser projectLeader,
    ApplicationUser loggedInUser,
    def projectService,
    def projectManager,
    def issueTypeSchemeService,
    def issueTypeScreenSchemeManager,
    def workflowSchemeManager,
    def permissionSchemeManager,
    def issueSecuritySchemeService,
    def prioritySchemeManager,
    def notificationSchemeManager,
    def fieldLayoutManager
) {
    // 返回结果
    def resultMap = new HashMap()

    // 项目类型:business | software | service_desk
    def projectTypeKey = new ProjectTypeKey("software")

    // 构建创建数据
    def creationData = new ProjectCreationData.Builder().with {
        withName(projectName)
        withKey(projectKey)
        withDescription(null)
        withLead(projectLeader)  // 项目负责人
        withUrl(null)
        withAssigneeType(AssigneeTypes.PROJECT_LEAD)
        withType(projectTypeKey)
    }.build()

    // 验证并创建
    ProjectService.CreateProjectValidationResult projectValidationResult = projectService.validateCreateProject(loggedInUser, creationData)
    if (projectValidationResult.isValid()) {
        Project project = projectService.createProject(projectValidationResult)
        // 设置项目分类
        ProjectCategory projectCategory = projectManager.getProjectCategoryObjectByNameIgnoreCase(projectCategoryName)
        projectManager.setProjectCategory(project,projectCategory)
        // 关联问题类型方案
        //issueTypeSchemeService.removeProjectAssociation(loggedInUser, issueTypeId, project.getId().toString())
        List<String> projectIds = new ArrayList()
        projectIds.add(project.getId().toString())
        def issueTypeSchemeResult = issueTypeSchemeService.addProjectAssociations(
            loggedInUser, 
            issueTypeId, // 问题类型方案ID
            projectIds // 注意需要传入一个项目ID的列表
        )
        log.error("关联问题类型方案结果: "+issueTypeSchemeResult)
        // 关联工作流方案
        def workflowScheme = workflowSchemeManager.getSchemeObject(workflowSchemeId)
        workflowSchemeManager.addSchemeToProject(project,workflowScheme)
        // 关联界面方案
        def issueTypeScreenScheme = issueTypeScreenSchemeManager.getIssueTypeScreenScheme(issueTypeScreenSchemeId)
        issueTypeScreenSchemeManager.addSchemeAssociation(project,issueTypeScreenScheme)
        // 关联权限方案
        def permissionScheme = permissionSchemeManager.getSchemeObject(permissionSchemeId)
        permissionSchemeManager.removeSchemesFromProject(project)
        permissionSchemeManager.addSchemeToProject(project,permissionScheme)
        // 关联问题安全方案
        def issueSecuritySchemeResult = issueSecuritySchemeService.assignSchemeToProject(
            loggedInUser, 
            project.getId(), 
            issueSecuritySchemeId, // 问题安全方案ID 
            new HashMap<>() // 级别映射,通常可以为空
        )
        log.error("关联问题安全方案结果: "+issueSecuritySchemeResult)
        // 关联字段方案
        fieldLayoutManager.addSchemeAssociation(project, fieldConfigSchemeId)
        // 关联优先级方案
        def priorityScheme = prioritySchemeManager.getScheme(prioritySchemeId)
        prioritySchemeManager.assignProject(priorityScheme,project)
        // 关联通知方案
        def notificationScheme = notificationSchemeManager.getSchemeObject(notificationSchemeId)
        notificationSchemeManager.addSchemeToProject(project,notificationScheme)
        resultMap.put("project", project)
        resultMap.put("msg", "success")
    } else {
       log.error("创建项目失败:"+projectValidationResult.errorCollection.errors.toString()) 
       resultMap.put("project", null)
       resultMap.put("msg", projectValidationResult.errorCollection.errors.toString())
    }
    return resultMap
}

//创建SW项目版本(子项目通用)
def createSwProjectVersion(
   def issue,
   def project,
   def customFieldManager,
   def versionManager
){
   // SW Main Released Version
   def swMainReleasedVersionField = customFieldManager.getCustomFieldObject("customfield_10710")
   def swMainReleasedVersion = issue.getCustomFieldValue(swMainReleasedVersionField) as String
   // SW Main Unreleased Version
   def swMainUnreleasedVersionField = customFieldManager.getCustomFieldObject("customfield_10711")
   def swMainUnreleasedVersion = issue.getCustomFieldValue(swMainUnreleasedVersionField) as String
   // 创建版本
   if (swMainReleasedVersion != null) {
      versionManager.createVersion(swMainReleasedVersion, null, null, null, project.getId(), null, true)
   }
   if (swMainUnreleasedVersion != null) {
      versionManager.createVersion(swMainUnreleasedVersion, null, null, null, project.getId(), null, false)
   }
}

// 创建项目角色(人员)
def createProjectRoleByUser(
    def loggedInUser,
    def users,
    def projectRole,
    def project,
    def projectRoleService
) {
    projectRoleService.addActorsToProjectRole(
        loggedInUser,
        users,          // 用户Key列表
        projectRole, 
        project, 
        'atlassian-user-role-actor',        // 角色用户类型,用户为 'atlassian-user-role-actor'
        null
    )
}

// 创建项目角色(用户组)
def createProjectRoleByGroup(
    def loggedInUser,
    def groups,
    def projectRole,
    def project,
    def projectRoleService
) {
    projectRoleService.addActorsToProjectRole(
        loggedInUser,
        groups,          // 用户组Key列表
        projectRole, 
        project, 
        'atlassian-group-role-actor',        // 角色用户类型,用户为 'atlassian-group-role-actor'
        null
    )
}