Browse Source

Merge branch 'yun-test' of k.zhang/duoduo into yun-master

k.zhang 11 months ago
parent
commit
64afb9b08d

+ 19 - 0
apis/shanghu/base.go

@@ -50,4 +50,23 @@ func InitShangHuRouter(engine *gin.RouterGroup) {
 		v2.POST("/merchant/cancel/info", GetMerchantCancelInfo) //核销详情
 		v2.POST("/merchant/cancel", CancelNumberV2)
 	}
+
+	recharge := engine.Group("v1/recharge")
+	{
+		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给用户充值
+		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("/merchant/cancel/info", GetChargeMerchantCancelInfo)         // 核销详情
+		recharge.POST("/merchant/cancel", RechargeCancel)                           // 核销
+		recharge.POST("/merchant/cancel/log", GetMerchantRechargeLog)               // 商家核销记录
+		recharge.POST("/client/cancel/log", GetClientRechargeLog)                   // c端核销记录
+	}
 }

+ 37 - 0
apis/shanghu/client.trans.go

@@ -118,6 +118,43 @@ func GetVerificationCode(c *gin.Context) {
 	app.OK(c, encodedData, app.Success)
 }
 
+// 充值核销码
+func GetRechargeVerificationCode(c *gin.Context) {
+	var inData models.RechargeVerificationCodeRequest
+	var outData models.RechargeVerificationCodeReply
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+	if inData.MerchantOpenId == "" || inData.ClientOpenId == "" {
+		app.Error(c, 400, errors.New("参数错误"), "参数错误")
+		return
+	}
+
+	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
+	}
+	qr, err := qrcode.Encode(string(str), qrcode.High, 200)
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+	encodedData := base64.StdEncoding.EncodeToString(qr)
+
+	app.OK(c, encodedData, app.Success)
+}
+
 func GetMerchantPayTransList(c *gin.Context) {
 	var inData models.MerchantTransRequest
 	var sqlMerchant shanghu.MerchantCard

+ 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
@@ -799,3 +876,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, "核销成功")
+
+}

+ 68 - 0
apis/shanghu/merchant.client.ticket.account.log.go

@@ -0,0 +1,68 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+func GetMerchantClientTicketAccountLog(c *gin.Context) {
+	var inData models.GetMerchantRechargeClientAccountLogListRequest
+	var sqlData shanghu.MerchantRechargeClientAccountLog
+	var outDataList []models.GetMerchantRechargeClientAccountLogListReply
+
+	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
+	}
+
+	sqlData.MerchantOpenID = inData.MerchantOpenId
+	cashOutList, count, err := sqlData.MerchantRechargeClientAccountLogList(pageSize, pageIndex)
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+
+	for _, v := range cashOutList {
+		var out models.GetMerchantRechargeClientAccountLogListReply
+		var merchantClientUser shanghu.MerchantClientUser
+		merchantClientUser.ClientOpenID = v.ClientOpenID
+
+		userInfo, err := merchantClientUser.GetUserInfo()
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+
+		var merchantRecharge shanghu.MerchantRecharge
+		merchantRecharge.ID = v.PayTransID
+
+		merchantRechargeInfo, err := merchantRecharge.GetMerchantRecharge()
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+
+		out.Amount = v.Amount.String()
+		out.ClientUserId = userInfo.Code
+		out.RechargeName = merchantRechargeInfo.MerchantRechargeName
+		out.RechargeTime = v.CreatedAt.Format(time.DateTime)
+		outDataList = append(outDataList, out)
+
+	}
+	app.PageOK(c, outDataList, count, pageIndex, pageSize, app.Success)
+
+}

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

