Commit 6443d13d3fc70029d6e1e3ad29a836c89c1b50a2
1 parent
41afbd8f
feat: 修改提示
Showing
5 changed files
with
33 additions
and
77 deletions
ruoyi-admin/src/main/java/com/ruoyi/in/service/ISignInService.java
| ... | ... | @@ -35,14 +35,6 @@ public interface ISignInService |
| 35 | 35 | public List<SignInResponseVo> selectSignInList(SignInResponseVo signIn); |
| 36 | 36 | |
| 37 | 37 | /** |
| 38 | - * 新增签到 | |
| 39 | - * | |
| 40 | - * @param signIn 签到 | |
| 41 | - * @return 结果 | |
| 42 | - */ | |
| 43 | - public AjaxResult insertSignIn(SignIn signIn); | |
| 44 | - | |
| 45 | - /** | |
| 46 | 38 | * 修改签到 |
| 47 | 39 | * |
| 48 | 40 | * @param signIn 签到 | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
| ... | ... | @@ -8,6 +8,7 @@ import java.time.LocalDateTime; |
| 8 | 8 | import java.time.format.DateTimeFormatter; |
| 9 | 9 | import java.time.temporal.ChronoUnit; |
| 10 | 10 | import java.util.*; |
| 11 | +import java.util.concurrent.TimeUnit; | |
| 11 | 12 | import java.util.stream.Collectors; |
| 12 | 13 | |
| 13 | 14 | import cn.hutool.core.collection.CollectionUtil; |
| ... | ... | @@ -112,51 +113,6 @@ public class SignInServiceImpl implements ISignInService { |
| 112 | 113 | return vos; |
| 113 | 114 | } |
| 114 | 115 | |
| 115 | - /** | |
| 116 | - * 新增签到 | |
| 117 | - * | |
| 118 | - * @param signIn 签到 | |
| 119 | - * @return 结果 | |
| 120 | - */ | |
| 121 | - @Override | |
| 122 | - public AjaxResult insertSignIn(SignIn signIn) { | |
| 123 | - // 查询员工信息 | |
| 124 | - Driver driver = driverMapper.getDriverInfoByJobCode(signIn.getJobCode()); | |
| 125 | - if (Objects.isNull(driver)) return AjaxResult.error("这个工号的员工不存在!"); | |
| 126 | - // 查询地址 | |
| 127 | - Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(signIn.getDeviceId()); | |
| 128 | - SignInResponseVo vo = getSignInResponseVo(driver, signIn, equipment); | |
| 129 | - signIn.setCreateTime(new Date()); | |
| 130 | - signIn.setRemark(""); | |
| 131 | - // 签到检查 酒精检查 超时检查 排班检查 | |
| 132 | - GlobalIndex globalIndex = new GlobalIndex(); | |
| 133 | - long now = System.currentTimeMillis(); | |
| 134 | - List<DriverScheduling> dto = schedulingService.queryScheduling(signIn.getJobCode(), now); | |
| 135 | - if (checkSignIn(now, dto, globalIndex, signIn, driver)) { | |
| 136 | - signIn.setStatus(SIGN_IN_SUCCESS); | |
| 137 | - } else { | |
| 138 | - signIn.setStatus(SIGN_IN_FAIL); | |
| 139 | - signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。")); | |
| 140 | - } | |
| 141 | - signIn.setIp(IpUtils.getIpAddr()); | |
| 142 | - // base64转图片 | |
| 143 | -// uploadImage(signIn); | |
| 144 | - signInMapper.insertSignIn(signIn); | |
| 145 | - // TODO redis 存储每个人的签到 用于后续考勤 | |
| 146 | - | |
| 147 | - // 驾驶人员二次签到酒精测试异常 | |
| 148 | - if (PERSONNEL_POSTS_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) { | |
| 149 | - AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo); | |
| 150 | - if (!Objects.isNull(result)) { | |
| 151 | - return result; | |
| 152 | - } | |
| 153 | - } | |
| 154 | - if (SIGN_IN_FAIL.equals(signIn.getStatus())) { | |
| 155 | - return AjaxResult.success(SIGN_IN_ERROR + ": " + signIn.getRemark(), vo); | |
| 156 | - } | |
| 157 | - return AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo); | |
| 158 | - } | |
| 159 | - | |
| 160 | 116 | |
| 161 | 117 | /** |
| 162 | 118 | * 修改签到 |
| ... | ... | @@ -233,10 +189,11 @@ public class SignInServiceImpl implements ISignInService { |
| 233 | 189 | } |
| 234 | 190 | } |
| 235 | 191 | if (SIGN_IN_SUCCESS.equals(signIn.getStatus())) { |
| 192 | + String prompt = signIn.getRemark().replace("正常", ""); | |
| 236 | 193 | if (signIn.getType().equals(SIGN_OUT)) { |
| 237 | - return AjaxResult.success(SIGN_OUT_SUCCESS_STRING, vo); | |
| 194 | + return AjaxResult.success(SIGN_OUT_SUCCESS_STRING + prompt, vo); | |
| 238 | 195 | } else { |
| 239 | - return AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo); | |
| 196 | + return AjaxResult.success(SIGN_IN_SUCCESS_STRING + prompt, vo); | |
| 240 | 197 | } |
| 241 | 198 | } else { |
| 242 | 199 | if (signIn.getType().equals(SIGN_OUT)) { |
| ... | ... | @@ -406,15 +363,14 @@ public class SignInServiceImpl implements ISignInService { |
| 406 | 363 | } |
| 407 | 364 | |
| 408 | 365 | private AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn, SignInResponseVo vo) { |
| 409 | - // TODO 待更换 缓存更新为当天签到记录 | |
| 410 | 366 | String key = REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW + ConstDateUtil.formatDate("yyyyMMdd") + ":" + signIn.getJobCode(); |
| 411 | 367 | // 驾驶员酒精测试连续超标两次则提示换人 |
| 412 | 368 | Integer count = redisCache.getCacheObject(key); |
| 413 | 369 | if (Objects.isNull(count) || count.equals(0)) { |
| 414 | 370 | count = 1; |
| 415 | - redisCache.setCacheObject(key, count); | |
| 371 | + redisCache.setCacheObject(key, count, 1, TimeUnit.DAYS); | |
| 416 | 372 | } else { |
| 417 | - redisCache.setCacheObject(key, ++count); | |
| 373 | + redisCache.setCacheObject(key, ++count, 1, TimeUnit.DAYS); | |
| 418 | 374 | } |
| 419 | 375 | if (SIGN_IN_ERROR_COUNT.compareTo(count) <= 0) { |
| 420 | 376 | return AjaxResult.success(SIGN_IN_ERROR + ": " + signIn.getRemark() + "酒精测试不通过" + count + "次请更换车辆驾驶员。", vo); |
| ... | ... | @@ -507,12 +463,8 @@ public class SignInServiceImpl implements ISignInService { |
| 507 | 463 | } |
| 508 | 464 | |
| 509 | 465 | private boolean checkTimeOut(GlobalIndex globalIndex, SignIn signIn, List<DriverScheduling> dto, String posts, long now) { |
| 510 | - // 那发车时间和到站时间作为开始上班的时间 | |
| 511 | - if (PERSONNEL_POSTS_DRIVER.equals(posts) || PERSONNEL_POSTS_SALES.equals(posts)) { | |
| 512 | - return driverCheckTimeOut(globalIndex, signIn, dto, now); | |
| 513 | - } else { | |
| 514 | - return driverCheckTimeOut(globalIndex, signIn, dto, now); | |
| 515 | - } | |
| 466 | + // 司售人员拿发车时间和到站时间作为开始上班的时间 | |
| 467 | + return driverCheckTimeOut(globalIndex, signIn, dto, now); | |
| 516 | 468 | } |
| 517 | 469 | |
| 518 | 470 | private boolean driverCheckTimeOut(GlobalIndex globalIndex, SignIn signIn, List<DriverScheduling> dto, long now) { |
| ... | ... | @@ -531,21 +483,22 @@ public class SignInServiceImpl implements ISignInService { |
| 531 | 483 | // 签到一个逻辑 当前无记录 |
| 532 | 484 | if (currentScheduling.getBcType().equals(BC_TYPE_OUT) && Objects.isNull(currentScheduling.getSignInId())) { |
| 533 | 485 | DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1); |
| 486 | + // 给出签到范围 | |
| 534 | 487 | // 上一次无记|签到,type:签退 当前时间小于最近签到时间 -> 超时签退 |
| 535 | 488 | if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getBcType().equals(BC_TYPE_IN)) { |
| 536 | - signIn.setRemark(SIGN_OUT_TIMEOUT); | |
| 489 | + signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。"); | |
| 537 | 490 | globalIndex.setIndex(lastClosestTimestamp.getIndex()); |
| 538 | 491 | result = false; |
| 539 | 492 | } |
| 540 | 493 | // 上一次无记无|签到,type:签退 当前时间小于最近签到时间 -> 超时签退 |
| 541 | 494 | else if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getIndex().equals(currentScheduling.getIndex())) { |
| 542 | - signIn.setRemark(SIGN_IN_TIMEOUT); | |
| 495 | + signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"); | |
| 543 | 496 | globalIndex.setIndex(currentScheduling.getIndex()); |
| 544 | 497 | result = false; |
| 545 | 498 | } |
| 546 | 499 | // 当前最近无记录|签到,type:签到|签退 -> 签到超时给上 |
| 547 | 500 | else { |
| 548 | - signIn.setRemark(SIGN_IN_TIMEOUT); | |
| 501 | + signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"); | |
| 549 | 502 | globalIndex.setIndex(currentScheduling.getIndex()); |
| 550 | 503 | result = false; |
| 551 | 504 | } |
| ... | ... | @@ -555,20 +508,21 @@ public class SignInServiceImpl implements ISignInService { |
| 555 | 508 | DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1); |
| 556 | 509 | // 上一次无记|签退,type:签到 当前时间小于最近签退时间 -> 签到异常 |
| 557 | 510 | if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_IN)) { |
| 558 | - signIn.setRemark(SIGN_IN_TIMEOUT); | |
| 511 | + signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。"); | |
| 559 | 512 | globalIndex.setIndex(lastClosestTimestamp.getIndex()); |
| 560 | 513 | result = false; |
| 561 | 514 | } |
| 562 | 515 | // 当前无记|签退 , type:签退|签到 ——> 签退异常 |
| 563 | 516 | else { |
| 564 | - signIn.setRemark(SIGN_OUT_TIMEOUT); | |
| 517 | + signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"); | |
| 565 | 518 | globalIndex.setIndex(currentScheduling.getIndex()); |
| 566 | 519 | result = false; |
| 567 | 520 | } |
| 568 | 521 | } |
| 569 | 522 | // 签退|签到 当前有记录 |
| 570 | 523 | if (!Objects.isNull(currentScheduling.getSignInId())) { |
| 571 | - signIn.setRemark(currentScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT); | |
| 524 | + String prompt = "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"; | |
| 525 | + signIn.setRemark((currentScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt); | |
| 572 | 526 | globalIndex.setIndex(currentScheduling.getIndex()); |
| 573 | 527 | result = false; |
| 574 | 528 | } | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/RuleAttendanceMainRequestVo.java
ruoyi-admin/src/main/java/com/ruoyi/service/SchedulingService.java
| ... | ... | @@ -2,6 +2,7 @@ package com.ruoyi.service; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollectionUtil; |
| 4 | 4 | import com.ruoyi.common.cache.NowSchedulingCache; |
| 5 | +import com.ruoyi.common.utils.DateUtils; | |
| 5 | 6 | import com.ruoyi.driver.mapper.DriverSchedulingMapper; |
| 6 | 7 | import com.ruoyi.in.domain.SignIn; |
| 7 | 8 | import com.ruoyi.in.mapper.SignInMapper; |
| ... | ... | @@ -77,7 +78,7 @@ public class SchedulingService { |
| 77 | 78 | |
| 78 | 79 | |
| 79 | 80 | /** |
| 80 | - * 计算签到逻辑 | |
| 81 | + * 计算当前签到签到逻辑 | |
| 81 | 82 | * |
| 82 | 83 | * @param dto |
| 83 | 84 | * @param now |
| ... | ... | @@ -140,17 +141,26 @@ public class SchedulingService { |
| 140 | 141 | if (globalIndex.getIndex() == dto.size() - 1) { |
| 141 | 142 | return; |
| 142 | 143 | } |
| 144 | + long timer = 1000 * 60 * 5; | |
| 145 | + // 有效的在一分钟内重复签到不做修改 | |
| 146 | + if (signIn.getExType().equals(SIGN_NO_EX_NUM) && (DateUtils.getNowDate().getTime() - dto.get(globalIndex.getIndex()).getSignTime().getTime()) <= timer) { | |
| 147 | + signIn.setRemark("您已经打卡过了,您已完成" + (globalIndex.getIndex() + 1) + "次打卡,请勿在5分钟内重复打卡"); | |
| 148 | + return; | |
| 149 | + } | |
| 143 | 150 | Integer index = globalIndex.getIndex() + 1; |
| 144 | 151 | // 之前是签到 | 目前有效记录 -》进行修改 变成无效 |
| 145 | 152 | if (signIn.getExType().equals(SIGN_NO_EX_NUM)) { |
| 146 | 153 | signIn.setStatus(SIGN_IN_FAIL); |
| 147 | 154 | signIn.setExType(SIGN_TIME_OUT_EX_NUM); |
| 148 | - signIn.setRemark(dto.get(index).getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT); | |
| 149 | - signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。")); | |
| 150 | 155 | signInMapper.updateSignIn(signIn); |
| 151 | 156 | } |
| 157 | + DriverScheduling scheduling = dto.get(index); | |
| 158 | + long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT(); | |
| 159 | + String prompt = "请在" + ConstDateUtil.formatDate("HH:mm", new Date(date)) + "前后一小时内打卡。"; | |
| 160 | + signIn.setRemark((scheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt); | |
| 161 | + signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。")); | |
| 152 | 162 | // 之前是签到 | 目前无效 -》往后更新 |
| 153 | - schedulingMapper.updateRoster(dto.get(globalIndex.getIndex() + 1), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 163 | + schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 154 | 164 | nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex() + 1, signIn); |
| 155 | 165 | } |
| 156 | 166 | |
| ... | ... | @@ -247,7 +257,7 @@ public class SchedulingService { |
| 247 | 257 | // 相差十五分钟 |
| 248 | 258 | if (timeDifferenceInMillis > 0 && timeDifferenceInMillis < (60 * 1000 * 15)) { |
| 249 | 259 | return true; |
| 250 | - } else if (timeDifferenceInMillis < 0) { | |
| 260 | + } else if (timeDifferenceInMillis <= 0) { | |
| 251 | 261 | return true; |
| 252 | 262 | } |
| 253 | 263 | return false; | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/service/impl/AttendanceServiceImpl.java
| ... | ... | @@ -165,7 +165,7 @@ public class AttendanceServiceImpl implements AttendanceService { |
| 165 | 165 | List<RuleAttendanceMain> list = attendanceMainService.list(new QueryWrapper<RuleAttendanceMain>() |
| 166 | 166 | .lambda() |
| 167 | 167 | .eq(RuleAttendanceMain::getSchedulingDate, vo.getDate()) |
| 168 | - .eq(StringUtils.isNotEmpty(vo.getJocCode()), RuleAttendanceMain::getJobCode, vo.getJocCode())); | |
| 168 | + .eq(StringUtils.isNotEmpty(vo.getJobCode()), RuleAttendanceMain::getJobCode, vo.getJobCode())); | |
| 169 | 169 | return list; |
| 170 | 170 | } |
| 171 | 171 | ... | ... |