Commit 2b433ba010fa8f479da06ad2a5c11c666f589101

Authored by guzijian
1 parent 6443d13d

feat: 修复修改排班日期规则工作日期bug

ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
... ... @@ -159,7 +159,7 @@ public class SignInServiceImpl implements ISignInService {
159 159 signIn.setCreateTime(new Date());
160 160 signIn.setRemark("");
161 161 GlobalIndex globalIndex = new GlobalIndex();
162   - long now = System.currentTimeMillis();
  162 + long now = signIn.getCreateTime().getTime();
163 163 List<DriverScheduling> dto = schedulingService.queryScheduling(signIn.getJobCode(), now);
164 164 // 签到检查
165 165 if (checkSignIn(now, dto, globalIndex, signIn, driver)) {
... ... @@ -182,6 +182,10 @@ public class SignInServiceImpl implements ISignInService {
182 182 threadJobService.asyncInsertExceptionRecord(signIn, driver, dto, globalIndex);
183 183  
184 184 // 驾驶人员二次签到酒精测试异常
  185 + return handleAjaxResult(signIn, driver, vo);
  186 + }
  187 +
  188 + private AjaxResult handleAjaxResult(SignIn signIn, Driver driver, SignInResponseVo vo) {
185 189 if (PERSONNEL_POSTS_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) {
186 190 AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo);
187 191 if (!Objects.isNull(result)) {
... ...
ruoyi-admin/src/main/java/com/ruoyi/mapper/RuleAttendanceMainMapper.java
... ... @@ -10,33 +10,35 @@ import org.apache.ibatis.annotations.Param;
10 10 import java.util.List;
11 11  
12 12 /**
13   -* @author 20412
14   -* @description 针对表【rule_attendance_main(考勤表)】的数据库操作Mapper
15   -* @createDate 2023-09-03 12:15:39
16   -* @Entity .domain.RuleAttendanceMain
17   -*/
  13 + * @author 20412
  14 + * @description 针对表【rule_attendance_main(考勤表)】的数据库操作Mapper
  15 + * @createDate 2023-09-03 12:15:39
  16 + * @Entity .domain.RuleAttendanceMain
  17 + */
18 18 public interface RuleAttendanceMainMapper extends BaseMapper<RuleAttendanceMain> {
19 19 /**
20 20 * 批量更新
21 21 *
22 22 * @param vo
23   - * @param main
  23 + * @param mainList
24 24 */
25   - void updateByIdTotalQuantity(@Param("vo") UpdateAttendanceVo vo,@Param("main") RuleAttendanceMain main);
  25 + void updateByIdTotalQuantity(@Param("vo") UpdateAttendanceVo vo, @Param("mainList") List<RuleAttendanceMain> mainList);
26 26  
27 27 /**
28 28 * 批量删除
  29 + *
29 30 * @param vo
30 31 */
31 32 void deleteByJobCodeTotalRecord(DeleteAttendanceVo vo);
32 33  
33 34 /**
34 35 * 获取当月的日期数据
  36 + *
35 37 * @param vo
36 38 * @param jobCodes
37 39 * @return
38 40 */
39   - List<RuleAttendanceMain> queryNowMonthDate(@Param("vo") PeopleRequestVo vo, @Param("jobCodes")List<String> jobCodes);
  41 + List<RuleAttendanceMain> queryNowMonthDate(@Param("vo") PeopleRequestVo vo, @Param("jobCodes") List<String> jobCodes);
40 42 }
41 43  
42 44  
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/RuleAttendanceMainService.java
... ... @@ -5,11 +5,9 @@ import com.ruoyi.domain.RuleAttendanceMain;
5 5 import com.ruoyi.domain.RuleAttendanceMainHelp;
6 6 import com.ruoyi.pojo.vo.DeleteAttendanceVo;
7 7 import com.ruoyi.pojo.vo.PeopleRequestVo;
8   -import com.ruoyi.pojo.vo.PeopleResponseVo;
9 8 import com.ruoyi.pojo.vo.UpdateAttendanceVo;
10 9 import org.apache.ibatis.annotations.Param;
11 10  
12   -import java.time.LocalDate;
13 11 import java.util.List;
14 12  
15 13 /**
... ... @@ -24,7 +22,7 @@ public interface RuleAttendanceMainService extends IService&lt;RuleAttendanceMain&gt;
24 22 * @param vo
25 23 * @param main
26 24 */
27   - void updateByJobCodeTotalQuantity(@Param("vo") UpdateAttendanceVo vo, @Param("main") RuleAttendanceMain main);
  25 + void updateByJobCodeTotalQuantity(@Param("vo") UpdateAttendanceVo vo, @Param("main") List<RuleAttendanceMain> main);
28 26  
29 27 /**
30 28 * 删除排班
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/SchedulingService.java
... ... @@ -118,16 +118,17 @@ public class SchedulingService {
118 118 return;
119 119 }
120 120  
  121 + String remark = getRemark(dto, signIn, globalIndex.getIndex());
121 122 // 更新最新的签到记录判断是否需要更新考勤
122 123 // 记录为空直接插入记录
123 124 if (Objects.isNull(dto.get(globalIndex.getIndex()).getSignInId()) || dto.size() == 1) {
124   - schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
  125 + schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
125 126 // 更新缓存
126 127 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn);
127 128 }
128 129 // 之前的无效
129 130 else if (!dto.get(globalIndex.getIndex()).getExType().equals(SIGN_NO_EX_NUM)) {
130   - schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
  131 + schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
131 132 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn);
132 133 }
133 134 // 之前的有效
... ... @@ -137,17 +138,31 @@ public class SchedulingService {
137 138  
138 139 }
139 140  
  141 + private String getRemark(List<DriverScheduling> dto, SignIn signIn, Integer globalIndex) {
  142 + DriverScheduling scheduling = dto.get(globalIndex);
  143 + long date = scheduling.getBcType().equals(BC_TYPE_IN) ? scheduling.getZdsjT() : scheduling.getFcsjT();
  144 + long nowBetween = ChronoUnit.MINUTES.between(ConstDateUtil.getLocalDateTimeByLongTime(date), ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime()));
  145 + if (!(Math.abs(nowBetween) <= 60)) {
  146 + if (nowBetween < -60L) {
  147 + return "早签";
  148 + } else {
  149 + return "迟到";
  150 + }
  151 + }
  152 + return signIn.getRemark();
  153 + }
  154 +
140 155 private void handlerRecord(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex) {
141 156 if (globalIndex.getIndex() == dto.size() - 1) {
142 157 return;
143 158 }
144   - long timer = 1000 * 60 * 5;
145   - // 有效的在一分钟内重复签到不做修改
  159 + long timer = 1000 * 60 * 60;
  160 + // 有效的在一小时内内重复签到不做修改
146 161 if (signIn.getExType().equals(SIGN_NO_EX_NUM) && (DateUtils.getNowDate().getTime() - dto.get(globalIndex.getIndex()).getSignTime().getTime()) <= timer) {
147   - signIn.setRemark("您已经打卡过了,您已完成" + (globalIndex.getIndex() + 1) + "次打卡,请勿在5分钟内重复打卡");
  162 + signIn.setRemark("您已经打卡过了,请勿在一小时内重复打卡");
148 163 return;
149 164 }
150   - Integer index = globalIndex.getIndex() + 1;
  165 + int index = globalIndex.getIndex() + 1;
151 166 // 之前是签到 | 目前有效记录 -》进行修改 变成无效
152 167 if (signIn.getExType().equals(SIGN_NO_EX_NUM)) {
153 168 signIn.setStatus(SIGN_IN_FAIL);
... ... @@ -160,7 +175,9 @@ public class SchedulingService {
160 175 signIn.setRemark((scheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt);
161 176 signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。"));
162 177 // 之前是签到 | 目前无效 -》往后更新
163   - schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
  178 +
  179 + String remark = getRemark(dto, signIn, index);
  180 + schedulingMapper.updateRoster(scheduling, signIn.getId(), signIn.getExType(), signIn.getCreateTime(), remark, signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
164 181 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex() + 1, signIn);
165 182 }
166 183  
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/impl/AttendanceServiceImpl.java
... ... @@ -175,26 +175,45 @@ public class AttendanceServiceImpl implements AttendanceService {
175 175 RuleAttendanceMain main = new RuleAttendanceMain();
176 176 RuleScheduling ruleScheduling = ruleSchedulingService.selectRuleSchedulingById(vo.getRuleId().longValue());
177 177 BeanUtils.copyProperties(ruleScheduling, main);
178   - main.setFirstWorkSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstWorkSignInTime())));
  178 + List<RuleAttendanceMain> mainList = handleRuleUpdate(vo, main, ruleScheduling);
  179 + attendanceMainService.updateByJobCodeTotalQuantity(vo, mainList);
  180 + }
  181 +
  182 + private static List<RuleAttendanceMain> handleRuleUpdate(UpdateAttendanceVo vo, RuleAttendanceMain main, RuleScheduling ruleScheduling) {
  183 + List<RuleAttendanceMain> mainList = new ArrayList<>();
  184 + LocalDate startDate = LocalDate.parse(vo.getStartDate());
  185 + LocalDate endDate = LocalDate.parse(vo.getEndDate());
  186 + while (startDate.compareTo(endDate) <= 0) {
  187 + handleSegmentation(main, ruleScheduling, mainList, startDate);
  188 + startDate = startDate.plusDays(1);
  189 + }
  190 + return mainList;
  191 + }
  192 +
  193 + private static void handleSegmentation(RuleAttendanceMain main, RuleScheduling ruleScheduling, List<RuleAttendanceMain> mainList, LocalDate startDate) {
  194 + RuleAttendanceMain nowMain = new RuleAttendanceMain();
  195 + BeanUtils.copyProperties(main,nowMain);
  196 + nowMain.setFirstWorkSignInTime(ConstDateUtil.dateAddition(startDate.toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getFirstWorkSignInTime())));
179 197 if (HAVE_SEGMENTATION.equals(ruleScheduling.getSecondFlag())) {
180   - main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime())));
181   - main.setSecondWorkSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondWorkSignInTime())));
  198 + nowMain.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(startDate.toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getFirstQuittingSignInTime())));
  199 + nowMain.setSecondWorkSignInTime(ConstDateUtil.dateAddition(startDate.toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getSecondWorkSignInTime())));
182 200 // 处理隔天
183 201 if (TOMORROW_YES.equals(ruleScheduling.getFirstSignInDayTomorrow())) {
184   - main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime())));
  202 + nowMain.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(startDate.plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getSecondQuittingSignInTime())));
185 203 } else {
186   - main.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getSecondQuittingSignInTime())));
  204 + nowMain.setSecondQuittingSignInTime(ConstDateUtil.dateAddition(startDate.toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getSecondQuittingSignInTime())));
187 205 }
188 206 } else {
189 207 // 处理隔天
190 208 if (TOMORROW_YES.equals(ruleScheduling.getFirstSignInDayTomorrow())) {
191   - main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime())));
  209 + nowMain.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(startDate.plusDays(1).toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getFirstQuittingSignInTime())));
192 210 } else {
193   - main.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(LocalDate.now().toString(), ConstDateUtil.formatDate("HH:mm:ss", main.getFirstQuittingSignInTime())));
  211 + nowMain.setFirstQuittingSignInTime(ConstDateUtil.dateAddition(startDate.toString(), ConstDateUtil.formatDate("HH:mm:ss", nowMain.getFirstQuittingSignInTime())));
194 212 }
195 213 }
196   - main.setWorkFlag(ruleScheduling.getId() == 0 ? FREE_FLAG : WORK_FLAG);
197   - attendanceMainService.updateByJobCodeTotalQuantity(vo, main);
  214 + nowMain.setWorkFlag(ruleScheduling.getId() == 0 ? FREE_FLAG : WORK_FLAG);
  215 + nowMain.setSchedulingDate(Date.from(startDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
  216 + mainList.add(nowMain);
198 217 }
199 218  
200 219 @Override
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/impl/RuleAttendanceMainServiceImpl.java
... ... @@ -6,7 +6,6 @@ import com.ruoyi.domain.RuleAttendanceMainHelp;
6 6 import com.ruoyi.mapper.RuleAttendanceMainMapper;
7 7 import com.ruoyi.pojo.vo.DeleteAttendanceVo;
8 8 import com.ruoyi.pojo.vo.PeopleRequestVo;
9   -import com.ruoyi.pojo.vo.PeopleResponseVo;
10 9 import com.ruoyi.pojo.vo.UpdateAttendanceVo;
11 10 import com.ruoyi.service.RuleAttendanceMainHelpService;
12 11 import com.ruoyi.service.RuleAttendanceMainService;
... ... @@ -28,8 +27,8 @@ public class RuleAttendanceMainServiceImpl extends ServiceImpl&lt;RuleAttendanceMai
28 27 private RuleAttendanceMainHelpService helpService;
29 28  
30 29 @Override
31   - public void updateByJobCodeTotalQuantity(UpdateAttendanceVo vo, RuleAttendanceMain main) {
32   - baseMapper.updateByIdTotalQuantity(vo, main);
  30 + public void updateByJobCodeTotalQuantity(UpdateAttendanceVo vo, List<RuleAttendanceMain> mainList) {
  31 + baseMapper.updateByIdTotalQuantity(vo, mainList);
33 32 }
34 33  
35 34 @Override
... ...
ruoyi-admin/src/main/resources/mapper/RuleAttendanceMainMapper.xml
... ... @@ -33,25 +33,27 @@
33 33 second_quitting_sign_in_time,second_sign_in_quitting_range,scheduling_date,work_flag
34 34 </sql>
35 35 <update id="updateByIdTotalQuantity">
36   - update rule_attendance_main set
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}
  36 + <foreach collection="mainList" item="main" index="index" separator=";">
  37 + update rule_attendance_main set
  38 + working_hour_plan = #{main.workingHourPlan},
  39 + working_hour_type = #{main.workingHourType},
  40 + first_work_sign_in_time = #{main.firstWorkSignInTime},
  41 + first_sign_in_working_range = #{main.firstSignInWorkingRange},
  42 + first_quitting_sign_in_time = #{main.firstQuittingSignInTime},
  43 + first_sign_in_quitting_range = #{main.firstSignInQuittingRange},
  44 + sign_in_time_out_range = #{main.signInTimeOutRange},
  45 + second_work_sign_in_time = #{main.secondWorkSignInTime},
  46 + second_sign_in_working_range = #{main.secondSignInWorkingRange},
  47 + second_quitting_sign_in_time = #{main.secondQuittingSignInTime},
  48 + second_sign_in_quitting_range = #{main.secondSignInQuittingRange},
  49 + work_flag = #{main.workFlag}
49 50 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 &gt;= #{vo.startDate} and scheduling_date &lt;= #{vo.endDate}
  51 + job_code IN
  52 + <foreach collection="vo.jobCode" index="index" item="item" open="(" close=")" separator=",">
  53 + #{item}
  54 + </foreach>
  55 + and scheduling_date = #{main.schedulingDate}
  56 + </foreach>
55 57 </update>
56 58 <delete id="deleteByJobCodeTotalRecord">
57 59 delete from rule_attendance_main
... ...