feat: integrate OA activation workflows and business migration

This commit is contained in:
Yvan
2026-11-07 00:09:19 +08:00
parent 64aca495f2
commit 9caf5b1abc
47 changed files with 1831 additions and 152 deletions
+31 -7
View File
@@ -20,9 +20,15 @@ import (
businessservice "kra/internal/service/business"
)
type activationHTTPDatabases struct{ oa *gorm.DB }
type activationHTTPDatabases struct {
oa *gorm.DB
sdk *gorm.DB
}
func (p *activationHTTPDatabases) Database(name string) (*gorm.DB, error) {
if name == "lx" && p.sdk != nil {
return p.sdk, nil
}
if name == "oa" && p.oa != nil {
return p.oa, nil
}
@@ -66,9 +72,27 @@ func TestActivationHTTPNamedDatabaseAndSpend(t *testing.T) {
}
}
provider := businessHTTPData{db}
databases := &activationHTTPDatabases{oa: oa}
uc := businessbiz.NewActivationUsecase(businessdata.NewActivationRepo(provider, databases), businessbiz.NewAccountUsecase(businessdata.NewAccountRepo(provider)))
h := handler.NewActivation(businessservice.NewActivationService(uc))
sdk := open("sdk.db")
pool, _ := sdk.DB()
pool.SetMaxOpenConns(1)
var files []struct{ Name, File string }
db.Raw("PRAGMA database_list").Scan(&files)
for _, file := range files {
if file.Name == "main" {
if err := sdk.Exec("ATTACH DATABASE ? AS sample", file.File).Error; err != nil {
t.Fatal(err)
}
}
}
for _, table := range []string{"tab_promote", "tab_spend"} {
if err := sdk.Exec("CREATE TABLE " + table + " AS SELECT * FROM sample." + table + " WHERE source_db='lx'").Error; err != nil {
t.Fatal(err)
}
}
sdk.Exec("DETACH DATABASE sample")
databases := &activationHTTPDatabases{oa: oa, sdk: sdk}
uc := businessbiz.NewActivationUsecase(businessdata.NewActivationRepo(provider, databases), businessbiz.NewAccountUsecase(businessdata.NewAccountRepo(provider)), businessbiz.NewUserPreferenceUsecase(businessdata.NewUserPreferenceRepo(provider)))
h := handler.NewActivation(businessservice.NewActivationService(uc, nil))
engine := gin.New()
engine.Use(func(c *gin.Context) {
id, _ := strconv.ParseUint(c.GetHeader("X-Test-User"), 10, 64)
@@ -113,14 +137,14 @@ func TestActivationHTTPNamedDatabaseAndSpend(t *testing.T) {
}
const detail = "/sw/promoteActivePool/bindSpendDetail?id=9007199254740993"
data := call(8, detail, 0)
if data["totalAmount"] != "30.30" || len(data["list"].([]any)) != 2 || data["endAt"] != "1970-01-01 00:33:20" {
t.Fatalf("流水金额、树范围或达标优先截止错误: %+v", data)
if data["totalAmount"] != "1029.30" || len(data["list"].([]any)) != 2 || data["endAt"] != "1970-01-01 01:00:00" {
t.Fatalf("流水金额、树范围或实际解绑截止错误: %+v", data)
}
call(7, detail, 7)
call(8, "/sw/promoteActivePool/bindSpendDetail?id=2", 7)
call(8, "/sw/promoteActivePool/bindSpendDetail?id=3", 7)
call(1, "/sw/promoteActivePool/bindSpendDetail?id=0", 7)
if err := db.Exec("DROP TABLE tab_spend").Error; err != nil {
if err := sdk.Exec("DROP TABLE tab_spend").Error; err != nil {
t.Fatal(err)
}
call(8, detail, 7)
+1 -1
View File
@@ -61,7 +61,7 @@ func TestAlertRecordHTTPCompleteWorkflowAndVisibility(t *testing.T) {
c.Next()
})
router.RegisterAlertRecord(engine.Group(""), handler.NewAlertRecord(service))
router.RegisterAlertGovernance(engine.Group(""), handler.NewAlertGovernance(businessservice.NewAlertGovernanceService(businessbiz.NewAlertGovernanceUsecase(businessdata.NewAlertGovernanceRepo(provider), accounts))))
router.RegisterAlertGovernance(engine.Group(""), handler.NewAlertGovernance(businessservice.NewAlertGovernanceService(businessbiz.NewAlertGovernanceUsecase(businessdata.NewAlertGovernanceRepo(provider, &activationHTTPDatabases{}), accounts))))
server := httptest.NewServer(engine)
defer server.Close()
call := func(user int, method, path, body string, expected int) map[string]any {
+1 -1
View File
@@ -71,7 +71,7 @@ func TestBusinessManagementHTTPGroupsGoalsAndEffectivenessAgree(t *testing.T) {
goalRepo := data.NewGoalRepo(provider)
performance := biz.NewPerformanceUsecase(data.NewPerformanceRepo(provider), teams, effective, goalRepo)
goals := biz.NewGoalUsecase(goalRepo, performance)
dashboard := biz.NewDashboardUsecase(data.NewDashboardRepo(provider), biz.NewWorkbenchUsecase(data.NewWorkbenchRepo(provider), accounts, preferences), effective)
dashboard := biz.NewDashboardUsecase(data.NewDashboardRepo(provider, &activationHTTPDatabases{}), biz.NewWorkbenchUsecase(data.NewWorkbenchRepo(provider), accounts, preferences), effective)
engine := gin.New()
engine.Use(func(c *gin.Context) {
id, _ := strconv.ParseUint(c.GetHeader("X-Test-User"), 10, 64)
+8 -4
View File
@@ -26,6 +26,7 @@ import (
"kra/internal/integration/email"
"kra/internal/integration/gameplatform"
"kra/internal/integration/mq"
"kra/internal/integration/oa"
"kra/internal/integration/payment"
"kra/internal/integration/sms"
"kra/internal/integration/storage"
@@ -82,7 +83,7 @@ func wireApp(configServer *config.Server, store *config.Store, logger *slog.Logg
auditRecorderUsecase := system2.NewAuditRecorderUsecase(auditRecordRepo)
auditRecorder := system3.NewAuditRecorder(auditRecorderUsecase)
registry := taskRegistry()
alertGovernanceRepo := business.NewAlertGovernanceRepo(dataData)
alertGovernanceRepo := business.NewAlertGovernanceRepo(dataData, dataData)
accountRepo := business.NewAccountRepo(dataData)
accountUsecase := business2.NewAccountUsecase(accountRepo)
alertGovernanceUsecase := business2.NewAlertGovernanceUsecase(alertGovernanceRepo, accountUsecase)
@@ -97,7 +98,7 @@ func wireApp(configServer *config.Server, store *config.Store, logger *slog.Logg
goalRepo := business.NewGoalRepo(dataData)
performanceUsecase := business2.NewPerformanceUsecase(performanceRepo, teamUsecase, effectivenessUsecase, goalRepo)
goalUsecase := business2.NewGoalUsecase(goalRepo, performanceUsecase)
dashboardRepo := business.NewDashboardRepo(dataData)
dashboardRepo := business.NewDashboardRepo(dataData, dataData)
workbenchRepo := business.NewWorkbenchRepo(dataData)
userPreferenceRepo := business.NewUserPreferenceRepo(dataData)
userPreferenceUsecase := business2.NewUserPreferenceUsecase(userPreferenceRepo)
@@ -141,8 +142,11 @@ func wireApp(configServer *config.Server, store *config.Store, logger *slog.Logg
channelService := business3.NewChannelService(channelUsecase)
channel := handler.NewChannel(channelService)
activationRepo := business.NewActivationRepo(dataData, dataData)
activationUsecase := business2.NewActivationUsecase(activationRepo, accountUsecase)
activationService := business3.NewActivationService(activationUsecase)
activationUsecase := business2.NewActivationUsecase(activationRepo, accountUsecase, userPreferenceUsecase)
activationPoolRepo := business.NewActivationPoolRepo(dataData, dataData)
activationGateway := oa.NewActivationGateway(store)
activationPoolUsecase := business2.NewActivationPoolUsecase(activationPoolRepo, activationGateway, accountUsecase)
activationService := business3.NewActivationService(activationUsecase, activationPoolUsecase)
activation := handler.NewActivation(activationService)
alertRecordRepo := business.NewAlertRecordRepo(dataData)
alertRecordUsecase := business2.NewAlertRecordUsecase(alertRecordRepo, accountUsecase)