コミットを比較

...

6 コミット

作成者 SHA1 メッセージ 日付
  huangjiajun 82a5772c0f 更新 4ヶ月前
  huangjiajun 1bebd31d24 更新 4ヶ月前
  huangjiajun 9025f3d707 更新 5ヶ月前
  huangjiajun 80663a67da 更新 5ヶ月前
  huangjiajun f3b93cc126 更新 5ヶ月前
  huangjiajun 47bf318d94 更新 5ヶ月前
69個のファイルの変更362行の追加11119行の削除
分割表示
  1. +15
    -0
      app/db/db_fin_user_flow.go
  2. +15
    -0
      app/db/db_guide_order_month_total.go
  3. +15
    -0
      app/db/db_withdraw_month_total.go
  4. +15
    -0
      app/db/model/guide_order_month_total.go
  5. +1
    -0
      app/db/model/ord_list.go
  6. +15
    -0
      app/db/model/withdraw_month_total.go
  7. +109
    -0
      consume/canal_fin_withdraw_apply_for_statistics.go
  8. +0
    -83
      consume/canal_guide_order_by_user_up_lv_consume.go
  9. +0
    -234
      consume/canal_guide_order_consume.go
  10. +140
    -0
      consume/canal_guide_order_for_statistics.go
  11. +0
    -123
      consume/canal_mall_ord_for_you_mi_shang.go
  12. +0
    -221
      consume/canal_order_consume.go
  13. +0
    -130
      consume/canal_user_virtual_coin_flow_consume.go
  14. +0
    -125
      consume/cloud_issuance_async_mlogin.go
  15. +0
    -72
      consume/cloud_issuance_msg_callback.go
  16. +0
    -77
      consume/consume.go
  17. +0
    -146
      consume/dou_shen_user_register_for_my_my_fans.go
  18. +0
    -207
      consume/dou_shen_user_register_for_my_my_recommender.go
  19. +0
    -194
      consume/dou_shen_user_register_for_official_consume.go
  20. +0
    -289
      consume/dou_shen_user_register_for_operation_center.go
  21. +0
    -68
      consume/dou_shen_user_register_for_user_register_up_lv.go
  22. +3
    -83
      consume/init.go
  23. +0
    -91
      consume/mall_add_supply_goods.go
  24. +7
    -558
      consume/md/consume_key.go
  25. +22
    -0
      consume/md/md_canal_fin_withdraw_apply_consume.go
  26. +5
    -0
      consume/md/md_canal_guide_order_consume.go
  27. +0
    -159
      consume/one_circles_activity_coin_auto_exchange_green_energy_consume.go
  28. +0
    -160
      consume/one_circles_activity_coin_auto_exchange_green_energy_for_team_consume.go
  29. +0
    -100
      consume/one_circles_settlement_public_activity_coin_consume.go
  30. +0
    -66
      consume/one_circles_sign_in_consume.go
  31. +0
    -66
      consume/one_circles_sign_in_copy_consume.go
  32. +0
    -97
      consume/one_circles_start_level_dividend_consume.go
  33. +0
    -125
      consume/super_cloud_issuance_async_mlogin.go
  34. +0
    -72
      consume/super_cloud_issuance_msg_callback.go
  35. +0
    -227
      consume/supply_cloud_chain_fenxiao_new_change.go
  36. +0
    -100
      consume/withdraw_consume.go
  37. +0
    -165
      consume/withdraw_consume_gongmao.go
  38. +0
    -185
      consume/withdraw_consume_pupiao.go
  39. +0
    -679
      consume/zhios_acquisition_condition.go
  40. +0
    -59
      consume/zhios_acquisition_condition_dev.go
  41. +0
    -326
      consume/zhios_appreciation.go
  42. +0
    -168
      consume/zhios_capital_pool_order_total.go
  43. +0
    -263
      consume/zhios_express_order_fail.go
  44. +0
    -217
      consume/zhios_fast_return_order_pay.go
  45. +0
    -168
      consume/zhios_fast_return_order_refund.go
  46. +0
    -163
      consume/zhios_fast_return_order_refund_second.go
  47. +0
    -100
      consume/zhios_fast_return_order_success.go
  48. +0
    -315
      consume/zhios_guide_store_order_success.go
  49. +0
    -67
      consume/zhios_installment_payment_auto_repaid_consume.go
  50. +0
    -138
      consume/zhios_integral_proxy_recharge.go
  51. +0
    -90
      consume/zhios_mall_green_coin_consume.go
  52. +0
    -120
      consume/zhios_one_circles_coin_consume.go
  53. +0
    -646
      consume/zhios_order_buckle.go
  54. +0
    -623
      consume/zhios_order_free.go
  55. +0
    -373
      consume/zhios_order_hjy.go
  56. +0
    -190
      consume/zhios_order_settle_total.go
  57. +0
    -166
      consume/zhios_order_total.go
  58. +0
    -313
      consume/zhios_order_total_second.go
  59. +0
    -258
      consume/zhios_recharge_order_fail.go
  60. +0
    -154
      consume/zhios_recharge_order_fail_dev.go
  61. +0
    -214
      consume/zhios_supplier_after_order.go
  62. +0
    -102
      consume/zhios_task_total.go
  63. +0
    -160
      consume/zhios_tikTok_goods_update.go
  64. +0
    -160
      consume/zhios_user_relate.go
  65. +0
    -86
      consume/zhios_user_up_lv.go
  66. +0
    -172
      consume/zhios_user_visit_ip_address_consume.go
  67. +0
    -187
      consume/zhios_valid_user.go
  68. +0
    -144
      consume/zhios_withdraw_reward.go
  69. +0
    -75
      consume/zhios_youmishang_exchange_store.go

+ 15
- 0
app/db/db_fin_user_flow.go ファイルの表示

@@ -0,0 +1,15 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

func GetFinUserFlow(sess *xorm.Session, id string) *model.FinUserFlow {
var data model.FinUserFlow
get, err := sess.Where("id=?", id).Get(&data)
if get == false || err != nil {
return nil
}
return &data
}

+ 15
- 0
app/db/db_guide_order_month_total.go ファイルの表示

@@ -0,0 +1,15 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

func GetGuideOrderMonthTotal(sess *xorm.Session, month, unionType string) *model.GuideOrderMonthTotal {
var data model.GuideOrderMonthTotal
get, err := sess.Where("month=? and union_type=?", month, unionType).Get(&data)
if get == false || err != nil {
return nil
}
return &data
}

+ 15
- 0
app/db/db_withdraw_month_total.go ファイルの表示

@@ -0,0 +1,15 @@
package db

import (
"applet/app/db/model"
"xorm.io/xorm"
)

func GetWithdrawMonthTotal(sess *xorm.Session, month string) *model.WithdrawMonthTotal {
var data model.WithdrawMonthTotal
get, err := sess.Where("month=? ", month).Get(&data)
if get == false || err != nil {
return nil
}
return &data
}

+ 15
- 0
app/db/model/guide_order_month_total.go ファイルの表示

@@ -0,0 +1,15 @@
package model

import (
"time"
)

type GuideOrderMonthTotal struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Month int `json:"month" xorm:"default 0 comment('202407') INT(11)"`
UnionSettleAmount string `json:"union_settle_amount" xorm:"default 0.00 comment('联盟结算') DECIMAL(20,2)"`
StationSettleAmount string `json:"station_settle_amount" xorm:"default 0.000000 comment('平台结算') DECIMAL(20,6)"`
UnionType string `json:"union_type" xorm:"default 0.000000 comment('平台结算') VARCHAR(255)"`
CreateAt time.Time `json:"create_at" xorm:"DATETIME"`
UpdateAt time.Time `json:"update_at" xorm:"DATETIME"`
}

+ 1
- 0
app/db/model/ord_list.go ファイルの表示

@@ -60,4 +60,5 @@ type OrdList struct {
OrderFormType int `xorm:"not null default 0 INT(1)" json:"order_form_type"`
HjyOid int `xorm:"not null default 0 INT(11)" json:"hjy_oid"`
TikTokTeamRealCommission string `json:"tik_tok_team_real_commission" xorm:"not null default 0.00 comment('') DECIMAL(20,8)"`
Ext string `json:"ext" xorm:"not null default 0.00 comment('') varchar(255)"`
}

+ 15
- 0
app/db/model/withdraw_month_total.go ファイルの表示

@@ -0,0 +1,15 @@
package model

import (
"time"
)

type WithdrawMonthTotal struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Month int `json:"month" xorm:"default 0 comment('202407') INT(11)"`
WithdrawAmount string `json:"withdraw_amount" xorm:"default 0.00 comment('平台提现') DECIMAL(20,2)"`
CreateAt time.Time `json:"create_at" xorm:"DATETIME"`
UpdateAt time.Time `json:"update_at" xorm:"DATETIME"`
RealWithdrawAmount string `json:"real_withdraw_amount" xorm:"default 0.00 DECIMAL(20,2)"`
Fee string `json:"fee" xorm:"default 0.00 DECIMAL(20,2)"`
}

+ 109
- 0
consume/canal_fin_withdraw_apply_for_statistics.go ファイルの表示

@@ -0,0 +1,109 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/cc14514/go-geoip2"
geoip2db "github.com/cc14514/go-geoip2-db"
"github.com/streadway/amqp"
"strings"
"time"
)

func CanalFinWithdrawApplyForStatistics(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(500)
delivery := ch.Consume(queue.Name, true) //设置自动应答

geoIp2db, _ := geoip2db.NewGeoipDbByStatik()
defer geoIp2db.Close()

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>>>CanalGuideOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = CanalFinWithdrawApplyForStatisticsDetail(res.Body, geoIp2db)
//_ = res.Reject(false)
//_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func CanalFinWithdrawApplyForStatisticsDetail(msg []byte, geoIp2db *geoip2.DBReader) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalFinWithdrawApplyMessage[md.CanalFinWithdrawApply]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

//2、判断操作(目前只针对insert进行修改)
if canalMsg.Type == md.CanalMsgUpdateSqlType {
//4、构造数据结构体 && 插入es文档
masterId := strings.Split(canalMsg.Database, "_")[1]
sess := db.DBs[masterId].NewSession()
defer sess.Close()
sess.Begin()
for _, data := range canalMsg.Data {
if utils.InArr(data.State, []string{"2", "3"}) {
flow := db.GetFinUserFlow(sess, data.Id)
fee := "0"
if flow != nil {
fee = flow.SysFee
}
WithdrawAmount := data.Amount
RealWithdrawAmount := data.Amount
if data.FeeType == "1" {
RealWithdrawAmount = utils.Float64ToStrByPrec(utils.StrToFloat64(RealWithdrawAmount)-utils.StrToFloat64(fee), 6)
}
month := utils.TimeParseStd(data.CreateAt).Format("200601")
total := db.GetWithdrawMonthTotal(sess, month)
if total == nil {
total = &model.WithdrawMonthTotal{
Month: utils.StrToInt(month),
WithdrawAmount: "",
CreateAt: utils.TimeParseStd(data.CreateAt),
UpdateAt: time.Now(),
}
_, err = sess.Insert(total)
if err != nil {
sess.Rollback()
return err
}
}
total.Fee = utils.Float64ToStrByPrec(utils.StrToFloat64(total.Fee)+utils.StrToFloat64(fee), 6)
total.WithdrawAmount = utils.Float64ToStrByPrec(utils.StrToFloat64(total.WithdrawAmount)+utils.StrToFloat64(WithdrawAmount), 6)
total.RealWithdrawAmount = utils.Float64ToStrByPrec(utils.StrToFloat64(total.RealWithdrawAmount)+utils.StrToFloat64(RealWithdrawAmount), 6)
_, err = sess.Where("id=?", total.Id).Update(total)
if err != nil {
sess.Rollback()
return err
}
}
}
sess.Commit()
}
return nil
}

+ 0
- 83
consume/canal_guide_order_by_user_up_lv_consume.go ファイルの表示

@@ -1,83 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
)

func CanalGuideOrderByUserUpLvConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1000)
delivery := ch.Consume(queue.Name, true) //设置自动应答

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>>>CanalGuideOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
handleCanalGuideOrderByUserUpLvConsume(res.Body)
//_ = res.Reject(false)
//_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCanalGuideOrderByUserUpLvConsume(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalOrderMessage[md.CanalGuideOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return nil
}

masterId := strings.Split(canalMsg.Database, "_")[1]
uids := make([]string, 0)
for _, data := range canalMsg.Data {
uids = append(uids, data.Uid)
}
eg := db.DBs[masterId]
if eg == nil {
return nil
}
levelList, _ := db.UserLevlEgAll(eg)
isAuto := 0
for _, v := range levelList {
if v.AutoUpdate == 1 {
isAuto = 1
}
}
if isAuto == 0 {
return nil
}
for _, v := range uids {
FindUser(eg, v, masterId, levelList)
oneUser, _ := db.UserProfileFindByID(eg, v)
if oneUser == nil || (oneUser != nil && oneUser.ParentUid == 0) {
continue
}
FindUser(eg, utils.IntToStr(oneUser.ParentUid), masterId, levelList)
}
return nil
}

+ 0
- 234
consume/canal_guide_order_consume.go ファイルの表示

@@ -1,234 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
esMd "applet/es/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/cc14514/go-geoip2"
geoip2db "github.com/cc14514/go-geoip2-db"
"github.com/streadway/amqp"
"net"
"strings"
"time"
"xorm.io/xorm"
)

func CanalGuideOrderConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(500)
delivery := ch.Consume(queue.Name, true) //设置自动应答

geoIp2db, _ := geoip2db.NewGeoipDbByStatik()
defer geoIp2db.Close()

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>>>CanalGuideOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleGuideOrdTable(res.Body, geoIp2db)
//_ = res.Reject(false)
//_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleGuideOrdTable(msg []byte, geoIp2db *geoip2.DBReader) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalOrderMessage[md.CanalGuideOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

//2、判断操作(目前只针对insert进行修改)
if canalMsg.Type == md.CanalMsgInsertSqlType {
//3、TODO::判断es索引是否创建(因为这里我已经手动创建了,省略此步骤)
//err := es.CreateIndexIfNotExists(esMd.ZhiosOrdersEsIndex, esMd.ZhiosOrdersEsMapping)
//if err != nil {
// panic(err)
//}

//4、构造数据结构体 && 插入es文档
masterId := strings.Split(canalMsg.Database, "_")[1]
for _, data := range canalMsg.Data {
var uniqueId = masterId + "_" + data.OrdId //es的唯一键,每个文档必须要有唯一键
user, err := db.UserFindByID(db.DBs[masterId], data.Uid)
if err != nil {
return err
}
provinceId, cityId, countyId, provinceName, cityName, countyName := getUserAddress(db.DBs[masterId], data.Uid, geoIp2db)
now := time.Now()
esData := esMd.ZhiosOrdersEs{
OrdKind: "guide",
MasterId: utils.StrToInt(masterId),
OrdId: data.OrdId,
MainOrdId: data.ParentOrdId,
StoreOrdId: data.PvdOid,
GoodsId: data.ItemId,
Uid: data.Uid,
BuyerPhone: user.Phone,
CostPrice: utils.StrToFloat64(data.PaidPrice),
//Gmv: utils.StrToFloat64(data.CostPrice) * float64(utils.StrToInt(data.ItemNum)),
Gmv: utils.StrToFloat64(data.PaidPrice),
State: int32(utils.StrToInt(data.State)),
StateZh: md.CanalGuideOrderState(int32(utils.StrToInt(data.State))).String(),
GoodsNum: utils.StrToInt(data.ItemNum),
PayChannel: 0,
PayChannelZh: "",
ReceiverPhone: user.Phone,
ReceiverName: user.Nickname,
ReceiverAddressDetail: "",
ProvinceId: provinceId,
CityId: cityId,
CountyId: countyId,
Province: provinceName,
City: cityName,
County: countyName,
OrderType: int32(utils.StrToInt(data.OrderType)),
EstimateCommission: utils.StrToFloat64(data.SysCommission),
LogisticCompany: "",
PayTime: "",
OrdCreateTime: utils.TimeToStr(data.CreateAt),
CreatedAt: now.Format("2006-01-02 15:04:05"),
UpdatedAt: now.Format("2006-01-02 15:04:05"),
}
if esData.GoodsNum == 0 {
esData.GoodsNum = 1
}
if esData.PayTime == "" {
esData.PayTime = "1970-01-01 00:00:00"
}
createDocRet, err := es.CreateDoc(esMd.ZhiosOrdersEsIndex, uniqueId, esData)
if err != nil {
return err
}
fmt.Printf("CreateDoc CanalGuide ==> %+v \n\n", createDocRet)
}
}
return nil
}

func getUserAddress(Db *xorm.Engine, uid string, geoIp2db *geoip2.DBReader) (provinceId, cityId, countyId, provinceName, cityName, countyName string) {
regionalAgentUserBelong, err := db.RegionalAgentUserBelongGetOneByParams(Db, map[string]interface{}{
"key": "uid",
"value": uid,
})
if err != nil {
return
}
if regionalAgentUserBelong == nil {
//TODO::没开区域代理的,使用用户ip归属地
userLoginIpList, err := db.UserLoginIpListGetOneByParams(Db, map[string]interface{}{
"key": "uid",
"value": uid,
})
if err != nil || userLoginIpList == nil {
provinceName = "广东省"
provinceId = "440000000000"
return
}

utils.FilePutContents("getUserAddress", utils.SerializeStr(userLoginIpList))
record, _ := geoIp2db.City(net.ParseIP(userLoginIpList.NowIp))
if record.Country.Names != nil && record.Subdivisions != nil && record.City.Names != nil {
province, err := db.ProvinceGetOneByName(record.Subdivisions[0].Names["zh-CN"])
if err != nil {
return
}
provinceId = province.Id
provinceName = province.Name

city, err := db.CityGetOneByName(record.City.Names["zh-CN"])
if err != nil {
return
}
cityId = city.Id
cityName = city.Name
return
}
//TODO::没开区域代理的,默认归属到广东
provinceName = "广东省"
provinceId = "440000000000"
return
}
var regionalId int64
if regionalAgentUserBelong.DistrictId != 0 {
regionalId = regionalAgentUserBelong.DistrictId
} else {
regionalId = int64(regionalAgentUserBelong.RegionId)
}
regionalAgentRegion, err := db.RegionalAgentRegionGetOneByParams(Db, map[string]interface{}{
"key": "id",
"value": regionalId,
})
if err != nil || regionalAgentRegion.WebsiteRegionId == "" {
return "", "", "", "", "", ""
}
switch regionalAgentRegion.Level {
case 1:
province, err := db.ProvinceGetOne(regionalAgentRegion.WebsiteRegionId)
if err != nil {
return "", "", "", "", "", ""
}
provinceId = province.Id
provinceName = province.Name
break
case 2:
city, err := db.CityGetOne(regionalAgentRegion.WebsiteRegionId)
if err != nil {
return "", "", "", "", "", ""
}
province, err := db.ProvinceGetOne(city.ProvinceId)
if err != nil {
return "", "", "", "", "", ""
}
provinceId = province.Id
provinceName = province.Name
cityId = city.Id
cityName = city.Name
break
case 3:
county, err := db.CountyGetOne(regionalAgentRegion.WebsiteRegionId)
if err != nil {
return "", "", "", "", "", ""
}
city, err := db.CityGetOne(county.CityId)
if err != nil {
return "", "", "", "", "", ""
}
province, err := db.ProvinceGetOne(city.ProvinceId)
if err != nil {
return "", "", "", "", "", ""
}
provinceId = province.Id
provinceName = province.Name
cityId = city.Id
cityName = city.Name
countyId = county.Id
countyName = county.Name
break
}
return
}

+ 140
- 0
consume/canal_guide_order_for_statistics.go ファイルの表示

@@ -0,0 +1,140 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/cc14514/go-geoip2"
geoip2db "github.com/cc14514/go-geoip2-db"
"github.com/streadway/amqp"
"strings"
"time"
"xorm.io/xorm"
)

func CanalGuideOrderForStatistics(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, true) //设置自动应答

geoIp2db, _ := geoip2db.NewGeoipDbByStatik()
defer geoIp2db.Close()

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>>>CanalGuideOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = CanalGuideOrderForStatisticsDetail(res.Body, geoIp2db)
//_ = res.Reject(false)
//_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func CanalGuideOrderForStatisticsDetail(msg []byte, geoIp2db *geoip2.DBReader) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalOrderMessage[md.CanalGuideOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

//2、判断操作(目前只针对update进行修改)
if canalMsg.Type == md.CanalMsgUpdateSqlType {
//4、构造数据结构体 && 插入es文档
masterId := strings.Split(canalMsg.Database, "_")[1]
sess := db.DBs[masterId].NewSession()
defer sess.Close()
sess.Begin()
for _, data := range canalMsg.Data {

if utils.StrToInt(data.PvdSettleAt) > 0 && strings.Contains(data.Ext, "pvd_settle_at") == false {
err = comm(sess, data.OrdId, data.BenefitAll, "pvd_settle_at", data.PvdSettleAt, data.Pvd)
if err != nil {
sess.Rollback()
return err
}
}
if utils.StrToInt(data.SettleAt) > 0 && strings.Contains(data.Ext, "station_settle_at") == false {
err = comm(sess, data.OrdId, data.BenefitAll, "station_settle_at", data.SettleAt, data.Pvd)
if err != nil {
sess.Rollback()
return err
}
}
}
sess.Commit()
}
return nil
}
func comm(sess *xorm.Session, oid, commission, types, times, pvd string) error {
byOid, _ := db.OrderListByOid(sess, oid)
if byOid == nil {
return nil
}
if strings.Contains(byOid.Ext, "station_settle_at") && types == "station_settle_at" {
return nil
}
if strings.Contains(byOid.Ext, "pvd_settle_at") && types == "pvd_settle_at" {
return nil
}
extData := make(map[string]interface{})
json.Unmarshal([]byte(byOid.Ext), &extData)
extData[types] = types
byOid.Ext = utils.SerializeStr(extData)
_, err2 := sess.Where("ord_id=?", byOid.OrdId).Cols("ext").Update(byOid)
if err2 != nil {
return err2
}
month := time.Unix(utils.StrToInt64(times), 0).Format("200601")
total := db.GetGuideOrderMonthTotal(sess, month, pvd)
if total == nil {
total = &model.GuideOrderMonthTotal{
Month: utils.StrToInt(month),
UnionType: pvd,
CreateAt: time.Unix(utils.StrToInt64(times), 0),
UpdateAt: time.Now(),
}
_, err := sess.Insert(total)
if err != nil {
return err
}
}
if types == "station_settle_at" {
sql := `select sum(amount) as amount from ord_list_relate where oid=%s `
sql = fmt.Sprintf(sql, oid)
data, _ := db.QueryNativeStringWithSession(sess, sql)
if len(data) > 0 {
total.StationSettleAmount = utils.Float64ToStrByPrec(utils.StrToFloat64(total.StationSettleAmount)+utils.StrToFloat64(data[0]["amount"]), 6)
}
}
if types == "pvd_settle_at" {
total.UnionSettleAmount = utils.Float64ToStrByPrec(utils.StrToFloat64(total.UnionSettleAmount)+utils.StrToFloat64(commission), 6)
}
_, err := sess.Where("id=?", total.Id).Update(total)
if err != nil {
return err
}
return nil
}

+ 0
- 123
consume/canal_mall_ord_for_you_mi_shang.go ファイルの表示

@@ -1,123 +0,0 @@
package consume

import (
"applet/app/db"
model2 "applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git/db/model"
zyos_go_condition_hdl "code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git/hdl"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/jinzhu/copier"
"github.com/streadway/amqp"
"strings"
"xorm.io/xorm"
)

func CanalMallOrdForYouMiShang(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(10)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCanalMallOrdForYouMiShang(res.Body)
//_ = res.Reject(false)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCanalMallOrdForYouMiShang(msg []byte) error {
var canalMsg *md.CanalMallOrdForYouMiShang
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
fmt.Println("=======================", err)
return err
}
database := strings.ReplaceAll(canalMsg.Database, "zhios_", "")
if utils.InArr(database, []string{"88164961"}) == false {

return nil
}
fmt.Println("==========================", 123333)

eg := db.DBs[database]
levelList, _ := db.UserLevlEgAll(eg)
userId := make(map[string]string, 0)
for _, v := range canalMsg.Data {
if utils.StrToInt(v.Uid) == 0 || utils.InArr(v.State, []string{"1", "2", "3"}) == false {
continue
}
userId[v.Uid] = v.Uid
}
fmt.Println(userId)
for _, v := range userId {
FindUser(eg, v, database, levelList)
oneUser, _ := db.UserProfileFindByID(eg, v)
if oneUser == nil || (oneUser != nil && oneUser.ParentUid == 0) {
continue
}
FindUser(eg, utils.IntToStr(oneUser.ParentUid), database, levelList)
}
return nil
}
func FindUser(eg *xorm.Engine, uid string, dbName string, levelList []*model2.UserLevel) {
oneUser, _ := db.UserFindByID(eg, uid)
if oneUser == nil {
return
}
if oneUser.IsNotUpLevel == 1 {
return
}
levelWeight := 0
for _, v1 := range levelList {
if v1.Id == oneUser.Level {
levelWeight = v1.LevelWeight
}
}
nextLv := ""
for _, v1 := range levelList {
if v1.LevelWeight <= levelWeight || v1.AutoUpdate == 0 { //小于当前等级或没开自动升级的都跳过
continue
}
if nextLv == "" {
nextLv = utils.IntToStr(v1.Id)
}
}
if nextLv != "" {
DataDetail1 := md2.DataDetail{
AgentType: nextLv,
Comment: "自动等级",
MasterId: dbName,
Uid: utils.IntToStr(oneUser.Uid),
IsChangeTime: "1",
}
var info model.User
copier.Copy(&info, &oneUser)
fmt.Println(DataDetail1)
zyos_go_condition_hdl.CommUplv(map[string]string{}, "", eg, dbName, &info, oneUser.Level, DataDetail1)
}
}

+ 0
- 221
consume/canal_order_consume.go ファイルの表示

@@ -1,221 +0,0 @@
package consume

import (
"applet/app/db"
model2 "applet/app/db/gim/model"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
esMd "applet/es/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
"time"
)

func CanalOrderConsumev2(queue md.MqQueue) {
var list []model.DouShenImGroup
err := db.Db.Where("kind =2 and id = 43140").Find(&list)
eg := db.DBs["68823769"]
for _, v := range list {
var m model.RegionalAgentUser
has, err := eg.Where("uid =?", v.Uid).Get(&m)
if err != nil {
panic(err)
}
if !has {
fmt.Println(">>>", v)
}
var group model2.Group
has, err = db.ImDb.Where("id =?", v.GroupId).Get(&group)
if err != nil {
panic(err)
}
if !has {
fmt.Println("<<<", v)
}
regionalAgentRegion, err := db.RegionalAgentRegionGetOneByParams(eg, map[string]interface{}{
"key": "id",
"value": m.RegionId,
})
if err != nil {
panic(err)
}
groupName := "抖省" + regionalAgentRegion.Name + "运营中心【1】群"
group.Name = groupName
_, err = db.ImDb.Where("id =?", v.GroupId).Cols("name").Update(group)
if err != nil {
panic(err)
}

v.Name = groupName
_, err = db.Db.Where("id =?", v.Id).Cols("name").Update(v)
if err != nil {
panic(err)
}
}

return
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleMallOrdTable(res.Body)
//_ = res.Reject(false)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func CanalOrderConsume(queue md.MqQueue) {
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(100)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleMallOrdTable(res.Body)
//_ = res.Reject(false)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleMallOrdTable(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalOrderMessage[md.CanalOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}
//2、判断操作(目前只针对insert进行修改)
if canalMsg.Type == md.CanalMsgInsertSqlType {
//3、TODO::判断es索引是否创建(因为这里我已经手动创建了,省略此步骤)
//err := es.CreateIndexIfNotExists(esMd.ZhiosOrdersEsIndex, esMd.ZhiosOrdersEsMapping)
//if err != nil {
// panic(err)
//}

//4、构造数据结构体 && 插入es文档
masterId := strings.Split(canalMsg.Database, "_")[1]

var ordList []string
for _, data := range canalMsg.Data {
ordList = append(ordList, data.OrdId)
}
ordItemList, err := db.MallOrdItemFindByParams(db.DBs[masterId], map[string]interface{}{
"key": "ord_id",
"value": ordList,
})
if err != nil {
return err
}
var ordItemListMap = map[string]int{}
for _, item := range *ordItemList {
ordItemListMap[utils.AnyToString(item.OrdId)] = item.GoodsNum
}

for _, data := range canalMsg.Data {
var uniqueId = masterId + "_" + data.OrdId //es的唯一键,每个文档必须要有唯一键
province, err := db.ProvinceGetOne(data.ProvinceId)
if err != nil {
return err
}
city, err := db.CityGetOne(data.CityId)
if err != nil {
return err
}
county, err := db.CountyGetOne(data.CountyId)
if err != nil {
return err
}
now := time.Now()
var goodsNum = 1
if ordItemListMap[data.OrdId] != 0 {
goodsNum = ordItemListMap[data.OrdId]
}
esData := esMd.ZhiosOrdersEs{
OrdKind: "mall",
MasterId: utils.StrToInt(masterId),
OrdId: data.OrdId,
MainOrdId: data.MainOrdId,
StoreOrdId: data.StoreOrdId,
GoodsId: data.GoodsId,
Uid: data.Uid,
BuyerPhone: data.BuyerPhone,
CostPrice: utils.StrToFloat64(data.CostPrice),
Gmv: utils.StrToFloat64(data.CostPrice) * float64(goodsNum),
State: int32(utils.StrToInt(data.State)),
StateZh: md.CanalOrderState(int32(utils.StrToInt(data.State))).String(),
PayChannel: int32(utils.StrToInt(data.PayChannel)),
PayChannelZh: md.CanalOrderPayChannel(int32(utils.StrToInt(data.PayChannel))).String(),
ReceiverPhone: data.ReceiverPhone,
ReceiverName: data.ReceiverName,
ReceiverAddressDetail: data.ReceiverAddressDetail,
ProvinceId: data.ProvinceId,
CityId: data.CityId,
CountyId: data.CountyId,
Province: province.Name,
City: city.Name,
County: county.Name,
OrderType: int32(utils.StrToInt(data.OrderType)),
GoodsNum: goodsNum,
EstimateCommission: utils.StrToFloat64(data.EstimateCommission),
LogisticCompany: data.LogisticCompany,
PayTime: data.PayTime,
OrdCreateTime: data.CreateTime,
CreatedAt: now.Format("2006-01-02 15:04:05"),
UpdatedAt: now.Format("2006-01-02 15:04:05"),
}
if esData.PayTime == "" {
esData.PayTime = "1970-01-01 00:00:00"
}
createDocRet, err := es.CreateDoc(esMd.ZhiosOrdersEsIndex, uniqueId, esData)
if err != nil {
return err
}
fmt.Printf("CreateDoc CanalOrder ==> %+v \n\n", createDocRet)
}
}
return nil
}

+ 0
- 130
consume/canal_user_virtual_coin_flow_consume.go ファイルの表示

@@ -1,130 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/shopspring/decimal"
"github.com/streadway/amqp"
"strings"
"time"
)

func CanalUserVirtualCoinFlowConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>CanalUserVirtualCoinFlowConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalUserVirtualCoinFlowConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleCanalUserVirtualCoinFlow(res.Body)
if err != nil {
fmt.Println("handleCanalUserVirtualCoinFlow_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleCanalUserVirtualCoinFlow(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalUserVirtualCoinFlowOrderMessage[md.CanalUserVirtualCoinFlowOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}

masterId := strings.Split(canalMsg.Database, "_")[1]
if masterId != "32053480" {
return nil
}
engine := db.DBs[masterId]
now := time.Now()

//2、查找 one_circles_green_energy_basic_setting 基础设置
userPublicPlatoonDoubleNetworkSetting, err := db.UserPublicPlatoonDoubleNetworkSettingGetOneByParams(engine, map[string]interface{}{
"key": "is_open",
"value": 1,
})
if err != nil {
return err
}
if userPublicPlatoonDoubleNetworkSetting == nil {
return errors.New("公排双网未开启")
}
if canalMsg.Type == md.CanalMsgInsertSqlType {
if canalMsg.Data[0].CoinId == utils.IntToStr(userPublicPlatoonDoubleNetworkSetting.CoinId) {
//3、查找 user_public_platoon_double_network_user_coin_record
userPublicPlatoonDoubleNetworkUserCoinRecord, err1 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordGetOneByParams(engine, map[string]interface{}{
"key": "uid",
"value": canalMsg.Data[0].Uid,
})
if err1 != nil {
return err1
}
if userPublicPlatoonDoubleNetworkUserCoinRecord == nil {
userProfile, err2 := db.UserProfileFindByIDSess(engine.NewSession(), canalMsg.Data[0].Uid)
if userProfile == nil {
return errors.New("用户不存在")
}
if err2 != nil {
return err2
}
//新增记录
_, err3 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordInsert(engine, &model.UserPublicPlatoonDoubleNetworkUserCoinRecord{
Uid: utils.StrToInt(canalMsg.Data[0].Uid),
LastAmount: canalMsg.Data[0].AfterAmout,
Amount: canalMsg.Data[0].AfterAmout,
RecommendUid: userProfile.ParentUid,
CoinId: utils.StrToInt(canalMsg.Data[0].CoinId),
CreateAt: now.Format("2006-01-02 15:04:05"),
UpdateAt: now.Format("2006-01-02 15:04:05"),
})
if err3 != nil {
return err3
}
} else {
//更新记录
afterAmount, _ := decimal.NewFromString(canalMsg.Data[0].AfterAmout)
amount, _ := decimal.NewFromString(userPublicPlatoonDoubleNetworkUserCoinRecord.Amount)
lastAmount, _ := decimal.NewFromString(userPublicPlatoonDoubleNetworkUserCoinRecord.LastAmount)
if canalMsg.Data[0].Direction == "1" || canalMsg.Data[0].Direction == "2" {
//收入 && 支出
userPublicPlatoonDoubleNetworkUserCoinRecord.Amount = amount.Add(afterAmount.Sub(lastAmount)).String()
}
userPublicPlatoonDoubleNetworkUserCoinRecord.LastAmount = canalMsg.Data[0].AfterAmout
_, err2 := db.UserPublicPlatoonDoubleNetworkUserCoinRecordUpdate(engine, userPublicPlatoonDoubleNetworkUserCoinRecord.Id, userPublicPlatoonDoubleNetworkUserCoinRecord, "amount", "last_amount")
if err2 != nil {
return err2
}
}
}
}

return nil
}

+ 0
- 125
consume/cloud_issuance_async_mlogin.go ファイルの表示

@@ -1,125 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils"
"applet/app/utils/cache"
tool "applet/app/utils/cloud_issuance"
"applet/app/utils/logx"
md2 "applet/cloud_issuance/md"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func CloudIssuanceAsyncMLoginConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>CloudIssuanceAsyncMLoginConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
//解析mq中queue的数据结构体
var msg *md2.CloudIssuanceAsyncMLogin
err = json.Unmarshal(res.Body, &msg)
if err != nil {
panic(err)
}
go func() {
err := handleAsyncMLogin(msg.WId, msg.MasterId, msg.UserId, msg.RobotId)
if err != nil {
fmt.Println("<<<<<<<<<<<< handleAsyncMLogin err>>>>>>>>", err.Error())
}
}()
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleAsyncMLogin(wId, masterId, userId string, robotId int) error {
var timeTotal = 0
for {
err, resp := robotAsyncMacLogin(md2.RobotAsyncMacLoginRequest{
WId: wId,
RobotId: robotId,
})
if err == nil {
fmt.Println("success <<<<<<<", resp)
if cfg.Prd {
engine := db.DBs[masterId]
cloudIssuanceUserRobotDb := db.CloudIssuanceUserRobotDb{}
cloudIssuanceUserRobotDb.Set(engine, utils.StrToInt(userId))
robot, err := cloudIssuanceUserRobotDb.GetCloudIssuanceUserRobot()
if err != nil {
return err
}
if robot == nil {
return errors.New("未查询到机器人记录")
}
robot.WcId = resp.WcId
robot.WcNickname = resp.NickName
robot.WcHeadUrl = resp.HeadUrl
robot.LoginStatus = 1
_, err = cloudIssuanceUserRobotDb.SaveCloudIssuanceUserRobot(robot.Id, robot, "wc_id", "wc_nickname", "wc_head_url", "login_status")
if err != nil {
return err
}
} else {
//TODO::测试环境, 简化操作 通过redis 桥接
cache.SetEx(fmt.Sprintf("cloud_issuance_async_login_success:%s:%s", masterId, userId), utils.SerializeStr(resp), 60*5)
}
return nil
}

fmt.Println("err>>>>>>>>", err.Error())
if err != nil && err.Error() != "未登录" {
return err
}
//TODO::休眠5s
time.Sleep(time.Duration(5) * time.Second)
timeTotal += 5
if timeTotal >= 240 {
return errors.New("超时未登录")
}
}
}

func robotAsyncMacLogin(args md2.RobotAsyncMacLoginRequest) (err error, result md2.RobotAsyncMacLoginResponse) { // 同步登录状态
url := tool.HttpBuild("itaoke.robot.async.mlogin", "127.0.0.1", map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"wId": args.WId,
})
data, err := tool.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

+ 0
- 72
consume/cloud_issuance_msg_callback.go ファイルの表示

@@ -1,72 +0,0 @@
package consume

import (
"applet/app/utils"
"applet/app/utils/logx"
db "applet/cloud_issuance/db/official"
md2 "applet/cloud_issuance/md"
"applet/cloud_issuance/svc"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/streadway/amqp"
"time"
)

func CloudIssuanceMsgCallBackConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(10)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>CloudIssuanceMsgCallBackConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
//解析mq中queue的数据结构体
var msg *md2.CallbackRequest
err = json.Unmarshal(res.Body, &msg)
if err != nil {
panic(err)
}
randInt := utils.RandIntRand(100, 200)
time.Sleep(time.Millisecond * time.Duration(randInt)) // 等待100 ~ 200毫秒
go func() {
//设置masterId
cloudIssuanceRobotRecords, err := db.CloudIssuanceRobotRecordsGetOneByParams(map[string]interface{}{
"key": "robot_id",
"value": msg.RobotId,
})
if err != nil {
fmt.Println("CallBackErr:::::", err.Error())
return
}
if cloudIssuanceRobotRecords == nil {
//TODO::未查询到机器人,不需要处理
utils.FilePutContents("cloud_issuance_call_back_not_found", utils.SerializeStr(msg))
return
}
var c = &gin.Context{}
c.Set("mid", cloudIssuanceRobotRecords.MasterId)
dealCloudIssuanceCallBackService := svc.DealCloudIssuanceCallBackService{}
dealCloudIssuanceCallBackService.Set(c)
dealCloudIssuanceCallBackService.DealCallBack(c, *msg)
}()
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

+ 0
- 77
consume/consume.go ファイルの表示

@@ -1,77 +0,0 @@
package consume

import (
"applet/app/utils"
"applet/app/utils/logx"
"bytes"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
jsoniter "github.com/json-iterator/go"
"github.com/streadway/amqp"
"log"
"strings"
)

var Json = jsoniter.ConfigCompatibleWithStandardLibrary

type Message struct {
MessageType string `json:"message_type"`
Data int `json:"data"`
}

func WorkReceive(name string) {
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//接收消息时,指定
msgs := ch.Consume(name, false)
for msg := range msgs {
var message2 Message
jsonStr := string(msg.Body)
jsonStr = strings.Trim(jsonStr, "\"")
jsonStr = strings.ReplaceAll(jsonStr, "\\", "")
utils.Unserialize([]byte(jsonStr), &message2)
switch message2.MessageType {
case "test":
go func(msg *amqp.Delivery) {
log.Printf("recevie1 Received a message: %s", msg.Body)
msg.Ack(true)
}(&msg)
}

}
}

func TestWorkSend() {
// 推入rabbitMq
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
}
defer ch.Release()
var message struct {
MessageType string `json:"message_type"`
Data int `json:"data"`
}
message.MessageType = "test"
message.Data = 1
for message.Data < 2 {
ch.Publish("test_work_queue_processor", utils.SerializeStr(message), "")
message.Data += 1
//time.Sleep(time.Second * 5)
}
}

