| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796 | package shanghuimport (	"context"	"duoduo/apis/common"	"duoduo/apis/pdd"	"duoduo/apis/shanghu/models"	"duoduo/conf"	"duoduo/models/shanghu"	"duoduo/tools"	"duoduo/tools/app"	"encoding/base64"	"encoding/json"	"errors"	"fmt"	"github.com/gin-gonic/gin"	"github.com/qiniu/go-sdk/v7/auth/qbox"	"github.com/qiniu/go-sdk/v7/storage"	"github.com/shopspring/decimal"	"strconv"	"time")func CreateMerchantCard(c *gin.Context) {	var inData models.CreateMerchantCardRequest	var sqlData shanghu.MerchantCard	err := c.ShouldBindJSON(&inData)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.CreatedAt = time.Now()	sqlData.UpdatedAt = time.Now()	jsStr, err := json.Marshal(inData.CardProjectData)	if err != nil {		app.Error(c, 400, err, "包含项目不能为空")		return	}	sqlData.CardProjectData = string(jsStr)	sqlData.CardPrice = inData.CardPrice	sqlData.CardTotalPrice = inData.CardTotalPrice	sqlData.ActivityEndTime, err = tools.TimeToInt64(inData.ActivityEndTime, "2006-01-02")	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.ActivityStartTime, err = tools.TimeToInt64(inData.ActivityStartTime, "2006-01-02")	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.Inventory, err = strconv.ParseInt(inData.Inventory, 10, 64)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.MerchantCardTime, err = tools.TimeToInt64(inData.MerchantCardTime, "2006-01-02")	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.MerchantOpenID = inData.MerchantOpenID	sqlData.Picture = inData.Picture	sqlData.QuotaNum, err = strconv.ParseInt(inData.QuotaNum, 10, 64)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.RebateRate, err = strconv.ParseInt(inData.RebateRate, 10, 64)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.UseRule = inData.UseRule	sqlData.MerchantCardName = inData.MerchantCardName	sqlData.CancelNumber, err = strconv.Atoi(inData.CancelNumber)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.BackgroundImage = inData.BackgroundImage	_, err = sqlData.Create()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	app.OK(c, nil, app.Success)}func GetMerchantCard(c *gin.Context) {	var inData models.GetMerchantCardRequest	var outData models.GetMerchantCardReply	var sqlData shanghu.MerchantCard	var project []int64	err := c.ShouldBindJSON(&inData)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.ID = inData.MerchantId	merchantCard, err := sqlData.GetMerchantCard()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	merchantCard.CardProjectData = ""	for i := 0; i < len(project); i++ {		var cardProject shanghu.MerchantCardProject		cardProject.ID = project[i]		projectInfo, err := cardProject.GetMerchantCardProject()		if err != nil {			app.Error(c, 500, err, err.Error())			return		}		merchantCard.CardProjectData = merchantCard.CardProjectData + projectInfo.ProjectName + "x1 "	}	outData.CardProjectData = merchantCard.CardProjectData	outData.MerchantCardName = merchantCard.MerchantCardName	outData.MerchantCardTime = time.Unix(merchantCard.MerchantCardTime, 0).Format("2006-01-02")	outData.ActivityEndTime = time.Unix(merchantCard.ActivityEndTime, 0).Format("2006-01-02")	outData.ActivityStartTime = time.Unix(merchantCard.ActivityStartTime, 0).Format("2006-01-02")	outData.Picture = merchantCard.Picture	outData.UseRule = merchantCard.UseRule	outData.QuotaNum = merchantCard.QuotaNum	outData.Inventory = merchantCard.Inventory	outData.RebateRate = merchantCard.RebateRate	outData.CardPrice = merchantCard.CardPrice	outData.X = merchantCard.X	outData.Y = merchantCard.Y	outData.W = merchantCard.W	outData.H = merchantCard.H	outData.BackgroundImage = merchantCard.BackgroundImage	outData.CardTotalPrice = merchantCard.CardTotalPrice	app.OK(c, outData, app.Success)}func GetMerchantCancelInfo(c *gin.Context) {	var inData models.GetMerchantCancelInfoRequest	var outData models.GetMerchantCardInfoReply	var qrMessage models.QRData	var merchantCardData shanghu.MerchantCard	var clientPay shanghu.ClientPayTrans	var project []int64	var cancelNum shanghu.CancelLog	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	}	clientPay.MerchantCardID = qrMessage.MerchantId	clientPay.ClientOpenID = qrMessage.ClientOpenId	clientInfo, err := clientPay.GetPayTransByOpenid()	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	outData.PayTime = clientInfo.PayTime.Format(time.DateTime)	merchantCardData.ID = qrMessage.MerchantId	merchantInfo, err := merchantCardData.GetMerchantCard()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	cancelNum.ClientOpenID = qrMessage.ClientOpenId	cancelNum.MerchantID = qrMessage.MerchantId	outData.MerchantCardName = merchantInfo.MerchantCardName	outData.MerchantCardTime = tools.TimeToStr(merchantInfo.MerchantCardTime)	outData.TotalCancelNumber = merchantInfo.CancelNumber	outData.CancelNumber = merchantInfo.CancelNumber - cancelNum.GetNumber()	err = json.Unmarshal([]byte(merchantInfo.CardProjectData), &project)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	for i := 0; i < len(project); i++ {		var cardProject shanghu.MerchantCardProject		var cardProjectInfo models.CardProjectInfo		cardProject.ID = project[i]		projectInfo, err := cardProject.GetMerchantCardProject()		if err != nil {			app.Error(c, 500, err, err.Error())			return		}		cardProjectInfo.ProjectUnit = projectInfo.ProjectUnit		cardProjectInfo.ProjectName = projectInfo.ProjectName		cardProjectInfo.ProjectUnitPrice = projectInfo.ProjectUnitPrice		outData.CardProjectData = append(outData.CardProjectData, cardProjectInfo)	}	app.OK(c, outData, app.Success)}func GetMerchantCanvasCard(c *gin.Context) {	var inData models.GetMerchantCardRequest	var outData models.GetMerchantCanvasCardReply	var sqlData shanghu.MerchantCard	var project []int64	var qr models.QRRequest	var getQR models.GetQRRequest	confIni, err := conf.ConnIni()	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	err = c.ShouldBindJSON(&inData)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.ID = inData.MerchantId	merchantCard, err := sqlData.GetMerchantCard()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	outData.Static.Background = "/images/背景.jpg"	var swiperList []models.SwiperList	var rightButton models.RightButton	var swiper models.SwiperList	swiper.ID = 0	swiper.URL = merchantCard.Picture	swiperList = append(swiperList, swiper)	//err = json.Unmarshal([]byte(merchantCard.Picture), &swiperList)	//if err != nil {	//	fmt.Println("picture")	//	app.Error(c, 500, err, err.Error())	//	return	//}	outData.Inventory = merchantCard.Inventory	outData.SwiperList = swiperList	rightButton.ImageURL = "/images/资源 24.png"	outData.RightButton = append(outData.RightButton, rightButton)	rightButton.ImageURL = "/images/资源 25.png"	outData.RightButton = append(outData.RightButton, rightButton)	rightButton.ImageURL = "/images/资源 26.png"	outData.RightButton = append(outData.RightButton, rightButton)	rightButton.ImageURL = "/images/资源 28.png"	outData.RightButton = append(outData.RightButton, rightButton)	var dataList models.DataList	err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)	if err != nil {		fmt.Println("picture2")		app.Error(c, 500, err, err.Error())		return	}	//merchantCard.CardProjectData = ""	for i := 0; i < len(project); i++ {		var cardProject shanghu.MerchantCardProject		cardProject.ID = project[i]		projectInfo, err := cardProject.GetMerchantCardProject()		if err != nil {			app.Error(c, 500, err, err.Error())			return		}		dataList.Name = projectInfo.ProjectName		dataList.Count = 1		dataList.Price = projectInfo.ProjectUnitPrice		dataList.Unit = projectInfo.ProjectUnit		outData.DataList = append(outData.DataList, dataList)	}	var buy models.BuyKnowList	buy.Icon = "/images/资源 46.png"	buy.Title = "有效期"	buy.Text = "至" + tools.TimeToStr(merchantCard.MerchantCardTime)	outData.BuyKnowList = append(outData.BuyKnowList, buy)	buy.Icon = "/images/资源 48.png"	buy.Title = "限购数量"	buy.Text = "每位用户限购1张"	outData.BuyKnowList = append(outData.BuyKnowList, buy)	buy.Icon = "/images/资源 49.png"	buy.Title = "使用规则"	buy.Text = merchantCard.UseRule	outData.BuyKnowList = append(outData.BuyKnowList, buy)	var shopData models.ShopData	var merchant shanghu.Merchant	merchant.OpenId = merchantCard.MerchantOpenID	merchantInfo, err := merchant.GetMerchant()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	shopData.Name = merchantInfo.MerchantName	shopData.Address = merchantInfo.Address	outData.ShopData = shopData	outData.FenxiangShow = false	outData.MerchantAmount, err = decimal.NewFromString(merchantCard.CardPrice)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	outData.MerchantOriginalAmount, err = decimal.NewFromString(merchantCard.CardTotalPrice)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	//outData.MerchantOriginalAmount = outData.MerchantAmount.Add(decimal.NewFromInt(50))	var outQRData models.ClientCardQRReply	val, err := pdd.DuoDuoGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx25357518f710b8ce&secret=83c7dca801a6c93fbfac3c91f57a4eb2")	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	err = tools.JsonUnmarshal(val, &outQRData)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	if outQRData.AccessToken == "" {		app.Error(c, 500, err, "token error")		return	}	url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + outQRData.AccessToken	//1.原始码 不需要购买直接分享 ==原生码直接分享	//2.code 本人openid 需要购买才能分享	//3.空的 官方邀请码	//返回邀请码	var qrCode string	if inData.Code == "yuanshima" && inData.Openid == "" { //商家平台 可以分享   code 等于自己的与yuanshima的都给平台		outData.IsShare = true		outData.InvitationCode = "yuanshima"		qrCode = "yuanshima"	} else if inData.Code == "yuanshima" && inData.Openid != "" { // 原始码 c端用户调用		var userInfo shanghu.MerchantClientUser		outData.IsShare = true		userInfo.ClientOpenID = inData.Openid		userInfoReply, _ := userInfo.GetUserInfo()		qrCode = userInfoReply.Code		outData.InvitationCode = inData.Code	} else if inData.Code != "yuanshima" && inData.Openid != "" && inData.Code != "" { //查询购买记录,没有购买过不让分享		var payTrans shanghu.ClientPayTrans		var userInfo shanghu.MerchantClientUser		payTrans.MerchantCardID = inData.MerchantId		payTrans.ClientOpenID = inData.Openid		payInfo, _ := payTrans.GetPayTransByOpenid()		if payInfo.ID <= 0 {			outData.IsShare = false		} else {			outData.IsShare = true		}		outData.InvitationCode = inData.Code		userInfo.ClientOpenID = inData.Openid		userInfoReply, _ := userInfo.GetUserInfo()		qrCode = userInfoReply.Code	} else {		app.Error(c, 500, errors.New("code 错误"), "code 错误")		return	}	//点击购买的时候把code给进去把 原始码购买属于平台	qr.CheckPath = true	qr.Page = "pages/home/home"	qr.EnvVersion = "release"	qr.Scene = "id-" + strconv.FormatInt(inData.MerchantId, 10) + "-c-" + qrCode	fmt.Println(qr.Scene)	data, err := json.Marshal(&qr)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	reply, err := common.Post(data, url)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	if getQR.Errcode != 0 {		app.Error(c, 500, err, getQR.Errmsg)		return	}	encoded := base64.StdEncoding.EncodeToString(reply)	outData.Base64Img = encoded	//上传二维码文件	timeUnixNano := time.Now().UnixNano() //单位纳秒	fileName := fmt.Sprintf("%d.jpg", timeUnixNano)	//七牛云上传图片	bucket := "imgxx"	key := "shanghuka/" + "erweima/" + time.Now().Format(time.DateOnly) + "/" + fileName	putPolicy := storage.PutPolicy{		Scope: bucket,	}	mac := qbox.NewMac(confIni.MustValue("ly-qn", "access_key"), confIni.MustValue("ly-qn", "secret_key"))	upToken := putPolicy.UploadToken(mac)	cfg := storage.Config{}	// 空间对应的机房	cfg.Zone = &storage.ZoneHuanan	// 是否使用https域名	cfg.UseHTTPS = false	// 上传是否使用CDN上传加速	cfg.UseCdnDomains = false	// 构建表单上传的对象	baseUploader := storage.NewBase64Uploader(&cfg)	ret := storage.PutRet{}	//data, err := base64.RawStdEncoding.DecodeString(inData.Pictures[i])	//if err != nil {	//	app.Error(c, 500, err, "上传图片失败")	//	return	//}	err = baseUploader.Put(context.Background(), &ret, upToken, key, []byte(encoded), nil)	if err != nil {		app.Error(c, 500, err, "上传图片失败")		return	}	outData.QRUrl = "http://lingyang.shisanmiao.com/" + key	//err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)	//if err != nil {	//	app.Error(c, 500, err, err.Error())	//	return	//}	//	//merchantCard.CardProjectData = ""	//for i := 0; i < len(project); i++ {	//	var cardProject shanghu.MerchantCardProject	//	cardProject.ID = project[i]	//	projectInfo, err := cardProject.GetMerchantCardProject()	//	if err != nil {	//		app.Error(c, 500, err, err.Error())	//		return	//	}	//	merchantCard.CardProjectData = merchantCard.CardProjectData + projectInfo.ProjectName + "x1 "	//}	app.OK(c, outData, app.Success)}func MerchantCardList(c *gin.Context) {	var inData models.MerchantCardListRequest	var sqlData shanghu.MerchantCard	var outData []models.MerchantCardListReply	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	merchantCard, count, err := sqlData.GetOpenIdList(pageSize, pageIndex, inData.TypeList)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	for _, v := range merchantCard {		var merchant models.MerchantCardListReply		var payNumber shanghu.ClientPayTrans		merchant.ID = v.ID		merchant.MerchantCardName = v.MerchantCardName		merchant.ActivityEnd = tools.TimeToStr(v.ActivityEndTime)		merchant.ActivityStart = tools.TimeToStr(v.ActivityStartTime)		merchant.CardPrice = v.CardPrice		payNumber.MerchantCardID = v.ID		merchant.SaleCardNumber = payNumber.GetNumByCardID()		outData = append(outData, merchant)	}	app.PageOK(c, outData, count, pageIndex, pageSize, app.Success)	return	//app.PageOK(c, merchantCard, count, pageIndex, pageSize, app.Success)}// c端获取卡信息func MerchantClientCardList(c *gin.Context) {	var inData models.MerchantCardListRequest	var sqlData shanghu.MerchantCard	var outData []models.MerchantCardListReply	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	}	merchantCard, count, err := sqlData.ClientGetOpenIdList(pageSize, pageIndex, inData.TypeList)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	for i := 0; i < len(merchantCard); i++ {		var reply models.MerchantCardListReply		reply.RebateRate = merchantCard[i].RebateRate		reply.ID = merchantCard[i].ID		reply.QuotaNum = merchantCard[i].QuotaNum		reply.MerchantCardName = merchantCard[i].MerchantCardName		reply.CardPrice = merchantCard[i].CardPrice		priceDec, err := decimal.NewFromString(merchantCard[i].CardPrice)		if err != nil {			app.Error(c, 500, err, err.Error())			return		}		reply.RebateAmount = priceDec.Mul(decimal.NewFromInt(merchantCard[i].RebateRate).Div(decimal.NewFromInt(100))).String()		outData = append(outData, reply)	}	app.PageOK(c, outData, count, pageIndex, pageSize, app.Success)}func UpdateMerchantCard(c *gin.Context) {	var inData models.UpdateMerchantCardRequest	var sqlData shanghu.MerchantCard	err := c.ShouldBindJSON(&inData)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	sqlData.ID = inData.ID	sqlData.QuotaNum = inData.QuotaNum	sqlData.UseRule = inData.UseRule	sqlData.Picture = inData.Picture	sqlData.Inventory = inData.Inventory	sqlData.ActivityStartTime = inData.ActivityStartTime	sqlData.ActivityEndTime = inData.ActivityEndTime	err = sqlData.UpdateMerchantCard()	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	app.OK(c, nil, app.Success)}func UpdateMerchantCardWXYZ(c *gin.Context) {	var inData models.UpdateMerchantCardWHXYRequest	var sqlData shanghu.MerchantCard	var whxy []models.WHXYStr	err := c.ShouldBindJSON(&inData)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	//"json: cannot unmarshal number -0.33279827286174424 into Go struct field WHXYStr.rotate of type int"	err = json.Unmarshal([]byte(inData.Whxy), &whxy)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	for i := 0; i < len(whxy); i++ {		if !whxy[i].Y.IsZero() {			sqlData.W = whxy[i].W.String()			sqlData.X = whxy[i].X.String()			sqlData.Y = whxy[i].Y.String()			sqlData.H = whxy[i].H.String()		}	}	sqlData.ID = inData.MerchantCardId	err = sqlData.UpdateMerchantWHXY()	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	app.OK(c, nil, app.Success)}// 核销次数func CancelNumber(c *gin.Context) {	var inData models.CancelCardRequest	var sqlData shanghu.MerchantCard	var log shanghu.CancelLog	var qrMessage models.QRData	var clientPay shanghu.ClientPayTrans	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	}	clientPay.MerchantCardID = qrMessage.MerchantId	clientPay.ClientOpenID = qrMessage.ClientOpenId	clientInfo, err := clientPay.GetPayTransByOpenid()	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	if clientInfo.ID == 0 {		app.Error(c, 200, errors.New("用户未购买此卡"), "用户未购买此卡")		return	}	sqlData.ID = qrMessage.MerchantId	merchantInfo, err := sqlData.GetMerchantCard()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	log.MerchantID = qrMessage.MerchantId	log.ClientOpenID = qrMessage.ClientOpenId	if log.GetNumber() >= merchantInfo.CancelNumber {		app.Error(c, 200, errors.New("卡已使用完,请重新购买"), "卡已使用完,请重新购买")		return	}	if merchantInfo.MerchantOpenID != inData.MerchantOpenId {		app.Error(c, 200, errors.New("核销商家与发卡商家不一致"), "核销商家与发卡商家不一致")		return	}	log.MerchantID = qrMessage.MerchantId	log.ClientOpenID = qrMessage.ClientOpenId	log.MerchantOpenID = inData.MerchantOpenId	log.CreatedAt = time.Now()	log.UpdatedAt = time.Now()	_, err = log.Create()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	app.OK(c, nil, "核销成功")}// 核销 v2func CancelNumberV2(c *gin.Context) {	var inData models.CancelCardV2Request	var sqlData shanghu.MerchantCard	var log shanghu.CancelLog	var cancelLog []shanghu.CancelLog	var qrMessage models.QRData	var clientPay shanghu.ClientPayTrans	err := c.ShouldBindJSON(&inData)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	if inData.Number <= 0 {		app.Error(c, 400, errors.New("核销次数不能为0"), "核销次数不能为0")		return	}	err = json.Unmarshal([]byte(inData.QRMessage), &qrMessage)	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	clientPay.MerchantCardID = qrMessage.MerchantId	clientPay.ClientOpenID = qrMessage.ClientOpenId	clientInfo, err := clientPay.GetPayTransByOpenid()	if err != nil {		app.Error(c, 400, err, err.Error())		return	}	if clientInfo.ID == 0 {		app.Error(c, 500, errors.New("用户未购买此卡"), "用户未购买此卡")		return	}	sqlData.ID = qrMessage.MerchantId	merchantInfo, err := sqlData.GetMerchantCard()	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	log.MerchantID = qrMessage.MerchantId	log.ClientOpenID = qrMessage.ClientOpenId	if log.GetNumber()+inData.Number > merchantInfo.CancelNumber {		app.Error(c, 500, errors.New("剩余核销次数不够,请重新购买"), "剩余核销次数不够,请重新购买")		return	}	//if merchantInfo.MerchantOpenID != inData.MerchantOpenId {	//	app.Error(c, 500, errors.New("核销商家与发卡商家不一致"), "核销商家与发卡商家不一致")	//	return	//}	for i := 0; i < inData.Number; i++ {		log.MerchantID = qrMessage.MerchantId		log.ClientOpenID = qrMessage.ClientOpenId		log.MerchantOpenID = inData.MerchantOpenId		log.CreatedAt = time.Now()		log.UpdatedAt = time.Now()		cancelLog = append(cancelLog, log)	}	err = log.CreateBatches(cancelLog)	if err != nil {		app.Error(c, 500, err, err.Error())		return	}	app.OK(c, nil, "核销成功")}
 |