@@ -0,0 +1,106 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"errors"
+	"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 {
+		if err.Error() == "record not found" {
+			app.Error(c, 400, errors.New("请确认用户ID是否正确"), "请确认用户ID是否正确")
+			return
+		}
+
+		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)
+
+}
+
+func GetMerchantRechargeList(c *gin.Context) {
+	var inData models.MerchantRechargeTicketListRequest
+	var sqlData shanghu.MerchantClientTicket
+	var outDataList []models.MerchantRechargeTicketListReply
+
+	//var merchantClientTicket shanghu.MerchantClientTicket
+
+	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
+	}
+
+	sqlData.ClientOpenID = inData.ClientOpenId
+	sqlData.MerchantOpenID = inData.MerchantOpenId
+	cashOutList, count, err := sqlData.MerchantRechargeTicketList(pageSize, pageIndex)
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+
+	for _, v := range cashOutList {
+		var merchant shanghu.Merchant
+		var outData models.MerchantRechargeTicketListReply
+		merchant.OpenId = v.MerchantOpenID
+		merchantData, err := merchant.GetMerchant()
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+		outData.MerchantOpenName = merchantData.MerchantName
+		outData.MerchantOpenID = v.MerchantOpenID
+		outData.ClientOpenID = v.ClientOpenID
+		outData.RechargeProjectQuantity = v.RechargeProjectQuantity
+		outData.RechargeProjectName = v.RechargeProjectName
+		outData.TicketId = v.ID
+		outDataList = append(outDataList, outData)
+	}
+
+	app.PageOK(c, outDataList, count, pageIndex, pageSize, app.Success)
+
+}

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

@@ -0,0 +1,59 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"github.com/gin-gonic/gin"
+)
+
+func GetMerchantRechargeClientAccountList(c *gin.Context) {
+	var inData models.MerchantRechargeClientAccountListRequest
+	var sqlData shanghu.MerchantRechargeClientAccount
+	var outDataList []models.MerchantRechargeClientAccountListReply
+
+	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
+	}
+
+	sqlData.ClientOpenID = inData.ClientOpenId
+
+	cashOutList, count, err := sqlData.MerchantRechargeClientAccountList(pageSize, pageIndex)
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+
+	for _, v := range cashOutList {
+		var merchant shanghu.Merchant
+		var outData models.MerchantRechargeClientAccountListReply
+		merchant.OpenId = v.MerchantOpenID
+		merchantData, err := merchant.GetMerchant()
+		if err != nil {
+			app.Error(c, 500, err, err.Error())
+			return
+		}
+		outData.MerchantOpenName = merchantData.MerchantName
+		outData.MerchantOpenID = v.MerchantOpenID
+		outData.Amount = v.Amount.String()
+		outData.ClientOpenID = v.ClientOpenID
+		outData.AccountId = v.ID
+		outDataList = append(outDataList, outData)
+
+	}
+
+	app.PageOK(c, outDataList, count, pageIndex, pageSize, app.Success)
+
+}

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

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

@@ -0,0 +1,118 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"encoding/json"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+// 配置充值
+func CreateMerchantRechargeConfig(c *gin.Context) {
+	var inData models.CreateMerchantRechargeRequest
+	var project []int64
+	var merchantProjectList []shanghu.MerchantRechargeProject
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	var merchantRecharge shanghu.MerchantRecharge
+	merchantRecharge.MerchantRechargeName = inData.MerchantRechargeName
+	merchantRecharge.CardProjectData = inData.CardProjectData
+	merchantRecharge.MerchantOpenID = inData.MerchantOpenID
+	merchantRecharge.Amount = inData.Amount
+	merchantRecharge.CreatedAt = time.Now()
+	merchantRecharge.UpdatedAt = time.Now()
+
+	err = json.Unmarshal([]byte(inData.CardProjectData), &project)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	for _, v := range project {
+		var sql shanghu.MerchantRechargeProject
+		sql.ID = v
+		merchantProject, err := sql.GetMerchantRechargeProjectById()
+		if err != nil {
+			app.Error(c, 400, err, err.Error())
+			return
+		}
+		merchantProjectList = append(merchantProjectList, merchantProject)
+
+	}
+	list, err := json.Marshal(merchantProjectList)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+	merchantRecharge.CardProjectData = string(list)
+
+	_, err = merchantRecharge.Create()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	app.OK(c, nil, app.Success)
+
+}
+
+// 删除充值
+func DelMerchantRechargeConfig(c *gin.Context) {
+	var inData models.DelMerchantRechargeRequest
+	var sql shanghu.MerchantRecharge
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	sql.ID = inData.Id
+	sql.MerchantOpenID = inData.MerchantOpenID
+	err = sql.DelMerchantRecharge()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	app.OK(c, nil, app.Success)
+
+}
+
+// 充值列表
+func MerchantRechargeConfigList(c *gin.Context) {
+	var inData models.MerchantRechargeListRequest
+	var sqlData shanghu.MerchantRecharge
+
+	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
+	}
+
+	sqlData.MerchantOpenID = inData.OpenId
+
+	cashOutList, count, err := sqlData.MerchantRechargeList(pageSize, pageIndex)
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+
+	app.PageOK(c, cashOutList, count, pageIndex, pageSize, app.Success)
+}

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