// 去除json中的转义字符
func disableEscapeHtml(data interface{}) (string, error) {
bf := bytes.NewBuffer([]byte{})
jsonEncoder := json.NewEncoder(bf)
jsonEncoder.SetEscapeHTML(true)
if err := jsonEncoder.Encode(data); err != nil {
return "", err
}
return bf.String(), nil
}

+ 0
- 146
consume/dou_shen_user_register_for_my_my_fans.go ファイルの表示

@@ -1,146 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
db2 "applet/app/db/gim"
model2 "applet/app/db/gim/model"
"applet/app/db/model"
utils2 "applet/app/utils"
"applet/app/utils/logx"
utils "applet/app/utils/rpc"
"applet/consume/md"
"applet/pkg/pb"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func DouShenUserRegisterConsumeForMyFans(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>DouShenUserRegisterConsumeForMyFans>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()

//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
err = handleDouShenUserRegisterConsumeForMyFans(res.Body)
if err != nil {
fmt.Println("!!!!!!!err!!!!!!!", err)
_ = res.Reject(false)

utils2.FilePutContents("douShenUserRegisterConsumeForMyFans_err", "[err]:"+err.Error())
if err.Error() == "用户暂未注册im系统" {
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.DouShenUserRegisterMessageStructForMyFans
json.Unmarshal(res.Body, &msg)
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
}
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleDouShenUserRegisterConsumeForMyFans(msgData []byte) error {
time.Sleep(time.Duration(15) * time.Second)
//1、解析mq中queue的数据结构体
var msg *md.DouShenUserRegisterMessageStructForMyFans
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
//2、查找用户对应im系统中的数据
gimUser, err := db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "phone_number",
"value": msg.Phone,
})
if err != nil {
return err
}
if gimUser == nil {
if db.DBs[msg.MasterId] == nil {
return nil
}
user, err := db.UserFindByMobile(db.DBs[msg.MasterId], strconv.FormatInt(msg.Phone, 10))
if err != nil {
return err
}
userProfile, err := db.UserProfileFindByID(db.DBs[msg.MasterId], user.Uid)
if err != nil {
return err
}

gimUserId, err := db2.UserInsert(db.ImDb, &model2.User{
PhoneNumber: strconv.FormatInt(msg.Phone, 10),
Nickname: user.Nickname,
AvatarUrl: userProfile.AvatarUrl,
Sex: userProfile.Gender,
CreateTime: time.Now().Format("2006-01-02 15:04:05"),
UpdateTime: time.Now().Format("2006-01-02 15:04:05"),
MasterId: utils2.StrToInt64(msg.MasterId),
IsAutoAddedFriends: 0,
})
if err != nil {
return errors.New("用户暂未注册im系统")
}
gimUser, err = db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "id",
"value": gimUserId,
})
if gimUser == nil {
return errors.New("用户暂未注册im系统")
}
}

groupName := "我的粉丝【1】群"
//3、创建群
resp, err := utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).CreateGroup(utils.GetCtx("", utils2.Int64ToStr(gimUser.Id), "", msg.MasterId), &pb.CreateGroupReq{
Name: groupName,
AvatarUrl: "",
//Introduction: gimUser.Nickname + "的粉丝群",
Introduction: "",
Extra: "",
MemberIds: nil,
})
if err != nil {
return err
}
//插入 dou_shen_im_group 记录
now := time.Now()
_, err = db.DouShenImGroupInsert(db.Db, &model.DouShenImGroup{
Kind: 3,
Uid: int(msg.Uid),
GroupId: int(resp.GroupId),
IsFull: 0,
Name: groupName,
CreateTime: now,
UpdateTime: now,
})
if err != nil {
return err
}

return nil
}

+ 0
- 207
consume/dou_shen_user_register_for_my_my_recommender.go ファイルの表示

@@ -1,207 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
db2 "applet/app/db/gim"
"applet/app/db/gim/model"
model2 "applet/app/db/model"
utils2 "applet/app/utils"
"applet/app/utils/logx"
utils "applet/app/utils/rpc"
"applet/consume/md"
"applet/pkg/pb"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func DouShenUserRegisterConsumeForMyRecommender(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>DouShenUserRegisterConsumeForMyRecommender>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
err = handleDouShenUserRegisterConsumeForMyRecommender(res.Body)
if err != nil {
fmt.Println("!!!!!!!err!!!!!!!", err)
_ = res.Reject(false)

utils2.FilePutContents("douShenUserRegisterConsumeForMyRecommender_err", "[err]:"+err.Error())
if err.Error() == "用户暂未注册im系统" {
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.DouShenUserRegisterMessageStructForMyRecommender
json.Unmarshal(res.Body, &msg)
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
}
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleDouShenUserRegisterConsumeForMyRecommender(msgData []byte) error {
time.Sleep(time.Duration(20) * time.Second)
//1、解析mq中queue的数据结构体
var msg *md.DouShenUserRegisterMessageStructForMyRecommender
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
//2、查找用户对应im系统中的数据
gimUser, err := db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "phone_number",
"value": msg.Phone,
})
if err != nil {
return err
}

if gimUser == nil {
if db.DBs[msg.MasterId] == nil {
return nil
}
user, err := db.UserFindByMobile(db.DBs[msg.MasterId], strconv.FormatInt(msg.Phone, 10))
if err != nil {
return err
}
userProfile, err := db.UserProfileFindByID(db.DBs[msg.MasterId], user.Uid)
if err != nil {
return err
}
gimUserId, err := db2.UserInsert(db.ImDb, &model.User{
PhoneNumber: strconv.FormatInt(msg.Phone, 10),
Nickname: user.Nickname,
AvatarUrl: userProfile.AvatarUrl,
Sex: userProfile.Gender,
CreateTime: time.Now().Format("2006-01-02 15:04:05"),
UpdateTime: time.Now().Format("2006-01-02 15:04:05"),
MasterId: utils2.StrToInt64(msg.MasterId),
IsAutoAddedFriends: 0,
})
if err != nil {
return errors.New("用户暂未注册im系统")
}
gimUser, err = db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "id",
"value": gimUserId,
})
if gimUser == nil {
return errors.New("用户暂未注册im系统")
}
}

//2、查找是否有群
var fansGroup model2.DouShenImGroup
fansGroups, err := db.DouShenImGroupFindByParamsByKind(db.Db, 3, map[string]interface{}{
"key": "uid",
"value": msg.RecommenderUid,
})
if err != nil {
return err
}
for _, group := range *fansGroups {
//统计当前群有多少人
userGroups, err := db2.GroupUserFindByParams(db.ImDb, map[string]interface{}{
"key": "group_id",
"value": group.GroupId,
})
if err != nil {
return err
}
if len(*userGroups) < 500 {
fansGroup = group
}
}

if fansGroup.GroupId == 0 {
recommenderUser, err := db.UserFindByID(db.DBs[msg.MasterId], msg.RecommenderUid)
if err != nil {
return err
}
recommenderGimUser, err := db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "phone_number",
"value": recommenderUser.Phone,
})
if recommenderGimUser == nil {
return errors.New("当前推荐人信息有误,请联系管理员!!!")
}

groupName := "我的粉丝【" + utils2.AnyToString(len(*fansGroups)+1) + "】群"
//3、创建群
resp, err := utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).CreateGroup(utils.GetCtx("", strconv.FormatInt(recommenderGimUser.Id, 10), "0", msg.MasterId), &pb.CreateGroupReq{
Name: groupName,
AvatarUrl: "",
//Introduction: "官方群",
Introduction: "",
Extra: "",
MemberIds: []int64{},
})
if err != nil {
return err
}

//插入 dou_shen_im_group 记录
now := time.Now()
_, err = db.DouShenImGroupInsert(db.Db, &model2.DouShenImGroup{
Kind: 3,
Uid: int(msg.RecommenderUid),
GroupId: int(resp.GroupId),
IsFull: 0,
Name: groupName,
CreateTime: now,
UpdateTime: now,
})
if err != nil {
return err
}
tempFansGroup, err := db.DouShenImGroupGetOneByParams(db.Db, 2, map[string]interface{}{
"group_id": resp.GroupId,
})
if err != nil {
return err
}
fansGroup = *tempFansGroup
}
userGroup, err2 := db2.GroupUserGetOneByParams(db.ImDb, 1, map[string]interface{}{
"key": "group_id",
"value": fansGroup.GroupId,
})
if err2 != nil {
return err2
}
if userGroup == nil {
return errors.New("当前推荐人群暂未设置群主,请联系管理员!!!")
}

//加入群
_, err = utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).AddGroupMembers(
utils.GetCtx("", strconv.FormatInt(userGroup.UserId, 10), "", msg.MasterId),
&pb.AddGroupMembersReq{
GroupId: int64(fansGroup.GroupId),
UserIds: []int64{gimUser.Id},
})
return nil
}

+ 0
- 194
consume/dou_shen_user_register_for_official_consume.go ファイルの表示

@@ -1,194 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
db2 "applet/app/db/gim"
model2 "applet/app/db/gim/model"
"applet/app/db/model"
utils2 "applet/app/utils"
"applet/app/utils/logx"
utils "applet/app/utils/rpc"
"applet/consume/md"
"applet/pkg/pb"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func DouShenUserRegisterConsumeForOfficial(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>DouShenUserRegisterConsumeForOfficial>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
err = handleDouShenUserRegisterConsumeForOfficial(res.Body)
if err != nil {
fmt.Println("!!!!!!!err!!!!!!!", err)
_ = res.Reject(false)

utils2.FilePutContents("douShenUserRegisterConsumeForOfficial_err", "[err]:"+err.Error())
if err.Error() == "用户暂未注册im系统" {
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.DouShenUserRegisterMessageStructForOfficial
json.Unmarshal(res.Body, &msg)
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
}
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleDouShenUserRegisterConsumeForOfficial(msgData []byte) error {
time.Sleep(time.Duration(5) * time.Second)
//1、解析mq中queue的数据结构体
var msg *md.DouShenUserRegisterMessageStructForOfficial
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
//2、查找用户对应im系统中的数据
gimUser, err := db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "phone_number",
"value": msg.Phone,
})
if err != nil {
return err
}
if gimUser == nil {
if db.DBs[msg.MasterId] == nil {
return nil
}
fmt.Println("===========================", msg.Phone)
user, err := db.UserFindByMobile(db.DBs[msg.MasterId], strconv.FormatInt(msg.Phone, 10))
if err != nil {
return err
}
if user == nil {
return nil
}
userProfile, err := db.UserProfileFindByID(db.DBs[msg.MasterId], user.Uid)
if err != nil {
return err
}

gimUserId, err := db2.UserInsert(db.ImDb, &model2.User{
PhoneNumber: strconv.FormatInt(msg.Phone, 10),
Nickname: user.Nickname,
AvatarUrl: userProfile.AvatarUrl,
Sex: userProfile.Gender,
CreateTime: time.Now().Format("2006-01-02 15:04:05"),
UpdateTime: time.Now().Format("2006-01-02 15:04:05"),
MasterId: utils2.StrToInt64(msg.MasterId),
IsAutoAddedFriends: 0,
})
if err != nil {
return errors.New("用户暂未注册im系统")
}
gimUser, err = db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "id",
"value": gimUserId,
})
if gimUser == nil {
return errors.New("用户暂未注册im系统")
}
}

//2、查找是否有群
//officialGroup, err := db.DouShenImGroupGetOneByParamsForOfficial(db.Db, 1)
var officialGroup model.DouShenImGroup
officialGroups, err := db.DouShenImGroupFindByParams(db.Db, map[string]interface{}{
"key": "kind",
"value": 1,
})
if err != nil {
return err
}
for _, group := range *officialGroups {
if officialGroup.GroupId != 0 {
continue
}
//统计当前群有多少人
userGroups, _ := db2.GroupUserFindByParams(db.ImDb, map[string]interface{}{
"key": "group_id",
"value": group.GroupId,
})
if len(*userGroups) < 500 {
officialGroup = group
}
}

if officialGroup.GroupId == 0 {
groupName := "官方【" + utils2.AnyToString(len(*officialGroups)+1) + "】群"
//3、创建群
resp, err := utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).CreateGroup(utils.GetCtx("", strconv.FormatInt(gimUser.Id, 10), "0", msg.MasterId), &pb.CreateGroupReq{
Name: groupName,
AvatarUrl: "",
//Introduction: "官方群",
Introduction: "",
Extra: "",
MemberIds: []int64{},
})
if err != nil {
return err
}

//插入 dou_shen_im_group 记录
now := time.Now()
_, err = db.DouShenImGroupInsert(db.Db, &model.DouShenImGroup{
Kind: 1,
Uid: int(msg.Uid),
GroupId: int(resp.GroupId),
IsFull: 0,
Name: groupName,
CreateTime: now,
UpdateTime: now,
})
if err != nil {
return err
}
} else {
userGroup, err2 := db2.GroupUserGetOneByParams(db.ImDb, 1, map[string]interface{}{
"key": "group_id",
"value": officialGroup.GroupId,
})
if err2 != nil {
return err2
}
if userGroup == nil {
return errors.New("当前官方群暂未设置群主,请联系管理员!!!")
}

//加入群
_, err = utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).AddGroupMembers(
utils.GetCtx("", strconv.FormatInt(userGroup.UserId, 10), "", msg.MasterId),
&pb.AddGroupMembersReq{
GroupId: int64(officialGroup.GroupId),
UserIds: []int64{gimUser.Id},
})
}
return nil
}

+ 0
- 289
consume/dou_shen_user_register_for_operation_center.go ファイルの表示

@@ -1,289 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
db2 "applet/app/db/gim"
"applet/app/db/gim/model"
model2 "applet/app/db/model"
"applet/app/svc"
utils2 "applet/app/utils"
"applet/app/utils/logx"
utils "applet/app/utils/rpc"
"applet/consume/md"
"applet/pkg/pb"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func DouShenUserRegisterConsumeForOperationCenter(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>DouShenUserRegisterConsumeForOperationCenter>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
err = handleDouShenUserRegisterConsumeForOperationCenter(res.Body)
if err != nil {
fmt.Println("!!!!!!!err!!!!!!!", err)
_ = res.Reject(false)

utils2.FilePutContents("douShenUserRegisterConsumeForOperationCenter_err", "[err]:"+err.Error())
if err.Error() == "用户暂未注册im系统" {
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.DouShenUserRegisterMessageStructForOperationCenter
json.Unmarshal(res.Body, &msg)
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
}
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleDouShenUserRegisterConsumeForOperationCenter(msgData []byte) error {
time.Sleep(time.Duration(30) * time.Second)
//1、解析mq中queue的数据结构体
var msg *md.DouShenUserRegisterMessageStructForOperationCenter
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
//2、查找用户对应im系统中的数据
gimUser, err := db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "phone_number",
"value": msg.Phone,
})
if err != nil {
return err
}

if gimUser == nil {
if db.DBs[msg.MasterId] == nil {
return nil
}
user, err := db.UserFindByMobile(db.DBs[msg.MasterId], strconv.FormatInt(msg.Phone, 10))
if err != nil {
return err
}
if user == nil {
return nil
}
userProfile, err := db.UserProfileFindByID(db.DBs[msg.MasterId], user.Uid)
if err != nil {
return err
}
if userProfile == nil {
return nil
}
gimUserId, err := db2.UserInsert(db.ImDb, &model.User{
PhoneNumber: strconv.FormatInt(msg.Phone, 10),
Nickname: user.Nickname,
AvatarUrl: userProfile.AvatarUrl,
Sex: userProfile.Gender,
CreateTime: time.Now().Format("2006-01-02 15:04:05"),
UpdateTime: time.Now().Format("2006-01-02 15:04:05"),
MasterId: utils2.StrToInt64(msg.MasterId),
IsAutoAddedFriends: 0,
})
if err != nil {
return errors.New("用户暂未注册im系统")
}
gimUser, err = db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "id",
"value": gimUserId,
})
if gimUser == nil {
return errors.New("用户暂未注册im系统")
}
}

//2、查找是否有群
//OperationGroup, err := db.DouShenImGroupGetOneByParamsForFans(db.Db, 2, msg.OperationCenterUid)
var OperationGroup model2.DouShenImGroup
operationGroups, err := db.DouShenImGroupFindByParamsByKind(db.Db, 2, map[string]interface{}{
"key": "uid",
"value": msg.OperationCenterUid,
})
if err != nil {
return err
}
for _, group := range *operationGroups {
//统计当前群有多少人
userGroups, err := db2.GroupUserFindByParams(db.ImDb, map[string]interface{}{
"key": "group_id",
"value": group.GroupId,
})
if err != nil {
return err
}
if len(*userGroups) < 500 {
OperationGroup = group
}
}

if OperationGroup.GroupId == 0 {
//创建运营中心群
operationCenterUser, err := db.UserFindByID(db.DBs[msg.MasterId], msg.OperationCenterUid)
if err != nil {
return err
}
operationCenterGimUser, err := db2.UserGetOneByParams(db.ImDb, msg.MasterId, map[string]interface{}{
"key": "phone_number",
"value": operationCenterUser.Phone,
})
if operationCenterGimUser == nil {
return errors.New("运营中心用户暂未注册im系统")
}
var m model2.RegionalAgentUser
_, err = db.DBs[msg.MasterId].Where("uid =?", msg.OperationCenterUid).Get(&m)
if err != nil {
panic(err)
}
regionalAgentRegion, err := db.RegionalAgentRegionGetOneByParams(db.DBs[msg.MasterId], map[string]interface{}{
"key": "id",
"value": m.RegionId,
})
if err != nil {
panic(err)
}

groupName := "抖省" + regionalAgentRegion.Name + "运营中心【" + utils2.AnyToString(len(*operationGroups)) + "】群"

resp, err := utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).CreateGroup(utils.GetCtx("", utils2.Int64ToStr(operationCenterGimUser.Id), "", msg.MasterId), &pb.CreateGroupReq{
Name: groupName,
AvatarUrl: "",
//Introduction: gimUser.Nickname + "的粉丝群",
Introduction: "",
Extra: "",
MemberIds: nil,
})
if err != nil {
return err
}
//插入 dou_shen_im_group 记录
now := time.Now()
_, err = db.DouShenImGroupInsert(db.Db, &model2.DouShenImGroup{
Kind: 2,
Uid: int(msg.OperationCenterUid),
GroupId: int(resp.GroupId),
IsFull: 0,
Name: groupName,
CreateTime: now,
UpdateTime: now,
})
if err != nil {
return err
}
tmpOperationGroup, err := db.DouShenImGroupGetOneByParams(db.Db, 2, map[string]interface{}{
"group_id": resp.GroupId,
})
if err != nil {
return err
}
OperationGroup = *tmpOperationGroup
}
userGroup, err2 := db2.GroupUserGetOneByParams(db.ImDb, 1, map[string]interface{}{
"key": "group_id",
"value": OperationGroup.GroupId,
})
if err2 != nil {
return err2
}
if userGroup == nil {
return errors.New("当前运营中心群暂未设置群主,请联系管理员!!!")
}

//加入群
_, err = utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).AddGroupMembers(utils.GetCtx("", strconv.FormatInt(userGroup.UserId, 10), "", msg.MasterId), &pb.AddGroupMembersReq{
GroupId: int64(OperationGroup.GroupId),
UserIds: []int64{gimUser.Id},
})

//发送专属红包
gimSendSpeciallyRedPackageUser, err := db2.DbSysCfg.SysCfgGetOne("send_specially_red_package_user", msg.MasterId)
if err != nil {
return err
}
if gimSendSpeciallyRedPackageUser == nil {
return errors.New("暂未设置专属红包发送用户")
}
sendSpeciallyRedPackageUser, err := db.SysCfgGetOne(db.DBs[msg.MasterId], "send_specially_red_package_user")
if err != nil {
return err
}
amount, err := getSendAmount(msg.MasterId)
if err != nil {
return err
}
args := md.SendRedPackageReq{
UserId: gimSendSpeciallyRedPackageUser.Val,
DeviceId: "",
Token: "",
Amount: amount,
RedPacketType: 5,
RedPacketNums: 1,
RedPacketContent: "抖省赚钱,大吉大利",
RedPacketSmallContent: gimUser.Nickname + "的专属红包",
ReceiverType: 2,
ReceiverId: int64(OperationGroup.GroupId),
SendTime: utils2.UnixMilliTime(time.Now()),
ToUserIds: []int64{gimUser.Id},
RedPackageCover: "",
}
err, _ = svc.CurlSendRedPackage(args, msg.MasterId, sendSpeciallyRedPackageUser.Val)
if err != nil {
return err
}
return nil
}

func getSendAmount(masterId string) (string, error) {
speciallyRedPackageAmountRadio, err := db.SysCfgGetOne(db.DBs[masterId], "specially_red_package_amount_radio")
if err != nil {
return "", err
}
var speciallyRedPackageAmountRadioData []*md.SpeciallyRedPackageAmountRadio
err = json.Unmarshal([]byte(speciallyRedPackageAmountRadio.Val), &speciallyRedPackageAmountRadioData)
if err != nil {
return "", err
}

var tempSpeciallyRedPackageAmountRadioData []*md.SpeciallyRedPackageAmountRadio
for _, v := range speciallyRedPackageAmountRadioData {
for i := 0; i < utils2.StrToInt(v.Value); i++ {
tempSpeciallyRedPackageAmountRadioData = append(tempSpeciallyRedPackageAmountRadioData, v)
}
}
if len(tempSpeciallyRedPackageAmountRadioData) < 100 {
return "", errors.New("红包金额比例设置有误!")
}

randInt := utils2.RandInt(99)
min := tempSpeciallyRedPackageAmountRadioData[randInt].From
max := tempSpeciallyRedPackageAmountRadioData[randInt].To
amount := utils2.AnyToString(utils2.RandFloats(utils2.AnyToFloat64(min), utils2.AnyToFloat64(max)))
return amount, nil
}

+ 0
- 68
consume/dou_shen_user_register_for_user_register_up_lv.go ファイルの表示

@@ -1,68 +0,0 @@
package consume

