active.pay.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  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. activeCancelSql.TransID = payTransInfo.ID
  245. num := activeCancelSql.GetActiveCancelNumByProjectID()
  246. fmt.Println("num = ", num)
  247. projectInfo.ProjectName = v.ProjectName
  248. projectInfo.TotalCancelNum = v.CancelNum
  249. projectInfo.PendingCancelNum = v.CancelNum - num
  250. projectInfo.ID = v.ID
  251. outData.GroupBuyProject = append(outData.GroupBuyProject, projectInfo)
  252. }
  253. app.OK(c, outData, app.Success)
  254. }
  255. // 拼团核销
  256. func GroupBuyCancel(c *gin.Context) {
  257. var inData models.GroupBuyCancelRequest
  258. var payTrans shanghu.ClientActivePayTrans
  259. var activeCancelLogList []shanghu.ActiveCancelLog
  260. err := c.ShouldBindJSON(&inData)
  261. if err != nil {
  262. app.Error(c, 400, err, err.Error())
  263. return
  264. }
  265. key := "GROU" + tools.MD5(inData.TradeNo+"zhangkun429@")
  266. if inData.Key != key {
  267. app.Error(c, 500, errors.New("数据错误"), "数据错误")
  268. return
  269. }
  270. //查交易
  271. payTrans.ThirdTradeNo = inData.TradeNo
  272. transInfo, err := payTrans.GetPayTransByThirdTradeNo()
  273. if err != nil {
  274. app.Error(c, 500, err, err.Error())
  275. return
  276. }
  277. //校验分账类型
  278. //if transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusUnSettle && transInfo.AccountStatus != shanghu.ClientActivePayTransAccountStatusSettleFail {
  279. // app.Error(c, 500, errors.New("核销已完成"), "核销已完成")
  280. // return
  281. //}
  282. // 校验支付类型
  283. if transInfo.Status != shanghu.ClientActivePayTransStatusPaySuccess {
  284. app.Error(c, 500, errors.New("未支付交易不准核销"), "未支付交易不准核销")
  285. return
  286. }
  287. if transInfo.AccountStatus == shanghu.ClientActivePayTransAccountStatusSettlePending {
  288. app.Error(c, 500, errors.New("正在分账中"), "正在分账中")
  289. return
  290. }
  291. //查看核销次数
  292. //是否可以核销,默认不可以核销,只要有一个可以核销就为true
  293. isCancel := false
  294. for _, v := range inData.GroupBuyProject {
  295. var projectSql shanghu.MerchantActiveGroupByProject
  296. var activeCancel shanghu.ActiveCancelLog
  297. projectSql.ID = v.ID
  298. projectInfo, err := projectSql.GetMerchantActiveGroupBuyProjectByID()
  299. if err != nil {
  300. app.Error(c, 500, err, err.Error())
  301. return
  302. }
  303. activeCancel.ClientOpenID = transInfo.ClientOpenID
  304. activeCancel.ActiveConfigID = transInfo.ActiveConfigID
  305. activeCancel.GroupByProjectID = v.ID
  306. activeCancel.TransID = transInfo.ID
  307. cancelNum := activeCancel.GetActiveCancelNumByProjectID()
  308. fmt.Println("cancelNum = ", cancelNum)
  309. fmt.Println("projectInfo.CancelNum = ", projectInfo.CancelNum)
  310. fmt.Println("v.CancelNum = ", v.CancelNum)
  311. if v.CancelNum <= 0 {
  312. continue
  313. }
  314. if projectInfo.CancelNum >= cancelNum+v.CancelNum && v.CancelNum > 0 {
  315. isCancel = true
  316. for i := 0; i < v.CancelNum; i++ {
  317. var activeCancelLogInfo shanghu.ActiveCancelLog
  318. activeCancelLogInfo.ActiveConfigID = transInfo.ActiveConfigID
  319. activeCancelLogInfo.ClientOpenID = transInfo.ClientOpenID
  320. activeCancelLogInfo.MerchantOpenID = inData.OpenId
  321. activeCancelLogInfo.GroupByProjectID = v.ID
  322. activeCancelLogInfo.TransID = transInfo.ID
  323. activeCancelLogInfo.CreatedAt = time.Now()
  324. activeCancelLogInfo.UpdatedAt = time.Now()
  325. activeCancelLogList = append(activeCancelLogList, activeCancelLogInfo)
  326. }
  327. } else {
  328. app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够")
  329. return
  330. }
  331. }
  332. if !isCancel {
  333. app.Error(c, 500, errors.New("核销次数不够"), "核销次数不够")
  334. return
  335. }
  336. // 分账
  337. if transInfo.AccountStatus == shanghu.ClientActivePayTransAccountStatusSettleSuccess {
  338. //不需要分账
  339. var activeCancel shanghu.ActiveCancelLog
  340. err = activeCancel.TXActiveCancelLogCreate(activeCancelLogList)
  341. if err != nil {
  342. app.Error(c, 500, err, err.Error())
  343. return
  344. }
  345. } else { // 需要分账
  346. // 分账中
  347. fmt.Println("分账中...")
  348. payTrans.ID = transInfo.ID
  349. payTrans.AccountStatus = shanghu.ClientActivePayTransAccountStatusSettlePending
  350. err = payTrans.UpdateAccountStatusByID()
  351. if err != nil {
  352. dataErr := make(map[string]interface{})
  353. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  354. dataErr["account_err_log"] = "修改分账中失败:" + err.Error() //分账失败日志
  355. dataErr["updated_at"] = time.Now()
  356. _ = payTrans.UpdateById(dataErr)
  357. app.Error(c, 500, err, err.Error())
  358. return
  359. }
  360. //校验是否被分过,分过后不再分账
  361. var merchantAccountLog shanghu.MerchantAccountLog
  362. merchantAccountLog.PayTransId = transInfo.ID
  363. merchantAccountLog.TransType = shanghu.MerchantAccountLogTransTypeGroupBuy
  364. num := merchantAccountLog.GetAccountLogNum()
  365. if num > 0 { //交易已经分过账
  366. dataErr := make(map[string]interface{})
  367. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  368. dataErr["account_err_log"] = "交易已分过账" //分账失败日志
  369. dataErr["updated_at"] = time.Now()
  370. _ = payTrans.UpdateById(dataErr)
  371. app.Error(c, 500, errors.New("交易已分过账"), "交易已分过账")
  372. return
  373. }
  374. //分账校验账号
  375. var merchantAccount shanghu.MerchantAccount
  376. merchantAccount.MerchantOpenID = transInfo.MerchantOpenID
  377. merchantAccountInfo, err := merchantAccount.GetMerchantAccount()
  378. if err != nil && err.Error() != "record not found" {
  379. dataErr := make(map[string]interface{})
  380. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  381. dataErr["account_err_log"] = "商家分账校验账号:" + err.Error() //分账失败日志
  382. dataErr["updated_at"] = time.Now()
  383. _ = payTrans.UpdateById(dataErr)
  384. app.Error(c, 500, err, err.Error())
  385. return
  386. }
  387. if merchantAccountInfo.ID == 0 { //需要创建新账号
  388. merchantAccount.MerchantOpenID = transInfo.MerchantOpenID
  389. merchantAccount.Version = 1
  390. merchantAccount.CreatedAt = time.Now()
  391. merchantAccount.UpdatedAt = time.Now()
  392. merchantAccount, err = merchantAccount.Create()
  393. if err != nil {
  394. dataErr := make(map[string]interface{})
  395. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  396. dataErr["account_err_log"] = "创建新的商家账号:" + err.Error() //分账失败日志
  397. dataErr["updated_at"] = time.Now()
  398. _ = payTrans.UpdateById(dataErr)
  399. app.Error(c, 500, err, err.Error())
  400. return
  401. }
  402. }
  403. var clientAccount shanghu.ActiveClientAccount
  404. if transInfo.InvitationCode != shanghu.YuanShiMa { //校验c端客户
  405. var activeUser shanghu.ActiveUser
  406. activeUser.Code = transInfo.InvitationCode
  407. activeUserInfo, err := activeUser.GetUserInfoByCode()
  408. if err != nil {
  409. dataErr := make(map[string]interface{})
  410. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  411. dataErr["account_err_log"] = "根据Code获取c端客户信息:" + transInfo.InvitationCode + err.Error() //分账失败日志
  412. dataErr["updated_at"] = time.Now()
  413. _ = payTrans.UpdateById(dataErr)
  414. app.Error(c, 500, err, err.Error())
  415. return
  416. }
  417. clientAccount.ClientOpenID = activeUserInfo.OpenID
  418. clientAccountInfo, err := clientAccount.GetActiveAccount()
  419. if err != nil && err.Error() != "record not found" {
  420. dataErr := make(map[string]interface{})
  421. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  422. dataErr["account_err_log"] = "获取c端客户账户:" + err.Error() //分账失败日志
  423. dataErr["updated_at"] = time.Now()
  424. _ = payTrans.UpdateById(dataErr)
  425. app.Error(c, 500, err, err.Error())
  426. return
  427. }
  428. if clientAccountInfo.ID == 0 { //需要创建新账号
  429. clientAccount.ClientOpenID = activeUserInfo.OpenID
  430. clientAccount.Version = 1
  431. clientAccount.CreatedAt = time.Now()
  432. clientAccount.UpdatedAt = time.Now()
  433. clientAccount, err = clientAccount.Create()
  434. if err != nil {
  435. dataErr := make(map[string]interface{})
  436. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  437. dataErr["account_err_log"] = "创建c端客户:" + err.Error() //分账失败日志
  438. dataErr["updated_at"] = time.Now()
  439. _ = payTrans.UpdateById(dataErr)
  440. app.Error(c, 500, err, err.Error())
  441. return
  442. }
  443. }
  444. }
  445. //分账 根据merchant-openid + activeUserInfo.openid 进行分账
  446. //商家分多少钱,客户分多少钱
  447. err = merchantAccount.ActiveCancelSettle(activeCancelLogList, merchantAccount, clientAccount, transInfo)
  448. if err != nil {
  449. dataErr := make(map[string]interface{})
  450. dataErr["account_status"] = shanghu.ClientActivePayTransAccountStatusSettleFail //分账失败
  451. dataErr["account_err_log"] = "分账失败:" + err.Error() //分账失败日志
  452. dataErr["updated_at"] = time.Now()
  453. _ = payTrans.UpdateById(dataErr)
  454. app.Error(c, 500, err, err.Error())
  455. return
  456. }
  457. }
  458. app.OK(c, nil, app.Success)
  459. }