shiqian 4 年之前
父节点
当前提交
86ac6fff4f

+ 25 - 3
boman-api/boman-domain/src/main/java/com.boman.domain/constant/AttendanceConst.java

@@ -8,17 +8,39 @@ package com.boman.domain.constant;
 public class AttendanceConst {
 
     /** 考勤人员姓名 **/
-    public static final String ATTENDANCE_USER_NAME = "attendance_user_name";
+    public static final String ATTENDANCE_USER_NAME = "attendance_table_username";
 
     /** 是否考勤异常 **/
     public static final String ATTENDANCE_ABNORMAL = "attendance_abnormal";
+    /** 是否迟到 **/
+    public static final String ATTENDANCE_TABLE_LATE = "attendance_table_late";
+    /** 是否早退 **/
+    public static final String ATTENDANCE_TABLE_LEAVE_EARLY = "attendance_table_leave";
 
-    /** 当天时间 **/
-    public static final String ATTENDANCE_NOW_TIME = "attendance_now_time";
+    /** 当天时间 yyyy-MM-dd 查询的时候是 in **/
+    public static final String ATTENDANCE_TABLE_TODAYTIME = "attendance_table_todaytime";
 
     /** 上班打卡时间 **/
     public static final String ATTENDANCE_TABLE_WORK = "attendance_table_work";
 
+    /** 下班打卡时间 **/
+    public static final String ATTENDANCE_TABLE_OFFWORK = "attendance_table_offwork";
 
+    /** 创建时间 **/
+    public static final String ATTENDANCE_TABLE_CREATE_TIME = "create_time";
+
+    /** 经度 **/
+    public static final String ATTENDANCE_TABLE_LONGITUDE = "longitude";
+
+    /** 纬度 **/
+    public static final String ATTENDANCE_TABLE_LATITUDE = "latitude";
+
+    public static final String Y = "Y";
+    /**  上班打卡 **/
+    public static final int GO_TO_WORK_TYPE = 1;
+    /**  下班打卡 **/
+    public static final int GO_OFF_WORK_TYPE = 2;
+    public static final String GO_TO_WORK = "上班打卡";
+    public static final String GO_OFF_WORK = "下班打卡";
 
 }

+ 24 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/AttendanceRulesConst.java

@@ -0,0 +1,24 @@
+package com.boman.domain.constant;
+
+
+/**
+ * @author shiqian
+ * @date 2021年05月26日 15:29
+ **/
+public class AttendanceRulesConst {
+
+    /** 规则表名 **/
+    public static final String ATTENDANCE_RULES_TABLE_NAME = "attendance_rules";
+
+    /** 规定上班时间 **/
+    public static final String ATTENDANCE_RULES_START_TIME = "attendance_rules_start_time";
+
+    /** 规定下班时间 **/
+    public static final String ATTENDANCE_RULES_END_TIME = "attendance_rules_end_time";
+
+    /**部门id **/
+    public static final String ATTENDANCE_RULES_DEPT_ID = "attendance_rules_dept_id";
+
+
+
+}

+ 26 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/dto/ClockOnDto.java

@@ -0,0 +1,26 @@
+package com.boman.domain.dto;
+
+
+import lombok.Data;
+
+/**
+ * @author shiqian
+ * @date 2021年06月16日 10:12
+ **/
+@Data
+public class ClockOnDto {
+
+    /** 1(上班打卡)  2(下班打卡) **/
+    private int type;
+
+    /** attendance_table 考勤表 **/
+    private String tableName;
+
+    /** 经度**/
+    private String longitude;
+
+    /** 纬度 **/
+    private String latitude;
+
+
+}

+ 79 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/DateUtils.java

@@ -1,10 +1,14 @@
 package com.boman.common.core.utils;
 
 import java.lang.management.ManagementFactory;
+import java.text.DateFormat;
 import java.text.ParseException;
+import java.text.ParsePosition;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -29,6 +33,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+    public static String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
 
     private static String[] parsePatterns = {
             "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
@@ -44,6 +49,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return new Date();
     }
 
