Files
2026-05-20 16:13:58 +08:00

346 lines
9.5 KiB
Go

package applicationser
import (
"context"
"stat/api/proto"
"stat/common/log"
"stat/common/redis"
"stat/common/stdLog"
"stat/common/utils"
"stat/models/appcategory"
"stat/models/applicationLocMod"
"stat/models/applicationmod"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
// 外部获取配置应用
func GetApplication(ctx context.Context, req proto.CenterApplicationReq) (code stdLog.CodeType, data interface{}, err error) {
resp := proto.CenterApplicationRes{
List: make([]*proto.CenterApplication, 0),
AppCategoryList: make([]*proto.CenterAppCategory, 0)}
list, err := applicationmod.FindAppByAppId(ctx, req.ParentAppId)
if err != nil {
code = stdLog.AppDbError
return
}
filter := bson.M{"parentAppId": req.ParentAppId, "status": true}
//filter := bson.M{"status": true}
sort := bson.D{{Key: "rank", Value: -1}}
opt := options.Find().SetSort(sort)
categorylist, serr := appcategory.FindManyAppCategory(ctx, filter, opt)
if serr != nil {
code = stdLog.AppCategoryDbError
return
}
if len(list) > 0 {
for _, info := range list {
app := &proto.CenterApplication{
Id: info.Id,
AppId: info.AppId,
ParentAppId: info.ParentAppId,
Name: info.Name,
//Tag: info.Tag,
Internal: info.Internal,
Categories: info.Categories,
Desc: info.Desc,
DownloadUrl: info.DownloadUrl,
IosUrl: info.IosUrl,
AndroidUrl: info.AndroidUrl,
Avatar: info.Avatar,
Status: info.Status,
Rank: info.Rank,
Total: info.Total,
CreatedId: info.CreatedId,
UpdatedId: info.UpdatedId,
CreatedAt: info.CreatedAt,
UpdatedAt: info.UpdatedAt,
IsGame: info.IsGame,
IsRecommend: info.IsRecommend,
NineShow: info.NineShow,
RecreationShow: info.RecreationShow,
HomeShow: info.HomeShow,
LocIds: info.LocIds,
SmallImg: info.SmallImg,
BigImg: info.BigImg,
IsHighQuality: info.IsHighQuality,
HighQualityType: info.HighQualityType,
}
resp.List = append(resp.List, app)
}
}
if len(categorylist) > 0 {
for _, info := range categorylist {
app := &proto.CenterAppCategory{
Id: info.Id,
ParentAppId: info.ParentAppId,
Name: info.Name,
Desc: info.Desc,
Status: info.Status,
Rank: info.Rank,
CreatedAt: info.CreatedAt,
UpdatedAt: info.UpdatedAt,
ImgType: info.ImgType,
}
resp.AppCategoryList = append(resp.AppCategoryList, app)
}
}
data = resp
code = stdLog.Success
return
}
// IncApplicationClickCount
func IncApplicationClickCount(ctx context.Context, param *proto.ApplicationClickReq) (serr *stdLog.SrvErr) {
id, err := primitive.ObjectIDFromHex(param.Id)
if err != nil {
return stdLog.New(stdLog.ParamError, "", err.Error())
}
_, serr = applicationmod.FindOneApplication(ctx, bson.M{"_id": id})
if serr != nil {
return serr
}
// 写入redis
now := time.Now().Local()
set := redis.GetAppClickDaySet(now)
name := redis.GetAppClickHourName(param.Id, now.Hour())
//name := redis.GetAppClickHourNameByAppId(application.AppId, application.ParentAppId, now.Hour())
if _, err := set.IncInt(name, 1); err != nil {
return stdLog.New(stdLog.RedisSet, "", err.Error())
}
// 写入db
update := bson.M{"$inc": bson.M{"total": 1}}
serr = applicationmod.UpdateOneApplication(ctx, bson.M{"_id": id}, update)
if serr != nil {
return serr
}
return nil
}
// AddApplication 添加应用
func AddApplication(ctx context.Context, param *applicationmod.Application, account string) *stdLog.SrvErr {
param.Id = primitive.NewObjectID()
now := utils.Now()
param.CreatedAt = now
//param.CreatedId = userId
param.UpdatedAt = now
//param.UpdatedId = userId
err := applicationmod.InsertOneApplication(ctx, param)
if err != nil {
log.Error("AddApplication:InsertOneApplication", log.E(err))
return err
}
CheckChange(ctx, nil, param, account)
return nil
}
// DelApplication 删除应用
func DelApplication(ctx context.Context, id primitive.ObjectID, account string) *stdLog.SrvErr {
filter := bson.M{"_id": id}
oldDoc, serr := applicationmod.FindOneApplication(ctx, filter)
if serr != nil {
log.Error("UpdateApplication:FindOneApplication", log.Any("id", id), log.E(serr))
return serr
}
count, err := applicationmod.DelOneApplication(ctx, filter)
if err != nil {
log.Error("DelApplication:DelOneApplication", log.Any("appId", id), log.E(err))
return err
}
if count == 0 {
return stdLog.New(stdLog.ErrApplicationNotExist, "", "")
}
CheckChange(ctx, oldDoc, nil, account)
return nil
}
// UpdateApplication 更新应用
func UpdateApplication(ctx context.Context, req *applicationmod.AppUpdate, account string) *stdLog.SrvErr {
id, err := primitive.ObjectIDFromHex(req.Id)
if err != nil {
log.Error("UpdateApplication:ObjectIDFromHex", log.Any("id", req.Id), log.E(err))
return stdLog.New(stdLog.ParamError, "", err.Error())
}
filter := bson.M{"_id": id}
now := utils.Now()
oldDoc, serr := applicationmod.FindOneApplication(ctx, filter)
if serr != nil {
log.Error("UpdateApplication:FindOneApplication", log.Any("id", req.Id), log.E(serr))
return serr
}
doc := &applicationmod.AppUpdateInfo{
AppId: req.Param.AppId,
ParentAppId: req.Param.ParentAppId,
Name: req.Param.Name,
DaoLiangTitle: req.Param.DaoLiangTitle,
//Tag: req.Param.Tag,
Internal: req.Param.Internal,
Categories: req.Param.Categories,
Desc: req.Param.Desc,
DownloadUrl: req.Param.DownloadUrl,
IosUrl: req.Param.IosUrl,
AndroidUrl: req.Param.AndroidUrl,
Avatar: req.Param.Avatar,
Status: req.Param.Status,
Rank: req.Param.Rank,
Total: req.Param.Total,
UpdatedAt: now,
NineShow: req.Param.NineShow,
RecreationShow: req.Param.RecreationShow,
IsGame: req.Param.IsGame,
IsRecommend: req.Param.IsRecommend,
HomeShow: req.Param.HomeShow,
LocIds: req.Param.LocIds,
SmallImg: req.Param.SmallImg,
BigImg: req.Param.BigImg,
IsHighQuality: req.Param.IsHighQuality,
HighQualityType: req.Param.HighQualityType,
StartTime: req.Param.StartTime,
EndTime: req.Param.EndTime,
}
serr = applicationmod.UpdateOneApplication(ctx, filter, bson.M{
"$set": doc,
})
if serr != nil {
log.Error("UpdateApplication:UpdateOneApplication", log.Any("id", req.Id), log.E(serr))
return serr
}
newDoc, serr := applicationmod.FindOneApplication(ctx, filter)
if serr != nil {
log.Error("UpdateApplication:FindOneApplication", log.Any("id", req.Id), log.E(serr))
return serr
}
CheckChange(ctx, oldDoc, newDoc, account)
return nil
}
// GetAppList 获取应用列表
func GetAppList(ctx context.Context, param *proto.GetApplicationsReq) (*proto.GetApplicationsResp, *stdLog.SrvErr) {
filter := bson.M{}
sort := bson.M{applicationmod.FN.Application.Rank: -1}
if param.Id != nil && *param.Id != "" {
id, serr := primitive.ObjectIDFromHex(*param.Id)
if serr != nil {
return nil, stdLog.New(stdLog.ParamError, "", "id错误")
}
filter["_id"] = id
}
if param.Name != nil && *param.Name != "" {
filter["name"] = bson.M{"$regex": *param.Name}
}
if param.DaoLiangTitle != nil && *param.DaoLiangTitle != "" {
filter["daoLiangTitle"] = bson.M{"$regex": *param.DaoLiangTitle}
}
/*if param.Tag != nil && *param.Tag != 0 {
filter["tag"] = *param.Tag
}
*/
if param.Status != nil {
filter["status"] = *param.Status
}
if param.Category != nil {
filter["categories.cid"] = *param.Category
sort["categories.rank"] = 1
} else {
sort["categories.rank"] = 1
}
if param.ParentAppId != nil {
filter["parentAppId"] = param.ParentAppId
}
if len(param.LocIds) > 0 {
filter["locIds"] = bson.M{"$in": param.LocIds}
}
if param.DownloadUrl != nil {
filter["download_url"] = *param.DownloadUrl
}
if param.IosUrl != nil {
filter["iosUrl"] = *param.IosUrl
}
if param.AndroidUrl != nil {
filter["androidUrl"] = *param.AndroidUrl
}
if param.IsHighQuality != nil {
filter["isHighQuality"] = *param.IsHighQuality
}
count, serr := applicationmod.CountApplications(ctx, filter)
if serr != nil {
log.Error("GetAppList:CountApplications", log.E(serr))
return nil, serr
}
if count == 0 {
return &proto.GetApplicationsResp{
List: nil,
Total: count,
}, nil
}
opt := &options.FindOptions{}
opt.SetSort(sort)
opt.SetLimit(param.PageSize)
opt.SetSkip((param.PageNum - 1) * param.PageSize)
applicationList, serr := applicationmod.FindManyApplication(ctx, filter, opt)
if serr != nil {
log.Error("GetAppList:FindManyApplication", log.E(serr))
return nil, serr
}
// 给前端提供分类名字
dict, serr := appcategory.GetAppCategoryIdNameMap(ctx)
if serr != nil {
return nil, serr
}
locDict, err := applicationLocMod.GetAppLocIdNameMap(ctx)
if err != nil {
return nil, err
}
for i, app := range applicationList {
applicationList[i].LocNames = make([]string, 0)
if len(app.LocIds) == 0 {
applicationList[i].LocIds = make([]int64, 0)
} else {
for _, id := range app.LocIds {
if loc, ok := locDict[id]; ok {
applicationList[i].LocNames = append(applicationList[i].LocNames, loc.Name)
}
}
}
for _, item := range app.Categories {
if category := dict[item.CID]; category != nil {
item.Name = category.Name
}
}
}
resp := &proto.GetApplicationsResp{
List: applicationList,
Total: count,
}
return resp, nil
}