merchant.card.go 14 KB

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