editBatchReturn.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package order
  2. import (
  3. "app.yhyue.com/moapp/jybase/date"
  4. "context"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "github.com/gogf/gf/v2/database/gdb"
  9. "github.com/gogf/gf/v2/errors/gerror"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/util/gconv"
  12. "jyOrderManager/internal/jyutil"
  13. "jyOrderManager/internal/logic/product"
  14. "jyOrderManager/internal/model"
  15. "log"
  16. "math"
  17. "strings"
  18. "time"
  19. )
  20. var (
  21. AliProceduresMoney float64
  22. CorporateProceduresMoney float64
  23. WxProceduresMoney float64
  24. )
  25. func init() {
  26. WxProceduresMoney = g.Cfg().MustGet(context.Background(), "wxProceduresMoney").Float64()
  27. AliProceduresMoney = g.Cfg().MustGet(context.Background(), "aliProceduresMoney").Float64()
  28. CorporateProceduresMoney = g.Cfg().MustGet(context.Background(), "corporateProceduresMoney").Float64()
  29. }
  30. // EditBatchReturn 回款
  31. func EditBatchReturn(ctx context.Context, param model.OrdersEditBatchReturn) error {
  32. if param.OrderArr == nil {
  33. return errors.New("缺少关键参数")
  34. }
  35. orderArr := make(map[string]map[string]interface{})
  36. var (
  37. price, realPrice int //cbs回款
  38. )
  39. for _, value := range param.OrderArr {
  40. orderData, _ := g.DB().Ctx(ctx).GetOne(ctx, "select (IFNULL( a.pay_money, 0 )-IFNULL(a.commission,0)-IFNULL(a.procedures_money,0))-(select IFNULL(sum(b.return_money),0) from return_money_record b where b.order_code=a.order_code and b.state=1) + (select IFNULL(sum(c.refund_money),0) from refund_record c where c.order_code=a.order_code) as outstandingPayment, a.* from dataexport_order a where a.id=?", value["orderId"])
  41. if orderData.IsEmpty() {
  42. continue
  43. }
  44. orderDataMap := orderData.Map()
  45. if gconv.Int(value["money"]) > gconv.Int(orderDataMap["outstandingPayment"]) {
  46. return errors.New(gconv.String(orderDataMap["order_code"]) + "回款金额过大")
  47. }
  48. orderDataMap["realPrice"] = gconv.Int(value["money"]) //回款
  49. orderDataMap["returnVoucherUrl"] = param.ReturnVoucherUrl
  50. realPrice += gconv.Int(value["money"])
  51. orderArr[gconv.String(orderDataMap["order_code"])] = orderDataMap
  52. price += gconv.Int(orderDataMap["outstandingPayment"]) //剩余回款
  53. }
  54. transactionMap := make(map[string]interface{})
  55. var (
  56. money int
  57. )
  58. switch param.FlowType == 0 {
  59. case true: //流水回款
  60. //查询回款流水记录
  61. transactionData, _ := g.DB().Ctx(ctx).GetOne(ctx, fmt.Sprintf(`SELECT returnId,BNKNAM,BNKFLW,id,ACTNBR,TRSBAL,BNKTIM,OTHNAM,NUSAGE FROM cbs.transaction WHERE id = %d`, param.TransactionId))
  62. if transactionData.IsEmpty() {
  63. return errors.New("未找到该流水")
  64. }
  65. if price == 0 {
  66. return errors.New("订单回款失败,回款金额不符合")
  67. }
  68. money = int(math.Floor(gconv.Float64(transactionData.Map()["TRSBAL"]))*100 + 0.5) //流水
  69. log.Println("回款金额", money, price, realPrice)
  70. if realPrice > price || money != realPrice {
  71. return errors.New("订单回款失败,回款金额不符合")
  72. }
  73. transactionMap = transactionData.Map()
  74. case false: //手动回款
  75. if param.ReturnMoney != realPrice {
  76. return errors.New("订单回款失败,回款金额不符合")
  77. }
  78. }
  79. var returnId []string
  80. return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  81. for key, value := range orderArr {
  82. var (
  83. orderCode = gconv.String(value["order_code"])
  84. returnMoney = gconv.Int(value["realPrice"])
  85. )
  86. //回款关闭相应的支付码支付
  87. //go CancelOnlinePay(orderCode)
  88. isFirst, _ := g.DB().Ctx(ctx).GetCount(ctx, fmt.Sprintf(`SELECT * FROM return_money_record WHERE state = 1 and order_code ='%s'`, orderCode))
  89. isFirstReturn := isFirst == 0
  90. insertData := map[string]interface{}{
  91. "order_code": key,
  92. "return_money": returnMoney,
  93. "return_invoice_status": 0,
  94. "return_voucher_url": value["returnVoucherUrl"],
  95. "operate_person": jyutil.GetUserMsgFromCtx(ctx).EntUserName,
  96. "operate_time": date.NowFormat(date.Date_Full_Layout),
  97. "flow_type": param.FlowType,
  98. "pay_account_name": param.PayAccountName,
  99. "state": 1,
  100. }
  101. switch param.ReturnType {
  102. case 1:
  103. insertData["procedures_money"] = math.Round(float64(param.ReturnMoney) * WxProceduresMoney / 100)
  104. case 2:
  105. if param.FlowType == 0 { //流水折扣
  106. insertData["procedures_money"] = math.Round(float64(param.ReturnMoney) * AliProceduresMoney / 100)
  107. }
  108. case 3:
  109. insertData["procedures_money"] = math.Round(float64(param.ReturnMoney) * CorporateProceduresMoney / 100)
  110. }
  111. switch param.FlowType == 0 {
  112. case true:
  113. insertData["return_time"] = transactionMap["BNKTIM"]
  114. insertData["return_time"] = transactionMap["BNKTIM"]
  115. insertData["return_money"] = returnMoney
  116. insertData["return_type"] = 3
  117. insertData["return_remark"] = transactionMap["NUSAGE"]
  118. insertData["return_code"] = ""
  119. insertData["flow_money"] = money
  120. insertData["bank_flow"] = transactionMap["BNKFLW"]
  121. insertData["bank_name"] = transactionMap["BNKNAM"]
  122. case false:
  123. insertData["return_time"] = param.BNKTIM
  124. insertData["return_money"] = returnMoney
  125. insertData["return_type"] = param.ReturnType
  126. insertData["return_remark"] = param.ReturnRemarks
  127. insertData["return_code"] = param.ReturnCode
  128. insertData["bank_flow"] = param.BNKFLW
  129. insertData["flow_money"] = param.ReturnMoney
  130. insertData["bank_name"] = param.BNKNAM
  131. }
  132. filterMap := gconv.Map(value["filter"])
  133. if filterMap == nil {
  134. filterMap = make(map[string]interface{})
  135. }
  136. filterMap["isAll"] = 1
  137. filter_map, _ := json.Marshal(filterMap)
  138. updateData := map[string]interface{}{
  139. "filter": string(filter_map),
  140. "pay_time": time.Now().Format("2006-01-02 15:04:05"),
  141. }
  142. returnData, _ := g.DB().Ctx(ctx).GetOne(ctx, `select IFNULL(sum(return_money),0) as return_money from return_money_record where order_code=? and state=1`, key)
  143. refundData, _ := g.DB().Ctx(ctx).GetOne(ctx, `select IFNULL(sum(refund_money),0) as refund_money from refund_record where order_code=?`, key)
  144. return_moneys := gconv.Int(returnData.Map()["return_money"])
  145. refund_money := gconv.Int(refundData.Map()["refund_money"])
  146. if returnMoney+return_moneys == refund_money {
  147. updateData["refund_status"] = 1
  148. } else if returnMoney+return_moneys > refund_money && refund_money > 0 {
  149. updateData["refund_status"] = 2
  150. }
  151. if returnMoney == gconv.Int(value["outstandingPayment"]) {
  152. updateData["return_status"] = 1
  153. } else {
  154. updateData["return_status"] = 2
  155. }
  156. if gconv.Int(value["order_status"]) == 0 {
  157. updateData["order_status"] = 1
  158. }
  159. _, err1 := g.DB().Ctx(ctx).Update(ctx, "dataexport_order", updateData, map[string]interface{}{"id": value["id"]})
  160. if err1 != nil {
  161. return err1
  162. }
  163. res, err2 := g.DB().Ctx(ctx).Insert(ctx, "return_money_record", insertData)
  164. if err2 != nil {
  165. return err2
  166. }
  167. //修改成功,判断是否全额回款并且创建订单勾选回款开通权益
  168. if gconv.Int(value["return_status"]) != 1 && gconv.Int(updateData["return_status"]) == 1 {
  169. productDetail, err := g.DB().Ctx(ctx).Query(ctx, fmt.Sprintf(`SELECT * FROM jy_order_detail WHERE order_code ='%s' and returned_open =1`, orderCode))
  170. if err != nil || productDetail.IsEmpty() {
  171. return err
  172. }
  173. // 产品服务开通
  174. for _, m := range productDetail.List() {
  175. if !jyutil.IsServiceOpen(m) {
  176. continue
  177. }
  178. //参数注入
  179. m["phone"] = value["user_phone"]
  180. m["order_code"] = orderCode
  181. m["reqCompanyName"] = value["company_name"]
  182. m["amount"] = m["final_price"]
  183. m["reqSubject"] = value["buy_subject"]
  184. productCode := gconv.String(m["product_code"])
  185. pFunc, err := product.JyProFunc.GetProductInitFuncByCode(productCode)
  186. if err != nil {
  187. return err
  188. }
  189. pObj, err := pFunc(m)
  190. if err != nil {
  191. return gerror.Wrap(err, fmt.Sprintf("获取%s商品异常", productCode))
  192. }
  193. if err := pObj.OpenService(ctx, time.Now()); err != nil {
  194. return err
  195. }
  196. }
  197. }
  198. id, _ := res.LastInsertId()
  199. returnId = append(returnId, fmt.Sprint(id))
  200. //首次回款销售业绩生效
  201. if isFirstReturn {
  202. if err := CommonChange(ctx, orderCode, param.BNKTIM, ReturnMoney); err != nil {
  203. log.Printf("%s 回款销售业绩生效异常 %v", orderCode, err)
  204. }
  205. }
  206. }
  207. if param.FlowType == 0 {
  208. //修改回款流水记
  209. updateTransactionData := map[string]interface{}{
  210. "return_id": strings.Join(returnId, ","),
  211. "ISRELATION": 1,
  212. }
  213. _, err := g.DB().Ctx(ctx).Update(ctx, "transaction", updateTransactionData, map[string]interface{}{"id": transactionMap["id"]})
  214. if err != nil {
  215. return err
  216. }
  217. }
  218. return nil
  219. })
  220. }