LIVE_YE 7 сар өмнө
parent
commit
7915506bfc

+ 4 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -3,12 +3,16 @@ package com.ruoyi;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 启动程序
  * 
  * @author ruoyi
  */
+@EnableAsync
+@EnableScheduling
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 public class RuoYiApplication
 {

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockHolidaysController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.clock;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ClockHolidays;
+import com.ruoyi.system.service.IClockHolidaysService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 节假日时间Controller
+ *
+ * @author boman
+ * @date 2024-11-27
+ */
+@RestController
+@RequestMapping("/system/holidays")
+public class ClockHolidaysController extends BaseController
+{
+    @Autowired
+    private IClockHolidaysService clockHolidaysService;
+
+/**
+ * 查询节假日时间列表
+ */
+@PreAuthorize("@ss.hasPermi('system:holidays:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ClockHolidays clockHolidays)
+    {
+        startPage();
+        List<ClockHolidays> list = clockHolidaysService.selectClockHolidaysList(clockHolidays);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出节假日时间列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:export')")
+    @Log(title = "节假日时间", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ClockHolidays clockHolidays)
+    {
+        List<ClockHolidays> list = clockHolidaysService.selectClockHolidaysList(clockHolidays);
+        ExcelUtil<ClockHolidays> util = new ExcelUtil<ClockHolidays>(ClockHolidays.class);
+        util.exportExcel(response, list, "节假日时间数据");
+    }
+
+    /**
+     * 获取节假日时间详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(clockHolidaysService.selectClockHolidaysById(id));
+    }
+
+    /**
+     * 新增节假日时间
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:add')")
+    @Log(title = "节假日时间", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ClockHolidays clockHolidays)
+    {
+        return toAjax(clockHolidaysService.insertClockHolidays(clockHolidays));
+    }
+
+    /**
+     * 修改节假日时间
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:edit')")
+    @Log(title = "节假日时间", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ClockHolidays clockHolidays)
+    {
+        return toAjax(clockHolidaysService.updateClockHolidays(clockHolidays));
+    }
+
+    /**
+     * 删除节假日时间
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:remove')")
+    @Log(title = "节假日时间", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(clockHolidaysService.deleteClockHolidaysByIds(ids));
+    }
+}

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockRecordController.java

@@ -135,4 +135,23 @@ public class ClockRecordController extends BaseController {
         List<Map<String,Object>> listMap = clockRecordService.all(clockUserInfo);
         return getDataTable(listMap);
     }
+
+    /**
+     * 打卡人员异常统计
+     */
+    @PreAuthorize("@ss.hasPermi('system:clock:abnormal')")
+    @GetMapping("/abnormal")
+    public AjaxResult abnormal(ClockRecord clockRecord) {
+        return clockRecordService.abnormal(clockRecord);
+    }
+
+    /**
+     * 个人打卡异常详情(pc用)
+     *
+     */
+    @PreAuthorize("@ss.hasPermi('system:clock:details')")
+    @GetMapping("/pc/details")
+    public AjaxResult details(ClockRecord clockRecord) {
+        return clockRecordService.details(clockRecord);
+    }
 }

+ 13 - 0
ruoyi-common/pom.xml

@@ -143,6 +143,19 @@
             <version>1.1.3</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.8.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.9.0</version>
+        </dependency>
+
+
     </dependencies>
 
 </project>

+ 29 - 8
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -59,6 +59,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dateTimeNow(YYYY_MM_DD);
     }
 
+    /**
+     * 获取当前日期, 默认格式为yyyy
+     *
+     * @return String
+     */
+    public static String getYear()
+    {
+        return dateTimeNow(YYYY);
+    }
+
     public static final String getTime()
     {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
@@ -269,14 +279,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
 
 
-
-    public static void main(String[] args) {
-        List<String> strings = weekList();
-        for (String string : strings) {
-            System.out.println(string);
-        }
-    }
-
     /**
      * 增加 Date  ==> LocalDate
      */
@@ -361,4 +363,23 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dates;
     }
 
+    /**
+     * 判断两个日期相差的天数
+     *  str2 - str1
+     * @return
+     */
+    public static int compare(String str1,String str2)
+    {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date date1 = sdf.parse(str1);
+            Date date2 = sdf.parse(str2);
+            return differentDaysByMillisecond(date1, date2);
+        } catch (ParseException e) {
+            e.printStackTrace();
+            return 0;
+        }
+
+    }
+
 }

+ 6 - 0
ruoyi-system/pom.xml

@@ -23,6 +23,12 @@
             <artifactId>ruoyi-common</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 84 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ClockHolidays.java

