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 }