+    public static Date strToDate(String strDate, String format) {
+        SimpleDateFormat formatter = new SimpleDateFormat(format);
+        ParsePosition pos = new ParsePosition(0);
+        return formatter.parse(strDate, pos);
+    }
+
     /**
      * 获取当前日期, 默认格式为yyyy-MM-dd
      *
@@ -61,6 +72,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return dateTimeNow(YYYYMM);
     }
 
+    public static final String getYyyy_Mm() {
+        return dateTimeNow(YYYY_MM);
+    }
+
 
     public static final String getYyyyMmDd() {
         return dateTimeNow(YYYYMMDD);
@@ -174,4 +189,68 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String stampToTime(String stamp) {
         return new SimpleDateFormat("yyyy-MM-dd").format(new Date(Long.parseLong(stamp)));
     }
+
+    /**
+     * 功能描述: 获取当前月份的第一天到当天
+     *
+     * @return java.lang.String
+     */
+    public static List<String> getMonthDays() {
+        List<String> result = new ArrayList<>(31);
+        Calendar cd = Calendar.getInstance();
+        int year = cd.get(Calendar.YEAR);
+        int month = cd.get(Calendar.MONTH);
+        int day;
+
+        String today = getDate();
+        int[] monDays = new int[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+        if (((year) % 4 == 0 && (year) % 100 != 0) || (year) % 400 == 0) {
+            day = monDays[month]++;
+        } else {
+            day = monDays[month];
+        }
+
+        for (int i = 1; i <= day; i++) {
+            String m;
+            if (month < 10) {
+                m = "0" + (month + 1) + "";
+            } else {
+                m = month + 1 + "";
+            }
+
+            String d;
+            if (i < 10) {
+                d = "0" + i + "";
+            } else {
+                d = i + "";
+            }
+
+            String time = year + "-" + m + "-" + d;
+            if (today.equals(time)) {
+                result.add(time);
+                break;
+            }
+
+            result.add(time);
+        }
+
+        return result;
+    }
+
+    public static int getWeekMonthYear(int type) {
+        Calendar calendar = Calendar.getInstance();
+        Date today = new Date();
+        calendar.setTime(today);
+        int typeNo = calendar.get(type);
+        if (type == Calendar.WEEK_OF_MONTH) {
+            if (typeNo == 1) {
+                typeNo = 7;
+            } else {
+                typeNo = typeNo - 1;
+            }
+        }
+
+        return typeNo;
+    }
+
 }

+ 28 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/number/NumberUtils.java

@@ -0,0 +1,28 @@
+package com.boman.common.core.utils.number;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+
+/**
+ * @author shiqian
+ * @date 2021年06月11日 10:00
+ **/
+public class NumberUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(NumberUtils.class);
+
+    public static boolean gtZero(int input){
+        return input > 0;
+    }
+
+    public static boolean ltZero(int input){
+        return input < 0;
+    }
+
+    public static boolean eqZero(int input){
+        return input == 0;
+    }
+
+}

+ 24 - 0
boman-web-core/src/main/java/com/boman/web/core/controller/AttendanceController.java

@@ -1,6 +1,7 @@
 package com.boman.web.core.controller;
 
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.ClockOnDto;
 import com.boman.domain.dto.FormDataDto;
 import com.boman.web.core.service.attendance.AttendanceService;
 import org.springframework.web.bind.annotation.*;
