Commit 41a7284a733a0bef263c18af6ae5c51d18bd8ddf

Authored by guzijian
1 parent b0681714

fix: 更新文件

Showing 70 changed files with 2246 additions and 675 deletions
ruoyi-admin/pom.xml
@@ -16,6 +16,12 @@ @@ -16,6 +16,12 @@
16 </description> 16 </description>
17 17
18 <dependencies> 18 <dependencies>
  19 + <!-- 邮箱starter依赖-->
  20 + <dependency>
  21 + <groupId>org.springframework.boot</groupId>
  22 + <artifactId>spring-boot-starter-mail</artifactId>
  23 + </dependency>
  24 + <!-- hutool工具包 -->
19 <dependency> 25 <dependency>
20 <groupId>cn.hutool</groupId> 26 <groupId>cn.hutool</groupId>
21 <artifactId>hutool-all</artifactId> 27 <artifactId>hutool-all</artifactId>
ruoyi-admin/src/main/java/com/ruoyi/common/ConstEquipmentProperties.java
@@ -29,10 +29,12 @@ public interface ConstEquipmentProperties { @@ -29,10 +29,12 @@ public interface ConstEquipmentProperties {
29 * 设备脱机 29 * 设备脱机
30 */ 30 */
31 String DEVICE_OFFLINE = "脱机"; 31 String DEVICE_OFFLINE = "脱机";
  32 + Integer DEVICE_OFFLINE_NUM = 2;
32 /** 33 /**
33 * 设备在线 34 * 设备在线
34 */ 35 */
35 String DEVICE_ONLINE = "在线"; 36 String DEVICE_ONLINE = "在线";
  37 + Integer DEVICE_ONLINE_NUM = 1;
36 /** 38 /**
37 * 脱机判断5分钟 39 * 脱机判断5分钟
38 */ 40 */
ruoyi-admin/src/main/java/com/ruoyi/common/RuleSchedulingProperties.java 0 → 100644
  1 +package com.ruoyi.common;
  2 +
  3 +/**
  4 + * @author 20412
  5 + */
  6 +public interface RuleSchedulingProperties {
  7 + /**
  8 + * 无分段
  9 + */
  10 + Integer HAVE_SEGMENTATION = 2;
  11 + /**
  12 + * 有分段
  13 + */
  14 + Integer NO_SEGMENTATION = 1;
  15 +
  16 + /**
  17 + * 有隔天
  18 + */
  19 + Integer TOMORROW_YES = 2;
  20 + /**
  21 + * 有隔天
  22 + */
  23 + String TOMORROW_YES_STRING = "-隔天";
  24 + /**
  25 + * 无隔天
  26 + */
  27 + Integer TOMORROW_NO = 1;
  28 + String TOMORROW_NO_STRING = "-";
  29 +
  30 + /**
  31 + * 工时制
  32 + */
  33 + String WORK_HOUR_PLAN_NORMAL_STRING = "标准工时制";
  34 + String WORK_HOUR_PLAN_COMPREHENSIVE_STRING = "综合工时制";
  35 + String WORK_HOUR_PLAN_DYNAMIC_STRING = "不定时工时制";
  36 +
  37 + Integer WORK_HOUR_PLAN_NORMAL = 0;
  38 + Integer WORK_HOUR_PLAN_COMPREHENSIVE = 1;
  39 + Integer WORK_HOUR_PLAN_DYNAMIC = 2;
  40 +
  41 + /**
  42 + * 工时类型
  43 + */
  44 + String WORK_HOUR_TYPE_ELASTIC_STRING = "弹性工时";
  45 + String WORK_HOUR_TYPE_FIXED_STRING = "固定工时";
  46 +
  47 + Integer WORK_HOUR_TYPE_ELASTIC = 0;
  48 + Integer WORK_HOUR_TYPE_FIXED = 1;
  49 +
  50 +}
ruoyi-admin/src/main/java/com/ruoyi/common/cache/NowSchedulingCache.java
@@ -2,8 +2,11 @@ package com.ruoyi.common.cache; @@ -2,8 +2,11 @@ package com.ruoyi.common.cache;
2 2
3 import cn.hutool.core.collection.CollectionUtil; 3 import cn.hutool.core.collection.CollectionUtil;
4 import com.ruoyi.driver.mapper.DriverSchedulingMapper; 4 import com.ruoyi.driver.mapper.DriverSchedulingMapper;
  5 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  6 +import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
5 import com.ruoyi.in.domain.SignIn; 7 import com.ruoyi.in.domain.SignIn;
6 -import com.ruoyi.pojo.entity.DriverScheduling; 8 +import com.ruoyi.domain.DriverScheduling;
  9 +import com.ruoyi.service.ThreadJobService;
7 import com.ruoyi.utils.ConstDateUtil; 10 import com.ruoyi.utils.ConstDateUtil;
8 import org.slf4j.Logger; 11 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 12 import org.slf4j.LoggerFactory;
@@ -20,10 +23,11 @@ public class NowSchedulingCache { @@ -20,10 +23,11 @@ public class NowSchedulingCache {
20 * 当天初版排班 23 * 当天初版排班
21 */ 24 */
22 private static ConcurrentHashMap<String, Map<String, List<DriverScheduling>>> cacheNowDayScheduling = new ConcurrentHashMap<>(); 25 private static ConcurrentHashMap<String, Map<String, List<DriverScheduling>>> cacheNowDayScheduling = new ConcurrentHashMap<>();
  26 + private IErrorJobcodeService errorJobcodeService;
23 27
24 -  
25 - public NowSchedulingCache(DriverSchedulingMapper driverSchedulingMapper) { 28 + public NowSchedulingCache(DriverSchedulingMapper driverSchedulingMapper,IErrorJobcodeService errorJobcodeService) {
26 this.schedulingMapper = driverSchedulingMapper; 29 this.schedulingMapper = driverSchedulingMapper;
  30 + this.errorJobcodeService = errorJobcodeService;
27 log.info("项目启动加载中获取排班表-----"); 31 log.info("项目启动加载中获取排班表-----");
28 cacheNowDaySchedulingInit(); 32 cacheNowDaySchedulingInit();
29 } 33 }
@@ -34,12 +38,18 @@ public class NowSchedulingCache { @@ -34,12 +38,18 @@ public class NowSchedulingCache {
34 Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800); 38 Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800);
35 String date = ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(i)); 39 String date = ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(i));
36 List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null); 40 List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null);
37 - handleResultMap(resultMap, schedulingList); 41 + handlerResultMap(resultMap, schedulingList);
  42 + // 获取错误排班
  43 + List<ErrorJobcode> errorScheduling = ThreadJobService.getErrorScheduling(resultMap);
  44 + // 插入错误排班
  45 + errorJobcodeService.insertBatchErrorJobcode(errorScheduling);
  46 + // 更新缓存
