merchant.card.go 16 KB

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