@@ -18,6 +19,17 @@ public class AttendanceController {
     @Resource
     private AttendanceService service;
 
+    /**
+     * 功能描述: 打卡
+     *
+     * @param dto tableName
+     * @return com.boman.domain.dto.AjaxResult
+     */
+    @PostMapping("/clockOn")
+    public AjaxResult clockOn(@RequestBody ClockOnDto dto) {
+        return AjaxResult.success(service.clockOn(dto));
+    }
+
     /**
      * 功能描述: 根据tableName和userId查找当月考勤
      *
@@ -43,6 +55,18 @@ public class AttendanceController {
         return AjaxResult.success(service.showAttendanceType(tableName, userName));
     }
 
+    /**
+     * 功能描述: 查询该人的一天打卡时间
+     *
+     * @param tableName tableName
+     * @param userName  userName
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    @GetMapping("/attendanceTime/{tableName}/{userName}")
+    public AjaxResult attendanceTime(@PathVariable("tableName") String tableName, @PathVariable("userName") String userName) {
+        return AjaxResult.success(service.attendanceTime(tableName, userName));
+    }
+
 
     /**
      * 功能描述: 根据tableName和userId查找当月考勤详细记录

+ 5 - 5
boman-web-core/src/main/java/com/boman/web/core/controller/ObjController.java

@@ -217,11 +217,11 @@ public class ObjController {
      * @param condition condition
      * @return com.boman.domain.dto.AjaxResult
      */
-    @ApiOperation(value = "获取表单按钮")
-    @PostMapping("/getButton")
-    public AjaxResult getButton(@RequestBody FormDataDto condition) {
-        return AjaxResult.success(tableServiceCmdService.getButton(condition.getTable()));
-    }
+//    @ApiOperation(value = "获取表单按钮")
+//    @PostMapping("/getButton")
+//    public AjaxResult getButton(@RequestBody FormDataDto condition) {
+//        return AjaxResult.success(tableServiceCmdService.getButton(condition.getTable()));
+//    }
 
     /**
      * 功能描述: 获取表单子表

+ 31 - 4
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -380,7 +380,7 @@ public class TableServiceCmdService {
         }
         JSONObject result = new JSONObject();
         result.put(SHOW_DATA, removeHr(parentColumns));
-        result.put(BUTTON_LIST, getButton(tableName));
+        result.put(BUTTON_LIST, getButton(tableName, json.getString(SubmitConstant.STATUS)));
         Integer tableColumn = genTable.getTableColumn();
         if (tableColumn != null) {
             result.put(TABLE_COLUMN, tableColumn);
@@ -551,9 +551,36 @@ public class TableServiceCmdService {
      * @param tableName tableName
      * @return com.boman.domain.dto.AjaxResult
      */
-    public String getButton(String tableName) {
+//    public String getButton(String tableName) {
+//        GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName);
+//        List<String> btns = buildBtnList(genTable.getTableName());
+//        return Strings.nullToEmpty(CollectionUtils.listToString(btns));
+//    }
+
+
+    /**
+     * 功能描述:  单独获取按钮
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     *
+     * @param tableName tableName
+     * @param status    数据的审核状态
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    public String getButton(String tableName, String status) {
         GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName);
         List<String> btns = buildBtnList(genTable.getTableName());
+        if (isEmpty(status)) {
+            return Strings.nullToEmpty(CollectionUtils.listToString(btns));
+        }
+
+        // 非未提交状态
+        if (!SubmitConstant.NOT_SUBMIT.equals(status)) {
+            btns.remove(GlobalBtn.S);
+            btns.remove(GlobalBtn.D);
+            btns.remove(GlobalBtn.A);
+            btns.remove(GlobalBtn.U);
+        }
+
         return Strings.nullToEmpty(CollectionUtils.listToString(btns));
     }
 
@@ -776,7 +803,7 @@ public class TableServiceCmdService {
         }
 
         JSONObject result = new JSONObject();
-        result.put(BUTTON_LIST, getButton(tableName));
+        result.put(BUTTON_LIST, getButton(tableName, null));
         result.put(SHOW_DATA, resultCols);
         result.put(RULES, packRequireColumn(insertVisibleColumns));
         Integer tableColumn = genTable.getTableColumn();
@@ -830,7 +857,7 @@ public class TableServiceCmdService {
         return ajaxResult;
     }
 
-    /**
+    /**P
      * 功能描述: 新增的时候处理默认值, 从redis中拿到存在token中的userEnv对象,根据数据库中存的默认值的key,和userEnv中的key做比对,
      * 从中取出作为字段的默认值,redis中存userEnv的位置:{@link TokenService#packUserEnv(com.boman.system.api.model.LoginUser))}
      *

+ 19 - 0
boman-web-core/src/main/java/com/boman/web/core/service/attendance/AttendanceService.java

@@ -2,6 +2,7 @@ package com.boman.web.core.service.attendance;
 
 import com.alibaba.fastjson.JSONObject;
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.ClockOnDto;
 import com.boman.domain.dto.FormDataDto;
 
 import java.util.List;
@@ -40,4 +41,22 @@ public interface AttendanceService {
 
 
     List<JSONObject> checkAttendanceType(String tableName, String userName);
+
+    /**
+     * 功能描述: 查询该人的一天打卡时间
+     *
+     * @param tableName tableName
+     * @param userName  userName
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    JSONObject attendanceTime(String tableName, String userName);
+
+
+    /**
+     * 功能描述: 打卡
+     *
+     * @param dto     dto
+     * @return com.alibaba.fastjson.JSONObject
+     */
+    JSONObject clockOn(ClockOnDto dto);
 }

+ 211 - 36
boman-web-core/src/main/java/com/boman/web/core/service/attendance/AttendanceServiceImpl.java

@@ -2,23 +2,30 @@ package com.boman.web.core.service.attendance;
 
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.DateUtils;
+import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.ClockOnDto;
 import com.boman.domain.dto.FormDataDto;
+import com.boman.web.core.service.TableServiceCmdService;
+import com.boman.web.core.service.attendance.rules.AttendanceRulesService;
 import com.boman.web.core.service.common.ICommonService;
+import com.boman.web.core.utils.AuthUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.stream.Collectors;
 
-import static com.boman.common.core.utils.obj.ObjectUtils.ifNullSetEmpty;
-import static com.boman.common.core.utils.obj.ObjectUtils.requireNonNull;
+import static com.boman.common.core.utils.DateUtils.YYYY_MM_DD_HH_MM;
+import static com.boman.common.core.utils.number.NumberUtils.gtZero;
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.domain.constant.AttendanceConst.*;
+import static com.boman.domain.constant.AttendanceRulesConst.ATTENDANCE_RULES_END_TIME;
+import static com.boman.domain.constant.AttendanceRulesConst.ATTENDANCE_RULES_START_TIME;
 import static com.boman.domain.constant.FormDataConstant.CONDITION;
 
 /**
@@ -32,6 +39,10 @@ public class AttendanceServiceImpl implements AttendanceService {
 
     @Resource
     private ICommonService commonService;
+    @Resource
+    private AttendanceRulesService rulesService;
+    @Resource
+    private TableServiceCmdService cmdService;
 
     /**
      * 功能描述: 根据tableName和userId查找当月考勤
@@ -44,10 +55,10 @@ public class AttendanceServiceImpl implements AttendanceService {
         requireNonNull(tableName, "tableName is empty");
         requireNonNull(userName, "userName is empty");
 
-        String yyyyMm = DateUtils.getYyyyMm();
+        List<String> days = DateUtils.getMonthDays();
         JSONObject map = new JSONObject(2);
         map.put(ATTENDANCE_USER_NAME, userName);
-        map.put(ATTENDANCE_NOW_TIME, yyyyMm);
+        map.put(ATTENDANCE_TABLE_TODAYTIME, days);
         return commonService.getByMap(tableName, map);
     }
 
@@ -61,35 +72,45 @@ public class AttendanceServiceImpl implements AttendanceService {
      */
     @Override
     public AjaxResult attendanceRecord(String tableName, Long userName) {
+        Map<String, Object> mapObj = new HashMap<>(4);
         List<JSONObject> byMap = listByUserName(tableName, userName);
-        List<String> dateList = new ArrayList<>();
-        //定义三个返回值
-        int leave = 0;
-        int late = 0;
-        int leaveOr = 0;
-        if (byMap.size()>0){
-            for (JSONObject jsonObject : byMap) {
-                if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_leave")) && "Y".equals(String.valueOf(jsonObject.get("attendance_table_leave")))){
-                    leave += 1;
-                }
-                if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_late")) && "Y".equals(String.valueOf(jsonObject.get("attendance_table_late")))){
-                    late += 1;
-                }
-                if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_leave_or")) && "Y".equals(String.valueOf(jsonObject.get("attendance_table_leave_or")))) {
-                    leaveOr += 1;
-                }
-                if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_todaytime"))){
-                    String todayTime = String.valueOf(jsonObject.get("attendance_table_todaytime"));
-                    dateList.add(todayTime);
+        if (isEmpty(byMap)) {
+            mapObj.put("leave", 0);
+            mapObj.put("late", 0);
+            mapObj.put("leaveOr", 0);
+            mapObj.put("dateList", 0);
+            return AjaxResult.success(mapObj);
+        }
+
+        List<String> dateList = new ArrayList<>(byMap.size());
+        //  早退        迟到      请假
+        int leave = 0, late = 0, leaveOr = 0;
+        for (JSONObject jsonObject : byMap) {
+            if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_leave")) && "Y".equals(String.valueOf(jsonObject.get("attendance_table_leave")))) {
+                leave++;
+            }
+
+            if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_late")) && "Y".equals(String.valueOf(jsonObject.get("attendance_table_late")))) {
+                late++;
+            }
+
+            if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_leave_or")) && "Y".equals(String.valueOf(jsonObject.get("attendance_table_leave_or")))) {
+                leaveOr++;
+            }
+
+            if (ObjectUtils.isNotEmpty(jsonObject.get("attendance_table_todaytime"))) {
+                // 只需要异常的
+                if (gtZero(leave) || gtZero(late) || gtZero(leaveOr)) {
+                    dateList.add(jsonObject.getString("attendance_table_todaytime"));
                 }
             }
         }
