micro-bundle/internal/logic/bundleExtendLogic.go
2025-10-21 16:39:51 +08:00

563 lines
27 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package logic
import (
"encoding/json"
"errors"
"micro-bundle/internal/dao"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
"strconv"
"time"
"dubbo.apache.org/dubbo-go/v3/common/logger"
"github.com/jinzhu/copier"
"github.com/samber/lo"
)
func BundleExtend(req *bundle.BundleExtendRequest) (*bundle.BundleExtendResponse, error) {
data := model.BundleExtensionRecords{}
if err := copier.CopyWithOption(&data, req, copier.Option{DeepCopy: true}); err != nil {
return nil, err
}
if req.Type == 1 {
if err := dao.ExtendBundleBalanceByUserId(model.BundleBalanceExtendPo{
UserId: int(req.UserId),
VideoNumber: int(req.VideoAdditional),
ImageNumber: int(req.ImagesAdditional),
DataAnalysisNumber: int(req.DataAdditional),
AccountNumber: int(req.AccountAdditional),
DurationNumber: int(req.DataAdditional),
}); err != nil {
return nil, errors.New("用户没有余量信息")
}
}
err := dao.AddBundleExtendRecord(data)
if err != nil {
logger.Error(err)
return nil, errors.New("创建扩展记录失败")
}
return nil, nil
}
func BundleExtendRecordsList(req *bundle.BundleExtendRecordsListRequest) (*bundle.BundleExtendRecordsListResponse, error) {
data, total, err := dao.GetBundleExtendRecordList(req)
if err != nil {
logger.Error(err)
return nil, errors.New("查询失败")
}
resp := &bundle.BundleExtendRecordsListResponse{}
resp.Total = total
resp.Data = lo.Map(data, func(m model.BundleExtendRecordItemPo, _ int) *bundle.BundleExtendRecordItem {
result := &bundle.BundleExtendRecordItem{}
copier.Copy(result, &m)
result.CreatedAt = uint64(m.CreatedAt.UnixMilli())
return result
})
return resp, nil
}
func GetBundleBalanceList(req *bundle.GetBundleBalanceListReq) (*bundle.GetBundleBalanceListResp, error) {
data, total, err := dao.GetBundleBalanceList(req)
if err != nil {
logger.Error(err)
return nil, errors.New("查询失败")
}
resp := &bundle.GetBundleBalanceListResp{}
resp.Total = total
date, err := time.Parse("2006-01", req.Month)
if err != nil {
date = time.Now()
}
resp.Data = lo.Map(data, func(m model.BundleBalancePo, _ int) *bundle.BundleBalanceItem {
result := &bundle.BundleBalanceItem{
UserId: int32(m.UserId),
UserName: m.UserName,
UserPhoneNumber: m.UserPhoneNumber,
CustomerNum: m.CustomerNum,
PayTime: m.PayTime,
StartTime: m.StartAt.UnixMilli(),
Status: int32(m.Status),
BundleName: m.BundleName,
Month: req.Month,
ExpiredTime: m.ExpiredAt.UnixMilli(),
// 账号类
BundleAccountNumber: int32(m.BundleAccountNumber),
IncreaseAccountNumber: int32(m.IncreaseAccountNumber),
BundleAccountConsumptionNumber: int32(m.BundleAccountConsumptionNumber),
IncreaseAccountConsumptionNumber: int32(m.IncreaseAccountConsumptionNumber),
// 视频类
BundleVideoNumber: int32(m.BundleVideoNumber) + int32(m.BundleLimitVideoNumber) + int32(m.BundleLimitVideoExpiredNumber),
IncreaseVideoNumber: int32(m.IncreaseVideoNumber) + int32(m.IncreaseLimitVideoNumber) + int32(m.IncreaseLimitVideoExpiredNumber),
BundleVideoConsumptionNumber: int32(m.BundleVideoConsumptionNumber) + int32(m.BundleLimitVideoConsumptionNumber) + int32(m.BundleLimitVideoExpiredConsumptionNumber),
IncreaseVideoConsumptionNumber: int32(m.IncreaseVideoConsumptionNumber) + int32(m.IncreaseLimitVideoConsumptionNumber) + int32(m.IncreaseLimitVideoExpiredConsumptionNumber),
InvalidBundleVideoNumber: int32(m.InvalidBundleVideoNumber),
InvalidIncreaseVideoNumber: int32(m.InvalidIncreaseVideoNumber),
MonthlyNewBundleVideoNumber: int32(cal(m.BundleBalance, m.BundleLimitVideoNumber, m.MonthlyLimitVideoQuotaNumber, date) + cal(m.BundleBalance, m.BundleLimitVideoExpiredNumber, m.MonthlyLimitVideoQuotaNumber, date)),
MonthlyNewIncreaseVideoNumber: int32(cal(m.BundleBalance, m.IncreaseLimitVideoNumber, m.MonthlyLimitVideoQuotaNumber, date) + cal(m.BundleBalance, m.IncreaseLimitVideoExpiredNumber, m.MonthlyLimitVideoQuotaNumber, date)),
MonthBundleVideoConsumptionNumber: int32(m.MonthlyBundleVideoConsumptionNumber),
MonthIncreaseVideoConsumptionNumber: int32(m.MonthlyIncreaseVideoConsumptionNumber),
MonthlyInvalidBundleVideoNumber: int32(m.MonthlyInvalidBundleVideoNumber),
MonthlyInvalidIncreaseVideoNumber: int32(m.MonthlyInvalidIncreaseVideoNumber),
// 图文类
BundleImageNumber: int32(m.BundleImageNumber) + int32(m.BundleLimitImageNumber) + int32(m.BundleLimitImageExpiredNumber),
IncreaseImageNumber: int32(m.IncreaseImageNumber) + int32(m.IncreaseLimitImageNumber) + int32(m.IncreaseLimitImageExpiredNumber),
BundleImageConsumptionNumber: int32(m.BundleImageConsumptionNumber) + int32(m.BundleLimitImageConsumptionNumber) + int32(m.BundleLimitImageExpiredConsumptionNumber),
IncreaseImageConsumptionNumber: int32(m.IncreaseImageConsumptionNumber) + int32(m.IncreaseLimitImageConsumptionNumber) + int32(m.IncreaseLimitImageExpiredConsumptionNumber),
InvalidBundleImageNumber: int32(m.InvalidBundleImageNumber),
InvalidIncreaseImageNumber: int32(m.InvalidIncreaseImageNumber),
MonthlyNewBundleImageNumber: int32(cal(m.BundleBalance, m.BundleLimitImageNumber, m.MonthlyLimitImageQuotaNumber, date) + cal(m.BundleBalance, m.BundleLimitImageExpiredNumber, m.MonthlyLimitImageQuotaNumber, date)),
MonthlyNewIncreaseImageNumber: int32(cal(m.BundleBalance, m.IncreaseLimitImageNumber, m.MonthlyLimitImageQuotaNumber, date) + cal(m.BundleBalance, m.IncreaseLimitImageExpiredNumber, m.MonthlyLimitImageQuotaNumber, date)),
MonthBundleImageConsumptionNumber: int32(m.MonthlyBundleImageConsumptionNumber),
MonthIncreaseImageConsumptionNumber: int32(m.MonthlyIncreaseImageConsumptionNumber),
MonthlyInvalidBundleImageNumber: int32(m.MonthlyInvalidBundleImageNumber),
MonthlyInvalidIncreaseImageNumber: int32(m.MonthlyInvalidIncreaseImageNumber),
// 数据分析类
BundleDataAnalysisNumber: int32(m.BundleDataAnalysisNumber) + int32(m.BundleLimitDataAnalysisNumber) + int32(m.BundleLimitDataAnalysisExpiredNumber),
IncreaseDataAnalysisNumber: int32(m.IncreaseDataAnalysisNumber) + int32(m.IncreaseLimitDataAnalysisNumber) + int32(m.IncreaseLimitDataAnalysisExpiredNumber),
BundleDataAnalysisConsumptionNumber: int32(m.BundleDataAnalysisConsumptionNumber) + int32(m.BundleLimitDataAnalysisConsumptionNumber) + int32(m.BundleLimitDataAnalysisExpiredConsumptionNumber),
IncreaseDataAnalysisConsumptionNumber: int32(m.IncreaseDataAnalysisConsumptionNumber) + int32(m.IncreaseLimitDataAnalysisConsumptionNumber) + int32(m.IncreaseLimitDataAnalysisExpiredConsumptionNumber),
InvalidBundleDataAnalysisNumber: int32(m.InvalidBundleDataAnalysisNumber),
InvalidIncreaseDataAnalysisNumber: int32(m.InvalidIncreaseDataAnalysisNumber),
MonthlyNewBundleDataAnalysisNumber: int32(cal(m.BundleBalance, m.BundleLimitDataAnalysisNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date) + cal(m.BundleBalance, m.BundleLimitDataAnalysisExpiredNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date)),
MonthlyNewIncreaseDataAnalysisNumber: int32(cal(m.BundleBalance, m.IncreaseLimitDataAnalysisNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date) + cal(m.BundleBalance, m.IncreaseLimitDataAnalysisExpiredNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date)),
MonthBundleDataAnalysisConsumptionNumber: int32(m.MonthlyBundleDataAnalysisConsumptionNumber),
MonthIncreaseDataAnalysisConsumptionNumber: int32(m.MonthlyIncreaseDataAnalysisConsumptionNumber),
MonthlyInvalidBundleDataAnalysisNumber: int32(m.MonthlyInvalidBundleDataAnalysisNumber),
MonthlyInvalidIncreaseDataAnalysisNumber: int32(m.MonthlyInvalidIncreaseDataAnalysisNumber),
// 手动扩展类
MonthlyNewManualAccountNumber: int32(m.MonthlyNewAccountNumber),
MonthlyNewManualVideoNumber: int32(m.MonthlyNewManualVideoNumber),
MonthlyNewManualImageNumber: int32(m.MonthlyNewManualImageNumber),
MonthlyNewManualDataAnalysisNumber: int32(m.MonthlyNewManualDataAnalysisNumber),
MonthlyNewDurationNumber: int32(m.MonthlyNewDurationNumber),
MonthlyManualAccountConsumptionNumber: int32(m.MonthlyManualAccountConsumptionNumber),
MonthlyManualVideoConsumptionNumber: int32(m.MonthlyManualVideoConsumptionNumber),
MonthlyManualImageConsumptionNumber: int32(m.MonthlyManualImageConsumptionNumber),
MonthlyManualDataAnalysisConsumptionNumber: int32(m.MonthlyManualDataAnalysisConsumptionNumber),
ManualAccountConsumptionNumber: int32(m.ManualAccountConsumptionNumber),
ManualVideoConsumptionNumber: int32(m.ManualVideoConsumptionNumber),
ManualImageConsumptionNumber: int32(m.ManualImageConsumptionNumber),
ManualDataAnalysisConsumptionNumber: int32(m.ManualDataAnalysisConsumptionNumber),
ManualAccountNumber: int32(m.ManualAccountNumber),
ManualVideoNumber: int32(m.ManualVideoNumber),
ManualImageNumber: int32(m.ManualImageNumber),
ManualDataAnalysisNumber: int32(m.ManualDataAnalysisNumber),
Activate: int32(m.Activate),
}
if result.Activate != 2 { // 除了等于0的情况
result.Activate = 1
}
if m.OrderUUID != "" {
result.Bought = 2
} else {
result.Bought = 1
}
return result
})
return resp, nil
}
func GetBundleBalanceByUserId(req *bundle.GetBundleBalanceByUserIdReq) (*bundle.GetBundleBalanceByUserIdResp, error) {
data, err := dao.GetBundleBalanceByUserId(req)
if err != nil {
logger.Error(err)
return nil, errors.New("无套餐数据")
}
if data.Activate != 2 {
return nil, errors.New("套餐未激活")
}
result := &bundle.GetBundleBalanceByUserIdResp{
OrderUUID: data.OrderUUID,
BundleName: data.BundleName,
PayTime: data.StartAt.UnixMilli(),
ExpiredTime: data.ExpiredAt.UnixMilli(),
PaymentAmount: data.PaymentAmount,
PaymentType: data.PaymentType,
AccountNumber: int32(data.BundleAccountNumber) + int32(data.IncreaseAccountNumber) + int32(data.ManualAccountNumber),
AccountAdditional: int32(data.ManualAccountNumber),
AccountConsumptionNumber: int32(data.BundleAccountConsumptionNumber) + int32(data.IncreaseAccountConsumptionNumber) + int32(data.ManualAccountConsumptionNumber),
VideoNumber: int32(data.BundleVideoNumber) + int32(data.BundleLimitVideoNumber) + int32(data.BundleLimitVideoExpiredNumber) + int32(data.IncreaseVideoNumber) + int32(data.IncreaseLimitVideoNumber) + int32(data.IncreaseLimitVideoExpiredNumber) + int32(data.ManualVideoNumber),
VideoAdditional: int32(data.ManualVideoNumber),
VideoConsumptionNumber: int32(data.BundleVideoConsumptionNumber) + int32(data.BundleLimitVideoConsumptionNumber) + int32(data.BundleLimitVideoExpiredConsumptionNumber) + int32(data.IncreaseVideoConsumptionNumber) + int32(data.IncreaseLimitVideoConsumptionNumber) + int32(data.IncreaseLimitVideoExpiredConsumptionNumber) + int32(data.ManualVideoConsumptionNumber),
ImageNumber: int32(data.BundleImageNumber) + int32(data.BundleLimitImageNumber) + int32(data.BundleLimitImageExpiredNumber) + int32(data.IncreaseImageNumber) + int32(data.IncreaseLimitImageNumber) + int32(data.IncreaseLimitImageExpiredNumber) + int32(data.ManualImageNumber),
ImageAdditional: int32(data.ManualImageNumber),
ImageConsumptionNumber: int32(data.BundleImageConsumptionNumber) + int32(data.BundleLimitImageConsumptionNumber) + int32(data.BundleLimitImageExpiredConsumptionNumber) + int32(data.IncreaseImageConsumptionNumber) + int32(data.IncreaseLimitImageConsumptionNumber) + int32(data.IncreaseLimitImageExpiredConsumptionNumber) + int32(data.ManualImageConsumptionNumber),
DataAnalysisNumber: int32(data.BundleDataAnalysisNumber) + int32(data.BundleLimitDataAnalysisNumber) + int32(data.BundleLimitDataAnalysisExpiredNumber) + int32(data.IncreaseDataAnalysisNumber) + int32(data.IncreaseLimitDataAnalysisNumber) + int32(data.IncreaseLimitDataAnalysisExpiredNumber) + int32(data.ManualDataAnalysisNumber),
DataAnalysisAdditional: int32(data.ManualDataAnalysisNumber),
DataAnalysisConsumptionNumber: int32(data.BundleDataAnalysisConsumptionNumber) + int32(data.BundleLimitDataAnalysisConsumptionNumber) + int32(data.BundleLimitDataAnalysisExpiredConsumptionNumber) + int32(data.IncreaseDataAnalysisConsumptionNumber) + int32(data.IncreaseLimitDataAnalysisConsumptionNumber) + int32(data.IncreaseLimitDataAnalysisExpiredConsumptionNumber) + int32(data.ManualDataAnalysisConsumptionNumber),
}
return result, nil
}
func AddBundleBalance(req *bundle.AddBundleBalanceReq) (*bundle.AddBundleBalanceResp, error) {
data := model.BundleBalanceUsePo{
UserId: int(req.UserId),
AccountNumber: int(req.AccountConsumptionNumber),
ImageNumber: int(req.ImageConsumptionNumber),
VideoNumber: int(req.VideoConsumptionNumber),
DataAnalysisNumber: int(req.DataAnalysisConsumptionNumber),
}
uesdType, err := dao.AddBundleBalanceByUserId(data)
return &bundle.AddBundleBalanceResp{
UsedType: uint32(uesdType),
}, err
}
// 计算本月发放的限制类型数量
func cal(data model.BundleBalance, total, limit int, date time.Time) int {
var released int // 已释放的次数
if data.StartAt.Month() == date.Month() && data.StartAt.Year() == date.Year() { //第一个月释放的
} else if data.StartAt.Day() >= 16 {
released += (limit + 1) / 2
} else {
released += limit
}
interval := date.Year()*12 + int(date.Month()) - (data.StartAt.Year()*12 + int(data.StartAt.Month())) // 后续月份释放的
released += interval * limit
remaining := max(total-released, 0) // 还剩余多少次没有发放
if data.StartAt.Month() == date.Month() && data.StartAt.Year() == date.Year() && data.StartAt.Day() >= 16 { // 本月为第一个月并且16号后购买只给一半向上取整
return min((limit+1)/2, remaining)
}
if data.ExpiredAt.Month() == date.Month() && data.ExpiredAt.Year() == date.Year() && data.ExpiredAt.Day() < 16 { // 本月为最后一个月并且16号前到期只给一半向下取整
return min(limit/2, remaining)
}
return min(limit, remaining)
}
func CreateBundleBalance(req *bundle.CreateBundleBalanceReq) (*bundle.CreateBundleBalanceResp, error) {
var data model.BundleBalance
addValues, err := dao.GetValueAddByOrderUUID(req.OrderUUID)
if err != nil || len(addValues) == 0 {
return nil, errors.New("获取增值服务失败")
}
data.StartAt = time.Now()
data.ExpiredAt = time.Now()
userId, err := strconv.Atoi(addValues[0].CustomerID)
if err != nil {
return nil, err
}
data.Month = time.Now().Format("2006-01")
data.UserId = userId
data.OrderUUID = req.OrderUUID
for _, v := range addValues {
switch v.ServiceType {
case 1: // 视频类型
if v.EquityType == 1 { // 套餐权益
if v.QuotaType == 2 { // 限制额度
data.MonthlyLimitVideoQuotaNumber = int(v.QuotaValue)
if v.IsExpired { // 会过期的限制类型
data.BundleLimitVideoExpiredNumber += int(v.Num)
} else {
data.BundleLimitVideoNumber += int(v.Num)
}
} else {
data.BundleVideoNumber += int(v.Num)
}
} else {
if v.QuotaType == 2 { // 限制额度
data.MonthlyLimitVideoQuotaNumber = int(v.QuotaValue)
if v.IsExpired { // 会过期的限制类型
data.IncreaseLimitVideoExpiredNumber += int(v.Num)
} else {
data.IncreaseLimitVideoNumber += int(v.Num)
}
} else {
data.IncreaseVideoNumber += int(v.Num)
}
}
case 2: // 图文类型
if v.EquityType == 1 { // 套餐权益
if v.QuotaType == 2 { // 限制额度
data.MonthlyLimitImageQuotaNumber = int(v.QuotaValue)
if v.IsExpired { // 会过期的限制类型
data.BundleLimitImageExpiredNumber += int(v.Num)
} else {
data.BundleLimitImageNumber += int(v.Num)
}
} else {
data.BundleImageNumber += int(v.Num)
}
} else {
if v.QuotaType == 2 { // 限制额度
data.MonthlyLimitImageQuotaNumber = int(v.QuotaValue)
if v.IsExpired { // 会过期的限制类型
data.IncreaseLimitImageExpiredNumber += int(v.Num)
} else {
data.IncreaseLimitImageNumber += int(v.Num)
}
} else {
data.IncreaseImageNumber += int(v.Num)
}
}
case 3: // 数据分析
if v.EquityType == 1 { // 套餐权益
if v.QuotaType == 2 { // 限制额度
data.MonthlyLimitDataAnalysisQuotaNumber = int(v.QuotaValue)
if v.IsExpired { // 会过期的限制类型
data.BundleLimitDataAnalysisExpiredNumber += int(v.Num)
} else {
data.BundleLimitDataAnalysisNumber += int(v.Num)
}
} else {
data.BundleDataAnalysisNumber += int(v.Num)
}
} else {
if v.QuotaType == 2 { // 限制额度
data.MonthlyLimitDataAnalysisQuotaNumber = int(v.QuotaValue)
if v.IsExpired { // 会过期的限制类型
data.IncreaseLimitDataAnalysisExpiredNumber += int(v.Num)
} else {
data.IncreaseLimitDataAnalysisNumber += int(v.Num)
}
} else {
data.IncreaseDataAnalysisNumber += int(v.Num)
}
}
case 4: // 账号数
if v.EquityType == 1 { // 套餐权益
data.BundleAccountNumber += int(v.Num)
} else {
data.IncreaseAccountNumber += int(v.Num)
}
case 5: // 可用时长
switch v.Unit {
case "天":
data.ExpiredAt = data.ExpiredAt.Add(time.Hour * 24 * time.Duration(v.Num))
case "月":
data.ExpiredAt = data.ExpiredAt.Add(time.Hour * 24 * 30 * time.Duration(v.Num))
case "年":
data.ExpiredAt = data.ExpiredAt.Add(time.Hour * 24 * 365 * time.Duration(v.Num))
}
}
}
now := time.Now()
// 当月可用的限制类型数等于本月方法的套餐和增值两种类型的总和
data.MonthlyLimitVideoExpireNumber = cal(data, data.BundleLimitVideoExpiredNumber, data.MonthlyLimitVideoQuotaNumber, now) + cal(data, data.IncreaseLimitVideoExpiredNumber, data.MonthlyLimitVideoQuotaNumber, now)
data.MonthlyLimitVideoNumber = cal(data, data.BundleLimitVideoNumber, data.MonthlyLimitVideoQuotaNumber, now) + cal(data, data.IncreaseLimitVideoNumber, data.MonthlyLimitVideoQuotaNumber, now)
data.MonthlyLimitImageExpireNumber = cal(data, data.BundleLimitImageExpiredNumber, data.MonthlyLimitImageQuotaNumber, now) + cal(data, data.IncreaseLimitImageExpiredNumber, data.MonthlyLimitImageQuotaNumber, now)
data.MonthlyLimitImageNumber = cal(data, data.BundleLimitImageNumber, data.MonthlyLimitImageQuotaNumber, now) + cal(data, data.IncreaseLimitImageNumber, data.MonthlyLimitImageQuotaNumber, now)
data.MonthlyLimitDataAnalysisExpireNumber = cal(data, data.BundleLimitDataAnalysisExpiredNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now) + cal(data, data.IncreaseLimitDataAnalysisExpiredNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now)
data.MonthlyLimitDataAnalysisNumber = cal(data, data.BundleLimitDataAnalysisNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now) + cal(data, data.IncreaseLimitDataAnalysisNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now)
err = dao.CreateBundleBalance(data)
if err != nil {
logger.Error(err)
return nil, errors.New("创建余量信息失败")
}
return nil, nil
}
func GetUsedRecord(req *bundle.GetUsedRecordListReq) (*bundle.GetUsedRecordListResp, error) {
data, total, err := dao.GetUsedRecord(req)
if err != nil {
logger.Error(err)
return nil, errors.New("查询失败")
}
resp := &bundle.GetUsedRecordListResp{}
resp.Total = total
resp.Data = lo.Map(data, func(m model.CostLogPo, _ int) *bundle.WorkCastItem {
result := &bundle.WorkCastItem{}
copier.Copy(result, &m)
return result
})
return resp, nil
}
func GetImageWorkDetail(req *bundle.GetImageWorkDetailReq) (*bundle.GetImageWorkDetailResp, error) {
data, err := dao.GetImageWorkDetail(req)
if err != nil {
logger.Error(err)
return nil, errors.New("查询失败")
}
result := &bundle.GetImageWorkDetailResp{}
err = copier.Copy(result, &data)
return result, err
}
func GetVedioWorkDetail(req *bundle.GetVedioWorkDetailReq) (*bundle.GetVedioeWorkDetailResp, error) {
data, err := dao.GetVedioWorkDetail(req)
if err != nil {
logger.Error(err)
return nil, errors.New("查询失败")
}
result := &bundle.GetVedioeWorkDetailResp{}
err = copier.Copy(result, &data)
return result, err
}
func ToBeComfirmedWorks(req *bundle.ToBeComfirmedWorksReq) (*bundle.ToBeComfirmedWorksResp, error) {
data, total, unconfirmed, err := dao.ToBeComfirmedWorks(req)
if err != nil {
logger.Error(err)
return nil, errors.New("查询失败")
}
result := &bundle.ToBeComfirmedWorksResp{
Total: total,
Unconfirmed: unconfirmed,
}
result.Data = lo.Map(data, func(m model.CastWorkLog, _ int) *bundle.WorkItem {
result := &bundle.WorkItem{}
copier.Copy(result, &m)
return result
})
return result, nil
}
func ConfirmWork(req *bundle.ConfirmWorkReq) (*bundle.ConfirmWorkResp, error) {
return nil, dao.ConfirmWork(req)
}
func BundleActivate(req *bundle.BundleActivateReq) error {
return dao.BundleActivate(req.Ids)
}
func UpdateBundleBalance() {
dao.UpdateBundleBalance()
}
func BundleBalanceExport(req *bundle.BundleBalanceExportReq) (*bundle.BundleBalanceExportResp, error) {
data, err := GetBundleBalanceList(&bundle.GetBundleBalanceListReq{
Month: req.Month,
Bought: 2,
})
if err != nil {
return nil, err
}
prefixData, err := dao.BalanceExportPrefix()
if err != nil {
return nil, err
}
var prefixMap = map[int32]model.BundleExportDto{}
for _, v := range prefixData {
prefixMap[v.UserId] = v
}
items := []*bundle.BundleBalanceExportItem{}
for _, v := range data.Data {
prefixItem := prefixMap[v.UserId]
item := &bundle.BundleBalanceExportItem{}
copier.Copy(item, v)
item.Month = req.Month
item.CustomerNum = prefixItem.CustomerNum
item.PayTime = prefixItem.PayTime
item.BundleAmount = prefixItem.BundleAmount
item.IncreaseAmount = prefixItem.TotalPayAmount - prefixItem.BundleAmount
item.TotalPayAmount = prefixItem.TotalPayAmount
item.Currency = "USD"
item.Fee = prefixItem.Fee
if v.BundleVideoNumber == 0 {
item.BundleVideoUnitPrice = 0
} else {
item.BundleVideoUnitPrice = float32(item.BundleAmount / float32(v.BundleVideoNumber))
}
if v.IncreaseVideoNumber == 0 {
item.IncreaseVideoUnitPrice = 0
} else {
item.IncreaseVideoUnitPrice = float32(item.IncreaseAmount / float32(v.IncreaseVideoNumber))
}
items = append(items, item)
}
return &bundle.BundleBalanceExportResp{Total: int64(len(items)), Data: items}, nil
}
func GetBundleBalanceLayout(req *bundle.GetBundleBalanceLayoutReq) (*bundle.GetBundleBalanceLayoutResp, error) {
data, err := dao.GetBundleBalanceLayout(req)
if err != nil { // 返回默认值
return &bundle.GetBundleBalanceLayoutResp{
Data: buildDefaultBalanceLayout(),
}, nil
}
return &bundle.GetBundleBalanceLayoutResp{
Data: data,
}, nil
}
func SetBundleBalanceLayout(req *bundle.SetBundleBalanceLayoutReq) (*bundle.SetBundleBalanceLayoutResp, error) {
return nil, dao.SetBundleBalanceLayout(req)
}
func buildDefaultBalanceLayout() string {
m := map[string]string{
"是否激活": "activate",
"艺人": "userName",
"艺人手机号": "userPhoneNumber",
"用户编号": "customerNum",
"套餐状态": "status",
"最后购买的套餐": "bundleName",
"下单时间": "payTime",
"开始有效时间": "startTime",
"过期时间": "expiredTime",
"所属月份": "month",
"购买状态": "bought",
"当前可用套餐账号数": "bundleAccountNumber",
"当前可用增值账号数": "increaseAccountNumber",
"当前已用套餐账号数": "bundleAccountConsumptionNumber",
"当前已用增值账号数": "increaseAccountConsumptionNumber",
"当前可用套餐视频数": "bundleVideoNumber",
"当前可用增值视频数": "increaseVideoNumber",
"当前已用套餐视频数": "bundleVideoConsumptionNumber",
"当前已用增值视频数": "increaseVideoConsumptionNumber",
"当前作废套餐视频数": "invalidBundleVideoNumber",
"当前作废增值视频数": "invalidIncreaseVideoNumber",
"当月新增套餐视频数": "monthlyNewBundleVideoNumber",
"当月新增增值视频数": "monthlyNewIncreaseVideoNumber",
"当月使用套餐视频数": "monthBundleVideoConsumptionNumber",
"当月使用增值视频数": "monthIncreaseVideoConsumptionNumber",
"当月作废套餐视频数": "monthlyInvalidBundleVideoNumber",
"当月作废增值视频数": "monthlyInvalidIncreaseVideoNumber",
"当前可用套餐图文数": "bundleImageNumber",
"当前可用增值图文数": "increaseImageNumber",
"当前已用套餐图文数": "bundleImageConsumptionNumber",
"当前已用增值图文数": "increaseImageConsumptionNumber",
"当前作废套餐图文数": "invalidBundleImageNumber",
"当前作废增值图文数": "invalidIncreaseImageNumber",
"当月新增套餐图文数": "monthlyNewBundleImageNumber",
"当月新增增值图文数": "monthlyNewIncreaseImageNumber",
"当月使用套餐图文数": "monthBundleImageConsumptionNumber",
"当月使用增值图文数": "monthIncreaseImageConsumptionNumber",
"当月作废套餐图文数": "monthlyInvalidBundleImageNumber",
"当月作废增值图文数": "monthlyInvalidIncreaseImageNumber",
"当前可用套餐数据数": "bundleDataAnalysisNumber",
"当前可用增值数据数": "increaseDataAnalysisNumber",
"当前已用套餐数据数": "bundleDataAnalysisConsumptionNumber",
"当前已用增值数据数": "increaseDataAnalysisConsumptionNumber",
"当前作废套餐数据数": "invalidBundleDataAnalysisNumber",
"当前作废增值数据数": "invalidIncreaseDataAnalysisNumber",
"当月新增套餐数据数": "monthlyNewBundleDataAnalysisNumber",
"当月新增增值数据数": "monthlyNewIncreaseDataAnalysisNumber",
"当月使用套餐数据数": "monthBundleDataAnalysisConsumptionNumber",
"当月使用增值数据数": "monthIncreaseDataAnalysisConsumptionNumber",
"当月作废套餐数据数": "monthlyInvalidBundleDataAnalysisNumber",
"当月作废增值数据数": "monthlyInvalidIncreaseDataAnalysisNumber",
"当月新增手动扩展账号数": "monthlyNewManualAccountNumber",
"当月新增手动扩展视频数": "monthlyNewManualVideoNumber",
"当月新增手动扩展图文数": "monthlyNewManualImageNumber",
"当月新增手动扩展数据数": "monthlyNewManualDataAnalysisNumber",
"当月新增手动扩展时长(日)": "monthlyNewDurationNumber",
"当月已用手动扩展账号数": "monthlyManualAccountConsumptionNumber",
"当月已用手动扩展视频数": "monthlyManualVideoConsumptionNumber",
"当月已用手动扩展图文数": "monthlyManualImageConsumptionNumber",
"当月已用手动扩展数据数": "monthlyManualDataAnalysisConsumptionNumber",
}
jsonMap := []map[string]any{}
for k, v := range m {
jsonMap = append(jsonMap, map[string]any{
"sort": 1,
"fieldKey": v,
"fieldValue": k,
"sortOrNot": true,
"status": 1,
"width": 160,
})
}
b, _ := json.Marshal(jsonMap)
return string(b)
}