active.pay.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package shanghu
  2. import (
  3. "duoduo/apis/shanghu/models"
  4. "duoduo/models/shanghu"
  5. "duoduo/tools"
  6. "duoduo/tools/app"
  7. "encoding/base64"
  8. "encoding/json"
  9. "errors"
  10. "github.com/gin-gonic/gin"
  11. "github.com/skip2/go-qrcode"
  12. "time"
  13. )
  14. // 待核销金额
  15. func PendingCancelAmount(c *gin.Context) {
  16. var inData models.PendingCancelAmountRequest
  17. var activePayTransSql shanghu.ClientActivePayTrans
  18. var outData models.PendingCancelAmountReply
  19. err := c.ShouldBindJSON(&inData)
  20. if err != nil {
  21. app.Error(c, 400, err, err.Error())
  22. return
  23. }
  24. if inData.Type == 1 { //商家
  25. activePayTransSql.MerchantOpenID = inData.OpenId
  26. activeAmount, err := activePayTransSql.GetPendingCancelByMerchant()
  27. if err != nil {
  28. app.Error(c, 500, err, err.Error())
  29. return
  30. }
  31. outData.Amount = activeAmount.MerchantAmount.String()
  32. } else if inData.Type == 2 { //个人
  33. activePayTransSql.ClientOpenID = inData.OpenId
  34. activeAmount, err := activePayTransSql.GetPendingCancelByClient()
  35. if err != nil {
  36. app.Error(c, 500, err, err.Error())
  37. return
  38. }
  39. outData.Amount = activeAmount.ClientAmount.String()
  40. } else {
  41. app.Error(c, 500, errors.New("type 类型错误"), err.Error())
  42. return
  43. }
  44. app.OK(c, outData, app.Success)
  45. }
  46. // 拼团购买
  47. func GetGroupBuyPayList(c *gin.Context) {
  48. var inData models.GetGroupBuyPayRequest
  49. var sqlData shanghu.ClientActivePayTrans
  50. var outData []models.GetGroupBuyPayReply
  51. err := c.ShouldBindJSON(&inData)
  52. if err != nil {
  53. app.Error(c, 400, err, err.Error())
  54. return
  55. }
  56. //// 不是商家也不是c端客户
  57. //if inData.UserType != 1 && inData.UserType != 2 {
  58. // app.Error(c, 500, errors.New("用户类型错误"), err.Error())
  59. // return
  60. //}
  61. //
  62. //// 核销类型错误
  63. //if inData.GroupBuyType != 1 && inData.GroupBuyType != 2 {
  64. // app.Error(c, 500, errors.New("核销类型错误"), err.Error())
  65. // return
  66. //}
  67. var pageSize = 10
  68. var pageIndex = 1
  69. if inData.PageSize != 0 {
  70. pageSize = inData.PageSize
  71. }
  72. if inData.PageIndex != 0 {
  73. pageIndex = inData.PageIndex
  74. }
  75. activeDrawLogList, count, err := sqlData.GetActivePayTransList(pageSize, pageIndex, inData.OpenId)
  76. if err != nil {
  77. app.Error(c, 500, err, err.Error())
  78. return
  79. }
  80. for _, v := range activeDrawLogList {
  81. var data models.GetGroupBuyPayReply
  82. var activeSql shanghu.MerchantActiveConfig
  83. var groupBuySql shanghu.MerchantActiveGroupBuy
  84. var groupBuyProductSql shanghu.MerchantActiveGroupByProject
  85. var groupBuyProductCancel shanghu.ActiveCancelLog
  86. data.MerchantAmount = v.MerchantAmount.String()
  87. data.Amount = v.Amount.String()
  88. data.ClientAmount = v.ClientAmount.String()
  89. data.PayTime = v.PayTime.Format(time.DateTime)
  90. activeSql.ID = v.ActiveConfigID
  91. activeInfo, err := activeSql.GetConfigInfoById()
  92. if err != nil {
  93. app.Error(c, 500, err, err.Error())
  94. return
  95. }
  96. data.ActiveName = activeInfo.ActiveName
  97. groupBuySql.ID = v.GroupBuyID
  98. groupBuyInfo, err := groupBuySql.GetMerchantActiveGroupBuyById()
  99. if err != nil {
  100. app.Error(c, 500, err, err.Error())
  101. return
  102. }
  103. groupBuyProductSql.GroupBuyID = v.GroupBuyID
  104. groupBuyProductList, _, err := groupBuyProductSql.GetGroupBuyProjectList()
  105. if err != nil {
  106. app.Error(c, 500, err, err.Error())
  107. return
  108. }
  109. totalGroupBuyNum := 0
  110. for _, v := range groupBuyProductList {
  111. totalGroupBuyNum = totalGroupBuyNum + v.CancelNum
  112. }
  113. groupBuyProductCancel.ClientOpenID = inData.OpenId
  114. groupBuyProductCancel.ActiveConfigID = v.ActiveConfigID
  115. cancelNum := groupBuyProductCancel.GetActiveCancelNum()
  116. data.GroupBuyName = groupBuyInfo.GroupBuyName
  117. data.PayTime = v.PayTime.Format(time.DateTime)
  118. data.TradeNo = v.ThirdTradeNo
  119. data.TotalCancelNum = totalGroupBuyNum
  120. data.PendingCancelNum = cancelNum
  121. data.Url = groupBuyInfo.GroupBuyUrl
  122. outData = append(outData, data)
  123. }
  124. app.PageOK(c, outData, count, pageIndex, pageSize, app.Success)
  125. }
  126. // 拼团核销码
  127. func GroupBuyPayCode(c *gin.Context) {
  128. var inData models.GroupBuyPayCodeRequest
  129. var outData models.GroupBuyPayCodeReply
  130. var payTransSql shanghu.ClientActivePayTrans
  131. var groupBuyProductSql shanghu.MerchantActiveGroupByProject
  132. var groupBuyProductCancel shanghu.ActiveCancelLog
  133. err := c.ShouldBindJSON(&inData)
  134. if err != nil {
  135. app.Error(c, 400, err, err.Error())
  136. return
  137. }
  138. //校验核销次数
  139. payTransSql.ThirdTradeNo = inData.TradeNo
  140. payTransInfo, err := payTransSql.GetPayTransByThirdTradeNo()
  141. if err != nil {
  142. app.Error(c, 500, err, err.Error())
  143. return
  144. }
  145. groupBuyProductSql.GroupBuyID = payTransInfo.GroupBuyID
  146. groupBuyProductList, _, err := groupBuyProductSql.GetGroupBuyProjectList()
  147. if err != nil {
  148. app.Error(c, 500, err, err.Error())
  149. return
  150. }
  151. totalGroupBuyNum := 0
  152. for _, v := range groupBuyProductList {
  153. totalGroupBuyNum = totalGroupBuyNum + v.CancelNum
  154. }
  155. groupBuyProductCancel.ClientOpenID = payTransInfo.ClientOpenID
  156. groupBuyProductCancel.ActiveConfigID = payTransInfo.ActiveConfigID
  157. cancelNum := groupBuyProductCancel.GetActiveCancelNum()
  158. if totalGroupBuyNum <= cancelNum {
  159. app.Error(c, 500, errors.New("核销次数用完"), "核销次数用完")
  160. return
  161. }
  162. outData.Key = "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@")
  163. outData.TradeNo = inData.TradeNo
  164. str, err := json.Marshal(&outData)
  165. if err != nil {
  166. app.Error(c, 500, err, err.Error())
  167. return
  168. }
  169. qr, err := qrcode.Encode(string(str), qrcode.High, 200)
  170. if err != nil {
  171. app.Error(c, 500, err, err.Error())
  172. return
  173. }
  174. encodedData := base64.StdEncoding.EncodeToString(qr)
  175. app.OK(c, encodedData, app.Success)
  176. }
  177. // 拼团核销详情
  178. func GroupBuyCancelInfo(c *gin.Context) {
  179. var inData models.GroupBuyCancelInfoRequest
  180. var outData models.GroupBuyCancelInfoReply
  181. var sqlData shanghu.ClientActivePayTrans
  182. var activeConfigSql shanghu.MerchantActiveConfig
  183. var groupBuySql shanghu.MerchantActiveGroupBuy
  184. var groupBuyProjectSql shanghu.MerchantActiveGroupByProject
  185. err := c.ShouldBindJSON(&inData)
  186. if err != nil {
  187. app.Error(c, 400, err, err.Error())
  188. return
  189. }
  190. key := "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@")
  191. if inData.Key != key {
  192. app.Error(c, 500, errors.New("数据错误"), "数据错误")
  193. return
  194. }
  195. sqlData.ThirdTradeNo = inData.TradeNo
  196. payTransInfo, err := sqlData.GetPayTransByThirdTradeNo()
  197. if err != nil {
  198. app.Error(c, 500, err, err.Error())
  199. return
  200. }
  201. //校验分账类型
  202. //if payTransInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && payTransInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail {
  203. // app.Error(c, 500, errors.New("核销已完成"), "核销已完成")
  204. // return
  205. //}
  206. // 校验支付类型
  207. if payTransInfo.Status != shanghu.ClientActivePayTransStatusPaySuccess {
  208. app.Error(c, 500, errors.New("未支付交易不准核销"), "未支付交易不准核销")
  209. return
  210. }
  211. // 返回拼团信息
  212. outData.Amount = payTransInfo.Amount.String()
  213. outData.TradeNo = inData.TradeNo
  214. outData.PayTime = payTransInfo.PayTime.Format(time.DateTime)
  215. outData.MerchantAmount = payTransInfo.MerchantAmount.String()
  216. outData.ClientAmount = payTransInfo.ClientAmount.String()
  217. activeConfigSql.ID = payTransInfo.ActiveConfigID
  218. activeConfigInfo, err := activeConfigSql.GetConfigInfoById()
  219. if err != nil {
  220. app.Error(c, 500, err, err.Error())
  221. return
  222. }
  223. outData.ActiveName = activeConfigInfo.ActiveName
  224. groupBuySql.ID = payTransInfo.GroupBuyID
  225. groupBuyInfo, err := groupBuySql.GetMerchantActiveGroupBuyById()
  226. if err != nil {
  227. app.Error(c, 500, err, err.Error())
  228. return
  229. }
  230. outData.GroupBuyName = groupBuyInfo.GroupBuyName
  231. groupBuyProjectSql.GroupBuyID = payTransInfo.GroupBuyID
  232. project, _, err := groupBuyProjectSql.GetGroupBuyProjectList()
  233. if err != nil {
  234. app.Error(c, 500, err, err.Error())
  235. return
  236. }
  237. for _, v := range project {
  238. var projectInfo models.CancelGroupBuyProject
  239. var activeCancelSql shanghu.ActiveCancelLog
  240. activeCancelSql.ClientOpenID = payTransInfo.ClientOpenID
  241. activeCancelSql.ActiveConfigID = payTransInfo.ActiveConfigID
  242. num := activeCancelSql.GetActiveCancelNum()
  243. projectInfo.ProjectName = v.ProjectName
  244. projectInfo.TotalCancelNum = v.CancelNum
  245. projectInfo.PendingCancelNum = v.CancelNum - num
  246. projectInfo.ID = v.ID
  247. outData.GroupBuyProject = append(outData.GroupBuyProject, projectInfo)
  248. }
  249. app.OK(c, outData, app.Success)
  250. }
  251. // 拼团核销
  252. func GroupBuyCancel(c *gin.Context) {
  253. var inData models.GroupBuyCancelRequest
  254. var payTrans shanghu.ClientActivePayTrans
  255. var activeCancelLogList []shanghu.ActiveCancelLog
  256. err := c.ShouldBindJSON(&inData)
  257. if err != nil {
  258. app.Error(c, 400, err, err.Error())
  259. return
  260. }
  261. key := "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@")
  262. if inData.Key != key {
  263. app.Error(c, 500, errors.New("数据错误"), "数据错误")
  264. return
  265. }
  266. //查交易
  267. payTrans.ThirdTradeNo = inData.TradeNo
  268. transInfo, err := payTrans.GetPayTransByThirdTradeNo()
  269. if err != nil {
  270. app.Error(c, 500, err, err.Error())
  271. return
  272. }
  273. //校验分账类型
  274. //if transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail {
  275. // app.Error(c, 500, errors.New("核销已完成"), "核销已完成")
  276. // return
  277. //}
  278. // 校验支付类型
  279. if transInfo.Status != shanghu.ClientActivePayTransStatusPaySuccess {
  280. app.Error(c, 500, errors.New("未支付交易不准核销"), "未支付交易不准核销")
  281. return
  282. }
  283. //查看核销次数
  284. //是否可以核销,默认不可以核销,只要有一个可以核销就为true
  285. isCancel := false
  286. for _, v := range inData.GroupBuyProject {
  287. var projectSql shanghu.MerchantActiveGroupByProject
  288. var activeCancel shanghu.ActiveCancelLog
  289. projectSql.ID = v.ID
  290. projectInfo, err := projectSql.GetMerchantActiveGroupBuyProjectByID()
  291. if err != nil {
  292. app.Error(c, 500, err, err.Error())
  293. return
  294. }
  295. cancelNum := activeCancel.GetActiveCancelNum()
  296. if projectInfo.CancelNum >= cancelNum+v.CancelNum && v.CancelNum > 0 {
  297. isCancel = true
  298. for i := 0; i < projectInfo.CancelNum; i++ {
  299. var activeCancelLogInfo shanghu.ActiveCancelLog
  300. activeCancelLogInfo.ActiveConfigID = payTrans.ActiveConfigID
  301. activeCancelLogInfo.ClientOpenID = payTrans.ClientOpenID
  302. activeCancelLogInfo.MerchantOpenID = inData.OpenId
  303. activeCancelLogInfo.GroupByProjectID = v.ID
  304. activeCancelLogInfo.CreatedAt = time.Now()
  305. activeCancelLogInfo.UpdatedAt = time.Now()
  306. activeCancelLogList = append(activeCancelLogList, activeCancelLogInfo)
  307. }
  308. }
  309. }
  310. if !isCancel {
  311. app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够")
  312. return
  313. }
  314. // 分账
  315. if transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail {
  316. //不需要分账
  317. var activeCancel shanghu.ActiveCancelLog
  318. err = activeCancel.TXActiveCancelLogCreate(activeCancelLogList)
  319. if err != nil {
  320. app.Error(c, 500, err, err.Error())
  321. return
  322. }
  323. } else { // 需要分账
  324. //校验是否被分过,分过后不再分账
  325. var merchantAccountLog shanghu.MerchantAccountLog
  326. merchantAccountLog.PayTransId = payTrans.ID
  327. merchantAccountLog.TransType = shanghu.MerchantAccountLogTransTypeGroupBuy
  328. num := merchantAccountLog.GetAccountLogNum()
  329. if num > 0 { //交易已经分过账
  330. app.Error(c, 500, errors.New("交易已分过账"), "交易已分过账")
  331. return
  332. }
  333. //分账校验账号
  334. var merchantAccount shanghu.MerchantAccount
  335. merchantAccount.MerchantOpenID = payTrans.MerchantOpenID
  336. merchantAccountInfo, err := merchantAccount.GetMerchantAccount()
  337. if err != nil && err.Error() != "record not found" {
  338. app.Error(c, 500, err, err.Error())
  339. return
  340. }
  341. if merchantAccountInfo.ID == 0 { //需要创建新账号
  342. merchantAccount.MerchantOpenID = payTrans.MerchantOpenID
  343. merchantAccount.Version = 1
  344. merchantAccount.CreatedAt = time.Now()
  345. merchantAccount.UpdatedAt = time.Now()
  346. _, err = merchantAccount.Create()
  347. if err != nil {
  348. app.Error(c, 500, err, err.Error())
  349. return
  350. }
  351. }
  352. if payTrans.InvitationCode != shanghu.YuanShiMa { //校验c端客户
  353. var activeUser shanghu.ActiveUser
  354. var clientAccount shanghu.ActiveClientAccount
  355. activeUser.Code = payTrans.InvitationCode
  356. activeUserInfo, err := activeUser.GetUserInfoByCode()
  357. if err != nil {
  358. app.Error(c, 500, err, err.Error())
  359. return
  360. }
  361. clientAccount.ClientOpenID = activeUserInfo.OpenID
  362. clientAccountInfo, err := clientAccount.GetMerchantAccount()
  363. if err != nil && err.Error() != "record not found" {
  364. app.Error(c, 500, err, err.Error())
  365. return
  366. }
  367. if clientAccountInfo.ID == 0 { //需要创建新账号
  368. clientAccount.ClientOpenID = activeUserInfo.OpenID
  369. clientAccount.Version = 1
  370. clientAccount.CreatedAt = time.Now()
  371. clientAccount.UpdatedAt = time.Now()
  372. _, err = clientAccount.Create()
  373. if err != nil {
  374. app.Error(c, 500, err, err.Error())
  375. return
  376. }
  377. }
  378. }
  379. //分账 根据merchant-openid + activeUserInfo.openid 进行分账
  380. }
  381. }