@@ -0,0 +1,88 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	"duoduo/models/shanghu"
+	"duoduo/tools/app"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+func CreateMerchantRechargeProject(c *gin.Context) {
+	var inData models.CreateMerchantRechargeProjectRequest
+	var sqlData shanghu.MerchantRechargeProject
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	sqlData.CreatedAt = time.Now()
+	sqlData.UpdatedAt = time.Now()
+	sqlData.MerchantOpenID = inData.MerchantOpenID
+	sqlData.ProjectName = inData.ProjectName
+	sqlData.ProjectQuantity = inData.ProjectQuantity
+
+	_, err = sqlData.Create()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	app.OK(c, nil, app.Success)
+
+}
+
+func DelMerchantRechargeProject(c *gin.Context) {
+	var inData models.DelMerchantRechargeProjectRequest
+	var sqlData shanghu.MerchantRechargeProject
+
+	err := c.ShouldBindJSON(&inData)
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	sqlData.ID = inData.Id
+	sqlData.MerchantOpenID = inData.MerchantOpenId
+
+	err = sqlData.DelMerchantRecharge()
+	if err != nil {
+		app.Error(c, 400, err, err.Error())
+		return
+	}
+
+	app.OK(c, nil, app.Success)
+
+}
+
+func MerchantRechargeProjectList(c *gin.Context) {
+	var inData models.MerchantRechargeProjectListRequest
+	var sqlData shanghu.MerchantRechargeProject
+
+	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
+	}
+	sqlData.MerchantOpenID = inData.OpenId
+
+	merchant, count, err := sqlData.GetMerchantRechargeProjectListByOpenId(pageSize, pageIndex)
+	if err != nil {
+		app.Error(c, 500, err, err.Error())
+		return
+	}
+	app.PageOK(c, merchant, count, 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"`
+}

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

@@ -37,6 +37,17 @@ type VerificationCodeReply struct {
 	QR string `json:"qr"`
 }
 
+type RechargeVerificationCodeRequest struct {
+	ClientOpenId   string `json:"client_open_id"`
+	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"`

+ 14 - 0
apis/shanghu/models/merchant.client.ticket.account.log.go

@@ -0,0 +1,14 @@
+package models
+
+type GetMerchantRechargeClientAccountLogListRequest struct {
+	MerchantOpenId string `json:"merchant_open_id"`
+	PageSize       int    `json:"page_size"`
+	PageIndex      int    `json:"page_index"`
+}
+
+type GetMerchantRechargeClientAccountLogListReply struct {
+	ClientUserId string `json:"client_user_id"`
+	Amount       string `json:"amount"`
+	RechargeName string `json:"recharge_name"`
+	RechargeTime string `json:"recharge_time"`
+}

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

@@ -0,0 +1,23 @@
+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
+}
+
+type MerchantRechargeTicketListRequest struct {
+	ClientOpenId   string `json:"client_open_id"`
+	MerchantOpenId string `json:"merchant_open_id"`
+	PageSize       int    `json:"page_size"`
+	PageIndex      int    `json:"page_index"`
+}
+
+type MerchantRechargeTicketListReply struct {
+	RechargeProjectQuantity int    `json:"recharge_project_quantity"` // 项目数量
+	RechargeProjectName     string `json:"recharge_project_name"`     // 项目名
+	MerchantOpenID          string `json:"merchant_open_id"`          //
+	ClientOpenID            string `json:"client_open_id"`            //
+	MerchantOpenName        string `json:"merchant_open_name"`        //商户名称
+	TicketId                int64  `json:"ticket_id"`
+}

+ 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"`
+}

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

