active.pay.go 16 KB

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