import (
"applet/app/db"
utils2 "applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func DouShenUserRegisterConsumeForUserRegisterUpLv(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>DouShenUserRegisterConsumeForUserRegisterUpLv>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()

//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
err = handleDouShenUserRegisterConsumeForUserRegisterUpLv(res.Body)
if err != nil {
fmt.Println("!!!!!!!err!!!!!!!", err)
utils2.FilePutContents("douShenUserRegisterConsumeForUserRegisterUpLv_err", "[err]:"+err.Error())
_ = res.Reject(false)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleDouShenUserRegisterConsumeForUserRegisterUpLv(msgData []byte) error {
time.Sleep(time.Duration(10) * time.Second)
//1、解析mq中queue的数据结构体
var msg *md.DouShenUserRegisterMessageStructForUserRegisterUpLv
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
if db.DBs[msg.MasterId] == nil {
return nil
}
eg := db.DBs[msg.MasterId]
levelList, _ := db.UserLevlEgAll(eg)
FindUser(eg, strconv.FormatInt(msg.Uid, 10), msg.MasterId, levelList)
return nil
}

+ 3
- 83
consume/init.go ファイルの表示

@@ -17,90 +17,10 @@ func Init() {

// 增加消费任务队列
func initConsumes() {
//jobs[consumeMd.ZhiosGuideStoreOrderFunName] = ZhiosGuideStoreOrder

//jobs[consumeMd.ZhiosIntegralProxyRechargeFunName] = ZhiosIntegralProxyRecharge
//jobs[consumeMd.ZhiosUserUpLvFunName] = ZhiosUserUpLv
//jobs[consumeMd.CanalGuideOrderByUserUpLvConsume] = CanalGuideOrderByUserUpLvConsume
//jobs[consumeMd.ZhiosOrderFreeFunName] = ZhiosOrderFree
//jobs[consumeMd.ZhiosOrderTotalFunName] = ZhiosOrderTotal
//jobs[consumeMd.ZhiosOrderTotalSecondFunName] = ZhiosOrderTotalSecond
////
//jobs[consumeMd.ZhiosOrderSettleTotalFunName] = ZhiosSettleTotal
//jobs[consumeMd.ZhiosOrderHjyFunName] = ZhiosOrderHjy
//jobs[consumeMd.ZhiosOrderBuckleFunName] = ZhiosOrderBuckle
////
//jobs[consumeMd.ZhiosSupplierAfterOrderFunName] = ZhiosSupplierAfterOrder
//
//jobs[consumeMd.ZhiosAppreciationFunName] = ZhiosAppreciation
//jobs[consumeMd.ZhiosValidUserFunName] = ZhiosValidUser
//
//jobs[consumeMd.ZhiosAcquisitionConditionFunName] = ZhiosAcquisitionCondition
//
//jobs[consumeMd.DouShenUserRegisterConsumeForOfficialFunName] = DouShenUserRegisterConsumeForOfficial
//jobs[consumeMd.DouShenUserRegisterConsumeForOperationCenterFunName] = DouShenUserRegisterConsumeForOperationCenter
//jobs[consumeMd.DouShenUserRegisterConsumeForMyRecommenderFunName] = DouShenUserRegisterConsumeForMyRecommender
//jobs[consumeMd.DouShenUserRegisterConsumeForMyFansFunName] = DouShenUserRegisterConsumeForMyFans
//jobs[consumeMd.DouShenUserRegisterConsumeForUserRegisterUpLvFunName] = DouShenUserRegisterConsumeForUserRegisterUpLv
//
//jobs[consumeMd.ZhiosFastReturnOrderPayFunName] = ZhiosFastReturnOrderPay
//jobs[consumeMd.ZhiosFastReturnOrderSuccessFunName] = ZhiosFastReturnOrderSuccess
//jobs[consumeMd.ZhiosFastReturnOrderRefundFunName] = ZhiosFastReturnOrderRefund
//jobs[consumeMd.ZhiosFastReturnOrderRefundSecondFunName] = ZhiosFastReturnOrderRefundSecond
//
//jobs[consumeMd.YoumishangExchangeStoreFunName] = YoumishangExchangeStore
//
//jobs[consumeMd.ZhiosRechargeOrderFailFunName] = ZhiosRechargeOrderFail
//
//jobs[consumeMd.CloudIssuanceAsyncMLoginFunName] = CloudIssuanceAsyncMLoginConsume
//jobs[consumeMd.ZhiosTikTokUpdateFunName] = ZhiosTikTokUpdate
//jobs[consumeMd.ZhiosTikTokAllUpdateFunName] = ZhiosTikTokAllUpdate
//
//jobs[consumeMd.ZhiosCapitalPoolOrderTotalFunName] = ZhiosCapitalPoolOrderTotal
//jobs[consumeMd.ZhiosExpressOrderFail] = ZhiosExpressOrderFail
//jobs[consumeMd.ZhiosWithdrawReward] = ZhiosWithdrawReward
//jobs[consumeMd.ZhiosTaskTotal] = ZhiosTaskTotal

//

////////////////////////////////////// V1 /////////////////////////////////////////////////////
//jobs[consumeMd.CloudIssuanceMsgCallBackFunName] = CloudIssuanceMsgCallBackConsume

//////////////////////////////////////// V2 /////////////////////////////////////////////////////
//jobs[consumeMd.SupplyCloudChainFenxiaoNewChangeFunName] = SupplyCloudChainFenxiaoNewChangeConsume

//////////////////////////////////////// V3 /////////////////////////////////////////////////////
//jobs[consumeMd.MallAddSupplyGoodsFunName] = MallAddSupplyGoodsConsume

//////////////////////////////////////// bigData /////////////////////////////////////////////////////
//jobs[consumeMd.CanalOrderConsumeFunName] = CanalOrderConsume
//jobs[consumeMd.CanalGuideOrderConsumeFunName] = CanalGuideOrderConsume
//jobs[consumeMd.ZhiOsUserVisitIpAddressConsumeFunName] = ZhiOsUserVisitIpAddressConsume
//jobs[consumeMd.CanalUserVirtualCcoinFlowFunName] = CanalUserVirtualCoinFlowConsume

//////////////////////////////////////// oneCircles /////////////////////////////////////////////////////

//jobs[consumeMd.OneCirclesSignInGreenEnergyFunName] = OneCirclesSignInGreenEnergyConsume
//jobs[consumeMd.OneCirclesStartLevelDividendFunName] = OneCirclesStartLevelDividendConsume
//jobs[consumeMd.OneCirclesActivityCoinAutoExchangeGreenEnergyFunName] = OneCirclesActivityCoinAutoExchangeGreenEnergyConsume
//jobs[consumeMd.OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamFunName] = OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume
//jobs[consumeMd.OneCirclesSettlementPublicGiveActivityCoinFunName] = OneCirclesSettlementPublicGiveActivityCoinConsume
//jobs[consumeMd.OneCirclesSignInCopyGreenEnergyFunName] = OneCirclesSignInCopyGreenEnergyConsume

//////////////////////////////////////// withdraw /////////////////////////////////////////////////////
//jobs[consumeMd.WithdrawConsumeFunName] = WithdrawConsume
//jobs[consumeMd.FlexibleEmploymentWithdrawForGongMaoConsumeFunName] = FlexibleEmploymentWithdrawForGongMaoConsume
//jobs[consumeMd.FlexibleEmploymentWithdrawForPupiaoConsumeFunName] = FlexibleEmploymentWithdrawForPupiaoConsume

//jobs[consumeMd.ZhiosMallGreenCoinConsumeFunName] = ZhiosMallGreenCoinConsume //绿色双链积分
//jobs[consumeMd.ZhiosOneCirclesCoinConsumeFunName] = ZhiosOneCirclesCoinConsume //一个圈圈虚拟币变化

//////////////////////////////////////// autoRepaid /////////////////////////////////////////////////////
jobs[consumeMd.InstallmentPaymentAutoRepaidConsumeFunName] = InstallmentPaymentAutoRepaidConsume //分期付 - 自动扣款

////////////////////////////////////// SuperCloudIssuance /////////////////////////////////////////////////////
//jobs[consumeMd.SuperCloudIssuanceMsgCallBackFunName] = SuperCloudIssuanceMsgCallBackConsume
//jobs[consumeMd.SuperCloudIssuanceAsyncMLoginFunName] = SuperCloudIssuanceAsyncMLoginConsume
////////////////////////////////////// order_statistics /////////////////////////////////////////////////////
jobs[consumeMd.CanalGuideOrderForStatistics] = CanalGuideOrderForStatistics
jobs[consumeMd.CanalFinWithdrawApplyForStatistics] = CanalFinWithdrawApplyForStatistics
}

func Run() {


+ 0
- 91
consume/mall_add_supply_goods.go ファイルの表示

@@ -1,91 +0,0 @@
package consume

import (
svc2 "applet/app/svc"
"applet/app/utils/logx"
"applet/consume/md"
md3 "applet/mall/md"
"applet/mall/svc"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/jinzhu/copier"
"github.com/streadway/amqp"
"strings"
)

func MallAddSupplyGoodsConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>MallAddSupplyGoodsConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleMallAddSupplyGoodsConsume(res.Body)
if err != nil {
fmt.Println("*****************err*************************", err)
}
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleMallAddSupplyGoodsConsume(msgData []byte) error {
//解析mq中queue的数据结构体
var pushStuct struct {
Args struct {
GoodsInfo []*md3.OfficialGoods `json:"goods_info"`
md3.OfficialGoodsConditions
} `json:"args"`
Mid string `json:"mid"`
}
err := json.Unmarshal(msgData, &pushStuct)
if err != nil {
panic(err)
}
//设置masterId
var c = &gin.Context{}
if pushStuct.Mid == "123456" {
return nil
}
c.Set("mid", pushStuct.Mid)
var t struct {
GoodsInfo []*md3.OfficialGoods `json:"goods_info"`
md3.OfficialGoodsConditions
}
t = pushStuct.Args
var conditions md3.OfficialGoodsConditions
conditions.CategoryId = t.CategoryId
conditions.AddPriceBase = t.AddPriceBase
conditions.AddPriceNum = t.AddPriceNum
conditions.AddPriceType = t.AddPriceType
conditions.NumType = t.NumType
engine := svc2.MasterDb(c)
for _, goods := range t.GoodsInfo {
var b2cGoods md3.OfficialGoods
copier.Copy(&b2cGoods, goods)
ex := strings.Split(b2cGoods.Price, "-")
b2cGoods.Price = ex[0]
err1 := svc.AddOfficialGoods(c, engine, &b2cGoods, &conditions)
if err1 != nil {
return err1
}
}
return nil
}

+ 7
- 558
consume/md/consume_key.go ファイルの表示

@@ -11,578 +11,27 @@ type MqQueue struct {
}

var RabbitMqQueueKeyList = []*MqQueue{
{
ExchangeName: "",
Name: "cloud_issuance_async_mlogin",
Type: SimpleQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "CloudIssuanceAsyncMLoginConsume",
},
{
ExchangeName: "",
Name: "super_cloud_issuance_async_mlogin",
Type: SimpleQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "SuperCloudIssuanceAsyncMLoginConsume",
},
{
ExchangeName: "zhios.cloud.issuance.msg.callback.exchange",
Name: "cloud_issuance_msg_call_back",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "CloudIssuanceMsgCallBackConsume",
},
{
ExchangeName: "zhios.super.cloud.issuance.msg.callback.exchange",
Name: "super_cloud_issuance_msg_call_back",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "SuperCloudIssuanceMsgCallBackConsume",
},
{
ExchangeName: "zhios.cloud_chain.fenxiao.newChange.exchange",
Name: "cloud_chain_fenxiao_newChange",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "SupplyCloudChainFenxiaoNewChangeConsume",
},
{
ExchangeName: "zhios.addSupplyGoods.exchange",
Name: "mall_add_supply_goods",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "",
BindKey: "",
ConsumeFunName: "MallAddSupplyGoodsConsume",
},
{
ExchangeName: "canal.topic",
Name: "canal_order",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_mall_order",
BindKey: "",
ConsumeFunName: "CanalOrderConsume",
},
{
ExchangeName: "canal.topic",
Name: "canal_guide_order",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_order_list",
BindKey: "",
ConsumeFunName: "CanalGuideOrderConsume",
},
{
ExchangeName: "canal.topic",
Name: "canal_guide_order_by_user_up_lv",
Name: "canal_guide_order_for_statistics",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_order_list",
BindKey: "",
ConsumeFunName: "CanalGuideOrderByUserUpLvConsume",
},
{
ExchangeName: "zhios.app.user.visit.ip.address.exchange",
Name: "zhios_user_visit_ip_address_queue",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "queue_one",
BindKey: "",
ConsumeFunName: "ZhiOsUserVisitIpAddressConsume",
},
{
ExchangeName: "zhios.order.fast.return.exchange",
Name: "zhios_fast_return_order_pay",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_pay",
BindKey: "",
ConsumeFunName: "ZhiosFastReturnOrderPay",
},
{
ExchangeName: "zhios.order.fast.return.exchange",
Name: "zhios_fast_return_order_success",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_success",
BindKey: "",
ConsumeFunName: "ZhiosFastReturnOrderSuccess",
},
{
ExchangeName: "zhios.order.fast.return.exchange",
Name: "zhios_fast_return_order_refund",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_refund",
BindKey: "",
ConsumeFunName: "ZhiosFastReturnOrderRefund",
},
{
ExchangeName: "zhios.order.fast.return.exchange",
Name: "zhios_fast_return_order_refund_second",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_refund_second",
BindKey: "",
ConsumeFunName: "ZhiosFastReturnOrderRefundSecond",
},
{
ExchangeName: "zhios.doushen.user.register.exchange",
Name: "zhios_doushen_user_register_my_fans",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "my_fans",
BindKey: "my_fans",
ConsumeFunName: "DouShenUserRegisterConsumeForMyFans",
},
{
ExchangeName: "zhios.doushen.user.register.exchange",
Name: "zhios_doushen_user_register_operation_center",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "operation_center",
BindKey: "operation_center",
ConsumeFunName: "DouShenUserRegisterConsumeForOperationCenter",
},
{
ExchangeName: "zhios.doushen.user.register.exchange",
Name: "zhios_doushen_user_register_my_recommender",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "my_recommender",
BindKey: "my_recommender",
ConsumeFunName: "DouShenUserRegisterConsumeForMyRecommender",
},
{
ExchangeName: "zhios.doushen.user.register.exchange",
Name: "zhios_doushen_user_register_official",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "official",
BindKey: "official",
ConsumeFunName: "DouShenUserRegisterConsumeForOfficial",
},
{
ExchangeName: "zhios.doushen.user.register.exchange",
Name: "zhios_doushen_user_register_user_comm_up_lv",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "user_register_comm_up_lv",
BindKey: "user_register_comm_up_lv",
ConsumeFunName: "DouShenUserRegisterConsumeForUserRegisterUpLv",
},
{
ExchangeName: "canal.topic",
Name: "canal_mall_ord_for_you_mi_shang",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "canal_mall_order",
BindKey: "",
ConsumeFunName: "CanalMallOrdForYouMiShang",
},
{
ExchangeName: "zhios.youmishang.exchange",
Name: "zhios_youmishang_exchange_store",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "store",
BindKey: "store",
ConsumeFunName: "YoumishangExchangeStore",
},
{
ExchangeName: "zhios.recharge.order.exchange",
Name: "zhios_recharge_order_fail",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_fail",
BindKey: "",
ConsumeFunName: "ZhiosRechargeOrderFail",
},
{
ExchangeName: "zhios.tikTok.exchange",
Name: "zhios_tikTok_update",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "update",
BindKey: "",
ConsumeFunName: "ZhiosTikTokUpdate",
},
{
ExchangeName: "zhios.tikTok.exchange",
Name: "zhios_tikTok_all_update",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "all_update",
BindKey: "",
ConsumeFunName: "ZhiosTikTokAllUpdate",
},
{
ExchangeName: "zhios.capital_pool.order_total.exchange",
Name: "zhios_capital_pool_order_total",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_total",
BindKey: "",
ConsumeFunName: "ZhiosCapitalPoolOrderTotal",
},
{
ExchangeName: "zhios.acquisition.exchange",
Name: "zhios_acquisition_condition",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "condition",
BindKey: "",
ConsumeFunName: "ZhiosAcquisitionCondition",
},
{
ExchangeName: "zhios.acquisition.exchange",
Name: "zhios_acquisition_condition_dev",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "acq_dev",
BindKey: "",
ConsumeFunName: "ZhiosAcquisitionConditionDev",
},
{
ExchangeName: "zhios.recharge.order.exchange",
Name: "zhios_recharge_order_fail_dev",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_fail_dev",
BindKey: "",
ConsumeFunName: "ZhiosRechargeOrderFailDev",
},
{
ExchangeName: "zhios.express.order.exchange",
Name: "zhios_express_order_fail",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_fail",
BindKey: "",
ConsumeFunName: "zhiosExpressOrderFail",
},
{
ExchangeName: "zhios.withdraw.reward.exchange",
Name: "zhios_withdraw_reward",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "withdraw_reward",
BindKey: "",
ConsumeFunName: "zhiosWithdrawReward",
},
{
ExchangeName: "zhios.task.exchange",
Name: "zhios_task_total",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "task_total",
BindKey: "",
ConsumeFunName: "zhiosTaskTotal",
},
{
ExchangeName: "zhios.user_valid.exchange",
Name: "zhios_user_valid",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "user_valid",
BindKey: "",
ConsumeFunName: "ZhiosValidUser",
},
{
ExchangeName: "zhios.appreciation.exchange",
Name: "zhios_appreciation",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "appreciation",
BindKey: "",
ConsumeFunName: "ZhiosAppreciation",
},
{
ExchangeName: "zhios.appreciation.exchange",
Name: "zhios_appreciation_dev",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "appreciation_dev",
BindKey: "",
ConsumeFunName: "ZhiosAppreciationDev",
},
{
ExchangeName: "zhios.guide_store.exchange",
Name: "zhios_guide_store_order",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "guide_store_order",
BindKey: "",
ConsumeFunName: "ZhiosGuideStoreOrder",
},
{
ExchangeName: "zhios.supplier_after_order.exchange",
Name: "zhios_supplier_after_order",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "refund",
BindKey: "",
ConsumeFunName: "ZhiosSupplierAfterOrder",
},
{
ExchangeName: "zhios.order_buckle.exchange",
Name: "zhios_order_buckle",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_buckle",
BindKey: "",
ConsumeFunName: "ZhiosOrderBuckle",
},
{
ExchangeName: "zhios.order_hjy.exchange",
Name: "zhios_order_hjy",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_hjy",
BindKey: "",
ConsumeFunName: "ZhiosOrderHjy",
},
{
ExchangeName: "zhios.order_settle_total.exchange",
Name: "zhios_order_settle_total",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_settle_total",
BindKey: "",
ConsumeFunName: "ZhiosOrderSettleTotal",
},
{
ExchangeName: "zhios.order_total.exchange",
Name: "zhios_order_total",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_total",
BindKey: "",
ConsumeFunName: "ZhiosOrderTotal",
},
{
ExchangeName: "zhios.order_total.exchange",
Name: "zhios_order_total_second",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_total_second",
BindKey: "",
ConsumeFunName: "ZhiosOrderTotalSecond",
},
{
ExchangeName: "zhios.order_free.exchange",
Name: "zhios_order_free",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "order_free",
BindKey: "",
ConsumeFunName: "ZhiosOrderFree",
},
{
ExchangeName: "zhios.user_up_lv.exchange",
Name: "zhios_user_up_lv",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "user_up_lv",
BindKey: "",
ConsumeFunName: "ZhiosUserUpLv",
},
{
ExchangeName: "zhios.integral_proxy_recharge.exchange",
Name: "zhios_integral_proxy_recharge",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "integral_proxy_recharge",
BindKey: "",
ConsumeFunName: "ZhiosIntegralProxyRecharge",
},
{
ExchangeName: "zhios.mall_green_coin_consume.exchange",
Name: "zhios_mall_green_coin_consume",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "mall_green_coin_consume",
BindKey: "",
ConsumeFunName: "ZhiosMallGreenCoinConsume",
ConsumeFunName: "CanalGuideOrderForStatistics",
},
{
ExchangeName: "canal.topic",
Name: "user_virtual_coin_flow_aggregation",
Name: "canal_fin_withdraw_apply_for_statistics",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_user_virtual_coin_flow_aggregation",
BindKey: "",
ConsumeFunName: "ZhiosOneCirclesCoinConsume",
},
{
ExchangeName: "canal.topic",
Name: "canal_user_virtual_coin_flow",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "canal_user_virtual_coin_flow",
BindKey: "",
ConsumeFunName: "CanalUserVirtualCoinFlowConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_sign_in_green_energy",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "sign_in",
BindKey: "",
ConsumeFunName: "OneCirclesSignInGreenEnergyConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_start_level_dividend",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "star_level_dividend",
BindKey: "",
ConsumeFunName: "OneCirclesStartLevelDividendConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_auto_exchange_green_energy_to_person_1",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "auto_exchange_green_energy_to_person_1",
BindKey: "",
ConsumeFunName: "OneCirclesActivityCoinAutoExchangeGreenEnergyConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_auto_exchange_green_energy_to_team",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "auto_exchange_green_energy_to_team",
BindKey: "",
ConsumeFunName: "OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_settlement_public_give_activity_coin",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "settlement_public_give_activity_coin",
BindKey: "",
ConsumeFunName: "OneCirclesSettlementPublicGiveActivityCoinConsume",
},
{
ExchangeName: "one.circles",
Name: "one_circles_sign_in_green_energy_copy",
Type: TopicQueueType,
IsPersistent: false,
RoutKey: "sign_in_copy",
BindKey: "",
ConsumeFunName: "OneCirclesSignInCopyGreenEnergyConsume",
},
{
ExchangeName: "zhios.app.user.withdraw.apply.exchange",
Name: "zhios_app_user_withdraw_apply_queue",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "queues_one",
BindKey: "",
ConsumeFunName: "WithdrawConsume",
},
{
ExchangeName: "zhios.app.user.withdraw.apply.flexible.employment.exchange",
Name: "zhios_app_user_withdraw_apply_gongmao_queue",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "gongmao",
BindKey: "",
ConsumeFunName: "FlexibleEmploymentWithdrawForGongMaoConsume",
},
{
ExchangeName: "zhios.app.user.withdraw.apply.flexible.employment.exchange",
Name: "zhios_app_user_withdraw_apply_pupiao_queue",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "pupiao",
BindKey: "",
ConsumeFunName: "FlexibleEmploymentWithdrawForPupiaoConsume",
},
{
ExchangeName: "installment.payment",
Name: "zhios_installment_payment_auto_repaid",
Type: DirectQueueType,
IsPersistent: false,
RoutKey: "auto_repaid",
RoutKey: "canal_fin_withdraw_apply",
BindKey: "",
ConsumeFunName: "InstallmentPaymentAutoRepaidConsume",
ConsumeFunName: "CanalFinWithdrawApplyForStatistics",
},
}

const (
ZhiosUserRelateFunName = "ZhiosUserRelate"
ZhiosIntegralProxyRechargeFunName = "ZhiosIntegralProxyRecharge"
ZhiosMallGreenCoinConsumeFunName = "ZhiosMallGreenCoinConsume"
ZhiosOneCirclesCoinConsumeFunName = "ZhiosOneCirclesCoinConsume"
ZhiosUserUpLvFunName = "ZhiosUserUpLv"
CanalGuideOrderByUserUpLvConsume = "CanalGuideOrderByUserUpLvConsume"
ZhiosOrderFreeFunName = "ZhiosOrderFree"
ZhiosOrderSettleTotalFunName = "ZhiosOrderSettleTotal"
ZhiosOrderTotalFunName = "ZhiosOrderTotal"
ZhiosOrderTotalSecondFunName = "ZhiosOrderTotalSecond"
ZhiosOrderHjyFunName = "ZhiosOrderHjy"
ZhiosOrderBuckleFunName = "ZhiosOrderBuckle"
ZhiosSupplierAfterOrderFunName = "ZhiosSupplierAfterOrder"
CanalOrderConsumeFunName = "CanalOrderConsume"
CanalGuideOrderConsumeFunName = "CanalGuideOrderConsume"
ZhiOsUserVisitIpAddressConsumeFunName = "ZhiOsUserVisitIpAddressConsume"
DouShenUserRegisterConsumeForOfficialFunName = "DouShenUserRegisterConsumeForOfficial"
DouShenUserRegisterConsumeForOperationCenterFunName = "DouShenUserRegisterConsumeForOperationCenter"
DouShenUserRegisterConsumeForMyRecommenderFunName = "DouShenUserRegisterConsumeForMyRecommender"
DouShenUserRegisterConsumeForMyFansFunName = "DouShenUserRegisterConsumeForMyFans"
DouShenUserRegisterConsumeForUserRegisterUpLvFunName = "DouShenUserRegisterConsumeForUserRegisterUpLv"
ZhiosFastReturnOrderPayFunName = "ZhiosFastReturnOrderPay"
ZhiosFastReturnOrderSuccessFunName = "ZhiosFastReturnOrderSuccess"
ZhiosFastReturnOrderRefundFunName = "ZhiosFastReturnOrderRefund"
ZhiosFastReturnOrderRefundSecondFunName = "ZhiosFastReturnOrderRefundSecond"
CanalMallOrdForYouMiShangFunName = "CanalMallOrdForYouMiShang"
YoumishangExchangeStoreFunName = "YoumishangExchangeStore"
ZhiosRechargeOrderFailFunName = "ZhiosRechargeOrderFail"
ZhiosRechargeOrderFailDevFunName = "ZhiosRechargeOrderFailDev"
ZhiosCapitalPoolOrderTotalFunName = "ZhiosCapitalPoolOrderTotal"
ZhiosExpressOrderFail = "zhiosExpressOrderFail"
ZhiosWithdrawReward = "zhiosWithdrawReward"
ZhiosTikTokUpdateFunName = "ZhiosTikTokUpdate"
ZhiosTikTokAllUpdateFunName = "ZhiosTikTokAllUpdate"
CloudIssuanceAsyncMLoginFunName = "CloudIssuanceAsyncMLoginConsume"
CloudIssuanceMsgCallBackFunName = "CloudIssuanceMsgCallBackConsume"
SuperCloudIssuanceAsyncMLoginFunName = "SuperCloudIssuanceAsyncMLoginConsume"
SuperCloudIssuanceMsgCallBackFunName = "SuperCloudIssuanceMsgCallBackConsume"
ZhiosAcquisitionConditionFunName = "ZhiosAcquisitionCondition"
ZhiosValidUserFunName = "ZhiosValidUser"
ZhiosAppreciationFunName = "ZhiosAppreciation"
ZhiosAppreciationDevFunName = "ZhiosAppreciationDev"
ZhiosGuideStoreOrderFunName = "ZhiosGuideStoreOrder"
ZhiosAcquisitionConditionDevFunName = "ZhiosAcquisitionConditionDev"
SupplyCloudChainFenxiaoNewChangeFunName = "SupplyCloudChainFenxiaoNewChangeConsume"
MallAddSupplyGoodsFunName = "MallAddSupplyGoodsConsume"
CanalUserVirtualCcoinFlowFunName = "CanalUserVirtualCoinFlowConsume"
OneCirclesSignInGreenEnergyFunName = "OneCirclesSignInGreenEnergyConsume"
OneCirclesStartLevelDividendFunName = "OneCirclesStartLevelDividendConsume"
OneCirclesSignInCopyGreenEnergyFunName = "OneCirclesSignInCopyGreenEnergyConsume"
OneCirclesActivityCoinAutoExchangeGreenEnergyFunName = "OneCirclesActivityCoinAutoExchangeGreenEnergyConsume"
OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamFunName = "OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume"
OneCirclesSettlementPublicGiveActivityCoinFunName = "OneCirclesSettlementPublicGiveActivityCoinConsume"
WithdrawConsumeFunName = "WithdrawConsume"
FlexibleEmploymentWithdrawForGongMaoConsumeFunName = "FlexibleEmploymentWithdrawForGongMaoConsume"
FlexibleEmploymentWithdrawForPupiaoConsumeFunName = "FlexibleEmploymentWithdrawForPupiaoConsume"
ZhiosTaskTotal = "zhiosTaskTotal"
InstallmentPaymentAutoRepaidConsumeFunName = "InstallmentPaymentAutoRepaidConsume"
CanalFinWithdrawApplyForStatistics = "CanalFinWithdrawApplyForStatistics"
CanalGuideOrderForStatistics = "CanalGuideOrderForStatistics"
)

+ 22
- 0
consume/md/md_canal_fin_withdraw_apply_consume.go ファイルの表示

@@ -0,0 +1,22 @@
package md

type CanalFinWithdrawApply struct {
Id string `json:"id"`
Amount string `json:"amount"`
State string `json:"state"`
CreateAt string `json:"create_at"`
FeeType string `json:"fee_type"`
}

type CanalFinWithdrawApplyMessage[T any] struct {
Data []T `json:"data"`
Database string `json:"database"`
ES int64 `json:"es"`
ID int64 `json:"id"`
IsDdl bool `json:"isDdl"`
Old []T `json:"old"`
PkNames []string `json:"pkNames"`
Table string `json:"table"`
TS int64 `json:"ts"`
Type string `json:"type"`
}

+ 5
- 0
consume/md/md_canal_guide_order_consume.go ファイルの表示

@@ -16,6 +16,11 @@ type CanalGuideOrder struct {
ItemNum string `json:"item_num"`
SysCommission string `json:"sys_commission"`
CreateAt string `json:"create_at"`
PvdSettleAt string `json:"pvd_settle_at"`
SettleAt string `json:"settle_at"`
Pvd string `json:"pvd"`
Ext string `json:"ext"`
BenefitAll string `json:"benefit_all"`
}

type CanalGuideOrderMessage[T any] struct {


+ 0
- 159
consume/one_circles_activity_coin_auto_exchange_green_energy_consume.go ファイルの表示

@@ -1,159 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
utils2 "applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"applet/mall/utils"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
db2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles/enum"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles/svc"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func OneCirclesActivityCoinAutoExchangeGreenEnergyConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>OneCirclesActivityCoinAutoExchangeGreenEnergyConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(40)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleOneCirclesActivityCoinAutoExchangeGreenEnergyConsume(res.Body)
if err != nil {
fmt.Println("OneCirclesActivityCoinAutoExchangeGreenEnergyConsume_ERR:::::", err.Error())
utils2.FilePutContents("OneCirclesActivityCoinAutoExchangeGreenEnergyConsume_ERR", utils2.SerializeStr(map[string]interface{}{
"body": res.Body,
"err": err.Error(),
}))
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleOneCirclesActivityCoinAutoExchangeGreenEnergyConsume(msgData []byte) error {
time.Sleep(time.Duration(100) * time.Microsecond) //休眠0.1毫秒
//1、解析mq中queue的数据结构体
var msg *md2.OneCirclesStructForAutoExchangeGreenEnergy
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
engine := db.DBs[msg.MasterId]
//2、查找 `one_circles_green_energy_basic_setting` 基础设置
oneCirclesGreenEnergyBasicSetting, cb, err := svc.GetPrice(engine, msg.MasterId)
if err != nil {
return err
}
if cb != nil {
defer cb() // 释放锁
}
//oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
// "key": "is_open",
// "value": 1,
//})
//if err != nil {
// return err
//}
//if oneCirclesGreenEnergyBasicSetting == nil {
// return nil
//}

session := engine.NewSession()
defer func() {
session.Close()
if err := recover(); err != nil {
_ = logx.Error(err)
}
}()
session.Begin()
//3.1计算涨价公式
err1, values, _, afterPriceValue := one_circles.NewCalcPriceIncreaseFormula(msg.AutoExchangeNumsAmount, oneCirclesGreenEnergyBasicSetting)
if err1 != nil {
_ = session.Rollback()
return err1
}
//3.2给相应的用户加上个人的绿色积分(可用数量)
err = rule.DealUserCoin(session, md2.DealUserCoinReq{
Kind: "add",
Mid: msg.MasterId,
Title: md2.OneCirclesPersonalActiveCoinExchangeGreenEnergy,
TransferType: md2.OneCirclesPersonalActiveCoinExchangeGreenEnergyForUserVirtualCoinFlow,
OrdId: "",
CoinId: oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId,
Uid: msg.Uid,
Amount: utils.StrToFloat64(values),
})
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::33333", err.Error())
return err
}

//4.1给相应的用户减去个人活跃积分
err = rule.DealUserCoin(session, md2.DealUserCoinReq{
Kind: "sub",
Mid: msg.MasterId,
Title: md2.OneCirclesPersonalActiveCoinExchangeToBeGreenEnergy,
TransferType: md2.OneCirclesPersonalActiveCoinExchangeToBeGreenEnergyForUserVirtualCoinFlow,
OrdId: "",
CoinId: msg.CoinId,
Uid: msg.Uid,
Amount: utils.StrToFloat64(msg.Amount),
})
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::33333", err.Error())
return err
}
//4.2减少“原始数量”中的绿色能量
err = one_circles.DealAvailableGreenEnergyCoin(session, int(enum.PersonalActivePointRedemption), utils.StrToFloat64(values), utils.StrToFloat64(msg.AutoExchangeNumsAmount), enum.PersonalActivePointRedemption.String(), oneCirclesGreenEnergyBasicSetting, afterPriceValue)
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::44444", err.Error())
return err
}

//5、修改 one_circles_green_energy_basic_setting 的 now_price
_, err = db2.OneCirclesGreenEnergyBasicSettingUpdate(session, oneCirclesGreenEnergyBasicSetting.Id, oneCirclesGreenEnergyBasicSetting)
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::77777", err.Error())
return err
}
err = session.Commit()
if err != nil {
_ = session.Rollback()
return errors.New("事务提交失败")
}
return nil
}

+ 0
- 160
consume/one_circles_activity_coin_auto_exchange_green_energy_for_team_consume.go ファイルの表示

@@ -1,160 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
utils2 "applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"applet/mall/utils"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
db2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles/enum"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles/svc"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(20)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleOneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume(res.Body)
if err != nil {
fmt.Println("OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume_ERR:::::", err.Error())
utils2.FilePutContents("OneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume_ERR", utils2.SerializeStr(map[string]interface{}{
"body": res.Body,
"err": err.Error(),
}))
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleOneCirclesActivityCoinAutoExchangeGreenEnergyForTeamConsume(msgData []byte) error {
time.Sleep(time.Duration(200) * time.Microsecond) //休眠0.2毫秒
//1、解析mq中queue的数据结构体
var msg *md2.OneCirclesStructForAutoExchangeGreenEnergy
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
engine := db.DBs[msg.MasterId]
//2、查找 `one_circles_green_energy_basic_setting` 基础设置
oneCirclesGreenEnergyBasicSetting, cb, err := svc.GetPrice(engine, msg.MasterId)
if err != nil {
return err
}
if cb != nil {
defer cb() // 释放锁
}
//
//oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
// "key": "is_open",
// "value": 1,
//})
//if err != nil {
// return err
//}
//if oneCirclesGreenEnergyBasicSetting == nil {
// return nil
//}

session := engine.NewSession()
defer func() {
session.Close()
if err := recover(); err != nil {
_ = logx.Error(err)
}
}()
session.Begin()
//3.1计算涨价公式
err1, values, _, afterPriceValue := one_circles.NewCalcPriceIncreaseFormula(msg.AutoExchangeNumsAmount, oneCirclesGreenEnergyBasicSetting)
if err1 != nil {
_ = session.Rollback()
return err1
}
//3.2给相应的用户加上个人的绿色积分(结算数量)
err = rule.DealUserCoin(session, md2.DealUserCoinReq{
Kind: "add",
Mid: msg.MasterId,
Title: md2.OneCirclesTeamActiveCoinExchangeGreenEnergy,
TransferType: md2.OneCirclesTeamActiveCoinExchangeGreenEnergyForUserVirtualCoinFlow,
OrdId: "",
CoinId: oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId,
Uid: msg.Uid,
Amount: utils.StrToFloat64(values),
})
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::33333", err.Error())
return err
}

//4.1给相应的用户减去团队活跃积分
err = rule.DealUserCoin(session, md2.DealUserCoinReq{
Kind: "sub",
Mid: msg.MasterId,
Title: md2.OneCirclesTeamActiveCoinExchangeToBeGreenEnergy,
TransferType: md2.OneCirclesTeamActiveCoinExchangeToBeGreenEnergyForUserVirtualCoinFlow,
OrdId: "",
CoinId: msg.CoinId,
Uid: msg.Uid,
Amount: utils.StrToFloat64(msg.Amount),
})
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::33333", err.Error())
return err
}
//4.2减少“原始数量”中的绿色能量
err = one_circles.DealAvailableGreenEnergyCoin(session, int(enum.TeamActivePointRedemption), utils.StrToFloat64(values), utils.StrToFloat64(msg.AutoExchangeNumsAmount), enum.TeamActivePointRedemption.String(), oneCirclesGreenEnergyBasicSetting, afterPriceValue)
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::44444", err.Error())
return err
}

//5、修改 one_circles_green_energy_basic_setting 的 now_price
_, err = db2.OneCirclesGreenEnergyBasicSettingUpdate(session, oneCirclesGreenEnergyBasicSetting.Id, oneCirclesGreenEnergyBasicSetting)
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::77777", err.Error())
return err
}
err = session.Commit()
if err != nil {
_ = session.Rollback()
return errors.New("事务提交失败")
}
return nil
}

+ 0
- 100
consume/one_circles_settlement_public_activity_coin_consume.go ファイルの表示

@@ -1,100 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
utils2 "applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func OneCirclesSettlementPublicGiveActivityCoinConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>OneCirclesSettlementPublicGiveActivityCoinConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleOneCirclesSettlementPublicGiveActivityCoinConsume(res.Body)
if err != nil {
fmt.Println("OneCirclesSettlementPublicGiveActivityCoinConsume_ERR:::::", err.Error())
utils2.FilePutContents("OneCirclesSettlementPublicGiveActivityCoinConsume_ERR", utils2.SerializeStr(map[string]interface{}{
"body": res.Body,
"err": err.Error(),
}))
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleOneCirclesSettlementPublicGiveActivityCoinConsume(msgData []byte) error {
time.Sleep(time.Duration(2) * time.Millisecond) //休眠2毫秒
//1、解析mq中queue的数据结构体
var msg *md2.DealUserCoinReq
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
engine := db.DBs[msg.Mid]

session := engine.NewSession()
defer func() {
session.Close()
if err := recover(); err != nil {
_ = logx.Error(err)
}
}()
session.Begin()

err = rule.DealUserCoin(session, md2.DealUserCoinReq{
Kind: "add",
Mid: msg.Mid,
Title: msg.Title,
TransferType: msg.TransferType,
OrdId: "",
CoinId: msg.CoinId,
Uid: msg.Uid,
Amount: msg.Amount,
})
if err != nil {
_ = session.Rollback()
fmt.Println("err:::::2222", err)
return err
}

err = session.Commit()
if err != nil {
_ = session.Rollback()
return errors.New("事务提交失败")
}
return nil
}

+ 0
- 66
consume/one_circles_sign_in_consume.go ファイルの表示

@@ -1,66 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

func OneCirclesSignInGreenEnergyConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>OneCirclesSignInGreenEnergyConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleOneCirclesSignInGreenEnergy(res.Body)
if err != nil {
fmt.Println("OneCirclesSignInGreenEnergyConsume_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleOneCirclesSignInGreenEnergy(msgData []byte) error {
//1、解析mq中queue的数据结构体
var msg *md.OneCirclesStructForSignIn
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}

engine := db.DBs[msg.MasterId]
err = one_circles.HandleSettlementSignInGreenEnergy(engine, msg.MasterId, msg.Id, msg.Uid, msg.EndTime)
fmt.Println("err::::", err)
if err != nil {
return err
}
return nil
}

+ 0
- 66
consume/one_circles_sign_in_copy_consume.go ファイルの表示

@@ -1,66 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

func OneCirclesSignInCopyGreenEnergyConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>OneCirclesSignInCopyGreenEnergyConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleOneCirclesSignInCopyGreenEnergy(res.Body)
if err != nil {
fmt.Println("OneCirclesSignInCopyGreenEnergyConsume_ERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleOneCirclesSignInCopyGreenEnergy(msgData []byte) error {
//1、解析mq中queue的数据结构体
var msg *md.OneCirclesStructForSignIn
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}

engine := db.DBs[msg.MasterId]
err = one_circles.HandleSettlementSignInGreenEnergy(engine, msg.MasterId, msg.Id, msg.Uid, msg.EndTime)
fmt.Println("err::::", err)
if err != nil {
return err
}
return nil
}

+ 0
- 97
consume/one_circles_start_level_dividend_consume.go ファイルの表示

@@ -1,97 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
utils2 "applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
db2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func OneCirclesStartLevelDividendConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>OneCirclesStartLevelDividendConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleOneCirclesStartLevelDividendConsume(res.Body)
if err != nil {
fmt.Println("OneCirclesStartLevelDividendConsume_ERR:::::", err.Error())
utils2.FilePutContents("OneCirclesStartLevelDividendConsume_ERR", utils2.SerializeStr(map[string]interface{}{
"body": res.Body,
"err": err.Error(),
}))
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleOneCirclesStartLevelDividendConsume(msgData []byte) error {
time.Sleep(time.Duration(100) * time.Millisecond) //休眠100毫秒
//1、解析mq中queue的数据结构体
var msg *md.OneCirclesStructForStarLevelDividends
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
engine := db.DBs[msg.MasterId]
//2、查找 `one_circles_green_energy_basic_setting` 基础设置
oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
"key": "is_open",
"value": 1,
})
if err != nil {
return err
}
if oneCirclesGreenEnergyBasicSetting == nil {
return nil
}

//3、给相应的用户加上个人的绿色积分(结算数量)
session := engine.NewSession()
err = rule.DealUserCoin(session, md2.DealUserCoinReq{
Kind: "add",
Mid: msg.MasterId,
Title: md2.OneCirclesSettlementStarLevelDividends,
TransferType: md2.OneCirclesSettlementStarLevelDividendsForUserVirtualCoinFlow,
OrdId: "",
CoinId: oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId,
Uid: msg.Uid,
Amount: msg.SignDividend,
})
if err != nil {
return err
}
return nil
}

+ 0
- 125
consume/super_cloud_issuance_async_mlogin.go ファイルの表示

@@ -1,125 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils"
"applet/app/utils/cache"
tool "applet/app/utils/cloud_issuance"
"applet/app/utils/logx"
md2 "applet/cloud_issuance/md"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strconv"
"time"
)

func SuperCloudIssuanceAsyncMLoginConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>SuperCloudIssuanceAsyncMLoginConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
//解析mq中queue的数据结构体
var msg *md2.CloudIssuanceAsyncMLogin
err = json.Unmarshal(res.Body, &msg)
if err != nil {
panic(err)
}
go func() {
err := handleSuperAsyncMLogin(msg.WId, msg.MasterId, msg.UserId, msg.RobotId)
if err != nil {
fmt.Println("<<<<<<<<<<<< handleSuperAsyncMLogin err>>>>>>>>", err.Error())
}
}()
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleSuperAsyncMLogin(wId, masterId, userId string, robotId int) error {
var timeTotal = 0
for {
err, resp := robotSuperAsyncMacLogin(md2.RobotAsyncMacLoginRequest{
WId: wId,
RobotId: robotId,
})
if err == nil {
fmt.Println("success <<<<<<<", resp)
if cfg.Prd {
engine := db.DBs[masterId]
cloudIssuanceUserRobotDb := implement.NewSuperCloudIssuanceUserRobotDb(engine, utils.StrToInt(userId), masterId)
robot, err := cloudIssuanceUserRobotDb.GetSuperCloudIssuanceUserRobot()
if err != nil {
return err
}
if robot == nil {
return errors.New("未查询到机器人记录")
}
robot.WcId = resp.WcId
robot.WcNickname = resp.NickName
robot.WcHeadUrl = resp.HeadUrl
robot.LoginStatus = 1
_, err = cloudIssuanceUserRobotDb.SaveSuperCloudIssuanceUserRobot(robot.Id, robot, "wc_id", "wc_nickname", "wc_head_url", "login_status")
if err != nil {
return err
}
} else {
//TODO::测试环境, 简化操作 通过redis 桥接
cache.SetEx(fmt.Sprintf("super_cloud_issuance_async_login_success:%s:%s", masterId, userId), utils.SerializeStr(resp), 60*5)
}
return nil
}

fmt.Println("err>>>>>>>>", err.Error())
if err != nil && err.Error() != "未登录" {
return err
}
//TODO::休眠5s
time.Sleep(time.Duration(5) * time.Second)
timeTotal += 5
if timeTotal >= 240 {
return errors.New("超时未登录")
}
}
}

func robotSuperAsyncMacLogin(args md2.RobotAsyncMacLoginRequest) (err error, result md2.RobotAsyncMacLoginResponse) { // 同步登录状态
url := tool.HttpBuild("itaoke.robot.async.mlogin", "127.0.0.1", map[string]string{
"robot_id": strconv.Itoa(args.RobotId),
"wId": args.WId,
})
data, err := tool.SendPost(url, args)
if err != nil {
return
}
resByte, err := json.Marshal(data.Data)
if err != nil {
return
}
err = json.Unmarshal(resByte, &result)
if err != nil {
return
}
return
}

+ 0
- 72
consume/super_cloud_issuance_msg_callback.go ファイルの表示

@@ -1,72 +0,0 @@
package consume

import (
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
db "applet/super_cloud_issuance/db/official"
md2 "applet/super_cloud_issuance/md"
"applet/super_cloud_issuance/svc"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/streadway/amqp"
"time"
)

func SuperCloudIssuanceMsgCallBackConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(10)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>CloudIssuanceMsgCallBackConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
//解析mq中queue的数据结构体
var msg *md2.CallbackRequest
err = json.Unmarshal(res.Body, &msg)
if err != nil {
panic(err)
}
randInt := utils.RandIntRand(100, 200)
time.Sleep(time.Millisecond * time.Duration(randInt)) // 等待100 ~ 200毫秒
go func() {
//设置masterId
cloudIssuanceRobotRecords, err := db.SuperCloudIssuanceRobotRecordsGetOneByParams(map[string]interface{}{
"key": "robot_id",
"value": msg.RobotId,
})
if err != nil {
fmt.Println("CallBackErr:::::", err.Error())
return
}
if cloudIssuanceRobotRecords == nil {
//TODO::未查询到机器人,不需要处理
utils.FilePutContents("cloud_issuance_call_back_not_found", utils.SerializeStr(msg))
return
}
var c = &gin.Context{}
c.Set("mid", cloudIssuanceRobotRecords.MasterId)
dealCloudIssuanceCallBackService := svc.DealSuperCloudIssuanceCallBackService{}
dealCloudIssuanceCallBackService.Set(c)
dealCloudIssuanceCallBackService.DealCallBack(c, *msg)
}()
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

+ 0
- 227
consume/supply_cloud_chain_fenxiao_new_change.go ファイルの表示

@@ -1,227 +0,0 @@
package consume

import (
svc2 "applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
utils1688 "applet/supply/1688/utils"
"applet/supply/db"
"applet/supply/db/model"
"applet/supply/enum"
md2 "applet/supply/md"
"applet/supply/svc"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/streadway/amqp"
"strings"
"time"
)

func SupplyCloudChainFenxiaoNewChangeConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>SupplyCloudChainFenxiaoNewChangeConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleSupplyCloudChainFenxiaoNewChangeConsume(res.Body)
if err != nil {
fmt.Println("*****************err*************************", err)
}
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func RemoveRepeatedElement(arr []string) (newArr []string) {
newArr = make([]string, 0)
for i := 0; i < len(arr); i++ {
repeat := false
for j := i + 1; j < len(arr); j++ {
if arr[i] == arr[j] {
repeat = true
break
}
}
if !repeat {
newArr = append(newArr, arr[i])
}
}
return
}

func handleSupplyCloudChainFenxiaoNewChangeConsume(msgData []byte) error {
//解析mq中queue的数据结构体
var pushStuct struct {
Args struct {
md2.GoodsAddPriceConditions
} `json:"args"`
Mid string `json:"mid"`
}
err := json.Unmarshal(msgData, &pushStuct)
if err != nil {
panic(err)
}

//设置masterId
var c = &gin.Context{}
c.Set("mid", pushStuct.Mid)
var t struct {
md2.GoodsAddPriceConditions
}
t = pushStuct.Args
var idsMap = map[string]string{}
for _, v := range t.Ids {
idsMap[v] = v
}
var idsArray []string
for _, v := range idsMap {
idsArray = append(idsArray, v)
}
t.Ids = idsArray

basicSetting, _ := svc.GetSupplyBasicSetting(c)
if basicSetting == nil {
return errors.New("!!!!!功能开发中")
}
if basicSetting.AliCloudChainFenXiaoAppkey == "" || basicSetting.AliCloudChainFenXiaoAppsecret == "" || basicSetting.AliCloudChainFenXiaoAccesstoken == "" {
return errors.New("!!!!!必要参数没有填写,功能已暂停")
}
get, systemMerchant, err1 := db.GetSystemMerchant(svc2.MasterDb(c))
if err1 != nil {
return err1
}
if !get {
return errors.New("!!!!!请先去设置官方商家信息")
}
ids := RemoveRepeatedElement(t.Ids)
var tmpIds []string
var resultList []interface{}
for _, v := range ids {
tmpIds = append(tmpIds, v)
if len(tmpIds) >= 20 {
goodsFrom1688s, err := utils1688.GetFenXiaoProductInfoFrom1688(basicSetting.AliCloudChainFenXiaoAppkey, basicSetting.AliCloudChainFenXiaoAppsecret, basicSetting.AliCloudChainFenXiaoAccesstoken, tmpIds)
if err != nil {
return err
}
result, ok := goodsFrom1688s["result"].(map[string]interface{})
if !ok {
return errors.New("!!!!!错误的数据")
}
if message, ok := result["message"]; ok {
fmt.Println("!!!!!!!!!!!!", message, "!!!!!!!!!!")
return errors.New("message 反射失败1")
}
tmpResultList, ok := result["result"].([]interface{})
if !ok {
return errors.New("!!!!!!错误的数据2")
}
if len(tmpResultList) == 0 {
return errors.New("!!!!!!错误的数据3")
}
for _, vv := range tmpResultList {
resultList = append(resultList, vv)
}
tmpIds = []string{}
}
}

if len(tmpIds) >= 0 {
goodsFrom1688s, err := utils1688.GetFenXiaoProductInfoFrom1688(basicSetting.AliCloudChainFenXiaoAppkey, basicSetting.AliCloudChainFenXiaoAppsecret, basicSetting.AliCloudChainFenXiaoAccesstoken, tmpIds)
if err != nil {
return err
}
result, ok := goodsFrom1688s["result"].(map[string]interface{})
if !ok {
return errors.New("!!!!!!错误的数据4")
}
if message, ok := result["message"]; ok {
fmt.Println("!!!!!", message)
return errors.New("message 反射失败2")
}
tmpResultList, ok := result["result"].([]interface{})
if !ok {
return errors.New("!!!!!!错误的数据4")
}
if len(tmpResultList) == 0 {
return errors.New("!!!!!!错误的数据5")
}
for _, vv := range tmpResultList {
resultList = append(resultList, vv)
}
}

var cloudChainGoods = map[string]map[string]interface{}{}
for _, v := range resultList {
tmp, ok1 := v.(map[string]interface{})
if !ok1 {
return errors.New("!!!!!!错误的数据6")
}
productInfo, ok1 := tmp["productInfo"].(map[string]interface{})
if !ok1 {
return errors.New("!!!!!!错误的数据7")
}
var productId = utils.AnyToString(productInfo["productID"])
for strings.HasSuffix(productId, "0") {
productId = strings.TrimSuffix(productId, "0")
}
if strings.HasSuffix(productId, ".") {
productId = strings.TrimSuffix(productId, ".")
}
cloudChainGoods[productId] = tmp
}

utils.FilePutContents("cloudChainGoods", utils.SerializeStr(cloudChainGoods))
for _, id := range ids {
if cloudChainGoods[id] == nil {
continue
}
var goods model.MallGoods
goods.CloudChainGoodsId = id
goods.MerchantId = systemMerchant.Id
getV2, err11 := goods.GetV2(svc2.MasterDb(c))
if err11 != nil {
fmt.Println("!!!!!!", err11.Error())
continue
}
if getV2 {
continue
}
var req md2.AddGoodsReq
req.Base.GoodsType = 1
req.Base.CloudChainGoodsId = id
req.Base.SaleState = enum.MallGoodsSaleStateOnShelf
req.Base.CategoryId = utils.StrToInt(t.CategoryId)
req.Base.MerchantId = systemMerchant.Id

err := svc.CloudChainFenXiaoGoodsChangeMallGoods(c, cloudChainGoods[id], &req)
if err != nil {
return err
}

err111 := svc.AddMallGoods(c, &req)
if err111 != nil {
return err111
}
time.Sleep(12 * time.Millisecond)
}
return nil
}

+ 0
- 100
consume/withdraw_consume.go ファイルの表示

@@ -1,100 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func WithdrawConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>WithdrawConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleWithdrawConsume(res.Body)
fmt.Println("err ::: ", err)
if err != nil {
fmt.Println("WithdrawConsume_ERR:::::", err.Error())
//_ = res.Reject(true)
_ = res.Reject(false)
var msg interface{}
json.Unmarshal(res.Body, &msg)
if err.Error() == "Connection timed out" {
//TODO::重新推回队列末尾,避免造成队列堵塞
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
} else {
//TODO::推入新的队列中备份
utils.FilePutContents("WithdrawConsume_ERR", utils.SerializeStr(err.Error()))
ch.Publish("zhios.app.user.withdraw.apply.exception.exchange", msg, "queues_one")
}
} else {
err = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleWithdrawConsume(msgData []byte) error {
time.Sleep(time.Microsecond * 200) // 等待200毫秒
//1、解析mq中queue的数据结构体
var msg interface{}
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
fmt.Println("message:::::::::::>>>>>>>>>")
fmt.Println(msg)
var url = "http://admin.99813608.zhiyingos.com/index/transfer"
if cfg.Prd {
url = "http://zhios-admin/index/transfer"
}
post, err := utils.CurlPost(url, msg, nil)
if err != nil {
return err
}
fmt.Println("transfer:::::::::::<<<<<<<<<")
fmt.Println(string(post), "\n========================================\n\n")
var postResult struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
IsOk bool `json:"isOk"`
Msg string `json:"msg"`
} `json:"data"`
}
err = json.Unmarshal(post, &postResult)
if err != nil {
return err
}
if !postResult.Data.IsOk {
return errors.New(postResult.Data.Msg)
}
return nil
}

+ 0
- 165
consume/withdraw_consume_gongmao.go ファイルの表示

