Commit e603dc0af1014a9a10ef8633df6622ad7e35e6de
1 parent
71818d8d
新 的打卡日志
Showing
10 changed files
with
167 additions
and
100 deletions
Bsth-admin/src/main/java/com/ruoyi/common/cache/NowSchedulingCache.java
| ... | ... | @@ -68,7 +68,7 @@ public class NowSchedulingCache { |
| 68 | 68 | * @param date |
| 69 | 69 | * @return int 0 为刷新成功、1为传入对象值为空或工号为空或传入的DriverScheduling的ID为空 |
| 70 | 70 | */ |
| 71 | - public int refreshDriveScheDulingCacheByDateAndJobCode(DriverScheduling driverScheduling, Date date) { | |
| 71 | + public int refreshDriveScheDulingCacheByDateAndJobCode(DriverScheduling driverScheduling, Date date) { | |
| 72 | 72 | if (Objects.isNull(driverScheduling) || Objects.isNull(date) || StringUtils.isEmpty(driverScheduling.getJobCode()) |
| 73 | 73 | || Objects.isNull(driverScheduling.getId())) { |
| 74 | 74 | log.warn("刷新本地打卡缓存信息失败,传入的对象为空。传入的时间:{},传入的数据对象:{}", date, driverScheduling); |
| ... | ... | @@ -154,33 +154,36 @@ public class NowSchedulingCache { |
| 154 | 154 | * @param index |
| 155 | 155 | * @param signIn |
| 156 | 156 | */ |
| 157 | - public void updateCacheByJobCode(String remark, String key, Integer index, SignIn signIn,boolean isNew,DriverScheduling sourceScheduling) { | |
| 158 | - if(isNew && Objects.nonNull(sourceScheduling)){ | |
| 159 | - if(Objects.isNull(cacheNowDayScheduling.get(key))){ | |
| 157 | + public void updateCacheByJobCode(String remark, String key, Integer index, SignIn signIn, boolean isNew, DriverScheduling sourceScheduling) { | |
| 158 | + if (isNew && Objects.nonNull(sourceScheduling)) { | |
| 159 | + if (Objects.isNull(cacheNowDayScheduling.get(key))) { | |
| 160 | 160 | return; |
| 161 | 161 | } |
| 162 | 162 | |
| 163 | 163 | int size = CollectionUtils.size(cacheNowDayScheduling.get(key).get(signIn.getJobCode())); |
| 164 | 164 | for (int i = 0; i < size; i++) { |
| 165 | - if(Objects.equals(cacheNowDayScheduling.get(key).get(signIn.getJobCode()).get(i).getId(),sourceScheduling.getId())){ | |
| 165 | + if (Objects.equals(cacheNowDayScheduling.get(key).get(signIn.getJobCode()).get(i).getId(), sourceScheduling.getId())) { | |
| 166 | 166 | index = i; |
| 167 | 167 | break; |
| 168 | 168 | } |
| 169 | 169 | } |
| 170 | - | |
| 171 | - | |
| 172 | - | |
| 173 | - | |
| 174 | 170 | } |
| 175 | 171 | if (key.equals(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(0))) |
| 176 | 172 | || key.equals(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(-1)))) { |
| 173 | + if (Objects.isNull(cacheNowDayScheduling.get(key)) || Objects.isNull(cacheNowDayScheduling.get(key).get(signIn.getJobCode()))) { | |
| 174 | + return; | |
| 175 | + } | |
| 176 | + int size = CollectionUtils.size(cacheNowDayScheduling.get(key).get(signIn.getJobCode())); | |
| 177 | + if (size <= index) { | |
| 178 | + return; | |
| 179 | + } | |
| 177 | 180 | DriverScheduling scheduling = cacheNowDayScheduling.get(key).get(signIn.getJobCode()).get(index); |
| 178 | 181 | scheduling.setSignInId(signIn.getId()); |
| 179 | 182 | scheduling.setRemark(remark); |
| 180 | 183 | |
| 181 | 184 | Integer exType = signIn.getExType(); |
| 182 | - if(isNew){ | |
| 183 | - exType = bigViewServiceV1.isSignStatusWineEnum(signIn)?3:bigViewServiceV1.isSignStatusDelayEnum(signIn)?1:Objects.equals(2,signIn.getExType())?2:0; | |
| 185 | + if (isNew) { | |
| 186 | + exType = bigViewServiceV1.isSignStatusWineEnum(signIn) ? 3 : bigViewServiceV1.isSignStatusDelayEnum(signIn) ? 1 : Objects.equals(2, signIn.getExType()) ? 2 : 0; | |
| 184 | 187 | } |
| 185 | 188 | scheduling.setExType(exType); |
| 186 | 189 | scheduling.setSignTime(signIn.getCreateTime()); |
| ... | ... | @@ -189,7 +192,7 @@ public class NowSchedulingCache { |
| 189 | 192 | scheduling.setAlcoholIntake(signIn.getAlcoholIntake()); |
| 190 | 193 | |
| 191 | 194 | |
| 192 | - cacheNowDayScheduling.get(key).get(signIn.getJobCode()).set(index,scheduling); | |
| 195 | + cacheNowDayScheduling.get(key).get(signIn.getJobCode()).set(index, scheduling); | |
| 193 | 196 | } |
| 194 | 197 | } |
| 195 | 198 | ... | ... |
Bsth-admin/src/main/java/com/ruoyi/common/cache/SchedulingCache.java
Bsth-admin/src/main/java/com/ruoyi/in/controller/SignInController.java
| ... | ... | @@ -7,18 +7,15 @@ import com.ruoyi.common.core.page.TableDataInfo; |
| 7 | 7 | import com.ruoyi.common.core.redis.RedisCache; |
| 8 | 8 | import com.ruoyi.common.enums.BusinessType; |
| 9 | 9 | import com.ruoyi.common.exception.file.FileUploadException; |
| 10 | -import com.ruoyi.common.utils.StringUtils; | |
| 11 | 10 | import com.ruoyi.common.utils.poi.ExcelUtil; |
| 12 | 11 | import com.ruoyi.in.domain.SignIn; |
| 13 | 12 | import com.ruoyi.in.service.ISignInService; |
| 14 | 13 | import com.ruoyi.in.service.SignInServiceV1; |
| 15 | 14 | import com.ruoyi.pojo.response.SignInResponseVo; |
| 16 | -import com.ruoyi.utils.ConstDateUtil; | |
| 17 | 15 | import io.swagger.annotations.Api; |
| 18 | 16 | import io.swagger.annotations.ApiOperation; |
| 19 | 17 | import io.swagger.annotations.ApiParam; |
| 20 | 18 | import lombok.extern.slf4j.Slf4j; |
| 21 | -import org.apache.commons.lang3.RandomUtils; | |
| 22 | 19 | import org.springframework.beans.factory.annotation.Autowired; |
| 23 | 20 | import org.springframework.validation.annotation.Validated; |
| 24 | 21 | import org.springframework.web.bind.annotation.*; |
| ... | ... | @@ -26,13 +23,7 @@ import org.springframework.web.bind.annotation.*; |
| 26 | 23 | import javax.servlet.http.HttpServletRequest; |
| 27 | 24 | import javax.servlet.http.HttpServletResponse; |
| 28 | 25 | import java.io.IOException; |
| 29 | -import java.text.MessageFormat; | |
| 30 | -import java.util.Date; | |
| 31 | 26 | import java.util.List; |
| 32 | -import java.util.Objects; | |
| 33 | -import java.util.concurrent.TimeUnit; | |
| 34 | - | |
| 35 | -import static com.ruoyi.common.redispre.GlobalRedisPreName.REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW; | |
| 36 | 27 | |
| 37 | 28 | /** |
| 38 | 29 | * 签到Controller |
| ... | ... | @@ -110,36 +101,37 @@ public class SignInController extends BaseController { |
| 110 | 101 | @PostMapping("/newAdd") |
| 111 | 102 | @ApiOperation("新增签到(设备传入)") |
| 112 | 103 | public AjaxResult addSignIn(@ApiParam @RequestBody @Validated SignIn signIn) throws FileUploadException, IOException { |
| 113 | - String key = MessageFormat.format("sign:assignment:{0}", signIn.getJobCode()); | |
| 114 | - if (redisCache.hasKey(key)) { | |
| 115 | - log.info(" sing method old sign :[{}]", signIn); | |
| 116 | - return signInService.addSignIn(signIn); | |
| 117 | - } | |
| 118 | - | |
| 119 | - Integer num = RandomUtils.nextInt(0, 10); | |
| 120 | - if (num < 6) { | |
| 121 | - redisCache.setCacheObject(key, num, 5, TimeUnit.MINUTES); | |
| 122 | - log.info("[{}] sing method 走新的签到方式 :[{}] ", num, signIn); | |
| 123 | - key = StringUtils.join(REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW, ConstDateUtil.FAST_YYYY_MM_DD.format(new Date()), ":", signIn.getJobCode()); | |
| 124 | - Integer count = redisCache.getCacheObject(key); | |
| 125 | - try { | |
| 126 | - return signInServiceV1.addsignInV1(signIn); | |
| 127 | - } catch (Exception e) { | |
| 128 | - if (Objects.isNull(count) || count < 1) { | |
| 129 | - count = 0; | |
| 130 | - } else { | |
| 131 | - count = count - 1; | |
| 132 | - } | |
| 133 | - if (redisCache.hasKey(key)) { | |
| 134 | - redisCache.setCacheObject(key, count, 1, TimeUnit.DAYS); | |
| 135 | - } | |
| 136 | - log.error("[{}] sing method 走新的签到方式,签到失败 :[{}]", num, signIn, e); | |
| 137 | - } | |
| 138 | - | |
| 139 | - } | |
| 140 | - | |
| 141 | - log.info("[{}] sing method old sign :[{}]", num, signIn); | |
| 142 | - return signInService.addSignIn(signIn); | |
| 104 | +// String key = MessageFormat.format("sign:assignment:{0}", signIn.getJobCode()); | |
| 105 | +// if (redisCache.hasKey(key)) { | |
| 106 | +// log.info(" sing method old sign :[{}]", signIn); | |
| 107 | +// return signInService.addSignIn(signIn); | |
| 108 | +// } | |
| 109 | +// | |
| 110 | +// Integer num = RandomUtils.nextInt(0, 10); | |
| 111 | +// if (num < 6) { | |
| 112 | +// redisCache.setCacheObject(key, num, 5, TimeUnit.MINUTES); | |
| 113 | +// log.info("[{}] sing method 走新的签到方式 :[{}] ", num, signIn); | |
| 114 | +// key = StringUtils.join(REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW, ConstDateUtil.FAST_YYYY_MM_DD.format(new Date()), ":", signIn.getJobCode()); | |
| 115 | +// Integer count = redisCache.getCacheObject(key); | |
| 116 | +// try { | |
| 117 | +// return signInServiceV1.addsignInV1(signIn); | |
| 118 | +// } catch (Exception e) { | |
| 119 | +// if (Objects.isNull(count) || count < 1) { | |
| 120 | +// count = 0; | |
| 121 | +// } else { | |
| 122 | +// count = count - 1; | |
| 123 | +// } | |
| 124 | +// if (redisCache.hasKey(key)) { | |
| 125 | +// redisCache.setCacheObject(key, count, 1, TimeUnit.DAYS); | |
| 126 | +// } | |
| 127 | +// log.error("[{}] sing method 走新的签到方式,签到失败 :[{}]", num, signIn, e); | |
| 128 | +// } | |
| 129 | +// | |
| 130 | +// } | |
| 131 | +// | |
| 132 | +// log.info("[{}] sing method old sign :[{}]", num, signIn); | |
| 133 | +// return signInService.addSignIn(signIn); | |
| 134 | + return signInServiceV1.addsignInV1(signIn); | |
| 143 | 135 | } |
| 144 | 136 | |
| 145 | 137 | // /** | ... | ... |
Bsth-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceV1Impl.java
| ... | ... | @@ -27,6 +27,7 @@ import com.ruoyi.in.domain.SignIn; |
| 27 | 27 | import com.ruoyi.in.domain.SignInV1; |
| 28 | 28 | import com.ruoyi.in.mapper.SignInMapper; |
| 29 | 29 | import com.ruoyi.in.mapper.SignInMapperV1; |
| 30 | +import com.ruoyi.in.service.ISignInService; | |
| 30 | 31 | import com.ruoyi.in.service.SignInServiceV1; |
| 31 | 32 | import com.ruoyi.scheduling.service.SchedulingServiceV1; |
| 32 | 33 | import com.ruoyi.service.BigViewServiceV1; |
| ... | ... | @@ -75,6 +76,8 @@ public class SignInServiceV1Impl extends ServiceImpl<SignInMapperV1, SignInV1> i |
| 75 | 76 | |
| 76 | 77 | @Autowired |
| 77 | 78 | private RedisCache redisCache; |
| 79 | + @Autowired | |
| 80 | + private ISignInService signInService; | |
| 78 | 81 | |
| 79 | 82 | private static final FastDateFormat HHMM = FastDateFormat.getInstance("HH:mm"); |
| 80 | 83 | |
| ... | ... | @@ -142,7 +145,7 @@ public class SignInServiceV1Impl extends ServiceImpl<SignInMapperV1, SignInV1> i |
| 142 | 145 | switchAndChooseAlcohol(signIn, driver, scheduling); |
| 143 | 146 | |
| 144 | 147 | } else { |
| 145 | - log.info("签到的数据为:[{}]",scheduling); | |
| 148 | + log.info("签到的数据为:[{}]", scheduling); | |
| 146 | 149 | SignInV1 sourceSign = getById(scheduling.getSignInId()); |
| 147 | 150 | if (Objects.nonNull(sourceSign)) { |
| 148 | 151 | switchAndChooseTime(signIn, scheduling, dateTime); |
| ... | ... | @@ -153,10 +156,11 @@ public class SignInServiceV1Impl extends ServiceImpl<SignInMapperV1, SignInV1> i |
| 153 | 156 | } |
| 154 | 157 | |
| 155 | 158 | private AjaxResult saveData(SignIn signIn, DriverScheduling scheduling, CalDriverScheduling calDriverScheduling, Driver driver, SignInV1 signInV1) { |
| 159 | + | |
| 156 | 160 | signInMapper.insertSignIn(signIn); |
| 157 | 161 | // 更新考勤 |
| 158 | 162 | if (Objects.nonNull(calDriverScheduling)) { |
| 159 | - schedulingService.computedSignInBySignIn(scheduling, calDriverScheduling.getIndex(), signIn,true); | |
| 163 | + schedulingService.computedSignInBySignIn(scheduling, calDriverScheduling.getIndex(), signIn, true, signInService); | |
| 160 | 164 | } |
| 161 | 165 | |
| 162 | 166 | if (TempCache.checkJobCodeExist(signIn.getJobCode())) { |
| ... | ... | @@ -256,16 +260,27 @@ public class SignInServiceV1Impl extends ServiceImpl<SignInMapperV1, SignInV1> i |
| 256 | 260 | String fcsjHHMM = HHMM.format(zdsj); |
| 257 | 261 | String dzsjHHMM = HHMM.format(date1); |
| 258 | 262 | |
| 263 | + Calendar calendar = new GregorianCalendar(); | |
| 264 | + calendar.setTime(org.apache.commons.lang3.time.DateUtils.addMinutes(zdsj, 1)); | |
| 265 | + calendar.set(Calendar.SECOND, 0); | |
| 266 | + calendar.set(Calendar.MILLISECOND, 0); | |
| 267 | + | |
| 268 | + Date date = Math.abs(calendar.getTime().getTime()-dateTime)>Math.abs(zdsj.getTime()-dateTime)?zdsj:calendar.getTime(); | |
| 269 | + | |
| 259 | 270 | String remark = org.apache.commons.lang3.StringUtils.join(ErrorTypeProperties.SIGN_OUT_TIMEOUT, "请在", fcsjHHMM, "到", dzsjHHMM, "之间打卡"); |
| 260 | - return switchAndChooseTime(signIn, dateTime, zdsj, 80, remark); | |
| 271 | + return switchAndChooseTime(signIn, dateTime, date, 80, remark); | |
| 261 | 272 | } else { |
| 262 | 273 | Date fcsj = new Date(scheduling.getFcsjT()); |
| 263 | 274 | |
| 264 | 275 | String fcsjHHMM = HHMM.format(org.apache.commons.lang3.time.DateUtils.addMinutes(fcsj, -60)); |
| 265 | 276 | String dzsjHHMM = HHMM.format(fcsj); |
| 277 | + Calendar calendar = new GregorianCalendar(); | |
| 278 | + calendar.setTime(org.apache.commons.lang3.time.DateUtils.addMinutes(fcsj, 1)); | |
| 279 | + calendar.set(Calendar.SECOND, 0); | |
| 280 | + calendar.set(Calendar.MILLISECOND, 0); | |
| 266 | 281 | |
| 267 | 282 | String remark = org.apache.commons.lang3.StringUtils.join(ErrorTypeProperties.SIGN_IN_TIMEOUT, "请在", fcsjHHMM, "到", dzsjHHMM, "之间打卡"); |
| 268 | - return switchAndChooseTime(signIn, dateTime, fcsj, -60, remark); | |
| 283 | + return switchAndChooseTime(signIn, dateTime, calendar.getTime(), -60, remark); | |
| 269 | 284 | } |
| 270 | 285 | } |
| 271 | 286 | |
| ... | ... | @@ -346,19 +361,26 @@ public class SignInServiceV1Impl extends ServiceImpl<SignInMapperV1, SignInV1> i |
| 346 | 361 | */ |
| 347 | 362 | private CalDriverScheduling findSchedulingByDateTime(List<DriverSchedulingV1> schedulings, long dateTime, String type) { |
| 348 | 363 | int size = CollectionUtils.size(schedulings); |
| 364 | + Set<Long> values = new LinkedHashSet<>(); | |
| 349 | 365 | for (int i = 0; i < size; i++) { |
| 350 | 366 | DriverSchedulingV1 s = schedulings.get(i); |
| 351 | 367 | s.setIndex(i); |
| 352 | 368 | |
| 353 | 369 | if (Objects.nonNull(s.getFcsjT()) && org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(org.apache.commons.lang3.StringUtils.trim(s.getBcType()), type)) { |
| 354 | 370 | s.setMinTime(Math.abs(s.getFcsjT() - dateTime)); |
| 371 | + values.add(s.getMinTime()); | |
| 355 | 372 | } else { |
| 356 | 373 | s.setMinTime(Long.MAX_VALUE); |
| 357 | 374 | } |
| 358 | 375 | |
| 359 | 376 | } |
| 377 | +// Optional<DriverSchedulingV1> optional = schedulings.stream().filter(s -> Objects.isNull(s.getSignInId())).min(Comparator.comparing(DriverScheduling::getMinTime)); | |
| 378 | +// if (optional.isPresent()) { | |
| 379 | +// return new CalDriverScheduling(optional.get()); | |
| 380 | +// } | |
| 381 | + Optional<DriverSchedulingV1> optional = schedulings.stream().filter(s -> org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(type, s.getBcType())).min(Comparator.comparing(DriverScheduling::getMinTime)); | |
| 382 | + | |
| 360 | 383 | |
| 361 | - Optional<DriverSchedulingV1> optional = schedulings.stream().min(Comparator.comparing(DriverScheduling::getMinTime)); | |
| 362 | 384 | return new CalDriverScheduling(optional.orElse(null)); |
| 363 | 385 | } |
| 364 | 386 | ... | ... |
Bsth-admin/src/main/java/com/ruoyi/scheduling/service/impl/SchedulingServiceV1Impl.java
| ... | ... | @@ -2,11 +2,14 @@ package com.ruoyi.scheduling.service.impl; |
| 2 | 2 | |
| 3 | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| 4 | 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| 5 | +import com.ruoyi.common.utils.DateUtils; | |
| 5 | 6 | import com.ruoyi.domain.DriverSchedulingV1; |
| 6 | 7 | import com.ruoyi.scheduling.mapper.SchedulingMapperV1; |
| 7 | 8 | import com.ruoyi.scheduling.service.SchedulingServiceV1; |
| 9 | +import org.apache.commons.lang3.StringUtils; | |
| 8 | 10 | import org.springframework.stereotype.Service; |
| 9 | 11 | |
| 12 | +import java.text.ParseException; | |
| 10 | 13 | import java.util.Date; |
| 11 | 14 | import java.util.List; |
| 12 | 15 | |
| ... | ... | @@ -15,9 +18,25 @@ public class SchedulingServiceV1Impl extends ServiceImpl<SchedulingMapperV1, Dri |
| 15 | 18 | |
| 16 | 19 | @Override |
| 17 | 20 | public List<DriverSchedulingV1> queryByJobCodeAndSchedulingDate(String jobCode, Date date) { |
| 21 | + String dateStr = DateUtils.FAST_YYYY_MM_DD.format(org.apache.commons.lang3.time.DateUtils.addDays(date, 1)); | |
| 22 | + dateStr = StringUtils.join(dateStr, " 06:30:30"); | |
| 18 | 23 | LambdaQueryWrapper<DriverSchedulingV1> wrapper = new LambdaQueryWrapper<>(); |
| 19 | - wrapper.eq(DriverSchedulingV1::getJobCode, jobCode).eq(DriverSchedulingV1::getScheduleDate, date); | |
| 20 | - wrapper.orderByAsc(DriverSchedulingV1::getFcsjT); | |
| 24 | + try { | |
| 25 | + Date date1 = DateUtils.FAST_YYYY_MM_DDHHMMSS.parse(dateStr); | |
| 26 | + | |
| 27 | +// dateStr = DateUtils.FAST_YYYY_MM_DD.format(org.apache.commons.lang3.time.DateUtils.addDays(date, -1)); | |
| 28 | + dateStr = DateUtils.FAST_YYYY_MM_DD.format(date); | |
| 29 | + dateStr = StringUtils.join(dateStr, " 00:00:00"); | |
| 30 | + Date date2 = DateUtils.FAST_YYYY_MM_DDHHMMSS.parse(dateStr); | |
| 31 | + | |
| 32 | + wrapper.eq(DriverSchedulingV1::getJobCode, jobCode); | |
| 33 | + wrapper.and(wr -> { | |
| 34 | + wr.eq(DriverSchedulingV1::getScheduleDate, date).or().between(DriverSchedulingV1::getFcsjT, date2.getTime(), date1.getTime()); | |
| 35 | + }); | |
| 36 | + wrapper.orderByAsc(DriverSchedulingV1::getFcsjT); | |
| 37 | + } catch (ParseException e) { | |
| 38 | + throw new RuntimeException(e); | |
| 39 | + } | |
| 21 | 40 | return list(wrapper); |
| 22 | 41 | } |
| 23 | 42 | |
| ... | ... | @@ -25,7 +44,7 @@ public class SchedulingServiceV1Impl extends ServiceImpl<SchedulingMapperV1, Dri |
| 25 | 44 | public List<DriverSchedulingV1> queryByNbbmAndDate(String nbbm, Date date) { |
| 26 | 45 | LambdaQueryWrapper<DriverSchedulingV1> wrapper = new LambdaQueryWrapper<>(); |
| 27 | 46 | wrapper.eq(DriverSchedulingV1::getNbbm, nbbm).eq(DriverSchedulingV1::getScheduleDate, date); |
| 28 | - | |
| 47 | + | |
| 29 | 48 | return list(wrapper); |
| 30 | 49 | } |
| 31 | 50 | } | ... | ... |
Bsth-admin/src/main/java/com/ruoyi/service/BigViewServiceV1.java
| ... | ... | @@ -11,7 +11,7 @@ import java.util.Date; |
| 11 | 11 | |
| 12 | 12 | public interface BigViewServiceV1 { |
| 13 | 13 | |
| 14 | - void asyncRefreshRedisValue(SignIn signIn, Driver driver, DriverScheduling driverScheduling,String dateStr, Date date) throws InterruptedException; | |
| 14 | + void asyncRefreshRedisValue(SignIn signIn, Driver driver, DriverScheduling driverScheduling, String dateStr, Date date) throws InterruptedException; | |
| 15 | 15 | |
| 16 | 16 | AjaxResult queryBigViewQueryLineInfo(Date date); |
| 17 | 17 | |
| ... | ... | @@ -30,6 +30,13 @@ public interface BigViewServiceV1 { |
| 30 | 30 | AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn); |
| 31 | 31 | |
| 32 | 32 | /*** |
| 33 | + * 是否正常 | |
| 34 | + * @param signIn | |
| 35 | + * @return | |
| 36 | + */ | |
| 37 | + boolean isNormal(SignIn signIn); | |
| 38 | + | |
| 39 | + /*** | |
| 33 | 40 | * 是否是早签 |
| 34 | 41 | * @author liujun |
| 35 | 42 | * @date 2024/9/25 14:51 |
| ... | ... | @@ -69,6 +76,7 @@ public interface BigViewServiceV1 { |
| 69 | 76 | * @return boolean |
| 70 | 77 | */ |
| 71 | 78 | boolean isSignStatusZoneEnum(SignIn signIn); |
| 79 | + | |
| 72 | 80 | /*** |
| 73 | 81 | * 是否是驾驶员 |
| 74 | 82 | * @author liujun | ... | ... |
Bsth-admin/src/main/java/com/ruoyi/service/SchedulingService.java
| ... | ... | @@ -7,6 +7,7 @@ import com.ruoyi.domain.DriverScheduling; |
| 7 | 7 | import com.ruoyi.driver.mapper.DriverSchedulingMapper; |
| 8 | 8 | import com.ruoyi.in.domain.SignIn; |
| 9 | 9 | import com.ruoyi.in.mapper.SignInMapper; |
| 10 | +import com.ruoyi.in.service.ISignInService; | |
| 10 | 11 | import com.ruoyi.in.service.impl.SignInServiceImpl; |
| 11 | 12 | import com.ruoyi.pojo.DriverSignInRecommendation; |
| 12 | 13 | import com.ruoyi.pojo.GlobalIndex; |
| ... | ... | @@ -115,7 +116,7 @@ public class SchedulingService { |
| 115 | 116 | * @param signIn |
| 116 | 117 | * @param globalIndex |
| 117 | 118 | */ |
| 118 | - public void computedSignInBySignIn(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex, boolean isNew,DriverScheduling sourceScheduling) { | |
| 119 | + public void computedSignInBySignIn(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex, boolean isNew, DriverScheduling sourceScheduling) { | |
| 119 | 120 | // 无排班不记录不在考勤表不更新 |
| 120 | 121 | if (CollectionUtil.isEmpty(dto)) { |
| 121 | 122 | return; |
| ... | ... | @@ -126,13 +127,13 @@ public class SchedulingService { |
| 126 | 127 | if (Objects.isNull(dto.get(globalIndex.getIndex()).getSignInId()) || dto.size() == 1) { |
| 127 | 128 | schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); |
| 128 | 129 | // 更新缓存 |
| 129 | - nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn, isNew,sourceScheduling); | |
| 130 | + nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn, isNew, sourceScheduling); | |
| 130 | 131 | |
| 131 | 132 | } |
| 132 | 133 | // 之前的无效 |
| 133 | 134 | else if (!SIGN_NO_EX_NUM.equals(dto.get(globalIndex.getIndex()).getExType())) { |
| 134 | 135 | schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); |
| 135 | - nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn, isNew,sourceScheduling); | |
| 136 | + nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn, isNew, sourceScheduling); | |
| 136 | 137 | |
| 137 | 138 | } |
| 138 | 139 | // 之前的有效 |
| ... | ... | @@ -147,7 +148,7 @@ public class SchedulingService { |
| 147 | 148 | * |
| 148 | 149 | * @param signIn |
| 149 | 150 | */ |
| 150 | - public void computedSignInBySignIn(DriverScheduling driverScheduling, int index, SignIn signIn,boolean isNew) { | |
| 151 | + public void computedSignInBySignIn(DriverScheduling driverScheduling, int index, SignIn signIn, boolean isNew, ISignInService signInService) { | |
| 151 | 152 | // 无排班不记录不在考勤表不更新 |
| 152 | 153 | if (Objects.isNull(driverScheduling)) { |
| 153 | 154 | return; |
| ... | ... | @@ -156,23 +157,42 @@ public class SchedulingService { |
| 156 | 157 | // 更新最新的签到记录判断是否需要更新考勤 |
| 157 | 158 | // 记录为空直接插入记录 |
| 158 | 159 | if (Objects.isNull(driverScheduling.getSignInId())) { |
| 159 | - schedulingMapper.updateRoster(driverScheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 160 | - // 更新缓存 | |
| 161 | - nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(driverScheduling.getScheduleDate()), index, signIn,isNew,driverScheduling); | |
| 162 | - } | |
| 163 | - // 之前的无效 | |
| 164 | - else if (!SIGN_NO_EX_NUM.equals(driverScheduling.getExType())) { | |
| 165 | - schedulingMapper.updateRoster(driverScheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 166 | - nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(driverScheduling.getScheduleDate()), index, signIn,isNew,driverScheduling); | |
| 167 | - } | |
| 168 | - // 之前的有效 | |
| 169 | - else { | |
| 170 | - handlerRecord(driverScheduling, signIn, index,isNew); | |
| 160 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 161 | + }else{ | |
| 162 | + SignIn sourceSign = signInService.selectSignInById(driverScheduling.getSignInId()); | |
| 163 | + if(Objects.isNull(sourceSign)){ | |
| 164 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 165 | + }else if(bigViewServiceV1.isEarly(sourceSign) && bigViewServiceV1.isNormal(signIn)){ | |
| 166 | + //第一次是早签,第二次正常签到,覆盖原来的数据。 | |
| 167 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 168 | + }else if(bigViewServiceV1.isNormal(sourceSign) && bigViewServiceV1.isSignStatusWineEnum(signIn)){ | |
| 169 | + //第一次正常签到,第二次酒驾,覆盖原来的数据。 | |
| 170 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 171 | + }else if(!bigViewServiceV1.isEarly(sourceSign) && !bigViewServiceV1.isSignStatusDelayEnum(sourceSign) && | |
| 172 | + !bigViewServiceV1.isSignStatusWineEnum(sourceSign) && bigViewServiceV1.isSignStatusWineEnum(signIn)){ | |
| 173 | + //第一次正常签到,第二次酒驾,覆盖原来的数据。 | |
| 174 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 175 | + }else if(!bigViewServiceV1.isEarly(sourceSign) && !bigViewServiceV1.isSignStatusDelayEnum(sourceSign) && | |
| 176 | + bigViewServiceV1.isSignStatusWineEnum(sourceSign) && bigViewServiceV1.isNormal(signIn)){ | |
| 177 | + //第一次在签到时间范围内签到且酒驾,第二次正常,覆盖原来的数据。 | |
| 178 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 179 | + }else if(bigViewServiceV1.isSignStatusDelayEnum(sourceSign) && bigViewServiceV1.isSignStatusWineEnum(sourceSign) ){ | |
| 180 | + //第一次迟到签到且酒驾,第二次测试覆盖原来的数据。 | |
| 181 | + changeScheduling(driverScheduling,signIn,remark,index,isNew); | |
| 182 | + }else{ | |
| 183 | + handlerRecord(driverScheduling, signIn, index, isNew); | |
| 184 | + } | |
| 171 | 185 | } |
| 172 | 186 | |
| 173 | 187 | } |
| 174 | 188 | |
| 175 | - private void handlerRecord(DriverScheduling scheduling, SignIn signIn, Integer index,boolean isNew) { | |
| 189 | + private void changeScheduling(DriverScheduling driverScheduling,SignIn signIn,String remark,Integer index,boolean isNew){ | |
| 190 | + schedulingMapper.updateRoster(driverScheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 191 | + // 更新缓存 | |
| 192 | + nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(driverScheduling.getScheduleDate()), index, signIn, isNew, driverScheduling); | |
| 193 | + } | |
| 194 | + | |
| 195 | + private void handlerRecord(DriverScheduling scheduling, SignIn signIn, int index, boolean isNew) { | |
| 176 | 196 | if (Objects.isNull(scheduling)) { |
| 177 | 197 | return; |
| 178 | 198 | } |
| ... | ... | @@ -193,10 +213,10 @@ public class SchedulingService { |
| 193 | 213 | } |
| 194 | 214 | |
| 195 | 215 | |
| 196 | - String remark = getRemark(scheduling, signIn); | |
| 216 | +// String remark = getRemark(scheduling, signIn); | |
| 197 | 217 | signInMapper.updateSignIn(signIn); |
| 198 | - schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 199 | - nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(scheduling.getScheduleDate()), index, signIn,isNew,scheduling); | |
| 218 | + // schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); | |
| 219 | + // nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(scheduling.getScheduleDate()), index, signIn, isNew, scheduling); | |
| 200 | 220 | } |
| 201 | 221 | |
| 202 | 222 | |
| ... | ... | @@ -221,7 +241,7 @@ public class SchedulingService { |
| 221 | 241 | sb.append("," + signIn.getRemark().substring(index)); |
| 222 | 242 | } |
| 223 | 243 | } |
| 224 | - return sb.toString(); | |
| 244 | + return StringUtils.isEmpty(sb.toString()) ? "正常" : sb.toString(); | |
| 225 | 245 | } |
| 226 | 246 | |
| 227 | 247 | private String getRemark(DriverScheduling scheduling, SignIn signIn) { |
| ... | ... | @@ -230,16 +250,15 @@ public class SchedulingService { |
| 230 | 250 | sb.append(EARLY); |
| 231 | 251 | } else if (bigViewServiceV1.isSignStatusDelayEnum(signIn)) { |
| 232 | 252 | sb.append(SIGN_STATUS_DELAY_ENUM.getDescription(scheduling.getBcType())); |
| 233 | - } else { | |
| 253 | + } else if (StringUtils.isNotEmpty(signIn.getRemark())) { | |
| 234 | 254 | sb.append(signIn.getRemark()); |
| 235 | 255 | } |
| 236 | - | |
| 237 | 256 | if (bigViewServiceV1.isSignStatusWineEnum(signIn) && StringUtils.isNotEmpty(signIn.getRemark())) { |
| 238 | - if(StringUtils.indexOf(scheduling.getRemark(),signIn.getRemark()) > -1){ | |
| 257 | + if (StringUtils.indexOf(scheduling.getRemark(), signIn.getRemark()) > -1) { | |
| 239 | 258 | return scheduling.getRemark(); |
| 240 | 259 | } |
| 241 | 260 | |
| 242 | - if(StringUtils.indexOf(sb.toString(),signIn.getRemark()) > -1){ | |
| 261 | + if (StringUtils.indexOf(sb.toString(), signIn.getRemark()) > -1) { | |
| 243 | 262 | return sb.toString(); |
| 244 | 263 | } |
| 245 | 264 | int index = signIn.getRemark().indexOf(ALCOHOL_SIGN_IN_ERROR); |
| ... | ... | @@ -247,7 +266,7 @@ public class SchedulingService { |
| 247 | 266 | sb.append("," + signIn.getRemark().substring(index)); |
| 248 | 267 | } |
| 249 | 268 | } |
| 250 | - return sb.toString(); | |
| 269 | + return StringUtils.isEmpty(sb.toString()) ? "正常" : sb.toString(); | |
| 251 | 270 | } |
| 252 | 271 | |
| 253 | 272 | |
| ... | ... | @@ -288,7 +307,7 @@ public class SchedulingService { |
| 288 | 307 | String remark = getRemark(dto, signIn, index); |
| 289 | 308 | signInMapper.updateSignIn(signIn); |
| 290 | 309 | schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); |
| 291 | - nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex() + 1, signIn,false,scheduling); | |
| 310 | + nowSchedulingCache.updateCacheByJobCode(remark, ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex() + 1, signIn, false, scheduling); | |
| 292 | 311 | } |
| 293 | 312 | |
| 294 | 313 | private Integer bcTypeTransform(String bcType) { | ... | ... |
Bsth-admin/src/main/java/com/ruoyi/service/impl/BigViewServiceV1Impl.java
| ... | ... | @@ -186,6 +186,11 @@ public class BigViewServiceV1Impl implements BigViewServiceV1 { |
| 186 | 186 | return null; |
| 187 | 187 | } |
| 188 | 188 | |
| 189 | + @Override | |
| 190 | + public boolean isNormal(SignIn signIn) { | |
| 191 | + return Objects.nonNull(signIn) && Objects.equals(signIn.getExType(), 0); | |
| 192 | + } | |
| 193 | + | |
| 189 | 194 | |
| 190 | 195 | @Override |
| 191 | 196 | public boolean isEarly(SignIn signIn) { |
| ... | ... | @@ -195,7 +200,7 @@ public class BigViewServiceV1Impl implements BigViewServiceV1 { |
| 195 | 200 | |
| 196 | 201 | @Override |
| 197 | 202 | public boolean isSignStatusWineEnum(SignIn signIn) { |
| 198 | - return Objects.nonNull(signIn) && (Objects.equals(3, signIn.getExType()) || Objects.equals(23, signIn.getExType()) || Objects.equals(33, signIn.getExType())); | |
| 203 | + return Objects.nonNull(signIn) && Objects.nonNull(signIn.getExType()) && signIn.getExType() % 10 == 3; | |
| 199 | 204 | } |
| 200 | 205 | |
| 201 | 206 | |
| ... | ... | @@ -206,7 +211,7 @@ public class BigViewServiceV1Impl implements BigViewServiceV1 { |
| 206 | 211 | |
| 207 | 212 | @Override |
| 208 | 213 | public boolean isSignStatusZoneEnum(SignIn signIn) { |
| 209 | - return Objects.nonNull(signIn) && Objects.equals(0, signIn.getExType()); | |
| 214 | + return !isSignStatusWineEnum(signIn); | |
| 210 | 215 | } |
| 211 | 216 | |
| 212 | 217 | @Override | ... | ... |
Bsth-admin/src/main/resources/mapper/in/SignInMapper.xml
| ... | ... | @@ -36,6 +36,7 @@ |
| 36 | 36 | <result property="updateTime" column="update_time"/> |
| 37 | 37 | <result property="alcoholIntake" column="alcohol_intake"/> |
| 38 | 38 | <result property="remark" column="remark"/> |
| 39 | + <result property="exType" column="ex_type"/> | |
| 39 | 40 | </resultMap> |
| 40 | 41 | |
| 41 | 42 | <sql id="selectSignInVo"> |
| ... | ... | @@ -52,7 +53,8 @@ |
| 52 | 53 | type, |
| 53 | 54 | update_time, |
| 54 | 55 | alcohol_intake, |
| 55 | - remark | |
| 56 | + remark, | |
| 57 | + ex_type | |
| 56 | 58 | from sign_in |
| 57 | 59 | </sql> |
| 58 | 60 | ... | ... |
Bsth-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
| 1 | 1 | package com.ruoyi.common.utils; |
| 2 | 2 | |
| 3 | +import org.apache.commons.lang3.time.DateFormatUtils; | |
| 4 | +import org.apache.commons.lang3.time.FastDateFormat; | |
| 5 | + | |
| 3 | 6 | import java.lang.management.ManagementFactory; |
| 4 | 7 | import java.text.ParseException; |
| 5 | 8 | import java.text.SimpleDateFormat; |
| 6 | -import java.time.LocalDate; | |
| 7 | -import java.time.LocalDateTime; | |
| 8 | -import java.time.LocalTime; | |
| 9 | -import java.time.ZoneId; | |
| 10 | -import java.time.ZonedDateTime; | |
| 9 | +import java.time.*; | |
| 11 | 10 | import java.util.Date; |
| 12 | 11 | import java.util.Objects; |
| 13 | 12 | |
| 14 | -import org.apache.commons.lang3.time.DateFormatUtils; | |
| 15 | -import org.apache.commons.lang3.time.FastDateFormat; | |
| 16 | - | |
| 17 | 13 | /** |
| 18 | 14 | * 时间工具类 |
| 19 | 15 | * |
| ... | ... | @@ -36,7 +32,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { |
| 36 | 32 | "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", |
| 37 | 33 | "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; |
| 38 | 34 | |
| 39 | - public static FastDateFormat FAST_YYYY_MM_DD = FastDateFormat.getInstance("yyyy-MM-DD"); | |
| 35 | + public static FastDateFormat FAST_YYYY_MM_DD = FastDateFormat.getInstance("yyyy-MM-dd"); | |
| 36 | + public static FastDateFormat FAST_YYYY_MM_DDHHMMSS = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); | |
| 40 | 37 | |
| 41 | 38 | /** |
| 42 | 39 | * 获取当前Date型日期 | ... | ... |