package shanghu import ( "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.空的 官方邀请码 //返回邀请码 if inData.Code == "yuanshima" && inData.Openid == "" { //商家平台 可以分享 code 等于自己的与yuanshima的都给平台 outData.IsShare = true outData.InvitationCode = "yuanshima" } else if inData.Code == "yuanshima" && inData.Openid != "" { // 原始码 c端用户调用 var userInfo shanghu.MerchantClientUser outData.IsShare = true userInfo.ClientOpenID = inData.Openid userInfoReply, _ := userInfo.GetUserInfo() outData.InvitationCode = userInfoReply.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 } 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-" + outData.InvitationCode 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, "核销成功") } // 核销 v2 func 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, "核销成功") }