@@ -0,0 +1,15 @@
+package models
+
+type MerchantRechargeClientAccountListRequest struct {
+	ClientOpenId string `json:"client_open_id"`
+	PageSize     int    `json:"page_size"`
+	PageIndex    int    `json:"page_index"`
+}
+
+type MerchantRechargeClientAccountListReply struct {
+	ClientOpenID     string `json:"client_open_id"`
+	MerchantOpenID   string `json:"merchant_open_id"`
+	Amount           string `json:"amount"`
+	MerchantOpenName string `json:"merchant_open_name"`
+	AccountId        int64  `json:"account_id"`
+}

+ 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"`         //核销日期
+
+}

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

@@ -0,0 +1,28 @@
+package models
+
+type CreateMerchantRechargeRequest struct {
+	//MerchantRecharge []MerchantRecharge `json:"merchant_recharge"`
+	//Id                   int64  `json:"id"`                     //id
+	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 {
+	Id                   int64  `json:"id"`                     //id
+	MerchantRechargeName string `json:"merchant_recharge_name"` // 招商充值名称
+	MerchantOpenID       string `json:"merchant_open_id"`       // Open id
+	CardProjectData      string `json:"card_project_data"`
+}
+
+type DelMerchantRechargeRequest struct {
+	Id             int64  `json:"id"`
+	MerchantOpenID string `json:"merchant_open_id"` // Open id
+}
+
+type MerchantRechargeListRequest struct {
+	OpenId    string `json:"open_id"`
+	PageSize  int    `json:"page_size"`
+	PageIndex int    `json:"page_index"`
+}

+ 18 - 0
apis/shanghu/models/merchant.recharge.project.go

@@ -0,0 +1,18 @@
+package models
+
+type CreateMerchantRechargeProjectRequest struct {
+	ProjectName     string `json:"project_name"`     // 项目名称
+	MerchantOpenID  string `json:"merchant_open_id"` // Open id
+	ProjectQuantity int    `json:"project_quantity"` //产品数量
+}
+
+type DelMerchantRechargeProjectRequest struct {
+	Id             int64  `json:"id"`
+	MerchantOpenId string `json:"merchant_open_id"`
+}
+
+type MerchantRechargeProjectListRequest struct {
+	OpenId    string `json:"open_id"`
+	PageSize  int    `json:"page_size"`
+	PageIndex int    `json:"page_index"`
+}

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

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

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

@@ -0,0 +1,332 @@
+package shanghu
+
+import (
+	"duoduo/apis/shanghu/models"
+	orm "duoduo/database"
+	"duoduo/tools"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"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 操作人
+	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"`              // 创建时间
+	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 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
+	}
+
+	fmt.Println("account = ", account)
+
+	// 创建充值记录
+	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
+		}
+		fmt.Println("inAmount = ", inAmount)
+		amountPre := account.Amount
+		amountAfter := account.Amount.Add(inAmount)
+
+		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":           amountAfter,
+				"version":          account.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 = inAmount
+		accountLog.AmountPre = amountPre
+		accountLog.AmountAfter = amountAfter
+		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
+		}
+
+	}
+	fmt.Println(recharge.CardProjectData)
+	//充卡券
+	err = json.Unmarshal([]byte(recharge.CardProjectData), &project)
+	if err != nil {
+		return err
+	}
+
+	for _, v := range project {
+		var ticket MerchantClientTicket
+
+		ticket.RechargeProjectName = v.ProjectName
+		ticket.RechargeProjectQuantity = v.ProjectQuantity
+		ticket.RechargeProjectID = v.ID
+		ticket.MerchantOpenID = v.MerchantOpenID
+		ticket.ClientOpenID = clientOpenId
+		ticket.Operator = operator
+
+		err = tx.Table(ticket.TableName()).Create(&ticket).Error
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+// list 接口使用
+func (m *MerchantClientTicket) MerchantRechargeTicketList(pageSize int, pageIndex int) ([]MerchantClientTicket, int, error) {
+	var doc []MerchantClientTicket
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("client_open_id = ? and merchant_open_id = ?", m.ClientOpenID, 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
+}
+
+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
+		}
+		version := ticketInfo.Version
+		//quantity := v.CancelQuantity                                           //交易前数量
+		quantityAfter := ticketInfo.RechargeProjectQuantity - v.CancelQuantity //交易后数量
+
+		result := tx.Table("merchant_client_ticket").Model(&ticketInfo).Where("id = ? and version = ? ", ticketInfo.ID, ticketInfo.Version).Updates(
+			map[string]interface{}{
+				"recharge_project_quantity": quantityAfter,
+				"version":                   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:  quantityAfter,
+			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
+}

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

@@ -0,0 +1,63 @@
+package shanghu
+
+import (
+	orm "duoduo/database"
+	"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"
+}
+
+// list 接口使用
+func (m *MerchantRechargeClientAccount) MerchantRechargeClientAccountList(pageSize int, pageIndex int) ([]MerchantRechargeClientAccount, int, error) {
+	var doc []MerchantRechargeClientAccount
+
+	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
+}
+
+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
+}

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

@@ -0,0 +1,97 @@
+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
+}
+
+// list 接口使用
+func (m *MerchantRechargeClientAccountLog) MerchantRechargeClientAccountLogList(pageSize int, pageIndex int) ([]MerchantRechargeClientAccountLog, int, error) {
+	var doc []MerchantRechargeClientAccountLog
+
+	table := orm.ShMysql.Table(m.TableName())
+
+	table = table.Where("merchant_open_id = ?  and trans_type = 1", 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
+}
+
+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
+}

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

