package shanghu import ( orm "duoduo/database" "errors" "github.com/shopspring/decimal" "time" ) type ActiveClientAccount struct { ID int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` // 主键 ClientOpenID string `gorm:"column:client_open_id;type:varchar(255)" json:"client_open_id"` // ReviewAmount decimal.Decimal `gorm:"column:review_amount;type:decimal(10,2)" json:"review_amount"` // 待核销金额 Version int `gorm:"column:version;type:int(11)" json:"version"` // Version Amount decimal.Decimal `gorm:"column:amount;type:decimal(10,2)" json:"amount"` // 可提现金额 CreateBy int64 `gorm:"column:create_by;type:bigint(20)" json:"create_by"` // 创建者 UpdateBy int64 `gorm:"column:update_by;type:bigint(20)" json:"update_by"` // 更新者 CreatedAt time.Time `gorm:"column:created_at;type:datetime(3)" json:"created_at"` // 创建时间 UpdatedAt time.Time `gorm:"column:updated_at;type:datetime(3)" json:"updated_at"` // 最后更新时间 DeletedAt time.Time `gorm:"column:deleted_at;type:datetime(3);default:null" json:"deleted_at"` // 删除时间 } func (m *ActiveClientAccount) TableName() string { return "active_client_account" } func (m *ActiveClientAccount) GetActiveAccount() (ActiveClientAccount, error) { var doc ActiveClientAccount table := orm.ShMysql.Table(m.TableName()) table = table.Where("client_open_id = ? ", m.ClientOpenID) if err := table.Select("*").First(&doc).Error; err != nil { return doc, err } return doc, nil } func (m *ActiveClientAccount) Create() (ActiveClientAccount, error) { var doc ActiveClientAccount var err error doc = *m err = orm.ShMysql.Table(m.TableName()).Create(&doc).Error if err != nil { return doc, err } return doc, nil } // c端拼个好运提现 func (m *ActiveClientAccount) SettleSubClient(clientAmount decimal.Decimal, clientOpenId string, cashOutId int64) error { // 使用事务 添加 var err error var clientAccount ActiveClientAccount var cashOut CashOut var amountPreClient decimal.Decimal tx := orm.ShMysql.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() err = tx.Table("active_client_account").Select("*").Where("client_open_id = ?", clientOpenId).Find(&clientAccount).Error if err != nil { return err } amountPreClient = clientAccount.Amount if clientAccount.Amount.Cmp(clientAmount) < 0 { err = errors.New("账户金额不够") return err } clientAmountSub := clientAccount.Amount.Sub(clientAmount) result := tx.Table("active_client_account").Model(&clientAccount).Where("client_open_id = ? and version = ?", clientOpenId, clientAccount.Version).Updates( map[string]interface{}{ "amount": clientAmountSub, "version": clientAccount.Version + 1, "updated_at": time.Now()}) if result.Error != nil { err = result.Error return err } if result.RowsAffected <= 0 { err = errors.New("rows is zero") return err } var clientAccountLog ActiveClientAccountLog clientAccountLog.ClientOpenID = clientOpenId clientAccountLog.UpdatedAt = time.Now() clientAccountLog.AmountPre = amountPreClient clientAccountLog.AmountAfter = clientAmountSub clientAccountLog.ReviewAmountAfter = clientAccount.ReviewAmount clientAccountLog.ReviewAmountPre = clientAccount.ReviewAmount clientAccountLog.Amount = clientAmount clientAccountLog.PayTransID = cashOutId clientAccountLog.TransType = ActiveClientAccountLogTypeCashOut err = tx.Table("active_client_account_log").Create(&clientAccountLog).Error if err != nil { return err } result = tx.Table("cash_out").Model(&cashOut).Where("id = ? ", cashOutId).Updates( map[string]interface{}{ "status": 99, //体现成功 "account_status": 99, //分账成功 "updated_at": time.Now()}) if result.Error != nil { err = result.Error return err } if result.RowsAffected <= 0 { err = errors.New("rows is zero") return err } return nil } func (m *ActiveClientAccount) SettleAddCashOutFee(amount decimal.Decimal, clientOpenId string, cashOutId int64) error { // 使用事务 添加 var err error var clientAccount ActiveClientAccount var amountPreClient decimal.Decimal tx := orm.ShMysql.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() err = tx.Table("active_client_account").Select("*").Where("client_open_id = ?", clientOpenId).Find(&clientAccount).Error if err != nil && err.Error() != "record not found" { return err } if clientAccount.ID == 0 { clientAccount.ClientOpenID = clientOpenId clientAccount.Version = 1 clientAccount.UpdatedAt = time.Now() clientAccount.CreatedAt = time.Now() err = tx.Table("active_client_account").Create(&clientAccount).Error if err != nil { return err } } amountPreClient = clientAccount.Amount clientAmountAdd := clientAccount.Amount.Add(amount) result := tx.Table("active_client_account").Model(&clientAccount).Where("client_open_id = ? and version = ?", clientOpenId, clientAccount.Version).Updates( map[string]interface{}{ "amount": clientAmountAdd, "version": clientAccount.Version + 1, "updated_at": time.Now()}) if result.Error != nil { err = result.Error return err } if result.RowsAffected <= 0 { err = errors.New("rows is zero") return err } var clientAccountLog ActiveClientAccountLog clientAccountLog.ClientOpenID = clientOpenId clientAccountLog.UpdatedAt = time.Now() clientAccountLog.AmountPre = amountPreClient clientAccountLog.AmountAfter = clientAmountAdd clientAccountLog.ReviewAmountAfter = clientAccount.ReviewAmount clientAccountLog.ReviewAmountPre = clientAccount.ReviewAmount clientAccountLog.Amount = amount clientAccountLog.PayTransID = cashOutId clientAccountLog.TransType = ActiveClientAccountLogTypeCashOutFee //服务费 err = tx.Table("active_client_account_log").Create(&clientAccountLog).Error if err != nil { return err } return nil }