dzx пре 1 година
родитељ
комит
770ca58896

+ 191 - 10
src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java

@@ -1,14 +1,19 @@
 package com.xjrsoft.module.ledger.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.ledger.dto.TeacherLeavePageDto;
-import com.xjrsoft.module.ledger.vo.TeacherLeavePageVo;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsOvertimeVo;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.vo.UserPageVo;
@@ -18,13 +23,21 @@ import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.text.DecimalFormat;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
 * @title: 台账配置表
@@ -43,18 +56,19 @@ public class LedgerStatisticsController {
     private final IWfTeacherleaveService teacherleaveService;
 
     @GetMapping(value = "/teacher-leave-page")
-    @ApiOperation(value="教师请假台账(分页)")
-    @SaCheckPermission("ledgerconfig:detail")
-    public RT<PageOutput<TeacherLeavePageVo>> teacherLeavePage(@Valid TeacherLeavePageDto dto){
-        IPage<TeacherLeavePageVo> userPage = userService.selectJoinListPage(ConventPage.getPage(dto), TeacherLeavePageVo.class,
+    @ApiOperation(value="教师请假统计(分页)")
+    @SaCheckPermission("ledgerstatistics:detail")
+    public RT<PageOutput<LedgerStatisticsLeaveVo>> teacherLeavePage(@Valid LedgerStatisticsPageDto dto){
+        IPage<LedgerStatisticsLeaveVo> userPage = userService.selectJoinListPage(ConventPage.getPage(dto), LedgerStatisticsLeaveVo.class,
                 new MPJLambdaWrapper<User>()
                         .disableSubLogicDel()
                         .select(User::getId)
                         .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
-                        .select(" SELECT GROUP_CONCAT(t1.name) AS dept_name FROM xjr_department t1" +
+                        .select(" (SELECT GROUP_CONCAT(t1.name) FROM xjr_department t1" +
                                 " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
-                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id")
+                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id) as dept_name")
                         .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
                         .orderByAsc(User::getId)
         );
         LocalDateTime startTime = null;
@@ -63,9 +77,176 @@ public class LedgerStatisticsController {
             startTime = dto.getStartDate().atTime(0,0,0);
             endTime = dto.getEndDate().atTime(23,59,59);
         }
-        Map<Long, WfTeacherleave> leaveMap = teacherleaveService.getLeaveList(startTime, endTime);
-        PageOutput<TeacherLeavePageVo> pageOutput = ConventPage.getPageOutput(userPage, TeacherLeavePageVo.class);
+        Map<String, List<WfTeacherleave>> userLeaveMap = teacherleaveService.getUserLeaveList(startTime, endTime);
+
+        for (LedgerStatisticsLeaveVo record : userPage.getRecords()) {
+            List<WfTeacherleave> wfTeacherleaves = userLeaveMap.get(record.getId().toString());
+            if(wfTeacherleaves == null || wfTeacherleaves.isEmpty()){
+                continue;
+            }
+            double value = wfTeacherleaves.stream().mapToDouble(WfTeacherleave::getLeaveDays).sum();
+            boolean isInteger = (value % 1) == 0;
+            DecimalFormat df = new DecimalFormat(isInteger ? "0" : "#.##");
+            String formattedValue = df.format(value);
+            record.setLeaveDays(formattedValue);
+        }
+
+        PageOutput<LedgerStatisticsLeaveVo> pageOutput = ConventPage.getPageOutput(userPage, LedgerStatisticsLeaveVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @PostMapping(value = "/teacher-leave-export-query")
+    @ApiOperation(value="教师请假统计-导出")
+    @SaCheckPermission("ledgerstatistics:detail")
+    public ResponseEntity<byte[]> teacherLeaveExportQuery(@Valid @RequestBody LedgerStatisticsPageDto dto){
+        List<LedgerStatisticsLeaveVo> list = userService.selectJoinList(LedgerStatisticsLeaveVo.class,
+                new MPJLambdaWrapper<User>()
+                        .disableSubLogicDel()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
+                        .select(" (SELECT GROUP_CONCAT(t1.name) FROM xjr_department t1" +
+                                " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
+                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id) as dept_name")
+                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
+                        .orderByAsc(User::getId)
+        );
+        LocalDateTime startTime = null;
+        LocalDateTime endTime = null;
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            startTime = dto.getStartDate().atTime(0,0,0);
+            endTime = dto.getEndDate().atTime(23,59,59);
+        }
+        Map<String, List<WfTeacherleave>> userLeaveMap = teacherleaveService.getUserLeaveList(startTime, endTime);
+        int sortCode = 1;
+        for (LedgerStatisticsLeaveVo record : list) {
+            List<WfTeacherleave> wfTeacherleaves = userLeaveMap.get(record.getId().toString());
+            if(wfTeacherleaves == null || wfTeacherleaves.isEmpty()){
+                continue;
+            }
+            double value = wfTeacherleaves.stream().mapToDouble(WfTeacherleave::getLeaveDays).sum();
+            boolean isInteger = (value % 1) == 0;
+            DecimalFormat df = new DecimalFormat(isInteger ? "0" : "#.##");
+            String formattedValue = df.format(value);
+            record.setLeaveDays(formattedValue);
+            record.setSortCode(sortCode);
+            sortCode ++;
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, LedgerStatisticsLeaveVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "teacher-leave" + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @GetMapping(value = "/teacher-overtime-page")
+    @ApiOperation(value="教师加班统计(分页)")
+    @SaCheckPermission("ledgerstatistics:detail")
+    public RT<PageOutput<LedgerStatisticsOvertimeVo>> teacherOvertimePage(@Valid LedgerStatisticsPageDto dto){
+        IPage<LedgerStatisticsOvertimeVo> userPage = userService.selectJoinListPage(ConventPage.getPage(dto), LedgerStatisticsOvertimeVo.class,
+                new MPJLambdaWrapper<User>()
+                        .disableSubLogicDel()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
+                        .select(" (SELECT GROUP_CONCAT(t1.name) FROM xjr_department t1" +
+                                " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
+                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id) as dept_name")
+                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
+                        .orderByAsc(User::getId)
+        );
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        String sql = "SELECT t4.teacher_user_id,SUM(t.total_days) as total_days FROM wf_overtime t" +
+                " LEFT JOIN xjr_user t1 ON t1.id = t.user_id" +
+                " LEFT JOIN xjr_user t3 ON t3.id = t.leader_in_charge" +
+                " LEFT JOIN xjr_workflow_form_relation t2 ON t.id = t2.form_key_value" +
+                " LEFT JOIN wf_overtime_teacher t4 ON t.id = t4.wf_overtime_id" +
+                " WHERE t2.current_state = 'COMPLETED'";
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            String startTime = dto.getStartDate().atTime(0,0,0).format(dtf);
+            String endTime = dto.getEndDate().atTime(23,59,59).format(dtf);
+            sql += " AND (" +
+                "   (overtime_start_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                "   OR (overtime_end_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                "   OR (overtime_start_time > '" + startTime + "' and '" + endTime + "' > overtime_end_time)" +
+                "   OR ('" + startTime + "' > overtime_start_time and overtime_end_time > '" + endTime + "')" +
+                ")";
+        }
+        sql += " GROUP BY t4.teacher_user_id";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        Map<Long, String> userLeaveMap = list.stream().collect(
+                Collectors.toMap(x -> Long.parseLong(x.get("teacher_user_id").toString()), x -> x.get("total_days").toString())
+        );
+        for (LedgerStatisticsOvertimeVo record : userPage.getRecords()) {
+            if(!userLeaveMap.containsKey(record.getId())){
+                continue;
+            }
+            double value = Double.parseDouble(userLeaveMap.get(record.getId()));
+            boolean isInteger = (value % 1) == 0;
+            DecimalFormat df = new DecimalFormat(isInteger ? "0" : "#.##");
+            String formattedValue = df.format(value);
+            record.setTotalDays(formattedValue);
+        }
+
+        PageOutput<LedgerStatisticsOvertimeVo> pageOutput = ConventPage.getPageOutput(userPage, LedgerStatisticsOvertimeVo.class);
         return RT.ok(pageOutput);
     }
 
+    @PostMapping(value = "/teacher-overtime-export-query")
+    @ApiOperation(value="教师加班统计-导出")
+    @SaCheckPermission("ledgerstatistics:detail")
+    public ResponseEntity<byte[]> teacherOvertimeExportQuery(@Valid LedgerStatisticsPageDto dto){
+        List<LedgerStatisticsOvertimeVo> userPage = userService.selectJoinList(LedgerStatisticsOvertimeVo.class,
+                new MPJLambdaWrapper<User>()
+                        .disableSubLogicDel()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
+                        .select(" (SELECT GROUP_CONCAT(t1.name) FROM xjr_department t1" +
+                                " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
+                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id) as dept_name")
+                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
+                        .orderByAsc(User::getId)
+        );
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        String sql = "SELECT t4.teacher_user_id,SUM(t.total_days) as total_days FROM wf_overtime t" +
+                " LEFT JOIN xjr_user t1 ON t1.id = t.user_id" +
+                " LEFT JOIN xjr_user t3 ON t3.id = t.leader_in_charge" +
+                " LEFT JOIN xjr_workflow_form_relation t2 ON t.id = t2.form_key_value" +
+                " LEFT JOIN wf_overtime_teacher t4 ON t.id = t4.wf_overtime_id" +
+                " WHERE t2.current_state = 'COMPLETED'";
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            String startTime = dto.getStartDate().atTime(0,0,0).format(dtf);
+            String endTime = dto.getEndDate().atTime(23,59,59).format(dtf);
+            sql += " AND (" +
+                    "   (overtime_start_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                    "   OR (overtime_end_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                    "   OR (overtime_start_time > '" + startTime + "' and '" + endTime + "' > overtime_end_time)" +
+                    "   OR ('" + startTime + "' > overtime_start_time and overtime_end_time > '" + endTime + "')" +
+                    ")";
+        }
+        sql += " GROUP BY t4.teacher_user_id";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        Map<Long, String> userLeaveMap = list.stream().collect(
+                Collectors.toMap(x -> Long.parseLong(x.get("teacher_user_id").toString()), x -> x.get("total_days").toString())
+        );
+        for (LedgerStatisticsOvertimeVo record : userPage) {
+            if(!userLeaveMap.containsKey(record.getId())){
+                continue;
+            }
+            double value = Double.parseDouble(userLeaveMap.get(record.getId()));
+            boolean isInteger = (value % 1) == 0;
+            DecimalFormat df = new DecimalFormat(isInteger ? "0" : "#.##");
+            String formattedValue = df.format(value);
+            record.setTotalDays(formattedValue);
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, LedgerStatisticsOvertimeVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "teacher-overtime" + ExcelTypeEnum.XLSX.getValue());
+    }
+
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/ledger/dto/TeacherLeavePageDto.java → src/main/java/com/xjrsoft/module/ledger/dto/LedgerStatisticsPageDto.java

@@ -17,7 +17,7 @@ import java.time.LocalDate;
 */
 @Data
 @EqualsAndHashCode(callSuper = false)
-public class TeacherLeavePageDto extends PageInput {
+public class LedgerStatisticsPageDto extends PageInput {
 
     @ApiModelProperty("姓名")
     private String name;

+ 21 - 0
src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsLeaveVo.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.ledger.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 台账配置表分页查询入参
+* @Author dzx
+* @Date: 2024-03-06
+* @Version 1.0
+*/
+@Data
+public class LedgerStatisticsLeaveVo extends LedgerStatisticsPageVo{
+
+    @ExcelProperty("请假天数")
+    @ApiModelProperty("请假天数")
+    private String leaveDays;
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsOvertimeVo.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.ledger.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 台账配置表分页查询入参
+* @Author dzx
+* @Date: 2024-03-06
+* @Version 1.0
+*/
+@Data
+public class LedgerStatisticsOvertimeVo extends LedgerStatisticsPageVo{
+
+    @ExcelProperty("加班天数")
+    @ApiModelProperty("加班天数")
+    private String totalDays;
+
+}

+ 6 - 10
src/main/java/com/xjrsoft/module/ledger/vo/TeacherLeavePageVo.java → src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsPageVo.java

@@ -1,11 +1,8 @@
 package com.xjrsoft.module.ledger.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springframework.format.annotation.DateTimeFormat;
 
 
 /**
@@ -15,11 +12,14 @@ import org.springframework.format.annotation.DateTimeFormat;
 * @Version 1.0
 */
 @Data
-public class TeacherLeavePageVo {
+public class LedgerStatisticsPageVo {
+
+    @ApiModelProperty("主键id")
+    private Long id;
 
     @ExcelProperty("序号")
-    @ApiModelProperty("请假人")
-    private Integer 序号;
+    @ApiModelProperty("序号")
+    private Integer sortCode;
 
     @ExcelProperty("请假人")
     @ApiModelProperty("请假人")
@@ -33,8 +33,4 @@ public class TeacherLeavePageVo {
     @ApiModelProperty("所属部门")
     private String deptName;
 
-    @ExcelProperty("请假天数")
-    @ApiModelProperty("请假天数")
-    private String leaveDays;
-
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java

@@ -22,4 +22,6 @@ public interface WfTeacherleaveMapper extends MPJBaseMapper<WfTeacherleave> {
     List<WfTeacherleave> getLeaveList(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 
     WfTeacherleave getLeaveByUserId(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userId")Long userId);
+
+    List<WfTeacherleave> getUserLeaveList(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java

@@ -4,6 +4,7 @@ import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -30,4 +31,6 @@ public interface IWfTeacherleaveService extends MPJBaseService<WfTeacherleave> {
     WfTeacherleave getLeaveByUserId(LocalDateTime startTime, LocalDateTime endTime, Long userId);
 
     void updateAttendancestatus(Long id);
+
+    Map<String, List<WfTeacherleave>> getUserLeaveList(LocalDateTime startTime, LocalDateTime endTime);
 }

+ 9 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -35,6 +35,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @title: 教职工请假流程
@@ -319,4 +320,12 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
          */
         private Long turnNum;
     }
+
+    @Override
+    public Map<String, List<WfTeacherleave>> getUserLeaveList(LocalDateTime startTime, LocalDateTime endTime) {
+        List<WfTeacherleave> leaveList = wfTeacherleaveMapper.getUserLeaveList(startTime, endTime);
+        Map<String, List<WfTeacherleave>> result = leaveList.stream().collect(Collectors.groupingBy(WfTeacherleave::getUserId));
+
+        return result;
+    }
 }

+ 23 - 5
src/main/resources/mapper/teacher/WfTeacherleaveMapper.xml

@@ -6,7 +6,8 @@
     <select id="getLeaveCount" resultType="java.lang.Long">
         SELECT COUNT(*) FROM wf_teacherleave t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
-        WHERE t1.status = 1 AND t2.delete_mark = 0
+        inner JOIN xjr_workflow_form_relation t3 ON t3.form_key_value = t1.id
+        WHERE t3.current_state = 'COMPLETED' AND t2.delete_mark = 0
         AND (
         (leave_start_time BETWEEN #{startTime} and #{endTime})
         OR (leave_end_time BETWEEN #{startTime} and #{endTime})
@@ -17,8 +18,9 @@
 
     <select id="getLeaveList" resultType="com.xjrsoft.module.teacher.entity.WfTeacherleave">
         SELECT * FROM wf_teacherleave t1
-                                 INNER JOIN xjr_user t2 ON t1.user_id = t2.id
-        WHERE t1.status = 1 AND t2.delete_mark = 0
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        inner JOIN xjr_workflow_form_relation t3 ON t3.form_key_value = t1.id
+        WHERE t3.current_state = 'COMPLETED' AND t2.delete_mark = 0
           AND (
                 (leave_start_time BETWEEN #{startTime} and #{endTime})
                 OR (leave_end_time BETWEEN #{startTime} and #{endTime})
@@ -28,8 +30,9 @@
     </select>
     <select id="getLeaveByUserId" resultType="com.xjrsoft.module.teacher.entity.WfTeacherleave">
         SELECT * FROM wf_teacherleave t1
-                          INNER JOIN xjr_user t2 ON t1.user_id = t2.id
-        WHERE t1.status = 1 AND t2.delete_mark = 0
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        inner JOIN xjr_workflow_form_relation t3 ON t3.form_key_value = t1.id
+        WHERE t3.current_state = 'COMPLETED' AND t2.delete_mark = 0
           AND (
                 (leave_start_time BETWEEN #{startTime} and #{endTime})
                 OR (leave_end_time BETWEEN #{startTime} and #{endTime})
@@ -38,4 +41,19 @@
             )
         and t2.id = #{userId}
     </select>
+
+    <select id="getUserLeaveList" resultType="com.xjrsoft.module.teacher.entity.WfTeacherleave">
+        SELECT * FROM wf_teacherleave t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        inner JOIN xjr_workflow_form_relation t3 ON t3.form_key_value = t1.id
+        WHERE t3.current_state = 'COMPLETED' AND t2.delete_mark = 0
+        <if test="startTime != null and endTime != null">
+            AND (
+                (leave_start_time BETWEEN #{startTime} and #{endTime})
+                OR (leave_end_time BETWEEN #{startTime} and #{endTime})
+                OR (leave_start_time > #{startTime} and #{endTime} > leave_end_time)
+                OR (#{startTime} > leave_start_time and leave_end_time > #{endTime})
+            )
+        </if>
+    </select>
 </mapper>