@@ -1,165 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
db2 "applet/app/flexible_employment/db"
"applet/app/flexible_employment/enum"
"applet/app/flexible_employment/svc"
"applet/app/lib/flexible_employment"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func FlexibleEmploymentWithdrawForGongMaoConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>FlexibleEmploymentWithdrawForGongMaoConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleFlexibleEmploymentWithdrawForGongMaoConsume(res.Body)
fmt.Println("err ::: ", err)
if err != nil {
fmt.Println("FlexibleEmploymentWithdrawForGongMaoConsume_ERR:::::", err.Error())
_ = res.Reject(true) //TODO::拒绝 Ack
//_ = res.Reject(false)
var msg interface{}
json.Unmarshal(res.Body, &msg)
if err.Error() == "Connection timed out" {
//TODO::重新推回队列末尾,避免造成队列堵塞
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
} else {
//TODO::推入新的队列中备份
utils.FilePutContents("FlexibleEmploymentWithdrawForGongMaoConsume_ERR", utils.SerializeStr(err.Error()))
ch.Publish("zhios.app.user.withdraw.apply.exception.exchange", msg, "gongmao")
}
} else {
err = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleFlexibleEmploymentWithdrawForGongMaoConsume(msgData []byte) error {
var ms string
err := json.Unmarshal(msgData, &ms)
if err != nil {
return err
}
time.Sleep(time.Microsecond * 200) // 等待200毫秒
//1、解析mq中queue的数据结构体
var msg struct {
Uid string `json:"uid"`
Nickname string `json:"nickname"`
MasterId string `json:"master_id"`
AppName string `json:"app_name"`
ApplyOrder string `json:"apply_order"`
ActualAmount string `json:"actual_amount"`
MobCfg interface{} `json:"mob_cfg"`
}
err = json.Unmarshal([]byte(ms), &msg)
if err != nil {
return err
}
fmt.Println("gongmao_message:::::::::::>>>>>>>>>")
fmt.Println(msg)
if db.DBs[msg.MasterId] == nil {
return nil
}
engine := db.DBs[msg.MasterId]

//1、查找对应记录
flexibleEmploymentOrdDb := db2.FlexibleEmploymentOrdDb{}
flexibleEmploymentOrdDb.Set(msg.MasterId)
flexibleEmploymentOrd, err := flexibleEmploymentOrdDb.Get(msg.ApplyOrder)
if err != nil {
return err
}
if flexibleEmploymentOrd == nil {
return errors.New("未查询到对应订单记录")
}

flexibleEmploymentBasicDb := db2.FlexibleEmploymentBasicDb{}
flexibleEmploymentBasicDb.Set()
basic, err := flexibleEmploymentBasicDb.Get(msg.MasterId)
if err != nil {
return err
}
gongMao := flexible_employment.New(basic.AppKey, basic.AppSecret, basic.SecretId)
result, err := gongMao.Curl(enum.MerchantDoSinglePayment, map[string]interface{}{
"requestId": flexibleEmploymentOrd.RequestId,
"mobile": flexibleEmploymentOrd.Mobile,
"name": flexibleEmploymentOrd.Name,
"amount": flexibleEmploymentOrd.Amount,
"identity": flexibleEmploymentOrd.Identity,
"bankAccount": flexibleEmploymentOrd.BankAccount,
"dateTime": time.Now().Format("20060102150405"),
"salaryType": flexibleEmploymentOrd.SettleType,
})
if err != nil {
return err
}
var response struct {
Success bool `json:"success"`
ErrorCode string `json:"errorCode"`
ErrorMsg string `json:"errorMsg"`
Data struct {
RequestId string `json:"requestId"`
AppmentTime string `json:"appmentTime"`
} `json:"data"`
}
if err = json.Unmarshal(utils.Serialize(result), &response); err != nil {
return err
}
if !response.Success {
//TODO::发起提现失败,将处理提现失败状态
finWithdrawApply, err := db.UserWithDrawApplyByUIDById(engine, flexibleEmploymentOrd.RequestId)
if err != nil {
return err
}
session := engine.NewSession()
defer session.Close()
session.Begin()
err = svc.DealFailResult(session, finWithdrawApply, msg.MasterId, response.ErrorMsg)
if err != nil {
_ = session.Rollback()
return err
}
return session.Commit()
}
flexibleEmploymentOrd.State = 1
updateAck, err := flexibleEmploymentOrdDb.Update(flexibleEmploymentOrd.Id, flexibleEmploymentOrd, "state")
if err != nil {
return err
}
if updateAck <= 0 {
return errors.New("更新 flexible_employment_ord 状态失败")
}
return nil
}

+ 0
- 185
consume/withdraw_consume_pupiao.go ファイルの表示

@@ -1,185 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
db2 "applet/app/flexible_employment/db"
"applet/app/flexible_employment/enum"
"applet/app/flexible_employment/svc"
"applet/app/flexible_employment/utils/aes"
"applet/app/lib/flexible_employment"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func FlexibleEmploymentWithdrawForPupiaoConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>FlexibleEmploymentWithdrawForPupiaoConsume>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

one_circles.Init(cfg.RedisAddr)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
err = handleFlexibleEmploymentWithdrawForPupiaoConsume(res.Body)
fmt.Println("err ::: ", err)
if err != nil {
fmt.Println("FlexibleEmploymentWithdrawForPupiaoConsume_ERR:::::", err.Error())
//_ = res.Reject(true)
_ = res.Reject(false)
var msg interface{}
json.Unmarshal(res.Body, &msg)
if err.Error() == "Connection timed out" {
//TODO::重新推回队列末尾,避免造成队列堵塞
ch.Publish(queue.ExchangeName, msg, queue.RoutKey)
} else {
//TODO::推入新的队列中备份
utils.FilePutContents("FlexibleEmploymentWithdrawForPupiaoConsume_ERR", utils.SerializeStr(err.Error()))
ch.Publish("zhios.app.user.withdraw.apply.exception.exchange", msg, "pupiao")
}
} else {
err = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleFlexibleEmploymentWithdrawForPupiaoConsume(msgData []byte) error {
var ms string
err := json.Unmarshal(msgData, &ms)
if err != nil {
return err
}
time.Sleep(time.Microsecond * 200) // 等待200毫秒
//1、解析mq中queue的数据结构体
var msg struct {
Uid string `json:"uid"`
Nickname string `json:"nickname"`
MasterId string `json:"master_id"`
AppName string `json:"app_name"`
ApplyOrder string `json:"apply_order"`
ActualAmount string `json:"actual_amount"`
Oid string `json:"oid"`
MobCfg interface{} `json:"mob_cfg"`
}
err = json.Unmarshal([]byte(ms), &msg)
if err != nil {
return err
}
fmt.Println("pupiao_message:::::::::::>>>>>>>>>")
fmt.Println(msg)
if db.DBs[msg.MasterId] == nil {
return nil
}
engine := db.DBs[msg.MasterId]

//1、查找对应记录
flexibleEmploymentPupiaoOrdDb := db2.FlexibleEmploymentPupiaoOrdDb{}
flexibleEmploymentPupiaoOrdDb.Set(msg.MasterId)
flexibleEmploymentPupiaoOrd, err := flexibleEmploymentPupiaoOrdDb.Get(msg.Oid)
if err != nil {
return err
}
if flexibleEmploymentPupiaoOrd == nil {
return errors.New("未查询到对应订单记录")
}

flexibleEmploymentPuiaoBasicDb := db2.FlexibleEmploymentPuiaoBasicDb{}
flexibleEmploymentPuiaoBasicDb.Set()
basic, err := flexibleEmploymentPuiaoBasicDb.GetBasic(msg.MasterId)
if err != nil {
return err
}

//2、发起制单
puPiao := flexible_employment.NewPuPiao(basic.AppId, basic.AppSecret)
var userAESData = []map[string]string{
{
"outTradeNo": "o_" + utils.Int64ToStr(flexibleEmploymentPupiaoOrd.WithdrawApplyId),
"settleType": flexibleEmploymentPupiaoOrd.SettleType,
"payeeName": flexibleEmploymentPupiaoOrd.PayeeName,
"payeeIdCard": flexibleEmploymentPupiaoOrd.PayeeIdCard,
"payeePhone": flexibleEmploymentPupiaoOrd.PayeePhone,
"payeeNo": flexibleEmploymentPupiaoOrd.PayeeNo,
"orderAmount": flexibleEmploymentPupiaoOrd.TotalAmount,
},
}
str, _ := json.Marshal(userAESData)
itemAESContent, _ := aes.AesEncryptByECB([]byte(basic.AppSecret), string(str))
settleAccountId := basic.SettleAccountId
if flexibleEmploymentPupiaoOrd.SettleType == "ALIPAY" {
settleAccountId = basic.SettleAccountIdForAli
}
result, err := puPiao.Curl(enum.OpenApiPaymentReceiveOrder, map[string]interface{}{
"outBatchNo": flexibleEmploymentPupiaoOrd.OutBatchNo,
"hrcompanyId": basic.HrCompanyId,
"settleAccountId": settleAccountId,
"totalCount": "1",
"totalAmount": flexibleEmploymentPupiaoOrd.TotalAmount,
"itemAESContent": itemAESContent,
})
if err != nil {
return err
}
var response struct {
IsSuccess string `json:"isSuccess"`
Charset string `json:"charset"`
ErrorCode string `json:"errorCode"`
ErrorMsg string `json:"errorMsg"`
Data struct {
PlatformBatchNo string `json:"platformBatchNo"`
OutBatchNo string `json:"outBatchNo"`
} `json:"data"`
}
if err = json.Unmarshal(utils.Serialize(result), &response); err != nil {
return err
}
if response.IsSuccess == "F" {
flexibleEmploymentPupiaoOrd.BatchStatus = 1
updateAck, err := flexibleEmploymentPupiaoOrdDb.Update(flexibleEmploymentPupiaoOrd.Id, flexibleEmploymentPupiaoOrd, "batch_status")
if err != nil {
return err
}
if updateAck <= 0 {
return errors.New("更新 flexible_employment_pupiao_ord 状态失败")
}
//TODO::制单失败,将处理提现失败状态
finWithdrawApply, err := db.UserWithDrawApplyByUIDById(engine, utils.Int64ToStr(flexibleEmploymentPupiaoOrd.WithdrawApplyId))
if err != nil {
return err
}
session := engine.NewSession()
defer session.Close()
session.Begin()
err = svc.DealFailResultForPuPiao(session, finWithdrawApply, msg.MasterId, response.ErrorMsg)
if err != nil {
_ = session.Rollback()
return err
}
return session.Commit()
}
return nil
}

+ 0
- 679
consume/zhios_acquisition_condition.go ファイルの表示

@@ -1,679 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
"time"
"xorm.io/xorm"
)

func ZhiosAcquisitionCondition(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(300)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>ZhiosAcquisitionCondition<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosAcquisition(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
if err == nil {
_ = res.Ack(true)
} else {

var canalMsg *md.ZhiosAcquisition
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err == nil {
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err == nil {
ch.Publish(queue.ExchangeName, utils.SerializeStr(canalMsg), queue.RoutKey)
}
}

}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}
func handleZhiosAcquisition(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAcquisition
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
if canalMsg.Uid == "" {
return nil
}
userInfo, _ := db.UserFindByID(eg, canalMsg.Uid)
if userInfo == nil {
return nil
}
userProfile, _ := db.UserProfileFindByID(eg, canalMsg.Uid)
if userProfile == nil {
return nil
}
cfg := db.GetAcquisitionCfg(eg, canalMsg.Id, userInfo.CreateAt)
if cfg == nil {
return nil
}
nextUserProfile, _ := db.UserProfileFindByID(eg, userProfile.ParentUid)
var user = &md.User{Info: userInfo, Profile: userProfile}

bools, str := checkAllCompleteTmp(eg, user, cfg)
isFull := 0
fullTime := 0
toRewardTime := 0
if bools {
isFull = 1
fullTime = int(time.Now().Unix())
toRewardTime = int(time.Now().Unix()) + utils.StrToInt(cfg.RewardAccountDay)*86400
}
//写入奖励记录

//新的设置 读第一个新注册的奖励
lv := 0
if len(cfg.RewardRule.LvRewardList) > 0 {
isEnd := 0
for k, v := range cfg.RewardRule.LvRewardList {
if isEnd == 1 {
continue
}
if utils.StrToInt(v.Id) == user.Info.Level {
isEnd = 1
}
lv = utils.StrToInt(v.Id)
if cfg.RewardRule.NewRewardCoinId != "" {
ex := strings.Split(cfg.RewardRule.NewRewardCoinId, ",")
for _, v1 := range v.CoinList {
if utils.InArr(v1.CoinId, ex) {
InvitedReward := v1.InvitedReward
if cfg.RewardRule.RewardType == "1" {
InvitedReward = Rands(v1.InvitedReward, v1.InvitedRewardMax)
}
//直推
DirectSuccess := v1.DirectSuccess
if cfg.RewardRule.RewardType == "1" {
DirectSuccess = Rands(v1.DirectSuccess, v1.DirectSuccessMax)
}
//间推
IndirectSuccess := v1.IndirectSuccess
if cfg.RewardRule.RewardType == "1" {
IndirectSuccess = Rands(v1.IndirectSuccess, v1.IndirectSuccessMax)
}
InvitedSource := 0
DirectSource := 1
IndirectSource := 2
InvitedSourceStr := "注册奖励"
DirectSourceStr := "直推好友"
IndirectSourceStr := "间推好友"
if k > 0 {
InvitedSource = 3
DirectSource = 4
IndirectSource = 5
InvitedSourceStr = "升级" + v.Name + "奖励"
DirectSourceStr = "直推好友升级" + v.Name + "奖励"
IndirectSourceStr = "间推好友升级" + v.Name + "奖励"
}
if utils.StrToFloat64(InvitedReward) > 0 {
ownRewardLog, ownhas, _ := db.GetNewAcquisitionRewardLogWhereCoinId(eg, userProfile.Uid, user.Profile.Uid, lv, utils.StrToInt(v1.CoinId))
if !ownhas {
ownRewardLog = &model.NewAcquisitionRewardLog{
Uid: user.Profile.Uid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: InvitedSource,
SourceText: InvitedSourceStr,
Money: InvitedReward,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(v1.CoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}

db.InsertNewRewardLog(eg, ownRewardLog)
}
if ownRewardLog.GivenAt == 0 {

ownRewardLog.CompleteCon = str
ownRewardLog.IsFull = isFull
if ownRewardLog.FullTime == 0 {
ownRewardLog.FullTime = fullTime
}
if ownRewardLog.ToRewardTime == 0 {
ownRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", ownRewardLog.Id).Update(ownRewardLog)
}
}
if utils.StrToFloat64(DirectSuccess) > 0 {
if userProfile.ParentUid > 0 {
//写入奖励记录
extendRewardLog, extendHas, _ := db.GetNewAcquisitionRewardLogWhereCoinId(eg, userProfile.ParentUid, userProfile.Uid, lv, utils.StrToInt(v1.CoinId))
if !extendHas {
extendRewardLog = &model.NewAcquisitionRewardLog{
Uid: user.Profile.ParentUid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: DirectSource,
SourceText: DirectSourceStr,
Money: DirectSuccess,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(v1.CoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}
db.InsertNewRewardLog(eg, extendRewardLog)
}
if extendRewardLog.GivenAt == 0 {

extendRewardLog.CompleteCon = str
extendRewardLog.IsFull = isFull
if extendRewardLog.FullTime == 0 {
extendRewardLog.FullTime = fullTime
}
if extendRewardLog.ToRewardTime == 0 {
extendRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", extendRewardLog.Id).Update(extendRewardLog)
}
}
}
if utils.StrToFloat64(IndirectSuccess) > 0 {
if nextUserProfile != nil && nextUserProfile.ParentUid > 0 {
IndirectRewardLog, IndirectHas, _ := db.GetNewAcquisitionRewardLogWhereCoinId(eg, nextUserProfile.ParentUid, userProfile.Uid, lv, utils.StrToInt(v1.CoinId))
if !IndirectHas {
IndirectRewardLog = &model.NewAcquisitionRewardLog{
Uid: nextUserProfile.ParentUid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: IndirectSource,
SourceText: IndirectSourceStr,
Money: IndirectSuccess,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(v1.CoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}
db.InsertNewRewardLog(eg, IndirectRewardLog)
}
if IndirectRewardLog.GivenAt == 0 {
IndirectRewardLog.CompleteCon = str
IndirectRewardLog.IsFull = isFull
if IndirectRewardLog.FullTime == 0 {
IndirectRewardLog.FullTime = fullTime
}
if IndirectRewardLog.ToRewardTime == 0 {
IndirectRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", IndirectRewardLog.Id).Update(IndirectRewardLog)
}
}
}
}
}

} else {
InvitedReward := v.InvitedReward
if cfg.RewardRule.RewardType == "1" {
InvitedReward = Rands(v.InvitedReward, v.InvitedRewardMax)
}
//直推
DirectSuccess := v.DirectSuccess
if cfg.RewardRule.RewardType == "1" {
DirectSuccess = Rands(v.DirectSuccess, v.DirectSuccessMax)
}
//间推
IndirectSuccess := v.IndirectSuccess
if cfg.RewardRule.RewardType == "1" {
IndirectSuccess = Rands(v.IndirectSuccess, v.IndirectSuccessMax)
}
InvitedSource := 0
DirectSource := 1
IndirectSource := 2
InvitedSourceStr := "注册奖励"
DirectSourceStr := "直推好友"
IndirectSourceStr := "间推好友"
if k > 0 {
InvitedSource = 3
DirectSource = 4
IndirectSource = 5
InvitedSourceStr = "升级" + v.Name + "奖励"
DirectSourceStr = "直推好友升级" + v.Name + "奖励"
IndirectSourceStr = "间推好友升级" + v.Name + "奖励"
}
if utils.StrToFloat64(InvitedReward) > 0 {
ownRewardLog, ownhas, _ := db.GetNewAcquisitionRewardLogWhere(eg, userProfile.Uid, user.Profile.Uid, lv)
if !ownhas {
ownRewardLog = &model.NewAcquisitionRewardLog{
Uid: user.Profile.Uid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: InvitedSource,
SourceText: InvitedSourceStr,
Money: InvitedReward,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(cfg.RewardRule.RewardCoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}

db.InsertNewRewardLog(eg, ownRewardLog)
}
if ownRewardLog.GivenAt == 0 {

ownRewardLog.CompleteCon = str
ownRewardLog.IsFull = isFull
if ownRewardLog.FullTime == 0 {
ownRewardLog.FullTime = fullTime
}
if ownRewardLog.ToRewardTime == 0 {
ownRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", ownRewardLog.Id).Update(ownRewardLog)
}
}
if utils.StrToFloat64(DirectSuccess) > 0 {
if userProfile.ParentUid > 0 {
//写入奖励记录
extendRewardLog, extendHas, _ := db.GetNewAcquisitionRewardLogWhere(eg, userProfile.ParentUid, userProfile.Uid, lv)
if !extendHas {
extendRewardLog = &model.NewAcquisitionRewardLog{
Uid: user.Profile.ParentUid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: DirectSource,
SourceText: DirectSourceStr,
Money: DirectSuccess,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(cfg.RewardRule.RewardCoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}
db.InsertNewRewardLog(eg, extendRewardLog)
}
if extendRewardLog.GivenAt == 0 {

extendRewardLog.CompleteCon = str
extendRewardLog.IsFull = isFull
if extendRewardLog.FullTime == 0 {
extendRewardLog.FullTime = fullTime
}
if extendRewardLog.ToRewardTime == 0 {
extendRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", extendRewardLog.Id).Update(extendRewardLog)
}
}
}
if utils.StrToFloat64(IndirectSuccess) > 0 {
if nextUserProfile != nil && nextUserProfile.ParentUid > 0 {
IndirectRewardLog, IndirectHas, _ := db.GetNewAcquisitionRewardLogWhere(eg, nextUserProfile.ParentUid, userProfile.Uid, lv)
if !IndirectHas {
IndirectRewardLog = &model.NewAcquisitionRewardLog{
Uid: nextUserProfile.ParentUid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: IndirectSource,
SourceText: IndirectSourceStr,
Money: IndirectSuccess,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(cfg.RewardRule.RewardCoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}
db.InsertNewRewardLog(eg, IndirectRewardLog)
}
if IndirectRewardLog.GivenAt == 0 {
IndirectRewardLog.CompleteCon = str
IndirectRewardLog.IsFull = isFull
if IndirectRewardLog.FullTime == 0 {
IndirectRewardLog.FullTime = fullTime
}
if IndirectRewardLog.ToRewardTime == 0 {
IndirectRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", IndirectRewardLog.Id).Update(IndirectRewardLog)
}
}
}
}

}
} else {
InvitedReward := cfg.RewardRule.InvitedReward
if cfg.RewardRule.RewardType == "1" {
InvitedReward = Rands(cfg.RewardRule.InvitedReward, cfg.RewardRule.InvitedRewardMax)
}
//直推
DirectSuccess := cfg.RewardRule.DirectSuccess
if cfg.RewardRule.RewardType == "1" {
DirectSuccess = Rands(cfg.RewardRule.DirectSuccess, cfg.RewardRule.DirectSuccessMax)
}
//间推
IndirectSuccess := cfg.RewardRule.IndirectSuccess
if cfg.RewardRule.RewardType == "1" {
IndirectSuccess = Rands(cfg.RewardRule.IndirectSuccess, cfg.RewardRule.IndirectSuccessMax)
}
if utils.StrToFloat64(InvitedReward) > 0 {
ownRewardLog, ownhas, _ := db.GetNewAcquisitionRewardLog(eg, &model.NewAcquisitionRewardLog{
Uid: user.Profile.Uid,
ToUid: user.Profile.Uid,
})
if !ownhas {
ownRewardLog = &model.NewAcquisitionRewardLog{
Uid: user.Profile.Uid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: 0,
SourceText: "注册奖励",
Money: InvitedReward,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(cfg.RewardRule.RewardCoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}

db.InsertNewRewardLog(eg, ownRewardLog)
}
if ownRewardLog.GivenAt == 0 {
ownRewardLog.CompleteCon = str
ownRewardLog.IsFull = isFull
if ownRewardLog.FullTime == 0 {
ownRewardLog.FullTime = fullTime
}
if ownRewardLog.ToRewardTime == 0 {
ownRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", ownRewardLog.Id).Update(ownRewardLog)
}
}
if utils.StrToFloat64(DirectSuccess) > 0 {
if userProfile.ParentUid > 0 {
//写入奖励记录
extendRewardLog, extendHas, _ := db.GetNewAcquisitionRewardLog(eg, &model.NewAcquisitionRewardLog{
Uid: userProfile.ParentUid,
ToUid: userProfile.Uid,
})
if !extendHas {
extendRewardLog = &model.NewAcquisitionRewardLog{
Uid: user.Profile.ParentUid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: 1,
SourceText: "直推好友",
Money: DirectSuccess,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(cfg.RewardRule.RewardCoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}
db.InsertNewRewardLog(eg, extendRewardLog)
}
if extendRewardLog.GivenAt == 0 {
extendRewardLog.CompleteCon = str
extendRewardLog.IsFull = isFull
if extendRewardLog.FullTime == 0 {
extendRewardLog.FullTime = fullTime
}
if extendRewardLog.ToRewardTime == 0 {
extendRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", extendRewardLog.Id).Update(extendRewardLog)
}
}
}
if utils.StrToFloat64(IndirectSuccess) > 0 {
if nextUserProfile != nil && nextUserProfile.ParentUid > 0 {
IndirectRewardLog, IndirectHas, _ := db.GetNewAcquisitionRewardLog(eg, &model.NewAcquisitionRewardLog{
Uid: nextUserProfile.ParentUid,
ToUid: userProfile.Uid,
})
if !IndirectHas {
IndirectRewardLog = &model.NewAcquisitionRewardLog{
Uid: nextUserProfile.ParentUid,
ToUid: user.Profile.Uid,
Title: user.Info.Nickname,
Source: 2,
SourceText: "间推好友",
Money: IndirectSuccess,
CreatedAt: int(time.Now().Unix()),
State: 0,
CoinId: utils.StrToInt(cfg.RewardRule.RewardCoinId),
RewardType: utils.StrToInt(cfg.RewardRule.RewardType),
InviteTime: int(userInfo.CreateAt.Unix()),
Lv: lv,
}
db.InsertNewRewardLog(eg, IndirectRewardLog)
}
if IndirectRewardLog.GivenAt == 0 {
IndirectRewardLog.CompleteCon = str
IndirectRewardLog.IsFull = isFull
if IndirectRewardLog.FullTime == 0 {
IndirectRewardLog.FullTime = fullTime
}
if IndirectRewardLog.ToRewardTime == 0 {
IndirectRewardLog.ToRewardTime = toRewardTime
}
eg.Where("id=?", IndirectRewardLog.Id).Update(IndirectRewardLog)
}
}
}
}

return nil
}
func Rands(minVal, maxVal string) string {
min := int(utils.StrToFloat64(minVal) * 100)
max := int(utils.StrToFloat64(maxVal) * 100)
return utils.Float64ToStrByPrec(float64(utils.RandIntRand(min, max))/100, 3)
}

//判断是否符合条件
func checkAllCompleteTmp(eg *xorm.Engine, user *md.User, acqCfg *md.AcquisitionCfg) (bool, string) {
res := true
str := ""
if acqCfg.SuccessConditions.Register.Open == "1" {
res = res && AcqRegisterTmp(user, acqCfg)
if res {
str += ",Register"
}
}
if acqCfg.SuccessConditions.TaobaoAuthorization.Open == "1" {
res = res && AcqTaoBaoAuthTmp(user, acqCfg)
if res {
str += ",TaobaoAuthorization"
}
}
if acqCfg.SuccessConditions.FirstOrder.Open == "1" {
res = res && AcqFirstOrder(eg, user, acqCfg)
if res {
str += ",FirstOrder"
}
}
if acqCfg.SuccessConditions.SelfOrder.Open == "1" {
res = res && AcqSelfOrder(eg, user, acqCfg)
if res {
str += ",SelfOrder"
}
}
if acqCfg.SuccessConditions.OrderPay.Open == "1" {
//AcqOrderPay(eg, user, acqCfg)
res = res && AcqOrderPay(eg, user, acqCfg)
if res {
str += ",OrderPay"
}
}
if len(str) > 0 {
str = str[1:]
}
return res, str
}
func AcqRegisterTmp(user *md.User, acqCfg *md.AcquisitionCfg) bool {
var startTime = utils.TimeStdParseUnix(acqCfg.StartTime)
var endTime = utils.TimeStdParseUnix(acqCfg.EndTime)
if startTime == 0 || endTime == 0 {
return false
}
//时间不在活动范围之内返回false
if user.Info.CreateAt.Unix() < startTime {
return false
}
if user.Info.CreateAt.Unix() > endTime {
return false
}
return true
}

func AcqTaoBaoAuthTmp(user *md.User, acqCfg *md.AcquisitionCfg) bool {
if user.Profile.AccTaobaoAuthTime > 0 {
return true
}
return false
}

func AcqFirstOrder(eg *xorm.Engine, user *md.User, acqCfg *md.AcquisitionCfg) bool {
endTime := int(user.Info.CreateAt.Unix()) + utils.StrToInt(acqCfg.SuccessConditions.FirstOrder.Day)*86400
return commAmount(eg, utils.IntToStr(user.Info.Uid), endTime, 0, acqCfg)
}
func AcqSelfOrder(eg *xorm.Engine, user *md.User, acqCfg *md.AcquisitionCfg) bool {
return commAmount(eg, utils.IntToStr(user.Info.Uid), 0, 2, acqCfg)
}
func AcqOrderPay(eg *xorm.Engine, user *md.User, acqCfg *md.AcquisitionCfg) bool {
return commAmount(eg, utils.IntToStr(user.Info.Uid), 0, 1, acqCfg)
}
func sqlSelect(eg *xorm.Engine, uid string, endTime, types int, acqCfg *md.AcquisitionCfg, arr []string) int {
sql := `SELECT COUNT(*) as count FROM %s ol
LEFT JOIN %s olr on olr.oid=%s and olr.uid=%s
WHERE ol.uid=? %s %s
`
str := ""
if endTime > 0 {
str += " AND olr.create_at<=" + utils.IntToStr(endTime)
}
if types == 2 {
str += " AND olr.amount>=" + acqCfg.SuccessConditions.SelfOrder.Money
}
if types == 1 {
str += " AND %s>=" + acqCfg.SuccessConditions.OrderPay.Money
str = fmt.Sprintf(str, arr[0])
}
sqlOrd := fmt.Sprintf(sql, arr[1], arr[2], arr[3], arr[4], str, arr[5])
ordResult, err := db.QueryNativeString(eg, sqlOrd, uid)
fmt.Println(sqlOrd)
fmt.Println(err)
count := 0
for _, v := range ordResult {
count = utils.StrToInt(v["count"])
}
return count
}
func commAmount(eg *xorm.Engine, uid string, endTime, types int, acqCfg *md.AcquisitionCfg) bool {
state := "0,1,2,3,5"
psoState := "'订单付款','订单结算'"
mallState := "1,2,3"
o2oState := "1,2,3,4"
b2cState := "1,2,3,4"
if acqCfg.SuccessConditions.FirstOrder.Status == "1" {
state = "1,2,3,5"
mallState = "2,3"
o2oState = "2,3,4"
b2cState = "2,3,4"
}
if acqCfg.SuccessConditions.FirstOrder.Status == "2" {
state = "2,3,5"
mallState = "2,3"
o2oState = "2,3,4"
b2cState = "2,3,4"
}
if acqCfg.SuccessConditions.FirstOrder.Status == "3" {
state = "3,5"
mallState = "3"
o2oState = "3,4"
b2cState = "3,4"
psoState = "'订单结算'"
}

arr := []string{"ol.paid_price", "ord_list", "ord_list_relate", "ol.ord_id", "ol.uid", " and ol.state in(" + state + ")"}
count := sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.paid_price", "privilege_card_ord", "ord_list_relate", "ol.ord_id", "ol.uid", " and ol.state=1"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.money", "express_order", "ord_list_relate", "ol.oid", "ol.uid", " and ol.status in('待取件','运输中','已完成')"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.commission", "duoyou_ord_list", "ord_list_relate", "ol.oid", "ol.uid", " and ol.id>0"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.amount", "recharge_order", "ord_list_relate", "ol.oid", "ol.uid", " and ol.status<>'已退款'"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.amount", "playlet_sale_order", "ord_list_relate", "ol.custom_oid", "ol.uid", " and ol.status in(" + psoState + ")"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)

arr = []string{"ol.cost_price", "mall_ord", "mall_ord_list_relate", "ol.ord_id", "ol.uid", " and ol.state in(" + mallState + ")"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)

arr = []string{"ol.cost_price", "o2o_ord", "o2o_ord_list_relate", "ol.ord_id", "ol.uid", " and ol.state in(" + o2oState + ")"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.actual_pay_amount", "o2o_pay_to_merchant", "o2o_ord_list_relate", "ol.pay_id", "ol.uid", " and ol.state >=1"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
arr = []string{"ol.cost_price", "b2c_ord", "b2c_ord_list_relate", "ol.ord_id", "ol.uid", " and ol.state in(" + b2cState + ")"}
count += sqlSelect(eg, uid, endTime, types, acqCfg, arr)
if count > 0 {
return true
}
return false
}

+ 0
- 59
consume/zhios_acquisition_condition_dev.go ファイルの表示

@@ -1,59 +0,0 @@
package consume

import (
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

func ZhiosAcquisitionConditionDev(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(300)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>ZhiosAcquisitionCondition<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosAcquisition(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
if err == nil {
_ = res.Ack(true)
} else {

var canalMsg *md.ZhiosAcquisition
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err == nil {
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err == nil {
ch.Publish(queue.ExchangeName, utils.SerializeStr(canalMsg), queue.RoutKey)
}
}

}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

+ 0
- 326
consume/zhios_appreciation.go ファイルの表示

@@ -1,326 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"xorm.io/xorm"
)

func ZhiosAppreciation(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosAppreciation(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosAppreciation(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAppreciation
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}

//类型 转入 exchange
if canalMsg.Type == "exchange" {
err := exchange(eg, canalMsg)
if err != nil {
return err
}
}
//类型 提现 withdraw 到余额
if canalMsg.Type == "withdraw" {
err := withdraw(eg, canalMsg)
if err != nil {
return err
}
}
//类型 购物销毁
if canalMsg.Type == "destroy" {
err := destroy(eg, canalMsg)
if err != nil {
return err
}
}
//类型 购物退回
if canalMsg.Type == "buy_refund" {
err := buyRefund(eg, canalMsg)
if err != nil {
return err
}
}

return nil
}

//转入 操作加入资金池和加入积分
func exchange(eg *xorm.Engine, msg *md.ZhiosAppreciation) error {

sess := eg.NewSession()
defer sess.Close()
sess.Begin()
//计算出当前的价值
args := make(map[string]string)
json.Unmarshal([]byte(msg.Ext), &args)
biliMap := caleBili(eg, sess, msg.Mid, args)
ordId := utils.OrderUUID(utils.StrToInt(msg.Uid))
coinMapInUse, _ := db.VirtualCoinMapInUse(eg, msg.Mid, "")
//积分加入
title := coinMapInUse[args["id"]].Name + "-转入"
appreciationCoinId := db.SysCfgGetWithDb(eg, msg.Mid, "appreciation_coin_id")
_, err := svc.ExchangeUserVirFinValidAndInterFlowWithSession(sess,
utils.StrToFloat64(biliMap["in_coin"]), title, "0", 1, 109, utils.StrToInt(msg.Uid), utils.StrToInt(appreciationCoinId), 0, utils.StrToInt64(ordId), "", 0, 0)
if err != nil {
sess.Rollback()
return err
}
base := db.GetAppreciationBase(sess)
beforeValue := "0"
beforeFlowValue := "0"
if base != nil {
beforeValue = base.Sum
beforeFlowValue = base.FlowSum
}
err = db.InsertAppreciation(sess, appreciationCoinId, msg.Uid, "0", "0", msg.Oid, biliMap["coin"], biliMap["in_coin"], beforeValue, beforeFlowValue)
if err != nil {
sess.Rollback()
return err
}
//加入资金池
sql := `UPDATE appreciation_base SET sum=sum+?,flow_sum=flow_sum+? WHERE is_use=1;`
_, err = sess.Exec(sql, utils.StrToFloat64(biliMap["coin"]), utils.StrToFloat64(biliMap["in_coin"]))
if err != nil {
sess.Rollback()
return err
}
sess.Commit()
return nil
}

//提现
func withdraw(eg *xorm.Engine, msg *md.ZhiosAppreciation) error {
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
args := make(map[string]string)
json.Unmarshal([]byte(msg.Ext), &args)
//资产价值
price := ""
appreciationWithdrawFee := db.SysCfgGetWithDb(eg, msg.Mid, "appreciation_withdraw_fee")
appreciationWithdrawBack := db.SysCfgGetWithDb(eg, msg.Mid, "appreciation_withdraw_back")
feeMap := md2.DealWithdrawalFeeResp{
WithdrawalCommissionFee: utils.StrToFloat64(appreciationWithdrawFee) / 100,
WithdrawalDestroyFee: (utils.StrToFloat64(appreciationWithdrawFee) - utils.StrToFloat64(appreciationWithdrawBack)) / 100,
WithdrawalRefluxFee: utils.StrToFloat64(appreciationWithdrawBack) / 100,
}
_, resp := rule.DealWithdrawalAndDestroy(sess, feeMap, utils.StrToFloat64(args["amount"]))
//这是到手的
newAmount := utils.GetPrec(utils.Float64ToStrByPrec(resp.TransferOutValue-resp.AmountOut, 5), "4")
//扣的
coinSum := utils.GetPrec(utils.Float64ToStrByPrec(resp.TransferOutValue-resp.RefluxValue, 20), "4")
price = utils.GetPrec(utils.Float64ToStrByPrec(resp.Price, 20), "4")
err := svc.UpdateUserFinValidAndInterFlowSess(sess,
newAmount, args["amount"]+"个数字资产转余额,价值"+price+"/个", "appreciation", 0, 56, utils.StrToInt(msg.Uid), utils.StrToInt(msg.Oid), utils.StrToInt64(msg.Oid), utils.StrToInt64(msg.Oid))
if err != nil {
sess.Rollback()
return err
}
base := db.GetAppreciationBase(sess)
beforeValue := "0"
beforeFlowValue := "0"
if base != nil {
beforeValue = base.Sum
beforeFlowValue = base.FlowSum
}
appreciationCoinId := db.SysCfgGetWithDb(eg, msg.Mid, "appreciation_coin_id")
//转出
err = db.InsertAppreciation(sess, appreciationCoinId, msg.Uid, "1", "1", msg.Oid, args["amount"], args["amount"], beforeValue, beforeFlowValue)
if err != nil {
sess.Rollback()
return err
}
////销毁的
beforeValue = utils.GetPrec(utils.Float64ToStrByPrec(utils.StrToFloat64(beforeValue)-resp.TransferOutValue, 5), "4")
beforeFlowValue = utils.GetPrec(utils.Float64ToStrByPrec(utils.StrToFloat64(beforeFlowValue)-utils.StrToFloat64(args["amount"]), 5), "4")
//DestroyValue := utils.GetPrec(utils.Float64ToStrByPrec(resp.DestroyValue, 5), "4")
//err = db.InsertAppreciation(sess, appreciationCoinId, args["uid"], "2", "1", DestroyValue, "0", beforeValue, beforeFlowValue)
//if err != nil {
// sess.Rollback()
// return err
//}
//回流的
RefluxValue := utils.GetPrec(utils.Float64ToStrByPrec(resp.RefluxValue, 5), "4")
err = db.InsertAppreciation(sess, appreciationCoinId, msg.Uid, "3", "0", msg.Oid, RefluxValue, "0", beforeValue, beforeFlowValue)
if err != nil {
sess.Rollback()
return err
}
sql := `UPDATE appreciation_base SET sum=sum-?,flow_sum=flow_sum-? WHERE is_use=1;`
_, err = eg.Exec(sql, utils.StrToFloat64(coinSum), utils.StrToFloat64(args["amount"]))
if err != nil {
sess.Rollback()
return err
}
sess.Where("ord_id=?", msg.Oid).Cols("price").Update(&model.UserVirtualCoinFlow{Price: price})
sess.Commit()
return nil
}

//购物销毁
func destroy(eg *xorm.Engine, msg *md.ZhiosAppreciation) error {
args := make(map[string]string)
json.Unmarshal([]byte(msg.Ext), &args)
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
base := db.GetAppreciationBase(sess)
beforeValue := "0"
beforeFlowValue := "0"
if base != nil {
beforeValue = base.Sum
beforeFlowValue = base.FlowSum
}
appreciationCoinId := db.SysCfgGetWithDb(eg, msg.Mid, "appreciation_coin_id")
//转出
err := db.InsertAppreciation(sess, appreciationCoinId, msg.Uid, "4", "1", msg.Oid, args["coinPrice"], args["amount"], beforeValue, beforeFlowValue)
if err != nil {
sess.Rollback()
return err
}

sql := `UPDATE appreciation_base SET sum=sum-?,flow_sum=flow_sum-? WHERE is_use=1;`
_, err = eg.Exec(sql, utils.StrToFloat64(args["coinPrice"]), utils.StrToFloat64(args["amount"]))
if err != nil {
sess.Rollback()
return err
}
sess.Commit()
return nil
}

//购物退回
func buyRefund(eg *xorm.Engine, msg *md.ZhiosAppreciation) error {
args := make(map[string]string)
json.Unmarshal([]byte(msg.Ext), &args)
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
base := db.GetAppreciationBase(sess)
beforeValue := "0"
beforeFlowValue := "0"
if base != nil {
beforeValue = base.Sum
beforeFlowValue = base.FlowSum
}
appreciationCoinId := db.SysCfgGetWithDb(eg, msg.Mid, "appreciation_coin_id")
//转出
err := db.InsertAppreciation(sess, appreciationCoinId, msg.Uid, "5", "0", msg.Oid, args["coinPrice"], args["amount"], beforeValue, beforeFlowValue)
if err != nil {
sess.Rollback()
return err
}

sql := `UPDATE appreciation_base SET sum=sum+?,flow_sum=flow_sum+? WHERE is_use=1;`
_, err = eg.Exec(sql, utils.StrToFloat64(args["coinPrice"]), utils.StrToFloat64(args["amount"]))
if err != nil {
sess.Rollback()
return err
}
sess.Commit()
return nil
}
func caleBili(eg *xorm.Engine, sess *xorm.Session, dbName string, args map[string]string) map[string]string {
appreciationCoinId := db.SysCfgGetWithDb(eg, dbName, "appreciation_coin_id")
bCoinStr := ""
bcoin := ""
if args["id"] == "cny" {
bCoinStr = args["amount"]
} else {
ids := []string{args["id"], appreciationCoinId}
coin := db.VirtualCoinByIds(eg, ids)
aCoinBili := coin[args["id"]].ExchangeRatio
//1:5=X:money X= 1:5*money
amoney := (1 / utils.StrToFloat64(aCoinBili)) * utils.StrToFloat64(args["amount"])
bcoin = utils.GetPrec(utils.Float64ToStrByPrec(amoney, 5), "4")
//这是只返70%
appreciationCoinFee := db.SysCfgGetWithDb(eg, dbName, "appreciation_coin_fee")
bCoins := amoney * (utils.StrToFloat64(appreciationCoinFee) / 100)
//除以当前的资产价值
_, value := rule.DealTransferIn(sess, bCoins)
bCoins = value
bCoinStr = utils.GetPrec(utils.Float64ToStrByPrec(bCoins, 20), "4")
}
res := map[string]string{
"in_coin": bCoinStr,
"coin": bcoin,
}
return res
}
func coinPriceEg(eg *xorm.Engine) map[string]string {
base := db.GetAppreciationBaseEg(eg)
sum := "0"
flowSum := "0"
price := "1"
if base != nil {
sum = base.Sum
flowSum = base.FlowSum
}
price = utils.GetPrec(utils.Float64ToStrByPrec(utils.StrToFloat64(sum)/utils.StrToFloat64(flowSum), 5), "4")
res := map[string]string{
"price": price,
"sum": sum,
"flow_sum": flowSum,
}
return res
}

+ 0
- 168
consume/zhios_capital_pool_order_total.go ファイルの表示

@@ -1,168 +0,0 @@
package consume

import (
"applet/app/db"
model2 "applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"github.com/syyongx/php2go"
"time"
"xorm.io/xorm"
)

func ZhiosCapitalPoolOrderTotal(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(20)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosCapitalPoolOrderTotal(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosCapitalPoolOrderTotal(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosCapitalPoolOrderTotal
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
err = AddUserOrdTotal(eg, canalMsg.Mid, canalMsg.Uid, canalMsg.Runtime, canalMsg.TotalTime, canalMsg.BonusLevelType, canalMsg.Level)
if err != nil {
fmt.Println(err)
return err
}
return nil
}
func AddUserOrdTotal(eg *xorm.Engine, dbName string, uids []string, runtime, totalTime int64, leveType int, level string) error {
if len(uids) == 0 {
return nil
}
m := GetUserOrdTotal(eg, uids, totalTime)
var data []model2.CapitalPoolOrderTotal
err := eg.In("uid", uids).And("create_time=? and level_type=? and level=?", time.Unix(runtime, 0).Format("2006-01-02"), leveType, level).Find(&data)
var userData = make(map[string]model2.CapitalPoolOrderTotal)
if err == nil {
for _, v := range data {
userData[utils.IntToStr(v.Uid)] = v
}
}
for k, v := range m {
user, ok := userData[k]
if ok {
user.Sum = utils.Float64ToStrByPrec(v, 2)
user.UpdateTime = time.Now()
eg.Where("id=?", user.Id).Cols("sum,update_time").Update(&user)
} else {
fmt.Println(time.Unix(runtime, 0).Format("2006-01-02"))
var userDatas = &model2.CapitalPoolOrderTotal{
Uid: utils.StrToInt(k),
Sum: utils.Float64ToStrByPrec(v, 2),
CreateTime: time.Unix(runtime, 0).Format("2006-01-02"),
UpdateTime: time.Now(),
LevelType: leveType,
Level: utils.StrToInt(level),
}
fmt.Println(userDatas)
_, err := eg.InsertOne(userDatas)
if err != nil {
utils.FilePutContents(dbName+"capital", utils.SerializeStr(userDatas))
utils.FilePutContents(dbName+"capital", err.Error())
return err
}
}
}
sum, _ := eg.Where("create_time=? and level_type=? and level=?", time.Unix(runtime, 0).Format("2006-01-02"), leveType, level).Sum(&model2.CapitalPoolOrderTotal{}, "sum")
fmt.Println(sum)

sql := `UPDATE capital_pool_order_total SET all_sum=%f WHERE create_time='%s' and level_type=%d and level=%s;`
sql = fmt.Sprintf(sql, sum, time.Unix(runtime, 0).Format("2006-01-02"), leveType, level)
db.QueryNativeString(eg, sql)
return nil
}

func GetUserOrdTotal(eg *xorm.Engine, uids []string, totalTime int64) map[string]float64 {
totalTimeStr := time.Unix(totalTime, 0)
var userMap = make(map[string]float64, 0)
if len(uids) == 0 {
return userMap
}
uidStr := php2go.Implode(",", uids)
guideSql := `SELECT SUM(paid_price) AS amount,uid FROM ord_list WHERE uid IN (%s) AND state IN(%s) AND confirm_at>=%d GROUP BY uid;`
guideSql = fmt.Sprintf(guideSql, uidStr, "1,2,3,5", totalTime)
guide, err := db.QueryNativeString(eg, guideSql)
fmt.Println(err)
if len(guide) > 0 {
for _, v := range guide {
userMap[v["uid"]] += utils.StrToFloat64(v["amount"])
}
}
mallSql := `SELECT SUM(cost_price) AS amount,uid FROM mall_ord WHERE uid IN (%s) AND state IN(%s) AND confirm_time>='%s' GROUP BY uid;`
mallSql = fmt.Sprintf(mallSql, uidStr, "3", totalTimeStr)
mall, err := db.QueryNativeString(eg, mallSql)
fmt.Println(err)

if len(mall) > 0 {
for _, v := range mall {
userMap[v["uid"]] += utils.StrToFloat64(v["amount"])
}
}
cardSql := `SELECT SUM(paid_price) AS amount,uid FROM privilege_card_ord WHERE uid IN (%s) AND state IN(%s) AND created_at>=%d GROUP BY uid;`
cardSql = fmt.Sprintf(cardSql, uidStr, "1", totalTime)
card, err := db.QueryNativeString(eg, cardSql)
fmt.Println(err)
if len(card) > 0 {
for _, v := range card {
userMap[v["uid"]] += utils.StrToFloat64(v["amount"])
}
}
rechargeSql := `SELECT SUM(amount) AS amount,uid FROM recharge_order WHERE uid IN (%s) AND status='已付款' AND create_time>='%s' GROUP BY uid;`
rechargeSql = fmt.Sprintf(rechargeSql, uidStr, time.Unix(totalTime, 0).Format("2006-01-02 15:04:05"))
recharge, err := db.QueryNativeString(eg, rechargeSql)
fmt.Println(err)
if len(recharge) > 0 {
for _, v := range recharge {
userMap[v["uid"]] += utils.StrToFloat64(v["amount"])
}
}
return userMap
}

+ 0
- 263
consume/zhios_express_order_fail.go ファイルの表示

@@ -1,263 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/offical"
"applet/app/db/offical/model"
"applet/app/e"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/cache"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/express"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"github.com/tidwall/gjson"
"time"
)

func ZhiosExpressOrderFail(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosExpressOrderFail(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosExpressOrderFail(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosExpressOrderFails
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
//判断订单是否订单失败
ord := db.GetExpressWithOid(eg, canalMsg.Oid)
officialOrd := offical.GetExpressWithOid(canalMsg.Oid)
if ord.Status == "已退回" {
return nil
}
ordExpressPlatform := utils.IntToStr(ord.ExpressPlatform)
base := CommBase(mid, ordExpressPlatform)
if canalMsg.IsFail != "1" { //查下订单详情
param := map[string]interface{}{
"clientOrderNo": canalMsg.Oid,
}
order, _ := express.ShowOrder(base, param)
if gjson.Get(order, "code").Int() == 500 || gjson.Get(order, "code").String() != "00" || gjson.Get(order, "data.status").String() == "CANCELED" {
ord.Status = "订单失败"
}
}
if ord.Status == "订单失败" || ord.Status == "已取消" {
ord.Status = "已退回"
ord.IsRefund = 1
ord.RefundTime = time.Now()
if ord.Own != 1 {
officialOrd.Status = "已退回"
officialOrd.IsRefund = 1
officialOrd.RefundTime = time.Now()
db.Db.Where("oid=?", officialOrd.Oid).Update(officialOrd)
}
eg.Where("oid=?", ord.Oid).Update(ord)
svc.DealMoneyWithEg(eg, ord.Uid, ord.Money, 56, utils.StrToInt64(ord.Oid), 0, 0, "快递退款", "express", 0)
if ord.AgentPay == 1 {
agentDeduct(ord.Oid, base, ord.AgentPrice)
}
if ord.StationPay == 1 {
stationDeduct(mid, ord.Oid, base, ord.StationPrice)
}
}
return nil
}

//站长预存款扣除
func stationDeduct(dbName, oid string, base map[string]string, price string) (error, int) {
eg := db.Db
var user model.ExpressUserMoney
get, err := eg.Where("uid=? and agent_uid=?", dbName, base["puid"]).Get(&user)
if get == false || err != nil {
return e.NewErr(400, "站点预存款不足!"), 0
}
user.Money = utils.Float64ToStr(utils.StrToFloat64(user.Money) + utils.StrToFloat64(price))
_, err = eg.Where("id=?", user.Id).Update(&user)
if err != nil {
return e.NewErr(400, "站点预存款扣除失败!"), 0
}
var flow = &model.ExpressUserMoneyFlow{
Uid: user.Uid,
Type: 0,
Time: time.Now(),
Amount: price,
AfterAmount: user.Money,
Oid: oid,
Title: "快递退款",
}
_, err = eg.Insert(flow)
if err != nil {
return e.NewErr(400, "站点预存款扣除失败!"), 0
}
return nil, 1
}
func agentDeduct(oid string, base map[string]string, price string) (error, int) {
eg := db.Db
var user model.ExpressAgentMoney
get, err := eg.Where("uid=?", base["puid"]).Get(&user)
if get == false || err != nil {
return e.NewErr(400, "平台预存款不足!"), 0
}
user.Money = utils.Float64ToStr(utils.StrToFloat64(user.Money) + utils.StrToFloat64(price))
_, err = eg.Where("id=?", user.Id).Update(&user)
if err != nil {
return e.NewErr(400, "平台预存款扣除失败!"), 0
}
var flow = &model.ExpressAgentMoneyFlow{
Puid: utils.StrToInt(base["puid"]),
Uid: user.Uid,
Type: 0,
Time: time.Now(),
Amount: price,
AfterAmount: user.Money,
Oid: oid,
Title: "快递退款",
}
_, err = eg.Insert(flow)
if err != nil {
return e.NewErr(400, "平台预存款扣除失败!"), 0
}
return nil, 1
}

func AppUserListPuid(mid string) string {
appList := offical.GetUserAppList(mid)
uid := "0"
if appList != nil && appList.Puid > 0 {
uid = utils.IntToStr(appList.Puid)
}

return uid
}
func AppUserListPuidNew(mid string, ordExpressPlatform string) string {
appList := offical.GetUserAppList(mid)
uid := "0"
if appList != nil && appList.Puid > 0 {
uid = utils.IntToStr(appList.Puid)
}
expressPlatform := offical.MasterListCfgGetOneData(uid, "express_platform_type")
if expressPlatform == "1" || ordExpressPlatform == "1" { //如果是1 走智莺官方
uid = "0"
}
return uid
}

func CommBase(mid, ordExpressPlatform string) map[string]string {
puid := AppUserListPuidNew(mid, ordExpressPlatform)
key := puid + "_official_express_info"
stringStr, err := cache.GetString(key)
stringMap := make(map[string]string)
json.Unmarshal([]byte(stringStr), &stringMap)
if len(stringMap) == 0 || err != nil {
expressType := offical.MasterListCfgGetOneData(puid, "express_type")
expressUrl := offical.MasterListCfgGetOneData(puid, "express_url")
expressClientId := offical.MasterListCfgGetOneData(puid, "express_client_id")
expressKey := offical.MasterListCfgGetOneData(puid, "express_key")
expressMinSendMoney := offical.MasterListCfgGetOneData(puid, "express_min_send_money") //最低预存款
expressFeeSendMoney := offical.MasterListCfgGetOneData(puid, "express_fee_send_money") //充值预存款手续费
expressFirstPayBili := offical.MasterListCfgGetOneData(puid, "express_first_pay_bili") //首重加价
expressSecondPayBili := offical.MasterListCfgGetOneData(puid, "express_second_pay_bili") //续重加价
stringMap = map[string]string{
"puid": puid,
"express_type": expressType,
"express_url": expressUrl,
"express_key": expressKey,
"express_client_id": expressClientId,
"express_min_send_money": "",
"express_fee_send_money": "",
"express_first_pay_bili": "",
"express_second_pay_bili": "",
"official_express_min_send_money": expressMinSendMoney,
"official_express_fee_send_money": expressFeeSendMoney,
"official_express_first_pay_bili": expressFirstPayBili,
"official_express_second_pay_bili": expressSecondPayBili,
}
//如果是官方 不是代理就没有代理的设置
//如果是代理 就有代理的设置
if utils.StrToInt(puid) > 0 {
stringMap["express_min_send_money"] = expressMinSendMoney
stringMap["express_fee_send_money"] = expressFeeSendMoney
stringMap["express_first_pay_bili"] = expressFirstPayBili
stringMap["express_second_pay_bili"] = expressSecondPayBili
if stringMap["express_type"] == "1" { //代理自有渠道,智莺的加价不用了
stringMap["official_express_min_send_money"] = ""
stringMap["official_express_fee_send_money"] = ""
stringMap["official_express_first_pay_bili"] = ""
stringMap["official_express_second_pay_bili"] = ""
}
}
cache.SetEx(key, utils.SerializeStr(stringMap), 300)

}
if utils.StrToInt(puid) > 0 && stringMap["express_type"] != "1" { //跟随官方
key1 := "0_official_express_info"
stringStr1, err1 := cache.GetString(key1)
stringMap1 := make(map[string]string)
json.Unmarshal([]byte(stringStr1), &stringMap1)
if len(stringMap1) == 0 || err1 != nil { //如果是代理 但只有官方设置
stringMap1 = make(map[string]string)

stringMap1["express_url"] = offical.MasterListCfgGetOneData("0", "express_url")
stringMap1["express_client_id"] = offical.MasterListCfgGetOneData("0", "express_client_id")
stringMap1["express_key"] = offical.MasterListCfgGetOneData("0", "express_key")
stringMap1["official_express_min_send_money"] = offical.MasterListCfgGetOneData("0", "express_min_send_money") //最低预存款
stringMap1["official_express_fee_send_money"] = offical.MasterListCfgGetOneData("0", "express_fee_send_money") //充值预存款手续费
stringMap1["official_express_first_pay_bili"] = offical.MasterListCfgGetOneData("0", "express_first_pay_bili") //首重加价
stringMap1["official_express_second_pay_bili"] = offical.MasterListCfgGetOneData("0", "express_second_pay_bili") //续重加价
cache.SetEx(key1, utils.SerializeStr(stringMap1), 300)
}
for k, v := range stringMap1 {
stringMap[k] = v
}
}
return stringMap
}

+ 0
- 217
consume/zhios_fast_return_order_pay.go ファイルの表示

@@ -1,217 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"github.com/tidwall/gjson"
"time"
"xorm.io/xorm"
)

func ZhiosFastReturnOrderPay(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(10)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosFastReturnOrderPay(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
if err == nil {
_ = res.Ack(true)
} else {
//var canalMsg *md.ZhiosFatReturnOrderPay
//var tmpString string
//err := json.Unmarshal(res.Body, &tmpString)
//if err == nil {
// fmt.Println(tmpString)
// err = json.Unmarshal([]byte(tmpString), &canalMsg)
// if err == nil {
// ch.Publish(queue.ExchangeName, utils.SerializeStr(canalMsg), queue.RoutKey)
// }
//}

}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosFastReturnOrderPay(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosFatReturnOrderPay
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
uid := utils.StrToInt(canalMsg.Uid)
oid := canalMsg.Oid
isFastReturn, info := CommCheckFastReturn(eg, uid, mid)
if isFastReturn == 0 {
return nil
}
var orderData model.OrdList
b, err2 := eg.Where("ord_id=?", oid).Get(&orderData)
if b == false || err2 != nil {
return errors.New("err")
}
if (orderData.IsFastSign == 1 && orderData.IsTransfer == 1) || orderData.State == 4 || orderData.IsWaitReduce > 0 {
return nil
}
var data1 model.OrdListRelate
get, err := eg.Where("uid=? and oid=? and level=?", uid, oid, 0).Get(&data1)
if get == false || err != nil {
return errors.New("err")
}
amount := int(data1.Amount * 100)
if amount <= 0 {
return nil
}
money := utils.Float64ToStr(float64(amount) / 100)
fmt.Println(money)
fastReturnMoney := db.SysCfgFindWithDb(eg, mid, "fast_return_money")
if utils.StrToFloat64(info.Money)+utils.StrToFloat64(money) > utils.StrToFloat64(fastReturnMoney["fast_return_money"]) {
return nil
}
if orderData.IsFastSign == 0 {
args := map[string]string{
"out_order_no": oid,
"credit_agreement_id": info.CreditAgreementId,
"category_id": "pay_for_rebate_0001",
"order_amount": money,
"amount_type": "ORDER_AMOUNT",
"subject": canalMsg.Name + oid,
}
args = CommInfo(eg, mid, args)
fmt.Println(args)
order, err := pay.CreditagreementOrder(args)
if err != nil {
utils.FilePutContents(mid+"CreditagreementOrder_err", err.Error())
}
utils.FilePutContents(mid+"CreditagreementOrder", utils.SerializeStr(args))
utils.FilePutContents(mid+"CreditagreementOrder", utils.SerializeStr(order))
if err != nil || order == nil {
return nil
}
if order.ZhimaCreditPayafteruseCreditbizorderOrderResponse.Code != "10000" {
return nil
}
orderData.IsFastSign = 1
orderData.FastSignId = order.ZhimaCreditPayafteruseCreditbizorderOrderResponse.CreditBizOrderId
eg.Where("ord_id=?", oid).Cols("is_fast_sign,fast_sign_id").Update(&orderData)
sql := "UPDATE user_alipay_info SET money=money+? WHERE uid=?"
db.QueryNativeString(eg, sql, money, orderData.Uid)
}
if info.AlipayId != "" && orderData.IsTransfer != 1 {
//转账
args1 := map[string]string{
"out_biz_no": utils.Int64ToStr(orderData.OrdId),
"trans_amount": money,
"identity": info.AlipayId,
"identity_type": "ALIPAY_USER_ID",
"product_code": "TRANS_ACCOUNT_NO_PWD",
"biz_scene": "DIRECT_TRANSFER",
"order_title": canalMsg.Name + "秒返",
}
args1 = CommInfo(eg, mid, args1)
fmt.Println(utils.SerializeStr(args1))
sign, err := pay.AlipayFundTransUniTransfer(args1)
if err != nil {
utils.FilePutContents(mid+"transfer_err", err.Error())
}
fmt.Println(sign)
utils.FilePutContents(mid+"transfer", utils.SerializeStr(args1))
utils.FilePutContents(mid+"transfer", utils.SerializeStr(sign))
if sign != nil && sign.AlipayFundTransUniTransferResponse.Code == "10000" {
orderData.TransferSignId = sign.AlipayFundTransUniTransferResponse.OrderId
if sign.AlipayFundTransUniTransferResponse.Status == "SUCCESS" {
orderData.IsTransfer = 1
var flow = &model.FinUserFlow{
Type: 0,
Uid: orderData.Uid,
Amount: "",
PaymentType: 3,
BeforeAmount: "0",
AfterAmount: "0",
OrdType: "fast_return",
OrdId: utils.AnyToString(orderData.OrdId),
OrdAction: 103,
OrdTitle: "佣金到账" + money + "元(已到支付宝)",
State: 2,
OtherId: 0,
OrdTime: int(time.Now().Unix()),
CreateAt: time.Now(),
}
eg.Insert(flow)
} else {
orderData.IsTransfer = 2
}
eg.Where("ord_id=?", oid).Cols("is_transfer,transfer_sign_id").Update(&orderData)

} else {
fmt.Println(sign)
return errors.New("失败")
}
}

return nil
}
func CommCheckFastReturn(eg *xorm.Engine, uid int, mid string) (int, *model.UserAlipayInfo) {
fastReturnOnoff := db.SysCfgFindWithDb(eg, mid, "fast_return_onoff")
info := db.GetUserAlipayInfo(eg, uid)
if info.IsSign == 0 || info.IsOpen == 0 || info.CreditAgreementId == "" || fastReturnOnoff["fast_return_onoff"] != "1" {
return 0, nil
}
return 1, info
}
func CommInfo(eg *xorm.Engine, mid string, args map[string]string) map[string]string {
fastReturnAlipay := db.SysCfgFindWithDb(eg, mid, "fast_return_alipay")
fastReturnAlipayInfo := fastReturnAlipay["fast_return_alipay"]
args["pay_app_cert_sn"] = gjson.Get(fastReturnAlipayInfo, "pay_app_cert_sn").String()
args["pay_alipayrsa_public_key"] = gjson.Get(fastReturnAlipayInfo, "pay_alipayrsa_public_key").String()
args["pay_ali_use_type"] = gjson.Get(fastReturnAlipayInfo, "pay_ali_use_type").String()
args["private_key"] = gjson.Get(fastReturnAlipayInfo, "private_key").String()
args["app_id"] = gjson.Get(fastReturnAlipayInfo, "app_id").String()
//args["pay_app_cert_sn"] = "25024da974663c98d943ec355e561863"
//args["pay_alipayrsa_public_key"] = "549086292366017b7710dcc74b7969c8"
//args["pay_ali_use_type"] = "1"
//args["private_key"] = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCunVhChSZGSjiuxNrvyd2a06XAT3J7NLH1fjWiy4HfdhH769xejqFdYFGvRrWCyXRNm/ionWmplzHBopnfTP/tbdoqM7HjZegORCDV3mnB4VVqFgXbrJHlh2lum75zysFbj/7pskGG/tzc8CdjbuTkqt3Z7EXBn8RyUvBi+42XAV51dg1k8DsucoSXuKBW6H2iR27HdDYsmsZmGMIa3NaOIq69i1vMq19bu+UsoBVFHA4DBzwwAHWZEiR+hFg99vhEDyby972kgnBCPnQL2Y8xiXufKpvKFzDCJ/aDNzoWhLfr7QAUKL3vleH8z53sQDy4hTYPLYPT2Y+gGAB6LPMpAgMBAAECggEAB3iL8iyoOpGqYy/g/ilw5dLwYI4Fo+fZRVulB9YVNG5kzpaE0zbfCJO6avlngrUD2N43gV9ayfrCEjrWwosU2B+/GdckYUpW52Va0ku10qnFcciHb6Kui1eD10uqlmGybCx5B56s1w3IfVt5E/QGrxHwdAZ75ZDkYs/RoSqKIE/IkfE3FpUYwBrj8vfvCsrzvThqTSXxq3KgyH8wzcSOca9UuO41po0n3my/4PdceBufMgm0sZS0IawOwuciXljXaCsRQ0Z9q2Wun5aYE5mGkUcVyZYbYl3of/VBBueq+egauvRq5n23JQ7UBCMpwZYgKrlHUTW2Szl8iibkVmMn0QKBgQDdzxeB/I0dg/UYs5lTjk9eQnyaEZhg+wulHnnhPkwPMAChUotzFa/r22ND+4Q/gLj9Q/6SzwOm8eFi20lX7teWJyEmy1/BWrRrhL/G7GMMg2zf4XWt4+TW7oSx4aHxCu2jbleUYqJ3f+eN4BfYSOKAwh1bxtAJmTxlhY7JwlLuOwKBgQDJh+U04CdJA6E0k8pkRa1XmR0K+zkQl8ksrj37zF91XCUejuLSu9a2ATPma/lgOT2DoV72f+a9Raqw7wR4r/iDQNucPkIUN/gyRfc4bRpIuUgm0W/RvHJc8WxmNuIrUigA2yaZE7SBWCDmphrueKY/WrOgWuVf2X4lBiMZBVGZ6wKBgQDExh+4tXALKzGYhFwVgD5xBNK9a7ae8pfWGD9Pz5ByOMeWVkBYDHlQ6AQcH1mnbG6wYE3Lt9Mpm5Ozu45JcB3Zm0URwYJlai584/uuYa9NPpqr0rwvU+mDs34MwHqF+IfxYMZZYVd4ZAPsHU2KFr66M3sQHEQa/9JQzjdqTfZ8WQKBgQCF6PmhT8xq1LGaORXD2RScX04QDOxXHTR8ru7a0GshlW/IxVLsignaeCQfWOGkUYSRYXmzOzt7yr3nwXpsIylzNXZ3dFr+Ck6uQRVLdht/9TV/La0qZRhsr7LCnHdeJ8ITB4u3LYPEamW6POcqTBrTgBZZV+yP6vnJ6jEKICGfrwKBgQDBpw0jV8/DO/8TXG6OuzdE+8HmF1umoQSo2NhmCAT1Khi0kuIZKoDdg0R/Y2Ccom5H8ROJIoHnviaDBM6IIDaBM//ifl/XgezVaB/oMa/OyXRs5xB/VW31RGyXRSO9maM5R/szXndzQ8rApodbKWxfn6uamDRJHYEWnAcFXTPkTA=="
//args["app_id"] = "2021003156691664"
return args
}

+ 0
- 168
consume/zhios_fast_return_order_refund.go ファイルの表示

@@ -1,168 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func ZhiosFastReturnOrderRefund(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosFastReturnOrderRefund(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosFastReturnOrderRefund(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosFatReturnOrderPay
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
uid := utils.StrToInt(canalMsg.Uid)
oid := canalMsg.Oid
var orderData model.OrdList
b, err2 := eg.Where("ord_id=?", oid).Get(&orderData)
if b == false || err2 != nil {
return errors.New("err")
}
if orderData.State != 4 || orderData.IsWaitReduce > 0 || orderData.FastSignId == "" {
return nil
}
var data1 model.OrdListRelate
get, err := eg.Where("uid=? and oid=? and level=?", uid, oid, 0).Get(&data1)
if get == false || err != nil {
return errors.New("err")
}
amount := int(data1.Amount * 100)
if amount <= 0 {
return nil
}
if orderData.IsTransfer == 0 {
args := map[string]string{
"out_request_no": utils.Int64ToStr(orderData.OrdId),
"is_fulfilled": "true",
"credit_biz_order_id": orderData.FastSignId,
"remark": "",
}
args = CommInfo(eg, mid, args)
finish, err := pay.CreditagreementOrderFinish(args)
fmt.Println(finish)
if err != nil {
fmt.Println(err)
}
if err != nil || finish == nil {
return errors.New("err")
}
if finish.ZhimaCreditPayafteruseCreditbizorderFinishResponse.Code != "10000" {
return errors.New("err")
}
orderData.IsWaitReduce = 3
eg.Where("ord_id=?", oid).Cols("is_wait_reduce").Update(&orderData)
return nil
}
money := utils.Float64ToStr(float64(amount) / 100)
args := map[string]string{
"out_trade_no": utils.Int64ToStr(orderData.OrdId),
"creditTradeScene": "CREDIT_PAY_UNCERTAIN_FEE",
"is_async_pay": "true",
"total_amount": money,
"auth_code": orderData.FastSignId,
"scene": "ZHIMA_CREDIT_CODE",
"subject": canalMsg.Name + "订单取消",
"product_code": "GENERAL_WITHHOLDING",
"notify_url": "",
}
if canalMsg.Prd == "true" {
args["notify_url"] = "http://api.zhiyingos.com/api/v1/alipay/reduce/callback?master_id=" + mid
} else {
args["notify_url"] = "http://inapi.izhyin.cn/api/v1/alipay/reduce/callback?master_id=" + mid
}
args = CommInfo(eg, mid, args)
fmt.Println(args)
tradePay, _ := pay.AlipayTradePay(args)
orderData.IsWaitReduce = 1
if tradePay != nil && tradePay.AlipayTradePayResponse.Code == "10000" {
orderData.IsWaitReduce = 2
}
sql := "UPDATE user_alipay_info SET money=money-? WHERE uid=?"
db.QueryNativeString(eg, sql, money, orderData.Uid)
eg.Where("ord_id=?", oid).Cols("is_wait_reduce").Update(&orderData)
if orderData.IsWaitReduce == 2 {
args1 := map[string]string{
"out_request_no": utils.Int64ToStr(orderData.OrdId),
"is_fulfilled": "false",
"credit_biz_order_id": orderData.FastSignId,
"remark": "",
}
if orderData.State != 4 {
args1["is_fulfilled"] = "true"
}
args1 = CommInfo(eg, mid, args1)
pay.CreditagreementOrderFinish(args1)
}
var flow = &model.FinUserFlow{
Type: 1,
Uid: orderData.Uid,
Amount: "",
PaymentType: 3,
BeforeAmount: "0",
AfterAmount: "0",
OrdType: "fast_return",
OrdId: utils.AnyToString(orderData.OrdId),
OrdAction: 103,
OrdTitle: "秒返订单退款扣除" + money + "元(支付宝)",
State: 2,
OtherId: 0,
OrdTime: int(time.Now().Unix()),
CreateAt: time.Now(),
}
eg.Insert(flow)
return nil
}

+ 0
- 163
consume/zhios_fast_return_order_refund_second.go ファイルの表示

@@ -1,163 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func ZhiosFastReturnOrderRefundSecond(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosFastReturnOrderRefundSecond(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosFastReturnOrderRefundSecond(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosFatReturnOrderPay
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
oid := canalMsg.Oid
var orderData model.OrdList
b, err2 := eg.Where("ord_id=?", oid).Get(&orderData)
if b == false || err2 != nil {
return errors.New("err")
}
if orderData.IsWaitReduce > 0 || orderData.FastSignId == "" {
return nil
}
amount := canalMsg.Amount
if amount <= 0 {
return nil
}
if orderData.IsTransfer == 0 {
args := map[string]string{
"out_request_no": utils.Int64ToStr(orderData.OrdId),
"is_fulfilled": "true",
"credit_biz_order_id": orderData.FastSignId,
"remark": "",
}
args = CommInfo(eg, mid, args)
finish, err := pay.CreditagreementOrderFinish(args)
fmt.Println(finish)
if err != nil {
fmt.Println(err)
}
if err != nil || finish == nil {
return errors.New("err")
}
if finish.ZhimaCreditPayafteruseCreditbizorderFinishResponse.Code != "10000" {
return errors.New("err")
}
orderData.IsWaitReduce = 3
eg.Where("ord_id=?", oid).Cols("is_wait_reduce").Update(&orderData)
return nil
}
money := utils.Float64ToStr(float64(amount) / 100)
args := map[string]string{
"out_trade_no": utils.Int64ToStr(orderData.OrdId),
"creditTradeScene": "CREDIT_PAY_UNCERTAIN_FEE",
"is_async_pay": "true",
"total_amount": money,
"auth_code": orderData.FastSignId,
"scene": "ZHIMA_CREDIT_CODE",
"subject": canalMsg.Name + "订单取消",
"product_code": "GENERAL_WITHHOLDING",
"notify_url": "",
}
if canalMsg.Prd == "true" {
args["notify_url"] = "http://api.zhiyingos.com/api/v1/alipay/reduce/callback?master_id=" + mid
} else {
args["notify_url"] = "http://inapi.izhyin.cn/api/v1/alipay/reduce/callback?master_id=" + mid
}
args = CommInfo(eg, mid, args)
fmt.Println(args)
tradePay, _ := pay.AlipayTradePay(args)
orderData.IsWaitReduce = 1
if tradePay != nil && tradePay.AlipayTradePayResponse.Code == "10000" {
orderData.IsWaitReduce = 2
}
orderData.IsFastSign = 0
sql := "UPDATE user_alipay_info SET money=money-? WHERE uid=?"
db.QueryNativeString(eg, sql, money, orderData.Uid)
eg.Where("ord_id=?", oid).Cols("is_fast_sign,is_wait_reduce").Update(&orderData)
if orderData.IsWaitReduce == 2 {
args1 := map[string]string{
"out_request_no": utils.Int64ToStr(orderData.OrdId),
"is_fulfilled": "false",
"credit_biz_order_id": orderData.FastSignId,
"remark": "",
}
if orderData.State != 4 {
args1["is_fulfilled"] = "true"
}
args1 = CommInfo(eg, mid, args1)
pay.CreditagreementOrderFinish(args1)
}
var flow = &model.FinUserFlow{
Type: 1,
Uid: orderData.Uid,
Amount: "",
PaymentType: 3,
BeforeAmount: "0",
AfterAmount: "0",
OrdType: "fast_return",
OrdId: utils.AnyToString(orderData.OrdId),
OrdAction: 103,
OrdTitle: "秒返订单退款扣除" + money + "元(支付宝)",
State: 2,
OtherId: 0,
OrdTime: int(time.Now().Unix()),
CreateAt: time.Now(),
}
eg.Insert(flow)
return nil
}

+ 0
- 100
consume/zhios_fast_return_order_success.go ファイルの表示

@@ -1,100 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

func ZhiosFastReturnOrderSuccess(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosFastReturnOrderSuccess(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosFastReturnOrderSuccess(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosFatReturnOrderPay
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
oid := canalMsg.Oid
var orderData model.OrdList
b, err2 := eg.Where("ord_id=?", oid).Get(&orderData)
if b == false || err2 != nil {
return errors.New("err")
}
if orderData.FastSignId == "" {
return errors.New("err")
}
args := map[string]string{
"out_request_no": utils.Int64ToStr(orderData.OrdId),
"is_fulfilled": "false",
"credit_biz_order_id": orderData.FastSignId,
"remark": "",
}
if orderData.State != 4 {
args["is_fulfilled"] = "true"
}
args = CommInfo(eg, mid, args)
finish, err := pay.CreditagreementOrderFinish(args)
fmt.Println(finish)
if err != nil {
fmt.Println(err)
}
if err != nil || finish == nil {
return errors.New("err")
}
if finish.ZhimaCreditPayafteruseCreditbizorderFinishResponse.Code != "10000" {
return errors.New("err")
}
orderData.FastSuccess = 1
eg.Where("ord_id=?", orderData.OrdId).Cols("fast_success").Update(&orderData)
return nil
}

+ 0
- 315
consume/zhios_guide_store_order_success.go ファイルの表示

@@ -1,315 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
"xorm.io/xorm"
)

func ZhiosGuideStoreOrder(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosGuideStoreOrderSuccess(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosGuideStoreOrderSuccess(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosGuideStoreOrder
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
if canalMsg.Type == "success" {
err := success(eg, canalMsg)
if err != nil {
return err
}
}
if canalMsg.Type == "fail" {
err := fail(eg, canalMsg)
if err != nil {
return err
}
}
if canalMsg.Type == "down" {
err := down(eg, canalMsg)
if err != nil {
return err
}
}
return nil
}

func down(eg *xorm.Engine, canalMsg *md.ZhiosGuideStoreOrder) error {
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
//退积分
sum := canalMsg.DeductPrice
//退积分
// 111商家发布商品扣除 112商家商品审核失败退回 113 商家删除商品退回 114商品退款退回 115商家商品下架退回
err := UpdateUserFinValidAndInterFlowFreezeSess(sess,
utils.AnyToString(sum), "商品("+canalMsg.ItemId+")删除"+canalMsg.Stock+"个退回", "0", 1, utils.StrToInt(canalMsg.Uid), utils.StrToInt(canalMsg.CoinId), 113, utils.StrToInt64(utils.OrderUUID(utils.StrToInt(canalMsg.Uid))))
if err != nil {
sess.Rollback()
return err
}
sess.Commit()
return nil
}
func success(eg *xorm.Engine, canalMsg *md.ZhiosGuideStoreOrder) error {
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
var data model.GuideStoreOrder
get, _ := sess.Where("pvd_oid=?", canalMsg.Oid).Get(&data)
var newOrd model.OrdList
sess.Where("pvd_oid=?", canalMsg.Oid).Get(&newOrd)
if get == false {
deductPrice := canalMsg.DeductPrice
var storeOrder = model.GuideStoreOrder{
Uid: newOrd.Uid,
Time: time.Unix(int64(newOrd.CreateAt), 0),
StoreId: utils.StrToInt(canalMsg.StoreId),
Gid: newOrd.ItemId,
State: newOrd.State,
Title: canalMsg.ItemTitle,
Pvd: canalMsg.Pvd,
SubsidyPrice: canalMsg.SubsidyPrice,
Fee: canalMsg.Fee,
DeductPrice: deductPrice,
OldDeductPrice: deductPrice,
Price: utils.Float64ToStr(newOrd.PaidPrice),
Oid: utils.Int64ToStr(newOrd.OrdId),
PvdOid: newOrd.PvdOid,
DeductState: 1,
DeductAt: time.Now(),
}
if utils.StrToInt(canalMsg.State) == 4 {
storeOrder.DeductState = 0
}
_, err := sess.Insert(&storeOrder)
if err == nil && storeOrder.DeductState == 1 {
coinId := db.SysCfgGetWithDb(eg, canalMsg.Mid, "guide_store_coin_id")
err := UpdateUserFinValidAndInterFlowFreeze(sess,
utils.AnyToString(deductPrice), "商品("+newOrd.ItemId+")下单扣除冻结积分", "0", 2, utils.StrToInt(canalMsg.StoreId), utils.StrToInt(coinId), 117, newOrd.OrdId)
if err != nil {
sess.Rollback()
return err
}
}
newOrd.OrderFormType = -2
sess.Where("ord_id=?", newOrd.OrdId).Cols("order_form_type").Update(&newOrd)
}
sess.Commit()
return nil
}

func fail(eg *xorm.Engine, canalMsg *md.ZhiosGuideStoreOrder) error {
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
//m, _ := db.FreeProductByID(eg, canalMsg.ItemId, canalMsg.Pvd)
//直接退回账号了 定制
storeOrder := db.GuideStoreOrderSess(sess, utils.StrToInt64(canalMsg.Oid))
//if m != nil {
if storeOrder != nil && utils.StrToFloat64(storeOrder.DeductPrice) > 0 && storeOrder.DeductState == 1 {
coinId := db.SysCfgGetWithDb(eg, canalMsg.Mid, "guide_store_coin_id")
err := UpdateUserVirtualCoinFinValidAndInterFlow(sess,
utils.AnyToString(storeOrder.DeductPrice), "商品("+storeOrder.Gid+")退款退回", "0", 1, storeOrder.StoreId, utils.StrToInt(coinId), 114, utils.StrToInt64(canalMsg.Oid))
if err != nil {
sess.Rollback()
return err
}
storeOrder.DeductPrice = "0"
storeOrder.DeductState = 2
storeOrder.State = 4
_, err = sess.Where("id=?", storeOrder.Id).Update(storeOrder)
if err != nil {
sess.Rollback()
return err
}
}
//}
sess.Commit()
return nil
}
func UpdateUserFinValidAndInterFlowFreezeSess(session *xorm.Session, money, Title, fee string, types, uid, coinId, transferType int, ordId int64) error {
UserVirtualAmount, err := db.UserVirtualAmountFindByIdWithSession(session, uid, coinId)
if err != nil || UserVirtualAmount == nil {
if err == nil {
err = errors.New("获取用户余额信息失败")
}
return err
}
beforeAmount := UserVirtualAmount.Amount
freezeBeforeAmount := UserVirtualAmount.FreezeAmount

if types == 1 {
UserVirtualAmount.Amount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.Amount) + utils.StrToFloat64(money))
UserVirtualAmount.FreezeAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.FreezeAmount) - utils.StrToFloat64(money))
} else if types == 2 {
UserVirtualAmount.Amount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.Amount) - utils.StrToFloat64(money))
UserVirtualAmount.FreezeAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.FreezeAmount) + utils.StrToFloat64(money))
if utils.StrToFloat64(UserVirtualAmount.Amount) < 0 {
return errors.New("额度不足")
}
}
afterAmount := UserVirtualAmount.Amount
freezeAfterAmount := UserVirtualAmount.FreezeAmount

affected, err := db.UserVirtualAmountUpdateWithSession(session, uid, coinId, UserVirtualAmount, "amount,freeze_amount")
if err != nil || affected == 0 {
if err == nil {
err = errors.New("更新用户余额信息失败")
}
return err
}
err = virtualCoinFlowInsert(session, uid, coinId, money, fee, ordId, Title, types, transferType, beforeAmount, afterAmount, freezeBeforeAmount, freezeAfterAmount)
if err != nil {
return err
}
return nil
}

func UpdateUserVirtualCoinFinValidAndInterFlow(sess *xorm.Session, money, Title, fee string, types, uid, coinId, transferType int, ordId int64) error {
UserVirtualAmount, err := db.UserVirtualAmountFindById(sess, uid, coinId)
if err != nil || UserVirtualAmount == nil {
if err == nil {
err = errors.New("获取用户余额信息失败")
}
return err
}
beforeAmount := UserVirtualAmount.Amount
freezeBeforeAmount := UserVirtualAmount.FreezeAmount
if types == 2 {
UserVirtualAmount.Amount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.Amount) - utils.StrToFloat64(money))
UserVirtualAmount.UseAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.UseAmount) + utils.StrToFloat64(money))
} else if types == 1 {
UserVirtualAmount.Amount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.Amount) + utils.StrToFloat64(money))
UserVirtualAmount.UseAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.UseAmount) - utils.StrToFloat64(money))
}
afterAmount := UserVirtualAmount.Amount
freezeAfterAmount := UserVirtualAmount.FreezeAmount

affected, err := db.UserVirtualAmountUpdate(sess, uid, coinId, UserVirtualAmount, "amount")
if err != nil || affected == 0 {
if err == nil {
err = errors.New("更新用户余额信息失败")
}
return err
}
err = virtualCoinFlowInsert(sess, uid, coinId, money, fee, ordId, Title, types, transferType, beforeAmount, afterAmount, freezeBeforeAmount, freezeAfterAmount)
if err != nil {
return err
}
return nil
}

func UpdateUserFinValidAndInterFlowFreeze(sess *xorm.Session, money, Title, fee string, types, uid, coinId, transferType int, ordId int64) error {
UserVirtualAmount, err := db.UserVirtualAmountFindById(sess, uid, coinId)
if err != nil || UserVirtualAmount == nil {
if err == nil {
err = errors.New("获取用户余额信息失败")
}
return err
}
beforeAmount := UserVirtualAmount.Amount
freezeBeforeAmount := UserVirtualAmount.FreezeAmount

if types == 2 {
UserVirtualAmount.FreezeAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.FreezeAmount) - utils.StrToFloat64(money))
UserVirtualAmount.UseAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.UseAmount) + utils.StrToFloat64(money))
} else if types == 1 {
UserVirtualAmount.FreezeAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.FreezeAmount) + utils.StrToFloat64(money))
UserVirtualAmount.UseAmount = utils.AnyToString(utils.AnyToFloat64(UserVirtualAmount.UseAmount) - utils.StrToFloat64(money))
}
afterAmount := UserVirtualAmount.Amount
freezeAfterAmount := UserVirtualAmount.FreezeAmount
affected, err := db.UserVirtualAmountUpdate(sess, uid, coinId, UserVirtualAmount, "freeze_amount,use_amount")
if err != nil || affected == 0 {
if err == nil {
err = errors.New("更新用户余额信息失败")
}
return err
}
err = virtualCoinFlowInsert(sess, uid, coinId, money, fee, ordId, Title, types, transferType, beforeAmount, afterAmount, freezeBeforeAmount, freezeAfterAmount)
if err != nil {
return err
}
return nil
}
func virtualCoinFlowInsert(sess *xorm.Session, uid, coinId int, money, SysFee string, ordId int64, ItemTitle string, types, transferType int, beforeAmount string, afterAmount string, freezeBeforeAmount string, freezeAfterAmount string) error {
now := time.Now()
if err := db.UserVirtualCoinFlowInsertOne(
sess,
&model.UserVirtualCoinFlow{
Uid: uid,
OrdId: utils.Int64ToStr(ordId),
CoinId: coinId,
Direction: types,
Title: ItemTitle,
Amout: money,
FreezeBeforeAmout: freezeBeforeAmount,
FreezeAfterAmout: freezeAfterAmount,
BeforeAmout: beforeAmount,
AfterAmout: afterAmount,
SysFee: SysFee,
CreateTime: now,
TransferType: transferType,
}); err != nil {
_ = logx.Warn(err)
return err
}
return nil
}

+ 0
- 67
consume/zhios_installment_payment_auto_repaid_consume.go ファイルの表示

@@ -1,67 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/installment_payment"
md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/installment_payment/md"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func InstallmentPaymentAutoRepaidConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>InstallmentPaymentAutoRepaidConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleInstallmentPaymentAutoRepaidConsume(ch, res.Body)
if err != nil {
fmt.Println("handleInstallmentPaymentAutoRepaidConsumeERR:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleInstallmentPaymentAutoRepaidConsume(ch *rabbit.Channel, msgData []byte) error {
time.Sleep(time.Duration(1) * time.Millisecond) //休眠1毫秒

//1、解析mq中queue的数据结构体
var msg *md2.InstallmentPaymentStructForAutoRepaid
err := json.Unmarshal(msgData, &msg)
if err != nil {
return err
}
engine := db.DBs[msg.MasterId]
installment_payment.Init(cfg.RedisAddr)
//2、调用 `DealInstallmentPaymentAutoRepaid` 制度方法进行扣款
err = installment_payment.DealInstallmentPaymentAutoRepaid(engine, ch, *msg, msg.MasterId)
return nil
}

+ 0
- 138
consume/zhios_integral_proxy_recharge.go ファイルの表示

@@ -1,138 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
"xorm.io/xorm"
)

func ZhiosIntegralProxyRecharge(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosIntegralProxyRecharge(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosIntegralProxyRecharge(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAppreciation
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
order := db.GetIntegralProxyRecord(sess, canalMsg.Oid)
now := int(time.Now().Unix())
if order.State != 1 || order.SendTime > now {
sess.Rollback()
return nil
}
day := order.Time.Format("02")
if order.SendTime == 0 {
order.SendTime = int(utils.TimeStdParseUnix(order.PayTime.Format("2006-01-02") + " 00:00:00"))
} else if order.SendTime < int(time.Now().Unix()) {
order.SendTime = int(utils.TimeStdParseUnix(time.Now().Format("2006-01-02") + " 00:00:00"))
}
order.SendTime += 30 * 86400
date := time.Unix(int64(order.SendTime), 0).Format("2006-01")
order.SendTime = int(utils.TimeStdParseUnix(date + "-" + day + " 00:00:00"))

amount := "0"
title := ""
str := "代充值"
if order.Type == "gift_goods" {
str = "购买礼包奖励"
}
if order.Type == "give" {
str = "转赠"
}
if canalMsg.Type == "" || canalMsg.Type == "first" {
amount = order.Amount
title = str + "到账"
if order.RealOnAccount > 0 {
order.RealOnAccount--
title = str + "第" + utils.IntToStr(order.OnAccount-order.RealOnAccount) + "期到账"
amount = order.EveryAmount
}
}
if canalMsg.Type == "second" {
if order.RealOnAccount <= 0 { //已经没了
sess.Rollback()
return nil
}
order.RealOnAccount--
title = str + "第" + utils.IntToStr(order.OnAccount-order.RealOnAccount) + "期到账"
amount = order.EveryAmount
}
err = addIntegral(sess, order.CoinId, order.Oid, amount, title, order.Uid)
if err != nil {
sess.Rollback()
return err
}
order.RunTime = utils.StrToInt(time.Now().Format("200601"))
update, err := sess.Where("id=?", order.Id).Cols("run_time,real_on_account,send_time").Update(order)
if update == 0 || err != nil {
sess.Rollback()
return err
}
sess.Commit()
return nil
}
func addIntegral(sess *xorm.Session, coinId int, oid int64, amount, title string, uid int) error {
err := UpdateUserVirtualCoinFinValidAndInterFlow(sess,
amount, title, "0", 1, uid, coinId, 125, oid)
if err != nil {
return err
}
return nil
}

+ 0
- 90
consume/zhios_mall_green_coin_consume.go ファイルの表示

@@ -1,90 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

func ZhiosMallGreenCoinConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>ZhiosMallGreenCoinConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosMallGreenCoinConsume(res.Body)
//_ = res.Reject(false)
if err != nil {
var canalMsg *md.ZhiosMallConsume
var tmpString string
err1 := json.Unmarshal(res.Body, &tmpString)
if err1 == nil {
fmt.Println(tmpString)
err1 = json.Unmarshal([]byte(tmpString), &canalMsg)
if err1 == nil {
canalMsg.Err = err.Error()
ch.Publish(md.MallGreenCoinConsume, utils.SerializeStr(canalMsg), md.MallGreenCoinConsumeKeyErr)
}
}
}
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosMallGreenCoinConsume(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosMallConsume
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
rule.InitForGreenCoinDoubleChainIntegral(cfg.RedisAddr)
err = rule.DealUserGreenCoinDoubleChainIntegral(eg, utils.StrToInt(canalMsg.Uid), canalMsg.Oid, canalMsg.Mid)
fmt.Println(err)
if err != nil {
return err
}

return nil
}

+ 0
- 120
consume/zhios_one_circles_coin_consume.go ファイルの表示

@@ -1,120 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/shopspring/decimal"
"github.com/streadway/amqp"
"strings"
"time"
)

func ZhiosOneCirclesCoinConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(50)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>ZhiosOneCirclesCoinConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOneCirclesCoinConsume(res.Body)
if err != nil {
fmt.Println("handleZhiosOneCirclesCoinConsume:::::", err.Error())
}
//_ = res.Reject(false)
err = res.Ack(true)
fmt.Println("err ::: ", err)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOneCirclesCoinConsume(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.CanalUserVirtualCoinFlowOrderMessage[md.CanalUserVirtualCoinFlowOrder]
err := json.Unmarshal(msg, &canalMsg)
if err != nil {
return err
}
masterId := strings.Split(canalMsg.Database, "_")[1]
if masterId != "31585332" {
return nil
}
engine := db.DBs[masterId]
now := time.Now()

if canalMsg.Type == md.CanalMsgInsertSqlType {
////2、查找 one_circles_green_energy_basic_setting 基础设置
//userPublicPlatoonDoubleNetworkSetting, err := db.UserPublicPlatoonDoubleNetworkSettingGetOneByParams(engine, map[string]interface{}{
// "key": "is_open",
// "value": 1,
//})
//if err != nil {
// return err
//}

if canalMsg.Data[0].CoinId == utils.IntToStr(7) { //TODO::数据量太大,减少查询直接写死
//3、查找 user_public_platoon_double_network_user_coin_record
userVirtualCoinFlowAggregation, err1 := db.UserVirtualCoinFlowAggregationGetOneByParams(engine, map[string]interface{}{
"key": "uid",
"value": canalMsg.Data[0].Uid,
})
if err1 != nil {
return err1
}
if userVirtualCoinFlowAggregation == nil {
//新增记录
_, err3 := db.UserVirtualCoinFlowAggregationInsert(engine, &model.UserVirtualCoinFlowAggregation{
Uid: utils.StrToInt(canalMsg.Data[0].Uid),
CoinId: utils.StrToInt(canalMsg.Data[0].CoinId),
TodayData: canalMsg.Data[0].Amout,
ThisWeekData: canalMsg.Data[0].Amout,
ThisMonthData: canalMsg.Data[0].Amout,
NowData: canalMsg.Data[0].Amout,
CreateAt: now.Format("2006-01-02 15:04:05"),
UpdateAt: now.Format("2006-01-02 15:04:05"),
})
if err3 != nil {
return err3
}
} else {
//更新记录
amount, _ := decimal.NewFromString(canalMsg.Data[0].Amout)
todayData, _ := decimal.NewFromString(userVirtualCoinFlowAggregation.TodayData)
thisWeekData, _ := decimal.NewFromString(userVirtualCoinFlowAggregation.ThisWeekData)
thisMonthData, _ := decimal.NewFromString(userVirtualCoinFlowAggregation.ThisMonthData)
userVirtualCoinFlowAggregation.TodayData = todayData.Add(amount).String()
userVirtualCoinFlowAggregation.ThisWeekData = thisWeekData.Add(amount).String()
userVirtualCoinFlowAggregation.ThisMonthData = thisMonthData.Add(amount).String()
userVirtualCoinFlowAggregation.NowData = canalMsg.Data[0].AfterAmout
_, err2 := db.UserVirtualCoinFlowAggregationUpdate(engine, userVirtualCoinFlowAggregation.Id, userVirtualCoinFlowAggregation, "today_data", "this_week_data", "this_month_data", "now_data")
if err2 != nil {
return err2
}
}
}
}
return nil
}

+ 0
- 646
consume/zhios_order_buckle.go ファイルの表示

@@ -1,646 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
md2 "applet/app/md"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"encoding/json"
"errors"
"fmt"
"github.com/jinzhu/copier"
"github.com/streadway/amqp"
"github.com/tidwall/gjson"
"time"
"xorm.io/xorm"
)

func ZhiosOrderBuckle(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOrderBuckle(res.Body)
//_ = res.Reject(false)
if err != nil {
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosOrderBuckle
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err != nil {
return
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &msg)
if err != nil {
return
}
ch.Publish(queue.ExchangeName, utils.SerializeStr(msg), queue.RoutKey)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOrderBuckle(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderBuckle
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()

ordData, err := db.OrderListByPvdOid(sess, canalMsg.Oid)
if err != nil || ordData == nil {
return nil
}
if ordData.OrderFormType < 0 || ordData.State > 3 {
sess.Commit()

return nil
}
user, _ := db.UserFindByID(eg, ordData.Uid)
if user == nil {
sess.Commit()

return nil
}
//判断是否符合条件 TODO
bools := checkUser(eg, canalMsg.Mid, user, utils.FloatFormat(ordData.BenefitAll, 3))
if bools == false {
sess.Commit()

return nil
}

fmt.Println(ordData)
//加入分佣关系链
opts, commissionOpts, _ := svc.GetAllPlan(eg, canalMsg.Mid)
if opts == nil {
sess.Commit()

return nil
}
BenefitAll := ordData.BenefitAll
pvd := ordData.Pvd
if ordData.OrderFormType == 1 { //京东自营
pvd = md3.PVD_JDOwn
}
var rmd = md3.CommissionParam{IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder)}
opt, err := svc.GetPlanCfg(eg, pvd, canalMsg.Mid, opts, commissionOpts, map[int]string{}, &rmd)
if err != nil {
sess.Commit()
return nil
}

if opt.BuckleRate == 0 {
sess.Commit()

return nil
}
//计算出暗扣的比例 TODO
if opt.BuckleRate > 0 {
BenefitAll = utils.FloatFormat(ordData.BenefitAll*(1-opt.BuckleRate), 9)
}
var ord = md2.OrderInfo{
PvdOid: ordData.PvdOid,
Pvd: pvd,
ItemId: ordData.ItemId,
ItemNum: ordData.ItemNum,
ItemPrice: ordData.ItemPrice,
PaidPrice: ordData.PaidPrice,
OrderType: ordData.OrderType,
Commission: BenefitAll,
State: ordData.State,
}
//调用公共的分佣
isShare := 0
if ord.OrderType == 1 {
isShare = 1
}
//计算每个用户的分佣
req := md2.CommissionFirstParam{
CommissionParam: md2.CommissionParam{
Commission: utils.Float64ToStr(ord.Commission),
PaidPrice: utils.Float64ToStr(ord.PaidPrice),
OldPrice: utils.Float64ToStr(ord.PaidPrice),
IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder),
},
Uid: utils.IntToStr(ordData.Uid),
IsShare: isShare,
Provider: ord.Pvd,
IsAllLevelReturn: 1,
}
if utils.InArr(ord.Pvd, []string{md3.PVD_TB, md3.PVD_TM, md3.PVD_PDD, md3.PVD_SN, md3.PVD_KL, md3.PVD_JD, md3.PVD_JDOwn, md3.PVD_VIP}) == false {
req.CommissionParam.GoodsPrice = utils.Float64ToStr(ord.PaidPrice)
}
commissionList, err := GetCommissionByCommApi(eg, canalMsg.Mid, req)
if err != nil || commissionList.LvUser == nil {
sess.Commit()
return nil
}
pvdFee := commissionList.PvdFee
sysFee := commissionList.SysFee
subsidyFee := commissionList.SubsidyFee
lvUser := commissionList.LvUser
profit := commissionList.Profit
ordData.SubsidyFee = subsidyFee
ordData.PvdCommission = pvdFee
ordData.SysCommission = sysFee
ordData.BuckleCommission = utils.Float64ToStr(BenefitAll)
if ordData.OrderFormType == 2 {
ordData.OrderFormType = -2
} else {
ordData.OrderFormType = -1

}
var selfRate float64 = 0
var subsidyRate float64 = 0
//处理记录佣金
if opt != nil {
profit = lvUser.Profit
//判断下这个等级有么有设置
ordData.UserCommission = profit
ordData.SubsidyRate = subsidyRate
ordData.UserCommissionRate = selfRate
ordData.PlanCommissionId = opt.PlanCommissionId
ordData.BenefitList = SerializeLvUser(NewCalcLvUserFee(lvUser))
}

has, _ := db.OrderListByUpdateOrd(sess, ordData)
if has == false {
sess.Rollback()
return nil
}

//批量写入
if lvUser != nil {
err := OrderRelateInsert(eg, sess, ordData.OrdId, ordData.Pvd, ordData.CreateAt, lvUser, ordData, canalMsg.Mid, true, opt.Mode, "1")
if err != nil {
sess.Rollback()
return err
}
}
sess.Commit()
return nil
}

func checkUser(eg *xorm.Engine, dbName string, user *model.User, commission float64) bool {
buckleData := db.SysCfgGetWithDb(eg, dbName, "buckle_data")
//注册时间
lastMonthEstimateCommission := gjson.Get(buckleData, "last_month_estimate_commission").String() //用户上个月预估佣金金额大于
monthOrderCount := gjson.Get(buckleData, "month_order_count").String() //用户每月订单笔数
orderCommissionEnd := gjson.Get(buckleData, "order_commission_end").String() //用户订单佣金金额:结束区间
orderCommissionStart := gjson.Get(buckleData, "order_commission_start").String() //用户订单佣金金额:开始区间
userRegDay := gjson.Get(buckleData, "user_reg_day").String() //用户注册时间
if (time.Now().Unix()-user.CreateAt.Unix())/86400 < utils.StrToInt64(userRegDay) && utils.StrToInt64(userRegDay) > 0 {
fmt.Println("时间=============", (time.Now().Unix()-user.CreateAt.Unix())/86400)
return false
}
if utils.StrToFloat64(lastMonthEstimateCommission) > 0 {
lastMonthRange := utils.GetTimeRange("last_month")
// 统计上月预估 (预估包含结算部分且是有效订单)
sqlTpl2 := `SELECT cast(SUM(IF(ol.state<>4 or pco.state=1 or dol.id>0 or ro.status<>'已退款' or pso.status<>'订单退款', LEFT(olr.amount,LENGTH(olr.amount)-2), 0)) as decimal(50,4)) AS amount
FROM ord_list_relate olr
LEFT JOIN ord_list ol ON olr.oid = ol.ord_id
LEFT JOIN privilege_card_ord pco ON olr.oid =pco.ord_id
LEFT JOIN duoyou_ord_list dol ON olr.oid =dol.oid
LEFT JOIN recharge_order ro ON olr.oid =ro.oid
LEFT JOIN playlet_sale_order pso ON olr.oid =pso.custom_oid
WHERE olr.uid = ?
AND olr.create_at >= ?
AND olr.create_at < ?
`
lastMonthResult, _ := db.QueryNativeString(eg, sqlTpl2, user.Uid, lastMonthRange["start"], lastMonthRange["end"])
if len(lastMonthRange) == 0 {
return false
}
fmt.Println("上月预估佣金=============", lastMonthResult[0]["amount"])

if utils.StrToFloat64(lastMonthResult[0]["amount"]) < utils.StrToFloat64(lastMonthEstimateCommission) {
return false
}
}
if utils.StrToFloat64(monthOrderCount) > 0 {
currentMonth := utils.GetTimeRange("current_month")
count, _ := eg.Where("uid=? and create_at>=?", user.Uid, currentMonth["start"]).In("state", []string{"0", "1", "2", "3", "5"}).Count(&model.OrdList{})
fmt.Println("本月订单数=============", count)

if count < utils.StrToInt64(monthOrderCount) {
return false
}
}
if utils.StrToFloat64(orderCommissionEnd) > 0 && utils.StrToFloat64(orderCommissionStart) > 0 {
fmt.Println("订单佣金=============", commission)
if commission < utils.StrToFloat64(orderCommissionStart) {
return false
}
if commission > utils.StrToFloat64(orderCommissionEnd) {
return false
}
}
return true
}

func OrderRelateInsert(eg *xorm.Engine, sess *xorm.Session, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, newOrd *model.OrdList, masterId string, isDelete bool, mode string, isNew string) error {
if lvUser == nil {
return nil
}
uid := lvUser.Uid
if uid == 0 {
return nil
}
oldLvUser := lvUser
oldLevel := 0
byOid, _ := db.OrderListByOid(sess, utils.Int64ToStr(oid))
data := OrderRelateInsertComm(eg, oid, pvd, createTime, lvUser, newOrd, masterId, mode)
fmt.Println(data)

if data == nil || len(data) == 0 {
return nil
}
list, _ := db.OrderRelateFindByOid(sess, oid, pvd)
listMap := make(map[int]model.OrdListRelate)
if list != nil {
for _, v := range *list {
listMap[v.Uid] = v
}
}
for k, v := range data {
tmp, ok := listMap[v.Uid]
if ok {
data[k].OldAmount = tmp.Amount
leave := utils.FloatFormat(tmp.Amount-v.Amount, 6)
if leave >= 0 {
var tmps = model.BuckleRecord{
Date: time.Now().Format("2006-01"),
Time: time.Now(),
Uid: v.Uid,
OrdId: utils.Int64ToStr(v.Oid),
PvdOrdId: byOid.PvdOid,
Amount: utils.Float64ToStrByPrec(leave, 6),
BeforeAmount: utils.Float64ToStrByPrec(tmp.Amount, 6),
AfterAmount: utils.Float64ToStrByPrec(v.Amount, 6),
Level: v.Level,
}
_, err := sess.Insert(&tmps)
if err != nil {
return err
}

}
}

}

fmt.Println(isDelete)
_, err2 := db.OrderRelateDeleteByOid(sess, oid, pvd)
if err2 != nil {
return err2
}
_, err2 = db.VirtualCoinOrderRelateDeleteByOid(sess, oid, pvd)
if err2 != nil {
return err2
}
//后写入
err := db.DbInsertBatchSess(sess, data)
if err != nil {
return err

} else if lvUser.ProfitList != nil {
// 插入虚拟币数据
vcrData := CombineVirtualCoinRelateData(oldLvUser, oid, pvd, oldLevel, mode)
if len(vcrData) == 0 {
return nil
}
err := db.DbInsertBatchSess(sess, vcrData)
if err != nil {
return err

}
}
if lvUser.TikTokOwnSubsidyFeeList != nil {
_, err2 := db.TikTokTeamOrderRelateDeleteByOid(sess, oid, pvd)
if err != nil {
return err2
}
var teamData []model.TikTokTeamOrderRelate
TikTokTeamCommission := newOrd.TikTokTeamCommission
if utils.StrToFloat64(newOrd.TikTokTeamRealCommission) > 0 {
TikTokTeamCommission = newOrd.TikTokTeamRealCommission
}
for k, v := range lvUser.TikTokOwnSubsidyFeeList {
tmp := model.TikTokTeamOrderRelate{
CoinId: utils.StrToInt(k),
Uid: uid,
Amount: utils.Float64ToStrByPrec(v, 8),
Oid: utils.Int64ToStr(oid),
Time: time.Now(),
Commission: TikTokTeamCommission,
Pvd: pvd,
}
teamData = append(teamData, tmp)
}
if len(teamData) == 0 {
return nil
}
err := db.DbInsertBatchSess(sess, &teamData)
if err != nil {
return err

}
}
return nil
}
func OrderRelateInsertNew(eg *xorm.Engine, sess *xorm.Session, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, newOrd *model.OrdList, masterId string, isDelete bool, mode string, isNew string) error {
if lvUser == nil {
return nil
}
uid := lvUser.Uid
if uid == 0 {
return nil
}
oldLvUser := lvUser
oldLevel := 0
data := OrderRelateInsertComm(eg, oid, pvd, createTime, lvUser, newOrd, masterId, mode)
fmt.Println(data)

if data == nil || len(data) == 0 {
return nil
}
list, _ := db.OrderRelateFindByOid(sess, oid, pvd)
listMap := make(map[int]model.OrdListRelate)
if list != nil {
for _, v := range *list {
listMap[v.Uid] = v
}
}

fmt.Println(isDelete)
_, err2 := db.OrderRelateDeleteByOid(sess, oid, pvd)
if err2 != nil {
return err2
}
_, err2 = db.VirtualCoinOrderRelateDeleteByOid(sess, oid, pvd)
if err2 != nil {
return err2
}
//后写入
err := db.DbInsertBatchSess(sess, data)
if err != nil {
return err

} else if lvUser.ProfitList != nil {
// 插入虚拟币数据
vcrData := CombineVirtualCoinRelateData(oldLvUser, oid, pvd, oldLevel, mode)
if len(vcrData) == 0 {
return nil
}
err := db.DbInsertBatchSess(sess, vcrData)
if err != nil {
return err

}
}
if lvUser.TikTokOwnSubsidyFeeList != nil {
_, err2 := db.TikTokTeamOrderRelateDeleteByOid(sess, oid, pvd)
if err != nil {
return err2
}
var teamData []model.TikTokTeamOrderRelate
TikTokTeamCommission := newOrd.TikTokTeamCommission
if utils.StrToFloat64(newOrd.TikTokTeamRealCommission) > 0 {
TikTokTeamCommission = newOrd.TikTokTeamRealCommission
}
for k, v := range lvUser.TikTokOwnSubsidyFeeList {
tmp := model.TikTokTeamOrderRelate{
CoinId: utils.StrToInt(k),
Uid: uid,
Amount: utils.Float64ToStrByPrec(v, 8),
Oid: utils.Int64ToStr(oid),
Time: time.Now(),
Commission: TikTokTeamCommission,
Pvd: pvd,
}
teamData = append(teamData, tmp)
}
if len(teamData) == 0 {
return nil
}
err := db.DbInsertBatchSess(sess, &teamData)
if err != nil {
return err

}
}
return nil
}
func CombineVirtualCoinRelateData(lvUser *comm_plan.LvUser, oid int64, pvd string, level int, mode string) []*model.VirtualCoinRelate {
var data []*model.VirtualCoinRelate
//可能没有极差返利 只有补贴
profitList := lvUser.ProfitList
if len(profitList) == 0 {
profitList = lvUser.SubsidyFeeList
}
if profitList != nil {
var subsidyFeeList map[string]float64
if lvUser.SubsidyFeeList != nil && len(lvUser.ProfitList) > 0 {
subsidyFeeList = convertList2Map(lvUser.SubsidyFeeList)
}
var coinList = make([]string, 0)
for _, v := range profitList {
coinList = append(coinList, v.Cid)
}
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) && lvUser.SubsidyFeeList != nil { //补贴类型 没有的要补上
subsidyFeeList = convertList2Map(lvUser.SubsidyFeeList)
for _, v := range lvUser.SubsidyFeeList {
if utils.InArr(v.Cid, coinList) == false && v.Val > 0 {
v.Val = 0
profitList = append(profitList, v)
}
}
}
for _, item := range profitList {
if item.Cid != "0" && item.Cid != "commission" {
//加上补贴
subsidyFee := subsidyFeeList[item.Cid]
var ownSubsidyFee float64 = 0
ownSubsidyFee1, ok := lvUser.OwnSubsidyFeeList[item.Cid]
if ok {
ownSubsidyFee = ownSubsidyFee1
}
var additionalSubsidy float64 = 0
profit := utils.Float64ToStrByPrec(item.Val+subsidyFee+ownSubsidyFee, 9)
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) {
profit = utils.Float64ToStrByPrec(item.Val+ownSubsidyFee, 9)
additionalSubsidy = subsidyFee

}
if mode == "public_platoon" && level > 1 {
profit = "0"
}
if lvUser.Uid == 0 {
continue
}
var virtualCoinRelate = &model.VirtualCoinRelate{
Oid: oid,
Uid: lvUser.Uid,
CoinId: utils.StrToInt(item.Cid),
Amount: profit,
Pvd: pvd,
CreateAt: int(time.Now().Unix()),
Level: level,
Mode: mode,
AdditionalSubsidy: utils.Float64ToStrByPrec(additionalSubsidy, 6),
ExtendType: lvUser.ExtendType,
}
data = append(data, virtualCoinRelate)
}
}
}
if lvUser.ParentUser != nil {
level += 1
data = append(data, CombineVirtualCoinRelateData(lvUser.ParentUser, oid, pvd, level, mode)...)
}
return data
}
func convertList2Map(a []*comm_plan.VirtualCoinCommission) (b map[string]float64) {
b = make(map[string]float64)
for _, i := range a {
b[i.Cid] = i.Val
}
return b
}

func OrderRelateInsertComm(eg *xorm.Engine, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, newOrd *model.OrdList, masterId string, mode string) []*model.OrdListRelate {
var datas []*model.OrdListRelate
if lvUser == nil {
return datas
}
level := 0
fmt.Println("关系链---"+utils.Int64ToStr(oid)+"---"+pvd+"---", utils.SerializeStr(lvUser))
var ownSubsidyFee float64 = 0
ownSubsidyFee1, ok := lvUser.OwnSubsidyFeeList["0"]
if ok {
ownSubsidyFee = ownSubsidyFee1
}
profit := utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee+ownSubsidyFee, 9)
data := []*model.OrdListRelate{{Oid: oid, Uid: lvUser.Uid, Amount: profit, AdditionalSubsidy: utils.Float64ToStrByPrec(lvUser.AdditionalSubsidy, 9), Pvd: pvd, CreateAt: createTime, Level: level, Mode: mode, ExtendType: lvUser.ExtendType}}
for lvUser.ParentUser != nil {
lvUser = lvUser.ParentUser
fmt.Println(lvUser)
level = level + 1
profit = utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 9)
var additionalSubsidy float64 = 0
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) {
profit = utils.FloatFormat(lvUser.Profit, 6)
additionalSubsidy = lvUser.SubsidyFee
}
if lvUser.Uid == 0 {
continue
}
data = append(data, &model.OrdListRelate{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
Mode: mode,
AdditionalSubsidy: utils.Float64ToStrByPrec(additionalSubsidy, 9),
ExtendType: lvUser.ExtendType,
})
}
return data
}

func SerializeLvUser(lvUser map[int]float64) string {
s := ""
for k, v := range lvUser {
s += "|" + utils.IntToStr(k) + ":" + utils.Float64ToStr(v)
}
return s
}

func NewCalcLvUserFee(lvUser *comm_plan.LvUser) map[int]float64 {
fee := map[int]float64{}
if lvUser == nil {
return fee
}
if lvUser.ParentUser == nil {
fee[lvUser.Uid] = lvUser.Profit
}
for lvUser.ParentUser != nil {
fee[lvUser.Uid] = lvUser.Profit
lvUser = lvUser.ParentUser
}
return fee
}

func SettleComm(eg *xorm.Engine, masterId string, CommissionParam md2.CommissionFirstParam) (float64, float64, float64, float64, *comm_plan.LvUser, error) {
var CommissionParam1 = md3.CommissionFirstParam{}
copier.Copy(&CommissionParam1, CommissionParam)
profit, pvdFee, sysFee, subsidyFee, lvUser, err := rule.SettleCommWithOrder(eg, masterId, CommissionParam1)
return profit, pvdFee, sysFee, subsidyFee, lvUser, err
}

// GetCommissionByCommApi 调用公共接口获取佣金
func GetCommissionByCommApi(eg *xorm.Engine, masterId string, req md2.CommissionFirstParam) (*comm_plan.SettleCommissionToGuide, error) {
profit, pvdFee, sysFee, subsidyFee, lvUser, err := SettleComm(eg, masterId, req)
if err != nil {
return nil, err
}
result := &comm_plan.SettleCommissionToGuide{
Profit: profit,
PvdFee: pvdFee,
SysFee: sysFee,
SubsidyFee: subsidyFee,
LvUser: lvUser,
}
return result, nil
}

+ 0
- 623
consume/zhios_order_free.go ファイルの表示

@@ -1,623 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
md2 "applet/app/md"
svc2 "applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
"time"
"xorm.io/xorm"
)

func ZhiosOrderFree(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(100)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOrderFree(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOrderFree(msg []byte) error {
time.Sleep(time.Microsecond * 20) // 等待500毫秒
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderFree
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
ordData, err := db.OrderListByPvdOid(sess, canalMsg.Oid)
if err != nil || ordData == nil {
return nil
}
if ordData.State > 3 || ordData.PriceType > 0 || ordData.ThirdPriceType > 0 {
return nil
}
if canalMsg.OrderType == "13" {
freeNewType := db.SysCfgGetWithDb(eg, canalMsg.Mid, "more_free_new_type")
freeOrder := moreOrderFreeCheck(eg, sess, canalMsg)
if freeOrder != nil {
priceType := freeOrder.PriceType
ordData.ThirdPriceType = priceType
fee := utils.StrToFloat64(freeOrder.Fee)
allCommission := utils.StrToFloat64(freeOrder.ReturnMoney)
ordData.BenefitAll = allCommission
ownbuyReturnType := 0
if freeOrder.OwnbuyReturnType == 0 && freeOrder.ReturnType == 1 { //自购补贴等于0为关闭 并且是淘礼金商品
ownbuyReturnType = 1
}
storeId := freeOrder.StoreId
bili := utils.StrToFloat64(freeOrder.Bili)
//加入分佣关系链
opts, commissionOpts, _ := svc.GetAllPlan(eg, canalMsg.Mid)
if opts == nil {
sess.Commit()

return nil
}
BenefitAll := ordData.BenefitAll
pvd := "moreFree_" + utils.IntToStr(priceType)
var rmd = md3.CommissionParam{IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder)}
opt, err := svc.GetPlanCfg(eg, pvd, canalMsg.Mid, opts, commissionOpts, map[int]string{}, &rmd)
if err != nil {
sess.Commit()
return nil
}
var ord = md2.OrderInfo{
PvdOid: ordData.PvdOid,
Pvd: pvd,
ItemId: ordData.ItemId,
ItemNum: ordData.ItemNum,
ItemPrice: ordData.ItemPrice,
PaidPrice: ordData.PaidPrice,
OrderType: ordData.OrderType,
Commission: BenefitAll,
State: ordData.State,
}

//调用公共的分佣
isShare := 0
if ord.OrderType == 1 {
isShare = 1
}
//计算每个用户的分佣
req := md2.CommissionFirstParam{
CommissionParam: md2.CommissionParam{
Commission: utils.Float64ToStr(ord.Commission),
PaidPrice: utils.Float64ToStr(ord.PaidPrice),
OldPrice: utils.Float64ToStr(ord.PaidPrice),
IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder),
},
Uid: utils.IntToStr(ordData.Uid),
IsShare: isShare,
Provider: ord.Pvd,
IsAllLevelReturn: 1,
OwnbuyReturnType: ownbuyReturnType,
}
if utils.InArr(ord.Pvd, []string{md3.PVD_TB, md3.PVD_TM, md3.PVD_PDD, md3.PVD_SN, md3.PVD_KL, md3.PVD_JD, md3.PVD_JDOwn, md3.PVD_VIP}) == false {
req.CommissionParam.GoodsPrice = utils.Float64ToStr(ord.PaidPrice)
}
commissionList, err := GetCommissionByCommApi(eg, canalMsg.Mid, req)
if err != nil || commissionList.LvUser == nil {
sess.Commit()
return nil
}
pvdFee := commissionList.PvdFee
sysFee := commissionList.SysFee
subsidyFee := commissionList.SubsidyFee
lvUser := commissionList.LvUser
profit := commissionList.Profit
ordData.SubsidyFee = subsidyFee
ordData.PvdCommission = pvdFee
ordData.SysCommission = sysFee
var selfRate float64 = 0
var subsidyRate float64 = 0
//处理记录佣金
if opt != nil {
profit = lvUser.Profit
//判断下这个等级有么有设置
ordData.UserCommission = profit
ordData.SubsidyRate = subsidyRate
ordData.UserCommissionRate = selfRate
ordData.PlanCommissionId = opt.PlanCommissionId
ordData.BenefitList = SerializeLvUser(NewCalcLvUserFee(lvUser))
}
if storeId > 0 {
deductPrice := (allCommission + fee) * bili
arg := md.ZhiosGuideStoreOrder{
Uid: utils.IntToStr(ordData.Uid),
Mid: canalMsg.Mid,
Oid: ordData.PvdOid,
StoreId: utils.IntToStr(storeId),
DeductPrice: utils.Float64ToStr(deductPrice),
ItemTitle: ord.ItemTitle,
Pvd: "free",
SubsidyPrice: utils.Float64ToStr(allCommission),
Fee: utils.Float64ToStr(fee),
State: utils.IntToStr(ordData.State),
Type: "success",
}
ordData.Data = utils.SerializeStr(arg)
}
has, _ := db.OrderListByUpdateOrd(sess, ordData)
if has == false {
sess.Rollback()
return nil
}

//批量写入
if lvUser != nil {
if freeNewType == "1" {
lvUser.AdditionalSubsidy = ordData.BenefitAll
}
err := OrderRelateInsertNew(eg, sess, ordData.OrdId, ordData.Pvd, ordData.CreateAt, lvUser, ordData, canalMsg.Mid, true, opt.Mode, "1")
if err != nil {
sess.Rollback()
return err
}
}
}
} else {
freeNewType := db.SysCfgGetWithDb(eg, canalMsg.Mid, "free_new_type")
freeOrder := orderFreeCheck(eg, sess, canalMsg)
if freeOrder != nil {
priceType := freeOrder.PriceType
ordData.PriceType = priceType
fee := utils.StrToFloat64(freeOrder.Fee)
allCommission := utils.StrToFloat64(freeOrder.ReturnMoney)
ordData.BenefitAll = allCommission
ownbuyReturnType := 0
if freeOrder.OwnbuyReturnType == 0 && freeOrder.ReturnType == 1 { //自购补贴等于0为关闭 并且是淘礼金商品
ownbuyReturnType = 1
}
storeId := freeOrder.StoreId
bili := utils.StrToFloat64(freeOrder.Bili)
//加入分佣关系链
opts, commissionOpts, _ := svc.GetAllPlan(eg, canalMsg.Mid)
if opts == nil {
sess.Commit()

return nil
}
if canalMsg.OrderType == "6" || canalMsg.OrderType == "7" {
ordData.OrderType = 3 //淘礼金免单
}
BenefitAll := ordData.BenefitAll
pvd := "free"
var rmd = md3.CommissionParam{IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder)}
opt, err := svc.GetPlanCfg(eg, pvd, canalMsg.Mid, opts, commissionOpts, map[int]string{}, &rmd)
if err != nil {
sess.Commit()
return nil
}
var ord = md2.OrderInfo{
PvdOid: ordData.PvdOid,
Pvd: pvd,
ItemId: ordData.ItemId,
ItemNum: ordData.ItemNum,
ItemPrice: ordData.ItemPrice,
PaidPrice: ordData.PaidPrice,
OrderType: ordData.OrderType,
Commission: BenefitAll,
State: ordData.State,
}

//调用公共的分佣
isShare := 0
if ord.OrderType == 1 {
isShare = 1
}
//计算每个用户的分佣
req := md2.CommissionFirstParam{
CommissionParam: md2.CommissionParam{
Commission: utils.Float64ToStr(ord.Commission),
PaidPrice: utils.Float64ToStr(ord.PaidPrice),
OldPrice: utils.Float64ToStr(ord.PaidPrice),
IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder),
},
Uid: utils.IntToStr(ordData.Uid),
IsShare: isShare,
Provider: ord.Pvd,
IsAllLevelReturn: 1,
OwnbuyReturnType: ownbuyReturnType,
}
if utils.InArr(ord.Pvd, []string{md3.PVD_TB, md3.PVD_TM, md3.PVD_PDD, md3.PVD_SN, md3.PVD_KL, md3.PVD_JD, md3.PVD_JDOwn, md3.PVD_VIP}) == false {
req.CommissionParam.GoodsPrice = utils.Float64ToStr(ord.PaidPrice)
}
commissionList, err := GetCommissionByCommApi(eg, canalMsg.Mid, req)
if err != nil || commissionList.LvUser == nil {
sess.Commit()
return nil
}
pvdFee := commissionList.PvdFee
sysFee := commissionList.SysFee
subsidyFee := commissionList.SubsidyFee
lvUser := commissionList.LvUser
profit := commissionList.Profit
ordData.SubsidyFee = subsidyFee
ordData.PvdCommission = pvdFee
ordData.SysCommission = sysFee
var selfRate float64 = 0
var subsidyRate float64 = 0
//处理记录佣金
if opt != nil {
profit = lvUser.Profit
//判断下这个等级有么有设置
ordData.UserCommission = profit
ordData.SubsidyRate = subsidyRate
ordData.UserCommissionRate = selfRate
ordData.PlanCommissionId = opt.PlanCommissionId
ordData.BenefitList = SerializeLvUser(NewCalcLvUserFee(lvUser))
}
if storeId > 0 {
deductPrice := (allCommission + fee) * bili
arg := md.ZhiosGuideStoreOrder{
Uid: utils.IntToStr(ordData.Uid),
Mid: canalMsg.Mid,
Oid: ordData.PvdOid,
StoreId: utils.IntToStr(storeId),
DeductPrice: utils.Float64ToStr(deductPrice),
ItemTitle: ord.ItemTitle,
Pvd: "free",
SubsidyPrice: utils.Float64ToStr(allCommission),
Fee: utils.Float64ToStr(fee),
State: utils.IntToStr(ordData.State),
Type: "success",
}
ordData.Data = utils.SerializeStr(arg)
}
has, _ := db.OrderListByUpdateOrd(sess, ordData)
if has == false {
sess.Rollback()
return nil
}

//批量写入
if lvUser != nil {
if freeNewType == "1" {
lvUser.AdditionalSubsidy = ordData.BenefitAll
}
err := OrderRelateInsertNew(eg, sess, ordData.OrdId, ordData.Pvd, ordData.CreateAt, lvUser, ordData, canalMsg.Mid, true, opt.Mode, "1")
if err != nil {
sess.Rollback()
return err
}
}
}
}
sess.Commit()

return nil
}
func orderFreeCheck(eg *xorm.Engine, sess *xorm.Session, canalMsg *md.ZhiosOrderFree) *model.NewcomersFreeProduct {

m, err := db.FreeProductByID(sess, canalMsg.ItemId, canalMsg.OptPvd)
stock := 0
if m != nil && m.StoreId > 0 { //小于多少份就不能出售了
guideStoreStock := db.SysCfgGetWithDb(eg, canalMsg.Mid, "guide_store_stock")
stock = utils.StrToInt(guideStoreStock)
}
if err != nil || m == nil || (m != nil && m.Stock <= stock) {
sess.Rollback()
return nil
}

if strings.Contains(canalMsg.Pid, "free_") && m.ReturnType == 0 {
mt, err := db.FreePriceTypeByID(sess, m.PriceType)
if err != nil || mt == nil {
sess.Rollback()

return nil
}
limitBuyConditions := &md.LimitBuyCondition{}
utils.Unserialize([]byte(mt.LimitBuyCondition), limitBuyConditions)
//判断条件前,先判断下有没有限购
if mt.NeedLimitBuy == 1 {
//判断当前栏目购买商品数量 并且开启了
if limitBuyConditions.OpenMoregoodsBuy == "1" && utils.StrToInt64(limitBuyConditions.MoregoodsBuyLimit) > 0 {
moreGoodsCount, _ := db.OrderListCountByPriceType(sess, canalMsg.Uid, mt.Id, utils.StrToInt(limitBuyConditions.MoregoodsBuyLimitDay))
if moreGoodsCount+1 > utils.StrToInt64(limitBuyConditions.MoregoodsBuyLimit) {
sess.Rollback()

return nil
}
}
//判断当前栏目购买商品数量 并且开启了
if limitBuyConditions.OpenOnegoodsBuy == "1" && utils.StrToInt64(limitBuyConditions.OnegoodsBuyLimit) > 0 {
moreGoodsCount, _ := db.OrderListCountByItemId(sess, canalMsg.Uid, canalMsg.ItemId, utils.StrToInt(limitBuyConditions.OnegoodsBuyLimitDay))
if moreGoodsCount+1 > utils.StrToInt64(limitBuyConditions.OnegoodsBuyLimit) {
sess.Rollback()
return nil
}
}
}
// 查找用户剩余的免单资格数
profile, err := db.UserProfileFindByID(eg, canalMsg.Uid)
if err != nil || profile == nil {
logx.Warn(err)
sess.Rollback()

return nil
}
if m.StoreId > 0 {
//商家放单 查下冻结
coinId := db.SysCfgGetWithDb(eg, canalMsg.Uid, "guide_store_coin_id")
amount := db.GetUserVirtualCoinAmount(eg, m.StoreId, coinId)
if amount == nil {
sess.Rollback()

return nil
}
if utils.StrToFloat64(amount.FreezeAmount) < utils.StrToFloat64(m.ReturnMoney) {
sess.Rollback()

return nil
}
}

//判断要不要扣免单券
if mt.NeedUseQuan == 1 {
// 更新剩余次数
isNeed := 1
if mt.NeedQuan == 0 {
isNeed = 0
}
if mt.NeedQuan > profile.FreeRemainTime {
auth, perm := svc2.CheckNewOrderAuth(eg, utils.StrToInt(canalMsg.Uid), mt)
if perm.AuthType == "all" || auth == false {
sess.Rollback()
return nil
}
if perm.AuthType != "all" && auth == true {
isNeed = 0
}
}
if isNeed == 1 {
profile.FreeRemainTime = profile.FreeRemainTime - mt.NeedQuan
_, err = db.UserProfileUpdate(eg, profile.Uid, profile, "free_remain_time")
if err != nil {
logx.Warn(err)
sess.Rollback()

return nil
}
// 插入日志记录
db.FreeQualificationRecordInsertOne(eg, &model.NewcomersQualificationRecord{
Uid: profile.Uid,
Source: 3,
SourceText: "消费扣除",
OrderId: utils.StrToInt64(canalMsg.Oid),
ChangeNum: -mt.NeedQuan,
AfterChangeNum: profile.FreeRemainTime,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
})
}

}
m.Stock--
if m.Stock < 0 {
m.Stock = 0
}
m.Sale++
_, err = eg.Where("id=?", m.Id).Cols("stock,sale").Update(m)
if err != nil {
sess.Rollback()
return nil
}
if m.StoreId > 0 { //扣库存
var storeGoods model.GuideStoreGoods
_, err := sess.Where("gid=? and delete_time is null and stock>?", m.GoodId, 0).Get(&storeGoods)
if err != nil {
sess.Rollback()
return nil
}
storeGoods.Stock--
if storeGoods.Stock < 0 {
storeGoods.DownState = 3
storeGoods.EndTime = int(time.Now().Unix())
}
_, err = sess.Where("id=?", storeGoods.Id).Cols("down_state,end_time,stock").Update(&storeGoods)
if err != nil {
sess.Rollback()
return nil
}
}
sess.Commit()
return m
}
sess.Commit()
return m
}
func moreOrderFreeCheck(eg *xorm.Engine, sess *xorm.Session, canalMsg *md.ZhiosOrderFree) *model.MoreNewcomersFreeProduct {

m, err := db.MoreFreeProductByID(sess, canalMsg.ItemId, canalMsg.OptPvd)
stock := 0
if m != nil && m.StoreId > 0 { //小于多少份就不能出售了
guideStoreStock := db.SysCfgGetWithDb(eg, canalMsg.Mid, "guide_store_stock")
stock = utils.StrToInt(guideStoreStock)
}
if err != nil || m == nil || (m != nil && m.Stock <= stock) {
sess.Rollback()
return nil
}

if strings.Contains(canalMsg.Pid, "moreFree_") && m.ReturnType == 0 {
mt, err := db.MoreFreePriceTypeByID(sess, m.PriceType)
if err != nil || mt == nil {
sess.Rollback()

return nil
}
limitBuyConditions := &md.LimitBuyCondition{}
utils.Unserialize([]byte(mt.LimitBuyCondition), limitBuyConditions)
//判断条件前,先判断下有没有限购
if mt.NeedLimitBuy == 1 {
//判断当前栏目购买商品数量 并且开启了
if limitBuyConditions.OpenMoregoodsBuy == "1" && utils.StrToInt64(limitBuyConditions.MoregoodsBuyLimit) > 0 {
moreGoodsCount, _ := db.OrderListCountByMorePriceType(sess, canalMsg.Uid, mt.Id, utils.StrToInt(limitBuyConditions.MoregoodsBuyLimitDay))
if moreGoodsCount+1 > utils.StrToInt64(limitBuyConditions.MoregoodsBuyLimit) {
sess.Rollback()

return nil
}
}
//判断当前栏目购买商品数量 并且开启了
if limitBuyConditions.OpenOnegoodsBuy == "1" && utils.StrToInt64(limitBuyConditions.OnegoodsBuyLimit) > 0 {
moreGoodsCount, _ := db.OrderListCountByMoreItemId(sess, canalMsg.Uid, canalMsg.ItemId, utils.StrToInt(limitBuyConditions.OnegoodsBuyLimitDay))
if moreGoodsCount+1 > utils.StrToInt64(limitBuyConditions.OnegoodsBuyLimit) {
sess.Rollback()
return nil
}
}
}
// 查找用户剩余的免单资格数
profile, err := db.UserProfileFindByID(eg, canalMsg.Uid)
if err != nil || profile == nil {
logx.Warn(err)
sess.Rollback()

return nil
}
if m.StoreId > 0 {
//商家放单 查下冻结
coinId := db.SysCfgGetWithDb(eg, canalMsg.Uid, "guide_store_coin_id")
amount := db.GetUserVirtualCoinAmount(eg, m.StoreId, coinId)
if amount == nil {
sess.Rollback()

return nil
}
if utils.StrToFloat64(amount.FreezeAmount) < utils.StrToFloat64(m.ReturnMoney) {
sess.Rollback()

return nil
}
}

//判断要不要扣免单券
if mt.NeedUseQuan == 1 {
// 更新剩余次数
isNeed := 1
if mt.NeedQuan == 0 {
isNeed = 0
}
if mt.NeedQuan > profile.ThirdFreeRemainTime {
auth, perm := svc2.MoreCheckNewOrderAuth(eg, utils.StrToInt(canalMsg.Uid), mt)
if perm.AuthType == "all" || auth == false {
sess.Rollback()
return nil
}
if perm.AuthType != "all" && auth == true {
isNeed = 0
}
}
if isNeed == 1 {
profile.ThirdFreeRemainTime = profile.ThirdFreeRemainTime - mt.NeedQuan
_, err = db.UserProfileUpdate(eg, profile.Uid, profile, "third_free_remain_time")
if err != nil {
logx.Warn(err)
sess.Rollback()

return nil
}
// 插入日志记录
db.ThirdFreeQualificationRecordInsertOne(eg, &model.ThirdNewcomersQualificationRecord{
Uid: profile.Uid,
Source: 3,
SourceText: "消费扣除",
OrderId: utils.StrToInt64(canalMsg.Oid),
ChangeNum: -mt.NeedQuan,
AfterChangeNum: profile.ThirdFreeRemainTime,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
})
}

}
m.Stock--
if m.Stock < 0 {
m.Stock = 0
}
m.Sale++
_, err = eg.Where("id=?", m.Id).Cols("stock,sale").Update(m)
if err != nil {
sess.Rollback()
return nil
}
if m.StoreId > 0 { //扣库存
var storeGoods model.GuideStoreGoods
_, err := sess.Where("gid=? and delete_time is null and stock>?", m.GoodId, 0).Get(&storeGoods)
if err != nil {
sess.Rollback()
return nil
}
storeGoods.Stock--
if storeGoods.Stock < 0 {
storeGoods.DownState = 3
storeGoods.EndTime = int(time.Now().Unix())
}
_, err = sess.Where("id=?", storeGoods.Id).Cols("down_state,end_time,stock").Update(&storeGoods)
if err != nil {
sess.Rollback()
return nil
}
}
sess.Commit()
return m
}
sess.Commit()
return m
}

+ 0
- 373
consume/zhios_order_hjy.go ファイルの表示

@@ -1,373 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
md2 "applet/app/md"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"github.com/syyongx/php2go"
"sort"
"time"
"xorm.io/xorm"
)

func ZhiosOrderHjy(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(500)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOrderHjy(res.Body)
//_ = res.Reject(false)
if err != nil {
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosOrderBuckle
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err != nil {
return
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &msg)
if err != nil {
return
}
ch.Publish(queue.ExchangeName, utils.SerializeStr(msg), queue.RoutKey)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}
func GetHjyOrderCommission(eg *xorm.Engine, dbName, order_id string) (string, string) {
url := "https://app.openapi.dhcc.wang"
hjyAppkey := db.SysCfgGetWithDb(eg, dbName, "hjy_appkey")
hjyAppSecret := db.SysCfgGetWithDb(eg, dbName, "hjy_app_secret")
param := map[string]string{
"app_key": hjyAppkey,
"time": utils.Int64ToStr(time.Now().Unix()),
"order_id": order_id,
"page": "1",
"api_name": "dhcc.oauth.order.commission",
"version": "v1",
"pagesize": "1",
}
keys := KsortToStr(param)
str := ""
for _, v := range keys {
if str == "" {
str += v + "=" + php2go.URLEncode(param[v])
} else {
str += "&" + v + "=" + php2go.URLEncode(param[v])
}
}
str += hjyAppSecret
param["sign"] = utils.Md5(str)
post, _ := utils.CurlPost(url, param, nil)
fmt.Println(string(post))
var data md.HjyOrderCommisisonData
json.Unmarshal(post, &data)
if data.Code != 0 {
return "0", "0"
}
for _, v := range data.Data.List {
if v.SettlementStatus == "已结" {
return "1", v.SettlementTime
}
}
return "0", ""
}
func KsortToStr(params map[string]string) []string {
keys := make([]string, len(params))
i := 0
for k, _ := range params {
keys[i] = k
i++
}
sort.Strings(keys)
return keys
}
func handleZhiosOrderHjy(msg []byte) error {

//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderBuckle
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()

ordData, err := db.OrderListByhjyOid(sess, canalMsg.Oid)
if err != nil || ordData == nil {
return nil
}
if ordData.OrderFormType < 0 {
sess.Commit()

return nil
}
user, _ := db.UserFindByID(eg, ordData.Uid)
if user == nil {
fmt.Println(user)
sess.Commit()

return nil
}

if ordData.State == 5 {
sess.Commit()
return nil
}
//if ordData.State == 1 || ordData.State == 3 {
// if int64(ordData.ConfirmAt) >= utils.TimeStdParseUnix("2023-11-01 00:00:00") {
// isSettle, settleTime := GetHjyOrderCommission(eg, canalMsg.Mid, utils.IntToStr(ordData.HjyOid))
// if isSettle == "1" {
// ordData.State = 5
// ordData.SettleAt = int(utils.TimeStdParseUnix(settleTime))
// }
// }
//
//}
var ordRelate = make([]model.OrdListRelate, 0)
sess.Where("oid=?", canalMsg.Oid).Find(&ordRelate)
if len(ordRelate) > 0 {
sess.Commit()
return nil
}
if ordData.State != 4 && int64(ordData.ConfirmAt) > 0 && int64(ordData.ConfirmAt) < utils.TimeStdParseUnix("2023-11-01 00:00:00") {
ordData.State = 5
ordData.SettleAt = ordData.ConfirmAt
}

fmt.Println(ordData)
//加入分佣关系链
opts, commissionOpts, _ := svc.GetAllPlan(eg, canalMsg.Mid)
if opts == nil {
fmt.Println(opts)

sess.Commit()

return nil
}
BenefitAll := ordData.BenefitAll
pvd := ordData.Pvd
if ordData.OrderFormType == 1 { //京东自营
pvd = md3.PVD_JDOwn
}
var rmd = md3.CommissionParam{IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder)}
opt, err := svc.GetPlanCfg(eg, pvd, canalMsg.Mid, opts, commissionOpts, map[int]string{}, &rmd)
if err != nil {
fmt.Println(err)

sess.Commit()
return nil
}

var ord = md2.OrderInfo{
PvdOid: ordData.PvdOid,
Pvd: pvd,
ItemId: ordData.ItemId,
ItemNum: ordData.ItemNum,
ItemPrice: ordData.ItemPrice,
PaidPrice: ordData.PaidPrice,
OrderType: ordData.OrderType,
Commission: BenefitAll,
State: ordData.State,
}
//调用公共的分佣
isShare := 0
if ord.OrderType == 1 {
isShare = 1
}
//计算每个用户的分佣
req := md2.CommissionFirstParam{
CommissionParam: md2.CommissionParam{
Commission: utils.Float64ToStr(ord.Commission),
PaidPrice: utils.Float64ToStr(ord.PaidPrice),
OldPrice: utils.Float64ToStr(ord.PaidPrice),
IsTikTokTeamOrder: utils.IntToStr(ordData.IsTikTokTeamOrder),
},
Uid: utils.IntToStr(ordData.Uid),
IsShare: isShare,
Provider: ord.Pvd,
IsAllLevelReturn: 1,
}
if utils.InArr(ord.Pvd, []string{md3.PVD_TB, md3.PVD_TM, md3.PVD_PDD, md3.PVD_SN, md3.PVD_KL, md3.PVD_JD, md3.PVD_JDOwn, md3.PVD_VIP}) == false {
req.CommissionParam.GoodsPrice = utils.Float64ToStr(ord.PaidPrice)
}
commissionList, err := GetCommissionByCommApi(eg, canalMsg.Mid, req)
if err != nil || commissionList.LvUser == nil {
fmt.Println(err)
sess.Commit()
return nil
}
pvdFee := commissionList.PvdFee
sysFee := commissionList.SysFee
subsidyFee := commissionList.SubsidyFee
lvUser := commissionList.LvUser
profit := commissionList.Profit
ordData.SubsidyFee = subsidyFee
ordData.PvdCommission = pvdFee
ordData.SysCommission = sysFee
ordData.BuckleCommission = utils.Float64ToStr(BenefitAll)
var selfRate float64 = 0
var subsidyRate float64 = 0
//处理记录佣金
if opt != nil {
profit = lvUser.Profit
//判断下这个等级有么有设置
ordData.UserCommission = profit
ordData.SubsidyRate = subsidyRate
ordData.UserCommissionRate = selfRate
ordData.PlanCommissionId = opt.PlanCommissionId
ordData.BenefitList = SerializeLvUser(NewCalcLvUserFee(lvUser))
}
_, err = db.OrderListByUpdateOrd(sess, ordData)
if err != nil {
fmt.Println(err)

sess.Rollback()
return nil
}
fmt.Println(lvUser)

//批量写入
if lvUser != nil {
err := OrderRelateInsert1(eg, sess, ordData.OrdId, ordData.Pvd, ordData.CreateAt, lvUser, ordData, canalMsg.Mid, true, opt.Mode, "1")
fmt.Println(err)
if err != nil {
sess.Rollback()
return err
}
}
sess.Commit()
return nil
}

func OrderRelateInsert1(eg *xorm.Engine, sess *xorm.Session, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, newOrd *model.OrdList, masterId string, isDelete bool, mode string, isNew string) error {
if lvUser == nil {
return nil
}
uid := lvUser.Uid
if uid == 0 {
return nil
}
oldLvUser := lvUser
oldLevel := 0
data := OrderRelateInsertComm(eg, oid, pvd, createTime, lvUser, newOrd, masterId, mode)
fmt.Println(data)

if data == nil || len(data) == 0 {
return nil
}
list, _ := db.OrderRelateFindByOid(sess, oid, pvd)
listMap := make(map[int]model.OrdListRelate)
if list != nil {
for _, v := range *list {
listMap[v.Uid] = v
}
}
fmt.Println(isDelete)
_, err2 := db.OrderRelateDeleteByOid(sess, oid, pvd)
if err2 != nil {
return err2
}
_, err2 = db.VirtualCoinOrderRelateDeleteByOid(sess, oid, pvd)
if err2 != nil {
return err2
}
//后写入
err := db.DbInsertBatchSess(sess, data)
if err != nil {
return err

} else if lvUser.ProfitList != nil {
// 插入虚拟币数据
vcrData := CombineVirtualCoinRelateData(oldLvUser, oid, pvd, oldLevel, mode)
if len(vcrData) == 0 {
return nil
}
err := db.DbInsertBatchSess(sess, vcrData)
if err != nil {
return err

}
}
if lvUser.TikTokOwnSubsidyFeeList != nil {
_, err2 := db.TikTokTeamOrderRelateDeleteByOid(sess, oid, pvd)
if err != nil {
return err2
}
var teamData []model.TikTokTeamOrderRelate
TikTokTeamCommission := newOrd.TikTokTeamCommission
if utils.StrToFloat64(newOrd.TikTokTeamRealCommission) > 0 {
TikTokTeamCommission = newOrd.TikTokTeamRealCommission
}
for k, v := range lvUser.TikTokOwnSubsidyFeeList {
tmp := model.TikTokTeamOrderRelate{
CoinId: utils.StrToInt(k),
Uid: uid,
Amount: utils.Float64ToStrByPrec(v, 8),
Oid: utils.Int64ToStr(oid),
Time: time.Now(),
Commission: TikTokTeamCommission,
Pvd: pvd,
}
teamData = append(teamData, tmp)
}
if len(teamData) == 0 {
return nil
}
err := db.DbInsertBatchSess(sess, &teamData)
if err != nil {
return err

}
}
return nil
}

+ 0
- 190
consume/zhios_order_settle_total.go ファイルの表示

@@ -1,190 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func ZhiosSettleTotal(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOrderSettleTotal(res.Body)
//_ = res.Reject(false)
if err != nil {
fmt.Println("==================", err.Error())
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosOrderBuckle
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err != nil {
return
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &msg)
if err != nil {
return
}
ch.Publish(queue.ExchangeName, utils.SerializeStr(msg), queue.RoutKey)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOrderSettleTotal(msg []byte) error {
//time.Sleep(time.Microsecond * 20) // 等待500毫秒
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderBuckle
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
times := time.Now()
fmt.Println("==================", time.Since(times))
ordData, err := db.OrderListByPvdOid(sess, canalMsg.Oid)
if err != nil || ordData == nil {
return nil
}
fmt.Println("==================1", time.Since(times))

var ordRelate = make([]model.OrdListRelate, 0)
sess.Where("oid=?", canalMsg.Oid).Find(&ordRelate)
fmt.Println("==================2", time.Since(times))

if len(ordRelate) > 0 {
for _, v := range ordRelate {
if v.Amount == 0 && utils.StrToFloat64(v.AdditionalSubsidy) == 0 {
continue
}

var userStatistics model.UserStatistics
sess.Where("uid=?", v.Uid).Get(&userStatistics)
if userStatistics.Id == 0 {
userStatistics = model.UserStatistics{
ImportFinTotal: "",
FinTotal: "",
Uid: v.Uid,
}
_, err := sess.Insert(&userStatistics)
if err != nil {
sess.Rollback()
return err
}
}
userStatistics.FinTotal = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics.FinTotal)+v.Amount+utils.StrToFloat64(v.AdditionalSubsidy), 4)
_, err := sess.Where("id=?", userStatistics.Id).Cols("fin_total").Update(&userStatistics)
if err != nil {
return err
}
fmt.Println("==================3", time.Since(times))

var userStatistics1 model.UserWaitAmount
sess.Where("uid=? ", v.Uid).Get(&userStatistics1)
if userStatistics1.Id == 0 {
continue
}
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)-v.Amount-utils.StrToFloat64(v.AdditionalSubsidy), 4)
_, err1 := sess.Where("id=?", userStatistics1.Id).Cols("amount").Update(&userStatistics1)
if err1 != nil {
sess.Rollback()
return err
}
fmt.Println("==================4", time.Since(times))

//if update1 == 0 {
// sess.Rollback()
// return errors.New("失败")
//}

var userStatistics2 model.UserMonthAmount
if ordData.SettleAt == 0 {
ordData.SettleAt = int(time.Now().Unix())
}
now := time.Unix(int64(ordData.SettleAt), 0).Format("200601")
sess.Where("uid=? and date=?", v.Uid, now).Get(&userStatistics2)
fmt.Println("==================31", time.Since(times))

if userStatistics2.Id == 0 {
userStatistics2 = model.UserMonthAmount{
Date: utils.StrToInt(now),
Uid: v.Uid,
}
has, err := sess.Insert(&userStatistics2)
if err != nil {
sess.Rollback()
return err
}
if has == 0 {
sess.Rollback()
return errors.New("失败")
}
}
fmt.Println("==================41", time.Since(times))

userStatistics2.SettleAmount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics2.SettleAmount)+v.Amount+utils.StrToFloat64(v.AdditionalSubsidy), 4)
_, err2 := sess.Where("id=?", userStatistics2.Id).Cols("settle_amount").Update(&userStatistics2)
if err2 != nil {
sess.Rollback()
return err2
}
fmt.Println("==================5", time.Since(times))

//if update2 == 0 {
// sess.Rollback()
// return errors.New("失败")
//}
}
}
sess.Commit()

