Files
platforms/backend/api/cmd/cli/address_migration.go

66 lines
3.2 KiB
Go
Raw Normal View History

// 功能描述:只扩展用户地址的联系人和幂等字段,不执行全库迁移或初始化。
// 版本1.0.0。
package main
import (
"fmt"
"git.apinb.com/bsm-sdk/core/database"
dbsql "git.apinb.com/bsm-sdk/core/database/sql"
"git.apinb.com/heqiapp/platforms/backend/api/internal/config"
"gorm.io/gorm"
)
// migrateUserAddress 使用当前环境的已有数据库配置,事务失败全部回滚。
func migrateUserAddress() error {
return migrateClientColumns([]string{
`ALTER TABLE user_address ADD COLUMN IF NOT EXISTS contact_name varchar(64) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS contact_phone varchar(32) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS request_no varchar(64) NOT NULL DEFAULT ''`,
`COMMENT ON COLUMN user_address.contact_name IS '收货联系人姓名;历史记录为空,编辑时补齐'`,
`COMMENT ON COLUMN user_address.contact_phone IS '收货联系人手机号;历史记录为空,编辑时补齐'`,
`COMMENT ON COLUMN user_address.request_no IS '客户端新增请求幂等标识,同一用户重试不重复新增,历史记录为空'`,
})
}
// migrateTicketContact 仅补齐报修故障分类和提交时的联系人快照。
func migrateTicketContact() error {
return migrateClientColumns([]string{
`ALTER TABLE cs_ticket ADD COLUMN IF NOT EXISTS fault_type varchar(32) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS contact_name varchar(64) NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS contact_phone varchar(32) NOT NULL DEFAULT ''`,
`COMMENT ON COLUMN cs_ticket.fault_type IS '故障类型leak=燃气泄漏valve=阀门故障alarm=报警器故障other=其他;历史记录为空'`,
`COMMENT ON COLUMN cs_ticket.contact_name IS '用户提交工单时的联系人姓名快照,历史记录为空'`,
`COMMENT ON COLUMN cs_ticket.contact_phone IS '用户提交工单时的联系电话快照,历史记录为空'`,
})
}
// migrateTicketContract 只增加可选合同关联旧工单保持0且不改变原处理规则。
func migrateTicketContract() error {
return migrateClientColumns([]string{
`ALTER TABLE cs_ticket ADD COLUMN IF NOT EXISTS gasorder_contract_id bigint NOT NULL DEFAULT 0`,
`COMMENT ON COLUMN cs_ticket.gasorder_contract_id IS '关联供气合同内部主键0=非合同申请非0由本人合同校验后写入不代表合同已修改'`,
`CREATE INDEX IF NOT EXISTS idx_cs_ticket_gasorder_contract_id ON cs_ticket(gasorder_contract_id)`,
})
}
// migrateClientColumns 在已有远程配置中执行明确字段扩展,锁超时或失败全部回滚。
func migrateClientColumns(statements []string) error {
config.New(serviceKey)
if config.Spec.Databases == nil {
return fmt.Errorf("database configuration required")
}
db, err := database.NewDatabase(config.Spec.Databases.Driver, config.Spec.Databases.Source, dbsql.SetOptions(nil))
if err != nil {
return fmt.Errorf("connect configured database failed")
}
sqlDB, err := db.DB()
if err != nil {
return err
}
defer sqlDB.Close()
return db.Transaction(func(tx *gorm.DB) error {
for _, statement := range append([]string{`SET LOCAL lock_timeout = '5s'`}, statements...) {
if err := tx.Exec(statement).Error; err != nil {
return err
}
}
return nil
})
}