@@ -0,0 +1,84 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 节假日时间对象 clock_holidays
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+public class ClockHolidays extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 年份 */
+    @Excel(name = "年份")
+    private String year;
+
+    /** 日期(yyyy-mm-dd) */
+    @Excel(name = "日期", readConverterExp = "y=yyy-mm-dd")
+    private String holidayDate;
+
+    /** 是否补班 YES:补班,NO:放假 */
+    @Excel(name = "是否补班 YES:补班,NO:放假")
+    private String type;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setYear(String year) 
+    {
+        this.year = year;
+    }
+
+    public String getYear() 
+    {
+        return year;
+    }
+    public void setHolidayDate(String holidayDate) 
+    {
+        this.holidayDate = holidayDate;
+    }
+
+    public String getHolidayDate() 
+    {
+        return holidayDate;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("year", getYear())
+            .append("holidayDate", getHolidayDate())
+            .append("type", getType())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 63 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClockHolidaysMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.ClockHolidays;
+
+/**
+ * 节假日时间Mapper接口
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+public interface ClockHolidaysMapper 
+{
+    /**
+     * 查询节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 节假日时间
+     */
+    public ClockHolidays selectClockHolidaysById(Long id);
+
+    /**
+     * 查询节假日时间列表
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 节假日时间集合
+     */
+    public List<ClockHolidays> selectClockHolidaysList(ClockHolidays clockHolidays);
+
+    /**
+     * 新增节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int insertClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 修改节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int updateClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 删除节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 结果
+     */
+    public int deleteClockHolidaysById(Long id);
+
+    /**
+     * 批量删除节假日时间
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteClockHolidaysByIds(Long[] ids);
+
+    List<ClockHolidays> selectClockHolidaysMonthList(ClockHolidays clockHoliday);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IClockHolidaysService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.ClockHolidays;
+
+/**
+ * 节假日时间Service接口
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+public interface IClockHolidaysService 
+{
+    /**
+     * 查询节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 节假日时间
+     */
+    public ClockHolidays selectClockHolidaysById(Long id);
+
+    /**
+     * 查询节假日时间列表
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 节假日时间集合
+     */
+    public List<ClockHolidays> selectClockHolidaysList(ClockHolidays clockHolidays);
+
+    /**
+     * 新增节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int insertClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 修改节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int updateClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 批量删除节假日时间
+     * 
+     * @param ids 需要删除的节假日时间主键集合
+     * @return 结果
+     */
+    public int deleteClockHolidaysByIds(Long[] ids);
+
+    /**
+     * 删除节假日时间信息
+     * 
+     * @param id 节假日时间主键
+     * @return 结果
+     */
+    public int deleteClockHolidaysById(Long id);
+}

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IClockRecordService.java

@@ -72,4 +72,8 @@ public interface IClockRecordService
     AjaxResult personage(ClockRecord clockRecord);
 
     List<Map<String,Object>> all(ClockUserInfo clockUserInfo);
+
+    AjaxResult abnormal(ClockRecord clockRecord);
+
+    AjaxResult details(ClockRecord clockRecord);
 }

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockHolidaysServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ClockHolidaysMapper;
+import com.ruoyi.system.domain.ClockHolidays;
+import com.ruoyi.system.service.IClockHolidaysService;
+
+/**
+ * 节假日时间Service业务层处理
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+@Service
+public class ClockHolidaysServiceImpl implements IClockHolidaysService 
+{
+    @Autowired
+    private ClockHolidaysMapper clockHolidaysMapper;
+
+    /**
+     * 查询节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 节假日时间
+     */
+    @Override
+    public ClockHolidays selectClockHolidaysById(Long id)
+    {
+        return clockHolidaysMapper.selectClockHolidaysById(id);
+    }
+
+    /**
+     * 查询节假日时间列表
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 节假日时间
+     */
+    @Override
+    public List<ClockHolidays> selectClockHolidaysList(ClockHolidays clockHolidays)
+    {
+        return clockHolidaysMapper.selectClockHolidaysList(clockHolidays);
+    }
+
+    /**
+     * 新增节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    @Override
+    public int insertClockHolidays(ClockHolidays clockHolidays)
+    {
+        clockHolidays.setCreateTime(DateUtils.getNowDate());
+        return clockHolidaysMapper.insertClockHolidays(clockHolidays);
+    }
+
+    /**
+     * 修改节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    @Override
+    public int updateClockHolidays(ClockHolidays clockHolidays)
+    {
+        clockHolidays.setUpdateTime(DateUtils.getNowDate());
+        return clockHolidaysMapper.updateClockHolidays(clockHolidays);
+    }
+
+    /**
+     * 批量删除节假日时间
+     * 
+     * @param ids 需要删除的节假日时间主键
+     * @return 结果
+     */
+    @Override
+    public int deleteClockHolidaysByIds(Long[] ids)
+    {
+        return clockHolidaysMapper.deleteClockHolidaysByIds(ids);
+    }
+
+    /**
+     * 删除节假日时间信息
+     * 
+     * @param id 节假日时间主键
+     * @return 结果
+     */
+    @Override
+    public int deleteClockHolidaysById(Long id)
+    {
+        return clockHolidaysMapper.deleteClockHolidaysById(id);
+    }
+}

+ 385 - 124
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockRecordServiceImpl.java

@@ -11,27 +11,21 @@ import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.PageUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.domain.ClockUserInfo;
-import com.ruoyi.system.domain.DutySchedule;
-import com.ruoyi.system.domain.OrderFood;
-import com.ruoyi.system.mapper.ClockUserInfoMapper;
-import com.ruoyi.system.mapper.DutyScheduleMapper;
-import com.ruoyi.system.mapper.OrderFoodMapper;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.mapper.*;
+import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.system.mapper.ClockRecordMapper;
-import com.ruoyi.system.domain.ClockRecord;
 import com.ruoyi.system.service.IClockRecordService;
 
 /**
  * 打卡记录Service业务层处理
- * 
+ *
  * @author ruoyi
  * @date 2024-08-06
  */
 @Service
