merchant.card.go 14 KB

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