123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- package logic
- import (
- "context"
- "fmt"
- "time"
- . "app.yhyue.com/moapp/jybase/date"
- . "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/internal/entity"
- "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/internal/svc"
- "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/pb"
- "github.com/zeromicro/go-zero/core/logx"
- )
- type DeductionLogic struct {
- ctx context.Context
- svcCtx *svc.ServiceContext
- logx.Logger
- }
- func NewDeductionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeductionLogic {
- return &DeductionLogic{
- ctx: ctx,
- svcCtx: svcCtx,
- Logger: logx.WithContext(ctx),
- }
- }
- //资源扣减
- func (l *DeductionLogic) Deduction(in *pb.DeductionReq) (*pb.Resp, error) {
- l.Info("资源扣减请求参数", fmt.Sprintf("%+v", in))
- resp := &pb.Resp{}
- if in.Appid == "" {
- l.Error(fmt.Sprintf("%+v", in), "无效的参数appid")
- return resp, nil
- } else if in.FunctionCode == "" {
- l.Error(fmt.Sprintf("%+v", in), "无效的参数function_code")
- return resp, nil
- } else if in.Count <= 0 {
- l.Error(fmt.Sprintf("%+v", in), "无效的参数count")
- return resp, nil
- } else if in.UserId == 0 && in.EntId == 0 {
- l.Error(fmt.Sprintf("%+v", in), "无效的参数user_id、ent_id")
- return resp, nil
- }
- function := Base_function.FindByCode(in.Appid, in.FunctionCode)
- if function == nil {
- l.Error(fmt.Sprintf("%+v", in), "功能原始表中没有找到该功能")
- return resp, nil
- }
- myPowers := Base_power.FindMyPower(in.Appid, in.FunctionCode, in.UserId, in.EntId)
- if myPowers == nil || len(*myPowers) == 0 {
- resp.Status = -1
- l.Error(fmt.Sprintf("%+v", in), "功能权益表中没有找到权益记录")
- return resp, nil
- }
- use_values, detail_values := []interface{}{}, [][]interface{}{}
- update := [][]interface{}{}
- surplus_count := int64(-1)
- deduct_count := in.Count
- user_id, ent_id := int64(0), int64(0)
- if function.Power_rule == 2 { //周期+数量
- my_surplus_count := int64(0)
- for _, v := range *myPowers {
- if v.Surplus_count <= 0 {
- continue
- }
- if deduct_count > 0 {
- if v.Power_type == 1 {
- user_id = v.Power_ofid
- } else if v.Power_type == 2 {
- ent_id = v.Power_ofid
- } else {
- continue
- }
- this_deduct_count := deduct_count
- if v.Surplus_count >= deduct_count { //本次记录的数据足够扣减
- v.Surplus_count -= deduct_count
- deduct_count = 0
- } else { //本次不够扣减,把本次的扣完,进入下次扣减
- v.Surplus_count = 0
- this_deduct_count = v.Surplus_count
- deduct_count -= v.Surplus_count
- }
- update = append(update, []interface{}{v.Id, v.Surplus_count, NowFormat(Date_Full_Layout)})
- detail_values = append(detail_values, []interface{}{in.Appid, v.Id, v.Surplus_count, this_deduct_count, NowFormat(Date_Full_Layout)})
- }
- my_surplus_count += v.Surplus_count
- }
- //剩余的总数成功完成了本次的扣减
- if deduct_count == 0 {
- surplus_count = my_surplus_count
- }
- } else if function.Power_rule == 3 { //周期+频率+数量
- for _, v := range *myPowers {
- use, err := Base_resource_use.FindLastOne(in.Appid, in.FunctionCode, in.UserId, in.EntId, v.Power_type)
- if err != nil {
- l.Error(fmt.Sprintf("%+v", in), "查询资源使用记录失败", err)
- continue
- }
- if use != nil {
- create_time, err := time.ParseInLocation(Date_Full_Layout, use.Create_time, time.Local)
- if err != nil {
- l.Error(fmt.Sprintf("%+v", in), "资源充值/消耗表创建时间错误", create_time, err)
- continue
- }
- now := time.Now()
- if v.Limit_strategy == "1d" {
- if create_time.Year() == now.Year() && create_time.Month() == now.Month() && create_time.Day() == now.Day() {
- surplus_count = use.Surplus_count - in.Count
- } else {
- surplus_count = v.Strategy_count - in.Count
- }
- } else if v.Limit_strategy == "1m" {
- if create_time.Year() == now.Year() && create_time.Month() == now.Month() {
- surplus_count = use.Surplus_count - in.Count
- } else {
- surplus_count = v.Strategy_count - in.Count
- }
- } else {
- l.Error(fmt.Sprintf("%+v", in), "limit_strategy格式错误", v.Limit_strategy)
- continue
- }
- } else {
- surplus_count = v.Strategy_count - in.Count
- }
- if v.Power_type == 1 {
- user_id = v.Power_ofid
- } else if v.Power_type == 2 {
- ent_id = v.Power_ofid
- } else {
- continue
- }
- if surplus_count >= 0 {
- detail_values = append(detail_values, []interface{}{in.Appid, v.Id, surplus_count, in.Count, NowFormat(Date_Full_Layout)})
- break
- }
- }
- }
- if surplus_count < 0 {
- resp.Status = -2
- return resp, nil
- } else {
- use_values = append(use_values, in.Appid, ent_id, user_id, in.FunctionCode, 0, surplus_count, in.Count, NowFormat(Date_Full_Layout))
- }
- if len(use_values) > 0 && len(detail_values) > 0 && Base_resource_use.Deduction(use_values, detail_values, update) {
- resp.Status = 1
- return resp, nil
- }
- return resp, nil
- }
|