浏览代码

/teacher/attendanceRecord/getPresentUserCheckInfo 打卡考勤记录,进行打卡
/teacher/attendancePersonnel/ 打卡考勤人员管理
/teacher/attendancePersonnel/addBatch 批量添加需要考勤的人员,当该人员已经在名单里面不需要重复添加

phoenix 1 年之前
父节点
当前提交
865779d6bf

+ 34 - 0
src/main/java/com/xjrsoft/common/enums/AttendanceNodeEnum.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description:TODO
+ * @author: phoenix
+ * @create: 2023/12/19 9:42
+ * @Version 1.0
+ */
+public enum AttendanceNodeEnum {
+    /*
+     *  上班打卡
+     * */
+    STARTWORK("start_work", "上班打卡"),
+    /*
+     *  下班打卡
+     * */
+    ENDWORK("end_work", "下班打卡");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    AttendanceNodeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 8 - 0
src/main/java/com/xjrsoft/module/teacher/controller/AttendancePersonnelController.java

@@ -91,6 +91,14 @@ public class AttendancePersonnelController {
     return RT.ok(isSuccess);
     }
 
+    @PostMapping("/addBatch")
+    @ApiOperation(value = "批量添加考勤-人员")
+    @SaCheckPermission("attendancepersonnel:add")
+    public RT<Boolean> addBatch(@Valid @RequestBody List<Long> userIds){
+        boolean isSuccess = attendancePersonnelService.addBatch(userIds);
+        return RT.ok(isSuccess);
+    }
+
     @PutMapping
     @ApiOperation(value = "修改考勤-人员")
     @SaCheckPermission("attendancepersonnel:edit")

+ 8 - 0
src/main/java/com/xjrsoft/module/teacher/controller/AttendanceRecordController.java

@@ -17,6 +17,7 @@ import com.alibaba.excel.support.ExcelTypeEnum;
 import com.xjrsoft.module.teacher.entity.AttendanceConfig;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.vo.AttendanceConfigPageVo;
+import com.xjrsoft.module.teacher.vo.PresentUserCheckInfoVo;
 import org.springframework.http.ResponseEntity;
 import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
@@ -76,6 +77,13 @@ public class AttendanceRecordController {
         return RT.ok(dayList);
     }
 
+    @GetMapping(value = "/getPresentUserCheckInfo")
+    @ApiOperation(value="获取当前用户当天上班打卡数据")
+    @SaCheckPermission("attendancerecord:detail")
+    public RT<PresentUserCheckInfoVo> getPresentUserCheckInfo(){
+        PresentUserCheckInfoVo presentUserCheckInfo = attendanceRecordService.getPresentUserCheckInfo();
+        return RT.ok(presentUserCheckInfo);
+    }
 
     @GetMapping(value = "/info")
     @ApiOperation(value="根据id查询考勤-记录信息")

+ 0 - 15
src/main/java/com/xjrsoft/module/teacher/dto/ClockInDto.java

@@ -19,21 +19,6 @@ public class ClockInDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    /**
-    * 用户编号
-    */
-    @ApiModelProperty("用户编号")
-    private Long userId;
-    /**
-    * 考勤时间
-    */
-    @ApiModelProperty("考勤时间")
-    private String attendanceTime;
-    /**
-    * 打卡时间
-    */
-    @ApiModelProperty("打卡时间")
-    private Date checkTime;
     /**
     * 考勤节点(xjr_dictionary_item[attendance_node])
     */

+ 7 - 0
src/main/java/com/xjrsoft/module/teacher/service/IAttendancePersonnelService.java

@@ -14,4 +14,11 @@ import java.util.List;
 */
 
 public interface IAttendancePersonnelService extends MPJBaseService<AttendancePersonnel> {
+
+    /**
+     * 批量添加考勤-人员
+     * @param userIds
+     * @return
+     */
+    Boolean addBatch(List<Long> userIds);
 }

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

@@ -6,6 +6,8 @@ import com.xjrsoft.module.teacher.dto.AddAttendanceRecordDto;
 import com.xjrsoft.module.teacher.dto.ClockInDto;
 import com.xjrsoft.module.teacher.dto.GetCheckInDayDto;
 import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import com.xjrsoft.module.teacher.vo.AttendanceRecordVo;
+import com.xjrsoft.module.teacher.vo.PresentUserCheckInfoVo;
 import lombok.Data;
 import java.util.List;
 
@@ -29,4 +31,10 @@ public interface IAttendanceRecordService extends MPJBaseService<AttendanceRecor
      * @param dto
      */
     List<String> getCheckInDay(GetCheckInDayDto dto);
+
+
+    /**
+     * 获取当前用户当天上班打卡数据
+     */
+    PresentUserCheckInfoVo getPresentUserCheckInfo();
 }

