Files
TrangleAgent/Backend/internal/logic/trace/trace.go

190 lines
4.6 KiB
Go
Raw Normal View History

2026-01-18 18:20:40 +08:00
package trace
import (
"context"
"fmt"
v1 "leke/api/user/v1"
"leke/internal/dao"
"leke/internal/model/entity"
"leke/internal/service"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/os/gtime"
)
type sTrace struct{}
func NewTrace() *sTrace {
return &sTrace{}
}
func init() {
service.RegisterTrace(NewTrace())
}
// TraceList 获取轨迹列表
func (s *sTrace) TraceList(ctx context.Context, req *v1.TraceListReq) (res *v1.TraceListRes, err error) {
// 创建数据库查询模型
m := dao.RoleCards.Ctx(ctx)
// 根据角色ID查询
if req.RoleId != 0 {
m = m.Where(dao.RoleCards.Columns().Id, req.RoleId)
}
// 查询总数
total, err := m.Count()
if err != nil {
return nil, err
}
// 分页处理
m = m.Page(req.Page, req.PageSize)
// 查询列表数据 (Scan 到实体)
var roleCards []*entity.RoleCards
err = m.Scan(&roleCards)
if err != nil {
return nil, err
}
// 转换为视图参数
traceList := make([]*v1.TraceViewParams, 0, len(roleCards))
for _, card := range roleCards {
traceList = append(traceList, &v1.TraceViewParams{
UserId: card.UserId,
RoleId: card.Id,
DepartmentId: card.DepartmentId,
RedTrace: int(card.RedTrack),
YellowTrace: int(card.YellowTrack),
BlueTrace: int(card.BlueTrack),
})
}
res = &v1.TraceListRes{
List: traceList,
}
// 设置分页信息
req.PageResult.Total = int(total)
req.PageResult.Page = req.Page
req.PageResult.PageSize = req.PageSize
return
}
// TraceView 查看轨迹详情
func (s *sTrace) TraceView(ctx context.Context, req *v1.TraceViewReq) (res *v1.TraceViewRes, err error) {
// 创建数据库查询模型
m := dao.RoleCards.Ctx(ctx)
// 根据角色ID查询
var card entity.RoleCards
err = m.Where(dao.RoleCards.Columns().Id, req.RoleId).Scan(&card)
if err != nil {
return nil, err
}
res = &v1.TraceViewRes{
TraceViewParams: v1.TraceViewParams{
UserId: card.UserId,
RoleId: card.Id,
DepartmentId: card.DepartmentId,
RedTrace: int(card.RedTrack),
YellowTrace: int(card.YellowTrack),
BlueTrace: int(card.BlueTrack),
},
}
return
}
// TraceUpdate 更新轨迹信息 (增加)
func (s *sTrace) TraceUpdate(ctx context.Context, req *v1.TraceUpdateReq) (res *v1.TraceUpdateRes, err error) {
// 创建数据库查询模型
m := dao.RoleCards.Ctx(ctx)
// 准备更新数据
data := make(map[string]interface{})
// 只有当数值不为0时才进行更新操作
if req.RedTrace != 0 {
data[dao.RoleCards.Columns().RedTrack] = gdb.Raw(fmt.Sprintf("%s + %d", dao.RoleCards.Columns().RedTrack, req.RedTrace))
}
if req.YellowTrace != 0 {
data[dao.RoleCards.Columns().YellowTrack] = gdb.Raw(fmt.Sprintf("%s + %d", dao.RoleCards.Columns().YellowTrack, req.YellowTrace))
}
if req.BlueTrace != 0 {
data[dao.RoleCards.Columns().BlueTrack] = gdb.Raw(fmt.Sprintf("%s + %d", dao.RoleCards.Columns().BlueTrack, req.BlueTrace))
}
// 如果没有需要更新的字段,直接返回
if len(data) == 0 {
return &v1.TraceUpdateRes{
RoleId: req.RoleId,
RedTrace: req.RedTrace,
YellowTrace: req.YellowTrace,
BlueTrace: req.BlueTrace,
}, nil
}
// 添加更新时间
data[dao.RoleCards.Columns().UpdatedAt] = gtime.Now()
// 执行更新
_, err = m.Data(data).Where(dao.RoleCards.Columns().Id, req.RoleId).Update()
if err != nil {
return nil, err
}
res = &v1.TraceUpdateRes{
RoleId: req.RoleId,
RedTrace: req.RedTrace,
YellowTrace: req.YellowTrace,
BlueTrace: req.BlueTrace,
}
return
}
// TraceReduce 减少轨迹数值
func (s *sTrace) TraceReduce(ctx context.Context, req *v1.TraceReduceReq) (res *v1.TraceReduceRes, err error) {
// 创建数据库查询模型
m := dao.RoleCards.Ctx(ctx)
// 准备更新数据
data := make(map[string]interface{})
// 只有当数值不为0时才进行减少操作
if req.RedTrace != 0 {
data[dao.RoleCards.Columns().RedTrack] = gdb.Raw(fmt.Sprintf("GREATEST(0, %s - %d)", dao.RoleCards.Columns().RedTrack, req.RedTrace))
}
if req.YellowTrace != 0 {
data[dao.RoleCards.Columns().YellowTrack] = gdb.Raw(fmt.Sprintf("GREATEST(0, %s - %d)", dao.RoleCards.Columns().YellowTrack, req.YellowTrace))
}
if req.BlueTrace != 0 {
data[dao.RoleCards.Columns().BlueTrack] = gdb.Raw(fmt.Sprintf("GREATEST(0, %s - %d)", dao.RoleCards.Columns().BlueTrack, req.BlueTrace))
}
// 如果没有需要更新的字段,直接返回
if len(data) == 0 {
return &v1.TraceReduceRes{}, nil
}
// 添加更新时间
data[dao.RoleCards.Columns().UpdatedAt] = gtime.Now()
// 执行更新
_, err = m.Data(data).Where(dao.RoleCards.Columns().Id, req.RoleId).Update()
if err != nil {
return nil, err
}
res = &v1.TraceReduceRes{}
return
}