returnOnlineHandler.go 6.6 KB

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