+ 20 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/AttendancePersonnelServiceImpl.java

@@ -1,5 +1,7 @@
 package com.xjrsoft.module.teacher.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.module.teacher.entity.AttendancePersonnel;
@@ -8,6 +10,8 @@ import com.xjrsoft.module.teacher.service.IAttendancePersonnelService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -22,4 +26,20 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 @Service
 @AllArgsConstructor
 public class AttendancePersonnelServiceImpl extends MPJBaseServiceImpl<AttendancePersonnelMapper, AttendancePersonnel> implements IAttendancePersonnelService {
+    @Override
+    public Boolean addBatch(List<Long> userIds) {
+        List<AttendancePersonnel> addList = new ArrayList<>();
+        //判断该userId是否已经添加到考勤人员了
+        for (Long userId : userIds) {
+            AttendancePersonnel attendancePersonnel = new AttendancePersonnel();
+            LambdaQueryWrapper<AttendancePersonnel> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(AttendancePersonnel::getUserId,userId);
+            Long count = this.count(queryWrapper);
+            if(ObjectUtil.isNull(count) || count<=0){
+                attendancePersonnel.setUserId(userId);
+                addList.add(attendancePersonnel);
+            }
+        }
+        return this.saveBatch(addList);
+    }
 }

+ 92 - 10
src/main/java/com/xjrsoft/module/teacher/service/impl/AttendanceRecordServiceImpl.java

@@ -1,25 +1,36 @@
 package com.xjrsoft.module.teacher.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.mysql.cj.jdbc.exceptions.MySQLQueryInterruptedException;
+import com.xjrsoft.common.enums.AttendanceNodeEnum;
 import com.xjrsoft.common.exception.MyException;
 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.organization.entity.Post;
+import com.xjrsoft.module.organization.entity.UserPostRelation;
 import com.xjrsoft.module.teacher.dto.ClockInDto;
 import com.xjrsoft.module.teacher.dto.GetCheckInDayDto;
 import com.xjrsoft.module.teacher.entity.AttendanceConfig;
 import com.xjrsoft.module.teacher.entity.AttendanceRecord;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.AttendanceRecordMapper;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
 import com.xjrsoft.module.teacher.service.IAttendanceConfigService;
 import com.xjrsoft.module.teacher.service.IAttendanceRecordService;
 import com.xjrsoft.module.teacher.vo.AttendanceConfigPageVo;
+import com.xjrsoft.module.teacher.vo.AttendanceRecordPageVo;
+import com.xjrsoft.module.teacher.vo.AttendanceRecordVo;
+import com.xjrsoft.module.teacher.vo.PresentUserCheckInfoVo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,26 +60,31 @@ public class AttendanceRecordServiceImpl extends MPJBaseServiceImpl<AttendanceRe
     private final IAttendanceConfigService attendanceConfigService;
 
     private final AttendanceRecordMapper attendanceRecordMapper;
