daShangDao_psiServer/service/out_task.go
2026-06-15 13:47:39 +08:00

298 lines
8.0 KiB
Go

package service
import (
"fmt"
"psi/database"
"psi/models"
systemReq "psi/models/request"
systemRes "psi/models/response"
"psi/utils"
"time"
"gorm.io/gorm"
)
type OutTaskService struct{}
// GetOutTaskList 获取外部任务列表
func (s *OutTaskService) GetOutTaskList(req systemReq.GetOutTaskListRequest, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.OutTaskListResponse, error) {
databaseConn := database.OptionalDB(db...)
if req.Page < 1 {
req.Page = 1
}
if req.PageSize < 1 || req.PageSize > 100 {
req.PageSize = 20
}
query := databaseConn.Model(&models.OutTask{}).Where("out_task.is_del = ?", 0)
if req.ShopID > 0 {
query = query.Where("out_task.shop_id = ?", req.ShopID)
}
if req.WaveTaskID > 0 {
query = query.Where("out_task.wave_task_id = ?", req.WaveTaskID)
}
if req.ShopType > 0 {
query = query.Where("out_task.shop_type = ?", req.ShopType)
}
if req.TaskType > 0 {
query = query.Where("out_task.task_type = ?", req.TaskType)
}
if req.StartDate > 0 {
query = query.Where("out_task.created_at >= ?", req.StartDate)
}
if req.EndDate > 0 {
query = query.Where("out_task.created_at <= ?", req.EndDate)
}
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, utils.NewError("查询总数失败")
}
if total == 0 {
return &systemRes.OutTaskListResponse{
List: []systemRes.OutTaskItem{},
Total: 0,
Page: req.Page,
PageSize: req.PageSize,
}, nil
}
var tasks []models.OutTask
offset := (req.Page - 1) * req.PageSize
if err := query.Order("out_task.created_at DESC").
Offset(offset).
Limit(req.PageSize).
Find(&tasks).Error; err != nil {
return nil, utils.NewError("查询外部任务列表失败")
}
taskItems := make([]systemRes.OutTaskItem, 0, len(tasks))
for _, task := range tasks {
taskItems = append(taskItems, systemRes.ConvertOutTaskToItem(task))
}
return &systemRes.OutTaskListResponse{
List: taskItems,
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}, nil
}
// GetOutTaskLogList 获取外部任务日志列表
func (s *OutTaskService) GetOutTaskLogList(req systemReq.GetOutTaskLogListRequest, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.OutTaskLogListResponse, error) {
databaseConn := database.OptionalDB(db...)
if req.Page < 1 {
req.Page = 1
}
if req.PageSize < 1 || req.PageSize > 100 {
req.PageSize = 20
}
query := databaseConn.Model(&models.OutTaskLog{}).Where("out_task_log.is_del = ?", 0).Where("out_task_log.out_task_id = ?", req.OutTaskID)
if req.ShopID > 0 {
query = query.Where("out_task_log.shop_id = ?", req.ShopID)
}
if req.WaveTaskID > 0 {
query = query.Where("out_task_log.wave_task_id = ?", req.WaveTaskID)
}
if req.ProductID > 0 {
query = query.Where("out_task_log.product_id = ?", req.ProductID)
}
if req.Status >= 0 {
query = query.Where("out_task_log.status = ?", req.Status)
}
if req.StartDate > 0 {
query = query.Where("out_task_log.created_at >= ?", req.StartDate)
}
if req.EndDate > 0 {
query = query.Where("out_task_log.created_at <= ?", req.EndDate)
}
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, utils.NewError("查询总数失败")
}
if total == 0 {
return &systemRes.OutTaskLogListResponse{
List: []systemRes.OutTaskLogItem{},
Total: 0,
Page: req.Page,
PageSize: req.PageSize,
}, nil
}
var logs []models.OutTaskLog
offset := (req.Page - 1) * req.PageSize
if err := query.Order("out_task_log.created_at DESC").
Offset(offset).
Limit(req.PageSize).
Find(&logs).Error; err != nil {
return nil, utils.NewError("查询外部任务日志列表失败")
}
logItems := make([]systemRes.OutTaskLogItem, 0, len(logs))
for _, log := range logs {
logItems = append(logItems, systemRes.ConvertOutTaskLogToItem(log))
}
return &systemRes.OutTaskLogListResponse{
List: logItems,
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}, nil
}
// GetOutTaskByShop 按店铺分组获取外部任务列表
func (s *OutTaskService) GetOutTaskByShop(req systemReq.GetOutTaskByShopRequest, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.OutTaskByShopResponse, error) {
databaseConn := database.OptionalDB(db...)
if req.Page < 1 {
req.Page = 1
}
if req.PageSize < 1 || req.PageSize > 100 {
req.PageSize = 20
}
// 构建查询条件
query := databaseConn.Model(&models.OutTask{}).Where("out_task.is_del = ?", 0)
if req.ShopID > 0 {
query = query.Where("out_task.shop_id = ?", req.ShopID)
}
if req.ShopType > 0 {
query = query.Where("out_task.shop_type = ?", req.ShopType)
}
if req.StartDate > 0 {
query = query.Where("out_task.created_at >= ?", req.StartDate)
}
if req.EndDate > 0 {
query = query.Where("out_task.created_at <= ?", req.EndDate)
}
// 获取总数
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, utils.NewError("查询总数失败")
}
if total == 0 {
return &systemRes.OutTaskByShopResponse{
List: []systemRes.OutTaskShopGroup{},
Total: 0,
Page: req.Page,
PageSize: req.PageSize,
}, nil
}
// 分页查询任务列表
var tasks []models.OutTask
offset := (req.Page - 1) * req.PageSize
if err := query.Order("out_task.shop_id ASC, out_task.created_at DESC").
Offset(offset).
Limit(req.PageSize).
Find(&tasks).Error; err != nil {
return nil, utils.NewError("查询外部任务列表失败")
}
// 按店铺分组
shopGroupMap := make(map[int64]*systemRes.OutTaskShopGroup)
shopIDs := make([]int64, 0)
for _, task := range tasks {
if _, exists := shopGroupMap[task.ShopID]; !exists {
shopIDs = append(shopIDs, task.ShopID)
shopGroupMap[task.ShopID] = &systemRes.OutTaskShopGroup{
ShopID: task.ShopID,
ShopType: task.ShopType,
ShopTypeText: systemRes.GetShopTypeText(task.ShopType),
Tasks: []systemRes.OutTaskDetail{},
}
}
taskDetail := systemRes.ConvertOutTaskToDetail(task)
shopGroupMap[task.ShopID].Tasks = append(shopGroupMap[task.ShopID].Tasks, taskDetail)
}
// 批量查询店铺名称
shopNameMap := make(map[int64]string)
if len(shopIDs) > 0 {
var shops []models.Shop
if err := databaseConn.Model(&models.Shop{}).
Where("id IN ? AND del_flag = ?", shopIDs, 0).
Find(&shops).Error; err == nil {
for _, shop := range shops {
shopNameMap[shop.ID] = shop.ShopAliasName
}
}
}
// 为每个任务查询日志明细
for shopID, shopGroup := range shopGroupMap {
shopGroup.ShopName = shopNameMap[shopID]
for i := range shopGroup.Tasks {
task := &shopGroup.Tasks[i]
// 只查询已发送任务的日志
if task.OutTaskID == 0 {
continue
}
var logs []models.OutTaskLog
if err := databaseConn.Model(&models.OutTaskLog{}).
Where("out_task_log.out_task_id = ? AND out_task_log.is_del = ?", task.OutTaskID, 0).
Order("out_task_log.created_at DESC").
Find(&logs).Error; err == nil {
logItems := make([]systemRes.OutTaskLogItem, 0, len(logs))
for _, log := range logs {
logItems = append(logItems, systemRes.ConvertOutTaskLogToItem(log))
}
task.Logs = logItems
}
}
}
// 转换为列表
shopGroups := make([]systemRes.OutTaskShopGroup, 0, len(shopGroupMap))
for _, group := range shopGroupMap {
shopGroups = append(shopGroups, *group)
}
return &systemRes.OutTaskByShopResponse{
List: shopGroups,
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}, nil
}
func (s *OutTaskService) UpdateOutTaskLog(req systemReq.UpdateOutTaskLogRequest) error {
databaseConn, err := database.GetTenantDB(req.UserID)
if err != nil {
return fmt.Errorf("获取数据库连接失败: %v", err)
}
var log models.OutTaskLog
if err := databaseConn.Where("out_task_id = ? AND product_id = ?", req.OutTaskID, req.ProductID).First(&log).Error; err != nil {
return fmt.Errorf("查询外部任务日志失败: %v", err)
}
if err := databaseConn.Model(&log).Updates(map[string]interface{}{
"status": 2,
"updated_at": time.Now().Unix(),
}).Error; err != nil {
return fmt.Errorf("更新外部任务日志失败: %v", err)
}
return nil
}