Commit 010828aaf658869d6afe0034d0d4914ad27a4b19

Authored by guzijian
1 parent 8684c715

feat: 修改签退时间范围

Bsth-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
@@ -506,7 +506,7 @@ public class SignInServiceImpl implements ISignInService { @@ -506,7 +506,7 @@ public class SignInServiceImpl implements ISignInService {
506 506
507 private boolean driverCheckTimeOut(GlobalIndex globalIndex, SignIn signIn, List<DriverScheduling> dto, long now) { 507 private boolean driverCheckTimeOut(GlobalIndex globalIndex, SignIn signIn, List<DriverScheduling> dto, long now) {
508 try { 508 try {
509 - Boolean result = true; 509 + boolean result = true;
510 DriverSignInRecommendation currentScheduling = schedulingService.computedTheCurrentClosestTimestamp(dto, now, 0); 510 DriverSignInRecommendation currentScheduling = schedulingService.computedTheCurrentClosestTimestamp(dto, now, 0);
511 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps()); 511 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps());
512 LocalDateTime nowTime = ConstDateUtil.getLocalDateTimeByLongTime(now); 512 LocalDateTime nowTime = ConstDateUtil.getLocalDateTimeByLongTime(now);
@@ -516,49 +516,50 @@ public class SignInServiceImpl implements ISignInService { @@ -516,49 +516,50 @@ public class SignInServiceImpl implements ISignInService {
516 return handlerExceptionRecord(dto, now, globalIndex, signIn); 516 return handlerExceptionRecord(dto, now, globalIndex, signIn);
517 } 517 }
518 // 不在有效时间范围内,判断当前是否有签到记录 当前应签到还是签退 518 // 不在有效时间范围内,判断当前是否有签到记录 当前应签到还是签退
519 - if (!(Math.abs(nowBetween) <= 60)) { 519 + if (checkTimerSign(nowBetween, currentScheduling.getBcType())) {
520 // 签到一个逻辑 当前无记录 520 // 签到一个逻辑 当前无记录
521 if (currentScheduling.getBcType().equals(BC_TYPE_OUT) && Objects.isNull(currentScheduling.getSignInId())) { 521 if (currentScheduling.getBcType().equals(BC_TYPE_OUT) && Objects.isNull(currentScheduling.getSignInId())) {
522 DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1); 522 DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1);
523 // 给出签到范围 523 // 给出签到范围
524 // 上一次无记|签到,type:签退 当前时间小于最近签到时间 -> 超时签退 524 // 上一次无记|签到,type:签退 当前时间小于最近签到时间 -> 超时签退
525 if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getBcType().equals(BC_TYPE_IN)) { 525 if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getBcType().equals(BC_TYPE_IN)) {
526 - signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。"); 526 + signIn.setRemark(SIGN_OUT_TIMEOUT + getPrompt(lastClosestTimestamp));
527 globalIndex.setIndex(lastClosestTimestamp.getIndex()); 527 globalIndex.setIndex(lastClosestTimestamp.getIndex());
528 result = false; 528 result = false;
529 } 529 }
530 // 上一次无记无|签到,type:签退 当前时间小于最近签到时间 -> 超时签退 530 // 上一次无记无|签到,type:签退 当前时间小于最近签到时间 -> 超时签退
531 else if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getIndex().equals(currentScheduling.getIndex())) { 531 else if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getIndex().equals(currentScheduling.getIndex())) {
532 - signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"); 532 + signIn.setRemark(SIGN_IN_TIMEOUT + getPrompt(currentScheduling));
533 globalIndex.setIndex(currentScheduling.getIndex()); 533 globalIndex.setIndex(currentScheduling.getIndex());
534 result = false; 534 result = false;
535 } 535 }
536 // 当前最近无记录|签到,type:签到|签退 -> 签到超时给上 536 // 当前最近无记录|签到,type:签到|签退 -> 签到超时给上
537 else { 537 else {
538 - signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"); 538 + signIn.setRemark(SIGN_IN_TIMEOUT + getPrompt(currentScheduling));
539 globalIndex.setIndex(currentScheduling.getIndex()); 539 globalIndex.setIndex(currentScheduling.getIndex());
540 result = false; 540 result = false;
541 } 541 }
542 } 542 }
  543 +
