|
@@ -0,0 +1,159 @@
|
|
|
+package shanghu
|
|
|
+
|
|
|
+import (
|
|
|
+ orm "duoduo/database"
|
|
|
+ "duoduo/tools"
|
|
|
+ "encoding/json"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type MerchantClientTicket struct {
|
|
|
+ ID int64 `gorm:"column:id;type:bigint(20);primary_key" json:"id"`
|
|
|
+ RechargeProjectID int64 `gorm:"column:recharge_project_id;type:bigint(20)" json:"recharge_project_id"` // 项目id
|
|
|
+ RechargeProjectQuantity int `gorm:"column:recharge_project_quantity;type:int(11)" json:"recharge_project_quantity"` // 项目数量
|
|
|
+ RechargeProjectName string `gorm:"column:recharge_project_name;type:varchar(255)" json:"recharge_project_name"` // 项目名
|
|
|
+ MerchantOpenID string `gorm:"column:merchant_open_id;type:varchar(255)" json:"merchant_open_id"`
|
|
|
+ ClientOpenID string `gorm:"column:client_open_id;type:varchar(255)" json:"client_open_id"`
|
|
|
+ Operator string `gorm:"column:operator;type:varchar(255)" json:"operator"` // operator 操作人
|
|
|
+ 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 *MerchantClientTicket) TableName() string {
|
|
|
+ return "merchant_client_ticket"
|
|
|
+}
|
|
|
+
|
|
|
+func (u *MerchantClientTicket) Create() (MerchantClientTicket, error) {
|
|
|
+ var doc MerchantClientTicket
|
|
|
+ var err error
|
|
|
+
|
|
|
+ doc = *u
|
|
|
+ err = orm.ShMysql.Table(u.TableName()).Create(&doc).Error
|
|
|
+ if err != nil {
|
|
|
+ return doc, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return doc, nil
|
|
|
+}
|
|
|
+
|
|
|
+// 商家充值进来,卡的商家
|
|
|
+func (u *MerchantClientTicket) Recharge(recharge MerchantRecharge, clientOpenId string, operator string) error {
|
|
|
+ var err error
|
|
|
+ var account MerchantRechargeClientAccount
|
|
|
+ var accountLog MerchantRechargeClientAccountLog
|
|
|
+ var ticket MerchantClientTicket
|
|
|
+ var project MerchantRechargeProject
|
|
|
+
|
|
|
+ tx := orm.ShMysql.Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ err = tx.Table("merchant_recharge_client_account").Where("client_open_id = ? and merchant_open_id = ?",
|
|
|
+ clientOpenId, recharge.MerchantOpenID).First(&account).Error
|
|
|
+ if err != nil && err.Error() != "record not found" {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建充值记录
|
|
|
+ if account.ID == 0 {
|
|
|
+ var clientAccount MerchantRechargeClientAccount
|
|
|
+ clientAccount.Amount, err = decimal.NewFromString(recharge.Amount)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ clientAccount.ClientOpenID = clientOpenId
|
|
|
+ clientAccount.MerchantOpenID = recharge.MerchantOpenID
|
|
|
+ clientAccount.UpdatedAt = time.Now()
|
|
|
+ clientAccount.CreatedAt = time.Now()
|
|
|
+ err = tx.Table(clientAccount.TableName()).Create(&clientAccount).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ //充值记录
|
|
|
+ accountLog.Amount = account.Amount
|
|
|
+ accountLog.AmountAfter = account.Amount
|
|
|
+ accountLog.ClientOpenID = clientOpenId
|
|
|
+ accountLog.MerchantOpenID = recharge.MerchantOpenID //充值商户
|
|
|
+ accountLog.TransType = 1 //充值
|
|
|
+ accountLog.Operator = operator //充值人员
|
|
|
+ accountLog.PayTransID = recharge.ID
|
|
|
+ accountLog.CreatedAt = time.Now()
|
|
|
+ accountLog.UpdatedAt = time.Now()
|
|
|
+ err = tx.Table(accountLog.TableName()).Create(&accountLog).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ } else { //更新充值加钱,并且保存记录
|
|
|
+ //var clientAccount MerchantRechargeClientAccount
|
|
|
+ //clientAccount.MerchantOpenID = recharge.MerchantOpenID
|
|
|
+ //clientAccount.ClientOpenID = clientOpenId
|
|
|
+ //err = tx.Table(clientAccount.TableName()).Where("client_open_id = ? and merchant_open_id = ?",
|
|
|
+ // clientOpenId, recharge.MerchantOpenID).First(&clientAccount).Error
|
|
|
+ //if err != nil {
|
|
|
+ // return err
|
|
|
+ //}
|
|
|
+
|
|
|
+ inAmount, err := decimal.NewFromString(recharge.Amount)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if err = tx.Table(account.TableName()).Model(&account).Where("id = ? and version = ? ", account.ID, account.Version).Updates(
|
|
|
+ map[string]interface{}{
|
|
|
+ "client_open_id": account.ClientOpenID,
|
|
|
+ "merchant_open_id": account.MerchantOpenID,
|
|
|
+ "amount": account.Amount.Add(inAmount),
|
|
|
+ "version": account.Version + 1,
|
|
|
+ "updated_at": tools.GetCurrntTimeStr()}).Error; err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ //充值记录
|
|
|
+ accountLog.Amount = inAmount
|
|
|
+ accountLog.AmountPre = account.Amount
|
|
|
+ accountLog.AmountAfter = account.Amount.Add(inAmount)
|
|
|
+ accountLog.ClientOpenID = clientOpenId
|
|
|
+ accountLog.MerchantOpenID = recharge.MerchantOpenID //充值商户
|
|
|
+ accountLog.TransType = 1 //充值
|
|
|
+ accountLog.Operator = operator //充值人员
|
|
|
+ accountLog.PayTransID = recharge.ID
|
|
|
+ accountLog.CreatedAt = time.Now()
|
|
|
+ accountLog.UpdatedAt = time.Now()
|
|
|
+
|
|
|
+ err = tx.Table(accountLog.TableName()).Create(&accountLog).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //充卡券
|
|
|
+ err = json.Unmarshal([]byte(recharge.CardProjectData), &project)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ ticket.RechargeProjectName = project.ProjectName
|
|
|
+ ticket.RechargeProjectQuantity = project.ProjectQuantity
|
|
|
+ ticket.RechargeProjectID = project.ID
|
|
|
+ ticket.MerchantOpenID = project.MerchantOpenID
|
|
|
+ ticket.ClientOpenID = clientOpenId
|
|
|
+ ticket.Operator = operator
|
|
|
+
|
|
|
+ err = tx.Table(ticket.TableName()).Create(&ticket).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|