return nil
}

+ 0
- 166
consume/zhios_order_total.go ファイルの表示

@@ -1,166 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
"xorm.io/xorm"
)

func ZhiosOrderTotal(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(100)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOrderTotal(res.Body)
//_ = res.Reject(false)
if err != nil {
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosOrderBuckle
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err != nil {
return
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &msg)
if err != nil {
return
}
ch.Publish(queue.ExchangeName, utils.SerializeStr(msg), queue.RoutKey)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOrderTotal(msg []byte) error {
time.Sleep(time.Microsecond * 20) // 等待500毫秒
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderBuckle
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
statUserOrderMoney(eg, canalMsg)
return nil
}
func statUserOrderMoney(eg *xorm.Engine, req *md.ZhiosOrderBuckle) (map[string]string, error) {
result := make(map[string]string)
thisMonthRange := utils.GetTimeRange("current_month")
lastMonthRange := utils.GetTimeRange("last_month")
var thisMonthData model.UserMonthAmount
thismonth := time.Unix(thisMonthRange["start"], 0).Format("200601")
eg.Where("uid=? and date=?", req.Uid, thismonth).Get(&thisMonthData)
if thisMonthData.Id == 0 {
thisMonthData.Uid = utils.StrToInt(req.Uid)
thisMonthData.Date = utils.StrToInt(thismonth)
eg.Insert(&thisMonthData)
}

var lastMonthData model.UserMonthAmount
lastmonth := time.Unix(lastMonthRange["start"], 0).Format("200601")
eg.Where("uid=? and date=?", req.Uid, lastmonth).Get(&lastMonthData)
if lastMonthData.Id == 0 {
lastMonthData.Uid = utils.StrToInt(req.Uid)
lastMonthData.Date = utils.StrToInt(lastmonth)
eg.Insert(&lastMonthData)
}
types := ""
uid := req.Uid
// 获取时间范围

// 统计预估 (预估包含结算部分且是有效订单)
sqlTpl := `SELECT cast(SUM(LEFT(olr.amount,LENGTH(olr.amount)-2)) as decimal(50,4)) AS amount
FROM ord_list_relate olr
LEFT JOIN ord_list ol ON olr.oid = ol.ord_id
LEFT JOIN privilege_card_ord pco ON olr.oid =pco.ord_id
LEFT JOIN duoyou_ord_list dol ON olr.oid =dol.oid
LEFT JOIN recharge_order ro ON olr.oid =ro.oid
LEFT JOIN playlet_sale_order pso ON olr.oid =pso.custom_oid
WHERE olr.uid = ? %s
AND olr.create_at >= ?
AND olr.create_at < ? AND (ol.state<>4 or pco.state=1 or dol.id>0 or ro.status<>'已退款' or pso.status<>'订单退款');
`
sqlTpl = fmt.Sprintf(sqlTpl, types)

fmt.Println(lastMonthRange)
thisMonthResult, err := db.QueryNativeString(eg, sqlTpl, uid, thisMonthRange["start"], thisMonthRange["end"])
if err != nil {
_ = logx.Warn(err)
result["thisMonth"] = "0"
} else {
result["thisMonth"] = thisMonthResult[0]["amount"]
}
thisMonthData.Amount = result["thisMonth"]
eg.Where("id=?", thisMonthData.Id).Update(&thisMonthData)

// 统计上月预估 (预估包含结算部分且是有效订单)
sqlTpl2 := `SELECT cast(SUM(IF(ol.state<>4 or pco.state=1 or dol.id>0 or ro.status<>'已退款' or pso.status<>'订单退款', LEFT(olr.amount,LENGTH(olr.amount)-2), 0)) as decimal(50,4)) AS amount
FROM ord_list_relate olr
LEFT JOIN ord_list ol ON olr.oid = ol.ord_id
LEFT JOIN privilege_card_ord pco ON olr.oid =pco.ord_id
LEFT JOIN duoyou_ord_list dol ON olr.oid =dol.oid
LEFT JOIN recharge_order ro ON olr.oid =ro.oid
LEFT JOIN playlet_sale_order pso ON olr.oid =pso.custom_oid
WHERE olr.uid = ? %s
AND olr.create_at >= ?
AND olr.create_at < ?
`
sqlTpl2 = fmt.Sprintf(sqlTpl2, types)

lastMonthResult, err := db.QueryNativeString(eg, sqlTpl2, uid, lastMonthRange["start"], lastMonthRange["end"])
if err != nil {
_ = logx.Warn(err)
result["lastMonth"] = "0"
} else {
result["lastMonth"] = lastMonthResult[0]["amount"]
}

lastMonthData.Amount = result["lastMonth"]
eg.Where("id=?", lastMonthData.Id).Update(&lastMonthData)
return result, nil
}

+ 0
- 313
consume/zhios_order_total_second.go ファイルの表示

@@ -1,313 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func ZhiosOrderTotalSecond(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosOrderTotalSecond(res.Body)
//_ = res.Reject(false)
if err != nil {
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosOrderBuckle
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err != nil {
return
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &msg)
if err != nil {
return
}
ch.Publish(queue.ExchangeName, utils.SerializeStr(msg), queue.RoutKey)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosOrderTotalSecond(msg []byte) error {
time.Sleep(time.Microsecond * 20) // 等待500毫秒
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderBuckle
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()

ordData, err := db.OrderListByPvdOid(sess, canalMsg.Oid)
if err != nil || ordData == nil {
sess.Rollback()
return nil
}

now := time.Unix(int64(ordData.CreateAt), 0).Format("200601")
nowDay := time.Unix(int64(ordData.CreateAt), 0).Format("20060102")
isTotal := ordData.IsTotal
if ordData.OrderFormType >= 0 {
if ordData.IsTotal == 1 && ordData.State != 4 {
sess.Rollback()
return nil
}
if ordData.IsTotal == 2 && ordData.State == 4 {
sess.Rollback()
return nil
}
var ordRelate = make([]model.OrdListRelate, 0)
sess.Where("oid=?", canalMsg.Oid).Find(&ordRelate)
if len(ordRelate) > 0 {
for _, v := range ordRelate {
if v.Amount == 0 && utils.StrToFloat64(v.AdditionalSubsidy) == 0 {
continue
}
var userStatistics model.UserMonthAmount
sess.Where("uid=? and date=?", v.Uid, now).Get(&userStatistics)
if userStatistics.Id == 0 {
userStatistics = model.UserMonthAmount{
Date: utils.StrToInt(now),
Uid: v.Uid,
}
has, err := sess.Insert(&userStatistics)
if err != nil {
sess.Rollback()
return err
}
if has == 0 {
sess.Rollback()
return errors.New("失败")
}
}
isupdate := 0
if ordData.State == 4 && ordData.IsTotal == 1 {
isupdate = 1
isTotal = 2
userStatistics.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics.Amount)-v.Amount-utils.StrToFloat64(v.AdditionalSubsidy), 4)
}
if ordData.State != 4 && ordData.IsTotal == 0 {
isupdate = 1
isTotal = 1
userStatistics.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics.Amount)+v.Amount+utils.StrToFloat64(v.AdditionalSubsidy), 4)
}
update, err := sess.Where("id=?", userStatistics.Id).Cols("amount").Update(&userStatistics)
if err != nil {
sess.Rollback()
return err
}
if update == 0 && isupdate == 1 {
sess.Rollback()
return errors.New("失败")
}
if v.CreateAt > 1711086661 {
var userStatistics1 model.UserDayAmount
sess.Where("uid=? and date=?", v.Uid, nowDay).Get(&userStatistics1)
if userStatistics1.Id == 0 {
userStatistics1 = model.UserDayAmount{
Date: utils.StrToInt(nowDay),
Uid: v.Uid,
}
has, err := sess.Insert(&userStatistics1)
if err != nil {
sess.Rollback()
return err
}
if has == 0 {
sess.Rollback()
return errors.New("失败")
}
}
isupdate1 := 0
if ordData.State == 4 && ordData.IsTotal == 1 {
isupdate1 = 1
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)-v.Amount-utils.StrToFloat64(v.AdditionalSubsidy), 4)
}
if ordData.State != 4 && ordData.IsTotal == 0 {
isupdate1 = 1
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)+v.Amount+utils.StrToFloat64(v.AdditionalSubsidy), 4)
}
update1, err1 := sess.Where("id=?", userStatistics1.Id).Cols("amount").Update(&userStatistics1)
if err1 != nil {
sess.Rollback()
return err
}
if update1 == 0 && isupdate1 == 1 {
sess.Rollback()
return errors.New("失败")
}
}
var userStatistics1 model.UserWaitAmount
sess.Where("uid=? ", v.Uid).Get(&userStatistics1)
if userStatistics1.Id == 0 {
userStatistics1 = model.UserWaitAmount{
Uid: v.Uid,
}
has, err := sess.Insert(&userStatistics1)
if err != nil {
sess.Rollback()
return err
}
if has == 0 {
sess.Rollback()
return errors.New("失败")
}
}
isupdate1 := 0
if ordData.State == 4 && ordData.IsTotal == 1 {
isupdate1 = 1
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)-v.Amount-utils.StrToFloat64(v.AdditionalSubsidy), 4)
}
if ordData.State != 4 && ordData.IsTotal == 0 {
isupdate1 = 1
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)+v.Amount+utils.StrToFloat64(v.AdditionalSubsidy), 4)
}
update1, err1 := sess.Where("id=?", userStatistics1.Id).Cols("amount").Update(&userStatistics1)
if err1 != nil {
sess.Rollback()
return err
}
if update1 == 0 && isupdate1 == 1 {
sess.Rollback()
return errors.New("失败")
}
}
}
} else {
if ordData.IsTotal == 3 && ordData.State != 4 {
sess.Rollback()
return nil
}
if ordData.IsTotal == 2 && ordData.State == 4 {
sess.Rollback()
return nil
}
var ordRelate = make([]model.BuckleRecord, 0)
sess.Where("ord_id=?", canalMsg.Oid).Find(&ordRelate)
if len(ordRelate) > 0 {
for _, v := range ordRelate {
if utils.StrToFloat64(v.Amount) == 0 {
continue
}
var userStatistics model.UserMonthAmount
sess.Where("uid=? and date=?", v.Uid, now).Get(&userStatistics)
if userStatistics.Id == 0 {
userStatistics = model.UserMonthAmount{
Date: utils.StrToInt(now),
Uid: v.Uid,
}
_, err := sess.Insert(&userStatistics)
if err != nil {
sess.Rollback()
return err
}
}
if ordData.State == 4 && (ordData.IsTotal == 1 || ordData.IsTotal == 3) {
isTotal = 2
userStatistics.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics.Amount)-utils.StrToFloat64(v.AfterAmount), 4)
}
if ordData.State != 4 && (ordData.IsTotal == 0) {
isTotal = 3
userStatistics.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics.Amount)+utils.StrToFloat64(v.AfterAmount), 4)
}
if ordData.State != 4 && (ordData.IsTotal == 1) {
isTotal = 3
userStatistics.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics.Amount)-utils.StrToFloat64(v.Amount), 4)
}
_, err := sess.Where("id=?", userStatistics.Id).Cols("amount").Update(&userStatistics)
if err != nil {
sess.Rollback()
return err
}
var userStatistics1 model.UserWaitAmount
sess.Where("uid=? ", v.Uid).Get(&userStatistics1)
if userStatistics1.Id == 0 {
userStatistics1 = model.UserWaitAmount{
Uid: v.Uid,
}
has, err := sess.Insert(&userStatistics1)
if err != nil {
sess.Rollback()
return err
}
if has == 0 {
sess.Rollback()
return errors.New("失败")
}
}
if ordData.State == 4 && (ordData.IsTotal == 1 || ordData.IsTotal == 3) {
isTotal = 2
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)-utils.StrToFloat64(v.AfterAmount), 4)
}
if ordData.State != 4 && (ordData.IsTotal == 0) {
isTotal = 3
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)+utils.StrToFloat64(v.AfterAmount), 4)
}
if ordData.State != 4 && (ordData.IsTotal == 1) {
isTotal = 3
userStatistics1.Amount = utils.Float64ToStrByPrec(utils.StrToFloat64(userStatistics1.Amount)-utils.StrToFloat64(v.Amount), 4)
}
_, err = sess.Where("id=?", userStatistics1.Id).Cols("amount").Update(&userStatistics)
if err != nil {
sess.Rollback()
return err
}

}
}
}
ordData.IsTotal = isTotal
sess.Where("ord_id=?", ordData.OrdId).Update(ordData)
sess.Commit()
return nil
}

