Kaynağa Gözat

请假统计调整

dzx 11 ay önce
ebeveyn
işleme
8dff28b0a9

+ 8 - 82
src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java

@@ -6,6 +6,7 @@ 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.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
@@ -26,7 +27,6 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.vo.UserPageVo;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
-import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -41,7 +41,6 @@ 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.ArrayList;
 import java.util.List;
@@ -82,47 +81,11 @@ public class LedgerStatisticsController {
             userIdList.addAll(userList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList()));
         }
 
-        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, userIdList);
-
-        List<String> userIds = new ArrayList<>(userLeaveMap.keySet());
-        if(userIds.isEmpty()){
-            return RT.ok(new PageOutput<>());
-        }
-
-        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) 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())
-                        .like(StrUtil.isNotEmpty(dto.getUserName()), User::getUserName, dto.getUserName())
-                        .in(User::getId, userIds)
-                        .orderByAsc(User::getId)
-        );
-
-        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);
+        if(!userIdList.isEmpty()){
+            dto.setUserIds(userIdList);
         }
-
-        PageOutput<LedgerStatisticsLeaveVo> pageOutput = ConventPage.getPageOutput(userPage, LedgerStatisticsLeaveVo.class);
+        Page<LedgerStatisticsLeaveVo> page = teacherleaveService.getStatisticsPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<LedgerStatisticsLeaveVo> pageOutput = ConventPage.getPageOutput(page, LedgerStatisticsLeaveVo.class);
         return RT.ok(pageOutput);
     }
 
@@ -143,50 +106,13 @@ public class LedgerStatisticsController {
             userIdList.addAll(userList.stream().map(UserDeptRelation::getUserId).collect(Collectors.toList()));
         }
 
-        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, userIdList);
-
-        List<String> userIds = new ArrayList<>(userLeaveMap.keySet());
-        if(userIds.isEmpty()){
-            List<LedgerStatisticsLeaveExcelVo> list = new ArrayList<>();
-            ByteArrayOutputStream bot = new ByteArrayOutputStream();
-            EasyExcel.write(bot, LedgerStatisticsLeaveExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
-
-            return RT.fileStream(bot.toByteArray(), "teacher-leave" + ExcelTypeEnum.XLSX.getValue());
+        if(!userIdList.isEmpty()){
+            dto.setUserIds(userIdList);
         }
-
-        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())
-                        .like(StrUtil.isNotEmpty(dto.getUserName()), User::getUserName, dto.getUserName())
-                        .in(User::getId, userIds)
-                        .orderByAsc(User::getId)
-        );
+        List<LedgerStatisticsLeaveVo> list = teacherleaveService.getStatisticsList(dto);
         List<LedgerStatisticsLeaveExcelVo> dataList = new ArrayList<>();
-
         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);
             LedgerStatisticsLeaveExcelVo bean = BeanUtil.toBean(record, LedgerStatisticsLeaveExcelVo.class);
             dataList.add(bean);