+
+    private final XjrUserMapper xjrUserMapper;
     @Override
     public Boolean addAttendanceRecordOfClockIn(AttendanceRecord attendanceRecord) {
-        if(ObjectUtil.isNotNull(attendanceRecord.getLeaveReason())
-                && ObjectUtil.isNotNull(attendanceRecord.getLongitude())
+        if(ObjectUtil.isNotNull(attendanceRecord.getLongitude())
                 && ObjectUtil.isNotNull(attendanceRecord.getLatitude())
                 && ObjectUtil.isNotNull(attendanceRecord.getAddress())
-                && ObjectUtil.isNotNull(attendanceRecord.getCheckTime())
-                &&attendanceRecord.getLeaveReason().equals("start_work")){//上班打卡
+                ){//上班打卡
+            Long userId = Long.parseLong(StpUtil.getLoginIdAsString());
+            attendanceRecord.setUserId(userId);
+            long time = System.currentTimeMillis();
+            Date date_now = new Date(time);
+            attendanceRecord.setCheckTime(date_now);
+            attendanceRecord.setLeaveReason(AttendanceNodeEnum.STARTWORK.getCode());
 
             //判断是否已经打卡,一天只能打卡一次
-            Date date = DateUtil.parse(attendanceRecord.getCheckTime().toString());
-
             //一天的开始,结果:2017-03-01 00:00:00
-            Date beginOfDay = DateUtil.beginOfDay(date);
+            Date beginOfDay = DateUtil.beginOfDay(attendanceRecord.getCheckTime());
 
             //一天的结束,结果:2017-03-01 23:59:59
-            Date endOfDay = DateUtil.endOfDay(date);
+            Date endOfDay = DateUtil.endOfDay(attendanceRecord.getCheckTime());
             LambdaQueryWrapper<AttendanceRecord> queryWrapper01 = new LambdaQueryWrapper<>();
             queryWrapper01
                     .eq(AttendanceRecord::getUserId,attendanceRecord.getUserId())
+                    .eq(AttendanceRecord::getLeaveReason,AttendanceNodeEnum.STARTWORK.getCode())
                     .between(AttendanceRecord::getCheckTime,beginOfDay,endOfDay);
             List<AttendanceRecord> attendanceRecordList = this.list(queryWrapper01);
             if(ObjectUtil.isNotNull(attendanceRecordList) && attendanceRecordList.size() > 0){
@@ -88,6 +104,8 @@ public class AttendanceRecordServiceImpl extends MPJBaseServiceImpl<AttendanceRe
                 throw new MyException("打卡配置出现未知错误,请联系管理员!");
             }
             AttendanceConfig attendanceConfigCurrent = attendanceConfigList.get(0);
+            //为当前记录添加打卡配置的打卡时间
+            attendanceRecord.setAttendanceTime(attendanceConfigCurrent.getAttendanceTime());
 
             Double latitude = attendanceConfigCurrent.getLatitude();
             Double longitude = attendanceConfigCurrent.getLongitude();
@@ -100,12 +118,11 @@ public class AttendanceRecordServiceImpl extends MPJBaseServiceImpl<AttendanceRe
                 Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
                 Date attendanceConfigTinme = Date.from(instant);
 
-                if(attendanceConfigTinme.compareTo(attendanceRecord.getCheckTime()) == 1){//当为1表示正常
+                if(attendanceConfigTinme.compareTo(attendanceRecord.getCheckTime()) == 1){//当为1表示正常打卡
                     attendanceRecord.setStatus(1);
                 }else {
                     attendanceRecord.setStatus(2);
                 }
-
                 this.save(attendanceRecord);
             }else{
                 throw new MyException("未在打卡范围内,进入打卡范围!");
@@ -129,6 +146,71 @@ public class AttendanceRecordServiceImpl extends MPJBaseServiceImpl<AttendanceRe
         return new ArrayList<String>();
     }
 
+    @Override
+    public PresentUserCheckInfoVo getPresentUserCheckInfo() {
+        AttendanceRecord dto = new AttendanceRecord();
+        Long userId = Long.parseLong(StpUtil.getLoginIdAsString());
+        dto.setUserId(userId);
+        long time = System.currentTimeMillis();
+        Date date_now = new Date(time);
+
+        //一天的开始,结果:2017-03-01 00:00:00
+        Date beginOfDay = DateUtil.beginOfDay(date_now);
+
+        //一天的结束,结果:2017-03-01 23:59:59
+        Date endOfDay = DateUtil.endOfDay(date_now);
+
+        //已经上班打卡
+        MPJLambdaWrapper<AttendanceRecord> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .selectAs(XjrUser::getName, PresentUserCheckInfoVo::getUserName)
+                .selectAs(Post::getName, PresentUserCheckInfoVo::getPostName)
+                .select(AttendanceRecord.class, x -> VoToColumnUtil.fieldsToColumns(PresentUserCheckInfoVo.class).contains(x.getProperty()))
+                .leftJoin(XjrUser.class, XjrUser::getId,AttendanceRecord::getUserId)
+                .leftJoin(UserPostRelation.class, UserPostRelation::getUserId,AttendanceRecord::getUserId)
+                .leftJoin(Post.class, Post::getId,UserPostRelation::getPostId)
+                .eq(AttendanceRecord::getUserId,dto.getUserId())
+                .eq(AttendanceRecord::getLeaveReason,AttendanceNodeEnum.STARTWORK.getCode())
+                .between(AttendanceRecord::getCheckTime,beginOfDay,endOfDay);
+        List<PresentUserCheckInfoVo> presentUserCheckInfoVoList = this.selectJoinList(PresentUserCheckInfoVo.class, queryWrapper);
+
+        if(ObjectUtil.isNotNull(presentUserCheckInfoVoList) && presentUserCheckInfoVoList.size() > 0){
+            return presentUserCheckInfoVoList.get(0);
+        }
+
+        //没有上班打卡
+        MPJLambdaWrapper<XjrUser> queryWrapper3 = new MPJLambdaWrapper<>();
+        queryWrapper3
+                .selectAs(XjrUser::getName, PresentUserCheckInfoVo::getUserName)
+                .selectAs(Post::getName, PresentUserCheckInfoVo::getPostName)
+                .leftJoin(UserPostRelation.class, UserPostRelation::getUserId,XjrUser::getId)
+                .leftJoin(Post.class, Post::getId,UserPostRelation::getPostId)
+                .eq(XjrUser::getId,dto.getUserId());
+        List<PresentUserCheckInfoVo> presentUserCheckInfoVoList1 = xjrUserMapper.selectJoinList(PresentUserCheckInfoVo.class, queryWrapper3);
+
+        if(ObjectUtil.isNull(presentUserCheckInfoVoList1) || presentUserCheckInfoVoList1.size() <= 0){
+            throw new MyException("用户信息出现未知错误,请联系管理员");
+        }
+        PresentUserCheckInfoVo presentUserCheckInfoVo = presentUserCheckInfoVoList1.get(0);
+
+        LambdaQueryWrapper<AttendanceConfig> queryWrapper02 = new LambdaQueryWrapper<>();
+        queryWrapper02
+                .orderByDesc(AttendanceConfig::getId)
+                .select(AttendanceConfig.class,x -> VoToColumnUtil.fieldsToColumns(AttendanceConfigPageVo.class).contains(x.getProperty()))
+                .eq(AttendanceConfig::getDeleteMark,0)
+                .eq(AttendanceConfig::getEnabledMark,1);
+        List<AttendanceConfig> attendanceConfigList = attendanceConfigService.list(queryWrapper02);
+        if (attendanceConfigList == null || !(attendanceConfigList.size() > 0)) {
+            throw new MyException("打卡配置出现未知错误,请联系管理员!");
+        }
+
+        presentUserCheckInfoVo.setAttendanceTime(attendanceConfigList.get(0).getAttendanceTime());
+        presentUserCheckInfoVo.setLeaveReason(AttendanceNodeEnum.STARTWORK.getCode());
+        presentUserCheckInfoVo.setStatus(3);
+
+        return presentUserCheckInfoVo;
+    }
+
     //通过经纬度计算距离
     private double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
         double dLat = Math.toRadians(lat2 - lat1);

+ 66 - 0
src/main/java/com/xjrsoft/module/teacher/vo/PresentUserCheckInfoVo.java

@@ -0,0 +1,66 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+/**
+* @title: 当前用户当天考勤-记录出参
+* @Author szs
+* @Date: 2023-12-18
+* @Version 1.0
+*/
+@Data
+public class PresentUserCheckInfoVo {
+
+    /**
+     * 用户名
+     */
+    @ApiModelProperty("用户名")
+    private String userName;
+    /**
+     * 岗位名称
+     */
+    @ApiModelProperty("岗位名称")
+    private String postName;
+    /**
+    * 考勤时间
+    */
+    @ApiModelProperty("考勤时间")
+    private LocalTime attendanceTime;
+    /**
+    * 打卡时间
+    */
+    @ApiModelProperty("打卡时间")
+    private Date checkTime;
+    /**
+    * 考勤节点(xjr_dictionary_item[attendance_node])
+    */
+    @ApiModelProperty("考勤节点(xjr_dictionary_item[attendance_node])")
+    private String leaveReason;
+    /**
+    * 地点
+    */
+    @ApiModelProperty("地点")
+    private String address;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double longitude;
+    /**
+    * 纬度
+    */
+    @ApiModelProperty("纬度")
+    private Double latitude;
+    /**
+    * 状态(1:正常 2:迟到)
+    */
+    @ApiModelProperty("状态(1:正常 2:迟到)")
+    private Integer status;
+
+
+
+}