package service import ( "app.yhyue.com/moapp/jyResourcesCenter/entity" "app.yhyue.com/moapp/jyResourcesCenter/rpc/resourcesCenter" "app.yhyue.com/moapp/jybase/common" "strings" "time" ) // @Author jianghan // @Date 2025/2/7 // @Description 查询可扣费方式 func ChargeAccount(data *resourcesCenter.ChargeAccountReq) (resp *resourcesCenter.ChargeResp) { now := time.Now().Format("2006-01-02") jyOrm := entity.JyEngine.NewSession() centerOrm := entity.Engine.NewSession() var exportPower int _, err := jyOrm.Table("entniche_user").Cols("export_power").Where("id = ?", data.EntUserId).Get(&exportPower) if err != nil { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "人员数据定制权限查询失败"} } entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId}) var entNums int64 if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil { plan := (*entInfo)["plan"].(map[string]interface{}) entNums = common.Int64All(plan["current"]) } else { return &resourcesCenter.ChargeResp{Code: entity.SuccessCode, Message: "未查询到企业数据流量"} } var personNums int64 _, err = centerOrm.Table("account_resources").Select("sum(number) as number"). Where("accountId = ? and endTime >= ? and resourceType = ?", data.UserId, now, "高级字段包").Get(&personNums) if err != nil { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人流量包查询失败"} } if exportPower == 1 && (entNums > 0 || personNums == 0) { // 企业流量包扣除 var personLimit []*entity.PersonLimit err = jyOrm.Table("entniche_export_limit").Select("*"). Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit) if err != nil || personLimit == nil || len(personLimit) == 0 { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业个人账号限额查询失败"} } return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Data: &resourcesCenter.SomeInfo{ ChargeType: 0, Num1: entNums, Num2: personLimit[0].DataLimit, Num3: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].DataLimit-personLimit[0].ExportNums)), Num4: personLimit[0].MaxNums, Num5: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].MaxNums-personLimit[0].AllExportNums)), }, } } else { // 个人高级字段包扣除 return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Data: &resourcesCenter.SomeInfo{ ChargeType: 1, Num1: personNums, }, } } } // @Author jianghan // @Date 2025/2/7 // @Description // // 剑鱼定制导出企业流量包扣费,优先使用企业流量包扣费(个人账号有权限且企业下有可导出数量) // 个人流量包扣费只使用 高级流量包余额 func ChargeFunc(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) { if data.ChargeType == 0 { // 扣除企业数据包 return entCharge(data) } else { // 扣除个人数据包 return personCharge(data) } } func entCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) { souceOrm := entity.Engine.NewSession() jyOrm := entity.JyEngine.NewSession() var personLimit []*entity.PersonLimit err := jyOrm.Table("entniche_export_limit").Select("*"). Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit) if err != nil || personLimit == nil || len(personLimit) == 0 { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业个人账号限额查询失败"} } var entNums int64 entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId}) if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil { plan := (*entInfo)["plan"].(map[string]interface{}) entNums = common.Int64All(plan["current"]) } else { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "未查询到企业数据流量"} } if entNums < data.DeductNum { return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Message: "", Data: &resourcesCenter.SomeInfo{ ChargeType: 0, ChargeResult: 0, FailMsg: "企业数据流量包余额不足", Num1: entNums, Num2: personLimit[0].DataLimit, Num3: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].DataLimit-personLimit[0].ExportNums)), Num4: personLimit[0].MaxNums, Num5: common.Int64All(common.If(personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0, 0, personLimit[0].MaxNums-personLimit[0].AllExportNums)), }, } } // 先更新mgo企业数据总量 query := map[string]interface{}{ "entid": data.EntId, "plan.current": map[string]interface{}{ "$gte": data.DeductNum, }, } update := map[string]interface{}{ "$inc": map[string]interface{}{ "plan.current": -data.DeductNum, }, } b = entity.Mgo.Update("user", query, update, false, false) if !b { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "企业余额操作失败"} } err = jyOrm.Begin() //更新限额 if err != nil { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"} } var updateNum = int64(0) if personLimit[0].DataLimit == 0 && personLimit[0].MaxNums == 0 { // 当前账号没有限额 updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ?", personLimit[0].Id). Incr("export_nums", data.ExportNum). Incr("all_export_nums", data.ExportNum).Update(&entity.PersonLimit{}) if err != nil || updateNum <= 0 { _ = jyOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"} } } else { updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ? and data_limit >= ?", personLimit[0].Id, data.DeductNum). Decr("data_limit", data.DeductNum). Decr("max_nums", data.DeductNum). Incr("export_nums", data.ExportNum). Incr("all_export_nums", data.ExportNum). Update(&entity.PersonLimit{}) if err != nil { _ = jyOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"} } if updateNum <= 0 { _ = jyOrm.Rollback() _ = jyOrm.Table("entniche_export_limit").Select("*"). Where("ent_id = ? and user_id = ?", data.EntId, data.EntUserId).Find(&personLimit) var msg []string if personLimit[0].DataLimit < data.DeductNum { msg = append(msg, "超出您的每日导出限额") } if personLimit[0].MaxNums < data.DeductNum { msg = append(msg, "超出您的数据导出总量限额") } return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Message: "", Data: &resourcesCenter.SomeInfo{ ChargeType: 0, ChargeResult: 0, FailMsg: common.ObjToString(common.If(len(msg) > 0, strings.Join(msg, "、"), "")), Num1: entNums, Num2: personLimit[0].DataLimit, Num3: personLimit[0].DataLimit - personLimit[0].ExportNums, Num4: personLimit[0].MaxNums, Num5: personLimit[0].MaxNums - personLimit[0].AllExportNums, }, } } } //保存账号使用明细 detailed := entity.Detailed{ AccountId: data.UserId, CompanyId: data.EntId, ResourceType: "高级字段包", Number: data.ExportNum, DeductionNumb: data.DeductNum, Name: "数据流包", CreateTime: time.Now().Local(), Remarks: data.Remark, UserType: 0, UserId: data.UserId, AccountType: 1, EntId: data.EntId, } updateNum, err = souceOrm.Table(ConsumeRecord).Insert(&detailed) if err != nil || updateNum <= 0 { _ = jyOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "账号使用明细保存失败"} } err = jyOrm.Commit() if err != nil { _ = jyOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败"} } return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Message: "", Data: &resourcesCenter.SomeInfo{ ChargeType: 0, ChargeResult: 1, Num1: entNums, Num2: personLimit[0].DataLimit, Num3: personLimit[0].DataLimit - personLimit[0].ExportNums, Num4: personLimit[0].MaxNums, Num5: personLimit[0].MaxNums - personLimit[0].AllExportNums, }, } } func personCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) { now := time.Now().Format("2006-01-02") jyOrm := entity.Engine.NewSession() centerOrm := entity.Engine.NewSession() var personNums int64 _, err := centerOrm.Table("account_resources").Select("sum(number) as number"). Where("accountId = ? and endTime >= ? and resourceType = ?", data.UserId, now, "高级字段包").Get(&personNums) if err != nil { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人余额查询失败"} } if personNums == 0 || personNums < data.DeductNum { return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Data: &resourcesCenter.SomeInfo{ ChargeType: 1, ChargeResult: 0, Num1: personNums, }, } } var updateNum int64 err = centerOrm.Begin() if err != nil { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"} } //修改个人账户资源 balanceList := []entity.Balance{} err = centerOrm.Table(AccountResources). Select("*"). Where("accountId= ? and number > 0 and resourceType= ? and endTime >= ?", data.UserId, "高级字段包", now). OrderBy("endTime"). Find(&balanceList) if err != nil { _ = centerOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "个人账号资源查询失败"} } for _, value := range balanceList { if value.Number > data.DeductNum { value.Number = value.Number - data.DeductNum data.DeductNum = 0 } else { data.DeductNum = data.DeductNum - value.Number value.Number = 0 } updateNum, err = centerOrm.Table(AccountResources). Cols("number").ID(value.Id). Update(&value) if err != nil || updateNum <= 0 { _ = centerOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "修改账户失败"} } if data.DeductNum == 0 { break } } //保存账号使用明细 detailed := entity.Detailed{ AccountId: data.UserId, CompanyId: data.EntId, ResourceType: "高级字段包", Number: data.ExportNum, DeductionNumb: data.DeductNum, Name: "数据流包", CreateTime: time.Now().Local(), Remarks: data.Remark, UserType: 0, UserId: data.UserId, AccountType: 1, EntId: data.EntId, } updateNum, err = centerOrm.Table(ConsumeRecord).Insert(&detailed) if err != nil || updateNum <= 0 { return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "账号使用明细保存失败"} } err = centerOrm.Commit() if err != nil { _ = jyOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "事务提交失败"} } return &resourcesCenter.ChargeResp{ Code: entity.SuccessCode, Message: "", Data: &resourcesCenter.SomeInfo{ ChargeType: 1, ChargeResult: 1, Num1: personNums, }, } }