k.zhang hace 11 meses
padre
commit
60773ba223

+ 5 - 1
apis/shanghu/base.go

@@ -63,6 +63,10 @@ func InitShangHuRouter(engine *gin.RouterGroup) {
 		recharge.POST("/client/account/list", GetMerchantRechargeClientAccountList) //客户端展示金额
 		recharge.POST("/client/ticket/list", GetMerchantRechargeList)               //客户端展示优惠券
 		recharge.POST("/client/recharge/list", GetMerchantClientTicketAccountLog)   //获取充值记录
-		recharge.POST("/verification/code", GetRechargeVerificationCode)            //获取code                                                         //核销码
+		recharge.POST("/verification/code", GetRechargeVerificationCode)            //获取code
+		recharge.POST("/merchant/cancel/info", GetChargeMerchantCancelInfo)         // 核销详情
+		recharge.POST("/merchant/cancel", RechargeCancel)                           // 核销
+		recharge.POST("/merchant/cancel/log", GetMerchantRechargeLog)               // 商家核销记录
+		recharge.POST("/client/cancel/log", GetClientRechargeLog)                   // c端核销记录
 	}
 }

+ 10 - 6
apis/shanghu/client.trans.go

@@ -121,6 +121,7 @@ func GetVerificationCode(c *gin.Context) {
 // 充值核销码
 func GetRechargeVerificationCode(c *gin.Context) {
 	var inData models.RechargeVerificationCodeRequest
+	var outData models.RechargeVerificationCodeReply
 
 	err := c.ShouldBindJSON(&inData)
 	if err != nil {
@@ -132,16 +133,19 @@ func GetRechargeVerificationCode(c *gin.Context) {
 		return
 	}
 
-	str, err := json.Marshal(&inData)
+	key := tools.MD5(inData.MerchantOpenId + "zhangkun429@")
+
+	key = "CHARGE" + key
+	outData.Key = key
+	outData.ClientOpenId = inData.ClientOpenId
+	outData.MerchantOpenId = inData.MerchantOpenId
+
+	str, err := json.Marshal(&outData)
 	if err != nil {
 		app.Error(c, 500, err, err.Error())
 		return
 	}
-
-	key := tools.MD5(string(str))
-
-	key = "AKN" + key
-	qr, err := qrcode.Encode(key, qrcode.High, 200)
+	qr, err := qrcode.Encode(string(str), qrcode.High, 200)
 	if err != nil {
 		app.Error(c, 500, err, err.Error())
 		return

+ 99 - 0
apis/shanghu/merchant.card.go

@@ -222,6 +222,83 @@ func GetMerchantCancelInfo(c *gin.Context) {
 	app.OK(c, outData, app.Success)
 }
 
+// 核销详情
+func GetChargeMerchantCancelInfo(c *gin.Context) {
+	var inData models.GetMerchantCancelInfoRequest
+	var outData models.GetChargeMerchantCancelInfoReply
+	var qrMessage models.RechargeVerificationCodeReply
+	var clientAccount shanghu.MerchantRechargeClientAccount
+	var clientTicket shanghu.MerchantClientTicket
+	var merchant shanghu.Merchant
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	err = json.Unmarshal([]byte(inData.QRMessage), &qrMessage)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	key := tools.MD5(qrMessage.MerchantOpenId + "zhangkun429@")
+
+	key = "CHARGE" + key
+
+	if key != qrMessage.Key {
+		app.Error(c, 400, errors.New("报文错误"), "报文错误")
+		return
+	}
+
+	clientAccount.MerchantOpenID = qrMessage.MerchantOpenId
+	clientAccount.ClientOpenID = qrMessage.ClientOpenId
+	clientInfo, err := clientAccount.MerchantRechargeClientAccount()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	clientTicket.ClientOpenID = qrMessage.ClientOpenId
+	clientTicket.MerchantOpenID = qrMessage.MerchantOpenId
+
+	//获取券
+	clientTicketInfo, err := clientTicket.GetMerchantRechargeTicket()
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+
+	merchant.OpenId = qrMessage.MerchantOpenId
+	merchantInfo, err := merchant.GetMerchant()
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+	outData.MerchantName = merchantInfo.MerchantName
+	outData.Amount = clientInfo.Amount.String()
+	outData.AccountId = clientInfo.ID
+	for _, v := range clientTicketInfo {
+		var chargeProject models.ChargeMerchantCancelInfo
+		var project shanghu.MerchantRechargeProject
+
+		project.ID = v.RechargeProjectID
+		projectInfo, err := project.GetMerchantRechargeProjectById()
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+
+		chargeProject.ProjectQuantity = projectInfo.ProjectQuantity
+		chargeProject.TicketId = v.ID
+		chargeProject.RechargeProjectQuantity = v.RechargeProjectQuantity
+		chargeProject.RechargeProjectName = v.RechargeProjectName
+		outData.ChargeMerchantCancelInfo = append(outData.ChargeMerchantCancelInfo, chargeProject)
+	}
+
+	app.OK(c, outData, app.Success)
+}
 func GetMerchantCanvasCard(c *gin.Context) {
 	var inData models.GetMerchantCardRequest
 	var outData models.GetMerchantCanvasCardReply
@@ -794,3 +871,25 @@ func CancelNumberV2(c *gin.Context) {
 	app.OK(c, nil, "核销成功")
 
 }
+
+// 充值核销
+func RechargeCancel(c *gin.Context) {
+	var inData models.RechargeCancelRequest
+
+	ticker := shanghu.MerchantClientTicket{}
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	err = ticker.CancelAccountTicket(inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	app.OK(c, nil, "核销成功")
+
+}

+ 224 - 0
apis/shanghu/merchant.recharge.client.account.log.go

@@ -0,0 +1,224 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"github.com/gin-gonic/gin"
+	"strconv"
+	"time"
+)
+
+func GetClientRechargeLog(c *gin.Context) {
+	var inData models.MerchantRechargeClientAccountLogRequest
+	var sqlData shanghu.MerchantRechargeClientAccountLog
+	var outDataList []models.MerchantRechargeClientAccountLogReply
+	var countData int
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	var pageSize = 10
+	var pageIndex = 1
+
+	if inData.PageSize != 0 {
+		pageSize = inData.PageSize
+	}
+	if inData.PageIndex != 0 {
+		pageIndex = inData.PageIndex
+	}
+
+	if inData.Type == 1 { //充值核销
+		sqlData.ClientOpenID = inData.ClientOpenId
+
+		cashOutList, count, err := sqlData.MerchantRechargeClientAccountLogListByClient(pageSize, pageIndex)
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+		countData = count
+
+		for _, v := range cashOutList {
+			var merchant shanghu.Merchant
+			var user shanghu.MerchantUser
+			var outData models.MerchantRechargeClientAccountLogReply
+			merchant.OpenId = v.MerchantOpenID
+			merchantData, err := merchant.GetMerchant()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+
+			user.OpenID = v.Operator
+			operator, err := user.GetUserInfo()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+			outData.MerchantOpenName = merchantData.MerchantName
+			outData.CancelAmount = v.Amount.String()
+			outData.CancelAmountAfter = v.AmountAfter.String()
+			outData.CancelAmountPre = v.AmountPre.String()
+			outData.Operator = operator.Code
+			outData.CancelTime = v.CreatedAt.Format(time.DateTime)
+			outDataList = append(outDataList, outData)
+
+		}
+
+	} else if inData.Type == 2 { //卡券核销
+
+		var recharge shanghu.RechargeCancelLog
+
+		recharge.ClientOpenID = inData.ClientOpenId
+
+		cashOutList, count, err := recharge.RechargeCancelLogByClientList(pageSize, pageIndex)
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+
+		countData = count
+
+		for _, v := range cashOutList {
+			var merchant shanghu.Merchant
+			var user shanghu.MerchantUser
+			var outData models.MerchantRechargeClientAccountLogReply
+			merchant.OpenId = v.MerchantOpenID
+			merchantData, err := merchant.GetMerchant()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+
+			user.OpenID = v.Operator
+			operator, err := user.GetUserInfo()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+			outData.MerchantOpenName = merchantData.MerchantName
+			outData.CancelAmount = strconv.FormatInt(int64(v.Quantity), 10)
+			outData.CancelAmountAfter = strconv.FormatInt(int64(v.QuantityAfter), 10)
+			outData.CancelAmountPre = strconv.FormatInt(int64(v.QuantityPre), 10)
+			outData.Operator = operator.Code
+			outData.CancelTime = v.CreatedAt.Format(time.DateTime)
+			outDataList = append(outDataList, outData)
+
+		}
+
+	}
+
+	app.PageOK(c, outDataList, countData, pageIndex, pageSize, app.Success)
+
+}
+
+func GetMerchantRechargeLog(c *gin.Context) {
+	var inData models.MerchantRechargeAccountLogRequest
+	var sqlData shanghu.MerchantRechargeClientAccountLog
+	var outDataList []models.MerchantRechargeAccountLogReply
+	var countData int
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	var pageSize = 10
+	var pageIndex = 1
+
+	if inData.PageSize != 0 {
+		pageSize = inData.PageSize
+	}
+	if inData.PageIndex != 0 {
+		pageIndex = inData.PageIndex
+	}
+
+	if inData.Type == 1 { //充值核销
+		sqlData.MerchantOpenID = inData.MerchantOpenId
+
+		cashOutList, count, err := sqlData.MerchantRechargeAccountLogList(pageSize, pageIndex)
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+		countData = count
+
+		for _, v := range cashOutList {
+			var client shanghu.MerchantClientUser
+			var user shanghu.MerchantUser
+			//var merchant shanghu.Merchant
+			var outData models.MerchantRechargeAccountLogReply
+			client.ClientOpenID = v.ClientOpenID
+			clientInfo, err := client.GetUserInfo()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+
+			user.OpenID = v.Operator
+			operator, err := user.GetUserInfo()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+			outData.ClientCode = clientInfo.Code
+			outData.CancelAmount = v.Amount.String()
+			outData.CancelAmountAfter = v.AmountAfter.String()
+			outData.CancelAmountPre = v.AmountPre.String()
+			outData.Operator = operator.Code
+			outData.CancelTime = v.CreatedAt.Format(time.DateTime)
+			outDataList = append(outDataList, outData)
+
+		}
+
+	} else if inData.Type == 2 { //卡券核销
+
+		var recharge shanghu.RechargeCancelLog
+
+		recharge.MerchantOpenID = inData.MerchantOpenId
+
+		cashOutList, count, err := recharge.RechargeCancelLogByMerchantList(pageSize, pageIndex)
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+
+		countData = count
+
+		for _, v := range cashOutList {
+			var client shanghu.MerchantClientUser
+			var user shanghu.MerchantUser
+			//var merchant shanghu.Merchant
+			var outData models.MerchantRechargeAccountLogReply
+			client.ClientOpenID = v.ClientOpenID
+			clientData, err := client.GetUserInfo()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+
+			user.OpenID = v.Operator
+			operator, err := user.GetUserInfo()
+			if err != nil {
+				app.Error(c, 500, err, err.Error())
+				return
+			}
+			outData.ClientCode = clientData.Code
+			outData.CancelAmount = strconv.FormatInt(int64(v.Quantity), 10)
+			outData.CancelAmountAfter = strconv.FormatInt(int64(v.QuantityAfter), 10)
+			outData.CancelAmountPre = strconv.FormatInt(int64(v.QuantityPre), 10)
+			outData.Operator = operator.Code
+			outData.CancelTime = v.CreatedAt.Format(time.DateTime)
+			outDataList = append(outDataList, outData)
+
+		}
+
+	}
+
+	app.PageOK(c, outDataList, countData, pageIndex, pageSize, app.Success)
+
+}

+ 19 - 0
apis/shanghu/models/card.go

@@ -175,3 +175,22 @@ type CardProjectInfo struct {
 	ProjectUnitPrice string `json:"project_unit_price"` //单价
 	ProjectUnit      string `json:"project_unit"`       //产品单位
 }
+
+type GetChargeMerchantCancelInfoRequest struct {
+	MerchantOpenId string `json:"merchant_open_id"`
+	QRMessage      string `json:"qr_message"` //
+}
+
+type GetChargeMerchantCancelInfoReply struct {
+	AccountId                int64                      `json:"account_id"`
+	Amount                   string                     `json:"amount"`
+	MerchantName             string                     `json:"merchant_name"`
+	ChargeMerchantCancelInfo []ChargeMerchantCancelInfo `json:"charge_merchant_cancel_info"`
+}
+
+type ChargeMerchantCancelInfo struct {
+	TicketId                int64  `json:"ticket_id"`
+	RechargeProjectName     string `json:"recharge_project_name"`
+	RechargeProjectQuantity int    `json:"recharge_project_quantity"`
+	ProjectQuantity         int    `json:"project_quantity"`
+}

+ 6 - 0
apis/shanghu/models/client.trans.go

@@ -42,6 +42,12 @@ type RechargeVerificationCodeRequest struct {
 	MerchantOpenId string `json:"merchant_open_id"`
 }
 
+type RechargeVerificationCodeReply struct {
+	ClientOpenId   string `json:"client_open_id"`
+	MerchantOpenId string `json:"merchant_open_id"`
+	Key            string `json:"key"`
+}
+
 type MerchantTransRequest struct {
 	MerchantOpenId string `json:"open_id"`
 	PageSize       int    `json:"page_size"`

+ 12 - 0
apis/shanghu/models/merchant.go

@@ -61,3 +61,15 @@ type CancelCardV2Request struct {
 	QRMessage      string `json:"qr_message"`
 	Number         int    `json:"number"`
 }
+
+type RechargeCancelRequest struct {
+	AccountId            int64                  `json:"account_id"`
+	CancelAmount         string                 `json:"cancel_amount"`
+	ChargeMerchantCancel []ChargeMerchantCancel `json:"charge_merchant_cancel"`
+	MerchantOpenId       string                 `json:"merchant_open_id"`
+}
+
+type ChargeMerchantCancel struct {
+	TicketId       int64 `json:"ticket_id"`
+	CancelQuantity int   `json:"cancel_quantity"`
+}

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

@@ -0,0 +1,35 @@
+package models
+
+type MerchantRechargeClientAccountLogRequest struct {
+	ClientOpenId string `json:"client_open_id"`
+	Type         int    `json:"type"` //1-账户充值 2-卡券核销
+	PageSize     int    `json:"page_size"`
+	PageIndex    int    `json:"page_index"`
+}
+
+type MerchantRechargeClientAccountLogReply struct {
+	MerchantOpenName  string `json:"merchant_open_name"`  //商家名称
+	CancelAmount      string `json:"cancel_amount"`       //核销数量 核销金额
+	CancelAmountAfter string `json:"cancel_amount_after"` //剩余核销数量 核销金额
+	CancelAmountPre   string `json:"cancel_amount_pre"`   //核销前数量 核销前金额
+	Operator          string `json:"operator"`            //核销人
+	CancelTime        string `json:"cancel_time"`         //核销日期
+
+}
+
+type MerchantRechargeAccountLogRequest struct {
+	MerchantOpenId string `json:"merchant_open_id"`
+	Type           int    `json:"type"` //1-账户充值 2-卡券核销
+	PageSize       int    `json:"page_size"`
+	PageIndex      int    `json:"page_index"`
+}
+
+type MerchantRechargeAccountLogReply struct {
+	ClientCode        string `json:"client_code"`         //客户code
+	CancelAmount      string `json:"cancel_amount"`       //核销数量 核销金额
+	CancelAmountAfter string `json:"cancel_amount_after"` //剩余核销数量 核销金额
+	CancelAmountPre   string `json:"cancel_amount_pre"`   //核销前数量 核销前金额
+	Operator          string `json:"operator"`            //核销人
+	CancelTime        string `json:"cancel_time"`         //核销日期
+
+}

+ 1 - 0
apis/shanghu/recharge.cancel.log.go

@@ -0,0 +1 @@
+package shanghu

+ 155 - 5
models/shanghu/merchant.client.ticket.go

@@ -1,9 +1,11 @@
 package shanghu
 
 import (
+	"duoduo/apis/shanghu/models"
 	orm "duoduo/database"
 	"duoduo/tools"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"github.com/shopspring/decimal"
 	"time"
@@ -17,6 +19,7 @@ type MerchantClientTicket struct {
 	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 操作人
+	Version                 int       `gorm:"column:version;type:int(11)" json:"version"`                        // 锁
 	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"`              // 创建时间
@@ -63,6 +66,8 @@ func (u *MerchantClientTicket) Recharge(recharge MerchantRecharge, clientOpenId
 		return err
 	}
 
+	fmt.Println("account = ", account)
+
 	// 创建充值记录
 	if account.ID == 0 {
 		var clientAccount MerchantRechargeClientAccount
@@ -108,21 +113,30 @@ func (u *MerchantClientTicket) Recharge(recharge MerchantRecharge, clientOpenId
 		if err != nil {
 			return err
 		}
+		fmt.Println("inAmount = ", inAmount)
+		amountPre := account.Amount
+		amountAfter := account.Amount.Add(inAmount)
 
-		if err = tx.Table(account.TableName()).Model(&account).Where("id = ? and version = ? ", account.ID, account.Version).Updates(
+		result := 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),
+				"amount":           amountAfter,
 				"version":          account.Version + 1,
-				"updated_at":       tools.GetCurrntTimeStr()}).Error; err != nil {
+				"updated_at":       tools.GetCurrntTimeStr()})
+		if result.Error != nil {
+			err = result.Error
+			return err
+		}
+		if result.RowsAffected <= 0 {
+			err = errors.New("金额充值失败,请重新再试。")
 			return err
 		}
 
 		//充值记录
 		accountLog.Amount = inAmount
-		accountLog.AmountPre = account.Amount
-		accountLog.AmountAfter = account.Amount.Add(inAmount)
+		accountLog.AmountPre = amountPre
+		accountLog.AmountAfter = amountAfter
 		accountLog.ClientOpenID = clientOpenId
 		accountLog.MerchantOpenID = recharge.MerchantOpenID //充值商户
 		accountLog.TransType = 1                            //充值
@@ -177,3 +191,139 @@ func (m *MerchantClientTicket) MerchantRechargeTicketList(pageSize int, pageInde
 	table.Count(&count)
 	return doc, count, nil
 }
+
+func (m *MerchantClientTicket) GetMerchantRechargeTicket() ([]MerchantClientTicket, error) {
+
+	var doc []MerchantClientTicket
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("client_open_id = ? and merchant_open_id = ? and recharge_project_quantity > 0", m.ClientOpenID, m.MerchantOpenID)
+	if err := table.Select("*").Order("id desc").Find(&doc).Error; err != nil {
+		return nil, err
+	}
+	return doc, nil
+}
+
+func (m *MerchantClientTicket) CancelAccountTicket(data models.RechargeCancelRequest) error {
+	var err error
+	var rechargeAccount MerchantRechargeClientAccount
+	var ticket MerchantClientTicket
+	var accountLog MerchantRechargeClientAccountLog
+	tx := orm.ShMysql.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	//扣除金额
+	err = tx.Table("merchant_recharge_client_account").Select("*").Where("id = ?", data.AccountId).First(&rechargeAccount).Error
+	if err != nil {
+		return err
+	}
+	if data.CancelAmount != "" { //扣减账号金额
+		cancelAmount, err := decimal.NewFromString(data.CancelAmount)
+		if err != nil {
+			return err
+		}
+
+		if rechargeAccount.Amount.Cmp(cancelAmount) < 0 {
+			err = errors.New("金额不足")
+			return err
+		}
+
+		amount := cancelAmount                                  //交易金额
+		amountPre := rechargeAccount.Amount                     //交易前
+		amountAfter := rechargeAccount.Amount.Sub(cancelAmount) //交易后
+
+		result := tx.Table("merchant_recharge_client_account").Model(&rechargeAccount).Where("id = ? and version = ? ", rechargeAccount.ID, rechargeAccount.Version).Updates(
+			map[string]interface{}{
+				"amount":     amountAfter,
+				"version":    rechargeAccount.Version + 1,
+				"updated_at": tools.GetCurrntTimeStr()})
+
+		if result.Error != nil {
+			err = result.Error
+			return err
+		}
+		if result.RowsAffected <= 0 {
+			err = errors.New("核销失败,请重新再试。")
+			return err
+		}
+
+		//充值记录
+		accountLog.Amount = amount
+		accountLog.AmountPre = amountPre
+		accountLog.AmountAfter = amountAfter
+		accountLog.ClientOpenID = rechargeAccount.ClientOpenID
+		accountLog.MerchantOpenID = rechargeAccount.MerchantOpenID //充值商户
+		accountLog.TransType = 2                                   //消费
+		accountLog.Operator = data.MerchantOpenId                  //充值人员
+		accountLog.CreatedAt = time.Now()
+		accountLog.UpdatedAt = time.Now()
+
+		err = tx.Table(accountLog.TableName()).Create(&accountLog).Error
+		if err != nil {
+			return err
+		}
+
+	}
+
+	//扣卡券
+	for _, v := range data.ChargeMerchantCancel {
+		if v.CancelQuantity == 0 {
+			continue
+		}
+		//扣券
+		ticketInfo := MerchantClientTicket{}
+		err = tx.Table(ticket.TableName()).Select("*").Where("id = ?", v.TicketId).First(&ticketInfo).Error
+		if err != nil {
+			return err
+		}
+
+		if ticketInfo.RechargeProjectQuantity < v.CancelQuantity {
+			err = errors.New("卡券数量不够")
+			return err
+		}
+
+		result := tx.Table("merchant_client_ticket").Model(&ticketInfo).Where("id = ? and version = ? ", ticketInfo.ID, ticketInfo.Version).Updates(
+			map[string]interface{}{
+				"recharge_project_quantity": ticketInfo.RechargeProjectQuantity - v.CancelQuantity,
+				"version":                   rechargeAccount.Version + 1,
+				"updated_at":                tools.GetCurrntTimeStr()})
+
+		if result.Error != nil {
+			err = result.Error
+			return err
+		}
+
+		if result.RowsAffected <= 0 {
+			err = errors.New("核销失败,请重新再试。")
+			return err
+		}
+
+		//扣券日志
+		rechargeCancelLog := RechargeCancelLog{
+			ClientOpenID:   ticketInfo.ClientOpenID,
+			MerchantOpenID: ticketInfo.MerchantOpenID,
+			QuantityPre:    ticketInfo.RechargeProjectQuantity,
+			QuantityAfter:  ticketInfo.RechargeProjectQuantity - v.CancelQuantity,
+			Quantity:       v.CancelQuantity,
+			Operator:       data.MerchantOpenId,
+			RechargeID:     v.TicketId,
+			CreatedAt:      time.Now(),
+			UpdatedAt:      time.Now(),
+		}
+
+		err = tx.Table(rechargeCancelLog.TableName()).Create(&rechargeCancelLog).Error
+		if err != nil {
+			return err
+		}
+
+	}
+
+	return nil
+}

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

@@ -37,3 +37,27 @@ func (m *MerchantRechargeClientAccount) MerchantRechargeClientAccountList(pageSi
 	table.Count(&count)
 	return doc, count, nil
 }
+
+func (m *MerchantRechargeClientAccount) MerchantRechargeClientAccount() (MerchantRechargeClientAccount, error) {
+	var doc MerchantRechargeClientAccount
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("client_open_id = ? and merchant_open_id = ?", m.ClientOpenID, m.MerchantOpenID)
+	if err := table.Select("*").Order("id desc").First(&doc).Error; err != nil {
+		return doc, err
+	}
+	return doc, nil
+}
+
+func (m *MerchantRechargeClientAccount) GetMerchantRechargeClientAccount() (MerchantRechargeClientAccount, error) {
+	var doc MerchantRechargeClientAccount
+
+	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
+}

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

@@ -54,3 +54,44 @@ func (m *MerchantRechargeClientAccountLog) MerchantRechargeClientAccountLogList(
 	table.Count(&count)
 	return doc, count, nil
 }
+
+func (m *MerchantRechargeClientAccountLog) GetMerchantRechargeClientAccountLog() ([]MerchantRechargeClientAccountLog, error) {
+	var doc []MerchantRechargeClientAccountLog
+
+	table := orm.ShMysql.Table(m.TableName())
+	table = table.Where("merchant_open_id = ? and client_open_id = ? and type = 1 ", m.MerchantOpenID, m.ClientOpenID)
+	if err := table.Select("merchant_open_id,client_open_id,type,trans_type").Group("merchant_open_id,client_open_id,type,trans_type").Order("id desc").Find(&doc).Error; err != nil {
+		return nil, err
+	}
+	return doc, nil
+}
+
+// list 接口使用
+func (m *MerchantRechargeClientAccountLog) MerchantRechargeClientAccountLogListByClient(pageSize int, pageIndex int) ([]MerchantRechargeClientAccountLog, int, error) {
+	var doc []MerchantRechargeClientAccountLog
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("client_open_id = ? ", m.ClientOpenID)
+	var count int
+	if err := table.Select("*").Order("id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
+		return nil, 0, err
+	}
+	table.Count(&count)
+	return doc, count, nil
+}
+
+// list 接口使用
+func (m *MerchantRechargeClientAccountLog) MerchantRechargeAccountLogList(pageSize int, pageIndex int) ([]MerchantRechargeClientAccountLog, int, error) {
+	var doc []MerchantRechargeClientAccountLog
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("merchant_open_id = ? ", m.MerchantOpenID)
+	var count int
+	if err := table.Select("*").Order("id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
+		return nil, 0, err
+	}
+	table.Count(&count)
+	return doc, count, nil
+}

+ 14 - 7
models/shanghu/pay.go

@@ -269,7 +269,8 @@ func (m *ClientPayTrans) SettleAdd(merchantAmount, clientAmount decimal.Decimal,
 				"version":    clientAccount.Version + 1,
 				"updated_at": time.Now()})
 		if result.Error != nil {
-			return result.Error
+			err = result.Error
+			return err
 		}
 
 		if result.RowsAffected <= 0 {
@@ -303,7 +304,8 @@ func (m *ClientPayTrans) SettleAdd(merchantAmount, clientAmount decimal.Decimal,
 			"updated_at": time.Now()})
 
 	if result.Error != nil {
-		return result.Error
+		err = result.Error
+		return err
 	}
 	if result.RowsAffected <= 0 {
 		err = errors.New("rows is zero")
@@ -370,7 +372,8 @@ func (m *ClientPayTrans) SettleAddCashOutFee(amount decimal.Decimal, clientOpenI
 			"version":    clientAccount.Version + 1,
 			"updated_at": time.Now()})
 	if result.Error != nil {
-		return result.Error
+		err = result.Error
+		return err
 	}
 
 	if result.RowsAffected <= 0 {
@@ -433,7 +436,8 @@ func (m *ClientPayTrans) SettleSubClient(clientAmount decimal.Decimal, clientOpe
 			"version":    clientAccount.Version + 1,
 			"updated_at": time.Now()})
 	if result.Error != nil {
-		return result.Error
+		err = result.Error
+		return err
 	}
 
 	if result.RowsAffected <= 0 {
@@ -464,7 +468,8 @@ func (m *ClientPayTrans) SettleSubClient(clientAmount decimal.Decimal, clientOpe
 			"account_status": 99, //分账成功
 			"updated_at":     time.Now()})
 	if result.Error != nil {
-		return result.Error
+		err = result.Error
+		return err
 	}
 
 	if result.RowsAffected <= 0 {
@@ -510,7 +515,8 @@ func (m *ClientPayTrans) SettleSubMerchant(merchantAmount decimal.Decimal, merch
 			"version":    merchantAccount.Version + 1,
 			"updated_at": time.Now()})
 	if result.Error != nil {
-		return result.Error
+		err = result.Error
+		return err
 	}
 
 	if result.RowsAffected <= 0 {
@@ -541,7 +547,8 @@ func (m *ClientPayTrans) SettleSubMerchant(merchantAmount decimal.Decimal, merch
 			"account_status": 99, //分账成功
 			"updated_at":     time.Now()})
 	if result.Error != nil {
-		return result.Error
+		err = result.Error
+		return err
 	}
 
 	if result.RowsAffected <= 0 {

+ 56 - 0
models/shanghu/recharge_cancel_log.go

@@ -0,0 +1,56 @@
+package shanghu
+
+import (
+	orm "duoduo/database"
+	"time"
+)
+
+type RechargeCancelLog 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"`
+	QuantityPre    int       `gorm:"column:quantity_pre;type:int(11)" json:"quantity_pre"`     // 核销前数量
+	QuantityAfter  int       `gorm:"column:quantity_after;type:int(11)" json:"quantity_after"` // 核销后数量
+	Quantity       int       `gorm:"column:quantity;type:int(11)" json:"quantity"`             // 数量
+	Operator       string    `gorm:"column:operator;type:varchar(255)" json:"operator"`        // operator 操作人
+	RechargeID     int64     `gorm:"column:recharge_id;type:bigint(20)" json:"recharge_id"`
+	UpdateBy       int64     `gorm:"column:update_by;type:bigint(20)" json:"update_by"`
+	CreateBy       int64     `gorm:"column:create_by;type:bigint(20)" json:"create_by"`
+	CreatedAt      time.Time `gorm:"column:created_at;type:datetime" json:"created_at"`
+	UpdatedAt      time.Time `gorm:"column:updated_at;type:datetime" json:"updated_at"`
+	DeletedAt      time.Time `gorm:"column:deleted_at;type:datetime;default:null" json:"deleted_at"`
+}
+
+func (m *RechargeCancelLog) TableName() string {
+	return "recharge_cancel_log"
+}
+
+// list 接口使用
+func (m *RechargeCancelLog) RechargeCancelLogByClientList(pageSize int, pageIndex int) ([]RechargeCancelLog, int, error) {
+	var doc []RechargeCancelLog
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("client_open_id = ? ", m.ClientOpenID)
+	var count int
+	if err := table.Select("*").Order("id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
+		return nil, 0, err
+	}
+	table.Count(&count)
+	return doc, count, nil
+}
+
+// list 接口使用
+func (m *RechargeCancelLog) RechargeCancelLogByMerchantList(pageSize int, pageIndex int) ([]RechargeCancelLog, int, error) {
+	var doc []RechargeCancelLog
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("merchant_open_id = ? ", m.MerchantOpenID)
+	var count int
+	if err := table.Select("*").Order("id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
+		return nil, 0, err
+	}
+	table.Count(&count)
+	return doc, count, nil
+}