浏览代码

1、考勤统计调整
2、台账统计

dzx 1 年之前
父节点
当前提交
e0d2409ef9

+ 9 - 0
src/main/java/com/xjrsoft/module/attendance/controller/TeacherAttendanceRecordController.java

@@ -12,6 +12,7 @@ import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AddTeacherAttendanceRecordDto;
+import com.xjrsoft.module.attendance.dto.ResetTeacherAttendanceRecordDto;
 import com.xjrsoft.module.attendance.dto.TeacherAttendanceRecordPageDto;
 import com.xjrsoft.module.attendance.dto.UpdateTeacherAttendanceRecordDto;
 import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
@@ -119,4 +120,12 @@ public class TeacherAttendanceRecordController {
         return RT.ok(teacherAttendanceRecordService.removeBatchByIds(ids));
     }
 
+    @PostMapping("reset-data")
+    @ApiOperation(value = "重置考勤数据")
+    @SaCheckPermission("teacherattendancerecord:reset-data")
+    public RT<Boolean> add(@Valid @RequestBody ResetTeacherAttendanceRecordDto dto){
+        Boolean aBoolean = teacherAttendanceRecordService.resetData(dto);
+        return RT.ok(aBoolean);
+    }
+
 }

+ 25 - 0
src/main/java/com/xjrsoft/module/attendance/dto/ResetTeacherAttendanceRecordDto.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class ResetTeacherAttendanceRecordDto{
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("考勤日期")
+    private LocalDate attendanceDate;
+
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+}

+ 42 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/TeacherAttendanceRecordServiceImpl.java

@@ -2,14 +2,28 @@ package com.xjrsoft.module.attendance.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
+import com.xjrsoft.module.attendance.dto.ResetTeacherAttendanceRecordDto;
 import com.xjrsoft.module.attendance.dto.TeacherDetailsDto;
 import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
 import com.xjrsoft.module.attendance.mapper.TeacherAttendanceRecordMapper;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
 import com.xjrsoft.module.attendance.service.ITeacherAttendanceRecordService;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsPageVo;