+ 0
- 258
consume/zhios_recharge_order_fail.go ファイルの表示

@@ -1,258 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/db/offical"
model2 "applet/app/db/offical/model"
"applet/app/e"
md2 "applet/app/md"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/recharge"
"encoding/json"
"errors"
"fmt"
"github.com/shopspring/decimal"
"github.com/streadway/amqp"
"github.com/tidwall/gjson"
"strings"
"time"
"xorm.io/xorm"
)

func ZhiosRechargeOrderFail(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosRechargeOrderFail(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosRechargeOrderFail(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosRechargeOrderPay
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
uid := utils.StrToInt(canalMsg.Uid)
oid := canalMsg.Oid
var orderData model.RechargeOrder
b, err2 := eg.Where("oid=? and uid=?", oid, uid).Get(&orderData)
if err2 != nil {
return errors.New("err")
}
if b == false {
return nil
}
if orderData.Status != "已付款" {
return nil
}
//查询官方接口看看有没有订单
param, aggregationRechargeApiKey := CommAggregation(eg, mid)
param["out_trade_nums"] = oid
aggregationRechargeApiUrl := GetApiUrl()
order, err := recharge.GetOrder(aggregationRechargeApiUrl, aggregationRechargeApiKey, param)
utils.FilePutContents(mid+"rech", utils.SerializeStr(param))
utils.FilePutContents(mid+"rech", aggregationRechargeApiKey)
utils.FilePutContents(mid+"rech", utils.SerializeStr(order))
if err != nil {
utils.FilePutContents(mid+"rech", err.Error())
return errors.New("err")
}
if gjson.Get(order, "errno").Int() == 0 && strings.Contains(order, oid) == false {
utils.FilePutContents(mid+"rech", utils.SerializeStr(orderData))
NSFNTheSameBack := true
if orderData.PayMethod == 3 {
wechatP12ApiclientCert := db.SysCfgGetWithDb(eg, mid, "wechat_p12_apiclient_cert")
wechatPayRefundType := db.SysCfgGetWithDb(eg, mid, "wechat_pay_refund_type")
NSFNTheSameBack = false
if wechatP12ApiclientCert == "" || orderData.TradeNo == "" || wechatPayRefundType != "1" || orderData.AppId == "" {
NSFNTheSameBack = true
} else {
params := map[string]string{
"subject": "聚合充值" + orderData.Title + "退款",
"total_fee": wxMoneyMulHundred(orderData.Amount),
"amount": wxMoneyMulHundred(orderData.Amount),
"out_refund_no": orderData.Oid,
"p12_str": canalMsg.WxappletFilepathUrl + "/" + wechatP12ApiclientCert,
"transaction_id": orderData.TradeNo,
"pay_wx_mch_id": db.SysCfgGetWithDb(eg, mid, "pay_wx_mch_id"),
"pay_wx_api_key": db.SysCfgGetWithDb(eg, mid, "pay_wx_api_key"),
"uid": utils.IntToStr(orderData.Uid),
"notify_url": canalMsg.DomainUrl + "/api/v1/refund/callback/" + mid,
}
params["pay_wx_appid"] = orderData.AppId
r, r1, err := pay.WxAppRefund(params)
utils.FilePutContents("mall_refund", utils.SerializeStr(params))
utils.FilePutContents("mall_refund", utils.SerializeStr(r))
utils.FilePutContents("mall_refund", utils.SerializeStr(r1))
if err != nil {
utils.FilePutContents("mall_refund", err.Error())
return err
}
if r.ReturnCode != "SUCCESS" {
return errors.New(r.ReturnMsg)
}
}
}
if orderData.PayMethod == 2 {
alipayPayRefundType := db.SysCfgGetWithDb(eg, mid, "alipay_pay_refund_type")
NSFNTheSameBack = false
if orderData.TradeNo == "" || alipayPayRefundType != "1" {
NSFNTheSameBack = true
} else {
var params = &md2.AliPayPayParams{}
config, _ := svc.CommAlipayConfig(eg, mid, params)
config["trade_no"] = orderData.TradeNo
config["refund_amount"] = orderData.Amount
config["refund_reason"] = "退款"
config["out_request_no"] = utils.OrderUUID(orderData.Uid)
refund, err := pay.AlipayTradeRefund(config)
utils.FilePutContents("mall_refund", utils.SerializeStr(config))
utils.FilePutContents("mall_refund", utils.SerializeStr(refund))
if err != nil {
return err
}
if refund.AlipayTradeRefundResponse.Code != "10000" {
return errors.New(refund.AlipayTradeRefundResponse.SubMsg)

}
if refund.AlipayTradeRefundResponse.FundChange != "Y" {
return errors.New("退款失败")
}
}
}
// 更改为已支付
orderData.Status = "已退款"
orderData.RefundTime = time.Now()
// 保存ord
row, err := eg.ID(orderData.Id).Cols("status,pay_method,refund_time").Update(&orderData)
if row > 0 && err == nil {
if NSFNTheSameBack {
svc.UpdateUserFinValidAndInterFlow(eg,
orderData.Amount, "聚合充值"+orderData.Title+"退款", "aggregation_recharge", 0, 24, orderData.Uid, orderData.Id, int64(orderData.Id), utils.StrToInt64(orderData.Oid))
}
} else {
return errors.New("err")
}
rechargeNotPayMoney := db.SysCfgGetWithDb(eg, mid, "recharge_not_pay_money")
if rechargeNotPayMoney != "1" {
ZyRechargeMoneyDeal(mid, orderData.Oid, orderData.Uid, utils.StrToFloat64(orderData.ZyAmount), 0, orderData.Title+"退款", "refund")
}
}
return nil
}

// 微信金额乘100
func wxMoneyMulHundred(m string) string {
amount, _ := decimal.NewFromString(m)
newM := amount.Mul(decimal.NewFromInt(100))
return newM.String()
}
func GetApiUrl() string {
aggregationRechargeApiUrl := ""
aggregationRechargeApiUrlData := offical.SysCfgByKey("aggregation_recharge_api_url")
if aggregationRechargeApiUrlData != nil {
aggregationRechargeApiUrl = aggregationRechargeApiUrlData.V
}
return aggregationRechargeApiUrl
}
func ZyRechargeMoneyDeal(mid string, orderId string, uid int, officalAmount float64, types int, title, orderType string) error {
info := offical.GetAggregationUserInfo(mid)
if info == nil {
fmt.Println("获取价格失败")
return e.NewErr(400, "获取价格失败")
}
if types == 1 {
if utils.StrToFloat64(info.Amount)+utils.StrToFloat64(info.CreditAmount)-officalAmount < 0 {
fmt.Println("预存款不足")
return e.NewErr(400, "预存款不足")
}
info.Amount = utils.Float64ToStr(utils.StrToFloat64(info.Amount) - officalAmount)
} else {
info.Amount = utils.Float64ToStr(utils.StrToFloat64(info.Amount) + officalAmount)
}
update, err := db.Db.Where("id=?", info.Id).Cols("amount").Update(info)
if update == 0 || err != nil {
return e.NewErr(400, "预存款不足")
}
var flow = model2.AggregationUserRechargeOrd{
OrdId: orderId,
Uid: utils.StrToInt(mid),
Amount: utils.Float64ToStr(officalAmount),
CostPrice: utils.Float64ToStr(officalAmount),
Balance: info.Amount,
PayWay: 0,
State: 1,
Memo: title,
CreateAt: time.Now(),
Type: types,
OrdType: orderType,
SubUid: uid,
}
//TODO 要不要判断失败呢
db.Db.Insert(&flow)
return nil
}

func CommAggregation(eg *xorm.Engine, mid string) (map[string]string, string) {
aggregationRechargeApiKey := db.SysCfgGetWithDb(eg, mid, "aggregation_recharge_api_key")
aggregationRechargeUserId := db.SysCfgGetWithDb(eg, mid, "aggregation_recharge_user_id")
if aggregationRechargeApiKey == "" {
aggregationRechargeApiKeyMap := offical.SysCfgByKey("aggregation_recharge_api_key")
if aggregationRechargeApiKeyMap != nil {
aggregationRechargeApiKey = aggregationRechargeApiKeyMap.V
}
}
if aggregationRechargeUserId == "" {
aggregationRechargeUserIdMap := offical.SysCfgByKey("aggregation_recharge_user_id")
if aggregationRechargeUserIdMap != nil {
aggregationRechargeUserId = aggregationRechargeUserIdMap.V
}
}
param := map[string]string{
"userid": aggregationRechargeUserId,
}
return param, aggregationRechargeApiKey
}

+ 0
- 154
consume/zhios_recharge_order_fail_dev.go ファイルの表示

@@ -1,154 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/recharge"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"github.com/tidwall/gjson"
"strings"
"time"
)

func ZhiosRechargeOrderFailDev(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosRechargeOrderFailDev(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosRechargeOrderFailDev(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosRechargeOrderPay
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
uid := utils.StrToInt(canalMsg.Uid)
oid := canalMsg.Oid
var orderData model.RechargeOrder
b, err2 := eg.Where("oid=? and uid=?", oid, uid).Get(&orderData)
if err2 != nil {
return errors.New("err")
}
if b == false {
return nil
}
if orderData.Status != "已付款" {
return nil
}
//查询官方接口看看有没有订单
param, aggregationRechargeApiKey := CommAggregation(eg, mid)
param["out_trade_nums"] = oid
aggregationRechargeApiUrl := GetApiUrl()
order, err := recharge.GetOrder(aggregationRechargeApiUrl, aggregationRechargeApiKey, param)
utils.FilePutContents(mid+"rech", utils.SerializeStr(param))
utils.FilePutContents(mid+"rech", aggregationRechargeApiKey)
utils.FilePutContents(mid+"rech", utils.SerializeStr(order))
if err != nil {
utils.FilePutContents(mid+"rech", err.Error())
return errors.New("err")
}
if gjson.Get(order, "errno").Int() == 0 && strings.Contains(order, oid) == false {
utils.FilePutContents(mid+"rech", utils.SerializeStr(orderData))
NSFNTheSameBack := true
if orderData.PayMethod == 3 {
wechatP12ApiclientCert := db.SysCfgGetWithDb(eg, mid, "wechat_p12_apiclient_cert")
wechatPayRefundType := db.SysCfgGetWithDb(eg, mid, "wechat_pay_refund_type")
NSFNTheSameBack = false
if wechatP12ApiclientCert == "" || orderData.TradeNo == "" || wechatPayRefundType != "1" || orderData.AppId == "" {
NSFNTheSameBack = true
} else {
params := map[string]string{
"subject": "聚合充值" + orderData.Title + "退款",
"total_fee": wxMoneyMulHundred(orderData.Amount),
"amount": wxMoneyMulHundred(orderData.Amount),
"out_refund_no": orderData.Oid,
"p12_str": canalMsg.WxappletFilepathUrl + "/" + wechatP12ApiclientCert,
"transaction_id": orderData.TradeNo,
"pay_wx_mch_id": db.SysCfgGetWithDb(eg, mid, "pay_wx_mch_id"),
"pay_wx_api_key": db.SysCfgGetWithDb(eg, mid, "pay_wx_api_key"),
"uid": utils.IntToStr(orderData.Uid),
"notify_url": canalMsg.DomainUrl + "/api/v1/refund/callback/" + mid,
}
//params["p12_str"] = "D:\\Downloads\\WXCertUtil\\cert\\1534243971_20230825_cert\\" + wechatP12ApiclientCert
//params["notify_url"] = strings.ReplaceAll(params["notify_url"], "http:", "https:")
params["pay_wx_appid"] = orderData.AppId
r, r1, err := pay.WxAppRefund(params)
utils.FilePutContents("mall_refund", utils.SerializeStr(params))
utils.FilePutContents("mall_refund", utils.SerializeStr(r))
utils.FilePutContents("mall_refund", utils.SerializeStr(r1))
if err != nil {
utils.FilePutContents("mall_refund", err.Error())
return err
}
if r.ReturnCode != "SUCCESS" {
return errors.New(r.ReturnMsg)
}
}
}
// 更改为已支付
orderData.Status = "已退款"
orderData.RefundTime = time.Now()
// 保存ord
row, err := eg.ID(orderData.Id).Cols("status,pay_method,refund_time").Update(&orderData)
if row > 0 && err == nil {
if NSFNTheSameBack {
svc.UpdateUserFinValidAndInterFlow(eg,
orderData.Amount, "聚合充值"+orderData.Title+"退款", "aggregation_recharge", 0, 24, orderData.Uid, orderData.Id, int64(orderData.Id), utils.StrToInt64(orderData.Oid))
}
} else {
return errors.New("err")
}
rechargeNotPayMoney := db.SysCfgGetWithDb(eg, mid, "recharge_not_pay_money")
if rechargeNotPayMoney != "1" {
ZyRechargeMoneyDeal(mid, orderData.Oid, orderData.Uid, utils.StrToFloat64(orderData.ZyAmount), 0, orderData.Title+"退款", "refund")
}
}
return nil
}

+ 0
- 214
consume/zhios_supplier_after_order.go ファイルの表示

@@ -1,214 +0,0 @@
package consume

import (
"applet/app/cfg"
"applet/app/db"
"applet/app/db/model"
"applet/app/e"
md2 "applet/app/md"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
"encoding/json"
"errors"
"fmt"
"github.com/iGoogle-ink/gopay/alipay"
"github.com/streadway/amqp"
"xorm.io/xorm"
)

func ZhiosSupplierAfterOrder(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosSupplierAfterOrder(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosSupplierAfterOrder(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAppreciation
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
var afterOrder model.MallOrdAfterSale
get, err := eg.Where("ord_id=?", canalMsg.Oid).Get(&afterOrder)
if get == false || err != nil {
return nil
}

if afterOrder.IsRefund == 0 && afterOrder.State == 4 {
var order model.MallOrd
get, err = eg.Where("ord_id = ?", canalMsg.Oid).Get(&order)
if get == false || err != nil {
return nil
}
if utils.StrToFloat64(afterOrder.ActualRefundAmount) == 0 {
afterOrder.ActualRefundAmount = afterOrder.ApplyRefundMoney
}
wechatP12ApiclientCert := db.SysCfgGetWithDb(eg, canalMsg.Mid, "wechat_p12_apiclient_cert")
wechatPayRefundType := db.SysCfgGetWithDb(eg, canalMsg.Mid, "wechat_pay_refund_type")
alipayPayRefundType := db.SysCfgGetWithDb(eg, canalMsg.Mid, "alipay_pay_refund_type")
switch order.PayChannel {
case 2: // 支付宝支付
if order.TransactionId != "" && alipayPayRefundType == "1" {
var param = &md2.AliPayPayParams1{}
config, _ := CommMasterConfig(eg, canalMsg.Mid, param)
config["trade_no"] = order.TransactionId
config["refund_amount"] = afterOrder.ActualRefundAmount
config["refund_reason"] = "自营退货"
config["out_request_no"] = utils.OrderUUID(order.Uid)
refund, err := pay.AlipayTradeRefund(config)
utils.FilePutContents("mall_refund", utils.SerializeStr(config))
utils.FilePutContents("mall_refund", utils.SerializeStr(refund))
if err != nil {
utils.FilePutContents("mall_refund", err.Error())
order.ErrMsg = err.Error()
eg.Where("ord_id=?", order.OrdId).Cols("err_msg").Update(&order)
return nil
}
if refund.AlipayTradeRefundResponse.Code != "10000" {
order.ErrMsg = utils.SerializeStr(refund)
eg.Where("ord_id=?", order.OrdId).Cols("err_msg").Update(&order)
return nil
}
if refund.AlipayTradeRefundResponse.FundChange != "Y" {
order.ErrMsg = utils.SerializeStr(refund)
eg.Where("ord_id=?", order.OrdId).Cols("err_msg").Update(&order)
return nil
}
fmt.Println(refund)
fmt.Println(err)
order.MoneyInAccount = 1
afterOrder.IsRefund = 1
}
case 3: // 微信支付
if wechatP12ApiclientCert == "" || order.TransactionId == "" || wechatPayRefundType != "1" || order.AppId == "" {
} else {

params := map[string]string{
"subject": "自营商城退款",
"total_fee": wxMoneyMulHundred(afterOrder.ActualRefundAmount),
"amount": wxMoneyMulHundred(afterOrder.ActualRefundAmount),
"out_refund_no": utils.Int64ToStr(afterOrder.OrdId),
"p12_str": cfg.WxappletFilepath.URL + "/" + wechatP12ApiclientCert,
"transaction_id": order.TransactionId,
"pay_wx_mch_id": db.SysCfgGetWithDb(eg, canalMsg.Mid, "pay_wx_mch_id"),
"pay_wx_api_key": db.SysCfgGetWithDb(eg, canalMsg.Mid, "pay_wx_api_key"),
"uid": utils.IntToStr(order.Uid),
"notify_url": "http://api.zhiyingos.com/api/v1/mall/refund/callback/" + canalMsg.Mid,
}
//params["p12_str"] = "D:\\Downloads\\WXCertUtil\\cert\\1534243971_20230825_cert\\" + wechatP12ApiclientCert
//params["notify_url"] = strings.ReplaceAll(params["notify_url"], "http:", "https:")
params["pay_wx_appid"] = order.AppId
r, r1, err := pay.WxAppRefund(params)
utils.FilePutContents("mall_refund", utils.SerializeStr(params))
utils.FilePutContents("mall_refund", utils.SerializeStr(r))
utils.FilePutContents("mall_refund", utils.SerializeStr(r1))
if err != nil {
utils.FilePutContents("mall_refund", err.Error())
order.ErrMsg = err.Error()
eg.Where("ord_id=?", order.OrdId).Cols("err_msg").Update(&order)
return nil
}
if r.ReturnCode != "SUCCESS" {
order.ErrMsg = utils.SerializeStr(r)
eg.Where("ord_id=?", order.OrdId).Cols("err_msg").Update(&order)
return nil
}
order.MoneyInAccount = 1
afterOrder.IsRefund = 1
}
default:
}
eg.Where("id=?", afterOrder.Id).Cols("is_refund").Update(&afterOrder)
eg.Where("ord_id=?", order.OrdId).Cols("money_in_account").Update(&order)
}

return nil
}
func CommMasterConfig(eg *xorm.Engine, dbName string, p *md2.AliPayPayParams1) (map[string]string, error) {
//获取支付配置
req := map[string]string{
"pay_ali_use_type": db.SysCfgGetWithDb(eg, dbName, "pay_ali_use_type"),
"private_key": db.SysCfgGetWithDb(eg, dbName, "pay_ali_private_key"),
"app_id": db.SysCfgGetWithDb(eg, dbName, "pay_ali_app_id"),
"rsa": db.SysCfgGetWithDb(eg, dbName, "pay_ali_key_len_type"),
"pkcs": db.SysCfgGetWithDb(eg, dbName, "pay_ali_key_format_type"),
}
if req["pay_ali_use_type"] == "1" {
req["private_key"] = db.SysCfgGetWithDb(eg, dbName, "pay_ali_new_private_key")
req["app_id"] = db.SysCfgGetWithDb(eg, dbName, "pay_ali_new_app_id")
appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + db.SysCfgGetWithDb(eg, dbName, "pay_app_cert_sn"))
if err != nil {
fmt.Println(err)
return nil, err
}
if appCertSN == "" {
fmt.Println(err)
return nil, err
}
req["pay_app_cert_sn"] = appCertSN
aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + db.SysCfgGetWithDb(eg, dbName, "pay_alipayrsa_public_key"))
if err != nil {
fmt.Println(err)
return nil, err
}
if aliPayPublicCertSN == "" {
fmt.Println(err)
return nil, err
}
req["pay_alipayrsa_public_key"] = aliPayPublicCertSN
}
if req["private_key"] == "" || req["app_id"] == "" {
return req, e.NewErr(400, "请在后台正确配置支付宝")
}
req["ord_id"] = p.OrdId
req["amount"] = p.Amount
req["subject"] = p.Subject
req["order_type"] = p.OrderType

return req, nil
}

+ 0
- 102
consume/zhios_task_total.go ファイルの表示

@@ -1,102 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func ZhiosTaskTotal(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1000)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosTaskTotal(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosTaskTotal(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAcquisition
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()

list := db.GetTaskCenterRewardList(sess, canalMsg.Id)
if list == nil {
sess.Rollback()
return nil
}
if list.IsSend == 1 {
sess.Rollback()
return nil
}
var tmp = make(map[string]string)
json.Unmarshal([]byte(list.Reward), &tmp)
for k, v := range tmp {
if utils.StrToFloat64(v) == 0 {
continue
}
err := db.GetTaskTotal(sess, utils.IntToStr(list.Uid), time.Unix(int64(list.CreateTime), 0).Format("20060102"), time.Unix(int64(list.CreateTime), 0).Format("200601"), k, list.Type, list.TaskType, list.Title, v)
if err != nil {
sess.Rollback()
return err
}
}
list.IsSend = 1
update, err := sess.Where("id=?", list.Id).Cols("is_send").Update(list)
if update == 0 || err != nil {
sess.Rollback()
return errors.New("失败")
}
sess.Commit()
return nil
}

+ 0
- 160
consume/zhios_tikTok_goods_update.go ファイルの表示

@@ -1,160 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"time"
)

func ZhiosTikTokUpdate(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, true)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosTikTokGoodsUpdate(res.Body)
//_ = res.Reject(false)
//if err == nil {
//_ = res.Ack(true)
//}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}
func ZhiosTikTokAllUpdate(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, true)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosTikTokGoodsUpdate(res.Body)
//_ = res.Reject(false)
//if err == nil {
//_ = res.Ack(true)
//}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosTikTokGoodsUpdate(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.TikTokExChangeRoutKeyForUpdateParam
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
var v md.TikTokData
json.Unmarshal([]byte(canalMsg.Data), &v)
var tmp model.TikTokTeamGoods
//cache.HSet("tik_"+canalMsg.Mid, canalMsg.Cid+"_"+v.GoodsID, string(msg))
get, _ := eg.Where("gid=? and activity_id=?", v.GoodsID, canalMsg.Cid).Get(&tmp)
if get {
//if tmp.IsDown == 1 {
// continue
//}
tmp.IsDown = 0
tmp.ServiceRatio = v.ServiceRatio
tmp.Price = v.Price
tmp.TalentCommission = v.PublicCommission
tmp.PublicCommission = v.PublicCommission
tmp.Title = v.GoodsTitle
tmp.CostPrice = v.CostPrice
tmp.Commission = v.Commission
tmp.GoodsImg = v.GoodsImg
tmp.DetailUrl = v.DetailURL
tmp.EndType = "已采集"
tmp.LmType = ""
tmp.Sales = utils.StrToInt(v.GoodsSales)
tmp.ActivityId = utils.StrToInt(canalMsg.Cid)
tmp.ActivityStartTime = utils.TimeParseStd(v.ActivityStartTime + " 00:00:00")
tmp.ActivityEndTime = utils.TimeParseStd(v.ActivityEndTime + " 23:59:59")
tmp.OldActivityEndTime = utils.TimeParseStd(v.ActivityEndTime + " 23:59:59")
tmp.UpdateTime = time.Now()
tmp.Status = utils.StrToInt(canalMsg.Status)
if tmp.Status == 3 || tmp.Status == 6 {
tmp.ActivityEndTime = time.Now()
}
eg.Where("id=?", tmp.Id).AllCols().Update(&tmp)
} else {
if utils.InArr(canalMsg.Status, []string{"3", "6"}) {
return nil
}
tmp = model.TikTokTeamGoods{
Cid: utils.StrToInt(v.Cid),
ServiceRatio: v.ServiceRatio,
Title: v.GoodsTitle,
Price: v.Price,
CostPrice: v.CostPrice,
Commission: v.Commission,
TalentCommission: v.PublicCommission,
PublicCommission: v.PublicCommission,
Gid: v.GoodsID,
Sales: utils.StrToInt(v.GoodsSales),
GoodsImg: v.GoodsImg,
DetailUrl: v.DetailURL,
ShopName: v.ShopName,
ActivityStartTime: utils.TimeParseStd(v.ActivityStartTime + " 00:00:00"),
ActivityEndTime: utils.TimeParseStd(v.ActivityEndTime + " 23:59:59"),
OldActivityEndTime: utils.TimeParseStd(v.ActivityEndTime + " 23:59:59"),
ActivityId: utils.StrToInt(canalMsg.Cid),
UpdateTime: time.Now(),
EndType: "已采集",
IsDown: 0,
}
eg.InsertOne(&tmp)
}
return nil
}

+ 0
- 160
consume/zhios_user_relate.go ファイルの表示

@@ -1,160 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"strings"
"time"
"xorm.io/xorm"
)

func ZhiosUserRelate(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosUserRelate(res.Body)
//_ = res.Reject(false)
if err != nil {
_ = res.Reject(false)
//TODO::重新推回队列末尾,避免造成队列堵塞
var msg *md.ZhiosOrderBuckle
var tmpString string
err := json.Unmarshal(res.Body, &tmpString)
if err != nil {
return
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &msg)
if err != nil {
return
}
ch.Publish(queue.ExchangeName, utils.SerializeStr(msg), queue.RoutKey)
} else {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosUserRelate(msg []byte) error {
time.Sleep(time.Microsecond * 20) // 等待500毫秒
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosOrderBuckle
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
profile, err := db.UserProfileFindByID(eg, canalMsg.Uid)
if err != nil || profile == nil {

return nil
}
if profile.ParentUid > 0 {
ur := new(model.UserRelate)
//如果有上级要加入关系链
initLV := 1
ur.ParentUid = profile.ParentUid
ur.Uid = profile.Uid
ur.Level = initLV
ur.InviteTime = time.Now()
_, err = db.UserRelateInsert(eg, ur)

if err != nil && strings.Contains(err.Error(), "Duplicate") == false {
return err
}
// 插入多级关联
RoutineMultiRelate1(eg, ur.ParentUid, ur.Uid, initLV)

}
return nil
}

//RoutineMultiRelate is 多级关联
func RoutineMultiRelate1(eg *xorm.Engine, pid int, uid int, lv int) {

for {
if pid == 0 {
break
}
m, err := db.UserProfileFindByID(eg, pid)
if err != nil {
logx.Warn(err)
break
}
if m != nil {
if m.ParentUid == 0 {
break
}
lv++
ur := new(model.UserRelate)
ur.ParentUid = m.ParentUid
ur.Uid = uid
ur.Level = lv
ur.InviteTime = time.Now()
_, err := db.UserRelateInsert(eg, ur)
if err != nil && strings.Contains(err.Error(), "Duplicate") == false {
logx.Warn(err)
break
}
if err != nil && strings.Contains(err.Error(), "Duplicate") {
tmp, _, _ := db.UserRelateByUIDAndPUID(eg, ur.Uid, ur.ParentUid)
if tmp != nil && tmp.Level != ur.Level {
db.UserRelateUpdate(eg, ur)
}
}
// 还要关联当前的用户的所有下级,注意关联等级
//go RoutineInsertUserRelate(c, m.ParentUid, uid, lv)
// 下级关联上上级
// 继续查询
logx.Info(fmt.Sprintf("关联pid(%v) -> uid(%v),lv:%v", ur.ParentUid, ur.Uid, lv))
logx.Info("继续查询")
pid = m.ParentUid
}
if m == nil {
logx.Info("查询结束,退出")
break
}
}
}

+ 0
- 86
consume/zhios_user_up_lv.go ファイルの表示

@@ -1,86 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//自动升级
func ZhiosUserUpLv(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1000)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleUserUpLv(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleUserUpLv(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAcquisition
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
uid := canalMsg.Uid
levelList, _ := db.UserLevlEgAll(eg)
isAuto := 0
for _, v := range levelList {
if v.AutoUpdate == 1 {
isAuto = 1
}
}
if isAuto == 0 {
return nil
}
FindUser(eg, uid, mid, levelList)
oneUser, _ := db.UserProfileFindByID(eg, uid)
if oneUser == nil || (oneUser != nil && oneUser.ParentUid == 0) {
return nil
}
FindUser(eg, utils.IntToStr(oneUser.ParentUid), mid, levelList)
return nil
}

+ 0
- 172
consume/zhios_user_visit_ip_address_consume.go ファイルの表示

@@ -1,172 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/cache"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/cc14514/go-geoip2"
geoip2db "github.com/cc14514/go-geoip2-db"
"github.com/streadway/amqp"
"net"
"strings"
"time"
)

var data []*model.MasterAreaVisitsFlows

func ZhiOsUserVisitIpAddressConsume(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>ZhiOsUserVisitIpAddressConsume<<<<<<<<<<<<<<<<<<<<<<<")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
geoIp2db, _ := geoip2db.NewGeoipDbByStatik()
defer geoIp2db.Close()

defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(100)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
err = handleUserVisitIpAddress(res.Body, geoIp2db)
//_ = res.Reject(false)
_ = res.Ack(true)
if len(data) >= 100 {
db.BatchAddMasterAreaVisitsFlows(db.DataDb, data)
data = []*model.MasterAreaVisitsFlows{}
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleUserVisitIpAddress(msg []byte, geoIp2db *geoip2.DBReader) error {
now := time.Now()
today := now.Format("2006-01-02")
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
var msgStruct md.ZhiOsUserVisitIpAddressMessage
err = json.Unmarshal([]byte(tmpString), &msgStruct)
if err != nil {
fmt.Println(err.Error())
return err
}

if msgStruct.MasterId == "" {
cacheKeyForUrl := fmt.Sprintf(md.ZhiOsMasterIdForUrlHashMapCacheKey)
get, _ := cache.HGetString(cacheKeyForUrl, msgStruct.Url)
if get == "" {
msgStruct.MasterId = GetWebSiteDomainMasterId(msgStruct.Url)
utils.FilePutContents("GetWebSiteDomainMasterId", utils.SerializeStr(msgStruct))
cache.HSet(cacheKeyForUrl, msgStruct.Url, msgStruct.MasterId)
cache.Expire(cacheKeyForUrl, md.ZhiOsUserVisitIpAddressHashMapCacheTime)
} else {
msgStruct.MasterId = get
}
}

//1、判断ip是否已统计
//cacheKey := fmt.Sprintf(md.ZhiOsUserVisitIpAddressHashMapCacheKey, msgStruct.MasterId, today)
//get, _ := cache.HGetString(cacheKey, msgStruct.Ip)
//if get == "" {
if true {
//2、分析ip归属地
countryName, provinceId, cityId, provinceName, cityName := getIpAddress(geoIp2db, msgStruct)
if provinceId != "" || cityId != "" || countryName != "" || provinceName != "" || cityName != "" {
//3、插入`master_area_visits_flows` 表
if provinceName == "" {
provinceName = msgStruct.Province
}
if cityName == "" {
cityName = msgStruct.City
}

data = append(data, &model.MasterAreaVisitsFlows{
Ip: msgStruct.Ip,
MasterId: utils.StrToInt(msgStruct.MasterId),
Date: today,
CountryName: countryName,
ProvinceName: provinceName,
ProvinceId: provinceId,
CityName: cityName,
CityId: cityId,
Pvd: msgStruct.Pvd,
CreateAt: now,
UpdateAt: now,
})
//db.MasterAreaVisitsFlowsInsert(db.DataDb, )
}
//4、加入到缓存map中
//cache.HSet(cacheKey, msgStruct.Ip, msgStruct.MasterId)
//cache.Expire(cacheKey, md.ZhiOsUserVisitIpAddressHashMapCacheTime)
}
return nil
}

func getIpAddress(geoIp2db *geoip2.DBReader, message md.ZhiOsUserVisitIpAddressMessage) (countryName, provinceId, cityId, provinceName, cityName string) {
record, _ := geoIp2db.City(net.ParseIP(message.Ip))
if record.Country.Names != nil && record.Subdivisions != nil && record.City.Names != nil {
message.Country = record.Country.Names["zh-CN"]
message.Province = record.Subdivisions[0].Names["zh-CN"]
message.City = record.City.Names["zh-CN"]
}

countryName = message.Country
if countryName == "中国" && message.Province != "" {
if message.Province == "闽" {
message.Province = "福建"
}
province, err := db.ProvinceGetOneByName(message.Province)
if err != nil {
return "", "", "", "", ""
}
provinceId = province.Id
provinceName = province.Name

if message.City != "" {
city, err := db.CityGetOneByName(message.City)
if err != nil {
return "", "", "", "", ""
}
cityId = city.Id
cityName = city.Name
}
}
return
}

// 获取指定类型的域名对应的masterId:admin、wap、api
func GetWebSiteDomainMasterId(host string) string {
obj := new(model.UserAppDomain)
has, err := db.Db.Where("domain=?", host).Get(obj)
if err != nil || !has {
hostList := strings.Split(host, ":")
has, err = db.Db.Where("domain=?", hostList[0]).Get(obj)
if err != nil || !has {
return ""
}
}
return utils.AnyToString(obj.Uuid)
}

+ 0
- 187
consume/zhios_valid_user.go ファイルの表示

@@ -1,187 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"xorm.io/xorm"
)

func ZhiosValidUser(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(300)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>ZhiosAcquisitionCondition<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleValidUser(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}
func handleValidUser(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosAcquisition
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
if canalMsg.Uid == "" {
return nil
}
RoutineUpdateUserComm(eg, mid, canalMsg.Uid)
return nil
}
func RoutineUpdateUserComm(eg *xorm.Engine, dbName, uid string) {
if utils.StrToInt(uid) == 0 {
return
}
user, _ := db.UserFindByID(eg, uid)
if user == nil {
return
}
userProfile, _ := db.UserProfileFindByID(eg, uid)
if userProfile == nil {
return
}
if userProfile.IsVerify == 1 {
return
}
validConditionMap := map[string]interface{}{}
checkMap := map[string]interface{}{}
todone := 0
//有效会员 校验
vdata := db.SysCfgGetWithDb(eg, dbName, "valid_member_condition")
if err := json.Unmarshal([]byte(vdata), &validConditionMap); err != nil {
return
logx.Warn(err)
}
for k, v := range validConditionMap {
if v != "" && utils.AnyToFloat64(v) > 0 {
todone++
checkMap[k] = v
}
}

for k, v := range checkMap {
switch k {
case "taskVideo":
sum, _ := eg.Where("uid=? and task_type=? and task_id>0", user.Uid, 3).Sum(&model.TaskVideoNum{}, "count")
if sum >= utils.AnyToFloat64(v) {
todone--
}
case "realCheck":
// 检查实名认证
one, _ := db.GetRealNameAuthByUidWithState(eg, user.Uid, 1)
if one != nil && one.Uid == user.Uid {
todone--
}
case "bindPhone":
// 检查绑定手机号
if user.Phone != "" {
todone--
}
case "goodsCommission":
sqlTpl := `SELECT cast(SUM(LEFT(olr.amount,LENGTH(olr.amount)-2)) as decimal(50,4)) AS amount
FROM ord_list_relate olr
LEFT JOIN ord_list ol ON olr.oid = ol.ord_id
LEFT JOIN privilege_card_ord pco ON olr.oid =pco.ord_id
LEFT JOIN duoyou_ord_list dol ON olr.oid =dol.oid
LEFT JOIN recharge_order ro ON olr.oid =ro.oid
LEFT JOIN playlet_sale_order pso ON olr.oid =pso.custom_oid
WHERE olr.uid = ? AND (ol.state<>4 or pco.state=1 or dol.id>0 or ro.status<>'已退款' or pso.status<>'订单退款');
`
todayResult, err := db.QueryNativeString(eg, sqlTpl, uid)
today := "0"
if err == nil {
today = todayResult[0]["amount"]
}
// 累计佣金
if utils.StrToFloat64(today) >= utils.AnyToFloat64(v) {
todone--
}
case "orderPay":
// 付款订单满足v元
ms, err := db.OrderListByUIDByPaidPrice(eg, user.Uid, v, []string{"0", "1", "2", "3", "5"})
if err != nil {
logx.Warn(err)
}
mss := *ms
if len(mss) > 0 {
todone--
}
case "receive":
// 已收货
ms, err := db.OrderListByUIDByState(eg, user.Uid, []string{"1", "2", "3", "5"})
if err != nil {
logx.Warn(err)
}
mss := *ms
if len(mss) > 0 {
todone--
}
case "tbAuth":
// 是否淘宝授权
if userProfile.AccTaobaoAuthTime != 0 {
todone--
}
case "withdraw":
// 提现
sum, err := db.UserWithDrawApplySumByState(eg, user.Uid, "1", "2")
if err != nil {
logx.Warn(err)
}
if sum > 0 {
todone--
}
}
}
// 满足条件则将改用户打为有效用户
if todone == 0 {
userProfile.IsVerify = 1
}
_, err := db.UserProfileUpdate(eg, userProfile.Uid, userProfile)
if err != nil {
logx.Warn(err)
}
return
}

+ 0
- 144
consume/zhios_withdraw_reward.go ファイルの表示

@@ -1,144 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
"github.com/tidwall/gjson"
"time"
"xorm.io/xorm"
)

func ZhiosWithdrawReward(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(20)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosWithdrawReward(res.Body)
//_ = res.Reject(false)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosWithdrawReward(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosWithdraw
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
fmt.Println("===with", err.Error())
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
//判断用户是什么等级
var apply model.FinWithdrawApply
get, err := eg.Where("id=?", canalMsg.Id).Get(&apply)
if get == false || err != nil {
return nil
}
if apply.Uid == 0 {
return nil
}
//
withdrawSetting := db.SysCfgGetWithDb(eg, mid, "withdraw_setting")
withdrawFirstBili := gjson.Get(withdrawSetting, "withdrawFirstBili").String()
publicWithdrawTeamBili := db.SysCfgGetWithDb(eg, mid, "public_withdraw_team_bili")
publicWithdrawTeamCount := db.SysCfgGetWithDb(eg, mid, "public_withdraw_team_count")
if utils.StrToFloat64(withdrawFirstBili) > 0 {
level := 0
all, _ := db.UserLevlEgAll(eg)
for k, v := range all {
if k == 0 {
level = v.Id
}
}
//分给粉丝
levelUser := db.UserFindByLevel(eg, level)
if len(levelUser) == 0 {
return nil
}
ids := make([]int64, 0)
for _, v := range levelUser {
ids = append(ids, int64(v.Uid))
}
money := utils.FloatFormat(utils.StrToFloat64(apply.Amount)*(utils.StrToFloat64(withdrawFirstBili)/100)/float64(len(levelUser)), 6)
comm(eg, canalMsg.Id, ids, money, "全网提现分红", "withdraw_reward", "92")
}
if utils.StrToFloat64(publicWithdrawTeamBili) > 0 && utils.StrToFloat64(publicWithdrawTeamCount) > 0 {
//分给粉丝
user, _ := rule.FindRandUser(eg, utils.StrToInt(publicWithdrawTeamCount))
fmt.Println("=zhe", utils.SerializeStr(user))
money := utils.FloatFormat(utils.StrToFloat64(apply.Amount)*(utils.StrToFloat64(publicWithdrawTeamBili)/100)/float64(len(user)), 6)
comm(eg, canalMsg.Id, user, money, "公排团队提现分红", "withdraw_team_reward", "93")
}
return nil
}
func comm(eg *xorm.Engine, id string, levelUser []int64, money float64, title, types, ordAction string) {
for _, v := range levelUser {
profile, err := db.UserProfileFindByID(eg, v)
if err != nil || profile == nil {
continue
}
oldAmount := profile.FinValid
profile.FinValid = utils.Float64ToStrByPrec(utils.StrToFloat64(profile.FinValid)+money, 6)
eg.Where("uid=?", profile.Uid).Update(profile)
var flow = model.FinUserFlow{
Uid: int(v),
Type: 0,
Amount: utils.Float64ToStrByPrec(money, 6),
BeforeAmount: oldAmount,
AfterAmount: profile.FinValid,
OrdType: types,
OrdId: id,
OrdTitle: title,
OrdAction: utils.StrToInt(ordAction),
OrdTime: int(time.Now().Unix()),
State: 2,
CreateAt: time.Now(),
UpdateAt: time.Now(),
}
eg.Insert(&flow)
}

}

+ 0
- 75
consume/zhios_youmishang_exchange_store.go ファイルの表示

@@ -1,75 +0,0 @@
package consume

import (
"applet/app/db"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

func YoumishangExchangeStore(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleYoumishangExchangeStore(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
if err == nil {
_ = res.Ack(true)
}
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleYoumishangExchangeStore(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.YouMiShangExchangeStoreStruct
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.MasterId
eg := db.DBs[mid]
uid := canalMsg.Uid
levelList, _ := db.UserLevlEgAll(eg)
FindUser(eg, utils.Int64ToStr(uid), mid, levelList)
oneUser, _ := db.UserProfileFindByID(eg, uid)
if oneUser == nil || (oneUser != nil && oneUser.ParentUid == 0) {
return nil
}
FindUser(eg, utils.IntToStr(oneUser.ParentUid), mid, levelList)
return nil
}

読み込み中…
キャンセル
保存