huminmin
4 天以前 7591ba21194595cc8d9a1293dfdbfa945bc9948f
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
package cn.iocoder.yudao.module.hrm.dal.mysql.employee;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeContractPageReqVO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeContractDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
 
import java.time.LocalDate;
import java.util.List;
 
/**
 * 员工合同 Mapper
 *
 * @author 超级管理员
 */
@Mapper
public interface HrmEmployeeContractMapper extends BaseMapperX<HrmEmployeeContractDO> {
 
    /**
     * 到期提醒天数
     */
    int REMIND_DAYS = 30;
 
    /**
     * 合同状态:待生效
     */
    int STATUS_PENDING = 1;
    /**
     * 合同状态:生效中
     */
    int STATUS_ACTIVE = 2;
    /**
     * 合同状态:即将到期
     */
    int STATUS_EXPIRING_SOON = 3;
    /**
     * 合同状态:已到期
     */
    int STATUS_EXPIRED = 4;
 
    /**
     * 解除终止状态:正常
     */
    int TERMINATE_NORMAL = 0;
    /**
     * 解除终止状态:已解除
     */
    int TERMINATE_CANCELED = 1;
    /**
     * 解除终止状态:已终止
     */
    int TERMINATE_TERMINATED = 2;
 
    default PageResult<HrmEmployeeContractDO> selectPage(HrmEmployeeContractPageReqVO reqVO, LocalDate today) {
        LambdaQueryWrapperX<HrmEmployeeContractDO> query = new LambdaQueryWrapperX<HrmEmployeeContractDO>()
                .likeIfPresent(HrmEmployeeContractDO::getContractNo, reqVO.getContractNo())
                .eqIfPresent(HrmEmployeeContractDO::getEmployeeId, reqVO.getEmployeeId())
                .eqIfPresent(HrmEmployeeContractDO::getContractType, reqVO.getContractType())
                .eqIfPresent(HrmEmployeeContractDO::getContractTermType, reqVO.getContractTermType())
                .eqIfPresent(HrmEmployeeContractDO::getTerminateStatus, reqVO.getTerminateStatus())
                .orderByDesc(HrmEmployeeContractDO::getId);
        // 动态状态筛选(与 terminateStatus 互斥,优先按状态筛选)
        if (reqVO.getStatus() != null) {
            appendStatusCondition(query, reqVO.getStatus(), today);
        } else if (reqVO.getExpiryType() != null) {
            appendExpiryCondition(query, reqVO.getExpiryType(), today);
        }
        return selectPage(reqVO, query);
    }
 
    /**
     * 拼接动态状态筛选条件
     *
     * @param status 合同状态:1-待生效 2-生效中 3-即将到期 4-已到期 5-已解除 6-已终止
     */
    default void appendStatusCondition(LambdaQueryWrapperX<HrmEmployeeContractDO> query, Integer status, LocalDate today) {
        switch (status) {
            case STATUS_PENDING: // 待生效
                query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                        .gt(HrmEmployeeContractDO::getStartDate, today);
                break;
            case STATUS_ACTIVE: // 生效中:未解除/终止,已开始,且未结束(含无固定期限)
                query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                        .le(HrmEmployeeContractDO::getStartDate, today)
                        .and(w -> w.isNull(HrmEmployeeContractDO::getEndDate)
                                .or().ge(HrmEmployeeContractDO::getEndDate, today));
                break;
            case STATUS_EXPIRING_SOON: // 即将到期
                query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                        .le(HrmEmployeeContractDO::getStartDate, today)
                        .ge(HrmEmployeeContractDO::getEndDate, today)
                        .le(HrmEmployeeContractDO::getEndDate, today.plusDays(REMIND_DAYS));
                break;
            case STATUS_EXPIRED: // 已到期
                query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                        .isNotNull(HrmEmployeeContractDO::getEndDate)
                        .lt(HrmEmployeeContractDO::getEndDate, today);
                break;
            case 5: // 已解除
                query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_CANCELED);
                break;
            case 6: // 已终止
                query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_TERMINATED);
                break;
            default:
                break;
        }
    }
 
    /**
     * 拼接到期类型筛选条件(待办提醒用)
     *
     * @param expiryType 到期类型:1-即将到期 2-已到期
     */
    default void appendExpiryCondition(LambdaQueryWrapperX<HrmEmployeeContractDO> query, Integer expiryType, LocalDate today) {
        if (expiryType == 1) { // 即将到期
            query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                    .le(HrmEmployeeContractDO::getStartDate, today)
                    .between(HrmEmployeeContractDO::getEndDate, today, today.plusDays(REMIND_DAYS));
        } else if (expiryType == 2) { // 已到期
            query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                    .isNotNull(HrmEmployeeContractDO::getEndDate)
                    .lt(HrmEmployeeContractDO::getEndDate, today);
        }
    }
 
    /**
     * 统计即将到期的合同数量(供待办/首页提醒)
     */
    default Long selectCountByExpiring(LocalDate today) {
        return selectCount(new LambdaQueryWrapperX<HrmEmployeeContractDO>()
                .eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL)
                .le(HrmEmployeeContractDO::getStartDate, today)
                .between(HrmEmployeeContractDO::getEndDate, today, today.plusDays(REMIND_DAYS)));
    }
 
    /**
     * 查询同一员工时间重叠的未解除/未终止合同
     *
     * @param employeeId 员工ID
     * @param startDate  新合同开始日期
     * @param endDate    新合同结束日期(无固定期限为 null,视为无限长)
     * @param excludeId  需要排除的合同ID(更新时传自身 id,创建时传 null)
     * @return 重叠的合同列表
     */
    default List<HrmEmployeeContractDO> selectOverlapping(Long employeeId, LocalDate startDate,
                                                          LocalDate endDate, Long excludeId) {
        LambdaQueryWrapperX<HrmEmployeeContractDO> query = new LambdaQueryWrapperX<HrmEmployeeContractDO>();
        query.eq(HrmEmployeeContractDO::getEmployeeId, employeeId);
        query.eq(HrmEmployeeContractDO::getTerminateStatus, TERMINATE_NORMAL);
        if (excludeId != null) {
            query.ne(HrmEmployeeContractDO::getId, excludeId);
        }
        if (endDate != null) {
            // 新合同有结束日期:与已存在合同的 [startDate, endDate] 区间存在交集即冲突
            query.lt(HrmEmployeeContractDO::getStartDate, endDate);
            query.and(w -> w.isNull(HrmEmployeeContractDO::getEndDate)
                    .or().gt(HrmEmployeeContractDO::getEndDate, startDate));
        }
        // 新合同无固定期限(endDate 为 null):员工存在任意未解除/终止合同即冲突
        return selectList(query);
    }
 
    /**
     * 清除该员工全部合同的"当前合同"标记
     *
     * @param employeeId 员工ID
     */
    default void clearCurrentByEmployee(Long employeeId) {
        update(null, new LambdaUpdateWrapper<HrmEmployeeContractDO>()
                .eq(HrmEmployeeContractDO::getEmployeeId, employeeId)
                .set(HrmEmployeeContractDO::getIsCurrent, false));
    }
 
    /**
     * 查询员工的全部合同(按创建时间倒序)
     *
     * @param employeeId 员工ID
     * @return 合同列表
     */
    default List<HrmEmployeeContractDO> selectListByEmployee(Long employeeId) {
        return selectList(new LambdaQueryWrapperX<HrmEmployeeContractDO>()
                .eq(HrmEmployeeContractDO::getEmployeeId, employeeId)
                .orderByDesc(HrmEmployeeContractDO::getId));
    }
 
}