+ 6 - 0
src/main/java/com/xjrsoft/module/ledger/dto/LedgerStatisticsPageDto.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.ledger.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -7,6 +8,7 @@ import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDate;
+import java.util.List;
 
 
 /**
@@ -35,4 +37,8 @@ public class LedgerStatisticsPageDto extends PageInput {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("请假结束日期")
     private LocalDate endDate;
+
+    @JsonIgnore
+    @ApiModelProperty("用户ids")
+    private List<Long> userIds;
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsLeaveExcelVo.java

@@ -30,6 +30,10 @@ public class LedgerStatisticsLeaveExcelVo{
     @ApiModelProperty("所属部门")
     private String deptName;
 
+    @ExcelProperty("请假类型")
+    @ApiModelProperty("请假类型")
+    private String leaveType;
+
     @ExcelProperty("请假天数")
     @ApiModelProperty("请假天数")
     private String leaveDays;

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

@@ -18,4 +18,7 @@ public class LedgerStatisticsLeaveVo extends LedgerStatisticsPageVo{
     @ApiModelProperty("请假天数")
     private String leaveDays;
 
+    @ExcelProperty("请假类型")
+    @ApiModelProperty("请假类型")
+    private String leaveType;
 }

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

@@ -1,6 +1,9 @@
 package com.xjrsoft.module.teacher.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -24,4 +27,8 @@ public interface WfTeacherleaveMapper extends MPJBaseMapper<WfTeacherleave> {
     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, @Param("userIds") List<Long> userIds);
+
+    Page<LedgerStatisticsLeaveVo> getStatisticsPage(Page<LedgerStatisticsLeaveVo> page, @Param("dto") LedgerStatisticsPageDto dto);
+
+    List<LedgerStatisticsLeaveVo> getStatisticsList(@Param("dto") LedgerStatisticsPageDto dto);
 }

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

@@ -1,7 +1,11 @@
 package com.xjrsoft.module.teacher.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
+import org.apache.ibatis.annotations.Param;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -33,4 +37,8 @@ public interface IWfTeacherleaveService extends MPJBaseService<WfTeacherleave> {
     void updateAttendancestatus(Long id);
 
     Map<String, List<WfTeacherleave>> getUserLeaveList(LocalDateTime startTime, LocalDateTime endTime, List<Long> userIds);
+
+    Page<LedgerStatisticsLeaveVo> getStatisticsPage(Page<LedgerStatisticsLeaveVo> page, LedgerStatisticsPageDto dto);
+
+    List<LedgerStatisticsLeaveVo> getStatisticsList(LedgerStatisticsPageDto dto);
 }

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

@@ -3,6 +3,7 @@ package com.xjrsoft.module.teacher.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
@@ -14,6 +15,8 @@ import com.xjrsoft.module.attendance.mapper.TeacherAttendanceRecordMapper;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
+import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
 import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
@@ -328,4 +331,14 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
 
         return result;
     }
+
+    @Override
+    public Page<LedgerStatisticsLeaveVo> getStatisticsPage(Page<LedgerStatisticsLeaveVo> page, LedgerStatisticsPageDto dto) {
+        return this.baseMapper.getStatisticsPage(page, dto);
+    }
+
+    @Override
+    public List<LedgerStatisticsLeaveVo> getStatisticsList(LedgerStatisticsPageDto dto) {
+        return this.baseMapper.getStatisticsList(dto);
+    }
 }

+ 58 - 0
src/main/resources/mapper/teacher/WfTeacherleaveMapper.xml

@@ -62,4 +62,62 @@
             </foreach>
         </if>
     </select>
+
+    <select id="getStatisticsPage" parameterType="com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto" resultType="com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo">
+        SELECT t2.user_name, t2.name, t1.leave_type,SUM(t1.leave_days) as leave_days
+        ,(
+        SELECT GROUP_CONCAT(a1.name) FROM xjr_department a1
+        INNER JOIN xjr_user_dept_relation a2 ON a1.id = a2.dept_id
+        WHERE a1.delete_mark = 0 AND a2.user_id = t2.id
+        ) AS dept_name
+        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="dto.startDate != null and dto.endDate != null">
+            AND (
+            (t1.leave_start_time BETWEEN concat(#{dto.startDate}, '00:00:00') and concat(#{dto.endDate}, '23:59:59'))
+            OR (t1.leave_end_time BETWEEN concat(#{dto.startDate}, '00:00:00') and concat(#{dto.endDate}, '23:59:59'))
+            OR (t1.leave_start_time > concat(#{dto.startDate}, '00:00:00') and concat(#{dto.endDate}, '23:59:59') > t1.leave_end_time)
+            OR (concat(#{dto.startDate}, '00:00:00') > t1.leave_start_time and t1.leave_end_time > concat(#{dto.endDate}, '23:59:59'))
+            )
+        </if>
+        <if test="dto.userIds != null and dto.userIds.size() > 0">
+            AND t1.user_id in
+            <foreach item="userId" index="index" collection="dto.userIds" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+        GROUP BY t1.user_id,t1.leave_type
+        ORDER BY t2.user_name
+    </select>
+
+    <select id="getStatisticsList" parameterType="com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto" resultType="com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo">
+        SELECT t2.user_name, t2.name, t1.leave_type,SUM(t1.leave_days) as leave_days
+        ,(
+        SELECT GROUP_CONCAT(a1.name) FROM xjr_department a1
+        INNER JOIN xjr_user_dept_relation a2 ON a1.id = a2.dept_id
+        WHERE a1.delete_mark = 0 AND a2.user_id = t2.id
+        ) AS dept_name
+        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="dto.startDate != null and dto.endDate != null">
+            AND (
+            (t1.leave_start_time BETWEEN concat(#{dto.startDate}, '00:00:00') and concat(#{dto.endDate}, '23:59:59'))
+            OR (t1.leave_end_time BETWEEN concat(#{dto.startDate}, '00:00:00') and concat(#{dto.endDate}, '23:59:59'))
+            OR (t1.leave_start_time > concat(#{dto.startDate}, '00:00:00') and concat(#{dto.endDate}, '23:59:59') > t1.leave_end_time)
+            OR (concat(#{dto.startDate}, '00:00:00') > t1.leave_start_time and t1.leave_end_time > concat(#{dto.endDate}, '23:59:59'))
+            )
+        </if>
+        <if test="dto.userIds != null and dto.userIds.size() > 0">
+            AND t1.user_id in
+            <foreach item="userId" index="index" collection="dto.userIds" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+        GROUP BY t1.user_id,t1.leave_type
+        ORDER BY t2.user_name
+    </select>
 </mapper>