sunpengfei
2025-08-08 c8b6903d85e7ceef504a198b4bdfc6b72a73fe19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace FlexJobApi.FlexJobServer.Application
{
    /// <summary>
    /// 任务查询处理器
    /// </summary>
    public class TaskInfoQueryHandler(
            IRepository<TaskInfo> rep
        ) :
        IRequestHandler<GetTaskInfoQuery, GetTaskInfoQueryResult>,
        IRequestHandler<GetTaskInfosQuery, PagedListQueryResult<GetTaskInfosQueryResultItem>>
 
    {
        private readonly IRepository<TaskInfo> rep = rep;
 
        /// <summary>
        /// 查询任务详情
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task<GetTaskInfoQueryResult> Handle(GetTaskInfoQuery request, CancellationToken cancellationToken)
        {
            var model = await TaskInfoRepository.GetQueryable(rep)
                .Where(it => it.Id == request.Id)
                .ProjectToType<GetTaskInfoQueryResult>()
                .FirstOrDefaultAsync(cancellationToken);
            model.TaskCount = await rep.AsQueryable().AsNoTracking()
                .Where(it => it.EnterpriseId == model.EnterpriseId && it.ReleaseStatus == EnumTaskReleaseStatus.Stopped)
                .CountAsync();
            return model;
        }
 
        /// <summary>
        /// 查询任务分页列表
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task<PagedListQueryResult<GetTaskInfosQueryResultItem>> Handle(GetTaskInfosQuery request, CancellationToken cancellationToken)
        {
            var q = TaskInfoRepository.GetQueryable(rep);
            if (request.Keywords.IsNotNull())
            {
                q = q.Where(it => it.Name.Contains(request.Keywords));
            }
            if (request.BeginTime.HasValue && request.EndTime.HasValue)
            {
                q = q.Where(it => request.BeginTime <= it.BeginTime && it.BeginTime <= request.EndTime);
            }
            if (request.CityCode.IsNotNull())
            {
                q = q.Where(it => it.CityCode == request.CityCode);
            }
            if (request.SettlementCycle.HasValue)
            {
                q = q.Where(it => it.SettlementCycle == request.SettlementCycle);
            }
            if (request.BenefitCodes.IsNotNull())
            {
                q = q.Where(it => it.Benefits.Any(b => request.BenefitCodes.Contains(b.BenefitCode)));
            }
            if (request.GenderLimit.HasValue)
            {
                q = q.Where(it => it.GenderLimit == request.GenderLimit);
            }
            if (request.Status.HasValue)
            {
                q = q.Where(it => it.Status == request.Status);
            }
            if (request.ReleaseStatus.HasValue)
            {
                q = q.Where(it => it.ReleaseStatus == request.ReleaseStatus);
            }
            if (request.RecommendStatus.HasValue)
            {
                q = q.Where(it => it.RecommendStatus == request.RecommendStatus);
            }
            q = q.CustomOrderBy(request.PageModel.OrderInput);
            var s = from t in q
                    join tu in rep.Change<TaskInfoUser>().AsQueryable().AsNoTracking() on t.Id equals tu.TaskInfoId into tug
                    select new GetTaskInfosQueryResultItem
                    {
                        Id = t.Id,
                        Name = t.Name,
                        Code = t.Code,
                        BillingMethod = t.BillingMethod,
                        ServiceFee = t.ServiceFee,
                        SettlementCycle = t.SettlementCycle,
                        GenderLimit = t.GenderLimit,
                        UserCount = tug.Count(),
                        Status = t.Status,
                        BeginTime = t.BeginTime,
                        EndTime = t.EndTime,
                        ReleaseStatus = t.ReleaseStatus,
                        CheckReceiveStatus = t.CheckReceiveStatus,
                        CreatedTime = t.CreatedTime,
                        RecommendStatus = t.RecommendStatus,
                        SettlementStatus = t.SettlementStatus
                    };
            return request.PageModel.GetPagedListAsync(s, cancellationToken);
        }
    }
}