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.ChargeAccountResp) { now := time.Now().Format("2006-01-02") jyOrm := entity.JyEngine.NewSession() souceOrm := entity.Engine.NewSession() var exportPower int has, _ := jyOrm.Table("entniche_user").Cols("export_power").Where("id = ?", data.UserId).Get(&exportPower) if has && exportPower == 0 { return &resourcesCenter.ChargeAccountResp{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 { entNums = common.Int64All((*entInfo)["current"]) } else { return &resourcesCenter.ChargeAccountResp{Code: entity.ErrorCode, Message: "未查询到企业数据流量"} } var personNums int64 _ = souceOrm.Table("account_resources").Cols("SUM(number) AS totalNum"). Where("accountId = ? and endTime >= ? and resourceType = ?", data.EntId, now, "高级字段包").Find(&personNums) if exportPower == 1 && (entNums > 0 || personNums == 0) { // 企业流量包扣除 var personLimit *entity.PersonLimit _ = jyOrm.Table("entniche_export_limit").Select("*"). Where("ent_id = ? and user_id = ?", data.EntId, data.UserId).Find(&personLimit) return &resourcesCenter.ChargeAccountResp{ Code: entity.SuccessCode, Data: &resourcesCenter.SomeInfo{ ChargeType: 0, Num1: entNums, Num2: personLimit.DataLimit, Num3: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.DataLimit-personLimit.ExportNums)), Num4: personLimit.MaxNums, Num5: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.MaxNums-personLimit.AllExportNums)), }, } } else { // 个人高级字段包扣除 return &resourcesCenter.ChargeAccountResp{ 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) { now := time.Now().Format("2006-01-02 15:04:05") souceOrm := entity.Engine.NewSession() jyOrm := entity.JyEngine.NewSession() var personLimit *entity.PersonLimit _ = jyOrm.Table("entniche_export_limit").Select("*"). Where("ent_id = ? and user_id = ?", data.EntId, data.UserId).Find(&personLimit) var entNums int64 entInfo, b := entity.Mgo.FindOne("user", map[string]interface{}{"entid": data.EntId}) if b && len(*entInfo) > 0 && (*entInfo)["plan"] != nil { entNums = common.Int64All((*entInfo)["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.DataLimit, Num3: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.DataLimit-personLimit.ExportNums)), Num4: personLimit.MaxNums, Num5: common.Int64All(common.If(personLimit.DataLimit == 0 && personLimit.MaxNums == 0, 0, personLimit.MaxNums-personLimit.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.DataLimit == 0 && personLimit.MaxNums == 0 { // 当前账号没有限额 updateNum, err = jyOrm.Table("entniche_export_limit").Where("id = ?", personLimit.Id). Incr("export_nums", data.ExportNum). Incr("all_export_nums", data.ExportNum).Update(nil) 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 >=", 0, data.DeductNum). Decr("data_limit", data.DeductNum). Decr("max_nums", data.DeductNum). Incr("export_nums", data.ExportNum). Incr("all_export_nums", data.ExportNum). Update(nil) 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.UserId).Find(&personLimit) var msg []string if personLimit.DataLimit < data.DeductNum { msg = append(msg, "超出您的每日导出限额") } if personLimit.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.DataLimit, Num3: personLimit.DataLimit - personLimit.ExportNums, Num4: personLimit.MaxNums, Num5: personLimit.MaxNums - personLimit.AllExportNums, }, } } } //保存导出日志 var username, phone string _ = souceOrm.Table("entniche_user").Cols("name, phone"). Where("id = ?", data.UserId).Find(&username, &phone) exportLog := &entity.ExportLog{ UserName: username, ExportTime: now, DataSource: "3", ExportNum: data.ExportNum, DeductNum: data.ExportNum, //去重 DownloadUrl: data.DownloadUrl, EntId: data.EntId, Phone: phone, UserId: data.UserId, Filter: data.Filter, } _, err = jyOrm.Table("entniche_export_log").Insert(&exportLog) if err != nil { _ = jyOrm.Rollback() return &resourcesCenter.ChargeResp{Code: entity.ErrorCode, Message: "操作失败"} } //保存账号使用明细 detailed := entity.Detailed{ AccountId: data.AccountId, CompanyId: data.EntId, ResourceType: "高级字段包", Number: data.DeductNum, Name: "数据流包", CreateTime: time.Now().Local(), Remarks: "", UserType: 0, UserId: data.PositionId, AccountType: 1, EntId: data.EntId, } _, err = souceOrm.Table(ConsumeRecord).Insert(&detailed) if err != nil { _ = 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.DataLimit, Num3: personLimit.DataLimit - personLimit.ExportNums, Num4: personLimit.MaxNums, Num5: personLimit.MaxNums - personLimit.AllExportNums, }, } } func personCharge(data *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp) { return nil }