543 // 签退一个逻辑 当前无记录 544 // 签退一个逻辑 当前无记录
544 if (currentScheduling.getBcType().equals(BC_TYPE_IN) && Objects.isNull(currentScheduling.getSignInId())) { 545 if (currentScheduling.getBcType().equals(BC_TYPE_IN) && Objects.isNull(currentScheduling.getSignInId())) {
545 DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1); 546 DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1);
546 // 上一次无记|签退,type:签到 当前时间小于最近签退时间 -> 签到异常 547 // 上一次无记|签退,type:签到 当前时间小于最近签退时间 -> 签到异常
547 if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_IN)) { 548 if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_IN)) {
548 - signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。"); 549 + signIn.setRemark(SIGN_IN_TIMEOUT + getPrompt(lastClosestTimestamp));
549 globalIndex.setIndex(lastClosestTimestamp.getIndex()); 550 globalIndex.setIndex(lastClosestTimestamp.getIndex());
550 result = false; 551 result = false;
551 } 552 }
552 // 当前无记|签退 , type:签退|签到 ——> 签退异常 553 // 当前无记|签退 , type:签退|签到 ——> 签退异常
553 else { 554 else {
554 - signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"); 555 + signIn.setRemark(SIGN_OUT_TIMEOUT + getPrompt(currentScheduling));
555 globalIndex.setIndex(currentScheduling.getIndex()); 556 globalIndex.setIndex(currentScheduling.getIndex());
556 result = false; 557 result = false;
557 } 558 }
558 } 559 }
559 // 签退|签到 当前有记录 560 // 签退|签到 当前有记录
560 if (!Objects.isNull(currentScheduling.getSignInId())) { 561 if (!Objects.isNull(currentScheduling.getSignInId())) {
561 - String prompt = "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。"; 562 + String prompt = getPrompt(currentScheduling);
562 signIn.setRemark((currentScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt); 563 signIn.setRemark((currentScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt);
563 globalIndex.setIndex(currentScheduling.getIndex()); 564 globalIndex.setIndex(currentScheduling.getIndex());
564 result = false; 565 result = false;
@@ -569,10 +570,36 @@ public class SignInServiceImpl implements ISignInService { @@ -569,10 +570,36 @@ public class SignInServiceImpl implements ISignInService {
569 } 570 }
570 return result; 571 return result;
571 } catch (Exception e) { 572 } catch (Exception e) {
  573 + log.info(e.getMessage());
572 return true; 574 return true;
573 } 575 }
574 } 576 }
575 577
  578 + private String getPrompt(DriverSignInRecommendation currentScheduling) {
  579 + if (BC_TYPE_OUT.equals(currentScheduling.getBcType())) {
  580 + return "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。";
  581 + } else {
  582 + // 正两小时 负 1小时
  583 + LocalDateTime time = ConstDateUtil.stringTransformLocalDateTime(ConstDateUtil.formatDate("yyyy-MM-dd HH:mm:ss", new Date(currentScheduling.getTimestamps())),"yyyy-MM-dd HH:mm:ss");
  584 + LocalDateTime addHours = time.plusHours(2);
  585 + LocalDateTime hours = time.plusHours(-1);
  586 + return "请在" + ConstDateUtil.formatDate("HH:mm", hours) + "到"
  587 + + ConstDateUtil.formatDate("HH:mm", addHours) + "之间打卡";
  588 + }
  589 + }
  590 +
  591 +
  592 +
  593 + private static boolean checkTimerSign(long nowBetween, String bcType) {
  594 + // 如果是签到就是正负一小时内有效
  595 + if (BC_TYPE_OUT.equals(bcType)) {
  596 + return !(Math.abs(nowBetween) <= 60);
  597 + } else {
  598 + // 如果是签退就是负1小时 正两小时有效
  599 + return !((nowBetween >= 0 && nowBetween <= 120L) || (nowBetween < 0 && nowBetween >= -60L));
  600 + }
  601 + }
  602 +
