fonchain-fiee/pkg/service/bundle/bundleBalance.go

371 lines
9.2 KiB
Go

package bundle
import (
"context"
"errors"
"fmt"
"fonchain-fiee/api/bundle"
"fonchain-fiee/api/cast"
"fonchain-fiee/pkg/service"
"log"
"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
}
log.Print("req.ConfirmRemark:", req.ConfirmRemark)
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)
}