|
- 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 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(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(">>>>>>>>>>>>>>>>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]
- userInfo, _ := db.UserFindByID(eg, canalMsg.Uid)
- if userInfo == nil {
- return nil
- }
- userProfile, _ := db.UserProfileFindByID(eg, canalMsg.Uid)
- 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
- }
- //写入奖励记录
- InvitedReward := cfg.RewardRule.InvitedReward
- if cfg.RewardRule.RewardType == "1" {
- InvitedReward = Rands(cfg.RewardRule.InvitedReward, cfg.RewardRule.InvitedRewardMax)
- }
- if utils.StrToFloat64(InvitedReward) > 0 {
- ownRewardLog, ownhas, _ := db.GetNewAcquisitionRewardLog(eg, &model.NewAcquisitionRewardLog{
- Uid: userProfile.Uid,
- ToUid: 0,
- })
- 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()),
- }
-
- db.InsertNewRewardLog(eg, ownRewardLog)
- }
- 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)
- }
-
- //直推
- DirectSuccess := cfg.RewardRule.DirectSuccess
- if cfg.RewardRule.RewardType == "1" {
- DirectSuccess = Rands(cfg.RewardRule.DirectSuccess, cfg.RewardRule.DirectSuccessMax)
- }
- 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()),
- }
- db.InsertNewRewardLog(eg, extendRewardLog)
- }
- 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)
- }
- }
-
- //间推
- IndirectSuccess := cfg.RewardRule.IndirectSuccess
- if cfg.RewardRule.RewardType == "1" {
- IndirectSuccess = Rands(cfg.RewardRule.IndirectSuccess, cfg.RewardRule.IndirectSuccessMax)
- }
- 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()),
- }
- db.InsertNewRewardLog(eg, IndirectRewardLog)
- }
- 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" {
- 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.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
- }
|