returnOnlineHandler.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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/consts"
  12. "jyOrderManager/internal/logic/order"
  13. "jyOrderManager/internal/model"
  14. "regexp"
  15. "strings"
  16. "time"
  17. )
  18. func GetReturnOnlineHandler(r *ghttp.Request) {
  19. rData, err := func() (interface{}, error) {
  20. var param model.OrderReturnOnlineParams
  21. err := gconv.Struct(r.GetBody(), &param)
  22. if err != nil {
  23. return nil, errors.Wrap(err, "数据校验异常")
  24. }
  25. if param.PayType == consts.ReturnParamsPayTypeDeposit {
  26. return depositHandler(r, param)
  27. // 如果是保证金的
  28. }
  29. var (
  30. doType = param.DoType
  31. orderCode = param.OrderCode
  32. money = gconv.Int(param.Money)
  33. payWay = param.PayWay
  34. )
  35. 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)
  36. if err != nil {
  37. return nil, gerror.Wrapf(err, "查询订单数据异常%s", orderCode)
  38. }
  39. 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)
  40. if err != nil {
  41. return nil, gerror.Wrapf(err, "计算已回款出错%s", orderCode)
  42. }
  43. var (
  44. returnedMoney = gconv.Int(calculationRes.List()[0]["returned_money"])
  45. orderMap = orderRes.Map()
  46. payMoney = gconv.Int(orderMap["pay_money"])
  47. )
  48. switch doType {
  49. case "query":
  50. if gconv.Int(orderRes.Map()["pay_money"])-returnedMoney <= 0 {
  51. return nil, fmt.Errorf("待支付金额异常")
  52. }
  53. account, product := formatShow(orderMap)
  54. return map[string]interface{}{
  55. "product": product,
  56. "account": account,
  57. "money": payMoney - returnedMoney,
  58. }, nil
  59. case "getPay":
  60. if payMoney-returnedMoney-money < 0 {
  61. return nil, fmt.Errorf("待支付金额异常")
  62. }
  63. var (
  64. now = time.Now()
  65. exDay = now.AddDate(0, 0, 3)
  66. targetTime = time.Date(exDay.Year(), exDay.Month(), exDay.Day(), 23, 59, 59, 0, time.Local)
  67. token = uuid2.New().String()
  68. payPath string
  69. )
  70. switch payWay {
  71. case 1:
  72. payPath = "/weixin/pay/returnMoney"
  73. case 2:
  74. payPath = "/returnMoney/aliPage"
  75. default:
  76. return nil, fmt.Errorf("方式异常")
  77. }
  78. if _, err := g.DB().Insert(r.Context(), "return_money_online", map[string]interface{}{
  79. "status": 0,
  80. "token": token,
  81. "order_code": orderCode,
  82. "return_money": money,
  83. "expire_time": targetTime.Format("2006-01-02 15:04:05"),
  84. "creat_time": now.Format("2006-01-02 15:04:05"),
  85. }); err != nil {
  86. return nil, gerror.Wrapf(err, "保存回款数据异常")
  87. }
  88. return map[string]interface{}{
  89. "product": fmt.Sprintf("%s%s?token=%s", g.Cfg("global").MustGet(r.Context(), "webDomain.jy").String(), payPath, token),
  90. "expire": targetTime.Unix(),
  91. }, nil
  92. }
  93. return nil, fmt.Errorf("未知操作")
  94. }()
  95. if err != nil {
  96. g.Log().Errorf(r.Context(), "获取回款码异常 %v", err)
  97. }
  98. r.Response.WriteJson(NewResult(rData, err))
  99. }
  100. func depositHandler(r *ghttp.Request, param model.OrderReturnOnlineParams) (interface{}, error) {
  101. depositMoney, err := order.GetDepositMoney(r.Context(), param.OrderCode)
  102. if err != nil {
  103. return nil, gerror.Wrapf(err, "查询保证金异常%s", param.OrderCode)
  104. }
  105. if depositMoney == 0 {
  106. return nil, fmt.Errorf("未查询到保证金信息%s", param.OrderCode)
  107. }
  108. payMoney, err := order.GetDepositPayMoney(r.Context(), param.OrderCode)
  109. if err != nil {
  110. return nil, err
  111. }
  112. if payMoney > 0 {
  113. return nil, fmt.Errorf("该笔订单已收到保证金")
  114. }
  115. var (
  116. doType = param.DoType
  117. orderCode = param.OrderCode
  118. money = gconv.Int(param.Money)
  119. payWay = param.PayWay
  120. )
  121. 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)
  122. if err != nil {
  123. return nil, gerror.Wrapf(err, "查询订单数据异常%s", orderCode)
  124. }
  125. var (
  126. orderMap = orderRes.Map()
  127. )
  128. switch doType {
  129. case "query":
  130. account, product := formatShow(orderMap)
  131. return map[string]interface{}{
  132. "product": product,
  133. "account": account,
  134. "money": depositMoney,
  135. }, nil
  136. case "getPay":
  137. var (
  138. now = time.Now()
  139. exDay = now.AddDate(0, 0, 3)
  140. targetTime = time.Date(exDay.Year(), exDay.Month(), exDay.Day(), 23, 59, 59, 0, time.Local)
  141. token = uuid2.New().String()
  142. payPath string
  143. )
  144. // TODO 替换调配置
  145. switch payWay {
  146. case 1:
  147. payPath = "/weixin/pay/returnMoney"
  148. case 2:
  149. payPath = "/returnMoney/aliPage"
  150. default:
  151. return nil, fmt.Errorf("方式异常")
  152. }
  153. if _, err := g.DB().Insert(r.Context(), consts.OrderDepositOnlineTableName, map[string]interface{}{
  154. "status": 0,
  155. "token": token,
  156. "order_code": orderCode,
  157. "return_money": money,
  158. "expire_time": targetTime.Format("2006-01-02 15:04:05"),
  159. "creat_time": now.Format("2006-01-02 15:04:05"),
  160. }); err != nil {
  161. return nil, gerror.Wrapf(err, "保存回款数据异常")
  162. }
  163. return map[string]interface{}{
  164. "product": fmt.Sprintf("%s%s?token=%s", g.Cfg("global").MustGet(r.Context(), "webDomain.jy").String(), payPath, token),
  165. "expire": targetTime.Unix(),
  166. }, nil
  167. }
  168. return nil, fmt.Errorf("未知操作")
  169. }
  170. func formatShow(orderMap map[string]interface{}) (string, string) {
  171. var account string
  172. if company_name := gconv.String(orderMap["company_name"]); company_name != "" {
  173. account = company_name
  174. } else if phone := gconv.String(orderMap["user_phone"]); len(phone) == 11 && !strings.HasPrefix(phone, "9") {
  175. account = maskPhoneNumber(phone)
  176. }
  177. product := gconv.String(orderMap["product_type"])
  178. if product == "VIP订阅" {
  179. product = "超级订阅"
  180. }
  181. return account, product
  182. }
  183. func maskPhoneNumber(phoneNumber string) string {
  184. re := regexp.MustCompile(`(\d{3})\d{4}(\d{4})`)
  185. maskedNumber := re.ReplaceAllString(phoneNumber, "$1****$2")
  186. return maskedNumber
  187. }