sunpengfei
2025-08-20 a9ee8bf270eb8a3315808b24b41417be4b1a8a9a
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
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.UserServer.Application
{
    /// <summary>
    /// 合同模板命令处理器
    /// </summary>
    public class ContractTemplateCommandHandler(
            IRepository<ContractTemplate> rep
        ) :
        IRequestHandler<SaveContractTemplateCommand, Guid>,
        IRequestHandler<SetIsDisabledContractTemplateCommand, int>
    {
        private readonly IRepository<ContractTemplate> rep = rep;
 
        /// <summary>
        /// 保存合同模板
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task<Guid> Handle(SaveContractTemplateCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            if (logier.Type == EnumUserType.Enterprise)
            {
                request.EnterpriseId = logier.EnterpriseId;
            }
            if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请选择企业");
 
            return await request.SaveData<ContractTemplate, SaveContractTemplateCommand>(
                 q => q
                    .Include(it => it.Values)
                    .Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled),
                 it => it.EnterpriseId == request.EnterpriseId && it.Name == request.Name && !it.IsDisabled && it.Id != request.Id,
                 entity =>
                 {
                     request.Adapt(entity);
                     if (entity.Values.Count != request.Values.Count
                        || entity.Values.Any(ov =>
                                request.Values.Count(nv =>
                                    ov.Id == nv.Id
                                    && ov.Type == nv.Type
                                    && ov.Recorder == nv.Recorder
                                    && ov.UserType == nv.UserType
                                    && ov.Label == nv.Label
                                    && ov.Required == nv.Required) != 1))
                     {
                         entity.Values = request.Values.Select(it =>
                         {
                             var value = entity.Values.FirstOrDefault(v => v.Id == it.Id);
                             if (value == null)
                             {
                                 value = new ContractTemplateValue();
                             }
                             it.Adapt(value);
                             return value;
                         }).ToList();
                         entity.UpdatedUserId = logier.Id;
                         entity.UpdatedTime = DateTime.Now;
                     }
                     if (entity.Access.HasValue && entity.TemplateId.IsNotNull())
                     {
                         if (entity.Status == EnumContractTemplateStatus.Wait)
                         {
                             entity.Status = EnumContractTemplateStatus.Completed;
                             entity.CompletedTime = DateTime.Now;
                         }
                     }
                     else
                     {
                         entity.Status = EnumContractTemplateStatus.Wait;
                         entity.CompletedTime = null;
                     }
                 },
                 cancellationToken);
        }
 
        /// <summary>
        /// 禁用合同模板
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task<int> Handle(SetIsDisabledContractTemplateCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            return await request.SetIsDisabled<ContractTemplate>(q =>
            {
                if (logier.Type == EnumUserType.Enterprise)
                {
                    q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
                }
                return q;
            }, cancellationToken);
        }
    }
}