38 cacheNowDayScheduling.put(date, resultMap); 47 cacheNowDayScheduling.put(date, resultMap);
39 } 48 }
40 } 49 }
41 50
42 - private void handleResultMap(Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) { 51 +
  52 + public static void handlerResultMap(Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) {
43 for (DriverScheduling scheduling : schedulingList) { 53 for (DriverScheduling scheduling : schedulingList) {
44 List<DriverScheduling> list = resultMap.get(scheduling.getJobCode()); 54 List<DriverScheduling> list = resultMap.get(scheduling.getJobCode());
45 if (CollectionUtil.isEmpty(list)) { 55 if (CollectionUtil.isEmpty(list)) {
@@ -94,13 +104,16 @@ public class NowSchedulingCache { @@ -94,13 +104,16 @@ public class NowSchedulingCache {
94 * @param signIn 104 * @param signIn
95 */ 105 */
96 public void updateCacheByJobCode(String key, Integer index, SignIn signIn) { 106 public void updateCacheByJobCode(String key, Integer index, SignIn signIn) {
97 - DriverScheduling scheduling = cacheNowDayScheduling.get(key).get(signIn.getJobCode()).get(index);  
98 - scheduling.setSignInId(signIn.getId());  
99 - scheduling.setRemark(signIn.getRemark());  
100 - scheduling.setExType(signIn.getExType());  
101 - scheduling.setSignTime(signIn.getCreateTime());  
102 - scheduling.setSignType(signIn.getType());  
103 - scheduling.setAlcoholFlag(signIn.getAlcoholFlag());  
104 - scheduling.setAlcoholIntake(signIn.getAlcoholIntake()); 107 + if (key.equals(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(0)))
  108 + || key.equals(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(-1)))){
  109 + DriverScheduling scheduling = cacheNowDayScheduling.get(key).get(signIn.getJobCode()).get(index);
  110 + scheduling.setSignInId(signIn.getId());
  111 + scheduling.setRemark(signIn.getRemark());
  112 + scheduling.setExType(signIn.getExType());
  113 + scheduling.setSignTime(signIn.getCreateTime());
  114 + scheduling.setSignType(signIn.getType());
  115 + scheduling.setAlcoholFlag(signIn.getAlcoholFlag());
  116 + scheduling.setAlcoholIntake(signIn.getAlcoholIntake());
  117 + }
105 } 118 }
106 } 119 }
ruoyi-admin/src/main/java/com/ruoyi/common/cache/SchedulingCache.java
1 package com.ruoyi.common.cache; 1 package com.ruoyi.common.cache;
2 2
3 -import cn.hutool.core.collection.CollectionUtil;  
4 -import com.ruoyi.pojo.entity.DriverScheduling;  
5 import com.ruoyi.pojo.response.ResponseSchedulingDto; 3 import com.ruoyi.pojo.response.ResponseSchedulingDto;
6 -import com.ruoyi.service.SchedulingService;  
7 import com.ruoyi.utils.ConstDateUtil; 4 import com.ruoyi.utils.ConstDateUtil;
8 import org.slf4j.Logger; 5 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 6 import org.slf4j.LoggerFactory;
@@ -44,8 +41,8 @@ public class SchedulingCache { @@ -44,8 +41,8 @@ public class SchedulingCache {
44 41
45 42
46 public SchedulingCache() { 43 public SchedulingCache() {
47 - log.info("项目启动加载中-----");  
48 - schedulingInit(); 44 + log.info("项目启动加载中获取实时班次-----");
  45 +// schedulingInit();
49 } 46 }
50 47
51 48
ruoyi-admin/src/main/java/com/ruoyi/common/global/GlobalDriverInfoCache.java deleted 100644 → 0
1 -package com.ruoyi.common.global;  
2 -  
3 -import com.ruoyi.in.domain.SignIn;  
4 -import com.ruoyi.pojo.domain.SignInExpand;  
5 -import org.springframework.stereotype.Component;  
6 -  
7 -import java.util.*;  
8 -import java.util.concurrent.ConcurrentHashMap;  
9 -  
10 -/**  
11 - * @author 20412  
12 - */  
13 -@Component  
14 -public class GlobalDriverInfoCache {  
15 - /**  
16 - * 签到次数汇总  
17 - */  
18 - private final ConcurrentHashMap<String, List<SignInExpand>> userCurrentMap = new ConcurrentHashMap<>();  
19 -  
20 - /**  
21 - * 驾驶员签到成功  
22 - *  
23 - * @param signIn  
24 - */  
25 - public void putDriverSignInSuccess(SignIn signIn) {  
26 - ConcurrentHashMap<String, List<SignInExpand>> userCurrentMap = null;  
27 - if (Objects.isNull(userCurrentMap.get(signIn.getJobCode()))) {  
28 - SignInExpand signInExpand = new SignInExpand();  
29 - signInExpand.setJobCode(signIn.getJobCode());  
30 - signInExpand.setSignCount(signIn.getId() + ",");  
31 - userCurrentMap.put(signIn.getJobCode(), new ArrayList<>(Arrays.asList(signInExpand)));  
32 - } else {  
33 - SignInExpand signInExpand = new SignInExpand();  
34 - signInExpand.setJobCode(signIn.getJobCode());  
35 - signInExpand.setSignCount(signInExpand.getSignCount() + signIn.getId() + ",");  
36 - userCurrentMap.get(signIn.getJobCode()).add(signInExpand);  
37 - }  
38 - }  
39 -  
40 - }  
41 -  
42 -  
ruoyi-admin/src/main/java/com/ruoyi/controller/AttendanceController.java 0 → 100644
  1 +package com.ruoyi.controller;
  2 +
  3 +import com.ruoyi.common.global.Result;
  4 +import com.ruoyi.pojo.vo.SchedulingRequestVo;
  5 +import com.ruoyi.service.AttendanceService;
  6 +import io.swagger.annotations.Api;
  7 +import io.swagger.annotations.ApiOperation;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.web.bind.annotation.*;
  10 +
  11 +/**
  12 + * 考勤表controller
  13 + * @author 20412
  14 + */
  15 +@RestController
  16 +@RequestMapping("/attendance")
  17 +@Api(tags = "考勤管理")
  18 +public class AttendanceController {
  19 +
  20 + @Autowired
  21 + private AttendanceService attendanceService;
  22 +
  23 +
  24 + /**
  25 + * 获取指定人员信息
  26 + */
  27 + @ApiOperation("获取人员信息")
  28 + @GetMapping("/peoples")
  29 + public Result<?> getPeopleInfo(@RequestParam(value = "id",required = false) Long id){
  30 + return Result.OK(attendanceService.getDriverInfo(id));
  31 + }
  32 +
  33 + /**
  34 + * 获取排班
  35 + */
  36 + @ApiOperation("获取排班")
  37 + @GetMapping("/scheduling/list")
  38 + public Result<?> getSchedulingList(@ModelAttribute SchedulingRequestVo vo){
  39 + return Result.OK(attendanceService.getSchedulingList(vo));
  40 + }
  41 +}
ruoyi-admin/src/main/java/com/ruoyi/controller/ReportController.java
@@ -50,7 +50,6 @@ public class ReportController { @@ -50,7 +50,6 @@ public class ReportController {
50 return AjaxResult.success(reportService.getReportDetail(requestVo, response)); 50 return AjaxResult.success(reportService.getReportDetail(requestVo, response));
51 } 51 }
52 52
53 -  
54 @ApiOperation("异常报表集合查询") 53 @ApiOperation("异常报表集合查询")
55 @GetMapping("/error/list") 54 @GetMapping("/error/list")
56 public AjaxResult getErrorList(@ApiParam @ModelAttribute ReportErrorRequestVo request) { 55 public AjaxResult getErrorList(@ApiParam @ModelAttribute ReportErrorRequestVo request) {
ruoyi-admin/src/main/java/com/ruoyi/pojo/entity/DriverScheduling.java renamed to ruoyi-admin/src/main/java/com/ruoyi/domain/DriverScheduling.java
1 -package com.ruoyi.pojo.entity; 1 +package com.ruoyi.domain;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import org.apache.poi.hpsf.Decimal; 4 import org.apache.poi.hpsf.Decimal;
ruoyi-admin/src/main/java/com/ruoyi/pojo/domain/EquipmentDriverExpand.java renamed to ruoyi-admin/src/main/java/com/ruoyi/domain/EquipmentDriverExpand.java
1 -package com.ruoyi.pojo.domain; 1 +package com.ruoyi.domain;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
ruoyi-admin/src/main/java/com/ruoyi/domain/RuleNumSetting.java 0 → 100644
  1 +package com.ruoyi.domain;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * 排班设置
  7 + * @author 20412
  8 + */
  9 +@Data
  10 +public class RuleNumSetting {
  11 +}
ruoyi-admin/src/main/java/com/ruoyi/pojo/domain/SignInExpand.java renamed to ruoyi-admin/src/main/java/com/ruoyi/domain/SignInExpand.java
1 -package com.ruoyi.pojo.domain; 1 +package com.ruoyi.domain;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import org.springframework.format.annotation.DateTimeFormat; 4 import org.springframework.format.annotation.DateTimeFormat;
ruoyi-admin/src/main/java/com/ruoyi/driver/mapper/DriverMapper.java
@@ -7,6 +7,7 @@ import com.ruoyi.driver.domain.Driver; @@ -7,6 +7,7 @@ import com.ruoyi.driver.domain.Driver;
7 import com.ruoyi.pojo.request.DriverRequestVo; 7 import com.ruoyi.pojo.request.DriverRequestVo;
8 import com.ruoyi.pojo.response.DriverResponseVo; 8 import com.ruoyi.pojo.response.DriverResponseVo;
9 import com.ruoyi.pojo.response.ResponseSchedulingDto; 9 import com.ruoyi.pojo.response.ResponseSchedulingDto;
  10 +import com.ruoyi.pojo.vo.PeopleResponseVo;
10 import org.apache.ibatis.annotations.Param; 11 import org.apache.ibatis.annotations.Param;
11 12
12 /** 13 /**
@@ -106,4 +107,17 @@ public interface DriverMapper @@ -106,4 +107,17 @@ public interface DriverMapper
106 void updateDriverInfoByJobCodes(@Param("drivers") List<Driver> drivers); 107 void updateDriverInfoByJobCodes(@Param("drivers") List<Driver> drivers);
107 108
108 void saveScheduling(@Param("responseSchedulingDto") List<ResponseSchedulingDto> responseSchedulingDto); 109 void saveScheduling(@Param("responseSchedulingDto") List<ResponseSchedulingDto> responseSchedulingDto);
  110 +
  111 + /**
  112 + * 获取已添加的考勤人员
  113 + * @param id
  114 + * @return
  115 + */
  116 + List<PeopleResponseVo> queryAttendanceInfoById(Long id);
  117 +
  118 + /**
  119 + * 获取所有可添加的考勤人员
  120 + * @return
  121 + */
  122 + List<PeopleResponseVo> queryAttendanceInfoAll();
109 } 123 }
ruoyi-admin/src/main/java/com/ruoyi/driver/mapper/DriverSchedulingMapper.java
1 package com.ruoyi.driver.mapper; 1 package com.ruoyi.driver.mapper;
2 2
3 -import com.ruoyi.pojo.entity.DriverScheduling;  
4 -import com.ruoyi.pojo.request.ReportViewRequestVo;  
5 -import com.ruoyi.pojo.response.ReportViewResponseVo;  
6 -import com.ruoyi.pojo.response.ResponseSchedulingDto; 3 +import com.ruoyi.domain.DriverScheduling;
7 import org.apache.ibatis.annotations.Param; 4 import org.apache.ibatis.annotations.Param;
8 5
9 import java.math.BigDecimal; 6 import java.math.BigDecimal;
@@ -16,7 +13,7 @@ import java.util.List; @@ -16,7 +13,7 @@ import java.util.List;
16 public interface DriverSchedulingMapper { 13 public interface DriverSchedulingMapper {
17 14
18 15
19 - void insertRoster(@Param("list") List<DriverScheduling> list); 16 + void insertRoster(List<DriverScheduling> list);
20 17
21 18
22 List<DriverScheduling> queryToDay(@Param("date") String date, @Param("name") String name,@Param("jobCode") String jobCode,@Param("lineName")String lineName ); 19 List<DriverScheduling> queryToDay(@Param("date") String date, @Param("name") String name,@Param("jobCode") String jobCode,@Param("lineName")String lineName );
ruoyi-admin/src/main/java/com/ruoyi/driver/service/impl/DriverServiceImpl.java
@@ -25,8 +25,8 @@ import com.ruoyi.equipment.mapper.EquipmentMapper; @@ -25,8 +25,8 @@ import com.ruoyi.equipment.mapper.EquipmentMapper;
25 import com.ruoyi.framework.config.ServerConfig; 25 import com.ruoyi.framework.config.ServerConfig;
26 import com.ruoyi.job.DriverJob; 26 import com.ruoyi.job.DriverJob;
27 import com.ruoyi.pojo.DriverSignRecommendation; 27 import com.ruoyi.pojo.DriverSignRecommendation;
28 -import com.ruoyi.pojo.domain.EquipmentDriverExpand;  
29 -import com.ruoyi.pojo.entity.DriverScheduling; 28 +import com.ruoyi.domain.EquipmentDriverExpand;
  29 +import com.ruoyi.domain.DriverScheduling;
30 import com.ruoyi.pojo.request.DriverRequestVo; 30 import com.ruoyi.pojo.request.DriverRequestVo;
31 import com.ruoyi.pojo.request.DriverSignInRequestVo; 31 import com.ruoyi.pojo.request.DriverSignInRequestVo;
32 import com.ruoyi.pojo.request.FaceUpdateReqVo; 32 import com.ruoyi.pojo.request.FaceUpdateReqVo;
@@ -150,16 +150,17 @@ public class DriverServiceImpl implements IDriverService { @@ -150,16 +150,17 @@ public class DriverServiceImpl implements IDriverService {
150 LocalDateTime signTime = ConstDateUtil.getLocalDateTimeByLongTime(timeMap.get(index).getTimestamps()); 150 LocalDateTime signTime = ConstDateUtil.getLocalDateTimeByLongTime(timeMap.get(index).getTimestamps());
151 long range = ChronoUnit.MINUTES.between(signTime, nowTime); 151 long range = ChronoUnit.MINUTES.between(signTime, nowTime);
152 // 如果当前记录靠近签退,但是未到签退小于合法范围 上一次记录未签到,则返回签到记录 152 // 如果当前记录靠近签退,但是未到签退小于合法范围 上一次记录未签到,则返回签到记录
153 - if (BC_TYPE_IN.equals(timeMap.get(index).getBcType())  
154 - && range < -60L  
155 - && Objects.isNull(timeMap.get(index).getSignInId())  
156 - && Objects.isNull(timeMap.get(index - 1).getSignInId())) {  
157 - // 定位上次操作  
158 - index = index - 1;  
159 - } 153 + if ( dto.size() > 1
  154 + && BC_TYPE_IN.equals(timeMap.get(index).getBcType())
  155 + && range < -60L
  156 + && Objects.isNull(timeMap.get(index).getSignInId())
  157 + && Objects.isNull(timeMap.get(index - 1).getSignInId())) {
  158 + // 定位上次操作
  159 + index = index - 1;
  160 + }
160 161
161 // 如果当前记录是异常的记录且还在目前还在签到范围内 162 // 如果当前记录是异常的记录且还在目前还在签到范围内
162 - if (!Objects.isNull(timeMap.get(index).getSignInId())) { 163 + if (!Objects.isNull(timeMap.get(index).getSignInId()) && dto.size() > 1) {
163 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(timeMap.get(index).getTimestamps()); 164 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(timeMap.get(index).getTimestamps());
164 long nowBetween = ChronoUnit.MINUTES.between(endTime, nowTime); 165 long nowBetween = ChronoUnit.MINUTES.between(endTime, nowTime);
165 // 如果当前有效范围内签到记录无效如酒精测试异常则重复当前操作 166 // 如果当前有效范围内签到记录无效如酒精测试异常则重复当前操作
@@ -328,7 +329,7 @@ public class DriverServiceImpl implements IDriverService { @@ -328,7 +329,7 @@ public class DriverServiceImpl implements IDriverService {
328 // 更新信息 329 // 更新信息
329 for (Driver item : drivers) { 330 for (Driver item : drivers) {
330 dto = schedulingService.queryScheduling(item.getJobCode(), now); 331 dto = schedulingService.queryScheduling(item.getJobCode(), now);
331 - DriverResponseVo vo = handleRecommendation(item, now, dto, schedulingFlag, alcoholFlag); 332 + DriverResponseVo vo = handlerRecommendation(item, now, dto, schedulingFlag, alcoholFlag);
332 // 无排班 333 // 无排班
333 if (Objects.isNull(vo)) { 334 if (Objects.isNull(vo)) {
334 vos.add(DriverResponseVo.createDriverResponseVo(null, item, null, false, false, "", "", "")); 335 vos.add(DriverResponseVo.createDriverResponseVo(null, item, null, false, false, "", "", ""));
@@ -339,7 +340,7 @@ public class DriverServiceImpl implements IDriverService { @@ -339,7 +340,7 @@ public class DriverServiceImpl implements IDriverService {
339 return vos; 340 return vos;
340 } 341 }
341 342
342 - private DriverResponseVo handleRecommendation(Driver driver, Long now, List<DriverScheduling> dto, Boolean schedulingFlag, Boolean alcoholFlag) { 343 + private DriverResponseVo handlerRecommendation(Driver driver, Long now, List<DriverScheduling> dto, Boolean schedulingFlag, Boolean alcoholFlag) {
343 DriverResponseVo vo = null; 344 DriverResponseVo vo = null;
344 // 给出计划操作 345 // 给出计划操作
345 if (!CollectionUtil.isEmpty(dto)) { 346 if (!CollectionUtil.isEmpty(dto)) {
ruoyi-admin/src/main/java/com/ruoyi/schedulingAssociateNum/controller/RuleNumSchedulingController.java renamed to ruoyi-admin/src/main/java/com/ruoyi/email/controller/EmailConfigController.java
1 -package com.ruoyi.schedulingAssociateNum.controller; 1 +package com.ruoyi.email.controller;
2 2
3 import java.util.List; 3 import java.util.List;
4 import javax.servlet.http.HttpServletResponse; 4 import javax.servlet.http.HttpServletResponse;
5 import org.springframework.security.access.prepost.PreAuthorize; 5 import org.springframework.security.access.prepost.PreAuthorize;
6 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.validation.annotation.Validated;
7 import org.springframework.web.bind.annotation.GetMapping; 8 import org.springframework.web.bind.annotation.GetMapping;
8 import org.springframework.web.bind.annotation.PostMapping; 9 import org.springframework.web.bind.annotation.PostMapping;
9 import org.springframework.web.bind.annotation.PutMapping; 10 import org.springframework.web.bind.annotation.PutMapping;
@@ -16,89 +17,94 @@ import com.ruoyi.common.annotation.Log; @@ -16,89 +17,94 @@ import com.ruoyi.common.annotation.Log;
16 import com.ruoyi.common.core.controller.BaseController; 17 import com.ruoyi.common.core.controller.BaseController;
17 import com.ruoyi.common.core.domain.AjaxResult; 18 import com.ruoyi.common.core.domain.AjaxResult;
18 import com.ruoyi.common.enums.BusinessType; 19 import com.ruoyi.common.enums.BusinessType;
19 -import com.ruoyi.schedulingAssociateNum.domain.RuleNumScheduling;  
20 -import com.ruoyi.schedulingAssociateNum.service.IRuleNumSchedulingService; 20 +import com.ruoyi.email.domain.EmailConfig;
  21 +import com.ruoyi.email.service.IEmailConfigService;
21 import com.ruoyi.common.utils.poi.ExcelUtil; 22 import com.ruoyi.common.utils.poi.ExcelUtil;
22 import com.ruoyi.common.core.page.TableDataInfo; 23 import com.ruoyi.common.core.page.TableDataInfo;
23 24
24 /** 25 /**
25 - * 排班规则和班次关联Controller 26 + * 邮箱配置Controller
26 * 27 *
27 - * @author 古自健  
28 - * @date 2023-08-07 28 + * @author guzijian
  29 + * @date 2023-08-24
29 */ 30 */
30 @RestController 31 @RestController
31 -@RequestMapping("/schedulingAssociateNum/schedulingAssociateNum")  
32 -public class RuleNumSchedulingController extends BaseController 32 +@RequestMapping("/email/email")
  33 +public class EmailConfigController extends BaseController
33 { 34 {
34 @Autowired 35 @Autowired
35 - private IRuleNumSchedulingService ruleNumSchedulingService; 36 + private IEmailConfigService emailConfigService;
36 37
37 /** 38 /**
38 - * 查询排班规则和班次关联列表 39 + * 查询邮箱配置列表
39 */ 40 */
40 - @PreAuthorize("@ss.hasPermi('schedulingAssociateNum:schedulingAssociateNum:list')") 41 + @PreAuthorize("@ss.hasPermi('email:email:list')")
41 @GetMapping("/list") 42 @GetMapping("/list")
42 - public TableDataInfo list(RuleNumScheduling ruleNumScheduling) 43 + public TableDataInfo list(EmailConfig emailConfig)
43 { 44 {
44 startPage(); 45 startPage();
45 - List<RuleNumScheduling> list = ruleNumSchedulingService.selectRuleNumSchedulingList(ruleNumScheduling); 46 + List<EmailConfig> list = emailConfigService.selectEmailConfigList(emailConfig);
46 return getDataTable(list); 47 return getDataTable(list);
47 } 48 }
48 49
49 /** 50 /**
50 - * 导出排班规则和班次关联列表 51 + * 导出邮箱配置列表
51 */ 52 */
52 - @PreAuthorize("@ss.hasPermi('schedulingAssociateNum:schedulingAssociateNum:export')")  
53 - @Log(title = "排班规则和班次关联", businessType = BusinessType.EXPORT) 53 + @PreAuthorize("@ss.hasPermi('email:email:export')")
  54 + @Log(title = "邮箱配置", businessType = BusinessType.EXPORT)
54 @PostMapping("/export") 55 @PostMapping("/export")
55 - public void export(HttpServletResponse response, RuleNumScheduling ruleNumScheduling) 56 + public void export(HttpServletResponse response, EmailConfig emailConfig)
56 { 57 {
57 - List<RuleNumScheduling> list = ruleNumSchedulingService.selectRuleNumSchedulingList(ruleNumScheduling);  
58 - ExcelUtil<RuleNumScheduling> util = new ExcelUtil<RuleNumScheduling>(RuleNumScheduling.class);  
59 - util.exportExcel(response, list, "排班规则和班次关联数据"); 58 + List<EmailConfig> list = emailConfigService.selectEmailConfigList(emailConfig);
  59 + ExcelUtil<EmailConfig> util = new ExcelUtil<EmailConfig>(EmailConfig.class);
  60 + util.exportExcel(response, list, "邮箱配置数据");
  61 + }
  62 +
  63 + @GetMapping("/getAllEmail")
  64 + public AjaxResult getAllEmail(){
  65 + return AjaxResult.success(emailConfigService.selectEmailConfigList(new EmailConfig()));
60 } 66 }
61 67
62 /** 68 /**
63 - * 获取排班规则和班次关联详细信息 69 + * 获取邮箱配置详细信息
64 */ 70 */
65 - @PreAuthorize("@ss.hasPermi('schedulingAssociateNum:schedulingAssociateNum:query')") 71 + @PreAuthorize("@ss.hasPermi('email:email:query')")
66 @GetMapping(value = "/{id}") 72 @GetMapping(value = "/{id}")
67 public AjaxResult getInfo(@PathVariable("id") Long id) 73 public AjaxResult getInfo(@PathVariable("id") Long id)
68 { 74 {
69 - return success(ruleNumSchedulingService.selectRuleNumSchedulingById(id)); 75 + return success(emailConfigService.selectEmailConfigById(id));
70 } 76 }
71 77
72 /** 78 /**
73 - * 新增排班规则和班次关联 79 + * 新增邮箱配置
74 */ 80 */
75 - @PreAuthorize("@ss.hasPermi('schedulingAssociateNum:schedulingAssociateNum:add')")  
76 - @Log(title = "排班规则和班次关联", businessType = BusinessType.INSERT) 81 + @PreAuthorize("@ss.hasPermi('email:email:add')")
  82 + @Log(title = "邮箱配置", businessType = BusinessType.INSERT)
77 @PostMapping 83 @PostMapping
78 - public AjaxResult add(@RequestBody RuleNumScheduling ruleNumScheduling) 84 + public AjaxResult add(@RequestBody @Validated EmailConfig emailConfig)
79 { 85 {
80 - return toAjax(ruleNumSchedulingService.insertRuleNumScheduling(ruleNumScheduling)); 86 + return toAjax(emailConfigService.insertEmailConfig(emailConfig));
81 } 87 }
82 88
83 /** 89 /**
84 - * 修改排班规则和班次关联 90 + * 修改邮箱配置
85 */ 91 */
86 - @PreAuthorize("@ss.hasPermi('schedulingAssociateNum:schedulingAssociateNum:edit')")  
87 - @Log(title = "排班规则和班次关联", businessType = BusinessType.UPDATE) 92 + @PreAuthorize("@ss.hasPermi('email:email:edit')")
  93 + @Log(title = "邮箱配置", businessType = BusinessType.UPDATE)
88 @PutMapping 94 @PutMapping
89 - public AjaxResult edit(@RequestBody RuleNumScheduling ruleNumScheduling) 95 + public AjaxResult edit(@RequestBody EmailConfig emailConfig)
90 { 96 {
91 - return toAjax(ruleNumSchedulingService.updateRuleNumScheduling(ruleNumScheduling)); 97 + return toAjax(emailConfigService.updateEmailConfig(emailConfig));
92 } 98 }
93 99
94 /** 100 /**
95 - * 删除排班规则和班次关联 101 + * 删除邮箱配置
96 */ 102 */
97 - @PreAuthorize("@ss.hasPermi('schedulingAssociateNum:schedulingAssociateNum:remove')")  
98 - @Log(title = "排班规则和班次关联", businessType = BusinessType.DELETE)  
99 - @DeleteMapping("/{ids}")  
100 - public AjaxResult remove(@PathVariable Long[] ids) 103 + @PreAuthorize("@ss.hasPermi('email:email:remove')")
  104 + @Log(title = "邮箱配置", businessType = BusinessType.DELETE)
  105 + @DeleteMapping("/{id}")
  106 + public AjaxResult remove(@PathVariable Long id)
101 { 107 {
102 - return toAjax(ruleNumSchedulingService.deleteRuleNumSchedulingByIds(ids)); 108 + return toAjax(emailConfigService.deleteEmailConfigById(id));
103 } 109 }
104 } 110 }
ruoyi-admin/src/main/java/com/ruoyi/email/domain/EmailConfig.java 0 → 100644
  1 +package com.ruoyi.email.domain;
  2 +
  3 +import lombok.Data;
  4 +import org.apache.commons.lang3.builder.ToStringBuilder;
  5 +import org.apache.commons.lang3.builder.ToStringStyle;
  6 +import com.ruoyi.common.annotation.Excel;
  7 +import com.ruoyi.common.core.domain.BaseEntity;
  8 +
  9 +import javax.validation.constraints.Email;
  10 +
  11 +/**
  12 + * 邮箱配置对象 email_config
  13 + *
  14 + * @author guzijian
  15 + * @date 2023-08-24
  16 + */
  17 +@Data
  18 +public class EmailConfig extends BaseEntity
  19 +{
  20 + private static final long serialVersionUID = 1L;
  21 +
  22 + /** 主键 */
  23 + private Long id;
  24 +
  25 + /** 姓名 */
  26 + @Excel(name = "姓名")
  27 + private String name;
  28 +
  29 + /** 邮箱 */
  30 + @Excel(name = "邮箱")
  31 + @Email(message = "请输入正确的邮箱")
  32 + private String email;
  33 +
  34 + /** 排序 */
  35 + @Excel(name = "排序")
  36 + private Long sort;
  37 + /**
  38 + * 类型 0 收件人 1 抄送人 2 未启用
  39 + */
  40 + private Integer type;
  41 +
  42 + /**
  43 + * 抄送人
  44 + */
  45 + private String parentId;
  46 +
  47 +}
ruoyi-admin/src/main/java/com/ruoyi/schedulingAssociateNum/mapper/RuleNumSchedulingMapper.java renamed to ruoyi-admin/src/main/java/com/ruoyi/email/mapper/EmailConfigMapper.java
1 -package com.ruoyi.schedulingAssociateNum.mapper; 1 +package com.ruoyi.email.mapper;
2 2
3 import java.util.List; 3 import java.util.List;
4 -import com.ruoyi.schedulingAssociateNum.domain.RuleNumScheduling; 4 +import com.ruoyi.email.domain.EmailConfig;
  5 +import org.apache.ibatis.annotations.Param;
5 6
6 /** 7 /**
7 - * 排班规则和班次关联Mapper接口 8 + * 邮箱配置Mapper接口
8 * 9 *
9 - * @author 古自健  
10 - * @date 2023-08-07 10 + * @author guzijian
  11 + * @date 2023-08-24
11 */ 12 */
12 -public interface RuleNumSchedulingMapper 13 +public interface EmailConfigMapper
13 { 14 {
14 /** 15 /**
15 - * 查询排班规则和班次关联 16 + * 查询邮箱配置
16 * 17 *
17 - * @param id 排班规则和班次关联主键  
18 - * @return 排班规则和班次关联 18 + * @param id 邮箱配置主键
  19 + * @return 邮箱配置
19 */ 20 */
20 - public RuleNumScheduling selectRuleNumSchedulingById(Long id); 21 + public EmailConfig selectEmailConfigById(Long id);
21 22
22 /** 23 /**
23 - * 查询排班规则和班次关联列表 24 + * 查询邮箱配置列表
24 * 25 *
25 - * @param ruleNumScheduling 排班规则和班次关联  
26 - * @return 排班规则和班次关联集合 26 + * @param emailConfig 邮箱配置
  27 + * @return 邮箱配置集合
27 */ 28 */
28 - public List<RuleNumScheduling> selectRuleNumSchedulingList(RuleNumScheduling ruleNumScheduling); 29 + public List<EmailConfig> selectEmailConfigList(EmailConfig emailConfig);
29 30
30 /** 31 /**
31 - * 新增排班规则和班次关联 32 + * 新增邮箱配置
32 * 33 *
33 - * @param ruleNumScheduling 排班规则和班次关联 34 + * @param emailConfig 邮箱配置
34 * @return 结果 35 * @return 结果
35 */ 36 */
36 - public int insertRuleNumScheduling(RuleNumScheduling ruleNumScheduling); 37 + public int insertEmailConfig(EmailConfig emailConfig);
37 38
38 /** 39 /**
39 - * 修改排班规则和班次关联 40 + * 修改邮箱配置
40 * 41 *
41 - * @param ruleNumScheduling 排班规则和班次关联 42 + * @param emailConfig 邮箱配置
42 * @return 结果 43 * @return 结果
43 */ 44 */
44 - public int updateRuleNumScheduling(RuleNumScheduling ruleNumScheduling); 45 + public int updateEmailConfig(EmailConfig emailConfig);
45 46
46 /** 47 /**
47 - * 删除排班规则和班次关联 48 + * 删除邮箱配置
48 * 49 *
49 - * @param id 排班规则和班次关联主键 50 + * @param id 邮箱配置主键
50 * @return 结果 51 * @return 结果
51 */ 52 */
52 - public int deleteRuleNumSchedulingById(Long id); 53 + public int deleteEmailConfigById(Long id);
53 54
54 /** 55 /**
55 - * 批量删除排班规则和班次关联 56 + * 批量删除邮箱配置
56 * 57 *
57 * @param ids 需要删除的数据主键集合 58 * @param ids 需要删除的数据主键集合
58 * @return 结果 59 * @return 结果
59 */ 60 */
60 - public int deleteRuleNumSchedulingByIds(Long[] ids); 61 + public int deleteEmailConfigByIds(Long[] ids);
  62 +
  63 + void updateEmailConfigByEmails(@Param("ids") List<String> ids, @Param("config") EmailConfig emailConfig);
  64 +
  65 + void resetEmailConfigByEmails(@Param("ids") List<String> emails,@Param("config") EmailConfig config);
  66 +
  67 + List<EmailConfig> selectRecipientsEmailConfigList();
  68 +
  69 + List<EmailConfig> selectEmailConfigListByIds(@Param("ids") List<Long> ids);
61 } 70 }
ruoyi-admin/src/main/java/com/ruoyi/schedulingAssociateNum/service/IRuleNumSchedulingService.java renamed to ruoyi-admin/src/main/java/com/ruoyi/email/service/IEmailConfigService.java
1 -package com.ruoyi.schedulingAssociateNum.service; 1 +package com.ruoyi.email.service;
2 2
3 import java.util.List; 3 import java.util.List;
4 -import com.ruoyi.schedulingAssociateNum.domain.RuleNumScheduling; 4 +import com.ruoyi.email.domain.EmailConfig;
5 5
6 /** 6 /**
7 - * 排班规则和班次关联Service接口 7 + * 邮箱配置Service接口
8 * 8 *
9 - * @author 古自健  
10 - * @date 2023-08-07 9 + * @author guzijian
  10 + * @date 2023-08-24
11 */ 11 */
12 -public interface IRuleNumSchedulingService 12 +public interface IEmailConfigService
13 { 13 {
14 /** 14 /**
15 - * 查询排班规则和班次关联 15 + * 查询邮箱配置
16 * 16 *
17 - * @param id 排班规则和班次关联主键  
18 - * @return 排班规则和班次关联 17 + * @param id 邮箱配置主键
  18 + * @return 邮箱配置
19 */ 19 */
20 - public RuleNumScheduling selectRuleNumSchedulingById(Long id); 20 + public EmailConfig selectEmailConfigById(Long id);
21 21
22 /** 22 /**
23 - * 查询排班规则和班次关联列表 23 + * 查询邮箱配置列表
24 * 24 *
25 - * @param ruleNumScheduling 排班规则和班次关联  
26 - * @return 排班规则和班次关联集合 25 + * @param emailConfig 邮箱配置
  26 + * @return 邮箱配置集合
27 */ 27 */
28 - public List<RuleNumScheduling> selectRuleNumSchedulingList(RuleNumScheduling ruleNumScheduling); 28 + public List<EmailConfig> selectEmailConfigList(EmailConfig emailConfig);
29 29
30 /** 30 /**
31 - * 新增排班规则和班次关联 31 + * 新增邮箱配置
32 * 32 *
33 - * @param ruleNumScheduling 排班规则和班次关联 33 + * @param emailConfig 邮箱配置
34 * @return 结果 34 * @return 结果
35 */ 35 */
36 - public int insertRuleNumScheduling(RuleNumScheduling ruleNumScheduling); 36 + public int insertEmailConfig(EmailConfig emailConfig);
37 37
38 /** 38 /**
39 - * 修改排班规则和班次关联 39 + * 修改邮箱配置
40 * 40 *
41 - * @param ruleNumScheduling 排班规则和班次关联 41 + * @param emailConfig 邮箱配置
42 * @return 结果 42 * @return 结果
43 */ 43 */
44 - public int updateRuleNumScheduling(RuleNumScheduling ruleNumScheduling); 44 + public int updateEmailConfig(EmailConfig emailConfig);
45 45
46 /** 46 /**
47 - * 批量删除排班规则和班次关联 47 + * 批量删除邮箱配置
48 * 48 *
49 - * @param ids 需要删除的排班规则和班次关联主键集合 49 + * @param ids 需要删除的邮箱配置主键集合
50 * @return 结果 50 * @return 结果
51 */ 51 */
52 - public int deleteRuleNumSchedulingByIds(Long[] ids); 52 + public int deleteEmailConfigByIds(Long[] ids);
53 53
54 /** 54 /**
55 - * 删除排班规则和班次关联信息 55 + * 删除邮箱配置信息
56 * 56 *
57 - * @param id 排班规则和班次关联主键 57 + * @param id 邮箱配置主键
58 * @return 结果 58 * @return 结果
59 */ 59 */
60 - public int deleteRuleNumSchedulingById(Long id); 60 + public int deleteEmailConfigById(Long id);
  61 +
  62 + List<EmailConfig> selectRecipientsEmailConfigList();
  63 +
  64 + List<EmailConfig> selectEmailConfigListByIds(List<Long> collect);
61 } 65 }
ruoyi-admin/src/main/java/com/ruoyi/email/service/impl/EmailConfigServiceImpl.java 0 → 100644
  1 +package com.ruoyi.email.service.impl;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.Arrays;
  5 +import java.util.List;
  6 +import java.util.stream.Collectors;
  7 +
  8 +import cn.hutool.core.collection.CollectionUtil;
  9 +import org.apache.tomcat.util.buf.StringUtils;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.stereotype.Service;
  14 +import com.ruoyi.email.mapper.EmailConfigMapper;
  15 +import com.ruoyi.email.domain.EmailConfig;
  16 +import com.ruoyi.email.service.IEmailConfigService;
  17 +
  18 +/**
  19 + * 邮箱配置Service业务层处理
  20 + *
  21 + * @author guzijian
  22 + * @date 2023-08-24
  23 + */
  24 +@Service
  25 +public class EmailConfigServiceImpl implements IEmailConfigService {
  26 +
  27 + private static final Logger log = LoggerFactory.getLogger(EmailConfigServiceImpl.class);
  28 + @Autowired
  29 + private EmailConfigMapper emailConfigMapper;
  30 +
  31 + /**
  32 + * 查询邮箱配置
  33 + *
  34 + * @param id 邮箱配置主键
  35 + * @return 邮箱配置
  36 + */
  37 + @Override
  38 + public EmailConfig selectEmailConfigById(Long id) {
  39 + return emailConfigMapper.selectEmailConfigById(id);
  40 + }
  41 +
  42 + /**
  43 + * 查询邮箱配置列表
  44 + *
  45 + * @param emailConfig 邮箱配置
  46 + * @return 邮箱配置
  47 + */
  48 + @Override
  49 + public List<EmailConfig> selectEmailConfigList(EmailConfig emailConfig) {
  50 + return emailConfigMapper.selectEmailConfigList(emailConfig);
  51 + }
  52 +
  53 + /**
  54 + * 新增邮箱配置
  55 + *
  56 + * @param emailConfig 邮箱配置
  57 + * @return 结果
  58 + */
  59 + @Override
  60 + public int insertEmailConfig(EmailConfig emailConfig) {
  61 + if (!emailConfig.getType().equals(2)) {
  62 + throw new RuntimeException("新增邮件只能设置为未启用!");
  63 + }
  64 + return emailConfigMapper.insertEmailConfig(emailConfig);
  65 + }
  66 +
  67 + /**
  68 + * 修改邮箱配置
  69 + *
  70 + * @param emailConfig 邮箱配置
  71 + * @return 结果
  72 + */
  73 + @Override
  74 + public int updateEmailConfig(EmailConfig emailConfig) {
  75 + // 类型为收件人
  76 + try {
  77 + if (emailConfig.getType().equals(0)) {
  78 + List<String> ids = handlerEmail(emailConfig);
  79 + updateEmailConfigByEmails(ids, emailConfig);
  80 + } else {
  81 + EmailConfig config = emailConfigMapper.selectEmailConfigById(emailConfig.getId());
  82 + if (config.getType().equals(0)) {
  83 + List<String> ids = handlerEmail(config);
  84 + resetEmailConfigByEmails(ids, emailConfig);
  85 + } else {
  86 + emailConfig.setType(config.getType());
  87 + emailConfigMapper.updateEmailConfig(emailConfig);
  88 + }
  89 + }
  90 + return 1;
  91 + } catch (Exception e) {
  92 + log.error(e.getMessage());
  93 + return 0;
  94 + }
  95 + }
  96 +
  97 + private void resetEmailConfigByEmails(List<String> ids, EmailConfig config) {
  98 + emailConfigMapper.resetEmailConfigByEmails(ids, config);
  99 + }
  100 +
  101 + private void updateEmailConfigByEmails(List<String> ids, EmailConfig emailConfig) {
  102 + emailConfigMapper.updateEmailConfigByEmails(ids, emailConfig);
  103 + }
  104 +
  105 + private List<String> handlerEmail(EmailConfig emailConfig) {
  106 + if (emailConfig.getParentId() != null) {
  107 + List<String> ids = Arrays.stream(emailConfig.getParentId().split(",")).distinct().collect(Collectors.toList());
  108 + emailConfig.setParentId(StringUtils.join(ids));
  109 + return ids;
  110 + }
  111 + return null;
  112 + }
  113 +
  114 + /**
  115 + * 批量删除邮箱配置
  116 + *
  117 + * @param ids 需要删除的邮箱配置主键
  118 + * @return 结果
  119 + */
  120 + @Override
  121 + public int deleteEmailConfigByIds(Long[] ids) {
  122 + throw new RuntimeException("禁止批量删除!!!!");
  123 + }
  124 +
  125 + /**
  126 + * 删除邮箱配置信息
  127 + *
  128 + * @param id 邮箱配置主键
  129 + * @return 结果
  130 + */
  131 + @Override
  132 + public int deleteEmailConfigById(Long id) {
  133 + EmailConfig emailConfig = selectEmailConfigById(id);
  134 + if (!emailConfig.getType().equals(2)) {
  135 + throw new RuntimeException("除了未启用不允许被删除");
  136 + }
  137 + return emailConfigMapper.deleteEmailConfigById(id);
  138 + }
  139 +
  140 + @Override
  141 + public List<EmailConfig> selectRecipientsEmailConfigList() {
  142 + return emailConfigMapper.selectRecipientsEmailConfigList();
  143 + }
  144 +
  145 + @Override
  146 + public List<EmailConfig> selectEmailConfigListByIds(List<Long> ids) {
  147 + return emailConfigMapper.selectEmailConfigListByIds(ids);
  148 + }
  149 +}
ruoyi-admin/src/main/java/com/ruoyi/equipment/controller/EquipmentController.java
@@ -3,18 +3,12 @@ package com.ruoyi.equipment.controller; @@ -3,18 +3,12 @@ package com.ruoyi.equipment.controller;
3 import java.util.List; 3 import java.util.List;
4 import javax.servlet.http.HttpServletResponse; 4 import javax.servlet.http.HttpServletResponse;
5 5
  6 +import com.ruoyi.equipment.domain.EquipmentLog;
6 import io.swagger.annotations.Api; 7 import io.swagger.annotations.Api;
7 import io.swagger.annotations.ApiOperation; 8 import io.swagger.annotations.ApiOperation;
8 import org.springframework.security.access.prepost.PreAuthorize; 9 import org.springframework.security.access.prepost.PreAuthorize;
9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
10 -import org.springframework.web.bind.annotation.GetMapping;  
11 -import org.springframework.web.bind.annotation.PostMapping;  
12 -import org.springframework.web.bind.annotation.PutMapping;  
13 -import org.springframework.web.bind.annotation.DeleteMapping;  
14 -import org.springframework.web.bind.annotation.PathVariable;  
15 -import org.springframework.web.bind.annotation.RequestBody;  
16 -import org.springframework.web.bind.annotation.RequestMapping;  
17 -import org.springframework.web.bind.annotation.RestController; 11 +import org.springframework.web.bind.annotation.*;
18 import com.ruoyi.common.annotation.Log; 12 import com.ruoyi.common.annotation.Log;
19 import com.ruoyi.common.core.controller.BaseController; 13 import com.ruoyi.common.core.controller.BaseController;
20 import com.ruoyi.common.core.domain.AjaxResult; 14 import com.ruoyi.common.core.domain.AjaxResult;
@@ -63,6 +57,17 @@ public class EquipmentController extends BaseController { @@ -63,6 +57,17 @@ public class EquipmentController extends BaseController {
63 } 57 }
64 58
65 /** 59 /**
  60 + * 查看日志
  61 + */
  62 + @GetMapping("/log")
  63 + @ApiOperation("设备日志")
  64 + public TableDataInfo log(@ModelAttribute EquipmentLog log){
  65 + startPage();
  66 + List<EquipmentLog> list = equipmentService.queryLog(log);
  67 + return getDataTable(list);
  68 + }
  69 +
  70 + /**
66 * 获取设备信息详细信息 71 * 获取设备信息详细信息
67 */ 72 */
68 // @PreAuthorize("@ss.hasPermi('equipment:equipment:query')") 73 // @PreAuthorize("@ss.hasPermi('equipment:equipment:query')")
ruoyi-admin/src/main/java/com/ruoyi/equipment/domain/EquipmentLog.java 0 → 100644
  1 +package com.ruoyi.equipment.domain;
  2 +
  3 +import com.ruoyi.common.annotation.Excel;
  4 +import lombok.Data;
  5 +
  6 +import java.util.Date;
  7 +
  8 +/**
  9 + * @author 20412
  10 + */
  11 +@Data
  12 +public class EquipmentLog {
  13 + private Long id;
  14 + @Excel(name = "设备号")
  15 + private String deviceId;
  16 + /**
  17 + * 掉线时间
  18 + */
  19 + @Excel(name = "掉线时间")
  20 + private Date offLineTime;
  21 + /**
  22 + * 恢复时间
  23 + */
  24 + @Excel(name = "恢复时间")
  25 + private Date recoveryTime;
  26 + @Excel(name = "是否恢复")
  27 + private Integer recoveryFlag;
  28 + @Excel(name = "备注")
  29 + private String remark;
  30 +}
ruoyi-admin/src/main/java/com/ruoyi/equipment/mapper/EquipmentMapper.java
@@ -4,7 +4,8 @@ import java.util.List; @@ -4,7 +4,8 @@ import java.util.List;
4 4
5 import com.ruoyi.driver.domain.Driver; 5 import com.ruoyi.driver.domain.Driver;
6 import com.ruoyi.equipment.domain.Equipment; 6 import com.ruoyi.equipment.domain.Equipment;
7 -import com.ruoyi.pojo.domain.EquipmentDriverExpand; 7 +import com.ruoyi.equipment.domain.EquipmentLog;
  8 +import com.ruoyi.domain.EquipmentDriverExpand;
8 import org.apache.ibatis.annotations.Param; 9 import org.apache.ibatis.annotations.Param;
9 10
10 /** 11 /**
@@ -75,4 +76,11 @@ public interface EquipmentMapper @@ -75,4 +76,11 @@ public interface EquipmentMapper
75 76
76 void updateEquipmentByDeviceId(Equipment equipment); 77 void updateEquipmentByDeviceId(Equipment equipment);
77 78
  79 + void deleteExRecord();
  80 +
  81 + void insertEquipmentOffLineLog(List<Equipment> list);
  82 +
  83 + void updateEquipmentLog(@Param("recoveryList") List<EquipmentLog> recoveryList);
  84 +
  85 + List<EquipmentLog> queryLog(EquipmentLog log);
78 } 86 }
ruoyi-admin/src/main/java/com/ruoyi/equipment/service/IEquipmentService.java
@@ -2,6 +2,7 @@ package com.ruoyi.equipment.service; @@ -2,6 +2,7 @@ package com.ruoyi.equipment.service;
2 2
3 import java.util.List; 3 import java.util.List;
4 import com.ruoyi.equipment.domain.Equipment; 4 import com.ruoyi.equipment.domain.Equipment;
  5 +import com.ruoyi.equipment.domain.EquipmentLog;
5 6
6 /** 7 /**
7 * 设备信息Service接口 8 * 设备信息Service接口
@@ -58,4 +59,6 @@ public interface IEquipmentService @@ -58,4 +59,6 @@ public interface IEquipmentService
58 * @return 结果 59 * @return 结果
59 */ 60 */
60 public int deleteEquipmentById(Long id); 61 public int deleteEquipmentById(Long id);
  62 +
  63 + List<EquipmentLog> queryLog(EquipmentLog log);
61 } 64 }
ruoyi-admin/src/main/java/com/ruoyi/equipment/service/impl/EquipmentServiceImpl.java
@@ -4,6 +4,7 @@ import java.util.List; @@ -4,6 +4,7 @@ import java.util.List;
4 import com.ruoyi.common.utils.DateUtils; 4 import com.ruoyi.common.utils.DateUtils;
5 import com.ruoyi.common.utils.SecurityUtils; 5 import com.ruoyi.common.utils.SecurityUtils;
6 import com.ruoyi.common.utils.StringUtils; 6 import com.ruoyi.common.utils.StringUtils;
  7 +import com.ruoyi.equipment.domain.EquipmentLog;
7 import com.ruoyi.pojo.equipment.EquipmentOnline; 8 import com.ruoyi.pojo.equipment.EquipmentOnline;
8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
@@ -106,4 +107,9 @@ public class EquipmentServiceImpl implements IEquipmentService @@ -106,4 +107,9 @@ public class EquipmentServiceImpl implements IEquipmentService
106 { 107 {
107 return equipmentMapper.deleteEquipmentById(id); 108 return equipmentMapper.deleteEquipmentById(id);
108 } 109 }
  110 +
  111 + @Override
  112 + public List<EquipmentLog> queryLog(EquipmentLog log) {
  113 + return equipmentMapper.queryLog(log);
  114 + }
109 } 115 }
ruoyi-admin/src/main/java/com/ruoyi/errorScheduling/controller/ErrorJobcodeController.java 0 → 100644
  1 +package com.ruoyi.errorScheduling.controller;
  2 +
  3 +import java.util.List;
  4 +import javax.servlet.http.HttpServletResponse;
  5 +
  6 +import com.ruoyi.pojo.vo.ErrorJobcodeVo;
  7 +import org.springframework.security.access.prepost.PreAuthorize;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.web.bind.annotation.GetMapping;
  10 +import org.springframework.web.bind.annotation.PostMapping;
  11 +import org.springframework.web.bind.annotation.PutMapping;
  12 +import org.springframework.web.bind.annotation.DeleteMapping;
  13 +import org.springframework.web.bind.annotation.PathVariable;
  14 +import org.springframework.web.bind.annotation.RequestBody;
  15 +import org.springframework.web.bind.annotation.RequestMapping;
  16 +import org.springframework.web.bind.annotation.RestController;
  17 +import com.ruoyi.common.annotation.Log;
  18 +import com.ruoyi.common.core.controller.BaseController;
  19 +import com.ruoyi.common.core.domain.AjaxResult;
  20 +import com.ruoyi.common.enums.BusinessType;
  21 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  22 +import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
  23 +import com.ruoyi.common.utils.poi.ExcelUtil;
  24 +import com.ruoyi.common.core.page.TableDataInfo;
  25 +
  26 +/**
  27 + * 问题排班Controller
  28 + *
  29 + * @author guzijian
  30 + * @date 2023-08-24
  31 + */
  32 +@RestController
  33 +@RequestMapping("/errorScheduling/errorScheduling")
  34 +public class ErrorJobcodeController extends BaseController
  35 +{
  36 + @Autowired
  37 + private IErrorJobcodeService errorJobcodeService;
  38 +
  39 + /**
  40 + * 查询问题排班列表
  41 + */
  42 + @PreAuthorize("@ss.hasPermi('errorScheduling:errorScheduling:list')")
  43 + @GetMapping("/list")
  44 + public TableDataInfo list(ErrorJobcodeVo errorJobcode)
  45 + {
  46 + startPage();
  47 + List<ErrorJobcodeVo> list = errorJobcodeService.selectErrorJobcodeList(errorJobcode);
  48 + return getDataTable(list);
  49 + }
  50 +
  51 + /**
  52 + * 导出问题排班列表
  53 + */
  54 + @PreAuthorize("@ss.hasPermi('errorScheduling:errorScheduling:export')")
  55 + @Log(title = "问题排班", businessType = BusinessType.EXPORT)
  56 + @PostMapping("/export")
  57 + public void export(HttpServletResponse response, ErrorJobcodeVo errorJobcode)
  58 + {
  59 + List<ErrorJobcodeVo> list = errorJobcodeService.selectErrorJobcodeList(errorJobcode);
  60 + ExcelUtil<ErrorJobcodeVo> util = new ExcelUtil<ErrorJobcodeVo>(ErrorJobcodeVo.class);
  61 + util.exportExcel(response, list, "问题排班数据");
  62 + }
  63 +
  64 + /**
  65 + * 获取问题排班详细信息
  66 + */
  67 + @PreAuthorize("@ss.hasPermi('errorScheduling:errorScheduling:query')")
  68 + @GetMapping(value = "/{id}")
  69 + public AjaxResult getInfo(@PathVariable("id") Long id)
  70 + {
  71 + return success(errorJobcodeService.selectErrorJobcodeById(id));
  72 + }
  73 +
  74 +// /**
  75 +// * 新增问题排班
  76 +// */
  77 +// @PreAuthorize("@ss.hasPermi('errorScheduling:errorScheduling:add')")
  78 +// @Log(title = "问题排班", businessType = BusinessType.INSERT)
  79 +// @PostMapping
  80 +// public AjaxResult add(@RequestBody ErrorJobcode errorJobcode)
  81 +// {
  82 +// return toAjax(errorJobcodeService.insertErrorJobcode(errorJobcode));
  83 +// }
  84 +
  85 + /**
  86 + * 修改问题排班
  87 + */
  88 + @PreAuthorize("@ss.hasPermi('errorScheduling:errorScheduling:edit')")
  89 + @Log(title = "问题排班", businessType = BusinessType.UPDATE)
  90 + @PutMapping
  91 + public AjaxResult edit(@RequestBody ErrorJobcode errorJobcode)
  92 + {
  93 + return toAjax(errorJobcodeService.updateErrorJobcode(errorJobcode));
  94 + }
  95 +
  96 + /**
  97 + * 删除问题排班
  98 + */
  99 + @PreAuthorize("@ss.hasPermi('errorScheduling:errorScheduling:remove')")
  100 + @Log(title = "问题排班", businessType = BusinessType.DELETE)
  101 + @DeleteMapping("/{ids}")
  102 + public AjaxResult remove(@PathVariable Long[] ids)
  103 + {
  104 + return toAjax(errorJobcodeService.deleteErrorJobcodeByIds(ids));
  105 + }
  106 +}
ruoyi-admin/src/main/java/com/ruoyi/errorScheduling/domain/ErrorJobcode.java 0 → 100644
  1 +package com.ruoyi.errorScheduling.domain;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonFormat;
  4 +import lombok.Data;
  5 +import org.apache.commons.lang3.builder.ToStringBuilder;
  6 +import org.apache.commons.lang3.builder.ToStringStyle;
  7 +import com.ruoyi.common.annotation.Excel;
  8 +import com.ruoyi.common.core.domain.BaseEntity;
  9 +import org.springframework.format.annotation.DateTimeFormat;
  10 +
  11 +import java.util.Date;
  12 +
  13 +/**
  14 + * 问题排班对象 error_jobcode
  15 + *
  16 + * @author guzijian
  17 + * @date 2023-08-24
  18 + */
  19 +@Data
  20 +public class ErrorJobcode extends BaseEntity
  21 +{
  22 + private static final long serialVersionUID = 1L;
  23 +
  24 + /** 主键 */
  25 + private Long id;
  26 +
  27 + /** 工号 */
  28 + @Excel(name = "工号")
  29 + private String jobCode;
  30 +
  31 + /** 姓名 */
  32 + @Excel(name = "姓名")
  33 + private String name;
  34 +
  35 + /**工种 */
  36 + @Excel(name = "工种")
  37 + private String posts;
  38 +
  39 + /** 部门 */
  40 + @Excel(name = "部门")
  41 + private String fleetName;
  42 +
  43 + /** 线路 */
  44 + @Excel(name = "线路")
  45 + private String lineName;
  46 +
  47 + /** 车辆自编号 */
  48 + @Excel(name = "车辆自编号")
  49 + private String nbbm;
  50 +
  51 + /** 路牌 */
  52 + @Excel(name = "路牌")
  53 + private String lpName;
  54 +
  55 + @Excel(name = "触发日期")
  56 + @DateTimeFormat(pattern = "yyyy-MM-dd")
  57 + @JsonFormat(pattern = "yyyy-MM-dd")
  58 + private Date createTime;
  59 +
  60 +}
ruoyi-admin/src/main/java/com/ruoyi/errorScheduling/mapper/ErrorJobcodeMapper.java 0 → 100644
  1 +package com.ruoyi.errorScheduling.mapper;
  2 +
  3 +import java.util.List;
  4 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  5 +import com.ruoyi.pojo.vo.ErrorJobcodeVo;
  6 +import org.apache.ibatis.annotations.Param;
  7 +
  8 +/**
  9 + * 问题排班Mapper接口
  10 + *
  11 + * @author guzijian
  12 + * @date 2023-08-24
  13 + */
  14 +public interface ErrorJobcodeMapper
  15 +{
  16 + /**
  17 + * 查询问题排班
  18 + *
  19 + * @param id 问题排班主键
  20 + * @return 问题排班
  21 + */
  22 + public ErrorJobcode selectErrorJobcodeById(Long id);
  23 +
  24 + /**
  25 + * 查询问题排班列表
  26 + *
  27 + * @param errorJobcode 问题排班
  28 + * @return 问题排班集合
  29 + */
  30 + public List<ErrorJobcodeVo> selectErrorJobcodeList(ErrorJobcodeVo errorJobcode);
  31 +
  32 + /**
  33 + * 新增问题排班
  34 + *
  35 + * @param errorJobcode 问题排班
  36 + * @return 结果
  37 + */
  38 + public int insertErrorJobcode(ErrorJobcode errorJobcode);
  39 +
  40 + /**
  41 + * 修改问题排班
  42 + *
  43 + * @param errorJobcode 问题排班
  44 + * @return 结果
  45 + */
  46 + public int updateErrorJobcode(ErrorJobcode errorJobcode);
  47 +
  48 + /**
  49 + * 删除问题排班
  50 + *
  51 + * @param id 问题排班主键
  52 + * @return 结果
  53 + */
  54 + public int deleteErrorJobcodeById(Long id);
  55 +
  56 + /**
  57 + * 批量删除问题排班
  58 + *
  59 + * @param ids 需要删除的数据主键集合
  60 + * @return 结果
  61 + */
  62 + public int deleteErrorJobcodeByIds(Long[] ids);
  63 +
  64 + void insertBatchErrorJobcode(@Param("errorScheduling") List<ErrorJobcode> errorScheduling);
  65 +}
ruoyi-admin/src/main/java/com/ruoyi/errorScheduling/service/IErrorJobcodeService.java 0 → 100644
  1 +package com.ruoyi.errorScheduling.service;
  2 +
  3 +import java.util.List;
  4 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  5 +import com.ruoyi.pojo.vo.ErrorJobcodeVo;
  6 +
  7 +/**
  8 + * 问题排班Service接口
  9 + *
  10 + * @author guzijian
  11 + * @date 2023-08-24
  12 + */
  13 +public interface IErrorJobcodeService
  14 +{
  15 + /**
  16 + * 查询问题排班
  17 + *
  18 + * @param id 问题排班主键
  19 + * @return 问题排班
  20 + */
  21 + public ErrorJobcode selectErrorJobcodeById(Long id);
  22 +
  23 + /**
  24 + * 查询问题排班列表
  25 + *
  26 + * @param errorJobcode 问题排班
  27 + * @return 问题排班集合
  28 + */
  29 + public List<ErrorJobcodeVo> selectErrorJobcodeList(ErrorJobcodeVo errorJobcode);
  30 +
  31 + /**
  32 + * 新增问题排班
  33 + *
  34 + * @param errorJobcode 问题排班
  35 + * @return 结果
  36 + */
  37 + public int insertErrorJobcode(ErrorJobcode errorJobcode);
  38 +
  39 + /**
  40 + * 修改问题排班
  41 + *
  42 + * @param errorJobcode 问题排班
  43 + * @return 结果
  44 + */
  45 + public int updateErrorJobcode(ErrorJobcode errorJobcode);
  46 +
  47 + /**
  48 + * 批量删除问题排班
  49 + *
  50 + * @param ids 需要删除的问题排班主键集合
  51 + * @return 结果
  52 + */
  53 + public int deleteErrorJobcodeByIds(Long[] ids);
  54 +
  55 + /**
  56 + * 删除问题排班信息
  57 + *
  58 + * @param id 问题排班主键
  59 + * @return 结果
  60 + */
  61 + public int deleteErrorJobcodeById(Long id);
  62 +
  63 + void insertBatchErrorJobcode(List<ErrorJobcode> errorScheduling);
  64 +}
ruoyi-admin/src/main/java/com/ruoyi/schedulingAssociateNum/service/impl/RuleNumSchedulingServiceImpl.java renamed to ruoyi-admin/src/main/java/com/ruoyi/errorScheduling/service/impl/ErrorJobcodeServiceImpl.java
1 -package com.ruoyi.schedulingAssociateNum.service.impl; 1 +package com.ruoyi.errorScheduling.service.impl;
2 2
3 import java.util.List; 3 import java.util.List;
  4 +
  5 +import cn.hutool.core.collection.CollectionUtil;
  6 +import com.ruoyi.common.utils.DateUtils;
4 import com.ruoyi.common.utils.SecurityUtils; 7 import com.ruoyi.common.utils.SecurityUtils;
  8 +import com.ruoyi.pojo.vo.ErrorJobcodeVo;
5 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
7 -import com.ruoyi.schedulingAssociateNum.mapper.RuleNumSchedulingMapper;  
8 -import com.ruoyi.schedulingAssociateNum.domain.RuleNumScheduling;  
9 -import com.ruoyi.schedulingAssociateNum.service.IRuleNumSchedulingService; 11 +import com.ruoyi.errorScheduling.mapper.ErrorJobcodeMapper;
  12 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  13 +import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
10 14
11 /** 15 /**
12 - * 排班规则和班次关联Service业务层处理 16 + * 问题排班Service业务层处理
13 * 17 *
14 - * @author 古自健  
15 - * @date 2023-08-07 18 + * @author guzijian
  19 + * @date 2023-08-24
16 */ 20 */
17 @Service 21 @Service
18 -public class RuleNumSchedulingServiceImpl implements IRuleNumSchedulingService 22 +public class ErrorJobcodeServiceImpl implements IErrorJobcodeService
19 { 23 {
20 @Autowired 24 @Autowired
21 - private RuleNumSchedulingMapper ruleNumSchedulingMapper; 25 + private ErrorJobcodeMapper errorJobcodeMapper;
22 26
23 /** 27 /**
24 - * 查询排班规则和班次关联 28 + * 查询问题排班
25 * 29 *
26 - * @param id 排班规则和班次关联主键  
27 - * @return 排班规则和班次关联 30 + * @param id 问题排班主键
  31 + * @return 问题排班
28 */ 32 */
29 @Override 33 @Override
30 - public RuleNumScheduling selectRuleNumSchedulingById(Long id) 34 + public ErrorJobcode selectErrorJobcodeById(Long id)
31 { 35 {
32 - return ruleNumSchedulingMapper.selectRuleNumSchedulingById(id); 36 + return errorJobcodeMapper.selectErrorJobcodeById(id);
33 } 37 }
34 38
35 /** 39 /**
36 - * 查询排班规则和班次关联列表 40 + * 查询问题排班列表
37 * 41 *
38 - * @param ruleNumScheduling 排班规则和班次关联  
39 - * @return 排班规则和班次关联 42 + * @param errorJobcode 问题排班
  43 + * @return 问题排班
40 */ 44 */
41 @Override 45 @Override
42 - public List<RuleNumScheduling> selectRuleNumSchedulingList(RuleNumScheduling ruleNumScheduling) 46 + public List<ErrorJobcodeVo> selectErrorJobcodeList(ErrorJobcodeVo errorJobcode)
43 { 47 {
44 - return ruleNumSchedulingMapper.selectRuleNumSchedulingList(ruleNumScheduling); 48 + return errorJobcodeMapper.selectErrorJobcodeList(errorJobcode);
45 } 49 }
46 50
47 /** 51 /**
48 - * 新增排班规则和班次关联 52 + * 新增问题排班
49 * 53 *
50 - * @param ruleNumScheduling 排班规则和班次关联 54 + * @param errorJobcode 问题排班
51 * @return 结果 55 * @return 结果
52 */ 56 */
53 @Override 57 @Override
54 - public int insertRuleNumScheduling(RuleNumScheduling ruleNumScheduling) 58 + public int insertErrorJobcode(ErrorJobcode errorJobcode)
55 { 59 {
56 - return ruleNumSchedulingMapper.insertRuleNumScheduling(ruleNumScheduling); 60 + errorJobcode.setCreateTime(DateUtils.getNowDate());
  61 + return errorJobcodeMapper.insertErrorJobcode(errorJobcode);
57 } 62 }
58 63
59 /** 64 /**
60 - * 修改排班规则和班次关联 65 + * 修改问题排班
61 * 66 *
62 - * @param ruleNumScheduling 排班规则和班次关联 67 + * @param errorJobcode 问题排班
63 * @return 结果 68 * @return 结果
64 */ 69 */
65 @Override 70 @Override
66 - public int updateRuleNumScheduling(RuleNumScheduling ruleNumScheduling) 71 + public int updateErrorJobcode(ErrorJobcode errorJobcode)
67 { 72 {
68 - return ruleNumSchedulingMapper.updateRuleNumScheduling(ruleNumScheduling); 73 + return errorJobcodeMapper.updateErrorJobcode(errorJobcode);
69 } 74 }
70 75
71 /** 76 /**
72 - * 批量删除排班规则和班次关联 77 + * 批量删除问题排班
73 * 78 *
74 - * @param ids 需要删除的排班规则和班次关联主键 79 + * @param ids 需要删除的问题排班主键
75 * @return 结果 80 * @return 结果
76 */ 81 */
77 @Override 82 @Override
78 - public int deleteRuleNumSchedulingByIds(Long[] ids) 83 + public int deleteErrorJobcodeByIds(Long[] ids)
79 { 84 {
80 - return ruleNumSchedulingMapper.deleteRuleNumSchedulingByIds(ids); 85 + return errorJobcodeMapper.deleteErrorJobcodeByIds(ids);
81 } 86 }
82 87
83 /** 88 /**
84 - * 删除排班规则和班次关联信息 89 + * 删除问题排班信息
85 * 90 *
86 - * @param id 排班规则和班次关联主键 91 + * @param id 问题排班主键
87 * @return 结果 92 * @return 结果
88 */ 93 */
89 @Override 94 @Override
90 - public int deleteRuleNumSchedulingById(Long id) 95 + public int deleteErrorJobcodeById(Long id)
91 { 96 {
92 - return ruleNumSchedulingMapper.deleteRuleNumSchedulingById(id); 97 + return errorJobcodeMapper.deleteErrorJobcodeById(id);
  98 + }
  99 +
  100 + @Override
  101 + public void insertBatchErrorJobcode(List<ErrorJobcode> errorScheduling) {
  102 + if (!CollectionUtil.isEmpty(errorScheduling)){
  103 + errorJobcodeMapper.insertBatchErrorJobcode(errorScheduling);
  104 + }
93 } 105 }
94 } 106 }
ruoyi-admin/src/main/java/com/ruoyi/in/controller/SignInController.java
@@ -2,15 +2,14 @@ package com.ruoyi.in.controller; @@ -2,15 +2,14 @@ package com.ruoyi.in.controller;
2 2
3 import java.io.IOException; 3 import java.io.IOException;
4 import java.util.List; 4 import java.util.List;
  5 +import javax.servlet.http.HttpServletRequest;
5 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.http.HttpServletResponse;
6 7
7 import com.ruoyi.common.exception.file.FileUploadException; 8 import com.ruoyi.common.exception.file.FileUploadException;
8 -import com.ruoyi.pojo.request.FaceUpdateReqVo;  
9 import com.ruoyi.pojo.response.SignInResponseVo; 9 import com.ruoyi.pojo.response.SignInResponseVo;
10 import io.swagger.annotations.Api; 10 import io.swagger.annotations.Api;
11 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
12 import io.swagger.annotations.ApiParam; 12 import io.swagger.annotations.ApiParam;
13 -import org.springframework.security.access.prepost.PreAuthorize;  
14 import org.springframework.beans.factory.annotation.Autowired; 13 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.validation.annotation.Validated; 14 import org.springframework.validation.annotation.Validated;
16 import org.springframework.web.bind.annotation.GetMapping; 15 import org.springframework.web.bind.annotation.GetMapping;
@@ -59,7 +58,7 @@ public class SignInController extends BaseController { @@ -59,7 +58,7 @@ public class SignInController extends BaseController {
59 * 导出签到列表 58 * 导出签到列表
60 */ 59 */
61 // @PreAuthorize("@ss.hasPermi('in:in:export')") 60 // @PreAuthorize("@ss.hasPermi('in:in:export')")
62 - @Log(title = "签到", businessType = BusinessType.EXPORT) 61 +// @Log(title = "签到", businessType = BusinessType.EXPORT)
63 @PostMapping("/export") 62 @PostMapping("/export")
64 @ApiOperation("导出签到列表") 63 @ApiOperation("导出签到列表")
65 public void export(HttpServletResponse response, SignInResponseVo signIn) { 64 public void export(HttpServletResponse response, SignInResponseVo signIn) {
@@ -78,16 +77,16 @@ public class SignInController extends BaseController { @@ -78,16 +77,16 @@ public class SignInController extends BaseController {
78 return success(signInService.selectSignInById(id)); 77 return success(signInService.selectSignInById(id));
79 } 78 }
80 79
81 - /**  
82 - * 新增签到  
83 - */  
84 -// @PreAuthorize("@ss.hasPermi('in:in:add')")  
85 - @Log(title = "签到", businessType = BusinessType.INSERT)  
86 - @PostMapping  
87 - @ApiOperation("新增签到(通过后台管理页面)")  
88 - public AjaxResult add(@ApiParam @RequestBody SignIn signIn) {  
89 - return signInService.insertSignIn(signIn);  
90 - } 80 +// /**
  81 +// * 新增签到
  82 +// */
  83 +//// @PreAuthorize("@ss.hasPermi('in:in:add')")
  84 +// @Log(title = "签到", businessType = BusinessType.INSERT)
  85 +// @PostMapping
  86 +// @ApiOperation("新增签到(通过后台管理页面)")
  87 +// public AjaxResult add(@ApiParam @RequestBody SignIn signIn) {
  88 +// return signInService.insertSignIn(signIn);
  89 +// }
91 90
92 91
93 /** 92 /**
@@ -103,25 +102,35 @@ public class SignInController extends BaseController { @@ -103,25 +102,35 @@ public class SignInController extends BaseController {
103 return signInService.addSignIn(signIn); 102 return signInService.addSignIn(signIn);
104 } 103 }
105 104
106 - /**  
107 - * 修改签到  
108 - */  
109 -// @PreAuthorize("@ss.hasPermi('in:in:edit')")  
110 - @Log(title = "签到", businessType = BusinessType.UPDATE)  
111 - @PutMapping  
112 - @ApiOperation("修改签到")  
113 - public AjaxResult edit(@RequestBody SignIn signIn) {  
114 - return toAjax(signInService.updateSignIn(signIn));  
115 - } 105 +// /**
  106 +// * 修改签到
  107 +// */
  108 +//// @PreAuthorize("@ss.hasPermi('in:in:edit')")
  109 +// @Log(title = "签到", businessType = BusinessType.UPDATE)
  110 +// @PutMapping
  111 +// @ApiOperation("修改签到")
  112 +// public AjaxResult edit(@RequestBody SignIn signIn) {
  113 +// return toAjax(signInService.updateSignIn(signIn));
  114 +// }
116 115
117 /** 116 /**
118 * 删除签到 117 * 删除签到
119 */ 118 */
120 // @PreAuthorize("@ss.hasPermi('in:in:remove')") 119 // @PreAuthorize("@ss.hasPermi('in:in:remove')")
121 - @Log(title = "签到", businessType = BusinessType.DELETE)  
122 - @DeleteMapping("/{ids}")  
123 - @ApiOperation("删除签到")  
124 - public AjaxResult remove(@PathVariable Long[] ids) {  
125 - return toAjax(signInService.deleteSignInByIds(ids)); 120 +// @Log(title = "签到", businessType = BusinessType.DELETE)
  121 +// @DeleteMapping("/{ids}")
  122 +// @ApiOperation("删除签到")
  123 +// public AjaxResult remove(@PathVariable Long[] ids) {
  124 +// return toAjax(signInService.deleteSignInByIds(ids));
  125 +// }
  126 +
  127 + @GetMapping("/repair")
  128 + public AjaxResult repairSignRecord(HttpServletRequest request){
  129 + return AjaxResult.success(signInService.repairSignRecord(request));
  130 + }
  131 +
  132 + @GetMapping("/repairAll/{date}")
  133 + public AjaxResult repairAllSignRecord(HttpServletRequest request,@PathVariable("date") String date){
  134 + return AjaxResult.success(signInService.repairAllSignRecord(request,date));
126 } 135 }
127 } 136 }
ruoyi-admin/src/main/java/com/ruoyi/in/mapper/SignInMapper.java
@@ -2,6 +2,7 @@ package com.ruoyi.in.mapper; @@ -2,6 +2,7 @@ package com.ruoyi.in.mapper;
2 2
3 import java.util.List; 3 import java.util.List;
4 import com.ruoyi.in.domain.SignIn; 4 import com.ruoyi.in.domain.SignIn;
  5 +import com.ruoyi.domain.DriverScheduling;
5 import com.ruoyi.pojo.request.ReportViewRequestVo; 6 import com.ruoyi.pojo.request.ReportViewRequestVo;
6 import com.ruoyi.pojo.request.ReportErrorRequestVo; 7 import com.ruoyi.pojo.request.ReportErrorRequestVo;
7 import com.ruoyi.pojo.response.ReportViewResponseVo; 8 import com.ruoyi.pojo.response.ReportViewResponseVo;
@@ -71,4 +72,8 @@ public interface SignInMapper @@ -71,4 +72,8 @@ public interface SignInMapper
71 List<ReportViewResponseVo> getReportScrollViewTable(ReportViewRequestVo requestVo); 72 List<ReportViewResponseVo> getReportScrollViewTable(ReportViewRequestVo requestVo);
72 73
73 List<SignIn> getSignErrorList(ReportErrorRequestVo request); 74 List<SignIn> getSignErrorList(ReportErrorRequestVo request);
  75 +
  76 + List<DriverScheduling> queryOutBcType();
  77 +
  78 + List<SignIn> querySignInData();
74 } 79 }
ruoyi-admin/src/main/java/com/ruoyi/in/service/ISignInService.java
@@ -6,10 +6,10 @@ import java.util.List; @@ -6,10 +6,10 @@ import java.util.List;
6 import com.ruoyi.common.core.domain.AjaxResult; 6 import com.ruoyi.common.core.domain.AjaxResult;
7 import com.ruoyi.common.exception.file.FileUploadException; 7 import com.ruoyi.common.exception.file.FileUploadException;
8 import com.ruoyi.in.domain.SignIn; 8 import com.ruoyi.in.domain.SignIn;
9 -import com.ruoyi.pojo.request.ReportViewRequestVo;  
10 -import com.ruoyi.pojo.response.ReportViewResponseVo;  
11 import com.ruoyi.pojo.response.SignInResponseVo; 9 import com.ruoyi.pojo.response.SignInResponseVo;
12 10
  11 +import javax.servlet.http.HttpServletRequest;
  12 +
13 /** 13 /**
14 * 签到Service接口 14 * 签到Service接口
15 * 15 *
@@ -73,4 +73,7 @@ public interface ISignInService @@ -73,4 +73,7 @@ public interface ISignInService
73 */ 73 */
74 AjaxResult addSignIn(SignIn signIn) throws FileUploadException, IOException; 74 AjaxResult addSignIn(SignIn signIn) throws FileUploadException, IOException;
75 75
  76 + String repairSignRecord(HttpServletRequest request);
  77 +
  78 + String repairAllSignRecord(HttpServletRequest request,String date);
76 } 79 }
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
@@ -3,11 +3,15 @@ package com.ruoyi.in.service.impl; @@ -3,11 +3,15 @@ package com.ruoyi.in.service.impl;
3 import java.io.File; 3 import java.io.File;
4 import java.io.IOException; 4 import java.io.IOException;
5 import java.math.BigDecimal; 5 import java.math.BigDecimal;
  6 +import java.time.LocalDate;
6 import java.time.LocalDateTime; 7 import java.time.LocalDateTime;
  8 +import java.time.format.DateTimeFormatter;
7 import java.time.temporal.ChronoUnit; 9 import java.time.temporal.ChronoUnit;
8 import java.util.*; 10 import java.util.*;
  11 +import java.util.stream.Collectors;
9 12
10 import cn.hutool.core.collection.CollectionUtil; 13 import cn.hutool.core.collection.CollectionUtil;
  14 +import com.ruoyi.common.cache.NowSchedulingCache;
11 import com.ruoyi.common.cache.SchedulingCache; 15 import com.ruoyi.common.cache.SchedulingCache;
12 import com.ruoyi.common.config.RuoYiConfig; 16 import com.ruoyi.common.config.RuoYiConfig;
13 import com.ruoyi.common.constant.Constants; 17 import com.ruoyi.common.constant.Constants;
@@ -22,9 +26,10 @@ import com.ruoyi.driver.domain.Driver; @@ -22,9 +26,10 @@ import com.ruoyi.driver.domain.Driver;
22 import com.ruoyi.driver.mapper.DriverMapper; 26 import com.ruoyi.driver.mapper.DriverMapper;
23 import com.ruoyi.equipment.domain.Equipment; 27 import com.ruoyi.equipment.domain.Equipment;
24 import com.ruoyi.equipment.mapper.EquipmentMapper; 28 import com.ruoyi.equipment.mapper.EquipmentMapper;
  29 +import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
25 import com.ruoyi.pojo.DriverSignRecommendation; 30 import com.ruoyi.pojo.DriverSignRecommendation;
26 import com.ruoyi.pojo.GlobalIndex; 31 import com.ruoyi.pojo.GlobalIndex;
27 -import com.ruoyi.pojo.entity.DriverScheduling; 32 +import com.ruoyi.domain.DriverScheduling;
28 import com.ruoyi.pojo.response.SignInResponseVo; 33 import com.ruoyi.pojo.response.SignInResponseVo;
29 import com.ruoyi.service.SchedulingService; 34 import com.ruoyi.service.SchedulingService;
30 import com.ruoyi.service.ThreadJobService; 35 import com.ruoyi.service.ThreadJobService;
@@ -37,8 +42,10 @@ import org.springframework.stereotype.Service; @@ -37,8 +42,10 @@ import org.springframework.stereotype.Service;
37 import com.ruoyi.in.mapper.SignInMapper; 42 import com.ruoyi.in.mapper.SignInMapper;
38 import com.ruoyi.in.domain.SignIn; 43 import com.ruoyi.in.domain.SignIn;
39 import com.ruoyi.in.service.ISignInService; 44 import com.ruoyi.in.service.ISignInService;
  45 +import org.springframework.transaction.annotation.Transactional;
40 46
41 import javax.annotation.Resource; 47 import javax.annotation.Resource;
  48 +import javax.servlet.http.HttpServletRequest;
42 49
43 import static com.ruoyi.common.ConstDriverProperties.*; 50 import static com.ruoyi.common.ConstDriverProperties.*;
44 import static com.ruoyi.common.ErrorTypeProperties.*; 51 import static com.ruoyi.common.ErrorTypeProperties.*;
@@ -57,8 +64,13 @@ public class SignInServiceImpl implements ISignInService { @@ -57,8 +64,13 @@ public class SignInServiceImpl implements ISignInService {
57 private Logger log = LoggerFactory.getLogger(SignInServiceImpl.class); 64 private Logger log = LoggerFactory.getLogger(SignInServiceImpl.class);
58 65
59 @Resource 66 @Resource
  67 + private NowSchedulingCache nowSchedulingCache;
  68 + @Resource
60 private SchedulingService schedulingService; 69 private SchedulingService schedulingService;
61 70
  71 + @Autowired
  72 + private IErrorJobcodeService errorJobcodeService;
  73 +
62 @Resource 74 @Resource
63 private SchedulingCache schedulingCache; 75 private SchedulingCache schedulingCache;
64 @Autowired 76 @Autowired
@@ -223,6 +235,152 @@ public class SignInServiceImpl implements ISignInService { @@ -223,6 +235,152 @@ public class SignInServiceImpl implements ISignInService {
223 return SIGN_IN_SUCCESS.equals(signIn.getStatus()) ? AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo) : AjaxResult.success(SIGN_IN_ERROR + ":" + signIn.getRemark(), vo); 235 return SIGN_IN_SUCCESS.equals(signIn.getStatus()) ? AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo) : AjaxResult.success(SIGN_IN_ERROR + ":" + signIn.getRemark(), vo);
224 } 236 }
225 237
  238 + @Override
  239 + @Transactional(rollbackFor = Exception.class)
  240 + public String repairSignRecord(HttpServletRequest request) {
  241 + String header = request.getHeader("X-TOKEN-AUTH");
  242 + if (!"gzjUse".equals(header)) {
  243 + throw new RuntimeException("错误的认证");
  244 + }
  245 + // 获取发车班次
  246 + List<DriverScheduling> list = signInMapper.queryOutBcType();
  247 + // 获取签到数据
  248 + List<SignIn> signIns = signInMapper.querySignInData();
  249 + Map<String, DriverScheduling> transformMap = list.stream().collect(Collectors.toMap(DriverScheduling::getJobCode, item -> item));
  250 + // 更新签到数据
  251 + List<SignIn> signInList = handlerHaveScheduling(transformMap, signIns);
  252 + startRepairSignRecord(transformMap, signInList);
  253 + equipmentMapper.deleteExRecord();
  254 + return null;
  255 + }
  256 +
  257 + @Override
  258 + public String repairAllSignRecord(HttpServletRequest request, String date) {
  259 + String header = request.getHeader("X-TOKEN-AUTH");
  260 + if (!"gzjUse".equals(header)) {
  261 + throw new RuntimeException("错误的认证");
  262 + }
  263 + // 恢复当天的所有签到数据
  264 + // 获取排班
  265 + List<DriverScheduling> dto = schedulingService.queryToDay(date);
  266 + Map<String, List<DriverScheduling>> resultMap = new HashMap<>(500);
  267 + NowSchedulingCache.handlerResultMap(resultMap, dto);
  268 +
  269 + // 获取当天的签到数据
  270 + SignInResponseVo vo = new SignInResponseVo();
  271 + vo.setDate(transFormDate(date));
  272 + List<SignInResponseVo> inList = signInMapper.selectSignInList(vo);
  273 + vo.setDate(transFormDate(handleDate(date)));
  274 + inList.addAll(signInMapper.selectSignInList(vo));
  275 +
  276 + handleAllRecord(resultMap, inList);
  277 +
  278 + return null;
  279 + }
  280 +
  281 + private String handleDate(String dateString) {
  282 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
  283 + // 解析字符串日期为 LocalDate 对象
  284 + LocalDate parse = LocalDate.parse(dateString, formatter);
  285 + // 给日期加上一天
  286 + LocalDate nextDay = parse.plusDays(1);
  287 + // 将结果日期格式化为字符串(可选)
  288 + return nextDay.format(formatter);
  289 + }
  290 +
  291 + private String transFormDate(String dateString){
  292 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
  293 + LocalDate parse = LocalDate.parse(dateString, formatter);
  294 + DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  295 + return parse.format(formatter1);
  296 + }
  297 +
  298 + private void handleAllRecord(Map<String, List<DriverScheduling>> resultMap, List<SignInResponseVo> inList) {
  299 + inList = inList.stream().filter(item -> !Objects.isNull(resultMap.get(item.getJobCode()))).collect(Collectors.toList());
  300 + Map<String, List<SignInResponseVo>> recordMap = new HashMap<>(500);
  301 + handleSignIn(recordMap, inList);
  302 + // 恢复数据
  303 + repairRecord(resultMap, recordMap);
  304 + errorJobcodeService.insertBatchErrorJobcode(ThreadJobService.getErrorScheduling(resultMap));
  305 + }
  306 +
  307 + private void repairRecord(Map<String, List<DriverScheduling>> resultMap, Map<String, List<SignInResponseVo>> recordMap) {
  308 + Map<String, Driver> drivers = driverMapper.getDrivers(new Driver()).stream().collect(Collectors.toMap(Driver::getJobCode, driver -> driver));
  309 + for (Map.Entry<String, List<SignInResponseVo>> entry : recordMap.entrySet()) {
  310 + List<SignInResponseVo> value = entry.getValue();
  311 + for (SignInResponseVo sign : value) {
  312 + GlobalIndex globalIndex = new GlobalIndex();
  313 + checkSignIn(sign.getCreateTime().getTime(), resultMap.get(sign.getJobCode()), globalIndex, sign, drivers.get(sign.getJobCode()));
  314 + schedulingService.computedSignInBySignIn(resultMap.get(sign.getJobCode()),sign,globalIndex);
  315 + }
  316 + }
  317 + }
  318 +
  319 +
  320 + private void handleSignIn(Map<String, List<SignInResponseVo>> recordMap, List<SignInResponseVo> inList) {
  321 + for (SignInResponseVo vo : inList) {
  322 + List<SignInResponseVo> voList = recordMap.get(vo.getJobCode());
  323 + if (CollectionUtil.isEmpty(voList)) {
  324 + recordMap.put(vo.getJobCode(), new ArrayList<>(Arrays.asList(vo)));
  325 + } else {
  326 + voList.add(vo);
  327 + }
  328 + }
  329 + // 排序
  330 + for (Map.Entry<String, List<SignInResponseVo>> stringListEntry : recordMap.entrySet()) {
  331 + stringListEntry.getValue().sort(Comparator.comparing(SignInResponseVo::getCreateTime));
  332 + }
  333 + }
  334 +
  335 + private void startRepairSignRecord(Map<String, DriverScheduling> transformMap, List<SignIn> signInList) {
  336 + for (SignIn signIn : signInList) {
  337 + handlerExOutData(transformMap.get(signIn.getJobCode()), signIn);
  338 +
  339 + schedulingService.computedSignInBySignIn(new ArrayList<>(Arrays.asList(transformMap.get(signIn.getJobCode()))), signIn, new GlobalIndex());
  340 +// // 更新缓存
  341 + nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(transformMap.get(signIn.getJobCode()).getScheduleDate()), 0, signIn);
  342 + signInMapper.updateSignIn(signIn);
  343 +
  344 + }
  345 +
  346 + }
  347 +
  348 + private void handlerExOutData(DriverScheduling driverScheduling, SignIn signIn) {
  349 + LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(driverScheduling.getFcsjT());
  350 + LocalDateTime nowTime = ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime());
  351 + long nowBetween = ChronoUnit.MINUTES.between(endTime, nowTime);
  352 + if (Math.abs(nowBetween) <= 60) {
  353 + handlerNoExData(signIn, driverScheduling);
  354 + return;
  355 + }
  356 + handlerHaveExData(signIn, driverScheduling);
  357 + }
  358 +
  359 + private void handlerHaveExData(SignIn signIn, DriverScheduling driverScheduling) {
  360 + signIn.setExType(SIGN_TIME_OUT_EX_NUM);
  361 + signIn.setStatus(SIGN_IN_FAIL);
  362 + signIn.setUpdateTime(new Date());
  363 + signIn.setRemark(SIGN_IN_TIMEOUT);
  364 + }
  365 +
  366 + private void handlerNoExData(SignIn signIn, DriverScheduling driverScheduling) {
  367 + signIn.setExType(SIGN_NO_EX_NUM);
  368 + signIn.setStatus(SIGN_IN_SUCCESS);
  369 + signIn.setUpdateTime(new Date());
  370 + signIn.setRemark("正常");
  371 + }
  372 +
  373 + private List<SignIn> handlerHaveScheduling(Map<String, DriverScheduling> transformMap, List<SignIn> signIns) {
  374 + List<SignIn> signList = new ArrayList<>(500);
  375 +
  376 + for (SignIn signIn : signIns) {
  377 + if (!Objects.isNull(transformMap.get(signIn.getJobCode()))) {
  378 + signList.add(signIn);
  379 + }
  380 + }
  381 + return signList;
  382 + }
  383 +
226 private SignInResponseVo getSignInResponseVo(Driver driver, SignIn signIn, Equipment equipment) { 384 private SignInResponseVo getSignInResponseVo(Driver driver, SignIn signIn, Equipment equipment) {
227 SignInResponseVo vo = new SignInResponseVo(signIn); 385 SignInResponseVo vo = new SignInResponseVo(signIn);
228 if (Objects.isNull(equipment)) { 386 if (Objects.isNull(equipment)) {
@@ -264,6 +422,7 @@ public class SignInServiceImpl implements ISignInService { @@ -264,6 +422,7 @@ public class SignInServiceImpl implements ISignInService {
264 // 酒精测试校验 确定 且员工工种是驾驶员 422 // 酒精测试校验 确定 且员工工种是驾驶员
265 if (ALCOHOL_FLAG_YES.equals(signIn.getAlcoholFlag()) && PERSONNEL_POSTS_DRIVER.equals(driver.getPosts())) { 423 if (ALCOHOL_FLAG_YES.equals(signIn.getAlcoholFlag()) && PERSONNEL_POSTS_DRIVER.equals(driver.getPosts())) {
266 if (new BigDecimal(20).compareTo(signIn.getAlcoholIntake()) <= 0) { 424 if (new BigDecimal(20).compareTo(signIn.getAlcoholIntake()) <= 0) {
  425 + threadJobService.asyncSendEmail(dto, globalIndex.getIndex(), signIn, driver);
267 signIn.setRemark(signIn.getRemark() + ALCOHOL_SIGN_IN_ERROR + signIn.getAlcoholIntake().toString() + "mg/100ml。"); 426 signIn.setRemark(signIn.getRemark() + ALCOHOL_SIGN_IN_ERROR + signIn.getAlcoholIntake().toString() + "mg/100ml。");
268 signIn.setExType(SIGN_ALCOHOL_EX_NUM); 427 signIn.setExType(SIGN_ALCOHOL_EX_NUM);
269 result = false; 428 result = false;
@@ -296,6 +455,11 @@ public class SignInServiceImpl implements ISignInService { @@ -296,6 +455,11 @@ public class SignInServiceImpl implements ISignInService {
296 } 455 }
297 break; 456 break;
298 default: 457 default:
  458 + if (CollectionUtil.isEmpty(dto)) {
  459 + signIn.setRemark(signIn.getRemark() + WORK_DAY_ERROR);
  460 + signIn.setExType(SIGN_NO_SCHEDULING_EX_NUM);
  461 + result = false;
  462 + }
299 break; 463 break;
300 } 464 }
301 465
@@ -347,6 +511,10 @@ public class SignInServiceImpl implements ISignInService { @@ -347,6 +511,10 @@ public class SignInServiceImpl implements ISignInService {
347 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps()); 511 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps());
348 LocalDateTime nowTime = ConstDateUtil.getLocalDateTimeByLongTime(now); 512 LocalDateTime nowTime = ConstDateUtil.getLocalDateTimeByLongTime(now);
349 long nowBetween = ChronoUnit.MINUTES.between(endTime, nowTime); 513 long nowBetween = ChronoUnit.MINUTES.between(endTime, nowTime);
  514 + // 异常数据当进出场为单记录时
  515 + if (dto.size() == 1) {
  516 + return handlerExceptionRecord(dto, now, globalIndex, signIn);
  517 + }
350 // 不在有效时间范围内,判断当前是否有签到记录 当前应签到还是签退 518 // 不在有效时间范围内,判断当前是否有签到记录 当前应签到还是签退
351 if (!(Math.abs(nowBetween) <= 60)) { 519 if (!(Math.abs(nowBetween) <= 60)) {
352 // 签到一个逻辑 当前无记录 520 // 签到一个逻辑 当前无记录
@@ -403,6 +571,32 @@ public class SignInServiceImpl implements ISignInService { @@ -403,6 +571,32 @@ public class SignInServiceImpl implements ISignInService {
403 } 571 }
404 } 572 }
405 573
  574 + private Boolean handlerExceptionRecord(List<DriverScheduling> dto, long now, GlobalIndex globalIndex, SignIn signIn) {
  575 + DriverSignRecommendation currentScheduling = schedulingService.computedTheCurrentClosestTimestamp(dto, now, 0);
  576 + LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(currentScheduling.getTimestamps());
  577 + LocalDateTime nowTime = ConstDateUtil.getLocalDateTimeByLongTime(now);
  578 + long nowBetween = ChronoUnit.MINUTES.between(endTime, nowTime);
  579 + globalIndex.setIndex(0);
  580 + // 单挑数据 且不在范围内
  581 + if (BC_TYPE_IN.equals(dto.get(0).getBcType())) {
  582 + if (!(Math.abs(nowBetween) <= 60)) {
  583 + signIn.setRemark(SIGN_OUT_TIMEOUT);
  584 + return false;
  585 + } else {
  586 + return true;
  587 + }
  588 + }
  589 + if (BC_TYPE_OUT.equals(dto.get(0).getBcType())) {
  590 + if (!(Math.abs(nowBetween) <= 60)) {
  591 + signIn.setRemark(SIGN_IN_TIMEOUT);
  592 + return false;
  593 + } else {
  594 + return true;
  595 + }
  596 + }
  597 + return true;
  598 + }
  599 +
406 private void uploadImage(SignIn signIn, SignInResponseVo vo) throws IOException { 600 private void uploadImage(SignIn signIn, SignInResponseVo vo) throws IOException {
407 String base64 = signIn.getImage(); 601 String base64 = signIn.getImage();
408 // 图片路径 602 // 图片路径
ruoyi-admin/src/main/java/com/ruoyi/job/DriverJob.java
1 package com.ruoyi.job; 1 package com.ruoyi.job;
2 2
  3 +import cn.hutool.core.collection.CollectionUtil;
3 import cn.hutool.http.HttpUtil; 4 import cn.hutool.http.HttpUtil;
4 import com.alibaba.fastjson2.JSON; 5 import com.alibaba.fastjson2.JSON;
5 import com.alibaba.fastjson2.JSONArray; 6 import com.alibaba.fastjson2.JSONArray;
@@ -17,6 +18,7 @@ import com.ruoyi.pojo.response.ResponseSchedulingDto; @@ -17,6 +18,7 @@ import com.ruoyi.pojo.response.ResponseSchedulingDto;
17 import com.ruoyi.pojo.response.personnel.*; 18 import com.ruoyi.pojo.response.personnel.*;
18 import com.ruoyi.service.ThreadJobService; 19 import com.ruoyi.service.ThreadJobService;
19 import com.ruoyi.utils.ConstDateUtil; 20 import com.ruoyi.utils.ConstDateUtil;
  21 +import com.ruoyi.utils.ListUtils;
20 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
21 import org.springframework.beans.BeanUtils; 23 import org.springframework.beans.BeanUtils;
22 import org.springframework.beans.factory.InitializingBean; 24 import org.springframework.beans.factory.InitializingBean;
@@ -28,6 +30,7 @@ import org.springframework.stereotype.Component; @@ -28,6 +30,7 @@ import org.springframework.stereotype.Component;
28 import org.springframework.web.client.RestTemplate; 30 import org.springframework.web.client.RestTemplate;
29 31
30 import javax.annotation.Resource; 32 import javax.annotation.Resource;
  33 +import java.io.IOException;
31 import java.io.UnsupportedEncodingException; 34 import java.io.UnsupportedEncodingException;
32 import java.net.URLEncoder; 35 import java.net.URLEncoder;
33 import java.nio.charset.StandardCharsets; 36 import java.nio.charset.StandardCharsets;
@@ -260,8 +263,9 @@ public class DriverJob implements InitializingBean { @@ -260,8 +263,9 @@ public class DriverJob implements InitializingBean {
260 /** 263 /**
261 * 计算设备在线状态 5 分钟一次 264 * 计算设备在线状态 5 分钟一次
262 */ 265 */
263 - public void computedDeviceOnlineStatus(String date) { 266 + public void computedDeviceOnlineStatus(String date) throws IOException, ClassNotFoundException {
264 List<Equipment> list = EQUIPMENT_MAPPER.selectEquipmentList(null); 267 List<Equipment> list = EQUIPMENT_MAPPER.selectEquipmentList(null);
  268 + List<Equipment> original = ListUtils.deepCopy(list);
265 Long checkTime = StringUtils.isEmpty(date) ? DEVICE_OFFLINE_TIME : Long.parseLong(date); 269 Long checkTime = StringUtils.isEmpty(date) ? DEVICE_OFFLINE_TIME : Long.parseLong(date);
266 for (Equipment equipment : list) { 270 for (Equipment equipment : list) {
267 if (Objects.isNull(equipment.getLastHeartRes())) { 271 if (Objects.isNull(equipment.getLastHeartRes())) {
@@ -277,9 +281,12 @@ public class DriverJob implements InitializingBean { @@ -277,9 +281,12 @@ public class DriverJob implements InitializingBean {
277 } 281 }
278 } 282 }
279 } 283 }
  284 + // 更新日志
  285 + THREAD_JOB_SERVICE.asyncInsertEquipmentLog(list,original);
280 EQUIPMENT_MAPPER.updateEquipments(list); 286 EQUIPMENT_MAPPER.updateEquipments(list);
281 } 287 }
282 288
  289 +
283 public Map<String, List<ResponseSchedulingDto>> saveSchedulingToRedis(String getSchedulingInfoUrl, String dateKey) { 290 public Map<String, List<ResponseSchedulingDto>> saveSchedulingToRedis(String getSchedulingInfoUrl, String dateKey) {
284 log.info("开始拉取排班:{}", dateKey); 291 log.info("开始拉取排班:{}", dateKey);
285 List<ResponseSchedulingDto> originSchedulingList = RESTTEMPLATE.exchange( 292 List<ResponseSchedulingDto> originSchedulingList = RESTTEMPLATE.exchange(
ruoyi-admin/src/main/java/com/ruoyi/num/controller/RuleNumController.java
@@ -47,6 +47,17 @@ public class RuleNumController extends BaseController @@ -47,6 +47,17 @@ public class RuleNumController extends BaseController
47 } 47 }
48 48
49 /** 49 /**
  50 + * 查询班次管理列表
  51 + */
  52 + @PreAuthorize("@ss.hasPermi('num:num:list')")
  53 + @GetMapping("/list/all")
  54 + public AjaxResult listAll(RuleNum ruleNum)
  55 + {
  56 + return AjaxResult.success(ruleNumService.selectRuleNumList(ruleNum));
  57 + }
  58 +
  59 +
  60 + /**
50 * 导出班次管理列表 61 * 导出班次管理列表
51 */ 62 */
52 @PreAuthorize("@ss.hasPermi('num:num:export')") 63 @PreAuthorize("@ss.hasPermi('num:num:export')")
ruoyi-admin/src/main/java/com/ruoyi/pojo/DriverSignRecommendation.java
1 package com.ruoyi.pojo; 1 package com.ruoyi.pojo;
2 2
3 -import com.ruoyi.pojo.entity.DriverScheduling; 3 +import com.ruoyi.domain.DriverScheduling;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; 6 import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT;
ruoyi-admin/src/main/java/com/ruoyi/pojo/equipment/EquipmentOnline.java
@@ -26,12 +26,12 @@ public class EquipmentOnline { @@ -26,12 +26,12 @@ public class EquipmentOnline {
26 26
27 Logger log = LoggerFactory.getLogger(EquipmentOnline.class); 27 Logger log = LoggerFactory.getLogger(EquipmentOnline.class);
28 28
29 - @Autowired  
30 - private EquipmentOnline(EquipmentMapper mapper) {  
31 - log.info("初始化设备信息");  
32 - initClient(mapper);  
33 - log.info("设备信息初始化完毕");  
34 - } 29 +// @Autowired
  30 +// private EquipmentOnline(EquipmentMapper mapper) {
  31 +// log.info("初始化设备信息");
  32 +// initClient(mapper);
  33 +// log.info("设备信息初始化完毕");
  34 +// }
35 35
36 private void initClient(EquipmentMapper mapper) { 36 private void initClient(EquipmentMapper mapper) {
37 List<Equipment> list = mapper.selectEquipmentList(null); 37 List<Equipment> list = mapper.selectEquipmentList(null);
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/ExportReportViewResponseVo.java
@@ -5,7 +5,7 @@ import com.alibaba.excel.annotation.write.style.ColumnWidth; @@ -5,7 +5,7 @@ import com.alibaba.excel.annotation.write.style.ColumnWidth;
5 import com.alibaba.excel.annotation.write.style.HeadFontStyle; 5 import com.alibaba.excel.annotation.write.style.HeadFontStyle;
6 import com.alibaba.excel.annotation.write.style.HeadRowHeight; 6 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
7 import com.ruoyi.common.utils.bean.BeanUtils; 7 import com.ruoyi.common.utils.bean.BeanUtils;
8 -import com.ruoyi.pojo.entity.DriverScheduling; 8 +import com.ruoyi.domain.DriverScheduling;
9 import io.swagger.annotations.ApiModel; 9 import io.swagger.annotations.ApiModel;
10 import io.swagger.annotations.ApiModelProperty; 10 import io.swagger.annotations.ApiModelProperty;
11 import lombok.Data; 11 import lombok.Data;
@@ -119,17 +119,17 @@ public class ExportReportViewResponseVo { @@ -119,17 +119,17 @@ public class ExportReportViewResponseVo {
119 int size = driverSchedulings.size(); 119 int size = driverSchedulings.size();
120 this.setHaveSecondFlagString(size >= 4 ? "有分班":"无分班"); 120 this.setHaveSecondFlagString(size >= 4 ? "有分班":"无分班");
121 if (size <= 3) { 121 if (size <= 3) {
122 - handleFirst(driverSchedulings, size); 122 + handlerFirst(driverSchedulings, size);
123 } 123 }
124 // 有分班 124 // 有分班
125 else { 125 else {
126 // 签到 126 // 签到
127 - handleFirst(driverSchedulings, 2);  
128 - handelSecond(driverSchedulings, size); 127 + handlerFirst(driverSchedulings, 2);
  128 + handlerSecond(driverSchedulings, size);
129 } 129 }
130 } 130 }
131 131
132 - private void handelSecond(List<DriverScheduling> driverSchedulingList, int size) { 132 + private void handlerSecond(List<DriverScheduling> driverSchedulingList, int size) {
133 // 签到 133 // 签到
134 this.setSecondPlanSignInTime(new Date(driverSchedulingList.get(2).getFcsjT())); 134 this.setSecondPlanSignInTime(new Date(driverSchedulingList.get(2).getFcsjT()));
135 this.setSecondActualSignInTime(driverSchedulingList.get(2).getSignTime()); 135 this.setSecondActualSignInTime(driverSchedulingList.get(2).getSignTime());
@@ -144,7 +144,7 @@ public class ExportReportViewResponseVo { @@ -144,7 +144,7 @@ public class ExportReportViewResponseVo {
144 this.setSecondSignOutResultString(Objects.isNull(driverSchedulingList.get(size -1).getSignInId()) ? "未签退" : driverSchedulingList.get(size -1).getRemark()); 144 this.setSecondSignOutResultString(Objects.isNull(driverSchedulingList.get(size -1).getSignInId()) ? "未签退" : driverSchedulingList.get(size -1).getRemark());
145 } 145 }
146 146
147 - private void handleFirst(List<DriverScheduling> driverSchedulingList, int size) { 147 + private void handlerFirst(List<DriverScheduling> driverSchedulingList, int size) {
148 // 签到 148 // 签到
149 this.setPlanSignInTime(new Date(driverSchedulingList.get(0).getFcsjT())); 149 this.setPlanSignInTime(new Date(driverSchedulingList.get(0).getFcsjT()));
150 this.setActualSignInTime(driverSchedulingList.get(0).getSignTime()); 150 this.setActualSignInTime(driverSchedulingList.get(0).getSignTime());
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/ErrorJobcodeVo.java 0 → 100644
  1 +package com.ruoyi.pojo.vo;
  2 +
  3 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  4 +import lombok.Data;
  5 +
  6 +@Data
  7 +public class ErrorJobcodeVo extends ErrorJobcode {
  8 + /**
  9 + * date
  10 + */
  11 + String date;
  12 +}
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/PeopleResponseVo.java 0 → 100644
  1 +package com.ruoyi.pojo.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +/**
  8 + * @author 20412
  9 + */
  10 +@Data
  11 +@ApiModel("人员信息对象")
  12 +public class PeopleResponseVo {
  13 + @ApiModelProperty("工号")
  14 + private String jobCode;
  15 + @ApiModelProperty("姓名")
  16 + private String name;
  17 + @ApiModelProperty("工种")
  18 + private String posts;
  19 + @ApiModelProperty("部门")
  20 + private String fleetName;
  21 +}
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/RuleSchedulingResponseVo.java 0 → 100644
  1 +package com.ruoyi.pojo.vo;
  2 +
  3 +import com.ruoyi.common.annotation.Excel;
  4 +import com.ruoyi.scheduling.domain.RuleScheduling;
  5 +import lombok.Data;
  6 +
  7 +/**
  8 + * @author 20412
  9 + */
  10 +@Data
  11 +public class RuleSchedulingResponseVo extends RuleScheduling {
  12 + private String rangeTime;
  13 +
  14 +}
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/RuleSchedulingVo.java 0 → 100644
  1 +package com.ruoyi.pojo.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * @author 20412
  7 + */
  8 +@Data
  9 +public class RuleSchedulingVo {
  10 +
  11 + private Long id;
  12 + /**
  13 + * 规则名称
  14 + */
  15 + private String ruleName;
  16 + /**
  17 + * 时间范围
  18 + */
  19 + private String rangeTime;
  20 +}
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/SchedulingRequestVo.java 0 → 100644
  1 +package com.ruoyi.pojo.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @author 20412
  11 + */
  12 +@Data
  13 +@ApiModel("排班规则请求vo")
  14 +public class SchedulingRequestVo {
  15 + @ApiModelProperty("id")
  16 + private Long id;
  17 + @ApiModelProperty("规则名字")
  18 + private String matchName;
  19 + @ApiModelProperty("班次名称")
  20 + private String ruleDictName;
  21 + @ApiModelProperty("班次类型")
  22 + private Integer ruleType;
  23 +
  24 + private Integer pageNum;
  25 + private Integer pageSize;
  26 +}
ruoyi-admin/src/main/java/com/ruoyi/pojo/vo/SchedulingResponseVo.java 0 → 100644
  1 +package com.ruoyi.pojo.vo;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * @author 20412
  10 + */
  11 +@Data
  12 +public class SchedulingResponseVo {
  13 +
  14 + @ApiModelProperty("规则名字")
  15 + private String matchName;
  16 + @ApiModelProperty("班次名称")
  17 + private String ruleDictName;
  18 + @ApiModelProperty("班次类型")
  19 + private Integer ruleType;
  20 + @ApiModelProperty("考勤规则列表")
  21 + private List<String> ruleList;
  22 + @ApiModelProperty("适用人员")
  23 + private List<String> peopleList;
  24 +}
ruoyi-admin/src/main/java/com/ruoyi/scheduling/controller/RuleSchedulingController.java
@@ -2,6 +2,8 @@ package com.ruoyi.scheduling.controller; @@ -2,6 +2,8 @@ package com.ruoyi.scheduling.controller;
2 2
3 import java.util.List; 3 import java.util.List;
4 import javax.servlet.http.HttpServletResponse; 4 import javax.servlet.http.HttpServletResponse;
  5 +
  6 +import com.ruoyi.pojo.vo.RuleSchedulingResponseVo;
5 import org.springframework.security.access.prepost.PreAuthorize; 7 import org.springframework.security.access.prepost.PreAuthorize;
6 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.web.bind.annotation.GetMapping; 9 import org.springframework.web.bind.annotation.GetMapping;
@@ -43,7 +45,18 @@ public class RuleSchedulingController extends BaseController @@ -43,7 +45,18 @@ public class RuleSchedulingController extends BaseController
43 { 45 {
44 startPage(); 46 startPage();
45 List<RuleScheduling> list = ruleSchedulingService.selectRuleSchedulingList(ruleScheduling); 47 List<RuleScheduling> list = ruleSchedulingService.selectRuleSchedulingList(ruleScheduling);
46 - return getDataTable(list); 48 + List<RuleSchedulingResponseVo> vos = ruleSchedulingService.handleResponseRuleSchedulingList(list);
  49 + return getDataTable(vos);
  50 + }
  51 +
  52 + /**
  53 + * 查询排版规则列表
  54 + */
  55 + @PreAuthorize("@ss.hasPermi('scheduling:scheduling:list')")
  56 + @GetMapping("/list/all")
  57 + public AjaxResult listAll(RuleScheduling ruleScheduling)
  58 + {
  59 + return AjaxResult.success(ruleSchedulingService.selectRuleSchedulingListVo(ruleScheduling));
47 } 60 }
48 61
49 /** 62 /**
ruoyi-admin/src/main/java/com/ruoyi/scheduling/domain/RuleScheduling.java
@@ -2,10 +2,12 @@ package com.ruoyi.scheduling.domain; @@ -2,10 +2,12 @@ package com.ruoyi.scheduling.domain;
2 2
3 import java.util.Date; 3 import java.util.Date;
4 import com.fasterxml.jackson.annotation.JsonFormat; 4 import com.fasterxml.jackson.annotation.JsonFormat;
  5 +import lombok.Data;
5 import org.apache.commons.lang3.builder.ToStringBuilder; 6 import org.apache.commons.lang3.builder.ToStringBuilder;
6 import org.apache.commons.lang3.builder.ToStringStyle; 7 import org.apache.commons.lang3.builder.ToStringStyle;
7 import com.ruoyi.common.annotation.Excel; 8 import com.ruoyi.common.annotation.Excel;
8 import com.ruoyi.common.core.domain.BaseEntity; 9 import com.ruoyi.common.core.domain.BaseEntity;
  10 +import org.springframework.format.annotation.DateTimeFormat;
9 11
10 /** 12 /**
11 * 排版规则对象 rule_scheduling 13 * 排版规则对象 rule_scheduling
@@ -13,6 +15,7 @@ import com.ruoyi.common.core.domain.BaseEntity; @@ -13,6 +15,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
13 * @author guzijian 15 * @author guzijian
14 * @date 2023-08-07 16 * @date 2023-08-07
15 */ 17 */
  18 +@Data
16 public class RuleScheduling extends BaseEntity 19 public class RuleScheduling extends BaseEntity
17 { 20 {
18 private static final long serialVersionUID = 1L; 21 private static final long serialVersionUID = 1L;
@@ -26,228 +29,66 @@ public class RuleScheduling extends BaseEntity @@ -26,228 +29,66 @@ public class RuleScheduling extends BaseEntity
26 29
27 /** 工时制 */ 30 /** 工时制 */
28 @Excel(name = "工时制") 31 @Excel(name = "工时制")
29 - private Long workingHourPlan; 32 + private Integer workingHourPlan;
30 33
31 /** 工时类型 */ 34 /** 工时类型 */
32 @Excel(name = "工时类型") 35 @Excel(name = "工时类型")
33 - private Long workingHourType; 36 + private Integer workingHourType;
34 37
35 /** 第一段上班签到时间 */ 38 /** 第一段上班签到时间 */
36 - @JsonFormat(pattern = "yyyy-MM-dd")  
37 - @Excel(name = "第一段上班签到时间", width = 30, dateFormat = "yyyy-MM-dd") 39 + @JsonFormat(pattern = "HH:mm")
  40 + @Excel(name = "第一段上班签到时间", width = 30, dateFormat = "HH:mm")
  41 + @DateTimeFormat(pattern = "HH:mm")
38 private Date firstWorkSignInTime; 42 private Date firstWorkSignInTime;
39 43
40 /** 第一段上班打卡签到范围 */ 44 /** 第一段上班打卡签到范围 */
41 @Excel(name = "第一段上班打卡签到范围") 45 @Excel(name = "第一段上班打卡签到范围")
42 - private Long firstSignInWorkingRange; 46 + private Integer firstSignInWorkingRange;
43 47
44 /** 第一段下班签退时间 */ 48 /** 第一段下班签退时间 */
45 - @JsonFormat(pattern = "yyyy-MM-dd")  
46 - @Excel(name = "第一段下班签退时间", width = 30, dateFormat = "yyyy-MM-dd") 49 + @JsonFormat(pattern = "HH:mm")
  50 + @Excel(name = "第一段下班签退时间", width = 30, dateFormat = "HH:mm")
  51 + @DateTimeFormat(pattern = "HH:mm")
47 private Date firstQuittingSignInTime; 52 private Date firstQuittingSignInTime;
48 53
49 /** 第一段上下班标识,今天时间还是隔天 */ 54 /** 第一段上下班标识,今天时间还是隔天 */
50 @Excel(name = "第一段上下班标识,今天时间还是隔天") 55 @Excel(name = "第一段上下班标识,今天时间还是隔天")
51 - private Long firstSignInDayTomorrow; 56 + private Integer firstSignInDayTomorrow;
52 57
53 /** 第一段下班签退签到范围 */ 58 /** 第一段下班签退签到范围 */
54 @Excel(name = "第一段下班签退签到范围") 59 @Excel(name = "第一段下班签退签到范围")
55 - private Long firstSignInQuittingRange; 60 + private Integer firstSignInQuittingRange;
56 61
57 /** 超时范围允许 */ 62 /** 超时范围允许 */
58 @Excel(name = "超时范围允许") 63 @Excel(name = "超时范围允许")
59 - private Long signInTimeOutRange; 64 + private Integer signInTimeOutRange;
60 65
61 /** 第二段开启标识 1默认1 未开启 2 开启 */ 66 /** 第二段开启标识 1默认1 未开启 2 开启 */
62 @Excel(name = "第二段开启标识 1默认1 未开启 2 开启") 67 @Excel(name = "第二段开启标识 1默认1 未开启 2 开启")
63 - private Long secondFlag; 68 + private Integer secondFlag;
64 69
65 /** 第二段上班签到时间 */ 70 /** 第二段上班签到时间 */
66 - @JsonFormat(pattern = "yyyy-MM-dd")  
67 - @Excel(name = "第二段上班签到时间", width = 30, dateFormat = "yyyy-MM-dd") 71 + @JsonFormat(pattern = "HH:mm")
  72 + @Excel(name = "第二段上班签到时间", width = 30, dateFormat = "HH:mm")
  73 + @DateTimeFormat(pattern = "HH:mm")
68 private Date secondWorkSignInTime; 74 private Date secondWorkSignInTime;
69 75
70 /** 第二段上班打卡范围 */ 76 /** 第二段上班打卡范围 */
71 @Excel(name = "第二段上班打卡范围") 77 @Excel(name = "第二段上班打卡范围")
72 - private Long secondSignInWorkingRange; 78 + private Integer secondSignInWorkingRange;
73 79
74 /** 第二段下班签到签退 */ 80 /** 第二段下班签到签退 */
75 - @JsonFormat(pattern = "yyyy-MM-dd")  
76 - @Excel(name = "第二段下班签到签退", width = 30, dateFormat = "yyyy-MM-dd") 81 + @JsonFormat(pattern = "HH:mm")
  82 + @Excel(name = "第二段下班签到签退", width = 30, dateFormat = "HH:mm")
  83 + @DateTimeFormat(pattern = "HH:mm")
77 private Date secondQuittingSignInTime; 84 private Date secondQuittingSignInTime;
78 85
79 /** 第二段下班打卡范围 */ 86 /** 第二段下班打卡范围 */
80 @Excel(name = "第二段下班打卡范围") 87 @Excel(name = "第二段下班打卡范围")
81 - private Long secondSignInQuittingRange; 88 + private Integer secondSignInQuittingRange;
82 89
83 /** 第二段上下班标识,今天时间还是隔天 */ 90 /** 第二段上下班标识,今天时间还是隔天 */
84 @Excel(name = "第二段上下班标识,今天时间还是隔天") 91 @Excel(name = "第二段上下班标识,今天时间还是隔天")
85 - private Long secondSignDayTomorrow;  
86 -  
87 - public void setId(Long id)  
88 - {  
89 - this.id = id;  
90 - }  
91 -  
92 - public Long getId()  
93 - {  
94 - return id;  
95 - }  
96 - public void setRuleName(String ruleName)  
97 - {  
98 - this.ruleName = ruleName;  
99 - }  
100 -  
101 - public String getRuleName()  
102 - {  
103 - return ruleName;  
104 - }  
105 - public void setWorkingHourPlan(Long workingHourPlan)  
106 - {  
107 - this.workingHourPlan = workingHourPlan;  
108 - }  
109 -  
110 - public Long getWorkingHourPlan()  
111 - {  
112 - return workingHourPlan;  
113 - }  
114 - public void setWorkingHourType(Long workingHourType)  
115 - {  
116 - this.workingHourType = workingHourType;  
117 - }  
118 -  
119 - public Long getWorkingHourType()  
120 - {  
121 - return workingHourType;  
122 - }  
123 - public void setFirstWorkSignInTime(Date firstWorkSignInTime)  
124 - {  
125 - this.firstWorkSignInTime = firstWorkSignInTime;  
126 - }  
127 -  
128 - public Date getFirstWorkSignInTime()  
129 - {  
130 - return firstWorkSignInTime;  
131 - }  
132 - public void setFirstSignInWorkingRange(Long firstSignInWorkingRange)  
133 - {  
134 - this.firstSignInWorkingRange = firstSignInWorkingRange;  
135 - }  
136 -  
137 - public Long getFirstSignInWorkingRange()  
138 - {  
139 - return firstSignInWorkingRange;  
140 - }  
141 - public void setFirstQuittingSignInTime(Date firstQuittingSignInTime)  
142 - {  
143 - this.firstQuittingSignInTime = firstQuittingSignInTime;  
144 - }  
145 -  
146 - public Date getFirstQuittingSignInTime()  
147 - {  
148 - return firstQuittingSignInTime;  
149 - }  
150 - public void setFirstSignInDayTomorrow(Long firstSignInDayTomorrow)  
151 - {  
152 - this.firstSignInDayTomorrow = firstSignInDayTomorrow;  
153 - }  
154 -  
155 - public Long getFirstSignInDayTomorrow()  
156 - {  
157 - return firstSignInDayTomorrow;  
158 - }  
159 - public void setFirstSignInQuittingRange(Long firstSignInQuittingRange)  
160 - {  
161 - this.firstSignInQuittingRange = firstSignInQuittingRange;  
162 - }  
163 -  
164 - public Long getFirstSignInQuittingRange()  
165 - {  
166 - return firstSignInQuittingRange;  
167 - }  
168 - public void setSignInTimeOutRange(Long signInTimeOutRange)  
169 - {  
170 - this.signInTimeOutRange = signInTimeOutRange;  
171 - }  
172 -  
173 - public Long getSignInTimeOutRange()  
174 - {  
175 - return signInTimeOutRange;  
176 - }  
177 - public void setSecondFlag(Long secondFlag)  
178 - {  
179 - this.secondFlag = secondFlag;  
180 - }  
181 -  
182 - public Long getSecondFlag()  
183 - {  
184 - return secondFlag;  
185 - }  
186 - public void setSecondWorkSignInTime(Date secondWorkSignInTime)  
187 - {  
188 - this.secondWorkSignInTime = secondWorkSignInTime;  
189 - }  
190 -  
191 - public Date getSecondWorkSignInTime()  
192 - {  
193 - return secondWorkSignInTime;  
194 - }  
195 - public void setSecondSignInWorkingRange(Long secondSignInWorkingRange)  
196 - {  
197 - this.secondSignInWorkingRange = secondSignInWorkingRange;  
198 - }  
199 -  
200 - public Long getSecondSignInWorkingRange()  
201 - {  
202 - return secondSignInWorkingRange;  
203 - }  
204 - public void setSecondQuittingSignInTime(Date secondQuittingSignInTime)  
205 - {  
206 - this.secondQuittingSignInTime = secondQuittingSignInTime;  
207 - }  
208 -  
209 - public Date getSecondQuittingSignInTime()  
210 - {  
211 - return secondQuittingSignInTime;  
212 - }  
213 - public void setSecondSignInQuittingRange(Long secondSignInQuittingRange)  
214 - {  
215 - this.secondSignInQuittingRange = secondSignInQuittingRange;  
216 - }  
217 -  
218 - public Long getSecondSignInQuittingRange()  
219 - {  
220 - return secondSignInQuittingRange;  
221 - }  
222 - public void setSecondSignDayTomorrow(Long secondSignDayTomorrow)  
223 - {  
224 - this.secondSignDayTomorrow = secondSignDayTomorrow;  
225 - }  
226 -  
227 - public Long getSecondSignDayTomorrow()  
228 - {  
229 - return secondSignDayTomorrow;  
230 - }  
231 -  
232 - @Override  
233 - public String toString() {  
234 - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)  
235 - .append("id", getId())  
236 - .append("ruleName", getRuleName())  
237 - .append("workingHourPlan", getWorkingHourPlan())  
238 - .append("workingHourType", getWorkingHourType())  
239 - .append("firstWorkSignInTime", getFirstWorkSignInTime())  
240 - .append("firstSignInWorkingRange", getFirstSignInWorkingRange())  
241 - .append("firstQuittingSignInTime", getFirstQuittingSignInTime())  
242 - .append("firstSignInDayTomorrow", getFirstSignInDayTomorrow())  
243 - .append("firstSignInQuittingRange", getFirstSignInQuittingRange())  
244 - .append("signInTimeOutRange", getSignInTimeOutRange())  
245 - .append("secondFlag", getSecondFlag())  
246 - .append("secondWorkSignInTime", getSecondWorkSignInTime())  
247 - .append("secondSignInWorkingRange", getSecondSignInWorkingRange())  
248 - .append("secondQuittingSignInTime", getSecondQuittingSignInTime())  
249 - .append("secondSignInQuittingRange", getSecondSignInQuittingRange())  
250 - .append("secondSignDayTomorrow", getSecondSignDayTomorrow())  
251 - .toString();  
252 - } 92 + private Integer secondSignDayTomorrow;
  93 +
253 } 94 }
ruoyi-admin/src/main/java/com/ruoyi/scheduling/service/IRuleSchedulingService.java
1 package com.ruoyi.scheduling.service; 1 package com.ruoyi.scheduling.service;
2 2
3 import java.util.List; 3 import java.util.List;
  4 +
  5 +import com.ruoyi.pojo.vo.RuleSchedulingResponseVo;
  6 +import com.ruoyi.pojo.vo.RuleSchedulingVo;
4 import com.ruoyi.scheduling.domain.RuleScheduling; 7 import com.ruoyi.scheduling.domain.RuleScheduling;
5 8
6 /** 9 /**
@@ -58,4 +61,8 @@ public interface IRuleSchedulingService @@ -58,4 +61,8 @@ public interface IRuleSchedulingService
58 * @return 结果 61 * @return 结果
59 */ 62 */
60 public int deleteRuleSchedulingById(Long id); 63 public int deleteRuleSchedulingById(Long id);
  64 +
  65 + List<RuleSchedulingVo> selectRuleSchedulingListVo(RuleScheduling ruleScheduling);
  66 +
  67 + List<RuleSchedulingResponseVo> handleResponseRuleSchedulingList(List<RuleScheduling> list);
61 } 68 }
ruoyi-admin/src/main/java/com/ruoyi/scheduling/service/impl/RuleSchedulingServiceImpl.java
1 package com.ruoyi.scheduling.service.impl; 1 package com.ruoyi.scheduling.service.impl;
2 2
  3 +import java.text.SimpleDateFormat;
  4 +import java.util.Date;
3 import java.util.List; 5 import java.util.List;
4 -import com.ruoyi.common.utils.SecurityUtils; 6 +import java.util.stream.Collectors;
  7 +
  8 +import cn.hutool.core.collection.CollectionUtil;
  9 +import com.ruoyi.pojo.vo.RuleSchedulingResponseVo;
  10 +import com.ruoyi.pojo.vo.RuleSchedulingVo;
  11 +import org.springframework.beans.BeanUtils;
5 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
7 import com.ruoyi.scheduling.mapper.RuleSchedulingMapper; 14 import com.ruoyi.scheduling.mapper.RuleSchedulingMapper;
8 import com.ruoyi.scheduling.domain.RuleScheduling; 15 import com.ruoyi.scheduling.domain.RuleScheduling;
9 import com.ruoyi.scheduling.service.IRuleSchedulingService; 16 import com.ruoyi.scheduling.service.IRuleSchedulingService;
10 17
  18 +import static com.ruoyi.common.RuleSchedulingProperties.*;
  19 +
11 /** 20 /**
12 * 排版规则Service业务层处理 21 * 排版规则Service业务层处理
13 - * 22 + *
14 * @author guzijian 23 * @author guzijian
15 * @date 2023-08-04 24 * @date 2023-08-04
16 */ 25 */
17 @Service 26 @Service
18 -public class RuleSchedulingServiceImpl implements IRuleSchedulingService  
19 -{ 27 +public class RuleSchedulingServiceImpl implements IRuleSchedulingService {
20 @Autowired 28 @Autowired
21 private RuleSchedulingMapper ruleSchedulingMapper; 29 private RuleSchedulingMapper ruleSchedulingMapper;
22 30
23 /** 31 /**
24 * 查询排版规则 32 * 查询排版规则
25 - * 33 + *
26 * @param id 排版规则主键 34 * @param id 排版规则主键
27 * @return 排版规则 35 * @return 排版规则
28 */ 36 */
29 @Override 37 @Override
30 - public RuleScheduling selectRuleSchedulingById(Long id)  
31 - { 38 + public RuleScheduling selectRuleSchedulingById(Long id) {
32 return ruleSchedulingMapper.selectRuleSchedulingById(id); 39 return ruleSchedulingMapper.selectRuleSchedulingById(id);
33 } 40 }
34 41
35 /** 42 /**
36 * 查询排版规则列表 43 * 查询排版规则列表
37 - * 44 + *
38 * @param ruleScheduling 排版规则 45 * @param ruleScheduling 排版规则
39 * @return 排版规则 46 * @return 排版规则
40 */ 47 */
41 @Override 48 @Override
42 - public List<RuleScheduling> selectRuleSchedulingList(RuleScheduling ruleScheduling)  
43 - { 49 + public List<RuleScheduling> selectRuleSchedulingList(RuleScheduling ruleScheduling) {
44 return ruleSchedulingMapper.selectRuleSchedulingList(ruleScheduling); 50 return ruleSchedulingMapper.selectRuleSchedulingList(ruleScheduling);
45 } 51 }
46 52
47 /** 53 /**
48 * 新增排版规则 54 * 新增排版规则
49 - * 55 + *
50 * @param ruleScheduling 排版规则 56 * @param ruleScheduling 排版规则
51 * @return 结果 57 * @return 结果
52 */ 58 */
53 @Override 59 @Override
54 - public int insertRuleScheduling(RuleScheduling ruleScheduling)  
55 - { 60 + public int insertRuleScheduling(RuleScheduling ruleScheduling) {
56 return ruleSchedulingMapper.insertRuleScheduling(ruleScheduling); 61 return ruleSchedulingMapper.insertRuleScheduling(ruleScheduling);
57 } 62 }
58 63
59 /** 64 /**
60 * 修改排版规则 65 * 修改排版规则
61 - * 66 + *
62 * @param ruleScheduling 排版规则 67 * @param ruleScheduling 排版规则
63 * @return 结果 68 * @return 结果
64 */ 69 */
65 @Override 70 @Override
66 - public int updateRuleScheduling(RuleScheduling ruleScheduling)  
67 - { 71 + public int updateRuleScheduling(RuleScheduling ruleScheduling) {
68 return ruleSchedulingMapper.updateRuleScheduling(ruleScheduling); 72 return ruleSchedulingMapper.updateRuleScheduling(ruleScheduling);
69 } 73 }
70 74
71 /** 75 /**
72 * 批量删除排版规则 76 * 批量删除排版规则
73 - * 77 + *
74 * @param ids 需要删除的排版规则主键 78 * @param ids 需要删除的排版规则主键
75 * @return 结果 79 * @return 结果
76 */ 80 */
77 @Override 81 @Override
78 - public int deleteRuleSchedulingByIds(Long[] ids)  
79 - { 82 + public int deleteRuleSchedulingByIds(Long[] ids) {
80 return ruleSchedulingMapper.deleteRuleSchedulingByIds(ids); 83 return ruleSchedulingMapper.deleteRuleSchedulingByIds(ids);
81 } 84 }
82 85
83 /** 86 /**
84 * 删除排版规则信息 87 * 删除排版规则信息
85 - * 88 + *
86 * @param id 排版规则主键 89 * @param id 排版规则主键
87 * @return 结果 90 * @return 结果
88 */ 91 */
89 @Override 92 @Override
90 - public int deleteRuleSchedulingById(Long id)  
91 - { 93 + public int deleteRuleSchedulingById(Long id) {
92 return ruleSchedulingMapper.deleteRuleSchedulingById(id); 94 return ruleSchedulingMapper.deleteRuleSchedulingById(id);
93 } 95 }
  96 +
  97 + @Override
  98 + public List<RuleSchedulingVo> selectRuleSchedulingListVo(RuleScheduling ruleScheduling) {
  99 + List<RuleScheduling> list = ruleSchedulingMapper.selectRuleSchedulingList(ruleScheduling);
  100 + return handleRuleScheduling(list);
  101 + }
  102 +
  103 + @Override
  104 + public List<RuleSchedulingResponseVo> handleResponseRuleSchedulingList(List<RuleScheduling> list) {
  105 + return list.stream()
  106 + .map(item ->{
  107 + RuleSchedulingResponseVo vo = new RuleSchedulingResponseVo();
  108 + BeanUtils.copyProperties(item,vo);
  109 + vo.setRangeTime(handleRuleSchedulingRangeTime(item));
  110 + return vo;
  111 + })
  112 + .collect(Collectors.toList());
  113 + }
  114 +
  115 + private List<RuleSchedulingVo> handleRuleScheduling(List<RuleScheduling> list) {
  116 + if (CollectionUtil.isEmpty(list)) {
  117 + return null;
  118 + }
  119 +
  120 + // 处理返回数据
  121 + return list
  122 + .stream()
  123 + .map(item -> {
  124 + RuleSchedulingVo vo = new RuleSchedulingVo();
  125 + vo.setRuleName(item.getRuleName());
  126 + vo.setId(item.getId());
  127 + vo.setRangeTime(handleRuleSchedulingRangeTime(item));
  128 + return vo;
  129 + })
  130 + .collect(Collectors.toList());
  131 +
  132 + }
  133 +
  134 + private String handleRuleSchedulingRangeTime(RuleScheduling item) {
  135 + // 处理存在分段的数据
  136 + if (HAVE_SEGMENTATION.equals(item.getSecondFlag())) {
  137 + return handleSegmentation(item);
  138 + }
  139 + // 处理不存在分段的数据
  140 + else {
  141 + return handleNoSegmentation(item);
  142 + }
  143 + }
  144 +
  145 + private String handleNoSegmentation(RuleScheduling item) {
  146 + // 处理不隔天的情况
  147 + if (TOMORROW_NO.equals(item.getFirstSignInDayTomorrow())) {
  148 + return transformTimeType(item.getFirstWorkSignInTime()) + TOMORROW_NO_STRING + transformTimeType(item.getFirstQuittingSignInTime());
  149 + }
  150 + // 隔天
  151 + else {
  152 + return transformTimeType(item.getFirstWorkSignInTime()) + TOMORROW_YES_STRING + transformTimeType(item.getFirstQuittingSignInTime());
  153 + }
  154 + }
  155 +
  156 + private String handleSegmentation(RuleScheduling item) {
  157 + // 隔天
  158 + String firstRangeTimeString = handleNoSegmentation(item);
  159 + String secondRangeTimeString = handleHaveSegmentation(item);
  160 + return firstRangeTimeString + ";" + secondRangeTimeString;
  161 + }
  162 +
  163 + private String handleHaveSegmentation(RuleScheduling item) {
  164 + // 处理不隔天的情况
  165 + if (TOMORROW_NO.equals(item.getSecondSignDayTomorrow())) {
  166 + return transformTimeType(item.getSecondWorkSignInTime()) + TOMORROW_NO_STRING + transformTimeType(item.getSecondQuittingSignInTime());
  167 + }
  168 + // 隔天
  169 + else {
  170 + return transformTimeType(item.getSecondWorkSignInTime()) + TOMORROW_YES_STRING + transformTimeType(item.getSecondQuittingSignInTime());
  171 + }
  172 + }
  173 +
  174 + private String transformTimeType(Date time) {
  175 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
  176 + return simpleDateFormat.format(time);
  177 + }
94 } 178 }
ruoyi-admin/src/main/java/com/ruoyi/schedulingAssociateNum/domain/RuleNumScheduling.java deleted 100644 → 0
1 -package com.ruoyi.schedulingAssociateNum.domain;  
2 -  
3 -import org.apache.commons.lang3.builder.ToStringBuilder;  
4 -import org.apache.commons.lang3.builder.ToStringStyle;  
5 -import com.ruoyi.common.annotation.Excel;  
6 -import com.ruoyi.common.core.domain.BaseEntity;  
7 -  
8 -/**  
9 - * 排班规则和班次关联对象 rule_num_scheduling  
10 - *  
11 - * @author 古自健  
12 - * @date 2023-08-07  
13 - */  
14 -public class RuleNumScheduling extends BaseEntity  
15 -{  
16 - private static final long serialVersionUID = 1L;  
17 -  
18 - /** 主键 */  
19 - private Long id;  
20 -  
21 - /** 班次id */  
22 - @Excel(name = "班次id")  
23 - private Long ruleNumId;  
24 -  
25 - /** 规则id集合 */  
26 - @Excel(name = "规则id集合")  
27 - private String ruleSchedulingId;  
28 -  
29 - /** 排班名称 */  
30 - @Excel(name = "排班名称")  
31 - private String matchName;  
32 -  
33 - public void setId(Long id)  
34 - {  
35 - this.id = id;  
36 - }  
37 -  
38 - public Long getId()  
39 - {  
40 - return id;  
41 - }  
42 - public void setRuleNumId(Long ruleNumId)  
43 - {  
44 - this.ruleNumId = ruleNumId;  
45 - }  
46 -  
47 - public Long getRuleNumId()  
48 - {  
49 - return ruleNumId;  
50 - }  
51 - public void setRuleSchedulingId(String ruleSchedulingId)  
52 - {  
53 - this.ruleSchedulingId = ruleSchedulingId;  
54 - }  
55 -  
56 - public String getRuleSchedulingId()  
57 - {  
58 - return ruleSchedulingId;  
59 - }  
60 - public void setMatchName(String matchName)  
61 - {  
62 - this.matchName = matchName;  
63 - }  
64 -  
65 - public String getMatchName()  
66 - {  
67 - return matchName;  
68 - }  
69 -  
70 - @Override  
71 - public String toString() {  
72 - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)  
73 - .append("id", getId())  
74 - .append("ruleNumId", getRuleNumId())  
75 - .append("ruleSchedulingId", getRuleSchedulingId())  
76 - .append("matchName", getMatchName())  
77 - .toString();  
78 - }  
79 -}  
ruoyi-admin/src/main/java/com/ruoyi/service/AppService.java
@@ -96,7 +96,6 @@ public class AppService { @@ -96,7 +96,6 @@ public class AppService {
96 96
97 public void checkAppHeart(HeartPackageVo vo) { 97 public void checkAppHeart(HeartPackageVo vo) {
98 Equipment equipment = new Equipment(); 98 Equipment equipment = new Equipment();
99 - equipment.setOnlineClient(DEVICE_ONLINE);  
100 equipment.setLastHeartRes(new Date()); 99 equipment.setLastHeartRes(new Date());
101 equipment.setDeviceId(vo.getDeviceId()); 100 equipment.setDeviceId(vo.getDeviceId());
102 equipment.setRemark("版本号:" + vo.getVersionNum()); 101 equipment.setRemark("版本号:" + vo.getVersionNum());
ruoyi-admin/src/main/java/com/ruoyi/service/AttendanceService.java 0 → 100644
  1 +package com.ruoyi.service;
  2 +
  3 +import com.ruoyi.pojo.vo.PeopleResponseVo;
  4 +import com.ruoyi.pojo.vo.SchedulingRequestVo;
  5 +
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * @author 20412
  10 + */
  11 +public interface AttendanceService {
  12 + /**
  13 + * 获取人员信息
  14 + * @param id
  15 + * @return
  16 + */
  17 + List<PeopleResponseVo> getDriverInfo(Long id);
  18 +
  19 + List<SchedulingRequestVo> getSchedulingList(SchedulingRequestVo vo);
  20 +}
ruoyi-admin/src/main/java/com/ruoyi/service/EmailService.java 0 → 100644
  1 +package com.ruoyi.service;
  2 +
  3 +import com.ruoyi.email.domain.EmailConfig;
  4 +import com.ruoyi.email.service.IEmailConfigService;
  5 +import com.ruoyi.domain.DriverScheduling;
  6 +import com.ruoyi.utils.ConstDateUtil;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Value;
  11 +import org.springframework.mail.javamail.JavaMailSender;
  12 +import org.springframework.mail.javamail.MimeMessageHelper;
  13 +import org.springframework.stereotype.Service;
  14 +
  15 +import javax.mail.internet.MimeMessage;
  16 +import java.math.BigDecimal;
  17 +import java.util.Arrays;
  18 +import java.util.Date;
  19 +import java.util.List;
  20 +import java.util.Objects;
  21 +import java.util.stream.Collectors;
  22 +
  23 +/**
  24 + * 发送邮箱服务
  25 + *
  26 + * @author 20412
  27 + */
  28 +@Service
  29 +public class EmailService {
  30 + @Autowired
  31 + private JavaMailSender javaMailSender;
  32 +
  33 + @Autowired
  34 + private IEmailConfigService emailConfigService;
  35 +
  36 + private static final Logger log = LoggerFactory.getLogger(EmailService.class);
  37 +
  38 + @Value("${spring.mail.form}")
  39 + private String from;
  40 +
  41 + @Value("${spring.mail.nickname}")
  42 + private String name;
  43 +
  44 + public void sendWarningEmail(DriverScheduling item, Date signTime, BigDecimal alcoholIntake) {
  45 +
  46 + // TODO 支持发送多人 读取配置文件选着发送对象
  47 + List<EmailConfig> emailConfigs = emailConfigService.selectRecipientsEmailConfigList();
  48 + for (EmailConfig config : emailConfigs) {
  49 + String recipientEmail = config.getEmail().trim();
  50 + List<String> emails = getRecipientsEmailIds(config);
  51 + MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  52 + try {
  53 + MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
  54 + mimeMessageHelper.setFrom(from,name);
  55 + mimeMessageHelper.setTo(recipientEmail);
  56 + mimeMessageHelper.setSubject("重要警示:酒精测试通知");
  57 + if (!Objects.isNull(emails)) mimeMessageHelper.setCc(emails.toArray(new String[0]));
  58 + String jobCode = "工号:" + item.getJobCode() + "\n";
  59 + String name = "姓名:" + item.getName() + "\n";
  60 + String posts = "工种:" + item.getPosts() + "\n";
  61 + String fleetName = "车队:" + item.getFleetName() + "\n";
  62 + String scheduling = "排班:" + (Objects.isNull(item.getScheduleDate()) ? "无排班" : "有排班") + "\n";
  63 + String signDate = "打卡时间:" + ConstDateUtil.formatDate("yyyy-MM-dd HH:mm:ss", signTime) + "\n";
  64 + String cause = "原因:酒精测试超标,当前测试值达到" + alcoholIntake.toString() + "mg/100ml。属于" + getResultString(alcoholIntake);
  65 +
  66 + String content = jobCode + name + posts + fleetName + scheduling + signDate + cause;
  67 + mimeMessageHelper.setText(content);
  68 + javaMailSender.send(mimeMessage);
  69 + log.info("发送给:" + recipientEmail + "邮件发送成功");
  70 + } catch (Exception e) {
  71 + log.info("发送给:" + recipientEmail + "邮件发送失败");
  72 + log.error(e.getMessage());
  73 + }
  74 + }
  75 +
  76 + }
  77 +
  78 + private List<String> getRecipientsEmailIds(EmailConfig config) {
  79 + if (!Objects.isNull(config.getParentId())){
  80 + return emailConfigService
  81 + .selectEmailConfigListByIds(Arrays.stream(config.getParentId()
  82 + .split(","))
  83 + .map(Long::parseLong)
  84 + .collect(Collectors.toList()))
  85 + .stream()
  86 + .map(EmailConfig::getEmail)
  87 + .collect(Collectors.toList());
  88 + }
  89 + return null;
  90 + }
  91 +
  92 + private String getResultString(BigDecimal alcoholIntake) {
  93 + if (alcoholIntake.compareTo(new BigDecimal(20)) >= 0 && alcoholIntake.compareTo(new BigDecimal(80)) < 0)
  94 + return "饮酒后驾驶机动车";
  95 + else
  96 + return "醉酒后驾驶机动车";
  97 + }
  98 +}
ruoyi-admin/src/main/java/com/ruoyi/service/ReportService.java
1 package com.ruoyi.service; 1 package com.ruoyi.service;
2 2
3 -import com.ruoyi.driver.domain.Driver;  
4 import com.ruoyi.driver.mapper.DriverMapper; 3 import com.ruoyi.driver.mapper.DriverMapper;
5 import com.ruoyi.driver.mapper.DriverSchedulingMapper; 4 import com.ruoyi.driver.mapper.DriverSchedulingMapper;
6 -import com.ruoyi.eexception.domain.EquipmentException;  
7 import com.ruoyi.eexception.mapper.EquipmentExceptionMapper; 5 import com.ruoyi.eexception.mapper.EquipmentExceptionMapper;
8 -import com.ruoyi.in.domain.SignIn;  
9 import com.ruoyi.in.mapper.SignInMapper; 6 import com.ruoyi.in.mapper.SignInMapper;
10 -import com.ruoyi.pojo.entity.DriverScheduling; 7 +import com.ruoyi.domain.DriverScheduling;
11 import com.ruoyi.pojo.request.ReportViewRequestVo; 8 import com.ruoyi.pojo.request.ReportViewRequestVo;
12 import com.ruoyi.pojo.request.ReportErrorRequestVo; 9 import com.ruoyi.pojo.request.ReportErrorRequestVo;
13 import com.ruoyi.pojo.response.*; 10 import com.ruoyi.pojo.response.*;
14 -import com.ruoyi.utils.ConstDateUtil;  
15 import org.springframework.beans.BeanUtils; 11 import org.springframework.beans.BeanUtils;
16 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
17 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
@@ -19,7 +15,6 @@ import org.springframework.stereotype.Service; @@ -19,7 +15,6 @@ import org.springframework.stereotype.Service;
19 import javax.annotation.Resource; 15 import javax.annotation.Resource;
20 import javax.servlet.http.HttpServletResponse; 16 import javax.servlet.http.HttpServletResponse;
21 import javax.validation.constraints.NotBlank; 17 import javax.validation.constraints.NotBlank;
22 -import java.text.SimpleDateFormat;  
23 import java.time.LocalDate; 18 import java.time.LocalDate;
24 import java.time.YearMonth; 19 import java.time.YearMonth;
25 import java.time.format.DateTimeFormatter; 20 import java.time.format.DateTimeFormatter;
@@ -28,8 +23,6 @@ import java.util.stream.Collectors; @@ -28,8 +23,6 @@ import java.util.stream.Collectors;
28 23
29 import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; 24 import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT;
30 import static com.ruoyi.common.ConstSignInConstSignInProperties.*; 25 import static com.ruoyi.common.ConstSignInConstSignInProperties.*;
31 -import static com.ruoyi.common.ErrorTypeProperties.EQUIPMENT_ERROR;  
32 -import static com.ruoyi.common.ErrorTypeProperties.SIGN_IN_ERROR;  
33 import static com.ruoyi.common.ReportProperties.DAY; 26 import static com.ruoyi.common.ReportProperties.DAY;
34 import static com.ruoyi.common.ReportProperties.MONTH; 27 import static com.ruoyi.common.ReportProperties.MONTH;
35 28
@@ -96,7 +89,7 @@ public class ReportService { @@ -96,7 +89,7 @@ public class ReportService {
96 List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null); 89 List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null);
97 Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800); 90 Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800);
98 List<ExportReportViewResponseVo> vo = new ArrayList<>(800); 91 List<ExportReportViewResponseVo> vo = new ArrayList<>(800);
99 - handleResultMap(date, resultMap, schedulingList); 92 + handlerResultMap(date, resultMap, schedulingList);
100 handleResultList(vo, resultMap); 93 handleResultList(vo, resultMap);
101 return vo; 94 return vo;
102 } 95 }
@@ -108,7 +101,7 @@ public class ReportService { @@ -108,7 +101,7 @@ public class ReportService {
108 } 101 }
109 } 102 }
110 103
111 - private void handleResultMap(@NotBlank String date, Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) { 104 + private void handlerResultMap(@NotBlank String date, Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) {
112 for (DriverScheduling item : schedulingList) { 105 for (DriverScheduling item : schedulingList) {
113 String key = date + item.getJobCode(); 106 String key = date + item.getJobCode();
114 if (Objects.isNull(resultMap.get(key))) { 107 if (Objects.isNull(resultMap.get(key))) {
@@ -156,14 +149,14 @@ public class ReportService { @@ -156,14 +149,14 @@ public class ReportService {
156 List<DriverScheduling> toDay = schedulingMapper.queryToDay(vo.getDate(), vo.getName(), vo.getJobCode(), vo.getLineName()); 149 List<DriverScheduling> toDay = schedulingMapper.queryToDay(vo.getDate(), vo.getName(), vo.getJobCode(), vo.getLineName());
157 for (DriverScheduling scheduling : toDay) { 150 for (DriverScheduling scheduling : toDay) {
158 ReportDetailResponseVo reportDetailResponseVo = new ReportDetailResponseVo(); 151 ReportDetailResponseVo reportDetailResponseVo = new ReportDetailResponseVo();
159 - handleReportDetail(reportDetailResponseVo, scheduling); 152 + handlerReportDetail(reportDetailResponseVo, scheduling);
160 responseVos.add(reportDetailResponseVo); 153 responseVos.add(reportDetailResponseVo);
161 } 154 }
162 responseVos.sort(Comparator.comparing(ReportDetailResponseVo::getPlanTime)); 155 responseVos.sort(Comparator.comparing(ReportDetailResponseVo::getPlanTime));
163 return responseVos; 156 return responseVos;
164 } 157 }
165 158
166 - private void handleReportDetail(ReportDetailResponseVo reportDetailResponseVo, DriverScheduling scheduling) { 159 + private void handlerReportDetail(ReportDetailResponseVo reportDetailResponseVo, DriverScheduling scheduling) {
167 BeanUtils.copyProperties(scheduling, reportDetailResponseVo); 160 BeanUtils.copyProperties(scheduling, reportDetailResponseVo);
168 reportDetailResponseVo.setPlanAction(scheduling.getBcType().equals(BC_TYPE_OUT) ? SIGN_IN_STRING : SIGN_IN_OUT_STRING); 161 reportDetailResponseVo.setPlanAction(scheduling.getBcType().equals(BC_TYPE_OUT) ? SIGN_IN_STRING : SIGN_IN_OUT_STRING);
169 reportDetailResponseVo.setPlanTime(scheduling.getBcType().equals(BC_TYPE_OUT) ? new Date(scheduling.getFcsjT()) : new Date(scheduling.getZdsjT())); 162 reportDetailResponseVo.setPlanTime(scheduling.getBcType().equals(BC_TYPE_OUT) ? new Date(scheduling.getFcsjT()) : new Date(scheduling.getZdsjT()));
ruoyi-admin/src/main/java/com/ruoyi/service/SchedulingService.java
@@ -7,7 +7,7 @@ import com.ruoyi.in.domain.SignIn; @@ -7,7 +7,7 @@ import com.ruoyi.in.domain.SignIn;
7 import com.ruoyi.in.mapper.SignInMapper; 7 import com.ruoyi.in.mapper.SignInMapper;
8 import com.ruoyi.pojo.DriverSignRecommendation; 8 import com.ruoyi.pojo.DriverSignRecommendation;
9 import com.ruoyi.pojo.GlobalIndex; 9 import com.ruoyi.pojo.GlobalIndex;
10 -import com.ruoyi.pojo.entity.DriverScheduling; 10 +import com.ruoyi.domain.DriverScheduling;
11 import com.ruoyi.pojo.request.ReportViewRequestVo; 11 import com.ruoyi.pojo.request.ReportViewRequestVo;
12 import com.ruoyi.pojo.response.ReportViewResponseVo; 12 import com.ruoyi.pojo.response.ReportViewResponseVo;
13 import com.ruoyi.utils.ConstDateUtil; 13 import com.ruoyi.utils.ConstDateUtil;
@@ -118,7 +118,7 @@ public class SchedulingService { @@ -118,7 +118,7 @@ public class SchedulingService {
118 118
119 // 更新最新的签到记录判断是否需要更新考勤 119 // 更新最新的签到记录判断是否需要更新考勤
120 // 记录为空直接插入记录 120 // 记录为空直接插入记录
121 - if (Objects.isNull(dto.get(globalIndex.getIndex()).getSignInId())) { 121 + if (Objects.isNull(dto.get(globalIndex.getIndex()).getSignInId()) || dto.size() == 1) {
122 schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake()); 122 schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
123 // 更新缓存 123 // 更新缓存
124 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn); 124 nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn);
@@ -130,12 +130,12 @@ public class SchedulingService { @@ -130,12 +130,12 @@ public class SchedulingService {
130 } 130 }
131 // 之前的有效 131 // 之前的有效
132 else { 132 else {
133 - handleRecord(dto, signIn, globalIndex); 133 + handlerRecord(dto, signIn, globalIndex);
134 } 134 }
135 135
136 } 136 }
137 137
138 - private void handleRecord(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex) { 138 + private void handlerRecord(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex) {
139 if (globalIndex.getIndex() == dto.size() - 1) { 139 if (globalIndex.getIndex() == dto.size() - 1) {
140 return; 140 return;
141 } 141 }
@@ -210,13 +210,13 @@ public class SchedulingService { @@ -210,13 +210,13 @@ public class SchedulingService {
210 for (String key : orangeMap.keySet()) { 210 for (String key : orangeMap.keySet()) {
211 List<DriverScheduling> list = orangeMap.get(key); 211 List<DriverScheduling> list = orangeMap.get(key);
212 ReportViewResponseVo vo1 = new ReportViewResponseVo(); 212 ReportViewResponseVo vo1 = new ReportViewResponseVo();
213 - handleScheduling(list, vo1); 213 + handlerScheduling(list, vo1);
214 resultMap.put(key, vo1); 214 resultMap.put(key, vo1);
215 } 215 }
216 return new ArrayList<>(resultMap.values()); 216 return new ArrayList<>(resultMap.values());
217 } 217 }
218 218
219 - private static void handleScheduling(List<DriverScheduling> list, ReportViewResponseVo vo) { 219 + private static void handlerScheduling(List<DriverScheduling> list, ReportViewResponseVo vo) {
220 int planSignInCount = 0; 220 int planSignInCount = 0;
221 int actualSignInCount = 0; 221 int actualSignInCount = 0;
222 int planSignOutCount = 0; 222 int planSignOutCount = 0;
@@ -249,4 +249,8 @@ public class SchedulingService { @@ -249,4 +249,8 @@ public class SchedulingService {
249 vo.setActualSignInCount(actualSignInCount); 249 vo.setActualSignInCount(actualSignInCount);
250 vo.setActualSignOutCount(actualSignOutCount); 250 vo.setActualSignOutCount(actualSignOutCount);
251 } 251 }
  252 +
  253 + public List<DriverScheduling> queryToDay(String date) {
  254 + return schedulingMapper.queryToDay(date,null,null,null);
  255 + }
252 } 256 }
ruoyi-admin/src/main/java/com/ruoyi/service/ThreadJobService.java
@@ -13,12 +13,16 @@ import com.ruoyi.driver.mapper.DriverMapper; @@ -13,12 +13,16 @@ import com.ruoyi.driver.mapper.DriverMapper;
13 import com.ruoyi.driver.mapper.DriverSchedulingMapper; 13 import com.ruoyi.driver.mapper.DriverSchedulingMapper;
14 import com.ruoyi.eexception.domain.EquipmentException; 14 import com.ruoyi.eexception.domain.EquipmentException;
15 import com.ruoyi.eexception.mapper.EquipmentExceptionMapper; 15 import com.ruoyi.eexception.mapper.EquipmentExceptionMapper;
  16 +import com.ruoyi.equipment.domain.Equipment;
  17 +import com.ruoyi.equipment.domain.EquipmentLog;
  18 +import com.ruoyi.equipment.mapper.EquipmentMapper;
  19 +import com.ruoyi.errorScheduling.domain.ErrorJobcode;
  20 +import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
16 import com.ruoyi.in.domain.SignIn; 21 import com.ruoyi.in.domain.SignIn;
17 import com.ruoyi.job.DriverJob; 22 import com.ruoyi.job.DriverJob;
18 -import com.ruoyi.pojo.entity.DriverScheduling; 23 +import com.ruoyi.domain.DriverScheduling;
19 import com.ruoyi.pojo.response.ResponseSchedulingDto; 24 import com.ruoyi.pojo.response.ResponseSchedulingDto;
20 import com.ruoyi.utils.ConstDateUtil; 25 import com.ruoyi.utils.ConstDateUtil;
21 -import com.ruoyi.utils.ToolUtils;  
22 import lombok.extern.slf4j.Slf4j; 26 import lombok.extern.slf4j.Slf4j;
23 import org.springframework.beans.BeanUtils; 27 import org.springframework.beans.BeanUtils;
24 import org.springframework.beans.factory.annotation.Autowired; 28 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,6 +59,12 @@ import static com.ruoyi.common.ConstSignInConstSignInProperties.SIGN_NO_EX_NUM; @@ -55,6 +59,12 @@ import static com.ruoyi.common.ConstSignInConstSignInProperties.SIGN_NO_EX_NUM;
55 public class ThreadJobService { 59 public class ThreadJobService {
56 60
57 @Autowired 61 @Autowired
  62 + private IErrorJobcodeService errorJobcodeService;
  63 +
  64 + @Resource
  65 + private EmailService emailService;
  66 +
  67 + @Autowired
58 private DriverMapper driverMapper; 68 private DriverMapper driverMapper;
59 69
60 @Autowired 70 @Autowired
@@ -70,6 +80,9 @@ public class ThreadJobService { @@ -70,6 +80,9 @@ public class ThreadJobService {
70 @Autowired 80 @Autowired
71 private EquipmentExceptionMapper exceptionMapper; 81 private EquipmentExceptionMapper exceptionMapper;
72 82
  83 + @Autowired
  84 + private EquipmentMapper equipmentMapper;
  85 +
73 @Value("${api.headImage}") 86 @Value("${api.headImage}")
74 private String headImagePre; 87 private String headImagePre;
75 88
@@ -128,8 +141,8 @@ public class ThreadJobService { @@ -128,8 +141,8 @@ public class ThreadJobService {
128 } 141 }
129 142
130 @Async 143 @Async
131 - public void asyncInsertExceptionRecord(SignIn signIn){  
132 - if (!SIGN_NO_EX_NUM.equals(signIn.getExType())){ 144 + public void asyncInsertExceptionRecord(SignIn signIn) {
  145 + if (!SIGN_NO_EX_NUM.equals(signIn.getExType())) {
133 EquipmentException exception = new EquipmentException(); 146 EquipmentException exception = new EquipmentException();
134 exception.setExType(signIn.getExType()); 147 exception.setExType(signIn.getExType());
135 exception.setDeviceId(signIn.getDeviceId()); 148 exception.setDeviceId(signIn.getDeviceId());
@@ -160,8 +173,35 @@ public class ThreadJobService { @@ -160,8 +173,35 @@ public class ThreadJobService {
160 log.error("保存数据是出现了异常:{}", e.getMessage()); 173 log.error("保存数据是出现了异常:{}", e.getMessage());
161 } 174 }
162 } 175 }
  176 + }
  177 +
  178 + /**
  179 + * 异步发送邮件
  180 + *
  181 + * @param dto
  182 + * @param signIn
  183 + * @param driver
  184 + */
  185 + @Async
  186 + public void asyncSendEmail(List<DriverScheduling> dto, Integer index, SignIn signIn, Driver driver) {
  187 + DriverScheduling item = null;
  188 + if (CollectionUtil.isEmpty(dto)) {
  189 + item = new DriverScheduling();
  190 + handlerNoScheduling(item, signIn, driver);
  191 + // 无排班
  192 + emailService.sendWarningEmail(item, signIn.getCreateTime(), signIn.getAlcoholIntake());
  193 + } else {
  194 + // 有排班
  195 + emailService.sendWarningEmail(dto.get(index), signIn.getCreateTime(), signIn.getAlcoholIntake());
  196 + }
163 197
  198 + }
164 199
  200 + private void handlerNoScheduling(DriverScheduling item, SignIn signIn, Driver driver) {
  201 + BeanUtils.copyProperties(signIn, item);
  202 + item.setName(driver.getPersonnelName());
  203 + item.setFleetName(driver.getFleetName());
  204 + item.setPosts(driver.getPosts());
165 } 205 }
166 206
167 private void insertDriverInfo(String token, Driver driver) { 207 private void insertDriverInfo(String token, Driver driver) {
@@ -281,20 +321,31 @@ public class ThreadJobService { @@ -281,20 +321,31 @@ public class ThreadJobService {
281 @Async 321 @Async
282 @Transactional(rollbackFor = {Exception.class}) 322 @Transactional(rollbackFor = {Exception.class})
283 public void asyncComputedScheduling(Map<String, List<ResponseSchedulingDto>> originSchedulingMap) { 323 public void asyncComputedScheduling(Map<String, List<ResponseSchedulingDto>> originSchedulingMap) {
284 - //查询当天是否保存过考情表 如果存在则保存  
285 - List<DriverScheduling> dto = schedulingMapper.queryToDay(ConstDateUtil.formatDate("yyyy-MM-dd"), null,null,null);  
286 - // 存入缓存 324 + //查询当天是否保存过考情表 如果不存在则保存
  325 + Map<String, List<DriverScheduling>> dto = nowSchedulingCache.getCacheScheduling(ConstDateUtil.formatDate(new Date()));
287 if (!CollectionUtil.isEmpty(dto) || originSchedulingMap.size() == 0) { 326 if (!CollectionUtil.isEmpty(dto) || originSchedulingMap.size() == 0) {
288 - String date = ConstDateUtil.formatDate(new Date());  
289 - if (CollectionUtil.isEmpty(nowSchedulingCache.getCacheScheduling(date))){  
290 - Map<String, List<DriverScheduling>> resultMap =new HashMap<>(800);  
291 - handleResultMap(resultMap,dto);  
292 - nowSchedulingCache.setCacheScheduling(date,resultMap);  
293 - }  
294 return; 327 return;
295 } 328 }
  329 + List<DriverScheduling> bcList = getBcList(originSchedulingMap);
  330 + // 插入排班
  331 + schedulingMapper.insertRoster(bcList);
  332 + // 异常数据过多,不通过自增获取id再次查询获取
  333 + bcList = schedulingMapper.queryToDay(ConstDateUtil.formatDate("yyyy-MM-dd"), null, null, null);
  334 + // 处理缓存和错误排班
  335 + String date = ConstDateUtil.formatDate(new Date());
  336 + if (!CollectionUtil.isEmpty(bcList)) {
  337 + Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800);
  338 + NowSchedulingCache.handlerResultMap(resultMap, bcList);
  339 + // 更新缓存
  340 + nowSchedulingCache.setCacheScheduling(date, resultMap);
  341 + // 获取错误排班
  342 + List<ErrorJobcode> errorScheduling = getErrorScheduling(resultMap);
  343 + // 插入错误排班
  344 + errorJobcodeService.insertBatchErrorJobcode(errorScheduling);
  345 + }
  346 + }
296 347
297 - 348 + private List<DriverScheduling> getBcList(Map<String, List<ResponseSchedulingDto>> originSchedulingMap) {
298 List<DriverScheduling> bcList = new ArrayList<>(1000); 349 List<DriverScheduling> bcList = new ArrayList<>(1000);
299 for (String key : originSchedulingMap.keySet()) { 350 for (String key : originSchedulingMap.keySet()) {
300 List<ResponseSchedulingDto> schedulingList = originSchedulingMap.get(key); 351 List<ResponseSchedulingDto> schedulingList = originSchedulingMap.get(key);
@@ -302,29 +353,148 @@ public class ThreadJobService { @@ -302,29 +353,148 @@ public class ThreadJobService {
302 .filter(item -> BC_TYPE_IN.equals(item.getBcType()) || BC_TYPE_OUT.equals(item.getBcType())) 353 .filter(item -> BC_TYPE_IN.equals(item.getBcType()) || BC_TYPE_OUT.equals(item.getBcType()))
303 .map(item -> { 354 .map(item -> {
304 DriverScheduling scheduling = new DriverScheduling(); 355 DriverScheduling scheduling = new DriverScheduling();
305 - BeanUtils.copyProperties(item, scheduling); 356 + BeanUtils.copyProperties(item, scheduling, "id");
306 return scheduling; 357 return scheduling;
307 }).collect(Collectors.toList()); 358 }).collect(Collectors.toList());
308 - if (nowScheduling.size() > 4){  
309 - System.out.println("问题工号:" + key);  
310 - }  
311 - if (nowScheduling.size() % 2 == 1){  
312 - System.out.println("问题工号:" + key); 359 + if (nowScheduling.size() % 2 == 1 && nowScheduling.size() > 2) {
  360 + // 处理错误班次
  361 + nowScheduling = handleErrorBc(schedulingList);
313 } 362 }
314 bcList.addAll(nowScheduling); 363 bcList.addAll(nowScheduling);
315 } 364 }
316 - schedulingMapper.insertRoster(bcList); 365 + return bcList;
  366 + }
  367 +
  368 + public static List<ErrorJobcode> getErrorScheduling(Map<String, List<DriverScheduling>> resultMap) {
  369 + List<ErrorJobcode> errorList = new ArrayList<>();
  370 + // 循环处理
  371 + for (String key : resultMap.keySet()) {
  372 + List<DriverScheduling> schedulingList = resultMap.get(key);
  373 + schedulingList.sort(Comparator.comparing(DriverScheduling::getFcsjT));
  374 + // 处理单进|出场
  375 + if (resultMap.get(key).size() == 1) {
  376 + errorList.add(handlerSingleBc(schedulingList));
  377 + } else {
  378 + // 处理进出场不匹配
  379 + ErrorJobcode errorJobcode = handlerBcNoMatch(schedulingList);
  380 + if (errorJobcode != null) errorList.add(errorJobcode);
  381 + }
  382 + }
  383 + return errorList;
  384 + }
  385 +
  386 + public static ErrorJobcode handlerBcNoMatch(List<DriverScheduling> driverSchedulingList) {
  387 +
  388 + ErrorJobcode er = new ErrorJobcode();
  389 + BeanUtils.copyProperties(driverSchedulingList.get(0), er);
  390 + er.setCreateTime(driverSchedulingList.get(0).getScheduleDate());
  391 + // 出场次数
  392 + int bcOutCount = 0;
  393 + // 进场次数
  394 + int bcInCount = 0;
  395 + // 连续进场场次
  396 + boolean inContinuousFlag = false;
  397 + // 连续出场场次
  398 + boolean outContinuousFlag = false;
  399 + int length = driverSchedulingList.size();
  400 + for (int i = 0; i < length; i++) {
  401 + if (i < length - 1) {
  402 + // 判断是否出现连续
  403 + if (driverSchedulingList.get(i) == driverSchedulingList.get(i + 1)) {
  404 + if (BC_TYPE_IN.equals(driverSchedulingList.get(i).getBcType())) inContinuousFlag = true;
  405 + else outContinuousFlag = true;
  406 + }
  407 + }
  408 + if (BC_TYPE_IN.equals(driverSchedulingList.get(i).getBcType())) bcInCount++;
  409 + else bcOutCount++;
  410 + }
  411 + // 匹配进出场顺序
  412 + if (bcOutCount == bcInCount) {
  413 + if (inContinuousFlag || outContinuousFlag) {
  414 + er.setRemark(inContinuousFlag ? "连续进场" : "连续出场");
  415 + return er;
  416 + }
  417 + } else {
  418 + er.setRemark(bcOutCount > bcInCount ? "出场次数与进场次数不匹配,多于进场" : "进场次数与进场次数不匹配,多于出场");
  419 + return er;
  420 + }
  421 +
  422 + return null;
  423 +
  424 + }
  425 +
  426 + public static ErrorJobcode handlerSingleBc(List<DriverScheduling> driverSchedulingList) {
  427 + ErrorJobcode errorJobcode = new ErrorJobcode();
  428 + BeanUtils.copyProperties(driverSchedulingList.get(0), errorJobcode);
  429 + errorJobcode.setCreateTime(driverSchedulingList.get(0).getScheduleDate());
  430 + errorJobcode.setRemark(BC_TYPE_IN.equals(driverSchedulingList.get(0).getBcType()) ? "单个场次,没有出场" : "单个场次,没有进场");
  431 + return errorJobcode;
  432 + }
  433 +
  434 + private List<DriverScheduling> handleErrorBc(List<ResponseSchedulingDto> nowScheduling) {
  435 + // 处理两个进场
  436 + return handlerTowIn(nowScheduling);
  437 + }
  438 +
  439 + private List<DriverScheduling> handlerTowIn(List<ResponseSchedulingDto> nowScheduling) {
  440 + nowScheduling = nowScheduling.stream().filter(item -> BC_TYPE_IN.equals(item.getBcType()) || BC_TYPE_OUT.equals(item.getBcType())).collect(Collectors.toList());
  441 + if (nowScheduling.get(nowScheduling.size() - 1).getBcType().equals(BC_TYPE_IN)) {
  442 + // 连续的进场 判断哪个适配
  443 + ResponseSchedulingDto scheduling1 = nowScheduling.get(nowScheduling.size() - 1);
  444 + ResponseSchedulingDto scheduling2 = nowScheduling.get(nowScheduling.size() - 2);
  445 + // 判断后移除
  446 + if ("秀沁路汽车站".equals(scheduling1.getZdzName())) {
  447 + nowScheduling.remove(nowScheduling.size() - 2);
  448 + }
  449 + if ("秀沁路汽车站".equals(scheduling2.getZdzName())) {
  450 + nowScheduling.remove(nowScheduling.size() - 1);
  451 + }
  452 + }
  453 +
  454 + return nowScheduling.stream().map(item -> {
  455 + DriverScheduling scheduling = new DriverScheduling();
  456 + BeanUtils.copyProperties(item, scheduling);
  457 + return scheduling;
  458 + }).collect(Collectors.toList());
  459 + }
  460 +
  461 + @Async
  462 + public void asyncInsertEquipmentLog(List<Equipment> list, List<Equipment> original) {
  463 + // 插入离线日志
  464 + List<Equipment> offline = handleOffLine(list);
  465 + if (CollectionUtil.isNotEmpty(offline)) {
  466 + equipmentMapper.insertEquipmentOffLineLog(offline);
  467 + }
  468 +
  469 + // 更新恢复日志
  470 + List<EquipmentLog> recoveryList = handlerEquipmentRecovery(list, original);
  471 + if (CollectionUtil.isNotEmpty(recoveryList)) {
  472 + equipmentMapper.updateEquipmentLog(recoveryList);
  473 + }
317 } 474 }
318 475
319 - private void handleResultMap(Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) {  
320 - for (DriverScheduling scheduling : schedulingList) {  
321 - List<DriverScheduling> list = resultMap.get(scheduling.getJobCode());  
322 - if (CollectionUtil.isEmpty(list)){  
323 - resultMap.put(scheduling.getJobCode(),new ArrayList<>(Arrays.asList(scheduling)));  
324 - }else {  
325 - list.add(scheduling); 476 + private List<Equipment> handleOffLine(List<Equipment> list) {
  477 + return list.stream().filter(item -> "脱机".equals(item.getOnlineClient())).collect(Collectors.toList());
  478 + }
  479 +
  480 + private List<EquipmentLog> handlerEquipmentRecovery(List<Equipment> list, List<Equipment> original) {
  481 + if (CollectionUtil.isEmpty(original)) {
  482 + return new ArrayList<>();
  483 + }
  484 + List<EquipmentLog> recoveryList = new ArrayList<>(12);
  485 + Map<String, Equipment> originalMap = original.stream().collect(Collectors.toMap(Equipment::getDeviceId, equipment -> equipment));
  486 + for (Equipment nowItem : list) {
  487 + Equipment eqOr = originalMap.get(nowItem.getDeviceId());
  488 + if (!nowItem.getOnlineClient().equals(eqOr.getOnlineClient()) && DEVICE_OFFLINE.equals(eqOr.getOnlineClient())) {
  489 + EquipmentLog eqLog = new EquipmentLog();
  490 + eqLog.setRecoveryFlag(DEVICE_ONLINE_NUM);
  491 + eqLog.setRecoveryTime(nowItem.getLastHeartRes());
  492 + eqLog.setDeviceId(eqOr.getDeviceId());
  493 + recoveryList.add(eqLog);
326 } 494 }
327 } 495 }
  496 + return recoveryList;
328 } 497 }
329 498
  499 +
330 } 500 }
ruoyi-admin/src/main/java/com/ruoyi/service/impl/AttendanceServiceImpl.java 0 → 100644
  1 +package com.ruoyi.service.impl;
  2 +
  3 +import com.github.pagehelper.PageHelper;
  4 +import com.github.pagehelper.PageInfo;
  5 +import com.ruoyi.common.utils.PageUtils;
  6 +import com.ruoyi.driver.mapper.DriverMapper;
  7 +import com.ruoyi.mapper.RuleAttendanceMapper;
  8 +import com.ruoyi.pojo.vo.PeopleResponseVo;
  9 +import com.ruoyi.pojo.vo.SchedulingRequestVo;
  10 +import com.ruoyi.service.AttendanceService;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.stereotype.Service;
  13 +
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * @author 20412
  18 + */
  19 +@Service
  20 +public class AttendanceServiceImpl implements AttendanceService {
  21 +
  22 + @Autowired
  23 + private DriverMapper driverMapper;
  24 +
  25 +
  26 + @Autowired
  27 + private RuleAttendanceMapper ruleAttendanceMapper;
  28 +
  29 + @Override
  30 + public List<PeopleResponseVo> getDriverInfo(Long id) {
  31 + List<PeopleResponseVo> vos ;
  32 + // TODO 待完成
  33 + if (id != null) {
  34 + vos = driverMapper.queryAttendanceInfoById(id);
  35 + } else {
  36 + // 获取所有为设置考勤的人员
  37 + vos = driverMapper.queryAttendanceInfoAll();
  38 + }
  39 + return vos;
  40 + }
  41 +
  42 + @Override
  43 + public List<SchedulingRequestVo> getSchedulingList(SchedulingRequestVo vo) {
  44 + PageUtils.startPage();
  45 +// ruleAttendanceMapper.getSchedulingList(vo);
  46 + return null;
  47 + }
  48 +}
ruoyi-admin/src/main/java/com/ruoyi/utils/ConstDateUtil.java
1 package com.ruoyi.utils; 1 package com.ruoyi.utils;
2 2
3 -import java.text.ParseException;  
4 import java.text.SimpleDateFormat; 3 import java.text.SimpleDateFormat;
5 import java.time.Instant; 4 import java.time.Instant;
6 import java.time.LocalDateTime; 5 import java.time.LocalDateTime;
@@ -9,10 +8,14 @@ import java.util.Calendar; @@ -9,10 +8,14 @@ import java.util.Calendar;
9 import java.util.Date; 8 import java.util.Date;
10 9
11 public class ConstDateUtil { 10 public class ConstDateUtil {
12 - public static String formatDate(String str){  
13 - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(str); 11 + public static String formatDate(String pattern){
  12 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
14 return simpleDateFormat.format(new Date()); 13 return simpleDateFormat.format(new Date());
15 } 14 }
  15 + public static String formatDate(String pattern,Date date){
  16 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
  17 + return simpleDateFormat.format(date);
  18 + }
16 public static String formatDate(long time){ 19 public static String formatDate(long time){
17 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); 20 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
18 return simpleDateFormat.format(new Date(time)); 21 return simpleDateFormat.format(new Date(time));
@@ -38,4 +41,6 @@ public class ConstDateUtil { @@ -38,4 +41,6 @@ public class ConstDateUtil {
38 LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime(); 41 LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
39 return localDateTime; 42 return localDateTime;
40 } 43 }
  44 +
  45 +
41 } 46 }
ruoyi-admin/src/main/java/com/ruoyi/utils/ListUtils.java
1 package com.ruoyi.utils; 1 package com.ruoyi.utils;
2 2
  3 +import cn.hutool.core.collection.CollectionUtil;
  4 +
  5 +import java.io.*;
3 import java.util.ArrayList; 6 import java.util.ArrayList;
4 import java.util.List; 7 import java.util.List;
5 8
@@ -17,4 +20,26 @@ public class ListUtils&lt;T&gt;{ @@ -17,4 +20,26 @@ public class ListUtils&lt;T&gt;{
17 } 20 }
18 return batchList; 21 return batchList;
19 } 22 }
  23 +
  24 + /**
  25 + * 深度备份
  26 + * @param sourceList
  27 + * @return
  28 + * @param <T>
  29 + * @throws IOException
  30 + * @throws ClassNotFoundException
  31 + */
  32 + public static <T> List<T> deepCopy(List<T> sourceList) throws IOException, ClassNotFoundException{
  33 + if (CollectionUtil.isEmpty(sourceList)){
  34 + return new ArrayList<>();
  35 + }
  36 + ByteArrayOutputStream bo= new ByteArrayOutputStream();
  37 + ObjectOutputStream oos= new ObjectOutputStream(bo);
  38 + oos.writeObject(sourceList);
  39 + ByteArrayInputStream bi= new ByteArrayInputStream(bo.toByteArray());
  40 + ObjectInputStream ois=new ObjectInputStream(bi);
  41 + @SuppressWarnings("unchecked")
  42 + List<T> dest = (List<T>)ois.readObject();
  43 + return dest;
  44 + }
20 } 45 }
ruoyi-admin/src/main/resources/application-druid-dev.yml
1 # 数据源配置 1 # 数据源配置
2 spring: 2 spring:
  3 + # 邮箱配置
  4 + mail:
  5 + # 只发送不接收
  6 + host: smtp.163.com
  7 + # 自己的邮箱
  8 + username: m18980249160@163.com
  9 + # 提供的密码 不是自己的登录密码
  10 + password: RZHJXWXPCALIAOCG
  11 + # 占用端口号
  12 + port: 465
  13 + nickname: 酒精测试异常通知
  14 + form: m18980249160@163.com
  15 + protocol: smtp
  16 + properties:
  17 + mail:
  18 + smtp:
  19 + ssl:
  20 + enable: true
  21 + socketFactory:
  22 + class: javax.net.ssl.SSLSocketFactory
  23 +
  24 +
  25 +
  26 +
3 datasource: 27 datasource:
4 type: com.alibaba.druid.pool.DruidDataSource 28 type: com.alibaba.druid.pool.DruidDataSource
5 driverClassName: com.mysql.cj.jdbc.Driver 29 driverClassName: com.mysql.cj.jdbc.Driver
@@ -7,7 +31,7 @@ spring: @@ -7,7 +31,7 @@ spring:
7 # 主库数据源 31 # 主库数据源
8 master: 32 master:
9 # 测试地址 33 # 测试地址
10 - url: jdbc:mysql://1.14.107.94:3306/all-in-one?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&useAffectedRows=true&allowMultiQueries=true 34 + url: jdbc:mysql://localhost:3306/all-in-one?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&useAffectedRows=true&allowMultiQueries=true
11 username: root 35 username: root
12 password: guzijian 36 password: guzijian
13 # 从库数据源 37 # 从库数据源
ruoyi-admin/src/main/resources/application-druid-prd.yml
1 # 数据源配置 1 # 数据源配置
2 spring: 2 spring:
  3 + # 邮箱配置
  4 + mail:
  5 + # 只发送不接收
  6 + host: smtp.163.com
  7 + # 自己的邮箱
  8 + username: m18980249160@163.com
  9 + # 提供的密码 不是自己的登录密码
  10 + password: RZHJXWXPCALIAOCG
  11 + # 占用端口号
  12 + port: 465
  13 + nickname: 酒精测试异常通知
  14 + form: m18980249160@163.com
  15 + protocol: smtp
  16 + properties:
  17 + mail:
  18 + smtp:
  19 + ssl:
  20 + enable: true
  21 + socketFactory:
  22 + class: javax.net.ssl.SSLSocketFactory
  23 +
3 datasource: 24 datasource:
4 type: com.alibaba.druid.pool.DruidDataSource 25 type: com.alibaba.druid.pool.DruidDataSource
5 driverClassName: com.mysql.cj.jdbc.Driver 26 driverClassName: com.mysql.cj.jdbc.Driver
ruoyi-admin/src/main/resources/application-druid-uat.yml
1 # 数据源配置 1 # 数据源配置
2 spring: 2 spring:
  3 + # 邮箱配置
  4 + mail:
  5 + # 只发送不接收
  6 + host: smtp.163.com
  7 + # 自己的邮箱
  8 + username: m18980249160@163.com
  9 + # 提供的密码 不是自己的登录密码
  10 + password: RZHJXWXPCALIAOCG
  11 + # 占用端口号
  12 + port: 465
  13 + nickname: 酒精测试异常通知
  14 + form: m18980249160@163.com
  15 + protocol: smtp
  16 + properties:
  17 + mail:
  18 + smtp:
  19 + ssl:
  20 + enable: true
  21 + socketFactory:
  22 + class: javax.net.ssl.SSLSocketFactory
  23 +
3 datasource: 24 datasource:
4 type: com.alibaba.druid.pool.DruidDataSource 25 type: com.alibaba.druid.pool.DruidDataSource
5 driverClassName: com.mysql.cj.jdbc.Driver 26 driverClassName: com.mysql.cj.jdbc.Driver
ruoyi-admin/src/main/resources/mapper/driver/DriverMapper.xml
@@ -25,7 +25,13 @@ @@ -25,7 +25,13 @@
25 <result property="updateTime" column="update_time"/> 25 <result property="updateTime" column="update_time"/>
26 <result property="fleetName" column="fleet_name"/> 26 <result property="fleetName" column="fleet_name"/>
27 </resultMap> 27 </resultMap>
  28 + <resultMap id="PeopleResult" type="com.ruoyi.pojo.vo.PeopleResponseVo">
28 29
  30 + <result property="jobCode" column="job_code"/>
  31 + <result property="fleetName" column="fleet_name"/>
  32 + <result property="posts" column="posts"/>
  33 + <result property="name" column="personnel_name"/>
  34 + </resultMap>
29 <sql id="selectDriverVo"> 35 <sql id="selectDriverVo">
30 select id, 36 select id,
31 job_code, 37 job_code,
@@ -172,6 +178,25 @@ @@ -172,6 +178,25 @@
172 #{item} 178 #{item}
173 </foreach> 179 </foreach>
174 </select> 180 </select>
  181 + <select id="queryAttendanceInfoById" resultType="com.ruoyi.pojo.vo.PeopleResponseVo" resultMap="PeopleResult">
  182 +
  183 + </select>
  184 + <select id="queryAttendanceInfoAll" resultType="com.ruoyi.pojo.vo.PeopleResponseVo" resultMap="PeopleResult">
  185 + SELECT
  186 + job_code,
  187 + personnel_name,
  188 + posts,
  189 + fleet_name
  190 + FROM
  191 + driver
  192 + WHERE
  193 + job_code NOT IN (
  194 + SELECT
  195 + job_code
  196 + FROM
  197 + rule_num_driver
  198 + ) and driver.posts != "驾驶员" and driver.posts != "售票员"
  199 + </select>
175 200
176 <insert id="insertDriver" parameterType="Driver" useGeneratedKeys="true" keyProperty="id"> 201 <insert id="insertDriver" parameterType="Driver" useGeneratedKeys="true" keyProperty="id">
177 insert into driver 202 insert into driver
ruoyi-admin/src/main/resources/mapper/driver_scheduling/DriverSchedulingMapper.xml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <mapper namespace="com.ruoyi.driver.mapper.DriverSchedulingMapper"> 5 <mapper namespace="com.ruoyi.driver.mapper.DriverSchedulingMapper">
6 6
7 7
8 - <resultMap id="Scheduling" type="com.ruoyi.pojo.entity.DriverScheduling"> 8 + <resultMap id="Scheduling" type="com.ruoyi.domain.DriverScheduling">
9 <id column="id" jdbcType="BIGINT" property="id"/> 9 <id column="id" jdbcType="BIGINT" property="id"/>
10 <result column="job_code" property="jobCode"/> 10 <result column="job_code" property="jobCode"/>
11 <result column="name" property="name"/> 11 <result column="name" property="name"/>
@@ -23,10 +23,10 @@ @@ -23,10 +23,10 @@
23 <result column="alcohol_flag" property="alcoholFlag" jdbcType="DATETIMEOFFSET"/> 23 <result column="alcohol_flag" property="alcoholFlag" jdbcType="DATETIMEOFFSET"/>
24 <result column="alcohol_intake" property="alcoholIntake"/> 24 <result column="alcohol_intake" property="alcoholIntake"/>
25 </resultMap> 25 </resultMap>
26 - <insert id="insertRoster" useGeneratedKeys="true" keyProperty="id"> 26 + <insert id="insertRoster" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
27 insert into scheduling (schedule_date,line_name,job_code,`name`,posts,lp_name,nbbm,bc_type,fcsj_t,zdsj_t) 27 insert into scheduling (schedule_date,line_name,job_code,`name`,posts,lp_name,nbbm,bc_type,fcsj_t,zdsj_t)
28 values 28 values
29 - <foreach collection="list" item="item" index="index" separator=","> 29 + <foreach collection="list" item="item" separator=",">
30 ( 30 (
31 #{item.scheduleDate}, 31 #{item.scheduleDate},
32 #{item.lineName}, 32 #{item.lineName},
@@ -39,7 +39,6 @@ @@ -39,7 +39,6 @@
39 #{item.fcsjT}, 39 #{item.fcsjT},
40 #{item.zdsjT} 40 #{item.zdsjT}
41 ) 41 )
42 -  
43 </foreach> 42 </foreach>
44 on duplicate key update 43 on duplicate key update
45 job_code = values(job_code) 44 job_code = values(job_code)
@@ -56,7 +55,7 @@ @@ -56,7 +55,7 @@
56 where id = #{scheduling.id} 55 where id = #{scheduling.id}
57 </update> 56 </update>
58 57
59 - <select id="queryToDay" resultType="com.ruoyi.pojo.entity.DriverScheduling" resultMap="Scheduling"> 58 + <select id="queryToDay" resultType="com.ruoyi.domain.DriverScheduling" resultMap="Scheduling">
60 select scheduling.*,driver.fleet_name fleetName from 59 select scheduling.*,driver.fleet_name fleetName from
61 scheduling join driver on driver.job_code = scheduling.job_code 60 scheduling join driver on driver.job_code = scheduling.job_code
62 where schedule_date = #{date} 61 where schedule_date = #{date}
ruoyi-admin/src/main/resources/mapper/email/EmailConfigMapper.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.email.mapper.EmailConfigMapper">
  6 +
  7 + <resultMap type="EmailConfig" id="EmailConfigResult">
  8 + <result property="id" column="id" />
  9 + <result property="name" column="name" />
  10 + <result property="email" column="email" />
  11 + <result property="sort" column="sort" />
  12 + <result property="type" column="type" />
  13 + <result property="parentId" column="parent_id" />
  14 + </resultMap>
  15 +
  16 + <sql id="selectEmailConfigVo">
  17 + select id, `name`, email, sort,`type`,parent_id from email_config
  18 + </sql>
  19 +
  20 + <select id="selectEmailConfigList" parameterType="EmailConfig" resultMap="EmailConfigResult">
  21 + <include refid="selectEmailConfigVo"/>
  22 + <where>
  23 + <if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
  24 + <if test="email != null and email != ''"> and email = #{email}</if>
  25 + <if test="sort != null "> and sort = #{sort}</if>
  26 + <if test="type != null "> and type = #{type}</if>
  27 + <if test="parentId != null "> and parent_id = #{parentId}</if>
  28 + </where>
  29 + order by sort
  30 + </select>
  31 +
  32 + <select id="selectEmailConfigById" parameterType="Long" resultMap="EmailConfigResult">
  33 + <include refid="selectEmailConfigVo"/>
  34 + where id = #{id}
  35 + </select>
  36 + <select id="selectRecipientsEmailConfigList" resultType="com.ruoyi.email.domain.EmailConfig">
  37 + <include refid="selectEmailConfigVo"/>
  38 + where `type` = 0
  39 + </select>
  40 + <select id="selectEmailConfigListByIds" resultType="com.ruoyi.email.domain.EmailConfig">
  41 + select * from email_config
  42 + where id in
  43 + <foreach collection="ids" item="item" open="(" close=")" separator=",">
  44 + #{item}
  45 + </foreach>
  46 + </select>
  47 +
  48 +
  49 + <insert id="insertEmailConfig" parameterType="EmailConfig">
  50 + insert into email_config
  51 + <trim prefix="(" suffix=")" suffixOverrides=",">
  52 + <if test="id != null">id,</if>
  53 + <if test="name != null">`name`,</if>
  54 + <if test="email != null">email,</if>
  55 + <if test="type != null">`type`,</if>
  56 + <if test="sort != null">sort,</if>
  57 + <if test="parentId != null">parentId,</if>
  58 + </trim>
  59 + <trim prefix="values (" suffix=")" suffixOverrides=",">
  60 + <if test="id != null">#{id},</if>
  61 + <if test="name != null">#{name},</if>
  62 + <if test="email != null">#{email},</if>
  63 + <if test="type != null">#{type},</if>
  64 + <if test="sort != null">#{sort},</if>
  65 + <if test="parentId != null">#{parentId},</if>
  66 + </trim>
  67 + </insert>
  68 +
  69 + <update id="updateEmailConfig" parameterType="EmailConfig">
  70 + update email_config
  71 + <trim prefix="SET" suffixOverrides=",">
  72 + <if test="name != null">name = #{name},</if>
  73 + <if test="email != null">email = #{email},</if>
  74 + <if test="type != null">`type` = #{type},</if>
  75 + <if test="sort != null">sort = #{sort},</if>
  76 + <if test="parentId != null">parent_id = #{parentId},</if>
  77 + </trim>
  78 + where id = #{id}
  79 + </update>
  80 + <update id="updateEmailConfigByEmails">
  81 + <if test="ids != null and ids.size() > 0">
  82 + update email_config set type = 1 where id in
  83 + <foreach collection="ids" item="item" open="(" close=")" separator=",">
  84 + #{item}
  85 + </foreach>;
  86 + update email_config set type = 2 where id not in
  87 + <foreach collection="ids" item="item" open="(" close=")" separator=",">
  88 + #{item}
  89 + </foreach>;
  90 + </if>
  91 +
  92 + update email_config set type = #{config.type}, email = #{config.email}, `name` = #{config.name} , sort = #{config.sort}, parent_id = #{config.parentId} where id = #{config.id};
  93 + </update>
  94 + <update id="resetEmailConfigByEmails">
  95 + <if test="ids != null and ids.size() > 0">
  96 + update email_config set type = 2 where id in
  97 + <foreach collection="ids" item="item" open="(" close=")" separator=",">
  98 + #{item}
  99 + </foreach>;
  100 + </if>
  101 + update email_config set `type` = #{config.type}, email = #{config.email} , sort = #{config.sort} , `name` = #{config.name} ,parent_id = null where id = #{config.id};
  102 + </update>
  103 +
  104 + <delete id="deleteEmailConfigById" parameterType="Long">
  105 + delete from email_config where id = #{id}
  106 + </delete>
  107 +
  108 + <delete id="deleteEmailConfigByIds" parameterType="String">
  109 + delete from email_config where id in
  110 + <foreach item="id" collection="array" open="(" separator="," close=")">
  111 + #{id}
  112 + </foreach>
  113 + </delete>
  114 +</mapper>
0 \ No newline at end of file 115 \ No newline at end of file
ruoyi-admin/src/main/resources/mapper/equipment/EquipmentMapper.xml
@@ -55,7 +55,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -55,7 +55,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
55 select count(*) from equipment 55 select count(*) from equipment
56 where status = 1 56 where status = 1
57 </select> 57 </select>
58 - <select id="querySignListByJobCode" resultType="com.ruoyi.pojo.domain.EquipmentDriverExpand"> 58 + <select id="querySignListByJobCode" resultType="com.ruoyi.domain.EquipmentDriverExpand">
59 select driver_face_device_id.* from driver_face_device_id,equipment 59 select driver_face_device_id.* from driver_face_device_id,equipment
60 where driver_face_device_id.device_id = equipment.device_id 60 where driver_face_device_id.device_id = equipment.device_id
61 <if test="drivers != null and drivers.size() > 0"> 61 <if test="drivers != null and drivers.size() > 0">
@@ -70,8 +70,11 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -70,8 +70,11 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
70 select * from equipment 70 select * from equipment
71 where device_id = #{deviceId} 71 where device_id = #{deviceId}
72 </select> 72 </select>
73 -  
74 - 73 + <select id="queryLog" resultType="com.ruoyi.equipment.domain.EquipmentLog">
  74 + select * from equipment_log
  75 + where device_id = #{deviceId}
  76 + order by off_line_time desc
  77 + </select>
75 <insert id="insertEquipment" parameterType="Equipment" useGeneratedKeys="true" keyProperty="id"> 78 <insert id="insertEquipment" parameterType="Equipment" useGeneratedKeys="true" keyProperty="id">
76 insert into equipment 79 insert into equipment
77 <trim prefix="(" suffix=")" suffixOverrides=","> 80 <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -107,6 +110,20 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -107,6 +110,20 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
107 <if test="onlineClient != null">#{online_client},</if> 110 <if test="onlineClient != null">#{online_client},</if>
108 </trim> 111 </trim>
109 </insert> 112 </insert>
  113 + <insert id="insertEquipmentOffLineLog">
  114 + insert into equipment_log (device_id,off_line_time,recovery_flag)
  115 + values
  116 + <foreach collection="list" item="item" separator=",">
  117 + (
  118 + #{item.deviceId},
  119 + #{item.lastHeartRes},
  120 + 2
  121 + )
  122 + </foreach>
  123 + on duplicate key update
  124 + device_id = values(device_id)
  125 +
  126 + </insert>
110 127
111 <update id="updateEquipment" parameterType="Equipment"> 128 <update id="updateEquipment" parameterType="Equipment">
112 update equipment 129 update equipment
@@ -117,7 +134,6 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -117,7 +134,6 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
117 <if test="status != null">status = #{status},</if> 134 <if test="status != null">status = #{status},</if>
118 <if test="promise != null and promise != ''">promise = #{promise},</if> 135 <if test="promise != null and promise != ''">promise = #{promise},</if>
119 <if test="image != null">image = #{image},</if> 136 <if test="image != null">image = #{image},</if>
120 - <if test="deviceId != null">device_id = #{deviceId},</if>  
121 <if test="createTime != null">create_time = #{createTime},</if> 137 <if test="createTime != null">create_time = #{createTime},</if>
122 <if test="updateTime != null">update_time = #{updateTime},</if> 138 <if test="updateTime != null">update_time = #{updateTime},</if>
123 <if test="createBy != null">create_by = #{createBy},</if> 139 <if test="createBy != null">create_by = #{createBy},</if>
@@ -160,6 +176,12 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -160,6 +176,12 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
160 </trim> 176 </trim>
161 where device_id = #{deviceId} 177 where device_id = #{deviceId}
162 </update> 178 </update>
  179 + <update id="updateEquipmentLog">
  180 + <foreach collection="recoveryList" item="item" separator=";" index="index">
  181 + update equipment_log set recovery_time = #{item.recoveryTime},recovery_flag = #{item.recoveryFlag}
  182 + where device_id = #{item.deviceId} and recovery_flag = 2
  183 + </foreach>
  184 + </update>
163 185
164 <delete id="deleteEquipmentById" parameterType="Long"> 186 <delete id="deleteEquipmentById" parameterType="Long">
165 delete from equipment where id = #{id} 187 delete from equipment where id = #{id}
@@ -171,4 +193,45 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -171,4 +193,45 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
171 #{id} 193 #{id}
172 </foreach> 194 </foreach>
173 </delete> 195 </delete>
  196 + <delete id="deleteExRecord">
  197 + DELETE
  198 + FROM
  199 + equipment_exception
  200 + WHERE
  201 + id IN (
  202 + SELECT
  203 + ee.id
  204 + FROM
  205 + (
  206 + SELECT
  207 + id
  208 + FROM
  209 + equipment_exception
  210 + WHERE
  211 + create_time LIKE CONCAT( DATE_FORMAT( NOW(), "%Y-%m-%d" ), "%" )
  212 + AND job_code IN (
  213 + SELECT
  214 + s1.job_code
  215 + FROM
  216 + scheduling s1
  217 + INNER JOIN (
  218 + SELECT
  219 + job_code,
  220 + schedule_date,
  221 + MIN( fcsj_t ) AS min_fcsj_t
  222 + FROM
  223 + scheduling
  224 + WHERE
  225 + bc_type = 'out'
  226 + AND schedule_date = DATE_FORMAT( NOW(), '%Y-%m-%d' )
  227 + GROUP BY
  228 + job_code,
  229 + schedule_date
  230 + ) s2 ON s1.job_code = s2.job_code
  231 + AND s1.schedule_date = s2.schedule_date
  232 + AND s1.fcsj_t = s2.min_fcsj_t
  233 + )
  234 + ) as ee
  235 + )
  236 + </delete>
174 </mapper> 237 </mapper>
175 \ No newline at end of file 238 \ No newline at end of file
ruoyi-admin/src/main/resources/mapper/errorScheduling/ErrorJobcodeMapper.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.errorScheduling.mapper.ErrorJobcodeMapper">
  6 +
  7 + <resultMap type="ErrorJobcode" id="ErrorJobcodeResult">
  8 + <result property="id" column="id" />
  9 + <result property="jobCode" column="job_code" />
  10 + <result property="name" column="name" />
  11 + <result property="posts" column="posts" />
  12 + <result property="fleetName" column="fleet_name" />
  13 + <result property="lineName" column="line_name" />
  14 + <result property="nbbm" column="nbbm" />
  15 + <result property="lpName" column="lp_name" />
  16 + <result property="remark" column="remark" />
  17 + <result property="createTime" column="create_time" />
  18 + </resultMap>
  19 +
  20 + <sql id="selectErrorJobcodeVo">
  21 + select id, job_code, `name`, posts,fleet_name, line_name, nbbm, lp_name, remark, create_time from error_jobcode
  22 + </sql>
  23 +
  24 + <select id="selectErrorJobcodeList" parameterType="com.ruoyi.pojo.vo.ErrorJobcodeVo" resultMap="ErrorJobcodeResult">
  25 + <include refid="selectErrorJobcodeVo"/>
  26 + <where>
  27 + <if test="jobCode != null and jobCode != ''"> and job_code = #{jobCode}</if>
  28 + <if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
  29 + <if test="fleetName != null and fleetName != ''"> and fleet_name like concat('%', #{fleetName}, '%')</if>
  30 + <if test="lineName != null and lineName != ''"> and line_name like concat('%', #{lineName}, '%')</if>
  31 + <if test="nbbm != null and nbbm != ''"> and nbbm = #{nbbm}</if>
  32 + <if test="lpName != null and lpName != ''"> and lp_name like concat('%', #{lpName}, '%')</if>
  33 + <if test="date != null and date != ''"> and create_time like concat(#{date}, '%')</if>
  34 + </where>
  35 + </select>
  36 +
  37 + <select id="selectErrorJobcodeById" parameterType="Long" resultMap="ErrorJobcodeResult">
  38 + <include refid="selectErrorJobcodeVo"/>
  39 + where id = #{id}
  40 + </select>
  41 +
  42 + <insert id="insertErrorJobcode" parameterType="ErrorJobcode" useGeneratedKeys="true" keyProperty="id">
  43 + insert into error_jobcode
  44 + <trim prefix="(" suffix=")" suffixOverrides=",">
  45 + <if test="jobCode != null">job_code,</if>
  46 + <if test="name != null">`name`,</if>
  47 + <if test="posts != null">`posts`,</if>
  48 + <if test="fleetName != null">fleet_name,</if>
  49 + <if test="lineName != null">line_name,</if>
  50 + <if test="nbbm != null">nbbm,</if>
  51 + <if test="lpName != null">lp_name,</if>
  52 + <if test="remark != null">remark,</if>
  53 + <if test="createTime != null">create_time,</if>
  54 + </trim>
  55 + <trim prefix="values (" suffix=")" suffixOverrides=",">
  56 + <if test="jobCode != null">#{jobCode},</if>
  57 + <if test="name != null">#{name},</if>
  58 + <if test="posts != null">#{posts},</if>
  59 + <if test="fleetName != null">#{fleetName},</if>
  60 + <if test="lineName != null">#{lineName},</if>
  61 + <if test="nbbm != null">#{nbbm},</if>
  62 + <if test="lpName != null">#{lpName},</if>
  63 + <if test="remark != null">#{remark},</if>
  64 + <if test="createTime != null">#{createTime},</if>
  65 + </trim>
  66 + </insert>
  67 + <insert id="insertBatchErrorJobcode" useGeneratedKeys="true" keyProperty="id">
  68 + insert into error_jobcode (
  69 + job_code, `name`,posts ,fleet_name, line_name, nbbm, lp_name, remark, create_time
  70 + ) values
  71 + <foreach collection="errorScheduling" item="item" index="index" separator=",">
  72 + (
  73 + #{item.jobCode},
  74 + #{item.name},
  75 + #{item.posts},
  76 + #{item.fleetName},
  77 + #{item.lineName},
  78 + #{item.nbbm},
  79 + #{item.lpName},
  80 + #{item.remark},
  81 + #{item.createTime}
  82 + )
  83 + </foreach>
  84 + on duplicate key UPDATE
  85 + job_code = values(job_code)
  86 + </insert>
  87 +
  88 + <update id="updateErrorJobcode" parameterType="ErrorJobcode">
  89 + update error_jobcode
  90 + <trim prefix="SET" suffixOverrides=",">
  91 + <if test="jobCode != null">job_code = #{jobCode},</if>
  92 + <if test="name != null">name = #{name},</if>
  93 + <if test="fleetName != null">fleet_name = #{fleetName},</if>
  94 + <if test="lineName != null">line_name = #{lineName},</if>
  95 + <if test="nbbm != null">nbbm = #{nbbm},</if>
  96 + <if test="lpName != null">lp_name = #{lpName},</if>
  97 + <if test="remark != null">remark = #{remark},</if>
  98 + <if test="createTime != null">create_time = #{createTime},</if>
  99 + </trim>
  100 + where id = #{id}
  101 + </update>
  102 +
  103 + <delete id="deleteErrorJobcodeById" parameterType="Long">
  104 + delete from error_jobcode where id = #{id}
  105 + </delete>
  106 +
  107 + <delete id="deleteErrorJobcodeByIds" parameterType="String">
  108 + delete from error_jobcode where id in
  109 + <foreach item="id" collection="array" open="(" separator="," close=")">
  110 + #{id}
  111 + </foreach>
  112 + </delete>
  113 +</mapper>
0 \ No newline at end of file 114 \ No newline at end of file
ruoyi-admin/src/main/resources/mapper/in/SignInMapper.xml
@@ -99,6 +99,25 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -99,6 +99,25 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
99 </if> 99 </if>
100 100
101 </select> 101 </select>
  102 + <select id="queryOutBcType" resultType="com.ruoyi.domain.DriverScheduling">
  103 + SELECT s1.*
  104 + FROM scheduling s1
  105 + INNER JOIN (
  106 + SELECT job_code, schedule_date, MIN(fcsj_t) AS min_fcsj_t
  107 + FROM scheduling
  108 + WHERE bc_type = 'out' AND schedule_date = DATE_FORMAT(NOW(), '%Y-%m-%d')
  109 + GROUP BY job_code, schedule_date
  110 + ) s2 ON s1.job_code = s2.job_code AND s1.schedule_date = s2.schedule_date AND s1.fcsj_t = s2.min_fcsj_t;
  111 +
  112 + </select>
  113 + <select id="querySignInData" resultType="com.ruoyi.in.domain.SignIn">
  114 + SELECT * FROM sign_in s1 JOIN (
  115 + SELECT jobCode AS job_code, MIN(create_time) AS min_create_time
  116 + FROM sign_in
  117 + WHERE create_time LIKE CONCAT(DATE_FORMAT(NOW(), "%Y-%m-%d"), "%")
  118 + GROUP BY job_code, DATE(create_time)
  119 + ) s2 on s1.jobCode = s2.job_code and s1.create_time = s2.min_create_time
  120 + </select>
102 121
103 <insert id="insertSignIn" parameterType="SignIn" useGeneratedKeys="true" keyProperty="id"> 122 <insert id="insertSignIn" parameterType="SignIn" useGeneratedKeys="true" keyProperty="id">
104 insert into sign_in 123 insert into sign_in
@@ -144,7 +163,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -144,7 +163,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
144 <if test="ip != null">ip = #{ip},</if> 163 <if test="ip != null">ip = #{ip},</if>
145 <if test="deviceId != null">device_id = #{deviceId},</if> 164 <if test="deviceId != null">device_id = #{deviceId},</if>
146 <if test="image != null">image = #{image},</if> 165 <if test="image != null">image = #{image},</if>
147 - <if test="status != null">status = #{status},</if> 166 + <if test="status != null">`status` = #{status},</if>
148 <if test="updateBy != null">update_by = #{updateBy},</if> 167 <if test="updateBy != null">update_by = #{updateBy},</if>
149 <if test="singnIn != null">singn_in = #{singnIn},</if> 168 <if test="singnIn != null">singn_in = #{singnIn},</if>
150 <if test="alcoholFlag != null">alcohol_flag = #{alcoholFlag},</if> 169 <if test="alcoholFlag != null">alcohol_flag = #{alcoholFlag},</if>
@@ -152,6 +171,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; @@ -152,6 +171,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
152 <if test="updateTime != null">update_time = #{updateTime},</if> 171 <if test="updateTime != null">update_time = #{updateTime},</if>
153 <if test="alcoholIntake != null">alcohol_intake = #{alcoholIntake},</if> 172 <if test="alcoholIntake != null">alcohol_intake = #{alcoholIntake},</if>
154 <if test="remark != null">remark = #{remark},</if> 173 <if test="remark != null">remark = #{remark},</if>
  174 + <if test="exType != null">ex_type = #{exType},</if>
155 </trim> 175 </trim>
156 where id = #{id} 176 where id = #{id}
157 </update> 177 </update>
ruoyi-admin/src/main/resources/mapper/schedulingAssociateNum/RuleNumSchedulingMapper.xml deleted 100644 → 0
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.schedulingAssociateNum.mapper.RuleNumSchedulingMapper">  
6 -  
7 - <resultMap type="RuleNumScheduling" id="RuleNumSchedulingResult">  
8 - <result property="id" column="id" />  
9 - <result property="ruleNumId" column="rule_num_id" />  
10 - <result property="ruleSchedulingId" column="rule_scheduling_id" />  
11 - <result property="matchName" column="match_name" />  
12 - </resultMap>  
13 -  
14 - <sql id="selectRuleNumSchedulingVo">  
15 - select id, rule_num_id, rule_scheduling_id, match_name from rule_num_scheduling  
16 - </sql>  
17 -  
18 - <select id="selectRuleNumSchedulingList" parameterType="RuleNumScheduling" resultMap="RuleNumSchedulingResult">  
19 - <include refid="selectRuleNumSchedulingVo"/>  
20 - <where>  
21 - <if test="ruleNumId != null "> and rule_num_id = #{ruleNumId}</if>  
22 - <if test="ruleSchedulingId != null and ruleSchedulingId != ''"> and rule_scheduling_id = #{ruleSchedulingId}</if>  
23 - <if test="matchName != null and matchName != ''"> and match_name like concat('%', #{matchName}, '%')</if>  
24 - </where>  
25 - </select>  
26 -  
27 - <select id="selectRuleNumSchedulingById" parameterType="Long" resultMap="RuleNumSchedulingResult">  
28 - <include refid="selectRuleNumSchedulingVo"/>  
29 - where id = #{id}  
30 - </select>  
31 -  
32 - <insert id="insertRuleNumScheduling" parameterType="RuleNumScheduling" useGeneratedKeys="true" keyProperty="id">  
33 - insert into rule_num_scheduling  
34 - <trim prefix="(" suffix=")" suffixOverrides=",">  
35 - <if test="ruleNumId != null">rule_num_id,</if>  
36 - <if test="ruleSchedulingId != null">rule_scheduling_id,</if>  
37 - <if test="matchName != null">match_name,</if>  
38 - </trim>  
39 - <trim prefix="values (" suffix=")" suffixOverrides=",">  
40 - <if test="ruleNumId != null">#{ruleNumId},</if>  
41 - <if test="ruleSchedulingId != null">#{ruleSchedulingId},</if>  
42 - <if test="matchName != null">#{matchName},</if>  
43 - </trim>  
44 - </insert>  
45 -  
46 - <update id="updateRuleNumScheduling" parameterType="RuleNumScheduling">  
47 - update rule_num_scheduling  
48 - <trim prefix="SET" suffixOverrides=",">  
49 - <if test="ruleNumId != null">rule_num_id = #{ruleNumId},</if>  
50 - <if test="ruleSchedulingId != null">rule_scheduling_id = #{ruleSchedulingId},</if>  
51 - <if test="matchName != null">match_name = #{matchName},</if>  
52 - </trim>  
53 - where id = #{id}  
54 - </update>  
55 -  
56 - <delete id="deleteRuleNumSchedulingById" parameterType="Long">  
57 - delete from rule_num_scheduling where id = #{id}  
58 - </delete>  
59 -  
60 - <delete id="deleteRuleNumSchedulingByIds" parameterType="String">  
61 - delete from rule_num_scheduling where id in  
62 - <foreach item="id" collection="array" open="(" separator="," close=")">  
63 - #{id}  
64 - </foreach>  
65 - </delete>  
66 -</mapper>  
67 \ No newline at end of file 0 \ No newline at end of file
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter @@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
111 // 过滤请求 111 // 过滤请求
112 .authorizeRequests() 112 .authorizeRequests()
113 // 对于登录login 注册register 验证码captchaImage 允许匿名访问 113 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
114 - .antMatchers("/app/version/check/**","/app/checkDeviceHeart","/app/download","/driver/**","/in/**","/eexception/**","/equipment/**","/report/**","/login", "/register", "/captchaImage").permitAll() 114 + .antMatchers("/system/dict/data/**","/app/version/check/**","/app/checkDeviceHeart","/app/download","/driver/**","/in/**","/eexception/**","/equipment/**","/report/**","/login", "/register", "/captchaImage").permitAll()
115 // 静态资源,可匿名访问 115 // 静态资源,可匿名访问
116 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() 116 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
117 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() 117 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()