-        Map<String,Object> mapObj = new HashMap<>(3);
-        mapObj.put("leave",leave);
-        mapObj.put("late",late);
-        mapObj.put("leaveOr",leaveOr);
-        mapObj.put("dateList",dateList);
-        return   AjaxResult.success(mapObj);
+
+        mapObj.put("leave", leave);
+        mapObj.put("late", late);
+        mapObj.put("leaveOr", leaveOr);
+        mapObj.put("dateList", dateList);
+        return AjaxResult.success(mapObj);
     }
 
 
@@ -136,9 +157,15 @@ public class AttendanceServiceImpl implements AttendanceService {
         requireNonNull(tableName, "tableName is empty");
         requireNonNull(userName, "userName is empty");
 
-
-
-        return null;
+        FormDataDto dto = new FormDataDto();
+        dto.setTable(tableName);
+        JSONObject condition = new JSONObject();
+        condition.put("attendance_table_username", userName);
+        // in
+        condition.put(ATTENDANCE_TABLE_TODAYTIME, DateUtils.getDate());
+        dto.setFixedData(condition);
+        int count = commonService.count(dto);
+        return count > 0 ? "下班打卡" : "上班打卡";
     }
 
     @Override
@@ -152,4 +179,152 @@ public class AttendanceServiceImpl implements AttendanceService {
         map.put(ATTENDANCE_TABLE_WORK, yyyyMmDd);
         return commonService.getByMap(tableName, map);
     }
