active.pay.go 17 KB

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