576 private Boolean handlerExceptionRecord(List<DriverScheduling> dto, long now, GlobalIndex globalIndex, SignIn signIn) { 603 private Boolean handlerExceptionRecord(List<DriverScheduling> dto, long now, GlobalIndex globalIndex, SignIn signIn) {
577 DriverSignInRecommendation currentScheduling = schedulingService.computedTheCurrentClosestTimestamp(dto, now, 0); 604 DriverSignInRecommendation currentScheduling = schedulingService.computedTheCurrentClosestTimestamp(dto, now, 0);
578 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps()); 605 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps());
Bsth-admin/src/main/java/com/ruoyi/service/SchedulingService.java
@@ -142,7 +142,7 @@ public class SchedulingService { @@ -142,7 +142,7 @@ public class SchedulingService {
142 DriverScheduling scheduling = dto.get(globalIndex); 142 DriverScheduling scheduling = dto.get(globalIndex);
143 long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT(); 143 long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT();
144 long nowBetween = ChronoUnit.MINUTES.between(ConstDateUtil.getLocalDateTimeByLongTime(date), ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime())); 144 long nowBetween = ChronoUnit.MINUTES.between(ConstDateUtil.getLocalDateTimeByLongTime(date), ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime()));
145 - if (!(Math.abs(nowBetween) <= 60)) { 145 + if (checkTimerSign(nowBetween, scheduling.getBcType())) {
146 if (nowBetween < -60L) { 146 if (nowBetween < -60L) {
147 return "早签"; 147 return "早签";
148 } else { 148 } else {
@@ -152,6 +152,17 @@ public class SchedulingService { @@ -152,6 +152,17 @@ public class SchedulingService {
152 return signIn.getRemark(); 152 return signIn.getRemark();
153 } 153 }
154 154
  155 + private static boolean checkTimerSign(long nowBetween, String bcType) {
  156 + // 如果是签到就是正负一小时内有效
  157 + if (BC_TYPE_OUT.equals(bcType)) {
  158 + return !(Math.abs(nowBetween) <= 60);
  159 + } else {
  160 + // 如果是签退就是负1小时 正两小时有效
  161 + return !((nowBetween >= 0 && nowBetween <= 120L) || (nowBetween < 0 && nowBetween >= -60L));
  162 + }
  163 + }
  164 +
  165 +
155 private void handlerRecord(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex) { 166 private void handlerRecord(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex) {
156 if (globalIndex.getIndex() == dto.size() - 1) { 167 if (globalIndex.getIndex() == dto.size() - 1) {
157 return; 168 return;
@@ -163,24 +174,36 @@ public class SchedulingService { @@ -163,24 +174,36 @@ public class SchedulingService {
163 return; 174 return;
164 } 175 }
165 int index = globalIndex.getIndex() + 1; 176 int index = globalIndex.getIndex() + 1;
166 - // 之前是签到 | 目前有效记录 -》进行修改 变成无效  
167 - if (signIn.getExType().equals(SIGN_NO_EX_NUM)) {  
168 - signIn.setStatus(SIGN_IN_FAIL);  
169 - signIn.setExType(SIGN_TIME_OUT_EX_NUM);  
170 - signInMapper.updateSignIn(signIn);  
171 - } 177 + // 目前有效记录 -》进行修改 变成无效
  178 +// if (signIn.getExType().equals(SIGN_NO_EX_NUM)) {
  179 +// signIn.setStatus(SIGN_IN_FAIL);
  180 +// signIn.setExType(SIGN_TIME_OUT_EX_NUM);
  181 +// signInMapper.updateSignIn(signIn);
  182 +// }
172 DriverScheduling scheduling = dto.get(index); 183 DriverScheduling scheduling = dto.get(index);
173 long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT(); 184 long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT();
174 - String prompt = "请在" + ConstDateUtil.formatDate("HH:mm", new Date(date)) + "前后一小时内打卡。"; 185 + String prompt = getPrompt(new Date(date), scheduling.getBcType());
175 signIn.setRemark((scheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt); 186 signIn.setRemark((scheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt);
176 signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。")); 187 signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。"));
177 - // 之前是签到 | 目前无效 -》往后更新  
178 - 188 + // 目前无效 -》往后更新
179 String remark = getRemark(dto, signIn, index); 189 String remark = getRemark(dto, signIn, index);
180 schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); 190 schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
181 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex() + 1, signIn); 191 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex() + 1, signIn);
182 } 192 }
183 193
  194 + private String getPrompt(Date date, String bcType) {
  195 + if (BC_TYPE_OUT.equals(bcType)) {
  196 + return "请在" + ConstDateUtil.formatDate("HH:mm", date) + "前后一小时内打卡。";
  197 + } else {
  198 + // 正两小时 负 1小时
  199 + LocalDateTime time = ConstDateUtil.stringTransformLocalDateTime(ConstDateUtil.formatDate("yyyy-MM-dd HH:mm:ss", date),"yyyy-MM-dd HH:mm:ss");
  200 + LocalDateTime addHours = time.plusHours(2);
  201 + LocalDateTime hours = time.plusHours(-1);
  202 + return "请在" + ConstDateUtil.formatDate("HH:mm", hours) + "到"
  203 + + ConstDateUtil.formatDate("HH:mm", addHours) + "之间打卡";
  204 + }
  205 + }
  206 +
184 public List<ReportViewResponseVo> queryReportTableResponseVo(ReportViewRequestVo requestVo, HttpServletResponse response) { 207 public List<ReportViewResponseVo> queryReportTableResponseVo(ReportViewRequestVo requestVo, HttpServletResponse response) {
185 // 处理天 208 // 处理天
186 if (requestVo.getExportFlag().equals(NOW)) { 209 if (requestVo.getExportFlag().equals(NOW)) {
Bsth-admin/src/main/java/com/ruoyi/service/ThreadJobService.java
@@ -459,9 +459,28 @@ public class ThreadJobService { @@ -459,9 +459,28 @@ public class ThreadJobService {
459 bcList.add(scheduling3); 459 bcList.add(scheduling3);
460 } 460 }
461 } 461 }
  462 + // 测试用例
  463 + bcList.add(getDriverSchedulingTest("2023-09-26 03:20:00","2023-09-26 09:30:00","out"));
  464 + bcList.add(getDriverSchedulingTest("2023-09-26 03:20:00","2023-09-26 09:30:00","in"));
462 return bcList; 465 return bcList;
463 } 466 }
464 467
  468 + private DriverScheduling getDriverSchedulingTest(String startTime, String endTime,String bcType) {
  469 + DriverScheduling scheduling = new DriverScheduling();
  470 + scheduling.setJobCode("700001");
  471 + scheduling.setName("测试");
  472 + scheduling.setPosts("测试");
  473 + scheduling.setScheduleDate(new Date());
  474 + scheduling.setLineName("");
  475 + scheduling.setLpName("");
  476 + scheduling.setNbbm("");
  477 + scheduling.setFcsjT(ConstDateUtil.parseDate(startTime).getTime());
  478 + scheduling.setZdsjT(ConstDateUtil.parseDate(endTime).getTime());
  479 + scheduling.setFleetName("");
  480 + scheduling.setBcType(bcType);
  481 + return scheduling;
  482 + }
  483 +
465 private static DriverScheduling getDriverScheduling(RuleAttendanceMain ruleAttendanceMain) { 484 private static DriverScheduling getDriverScheduling(RuleAttendanceMain ruleAttendanceMain) {
466 DriverScheduling scheduling = new DriverScheduling(); 485 DriverScheduling scheduling = new DriverScheduling();
467 scheduling.setPosts(ruleAttendanceMain.getPosts()); 486 scheduling.setPosts(ruleAttendanceMain.getPosts());
Bsth-admin/src/main/java/com/ruoyi/utils/ConstDateUtil.java
@@ -10,6 +10,13 @@ import java.util.Date; @@ -10,6 +10,13 @@ import java.util.Date;
10 import java.util.List; 10 import java.util.List;
11 11
12 public class ConstDateUtil { 12 public class ConstDateUtil {
  13 +
  14 + public static LocalDateTime stringTransformLocalDateTime(String dateString, String pattern){
  15 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
  16 + return LocalDateTime.parse(dateString,formatter);
  17 + }
  18 +
  19 +
13 public static String formatDate(String pattern){ 20 public static String formatDate(String pattern){
14 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); 21 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
15 return simpleDateFormat.format(new Date()); 22 return simpleDateFormat.format(new Date());
@@ -28,6 +35,12 @@ public class ConstDateUtil { @@ -28,6 +35,12 @@ public class ConstDateUtil {
28 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); 35 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
29 return simpleDateFormat.format(date); 36 return simpleDateFormat.format(date);
30 } 37 }
  38 +
  39 + public static String formatDate(String pattern,LocalDateTime date){
  40 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
  41 + return date.format(formatter);
  42 + }
  43 +
31 public static String formatDate(String pattern,LocalDate date){ 44 public static String formatDate(String pattern,LocalDate date){
32 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); 45 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
33 return simpleDateFormat.format(date); 46 return simpleDateFormat.format(date);