merchant.card.go 14 KB

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