merchant.card.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. package shanghu
  2. import (
  3. "context"
  4. "duoduo/apis/common"
  5. "duoduo/apis/pdd"
  6. "duoduo/apis/shanghu/models"
  7. "duoduo/conf"
  8. "duoduo/models/shanghu"
  9. "duoduo/tools"
  10. "duoduo/tools/app"
  11. "encoding/base64"
  12. "encoding/json"
  13. "errors"
  14. "fmt"
  15. "github.com/gin-gonic/gin"
  16. "github.com/qiniu/go-sdk/v7/auth/qbox"
  17. "github.com/qiniu/go-sdk/v7/storage"
  18. "github.com/shopspring/decimal"
  19. "strconv"
  20. "time"
  21. )
  22. func CreateMerchantCard(c *gin.Context) {
  23. var inData models.CreateMerchantCardRequest
  24. var sqlData shanghu.MerchantCard
  25. err := c.ShouldBindJSON(&inData)
  26. if err != nil {
  27. app.Error(c, 400, err, err.Error())
  28. return
  29. }
  30. sqlData.CreatedAt = time.Now()
  31. sqlData.UpdatedAt = time.Now()
  32. jsStr, err := json.Marshal(inData.CardProjectData)
  33. if err != nil {
  34. app.Error(c, 400, err, "包含项目不能为空")
  35. return
  36. }
  37. sqlData.CardProjectData = string(jsStr)
  38. sqlData.CardPrice = inData.CardPrice
  39. sqlData.ActivityEndTime, err = tools.TimeToInt64(inData.ActivityEndTime, "2006-01-02")
  40. if err != nil {
  41. app.Error(c, 400, err, err.Error())
  42. return
  43. }
  44. sqlData.ActivityStartTime, err = tools.TimeToInt64(inData.ActivityStartTime, "2006-01-02")
  45. if err != nil {
  46. app.Error(c, 400, err, err.Error())
  47. return
  48. }
  49. sqlData.Inventory, err = strconv.ParseInt(inData.Inventory, 10, 64)
  50. if err != nil {
  51. app.Error(c, 400, err, err.Error())
  52. return
  53. }
  54. sqlData.MerchantCardTime, err = tools.TimeToInt64(inData.MerchantCardTime, "2006-01-02")
  55. if err != nil {
  56. app.Error(c, 400, err, err.Error())
  57. return
  58. }
  59. sqlData.MerchantOpenID = inData.MerchantOpenID
  60. sqlData.Picture = inData.Picture
  61. sqlData.QuotaNum, err = strconv.ParseInt(inData.QuotaNum, 10, 64)
  62. if err != nil {
  63. app.Error(c, 400, err, err.Error())
  64. return
  65. }
  66. sqlData.RebateRate, err = strconv.ParseInt(inData.RebateRate, 10, 64)
  67. if err != nil {
  68. app.Error(c, 400, err, err.Error())
  69. return
  70. }
  71. sqlData.UseRule = inData.UseRule
  72. sqlData.MerchantCardName = inData.MerchantCardName
  73. sqlData.CancelNumber, err = strconv.Atoi(inData.CancelNumber)
  74. if err != nil {
  75. app.Error(c, 400, err, err.Error())
  76. return
  77. }
  78. sqlData.BackgroundImage = inData.BackgroundImage
  79. _, err = sqlData.Create()
  80. if err != nil {
  81. app.Error(c, 500, err, err.Error())
  82. return
  83. }
  84. app.OK(c, nil, app.Success)
  85. }
  86. func GetMerchantCard(c *gin.Context) {
  87. var inData models.GetMerchantCardRequest
  88. var outData models.GetMerchantCardReply
  89. var sqlData shanghu.MerchantCard
  90. var project []int64
  91. err := c.ShouldBindJSON(&inData)
  92. if err != nil {
  93. app.Error(c, 400, err, err.Error())
  94. return
  95. }
  96. sqlData.ID = inData.MerchantId
  97. merchantCard, err := sqlData.GetMerchantCard()
  98. if err != nil {
  99. app.Error(c, 500, err, err.Error())
  100. return
  101. }
  102. err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)
  103. if err != nil {
  104. app.Error(c, 500, err, err.Error())
  105. return
  106. }
  107. merchantCard.CardProjectData = ""
  108. for i := 0; i < len(project); i++ {
  109. var cardProject shanghu.MerchantCardProject
  110. cardProject.ID = project[i]
  111. projectInfo, err := cardProject.GetMerchantCardProject()
  112. if err != nil {
  113. app.Error(c, 500, err, err.Error())
  114. return
  115. }
  116. merchantCard.CardProjectData = merchantCard.CardProjectData + projectInfo.ProjectName + "x1 "
  117. }
  118. outData.CardProjectData = merchantCard.CardProjectData
  119. outData.MerchantCardName = merchantCard.MerchantCardName
  120. outData.MerchantCardTime = time.Unix(merchantCard.MerchantCardTime, 0).Format("2006-01-02")
  121. outData.ActivityEndTime = time.Unix(merchantCard.ActivityEndTime, 0).Format("2006-01-02")
  122. outData.ActivityStartTime = time.Unix(merchantCard.ActivityStartTime, 0).Format("2006-01-02")
  123. outData.Picture = merchantCard.Picture
  124. outData.UseRule = merchantCard.UseRule
  125. outData.QuotaNum = merchantCard.QuotaNum
  126. outData.Inventory = merchantCard.Inventory
  127. outData.RebateRate = merchantCard.RebateRate
  128. outData.CardPrice = merchantCard.CardPrice
  129. outData.X = merchantCard.X
  130. outData.Y = merchantCard.Y
  131. outData.W = merchantCard.W
  132. outData.H = merchantCard.H
  133. outData.BackgroundImage = merchantCard.BackgroundImage
  134. app.OK(c, outData, app.Success)
  135. }
  136. func GetMerchantCanvasCard(c *gin.Context) {
  137. var inData models.GetMerchantCardRequest
  138. var outData models.GetMerchantCanvasCardReply
  139. var sqlData shanghu.MerchantCard
  140. var project []int64
  141. var qr models.QRRequest
  142. var getQR models.GetQRRequest
  143. confIni, err := conf.ConnIni()
  144. if err != nil {
  145. app.Error(c, 400, err, err.Error())
  146. return
  147. }
  148. err = c.ShouldBindJSON(&inData)
  149. if err != nil {
  150. app.Error(c, 400, err, err.Error())
  151. return
  152. }
  153. sqlData.ID = inData.MerchantId
  154. merchantCard, err := sqlData.GetMerchantCard()
  155. if err != nil {
  156. app.Error(c, 500, err, err.Error())
  157. return
  158. }
  159. outData.Static.Background = "/images/背景.jpg"
  160. var swiperList []models.SwiperList
  161. var rightButton models.RightButton
  162. var swiper models.SwiperList
  163. swiper.ID = 0
  164. swiper.URL = merchantCard.Picture
  165. swiperList = append(swiperList, swiper)
  166. //err = json.Unmarshal([]byte(merchantCard.Picture), &swiperList)
  167. //if err != nil {
  168. // fmt.Println("picture")
  169. // app.Error(c, 500, err, err.Error())
  170. // return
  171. //}
  172. outData.Inventory = merchantCard.Inventory
  173. outData.SwiperList = swiperList
  174. rightButton.ImageURL = "/images/资源 24.png"
  175. outData.RightButton = append(outData.RightButton, rightButton)
  176. rightButton.ImageURL = "/images/资源 25.png"
  177. outData.RightButton = append(outData.RightButton, rightButton)
  178. rightButton.ImageURL = "/images/资源 26.png"
  179. outData.RightButton = append(outData.RightButton, rightButton)
  180. rightButton.ImageURL = "/images/资源 28.png"
  181. outData.RightButton = append(outData.RightButton, rightButton)
  182. var dataList models.DataList
  183. err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)
  184. if err != nil {
  185. fmt.Println("picture2")
  186. app.Error(c, 500, err, err.Error())
  187. return
  188. }
  189. //merchantCard.CardProjectData = ""
  190. for i := 0; i < len(project); i++ {
  191. var cardProject shanghu.MerchantCardProject
  192. cardProject.ID = project[i]
  193. projectInfo, err := cardProject.GetMerchantCardProject()
  194. if err != nil {
  195. app.Error(c, 500, err, err.Error())
  196. return
  197. }
  198. dataList.Name = projectInfo.ProjectName
  199. dataList.Count = 1
  200. dataList.Price = projectInfo.ProjectUnitPrice
  201. outData.DataList = append(outData.DataList, dataList)
  202. }
  203. var buy models.BuyKnowList
  204. buy.Icon = "/images/资源 46.png"
  205. buy.Title = "有效期"
  206. buy.Text = "至" + tools.TimeToStr(merchantCard.MerchantCardTime)
  207. outData.BuyKnowList = append(outData.BuyKnowList, buy)
  208. buy.Icon = "/images/资源 48.png"
  209. buy.Title = "限购数量"
  210. buy.Text = "每位用户限购1张"
  211. outData.BuyKnowList = append(outData.BuyKnowList, buy)
  212. buy.Icon = "/images/资源 49.png"
  213. buy.Title = "使用规则"
  214. buy.Text = merchantCard.UseRule
  215. outData.BuyKnowList = append(outData.BuyKnowList, buy)
  216. var shopData models.ShopData
  217. var merchant shanghu.Merchant
  218. merchant.OpenId = merchantCard.MerchantOpenID
  219. merchantInfo, err := merchant.GetMerchant()
  220. if err != nil {
  221. app.Error(c, 500, err, err.Error())
  222. return
  223. }
  224. shopData.Name = merchantInfo.MerchantName
  225. shopData.Address = merchantInfo.Address
  226. outData.ShopData = shopData
  227. outData.FenxiangShow = false
  228. outData.MerchantAmount, err = decimal.NewFromString(merchantCard.CardPrice)
  229. if err != nil {
  230. app.Error(c, 500, err, err.Error())
  231. return
  232. }
  233. outData.MerchantOriginalAmount = outData.MerchantAmount.Add(decimal.NewFromInt(50))
  234. var outQRData models.ClientCardQRReply
  235. val, err := pdd.DuoDuoGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx25357518f710b8ce&secret=83c7dca801a6c93fbfac3c91f57a4eb2")
  236. if err != nil {
  237. app.Error(c, 500, err, err.Error())
  238. return
  239. }
  240. err = tools.JsonUnmarshal(val, &outQRData)
  241. if err != nil {
  242. app.Error(c, 500, err, err.Error())
  243. return
  244. }
  245. if outQRData.AccessToken == "" {
  246. app.Error(c, 500, err, "token error")
  247. return
  248. }
  249. url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + outQRData.AccessToken
  250. //1.原始码 不需要购买直接分享 ==原生码直接分享
  251. //2.code 本人openid 需要购买才能分享
  252. //3.空的 官方邀请码
  253. //返回邀请码
  254. if inData.Code == "yuanshima" { //可以分享 code 等于自己的与yuanshima的都给平台
  255. outData.IsShare = true
  256. outData.InvitationCode = "yuanshima"
  257. } else { //查询购买记录,没有购买过不让分享
  258. var payTrans shanghu.ClientPayTrans
  259. var userInfo shanghu.MerchantClientUser
  260. payTrans.MerchantCardID = inData.MerchantId
  261. payTrans.ClientOpenID = inData.Code
  262. payInfo, _ := payTrans.GetPayTransByOpenid()
  263. if payInfo.ID <= 0 {
  264. outData.IsShare = false
  265. } else {
  266. outData.IsShare = true
  267. }
  268. userInfo.ClientOpenID = inData.Code
  269. userInfoReply, _ := userInfo.GetUserInfo()
  270. outData.InvitationCode = userInfoReply.Code
  271. }
  272. //点击购买的时候把code给进去把 原始码购买属于平台
  273. qr.CheckPath = true
  274. qr.Page = "pages/home/home"
  275. qr.EnvVersion = "release"
  276. qr.Scene = "id-" + strconv.FormatInt(inData.MerchantId, 10) + "-c-" + outData.InvitationCode
  277. fmt.Println(qr.Scene)
  278. data, err := json.Marshal(&qr)
  279. if err != nil {
  280. app.Error(c, 500, err, err.Error())
  281. return
  282. }
  283. reply, err := common.Post(data, url)
  284. if err != nil {
  285. app.Error(c, 500, err, err.Error())
  286. return
  287. }
  288. if getQR.Errcode != 0 {
  289. app.Error(c, 500, err, getQR.Errmsg)
  290. return
  291. }
  292. encoded := base64.StdEncoding.EncodeToString(reply)
  293. outData.Base64Img = encoded
  294. //上传二维码文件
  295. timeUnixNano := time.Now().UnixNano() //单位纳秒
  296. fileName := fmt.Sprintf("%d.jpg", timeUnixNano)
  297. //七牛云上传图片
  298. bucket := "imgxx"
  299. key := "shanghuka/" + "erweima/" + time.Now().Format(time.DateOnly) + "/" + fileName
  300. putPolicy := storage.PutPolicy{
  301. Scope: bucket,
  302. }
  303. mac := qbox.NewMac(confIni.MustValue("ly-qn", "access_key"), confIni.MustValue("ly-qn", "secret_key"))
  304. upToken := putPolicy.UploadToken(mac)
  305. cfg := storage.Config{}
  306. // 空间对应的机房
  307. cfg.Zone = &storage.ZoneHuanan
  308. // 是否使用https域名
  309. cfg.UseHTTPS = false
  310. // 上传是否使用CDN上传加速
  311. cfg.UseCdnDomains = false
  312. // 构建表单上传的对象
  313. baseUploader := storage.NewBase64Uploader(&cfg)
  314. ret := storage.PutRet{}
  315. //data, err := base64.RawStdEncoding.DecodeString(inData.Pictures[i])
  316. //if err != nil {
  317. // app.Error(c, 500, err, "上传图片失败")
  318. // return
  319. //}
  320. err = baseUploader.Put(context.Background(), &ret, upToken, key, []byte(encoded), nil)
  321. if err != nil {
  322. app.Error(c, 500, err, "上传图片失败")
  323. return
  324. }
  325. outData.QRUrl = "http://lingyang.shisanmiao.com/" + key
  326. //err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)
  327. //if err != nil {
  328. // app.Error(c, 500, err, err.Error())
  329. // return
  330. //}
  331. //
  332. //merchantCard.CardProjectData = ""
  333. //for i := 0; i < len(project); i++ {
  334. // var cardProject shanghu.MerchantCardProject
  335. // cardProject.ID = project[i]
  336. // projectInfo, err := cardProject.GetMerchantCardProject()
  337. // if err != nil {
  338. // app.Error(c, 500, err, err.Error())
  339. // return
  340. // }
  341. // merchantCard.CardProjectData = merchantCard.CardProjectData + projectInfo.ProjectName + "x1 "
  342. //}
  343. app.OK(c, outData, app.Success)
  344. }
  345. func MerchantCardList(c *gin.Context) {
  346. var inData models.MerchantCardListRequest
  347. var sqlData shanghu.MerchantCard
  348. err := c.ShouldBindJSON(&inData)
  349. if err != nil {
  350. app.Error(c, 400, err, err.Error())
  351. return
  352. }
  353. var pageSize = 10
  354. var pageIndex = 1
  355. if inData.PageSize != 0 {
  356. pageSize = inData.PageSize
  357. }
  358. if inData.PageIndex != 0 {
  359. pageIndex = inData.PageIndex
  360. }
  361. fmt.Println(inData.OpenId)
  362. sqlData.MerchantOpenID = inData.OpenId
  363. merchantCard, count, err := sqlData.GetOpenIdList(pageSize, pageIndex, inData.TypeList)
  364. if err != nil {
  365. app.Error(c, 500, err, err.Error())
  366. return
  367. }
  368. app.PageOK(c, merchantCard, count, pageIndex, pageSize, app.Success)
  369. }
  370. // c端获取卡信息
  371. func MerchantClientCardList(c *gin.Context) {
  372. var inData models.MerchantCardListRequest
  373. var sqlData shanghu.MerchantCard
  374. var outData []models.MerchantCardListReply
  375. err := c.ShouldBindJSON(&inData)
  376. if err != nil {
  377. app.Error(c, 400, err, err.Error())
  378. return
  379. }
  380. var pageSize = 10
  381. var pageIndex = 1
  382. if inData.PageSize != 0 {
  383. pageSize = inData.PageSize
  384. }
  385. if inData.PageIndex != 0 {
  386. pageIndex = inData.PageIndex
  387. }
  388. merchantCard, count, err := sqlData.ClientGetOpenIdList(pageSize, pageIndex, inData.TypeList)
  389. if err != nil {
  390. app.Error(c, 500, err, err.Error())
  391. return
  392. }
  393. for i := 0; i < len(merchantCard); i++ {
  394. var reply models.MerchantCardListReply
  395. reply.RebateRate = merchantCard[i].RebateRate
  396. reply.ID = merchantCard[i].ID
  397. reply.QuotaNum = merchantCard[i].QuotaNum
  398. reply.MerchantCardName = merchantCard[i].MerchantCardName
  399. reply.CardPrice = merchantCard[i].CardPrice
  400. priceDec, err := decimal.NewFromString(merchantCard[i].CardPrice)
  401. if err != nil {
  402. app.Error(c, 500, err, err.Error())
  403. return
  404. }
  405. reply.RebateAmount = priceDec.Mul(decimal.NewFromInt(merchantCard[i].RebateRate).Div(decimal.NewFromInt(100))).String()
  406. outData = append(outData, reply)
  407. }
  408. app.PageOK(c, outData, count, pageIndex, pageSize, app.Success)
  409. }
  410. func UpdateMerchantCard(c *gin.Context) {
  411. var inData models.UpdateMerchantCardRequest
  412. var sqlData shanghu.MerchantCard
  413. err := c.ShouldBindJSON(&inData)
  414. if err != nil {
  415. app.Error(c, 400, err, err.Error())
  416. return
  417. }
  418. sqlData.ID = inData.ID
  419. sqlData.QuotaNum = inData.QuotaNum
  420. sqlData.UseRule = inData.UseRule
  421. sqlData.Picture = inData.Picture
  422. sqlData.Inventory = inData.Inventory
  423. sqlData.ActivityStartTime = inData.ActivityStartTime
  424. sqlData.ActivityEndTime = inData.ActivityEndTime
  425. err = sqlData.UpdateMerchantCard()
  426. if err != nil {
  427. app.Error(c, 400, err, err.Error())
  428. return
  429. }
  430. app.OK(c, nil, app.Success)
  431. }
  432. func UpdateMerchantCardWXYZ(c *gin.Context) {
  433. var inData models.UpdateMerchantCardWHXYRequest
  434. var sqlData shanghu.MerchantCard
  435. var whxy []models.WHXYStr
  436. err := c.ShouldBindJSON(&inData)
  437. if err != nil {
  438. app.Error(c, 400, err, err.Error())
  439. return
  440. }
  441. //"json: cannot unmarshal number -0.33279827286174424 into Go struct field WHXYStr.rotate of type int"
  442. err = json.Unmarshal([]byte(inData.Whxy), &whxy)
  443. if err != nil {
  444. app.Error(c, 400, err, err.Error())
  445. return
  446. }
  447. for i := 0; i < len(whxy); i++ {
  448. if !whxy[i].Y.IsZero() {
  449. sqlData.W = whxy[i].W.String()
  450. sqlData.X = whxy[i].X.String()
  451. sqlData.Y = whxy[i].Y.String()
  452. sqlData.H = whxy[i].H.String()
  453. }
  454. }
  455. sqlData.ID = inData.MerchantCardId
  456. err = sqlData.UpdateMerchantWHXY()
  457. if err != nil {
  458. app.Error(c, 400, err, err.Error())
  459. return
  460. }
  461. app.OK(c, nil, app.Success)
  462. }
  463. // 核销次数
  464. func CancelNumber(c *gin.Context) {
  465. var inData models.CancelCardRequest
  466. var sqlData shanghu.MerchantCard
  467. var log shanghu.CancelLog
  468. var qrMessage models.QRData
  469. var clientPay shanghu.ClientPayTrans
  470. err := c.ShouldBindJSON(&inData)
  471. if err != nil {
  472. app.Error(c, 400, err, err.Error())
  473. return
  474. }
  475. err = json.Unmarshal([]byte(inData.QRMessage), &qrMessage)
  476. if err != nil {
  477. app.Error(c, 400, err, err.Error())
  478. return
  479. }
  480. clientPay.MerchantCardID = qrMessage.MerchantId
  481. clientPay.ClientOpenID = qrMessage.ClientOpenId
  482. clientInfo, err := clientPay.GetPayTransByOpenid()
  483. if err != nil {
  484. app.Error(c, 400, err, err.Error())
  485. return
  486. }
  487. if clientInfo.ID == 0 {
  488. app.Error(c, 200, errors.New("用户未购买此卡"), "用户未购买此卡")
  489. return
  490. }
  491. sqlData.ID = qrMessage.MerchantId
  492. merchantInfo, err := sqlData.GetMerchantCard()
  493. if err != nil {
  494. app.Error(c, 500, err, err.Error())
  495. return
  496. }
  497. log.MerchantID = qrMessage.MerchantId
  498. log.ClientOpenID = qrMessage.ClientOpenId
  499. if log.GetNumber() >= merchantInfo.CancelNumber {
  500. app.Error(c, 200, errors.New("卡已使用完,请重新购买"), "卡已使用完,请重新购买")
  501. return
  502. }
  503. if merchantInfo.MerchantOpenID != inData.MerchantOpenId {
  504. app.Error(c, 200, errors.New("核销商家与发卡商家不一致"), "核销商家与发卡商家不一致")
  505. return
  506. }
  507. log.MerchantID = qrMessage.MerchantId
  508. log.ClientOpenID = qrMessage.ClientOpenId
  509. log.MerchantOpenID = inData.MerchantOpenId
  510. log.CreatedAt = time.Now()
  511. log.UpdatedAt = time.Now()
  512. _, err = log.Create()
  513. if err != nil {
  514. app.Error(c, 500, err, err.Error())
  515. return
  516. }
  517. app.OK(c, nil, "核销成功")
  518. }