+
+    /**
+     * 功能描述: 查询该人的一天打卡时间
+     *
+     * @param tableName tableName
+     * @param userName  userName
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    @Override
+    public JSONObject attendanceTime(String tableName, String userName) {
+        requireNonNull(tableName, "tableName is empty");
+        requireNonNull(userName, "userName is empty");
+
+        JSONObject result = new JSONObject();
+        List<JSONObject> attendanceList = listByUserNameAndTime(tableName, userName, DateUtils.getDate());
+        // 今天 还未打卡
+        if (isEmpty(attendanceList)) {
+            result.put(GO_TO_WORK, null);
+            result.put(GO_OFF_WORK, null);
+            return result;
+        }
+
+        attendanceList = attendanceList.stream()
+                .sorted(Comparator.comparing(json -> json.getTimestamp(ATTENDANCE_TABLE_CREATE_TIME)))
+                .collect(Collectors.toList());
+
+        Timestamp goToWorkTime = null;
+        Timestamp goOffWorkTime = null;
+        for (JSONObject attendance : attendanceList) {
+            if (isNotEmpty(attendance.get(ATTENDANCE_TABLE_WORK)) && isEmpty(attendance.get(ATTENDANCE_TABLE_OFFWORK))) {
+                goToWorkTime = attendance.getTimestamp(ATTENDANCE_TABLE_WORK);
+                break;
+            }
+        }
+
+         for (JSONObject attendance : attendanceList) {
+            if (isNotEmpty(attendance.get(ATTENDANCE_TABLE_OFFWORK)) && isEmpty(attendance.get(ATTENDANCE_TABLE_WORK))) {
+                goOffWorkTime = attendance.getTimestamp(ATTENDANCE_TABLE_OFFWORK);
+            }
+        }
+
+        result.put(GO_TO_WORK, goToWorkTime == null ? null : goToWorkTime.toString());
+        result.put(GO_OFF_WORK, goOffWorkTime == null ? null : goOffWorkTime.toString());
+        return result;
+    }
+
+    /**
+     * 功能描述: 打卡
+     *
+     * @param dto     dto
+     * @return com.alibaba.fastjson.JSONObject
+     */
+    @Override
+    public JSONObject clockOn(ClockOnDto dto) {
+        int type = requireNonNull(dto.getType(), "clockOn type is empty");
+        String tableName = requireNonNull(dto.getTableName(), "clockOn tableName is empty");
+
+        JSONObject commitData = new JSONObject();
+        commitData.put(ATTENDANCE_USER_NAME, SecurityUtils.getUsername());
+        commitData.put(ATTENDANCE_TABLE_TODAYTIME, DateUtils.getDate());
+        commitData.put(ATTENDANCE_TABLE_LONGITUDE, dto.getLongitude());
+        commitData.put(ATTENDANCE_TABLE_LATITUDE, dto.getLatitude());
+        Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+        // 是否请假
+        if (checkIsLeave()) {
+            //
+        }
+
+        if (GO_TO_WORK_TYPE == type) {
+            commitData.put(ATTENDANCE_TABLE_WORK, currentTime);
+            if (checkIsLate(currentTime)) {
+                commitData.put(ATTENDANCE_ABNORMAL, Y);
+                commitData.put(ATTENDANCE_TABLE_LATE, Y);
+            }
+
+        } else if (GO_OFF_WORK_TYPE == type) {
+            commitData.put(ATTENDANCE_TABLE_OFFWORK, currentTime);
+        }
+
+        saveClockOn(tableName, commitData);
+        return commitData;
+    }
+
+    /**
+     * 功能描述: 保存打卡信息
+     *
+     * @param tableName  tableName
+     * @param commitData commitData
+     * @return boolean
+     */
+    private boolean saveClockOn(String tableName, JSONObject commitData) {
+        FormDataDto dto = new FormDataDto();
+        dto.setObjId(-1L);
+        dto.setTable(tableName);
+        dto.setFixedData(commitData);
+        AjaxResult ajaxResult = cmdService.objectSave(dto);
+        return AjaxResult.checkSuccess(ajaxResult);
+    }
+
+    /**
+     * 功能描述: 是否迟到
+     *
+     * @param arrivalTime 上班打卡时间
+     * @return boolean
+     */
+    private boolean checkIsLate(Timestamp arrivalTime) {
+        JSONObject rule = rulesService.listByDeptId(AuthUtils.getLoginUser().getSysUser().getDeptId());
+        String hourMi = rule.getString(ATTENDANCE_RULES_START_TIME);
+        String year_month = DateUtils.getDate();
+        String ruleStartTime = year_month + " " + hourMi;
+        Date date = DateUtils.strToDate(ruleStartTime, YYYY_MM_DD_HH_MM);
+        return arrivalTime.after(date);
+    }
+
+    /**
+     * 功能描述: 是否早退
+     *
+     * @param leaveTime 下班打卡时间
+     * @return boolean
+     */
+    private boolean checkIsLeaveEarly(Timestamp leaveTime) {
+        JSONObject rule = rulesService.listByDeptId(AuthUtils.getLoginUser().getSysUser().getDeptId());
+        Timestamp ruleEndTime = rule.getTimestamp(ATTENDANCE_RULES_END_TIME);
+        return leaveTime.before(ruleEndTime);
+    }
+
+
+    private boolean checkIsLeave() {
+
+
+        return true;
+    }
+
+    /**
+     * 功能描述: 根据username和time查找
+     *
+     * @param tableName tableName
+     * @param userName  userName
+     * @param time      time
+     * @return java.util.List<com.alibaba.fastjson.JSONObject>
+     */
+    private List<JSONObject> listByUserNameAndTime(String tableName, String userName, String time) {
+        JSONObject condition = new JSONObject(2);
+        condition.put(ATTENDANCE_USER_NAME, userName);
+        condition.put(ATTENDANCE_TABLE_TODAYTIME, time);
+        return commonService.getByMap(tableName, condition);
+    }
+
 }