-public class ClockRecordServiceImpl implements IClockRecordService 
-{
+public class ClockRecordServiceImpl implements IClockRecordService {
     @Autowired
     private ClockRecordMapper clockRecordMapper;
     @Autowired
@@ -40,37 +34,37 @@ public class ClockRecordServiceImpl implements IClockRecordService
     private OrderFoodMapper orderFoodMapper;
     @Autowired
     private DutyScheduleMapper dutyScheduleMapper;
+    @Autowired
+    private ClockHolidaysMapper clockHolidaysMapper;
 
     /**
      * 查询打卡记录
-     * 
+     *
      * @param clockId 打卡记录主键
      * @return 打卡记录
      */
     @Override
-    public ClockRecord selectClockRecordByClockId(Long clockId)
-    {
+    public ClockRecord selectClockRecordByClockId(Long clockId) {
         return clockRecordMapper.selectClockRecordByClockId(clockId);
     }
 
     /**
      * 查询打卡记录列表
-     * 
+     *
      * @param clockRecord 打卡记录
      * @return 打卡记录
      */
     @Override
-    public List<ClockRecord> selectClockRecordList(ClockRecord clockRecord)
-    {
+    public List<ClockRecord> selectClockRecordList(ClockRecord clockRecord) {
         SysUser user = SecurityUtils.getLoginUser().getUser();
         List<SysRole> roles = user.getRoles();
         boolean bl = true;
         for (SysRole role : roles) {
-            if("admin".equals(role.getRoleKey()) || "administrators".equals(role.getRoleKey())){
+            if ("admin".equals(role.getRoleKey()) || "administrators".equals(role.getRoleKey())) {
                 bl = false;
             }
         }
-        if(bl){
+        if (bl) {
             clockRecord.setUserId(user.getUserId());
         }
         return clockRecordMapper.selectClockRecordList(clockRecord);
@@ -78,13 +72,12 @@ public class ClockRecordServiceImpl implements IClockRecordService
 
     /**
      * 新增打卡记录
-     * 
+     *
      * @param clockRecord 打卡记录
      * @return 结果
      */
     @Override
-    public int insertClockRecord(ClockRecord clockRecord)
-    {
+    public int insertClockRecord(ClockRecord clockRecord) {
         SysUser user = SecurityUtils.getLoginUser().getUser();
         clockRecord.setUserId(user.getUserId());
         clockRecord.setUserName(user.getNickName());
@@ -105,38 +98,35 @@ public class ClockRecordServiceImpl implements IClockRecordService
 
     /**
      * 修改打卡记录
-     * 
+     *
      * @param clockRecord 打卡记录
      * @return 结果
      */
     @Override
-    public int updateClockRecord(ClockRecord clockRecord)
-    {
+    public int updateClockRecord(ClockRecord clockRecord) {
         clockRecord.setUpdateTime(DateUtils.getNowDate());
         return clockRecordMapper.updateClockRecord(clockRecord);
     }
 
     /**
      * 批量删除打卡记录
-     * 
+     *
      * @param clockIds 需要删除的打卡记录主键
      * @return 结果
      */
     @Override
-    public int deleteClockRecordByClockIds(Long[] clockIds)
-    {
+    public int deleteClockRecordByClockIds(Long[] clockIds) {
         return clockRecordMapper.deleteClockRecordByClockIds(clockIds);
     }
 
     /**
      * 删除打卡记录信息
-     * 
+     *
      * @param clockId 打卡记录主键
      * @return 结果
      */
     @Override
-    public int deleteClockRecordByClockId(Long clockId)
-    {
+    public int deleteClockRecordByClockId(Long clockId) {
         return clockRecordMapper.deleteClockRecordByClockId(clockId);
     }
 
@@ -145,57 +135,57 @@ public class ClockRecordServiceImpl implements IClockRecordService
         Map<String, Object> resultMap = new HashMap<>();
         //查询人员数据
         ClockUserInfo clockUserInfo = clockUserInfoMapper.selectClockUserInfoByUserId(clockRecord.getUserId());
-        resultMap.put("name",clockUserInfo.getUserName());
+        resultMap.put("name", clockUserInfo.getUserName());
         //查询最新打卡数据
         ClockRecord clockRecordNew = clockRecordMapper.selectClockRecordNew(clockRecord);
-        resultMap.put("time",clockRecordNew.getRecordDate());
+        resultMap.put("time", clockRecordNew.getRecordDate());
         //todo 上下班时间
         DutySchedule dutySchedule = dutyScheduleMapper.selectDutyScheduleByDutyNew();
-        resultMap.put("workTime",dutySchedule.getStartWorkTime()+" - "+dutySchedule.getEndWorkTime());
+        resultMap.put("workTime", dutySchedule.getStartWorkTime() + " - " + dutySchedule.getEndWorkTime());
         //查询查询月打卡数据
         List<ClockRecord> clockRecords = clockRecordMapper.selectOrderFoodListRl(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
-        if (clockRecords != null && clockRecords.size() > 0){
+        if (clockRecords != null && clockRecords.size() > 0) {
             clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
         }
         //查询传入月所有日期
         List<String> dayList = DateUtils.getDay(DateUtils.parseDate(clockRecord.getRecordDate()));
         //写入数据
         List<Map> mapList = new ArrayList<>();
-        if (dayList.size()> 0){
+        if (dayList.size() > 0) {
             for (String day : dayList) {
-                Map<String,Object> map = new HashMap<>(5);
-                map.put("date",day);
-                map.put("am","未打卡");
+                Map<String, Object> map = new HashMap<>(5);
+                map.put("date", day);
+                map.put("am", "未打卡");
                 //上午打卡标识 1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("amex","5");
-                map.put("pm","未打卡");
+                map.put("amex", "5");
+                map.put("pm", "未打卡");
                 //下午打卡标识 1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("pmex","5");
-                if (clockTime.size() > 0){
+                map.put("pmex", "5");
+                if (clockTime.size() > 0) {
                     List<ClockRecord> clockRecordList = clockTime.get(day);
-                    if (clockRecordList != null && clockRecordList.size() > 0){
+                    if (clockRecordList != null && clockRecordList.size() > 0) {
                         clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
-                        if("1".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("am",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("am", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("amex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("pm",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("pm", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("1".equals(clockRecordList.get(0).getType())){
-                            map.put("am",clockRecordList.get(0).getRecordTime());
+                        if ("1".equals(clockRecordList.get(0).getType())) {
+                            map.put("am", clockRecordList.get(0).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(0).getIsOutwork());
+                            map.put("amex", clockRecordList.get(0).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(0).getType())){
-                            map.put("pm",clockRecordList.get(0).getRecordTime());
+                        if ("2".equals(clockRecordList.get(0).getType())) {
+                            map.put("pm", clockRecordList.get(0).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(0).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(0).getIsOutwork());
                         }
 
                     }
@@ -204,7 +194,18 @@ public class ClockRecordServiceImpl implements IClockRecordService
             }
         }
         //日历数据
-        resultMap.put("rlData",mapList);
+        resultMap.put("rlData", mapList);
+        //补班时间
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(DateUtils.getYear());
+        clockHoliday.setHolidayDate(clockRecord.getRecordDate());
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysMonthList(clockHoliday);
+        if(clockHolidaysList==null || clockHolidaysList.size()<0){
+            clockHolidaysList = new ArrayList<>();
+        }
+        //放假数据
+        resultMap.put("holidays", clockHolidaysList);
         return AjaxResult.success(resultMap);
     }
 
@@ -227,11 +228,11 @@ public class ClockRecordServiceImpl implements IClockRecordService
         int ydk = 0;
         //未打卡人数
         int wdk = 0;
-        if(clockUserId!=null && clockUserId.size()>0){
+        if (clockUserId != null && clockUserId.size() > 0) {
             ydk = clockUserId.size();
         }
-        if(clockUserInfoList!=null && clockUserInfoList.size()>0){
-            wdk = clockUserInfoList.size()-clockUserId.size();
+        if (clockUserInfoList != null && clockUserInfoList.size() > 0) {
+            wdk = clockUserInfoList.size() - clockUserId.size();
         }
 
         //订餐统计
@@ -244,23 +245,23 @@ public class ClockRecordServiceImpl implements IClockRecordService
         int dcwc = 0;
         //订餐晚餐人数
         int dcDinner = 0;
-        if(orderFoods!=null && orderFoods.size()>0){
+        if (orderFoods != null && orderFoods.size() > 0) {
             dczs = orderFoods.size();
             for (OrderFood food : orderFoods) {
-                if("1".equals(food.getOrderFoodType())){
+                if ("1".equals(food.getOrderFoodType())) {
                     dcwc++;
                 }
-                if("2".equals(food.getOrderFoodType())){
+                if ("2".equals(food.getOrderFoodType())) {
                     dcDinner++;
                 }
             }
         }
-        resultMap.put("dkzs",dkzs);
-        resultMap.put("ydk",ydk);
-        resultMap.put("wdk",wdk);
-        resultMap.put("dczs",dczs);
-        resultMap.put("dcwc",dcwc);
-        resultMap.put("dcDinner",dcDinner);
+        resultMap.put("dkzs", dkzs);
+        resultMap.put("ydk", ydk);
+        resultMap.put("wdk", wdk);
+        resultMap.put("dczs", dczs);
+        resultMap.put("dcwc", dcwc);
+        resultMap.put("dcDinner", dcDinner);
         return AjaxResult.success(resultMap);
     }
 
@@ -269,53 +270,53 @@ public class ClockRecordServiceImpl implements IClockRecordService
         Map<String, Object> resultMap = new HashMap<>();
 
         DutySchedule dutySchedule = dutyScheduleMapper.selectDutyScheduleByDutyNew();
-        resultMap.put("workTime",dutySchedule.getStartWorkTime()+" - "+dutySchedule.getEndWorkTime());
+        resultMap.put("workTime", dutySchedule.getStartWorkTime() + " - " + dutySchedule.getEndWorkTime());
 
-        //查询查询打卡数据
+        //查询查询打卡数据
         List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
-        if (clockRecords != null && clockRecords.size() > 0){
+        if (clockRecords != null && clockRecords.size() > 0) {
             clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
         }
         //查询传入月所有日期
-        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(),clockRecord.getEndTime());
+        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(), clockRecord.getEndTime());
         //写入数据
         List<Map> mapList = new ArrayList<>();
-        if (dayList.size()> 0){
+        if (dayList.size() > 0) {
             for (Date day : dayList) {
-                Map<String,Object> map = new HashMap<>(5);
+                Map<String, Object> map = new HashMap<>(5);
                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-                map.put("date",format.format(day));
-                map.put("am","未打卡");
+                map.put("date", format.format(day));
+                map.put("am", "未打卡");
                 //上午打卡标识  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("amex","5");
-                map.put("pm","未打卡");
+                map.put("amex", "5");
+                map.put("pm", "未打卡");
                 //下午打卡标识  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("pmex","5");
-                if (clockTime.size() > 0){
+                map.put("pmex", "5");
+                if (clockTime.size() > 0) {
                     List<ClockRecord> clockRecordList = clockTime.get(format.format(day));
-                    if (clockRecordList != null && clockRecordList.size() > 0){
+                    if (clockRecordList != null && clockRecordList.size() > 0) {
                         clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
-                        if("1".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("am",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("am", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("amex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("pm",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("pm", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("1".equals(clockRecordList.get(0).getType())){
-                            map.put("am",clockRecordList.get(0).getRecordTime());
+                        if ("1".equals(clockRecordList.get(0).getType())) {
+                            map.put("am", clockRecordList.get(0).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(0).getIsOutwork());
+                            map.put("amex", clockRecordList.get(0).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(0).getType())){
-                            map.put("pm",clockRecordList.get(0).getRecordTime());
+                        if ("2".equals(clockRecordList.get(0).getType())) {
+                            map.put("pm", clockRecordList.get(0).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(0).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(0).getIsOutwork());
                         }
 
                     }
@@ -324,35 +325,250 @@ public class ClockRecordServiceImpl implements IClockRecordService
             }
         }
         //日历数据
-        resultMap.put("rlData",mapList);
+        resultMap.put("rlData", mapList);
         return AjaxResult.success(resultMap);
     }
 
     @Override
     public AjaxResult personage(ClockRecord clockRecord) {
-        SysUser user = SecurityUtils.getLoginUser().getUser();
-        clockRecord.setUserId(user.getUserId());
         Map<String, Object> resultMap = statistics(clockRecord);
         return AjaxResult.success(resultMap);
     }
 
     @Override
-    public List<Map<String,Object>> all(ClockUserInfo clockUserInfo) {
-        List<Map<String,Object>> listMap = new ArrayList<>();
+    public List<Map<String, Object>> all(ClockUserInfo clockUserInfo) {
+        List<Map<String, Object>> listMap = new ArrayList<>();
         startPage();
         List<ClockUserInfo> clockUserList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
         clearPage();
         for (ClockUserInfo userInfo : clockUserList) {
             ClockRecord clockRecord = new ClockRecord();
             clockRecord.setUserId(userInfo.getUserId());
-            clockRecord.setRecordDate(clockUserInfo.getRecordDate()+"-01");
+            clockRecord.setRecordDate(clockUserInfo.getRecordDate() + "-01");
             Map<String, Object> resultMap = statistics(clockRecord);
-            resultMap.put("name",userInfo.getUserName());
+            resultMap.put("name", userInfo.getUserName());
+            resultMap.put("userId",userInfo.getUserId());
             listMap.add(resultMap);
         }
         return listMap;
     }
 
+    @SneakyThrows
+    @Override
+    public AjaxResult abnormal(ClockRecord clockRecord) {
+        Map<String, Object> resultMap = new HashMap<>();
+        int wq = 0;
+        int cd = 0;
+        int zt = 0;
+        int wdk = 0;
+        //获取所有打卡人员
+        //查询打卡人员
+        ClockUserInfo clockUserInfo = new ClockUserInfo();
+        clockUserInfo.setDelFlag("0");
+        List<ClockUserInfo> clockUserInfoList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
+        //获取时间段内的所有打卡信息
+        List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
+
+        //按人员类
+        Map<Long, List<ClockRecord>> clockUser = new HashMap<>();
+        if (clockRecords != null && clockRecords.size() > 0) {
+            clockUser = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getUserId));
+        }
+
+        //查询本年度所有节假日时间
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(DateUtils.getYear());
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        //分成补班和节假日
+        List<String> jjrList = new ArrayList<>();
+        List<String> bbList = new ArrayList<>();
+        for (ClockHolidays clockHolidays : clockHolidaysList) {
+            if("NO".equals(clockHolidays.getType())){
+                jjrList.add(clockHolidays.getHolidayDate());
+            }else{
+                bbList.add(clockHolidays.getHolidayDate());
+            }
+        }
+
+
+
+        //查询传入两个日期的所有日期
+        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(), clockRecord.getEndTime());
+        for (ClockUserInfo userInfo : clockUserInfoList) {
+            List<ClockRecord> clockRecordUser = clockUser.get(userInfo.getUserId());
+            //按日期分类
+            Map<String, List<ClockRecord>> clockTime = new HashMap<>();
+            if (clockRecordUser != null && clockRecordUser.size() > 0) {
+                clockTime = clockRecordUser.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
+            }
+            if (dayList.size() > 0) {
+                for (Date day : dayList) {
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                    boolean bl = (DateUtils.dayForWeek(format.format(day))==6 || DateUtils.dayForWeek(format.format(day))==7);
+                    if(jjrList.contains(format.format(day)) || (bl && !bbList.contains(format.format(day)))){
+                        continue;
+                    }
+                    List<ClockRecord> clockRecordList = clockTime.get(format.format(day));
+                    if(clockRecordList==null || clockRecordList.size()<=0){
+                        wdk++;
+                    }else{
+                        boolean sw = false;
+                        boolean xw = false;
+                        boolean bcd = false;
+                        boolean bzt = false;
+                        boolean bwq = false;
+                        if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            sw = true;
+                            if ("3".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                                bcd = true;
+                            }
+                            if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                                bwq = true;
+                            }
+                        }
+                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            xw = true;
+                            if ("4".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                                bzt = true;
+                            }
+                            if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                                bwq = true;
+                            }
+                        }
+                        if ("1".equals(clockRecordList.get(0).getType())) {
+                            sw = true;
+                            if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
+                                bcd = true;
+                            }
+                            if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                                bwq = true;
+                            }
+                        }
+                        if ("2".equals(clockRecordList.get(0).getType())) {
+                            xw = true;
+                            if ("4".equals(clockRecordList.get(0).getIsOutwork())) {
+                                bzt = true;
+                            }
+                            if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                                bwq = true;
+                            }
+                        }
+                        if(!sw || !xw){
+                            wdk++;
+                        }
+                        if(bcd){
+                            cd++;
+                        }
+                        if(bzt){
+                            zt++;
+                        }
+                        if(bwq){
+                            wq++;
+                        }
+                    }
+                }
+            }
+        }
+        resultMap.put("cd", cd);
+        resultMap.put("zt", zt);
+        resultMap.put("wq", wq);
+        resultMap.put("wdk", wdk);
+        return AjaxResult.success(resultMap);
+    }
+
+    @SneakyThrows
+    @Override
+    public AjaxResult details(ClockRecord clockRecord) {
+        List<Map<String, Object>> listMap = new ArrayList<>();
+        //查询人员打卡数据
+        List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
+        //按日期分类
+        Map<String, List<ClockRecord>> clockTime = new HashMap<>();
+        if (clockRecords != null && clockRecords.size() > 0) {
+            clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
+        }
+        //查询传入两个日期的所有日期
+        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(), clockRecord.getEndTime());
+        //查询本年度所有节假日时间
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(DateUtils.getYear());
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        //分成补班和节假日
+        List<String> jjrList = new ArrayList<>();
+        List<String> bbList = new ArrayList<>();
+        for (ClockHolidays clockHolidays : clockHolidaysList) {
+            if("NO".equals(clockHolidays.getType())){
+                jjrList.add(clockHolidays.getHolidayDate());
+            }else{
+                bbList.add(clockHolidays.getHolidayDate());
+            }
+        }
+        for (Date day : dayList) {
+            Map<String, Object> resultMap = new HashMap<>();
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            boolean bl = (DateUtils.dayForWeek(format.format(day))==6 || DateUtils.dayForWeek(format.format(day))==7);
+            if(jjrList.contains(format.format(day)) || (bl && !bbList.contains(format.format(day)))){
+                continue;
+            }
+            List<ClockRecord> clockRecordList = clockTime.get(format.format(day));
+            if(clockRecordList==null || clockRecordList.size()<=0){
+                resultMap.put("time",format.format(day));
+                resultMap.put("details","全天未打卡");
+                listMap.add(resultMap);
+            }else{
+                resultMap.put("time",format.format(day));
+                StringBuilder sb = new StringBuilder();
+                if(clockRecordList.size()>2){
+                    if ("1".equals(clockRecordList.get(0).getType())) {
+                        if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
+                            sb.append("上午:迟到");
+                        }
+                        if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                            sb.append("上午:外勤");
+                        }
+                    }
+                    if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                        if ("4".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                            if(StringUtils.isNotEmpty(sb.toString())){
+                                sb.append(",");
+                            }
+                            sb.append("下午:早退");
+                        }
+                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
+                            if(StringUtils.isNotEmpty(sb.toString())){
+                                sb.append(",");
+                            }
+                            sb.append("下午:外勤");
+                        }
+                    }
+                }else{
+                    if ("1".equals(clockRecordList.get(0).getType())) {
+                        if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
+                            sb.append("上午:迟到").append(",");
+                        }
+                        if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                            sb.append("上午:外勤").append(",");
+                        }
+                        sb.append("下午:缺卡");
+                    }
+                    if ("2".equals(clockRecordList.get(0).getType())) {
+                        sb.append("上午:缺卡");
+                        if ("4".equals(clockRecordList.get(0).getIsOutwork())) {
+                            sb.append(",").append("下午:早退");
+                        }
+                        if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
+                            sb.append(",").append("下午:外勤");
+                        }
+                    }
+                }
+                resultMap.put("details",sb.toString());
+                listMap.add(resultMap);
+            }
+        }
+        return AjaxResult.success(listMap);
+    }
+
     /**
      * 设置请求分页数据
      */
@@ -367,7 +583,10 @@ public class ClockRecordServiceImpl implements IClockRecordService
         PageUtils.clearPage();
     }
 
+
+    @SneakyThrows
     public Map<String, Object> statistics(ClockRecord clockRecord) {
+        String year = DateUtils.getYear();
         Map<String, Object> resultMap = new HashMap<>();
         //迟到
         int cd = 0;
@@ -375,59 +594,101 @@ public class ClockRecordServiceImpl implements IClockRecordService
         int zt = 0;
         //外勤
         int wq = 0;
+        //未打卡
+        int wdk = 0;
 
-        if(StringUtils.isEmpty(clockRecord.getRecordDate())){
+        if (StringUtils.isEmpty(clockRecord.getRecordDate())) {
             clockRecord.setRecordDate(DateUtils.getDate());
         }
         //查询查询月打卡数据
-        List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
+        List<ClockRecord> clockRecords = clockRecordMapper.selectOrderFoodListRl(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
-        if (clockRecords != null && clockRecords.size() > 0){
+        if (clockRecords != null && clockRecords.size() > 0) {
             clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
         }
-        for (String key : clockTime.keySet()) {
-            List<ClockRecord> clockRecordList = clockTime.get(key);
-            clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
-            for (ClockRecord record : clockRecordList) {
-                if("1".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                    if("3".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+        //查询传入月所有日期
+        List<String> dayList = DateUtils.getDay(DateUtils.parseDate(clockRecord.getRecordDate()));
+        //查询本年度所有节假日时间
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(year);
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        //分成补班和节假日
+        List<String> jjrList = new ArrayList<>();
+        List<String> bbList = new ArrayList<>();
+        for (ClockHolidays clockHolidays : clockHolidaysList) {
+            if("NO".equals(clockHolidays.getType())){
+                jjrList.add(clockHolidays.getHolidayDate());
+            }else{
+                bbList.add(clockHolidays.getHolidayDate());
+            }
+        }
+
+        for (String s : dayList) {
+            if(DateUtils.compare(s,DateUtils.getDate())<0){
+                continue;
+            }
+            //判断当天是否需要上班
+            boolean bl = (DateUtils.dayForWeek(s)==6 || DateUtils.dayForWeek(s)==7);
+            if(bbList.contains(s) || (!bl && !jjrList.contains(s))){
+                //需要要上班(当天不是双休并且不在节假日内,或者需要补班)
+                if(!clockTime.containsKey(s)){
+                    wdk = wdk+2;
+                    continue;
+                }
+                List<ClockRecord> clockRecordList = clockTime.get(s);
+                clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                boolean sw = false;
+                boolean xw = false;
+                if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                    sw = true;
+                    if ("3".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
                         cd++;
                     }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                    if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
                         wq++;
                     }
                 }
-                if("2".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                    if("4".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                    xw = true;
+                    if ("4".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
                         zt++;
                     }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                    if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getIsOutwork())) {
                         wq++;
                     }
                 }
-                if("1".equals(clockRecordList.get(0).getType())){
-                    if("3".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                if ("1".equals(clockRecordList.get(0).getType())) {
+                    sw = true;
+                    if ("3".equals(clockRecordList.get(0).getIsOutwork())) {
                         cd++;
                     }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                    if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
                         wq++;
                     }
                 }
-                if("2".equals(clockRecordList.get(0).getType())){
-                    if("4".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                if ("2".equals(clockRecordList.get(0).getType())) {
+                    xw = true;
+                    if ("4".equals(clockRecordList.get(0).getIsOutwork())) {
                         zt++;
                     }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                    if ("2".equals(clockRecordList.get(0).getIsOutwork())) {
                         wq++;
                     }
                 }
+                if(!sw || !xw){
+                    wdk++;
+                }
             }
-
         }
-        resultMap.put("cd",cd);
-        resultMap.put("zt",zt);
-        resultMap.put("wq",wq);
+        /*for (String key : clockTime.keySet()) {
+
+        }*/
+        resultMap.put("cd", cd);
+        resultMap.put("zt", zt);
+        resultMap.put("wq", wq);
+        resultMap.put("wdk", wdk);
         return resultMap;
     }
 

+ 6 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockUserInfoServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.ClockRecord;
 import com.ruoyi.system.mapper.ClockRecordMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -106,10 +107,12 @@ public class ClockUserInfoServiceImpl implements IClockUserInfoService
     @Override
     public List<ClockUserInfo> selectClockUserInfoRecordList(ClockUserInfo clockUserInfo) {
         List<ClockUserInfo> clockUserList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
-        String date = DateUtils.getDate();
+        if(StringUtils.isEmpty(clockUserInfo.getRecordDate())){
+            clockUserInfo.setRecordDate(DateUtils.getDate());
+        }
         for (ClockUserInfo userInfo : clockUserList) {
             Map<String,Object> clockMap = new HashMap<>();
-            clockMap.put("date",date);
+            clockMap.put("date",clockUserInfo.getRecordDate());
             clockMap.put("am","未打卡");
             //上午打卡标识 1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
             clockMap.put("amex","5");
@@ -119,7 +122,7 @@ public class ClockUserInfoServiceImpl implements IClockUserInfoService
             //查询当天的所有打卡信息
             ClockRecord clockRecord = new ClockRecord();
             clockRecord.setUserId(userInfo.getUserId());
-            clockRecord.setRecordDate(date);
+            clockRecord.setRecordDate(clockUserInfo.getRecordDate());
             List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
             if (clockRecords != null && clockRecords.size() > 0){
                 clockRecords = clockRecords.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());

+ 58 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/Task.java

@@ -1,24 +1,36 @@
 package com.ruoyi.system.service.impl;
 
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.google.gson.Gson;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.system.domain.ClockHolidays;
 import com.ruoyi.system.domain.MenuFood;
 import com.ruoyi.system.domain.MenuFoodRecord;
+import com.ruoyi.system.mapper.ClockHolidaysMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 定时任务
  */
 @Component
 public class Task {
+
+    @Autowired
+    private ClockHolidaysMapper clockHolidaysMapper;
     @Autowired
     private MenuFoodRecordServiceImpl menuFoodRecordService;
     @Autowired
@@ -47,4 +59,50 @@ public class Task {
             menuFoodRecordService.insertMenuFoodRecord(menuFoodRecord);
         }
     }
+
+    /***
+     *获取法定节假日和补班信息
+     * 定时:每个月20号2点
+     * @throws Exception
+     */
+    @Async
+    //@Scheduled(cron = "0 0/2 * * * ? ")
+    //@Scheduled(cron = "0 20 0 * * ? ")
+    //@Scheduled(cron = "0/10 * * * * ? ")
+    @Scheduled(cron = "0 0 2 20 * ? ")
+    public void holidays() {
+        String year = DateUtils.getYear();
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(year);
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        if(clockHolidaysList!=null && clockHolidaysList.size()>0){
+            year = String.valueOf(Integer.parseInt(year) + 1);
+        }
+        String url = "https://timor.tech/api/holiday/year/"+year;
+        String rspStr = HttpUtils.sendGet(url);
+        JSONObject obj = JSON.parseObject(rspStr);
+        Map<String, Map<String, Object>> holiday = (Map<String, Map<String, Object>>) obj.get("holiday");
+        if(ObjectUtils.isEmpty(holiday)){
+            return;
+        }
+        Set<String> strings = holiday.keySet();
+        for (String str : strings) {
+            Map<String, Object> stringObjectMap = holiday.get(str);
+            boolean bool = (Boolean) stringObjectMap.get("holiday");
+            ClockHolidays clockHolidays = new ClockHolidays();
+            clockHolidays.setYear(year);
+            clockHolidays.setHolidayDate((String) stringObjectMap.get("date"));
+            clockHolidays.setType("NO");
+            if(!bool){
+                clockHolidays.setType("YES");
+            }
+            clockHolidays.setCreateTime(DateUtils.getNowDate());
+            clockHolidays.setUpdateTime(DateUtils.getNowDate());
+            clockHolidaysMapper.insertClockHolidays(clockHolidays);
+        }
+
+        System.out.println("1");
+
+    }
 }

+ 96 - 0
ruoyi-system/src/main/resources/mapper/system/ClockHolidaysMapper.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.ClockHolidaysMapper">
+    
+    <resultMap type="ClockHolidays" id="ClockHolidaysResult">
+        <result property="id"    column="id"    />
+        <result property="year"    column="year"    />
+        <result property="holidayDate"    column="holiday_date"    />
+        <result property="type"    column="type"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectClockHolidaysVo">
+        select id, year, holiday_date, type, create_by, create_time, update_by, update_time, remark from clock_holidays
+    </sql>
+
+    <select id="selectClockHolidaysList" parameterType="ClockHolidays" resultMap="ClockHolidaysResult">
+        <include refid="selectClockHolidaysVo"/>
+        <where>  
+            <if test="year != null  and year != ''"> and year = #{year}</if>
+            <if test="holidayDate != null  and holidayDate != ''"> and holiday_date = #{holidayDate}</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+        </where>
+    </select>
+    
+    <select id="selectClockHolidaysById" parameterType="Long" resultMap="ClockHolidaysResult">
+        <include refid="selectClockHolidaysVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectClockHolidaysMonthList" parameterType="ClockHolidays" resultMap="ClockHolidaysResult">
+        <include refid="selectClockHolidaysVo"/>
+        <where>
+            <if test="year != null  and year != ''"> and year = #{year}</if>
+            <if test="holidayDate != null  and holidayDate != ''">
+                and date_format(holiday_date,'%Y%m') = date_format(#{holidayDate},'%Y%m')
+            </if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+        </where>
+    </select>
+
+    <insert id="insertClockHolidays" parameterType="ClockHolidays" useGeneratedKeys="true" keyProperty="id">
+        insert into clock_holidays
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="year != null and year != ''">year,</if>
+            <if test="holidayDate != null">holiday_date,</if>
+            <if test="type != null and type != ''">type,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="year != null and year != ''">#{year},</if>
+            <if test="holidayDate != null">#{holidayDate},</if>
+            <if test="type != null and type != ''">#{type},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateClockHolidays" parameterType="ClockHolidays">
+        update clock_holidays
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="year != null and year != ''">year = #{year},</if>
+            <if test="holidayDate != null">holiday_date = #{holidayDate},</if>
+            <if test="type != null and type != ''">type = #{type},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteClockHolidaysById" parameterType="Long">
+        delete from clock_holidays where id = #{id}
+    </delete>
+
+    <delete id="deleteClockHolidaysByIds" parameterType="String">
+        delete from clock_holidays where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>