Files
cid/service/app/application_service.go
2026-03-23 14:08:11 +08:00

179 lines
4.7 KiB
Go

package app
import (
consts "cid/consts/app"
dao "cid/dao/app"
dto "cid/model/dto/app"
entity "cid/model/entity/app"
"context"
"errors"
"github.com/gogf/gf/v2/util/gconv"
)
type applicationService struct{}
// Application 应用服务
var Application = new(applicationService)
// Create 创建应用
func (s *applicationService) Create(ctx context.Context, req *dto.CreateApplicationReq) (res *dto.CreateApplicationRes, err error) {
// 检查应用名称是否重复
count, err := dao.Application.Count(ctx, &dto.ListApplicationReq{Name: req.Name})
if err != nil {
return
}
if count > 0 {
return nil, errors.New("应用名称已存在")
}
// 检查应用编码是否重复
count, err = dao.Application.Count(ctx, &dto.ListApplicationReq{AppCode: req.AppCode})
if err != nil {
return
}
if count > 0 {
return nil, errors.New("应用编码已存在")
}
// 插入数据库
id, err := dao.Application.Insert(ctx, req)
if err != nil {
return
}
res = &dto.CreateApplicationRes{
Id: id,
}
return
}
// List 获取应用列表
func (s *applicationService) List(ctx context.Context, req *dto.ListApplicationReq) (res *dto.ListApplicationRes, err error) {
applicationList, total, err := dao.Application.List(ctx, req)
if err != nil {
return
}
// 组装响应数据
list := make([]dto.ApplicationItem, 0, len(applicationList))
for _, item := range applicationList {
list = append(list, dto.ApplicationItem{
Id: item.Id,
Name: item.Name,
AppCode: item.AppCode,
Type: item.Type,
TypeName: s.getTypeName(item.Type),
Status: item.Status,
StatusName: s.getStatusName(item.Status),
Description: item.Description,
CreatedAt: item.CreatedAt.Unix(),
UpdatedAt: item.UpdatedAt.Unix(),
})
}
res = &dto.ListApplicationRes{
List: list,
Total: total,
}
return
}
// GetOne 获取单个应用
func (s *applicationService) GetOne(ctx context.Context, req *dto.GetApplicationReq) (res *dto.GetApplicationRes, err error) {
application, err := dao.Application.GetOne(ctx, req)
if err != nil {
return
}
var applicationEntity *entity.Application
if err = gconv.Struct(application, &applicationEntity); err != nil {
return
}
return &dto.GetApplicationRes{
Application: applicationEntity,
}, nil
}
// Update 更新应用
func (s *applicationService) Update(ctx context.Context, req *dto.UpdateApplicationReq) (err error) {
// 检查应用是否存在
exist, err := dao.Application.GetOne(ctx, &dto.GetApplicationReq{Id: req.Id})
if err != nil || exist == nil {
return errors.New("应用不存在")
}
// 如果修改了名称,检查新名称是否重复
if req.Name != "" && req.Name != exist.Name {
count, err := dao.Application.Count(ctx, &dto.ListApplicationReq{Name: req.Name})
if err != nil {
return err
}
if count > 0 {
return errors.New("应用名称已存在")
}
}
// 如果修改了应用编码,检查新编码是否重复
if req.AppCode != "" && req.AppCode != exist.AppCode {
count, err := dao.Application.Count(ctx, &dto.ListApplicationReq{AppCode: req.AppCode})
if err != nil {
return err
}
if count > 0 {
return errors.New("应用编码已存在")
}
}
_, err = dao.Application.Update(ctx, req)
return
}
// UpdateStatus 更新应用状态
func (s *applicationService) UpdateStatus(ctx context.Context, req *dto.UpdateApplicationStatusReq) (err error) {
_, err = dao.Application.UpdateStatus(ctx, req.Id, req.Status.String())
return
}
// Delete 删除应用
func (s *applicationService) Delete(ctx context.Context, req *dto.DeleteApplicationReq) (err error) {
// TODO: 检查是否存在关联的数据,防止误删
// 例如: 检查该应用是否有关联的广告活动等
_, err = dao.Application.Delete(ctx, req)
return
}
// GetByAppCode 根据应用编码获取应用
func (s *applicationService) GetByAppCode(ctx context.Context, appCode string) (res *entity.Application, err error) {
return dao.Application.GetByAppCode(ctx, appCode)
}
// getTypeName 获取类型名称
func (s *applicationService) getTypeName(appType consts.AppType) string {
typeNames := map[consts.AppType]string{
consts.AppTypeWeb: "Web应用",
consts.AppTypeMobile: "移动应用",
consts.AppTypeMiniApp: "小程序",
consts.AppTypeH5: "H5应用",
consts.AppTypeDesktop: "桌面应用",
consts.AppTypeThirdParty: "第三方应用",
}
if name, ok := typeNames[appType]; ok {
return name
}
return string(appType)
}
// getStatusName 获取状态名称
func (s *applicationService) getStatusName(status consts.AppStatus) string {
statusNames := map[consts.AppStatus]string{
consts.AppStatusActive: "启用",
consts.AppStatusInactive: "停用",
}
if name, ok := statusNames[status]; ok {
return name
}
return string(status)
}