Commit af61bdb071d1f35aa2272e190257386940a7599e

Authored by guzijian
1 parent 1b7bcae8

feat: 新增规则修改校验,修改签退时间规则.

Bsth-admin/src/main/java/com/ruoyi/controller/AttendanceController.java
@@ -132,7 +132,7 @@ public class AttendanceController extends BaseController { @@ -132,7 +132,7 @@ public class AttendanceController extends BaseController {
132 132
133 @ApiOperation("获取一个月的排班table") 133 @ApiOperation("获取一个月的排班table")
134 @GetMapping("/list/people") 134 @GetMapping("/list/people")
135 - public TableDataInfo getTableMonth(@ModelAttribute PeopleRequestVo vo){ 135 + public TableDataInfo getTableMonth(@ModelAttribute PeopleRequestVo vo) {
136 return attendanceService.getTableMonth(vo); 136 return attendanceService.getTableMonth(vo);
137 } 137 }
138 138
@@ -140,21 +140,21 @@ public class AttendanceController extends BaseController { @@ -140,21 +140,21 @@ public class AttendanceController extends BaseController {
140 @ApiOperation("用户顶班") 140 @ApiOperation("用户顶班")
141 @PutMapping("/update/people/attendance") 141 @PutMapping("/update/people/attendance")
142 @Log(title = "用户顶班", businessType = BusinessType.UPDATE) 142 @Log(title = "用户顶班", businessType = BusinessType.UPDATE)
143 - public Result<?> updateSchedulingByUser( @RequestBody @Validated UpdatePeopleAttendanceRequestVo vo){ 143 + public Result<?> updateSchedulingByUser(@RequestBody @Validated UpdatePeopleAttendanceRequestVo vo) {
144 attendanceService.updateSchedulingByUser(vo); 144 attendanceService.updateSchedulingByUser(vo);
145 return Result.OK("顶班成功"); 145 return Result.OK("顶班成功");
146 } 146 }
147 147
148 @ApiOperation("获取当日休息的用户") 148 @ApiOperation("获取当日休息的用户")
149 @GetMapping("/getToday/freeUser") 149 @GetMapping("/getToday/freeUser")
150 - public Result<?> getTodayFreeUser(@RequestParam("date") String date){ 150 + public Result<?> getTodayFreeUser(@RequestParam("date") String date) {
151 return Result.OK(attendanceService.getTodayFreeUser(date)); 151 return Result.OK(attendanceService.getTodayFreeUser(date));
152 } 152 }
153 153
154 @ApiOperation("生成指定月份的排班") 154 @ApiOperation("生成指定月份的排班")
155 @PostMapping("/create/attendance/{month}") 155 @PostMapping("/create/attendance/{month}")
156 @Log(title = "生成当月", businessType = BusinessType.INSERT) 156 @Log(title = "生成当月", businessType = BusinessType.INSERT)
157 - public Result<?> createAttendance(@PathVariable("month") String month){ 157 + public Result<?> createAttendance(@PathVariable("month") String month) {
158 attendanceService.createAttendance(month); 158 attendanceService.createAttendance(month);
159 return Result.OK(); 159 return Result.OK();
160 } 160 }
@@ -162,10 +162,17 @@ public class AttendanceController extends BaseController { @@ -162,10 +162,17 @@ public class AttendanceController extends BaseController {
162 @ApiOperation("生成指定月份的指定人员的排班") 162 @ApiOperation("生成指定月份的指定人员的排班")
163 @PostMapping("/again/create/attendance") 163 @PostMapping("/again/create/attendance")
164 @Log(title = "重新生成", businessType = BusinessType.INSERT) 164 @Log(title = "重新生成", businessType = BusinessType.INSERT)
165 - public Result<?> againCreateAttendance(@RequestBody @Validated AgainCreateRequestVo vo){ 165 + public Result<?> againCreateAttendance(@RequestBody @Validated AgainCreateRequestVo vo) {
166 attendanceService.againCreateAttendance(vo); 166 attendanceService.againCreateAttendance(vo);
167 return Result.OK(); 167 return Result.OK();
168 } 168 }
169 169
  170 + /**
  171 + * 规则检查
  172 + */
  173 + @GetMapping("/check/scheduleRule/{ruleId}")
  174 + public Result<?> checkScheduleRule(@PathVariable("ruleId") String ruleId) {
  175 + return attendanceService.checkScheduleRule(ruleId);
  176 + }
170 177
171 } 178 }
Bsth-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
@@ -287,12 +287,13 @@ public class SignInServiceImpl implements ISignInService { @@ -287,12 +287,13 @@ public class SignInServiceImpl implements ISignInService {
287 287
288 @Override 288 @Override
289 public List<SignInResponseVo> selectSignInByIds(List<Long> collect) { 289 public List<SignInResponseVo> selectSignInByIds(List<Long> collect) {
290 - if (CollectionUtil.isEmpty(collect)){ 290 + if (CollectionUtil.isEmpty(collect)) {
291 return new ArrayList<>(); 291 return new ArrayList<>();
292 } 292 }
293 return signInMapper.selectSignInByIds(collect); 293 return signInMapper.selectSignInByIds(collect);
294 } 294 }
295 295
  296 +
296 private String handleDate(String dateString) { 297 private String handleDate(String dateString) {
297 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); 298 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
298 // 解析字符串日期为 LocalDate 对象 299 // 解析字符串日期为 LocalDate 对象
@@ -544,8 +545,8 @@ public class SignInServiceImpl implements ISignInService { @@ -544,8 +545,8 @@ public class SignInServiceImpl implements ISignInService {
544 globalIndex.setIndex(lastClosestTimestamp.getIndex()); 545 globalIndex.setIndex(lastClosestTimestamp.getIndex());
545 result = false; 546 result = false;
546 } 547 }
547 - // 上一次无记无|签到,type:签退 当前时间小于最近签到时间 -> 早签 或者 超时  
548 - else { 548 + // 当前无记|签到,type:签退 当前时间小于最近签到时间 -> 早签 或者 超时
  549 + else {
549 signIn.setRemark(SIGN_IN_TIMEOUT + getPrompt(currentScheduling)); 550 signIn.setRemark(SIGN_IN_TIMEOUT + getPrompt(currentScheduling));
550 globalIndex.setIndex(currentScheduling.getIndex()); 551 globalIndex.setIndex(currentScheduling.getIndex());
551 result = false; 552 result = false;
@@ -578,7 +579,6 @@ public class SignInServiceImpl implements ISignInService { @@ -578,7 +579,6 @@ public class SignInServiceImpl implements ISignInService {
578 globalIndex.setIndex(nextScheduling.getIndex()); 579 globalIndex.setIndex(nextScheduling.getIndex());
579 prompt = getPrompt(nextScheduling); 580 prompt = getPrompt(nextScheduling);
580 signIn.setRemark((nextScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt); 581 signIn.setRemark((nextScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt);
581 -  
582 } else { 582 } else {
583 globalIndex.setIndex(currentScheduling.getIndex()); 583 globalIndex.setIndex(currentScheduling.getIndex());
584 prompt = getPrompt(currentScheduling); 584 prompt = getPrompt(currentScheduling);
@@ -600,8 +600,8 @@ public class SignInServiceImpl implements ISignInService { @@ -600,8 +600,8 @@ public class SignInServiceImpl implements ISignInService {
600 } 600 }
601 601
602 private boolean handleTimeOut(String bcType, long nowBetween, GlobalIndex globalIndex, DriverSignInRecommendation currentScheduling) { 602 private boolean handleTimeOut(String bcType, long nowBetween, GlobalIndex globalIndex, DriverSignInRecommendation currentScheduling) {
603 - if ((BC_TYPE_OUT.equals(bcType) && nowBetween > 0 )  
604 - ||( BC_TYPE_IN.equals(bcType) && nowBetween <= 60L)) { 603 + if ((BC_TYPE_OUT.equals(bcType) && nowBetween > 0L)
  604 + || (BC_TYPE_IN.equals(bcType) && nowBetween > 60L)) {
605 return true; 605 return true;
606 } else { 606 } else {
607 return false; 607 return false;
@@ -612,23 +612,22 @@ public class SignInServiceImpl implements ISignInService { @@ -612,23 +612,22 @@ public class SignInServiceImpl implements ISignInService {
612 if (BC_TYPE_OUT.equals(currentScheduling.getBcType())) { 612 if (BC_TYPE_OUT.equals(currentScheduling.getBcType())) {
613 return "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前一小时内打卡。"; 613 return "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前一小时内打卡。";
614 } else { 614 } else {
615 - // 正1小时 负 1小时 615 + // 延后一小时
616 LocalDateTime time = ConstDateUtil.stringTransformLocalDateTime(ConstDateUtil.formatDate("yyyy-MM-dd HH:mm:ss", new Date(currentScheduling.getTimestamps())), "yyyy-MM-dd HH:mm:ss"); 616 LocalDateTime time = ConstDateUtil.stringTransformLocalDateTime(ConstDateUtil.formatDate("yyyy-MM-dd HH:mm:ss", new Date(currentScheduling.getTimestamps())), "yyyy-MM-dd HH:mm:ss");
617 LocalDateTime addHours = time.plusHours(1); 617 LocalDateTime addHours = time.plusHours(1);
618 - LocalDateTime hours = time.plusHours(-1);  
619 - return "请在" + ConstDateUtil.formatDate("HH:mm", hours) + "到" 618 + return "请在" + ConstDateUtil.formatDate("HH:mm", time) + "到"
620 + ConstDateUtil.formatDate("HH:mm", addHours) + "之间打卡"; 619 + ConstDateUtil.formatDate("HH:mm", addHours) + "之间打卡";
621 } 620 }
622 } 621 }
623 622
624 623
625 public static boolean checkTimerSign(long nowBetween, String bcType) { 624 public static boolean checkTimerSign(long nowBetween, String bcType) {
626 - // 如果是签到就是正负一小时内有效 625 + // 如果是签到就是提前一小时内有效
627 if (BC_TYPE_OUT.equals(bcType)) { 626 if (BC_TYPE_OUT.equals(bcType)) {
628 return !(nowBetween <= 0L && nowBetween >= -60L); 627 return !(nowBetween <= 0L && nowBetween >= -60L);
629 } else { 628 } else {
630 - // 如果是签退就是就是正负一小时内有效  
631 - return !(Math.abs(nowBetween) <= 60); 629 + // 如果是签退就是就是延后一小时内有效
  630 + return !(nowBetween <= 60 && nowBetween >= 0L);
632 } 631 }
633 } 632 }
634 633
Bsth-admin/src/main/java/com/ruoyi/scheduling/service/impl/RuleSchedulingServiceImpl.java
@@ -109,16 +109,6 @@ public class RuleSchedulingServiceImpl implements IRuleSchedulingService { @@ -109,16 +109,6 @@ public class RuleSchedulingServiceImpl implements IRuleSchedulingService {
109 @Override 109 @Override
110 public int updateRuleScheduling(RuleScheduling ruleScheduling) { 110 public int updateRuleScheduling(RuleScheduling ruleScheduling) {
111 handleNewAddScheduling(ruleScheduling); 111 handleNewAddScheduling(ruleScheduling);
112 - // TODO 规则是否绑定  
113 - LambdaQueryWrapper<RuleSettingScheduling> qw = new LambdaQueryWrapper<>();  
114 - qw.eq(RuleSettingScheduling::getRuleSchedulingId,ruleScheduling.getId());  
115 - List<RuleSettingScheduling> list = ruleSettingSchedulingService.list(qw);  
116 - if (CollectionUtil.isNotEmpty(list)) {  
117 - String ruleDictName = ruleNumSettingService.listByIds(list.stream()  
118 - .map(RuleSettingScheduling::getSettingId).collect(Collectors.toList()))  
119 - .stream().map(RuleNumSetting::getRuleDictName).distinct().collect(Collectors.joining(","));  
120 - throw new ServiceException("该规则已经与" + ruleDictName + "等班次绑定,请解绑对应班次后修改!");  
121 - }  
122 ruleScheduling.setUpdateTime(DateUtils.getNowDate()); 112 ruleScheduling.setUpdateTime(DateUtils.getNowDate());
123 ruleScheduling.setUpdateBy(SecurityUtils.getUsername()); 113 ruleScheduling.setUpdateBy(SecurityUtils.getUsername());
124 ToolUtils.handleRuleScheduling(ruleScheduling); 114 ToolUtils.handleRuleScheduling(ruleScheduling);
Bsth-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.common.core.page.TableDataInfo; 3 import com.ruoyi.common.core.page.TableDataInfo;
  4 +import com.ruoyi.common.global.Result;
4 import com.ruoyi.domain.RuleAttendanceMain; 5 import com.ruoyi.domain.RuleAttendanceMain;
5 import com.ruoyi.pojo.dto.SchedulingDto; 6 import com.ruoyi.pojo.dto.SchedulingDto;
6 import com.ruoyi.pojo.dto.SchedulingSettingDto; 7 import com.ruoyi.pojo.dto.SchedulingSettingDto;
@@ -87,4 +88,11 @@ public interface AttendanceService { @@ -87,4 +88,11 @@ public interface AttendanceService {
87 * @param vo 88 * @param vo
88 */ 89 */
89 void againCreateAttendance(AgainCreateRequestVo vo); 90 void againCreateAttendance(AgainCreateRequestVo vo);
  91 +
  92 + /**
  93 + * 检查规则
  94 + * @param ruleId
  95 + * @return
  96 + */
  97 + Result<?> checkScheduleRule(String ruleId);
90 } 98 }
Bsth-admin/src/main/java/com/ruoyi/service/SchedulingService.java
@@ -145,7 +145,7 @@ public class SchedulingService { @@ -145,7 +145,7 @@ public class SchedulingService {
145 long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT(); 145 long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT();
146 long nowBetween = ChronoUnit.MINUTES.between(ConstDateUtil.getLocalDateTimeByLongTime(date), ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime())); 146 long nowBetween = ChronoUnit.MINUTES.between(ConstDateUtil.getLocalDateTimeByLongTime(date), ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime()));
147 if (SignInServiceImpl.checkTimerSign(nowBetween, scheduling.getBcType())) { 147 if (SignInServiceImpl.checkTimerSign(nowBetween, scheduling.getBcType())) {
148 - if (nowBetween < -60L) { 148 + if (nowBetween < -60L || (BC_TYPE_IN.equals(scheduling.getBcType()) && nowBetween < 0L) ) {
149 sb.append(EARLY); 149 sb.append(EARLY);
150 } else { 150 } else {
151 sb.append(SIGN_STATUS_DELAY_ENUM.getDescription(scheduling.getBcType())); 151 sb.append(SIGN_STATUS_DELAY_ENUM.getDescription(scheduling.getBcType()));
Bsth-admin/src/main/java/com/ruoyi/service/impl/AttendanceServiceImpl.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.LambdaQueryWrapper;
4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 import com.github.pagehelper.PageInfo; 6 import com.github.pagehelper.PageInfo;
6 import com.ruoyi.common.constant.HttpStatus; 7 import com.ruoyi.common.constant.HttpStatus;
7 import com.ruoyi.common.core.page.TableDataInfo; 8 import com.ruoyi.common.core.page.TableDataInfo;
  9 +import com.ruoyi.common.exception.ServiceException;
  10 +import com.ruoyi.common.global.Result;
  11 +import com.ruoyi.common.global.ResultCode;
8 import com.ruoyi.common.utils.DateUtils; 12 import com.ruoyi.common.utils.DateUtils;
9 import com.ruoyi.common.utils.PageUtils; 13 import com.ruoyi.common.utils.PageUtils;
10 import com.ruoyi.common.utils.SecurityUtils; 14 import com.ruoyi.common.utils.SecurityUtils;
@@ -65,6 +69,7 @@ public class AttendanceServiceImpl implements AttendanceService { @@ -65,6 +69,7 @@ public class AttendanceServiceImpl implements AttendanceService {
65 @Autowired 69 @Autowired
66 private RuleSettingSchedulingService settingSchedulingService; 70 private RuleSettingSchedulingService settingSchedulingService;
67 71
  72 +
68 @Autowired 73 @Autowired
69 private RuleAttendanceMainService attendanceMainService; 74 private RuleAttendanceMainService attendanceMainService;
70 75
@@ -310,6 +315,21 @@ public class AttendanceServiceImpl implements AttendanceService { @@ -310,6 +315,21 @@ public class AttendanceServiceImpl implements AttendanceService {
310 createAttendanceByStartDate(vo); 315 createAttendanceByStartDate(vo);
311 } 316 }
312 317
  318 + @Override
  319 + public Result<?> checkScheduleRule(String ruleId) {
  320 + // TODO 规则是否绑定
  321 + LambdaQueryWrapper<RuleSettingScheduling> qw = new LambdaQueryWrapper<>();
  322 + qw.eq(RuleSettingScheduling::getRuleSchedulingId,ruleId);
  323 + List<RuleSettingScheduling> list = settingSchedulingService.list(qw);
  324 + if (CollectionUtil.isNotEmpty(list)) {
  325 + String ruleDictName = ruleNumSettingService.listByIds(list.stream()
  326 + .map(RuleSettingScheduling::getSettingId).collect(Collectors.toList()))
  327 + .stream().map(RuleNumSetting::getRuleDictName).distinct().collect(Collectors.joining(","));
  328 + return Result.ERROR(ResultCode.CODE_202,"该规则已经与" + ruleDictName + "等班次绑定!");
  329 + }
  330 + return Result.OK();
  331 + }
  332 +
313 private void createAttendanceByStartDate(AgainCreateRequestVo vo) { 333 private void createAttendanceByStartDate(AgainCreateRequestVo vo) {
314 List<AttendanceDto> peopleList = ruleSchedulingService.getPeopleListByJobCodes(vo.getJobCode()); 334 List<AttendanceDto> peopleList = ruleSchedulingService.getPeopleListByJobCodes(vo.getJobCode());
315 LocalDate parse = LocalDate.parse(vo.getDate()); 335 LocalDate parse = LocalDate.parse(vo.getDate());