From e240ed86962daf4cecb4b1f97d3ee8cc95d4401a Mon Sep 17 00:00:00 2001 From: dengbiao Date: Mon, 5 Aug 2024 14:43:54 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=9C=8D=E5=8A=A1=E5=A5=96=E5=88=86?= =?UTF-8?q?=E7=BA=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 2 + rule/service_award_dividend/index.go | 289 ++++++++++++++++++ .../md/service_award_dividend.go | 15 + 4 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 rule/service_award_dividend/index.go create mode 100644 rule/service_award_dividend/md/service_award_dividend.go diff --git a/go.mod b/go.mod index 4eb16d7..4686712 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ go 1.15 require ( code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5 - code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240723073901-849ec3e356f3 + code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240805064206-7176a3f52675 github.com/gin-gonic/gin v1.9.1 github.com/go-redis/redis v6.15.9+incompatible github.com/gomodule/redigo v1.8.9 diff --git a/go.sum b/go.sum index fb229d0..84a4178 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240701102131-0408d7e code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240701102131-0408d7ee8572/go.mod h1:nT2x13YFgrS3tS1fDyUR6q/GNIK+hPw7bdzZXz99SM0= code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240723073901-849ec3e356f3 h1:YQhrYavdlE5gUpQ6tm7029ONJVyy9IcSw4W1vU52+3E= code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240723073901-849ec3e356f3/go.mod h1:nT2x13YFgrS3tS1fDyUR6q/GNIK+hPw7bdzZXz99SM0= +code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240805064206-7176a3f52675 h1:CHFIwllR+HxDvhOsrW2+h/riCpAclOVbPh5xm63530w= +code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240805064206-7176a3f52675/go.mod h1:nT2x13YFgrS3tS1fDyUR6q/GNIK+hPw7bdzZXz99SM0= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= diff --git a/rule/service_award_dividend/index.go b/rule/service_award_dividend/index.go new file mode 100644 index 0000000..6c39930 --- /dev/null +++ b/rule/service_award_dividend/index.go @@ -0,0 +1,289 @@ +package service_award_dividend + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db" + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model" + 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/service_award_dividend/md" + zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils" + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/cache" + zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement" + "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" + "encoding/json" + "errors" + "time" + "xorm.io/xorm" +) + +func Init(redisAddr string) (err error) { + if redisAddr != "" { + cache.NewRedis(redisAddr) + } + _, err = cache.SelectDb(md2.RedisDataBase) + return +} + +func JoinServiceAwardDividendRelation(eg *xorm.Engine, masterId string, req md.JoinServiceAwardDividendRelationReq) (err error) { + user, err := db.DbsUserFindByUid(eg, req.Uid) + if err != nil { + return err + } + if user == nil { + return errors.New("未查询到相应会员记录") + } + + serviceAwardDividendBasicDb := implement.NewServiceAwardDividendBasicDb(eg) + base, _ := serviceAwardDividendBasicDb.GetServiceAwardDividendBasic() + if base.IsOpen != 1 { + err = errors.New("服务奖分红未开启!") + return + } + var generalVipAllocationSetStruct md.GeneralVipAllocationSetStruct //普通会员设置 + err = json.Unmarshal([]byte(base.GeneralVipAllocationSet), &generalVipAllocationSetStruct) + if err != nil { + return err + } + var seniorVipAllocationSetStruct []md.SeniorVipAllocationSetStruct //高级会员设置 + err = json.Unmarshal([]byte(base.SeniorVipAllocationSet), &seniorVipAllocationSetStruct) + if err != nil { + return err + } + var seniorVipIdsStruct md.SeniorVipIdsStruct //高级会员ids + err = json.Unmarshal([]byte(base.SeniorVipIds), &seniorVipIdsStruct) + if err != nil { + return err + } + + var levelMap = map[int]model.UserLevel{} + lvList, err := db.UserLevelInIDescByWeightLow(eg) + for _, v := range lvList { + levelMap[v.Id] = *v + } + + //1、判断是否有直属推荐人 + if req.ParentUid != 0 { + //2、判断直属推荐人是否为销售型会员 + parentUser, err := db.DbsUserFindByUid(eg, req.ParentUid) + if err != nil { + return err + } + if parentUser == nil { + return errors.New("未查询到相应上级会员记录") + } + if zhios_order_relate_utils.InArrToInt(parentUser.Level, seniorVipIdsStruct) { + //3、判断当前用户和父级用户谁的会员等级更高 + if levelMap[user.Level].LevelWeight >= levelMap[parentUser.Level].LevelWeight { + //4、判断当前用户是"普通会员" or "高级会员" + if zhios_order_relate_utils.InArrToInt(user.Level, seniorVipIdsStruct) { + err = AutoAddGeneralVip(eg, user, req.ParentUid, generalVipAllocationSetStruct) + if err != nil { + return err + } + } else { + for _, vv := range seniorVipAllocationSetStruct { + if vv.FromVipId == user.Level { + err = AutoAddSeniorVip(eg, user, req.ParentUid, vv) + if err != nil { + return err + } + } + } + } + } else { + err = AddVipToParent(eg, user, req.ParentUid) + if err != nil { + return err + } + } + } else { + //5、判断当前用户是"普通会员" or "高级会员" + if zhios_order_relate_utils.InArrToInt(user.Level, seniorVipIdsStruct) { + err = AutoAddGeneralVip(eg, user, req.ParentUid, generalVipAllocationSetStruct) + if err != nil { + return err + } + } else { + for _, vv := range seniorVipAllocationSetStruct { + if vv.FromVipId == user.Level { + err = AutoAddSeniorVip(eg, user, req.ParentUid, vv) + if err != nil { + return err + } + } + } + } + } + } else { + //2、判断当前用户是"普通会员" or "高级会员" + if zhios_order_relate_utils.InArrToInt(user.Level, seniorVipIdsStruct) { + err = AutoAddGeneralVip(eg, user, req.ParentUid, generalVipAllocationSetStruct) + if err != nil { + return err + } + } else { + for _, vv := range seniorVipAllocationSetStruct { + if vv.FromVipId == user.Level { + err = AutoAddSeniorVip(eg, user, req.ParentUid, vv) + if err != nil { + return err + } + } + } + } + } + return +} + +// AutoAddGeneralVip 自动添加普通会员 +func AutoAddGeneralVip(engine *xorm.Engine, user *model.User, parentUid int, generalVipAllocationSet md.GeneralVipAllocationSetStruct) (err error) { + //1、查询出当前应该分配给哪个上级会员 + var serviceAwardDividendRelation models.ServiceAwardDividendRelation + has, err := engine.In("vip_level", generalVipAllocationSet).Asc("allocation_nums").Get(&serviceAwardDividendRelation) + if err != nil { + return err + } + if has == false { + return errors.New("未查询到合适的绑定上级会员用户!") + } + + now := time.Now() + sess := engine.NewSession() + defer func() { + sess.Close() + if err := recover(); err != nil { + + _ = zhios_order_relate_logx.Error(err) + } + }() + sess.Begin() + + //2、新增 service_award_dividend_relation 记录 + serviceAwardDividendRelationDb := implement.NewServiceAwardDividendRelationDb(engine) + _, err = serviceAwardDividendRelationDb.InsertServiceAwardDividendRelationBySess(sess, &models.ServiceAwardDividendRelation{ + Uid: user.Uid, + ParentUid: parentUid, + BindUid: serviceAwardDividendRelation.Uid, + VipLevel: user.Level, + AllocationNums: 0, + CreateAt: now.Format("2006-01-02 15:04:05"), + UpdateAt: now.Format("2006-01-02 15:04:05"), + }) + if err != nil { + sess.Rollback() + return err + } + + //3、修改 绑定上级的 service_award_dividend_relation 记录 + serviceAwardDividendRelation.AllocationNums++ + updateRelationAfftecd, err := serviceAwardDividendRelationDb.SaveServiceAwardDividendRelation(sess, serviceAwardDividendRelation.Id, &serviceAwardDividendRelation, "allocation_nums") + if err != nil { + return err + } + if updateRelationAfftecd <= 0 { + return errors.New("更新 绑定上级的 service_award_dividend_relation 记录 失败!") + } + return sess.Commit() +} + +// AutoAddSeniorVip 自动添加高级会员 +func AutoAddSeniorVip(engine *xorm.Engine, user *model.User, parentUid int, seniorVipAllocationSet md.SeniorVipAllocationSetStruct) (err error) { + //1、查询出当前应该分配给哪个上级会员 + var serviceAwardDividendRelation models.ServiceAwardDividendRelation + has, err := engine.In("vip_level", seniorVipAllocationSet.ToVipId).Asc("allocation_nums").Get(&serviceAwardDividendRelation) + if err != nil { + return err + } + if has == false { + return errors.New("未查询到合适的绑定上级会员用户!") + } + + now := time.Now() + sess := engine.NewSession() + defer func() { + sess.Close() + if err := recover(); err != nil { + + _ = zhios_order_relate_logx.Error(err) + } + }() + sess.Begin() + + //2、新增 service_award_dividend_relation 记录 + serviceAwardDividendRelationDb := implement.NewServiceAwardDividendRelationDb(engine) + _, err = serviceAwardDividendRelationDb.InsertServiceAwardDividendRelationBySess(sess, &models.ServiceAwardDividendRelation{ + Uid: user.Uid, + ParentUid: parentUid, + BindUid: serviceAwardDividendRelation.Uid, + VipLevel: user.Level, + AllocationNums: 0, + CreateAt: now.Format("2006-01-02 15:04:05"), + UpdateAt: now.Format("2006-01-02 15:04:05"), + }) + if err != nil { + sess.Rollback() + return err + } + + //3、修改 绑定上级的 service_award_dividend_relation 记录 + serviceAwardDividendRelation.AllocationNums++ + updateRelationAfftecd, err := serviceAwardDividendRelationDb.SaveServiceAwardDividendRelation(sess, serviceAwardDividendRelation.Id, &serviceAwardDividendRelation, "allocation_nums") + if err != nil { + return err + } + if updateRelationAfftecd <= 0 { + return errors.New("更新 绑定上级的 service_award_dividend_relation 记录 失败!") + } + return sess.Commit() +} + +// AddVipToParent 添加会员至父级 +func AddVipToParent(engine *xorm.Engine, user *model.User, parentUid int) (err error) { + //1、查询出当前应该分配给哪个上级会员 + var serviceAwardDividendRelation models.ServiceAwardDividendRelation + has, err := engine.Where("uid =?", parentUid).Get(&serviceAwardDividendRelation) + if err != nil { + return err + } + if has == false { + return errors.New("未查询到对应绑定上级会员用户!") + } + + now := time.Now() + sess := engine.NewSession() + defer func() { + sess.Close() + if err := recover(); err != nil { + + _ = zhios_order_relate_logx.Error(err) + } + }() + sess.Begin() + + //2、新增 service_award_dividend_relation 记录 + serviceAwardDividendRelationDb := implement.NewServiceAwardDividendRelationDb(engine) + _, err = serviceAwardDividendRelationDb.InsertServiceAwardDividendRelationBySess(sess, &models.ServiceAwardDividendRelation{ + Uid: user.Uid, + ParentUid: parentUid, + BindUid: serviceAwardDividendRelation.Uid, + VipLevel: user.Level, + AllocationNums: 0, + CreateAt: now.Format("2006-01-02 15:04:05"), + UpdateAt: now.Format("2006-01-02 15:04:05"), + }) + if err != nil { + sess.Rollback() + return err + } + + //3、修改 绑定上级的 service_award_dividend_relation 记录 + serviceAwardDividendRelation.AllocationNums++ + updateRelationAfftecd, err := serviceAwardDividendRelationDb.SaveServiceAwardDividendRelation(sess, serviceAwardDividendRelation.Id, &serviceAwardDividendRelation, "allocation_nums") + if err != nil { + return err + } + if updateRelationAfftecd <= 0 { + return errors.New("更新 绑定上级的 service_award_dividend_relation 记录 失败!") + } + return sess.Commit() +} diff --git a/rule/service_award_dividend/md/service_award_dividend.go b/rule/service_award_dividend/md/service_award_dividend.go new file mode 100644 index 0000000..1b6d549 --- /dev/null +++ b/rule/service_award_dividend/md/service_award_dividend.go @@ -0,0 +1,15 @@ +package md + +type GeneralVipIdsStruct []int +type GeneralVipAllocationSetStruct []int + +type SeniorVipIdsStruct []int +type SeniorVipAllocationSetStruct struct { + FromVipId int `json:"from_vip_id"` + ToVipId []int `json:"to_vip_id"` +} + +type JoinServiceAwardDividendRelationReq struct { + Uid int `json:"uid"` //用户id + ParentUid int `json:"parent_uid"` //父级id +}