From f4d4db304d336e9b230095bc1d741a7e469d0d46 Mon Sep 17 00:00:00 2001 From: huangjiajun <582604932@qq.com> Date: Wed, 26 Apr 2023 16:43:25 +0800 Subject: [PATCH] test --- db/db.go | 4 + db/db_capital_pool.go | 48 +++++ db/db_capital_pool_loss_money.go | 57 ++++++ db/db_mall_ord_capital_pool_total.go | 20 ++ db/model/capital_pool_loss_money.go | 7 + db/model/capital_pool_loss_money_flow.go | 17 ++ db/model/mall_ord_capital_pool_total.go | 17 ++ db/model/new_capital_pool.go | 26 +++ db/model/new_capital_pool_ord.go | 20 ++ db/model/plan_reward.go | 41 ++-- lib/comm_plan/init.go | 19 +- rule/self_buy_global.go | 232 +++++++++++++++++++++++ svc/get_plan_cfg.go | 20 +- svc/reward_commission.go | 11 +- 14 files changed, 496 insertions(+), 43 deletions(-) create mode 100644 db/db_capital_pool_loss_money.go create mode 100644 db/db_mall_ord_capital_pool_total.go create mode 100644 db/model/capital_pool_loss_money.go create mode 100644 db/model/capital_pool_loss_money_flow.go create mode 100644 db/model/mall_ord_capital_pool_total.go create mode 100644 db/model/new_capital_pool.go create mode 100644 db/model/new_capital_pool_ord.go create mode 100644 rule/self_buy_global.go diff --git a/db/db.go b/db/db.go index d487179..f67b1d7 100644 --- a/db/db.go +++ b/db/db.go @@ -6,3 +6,7 @@ func QueryNativeString(Db *xorm.Engine, sql string, args ...interface{}) ([]map[ results, err := Db.SQL(sql, args...).QueryString() return results, err } +func QueryNativeStringSess(sess *xorm.Session, sql string, args ...interface{}) ([]map[string]string, error) { + results, err := sess.SQL(sql, args...).QueryString() + return results, err +} diff --git a/db/db_capital_pool.go b/db/db_capital_pool.go index 4fbd8ee..d266bd2 100644 --- a/db/db_capital_pool.go +++ b/db/db_capital_pool.go @@ -53,6 +53,28 @@ func UpdateCapitalPool(engine *xorm.Engine, pool *model.CapitalPoolAgent) (int64 session.Commit() return update, err } +func InitNewCapitalPool(engine *xorm.Engine) error { + pool := &model.CapitalPoolAgent{ + IsUse: 0, + IsAuto: 0, + BonusType: "1", + BonusDateType: 1, + BonusTime: "", + BonusLevelType: 1, + UserLevelGroup: "", + CreateAt: time.Now(), + UpdateAt: time.Now(), + SettleCardinality: "commission", + } + addCapitalPool, err := AddCapitalPool(engine, pool) + if err != nil { + return err + } + if addCapitalPool != 1 { + return errors.New("插入条数有误!") + } + return nil +} //获取资金池基础设置 func GetCapitalPool(engine *xorm.Engine) (pool model.CapitalPoolAgent, err error) { @@ -81,3 +103,29 @@ func GetCapitalPool(engine *xorm.Engine) (pool model.CapitalPoolAgent, err error } return } +func GetNewCapitalPool(engine *xorm.Engine) (pool model.NewCapitalPool, err error) { + get, err := engine.Where("1 = 1").Get(&pool) + if err != nil { + return model.NewCapitalPool{}, err + } + + if !get { + err := InitNewCapitalPool(engine) + if err != nil { + return model.NewCapitalPool{}, err + } + capitalPool, err := GetNewCapitalPool(engine) + if err != nil { + return model.NewCapitalPool{}, err + } + if capitalPool.SettleCardinality == "" { + capitalPool.SettleCardinality = "commission" + } + return capitalPool, err + } else { + if pool.SettleCardinality == "" { + pool.SettleCardinality = "commission" + } + } + return +} diff --git a/db/db_capital_pool_loss_money.go b/db/db_capital_pool_loss_money.go new file mode 100644 index 0000000..afee868 --- /dev/null +++ b/db/db_capital_pool_loss_money.go @@ -0,0 +1,57 @@ +package db + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model" + zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils" + "errors" + "time" + "xorm.io/xorm" +) + +func InsertCapitalPoolLossMoney(sess *xorm.Session, uid, money, title, types, formType string) error { + if zhios_order_relate_utils.StrToFloat64(money) <= 0 { + return nil + } + moneyData, err := GetCapitalPoolLossMoney(sess, uid) + if err != nil { + return err + } + if moneyData == nil { + return errors.New("查不到损失记录") + } + beforeMoney := moneyData.Money + moneyData.Money = zhios_order_relate_utils.Float64ToStrByPrec(zhios_order_relate_utils.StrToFloat64(beforeMoney)+zhios_order_relate_utils.StrToFloat64(money), 3) + afterMoney := moneyData.Money + update, err := sess.Where("uid=?", uid).Update(moneyData) + if update == 0 || err != nil { + return errors.New("失败") + } + var flow = &model.CapitalPoolLossMoneyFlow{ + Uid: zhios_order_relate_utils.StrToInt(uid), + Money: money, + Time: time.Now(), + BeforeMoney: beforeMoney, + AfterMoney: afterMoney, + Type: zhios_order_relate_utils.StrToInt(types), + FormType: formType, + Title: title, + } + insert, err := sess.Insert(flow) + if insert == 0 || err != nil { + return errors.New("失败") + } + return nil +} +func GetCapitalPoolLossMoney(sess *xorm.Session, uid string) (*model.CapitalPoolLossMoney, error) { + var data model.CapitalPoolLossMoney + get, err := sess.Where("uid=?", uid).Get(&data) + if err != nil { + return nil, err + } + if get == false { + data = model.CapitalPoolLossMoney{Uid: zhios_order_relate_utils.StrToInt(uid)} + sess.Insert(&data) + } + return &data, nil + +} diff --git a/db/db_mall_ord_capital_pool_total.go b/db/db_mall_ord_capital_pool_total.go new file mode 100644 index 0000000..5227d17 --- /dev/null +++ b/db/db_mall_ord_capital_pool_total.go @@ -0,0 +1,20 @@ +package db + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model" + zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils" + "xorm.io/xorm" +) + +func GetMaxPrice(eg *xorm.Engine, uid string) *model.MallOrdCapitalPoolTotal { + var data model.MallOrdCapitalPoolTotal + get, err := eg.Where("uid=? and type=?", uid, 0).Get(&data) + if err != nil { + return nil + } + if get == false { + data = model.MallOrdCapitalPoolTotal{Uid: zhios_order_relate_utils.StrToInt(uid)} + eg.Insert(&data) + } + return &data +} diff --git a/db/model/capital_pool_loss_money.go b/db/model/capital_pool_loss_money.go new file mode 100644 index 0000000..c41e780 --- /dev/null +++ b/db/model/capital_pool_loss_money.go @@ -0,0 +1,7 @@ +package model + +type CapitalPoolLossMoney struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + Money string `json:"money" xorm:"default 0.0000 DECIMAL(20,4)"` +} diff --git a/db/model/capital_pool_loss_money_flow.go b/db/model/capital_pool_loss_money_flow.go new file mode 100644 index 0000000..d22b2a5 --- /dev/null +++ b/db/model/capital_pool_loss_money_flow.go @@ -0,0 +1,17 @@ +package model + +import ( + "time" +) + +type CapitalPoolLossMoneyFlow struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + Money string `json:"money" xorm:"default 0.0000 DECIMAL(20,4)"` + Time time.Time `json:"time" xorm:"DATETIME"` + BeforeMoney string `json:"before_money" xorm:"DECIMAL(20,4)"` + AfterMoney string `json:"after_money" xorm:"DECIMAL(20,4)"` + Type int `json:"type" xorm:"default 0 INT(1)"` + FormType string `json:"form_type" xorm:"VARCHAR(255)"` + Title string `json:"title" xorm:"VARCHAR(255)"` +} diff --git a/db/model/mall_ord_capital_pool_total.go b/db/model/mall_ord_capital_pool_total.go new file mode 100644 index 0000000..d77b3f5 --- /dev/null +++ b/db/model/mall_ord_capital_pool_total.go @@ -0,0 +1,17 @@ +package model + +import ( + "time" +) + +type MallOrdCapitalPoolTotal struct { + Id int `json:"id" xorm:"not null pk INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + Price string `json:"price" xorm:"default 0.0000 DECIMAL(20,4)"` + LeavePrice string `json:"leave_price" xorm:"default 0.0000 DECIMAL(20,4)"` + Num int `json:"num" xorm:"default 0 INT(11)"` + UpdateTime time.Time `json:"update_time" xorm:"DATETIME"` + Oid string `json:"oid" xorm:"VARCHAR(255)"` + Type int `json:"type" xorm:"INT(11) DEFAULT 0"` + OtherPrice string `json:"other_price" xorm:"default 0.0000 DECIMAL(20,4)"` +} diff --git a/db/model/new_capital_pool.go b/db/model/new_capital_pool.go new file mode 100644 index 0000000..794af60 --- /dev/null +++ b/db/model/new_capital_pool.go @@ -0,0 +1,26 @@ +package model + +import ( + "time" +) + +type NewCapitalPool struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"` + IsUse int `json:"is_use" xorm:"not null comment('是否开启(否:0;是:1)') TINYINT(1)"` + IsAuto int `json:"is_auto" xorm:"not null default 0 comment('是否自动分红(否:0;是:1)') TINYINT(1)"` + BonusType string `json:"bonus_type" xorm:"not null default '0' comment('分红类型(1佣金,2积分,3区块币)多个以逗号隔开') VARCHAR(255)"` + BonusDateType int `json:"bonus_date_type" xorm:"not null default 0 comment('日期类型(1每天,2固定时间)') TINYINT(1)"` + BonusTime string `json:"bonus_time" xorm:"default '0' comment('分红日期(1,15,30)多个日期已逗号分隔开;ps 只有日期类型是2才是有数据') VARCHAR(255)"` + BonusLevelType int `json:"bonus_level_type" xorm:"not null default 0 comment('用户等级分红类型(1,指定等级,2大于或等于指定等级)') TINYINT(1)"` + UserLevelGroup string `json:"user_level_group" xorm:"not null comment('指定用户等级组json') TEXT"` + UserGroup string `json:"user_group" xorm:"not null comment('指定用户组json') LONGTEXT"` + OpenSecurities int `json:"open_securities" xorm:"not null comment('是否开启分红劵功能') TINYINT(1)"` + SecuritiesId string `json:"securities_id" xorm:"not null default '' comment('虚拟币id') VARCHAR(255)"` + ExchangeSecuritiesId string `json:"exchange_securities_id" xorm:"comment('兑换分红券虚拟币id') VARCHAR(255)"` + ExchangeRate string `json:"exchange_rate" xorm:"comment('兑换比例,固定为x:1') VARCHAR(255)"` + UserLevelLimit string `json:"user_level_limit" xorm:"comment('用户等级限制组json') TEXT"` + CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"default 'CURRENT_TIMESTAMP' comment('更新时间') TIMESTAMP"` + SettleCardinality string `json:"settle_cardinality" xorm:"comment('基数') VARCHAR(255)"` + QuantityAllocation int `json:"quantity_allocation" xorm:"not null comment('数量分配 0按人数 1按份数') TINYINT(1)"` +} diff --git a/db/model/new_capital_pool_ord.go b/db/model/new_capital_pool_ord.go new file mode 100644 index 0000000..c550b3e --- /dev/null +++ b/db/model/new_capital_pool_ord.go @@ -0,0 +1,20 @@ +package model + +import ( + "time" +) + +type NewCapitalPoolOrd struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"` + Uid int `json:"uid" xorm:"not null comment('用户id') INT(11)"` + Pvd string `json:"pvd" xorm:"not null comment('订单渠道:自营,导购,o2o。。。。') VARCHAR(255)"` + OrdId int64 `json:"ord_id" xorm:"not null default 0 comment('订单id') BIGINT(20)"` + Commission string `json:"commission" xorm:"not null comment('订单总佣金') DECIMAL(12,6)"` + Price string `json:"price" xorm:"not null comment('付款金额') DECIMAL(12,6)"` + CommissionType string `json:"commission_type" xorm:"not null default '0' comment('佣金类型(CNY,虚拟币1Id,虚拟币2Id)') VARCHAR(100)"` + CapitalPoolRate string `json:"capital_pool_rate" xorm:"not null comment('资金池存入比例') DECIMAL(6,4)"` + DepositValue string `json:"deposit_value" xorm:"not null comment('存入金额') DECIMAL(12,6)"` + CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"default 'CURRENT_TIMESTAMP' comment('更新时间') TIMESTAMP"` + SettleCardinality string `json:"settle_cardinality" xorm:"comment('基数') VARCHAR(255)"` +} diff --git a/db/model/plan_reward.go b/db/model/plan_reward.go index 8e47c41..4793e7d 100644 --- a/db/model/plan_reward.go +++ b/db/model/plan_reward.go @@ -1,24 +1,25 @@ package model type PlanReward struct { - Id int `json:"id" xorm:"not null pk autoincr INT(10)"` - Pvd string `json:"pvd" xorm:"not null comment('供应商') unique VARCHAR(255)"` - PvdRate float32 `json:"pvd_rate" xorm:"not null default 0.0000 comment('供应商抽成比例') FLOAT(6,4)"` - SysRate float32 `json:"sys_rate" xorm:"not null default 0.0000 comment('平台抽成比例') FLOAT(6,4)"` - RegionRate float32 `json:"region_rate" xorm:"not null default 0.0000 comment('区域代理抽成比例') FLOAT(6,4)"` - RegionSubRate float32 `json:"region_sub_rate" xorm:"not null default 0.0000 comment('区域代理抽成比例') FLOAT(6,4)"` - GlobalRate float32 `json:"global_rate" xorm:"not null default 0.0000 comment('全球分红抽成比例') FLOAT(6,4)"` - SettleMode int `json:"settle_mode" xorm:"not null default 1 comment('0.手动方案,1.自动方案') TINYINT(1)"` - PlanCommissionId int `json:"plan_commission_id" xorm:"not null default 0 comment('佣金方案0未设置,>0对应方案') TINYINT(3)"` - PlanSettleId int `json:"plan_settle_id" xorm:"not null default 0 comment('结算方案0未设置,>0对应方案') TINYINT(3)"` - State int `json:"state" xorm:"not null default 1 comment('0关闭,1开启') TINYINT(1)"` - SubsidyRate float32 `json:"subsidy_rate" xorm:"not null default 0.0000 comment('待删除字段') FLOAT(6,4)"` - Source int `json:"source" xorm:"not null default 1 comment('佣金来源:1联盟佣金 2补贴金额') TINYINT(1)"` - AppType int `json:"app_type" xorm:"not null default 1 comment('所属应用:1导购 2自营 4O2O') TINYINT(3)"` - MerchantRate float32 `json:"merchant_rate" xorm:"not null default 0.0000 comment('o2o商家抽成比例') FLOAT(6,4)"` - NewAgentRate float32 `json:"new_agent_rate" xorm:"not null default 0.0000 comment('') FLOAT(6,4)"` - PushHandRate float32 `json:"push_hand_rate" xorm:"not null default 0.0000 comment('o2o推手抽成比例') FLOAT(6,4)"` - OrderBeforeRate float32 `json:"order_before_rate" xorm:"not null default 0.0000 comment('下单前的联盟抽成') FLOAT(6,4)"` - IntegralOpen int `json:"integral_open" xorm:"not null default 0 comment('积分抽成') TINYINT(1)"` - PointType int `json:"point_type" xorm:"not null default 0 comment('') TINYINT(1)"` + Id int `json:"id" xorm:"not null pk autoincr INT(10)"` + Pvd string `json:"pvd" xorm:"not null comment('供应商') unique VARCHAR(255)"` + PvdRate float32 `json:"pvd_rate" xorm:"not null default 0.0000 comment('供应商抽成比例') FLOAT(6,4)"` + SysRate float32 `json:"sys_rate" xorm:"not null default 0.0000 comment('平台抽成比例') FLOAT(6,4)"` + RegionRate float32 `json:"region_rate" xorm:"not null default 0.0000 comment('区域代理抽成比例') FLOAT(6,4)"` + RegionSubRate float32 `json:"region_sub_rate" xorm:"not null default 0.0000 comment('区域代理抽成比例') FLOAT(6,4)"` + GlobalRate float32 `json:"global_rate" xorm:"not null default 0.0000 comment('全球分红抽成比例') FLOAT(6,4)"` + SelfBuyGlobalRate float64 `json:"self_buy_global_rate" xorm:"not null default 0.0000 comment('全球分红抽成比例') FLOAT(6,4)"` + SettleMode int `json:"settle_mode" xorm:"not null default 1 comment('0.手动方案,1.自动方案') TINYINT(1)"` + PlanCommissionId int `json:"plan_commission_id" xorm:"not null default 0 comment('佣金方案0未设置,>0对应方案') TINYINT(3)"` + PlanSettleId int `json:"plan_settle_id" xorm:"not null default 0 comment('结算方案0未设置,>0对应方案') TINYINT(3)"` + State int `json:"state" xorm:"not null default 1 comment('0关闭,1开启') TINYINT(1)"` + SubsidyRate float32 `json:"subsidy_rate" xorm:"not null default 0.0000 comment('待删除字段') FLOAT(6,4)"` + Source int `json:"source" xorm:"not null default 1 comment('佣金来源:1联盟佣金 2补贴金额') TINYINT(1)"` + AppType int `json:"app_type" xorm:"not null default 1 comment('所属应用:1导购 2自营 4O2O') TINYINT(3)"` + MerchantRate float32 `json:"merchant_rate" xorm:"not null default 0.0000 comment('o2o商家抽成比例') FLOAT(6,4)"` + NewAgentRate float32 `json:"new_agent_rate" xorm:"not null default 0.0000 comment('') FLOAT(6,4)"` + PushHandRate float32 `json:"push_hand_rate" xorm:"not null default 0.0000 comment('o2o推手抽成比例') FLOAT(6,4)"` + OrderBeforeRate float32 `json:"order_before_rate" xorm:"not null default 0.0000 comment('下单前的联盟抽成') FLOAT(6,4)"` + IntegralOpen int `json:"integral_open" xorm:"not null default 0 comment('积分抽成') TINYINT(1)"` + PointType int `json:"point_type" xorm:"not null default 0 comment('') TINYINT(1)"` } diff --git a/lib/comm_plan/init.go b/lib/comm_plan/init.go index f861d79..660d2de 100644 --- a/lib/comm_plan/init.go +++ b/lib/comm_plan/init.go @@ -29,15 +29,16 @@ type PlanOpt struct { CommissionMode string // 佣金返佣方式 //IntegralMode string // 积分返佣方式 //BlockIconsMode string // 区块币返佣方式 - SysRate float64 // 系统占佣比例 - PvdRate float64 // 供应商占佣比例 - RegionRate float64 // 区域代理占佣比例 - RegionSubRate float64 // 区域代理占佣比例 - GlobalRate float64 // 全球分红占佣比例 - MerchantRate float64 //商家占佣比例 - NewAgentRate float64 //代理分红占佣比例 - OrderBeforeRate float64 - PushHandRate float64 //推手占佣比例 + SysRate float64 // 系统占佣比例 + PvdRate float64 // 供应商占佣比例 + RegionRate float64 // 区域代理占佣比例 + RegionSubRate float64 // 区域代理占佣比例 + GlobalRate float64 // 全球分红占佣比例 + SelfBuyGlobalRate float64 + MerchantRate float64 //商家占佣比例 + NewAgentRate float64 //代理分红占佣比例 + OrderBeforeRate float64 + PushHandRate float64 //推手占佣比例 //IntegralBili float64 // 积分兑换比例 //BlockIconsBili float64 // 区块币兑换比例 UserRate map[int]*LvGrade // 供应商对应的等级比例 diff --git a/rule/self_buy_global.go b/rule/self_buy_global.go new file mode 100644 index 0000000..6e24155 --- /dev/null +++ b/rule/self_buy_global.go @@ -0,0 +1,232 @@ +package rule + +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" + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md" + zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils" + "errors" + "github.com/jinzhu/copier" + "time" + "xorm.io/xorm" +) + +func AddOrder(eg *xorm.Engine, req map[string]string) { + max := db.GetMaxPrice(eg, req["uid"]) + if req["type"] == "mall_goods_user_lv" { + for i := 0; i < zhios_order_relate_utils.StrToInt(req["num"]); i++ { + var data = &model.MallOrdCapitalPoolTotal{ + Uid: zhios_order_relate_utils.StrToInt(req["uid"]), + Price: req["price"], + LeavePrice: req["price"], + Num: 1, + UpdateTime: time.Now(), + Oid: req["oid"], + Type: 1, + } + eg.Insert(data) + } + } else { + if max != nil { + max.LeavePrice = zhios_order_relate_utils.Float64ToStrByPrec(zhios_order_relate_utils.StrToFloat64(max.LeavePrice)+zhios_order_relate_utils.StrToFloat64(req["price"]), 3) + max.OtherPrice = zhios_order_relate_utils.Float64ToStrByPrec(zhios_order_relate_utils.StrToFloat64(max.OtherPrice)+zhios_order_relate_utils.StrToFloat64(req["price"]), 3) + max.UpdateTime = time.Now() + eg.Where("id=?", max.Id, max) + } + } +} + +func Pool(eg *xorm.Engine, price string) { + if zhios_order_relate_utils.StrToFloat64(price) == 0 { + return + } + session := eg.NewSession() + defer session.Close() + err := session.Begin() + if err != nil { + session.Rollback() + return + } + //统计数量 + //礼包的 + sql := `SELECT SUM(sum) as sum,uid FROM mall_ord_capital_pool_total WHERE leave_price>0 and type=1 GROUP BY uid;` + nativeString, err := db.QueryNativeStringSess(session, sql) + if err != nil { + return + } + sqlFirst := `SELECT uid FROM mall_ord_capital_pool_total WHERE type=0 GROUP BY uid;` + nativeStringFirst, errFirst := db.QueryNativeStringSess(session, sqlFirst) + if errFirst != nil { + return + } + sum := 0 + ids := make([]string, 0) + newIds := make([]string, 0) + //礼包的算份数 + for _, v := range nativeString { + sum += zhios_order_relate_utils.StrToInt(v["sum"]) + ids = append(ids, v["uid"]) + } + //非礼包的 站位 + for _, v := range nativeStringFirst { + if zhios_order_relate_utils.InArr(v["uid"], ids) == false || len(ids) == 0 { + sum += 1 + newIds = append(newIds, v["uid"]) + } + } + oneMoney := zhios_order_relate_utils.StrToFloat64(price) / float64(sum) + //金额小的先扣 扣不完 给下一个 + var userMap = make(map[string]float64) + for _, v := range ids { + //读取用户的记录 + var leave float64 = 0 + var data []model.MallOrdCapitalPoolTotal + err := eg.Where("uid=? and type=? and leave_price>?", v, 1, 0).Find(&data) + if err != nil { + session.Rollback() + return + } + for _, v1 := range data { + leave, err = OneDoing(session, v1, oneMoney, leave) + if err != nil { + session.Rollback() + return + } + } + //这里判断下有没有初始记录有金额 如果没有的话就进入损失金额 + if leave > 0 { + var oneData model.MallOrdCapitalPoolTotal + has, err := session.Where("uid=? and type=? ", v, 0).Get(&oneData) + if err != nil { + session.Rollback() + return + } + if has { + //先扣除 剩下的进损失 + if zhios_order_relate_utils.StrToFloat64(oneData.LeavePrice)-leave < 0 { + leave = leave - zhios_order_relate_utils.StrToFloat64(oneData.LeavePrice) + oneData.LeavePrice = "0" + } else { + oneData.LeavePrice = zhios_order_relate_utils.Float64ToStrByPrec(zhios_order_relate_utils.StrToFloat64(oneData.LeavePrice)-leave, 2) + leave = 0 + } + update, err := session.Where("id=?", oneData.Id).Cols("leave_price").Update(&oneData) + if update == 0 || err != nil { + session.Rollback() + return + } + } + //剩下的进损失 + err = db.InsertCapitalPoolLossMoney(session, v, zhios_order_relate_utils.Float64ToStrByPrec(leave, 3), "分红损失", "0", "capital_pool") + if err != nil { + session.Rollback() + return + } + + leave = 0 + } + userMap[v] = leave + } + for _, v := range nativeStringFirst { + var leave float64 = 0 + money, ok := userMap[v["uid"]] + if ok { + leave = money + } + if zhios_order_relate_utils.InArr(v["uid"], ids) == false || len(ids) == 0 { + var oneData model.MallOrdCapitalPoolTotal + _, err := session.Where("uid=? and type=? ", v["uid"], 0).Get(&oneData) + if err != nil { + session.Rollback() + return + } + //这里还能分 + leave, err = OneDoing(session, oneData, oneMoney, leave) + if err != nil { + session.Rollback() + return + } + } else { + //这里只需要判断要不要扣 多出的进入损失金额 + if leave > 0 { + var oneData model.MallOrdCapitalPoolTotal + has, err := session.Where("uid=? and type=? ", v, 0).Get(&oneData) + if err != nil { + session.Rollback() + return + } + if has { + //先扣除 剩下的进损失 + if zhios_order_relate_utils.StrToFloat64(oneData.LeavePrice)-leave < 0 { + leave = leave - zhios_order_relate_utils.StrToFloat64(oneData.LeavePrice) + oneData.LeavePrice = "0" + } else { + leave = 0 + oneData.LeavePrice = zhios_order_relate_utils.Float64ToStrByPrec(zhios_order_relate_utils.StrToFloat64(oneData.LeavePrice)-leave, 2) + } + update, err := session.Where("id=?", oneData.Id).Cols("leave_price").Update(&oneData) + if update == 0 || err != nil { + session.Rollback() + return + } + } + } + + } + if leave > 0 { + //剩下的进损失 + err = db.InsertCapitalPoolLossMoney(session, v["uid"], zhios_order_relate_utils.Float64ToStrByPrec(leave, 3), "分红损失", "0", "capital_pool") + if err != nil { + session.Rollback() + return + } + } + } +} +func OneDoing(sess *xorm.Session, data model.MallOrdCapitalPoolTotal, oneMoney, leave float64) (float64, error) { + money := oneMoney + leave + if zhios_order_relate_utils.StrToFloat64(data.LeavePrice)-money < 0 { + money = zhios_order_relate_utils.StrToFloat64(data.LeavePrice) + leave = money - zhios_order_relate_utils.StrToFloat64(data.LeavePrice) + data.LeavePrice = "0" + } else { + leave = 0 + data.LeavePrice = zhios_order_relate_utils.Float64ToStrByPrec(zhios_order_relate_utils.StrToFloat64(data.LeavePrice)-money, 2) + } + update, err := sess.Where("id=?", data.Id).Cols("leave_price").Update(&data) + if update == 0 || err != nil { + return leave, errors.New("失败") + } + return leave, nil +} + +func AddBonusOrd(engine *xorm.Engine, t *md.BonusOrdParam) error { + + //获取分红基础设置 + pool, err := db.GetNewCapitalPool(engine) + if err != nil || pool.Id == 0 { + return errors.New("分红设置有误") + } + if pool.IsUse == 0 { + return errors.New("功能没有开始使用,插入分红失败") + } + var capitalPoolOrd model.NewCapitalPoolOrd + copier.Copy(&capitalPoolOrd, &t) + capitalPoolOrd.Uid = zhios_order_relate_utils.StrToInt(t.Uid) + capitalPoolOrd.OrdId = zhios_order_relate_utils.AnyToInt64(t.OrdId) + capitalPoolOrd.CreateAt = time.Now() + capitalPoolOrd.UpdateAt = time.Now() + capitalPoolOrd.SettleCardinality = pool.SettleCardinality + if pool.SettleCardinality == "price" { //价格为基数 + capitalPoolOrd.DepositValue = t.PriceValue + capitalPoolOrd.Commission = t.PriceValue + } + one, err := engine.InsertOne(&capitalPoolOrd) + if err != nil || one == 0 { + if err == nil { + err = errors.New("插入数据有误!") + } + return err + } + return nil +} diff --git a/svc/get_plan_cfg.go b/svc/get_plan_cfg.go index e98aac4..3c1a62d 100644 --- a/svc/get_plan_cfg.go +++ b/svc/get_plan_cfg.go @@ -75,6 +75,7 @@ func GetPlanCfg(eg *xorm.Engine, pvd, masterId string, rewardOpts map[string]*mo opt.RegionRate = float64(int64(rewardOpt.RegionRate*1e4)) / 1e4 opt.RegionSubRate = float64(int64(rewardOpt.RegionSubRate*1e4)) / 1e4 opt.GlobalRate = float64(int64(rewardOpt.GlobalRate*1e4)) / 1e4 + opt.SelfBuyGlobalRate = float64(int64(rewardOpt.SelfBuyGlobalRate*1e4)) / 1e4 opt.PushHandRate = float64(int64(rewardOpt.PushHandRate*1e4)) / 1e4 opt.MerchantRate = float64(int64(rewardOpt.MerchantRate*1e4)) / 1e4 opt.NewAgentRate = float64(int64(rewardOpt.NewAgentRate*1e4)) / 1e4 @@ -199,15 +200,16 @@ func PlanOpts(eg *xorm.Engine) map[string]*comm_plan.PlanOpt { continue } opts[v.Pvd] = &comm_plan.PlanOpt{ - Pvd: v.Pvd, - PlanCommissionId: v.PlanCommissionId, - Mode: commissionPlans[v.PlanCommissionId].Mode, - CommissionMode: commissionPlans[v.PlanCommissionId].CommissionMode, - SysRate: float64(v.SysRate), - PvdRate: float64(v.PvdRate), - RegionRate: float64(v.RegionRate), - GlobalRate: float64(v.GlobalRate), - UserRate: subsidyTmp, + Pvd: v.Pvd, + PlanCommissionId: v.PlanCommissionId, + Mode: commissionPlans[v.PlanCommissionId].Mode, + CommissionMode: commissionPlans[v.PlanCommissionId].CommissionMode, + SysRate: float64(v.SysRate), + PvdRate: float64(v.PvdRate), + RegionRate: float64(v.RegionRate), + GlobalRate: float64(v.GlobalRate), + SelfBuyGlobalRate: v.SelfBuyGlobalRate, + UserRate: subsidyTmp, } } diff --git a/svc/reward_commission.go b/svc/reward_commission.go index 019059e..8493656 100644 --- a/svc/reward_commission.go +++ b/svc/reward_commission.go @@ -487,17 +487,18 @@ func CommFee(fee float64, opt *comm_plan.PlanOpt, types, isGoods string) (float6 fee = float64(int64(float64(fee1)/100)) / 100 } } - pvdFee := fee * opt.PvdRate // 供应商联盟比例 - sysFee := fee * opt.SysRate // 平台比例 - regionFee := fee * opt.RegionRate // 区域代理比例 - globalFee := fee * opt.GlobalRate // 全球分红比例 + pvdFee := fee * opt.PvdRate // 供应商联盟比例 + sysFee := fee * opt.SysRate // 平台比例 + regionFee := fee * opt.RegionRate // 区域代理比例 + globalFee := fee * opt.GlobalRate // 全球分红比例 + selfBuyGlobalFee := fee * opt.SelfBuyGlobalRate // 全球分红比例 pushHandFee := fee * opt.PushHandRate merchantFee := fee * opt.MerchantRate newAgentFee := fee * opt.NewAgentRate regionSubFee := fee * opt.RegionSubRate // 剩余可分配的佣金 - total := int64(fee*1e4) - int64(pvdFee*1e4) - int64(sysFee*1e4) - int64(regionFee*1e4) - int64(regionSubFee*1e4) - int64(globalFee*1e4) - int64(pushHandFee*1e4) - int64(merchantFee*1e4) - int64(newAgentFee*1e4) + total := int64(fee*1e4) - int64(pvdFee*1e4) - int64(sysFee*1e4) - int64(regionFee*1e4) - int64(regionSubFee*1e4) - int64(globalFee*1e4) - int64(selfBuyGlobalFee*1e4) - int64(pushHandFee*1e4) - int64(merchantFee*1e4) - int64(newAgentFee*1e4) fee = float64(total) / 1e4 if fee < 0 {