@@ -0,0 +1,157 @@ | |||
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" | |||
zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx" | |||
"errors" | |||
"fmt" | |||
"reflect" | |||
"xorm.io/xorm" | |||
) | |||
// BatchSelectIntegralReleases 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `IntegralReleaseFindByParams` 方法 | |||
func BatchSelectIntegralReleases(Db *xorm.Engine, params map[string]interface{}) (*[]model.IntegralReleaseBasic, error) { | |||
var IntegralReleaseData []model.IntegralReleaseBasic | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]). | |||
Find(&IntegralReleaseData); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &IntegralReleaseData, nil | |||
} | |||
// IntegralReleaseInsert 插入单条数据 | |||
func IntegralReleaseInsert(Db *xorm.Engine, IntegralRelease *model.IntegralReleaseBasic) (int, error) { | |||
_, err := Db.InsertOne(IntegralRelease) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return IntegralRelease.Id, nil | |||
} | |||
// BatchAddIntegralReleases 批量新增数据 | |||
func BatchAddIntegralReleases(Db *xorm.Engine, IntegralReleaseData []*model.IntegralReleaseBasic) (int64, error) { | |||
affected, err := Db.Insert(IntegralReleaseData) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
func GetIntegralReleaseCount(Db *xorm.Engine) int { | |||
var IntegralRelease model.IntegralReleaseBasic | |||
session := Db.Where("") | |||
count, err := session.Count(&IntegralRelease) | |||
if err != nil { | |||
return 0 | |||
} | |||
return int(count) | |||
} | |||
// IntegralReleaseDelete 删除记录 | |||
func IntegralReleaseDelete(Db *xorm.Engine, id interface{}) (int64, error) { | |||
if reflect.TypeOf(id).Kind() == reflect.Slice { | |||
return Db.In("id", id).Delete(model.IntegralReleaseBasic{}) | |||
} else { | |||
return Db.Where("id = ?", id).Delete(model.IntegralReleaseBasic{}) | |||
} | |||
} | |||
// IntegralReleaseUpdate 更新记录 | |||
func IntegralReleaseUpdate(session *xorm.Session, id interface{}, IntegralRelease *model.IntegralReleaseBasic, forceColums ...string) (int64, error) { | |||
var ( | |||
affected int64 | |||
err error | |||
) | |||
if forceColums != nil { | |||
affected, err = session.Where("id=?", id).Cols(forceColums...).Update(IntegralRelease) | |||
} else { | |||
affected, err = session.Where("id=?", id).Update(IntegralRelease) | |||
} | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
// IntegralReleaseGetOneByParams 通过传入的参数查询数据(单条) | |||
func IntegralReleaseGetOneByParams(session *xorm.Session, params map[string]interface{}) (*model.IntegralReleaseBasic, error) { | |||
var m model.IntegralReleaseBasic | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
has, err := session.Where(query, params["value"]).Get(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
if has == false { | |||
return nil, errors.New("未查询到相应的 block_star_chain 记录") | |||
} | |||
return &m, nil | |||
} | |||
// IntegralReleaseFindByParams 通过传入的参数查询数据(多条) | |||
func IntegralReleaseFindByParams(Db *xorm.Engine, params map[string]interface{}) (*[]model.IntegralReleaseBasic, error) { | |||
var m []model.IntegralReleaseBasic | |||
if params["value"] == nil { | |||
return nil, errors.New("参数有误") | |||
} | |||
if params["key"] == nil { | |||
//查询全部数据 | |||
err := Db.Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} else { | |||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||
//指定In查询 | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &m, nil | |||
} else { | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
err := Db.Where(query, params["value"]).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
} | |||
} | |||
func IntegralReleaseFindByParamsByPage(Db *xorm.Engine, params map[string]interface{}, page, pageSize int) (*[]model.IntegralReleaseBasic, error) { | |||
var m []model.IntegralReleaseBasic | |||
if params["value"] == nil { | |||
return nil, errors.New("参数有误") | |||
} | |||
if page == 0 && pageSize == 0 { | |||
page = 1 | |||
pageSize = 10 | |||
} | |||
if params["key"] == nil { | |||
//查询全部数据 | |||
err := Db.Limit(pageSize, (page-1)*pageSize).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} else { | |||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||
//指定In查询 | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Limit(pageSize, (page-1)*pageSize).Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &m, nil | |||
} else { | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
err := Db.Where(query, params["value"]).Limit(pageSize, (page-1)*pageSize).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
} | |||
} |
@@ -0,0 +1,157 @@ | |||
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" | |||
zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx" | |||
"errors" | |||
"fmt" | |||
"reflect" | |||
"xorm.io/xorm" | |||
) | |||
// BatchSelectIntegralReleaseUserWithOrds 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `IntegralReleaseUserWithOrdFindByParams` 方法 | |||
func BatchSelectIntegralReleaseUserWithOrds(Db *xorm.Engine, params map[string]interface{}) (*[]model.IntegralReleaseUserWithOrd, error) { | |||
var IntegralReleaseUserWithOrdData []model.IntegralReleaseUserWithOrd | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]). | |||
Find(&IntegralReleaseUserWithOrdData); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &IntegralReleaseUserWithOrdData, nil | |||
} | |||
// IntegralReleaseUserWithOrdInsert 插入单条数据 | |||
func IntegralReleaseUserWithOrdInsert(Db *xorm.Engine, IntegralReleaseUserWithOrd *model.IntegralReleaseUserWithOrd) (int, error) { | |||
_, err := Db.InsertOne(IntegralReleaseUserWithOrd) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return IntegralReleaseUserWithOrd.Id, nil | |||
} | |||
// BatchAddIntegralReleaseUserWithOrds 批量新增数据 | |||
func BatchAddIntegralReleaseUserWithOrds(Db *xorm.Engine, IntegralReleaseUserWithOrdData []*model.IntegralReleaseUserWithOrd) (int64, error) { | |||
affected, err := Db.Insert(IntegralReleaseUserWithOrdData) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
func GetIntegralReleaseUserWithOrdCount(Db *xorm.Engine) int { | |||
var IntegralReleaseUserWithOrd model.IntegralReleaseUserWithOrd | |||
session := Db.Where("") | |||
count, err := session.Count(&IntegralReleaseUserWithOrd) | |||
if err != nil { | |||
return 0 | |||
} | |||
return int(count) | |||
} | |||
// IntegralReleaseUserWithOrdDelete 删除记录 | |||
func IntegralReleaseUserWithOrdDelete(Db *xorm.Engine, id interface{}) (int64, error) { | |||
if reflect.TypeOf(id).Kind() == reflect.Slice { | |||
return Db.In("id", id).Delete(model.IntegralReleaseUserWithOrd{}) | |||
} else { | |||
return Db.Where("id = ?", id).Delete(model.IntegralReleaseUserWithOrd{}) | |||
} | |||
} | |||
// IntegralReleaseUserWithOrdUpdate 更新记录 | |||
func IntegralReleaseUserWithOrdUpdate(session *xorm.Session, id interface{}, IntegralReleaseUserWithOrd *model.IntegralReleaseUserWithOrd, forceColums ...string) (int64, error) { | |||
var ( | |||
affected int64 | |||
err error | |||
) | |||
if forceColums != nil { | |||
affected, err = session.Where("id=?", id).Cols(forceColums...).Update(IntegralReleaseUserWithOrd) | |||
} else { | |||
affected, err = session.Where("id=?", id).Update(IntegralReleaseUserWithOrd) | |||
} | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
// IntegralReleaseUserWithOrdGetOneByParams 通过传入的参数查询数据(单条) | |||
func IntegralReleaseUserWithOrdGetOneByParams(session *xorm.Session, params map[string]interface{}) (*model.IntegralReleaseUserWithOrd, error) { | |||
var m model.IntegralReleaseUserWithOrd | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
has, err := session.Where(query, params["value"]).Get(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
if has == false { | |||
return nil, errors.New("未查询到相应的 block_star_chain 记录") | |||
} | |||
return &m, nil | |||
} | |||
// IntegralReleaseUserWithOrdFindByParams 通过传入的参数查询数据(多条) | |||
func IntegralReleaseUserWithOrdFindByParams(session *xorm.Session, params map[string]interface{}) (*[]model.IntegralReleaseUserWithOrd, error) { | |||
var m []model.IntegralReleaseUserWithOrd | |||
if params["value"] == nil { | |||
return nil, errors.New("参数有误") | |||
} | |||
if params["key"] == nil { | |||
//查询全部数据 | |||
err := session.Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} else { | |||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||
//指定In查询 | |||
if err := session.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &m, nil | |||
} else { | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
err := session.Where(query, params["value"]).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
} | |||
} | |||
func IntegralReleaseUserWithOrdFindByParamsByPage(Db *xorm.Engine, params map[string]interface{}, page, pageSize int) (*[]model.IntegralReleaseUserWithOrd, error) { | |||
var m []model.IntegralReleaseUserWithOrd | |||
if params["value"] == nil { | |||
return nil, errors.New("参数有误") | |||
} | |||
if page == 0 && pageSize == 0 { | |||
page = 1 | |||
pageSize = 10 | |||
} | |||
if params["key"] == nil { | |||
//查询全部数据 | |||
err := Db.Limit(pageSize, (page-1)*pageSize).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} else { | |||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||
//指定In查询 | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Limit(pageSize, (page-1)*pageSize).Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &m, nil | |||
} else { | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
err := Db.Where(query, params["value"]).Limit(pageSize, (page-1)*pageSize).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
} | |||
} |
@@ -0,0 +1,157 @@ | |||
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" | |||
zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx" | |||
"errors" | |||
"fmt" | |||
"reflect" | |||
"xorm.io/xorm" | |||
) | |||
// BatchSelectIntegralReleaseUserWithOrdFlows 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `IntegralReleaseUserWithOrdFlowFindByParams` 方法 | |||
func BatchSelectIntegralReleaseUserWithOrdFlows(Db *xorm.Engine, params map[string]interface{}) (*[]model.IntegralReleaseUserWithOrdFlow, error) { | |||
var IntegralReleaseUserWithOrdFlowData []model.IntegralReleaseUserWithOrdFlow | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]). | |||
Find(&IntegralReleaseUserWithOrdFlowData); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &IntegralReleaseUserWithOrdFlowData, nil | |||
} | |||
// IntegralReleaseUserWithOrdFlowInsert 插入单条数据 | |||
func IntegralReleaseUserWithOrdFlowInsert(session *xorm.Session, IntegralReleaseUserWithOrdFlow *model.IntegralReleaseUserWithOrdFlow) (int, error) { | |||
_, err := session.InsertOne(IntegralReleaseUserWithOrdFlow) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return IntegralReleaseUserWithOrdFlow.Id, nil | |||
} | |||
// BatchAddIntegralReleaseUserWithOrdFlows 批量新增数据 | |||
func BatchAddIntegralReleaseUserWithOrdFlows(Db *xorm.Engine, IntegralReleaseUserWithOrdFlowData []*model.IntegralReleaseUserWithOrdFlow) (int64, error) { | |||
affected, err := Db.Insert(IntegralReleaseUserWithOrdFlowData) | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
func GetIntegralReleaseUserWithOrdFlowCount(Db *xorm.Engine) int { | |||
var IntegralReleaseUserWithOrdFlow model.IntegralReleaseUserWithOrdFlow | |||
session := Db.Where("") | |||
count, err := session.Count(&IntegralReleaseUserWithOrdFlow) | |||
if err != nil { | |||
return 0 | |||
} | |||
return int(count) | |||
} | |||
// IntegralReleaseUserWithOrdFlowDelete 删除记录 | |||
func IntegralReleaseUserWithOrdFlowDelete(Db *xorm.Engine, id interface{}) (int64, error) { | |||
if reflect.TypeOf(id).Kind() == reflect.Slice { | |||
return Db.In("id", id).Delete(model.IntegralReleaseUserWithOrdFlow{}) | |||
} else { | |||
return Db.Where("id = ?", id).Delete(model.IntegralReleaseUserWithOrdFlow{}) | |||
} | |||
} | |||
// IntegralReleaseUserWithOrdFlowUpdate 更新记录 | |||
func IntegralReleaseUserWithOrdFlowUpdate(session *xorm.Session, id interface{}, IntegralReleaseUserWithOrdFlow *model.IntegralReleaseUserWithOrdFlow, forceColums ...string) (int64, error) { | |||
var ( | |||
affected int64 | |||
err error | |||
) | |||
if forceColums != nil { | |||
affected, err = session.Where("id=?", id).Cols(forceColums...).Update(IntegralReleaseUserWithOrdFlow) | |||
} else { | |||
affected, err = session.Where("id=?", id).Update(IntegralReleaseUserWithOrdFlow) | |||
} | |||
if err != nil { | |||
return 0, err | |||
} | |||
return affected, nil | |||
} | |||
// IntegralReleaseUserWithOrdFlowGetOneByParams 通过传入的参数查询数据(单条) | |||
func IntegralReleaseUserWithOrdFlowGetOneByParams(session *xorm.Session, params map[string]interface{}) (*model.IntegralReleaseUserWithOrdFlow, error) { | |||
var m model.IntegralReleaseUserWithOrdFlow | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
has, err := session.Where(query, params["value"]).Get(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
if has == false { | |||
return nil, errors.New("未查询到相应的 block_star_chain 记录") | |||
} | |||
return &m, nil | |||
} | |||
// IntegralReleaseUserWithOrdFlowFindByParams 通过传入的参数查询数据(多条) | |||
func IntegralReleaseUserWithOrdFlowFindByParams(Db *xorm.Engine, params map[string]interface{}) (*[]model.IntegralReleaseUserWithOrdFlow, error) { | |||
var m []model.IntegralReleaseUserWithOrdFlow | |||
if params["value"] == nil { | |||
return nil, errors.New("参数有误") | |||
} | |||
if params["key"] == nil { | |||
//查询全部数据 | |||
err := Db.Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} else { | |||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||
//指定In查询 | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &m, nil | |||
} else { | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
err := Db.Where(query, params["value"]).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
} | |||
} | |||
func IntegralReleaseUserWithOrdFlowFindByParamsByPage(Db *xorm.Engine, params map[string]interface{}, page, pageSize int) (*[]model.IntegralReleaseUserWithOrdFlow, error) { | |||
var m []model.IntegralReleaseUserWithOrdFlow | |||
if params["value"] == nil { | |||
return nil, errors.New("参数有误") | |||
} | |||
if page == 0 && pageSize == 0 { | |||
page = 1 | |||
pageSize = 10 | |||
} | |||
if params["key"] == nil { | |||
//查询全部数据 | |||
err := Db.Limit(pageSize, (page-1)*pageSize).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} else { | |||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||
//指定In查询 | |||
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Limit(pageSize, (page-1)*pageSize).Find(&m); err != nil { | |||
return nil, zhios_order_relate_logx.Warn(err) | |||
} | |||
return &m, nil | |||
} else { | |||
var query = fmt.Sprintf("%s =?", params["key"]) | |||
err := Db.Where(query, params["value"]).Limit(pageSize, (page-1)*pageSize).Find(&m) | |||
if err != nil { | |||
return nil, zhios_order_relate_logx.Error(err) | |||
} | |||
return &m, nil | |||
} | |||
} | |||
} |
@@ -0,0 +1,22 @@ | |||
package model | |||
import ( | |||
"time" | |||
) | |||
type IntegralReleaseBasic 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)"` | |||
Coin1 int `json:"coin_1" xorm:"not null default 0 comment('coinId_1(类似于红积分)') INT(11)"` | |||
Coin2 int `json:"coin_2" xorm:"not null default 0 comment('coinId_2(类似于绿积分)') INT(11)"` | |||
RegisterGiveCoinNum string `json:"register_give_coin_num" xorm:"not null default 0.0000 comment('注册赠送积分数量') DECIMAL(10,4)"` | |||
SignInReleaseRatio string `json:"sign_in_release_ratio" xorm:"not null default 0.0000 comment('签到释放比例') DECIMAL(10,4)"` | |||
BusinessDiscountSet string `json:"business_discount_set" xorm:"not null comment('商家让利释放速度设置') TEXT"` | |||
AlipayServiceChargeRate string `json:"alipay_service_charge_rate" xorm:"not null default 0.0000 comment('支付宝手续费比例') DECIMAL(10,4)"` | |||
TaxRevenueRate string `json:"tax_revenue_rate" xorm:"not null default 0.0000 comment('税收比例') DECIMAL(10,4)"` | |||
OperatingExpenseRate string `json:"operating_expense_rate" xorm:"not null default 0.0000 comment('服务费比例') DECIMAL(10,4)"` | |||
ReleaseDate string `json:"release_date" xorm:"not null default '0000-00-00' comment('释放日期') VARCHAR(50)"` | |||
Ext string `json:"ext" xorm:"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"` | |||
} |
@@ -0,0 +1,18 @@ | |||
package model | |||
import ( | |||
"time" | |||
) | |||
type IntegralReleaseUserWithOrd struct { | |||
Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"` | |||
Uid int `json:"uid" xorm:"not null default 0 comment('uid') INT(11)"` | |||
OrdId string `json:"ord_id" xorm:"not null default '0' comment('订单号') VARCHAR(100)"` | |||
Pvd int `json:"pvd" xorm:"not null default 0 comment('平台(0:注册)') TINYINT(3)"` | |||
TotalRedCoinNum string `json:"total_red_coin_num" xorm:"not null default 0.0000 comment('总红积分数量') DECIMAL(10,4)"` | |||
ReleasedGreenCoinNum string `json:"released_green_coin_num" xorm:"not null default 0.0000 comment('已释放绿积分数量') DECIMAL(10,4)"` | |||
OrdDiscountRatio string `json:"ord_discount_ratio" xorm:"not null default 0.0000 comment('让利百分比') DECIMAL(10,4)"` | |||
State int `json:"state" xorm:"not null default '1' comment('状态(1:正常 2:异常)') TINYINT(1)"` | |||
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"` | |||
} |
@@ -0,0 +1,20 @@ | |||
package model | |||
import ( | |||
"time" | |||
) | |||
type IntegralReleaseUserWithOrdFlow struct { | |||
Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"` | |||
Uid int `json:"uid" xorm:"not null default 0 comment('uid') INT(11)"` | |||
OrdId string `json:"ord_id" xorm:"not null default '0' comment('订单号') VARCHAR(100)"` | |||
Pvd int `json:"pvd" xorm:"not null default 0 comment('平台(0:注册)') TINYINT(3)"` | |||
TotalRedCoinNum string `json:"total_red_coin_num" xorm:"not null default 0.0000 comment('总红积分数量') DECIMAL(10,4)"` | |||
ReleasedGreenCoinNumBefore string `json:"released_green_coin_num_before" xorm:"not null default 0.0000 comment('已释放绿积分数量-之前') DECIMAL(10,4)"` | |||
ReleasedGreenCoinNumAfter string `json:"released_green_coin_num_after" xorm:"not null default 0.0000 comment('已释放绿积分数量-之后') DECIMAL(10,4)"` | |||
ReleaseGreenCoinNum string `json:"release_green_coin_num" xorm:"not null default 0.0000 comment('释放绿积分数量') DECIMAL(10,4)"` | |||
ReleaseRateDay string `json:"release_rate_day" xorm:"not null default 0.0000 comment('日释放系数') DECIMAL(10,4)"` | |||
ReleaseDate string `json:"release_date" xorm:"not null default '0000-00-00' comment('释放日期') VARCHAR(50)"` | |||
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"` | |||
} |
@@ -0,0 +1,7 @@ | |||
package md | |||
// BusinessDiscountSet 商家让利释放速度设置 | |||
type BusinessDiscountSet struct { | |||
Range []float64 `json:"range"` // 范围 | |||
ReleaseSpeed string `json:"release_speed"` // 释放速度 | |||
} |
@@ -0,0 +1,270 @@ | |||
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" | |||
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc" | |||
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" | |||
"encoding/json" | |||
"errors" | |||
"fmt" | |||
"github.com/shopspring/decimal" | |||
"strconv" | |||
"time" | |||
"xorm.io/xorm" | |||
) | |||
func InitForIntegralRelease(redisAddr string) (err error) { | |||
if redisAddr != "" { | |||
cache.NewRedis(redisAddr) | |||
} | |||
_, err = cache.SelectDb(md.RedisDataBase) | |||
return | |||
} | |||
const PessimismLockKeyForIntegralRelease = "daily_settlement_integral_release_pessimism_lock_key" | |||
const PessimismLockValueForIntegralRelease = "running" | |||
const DealUserCoinForIntegralReleaseRequestIdPrefix = "%s:integral_release_deal_user_coin:%d:uid:%d" | |||
// DailySettlementIntegralRelease 每日结算“积分释放” | |||
func DailySettlementIntegralRelease(engine *xorm.Engine, mid string, isTask bool) (err error) { | |||
session := engine.NewSession() | |||
defer func() { | |||
session.Close() | |||
if err := recover(); err != nil { | |||
_ = zhios_order_relate_logx.Error(err) | |||
} | |||
}() | |||
session.Begin() | |||
now := time.Now() | |||
today := now.Format("2006-01-02") | |||
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", now.Hour()) | |||
if isTask && (now.Hour() > 8) { | |||
//TODO::只在凌晨一点 ~ 凌晨 8 点运行 | |||
return errors.New("非运行时间") | |||
} | |||
//1、查找 `integral_release` 基础设置 | |||
integralRelease, err := db.IntegralReleaseGetOneByParams(session, map[string]interface{}{ | |||
"key": "is_use", | |||
"value": 1, | |||
}) | |||
if err != nil { | |||
_ = session.Rollback() | |||
return err | |||
} | |||
if integralRelease.ReleaseDate == today { | |||
_ = session.Rollback() | |||
return errors.New("今日“积分释放”已结算") | |||
} | |||
//TODO::增加“悲观锁”防止串行 | |||
getString, _ := cache.GetString(PessimismLockKeyForIntegralRelease) | |||
if getString == PessimismLockValueForIntegralRelease { | |||
fmt.Println("-----------------", "上一次结算未执行完") | |||
return errors.New("上一次结算未执行完") | |||
} | |||
cache.SetEx(PessimismLockKeyForIntegralRelease, PessimismLockValueForIntegralRelease, 3600*8) //8小时 | |||
//TODO::关闭系统 | |||
zhios_order_relate_utils.CurlPost("http://zhios-app:5000/api/v1/check_app_over_time", map[string]string{ | |||
"mid": mid, | |||
"is_close": "1", | |||
}, map[string]string{}) | |||
//2、查询所有 `integral_release_user_with_ord` 记录 | |||
integralReleaseUserWithOrds, err := db.IntegralReleaseUserWithOrdFindByParams(session, map[string]interface{}{ | |||
"state": "is_use", | |||
"value": 1, | |||
}) | |||
for _, ord := range *integralReleaseUserWithOrds { | |||
//计算释放系数 | |||
err, releaseSpeed := calcReleaseRate(integralRelease, zhios_order_relate_utils.StrToFloat64(ord.OrdDiscountRatio)) | |||
if err != nil { | |||
_ = session.Rollback() | |||
return err | |||
} | |||
releaseRate, _ := decimal.NewFromString(releaseSpeed) | |||
//释放绿积分 | |||
err = ReleaseGreenCoinForUser(session, mid, integralRelease, &ord, releaseRate) | |||
if err != nil { | |||
_ = session.Rollback() | |||
return err | |||
} | |||
} | |||
//3、提交事务 | |||
err = session.Commit() | |||
if err != nil { | |||
_ = session.Rollback() | |||
return errors.New("事务提交失败") | |||
} | |||
zhios_order_relate_utils.CurlPost("http://zhios-app:5000/api/v1/check_app_over_time", map[string]string{ | |||
"mid": mid, | |||
"is_close": "0", | |||
}, map[string]string{}) | |||
//cache.Del(PessimismLockKeyForIntegralRelease) | |||
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>绿色积分结束<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") | |||
return nil | |||
} | |||
// calcReleaseRate 计算释放系数 | |||
func calcReleaseRate(integralReleaseBasic *model.IntegralReleaseBasic, ordDiscountRatio float64) (err error, releaseSpeed string) { | |||
var businessDiscountSet []*md.BusinessDiscountSet | |||
if err := json.Unmarshal([]byte(integralReleaseBasic.BusinessDiscountSet), &businessDiscountSet); err != nil { | |||
return zhios_order_relate_logx.Warn("解析【商家让利释放速度设置】出错"), releaseSpeed | |||
} | |||
for _, value := range businessDiscountSet { | |||
if value.Range[0] <= ordDiscountRatio && ordDiscountRatio <= value.Range[1] { | |||
releaseSpeed = value.ReleaseSpeed | |||
} | |||
} | |||
return nil, releaseSpeed | |||
} | |||
// ReleaseGreenCoinForUser 释放绿积分 | |||
func ReleaseGreenCoinForUser(session *xorm.Session, mid string, integralReleaseBasic *model.IntegralReleaseBasic, integralReleaseUserWithOrd *model.IntegralReleaseUserWithOrd, releaseSpeed decimal.Decimal) error { | |||
//1、计算需要释放多少绿积分 | |||
totalRedCoinNum, _ := decimal.NewFromString(integralReleaseUserWithOrd.TotalRedCoinNum) | |||
releasedGreenCoinNum, _ := decimal.NewFromString(integralReleaseUserWithOrd.ReleasedGreenCoinNum) | |||
releaseCoinNum := totalRedCoinNum.Sub(releasedGreenCoinNum).Mul(releaseSpeed) | |||
//2、释放绿积分 | |||
var title = md.IntegralReleaseGreenCoinGrantByOrdTitleForUserVirtualCoinFlow | |||
var transferType = md.IntegralReleaseGreenCoinGrantByOrdTransferTypeForUserVirtualCoinFlow | |||
if integralReleaseUserWithOrd.Pvd == 0 { | |||
title = md.IntegralReleaseGreenCoinGrantBySignInTitleForUserVirtualCoinFlow | |||
transferType = md.IntegralReleaseGreenCoinGrantBySignInTransferTypeForUserVirtualCoinFlow | |||
} | |||
err := DealUserCoinForIntegralRelease(session, md.DealUserCoinReq{ | |||
Kind: "add", | |||
Mid: mid, | |||
Title: title, | |||
TransferType: transferType, | |||
OrdId: integralReleaseUserWithOrd.OrdId, | |||
CoinId: integralReleaseBasic.Coin2, | |||
Uid: integralReleaseUserWithOrd.Uid, | |||
Amount: zhios_order_relate_utils.StrToFloat64(releaseCoinNum.String()), | |||
}) | |||
if err != nil { | |||
return err | |||
} | |||
releasedGreenCoinNumBefore, _ := decimal.NewFromString(integralReleaseUserWithOrd.ReleasedGreenCoinNum) | |||
releasedGreenCoinNumAfter := releasedGreenCoinNumBefore.Add(releaseCoinNum) | |||
//3、更改`integral_release_user_with_ord`记录 | |||
integralReleaseUserWithOrd.ReleasedGreenCoinNum = releasedGreenCoinNumAfter.String() | |||
updateAffected, err := db.IntegralReleaseUserWithOrdUpdate(session, integralReleaseUserWithOrd.Id, integralReleaseUserWithOrd) | |||
if err != nil { | |||
return err | |||
} | |||
if updateAffected == 0 { | |||
err = errors.New("更新 integral_release_user_with_ord 记录失败") | |||
return err | |||
} | |||
//4、插入`integral_release_user_with_ord_flow`记录 | |||
now := time.Now() | |||
var integralReleaseUserWithOrdFlow = model.IntegralReleaseUserWithOrdFlow{ | |||
Uid: integralReleaseUserWithOrd.Uid, | |||
OrdId: integralReleaseUserWithOrd.OrdId, | |||
Pvd: integralReleaseUserWithOrd.Pvd, | |||
TotalRedCoinNum: integralReleaseUserWithOrd.TotalRedCoinNum, | |||
ReleasedGreenCoinNumBefore: releasedGreenCoinNumBefore.String(), | |||
ReleasedGreenCoinNumAfter: releasedGreenCoinNumAfter.String(), | |||
ReleaseGreenCoinNum: releaseCoinNum.String(), | |||
ReleaseRateDay: releaseSpeed.String(), | |||
ReleaseDate: now.Format("2006-01-02"), | |||
CreateAt: now, | |||
UpdateAt: now, | |||
} | |||
_, err = db.IntegralReleaseUserWithOrdFlowInsert(session, &integralReleaseUserWithOrdFlow) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} | |||
// DealUserCoinForIntegralRelease 处理给用户虚拟币积分 | |||
func DealUserCoinForIntegralRelease(session *xorm.Session, req md.DealUserCoinReq) (err error) { | |||
if req.Amount < 0 { | |||
req.Amount = 0 | |||
} | |||
//1、分布式锁阻拦 | |||
requestIdPrefix := fmt.Sprintf(DealUserCoinForIntegralReleaseRequestIdPrefix, req.Mid, req.CoinId, req.Uid) | |||
cb, err := svc.HandleDistributedLock(req.Mid, strconv.Itoa(req.Uid), requestIdPrefix) | |||
if err != nil { | |||
return err | |||
} | |||
if cb != nil { | |||
defer cb() // 释放锁 | |||
} | |||
//2、计算&&组装数据 | |||
now := time.Now() | |||
coinAmount, err := svc.GetUserCoinAmount(session, req.Mid, req.CoinId, req.Uid) | |||
if err != nil { | |||
return err | |||
} | |||
coinAmountValue := decimal.NewFromFloat(zhios_order_relate_utils.StrToFloat64(coinAmount)) | |||
amountValue := decimal.NewFromFloat(req.Amount).RoundFloor(4) | |||
var userVirtualCoinFlow model.UserVirtualCoinFlow | |||
userVirtualCoinFlow.CoinId = req.CoinId | |||
userVirtualCoinFlow.Title = req.Title | |||
userVirtualCoinFlow.TransferType = req.TransferType | |||
userVirtualCoinFlow.Uid = req.Uid | |||
userVirtualCoinFlow.ToUid = req.ToUid | |||
userVirtualCoinFlow.OrdId = req.OrdId | |||
userVirtualCoinFlow.BeforeAmout = coinAmount | |||
userVirtualCoinFlow.Amout = amountValue.String() | |||
userVirtualCoinFlow.CreateTime = now | |||
if req.Kind == "add" { | |||
userVirtualCoinFlow.Direction = 1 | |||
userVirtualCoinFlow.AfterAmout = coinAmountValue.Add(amountValue).RoundFloor(4).String() | |||
} else if req.Kind == "sub" { | |||
userVirtualCoinFlow.Direction = 2 | |||
userVirtualCoinFlow.AfterAmout = coinAmountValue.Sub(amountValue).RoundFloor(4).String() | |||
} else { | |||
err = errors.New("错误的kind类型") | |||
return err | |||
} | |||
if zhios_order_relate_utils.StrToFloat64(userVirtualCoinFlow.AfterAmout) < 0 { | |||
var coin model.VirtualCoin | |||
_, err = session.Where("id = ?", req.CoinId).Get(&coin) | |||
if err != nil { | |||
return err | |||
} | |||
zhios_order_relate_utils.FilePutContents("virtual_coin_not", zhios_order_relate_utils.SerializeStr(map[string]interface{}{ | |||
"uid": userVirtualCoinFlow.Uid, | |||
"amount": userVirtualCoinFlow.Amout, | |||
"before_amount": userVirtualCoinFlow.BeforeAmout, | |||
"after_amount": userVirtualCoinFlow.AfterAmout, | |||
"coin_id": userVirtualCoinFlow.CoinId, | |||
})) | |||
return errors.New("用户" + zhios_order_relate_utils.IntToStr(userVirtualCoinFlow.Uid) + "的" + coin.Name + "不足") | |||
//userVirtualCoinFlow.AfterAmout = "0" | |||
} | |||
//3、插入 `user_virtual_coin_flow` 记录 | |||
_, err = db.UserVirtualCoinFlowInsert(session, &userVirtualCoinFlow) | |||
if err != nil { | |||
return err | |||
} | |||
//4、修改 `user_virtual_amount`的amount值 && 及缓存 | |||
err = svc.SetCacheUserVirtualAmount(session, req.Mid, userVirtualCoinFlow.AfterAmout, req.CoinId, req.Uid, true) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} |