|
@@ -4,6 +4,8 @@ import com.ruoyi.common.core.controller.BaseController;
|
|
|
import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
import com.ruoyi.common.core.domain.entity.SysDictData;
|
|
|
import com.ruoyi.common.core.page.TableDataInfo;
|
|
|
+import com.ruoyi.common.core.redis.RedisCache;
|
|
|
+import com.ruoyi.common.utils.DateUtils;
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
import com.ruoyi.system.domain.KaoqinConfig;
|
|
|
import com.ruoyi.system.domain.KaoqinRecord;
|
|
@@ -12,8 +14,11 @@ import com.ruoyi.system.service.IKaoqinConfigService;
|
|
|
import com.ruoyi.system.service.IKaoqinRecordService;
|
|
|
import com.ruoyi.system.service.ISysDictDataService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -38,12 +43,16 @@ public class KaoQinController extends BaseController {
|
|
|
@Autowired
|
|
|
private ISysDictDataService dictDataService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private RedisCache redisCache;
|
|
|
+
|
|
|
/**
|
|
|
* 定位打卡提供计算参数
|
|
|
*
|
|
|
* @param kaoqinConfig
|
|
|
* @return
|
|
|
*/
|
|
|
+ @PreAuthorize("@ss.hasPermi('kaoqin:daKa:param')")
|
|
|
@GetMapping(value = "/daKa")
|
|
|
public AjaxResult daKa(KaoqinConfig kaoqinConfig) {
|
|
|
//先去 根据当前人员的部门id查询是否有规则,没有再去查祖籍列表
|
|
@@ -83,6 +92,7 @@ public class KaoQinController extends BaseController {
|
|
|
* 包括所有异常的数量
|
|
|
* 本月考勤记录的异常分类数量
|
|
|
*/
|
|
|
+ @PreAuthorize("@ss.hasPermi('kaoqin:statistics:abnormal')")
|
|
|
@GetMapping("/abnormal")
|
|
|
public AjaxResult abnormal(KaoqinRecord kaoqinRecord) {
|
|
|
//传入userId/年 和 月份 设置查询异常的考勤
|
|
@@ -133,6 +143,7 @@ public class KaoQinController extends BaseController {
|
|
|
/**
|
|
|
* 考勤日历
|
|
|
*/
|
|
|
+ @PreAuthorize("@ss.hasPermi('kaoqin:statistics:calendar')")
|
|
|
@GetMapping("/calendar")
|
|
|
public AjaxResult calendar(KaoqinRecord kaoqinRecord) {
|
|
|
//根据打卡人id和月份去找对应的打卡记录
|
|
@@ -262,4 +273,207 @@ public class KaoQinController extends BaseController {
|
|
|
}
|
|
|
return AjaxResult.success(list);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询考勤异常数据信息
|
|
|
+ * 包括所有异常的数量
|
|
|
+ * 今日打卡统计
|
|
|
+ */
|
|
|
+ @PreAuthorize("@ss.hasPermi('kaoqin:statistics:dayAbnormal')")
|
|
|
+ @GetMapping("/day/abnormal")
|
|
|
+ public AjaxResult dayAbnormal(KaoqinRecord kaoqinRecord) {
|
|
|
+ if(StringUtils.isEmpty(kaoqinRecord.getKaTime())){
|
|
|
+ kaoqinRecord.setKaTime(DateUtils.getDate());
|
|
|
+ }
|
|
|
+ Map<String, Object> map = new HashMap();
|
|
|
+ //查询当天考勤数据
|
|
|
+ Map<String, Long> todayMap = day(kaoqinRecord);
|
|
|
+ //查询昨天考勤数据
|
|
|
+ //获取昨天日期
|
|
|
+ String yesterday = DateUtils.getYesterday(kaoqinRecord.getKaTime());
|
|
|
+ kaoqinRecord.setKaTime(yesterday);
|
|
|
+ Map<String, Long> yesterdayMap = day(kaoqinRecord);
|
|
|
+ for (String s : todayMap.keySet()) {
|
|
|
+ Map<String, Object> mapZj = new HashMap();
|
|
|
+ String zz = "0%";
|
|
|
+ //1:正,2负
|
|
|
+ String zt = "1";
|
|
|
+ mapZj.put("num", todayMap.get(s));
|
|
|
+
|
|
|
+ BigDecimal todayBd = new BigDecimal(todayMap.get(s));
|
|
|
+ BigDecimal yesterdayBd = new BigDecimal(yesterdayMap.get(s));
|
|
|
+ BigDecimal fz = todayBd.subtract(yesterdayBd);
|
|
|
+ BigDecimal percentage = fz.multiply(new BigDecimal("100"))
|
|
|
+ .divide(yesterdayBd, 3, RoundingMode.HALF_UP) // 先计算百分比并保留三位小数以处理可能的精度问题
|
|
|
+ .setScale(1, RoundingMode.HALF_UP); // 再设置为一位小数
|
|
|
+ zz = percentage.toString() + "%";
|
|
|
+ if(percentage.compareTo(BigDecimal.ZERO) < 0){
|
|
|
+ zt = "2";
|
|
|
+ zz = (percentage.multiply(new BigDecimal("-1"))).toString()+ "%";;
|
|
|
+ }
|
|
|
+ mapZj.put("bfb", zz);
|
|
|
+ mapZj.put("zf",zt);
|
|
|
+ map.put(s,mapZj);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return AjaxResult.success(map);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询考勤异常数据信息
|
|
|
+ * 包括所有异常的数量
|
|
|
+ * 月打卡统计
|
|
|
+ */
|
|
|
+ @PreAuthorize("@ss.hasPermi('kaoqin:statistics:monthyAbnormal')")
|
|
|
+ @GetMapping("/month/abnormal")
|
|
|
+ public AjaxResult monthAbnormal(KaoqinRecord kaoqinRecord) {
|
|
|
+ Map<String, Object> mapTj = new HashMap();
|
|
|
+ Map<String, Long> mapCount = new HashMap();
|
|
|
+ List<KaoqinRecord> kaoQinRecords = kaoqinRecordService.selectKaoqinRecordList(kaoqinRecord);
|
|
|
+ //外勤打卡次数
|
|
|
+ Long wq= 0L;
|
|
|
+ //迟到打卡次数
|
|
|
+ Long cd= 0L;
|
|
|
+ //早退打卡次数
|
|
|
+ Long zt= 0L;
|
|
|
+ //缺卡打卡次数
|
|
|
+ Long qk= 0L;
|
|
|
+ //记录该月有多少次异常总数
|
|
|
+ Long count = 0L;
|
|
|
+ SysDictData dictData = new SysDictData();
|
|
|
+ dictData.setDictType("kaoqin_abnormal");
|
|
|
+ List<SysDictData> sysDictData = dictDataService.selectDictDataList(dictData);
|
|
|
+ Map<String, Long> map = new HashMap();
|
|
|
+ for (SysDictData sysDictDatum : sysDictData) {
|
|
|
+ //获取异常的值
|
|
|
+ String dictValue = sysDictDatum.getDictValue();
|
|
|
+ if (!"1".equals(dictValue)) {
|
|
|
+ Long aLong = 0L;
|
|
|
+ map.put(dictValue, aLong);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (KaoqinRecord kaoQinRecord : kaoQinRecords) {
|
|
|
+ String kaTypeAmIn = kaoQinRecord.getKaTypeAmIn();
|
|
|
+ String kaTypeAmOut = kaoQinRecord.getKaTypeAmOut();
|
|
|
+ String kaTypePmIn = kaoQinRecord.getKaTypePmIn();
|
|
|
+ String kaTypePmOut = kaoQinRecord.getKaTypePmOut();
|
|
|
+ if (!"1".equals(kaTypeAmIn) && StringUtils.isNotBlank(kaTypeAmIn)) {
|
|
|
+ Long aLong = map.get(kaTypeAmIn);
|
|
|
+ map.put(kaTypeAmIn, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ } if (!"1".equals(kaTypeAmOut) && StringUtils.isNotBlank(kaTypeAmOut)) {
|
|
|
+ Long aLong = map.get(kaTypeAmOut);
|
|
|
+ map.put(kaTypeAmOut, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ } if (!"1".equals(kaTypePmIn) && StringUtils.isNotBlank(kaTypePmIn)) {
|
|
|
+ Long aLong = map.get(kaTypePmIn);
|
|
|
+ map.put(kaTypePmIn, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ } if (!"1".equals(kaTypePmOut) && StringUtils.isNotBlank(kaTypePmOut)) {
|
|
|
+ Long aLong = map.get(kaTypePmOut);
|
|
|
+ map.put(kaTypePmOut, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ wq = map.get("3");
|
|
|
+ cd = map.get("2");
|
|
|
+ zt = map.get("4");
|
|
|
+ qk = map.get("5");
|
|
|
+
|
|
|
+ mapCount.put("wq",wq);
|
|
|
+ mapCount.put("cd",cd);
|
|
|
+ mapCount.put("zt",zt);
|
|
|
+ mapCount.put("qk",qk);
|
|
|
+ for (String s : mapCount.keySet()) {
|
|
|
+ Map<String, Object> mapZj = new HashMap();
|
|
|
+ mapZj.put("num", mapCount.get(s));
|
|
|
+ String zz = "0%";
|
|
|
+ BigDecimal countBd = new BigDecimal(count);
|
|
|
+ BigDecimal num = new BigDecimal(mapCount.get(s));
|
|
|
+ BigDecimal percentage = num.multiply(new BigDecimal("100"))
|
|
|
+ .divide(countBd, 3, RoundingMode.HALF_UP) // 先计算百分比并保留三位小数以处理可能的精度问题
|
|
|
+ .setScale(1, RoundingMode.HALF_UP); // 再设置为一位小数
|
|
|
+ zz = percentage.toString() + "%";
|
|
|
+ mapZj.put("bfb",zz);
|
|
|
+ mapTj.put(s, mapZj);
|
|
|
+ }
|
|
|
+ return AjaxResult.success(map);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public Map<String, Long> day(KaoqinRecord kaoqinRecord) {
|
|
|
+
|
|
|
+ Map<String, Long> map = new HashMap();
|
|
|
+ //传入日期设置查询异常的考勤
|
|
|
+ //kaoqinRecord.setKaStatus("2");
|
|
|
+ //查找最新的考勤规则
|
|
|
+ KaoqinConfig kaoqinConfigDept = kaoqinConfigService.selectKaoqinConfigBynew();
|
|
|
+ List<KaoqinRecord> kaoQinRecords = kaoqinRecordService.selectKaoqinRecordList(kaoqinRecord);
|
|
|
+ //正常打卡次数
|
|
|
+ Long zc= 0L;
|
|
|
+ //外勤打卡次数
|
|
|
+ Long wq= 0L;
|
|
|
+ //迟到打卡次数
|
|
|
+ Long cd= 0L;
|
|
|
+ //早退打卡次数
|
|
|
+ Long zt= 0L;
|
|
|
+ //缺卡打卡次数
|
|
|
+ Long qk= 0L;
|
|
|
+ //记录该月有多少次异常总数
|
|
|
+ Long count = 0L;
|
|
|
+ SysDictData dictData = new SysDictData();
|
|
|
+ dictData.setDictType("kaoqin_abnormal");
|
|
|
+ List<SysDictData> sysDictData = dictDataService.selectDictDataList(dictData);
|
|
|
+ Map<String, Long> todayMap = new HashMap();
|
|
|
+ for (SysDictData sysDictDatum : sysDictData) {
|
|
|
+ //获取异常的值
|
|
|
+ String dictValue = sysDictDatum.getDictValue();
|
|
|
+ Long aLong = 0L;
|
|
|
+ todayMap.put(dictValue, aLong);
|
|
|
+
|
|
|
+ }
|
|
|
+ for (KaoqinRecord kaoQinRecord : kaoQinRecords) {
|
|
|
+ String kaTypeAmIn = kaoQinRecord.getKaTypeAmIn();
|
|
|
+ String kaTypeAmOut = kaoQinRecord.getKaTypeAmOut();
|
|
|
+ String kaTypePmIn = kaoQinRecord.getKaTypePmIn();
|
|
|
+ String kaTypePmOut = kaoQinRecord.getKaTypePmOut();
|
|
|
+ if (StringUtils.isNotBlank(kaTypeAmIn)) {
|
|
|
+ Long aLong = todayMap.get(kaTypeAmIn);
|
|
|
+ todayMap.put(kaTypeAmIn, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ }
|
|
|
+ //如果只配置了两次打卡,中间两次打卡不计入统计
|
|
|
+ if("4".equals(kaoqinConfigDept.getKaNum())){
|
|
|
+ if (StringUtils.isNotBlank(kaTypeAmOut)) {
|
|
|
+ Long aLong = todayMap.get(kaTypeAmOut);
|
|
|
+ todayMap.put(kaTypeAmOut, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(kaTypePmIn)) {
|
|
|
+ Long aLong = todayMap.get(kaTypePmIn);
|
|
|
+ todayMap.put(kaTypePmIn, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(kaTypePmOut)) {
|
|
|
+ Long aLong = todayMap.get(kaTypePmOut);
|
|
|
+ todayMap.put(kaTypePmOut, aLong + 1);
|
|
|
+ count = count + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zc = todayMap.get("1");
|
|
|
+ wq = todayMap.get("3");
|
|
|
+ cd = todayMap.get("2");
|
|
|
+ zt = todayMap.get("4");
|
|
|
+ qk = todayMap.get("5");
|
|
|
+
|
|
|
+ map.put("zc",zc);
|
|
|
+ map.put("wq",wq);
|
|
|
+ map.put("cd",cd);
|
|
|
+ map.put("zt",zt);
|
|
|
+ map.put("qk",qk);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
}
|