k.zhang преди 11 месеца
родител
ревизия
7ef8aff3dd

+ 2 - 1
apis/shanghu/base.go

@@ -53,11 +53,12 @@ func InitShangHuRouter(engine *gin.RouterGroup) {
 
 	recharge := engine.Group("v1/recharge")
 	{
-		recharge.POST("/config", CreateMerchantRechargeConfig)
+		recharge.POST("/config", CreateMerchantRechargeConfig) //充100送xxx
 		recharge.POST("/del", DelMerchantRechargeConfig)
 		recharge.POST("/list", MerchantRechargeConfigList)
 		recharge.POST("/project/create", CreateMerchantRechargeProject)
 		recharge.POST("/project/del", DelMerchantRechargeProject)
 		recharge.POST("/project/list", MerchantRechargeProjectList)
+		recharge.POST("/merchant/recharge", MerchantRecharge) //充值根据code给用户充值
 	}
 }

+ 47 - 0
apis/shanghu/merchant.client.ticket.go

@@ -0,0 +1,47 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"github.com/gin-gonic/gin"
+)
+
+// 充值
+func MerchantRecharge(c *gin.Context) {
+	var inData models.MerchantRechargeRequest
+	var merchantRecharge shanghu.MerchantRecharge
+	var merchantClientTicket shanghu.MerchantClientTicket
+	var clientOpenId shanghu.MerchantClientUser
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	// 查客户id
+	clientOpenId.Code = inData.ClientCode
+	clientInfo, err := clientOpenId.GetUserInfoByCode()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	merchantRecharge.ID = inData.MerchantRechargeID
+
+	merchantRechargeInfo, err := merchantRecharge.GetMerchantRecharge()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	//json
+	err = merchantClientTicket.Recharge(merchantRechargeInfo, clientInfo.ClientOpenID, inData.MerchantOpenID)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	app.OK(c, nil, app.Success)
+
+}

+ 4 - 0
apis/shanghu/merchant.recharge.go

@@ -9,6 +9,7 @@ import (
 	"time"
 )
 