+import com.xjrsoft.module.holiday.service.IHolidayDateService;
+import com.xjrsoft.module.job.AttendanceRecordTask;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.outint.service.ICarOutInRecordService;
+import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
+import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import lombok.AllArgsConstructor;
+import me.zhyd.oauth.log.Log;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
@@ -21,6 +35,12 @@ import java.util.List;
 @Service
 @AllArgsConstructor
 public class TeacherAttendanceRecordServiceImpl extends MPJBaseServiceImpl<TeacherAttendanceRecordMapper, TeacherAttendanceRecord> implements ITeacherAttendanceRecordService {
+    private final IUserService userService;
+    private final IAttendanceRuleCategoryService ruleCategoryService;
+    private final IHolidayDateService holidayDateService;
+    private final IWfTeacherleaveService wfTeacherleaveService;
+    private final ITeacherOutInRecordService outInRecordService;
+    private final ICarOutInRecordService carOutInRecordService;
     @Override
     public Page<TeacherStatisticsPageVo> getPage(Page<TeacherStatisticsPageVo> page, TeacherDetailsDto dto) {
         return this.baseMapper.getPage(page, dto);
@@ -30,4 +50,26 @@ public class TeacherAttendanceRecordServiceImpl extends MPJBaseServiceImpl<Teach
     public List<TeacherStatisticsPageVo> getList(TeacherDetailsDto dto) {
         return this.baseMapper.getList(dto);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean resetData(ResetTeacherAttendanceRecordDto dto) {
+        try {
+            LocalDateTime startDateTime = dto.getAttendanceDate().atTime(0,0,0);
+            AttendanceRecordTask recordTask = new AttendanceRecordTask();
+            recordTask.teacherAttendanceRecord(startDateTime, dto.getTimeInterval(),
+                    userService,
+                    ruleCategoryService,
+                    holidayDateService,
+                    wfTeacherleaveService,
+                    outInRecordService,
+                    carOutInRecordService,
+                    this
+            );
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
+            throw new MyException("同步出错,请联系管理员");
+        }
+        return true;
+    }
 }

+ 90 - 54
src/main/java/com/xjrsoft/module/job/AttendanceRecordTask.java

@@ -192,39 +192,57 @@ public class AttendanceRecordTask {
             outInDto.setStatus(OutInStatusEnum.enter.getCode());
             outInDto.setUserId(record.getUserId());
             List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.getListByParam(outInDto);
-            if(!outInRecords.isEmpty()){
+
+            //查询该教师是否通过车辆进入
+            List<CarOutInRecord> list = carOutInRecordService.list(
+                    new MPJLambdaWrapper<CarOutInRecord>()
+                            .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
+                            .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
+                            .le(CarOutInRecord::getRecordTime, endTime)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .eq(CarMessageApply::getUserId, record.getUserId())
+                            .ge(timePeriod == 2, CarOutInRecord::getRecordTime, amEndTime)
+                            .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
+                            .orderByAsc(CarOutInRecord::getRecordTime)
+            );
+            //最早进入方式:1人脸 2车辆
+            Integer inStatus = 0;
+            if(!outInRecords.isEmpty() && !list.isEmpty()){
+                TeacherOutInRecord teacherOutInRecord = outInRecords.get(0);
+                CarOutInRecord carOutInRecord = list.get(0);
+                int result = teacherOutInRecord.getRecordTime().compareTo(carOutInRecord.getRecordTime());
+                if(result < 0){//人脸进入
+                    inStatus = 1;
+                }else if(result == 0){//同时
+                    inStatus = 0;
+                }else{//车辆进入
+                    inStatus = 2;
+                }
+            }else if(!outInRecords.isEmpty()){
+                inStatus = 1;
+            }else if(!list.isEmpty()){
+                inStatus = 2;
+            }
+
+            if(inStatus == 1){
                 TeacherOutInRecord outInRecord = outInRecords.get(0);
                 if(outInRecord != null){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus(outInRecord.getAttendanceStatus());
                     record.setAttendanceMode(1);
                 }
-            }else{
-                //查询该教师是否通过车辆进入
-                List<CarOutInRecord> list = carOutInRecordService.list(
-                        new MPJLambdaWrapper<CarOutInRecord>()
-                                .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
-                                .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
-                                .le(CarOutInRecord::getRecordTime, endTime)
-                                .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
-                                .eq(CarMessageApply::getUserId, record.getUserId())
-                                .ge(timePeriod != null && timePeriod == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                                .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
-                                .orderByAsc(CarOutInRecord::getRecordTime)
-                );
-                if(!list.isEmpty()){
-                    CarOutInRecord outInRecord = list.get(0);
-                    if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
-                        record.setRecordTime(outInRecord.getRecordTime());
-                        record.setAttendanceStatus("到校");
-                        record.setAttendanceMode(2);
-                        record.setCarNumber(outInRecord.getPlanNo());
-                    }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
-                        record.setRecordTime(outInRecord.getRecordTime());
-                        record.setAttendanceStatus("迟到");
-                        record.setAttendanceMode(1);
-                        record.setCarNumber(outInRecord.getPlanNo());
-                    }
+            }else if(inStatus == 2){
+                CarOutInRecord outInRecord = list.get(0);
+                if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("到校");
+                    record.setAttendanceMode(2);
+                    record.setCarNumber(outInRecord.getPlanNo());
+                }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("迟到");
+                    record.setAttendanceMode(1);
+                    record.setCarNumber(outInRecord.getPlanNo());
                 }
             }
 
@@ -349,39 +367,57 @@ public class AttendanceRecordTask {
             outInDto.setStatus(OutInStatusEnum.enter.getCode());
             outInDto.setUserId(record.getUserId());
             List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.getListByParam(outInDto);
-            if(!outInRecords.isEmpty()){
+
+            //查询该教师是否通过车辆进入
+            List<CarOutInRecord> list = carOutInRecordService.list(
+                    new MPJLambdaWrapper<CarOutInRecord>()
+                            .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
+                            .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
+                            .le(CarOutInRecord::getRecordTime, endTime)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .eq(CarMessageApply::getUserId, record.getUserId())
+                            .ge(timePeriod == 2, CarOutInRecord::getRecordTime, amEndTime)
+                            .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
+                            .orderByAsc(CarOutInRecord::getRecordTime)
+            );
+            //最早进入方式:1人脸 2车辆
+            Integer inStatus = 0;
+            if(!outInRecords.isEmpty() && !list.isEmpty()){
+                TeacherOutInRecord teacherOutInRecord = outInRecords.get(0);
+                CarOutInRecord carOutInRecord = list.get(0);
+                int result = teacherOutInRecord.getRecordTime().compareTo(carOutInRecord.getRecordTime());
+                if(result < 0){//人脸进入
+                    inStatus = 1;
+                }else if(result == 0){//同时
+                    inStatus = 0;
+                }else{//车辆进入
+                    inStatus = 2;
+                }
+            }else if(!outInRecords.isEmpty()){
+                inStatus = 1;
+            }else if(!list.isEmpty()){
+                inStatus = 2;
+            }
+
+            if(inStatus == 1){
                 TeacherOutInRecord outInRecord = outInRecords.get(0);
                 if(outInRecord != null){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setAttendanceStatus(outInRecord.getAttendanceStatus());
                     record.setAttendanceMode(1);
                 }
-            }else{
-                //查询该教师是否通过车辆进入
-                List<CarOutInRecord> list = carOutInRecordService.list(
-                        new MPJLambdaWrapper<CarOutInRecord>()
-                                .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
-                                .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
-                                .le(CarOutInRecord::getRecordTime, endTime)
-                                .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
-                                .eq(CarMessageApply::getUserId, record.getUserId())
-                                .ge(timePeriod == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                                .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
-                                .orderByAsc(CarOutInRecord::getRecordTime)
-                );
-                if(!list.isEmpty()){
-                    CarOutInRecord outInRecord = list.get(0);
-                    if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
-                        record.setRecordTime(outInRecord.getRecordTime());
-                        record.setAttendanceStatus("到校");
-                        record.setAttendanceMode(2);
-                        record.setCarNumber(outInRecord.getPlanNo());
-                    }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
-                        record.setRecordTime(outInRecord.getRecordTime());
-                        record.setAttendanceStatus("迟到");
-                        record.setAttendanceMode(1);
-                        record.setCarNumber(outInRecord.getPlanNo());
-                    }
+            }else if(inStatus == 2){
+                CarOutInRecord outInRecord = list.get(0);
+                if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("到校");
+                    record.setAttendanceMode(2);
+                    record.setCarNumber(outInRecord.getPlanNo());
+                }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus("迟到");
+                    record.setAttendanceMode(1);
+                    record.setCarNumber(outInRecord.getPlanNo());
                 }
             }
 

+ 71 - 0
src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java

@@ -0,0 +1,71 @@
+package com.xjrsoft.module.ledger.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.model.result.RT;
+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.organization.entity.User;
+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;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+* @title: 台账配置表
+* @Author dzx
+* @Date: 2024-03-06
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/ledger" + "/ledgerStatistics")
+@Api(value = "/ledger"  + "/ledgerStatistics",tags = "台账统计代码")
+@AllArgsConstructor
+public class LedgerStatisticsController {
+
+
+    private final IUserService userService;
+    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,
+                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" +
+                                " INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.dept_id" +
+                                " WHERE t1.delete_mark = 0 AND t2.user_id = t.id")
+                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .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<Long, WfTeacherleave> leaveMap = teacherleaveService.getLeaveList(startTime, endTime);
+        PageOutput<TeacherLeavePageVo> pageOutput = ConventPage.getPageOutput(userPage, TeacherLeavePageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/ledger/dto/TeacherLeavePageDto.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.ledger.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+
+/**
+* @title: 台账配置表分页查询入参
+* @Author dzx
+* @Date: 2024-03-06
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TeacherLeavePageDto extends PageInput {
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("工号")
+    private String userName;
+
+    @ApiModelProperty("所属部门")
+    private String deptName;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("请假开始日期")
+    private LocalDate startDate;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("请假结束日期")
+    private LocalDate endDate;
+}

+ 40 - 0
src/main/java/com/xjrsoft/module/ledger/vo/TeacherLeavePageVo.java

@@ -0,0 +1,40 @@
+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;
+
+
+/**
+* @title: 台账配置表分页查询入参
+* @Author dzx
+* @Date: 2024-03-06
+* @Version 1.0
+*/
+@Data
+public class TeacherLeavePageVo {
+
+    @ExcelProperty("序号")
+    @ApiModelProperty("请假人")
+    private Integer 序号;
+
+    @ExcelProperty("请假人")
+    @ApiModelProperty("请假人")
+    private String name;
+
+    @ExcelProperty("工号")
+    @ApiModelProperty("工号")
+    private String userName;
+
+    @ExcelProperty("所属部门")
+    @ApiModelProperty("所属部门")
+    private String deptName;
+
+    @ExcelProperty("请假天数")
+    @ApiModelProperty("请假天数")
+    private String leaveDays;
+
+}