package bundle import ( "context" "errors" "fmt" "fonchain-fiee/api/bundle" "fonchain-fiee/api/cast" "fonchain-fiee/pkg/service" "io" "os" "reflect" "strconv" "time" bundleModel "fonchain-fiee/pkg/model/bundle" "fonchain-fiee/pkg/model/login" "github.com/gin-gonic/gin" "github.com/xuri/excelize/v2" ) func BundleExtend(c *gin.Context) { var req bundle.BundleExtendRequest userInfo := login.GetUserInfoFromC(c) req.Type = 1 // 设置未手动扩展' req.OperatorName = userInfo.Name req.OperatorPhoneNumber = userInfo.TelNum req.OperatorId = userInfo.ID if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } res, err := service.BundleProvider.BundleExtend(context.Background(), &req) if err != nil { service.Error(c, err) return } service.Success(c, res) } func BundleExtendRecordsList(c *gin.Context) { var req bundle.BundleExtendRecordsListRequest if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } res, err := service.BundleProvider.BundleExtendRecordsList(context.Background(), &req) if err != nil { service.Error(c, err) return } service.Success(c, res) } func GetBundleBalance(c *gin.Context) { var req bundle.GetBundleBalanceListReq if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } res, err := service.BundleProvider.GetBundleBalanceList(context.Background(), &req) if err != nil { service.Error(c, err) return } service.Success(c, res) } func GetUsedRecordList(c *gin.Context) { var req bundle.GetUsedRecordListReq if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } res, err := service.BundleProvider.GetUsedRecordList(context.Background(), &req) if err != nil { service.Error(c, err) return } service.Success(c, res) } func GetWorkDetail(c *gin.Context) { var req cast.WorkDetailReq if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } // userInfo := login.GetUserInfoFromC(c) // res, err := service.BundleProvider.GetBundleBalanceByUserId(context.TODO(), &bundle.GetBundleBalanceByUserIdReq{ // UserId: int32(userInfo.ID), // }) // if err != nil { // service.Error(c, err) // return // } // if res.ExpiredTime <= time.Now().UnixMilli() { // service.Success(c, gin.H{ // "status": 1, // "message": "套餐过期请重新购买", // }) // return // } workRes, err := service.CastProvider.WorkDetail(context.Background(), &req) if err != nil { service.Error(c, err) return } // if len(workRes.Images) > 0 && res.ImageConsumptionNumber >= res.ImageNumber { // 图片用尽 // service.Success(c, gin.H{ // "status": 2, // "message": "增值服务已用尽", // }) // return // } else { // if res.VideoConsumptionNumber >= res.VideoNumber { // 视频用尽 // service.Success(c, gin.H{ // "status": 2, // "message": "增值服务已用尽", // }) // return // } // } service.Success(c, workRes) } func GetToBeComfirmedWorks(c *gin.Context) { var req bundle.ToBeComfirmedWorksReq if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } userInfo := login.GetUserInfoFromC(c) req.ArtistUuid = strconv.Itoa(int(userInfo.ID)) res, err := service.BundleProvider.ToBeComfirmedWorks(context.Background(), &req) if err != nil { service.Error(c, err) return } service.Success(c, res) } func GetUserBalance(c *gin.Context) { userInfo := login.GetUserInfoFromC(c) res, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{ UserId: int32(userInfo.ID), }) if err != nil { service.Error(c, err) return } service.Success(c, res) } func WorkConfirm(c *gin.Context) { // 确认作品并扣除余量 var req bundleModel.UserWorkConfirmReq if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, err) return } if req.ConfirmStatus == 2 { // 驳回完直接结束 res, err := service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{ WorkAction: cast.WorkActionENUM_CONFIRM, WorkUuid: req.WorkUuid, ConfirmRemark: req.ConfirmRemark, ConfirmStatus: 2, }) if err != nil { service.Error(c, err) return } service.Success(c, res) return } userInfo := login.GetUserInfoFromC(c) balanceInfoRes, err := service.BundleProvider.GetBundleBalanceByUserId(context.Background(), &bundle.GetBundleBalanceByUserIdReq{ UserId: int32(userInfo.ID), }) if err != nil { service.Error(c, err) return } wordInfoRes, err := service.CastProvider.WorkDetail(c, &cast.WorkDetailReq{ WorkUuid: req.WorkUuid, }) if err != nil { service.Error(c, err) return } if wordInfoRes.WorkStatus != 4 { service.Error(c, errors.New("作品不是待确认状态")) return } var workCategory = wordInfoRes.WorkCategory var addBalanceReq bundle.AddBundleBalanceReq addBalanceReq.UserId = int32(userInfo.ID) switch workCategory { case 1: { if balanceInfoRes.ImageConsumptionNumber >= balanceInfoRes.ImageNumber { // 图文余量不足 service.Error(c, errors.New("图文余量不足")) return } addBalanceReq.ImageConsumptionNumber = 1 } case 2: { if balanceInfoRes.VideoConsumptionNumber >= balanceInfoRes.VideoNumber { // 视频余量不足 service.Error(c, errors.New("视频余量不足")) return } addBalanceReq.VideoConsumptionNumber = 1 } default: service.Error(c, errors.New("不支持的类型")) return } _, err = service.BundleProvider.AddBundleBalance(c, &addBalanceReq) if err != nil { service.Error(c, err) return } res, err := service.CastProvider.UpdateStatus(c, &cast.UpdateStatusReq{ WorkAction: cast.WorkActionENUM_CONFIRM, WorkUuid: req.WorkUuid, ConfirmRemark: req.ConfirmRemark, ConfirmStatus: 1, }) if err != nil { service.Error(c, err) return } service.Success(c, res) } func CastLogConfirm(ctx *gin.Context) { var req bundle.ConfirmWorkReq if err := ctx.ShouldBindJSON(&req); err != nil { service.Error(ctx, err) return } res, err := service.BundleProvider.ConfirmWork(context.Background(), &req) if err != nil { service.Error(ctx, err) return } service.Success(ctx, res) } func BundleActivate(ctx *gin.Context) { var req bundle.BundleActivateReq if err := ctx.ShouldBindJSON(&req); err != nil { service.Error(ctx, err) return } res, err := service.BundleProvider.BundleActivate(context.Background(), &req) if err != nil { service.Error(ctx, err) return } service.Success(ctx, res) } func BundleExport(ctx *gin.Context) { var req bundle.BundleBalanceExportReq if err := ctx.ShouldBindJSON(&req); err != nil { service.Error(ctx, err) return } res, err := service.BundleProvider.BundleBalanceExport(context.Background(), &req) if err != nil { service.Error(ctx, err) return } f := excelize.NewFile() sheet := "Sheet1" f.NewSheet(sheet) // 写入表头 headers := []string{ "所属月份", "用户编号", "名字", "手机号", "支付时间", "套餐金额", "增值服务金额", "支付金额", "币种", "手续费", "套餐视频单价", "增值视频单价", "套餐账号总数", "增值账号总数", "套餐账号使用数", "增值账号使用数", "当前可用套餐视频数", "当前可用增值视频数", "当前已用套餐视频数", "当前已用增值视频数", "当前作废套餐视频数", "当前作废增值视频数", "当月新增套餐视频数", "当月新增增值视频数", "当月作废套餐视频数", "当月作废增值视频数", "当前可用套餐图文数", "当前可用增值图文数", "当前已用套餐图文数", "当前已用增值图文数", "当前作废套餐图文数", "当前作废增值图文数", "当月新增套餐图文数", "当月新增增值图文数", "当月作废套餐图文数", "当月作废增值图文数", "当前可用套餐数据分析数", "当前可用增值数据分析数", "当前已用套餐数据分析数", "当前已用增值数据分析数", "当前作废套餐数据分析数", "当前作废增值数据分析数", "当月新增套餐数据分析数", "当月新增增值数据分析数", "当月作废套餐数据分析数", "当月作废增值数据分析数", "当月手动扩展账号新增数", "当月手动扩展视频新增数", "当月手动扩展图文新增数", "当月手动扩展数据分析新增数", "当月新增手动扩展时长(天)", "当月手动扩展账号使用数", "当月手动扩展视频使用数", "当月手动扩展图文使用数", "当月手动扩展数据分析使用数", } for i, h := range headers { cell, _ := excelize.CoordinatesToCellName(i+1, 1) f.SetCellValue(sheet, cell, h) } // 写入数据 for r, item := range res.Data { row := r + 2 v := reflect.ValueOf(item) for c := 0; c < v.NumField(); c++ { cell, _ := excelize.CoordinatesToCellName(c+1, row) f.SetCellValue(sheet, cell, v.Field(c).Interface()) } } path := fmt.Sprintf("%s/%d/%s月余量导出.xlsx", os.TempDir(), time.Now().UnixMilli(), req.Month) // 保存文件 if err := f.SaveAs(path); err != nil { fmt.Println("保存失败:", err) return } defer os.Remove(path) ctx.File(path) } func SetBalanceLayout(ctx *gin.Context) { b, _ := io.ReadAll(ctx.Request.Body) userInfo := login.GetUserInfoFromC(ctx) var req = bundle.SetBundleBalanceLayoutReq{ Data: string(b), UserId: uint32(userInfo.ID), } res, err := service.BundleProvider.SetBundleBalanceLayout(context.Background(), &req) if err != nil { service.Error(ctx, err) return } service.Success(ctx, res) } func GetBalanceLayout(ctx *gin.Context) { userInfo := login.GetUserInfoFromC(ctx) var req = bundle.GetBundleBalanceLayoutReq{ UserId: uint32(userInfo.ID), } res, err := service.BundleProvider.GetBundleBalanceLayout(context.Background(), &req) if err != nil { service.Error(ctx, err) return } service.Success(ctx, res.Data) }