@@ -0,0 +1,76 @@ | |||
package db | |||
import ( | |||
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model" | |||
zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx" | |||
"reflect" | |||
"xorm.io/xorm" | |||
) | |||
type AppreciationFlowDb struct { | |||
Db *xorm.Engine `json:"db"` | |||
Uid int `json:"uid"` | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) Set(db *xorm.Engine, uid int) { // set方法 | |||
appreciationFlowDb.Db = db | |||
appreciationFlowDb.Uid = uid | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) GetAppreciationFlow(id int) (m *model.AppreciationFlow, err error) { | |||
m = new(model.AppreciationFlow) | |||
has, err := appreciationFlowDb.Db.Where("id =?", id).Get(m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
if has == false { | |||
return nil, nil | |||
} | |||
return m, nil | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) FindAppreciationFlowById(ids interface{}) (*[]model.AppreciationFlow, error) { | |||
var m []model.AppreciationFlow | |||
if err := appreciationFlowDb.Db.In("id", ids).Desc("id").Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) FindAppreciationFlow(limit, start int) (*[]model.AppreciationFlow, error) { | |||
var m []model.AppreciationFlow | |||
if limit == 0 || start == 0 { | |||
if err := appreciationFlowDb.Db.Where("uid =?", appreciationFlowDb.Uid).Asc("id").Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
} else { | |||
if err := appreciationFlowDb.Db.Where("uid =?", appreciationFlowDb.Uid).Asc("id").Limit(limit, start).Find(m); err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
} | |||
return &m, nil | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) AppreciationFlowInsert(m *model.AppreciationFlow) (int64, error) { | |||
_, err := appreciationFlowDb.Db.InsertOne(m) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return m.Id, nil | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) AppreciationFlowUpdate(m *model.AppreciationFlow, columns ...string) (int64, error) { | |||
affected, err := appreciationFlowDb.Db.Where("id =?", m.Id).Cols(columns...).Update(m) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
func (appreciationFlowDb *AppreciationFlowDb) AppreciationFlowDelete(id interface{}) (int64, error) { | |||
if reflect.TypeOf(id).Kind() == reflect.Slice { | |||
return appreciationFlowDb.Db.In("id", id).Delete(model.AppreciationFlow{}) | |||
} else { | |||
return appreciationFlowDb.Db.Where("id = ?", id).Delete(model.AppreciationFlow{}) | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
package model | |||
type AppreciationBase struct { | |||
Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"` | |||
IsUse int `json:"is_use" xorm:"not null default 0 comment('是否开启(否:0;是:1)') TINYINT(1)"` | |||
Sum string `json:"sum" xorm:"default 0.0000 comment('总资产') DECIMAL(20,4)"` | |||
FlowSum string `json:"flow_sum" xorm:"default 0.0000 comment('流通资产') DECIMAL(20,4)"` | |||
} |
@@ -0,0 +1,15 @@ | |||
package model | |||
type AppreciationFlow struct { | |||
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` | |||
CoinId int `json:"coin_id" xorm:"not null default 0 comment('虚拟币id') INT(11)"` | |||
Uid int `json:"uid" xorm:"not null default 0 comment('用户id') INT(11)"` | |||
Kind int `json:"kind" xorm:"not null default 1 comment('流水类型') TINYINT(1)"` | |||
Value string `json:"value" xorm:"not null default 0.0000 comment('虚拟币值') DECIMAL(20,4)"` | |||
BeforeFlowSum string `json:"before_flow_sum" xorm:"not null default 0.0000 comment('变动前-流通资产') DECIMAL(20,4)"` | |||
AfterFlowSum string `json:"after_flow_sum" xorm:"not null default 0.0000 comment('变动后-流通资产') DECIMAL(20,4)"` | |||
BeforeSum string `json:"before_sum" xorm:"not null default 0.0000 comment('变动前-总资产') DECIMAL(20,4)"` | |||
AfterSum string `json:"after_sum" xorm:"not null default 0.0000 comment('变动后-总资产') DECIMAL(20,4)"` | |||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"` | |||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"` | |||
} |
@@ -0,0 +1,26 @@ | |||
package enum | |||
// 增值积分流水种类 | |||
type AppreciationFlowKind int | |||
const ( | |||
TransferIn AppreciationFlowKind = iota | |||
TransferOut | |||
WithdrawalAndDestroy | |||
WithdrawalAndReflux | |||
) | |||
func (kind AppreciationFlowKind) String() string { | |||
switch kind { | |||
case TransferIn: | |||
return "转入" | |||
case TransferOut: | |||
return "转出" | |||
case WithdrawalAndDestroy: | |||
return "提现销毁" | |||
case WithdrawalAndReflux: | |||
return "提现回流" | |||
default: | |||
return "未知状态" | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
package md | |||
import "github.com/shopspring/decimal" | |||
var ( | |||
WithdrawalCommissionFee = decimal.NewFromFloat(0.15) //提现手续费比例 | |||
WithdrawalDestroyFee = decimal.NewFromFloat(0.05) //提现销毁增值积分比例 | |||
WithdrawalRefluxFee = decimal.NewFromFloat(0.10) //提现回流增值积分比例 | |||
) | |||
type DealWithdrawalAndDestroyResp struct { | |||
Price float64 `json:"price"` //价值 | |||
TransferOut float64 `json:"transfer_out"` //提现的积分 | |||
TransferOutValue float64 `json:"transfer_out_value"` //提现的余额 | |||
AmountOut float64 `json:"amount_out"` //手续费 | |||
DestroyValue float64 `json:"destroy_value"` //销毁的积分 | |||
RefluxValue float64 `json:"reflux_value"` //回流的积分 | |||
} | |||
type DealWithdrawalFeeResp struct { | |||
WithdrawalCommissionFee float64 `json:"withdrawal_commission_fee"` //提现手续费比例 | |||
WithdrawalDestroyFee float64 `json:"withdrawal_destroy_fee"` //提现销毁增值积分比例 | |||
WithdrawalRefluxFee float64 `json:"withdrawal_reflux_fee"` //提现回流增值积分比例 | |||
} |
@@ -0,0 +1,90 @@ | |||
package rule | |||
import ( | |||
"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" | |||
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/cache" | |||
"errors" | |||
"github.com/shopspring/decimal" | |||
"xorm.io/xorm" | |||
) | |||
func InitForAppreciation(redisAddr string) (err error) { | |||
if redisAddr != "" { | |||
cache.NewRedis(redisAddr) | |||
} | |||
_, err = cache.SelectDb(md.RedisDataBase) | |||
return | |||
} | |||
func CalcAppreciationValueEg(eg *xorm.Engine) (err error, value float64) { | |||
var appreciationBase model.AppreciationBase | |||
//1、查询增值积分资产总值 | |||
has, err := eg.Table("appreciation_base").Where("is_use =1").Get(&appreciationBase) | |||
if err != nil { | |||
return err, value | |||
} | |||
if !has { | |||
return errors.New("未查询到`增值积分资产总值`记录"), value | |||
} | |||
if zhios_order_relate_utils.StrToFloat64(appreciationBase.Sum) == 0 { //默认是1 | |||
return nil, 1 | |||
} | |||
sum, _ := decimal.NewFromString(appreciationBase.Sum) //总资产 | |||
flowSum, _ := decimal.NewFromString(appreciationBase.FlowSum) //流通资产 | |||
value, _ = sum.Div(flowSum).RoundFloor(4).Float64() | |||
return | |||
} | |||
/* | |||
计算增值积分当前价值 | |||
TODO:: 公式【 总资产/流通资产=当前积分价值 】 | |||
*/ | |||
func CalcAppreciationValue(session *xorm.Session) (err error, value float64) { | |||
var appreciationBase model.AppreciationBase | |||
//1、查询增值积分资产总值 | |||
has, err := session.Table("appreciation_base").Where("is_use =1").Get(&appreciationBase) | |||
if err != nil { | |||
return err, value | |||
} | |||
if !has { | |||
return errors.New("未查询到`增值积分资产总值`记录"), value | |||
} | |||
if zhios_order_relate_utils.StrToFloat64(appreciationBase.Sum) == 0 { //默认是1 | |||
return nil, 1 | |||
} | |||
sum, _ := decimal.NewFromString(appreciationBase.Sum) //总资产 | |||
flowSum, _ := decimal.NewFromString(appreciationBase.FlowSum) //流通资产 | |||
value, _ = sum.Div(flowSum).RoundFloor(4).Float64() | |||
return | |||
} | |||
//DealTransferIn 处理转入 | |||
func DealTransferIn(session *xorm.Session, amount float64) (err error, value float64) { | |||
amountValue := decimal.NewFromFloat(amount) | |||
err, nowValue := CalcAppreciationValue(session) | |||
if err != nil { | |||
return | |||
} | |||
nowValueF := decimal.NewFromFloat(nowValue) | |||
value, _ = amountValue.Div(nowValueF).Float64() | |||
return | |||
} | |||
// DealWithdrawalAndDestroy 处理给用户提现 | |||
func DealWithdrawalAndDestroy(session *xorm.Session, feeMap md.DealWithdrawalFeeResp, transferOut float64) (err error, resp md.DealWithdrawalAndDestroyResp) { | |||
transferOutValue := decimal.NewFromFloat(transferOut).Mul(decimal.NewFromFloat(feeMap.WithdrawalCommissionFee)) | |||
destroyValue := decimal.NewFromFloat(transferOut).Mul(decimal.NewFromFloat(feeMap.WithdrawalDestroyFee)) | |||
refluxValue := decimal.NewFromFloat(transferOut).Mul(decimal.NewFromFloat(feeMap.WithdrawalRefluxFee)) | |||
err, nowValue := CalcAppreciationValue(session) | |||
if err != nil { | |||
return | |||
} | |||
resp.TransferOut = transferOut | |||
resp.Price = nowValue | |||
resp.TransferOutValue, _ = decimal.NewFromFloat(transferOut).Mul(decimal.NewFromFloat(nowValue)).Float64() | |||
resp.AmountOut, _ = transferOutValue.Mul(decimal.NewFromFloat(nowValue)).Float64() | |||
resp.DestroyValue, _ = destroyValue.Float64() | |||
resp.RefluxValue, _ = refluxValue.Float64() | |||
return | |||
} |