@@ -0,0 +1,89 @@
+package shanghu
+
+import (
+	orm "duoduo/database"
+	"time"
+)
+
+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"`                             // 创建者
+	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 *MerchantRecharge) TableName() string {
+	return "merchant_recharge"
+}
+
+func (u *MerchantRecharge) Create() (MerchantRecharge, error) {
+	var doc MerchantRecharge
+	var err error
+
+	doc = *u
+	err = orm.ShMysql.Table(u.TableName()).Create(&doc).Error
+	if err != nil {
+		return doc, err
+	}
+
+	return doc, nil
+}
+
+func (m *MerchantRecharge) UpdateMerchantRecharge() error {
+
+	if err := orm.ShMysql.Table(m.TableName()).Model(&m).Where("id = ? ", m.ID).Updates(
+		map[string]interface{}{
+			"merchant_recharge_name": m.MerchantRechargeName,
+			"merchant_open_id":       m.MerchantOpenID,
+			"card_project_data":      m.CardProjectData,
+			"updated_at":             time.Now()}).Error; err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *MerchantRecharge) DelMerchantRecharge() error {
+
+	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
+	}
+
+	return nil
+}
+
+// list 接口使用
+func (m *MerchantRecharge) MerchantRechargeList(pageSize int, pageIndex int) ([]MerchantRecharge, int, error) {
+	var doc []MerchantRecharge
+
+	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
+}
+
+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
+}

+ 78 - 0
models/shanghu/merchant.recharget.project.go

@@ -0,0 +1,78 @@
+package shanghu
+
+import (
+	orm "duoduo/database"
+	"time"
+)
+
+type MerchantRechargeProject struct {
+	ID              int64     `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"`
+	MerchantOpenID  string    `gorm:"column:merchant_open_id;type:varchar(255);NOT NULL" json:"merchant_open_id"` // open_id
+	ProjectQuantity int       `gorm:"column:project_quantity;type:int(11)" json:"project_quantity"`               // 产品数量
+	ProjectName     string    `gorm:"column:project_name;type:varchar(100)" json:"project_name"`                  // 产品名
+	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 *MerchantRechargeProject) TableName() string {
+	return "merchant_recharge_project"
+}
+
+func (u *MerchantRechargeProject) Create() (MerchantRechargeProject, error) {
+	var doc MerchantRechargeProject
+	var err error
+
+	doc = *u
+	err = orm.ShMysql.Table(u.TableName()).Create(&doc).Error
+	if err != nil {
+		return doc, err
+	}
+
+	return doc, nil
+}
+
+func (m *MerchantRechargeProject) DelMerchantRecharge() error {
+
+	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
+	}
+
+	return nil
+}
+
+func (m *MerchantRechargeProject) GetMerchantRechargeProjectListByOpenId(pageSize int, pageIndex int) ([]MerchantRechargeProject, int, error) {
+	var doc []MerchantRechargeProject
+
+	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
+}
+
+//func (m *MerchantRechargeProject) GetMerchantRechargeProjectByOpenId()  {
+//
+//}
+
+func (m *MerchantRechargeProject) GetMerchantRechargeProjectById() (MerchantRechargeProject, error) {
+	var doc MerchantRechargeProject
+
+	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
+
+}

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