Commit f140e57a9d9b26df9f869908ebe643c6ba1b852d
1 parent
088d8a89
fix: 添加调度考勤
Showing
28 changed files
with
607 additions
and
101 deletions
ruoyi-admin/src/main/java/com/ruoyi/controller/AttendanceController.java
| @@ -6,10 +6,7 @@ import com.ruoyi.common.global.Result; | @@ -6,10 +6,7 @@ import com.ruoyi.common.global.Result; | ||
| 6 | import com.ruoyi.domain.RuleAttendanceMain; | 6 | import com.ruoyi.domain.RuleAttendanceMain; |
| 7 | import com.ruoyi.pojo.dto.SchedulingDto; | 7 | import com.ruoyi.pojo.dto.SchedulingDto; |
| 8 | import com.ruoyi.pojo.dto.SchedulingSettingDto; | 8 | import com.ruoyi.pojo.dto.SchedulingSettingDto; |
| 9 | -import com.ruoyi.pojo.vo.RuleAttendanceMainRequestVo; | ||
| 10 | -import com.ruoyi.pojo.vo.SchedulingRequestVo; | ||
| 11 | -import com.ruoyi.pojo.vo.SchedulingResponseVo; | ||
| 12 | -import com.ruoyi.pojo.vo.UpdateAttendanceVo; | 9 | +import com.ruoyi.pojo.vo.*; |
| 13 | import com.ruoyi.service.AttendanceService; | 10 | import com.ruoyi.service.AttendanceService; |
| 14 | import io.swagger.annotations.Api; | 11 | import io.swagger.annotations.Api; |
| 15 | import io.swagger.annotations.ApiOperation; | 12 | import io.swagger.annotations.ApiOperation; |
| @@ -21,6 +18,7 @@ import java.util.List; | @@ -21,6 +18,7 @@ import java.util.List; | ||
| 21 | 18 | ||
| 22 | /** | 19 | /** |
| 23 | * 考勤表controller | 20 | * 考勤表controller |
| 21 | + * | ||
| 24 | * @author 20412 | 22 | * @author 20412 |
| 25 | */ | 23 | */ |
| 26 | @RestController | 24 | @RestController |
| @@ -37,7 +35,7 @@ public class AttendanceController extends BaseController { | @@ -37,7 +35,7 @@ public class AttendanceController extends BaseController { | ||
| 37 | */ | 35 | */ |
| 38 | @ApiOperation("获取人员信息") | 36 | @ApiOperation("获取人员信息") |
| 39 | @GetMapping("/peoples") | 37 | @GetMapping("/peoples") |
| 40 | - public Result<?> getPeopleInfo(@RequestParam(value = "id",required = false) Long id){ | 38 | + public Result<?> getPeopleInfo(@RequestParam(value = "id", required = false) Long id) { |
| 41 | return Result.OK(attendanceService.getDriverInfo(id)); | 39 | return Result.OK(attendanceService.getDriverInfo(id)); |
| 42 | } | 40 | } |
| 43 | 41 | ||
| @@ -46,7 +44,7 @@ public class AttendanceController extends BaseController { | @@ -46,7 +44,7 @@ public class AttendanceController extends BaseController { | ||
| 46 | */ | 44 | */ |
| 47 | @ApiOperation("获取排班") | 45 | @ApiOperation("获取排班") |
| 48 | @GetMapping("/scheduling/list") | 46 | @GetMapping("/scheduling/list") |
| 49 | - public TableDataInfo getSchedulingList(@ModelAttribute SchedulingRequestVo vo){ | 47 | + public TableDataInfo getSchedulingList(@ModelAttribute SchedulingRequestVo vo) { |
| 50 | List<SchedulingResponseVo> list = attendanceService.getSchedulingList(vo); | 48 | List<SchedulingResponseVo> list = attendanceService.getSchedulingList(vo); |
| 51 | return getDataTable(list); | 49 | return getDataTable(list); |
| 52 | } | 50 | } |
| @@ -56,7 +54,7 @@ public class AttendanceController extends BaseController { | @@ -56,7 +54,7 @@ public class AttendanceController extends BaseController { | ||
| 56 | */ | 54 | */ |
| 57 | @ApiOperation("根据班次获取模板") | 55 | @ApiOperation("根据班次获取模板") |
| 58 | @GetMapping("/template/{id}") | 56 | @GetMapping("/template/{id}") |
| 59 | - public Result<?> getTemplate(@PathVariable("id") Long id){ | 57 | + public Result<?> getTemplate(@PathVariable("id") Long id) { |
| 60 | return Result.OK(attendanceService.getTemplate(id)); | 58 | return Result.OK(attendanceService.getTemplate(id)); |
| 61 | } | 59 | } |
| 62 | 60 | ||
| @@ -66,7 +64,7 @@ public class AttendanceController extends BaseController { | @@ -66,7 +64,7 @@ public class AttendanceController extends BaseController { | ||
| 66 | */ | 64 | */ |
| 67 | @ApiOperation("排班设置") | 65 | @ApiOperation("排班设置") |
| 68 | @PostMapping("/saveSchedulingSetting") | 66 | @PostMapping("/saveSchedulingSetting") |
| 69 | - public Result<?> saveSchedulingSetting(@RequestBody @Validated SchedulingSettingDto dto){ | 67 | + public Result<?> saveSchedulingSetting(@RequestBody @Validated SchedulingSettingDto dto) { |
| 70 | attendanceService.saveSchedulingSetting(dto); | 68 | attendanceService.saveSchedulingSetting(dto); |
| 71 | return Result.OK("新增成功"); | 69 | return Result.OK("新增成功"); |
| 72 | } | 70 | } |
| @@ -76,7 +74,7 @@ public class AttendanceController extends BaseController { | @@ -76,7 +74,7 @@ public class AttendanceController extends BaseController { | ||
| 76 | */ | 74 | */ |
| 77 | @ApiOperation("排班设置") | 75 | @ApiOperation("排班设置") |
| 78 | @PutMapping("/updateSchedulingSetting") | 76 | @PutMapping("/updateSchedulingSetting") |
| 79 | - public Result<?> updateSchedulingSetting(@RequestBody @Validated SchedulingDto dto){ | 77 | + public Result<?> updateSchedulingSetting(@RequestBody @Validated SchedulingDto dto) { |
| 80 | attendanceService.updateSchedulingSetting(dto); | 78 | attendanceService.updateSchedulingSetting(dto); |
| 81 | return Result.OK("新增成功"); | 79 | return Result.OK("新增成功"); |
| 82 | } | 80 | } |
| @@ -86,7 +84,7 @@ public class AttendanceController extends BaseController { | @@ -86,7 +84,7 @@ public class AttendanceController extends BaseController { | ||
| 86 | */ | 84 | */ |
| 87 | @ApiOperation("排班设置") | 85 | @ApiOperation("排班设置") |
| 88 | @DeleteMapping("/deleteSchedulingSetting/{settingId}") | 86 | @DeleteMapping("/deleteSchedulingSetting/{settingId}") |
| 89 | - public Result<?> deleteSchedulingSetting(@PathVariable("settingId") Integer settingId){ | 87 | + public Result<?> deleteSchedulingSetting(@PathVariable("settingId") Integer settingId) { |
| 90 | attendanceService.deleteSchedulingSetting(settingId); | 88 | attendanceService.deleteSchedulingSetting(settingId); |
| 91 | return Result.OK("删除成功"); | 89 | return Result.OK("删除成功"); |
| 92 | } | 90 | } |
| @@ -97,15 +95,36 @@ public class AttendanceController extends BaseController { | @@ -97,15 +95,36 @@ public class AttendanceController extends BaseController { | ||
| 97 | */ | 95 | */ |
| 98 | @ApiOperation("获取考情表") | 96 | @ApiOperation("获取考情表") |
| 99 | @GetMapping("/list/attendance") | 97 | @GetMapping("/list/attendance") |
| 100 | - public TableDataInfo getAttendance(@ModelAttribute RuleAttendanceMainRequestVo vo){ | 98 | + public TableDataInfo getAttendance(@ModelAttribute RuleAttendanceMainRequestVo vo) { |
| 101 | List<RuleAttendanceMain> list = attendanceService.queryAttendanceMain(vo); | 99 | List<RuleAttendanceMain> list = attendanceService.queryAttendanceMain(vo); |
| 102 | return getDataTable(list); | 100 | return getDataTable(list); |
| 103 | } | 101 | } |
| 104 | 102 | ||
| 105 | @ApiOperation("修改考情表") | 103 | @ApiOperation("修改考情表") |
| 106 | @PutMapping("/update/attendance") | 104 | @PutMapping("/update/attendance") |
| 107 | - public Result<?> updateAttendance(@RequestBody @Validated UpdateAttendanceVo vo){ | ||
| 108 | - attendanceService.updateAttendance(vo); | ||
| 109 | - return Result.OK("规则修改成功"); | 105 | + public Result<?> updateAttendance(@RequestBody @Validated UpdateAttendanceVo vo) { |
| 106 | + try { | ||
| 107 | + attendanceService.updateAttendance(vo); | ||
| 108 | + return Result.OK("排班修改成功"); | ||
| 109 | + } catch (Exception e) { | ||
| 110 | + throw new RuntimeException("排班修改失败,请联系管理员" + e.getMessage()); | ||
| 111 | + } | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + @ApiOperation("删除考勤表") | ||
| 115 | + @PostMapping("/delete/attendance") | ||
| 116 | + public Result<?> deleteAttendance(@RequestBody DeleteAttendanceVo vo) { | ||
| 117 | + try { | ||
| 118 | + attendanceService.deleteAttendance(vo); | ||
| 119 | + return Result.OK("删除排班成功"); | ||
| 120 | + } catch (Exception e) { | ||
| 121 | + throw new RuntimeException("删除排班失败,请联系管理员" + e.getMessage()); | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + @ApiOperation("获取排班表人员信息") | ||
| 126 | + @GetMapping("/list/people") | ||
| 127 | + public Result<?> getPeopleList(@ModelAttribute PeopleRequestVo vo){ | ||
| 128 | + return Result.OK(attendanceService.getPeopleList(vo)); | ||
| 110 | } | 129 | } |
| 111 | } | 130 | } |
ruoyi-admin/src/main/java/com/ruoyi/domain/RuleAttendanceMain.java
| @@ -109,6 +109,8 @@ public class RuleAttendanceMain implements Serializable { | @@ -109,6 +109,8 @@ public class RuleAttendanceMain implements Serializable { | ||
| 109 | */ | 109 | */ |
| 110 | private String ruleDictName; | 110 | private String ruleDictName; |
| 111 | 111 | ||
| 112 | + private String fleetName; | ||
| 113 | + | ||
| 112 | @TableField(exist = false) | 114 | @TableField(exist = false) |
| 113 | private static final long serialVersionUID = 1L; | 115 | private static final long serialVersionUID = 1L; |
| 114 | } | 116 | } |
| 115 | \ No newline at end of file | 117 | \ No newline at end of file |
ruoyi-admin/src/main/java/com/ruoyi/domain/RuleAttendanceMainHelp.java
0 → 100644
| 1 | +package com.ruoyi.domain; | ||
| 2 | + | ||
| 3 | +import com.baomidou.mybatisplus.annotation.IdType; | ||
| 4 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 7 | +import java.io.Serializable; | ||
| 8 | +import java.util.Date; | ||
| 9 | + | ||
| 10 | +import lombok.Data; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * 考勤表 | ||
| 14 | + * @author 20412 | ||
| 15 | + * @TableName rule_attendance_main_help | ||
| 16 | + */ | ||
| 17 | +@TableName(value ="rule_attendance_main_help") | ||
| 18 | +@Data | ||
| 19 | +public class RuleAttendanceMainHelp implements Serializable { | ||
| 20 | + /** | ||
| 21 | + * 主键 | ||
| 22 | + */ | ||
| 23 | + @TableId(type = IdType.AUTO) | ||
| 24 | + private Integer id; | ||
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * 姓名 | ||
| 28 | + */ | ||
| 29 | + private String name; | ||
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * 工号 | ||
| 33 | + */ | ||
| 34 | + private String jobCode; | ||
| 35 | + | ||
| 36 | + /** | ||
| 37 | + * 工种 | ||
| 38 | + */ | ||
| 39 | + private String posts; | ||
| 40 | + | ||
| 41 | + private Date dateFlag; | ||
| 42 | + | ||
| 43 | + private String fleetName; | ||
| 44 | + | ||
| 45 | + @TableField(exist = false) | ||
| 46 | + private static final long serialVersionUID = 1L; | ||
| 47 | +} | ||
| 0 | \ No newline at end of file | 48 | \ No newline at end of file |
ruoyi-admin/src/main/java/com/ruoyi/driver/controller/DriverController.java
| @@ -213,20 +213,10 @@ public class DriverController extends BaseController { | @@ -213,20 +213,10 @@ public class DriverController extends BaseController { | ||
| 213 | return driverService.faceRegistrationFeedback(vo.getDeviceId(), vo.getJobCodes()); | 213 | return driverService.faceRegistrationFeedback(vo.getDeviceId(), vo.getJobCodes()); |
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | - /** | ||
| 217 | - * 清除指定工号异常记录 | ||
| 218 | - */ | ||
| 219 | - @ApiOperation("清除指定工号异常记录") | ||
| 220 | - @DeleteMapping("/clear/{jobCode}") | ||
| 221 | - public AjaxResult clearExceptionRecordByJobCode(@PathVariable("jobCode") String jobCode) { | ||
| 222 | - driverService.clearExceptionRecordByJobCode(jobCode); | ||
| 223 | - return AjaxResult.success("清除成功"); | ||
| 224 | - } | ||
| 225 | - | ||
| 226 | - @GetMapping("/questionFeedback") | ||
| 227 | -// @ApiOperation("人脸识别反馈") | ||
| 228 | - public Result<?> questionFeedback() { | ||
| 229 | - | ||
| 230 | - return null; | ||
| 231 | - } | 216 | +// @GetMapping("/questionFeedback") |
| 217 | +//// @ApiOperation("人脸识别反馈") | ||
| 218 | +// public Result<?> questionFeedback() { | ||
| 219 | +// | ||
| 220 | +// return null; | ||
| 221 | +// } | ||
| 232 | } | 222 | } |
ruoyi-admin/src/main/java/com/ruoyi/driver/service/IDriverService.java
| @@ -101,7 +101,6 @@ public interface IDriverService | @@ -101,7 +101,6 @@ public interface IDriverService | ||
| 101 | 101 | ||
| 102 | void updateDrivers(List<Driver> drivers); | 102 | void updateDrivers(List<Driver> drivers); |
| 103 | 103 | ||
| 104 | - void clearExceptionRecordByJobCode(String jobCode); | ||
| 105 | 104 | ||
| 106 | /** | 105 | /** |
| 107 | * 删除不存在的工号 | 106 | * 删除不存在的工号 |
ruoyi-admin/src/main/java/com/ruoyi/driver/service/impl/DriverServiceImpl.java
| @@ -194,6 +194,7 @@ public class DriverServiceImpl implements IDriverService { | @@ -194,6 +194,7 @@ public class DriverServiceImpl implements IDriverService { | ||
| 194 | */ | 194 | */ |
| 195 | @Override | 195 | @Override |
| 196 | public int updateDriver(Driver driver) { | 196 | public int updateDriver(Driver driver) { |
| 197 | + driver.setUpdateTime(new Date()); | ||
| 197 | return driverMapper.updateDriver(driver); | 198 | return driverMapper.updateDriver(driver); |
| 198 | } | 199 | } |
| 199 | 200 | ||
| @@ -331,13 +332,19 @@ public class DriverServiceImpl implements IDriverService { | @@ -331,13 +332,19 @@ public class DriverServiceImpl implements IDriverService { | ||
| 331 | List<DriverScheduling> dto = null; | 332 | List<DriverScheduling> dto = null; |
| 332 | Boolean schedulingFlag = true; | 333 | Boolean schedulingFlag = true; |
| 333 | Boolean alcoholFlag = true; | 334 | Boolean alcoholFlag = true; |
| 334 | - | ||
| 335 | // 更新信息 | 335 | // 更新信息 |
| 336 | for (Driver item : drivers) { | 336 | for (Driver item : drivers) { |
| 337 | dto = schedulingService.queryScheduling(item.getJobCode(), now); | 337 | dto = schedulingService.queryScheduling(item.getJobCode(), now); |
| 338 | DriverResponseVo vo = handlerRecommendation(item, now, dto, schedulingFlag, alcoholFlag); | 338 | DriverResponseVo vo = handlerRecommendation(item, now, dto, schedulingFlag, alcoholFlag); |
| 339 | - if (CollectionUtil.isEmpty(dto) && (item.getJobCode().equals("722717") || item.getJobCode().equals("700001"))) { | ||
| 340 | - vos.add(DriverResponseVo.createDriverResponseVo(null, item, "签到", true, true, "测试", "测试", "测试")); | 339 | + // 针对指定用户操作 |
| 340 | + if ( item.getJobCode().equals("722717") || item.getJobCode().equals("700001")) { | ||
| 341 | + if (!CollectionUtil.isEmpty(dto) && vo.getPlanAction().equals(SIGN_IN_STRING) ){ | ||
| 342 | + vos.add(DriverResponseVo.createDriverResponseVo(null, item, SIGN_IN_STRING, true, true, "测试", "测试", "测试")); | ||
| 343 | + }else if (!CollectionUtil.isEmpty(dto)){ | ||
| 344 | + vos.add(vo); | ||
| 345 | + }else { | ||
| 346 | + vos.add(DriverResponseVo.createDriverResponseVo(null, item, SIGN_IN_STRING, true, true, "测试", "测试", "测试")); | ||
| 347 | + } | ||
| 341 | }else { | 348 | }else { |
| 342 | // 无排班 | 349 | // 无排班 |
| 343 | if (Objects.isNull(vo)) { | 350 | if (Objects.isNull(vo)) { |
| @@ -346,7 +353,6 @@ public class DriverServiceImpl implements IDriverService { | @@ -346,7 +353,6 @@ public class DriverServiceImpl implements IDriverService { | ||
| 346 | vos.add(vo); | 353 | vos.add(vo); |
| 347 | } | 354 | } |
| 348 | } | 355 | } |
| 349 | - | ||
| 350 | } | 356 | } |
| 351 | return vos; | 357 | return vos; |
| 352 | } | 358 | } |
| @@ -484,12 +490,6 @@ public class DriverServiceImpl implements IDriverService { | @@ -484,12 +490,6 @@ public class DriverServiceImpl implements IDriverService { | ||
| 484 | driverMapper.updateDriverInfoByJobCodes(drivers); | 490 | driverMapper.updateDriverInfoByJobCodes(drivers); |
| 485 | } | 491 | } |
| 486 | 492 | ||
| 487 | - @Override | ||
| 488 | - public void clearExceptionRecordByJobCode(String jobCode) { | ||
| 489 | - String dateKey = REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW + ConstDateUtil.formatDate(new Date()); | ||
| 490 | - log.info("在:{}时间工号:{}的异常记录被清除了", dateKey, jobCode); | ||
| 491 | - redisCache.deleteCacheMapValue(dateKey, jobCode); | ||
| 492 | - } | ||
| 493 | 493 | ||
| 494 | @Override | 494 | @Override |
| 495 | public void deleteNotEmptyJob(List<String> jobList) { | 495 | public void deleteNotEmptyJob(List<String> jobList) { |
ruoyi-admin/src/main/java/com/ruoyi/global/GlobalException.java
0 → 100644
| 1 | +package com.ruoyi.global; | ||
| 2 | + | ||
| 3 | +import com.ruoyi.common.global.Result; | ||
| 4 | +import com.ruoyi.common.global.ResultCode; | ||
| 5 | +import lombok.extern.slf4j.Slf4j; | ||
| 6 | +import org.springframework.security.core.userdetails.UsernameNotFoundException; | ||
| 7 | +import org.springframework.web.bind.annotation.ExceptionHandler; | ||
| 8 | +import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
| 9 | + | ||
| 10 | +import java.sql.SQLIntegrityConstraintViolationException; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * @author 20412 | ||
| 14 | + */ | ||
| 15 | +@Slf4j | ||
| 16 | +@RestControllerAdvice | ||
| 17 | +public class GlobalException { | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 处理sql完整性约束冲突 | ||
| 21 | + * @param e | ||
| 22 | + * @return | ||
| 23 | + */ | ||
| 24 | + @ExceptionHandler(SQLIntegrityConstraintViolationException.class) | ||
| 25 | + public Result<?> uniqSqlHandler(SQLIntegrityConstraintViolationException e){ | ||
| 26 | + // 唯一完成性约束冲突 | ||
| 27 | + if (e.getMessage().contains("Duplicate entry")){ | ||
| 28 | + String[] args = e.getMessage().split(" "); | ||
| 29 | + String message = args[2] + "已存在"; | ||
| 30 | + return Result.ERROR(message); | ||
| 31 | + } | ||
| 32 | + return Result.ERROR(e.getMessage()); | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + @ExceptionHandler(UsernameNotFoundException.class) | ||
| 36 | + public Result<?> userInfoIllegal(UsernameNotFoundException e){ | ||
| 37 | + return Result.ERROR(e.getMessage()).code(ResultCode.CODE_401.getCode()); | ||
| 38 | + } | ||
| 39 | +} |
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
| @@ -396,14 +396,14 @@ public class SignInServiceImpl implements ISignInService { | @@ -396,14 +396,14 @@ public class SignInServiceImpl implements ISignInService { | ||
| 396 | 396 | ||
| 397 | private AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn, SignInResponseVo vo) { | 397 | private AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn, SignInResponseVo vo) { |
| 398 | // TODO 待更换 缓存更新为当天签到记录 | 398 | // TODO 待更换 缓存更新为当天签到记录 |
| 399 | - String key = REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW + ConstDateUtil.formatDate("yyyyMMdd"); | 399 | + String key = REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW + ConstDateUtil.formatDate("yyyyMMdd") + ":" + signIn.getJobCode(); |
| 400 | // 驾驶员酒精测试连续超标两次则提示换人 | 400 | // 驾驶员酒精测试连续超标两次则提示换人 |
| 401 | - Integer count = redisCache.getCacheMapValue(key, signIn.getJobCode()); | 401 | + Integer count = redisCache.getCacheObject(key); |
| 402 | if (Objects.isNull(count) || count.equals(0)) { | 402 | if (Objects.isNull(count) || count.equals(0)) { |
| 403 | count = 1; | 403 | count = 1; |
| 404 | redisCache.setCacheMapValue(key, signIn.getJobCode(), count); | 404 | redisCache.setCacheMapValue(key, signIn.getJobCode(), count); |
| 405 | } else { | 405 | } else { |
| 406 | - count = redisCache.setIncrementMapValue(key, signIn.getJobCode(), 1); | 406 | + redisCache.setCacheObject(key, ++count); |
| 407 | } | 407 | } |
| 408 | if (SIGN_IN_ERROR_COUNT.compareTo(count) <= 0) { | 408 | if (SIGN_IN_ERROR_COUNT.compareTo(count) <= 0) { |
| 409 | return AjaxResult.success(SIGN_IN_ERROR + ": " + signIn.getRemark() + "酒精测试不通过" + count + "次请更换车辆驾驶员。", vo); | 409 | return AjaxResult.success(SIGN_IN_ERROR + ": " + signIn.getRemark() + "酒精测试不通过" + count + "次请更换车辆驾驶员。", vo); |
| @@ -500,7 +500,7 @@ public class SignInServiceImpl implements ISignInService { | @@ -500,7 +500,7 @@ public class SignInServiceImpl implements ISignInService { | ||
| 500 | if (PERSONNEL_POSTS_DRIVER.equals(posts) || PERSONNEL_POSTS_SALES.equals(posts)) { | 500 | if (PERSONNEL_POSTS_DRIVER.equals(posts) || PERSONNEL_POSTS_SALES.equals(posts)) { |
| 501 | return driverCheckTimeOut(globalIndex, signIn, dto, now); | 501 | return driverCheckTimeOut(globalIndex, signIn, dto, now); |
| 502 | } else { | 502 | } else { |
| 503 | - return true; | 503 | + return driverCheckTimeOut(globalIndex, signIn, dto, now); |
| 504 | } | 504 | } |
| 505 | } | 505 | } |
| 506 | 506 |
ruoyi-admin/src/main/java/com/ruoyi/job/DriverJob.java
| @@ -224,7 +224,7 @@ public class DriverJob implements InitializingBean { | @@ -224,7 +224,7 @@ public class DriverJob implements InitializingBean { | ||
| 224 | throw new RuntimeException(e); | 224 | throw new RuntimeException(e); |
| 225 | } | 225 | } |
| 226 | // 获取排班信息并存入redis | 226 | // 获取排班信息并存入redis |
| 227 | - saveSchedulingToRedis(getSchedulingInfoUrl, formatDate,timeOut); | 227 | + saveSchedulingToRedis(getSchedulingInfoUrl, formatDate, timeOut); |
| 228 | // 删除两天前排班信息 | 228 | // 删除两天前排班信息 |
| 229 | deleteScheduling(); | 229 | deleteScheduling(); |
| 230 | log.info("获取{}的排班数据完毕", formatDate); | 230 | log.info("获取{}的排班数据完毕", formatDate); |
| @@ -243,14 +243,14 @@ public class DriverJob implements InitializingBean { | @@ -243,14 +243,14 @@ public class DriverJob implements InitializingBean { | ||
| 243 | 243 | ||
| 244 | // 删除实时排班 | 244 | // 删除实时排班 |
| 245 | for (int i = 0; i < keys.size(); i++) { | 245 | for (int i = 0; i < keys.size(); i++) { |
| 246 | - if (nowKey.equals(keys.get(i)) || yesterdayKey.equals(keys.get(i))){ | 246 | + if (nowKey.equals(keys.get(i)) || yesterdayKey.equals(keys.get(i))) { |
| 247 | continue; | 247 | continue; |
| 248 | } | 248 | } |
| 249 | SCHEDULING_CACHE.removeCacheSchedulingByKey(keys.get(i)); | 249 | SCHEDULING_CACHE.removeCacheSchedulingByKey(keys.get(i)); |
| 250 | } | 250 | } |
| 251 | // 删除考勤 | 251 | // 删除考勤 |
| 252 | for (int i = 0; i < nowKeys.size(); i++) { | 252 | for (int i = 0; i < nowKeys.size(); i++) { |
| 253 | - if (nowDate.equals(nowKeys.get(i)) || yesterdayDate.equals(nowKeys.get(i))){ | 253 | + if (nowDate.equals(nowKeys.get(i)) || yesterdayDate.equals(nowKeys.get(i))) { |
| 254 | continue; | 254 | continue; |
| 255 | } | 255 | } |
| 256 | NOW_SCHEDULING_CACHE.removeCacheSchedulingByKey(nowKeys.get(i)); | 256 | NOW_SCHEDULING_CACHE.removeCacheSchedulingByKey(nowKeys.get(i)); |
| @@ -267,11 +267,18 @@ public class DriverJob implements InitializingBean { | @@ -267,11 +267,18 @@ public class DriverJob implements InitializingBean { | ||
| 267 | /** | 267 | /** |
| 268 | * 生成排班 | 268 | * 生成排班 |
| 269 | */ | 269 | */ |
| 270 | - public void createAttendance(){ | 270 | + public void createAttendance() { |
| 271 | RULE_NUM_SETTING_SERVICE.createAttendance(); | 271 | RULE_NUM_SETTING_SERVICE.createAttendance(); |
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | /** | 274 | /** |
| 275 | + * 工具任务 手动把非司售人员的排班加入到签到报表缓存 可以把当天生成的排班明细没有来得及加入签到报表的员工手动加入 | ||
| 276 | + */ | ||
| 277 | + public void manualAddBcCache(){ | ||
| 278 | + RULE_NUM_SETTING_SERVICE.manualAddBcCache(); | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + /** | ||
| 275 | * 计算设备在线状态 5 分钟一次 | 282 | * 计算设备在线状态 5 分钟一次 |
| 276 | */ | 283 | */ |
| 277 | public void computedDeviceOnlineStatus(String date) throws IOException, ClassNotFoundException { | 284 | public void computedDeviceOnlineStatus(String date) throws IOException, ClassNotFoundException { |
| @@ -293,7 +300,7 @@ public class DriverJob implements InitializingBean { | @@ -293,7 +300,7 @@ public class DriverJob implements InitializingBean { | ||
| 293 | } | 300 | } |
| 294 | } | 301 | } |
| 295 | // 更新日志 | 302 | // 更新日志 |
| 296 | - THREAD_JOB_SERVICE.asyncInsertEquipmentLog(list,original); | 303 | + THREAD_JOB_SERVICE.asyncInsertEquipmentLog(list, original); |
| 297 | EQUIPMENT_MAPPER.updateEquipments(list); | 304 | EQUIPMENT_MAPPER.updateEquipments(list); |
| 298 | } | 305 | } |
| 299 | 306 | ||
| @@ -325,7 +332,7 @@ public class DriverJob implements InitializingBean { | @@ -325,7 +332,7 @@ public class DriverJob implements InitializingBean { | ||
| 325 | schedulingList.sort(Comparator.comparing(ResponseSchedulingDto::getFcsjT)); | 332 | schedulingList.sort(Comparator.comparing(ResponseSchedulingDto::getFcsjT)); |
| 326 | } | 333 | } |
| 327 | // 存入签到报表 | 334 | // 存入签到报表 |
| 328 | - THREAD_JOB_SERVICE.asyncComputedScheduling(driverSchedulingMap,timeOut); | 335 | + THREAD_JOB_SERVICE.asyncComputedScheduling(driverSchedulingMap, timeOut); |
| 329 | // 实时排班直接存入缓存 | 336 | // 实时排班直接存入缓存 |
| 330 | SCHEDULING_CACHE.setCacheScheduling(DRIVER_SCHEDULING_PRE + dateKey, driverSchedulingMap); | 337 | SCHEDULING_CACHE.setCacheScheduling(DRIVER_SCHEDULING_PRE + dateKey, driverSchedulingMap); |
| 331 | log.info("拉取排班完毕:{}", dateKey); | 338 | log.info("拉取排班完毕:{}", dateKey); |
| @@ -335,7 +342,7 @@ public class DriverJob implements InitializingBean { | @@ -335,7 +342,7 @@ public class DriverJob implements InitializingBean { | ||
| 335 | private void splitSaveScheduling(Map<String, List<ResponseSchedulingDto>> driverSchedulingMap, String jobCode, String name, ResponseSchedulingDto item, String posts) { | 342 | private void splitSaveScheduling(Map<String, List<ResponseSchedulingDto>> driverSchedulingMap, String jobCode, String name, ResponseSchedulingDto item, String posts) { |
| 336 | if (!Objects.isNull(jobCode)) { | 343 | if (!Objects.isNull(jobCode)) { |
| 337 | ResponseSchedulingDto scheduling = new ResponseSchedulingDto(); | 344 | ResponseSchedulingDto scheduling = new ResponseSchedulingDto(); |
| 338 | - BeanUtils.copyProperties(item,scheduling); | 345 | + BeanUtils.copyProperties(item, scheduling); |
| 339 | scheduling.setPosts(posts); | 346 | scheduling.setPosts(posts); |
| 340 | scheduling.setJobCode(jobCode); | 347 | scheduling.setJobCode(jobCode); |
| 341 | scheduling.setName(name); | 348 | scheduling.setName(name); |
| @@ -359,7 +366,7 @@ public class DriverJob implements InitializingBean { | @@ -359,7 +366,7 @@ public class DriverJob implements InitializingBean { | ||
| 359 | int countPage = vo.getTotalCount() / pageSize; | 366 | int countPage = vo.getTotalCount() / pageSize; |
| 360 | countPage = vo.getTotalCount() % pageSize == 0 ? countPage : countPage + 1; | 367 | countPage = vo.getTotalCount() % pageSize == 0 ? countPage : countPage + 1; |
| 361 | List<Driver> drivers = getDrivers(date, vo); | 368 | List<Driver> drivers = getDrivers(date, vo); |
| 362 | - for (int i = 2; i <= countPage; i++ ) { | 369 | + for (int i = 2; i <= countPage; i++) { |
| 363 | drivers.addAll(getDrivers(date, getPersonInfo(accessToken, 100, i))); | 370 | drivers.addAll(getDrivers(date, getPersonInfo(accessToken, 100, i))); |
| 364 | } | 371 | } |
| 365 | List<String> jobList = drivers.stream().map(driver -> driver.getJobCode()).collect(Collectors.toList()); | 372 | List<String> jobList = drivers.stream().map(driver -> driver.getJobCode()).collect(Collectors.toList()); |
ruoyi-admin/src/main/java/com/ruoyi/mapper/RuleAttendanceMainHelpMapper.java
0 → 100644
| 1 | +package com.ruoyi.mapper; | ||
| 2 | + | ||
| 3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||
| 4 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 5 | +import com.ruoyi.pojo.vo.PeopleRequestVo; | ||
| 6 | + | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | +* @author 20412 | ||
| 11 | +* @description 针对表【rule_attendance_main_help(考勤表)】的数据库操作Mapper | ||
| 12 | +* @createDate 2023-09-05 15:39:18 | ||
| 13 | +* @Entity .domain.RuleAttendanceMainHelp | ||
| 14 | +*/ | ||
| 15 | +public interface RuleAttendanceMainHelpMapper extends BaseMapper<RuleAttendanceMainHelp> { | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * 获取当月生成的人员信息 | ||
| 19 | + * @param vo | ||
| 20 | + * @return | ||
| 21 | + */ | ||
| 22 | + List<RuleAttendanceMainHelp> queryNowMonthPeople(PeopleRequestVo vo); | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | + | ||
| 26 | + | ||
| 27 | + |
ruoyi-admin/src/main/java/com/ruoyi/mapper/RuleAttendanceMainMapper.java
| @@ -2,6 +2,9 @@ package com.ruoyi.mapper; | @@ -2,6 +2,9 @@ package com.ruoyi.mapper; | ||
| 2 | 2 | ||
| 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| 4 | import com.ruoyi.domain.RuleAttendanceMain; | 4 | import com.ruoyi.domain.RuleAttendanceMain; |
| 5 | +import com.ruoyi.pojo.vo.DeleteAttendanceVo; | ||
| 6 | +import com.ruoyi.pojo.vo.UpdateAttendanceVo; | ||
| 7 | +import org.apache.ibatis.annotations.Param; | ||
| 5 | 8 | ||
| 6 | /** | 9 | /** |
| 7 | * @author 20412 | 10 | * @author 20412 |
| @@ -11,10 +14,18 @@ import com.ruoyi.domain.RuleAttendanceMain; | @@ -11,10 +14,18 @@ import com.ruoyi.domain.RuleAttendanceMain; | ||
| 11 | */ | 14 | */ |
| 12 | public interface RuleAttendanceMainMapper extends BaseMapper<RuleAttendanceMain> { | 15 | public interface RuleAttendanceMainMapper extends BaseMapper<RuleAttendanceMain> { |
| 13 | /** | 16 | /** |
| 14 | - * 全量更新 | 17 | + * 批量更新 |
| 18 | + * | ||
| 19 | + * @param vo | ||
| 15 | * @param main | 20 | * @param main |
| 16 | */ | 21 | */ |
| 17 | - void updateByIdTotalQuantity(RuleAttendanceMain main); | 22 | + void updateByIdTotalQuantity(@Param("vo") UpdateAttendanceVo vo,@Param("main") RuleAttendanceMain main); |
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * 批量删除 | ||
| 26 | + * @param vo | ||
| 27 | + */ | ||
| 28 | + void deleteByJobCodeTotalRecord(DeleteAttendanceVo vo); | ||
| 18 | } | 29 | } |
| 19 | 30 | ||
| 20 | 31 |
ruoyi-admin/src/main/java/com/ruoyi/pojo/dto/AttendanceDto.java
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/DeleteAttendanceVo.java
0 → 100644
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/PeopleRequestVo.java
0 → 100644
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/UpdateAttendanceVo.java
| 1 | package com.ruoyi.pojo.vo; | 1 | package com.ruoyi.pojo.vo; |
| 2 | 2 | ||
| 3 | -import com.ruoyi.scheduling.domain.RuleScheduling; | ||
| 4 | import lombok.Data; | 3 | import lombok.Data; |
| 5 | 4 | ||
| 6 | -import javax.validation.constraints.NotNull; | ||
| 7 | import java.util.List; | 5 | import java.util.List; |
| 8 | 6 | ||
| 7 | + | ||
| 9 | /** | 8 | /** |
| 10 | * @author 20412 | 9 | * @author 20412 |
| 11 | */ | 10 | */ |
| 12 | @Data | 11 | @Data |
| 13 | public class UpdateAttendanceVo { | 12 | public class UpdateAttendanceVo { |
| 14 | - @NotNull | ||
| 15 | - private Integer id; | ||
| 16 | - @NotNull | 13 | + private List<String> jobCode; |
| 14 | + private String startDate; | ||
| 15 | + private String endDate; | ||
| 17 | private Integer ruleId; | 16 | private Integer ruleId; |
| 18 | } | 17 | } |
ruoyi-admin/src/main/java/com/ruoyi/service/AttendanceService.java
| 1 | package com.ruoyi.service; | 1 | package com.ruoyi.service; |
| 2 | 2 | ||
| 3 | import com.ruoyi.domain.RuleAttendanceMain; | 3 | import com.ruoyi.domain.RuleAttendanceMain; |
| 4 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 4 | import com.ruoyi.pojo.dto.SchedulingDto; | 5 | import com.ruoyi.pojo.dto.SchedulingDto; |
| 5 | import com.ruoyi.pojo.dto.SchedulingSettingDto; | 6 | import com.ruoyi.pojo.dto.SchedulingSettingDto; |
| 6 | import com.ruoyi.pojo.vo.*; | 7 | import com.ruoyi.pojo.vo.*; |
| @@ -53,4 +54,8 @@ public interface AttendanceService { | @@ -53,4 +54,8 @@ public interface AttendanceService { | ||
| 53 | List<RuleAttendanceMain> queryAttendanceMain(RuleAttendanceMainRequestVo vo); | 54 | List<RuleAttendanceMain> queryAttendanceMain(RuleAttendanceMainRequestVo vo); |
| 54 | 55 | ||
| 55 | void updateAttendance(UpdateAttendanceVo vo); | 56 | void updateAttendance(UpdateAttendanceVo vo); |
| 57 | + | ||
| 58 | + void deleteAttendance(DeleteAttendanceVo vo); | ||
| 59 | + | ||
| 60 | + List<RuleAttendanceMainHelp> getPeopleList(PeopleRequestVo vo); | ||
| 56 | } | 61 | } |
ruoyi-admin/src/main/java/com/ruoyi/service/RuleAttendanceMainHelpService.java
0 → 100644
| 1 | +package com.ruoyi.service; | ||
| 2 | + | ||
| 3 | +import com.baomidou.mybatisplus.extension.service.IService; | ||
| 4 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 5 | +import com.ruoyi.pojo.vo.PeopleRequestVo; | ||
| 6 | + | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | +* @author 20412 | ||
| 11 | +* @description 针对表【rule_attendance_main_help(考勤表)】的数据库操作Service | ||
| 12 | +* @createDate 2023-09-05 15:39:18 | ||
| 13 | +*/ | ||
| 14 | +public interface RuleAttendanceMainHelpService extends IService<RuleAttendanceMainHelp> { | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 查询当月生成人员数据 | ||
| 18 | + * @param vo | ||
| 19 | + * @return | ||
| 20 | + */ | ||
| 21 | + List<RuleAttendanceMainHelp> queryNowMonthPeople(PeopleRequestVo vo); | ||
| 22 | +} |
ruoyi-admin/src/main/java/com/ruoyi/service/RuleAttendanceMainService.java
| @@ -2,6 +2,14 @@ package com.ruoyi.service; | @@ -2,6 +2,14 @@ package com.ruoyi.service; | ||
| 2 | 2 | ||
| 3 | import com.baomidou.mybatisplus.extension.service.IService; | 3 | import com.baomidou.mybatisplus.extension.service.IService; |
| 4 | import com.ruoyi.domain.RuleAttendanceMain; | 4 | import com.ruoyi.domain.RuleAttendanceMain; |
| 5 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 6 | +import com.ruoyi.pojo.vo.DeleteAttendanceVo; | ||
| 7 | +import com.ruoyi.pojo.vo.PeopleRequestVo; | ||
| 8 | +import com.ruoyi.pojo.vo.PeopleResponseVo; | ||
| 9 | +import com.ruoyi.pojo.vo.UpdateAttendanceVo; | ||
| 10 | +import org.apache.ibatis.annotations.Param; | ||
| 11 | + | ||
| 12 | +import java.util.List; | ||
| 5 | 13 | ||
| 6 | /** | 14 | /** |
| 7 | * @author 20412 | 15 | * @author 20412 |
| @@ -10,5 +18,23 @@ import com.ruoyi.domain.RuleAttendanceMain; | @@ -10,5 +18,23 @@ import com.ruoyi.domain.RuleAttendanceMain; | ||
| 10 | */ | 18 | */ |
| 11 | public interface RuleAttendanceMainService extends IService<RuleAttendanceMain> { | 19 | public interface RuleAttendanceMainService extends IService<RuleAttendanceMain> { |
| 12 | 20 | ||
| 13 | - void updateByIdTotalQuantity(RuleAttendanceMain main); | 21 | + /** |
| 22 | + * 修改规则 | ||
| 23 | + * @param vo | ||
| 24 | + * @param main | ||
| 25 | + */ | ||
| 26 | + void updateByJobCodeTotalQuantity(@Param("vo") UpdateAttendanceVo vo, @Param("main") RuleAttendanceMain main); | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * 删除排班 | ||
| 30 | + * @param vo | ||
| 31 | + */ | ||
| 32 | + void deleteByJobCodeTotalRecord(DeleteAttendanceVo vo); | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * 获取本月生成清单 | ||
| 36 | + * @param vo | ||
| 37 | + * @return | ||
| 38 | + */ | ||
| 39 | + List<RuleAttendanceMainHelp> queryPeopleList(PeopleRequestVo vo); | ||
| 14 | } | 40 | } |
ruoyi-admin/src/main/java/com/ruoyi/service/RuleNumSettingService.java
| @@ -33,4 +33,9 @@ public interface RuleNumSettingService extends IService<RuleNumSetting> { | @@ -33,4 +33,9 @@ public interface RuleNumSettingService extends IService<RuleNumSetting> { | ||
| 33 | * @return | 33 | * @return |
| 34 | */ | 34 | */ |
| 35 | List<RuleNumDto> selectRuleNumBySettingId(List<Integer> settingList); | 35 | List<RuleNumDto> selectRuleNumBySettingId(List<Integer> settingList); |
| 36 | + | ||
| 37 | + /** | ||
| 38 | + * 手动添加班次 | ||
| 39 | + */ | ||
| 40 | + void manualAddBcCache(); | ||
| 36 | } | 41 | } |
ruoyi-admin/src/main/java/com/ruoyi/service/ThreadJobService.java
| @@ -3,11 +3,13 @@ package com.ruoyi.service; | @@ -3,11 +3,13 @@ package com.ruoyi.service; | ||
| 3 | 3 | ||
| 4 | import cn.hutool.core.collection.CollectionUtil; | 4 | import cn.hutool.core.collection.CollectionUtil; |
| 5 | import cn.hutool.http.HttpUtil; | 5 | import cn.hutool.http.HttpUtil; |
| 6 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 6 | import com.ruoyi.common.cache.NowSchedulingCache; | 7 | import com.ruoyi.common.cache.NowSchedulingCache; |
| 7 | import com.ruoyi.common.config.RuoYiConfig; | 8 | import com.ruoyi.common.config.RuoYiConfig; |
| 8 | import com.ruoyi.common.exception.file.FileUploadException; | 9 | import com.ruoyi.common.exception.file.FileUploadException; |
| 9 | import com.ruoyi.common.utils.StringUtils; | 10 | import com.ruoyi.common.utils.StringUtils; |
| 10 | import com.ruoyi.common.utils.file.FileUploadUtils; | 11 | import com.ruoyi.common.utils.file.FileUploadUtils; |
| 12 | +import com.ruoyi.domain.RuleAttendanceMain; | ||
| 11 | import com.ruoyi.driver.domain.Driver; | 13 | import com.ruoyi.driver.domain.Driver; |
| 12 | import com.ruoyi.driver.mapper.DriverMapper; | 14 | import com.ruoyi.driver.mapper.DriverMapper; |
| 13 | import com.ruoyi.driver.mapper.DriverSchedulingMapper; | 15 | import com.ruoyi.driver.mapper.DriverSchedulingMapper; |
| @@ -48,6 +50,7 @@ import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_IN; | @@ -48,6 +50,7 @@ import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_IN; | ||
| 48 | import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; | 50 | import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; |
| 49 | import static com.ruoyi.common.ConstEquipmentProperties.*; | 51 | import static com.ruoyi.common.ConstEquipmentProperties.*; |
| 50 | import static com.ruoyi.common.ConstSignInConstSignInProperties.SIGN_NO_EX_NUM; | 52 | import static com.ruoyi.common.ConstSignInConstSignInProperties.SIGN_NO_EX_NUM; |
| 53 | +import static com.ruoyi.common.RuleSchedulingProperties.WORK_FLAG; | ||
| 51 | 54 | ||
| 52 | 55 | ||
| 53 | /** | 56 | /** |
| @@ -75,6 +78,9 @@ public class ThreadJobService { | @@ -75,6 +78,9 @@ public class ThreadJobService { | ||
| 75 | @Resource | 78 | @Resource |
| 76 | private NowSchedulingCache nowSchedulingCache; | 79 | private NowSchedulingCache nowSchedulingCache; |
| 77 | 80 | ||
| 81 | + @Autowired | ||
| 82 | + private RuleAttendanceMainService attendanceMainService; | ||
| 83 | + | ||
| 78 | 84 | ||
| 79 | @Autowired | 85 | @Autowired |
| 80 | private PlatformTransactionManager transactionManager; | 86 | private PlatformTransactionManager transactionManager; |
| @@ -344,6 +350,9 @@ public class ThreadJobService { | @@ -344,6 +350,9 @@ public class ThreadJobService { | ||
| 344 | return; | 350 | return; |
| 345 | } | 351 | } |
| 346 | List<DriverScheduling> bcList = getBcList(originSchedulingMap); | 352 | List<DriverScheduling> bcList = getBcList(originSchedulingMap); |
| 353 | + | ||
| 354 | + // 处理非司售人员的排班明细 | ||
| 355 | + bcList.addAll(handleOtherPostsScheduling()); | ||
| 347 | // 插入排班 | 356 | // 插入排班 |
| 348 | schedulingMapper.insertRoster(bcList); | 357 | schedulingMapper.insertRoster(bcList); |
| 349 | // 异常数据过多,不通过自增获取id再次查询获取 | 358 | // 异常数据过多,不通过自增获取id再次查询获取 |
| @@ -362,6 +371,57 @@ public class ThreadJobService { | @@ -362,6 +371,57 @@ public class ThreadJobService { | ||
| 362 | } | 371 | } |
| 363 | } | 372 | } |
| 364 | 373 | ||
| 374 | + private List<DriverScheduling> handleOtherPostsScheduling() { | ||
| 375 | + QueryWrapper<RuleAttendanceMain> qw = new QueryWrapper<>(); | ||
| 376 | + qw.lambda() | ||
| 377 | + .eq(RuleAttendanceMain::getWorkFlag, WORK_FLAG) | ||
| 378 | + .eq(RuleAttendanceMain::getSchedulingDate, LocalDate.now()); | ||
| 379 | + List<RuleAttendanceMain> mainList = attendanceMainService.list(qw); | ||
| 380 | + List<DriverScheduling> bcList = new ArrayList<>(mainList.size() * 2); | ||
| 381 | + for (RuleAttendanceMain ruleAttendanceMain : mainList) { | ||
| 382 | + // 第一段 | ||
| 383 | + DriverScheduling scheduling = getDriverScheduling(ruleAttendanceMain); | ||
| 384 | + scheduling.setFcsjT(ruleAttendanceMain.getFirstWorkSignInTime().getTime()); | ||
| 385 | + scheduling.setBcType(BC_TYPE_OUT); | ||
| 386 | + scheduling.setZdsjT(ruleAttendanceMain.getFirstWorkSignInTime().getTime()); | ||
| 387 | + scheduling.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 388 | + bcList.add(scheduling); | ||
| 389 | + | ||
| 390 | + DriverScheduling scheduling1 = getDriverScheduling(ruleAttendanceMain); | ||
| 391 | + scheduling1.setBcType(BC_TYPE_IN); | ||
| 392 | + scheduling1.setZdsjT(ruleAttendanceMain.getFirstQuittingSignInTime().getTime()); | ||
| 393 | + scheduling1.setFcsjT(ruleAttendanceMain.getFirstQuittingSignInTime().getTime()); | ||
| 394 | + scheduling1.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 395 | + bcList.add(scheduling1); | ||
| 396 | + // 第二段 | ||
| 397 | + if (!Objects.isNull(ruleAttendanceMain.getSecondWorkSignInTime())) { | ||
| 398 | + DriverScheduling scheduling2 = getDriverScheduling(ruleAttendanceMain); | ||
| 399 | + scheduling2.setBcType(BC_TYPE_OUT); | ||
| 400 | + scheduling2.setFcsjT(ruleAttendanceMain.getSecondWorkSignInTime().getTime()); | ||
| 401 | + scheduling2.setZdsjT(ruleAttendanceMain.getSecondWorkSignInTime().getTime()); | ||
| 402 | + scheduling2.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 403 | + bcList.add(scheduling2); | ||
| 404 | + | ||
| 405 | + DriverScheduling scheduling3 = getDriverScheduling(ruleAttendanceMain); | ||
| 406 | + scheduling3.setBcType(BC_TYPE_IN); | ||
| 407 | + scheduling3.setFcsjT(ruleAttendanceMain.getSecondQuittingSignInTime().getTime()); | ||
| 408 | + scheduling3.setZdsjT(ruleAttendanceMain.getSecondQuittingSignInTime().getTime()); | ||
| 409 | + scheduling3.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 410 | + bcList.add(scheduling3); | ||
| 411 | + } | ||
| 412 | + } | ||
| 413 | + return bcList; | ||
| 414 | + } | ||
| 415 | + | ||
| 416 | + private static DriverScheduling getDriverScheduling(RuleAttendanceMain ruleAttendanceMain) { | ||
| 417 | + DriverScheduling scheduling = new DriverScheduling(); | ||
| 418 | + scheduling.setPosts(ruleAttendanceMain.getPosts()); | ||
| 419 | + scheduling.setJobCode(ruleAttendanceMain.getJobCode()); | ||
| 420 | + scheduling.setName(ruleAttendanceMain.getName()); | ||
| 421 | + scheduling.setFleetName(ruleAttendanceMain.getFleetName()); | ||
| 422 | + return scheduling; | ||
| 423 | + } | ||
| 424 | + | ||
| 365 | private List<DriverScheduling> getBcList(Map<String, List<ResponseSchedulingDto>> originSchedulingMap) { | 425 | private List<DriverScheduling> getBcList(Map<String, List<ResponseSchedulingDto>> originSchedulingMap) { |
| 366 | List<DriverScheduling> bcList = new ArrayList<>(1000); | 426 | List<DriverScheduling> bcList = new ArrayList<>(1000); |
| 367 | for (String key : originSchedulingMap.keySet()) { | 427 | for (String key : originSchedulingMap.keySet()) { |
ruoyi-admin/src/main/java/com/ruoyi/service/impl/AttendanceServiceImpl.java
| @@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | @@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 5 | import com.ruoyi.common.utils.DateUtils; | 5 | import com.ruoyi.common.utils.DateUtils; |
| 6 | import com.ruoyi.common.utils.PageUtils; | 6 | import com.ruoyi.common.utils.PageUtils; |
| 7 | import com.ruoyi.common.utils.SecurityUtils; | 7 | import com.ruoyi.common.utils.SecurityUtils; |
| 8 | -import com.ruoyi.domain.RuleAttendanceMain; | ||
| 9 | -import com.ruoyi.domain.RuleNumSetting; | ||
| 10 | -import com.ruoyi.domain.RuleSettingDriver; | ||
| 11 | -import com.ruoyi.domain.RuleSettingScheduling; | 8 | +import com.ruoyi.domain.*; |
| 12 | import com.ruoyi.driver.mapper.DriverMapper; | 9 | import com.ruoyi.driver.mapper.DriverMapper; |
| 13 | import com.ruoyi.num.domain.RuleNum; | 10 | import com.ruoyi.num.domain.RuleNum; |
| 14 | import com.ruoyi.num.service.IRuleNumService; | 11 | import com.ruoyi.num.service.IRuleNumService; |
| @@ -24,7 +21,6 @@ import com.ruoyi.service.*; | @@ -24,7 +21,6 @@ import com.ruoyi.service.*; | ||
| 24 | import com.ruoyi.utils.ConstDateUtil; | 21 | import com.ruoyi.utils.ConstDateUtil; |
| 25 | import org.springframework.beans.BeanUtils; | 22 | import org.springframework.beans.BeanUtils; |
| 26 | import org.springframework.beans.factory.annotation.Autowired; | 23 | import org.springframework.beans.factory.annotation.Autowired; |
| 27 | -import org.springframework.security.core.parameters.P; | ||
| 28 | import org.springframework.stereotype.Service; | 24 | import org.springframework.stereotype.Service; |
| 29 | import org.springframework.transaction.annotation.Transactional; | 25 | import org.springframework.transaction.annotation.Transactional; |
| 30 | 26 | ||
| @@ -159,8 +155,9 @@ public class AttendanceServiceImpl implements AttendanceService { | @@ -159,8 +155,9 @@ public class AttendanceServiceImpl implements AttendanceService { | ||
| 159 | } | 155 | } |
| 160 | 156 | ||
| 161 | @Override | 157 | @Override |
| 158 | + @Transactional(rollbackFor = Exception.class) | ||
| 162 | public void updateAttendance(UpdateAttendanceVo vo) { | 159 | public void updateAttendance(UpdateAttendanceVo vo) { |
| 163 | - RuleAttendanceMain main = attendanceMainService.getById(vo.getId()); | 160 | + RuleAttendanceMain main = new RuleAttendanceMain(); |
| 164 | RuleScheduling ruleScheduling = ruleSchedulingService.selectRuleSchedulingById(vo.getRuleId().longValue()); | 161 | RuleScheduling ruleScheduling = ruleSchedulingService.selectRuleSchedulingById(vo.getRuleId().longValue()); |
| 165 | BeanUtils.copyProperties(ruleScheduling, main); | 162 | BeanUtils.copyProperties(ruleScheduling, main); |
| 166 | main.setFirstWorkSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstWorkSignInTime()))); | 163 | main.setFirstWorkSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstWorkSignInTime()))); |
| @@ -170,19 +167,30 @@ public class AttendanceServiceImpl implements AttendanceService { | @@ -170,19 +167,30 @@ public class AttendanceServiceImpl implements AttendanceService { | ||
| 170 | // 处理隔天 | 167 | // 处理隔天 |
| 171 | if (TOMORROW_YES.equals(ruleScheduling.getFirstSignInDayTomorrow())) { | 168 | if (TOMORROW_YES.equals(ruleScheduling.getFirstSignInDayTomorrow())) { |
| 172 | main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime()))); | 169 | main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime()))); |
| 173 | - }else { | 170 | + } else { |
| 174 | main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime()))); | 171 | main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime()))); |
| 175 | } | 172 | } |
| 176 | } else { | 173 | } else { |
| 177 | // 处理隔天 | 174 | // 处理隔天 |
| 178 | if (TOMORROW_YES.equals(ruleScheduling.getFirstSignInDayTomorrow())) { | 175 | if (TOMORROW_YES.equals(ruleScheduling.getFirstSignInDayTomorrow())) { |
| 179 | main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime()))); | 176 | main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime()))); |
| 180 | - }else { | 177 | + } else { |
| 181 | main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime()))); | 178 | main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime()))); |
| 182 | } | 179 | } |
| 183 | } | 180 | } |
| 184 | main.setWorkFlag(ruleScheduling.getId() == 0 ? FREE_FLAG : WORK_FLAG); | 181 | main.setWorkFlag(ruleScheduling.getId() == 0 ? FREE_FLAG : WORK_FLAG); |
| 185 | - attendanceMainService.updateByIdTotalQuantity(main); | 182 | + attendanceMainService.updateByJobCodeTotalQuantity(vo, main); |
| 183 | + } | ||
| 184 | + | ||
| 185 | + @Override | ||
| 186 | + @Transactional(rollbackFor = Exception.class) | ||
| 187 | + public void deleteAttendance(DeleteAttendanceVo vo) { | ||
| 188 | + attendanceMainService.deleteByJobCodeTotalRecord(vo); | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + @Override | ||
| 192 | + public List<RuleAttendanceMainHelp> getPeopleList(PeopleRequestVo vo) { | ||
| 193 | + return attendanceMainService.queryPeopleList(vo); | ||
| 186 | } | 194 | } |
| 187 | 195 | ||
| 188 | private static void getRumSettingByDto(SchedulingDto dto, RuleNumSetting setting) { | 196 | private static void getRumSettingByDto(SchedulingDto dto, RuleNumSetting setting) { |
ruoyi-admin/src/main/java/com/ruoyi/service/impl/RuleAttendanceMainHelpServiceImpl.java
0 → 100644
| 1 | +package com.ruoyi.service.impl; | ||
| 2 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
| 3 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 4 | +import com.ruoyi.mapper.RuleAttendanceMainHelpMapper; | ||
| 5 | +import com.ruoyi.pojo.vo.PeopleRequestVo; | ||
| 6 | +import com.ruoyi.service.RuleAttendanceMainHelpService; | ||
| 7 | +import org.springframework.stereotype.Service; | ||
| 8 | + | ||
| 9 | +import java.util.List; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | +* @author 20412 | ||
| 13 | +* @description 针对表【rule_attendance_main_help(考勤表)】的数据库操作Service实现 | ||
| 14 | +* @createDate 2023-09-05 15:39:18 | ||
| 15 | +*/ | ||
| 16 | +@Service | ||
| 17 | +public class RuleAttendanceMainHelpServiceImpl extends ServiceImpl<RuleAttendanceMainHelpMapper, RuleAttendanceMainHelp> | ||
| 18 | + implements RuleAttendanceMainHelpService { | ||
| 19 | + | ||
| 20 | + @Override | ||
| 21 | + public List<RuleAttendanceMainHelp> queryNowMonthPeople(PeopleRequestVo vo) { | ||
| 22 | + return baseMapper.queryNowMonthPeople(vo); | ||
| 23 | + } | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | + | ||
| 27 | + | ||
| 28 | + |
ruoyi-admin/src/main/java/com/ruoyi/service/impl/RuleAttendanceMainServiceImpl.java
| @@ -2,10 +2,19 @@ package com.ruoyi.service.impl; | @@ -2,10 +2,19 @@ package com.ruoyi.service.impl; | ||
| 2 | 2 | ||
| 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| 4 | import com.ruoyi.domain.RuleAttendanceMain; | 4 | import com.ruoyi.domain.RuleAttendanceMain; |
| 5 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 5 | import com.ruoyi.mapper.RuleAttendanceMainMapper; | 6 | import com.ruoyi.mapper.RuleAttendanceMainMapper; |
| 7 | +import com.ruoyi.pojo.vo.DeleteAttendanceVo; | ||
| 8 | +import com.ruoyi.pojo.vo.PeopleRequestVo; | ||
| 9 | +import com.ruoyi.pojo.vo.PeopleResponseVo; | ||
| 10 | +import com.ruoyi.pojo.vo.UpdateAttendanceVo; | ||
| 11 | +import com.ruoyi.service.RuleAttendanceMainHelpService; | ||
| 6 | import com.ruoyi.service.RuleAttendanceMainService; | 12 | import com.ruoyi.service.RuleAttendanceMainService; |
| 13 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | import org.springframework.stereotype.Service; | 14 | import org.springframework.stereotype.Service; |
| 8 | 15 | ||
| 16 | +import java.util.List; | ||
| 17 | + | ||
| 9 | /** | 18 | /** |
| 10 | * @author 20412 | 19 | * @author 20412 |
| 11 | * @description 针对表【rule_attendance_main(考勤表)】的数据库操作Service实现 | 20 | * @description 针对表【rule_attendance_main(考勤表)】的数据库操作Service实现 |
| @@ -15,9 +24,22 @@ import org.springframework.stereotype.Service; | @@ -15,9 +24,22 @@ import org.springframework.stereotype.Service; | ||
| 15 | public class RuleAttendanceMainServiceImpl extends ServiceImpl<RuleAttendanceMainMapper, RuleAttendanceMain> | 24 | public class RuleAttendanceMainServiceImpl extends ServiceImpl<RuleAttendanceMainMapper, RuleAttendanceMain> |
| 16 | implements RuleAttendanceMainService { | 25 | implements RuleAttendanceMainService { |
| 17 | 26 | ||
| 27 | + @Autowired | ||
| 28 | + private RuleAttendanceMainHelpService helpService; | ||
| 29 | + | ||
| 30 | + @Override | ||
| 31 | + public void updateByJobCodeTotalQuantity(UpdateAttendanceVo vo, RuleAttendanceMain main) { | ||
| 32 | + baseMapper.updateByIdTotalQuantity(vo,main); | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + @Override | ||
| 36 | + public void deleteByJobCodeTotalRecord(DeleteAttendanceVo vo) { | ||
| 37 | + baseMapper.deleteByJobCodeTotalRecord(vo); | ||
| 38 | + } | ||
| 39 | + | ||
| 18 | @Override | 40 | @Override |
| 19 | - public void updateByIdTotalQuantity(RuleAttendanceMain main) { | ||
| 20 | - baseMapper.updateByIdTotalQuantity(main); | 41 | + public List<RuleAttendanceMainHelp> queryPeopleList(PeopleRequestVo vo) { |
| 42 | + return helpService.queryNowMonthPeople(vo); | ||
| 21 | } | 43 | } |
| 22 | } | 44 | } |
| 23 | 45 |
ruoyi-admin/src/main/java/com/ruoyi/service/impl/RuleNumSettingServiceImpl.java
| 1 | package com.ruoyi.service.impl; | 1 | package com.ruoyi.service.impl; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollectionUtil; | 3 | import cn.hutool.core.collection.CollectionUtil; |
| 4 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 5 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| 6 | +import com.ruoyi.common.cache.NowSchedulingCache; | ||
| 7 | +import com.ruoyi.domain.DriverScheduling; | ||
| 5 | import com.ruoyi.domain.RuleAttendanceMain; | 8 | import com.ruoyi.domain.RuleAttendanceMain; |
| 9 | +import com.ruoyi.domain.RuleAttendanceMainHelp; | ||
| 6 | import com.ruoyi.domain.RuleNumSetting; | 10 | import com.ruoyi.domain.RuleNumSetting; |
| 11 | +import com.ruoyi.driver.mapper.DriverSchedulingMapper; | ||
| 7 | import com.ruoyi.mapper.RuleNumSettingMapper; | 12 | import com.ruoyi.mapper.RuleNumSettingMapper; |
| 8 | import com.ruoyi.num.service.IRuleNumService; | 13 | import com.ruoyi.num.service.IRuleNumService; |
| 9 | import com.ruoyi.pojo.dto.AttendanceDto; | 14 | import com.ruoyi.pojo.dto.AttendanceDto; |
| @@ -12,19 +17,26 @@ import com.ruoyi.pojo.dto.RuleSchedulingDto; | @@ -12,19 +17,26 @@ import com.ruoyi.pojo.dto.RuleSchedulingDto; | ||
| 12 | import com.ruoyi.pojo.vo.SchedulingRequestVo; | 17 | import com.ruoyi.pojo.vo.SchedulingRequestVo; |
| 13 | import com.ruoyi.pojo.vo.SchedulingResponseVo; | 18 | import com.ruoyi.pojo.vo.SchedulingResponseVo; |
| 14 | import com.ruoyi.scheduling.service.IRuleSchedulingService; | 19 | import com.ruoyi.scheduling.service.IRuleSchedulingService; |
| 20 | +import com.ruoyi.service.RuleAttendanceMainHelpService; | ||
| 15 | import com.ruoyi.service.RuleAttendanceMainService; | 21 | import com.ruoyi.service.RuleAttendanceMainService; |
| 16 | import com.ruoyi.service.RuleNumSettingService; | 22 | import com.ruoyi.service.RuleNumSettingService; |
| 17 | import com.ruoyi.utils.ConstDateUtil; | 23 | import com.ruoyi.utils.ConstDateUtil; |
| 24 | +import org.slf4j.Logger; | ||
| 25 | +import org.slf4j.LoggerFactory; | ||
| 18 | import org.springframework.beans.BeanUtils; | 26 | import org.springframework.beans.BeanUtils; |
| 19 | import org.springframework.beans.factory.annotation.Autowired; | 27 | import org.springframework.beans.factory.annotation.Autowired; |
| 20 | import org.springframework.stereotype.Service; | 28 | import org.springframework.stereotype.Service; |
| 29 | +import org.springframework.transaction.annotation.Transactional; | ||
| 21 | 30 | ||
| 31 | +import javax.annotation.Resource; | ||
| 22 | import java.time.LocalDate; | 32 | import java.time.LocalDate; |
| 23 | import java.time.ZoneId; | 33 | import java.time.ZoneId; |
| 24 | import java.time.temporal.ChronoUnit; | 34 | import java.time.temporal.ChronoUnit; |
| 25 | import java.util.*; | 35 | import java.util.*; |
| 26 | import java.util.stream.Collectors; | 36 | import java.util.stream.Collectors; |
| 27 | 37 | ||
| 38 | +import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_IN; | ||
| 39 | +import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; | ||
| 28 | import static com.ruoyi.common.RuleSchedulingProperties.*; | 40 | import static com.ruoyi.common.RuleSchedulingProperties.*; |
| 29 | 41 | ||
| 30 | /** | 42 | /** |
| @@ -36,6 +48,9 @@ import static com.ruoyi.common.RuleSchedulingProperties.*; | @@ -36,6 +48,9 @@ import static com.ruoyi.common.RuleSchedulingProperties.*; | ||
| 36 | public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, RuleNumSetting> | 48 | public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, RuleNumSetting> |
| 37 | implements RuleNumSettingService { | 49 | implements RuleNumSettingService { |
| 38 | 50 | ||
| 51 | + private final static Logger log = LoggerFactory.getLogger(RuleNumSettingServiceImpl.class); | ||
| 52 | + @Autowired | ||
| 53 | + private RuleAttendanceMainHelpService helpService; | ||
| 39 | @Autowired | 54 | @Autowired |
| 40 | private IRuleSchedulingService schedulingService; | 55 | private IRuleSchedulingService schedulingService; |
| 41 | 56 | ||
| @@ -48,26 +63,52 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | @@ -48,26 +63,52 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | ||
| 48 | @Autowired | 63 | @Autowired |
| 49 | private RuleAttendanceMainService attendanceMainService; | 64 | private RuleAttendanceMainService attendanceMainService; |
| 50 | 65 | ||
| 66 | + @Autowired | ||
| 67 | + private DriverSchedulingMapper schedulingMapper; | ||
| 68 | + | ||
| 69 | + @Resource | ||
| 70 | + private NowSchedulingCache nowSchedulingCache; | ||
| 71 | + | ||
| 51 | @Override | 72 | @Override |
| 52 | public List<SchedulingResponseVo> getSchedulingList(SchedulingRequestVo vo) { | 73 | public List<SchedulingResponseVo> getSchedulingList(SchedulingRequestVo vo) { |
| 53 | return baseMapper.getSchedulingList(vo); | 74 | return baseMapper.getSchedulingList(vo); |
| 54 | } | 75 | } |
| 55 | 76 | ||
| 56 | @Override | 77 | @Override |
| 78 | + @Transactional(rollbackFor = Exception.class) | ||
| 57 | public void createAttendance() { | 79 | public void createAttendance() { |
| 58 | - | ||
| 59 | // 临时表根据工号生成一个月的模板,固定下来,每天生成一次,如果当前月内的工号已经生成了一次排班,则跳过生成 | 80 | // 临时表根据工号生成一个月的模板,固定下来,每天生成一次,如果当前月内的工号已经生成了一次排班,则跳过生成 |
| 60 | // 用户可以修改临时排班表的数据,只能修改未来一个月内的数据 过一天后把数据存储到考勤表, | 81 | // 用户可以修改临时排班表的数据,只能修改未来一个月内的数据 过一天后把数据存储到考勤表, |
| 61 | // 获取需要生成的人员工号 | 82 | // 获取需要生成的人员工号 |
| 62 | - List<AttendanceDto> peopleList = baseMapper.getPeopleList(); | ||
| 63 | - List<Integer> settingList = peopleList.stream().map(AttendanceDto::getSettingId).distinct().collect(Collectors.toList()); | ||
| 64 | - // 获取规则集合 | ||
| 65 | - List<RuleSchedulingDto> ruleList = schedulingService.selectRuleSchedulingListVoBySettingIds(settingList); | ||
| 66 | - // 获取班次 | ||
| 67 | - List<RuleNumDto> ruleNumDtoList = ruleNumSettingService.selectRuleNumBySettingId(settingList); | ||
| 68 | - // 处理规则 | ||
| 69 | - List<RuleAttendanceMain> attendanceMains = handleAttendanceMain(peopleList, ruleList, ruleNumDtoList); | ||
| 70 | - attendanceMainService.saveBatch(attendanceMains); | 83 | + try { |
| 84 | + log.info("开始生成排班明细"); | ||
| 85 | + List<AttendanceDto> peopleList = baseMapper.getPeopleList(); | ||
| 86 | + List<Integer> settingList = peopleList.stream().map(AttendanceDto::getSettingId).distinct().collect(Collectors.toList()); | ||
| 87 | + // 获取规则集合 | ||
| 88 | + List<RuleSchedulingDto> ruleList = schedulingService.selectRuleSchedulingListVoBySettingIds(settingList); | ||
| 89 | + // 获取班次 | ||
| 90 | + List<RuleNumDto> ruleNumDtoList = ruleNumSettingService.selectRuleNumBySettingId(settingList); | ||
| 91 | + // 处理规则 | ||
| 92 | + List<RuleAttendanceMain> attendanceMains = handleAttendanceMain(peopleList, ruleList, ruleNumDtoList); | ||
| 93 | + backCreatePeopleListLog(peopleList); | ||
| 94 | + attendanceMainService.saveBatch(attendanceMains); | ||
| 95 | + log.info("排班明细生成完毕"); | ||
| 96 | + } catch (Exception e) { | ||
| 97 | + log.error("排班明细生成失败,失败原因:{}", e.getMessage()); | ||
| 98 | + throw new RuntimeException(e); | ||
| 99 | + } | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + private void backCreatePeopleListLog(List<AttendanceDto> peopleList) { | ||
| 103 | + List<RuleAttendanceMainHelp> helpList = new ArrayList<>(peopleList.size()); | ||
| 104 | + Date date = new Date(); | ||
| 105 | + for (AttendanceDto dto : peopleList) { | ||
| 106 | + RuleAttendanceMainHelp help = new RuleAttendanceMainHelp(); | ||
| 107 | + BeanUtils.copyProperties(dto, help); | ||
| 108 | + help.setDateFlag(date); | ||
| 109 | + helpList.add(help); | ||
| 110 | + } | ||
| 111 | + helpService.saveBatch(helpList); | ||
| 71 | } | 112 | } |
| 72 | 113 | ||
| 73 | private List<RuleAttendanceMain> handleAttendanceMain(List<AttendanceDto> peopleList, List<RuleSchedulingDto> ruleList, List<RuleNumDto> ruleNumDtoList) { | 114 | private List<RuleAttendanceMain> handleAttendanceMain(List<AttendanceDto> peopleList, List<RuleSchedulingDto> ruleList, List<RuleNumDto> ruleNumDtoList) { |
| @@ -88,11 +129,11 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | @@ -88,11 +129,11 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | ||
| 88 | for (LocalDate date : dateList) { | 129 | for (LocalDate date : dateList) { |
| 89 | // 处理固定规则翻班 | 130 | // 处理固定规则翻班 |
| 90 | if (RULE_TYPE_FIXED.equals(dto.getRuleType())) { | 131 | if (RULE_TYPE_FIXED.equals(dto.getRuleType())) { |
| 91 | - handleFixed(date, mainList, ruleMap.get(settingId), attendanceDto,dto.getRuleDictName()); | 132 | + handleFixed(date, mainList, ruleMap.get(settingId), attendanceDto, dto.getRuleDictName()); |
| 92 | } | 133 | } |
| 93 | // 处理星期翻班 | 134 | // 处理星期翻班 |
| 94 | else { | 135 | else { |
| 95 | - handleWeek(date, mainList, ruleMap.get(settingId), attendanceDto,dto.getRuleDictName()); | 136 | + handleWeek(date, mainList, ruleMap.get(settingId), attendanceDto, dto.getRuleDictName()); |
| 96 | } | 137 | } |
| 97 | } | 138 | } |
| 98 | } | 139 | } |
| @@ -106,8 +147,9 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | @@ -106,8 +147,9 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | ||
| 106 | main.setSchedulingDate(Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant())); | 147 | main.setSchedulingDate(Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant())); |
| 107 | main.setPosts(attendanceDto.getPosts()); | 148 | main.setPosts(attendanceDto.getPosts()); |
| 108 | main.setRuleDictName(ruleDictName); | 149 | main.setRuleDictName(ruleDictName); |
| 150 | + main.setFleetName(attendanceDto.getFleetName()); | ||
| 109 | RuleSchedulingDto dto = null; | 151 | RuleSchedulingDto dto = null; |
| 110 | - dto = getRuleByWeek(main,ruleSchedulingDtoList, date,attendanceDto.getStartDate()); | 152 | + dto = getRuleByWeek(main, ruleSchedulingDtoList, date, attendanceDto.getStartDate()); |
| 111 | main.setWorkFlag(dto.getId() == 0 ? FREE_FLAG : WORK_FLAG); | 153 | main.setWorkFlag(dto.getId() == 0 ? FREE_FLAG : WORK_FLAG); |
| 112 | BeanUtils.copyProperties(dto, main); | 154 | BeanUtils.copyProperties(dto, main); |
| 113 | main.setName(attendanceDto.getName()); | 155 | main.setName(attendanceDto.getName()); |
| @@ -133,7 +175,7 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | @@ -133,7 +175,7 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | ||
| 133 | if (TOMORROW_YES.equals(dto.getFirstSignInDayTomorrow())) { | 175 | if (TOMORROW_YES.equals(dto.getFirstSignInDayTomorrow())) { |
| 134 | main.setSecondQuittingSignInTime(handleTimeTomorrowByRule(date, main.getSecondQuittingSignInTime())); | 176 | main.setSecondQuittingSignInTime(handleTimeTomorrowByRule(date, main.getSecondQuittingSignInTime())); |
| 135 | } else { | 177 | } else { |
| 136 | - main.setSecondWorkSignInTime(ConstDateUtil.dateAddition(date.toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime()))); | 178 | + main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(date.toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime()))); |
| 137 | } | 179 | } |
| 138 | } | 180 | } |
| 139 | } | 181 | } |
| @@ -176,6 +218,7 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | @@ -176,6 +218,7 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | ||
| 176 | main.setPosts(attendanceDto.getPosts()); | 218 | main.setPosts(attendanceDto.getPosts()); |
| 177 | main.setRuleDictName(ruleDictName); | 219 | main.setRuleDictName(ruleDictName); |
| 178 | main.setSchedulingDate(Date.from(nowDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); | 220 | main.setSchedulingDate(Date.from(nowDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); |
| 221 | + main.setFleetName(attendanceDto.getFleetName()); | ||
| 179 | Date startDate = attendanceDto.getStartDate(); | 222 | Date startDate = attendanceDto.getStartDate(); |
| 180 | // 匹配当天应设置的规则 | 223 | // 匹配当天应设置的规则 |
| 181 | RuleSchedulingDto dto = getNowRuleByFixed(nowDate, startDate, ruleSchedulingDtoList); | 224 | RuleSchedulingDto dto = getNowRuleByFixed(nowDate, startDate, ruleSchedulingDtoList); |
| @@ -266,6 +309,74 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | @@ -266,6 +309,74 @@ public class RuleNumSettingServiceImpl extends ServiceImpl<RuleNumSettingMapper, | ||
| 266 | return ruleNumService.selectRuleNumBySettingId(settingList); | 309 | return ruleNumService.selectRuleNumBySettingId(settingList); |
| 267 | } | 310 | } |
| 268 | 311 | ||
| 312 | + @Override | ||
| 313 | + public void manualAddBcCache() { | ||
| 314 | + List<DriverScheduling> bcList = handleOtherPostsScheduling(); | ||
| 315 | + schedulingMapper.insertRoster(bcList); | ||
| 316 | + bcList = schedulingMapper.queryToDay(ConstDateUtil.formatDate("yyyy-MM-dd"), null, null, null); | ||
| 317 | + String date = ConstDateUtil.formatDate(new Date()); | ||
| 318 | + Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800); | ||
| 319 | + NowSchedulingCache.handlerResultMap(resultMap, bcList); | ||
| 320 | + Map<String, List<DriverScheduling>> cacheScheduling = nowSchedulingCache.getCacheScheduling(date); | ||
| 321 | + for (Map.Entry<String, List<DriverScheduling>> entry : cacheScheduling.entrySet()) { | ||
| 322 | + String key = entry.getKey(); | ||
| 323 | + if (!Objects.isNull(resultMap.get(key))) { | ||
| 324 | + resultMap.remove(key); | ||
| 325 | + } | ||
| 326 | + } | ||
| 327 | + cacheScheduling.putAll(resultMap); | ||
| 328 | + } | ||
| 329 | + | ||
| 330 | + private List<DriverScheduling> handleOtherPostsScheduling() { | ||
| 331 | + QueryWrapper<RuleAttendanceMain> qw = new QueryWrapper<>(); | ||
| 332 | + qw.lambda() | ||
| 333 | + .eq(RuleAttendanceMain::getWorkFlag, WORK_FLAG) | ||
| 334 | + .eq(RuleAttendanceMain::getSchedulingDate, LocalDate.now()); | ||
| 335 | + List<RuleAttendanceMain> mainList = attendanceMainService.list(qw); | ||
| 336 | + List<DriverScheduling> bcList = new ArrayList<>(mainList.size() * 2); | ||
| 337 | + for (RuleAttendanceMain ruleAttendanceMain : mainList) { | ||
| 338 | + // 第一段 | ||
| 339 | + DriverScheduling scheduling = getDriverScheduling(ruleAttendanceMain); | ||
| 340 | + scheduling.setFcsjT(ruleAttendanceMain.getFirstWorkSignInTime().getTime()); | ||
| 341 | + scheduling.setBcType(BC_TYPE_OUT); | ||
| 342 | + scheduling.setZdsjT(ruleAttendanceMain.getFirstWorkSignInTime().getTime()); | ||
| 343 | + scheduling.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 344 | + bcList.add(scheduling); | ||
| 345 | + | ||
| 346 | + DriverScheduling scheduling1 = getDriverScheduling(ruleAttendanceMain); | ||
| 347 | + scheduling1.setBcType(BC_TYPE_IN); | ||
| 348 | + scheduling1.setZdsjT(ruleAttendanceMain.getFirstQuittingSignInTime().getTime()); | ||
| 349 | + scheduling1.setFcsjT(ruleAttendanceMain.getFirstQuittingSignInTime().getTime()); | ||
| 350 | + scheduling1.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 351 | + bcList.add(scheduling1); | ||
| 352 | + // 第二段 | ||
| 353 | + if (!Objects.isNull(ruleAttendanceMain.getSecondWorkSignInTime())) { | ||
| 354 | + DriverScheduling scheduling2 = getDriverScheduling(ruleAttendanceMain); | ||
| 355 | + scheduling2.setBcType(BC_TYPE_OUT); | ||
| 356 | + scheduling2.setFcsjT(ruleAttendanceMain.getSecondWorkSignInTime().getTime()); | ||
| 357 | + scheduling2.setZdsjT(ruleAttendanceMain.getSecondWorkSignInTime().getTime()); | ||
| 358 | + scheduling2.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 359 | + bcList.add(scheduling2); | ||
| 360 | + | ||
| 361 | + DriverScheduling scheduling3 = getDriverScheduling(ruleAttendanceMain); | ||
| 362 | + scheduling3.setBcType(BC_TYPE_IN); | ||
| 363 | + scheduling3.setFcsjT(ruleAttendanceMain.getSecondQuittingSignInTime().getTime()); | ||
| 364 | + scheduling3.setZdsjT(ruleAttendanceMain.getSecondQuittingSignInTime().getTime()); | ||
| 365 | + scheduling3.setScheduleDate(ruleAttendanceMain.getSchedulingDate()); | ||
| 366 | + bcList.add(scheduling3); | ||
| 367 | + } | ||
| 368 | + } | ||
| 369 | + return bcList; | ||
| 370 | + } | ||
| 371 | + | ||
| 372 | + private static DriverScheduling getDriverScheduling(RuleAttendanceMain ruleAttendanceMain) { | ||
| 373 | + DriverScheduling scheduling = new DriverScheduling(); | ||
| 374 | + scheduling.setPosts(ruleAttendanceMain.getPosts()); | ||
| 375 | + scheduling.setJobCode(ruleAttendanceMain.getJobCode()); | ||
| 376 | + scheduling.setName(ruleAttendanceMain.getName()); | ||
| 377 | + scheduling.setFleetName(ruleAttendanceMain.getFleetName()); | ||
| 378 | + return scheduling; | ||
| 379 | + } | ||
| 269 | 380 | ||
| 270 | } | 381 | } |
| 271 | 382 |
ruoyi-admin/src/main/resources/application-druid-prd.yml
| @@ -69,8 +69,8 @@ spring: | @@ -69,8 +69,8 @@ spring: | ||
| 69 | allow: | 69 | allow: |
| 70 | url-pattern: /druid/* | 70 | url-pattern: /druid/* |
| 71 | # 控制台管理用户名和密码 | 71 | # 控制台管理用户名和密码 |
| 72 | - login-username: ruoyi | ||
| 73 | - login-password: 123456 | 72 | + login-username: qpgj |
| 73 | + login-password: 2023#manager@qpgjuse | ||
| 74 | filter: | 74 | filter: |
| 75 | stat: | 75 | stat: |
| 76 | enabled: true | 76 | enabled: true |
ruoyi-admin/src/main/resources/mapper/RuleAttendanceMainHelpMapper.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE mapper | ||
| 3 | + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | ||
| 4 | + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||
| 5 | +<mapper namespace="com.ruoyi.mapper.RuleAttendanceMainHelpMapper"> | ||
| 6 | + | ||
| 7 | + <resultMap id="BaseResultMap" type="com.ruoyi.domain.RuleAttendanceMainHelp"> | ||
| 8 | + <id property="id" column="id" jdbcType="INTEGER"/> | ||
| 9 | + <result property="name" column="name" jdbcType="VARCHAR"/> | ||
| 10 | + <result property="jobCode" column="job_code" jdbcType="VARCHAR"/> | ||
| 11 | + <result property="posts" column="posts" jdbcType="VARCHAR"/> | ||
| 12 | + <result property="dateFlag" column="dateFlag" jdbcType="DATE"/> | ||
| 13 | + <result property="fleetName" column="fleet_name" jdbcType="VARCHAR"/> | ||
| 14 | + </resultMap> | ||
| 15 | + | ||
| 16 | + <sql id="Base_Column_List"> | ||
| 17 | + id,name,job_code, | ||
| 18 | + posts,date_flag,fleet_name | ||
| 19 | + </sql> | ||
| 20 | + <select id="queryNowMonthPeople" resultMap="BaseResultMap" resultType="com.ruoyi.domain.RuleAttendanceMainHelp"> | ||
| 21 | + SELECT * from rule_attendance_main_help WHERE DATE_FORMAT( date_flag, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' ) | ||
| 22 | + <if test="jobCode != null and jobCode != ''"> | ||
| 23 | + and job_code = #{jobCode} | ||
| 24 | + </if> | ||
| 25 | + <if test="posts != null and posts != ''"> | ||
| 26 | + and posts = #{posts} | ||
| 27 | + </if> | ||
| 28 | + <if test="name != null and name != ''"> | ||
| 29 | + and name = #{name} | ||
| 30 | + </if> | ||
| 31 | + </select> | ||
| 32 | +</mapper> |
ruoyi-admin/src/main/resources/mapper/RuleAttendanceMainMapper.xml
| @@ -34,18 +34,32 @@ | @@ -34,18 +34,32 @@ | ||
| 34 | </sql> | 34 | </sql> |
| 35 | <update id="updateByIdTotalQuantity"> | 35 | <update id="updateByIdTotalQuantity"> |
| 36 | update rule_attendance_main set | 36 | update rule_attendance_main set |
| 37 | - working_hour_plan = #{workingHourPlan}, | ||
| 38 | - working_hour_type = #{workingHourType}, | ||
| 39 | - first_work_sign_in_time = #{firstWorkSignInTime}, | ||
| 40 | - first_sign_in_working_range = #{firstSignInWorkingRange}, | ||
| 41 | - first_quitting_sign_in_time = #{firstQuittingSignInTime}, | ||
| 42 | - first_sign_in_quitting_range = #{firstSignInQuittingRange}, | ||
| 43 | - sign_in_time_out_range = #{signInTimeOutRange}, | ||
| 44 | - second_work_sign_in_time = #{secondWorkSignInTime}, | ||
| 45 | - second_sign_in_working_range = #{secondSignInWorkingRange}, | ||
| 46 | - second_quitting_sign_in_time = #{secondQuittingSignInTime}, | ||
| 47 | - second_sign_in_quitting_range = #{secondSignInQuittingRange}, | ||
| 48 | - work_flag = #{workFlag} | ||
| 49 | - where id = #{id} | 37 | + working_hour_plan = #{main.workingHourPlan}, |
| 38 | + working_hour_type = #{main.workingHourType}, | ||
| 39 | + first_work_sign_in_time = #{main.firstWorkSignInTime}, | ||
| 40 | + first_sign_in_working_range = #{main.firstSignInWorkingRange}, | ||
| 41 | + first_quitting_sign_in_time = #{main.firstQuittingSignInTime}, | ||
| 42 | + first_sign_in_quitting_range = #{main.firstSignInQuittingRange}, | ||
| 43 | + sign_in_time_out_range = #{main.signInTimeOutRange}, | ||
| 44 | + second_work_sign_in_time = #{main.secondWorkSignInTime}, | ||
| 45 | + second_sign_in_working_range = #{main.secondSignInWorkingRange}, | ||
| 46 | + second_quitting_sign_in_time = #{main.secondQuittingSignInTime}, | ||
| 47 | + second_sign_in_quitting_range = #{main.secondSignInQuittingRange}, | ||
| 48 | + work_flag = #{main.workFlag} | ||
| 49 | + where | ||
| 50 | + job_code IN | ||
| 51 | + <foreach collection="vo.jobCode" index="index" item="item" open="(" close=")" separator=","> | ||
| 52 | + #{item} | ||
| 53 | + </foreach> | ||
| 54 | + and scheduling_date >= #{vo.startDate} and scheduling_date <= #{vo.endDate} | ||
| 50 | </update> | 55 | </update> |
| 56 | + <delete id="deleteByJobCodeTotalRecord"> | ||
| 57 | + delete from rule_attendance_main | ||
| 58 | + where job_code IN | ||
| 59 | + <foreach collection="jobCode" index="index" item="item" separator="," open="(" close=")"> | ||
| 60 | + #{item} | ||
| 61 | + </foreach> | ||
| 62 | + and scheduling_date >= #{startDate} | ||
| 63 | + and scheduling_date <= #{endDate} | ||
| 64 | + </delete> | ||
| 51 | </mapper> | 65 | </mapper> |
ruoyi-admin/src/main/resources/mapper/RuleNumSettingMapper.xml
| @@ -22,6 +22,7 @@ | @@ -22,6 +22,7 @@ | ||
| 22 | <result property="name" column="personnel_name" jdbcType="VARCHAR"/> | 22 | <result property="name" column="personnel_name" jdbcType="VARCHAR"/> |
| 23 | <result property="settingId" column="setting_id" jdbcType="INTEGER"/> | 23 | <result property="settingId" column="setting_id" jdbcType="INTEGER"/> |
| 24 | <result property="startDate" column="start_date" jdbcType="DATE"/> | 24 | <result property="startDate" column="start_date" jdbcType="DATE"/> |
| 25 | + <result property="fleetName" column="fleet_name" jdbcType="VARCHAR"/> | ||
| 25 | <!-- <collection property="ruleList" ofType="com.ruoyi.scheduling.domain.RuleScheduling">--> | 26 | <!-- <collection property="ruleList" ofType="com.ruoyi.scheduling.domain.RuleScheduling">--> |
| 26 | <!-- <result column="working_hour_plan" property="workingHourPlan" jdbcType="INTEGER"/>--> | 27 | <!-- <result column="working_hour_plan" property="workingHourPlan" jdbcType="INTEGER"/>--> |
| 27 | <!-- <result column="working_hour_type" property="workingHourType" jdbcType="INTEGER"/>--> | 28 | <!-- <result column="working_hour_type" property="workingHourType" jdbcType="INTEGER"/>--> |
| @@ -71,6 +72,7 @@ | @@ -71,6 +72,7 @@ | ||
| 71 | SELECT | 72 | SELECT |
| 72 | driver.job_code, | 73 | driver.job_code, |
| 73 | driver.personnel_name, | 74 | driver.personnel_name, |
| 75 | + driver.fleet_name, | ||
| 74 | driver.posts, | 76 | driver.posts, |
| 75 | rule_setting_driver.setting_id, | 77 | rule_setting_driver.setting_id, |
| 76 | rule_setting_driver.start_date | 78 | rule_setting_driver.start_date |