Seed rdev.v2.json, rd_ templates, catalog policy (order 40), squad kind orchestration, and hard precheck requiring completed main (CDO). Includes StageKey dynamicization from P0 and docs for P2–P4 skeleton. Co-authored-by: Cursor <cursoragent@cursor.com>
133 lines
4.1 KiB
Go
133 lines
4.1 KiB
Go
package workflowdef
|
|
|
|
// 正式项目可选工作流(唯一对外目录)。
|
|
// 包含医疗四工作流 + 纯软件 bootstrap/delivery;不得把医疗语义硬塞进软件 key。
|
|
const (
|
|
OfficialKeyMain = "main"
|
|
OfficialKeyProductManager = "product_manager"
|
|
OfficialKeyTestManager = "test_manager"
|
|
OfficialKeyRDev = "rdev"
|
|
OfficialKeySoftwareBootstrap = "software_bootstrap"
|
|
OfficialKeySoftwareDelivery = "software_delivery"
|
|
)
|
|
|
|
var officialWorkflowKeys = map[string]struct{}{
|
|
OfficialKeyMain: {},
|
|
OfficialKeyProductManager: {},
|
|
OfficialKeyTestManager: {},
|
|
OfficialKeyRDev: {},
|
|
OfficialKeySoftwareBootstrap: {},
|
|
OfficialKeySoftwareDelivery: {},
|
|
}
|
|
|
|
var medicalWorkflowKeys = map[string]struct{}{
|
|
OfficialKeyMain: {},
|
|
OfficialKeyProductManager: {},
|
|
OfficialKeyTestManager: {},
|
|
OfficialKeyRDev: {},
|
|
}
|
|
|
|
var officialWorkflowNames = map[string]string{
|
|
OfficialKeyMain: "商务对接流程",
|
|
OfficialKeyProductManager: "智能产品经理流程",
|
|
OfficialKeyTestManager: "智能测试工程师流程",
|
|
OfficialKeyRDev: "研发设计控制流程",
|
|
OfficialKeySoftwareBootstrap: "软件项目自举流程",
|
|
OfficialKeySoftwareDelivery: "软件交付迭代流程",
|
|
}
|
|
|
|
var officialCatalogOrder = map[string]int{
|
|
OfficialKeyMain: 10,
|
|
OfficialKeyProductManager: 20,
|
|
OfficialKeyTestManager: 30,
|
|
OfficialKeyRDev: 40,
|
|
OfficialKeySoftwareBootstrap: 50,
|
|
OfficialKeySoftwareDelivery: 60,
|
|
}
|
|
|
|
var officialProductDomains = map[string][]string{
|
|
OfficialKeyMain: {"medical_device", "non_medical_software"},
|
|
OfficialKeyProductManager: {"medical_device", "non_medical_software"},
|
|
OfficialKeyTestManager: {"medical_device", "non_medical_software"},
|
|
OfficialKeyRDev: {"medical_device"},
|
|
OfficialKeySoftwareBootstrap: {"non_medical_software"},
|
|
OfficialKeySoftwareDelivery: {"non_medical_software"},
|
|
}
|
|
|
|
// IsOfficialWorkflowKey 是否为正式可选工作流 key(医疗四 + 软件两)。
|
|
func IsOfficialWorkflowKey(key string) bool {
|
|
_, ok := officialWorkflowKeys[key]
|
|
return ok
|
|
}
|
|
|
|
// IsMedicalWorkflowKey 是否为医疗正式工作流(固定文档数等门禁约束)。
|
|
func IsMedicalWorkflowKey(key string) bool {
|
|
_, ok := medicalWorkflowKeys[key]
|
|
return ok
|
|
}
|
|
|
|
// IsSoftwareWorkflowKey 是否为纯软件正式工作流。
|
|
func IsSoftwareWorkflowKey(key string) bool {
|
|
return key == OfficialKeySoftwareBootstrap || key == OfficialKeySoftwareDelivery
|
|
}
|
|
|
|
// OfficialWorkflowName 返回正式对外名称。
|
|
func OfficialWorkflowName(key string) string {
|
|
if name, ok := officialWorkflowNames[key]; ok {
|
|
return name
|
|
}
|
|
return key
|
|
}
|
|
|
|
// OfficialCatalogOrder 返回目录排序权重。
|
|
func OfficialCatalogOrder(key string) int {
|
|
if order, ok := officialCatalogOrder[key]; ok {
|
|
return order
|
|
}
|
|
return 9999
|
|
}
|
|
|
|
// OfficialWorkflowKeys 返回正式可选 key 列表(稳定顺序)。
|
|
func OfficialWorkflowKeys() []string {
|
|
return []string{
|
|
OfficialKeyMain,
|
|
OfficialKeyProductManager,
|
|
OfficialKeyTestManager,
|
|
OfficialKeyRDev,
|
|
OfficialKeySoftwareBootstrap,
|
|
OfficialKeySoftwareDelivery,
|
|
}
|
|
}
|
|
|
|
// MedicalWorkflowKeys 返回医疗四 key(稳定顺序)。
|
|
func MedicalWorkflowKeys() []string {
|
|
return []string{OfficialKeyMain, OfficialKeyProductManager, OfficialKeyTestManager, OfficialKeyRDev}
|
|
}
|
|
|
|
// SoftwareWorkflowKeys 返回软件两 key(稳定顺序)。
|
|
func SoftwareWorkflowKeys() []string {
|
|
return []string{OfficialKeySoftwareBootstrap, OfficialKeySoftwareDelivery}
|
|
}
|
|
|
|
// CompatibleWithProductDomain 判断工作流是否与项目产品域兼容。
|
|
// 空 domain 视为不过滤(兼容旧项目);软件 key 在 medical_device 下不可选。
|
|
func CompatibleWithProductDomain(workflowKey, productDomain string) bool {
|
|
if !IsOfficialWorkflowKey(workflowKey) {
|
|
return false
|
|
}
|
|
domain := productDomain
|
|
if domain == "" {
|
|
return true
|
|
}
|
|
allowed, ok := officialProductDomains[workflowKey]
|
|
if !ok {
|
|
return false
|
|
}
|
|
for _, d := range allowed {
|
|
if d == domain {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|