+ 20 - 0
boman-web-core/src/main/java/com/boman/web/core/service/attendance/rules/AttendanceRulesService.java

@@ -0,0 +1,20 @@
+package com.boman.web.core.service.attendance.rules;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+
+/**
+ * @author shiqian
+ * @date 2021年06月15日 17:15
+ **/
+public interface AttendanceRulesService {
+
+    /**
+     * 功能描述: 根据deptId, 查找规则
+     *
+     * @param deptId deptId
+     * @return com.alibaba.fastjson.JSONObject
+     */
+    JSONObject listByDeptId(Long deptId);
+}

+ 47 - 0
boman-web-core/src/main/java/com/boman/web/core/service/attendance/rules/AttendanceRulesServiceImpl.java

@@ -0,0 +1,47 @@
+package com.boman.web.core.service.attendance.rules;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.web.core.service.common.ICommonService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+import static com.boman.domain.constant.AttendanceRulesConst.ATTENDANCE_RULES_DEPT_ID;
+import static com.boman.domain.constant.AttendanceRulesConst.ATTENDANCE_RULES_TABLE_NAME;
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+
+/**
+ * @author shiqian
+ * @date 2021年06月15日 17:15
+ **/
+@Service
+public class AttendanceRulesServiceImpl implements AttendanceRulesService{
+
+    @Resource
+    private ICommonService commonService;
+
+    /**
+     * 功能描述: 根据deptId, 查找规则
+     *
+     * @param deptId deptId
+     * @return com.alibaba.fastjson.JSONObject
+     */
+    @Override
+    public JSONObject listByDeptId(Long deptId) {
+        JSONObject map = new JSONObject(2);
+        map.put(ATTENDANCE_RULES_DEPT_ID, deptId);
+        JSONObject result = commonService.getOneByMap(ATTENDANCE_RULES_TABLE_NAME, map);
+        if (isEmpty(result)) {
+            // 该部门没有单独设置,遵从总公司的上下班时间
+            map.clear();
+            map.put(ATTENDANCE_RULES_DEPT_ID, null);
+            result = commonService.getOneByMap(ATTENDANCE_RULES_TABLE_NAME, map);
+            if (isEmpty(result)) {
+                throw new IllegalArgumentException("该公司未配置上下班时间");
+            }
+        }
+
+        return result;
+    }
+
+}