returnOnlineHandler.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package controller
  2. import (
  3. . "app.yhyue.com/moapp/jybase/api"
  4. "fmt"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/net/ghttp"
  8. "github.com/gogf/gf/v2/util/gconv"
  9. uuid2 "github.com/google/uuid"
  10. "github.com/pkg/errors"
  11. "jyOrderManager/internal/model"
  12. "regexp"
  13. "strings"
  14. "time"
  15. )
  16. func GetReturnOnlineHandler(r *ghttp.Request) {
  17. rData, err := func() (interface{}, error) {
  18. var param model.OrderReturnOnlineParams
  19. err := gconv.Struct(r.GetBody(), &param)
  20. if err != nil {
  21. return nil, errors.Wrap(err, "数据校验异常")
  22. }
  23. var (
  24. doType = param.DoType
  25. orderCode = param.OrderCode
  26. money = gconv.Int(param.Money)
  27. payWay = param.PayWay
  28. )
  29. orderRes, err := g.DB().GetOne(r.Context(), "SELECT buy_subject,user_phone,company_name,product_type,pay_money+(select IFNULL(sum(payMoney),0) as return_money from moneyCorrection where orderCode=?) as pay_money FROM dataexport_order WHERE order_code=?", orderCode, orderCode)
  30. if err != nil {
  31. return nil, gerror.Wrapf(err, "查询订单数据异常%s", orderCode)
  32. }
  33. calculationRes, err := g.DB().Query(r.Context(), "SELECT SUM(return_money) as returned_money FROM return_money_record WHERE order_code=? AND state=1", orderCode)
  34. if err != nil {
  35. return nil, gerror.Wrapf(err, "计算已回款出错%s", orderCode)
  36. }
  37. var (
  38. returnedMoney = gconv.Int(calculationRes.List()[0]["returned_money"])
  39. orderMap = orderRes.Map()
  40. payMoney = gconv.Int(orderMap["pay_money"])
  41. )
  42. switch doType {
  43. case "query":
  44. if gconv.Int(orderRes.Map()["pay_money"])-returnedMoney <= 0 {
  45. return nil, fmt.Errorf("待支付金额异常")
  46. }
  47. account, product := formatShow(orderMap)
  48. return map[string]interface{}{
  49. "product": product,
  50. "account": account,
  51. "money": payMoney - returnedMoney,
  52. }, nil
  53. case "getPay":
  54. if payMoney-returnedMoney-money < 0 {
  55. return nil, fmt.Errorf("待支付金额异常")
  56. }
  57. var (
  58. now = time.Now()
  59. exDay = now.AddDate(0, 0, 3)
  60. targetTime = time.Date(exDay.Year(), exDay.Month(), exDay.Day(), 23, 59, 59, 0, time.Local)
  61. token = uuid2.New().String()
  62. payPath string
  63. )
  64. switch payWay {
  65. case 1:
  66. payPath = "/weixin/pay/returnMoney"
  67. case 2:
  68. payPath = "/returnMoney/aliPage"
  69. default:
  70. return nil, fmt.Errorf("方式异常")
  71. }
  72. if _, err := g.DB().Insert(r.Context(), "return_money_online", map[string]interface{}{
  73. "status": 0,
  74. "token": token,
  75. "order_code": orderCode,
  76. "return_money": money,
  77. "expire_time": targetTime.Format("2006-01-02 15:04:05"),
  78. "creat_time": now.Format("2006-01-02 15:04:05"),
  79. }); err != nil {
  80. return nil, gerror.Wrapf(err, "保存回款数据异常")
  81. }
  82. return map[string]interface{}{
  83. "product": fmt.Sprintf("%s%s?token=%s", g.Cfg("global").MustGet(r.Context(), "webDomain.jy").String(), payPath, token),
  84. "expire": targetTime.Unix(),
  85. }, nil
  86. }
  87. return nil, fmt.Errorf("未知操作")
  88. }()
  89. if err != nil {
  90. g.Log().Errorf(r.Context(), "获取回款码异常 %v", err)
  91. }
  92. r.Response.WriteJson(NewResult(rData, err))
  93. }
  94. func formatShow(orderMap map[string]interface{}) (string, string) {
  95. var account string
  96. if company_name := gconv.String(orderMap["company_name"]); company_name != "" {
  97. account = company_name
  98. } else if phone := gconv.String(orderMap["user_phone"]); len(phone) == 11 && !strings.HasPrefix(phone, "9") {
  99. account = maskPhoneNumber(phone)
  100. }
  101. product := gconv.String(orderMap["product_type"])
  102. if product == "VIP订阅" {
  103. product = "超级订阅"
  104. }
  105. return account, product
  106. }
  107. func maskPhoneNumber(phoneNumber string) string {
  108. re := regexp.MustCompile(`(\d{3})\d{4}(\d{4})`)
  109. maskedNumber := re.ReplaceAllString(phoneNumber, "$1****$2")
  110. return maskedNumber
  111. }