Files
weichenandCursor 37b1aaa3ae feat(rdev): add medical design-control workflow (13 stages / 60 docs)
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>
2026-09-17 09:46:26 +00:00

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
}