active.pay.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  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. if transInfo.AccountStatus == shanghu.ClientActivePayTransAccountStatusSettlePending {
  284. app.Error(c, 500, errors.New("正在分账中"), "正在分账中")
  285. return
  286. }
  287. //查看核销次数
  288. //是否可以核销,默认不可以核销,只要有一个可以核销就为true
  289. isCancel := false
  290. for _, v := range inData.GroupBuyProject {
  291. var projectSql shanghu.MerchantActiveGroupByProject
  292. var activeCancel shanghu.ActiveCancelLog
  293. projectSql.ID = v.ID
  294. projectInfo, err := projectSql.GetMerchantActiveGroupBuyProjectByID()
  295. if err != nil {
  296. app.Error(c, 500, err, err.Error())
  297. return
  298. }
  299. cancelNum := activeCancel.GetActiveCancelNum()
  300. if projectInfo.CancelNum >= cancelNum+v.CancelNum && v.CancelNum > 0 {
  301. isCancel = true
  302. for i := 0; i < projectInfo.CancelNum; i++ {
  303. var activeCancelLogInfo shanghu.ActiveCancelLog
  304. activeCancelLogInfo.ActiveConfigID = transInfo.ActiveConfigID
  305. activeCancelLogInfo.ClientOpenID = transInfo.ClientOpenID
  306. activeCancelLogInfo.MerchantOpenID = inData.OpenId
  307. activeCancelLogInfo.GroupByProjectID = v.ID
  308. activeCancelLogInfo.CreatedAt = time.Now()
  309. activeCancelLogInfo.UpdatedAt = time.Now()
  310. activeCancelLogList = append(activeCancelLogList, activeCancelLogInfo)
  311. }
  312. }
  313. }
  314. if !isCancel {
  315. app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够")
  316. return
  317. }
  318. // 分账
  319. if transInfo.AccountStatus == shanghu.ClientActivePayTransAccountStatusSettleSuccess {
  320. //不需要分账
  321. var activeCancel shanghu.ActiveCancelLog
  322. err = activeCancel.TXActiveCancelLogCreate(activeCancelLogList)
  323. if err != nil {
  324. app.Error(c, 500, err, err.Error())
  325. return
  326. }
  327. } else { // 需要分账
  328. // 分账中
  329. payTrans.ID = transInfo.ID
  330. payTrans.AccountStatus = shanghu.ClientActivePayTransAccountStatusSettlePending
  331. err = payTrans.UpdateAccountStatusByID()
  332. if err != nil {
  333. dataErr := make(map[string]interface{})
  334. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  335. dataErr["account_err_log"] = "修改分账中失败:" + err.Error() //分账失败日志
  336. dataErr["updated_at"] = time.Now()
  337. _ = payTrans.UpdateById(dataErr)
  338. app.Error(c, 500, err, err.Error())
  339. return
  340. }
  341. //校验是否被分过,分过后不再分账
  342. var merchantAccountLog shanghu.MerchantAccountLog
  343. merchantAccountLog.PayTransId = transInfo.ID
  344. merchantAccountLog.TransType = shanghu.MerchantAccountLogTransTypeGroupBuy
  345. num := merchantAccountLog.GetAccountLogNum()
  346. if num > 0 { //交易已经分过账
  347. dataErr := make(map[string]interface{})
  348. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  349. dataErr["account_err_log"] = "交易已分过账" //分账失败日志
  350. dataErr["updated_at"] = time.Now()
  351. _ = payTrans.UpdateById(dataErr)
  352. app.Error(c, 500, errors.New("交易已分过账"), "交易已分过账")
  353. return
  354. }
  355. //分账校验账号
  356. var merchantAccount shanghu.MerchantAccount
  357. merchantAccount.MerchantOpenID = transInfo.MerchantOpenID
  358. merchantAccountInfo, err := merchantAccount.GetMerchantAccount()
  359. if err != nil && err.Error() != "record not found" {
  360. dataErr := make(map[string]interface{})
  361. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  362. dataErr["account_err_log"] = "商家分账校验账号:" + err.Error() //分账失败日志
  363. dataErr["updated_at"] = time.Now()
  364. _ = payTrans.UpdateById(dataErr)
  365. app.Error(c, 500, err, err.Error())
  366. return
  367. }
  368. if merchantAccountInfo.ID == 0 { //需要创建新账号
  369. merchantAccount.MerchantOpenID = payTrans.MerchantOpenID
  370. merchantAccount.Version = 1
  371. merchantAccount.CreatedAt = time.Now()
  372. merchantAccount.UpdatedAt = time.Now()
  373. merchantAccount, err = merchantAccount.Create()
  374. if err != nil {
  375. dataErr := make(map[string]interface{})
  376. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  377. dataErr["account_err_log"] = "创建新的商家账号:" + err.Error() //分账失败日志
  378. dataErr["updated_at"] = time.Now()
  379. _ = payTrans.UpdateById(dataErr)
  380. app.Error(c, 500, err, err.Error())
  381. return
  382. }
  383. }
  384. var clientAccount shanghu.ActiveClientAccount
  385. if transInfo.InvitationCode != shanghu.YuanShiMa { //校验c端客户
  386. var activeUser shanghu.ActiveUser
  387. activeUser.Code = transInfo.InvitationCode
  388. activeUserInfo, err := activeUser.GetUserInfoByCode()
  389. if err != nil {
  390. dataErr := make(map[string]interface{})
  391. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  392. dataErr["account_err_log"] = "根据Code获取c端客户信息:" + transInfo.InvitationCode + err.Error() //分账失败日志
  393. dataErr["updated_at"] = time.Now()
  394. _ = payTrans.UpdateById(dataErr)
  395. app.Error(c, 500, err, err.Error())
  396. return
  397. }
  398. clientAccount.ClientOpenID = activeUserInfo.OpenID
  399. clientAccountInfo, err := clientAccount.GetMerchantAccount()
  400. if err != nil && err.Error() != "record not found" {
  401. dataErr := make(map[string]interface{})
  402. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  403. dataErr["account_err_log"] = "获取c端客户账户:" + err.Error() //分账失败日志
  404. dataErr["updated_at"] = time.Now()
  405. _ = payTrans.UpdateById(dataErr)
  406. app.Error(c, 500, err, err.Error())
  407. return
  408. }
  409. if clientAccountInfo.ID == 0 { //需要创建新账号
  410. clientAccount.ClientOpenID = activeUserInfo.OpenID
  411. clientAccount.Version = 1
  412. clientAccount.CreatedAt = time.Now()
  413. clientAccount.UpdatedAt = time.Now()
  414. clientAccount, err = clientAccount.Create()
  415. if err != nil {
  416. dataErr := make(map[string]interface{})
  417. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  418. dataErr["account_err_log"] = "创建c端客户:" + err.Error() //分账失败日志
  419. dataErr["updated_at"] = time.Now()
  420. _ = payTrans.UpdateById(dataErr)
  421. app.Error(c, 500, err, err.Error())
  422. return
  423. }
  424. }
  425. }
  426. //分账 根据merchant-openid + activeUserInfo.openid 进行分账
  427. //商家分多少钱,客户分多少钱
  428. err = merchantAccount.ActiveCancelSettle(activeCancelLogList, merchantAccount, clientAccount, transInfo)
  429. if err != nil {
  430. dataErr := make(map[string]interface{})
  431. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  432. dataErr["account_err_log"] = "分账失败:" + err.Error() //分账失败日志
  433. dataErr["updated_at"] = time.Now()
  434. _ = payTrans.UpdateById(dataErr)
  435. app.Error(c, 500, err, err.Error())
  436. return
  437. }
  438. }
  439. app.OK(c, nil, app.Success)
  440. }