Browse Source

台账统计调整

dzx 1 year ago
parent
commit
eaefd92911

+ 104 - 9
src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java

@@ -13,6 +13,7 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.ledger.dto.LedgerStatisticsPageDto;
 import com.xjrsoft.module.ledger.vo.LedgerStatisticsLeaveVo;
+import com.xjrsoft.module.ledger.vo.LedgerStatisticsListenVo;
 import com.xjrsoft.module.ledger.vo.LedgerStatisticsOvertimeVo;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
@@ -167,10 +168,10 @@ public class LedgerStatisticsController {
             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 + "')" +
+                "   (t.overtime_start_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                "   OR (t.overtime_end_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                "   OR (t.overtime_start_time > '" + startTime + "' and '" + endTime + "' > t.overtime_end_time)" +
+                "   OR ('" + startTime + "' > t.overtime_start_time and t.overtime_end_time > '" + endTime + "')" +
                 ")";
         }
         sql += " GROUP BY t4.teacher_user_id";
@@ -196,7 +197,7 @@ public class LedgerStatisticsController {
     @PostMapping(value = "/teacher-overtime-export-query")
     @ApiOperation(value="教师加班统计-导出")
     @SaCheckPermission("ledgerstatistics:detail")
-    public ResponseEntity<byte[]> teacherOvertimeExportQuery(@Valid LedgerStatisticsPageDto dto){
+    public ResponseEntity<byte[]> teacherOvertimeExportQuery(@Valid @RequestBody LedgerStatisticsPageDto dto){
         List<LedgerStatisticsOvertimeVo> userPage = userService.selectJoinList(LedgerStatisticsOvertimeVo.class,
                 new MPJLambdaWrapper<User>()
                         .disableSubLogicDel()
@@ -221,10 +222,10 @@ public class LedgerStatisticsController {
             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 + "')" +
+                    "   (t.overtime_start_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                    "   OR (t.overtime_end_time BETWEEN '" + startTime + "' and '" + endTime + "')" +
+                    "   OR (t.overtime_start_time > '" + startTime + "' and '" + endTime + "' > t.overtime_end_time)" +
+                    "   OR ('" + startTime + "' > t.overtime_start_time and t.overtime_end_time > '" + endTime + "')" +
                     ")";
         }
         sql += " GROUP BY t4.teacher_user_id";
@@ -249,4 +250,98 @@ public class LedgerStatisticsController {
         return RT.fileStream(bot.toByteArray(), "teacher-overtime" + ExcelTypeEnum.XLSX.getValue());
     }
 
+    @GetMapping(value = "/teacher-listen-page")
+    @ApiOperation(value="教师听课统计(分页)")
+    @SaCheckPermission("ledgerstatistics:detail")
+    public RT<PageOutput<LedgerStatisticsListenVo>> teacherListenPage(@Valid LedgerStatisticsPageDto dto){
+        IPage<LedgerStatisticsListenVo> userPage = userService.selectJoinListPage(ConventPage.getPage(dto), LedgerStatisticsListenVo.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");
+
+        String sql = "SELECT t1.user_id,count(t1.course_name) as course_count FROM wf_teacher_listen t1" +
+                " LEFT JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
+                " WHERE t2.current_state = 'COMPLETED'";
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            String startTime = dto.getStartDate().format(dtf);
+            String endTime = dto.getEndDate().format(dtf);
+            sql += " AND t1.schedule_date BETWEEN '" + startTime + "' and '" + endTime + "'";
+        }
+        sql += " GROUP BY t1.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("user_id").toString()), x -> x.get("course_count").toString())
+        );
+        for (LedgerStatisticsListenVo 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.setCourseCount(formattedValue);
+        }
+
+        PageOutput<LedgerStatisticsListenVo> pageOutput = ConventPage.getPageOutput(userPage, LedgerStatisticsListenVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/teacher-listen-export-query")
+    @ApiOperation(value="教师听课统计-导出")
+    @SaCheckPermission("ledgerstatistics:detail")
+    public ResponseEntity<byte[]> teacherListenExportQuery(@Valid @RequestBody LedgerStatisticsPageDto dto){
+        List<LedgerStatisticsListenVo> userPage = userService.selectJoinList(LedgerStatisticsListenVo.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");
+
+        String sql = "SELECT t1.user_id,count(t1.course_name) as course_count FROM wf_teacher_listen t1" +
+                " LEFT JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
+                " WHERE t2.current_state = 'COMPLETED'";
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            String startTime = dto.getStartDate().format(dtf);
+            String endTime = dto.getEndDate().format(dtf);
+            sql += " AND t1.schedule_date BETWEEN '" + startTime + "' and '" + endTime + "'";
+        }
+        sql += " GROUP BY t1.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("user_id").toString()), x -> x.get("course_count").toString())
+        );
+        for (LedgerStatisticsListenVo 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.setCourseCount(formattedValue);
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, LedgerStatisticsListenVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "teacher-listen" + ExcelTypeEnum.XLSX.getValue());
+    }
+
 }

+ 21 - 0
src/main/java/com/xjrsoft/module/ledger/vo/LedgerStatisticsListenVo.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 LedgerStatisticsListenVo extends LedgerStatisticsPageVo{
+
+    @ExcelProperty("听课次数")
+    @ApiModelProperty("听课次数")
+    private String courseCount;
+
+}