+// 配置充值
 func CreateMerchantRechargeConfig(c *gin.Context) {
 	var inData models.CreateMerchantRechargeRequest
 	var project []int64
@@ -23,6 +24,7 @@ func CreateMerchantRechargeConfig(c *gin.Context) {
 	merchantRecharge.MerchantRechargeName = inData.MerchantRechargeName
 	merchantRecharge.CardProjectData = inData.CardProjectData
 	merchantRecharge.MerchantOpenID = inData.MerchantOpenID
+	merchantRecharge.Amount = inData.Amount
 	merchantRecharge.CreatedAt = time.Now()
 	merchantRecharge.UpdatedAt = time.Now()
 
@@ -60,6 +62,7 @@ func CreateMerchantRechargeConfig(c *gin.Context) {
 
 }
 
+// 删除充值
 func DelMerchantRechargeConfig(c *gin.Context) {
 	var inData models.DelMerchantRechargeRequest
 	var sql shanghu.MerchantRecharge
@@ -81,6 +84,7 @@ func DelMerchantRechargeConfig(c *gin.Context) {
 
 }
 
+// 充值列表
 func MerchantRechargeConfigList(c *gin.Context) {
 	var inData models.MerchantRechargeListRequest
 	var sqlData shanghu.MerchantRecharge

+ 1 - 0
apis/shanghu/merchant.recharge.project.go

@@ -45,6 +45,7 @@ func DelMerchantRechargeProject(c *gin.Context) {
 	}
 
 	sqlData.ID = inData.Id
+	sqlData.MerchantOpenID = inData.MerchantOpenId
 
 	err = sqlData.DelMerchantRecharge()
 	if err != nil {

+ 7 - 0
apis/shanghu/models/merchant.client.ticket.go

@@ -0,0 +1,7 @@
+package models
+
+type MerchantRechargeRequest struct {
+	ClientCode         string `json:"client_code"`          // 客户端code
+	MerchantOpenID     string `json:"merchant_open_id"`     // Open id
+	MerchantRechargeID int64  `json:"merchant_recharge_id"` // 充值id
+}

+ 1 - 0
apis/shanghu/models/merchant.recharge.go

@@ -6,6 +6,7 @@ type CreateMerchantRechargeRequest struct {
 	MerchantRechargeName string `json:"merchant_recharge_name"` // 招商充值名称
 	MerchantOpenID       string `json:"merchant_open_id"`       // Open id
 	CardProjectData      string `json:"card_project_data"`
+	Amount               string `json:"amount"` //金额
 }
 
 type MerchantRecharge struct {

+ 2 - 1
apis/shanghu/models/merchant.recharge.project.go

@@ -7,7 +7,8 @@ type CreateMerchantRechargeProjectRequest struct {
 }
 
 type DelMerchantRechargeProjectRequest struct {
-	Id int64 `json:"id"`
+	Id             int64  `json:"id"`
+	MerchantOpenId string `json:"merchant_open_id"`
 }
 
 type MerchantRechargeProjectListRequest struct {

+ 159 - 0
models/shanghu/merchant.client.ticket.go

@@ -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
+}

+ 23 - 0
models/shanghu/merchant.recharge.client.account.go

@@ -0,0 +1,23 @@
+package shanghu
+
+import (
+	"github.com/shopspring/decimal"
+	"time"
+)
+
+type MerchantRechargeClientAccount 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"`
+	MerchantOpenID string          `gorm:"column:merchant_open_id;type:varchar(255)" json:"merchant_open_id"` // Open-id
+	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 *MerchantRechargeClientAccount) TableName() string {
+	return "merchant_recharge_client_account"
+}

+ 41 - 0
models/shanghu/merchant.recharge.client.account.log.go

@@ -0,0 +1,41 @@
+package shanghu
+
+import (
+	orm "duoduo/database"
+	"github.com/shopspring/decimal"
+	"time"
+)
+
+type MerchantRechargeClientAccountLog struct {
+	ID             int64           `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"`    // 主键
+	AmountPre      decimal.Decimal `gorm:"column:amount_pre;type:decimal(10,2)" json:"amount_pre"`            // 交易前
+	AmountAfter    decimal.Decimal `gorm:"column:amount_after;type:decimal(10,2)" json:"amount_after"`        // 交易后
+	TransType      int             `gorm:"column:trans_type;type:int(11)" json:"trans_type"`                  // 交易类型  1-充值 2-消费
+	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"`     // 商户openid
+	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"` // 删除时间
+	Amount         decimal.Decimal `gorm:"column:amount;type:decimal(10,2)" json:"amount"`                    // 交易金额
+	PayTransID     int64           `gorm:"column:pay_trans_id;type:bigint(20)" json:"pay_trans_id"`           // 充值id
+	Operator       string          `gorm:"column:operator;type:varchar(255)" json:"operator"`                 // operator 操作人
+}
+
+func (m *MerchantRechargeClientAccountLog) TableName() string {
+	return "merchant_recharge_client_account_log"
+}
+
+func (u *MerchantRechargeClientAccountLog) Create() (MerchantRechargeClientAccountLog, error) {
+	var doc MerchantRechargeClientAccountLog
+	var err error
+
+	doc = *u
+	err = orm.ShMysql.Table(u.TableName()).Create(&doc).Error
+	if err != nil {
+		return doc, err
+	}
+
+	return doc, nil
+}

+ 14 - 0
models/shanghu/merchant.recharge.go

@@ -8,6 +8,7 @@ import (
 type MerchantRecharge struct {
 	ID                   int64     `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"`                // Id
 	MerchantRechargeName string    `gorm:"column:merchant_recharge_name;type:varchar(255)" json:"merchant_recharge_name"` // 招商充值名称
+	Amount               string    `gorm:"column:amount;type:decimal(10,2)" json:"amount"`                                // 充值金额
 	MerchantOpenID       string    `gorm:"column:merchant_open_id;type:varchar(255)" json:"merchant_open_id"`             // Open id
 	CardProjectData      string    `gorm:"column:card_project_data;type:json" json:"card_project_data"`                   // 项目
 	CreateBy             int64     `gorm:"column:create_by;type:bigint(20)" json:"create_by"`                             // 创建者
@@ -73,3 +74,16 @@ func (m *MerchantRecharge) MerchantRechargeList(pageSize int, pageIndex int) ([]
 	table.Count(&count)
 	return doc, count, nil
 }
+
+func (m *MerchantRecharge) GetMerchantRecharge() (MerchantRecharge, error) {
+	var doc MerchantRecharge
+
+	table := orm.ShMysql.Table(m.TableName())
+	table = table.Where("id = ?  ", m.ID)
+
+	if err := table.Select("*").First(&doc).Error; err != nil {
+		return doc, err
+	}
+
+	return doc, nil
+}

+ 2 - 2
models/shanghu/merchant.recharget.project.go

@@ -14,7 +14,7 @@ type MerchantRechargeProject struct {
 	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)" json:"deleted_at"`                       // 删除时间
+	DeletedAt       time.Time `gorm:"column:deleted_at;type:datetime(3);default:null" json:"deleted_at"`          // 删除时间
 }
 
 func (m *MerchantRechargeProject) TableName() string {
@@ -36,7 +36,7 @@ func (u *MerchantRechargeProject) Create() (MerchantRechargeProject, error) {
 
 func (m *MerchantRechargeProject) DelMerchantRecharge() error {
 
-	if err := orm.ShMysql.Table(m.TableName()).Model(&m).Where("id = ? ", m.ID).Updates(
+	if err := orm.ShMysql.Table(m.TableName()).Model(&m).Where("id = ? and merchant_open_id = ?", m.ID, m.MerchantOpenID).Updates(
 		map[string]interface{}{
 			"deleted_at": time.Now()}).Error; err != nil {
 		return err