editBatchReturn.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package order
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/date"
  5. "context"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "github.com/gogf/gf/v2/database/gdb"
  10. "github.com/gogf/gf/v2/errors/gerror"
  11. "github.com/gogf/gf/v2/frame/g"
  12. "github.com/gogf/gf/v2/util/gconv"
  13. "jyOrderManager/internal/consts"
  14. "jyOrderManager/internal/jyutil"
  15. "jyOrderManager/internal/logic/dayActivity"
  16. "jyOrderManager/internal/logic/product"
  17. "jyOrderManager/internal/model"
  18. "log"
  19. "math"
  20. "strings"
  21. "time"
  22. )
  23. var (
  24. AliProceduresMoney float64
  25. CorporateProceduresMoney float64
  26. WxProceduresMoney float64
  27. )
  28. func init() {
  29. WxProceduresMoney = g.Cfg().MustGet(context.Background(), "wxProceduresMoney").Float64()
  30. AliProceduresMoney = g.Cfg().MustGet(context.Background(), "aliProceduresMoney").Float64()
  31. CorporateProceduresMoney = g.Cfg().MustGet(context.Background(), "corporateProceduresMoney").Float64()
  32. }
  33. // EditBatchReturn 回款
  34. func EditBatchReturn(ctx context.Context, param model.OrdersEditBatchReturn) error {
  35. if param.OrderArr == nil {
  36. return errors.New("缺少关键参数")
  37. }
  38. orderArr := make(map[string]map[string]interface{})
  39. var (
  40. price, realPrice int //cbs回款
  41. )
  42. for _, value := range param.OrderArr {
  43. orderData, _ := g.DB().Ctx(ctx).GetOne(ctx, "select ((IFNULL(CASE WHEN a.is_backstage_order = 1 THEN a.pay_money ELSE a.order_money END, 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)+(select IFNULL(sum(payMoney),0) as return_money from moneyCorrection c where c.orderCode=a.order_code) as outstandingPayment, a.* from dataexport_order a where a.id=?", value["orderId"])
  44. if orderData.IsEmpty() {
  45. continue
  46. }
  47. orderDataMap := orderData.Map()
  48. if gconv.Int(value["money"]) > gconv.Int(orderDataMap["outstandingPayment"]) {
  49. return errors.New(gconv.String(orderDataMap["order_code"]) + "回款金额过大")
  50. }
  51. orderDataMap["realPrice"] = gconv.Int(value["money"]) //回款
  52. orderDataMap["returnVoucherUrl"] = param.ReturnVoucherUrl
  53. realPrice += gconv.Int(value["money"])
  54. orderArr[gconv.String(orderDataMap["order_code"])] = orderDataMap
  55. price += gconv.Int(orderDataMap["outstandingPayment"]) //剩余回款
  56. }
  57. transactionMap := make(map[string]interface{})
  58. var (
  59. money int
  60. )
  61. switch param.FlowType == 0 {
  62. case true:
  63. //流水回款
  64. //查询回款流水记录
  65. transactionData, _ := g.DB("cbs").Ctx(ctx).GetOne(ctx, fmt.Sprintf(`SELECT return_id,BNKNAM,BNKFLW,id,ACTNBR,TRSBAL,BNKTIM,OTHNAM,NUSAGE FROM transaction WHERE id = %d`, param.TransactionId))
  66. if transactionData.IsEmpty() {
  67. return errors.New("未找到该流水")
  68. }
  69. if price == 0 {
  70. return errors.New("订单回款失败,回款金额不符合")
  71. }
  72. money = int(math.Floor(gconv.Float64(transactionData.Map()["TRSBAL"]))*100 + 0.5) //流水
  73. log.Println("回款金额", money, price, realPrice)
  74. if realPrice > price || money != realPrice {
  75. return errors.New("订单回款失败,回款金额不符合")
  76. }
  77. transactionMap = transactionData.Map()
  78. case false: //手动回款
  79. if param.ReturnMoney != realPrice {
  80. return errors.New("订单回款失败,回款金额不符合")
  81. }
  82. }
  83. var (
  84. returnId, allReturnOrder []string
  85. )
  86. for key, value := range orderArr {
  87. var (
  88. orderCode = gconv.String(value["order_code"])
  89. returnMoney = gconv.Int(value["realPrice"])
  90. )
  91. //回款关闭相应的支付码支付
  92. //go CancelOnlinePay(orderCode)
  93. isFirst, _ := g.DB().Ctx(ctx).GetCount(ctx, fmt.Sprintf(`SELECT * FROM return_money_record WHERE state = 1 and order_code ='%s'`, orderCode))
  94. isFirstReturn := isFirst == 0
  95. insertData := map[string]interface{}{
  96. "order_code": key,
  97. "return_money": returnMoney,
  98. "return_invoice_status": 0,
  99. "return_voucher_url": value["returnVoucherUrl"],
  100. "operate_person": jyutil.GetUserMsgFromCtx(ctx).EntUserName,
  101. "operate_time": date.NowFormat(date.Date_Full_Layout),
  102. "flow_type": param.FlowType,
  103. "pay_account_name": param.PayAccountName,
  104. "state": 1,
  105. }
  106. updateData := make(map[string]interface{})
  107. switch param.ReturnType {
  108. case 1:
  109. insertData["procedures_money"] = math.Round(float64(param.ReturnMoney) * WxProceduresMoney / 100)
  110. case 2:
  111. if param.FlowType == 0 { //流水折扣
  112. insertData["procedures_money"] = math.Round(float64(param.ReturnMoney) * AliProceduresMoney / 100)
  113. }
  114. case 3:
  115. insertData["procedures_money"] = math.Round(float64(param.ReturnMoney) * CorporateProceduresMoney / 100)
  116. }
  117. switch param.FlowType == 0 {
  118. case true:
  119. updateData["pay_time"] = transactionMap["BNKTIM"]
  120. insertData["return_time"] = transactionMap["BNKTIM"]
  121. insertData["return_money"] = returnMoney
  122. insertData["return_type"] = 3
  123. insertData["return_remark"] = transactionMap["NUSAGE"]
  124. insertData["return_code"] = ""
  125. insertData["flow_money"] = money
  126. insertData["bank_flow"] = transactionMap["BNKFLW"]
  127. insertData["bank_name"] = transactionMap["BNKNAM"]
  128. case false:
  129. updateData["pay_time"] = param.BNKTIM
  130. insertData["return_time"] = param.BNKTIM
  131. insertData["return_money"] = returnMoney
  132. insertData["return_type"] = param.ReturnType
  133. insertData["return_remark"] = param.ReturnRemarks
  134. insertData["return_code"] = param.ReturnCode
  135. insertData["bank_flow"] = param.BNKFLW
  136. insertData["flow_money"] = param.ReturnMoney
  137. insertData["bank_name"] = param.BNKNAM
  138. }
  139. filterMap := gconv.Map(value["filter"])
  140. if filterMap == nil {
  141. filterMap = make(map[string]interface{})
  142. }
  143. filterMap["isAll"] = 1
  144. filter_map, _ := json.Marshal(filterMap)
  145. updateData["filter"] = string(filter_map)
  146. 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)
  147. refundData, _ := g.DB().Ctx(ctx).GetOne(ctx, `select IFNULL(sum(refund_money),0) as refund_money from refund_record where order_code=?`, key)
  148. return_moneys := gconv.Int(returnData.Map()["return_money"])
  149. refund_money := gconv.Int(refundData.Map()["refund_money"])
  150. if returnMoney+return_moneys == refund_money {
  151. updateData["refund_status"] = 1
  152. } else if returnMoney+return_moneys > refund_money && refund_money > 0 {
  153. updateData["refund_status"] = 2
  154. }
  155. if returnMoney == gconv.Int(value["outstandingPayment"]) {
  156. updateData["return_status"] = 1
  157. // p718 全额回款赠送抽奖机会
  158. if common.IntAll(updateData["return_status"]) == 1 && common.IntAll(value["return_status"]) != 1 {
  159. allReturnOrder = append(allReturnOrder, orderCode)
  160. }
  161. } else {
  162. updateData["return_status"] = 2
  163. }
  164. if gconv.Int(value["order_status"]) == 0 {
  165. updateData["order_status"] = 1
  166. }
  167. updateData["last_update_person"] = jyutil.GetUserMsgFromCtx(ctx).EntUserName
  168. updateData["last_update_time"] = date.NowFormat(date.Date_Full_Layout)
  169. _, err1 := g.DB().Ctx(ctx).Update(ctx, "dataexport_order", updateData, map[string]interface{}{"id": value["id"]})
  170. if err1 != nil {
  171. return err1
  172. }
  173. res, err3 := g.DB().Ctx(ctx).Insert(ctx, "return_money_record", insertData)
  174. if err3 != nil {
  175. return err3
  176. }
  177. id, _ := res.LastInsertId()
  178. returnId = append(returnId, fmt.Sprint(id))
  179. //修改成功,判断是否全额回款并且创建订单勾选回款开通权益
  180. if gconv.Int(value["return_status"]) != 1 && consts.PhoneRegex.MatchString(gconv.String(value["user_phone"])) && gconv.Int(updateData["return_status"]) == 1 {
  181. productDetail, _ := g.DB().Ctx(ctx).Query(ctx, fmt.Sprintf(`SELECT * FROM jy_order_detail WHERE order_code ='%s' and returned_open =1 and is_service_open = 0 and status =1`, orderCode))
  182. if !productDetail.IsEmpty() {
  183. uData, entId, userPositionId, err := jyutil.GetCreateUserData(gconv.String(value["user_phone"]), gconv.String(value["company_name"]), gconv.Int(value["buy_subject"]) == 2)
  184. if err != nil {
  185. return errors.New("用户企业信息初始化失败")
  186. }
  187. if err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  188. // 产品服务开通
  189. for _, m := range productDetail.List() {
  190. if !jyutil.IsServiceOpen(m) {
  191. continue
  192. }
  193. //参数注入
  194. m["userMap"] = map[string]interface{}{
  195. "userData": uData, "entId": entId, "userPositionId": userPositionId,
  196. }
  197. m["phone"] = value["user_phone"]
  198. m["order_code"] = orderCode
  199. m["reqCompanyName"] = value["company_name"]
  200. m["amount"] = m["final_price"]
  201. m["reqSubject"] = value["buy_subject"]
  202. m["linked_orderId"] = m["linked_detail_id"]
  203. productCode := gconv.String(m["product_code"])
  204. pFunc, err4 := product.JyProFunc.GetProductInitFuncByCode(productCode)
  205. if err4 != nil {
  206. return err4
  207. }
  208. pObj, err5 := pFunc(m)
  209. if err5 != nil {
  210. return gerror.Wrap(err5, fmt.Sprintf("获取%s商品异常", productCode))
  211. }
  212. if err = pObj.OpenService(ctx, time.Now()); err != nil {
  213. return err
  214. }
  215. }
  216. if gconv.Int(value["buy_subject"]) == 2 {
  217. uData["userId"] = userPositionId
  218. }
  219. if orderUserId := gconv.String(value["user_id"]); orderUserId == "" || orderUserId != gconv.String(uData["userId"]) || (gconv.Int(value["buy_subject"]) == 2 && gconv.Int64(value["ent_id"]) != entId) {
  220. log.Printf("同步更新订单用户身份:orderUserId:%s,userId:%v,entId:%d\n", orderUserId, uData["userId"], entId)
  221. upData := g.Map{
  222. "user_id": uData["userId"],
  223. }
  224. if entId > 0 { //企业服务
  225. upData["ent_id"] = entId
  226. if personPhone := gconv.String(value["personPhone"]); personPhone != "" {
  227. jyutil.EndAddUser(ctx, entId, gconv.String(value["user_phone"]), personPhone, gconv.String(value["personName"]))
  228. }
  229. }
  230. //更新订单
  231. _, err = g.DB().Update(ctx, consts.OrderListTableName, upData, "order_code=?", orderCode)
  232. }
  233. return nil
  234. }); err != nil {
  235. log.Println(err)
  236. return err
  237. }
  238. }
  239. }
  240. //首次回款销售业绩生效
  241. log.Printf("%s 回款销售业绩是否生效 %v", orderCode, isFirstReturn)
  242. if isFirstReturn {
  243. if err := CommonChange(ctx, orderCode, param.BNKTIM, ReturnMoney); err != nil {
  244. log.Printf("%s 回款销售业绩生效异常 %v", orderCode, err)
  245. }
  246. }
  247. //回款更新订单详情支付状态
  248. if _, err := g.DB().Update(ctx, "jy_order_detail", g.Map{
  249. "pay_status": 1,
  250. }, " order_code=?", id, orderCode); err != nil {
  251. log.Printf("%s 回款更新订单详情支付状态异常 %v", orderCode, err)
  252. }
  253. }
  254. log.Println("p718 ", allReturnOrder)
  255. for _, orderCode := range allReturnOrder {
  256. orderCodeRs, _ := g.DB().Query(ctx, `SELECT dor.user_id,dor.user_phone,jod.product_type,jod.service_type FROM dataexport_order dor
  257. LEFT JOIN jy_order_detail jod on jod.order_code = dor.order_code
  258. WHERE dor.order_code=?
  259. `, orderCode)
  260. if !orderCodeRs.IsEmpty() {
  261. var (
  262. nsqOrderState int
  263. newProductType, userId, userPhone string
  264. )
  265. for _, m := range orderCodeRs.List() {
  266. productType := gconv.String(m["product_type"])
  267. if (productType == "大会员" || productType == "VIP订阅") && gconv.Int(m["service_type"]) > 0 && gconv.Int(m["service_type"]) < 4 {
  268. newProductType = productType
  269. userId = gconv.String(m["user_id"])
  270. userPhone = gconv.String(m["user_phone"])
  271. nsqOrderState = gconv.Int(m["service_type"])
  272. break
  273. }
  274. }
  275. if nsqOrderState > 0 {
  276. go dayActivity.ActivityNsqPublish(newProductType, userId, userPhone, orderCode, nsqOrderState-1)
  277. }
  278. }
  279. }
  280. if param.FlowType == 0 {
  281. //修改回款流水记
  282. updateTransactionData := map[string]interface{}{
  283. "return_id": strings.Join(returnId, ","),
  284. "ISRELATION": 1,
  285. }
  286. _, err := g.DB("cbs").Ctx(ctx).Update(ctx, "transaction", updateTransactionData, map[string]interface{}{"id": transactionMap["id"]})
  287. if err != nil {
  288. return err
  289. }
  290. }
  291. return nil
  292. }