Commit d4bd94ed6629560174214d303fc7896383831351

Authored by guzijian
1 parent 479764a3

fix: 修复bug

Showing 38 changed files with 647 additions and 703 deletions
ruoyi-admin/src/main/java/com/ruoyi/common/ConstSignInConstSignInProperties.java
... ... @@ -13,6 +13,8 @@ public interface ConstSignInConstSignInProperties {
13 13 String SIGN_NO_SCHEDULING_EX_NUM_STRING = "无排班异常";
14 14 Integer SIGN_ALCOHOL_EX_NUM = 3;
15 15 String SIGN_ALCOHOL_EX_NUM_STRING = "酒精超标异常";
  16 + Integer EQUIPMENT_ALCOHOL_EX_NUM = 4;
  17 + String EQUIPMENT_ALCOHOL_EX_NUM_STRING = "设备异常";
16 18  
17 19 String HAVE_EX = "有异常";
18 20 String NO_EX = "无异常";
... ... @@ -58,7 +60,7 @@ public interface ConstSignInConstSignInProperties {
58 60 */
59 61 Integer ALCOHOL_FLAG_YES = 1;
60 62 String ALCOHOL_FLAG_YES_STRING = "已测试";
61   - Integer ALCOHOL_FLAG_NO = 2;
  63 + Integer ALCOHOL_FLAG_NO = 0;
62 64 String ALCOHOL_FLAG_NO_STRING = "未测试";
63 65  
64 66 /**
... ...
ruoyi-admin/src/main/java/com/ruoyi/common/ErrorTypeProperties.java
... ... @@ -8,7 +8,7 @@ public interface ErrorTypeProperties {
8 8 String EQUIPMENT_ERROR = "设备异常";
9 9 String ALCOHOL_SIGN_IN_ERROR = "酒精测试超标,";
10 10 String WORK_DAY_ERROR = "当天没有排班,";
11   - String SIGN_IN_TIMEOUT = "签到异常,";
12   - String SIGN_OUT_TIMEOUT = "签退异常,";
  11 + String SIGN_IN_TIMEOUT = "没有在规定时间内签到,";
  12 + String SIGN_OUT_TIMEOUT = "没有在规定时间内签退,";
13 13  
14 14 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/common/cache/NowSchedulingCache.java 0 → 100644
  1 +package com.ruoyi.common.cache;
  2 +
  3 +import cn.hutool.core.collection.CollectionUtil;
  4 +import com.ruoyi.driver.mapper.DriverSchedulingMapper;
  5 +import com.ruoyi.pojo.entity.DriverScheduling;
  6 +import com.ruoyi.utils.ConstDateUtil;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.util.*;
  12 +import java.util.concurrent.ConcurrentHashMap;
  13 +
  14 +@Component
  15 +public class NowSchedulingCache {
  16 + private final DriverSchedulingMapper schedulingMapper;
  17 + Logger log = LoggerFactory.getLogger(SchedulingCache.class);
  18 + /**
  19 + * 当天初版排班
  20 + */
  21 + private static ConcurrentHashMap<String, Map<String, List<DriverScheduling>>> cacheNowDayScheduling = new ConcurrentHashMap<>();
  22 +
  23 +
  24 + public NowSchedulingCache(DriverSchedulingMapper driverSchedulingMapper) {
  25 + this.schedulingMapper = driverSchedulingMapper;
  26 + log.info("项目启动加载中获取排班表-----");
  27 + cacheNowDaySchedulingInit();
  28 + }
  29 +
  30 + private void cacheNowDaySchedulingInit() {
  31 + // 查询今天和昨天
  32 + for (int i = 0; i > -2; i--) {
  33 + Map<String, List<DriverScheduling>> resultMap =new HashMap<>(800);
  34 + String date = ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(i));
  35 + List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null);
  36 + handleResultMap(resultMap,schedulingList);
  37 + cacheNowDayScheduling.put(date,resultMap);
  38 + }
  39 + }
  40 +
  41 + private void handleResultMap(Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) {
  42 + for (DriverScheduling scheduling : schedulingList) {
  43 + List<DriverScheduling> list = resultMap.get(scheduling.getJobCode());
  44 + if (CollectionUtil.isEmpty(list)){
  45 + resultMap.put(scheduling.getJobCode(),new ArrayList<>(Arrays.asList(scheduling)));
  46 + }else {
  47 + list.add(scheduling);
  48 + }
  49 + }
  50 + }
  51 +
  52 + public void setCacheScheduling(String key, Map<String, List<DriverScheduling>> mapValue) {
  53 + cacheNowDayScheduling.put(key, mapValue);
  54 + }
  55 + public Map<String,List<DriverScheduling>> getCacheScheduling(String key) {
  56 + return cacheNowDayScheduling.get(key);
  57 + }
  58 +
  59 + public void removeCacheSchedulingByKey(String key) {
  60 + cacheNowDayScheduling.remove(key);
  61 + }
  62 +
  63 + public List<String> getKeys(){
  64 + return new ArrayList<>(cacheNowDayScheduling.keySet());
  65 + }
  66 +
  67 + public Integer size(){
  68 + return cacheNowDayScheduling.size();
  69 + }
  70 +
  71 + public List<DriverScheduling> getCacheSchedulingMapValueByHKey(String key, String HKey) {
  72 + if (Objects.isNull(cacheNowDayScheduling.get(key))) {
  73 + return null;
  74 + }
  75 + List<DriverScheduling> list = cacheNowDayScheduling.get(key).get(HKey);
  76 +
  77 + return Objects.isNull(list) ? null : list;
  78 + }
  79 +
  80 + public List<String> getHKeysByKey(String key) {
  81 + return new ArrayList<>(cacheNowDayScheduling.get(key).keySet());
  82 + }
  83 +
  84 + public List<String> getKes() {
  85 + return new ArrayList<>(cacheNowDayScheduling.keySet());
  86 + }
  87 +}
... ...
ruoyi-admin/src/main/java/com/ruoyi/common/cache/SchedulingCache.java
1 1 package com.ruoyi.common.cache;
2 2  
  3 +import cn.hutool.core.collection.CollectionUtil;
  4 +import com.ruoyi.pojo.entity.DriverScheduling;
3 5 import com.ruoyi.pojo.response.ResponseSchedulingDto;
  6 +import com.ruoyi.service.SchedulingService;
4 7 import com.ruoyi.utils.ConstDateUtil;
5 8 import org.slf4j.Logger;
6 9 import org.slf4j.LoggerFactory;
... ... @@ -9,7 +12,6 @@ import org.springframework.http.HttpMethod;
9 12 import org.springframework.stereotype.Component;
10 13 import org.springframework.web.client.RestTemplate;
11 14  
12   -import javax.annotation.Resource;
13 15 import java.security.MessageDigest;
14 16 import java.util.*;
15 17 import java.util.concurrent.ConcurrentHashMap;
... ... @@ -27,21 +29,28 @@ public class SchedulingCache {
27 29  
28 30 Logger log = LoggerFactory.getLogger(SchedulingCache.class);
29 31  
  32 +
  33 +
30 34 // @Value("${api.url.getSchedulingInfoNew}")
31 35 private static final String getSchedulingInfoUrl = "http://101.95.136.206:9089/webservice/rest/schedule_real/sch_jk_db/%s/%s?timestamp=%d&nonce=%s&password=%s&sign=%s";
32 36 // @Value("${api.config.nonce}")
33 37 private static final String NONCE = "adfsad";
34 38 // @Value("${api.config.password}")
35 39 private static final String PASSWORD = "c4dd3d8cb9a82f6d6a625818618b28ca7bebb464";
36   - @Resource
37   - private SchedulingCache schedulingCache;
  40 +
  41 + /**
  42 + * 实时更新排班
  43 + */
38 44 private static ConcurrentHashMap<String, Map<String, List<ResponseSchedulingDto>>> cacheScheduling = new ConcurrentHashMap<>();
39 45  
  46 +
40 47 public SchedulingCache() {
41 48 log.info("项目启动加载中-----");
42 49 // schedulingInit();
43 50 }
44 51  
  52 +
  53 +
45 54 private void schedulingInit() {
46 55 String formatNowDate = ConstDateUtil.formatDate(new Date());
47 56 String url = getUrl(formatNowDate);
... ...
ruoyi-admin/src/main/java/com/ruoyi/controller/ReportController.java
... ... @@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
4 4 import com.ruoyi.common.utils.poi.ExcelUtil;
5 5 import com.ruoyi.pojo.request.ReportViewRequestVo;
6 6 import com.ruoyi.pojo.request.ReportErrorRequestVo;
  7 +import com.ruoyi.pojo.response.ExportReportViewResponseVo;
7 8 import com.ruoyi.pojo.response.ReportErrorResponseVo;
8 9 import com.ruoyi.pojo.response.ReportViewResponseVo;
9 10 import com.ruoyi.service.ReportService;
... ... @@ -37,6 +38,12 @@ public class ReportController {
37 38 return AjaxResult.success(reportService.getReportScrollViewTable(requestVo,response));
38 39 }
39 40  
  41 + @ApiOperation("签到报表集合查询")
  42 + @GetMapping("/bigView")
  43 + public AjaxResult getBigView(HttpServletResponse response, @ApiParam @ModelAttribute ReportViewRequestVo requestVo) {
  44 + return AjaxResult.success(reportService.getBigView(requestVo,response));
  45 + }
  46 +
40 47 @ApiOperation("获取详情")
41 48 @GetMapping("/detail")
42 49 public AjaxResult getDetail(HttpServletResponse response, @ApiParam @ModelAttribute @Validated ReportViewRequestVo requestVo) {
... ... @@ -53,12 +60,9 @@ public class ReportController {
53 60 @ApiOperation("签到报表导出")
54 61 @PostMapping("/export")
55 62 public void exportReport(@ApiParam ReportViewRequestVo requestVo, HttpServletResponse response) {
56   - List<ReportViewResponseVo> list = reportService.exportReportList(requestVo, response);
  63 + List<ExportReportViewResponseVo> list = reportService.exportReportList(requestVo, response);
57 64 // 不导出图片清空路径信息
58   - if (!EXPORT.equals(requestVo.getExportFlag())){
59   -// list = list.stream().map(item->{item.setImage("");return item;}).collect(Collectors.toList());
60   - }
61   - ExcelUtil<ReportViewResponseVo> util = new ExcelUtil<ReportViewResponseVo>(ReportViewResponseVo.class);
  65 + ExcelUtil<ExportReportViewResponseVo> util = new ExcelUtil<ExportReportViewResponseVo>(ExportReportViewResponseVo.class);
62 66 util.exportEasyExcel(response, list, "签到报表");
63 67 }
64 68  
... ...
ruoyi-admin/src/main/java/com/ruoyi/driver/mapper/DriverSchedulingMapper.java
... ... @@ -6,6 +6,8 @@ import com.ruoyi.pojo.response.ReportViewResponseVo;
6 6 import com.ruoyi.pojo.response.ResponseSchedulingDto;
7 7 import org.apache.ibatis.annotations.Param;
8 8  
  9 +import java.math.BigDecimal;
  10 +import java.util.Date;
9 11 import java.util.List;
10 12  
11 13 /**
... ... @@ -19,6 +21,6 @@ public interface DriverSchedulingMapper {
19 21  
20 22 List<DriverScheduling> queryToDay(@Param("date") String date, @Param("name") String name,@Param("jobCode") String jobCode,@Param("lineName")String lineName );
21 23  
22   - void updateRoster(@Param("scheduling") DriverScheduling scheduling, @Param("signInId") Long id, @Param("exType") Integer exType);
  24 + void updateRoster(@Param("scheduling") DriverScheduling scheduling, @Param("signInId") Long id, @Param("exType") Integer exType, @Param("signTime")Date signTime, @Param("remark") String remark, @Param("signType") Integer signType, @Param("alcoholFlag") Integer alcoholFlag, @Param("alcoholIntake")BigDecimal alcoholIntake);
23 25  
24 26 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/driver/service/impl/DriverServiceImpl.java
... ... @@ -21,7 +21,6 @@ import com.ruoyi.common.global.ResultCode;
21 21 import com.ruoyi.common.utils.file.FileUploadUtils;
22 22 import com.ruoyi.common.utils.file.FileUtils;
23 23 import com.ruoyi.common.utils.file.MimeTypeUtils;
24   -import com.ruoyi.driver.mapper.DriverSchedulingMapper;
25 24 import com.ruoyi.equipment.mapper.EquipmentMapper;
26 25 import com.ruoyi.framework.config.ServerConfig;
27 26 import com.ruoyi.job.DriverJob;
... ... @@ -155,7 +154,7 @@ public class DriverServiceImpl implements IDriverService {
155 154 // 如果当前有效范围内签到记录无效如酒精测试异常则重复当前操作
156 155 if ((Math.abs(nowBetween) <= 60) && timeMap.get(index).getExType().equals(SIGN_ALCOHOL_EX_NUM) && timeMap.get(index).getBcType().equals(BC_TYPE_OUT)) {
157 156 return timeMap.get(index);
158   - }else {
  157 + } else {
159 158 index = index < timeMap.size() - 1 ? index + 1 : index;
160 159 }
161 160 }
... ... @@ -311,31 +310,17 @@ public class DriverServiceImpl implements IDriverService {
311 310 List<Driver> drivers = driverMapper.getDrivers(driver);
312 311 Long now = System.currentTimeMillis();
313 312 List<DriverResponseVo> vos = new ArrayList<>(drivers.size());
314   -// List<ResponseSchedulingDto> schedulingList = schedulingCache.getCacheSchedulingMapValueByHKey(ConstDateUtil.formatDate(new Date()), driver.getJobCode());
315 313 List<DriverScheduling> dto = null;
316 314 Boolean schedulingFlag = true;
317 315 Boolean alcoholFlag = true;
318   - dto = schedulingService.queryScheduling(driver.getJobCode(), now);
319 316  
320   - DriverResponseVo vo = null;
321   - // 给出计划操作
322   - if (!CollectionUtil.isEmpty(dto)) {
323   - DriverSignRecommendation item = checkTime(dto, now);
324   - if (BC_TYPE_OUT.equals(item.getBcType()) && !CollectionUtil.isEmpty(drivers)) {
325   - // 售票员无需酒精测试
326   - if (item.getPosts().equals(PERSONNEL_POSTS_DRIVER))
327   - vo = new DriverResponseVo(item.getTimestamps(), drivers.get(0), SIGN_IN_STRING, alcoholFlag, schedulingFlag,item.getNbbm(),item.getLpName(),item.getLineName());
328   - else
329   - vo = new DriverResponseVo(item.getTimestamps(), drivers.get(0), SIGN_IN_STRING, !alcoholFlag, schedulingFlag,item.getNbbm(),item.getLpName(),item.getLineName());
330   - } else if (BC_TYPE_IN.equals(item.getBcType()) && !CollectionUtil.isEmpty(drivers)) {
331   - vo = new DriverResponseVo(item.getTimestamps(), drivers.get(0), SIGN_IN_OUT_STRING, !alcoholFlag, !schedulingFlag,item.getNbbm(),item.getLpName(),item.getLineName());
332   - }
333   - }
334 317 // 更新信息
335 318 for (Driver item : drivers) {
  319 + dto = schedulingService.queryScheduling(item.getJobCode(), now);
  320 + DriverResponseVo vo = handleRecommendation(item, now, dto, schedulingFlag, alcoholFlag);
336 321 // 无排班
337 322 if (Objects.isNull(vo)) {
338   - vos.add(new DriverResponseVo(null, item, null, false, false,"","",""));
  323 + vos.add(new DriverResponseVo(null, item, null, false, false, "", "", ""));
339 324 } else {
340 325 vos.add(vo);
341 326 }
... ... @@ -343,6 +328,24 @@ public class DriverServiceImpl implements IDriverService {
343 328 return vos;
344 329 }
345 330  
  331 + private DriverResponseVo handleRecommendation(Driver drivers, Long now, List<DriverScheduling> dto, Boolean schedulingFlag, Boolean alcoholFlag) {
  332 + DriverResponseVo vo = null;
  333 + // 给出计划操作
  334 + if (!CollectionUtil.isEmpty(dto)) {
  335 + DriverSignRecommendation recommendation = checkTime(dto, now);
  336 + if (BC_TYPE_OUT.equals(recommendation.getBcType())) {
  337 + // 售票员无需酒精测试
  338 + if (recommendation.getPosts().equals(PERSONNEL_POSTS_DRIVER))
  339 + vo = new DriverResponseVo(recommendation.getTimestamps(), drivers, SIGN_IN_STRING, alcoholFlag, schedulingFlag, recommendation.getNbbm(), recommendation.getLpName(), recommendation.getLineName());
  340 + else
  341 + vo = new DriverResponseVo(recommendation.getTimestamps(), drivers, SIGN_IN_STRING, !alcoholFlag, schedulingFlag, recommendation.getNbbm(), recommendation.getLpName(), recommendation.getLineName());
  342 + } else if (BC_TYPE_IN.equals(recommendation.getBcType())) {
  343 + vo = new DriverResponseVo(recommendation.getTimestamps(), drivers, SIGN_IN_OUT_STRING, !alcoholFlag, !schedulingFlag, recommendation.getNbbm(), recommendation.getLpName(), recommendation.getLineName());
  344 + }
  345 + }
  346 + return vo;
  347 + }
  348 +
346 349  
347 350 @Override
348 351 public AjaxResult faceRegistrationFeedback(String deviceId, List<String> jobCodes) {
... ...
ruoyi-admin/src/main/java/com/ruoyi/eexception/controller/EquipmentExceptionController.java
... ... @@ -3,6 +3,7 @@ package com.ruoyi.eexception.controller;
3 3 import java.util.List;
4 4 import javax.servlet.http.HttpServletResponse;
5 5  
  6 +import com.ruoyi.pojo.response.EquipmentExceptionResponseVo;
6 7 import io.swagger.annotations.Api;
7 8 import io.swagger.annotations.ApiOperation;
8 9 import org.springframework.security.access.prepost.PreAuthorize;
... ... @@ -33,7 +34,6 @@ import com.ruoyi.common.core.page.TableDataInfo;
33 34 @RestController
34 35 @RequestMapping("/eexception/eexception")
35 36 @Api(tags = "设备异常接口")
36   -@Deprecated
37 37 public class EquipmentExceptionController extends BaseController
38 38 {
39 39 @Autowired
... ... @@ -48,7 +48,7 @@ public class EquipmentExceptionController extends BaseController
48 48 public TableDataInfo list(EquipmentException equipmentException)
49 49 {
50 50 startPage();
51   - List<EquipmentException> list = equipmentExceptionService.selectEquipmentExceptionList(equipmentException);
  51 + List<EquipmentExceptionResponseVo> list = equipmentExceptionService.selectEquipmentExceptionList(equipmentException);
52 52 return getDataTable(list);
53 53 }
54 54  
... ... @@ -61,8 +61,8 @@ public class EquipmentExceptionController extends BaseController
61 61 @ApiOperation("导出设备异常记录列表")
62 62 public void export(HttpServletResponse response, EquipmentException equipmentException)
63 63 {
64   - List<EquipmentException> list = equipmentExceptionService.selectEquipmentExceptionList(equipmentException);
65   - ExcelUtil<EquipmentException> util = new ExcelUtil<EquipmentException>(EquipmentException.class);
  64 + List<EquipmentExceptionResponseVo> list = equipmentExceptionService.selectEquipmentExceptionList(equipmentException);
  65 + ExcelUtil<EquipmentExceptionResponseVo> util = new ExcelUtil<EquipmentExceptionResponseVo>(EquipmentExceptionResponseVo.class);
66 66 util.exportExcel(response, list, "设备异常记录数据");
67 67 }
68 68  
... ...
ruoyi-admin/src/main/java/com/ruoyi/eexception/domain/EquipmentException.java
... ... @@ -47,5 +47,7 @@ public class EquipmentException extends BaseEntity
47 47 @ApiModelProperty("处理状态")
48 48 private Integer status;
49 49  
  50 + @ApiModelProperty("异常类型")
  51 + private Integer exType;
50 52  
51 53 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/eexception/mapper/EquipmentExceptionMapper.java
... ... @@ -3,6 +3,7 @@ package com.ruoyi.eexception.mapper;
3 3 import java.util.List;
4 4 import com.ruoyi.eexception.domain.EquipmentException;
5 5 import com.ruoyi.pojo.request.ReportErrorRequestVo;
  6 +import com.ruoyi.pojo.response.EquipmentExceptionResponseVo;
6 7  
7 8 /**
8 9 * 设备异常记录Mapper接口
... ... @@ -26,7 +27,15 @@ public interface EquipmentExceptionMapper
26 27 * @param equipmentException 设备异常记录
27 28 * @return 设备异常记录集合
28 29 */
29   - public List<EquipmentException> selectEquipmentExceptionList(EquipmentException equipmentException);
  30 + public List<EquipmentExceptionResponseVo> selectEquipmentExceptionList(EquipmentException equipmentException);
  31 + /**
  32 + * 查询设备异常记录列表
  33 + *
  34 + * @param requestVo 设备异常记录
  35 + * @return 设备异常记录集合
  36 + */
  37 + public List<EquipmentExceptionResponseVo> selectEquipmentExceptionListByVo(ReportErrorRequestVo requestVo);
  38 +
30 39  
31 40 /**
32 41 * 新增设备异常记录
... ... @@ -61,4 +70,6 @@ public interface EquipmentExceptionMapper
61 70 public int deleteEquipmentExceptionByIds(Long[] ids);
62 71  
63 72 List<EquipmentException> getEquipmentErrorList(ReportErrorRequestVo request);
  73 +
  74 + EquipmentException selectEquipmentExceptionByDeviceIdStatus(EquipmentException equipmentException);
64 75 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/eexception/service/IEquipmentExceptionService.java
... ... @@ -2,6 +2,7 @@ package com.ruoyi.eexception.service;
2 2  
3 3 import java.util.List;
4 4 import com.ruoyi.eexception.domain.EquipmentException;
  5 +import com.ruoyi.pojo.response.EquipmentExceptionResponseVo;
5 6  
6 7 /**
7 8 * 设备异常记录Service接口
... ... @@ -25,7 +26,7 @@ public interface IEquipmentExceptionService
25 26 * @param equipmentException 设备异常记录
26 27 * @return 设备异常记录集合
27 28 */
28   - public List<EquipmentException> selectEquipmentExceptionList(EquipmentException equipmentException);
  29 + public List<EquipmentExceptionResponseVo> selectEquipmentExceptionList(EquipmentException equipmentException);
29 30  
30 31 /**
31 32 * 新增设备异常记录
... ...
ruoyi-admin/src/main/java/com/ruoyi/eexception/service/impl/EquipmentExceptionServiceImpl.java
1 1 package com.ruoyi.eexception.service.impl;
2 2  
  3 +import java.util.Date;
3 4 import java.util.List;
4 5 import java.util.Objects;
5 6  
... ... @@ -8,14 +9,15 @@ import com.ruoyi.common.utils.SecurityUtils;
8 9 import com.ruoyi.common.utils.StringUtils;
9 10 import com.ruoyi.equipment.domain.Equipment;
10 11 import com.ruoyi.equipment.mapper.EquipmentMapper;
  12 +import com.ruoyi.pojo.response.EquipmentExceptionResponseVo;
11 13 import org.springframework.beans.factory.annotation.Autowired;
12 14 import org.springframework.stereotype.Service;
13 15 import com.ruoyi.eexception.mapper.EquipmentExceptionMapper;
14 16 import com.ruoyi.eexception.domain.EquipmentException;
15 17 import com.ruoyi.eexception.service.IEquipmentExceptionService;
16 18  
17   -import static com.ruoyi.common.ConstEquipmentProperties.EQUIPMENT_PROCESS_FLOW_COMMIT;
18   -import static com.ruoyi.common.ConstEquipmentProperties.EQUIPMENT_STATUS_ILLNESS;
  19 +import static com.ruoyi.common.ConstEquipmentProperties.*;
  20 +import static com.ruoyi.common.ConstSignInConstSignInProperties.EQUIPMENT_ALCOHOL_EX_NUM;
19 21  
20 22 /**
21 23 * 设备异常记录Service业务层处理
... ... @@ -51,7 +53,7 @@ public class EquipmentExceptionServiceImpl implements IEquipmentExceptionService
51 53 * @return 设备异常记录
52 54 */
53 55 @Override
54   - public List<EquipmentException> selectEquipmentExceptionList(EquipmentException equipmentException)
  56 + public List<EquipmentExceptionResponseVo> selectEquipmentExceptionList(EquipmentException equipmentException)
55 57 {
56 58 return equipmentExceptionMapper.selectEquipmentExceptionList(equipmentException);
57 59 }
... ... @@ -73,9 +75,16 @@ public class EquipmentExceptionServiceImpl implements IEquipmentExceptionService
73 75 if (Objects.isNull(equipment)){
74 76 throw new RuntimeException("设备不存在");
75 77 }
  78 + EquipmentException exception = equipmentExceptionMapper.selectEquipmentExceptionByDeviceIdStatus(equipmentException);
  79 + if (!Objects.isNull(exception)){
  80 + throw new RuntimeException("已经提交过报修,等待维修人员处理。");
  81 + }
  82 + if (Objects.isNull(equipmentException.getExType()))
  83 + equipmentException.setExType(EQUIPMENT_ALCOHOL_EX_NUM);
76 84 equipment.setStatus(EQUIPMENT_STATUS_ILLNESS);
77 85 equipmentMapper.updateEquipment(equipment);
78 86 equipmentException.setStatus(EQUIPMENT_PROCESS_FLOW_COMMIT);
  87 + equipmentException.setCreateTime(new Date());
79 88 return equipmentExceptionMapper.insertEquipmentException(equipmentException);
80 89 }
81 90  
... ... @@ -88,6 +97,12 @@ public class EquipmentExceptionServiceImpl implements IEquipmentExceptionService
88 97 @Override
89 98 public int updateEquipmentException(EquipmentException equipmentException)
90 99 {
  100 + EquipmentException equipmentException1 = equipmentExceptionMapper.selectEquipmentExceptionById(equipmentException.getId());
  101 + if (EQUIPMENT_ALCOHOL_EX_NUM.equals(equipmentException1.getExType()) && equipmentException.getStatus().equals(EQUIPMENT_PROCESS_FLOW_COMPLETE)){
  102 + Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(equipmentException.getDeviceId());
  103 + equipment.setStatus(EQUIPMENT_STATUS_HEALTH);
  104 + equipmentMapper.updateEquipment(equipment);
  105 + }
91 106 return equipmentExceptionMapper.updateEquipmentException(equipmentException);
92 107 }
93 108  
... ...
ruoyi-admin/src/main/java/com/ruoyi/equipment/mapper/EquipmentMapper.java
... ... @@ -4,7 +4,6 @@ import java.util.List;
4 4  
5 5 import com.ruoyi.driver.domain.Driver;
6 6 import com.ruoyi.equipment.domain.Equipment;
7   -import com.ruoyi.global_exception.domain.GlobalException;
8 7 import com.ruoyi.pojo.domain.EquipmentDriverExpand;
9 8 import org.apache.ibatis.annotations.Param;
10 9  
... ...
ruoyi-admin/src/main/java/com/ruoyi/global_exception/controller/GlobalExceptionController.java deleted 100644 → 0
1   -package com.ruoyi.global_exception.controller;
2   -
3   -import java.util.List;
4   -import javax.servlet.http.HttpServletResponse;
5   -
6   -import com.ruoyi.common.global.Result;
7   -import com.ruoyi.pojo.request.GlobalExceptionRequestVo;
8   -import io.swagger.annotations.Api;
9   -import io.swagger.annotations.ApiOperation;
10   -import io.swagger.annotations.ApiParam;
11   -import org.springframework.security.access.prepost.PreAuthorize;
12   -import org.springframework.beans.factory.annotation.Autowired;
13   -import org.springframework.validation.annotation.Validated;
14   -import org.springframework.web.bind.annotation.GetMapping;
15   -import org.springframework.web.bind.annotation.PostMapping;
16   -import org.springframework.web.bind.annotation.PutMapping;
17   -import org.springframework.web.bind.annotation.DeleteMapping;
18   -import org.springframework.web.bind.annotation.PathVariable;
19   -import org.springframework.web.bind.annotation.RequestBody;
20   -import org.springframework.web.bind.annotation.RequestMapping;
21   -import org.springframework.web.bind.annotation.RestController;
22   -import com.ruoyi.common.annotation.Log;
23   -import com.ruoyi.common.core.controller.BaseController;
24   -import com.ruoyi.common.core.domain.AjaxResult;
25   -import com.ruoyi.common.enums.BusinessType;
26   -import com.ruoyi.global_exception.domain.GlobalException;
27   -import com.ruoyi.global_exception.service.IGlobalExceptionService;
28   -import com.ruoyi.common.utils.poi.ExcelUtil;
29   -import com.ruoyi.common.core.page.TableDataInfo;
30   -
31   -/**
32   - * global_exceptionController
33   - *
34   - * @author global_exception
35   - * @date 2023-08-14
36   - */
37   -@RestController
38   -@RequestMapping("/global_exception/global_exception")
39   -@Api(tags = "异常管理")
40   -public class GlobalExceptionController extends BaseController
41   -{
42   - @Autowired
43   - private IGlobalExceptionService globalExceptionService;
44   -
45   - /**
46   - * 查询global_exception列表
47   - */
48   - @PreAuthorize("@ss.hasPermi('global_exception:global_exception:list')")
49   - @GetMapping("/list")
50   - public TableDataInfo list(GlobalException globalException)
51   - {
52   - startPage();
53   - List<GlobalException> list = globalExceptionService.selectGlobalExceptionList(globalException);
54   - return getDataTable(list);
55   - }
56   -
57   - /**
58   - * 导出global_exception列表
59   - */
60   - @PreAuthorize("@ss.hasPermi('global_exception:global_exception:export')")
61   - @Log(title = "global_exception", businessType = BusinessType.EXPORT)
62   - @PostMapping("/export")
63   - public void export(HttpServletResponse response, GlobalException globalException)
64   - {
65   - List<GlobalException> list = globalExceptionService.selectGlobalExceptionList(globalException);
66   - ExcelUtil<GlobalException> util = new ExcelUtil<GlobalException>(GlobalException.class);
67   - util.exportExcel(response, list, "global_exception数据");
68   - }
69   -
70   - /**
71   - * 获取global_exception详细信息
72   - */
73   - @PreAuthorize("@ss.hasPermi('global_exception:global_exception:query')")
74   - @GetMapping(value = "/{id}")
75   - public AjaxResult getInfo(@PathVariable("id") Long id)
76   - {
77   - return success(globalExceptionService.selectGlobalExceptionById(id));
78   - }
79   -
80   - /**
81   - * 新增global_exception
82   - */
83   - @PreAuthorize("@ss.hasPermi('global_exception:global_exception:add')")
84   -// @Log(title = "global_exception", businessType = BusinessType.INSERT)
85   - @ApiOperation("新增异常")
86   - @PostMapping
87   - public Result<?> add(@RequestBody @ApiParam @Validated GlobalExceptionRequestVo globalException)
88   - {
89   - return Result.OK(globalExceptionService.insertGlobalException(globalException));
90   - }
91   -
92   - /**
93   - * 修改global_exception
94   - */
95   - @PreAuthorize("@ss.hasPermi('global_exception:global_exception:edit')")
96   -// @Log(title = "global_exception", businessType = BusinessType.UPDATE)
97   - @PutMapping
98   - public AjaxResult edit(@RequestBody GlobalException globalException)
99   - {
100   - return toAjax(globalExceptionService.updateGlobalException(globalException));
101   - }
102   -
103   - /**
104   - * 删除global_exception
105   - */
106   - @PreAuthorize("@ss.hasPermi('global_exception:global_exception:remove')")
107   - @Log(title = "global_exception", businessType = BusinessType.DELETE)
108   - @DeleteMapping("/{ids}")
109   - public AjaxResult remove(@PathVariable Long[] ids)
110   - {
111   - return toAjax(globalExceptionService.deleteGlobalExceptionByIds(ids));
112   - }
113   -}
ruoyi-admin/src/main/java/com/ruoyi/global_exception/domain/GlobalException.java deleted 100644 → 0
1   -package com.ruoyi.global_exception.domain;
2   -
3   -import io.swagger.annotations.ApiModel;
4   -import io.swagger.annotations.ApiModelProperty;
5   -import lombok.Data;
6   -import org.apache.commons.lang3.builder.ToStringBuilder;
7   -import org.apache.commons.lang3.builder.ToStringStyle;
8   -import com.ruoyi.common.annotation.Excel;
9   -import com.ruoyi.common.core.domain.BaseEntity;
10   -import org.springframework.format.annotation.DateTimeFormat;
11   -
12   -import javax.validation.constraints.NotBlank;
13   -import javax.validation.constraints.NotEmpty;
14   -import javax.validation.constraints.NotNull;
15   -import java.io.Serializable;
16   -import java.util.Date;
17   -
18   -/**
19   - * global_exception对象 global_exception
20   - *
21   - * @author global_exception
22   - * @date 2023-08-14
23   - */
24   -@ApiModel("异常对象")
25   -@Data
26   -public class GlobalException implements Serializable {
27   - private static final long serialVersionUID = 1L;
28   -
29   - /**
30   - * id
31   - */
32   - @ApiModelProperty("主键")
33   - private Long id;
34   -
35   - /**
36   - * 提交工号
37   - */
38   - @Excel(name = "提交工号")
39   - @ApiModelProperty("提交工号")
40   - @NotBlank
41   - private String jobCode;
42   -
43   - /**
44   - * 设备号
45   - */
46   - @Excel(name = "设备号")
47   - @ApiModelProperty("设备号")
48   - @NotBlank
49   - private String deviceId;
50   -
51   - /**
52   - * 问题类型
53   - */
54   - @Excel(name = "问题类型")
55   - @ApiModelProperty("问题类型(1:识别异常,2:设备异常")
56   - @NotNull
57   - private Long type;
58   -
59   - /**
60   - * 处理情况
61   - */
62   - @Excel(name = "处理情况")
63   - @ApiModelProperty("处理情况 (3:未处理,2:处理中,1:已处理")
64   - @NotNull
65   - private Integer handle;
66   -
67   - @ApiModelProperty("创建时间")
68   - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
69   - private Date createTime;
70   - @ApiModelProperty("修改时间")
71   - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
72   - private Date updateTime;
73   - @Excel(name = "问题描述")
74   - @ApiModelProperty("问题描述")
75   - @NotBlank
76   - private String remark;
77   -
78   -}
ruoyi-admin/src/main/java/com/ruoyi/global_exception/mapper/GlobalExceptionMapper.java deleted 100644 → 0
1   -package com.ruoyi.global_exception.mapper;
2   -
3   -import java.util.List;
4   -import com.ruoyi.global_exception.domain.GlobalException;
5   -import org.apache.ibatis.annotations.Param;
6   -
7   -/**
8   - * global_exceptionMapper接口
9   - *
10   - * @author global_exception
11   - * @date 2023-08-14
12   - */
13   -public interface GlobalExceptionMapper
14   -{
15   - /**
16   - * 查询global_exception
17   - *
18   - * @param id global_exception主键
19   - * @return global_exception
20   - */
21   - public GlobalException selectGlobalExceptionById(Long id);
22   -
23   - /**
24   - * 查询global_exception列表
25   - *
26   - * @param globalException global_exception
27   - * @return global_exception集合
28   - */
29   - public List<GlobalException> selectGlobalExceptionList(GlobalException globalException);
30   -
31   - /**
32   - * 新增global_exception
33   - *
34   - * @param globalException global_exception
35   - * @return 结果
36   - */
37   - public int insertGlobalException(GlobalException globalException);
38   -
39   - /**
40   - * 修改global_exception
41   - *
42   - * @param globalException global_exception
43   - * @return 结果
44   - */
45   - public int updateGlobalException(GlobalException globalException);
46   -
47   - /**
48   - * 删除global_exception
49   - *
50   - * @param id global_exception主键
51   - * @return 结果
52   - */
53   - public int deleteGlobalExceptionById(Long id);
54   -
55   - /**
56   - * 批量删除global_exception
57   - *
58   - * @param ids 需要删除的数据主键集合
59   - * @return 结果
60   - */
61   - public int deleteGlobalExceptionByIds(Long[] ids);
62   -
63   -}
ruoyi-admin/src/main/java/com/ruoyi/global_exception/service/IGlobalExceptionService.java deleted 100644 → 0
1   -package com.ruoyi.global_exception.service;
2   -
3   -import java.util.List;
4   -import com.ruoyi.global_exception.domain.GlobalException;
5   -import com.ruoyi.pojo.request.GlobalExceptionRequestVo;
6   -
7   -/**
8   - * global_exceptionService接口
9   - *
10   - * @author global_exception
11   - * @date 2023-08-14
12   - */
13   -public interface IGlobalExceptionService
14   -{
15   - /**
16   - * 查询global_exception
17   - *
18   - * @param id global_exception主键
19   - * @return global_exception
20   - */
21   - public GlobalException selectGlobalExceptionById(Long id);
22   -
23   - /**
24   - * 查询global_exception列表
25   - *
26   - * @param globalException global_exception
27   - * @return global_exception集合
28   - */
29   - public List<GlobalException> selectGlobalExceptionList(GlobalException globalException);
30   -
31   - /**
32   - * 新增global_exception
33   - *
34   - * @param globalException global_exception
35   - * @return 结果
36   - */
37   - public String insertGlobalException(GlobalExceptionRequestVo globalException);
38   -
39   - /**
40   - * 修改global_exception
41   - *
42   - * @param globalException global_exception
43   - * @return 结果
44   - */
45   - public int updateGlobalException(GlobalException globalException);
46   -
47   - /**
48   - * 批量删除global_exception
49   - *
50   - * @param ids 需要删除的global_exception主键集合
51   - * @return 结果
52   - */
53   - public int deleteGlobalExceptionByIds(Long[] ids);
54   -
55   - /**
56   - * 删除global_exception信息
57   - *
58   - * @param id global_exception主键
59   - * @return 结果
60   - */
61   - public int deleteGlobalExceptionById(Long id);
62   -}
ruoyi-admin/src/main/java/com/ruoyi/global_exception/service/impl/GlobalExceptionServiceImpl.java deleted 100644 → 0
1   -package com.ruoyi.global_exception.service.impl;
2   -
3   -import java.util.Date;
4   -import java.util.List;
5   -import java.util.Objects;
6   -
7   -import com.ruoyi.common.utils.DateUtils;
8   -import com.ruoyi.common.utils.SecurityUtils;
9   -import com.ruoyi.driver.domain.Driver;
10   -import com.ruoyi.driver.mapper.DriverMapper;
11   -import com.ruoyi.equipment.domain.Equipment;
12   -import com.ruoyi.equipment.mapper.EquipmentMapper;
13   -import com.ruoyi.pojo.request.GlobalExceptionRequestVo;
14   -import org.springframework.beans.BeanUtils;
15   -import org.springframework.beans.factory.annotation.Autowired;
16   -import org.springframework.stereotype.Service;
17   -import com.ruoyi.global_exception.mapper.GlobalExceptionMapper;
18   -import com.ruoyi.global_exception.domain.GlobalException;
19   -import com.ruoyi.global_exception.service.IGlobalExceptionService;
20   -
21   -import static com.ruoyi.common.ConstEquipmentProperties.*;
22   -
23   -/**
24   - * global_exceptionService业务层处理
25   - *
26   - * @author global_exception
27   - * @date 2023-08-14
28   - */
29   -@Service
30   -public class GlobalExceptionServiceImpl implements IGlobalExceptionService {
31   - @Autowired
32   - private GlobalExceptionMapper globalExceptionMapper;
33   -
34   - @Autowired
35   - private DriverMapper driverMapper;
36   -
37   - @Autowired
38   - private EquipmentMapper equipmentMapper;
39   -
40   - /**
41   - * 查询global_exception
42   - *
43   - * @param id global_exception主键
44   - * @return global_exception
45   - */
46   - @Override
47   - public GlobalException selectGlobalExceptionById(Long id) {
48   - return globalExceptionMapper.selectGlobalExceptionById(id);
49   - }
50   -
51   - /**
52   - * 查询global_exception列表
53   - *
54   - * @param globalException global_exception
55   - * @return global_exception
56   - */
57   - @Override
58   - public List<GlobalException> selectGlobalExceptionList(GlobalException globalException) {
59   - return globalExceptionMapper.selectGlobalExceptionList(globalException);
60   - }
61   -
62   - /**
63   - * 新增global_exception
64   - *
65   - * @param globalException global_exception
66   - * @return 结果
67   - */
68   - @Override
69   - public String insertGlobalException(GlobalExceptionRequestVo globalException) {
70   - if (Objects.isNull(driverMapper.getDriverInfoByJobCode(globalException.getJobCode()))) {
71   - throw new RuntimeException("工号不存在");
72   - }
73   - Equipment equipment = new Equipment();
74   - equipment.setDeviceId(globalException.getDeviceId());
75   - if (Objects.isNull(equipmentMapper.selectEquipmentList(equipment))) {
76   - throw new RuntimeException("设备号不存在");
77   - }
78   - if (EQUIPMENT_STATUS_ILLNESS.equals(globalException.getType())) {
79   - equipment.setStatus(EQUIPMENT_STATUS_ILLNESS);
80   - updateEquipment(equipment);
81   - }
82   - GlobalException exception = new GlobalException();
83   - BeanUtils.copyProperties(globalException, exception);
84   - exception.setCreateTime(DateUtils.getNowDate());
85   - exception.setUpdateTime(DateUtils.getNowDate());
86   - exception.setHandle(EQUIPMENT_PROCESS_FLOW_COMMIT);
87   - if (globalExceptionMapper.insertGlobalException(exception) == 1) {
88   - return "新增成功";
89   - }
90   - return "新增失败";
91   - }
92   -
93   - private void updateEquipment(Equipment equipment) {
94   - equipmentMapper.updateEquipment(equipment);
95   - }
96   -
97   -
98   - /**
99   - * 修改global_exception
100   - *
101   - * @param globalException global_exception
102   - * @return 结果
103   - */
104   - @Override
105   - public int updateGlobalException(GlobalException globalException) {
106   - globalException.setUpdateTime(DateUtils.getNowDate());
107   - return globalExceptionMapper.updateGlobalException(globalException);
108   - }
109   -
110   - /**
111   - * 批量删除global_exception
112   - *
113   - * @param ids 需要删除的global_exception主键
114   - * @return 结果
115   - */
116   - @Override
117   - public int deleteGlobalExceptionByIds(Long[] ids) {
118   - return globalExceptionMapper.deleteGlobalExceptionByIds(ids);
119   - }
120   -
121   - /**
122   - * 删除global_exception信息
123   - *
124   - * @param id global_exception主键
125   - * @return 结果
126   - */
127   - @Override
128   - public int deleteGlobalExceptionById(Long id) {
129   - return globalExceptionMapper.deleteGlobalExceptionById(id);
130   - }
131   -}
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
... ... @@ -75,7 +75,7 @@ public class SignInServiceImpl implements ISignInService {
75 75 private RedisCache redisCache;
76 76  
77 77 @Resource
78   - private ThreadJobService threadJobConfig;
  78 + private ThreadJobService threadJobService;
79 79  
80 80 /**
81 81 * 查询签到
... ... @@ -91,12 +91,11 @@ public class SignInServiceImpl implements ISignInService {
91 91 /**
92 92 * 查询签到列表
93 93 *
94   - * @param signIn 签到
  94 + * @param vo 签到
95 95 * @return 签到
96 96 */
97 97 @Override
98   - public List<SignInResponseVo> selectSignInList(SignInResponseVo signIn) {
99   - SignInResponseVo vo = new SignInResponseVo(signIn);
  98 + public List<SignInResponseVo> selectSignInList(SignInResponseVo vo) {
100 99 List<SignInResponseVo> vos = signInMapper.selectSignInList(vo);
101 100 return vos;
102 101 }
... ... @@ -188,7 +187,7 @@ public class SignInServiceImpl implements ISignInService {
188 187 if (Objects.isNull(driver)) return AjaxResult.warn("这个工号的员工不存在!");
189 188 // 查询地址
190 189 Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(signIn.getDeviceId());
191   - SignInResponseVo vo = getSignInResponseVo(driver,signIn, equipment);
  190 + SignInResponseVo vo = getSignInResponseVo(driver, signIn, equipment);
192 191 signIn.setCreateTime(new Date());
193 192 signIn.setRemark("");
194 193 GlobalIndex globalIndex = new GlobalIndex();
... ... @@ -198,6 +197,7 @@ public class SignInServiceImpl implements ISignInService {
198 197 if (checkSignIn(now, dto, globalIndex, signIn, driver)) {
199 198 signIn.setStatus(SIGN_IN_SUCCESS);
200 199 signIn.setExType(SIGN_NO_EX_NUM);
  200 + signIn.setRemark("正常");
201 201 } else {
202 202 signIn.setStatus(SIGN_IN_FAIL);
203 203 signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。"));
... ... @@ -205,14 +205,13 @@ public class SignInServiceImpl implements ISignInService {
205 205 // base64转图片
206 206 signIn.setIp(IpUtils.getIpAddr());
207 207  
208   - uploadImage(signIn);
  208 + uploadImage(signIn, vo);
209 209 signInMapper.insertSignIn(signIn);
210 210 // 更新考勤
211 211 schedulingService.computedSignInBySignIn(dto, signIn, globalIndex);
212   - // 测试用户特殊处理 TODO 更新签到记录
213   - if (signIn.getJobCode().equals("700002") || signIn.getJobCode().equals("700001")) {
214   - return AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo);
215   - }
  212 +
  213 + // 异常保存到异常异常中
  214 + threadJobService.asyncInsertExceptionRecord(signIn);
216 215  
217 216 // 驾驶人员二次签到酒精测试异常
218 217 if (PERSONNEL_POSTS_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) {
... ... @@ -354,7 +353,7 @@ public class SignInServiceImpl implements ISignInService {
354 353 if (currentScheduling.getBcType().equals(BC_TYPE_OUT) && Objects.isNull(currentScheduling.getSignInId())) {
355 354 DriverSignRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1);
356 355 // 上一次无记|签到,type:签退 当前时间小于最近签到时间 -> 超时签退
357   - if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getBcType().equals(BC_TYPE_IN)){
  356 + if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getBcType().equals(BC_TYPE_IN)) {
358 357 signIn.setRemark(SIGN_OUT_TIMEOUT);
359 358 globalIndex.setIndex(lastClosestTimestamp.getIndex());
360 359 result = false;
... ... @@ -366,7 +365,7 @@ public class SignInServiceImpl implements ISignInService {
366 365 result = false;
367 366 }
368 367 // 当前最近无记录|签到,type:签到|签退 -> 签到超时给上
369   - else {
  368 + else {
370 369 signIn.setRemark(SIGN_IN_TIMEOUT);
371 370 globalIndex.setIndex(currentScheduling.getIndex());
372 371 result = false;
... ... @@ -376,13 +375,13 @@ public class SignInServiceImpl implements ISignInService {
376 375 if (currentScheduling.getBcType().equals(BC_TYPE_IN) && Objects.isNull(currentScheduling.getSignInId())) {
377 376 DriverSignRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1);
378 377 // 上一次无记|签退,type:签到 当前时间小于最近签退时间 -> 签到异常
379   - if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT)) {
  378 + if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_IN)) {
380 379 signIn.setRemark(SIGN_IN_TIMEOUT);
381 380 globalIndex.setIndex(lastClosestTimestamp.getIndex());
382 381 result = false;
383 382 }
384 383 // 当前无记|签退 , type:签退|签到 ——> 签退异常
385   - else {
  384 + else {
386 385 signIn.setRemark(SIGN_OUT_TIMEOUT);
387 386 globalIndex.setIndex(currentScheduling.getIndex());
388 387 result = false;
... ... @@ -404,7 +403,7 @@ public class SignInServiceImpl implements ISignInService {
404 403 }
405 404 }
406 405  
407   - private void uploadImage(SignIn signIn) throws IOException {
  406 + private void uploadImage(SignIn signIn, SignInResponseVo vo) throws IOException {
408 407 String base64 = signIn.getImage();
409 408 // 图片路径
410 409 String filePath = RuoYiConfig.getUploadPath();
... ... @@ -419,9 +418,10 @@ public class SignInServiceImpl implements ISignInService {
419 418 // 获取文件上传路径
420 419 String pathFileName = getPathFileName(filePath, fileName);
421 420 signIn.setImage(pathFileName);
  421 + vo.setImage(signIn.getImage());
422 422 log.info("开始上传签到图片");
423 423 // 异步上传文件
424   - threadJobConfig.asyncStartUploadBase64Image(absPath, base64);
  424 + threadJobService.asyncStartUploadBase64Image(absPath, base64);
425 425 }
426 426  
427 427 /**
... ...
ruoyi-admin/src/main/java/com/ruoyi/job/DriverJob.java
... ... @@ -3,6 +3,7 @@ package com.ruoyi.job;
3 3 import cn.hutool.http.HttpUtil;
4 4 import com.alibaba.fastjson2.JSON;
5 5 import com.alibaba.fastjson2.JSONArray;
  6 +import com.ruoyi.common.cache.NowSchedulingCache;
6 7 import com.ruoyi.common.cache.SchedulingCache;
7 8 import com.ruoyi.common.core.redis.RedisCache;
8 9 import com.ruoyi.common.utils.StringUtils;
... ... @@ -51,6 +52,8 @@ import static com.ruoyi.common.redispre.GlobalRedisPreName.*;
51 52 @Slf4j
52 53 public class DriverJob implements InitializingBean {
53 54  
  55 + @Resource
  56 + private NowSchedulingCache nowSchedulingCache;
54 57  
55 58 @Autowired
56 59 private RedisCache redisCache;
... ... @@ -92,6 +95,7 @@ public class DriverJob implements InitializingBean {
92 95 @Value("${api.config.nonce}")
93 96 private String nonce;
94 97  
  98 + private static NowSchedulingCache NOW_SCHEDULING_CACHE;
95 99 private static ThreadJobService THREAD_JOB_SERVICE;
96 100 private static SchedulingCache SCHEDULING_CACHE;
97 101 private static EquipmentMapper EQUIPMENT_MAPPER;
... ... @@ -177,6 +181,7 @@ public class DriverJob implements InitializingBean {
177 181 return result;
178 182 }
179 183  
  184 + // 弃用 无用方法
180 185 public void clearExceptionYesterdayRecord() {
181 186 // 获取当前日期时间
182 187 Calendar calendar = Calendar.getInstance();
... ... @@ -219,15 +224,30 @@ public class DriverJob implements InitializingBean {
219 224 }
220 225  
221 226 private void deleteScheduling() {
222   - String nowKey = DRIVER_SCHEDULING_PRE + ConstDateUtil.formatDate(new Date());
223   - String yesterdayKey = DRIVER_SCHEDULING_PRE + ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(-1));
  227 + String nowDate = ConstDateUtil.formatDate(new Date());
  228 + String yesterdayDate = ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(-1));
  229 +
  230 + String nowKey = DRIVER_SCHEDULING_PRE + nowDate;
  231 + String yesterdayKey = DRIVER_SCHEDULING_PRE + yesterdayDate;
  232 + // 考情keys
  233 + List<String> nowKeys = NOW_SCHEDULING_CACHE.getKes();
  234 + // 实时keys
224 235 List<String> keys = SCHEDULING_CACHE.getKeys();
  236 +
  237 + // 删除实时排班
225 238 for (int i = 0; i < keys.size(); i++) {
226 239 if (nowKey.equals(keys.get(i)) || yesterdayKey.equals(keys.get(i))){
227 240 continue;
228 241 }
229 242 SCHEDULING_CACHE.removeCacheSchedulingByKey(keys.get(i));
230 243 }
  244 + // 删除考勤
  245 + for (int i = 0; i < nowKeys.size(); i++) {
  246 + if (nowDate.equals(nowKeys.get(i)) || yesterdayDate.equals(nowKeys.get(i))){
  247 + continue;
  248 + }
  249 + NOW_SCHEDULING_CACHE.removeCacheSchedulingByKey(nowKeys.get(i));
  250 + }
231 251 }
232 252  
233 253 /**
... ... @@ -286,11 +306,10 @@ public class DriverJob implements InitializingBean {
286 306 List<ResponseSchedulingDto> schedulingList = driverSchedulingMap.get(key);
287 307 schedulingList.sort(Comparator.comparing(ResponseSchedulingDto::getFcsjT));
288 308 }
289   - // 存入数据库
  309 + // 存入签到报表
290 310 THREAD_JOB_SERVICE.asyncComputedScheduling(driverSchedulingMap);
291   - // 存入缓存
  311 + // 实时排班直接存入缓存
292 312 SCHEDULING_CACHE.setCacheScheduling(DRIVER_SCHEDULING_PRE + dateKey, driverSchedulingMap);
293   -// REDIS_CACHE.setCacheMap(DRIVER_SCHEDULING_PRE + dateKey, driverSchedulingMap, 2, TimeUnit.DAYS);
294 313 log.info("拉取排班完毕:{}", dateKey);
295 314 return driverSchedulingMap;
296 315 }
... ... @@ -484,5 +503,6 @@ public class DriverJob implements InitializingBean {
484 503 APP_SECRET = appSecret;
485 504 SCHEDULING_CACHE = schedulingCache;
486 505 EQUIPMENT_MAPPER = equipmentMapper;
  506 + NOW_SCHEDULING_CACHE = nowSchedulingCache;
487 507 }
488 508 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/entity/DriverScheduling.java
1 1 package com.ruoyi.pojo.entity;
2 2  
3 3 import lombok.Data;
  4 +import org.apache.poi.hpsf.Decimal;
4 5  
  6 +import java.math.BigDecimal;
5 7 import java.util.Date;
6 8  
7 9 @Data
... ... @@ -19,4 +21,13 @@ public class DriverScheduling {
19 21 private Long zdsjT;
20 22 private Long signInId;
21 23 private Integer exType;
  24 + private Integer signType;
  25 + private Date signTime;
  26 + private Integer alcoholFlag;
  27 + private BigDecimal alcoholIntake;
  28 + private String remark;
  29 + /**
  30 + * 不是当前表的属性
  31 + */
  32 + private String fleetName;
22 33 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/request/ReportErrorRequestVo.java
... ... @@ -26,16 +26,21 @@ public class ReportErrorRequestVo {
26 26 * 错误类型
27 27 */
28 28 @ApiModelProperty("错误类型")
29   - private String errorType;
  29 + private Integer exType;
30 30 /**
31   - * 开始时间
  31 + * 错误类型
  32 + */
  33 + @ApiModelProperty("场地名称")
  34 + private String siteName;
  35 + /**
  36 + * 指定日期
32 37 */
33   - @ApiModelProperty("开始时间")
34   - private String startTime;
  38 + @ApiModelProperty("指定日期")
  39 + private String date;
35 40 /**
36   - * 结束时间
  41 + * 主键
37 42 */
38   - @ApiModelProperty("结束时间")
39   - private String endTime;
  43 + @ApiModelProperty("主键")
  44 + private String id;
40 45  
41 46 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/EquipmentExceptionResponseVo.java 0 → 100644
  1 +package com.ruoyi.pojo.response;
  2 +
  3 +import com.ruoyi.eexception.domain.EquipmentException;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + *
  8 + * @author 20412
  9 + */
  10 +@Data
  11 +public class EquipmentExceptionResponseVo extends EquipmentException {
  12 + /**
  13 + * 姓名
  14 + */
  15 + private String personnelName;
  16 + /**
  17 + * 场地名称
  18 + */
  19 + private String siteName;
  20 +
  21 +}
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/ExportReportViewResponseVo.java
1 1 package com.ruoyi.pojo.response;
2 2  
3 3 import com.alibaba.excel.annotation.ExcelProperty;
  4 +import com.alibaba.excel.annotation.write.style.ColumnWidth;
  5 +import com.alibaba.excel.annotation.write.style.HeadFontStyle;
  6 +import com.alibaba.excel.annotation.write.style.HeadRowHeight;
  7 +import com.ruoyi.common.utils.bean.BeanUtils;
  8 +import com.ruoyi.pojo.entity.DriverScheduling;
4 9 import io.swagger.annotations.ApiModel;
5 10 import io.swagger.annotations.ApiModelProperty;
6 11 import lombok.Data;
7 12  
  13 +import java.math.BigDecimal;
8 14 import java.util.Date;
  15 +import java.util.List;
  16 +import java.util.Objects;
  17 +
  18 +import static com.ruoyi.common.ConstSignInConstSignInProperties.*;
9 19  
10 20 /**
11 21 * @author 20412
12 22 */
13 23 @Data
14 24 @ApiModel("报表对象表")
  25 +@HeadRowHeight(25)
  26 +@HeadFontStyle(fontHeightInPoints = 10,fontName = "黑体")
15 27 public class ExportReportViewResponseVo {
16 28 @ExcelProperty(value = "工号")
17 29 private String jobCode;
... ... @@ -23,41 +35,127 @@ public class ExportReportViewResponseVo {
23 35 @ExcelProperty(value = "线路")
24 36 private String lineName;
25 37  
26   - @ApiModelProperty("车队名称")
27   - @ExcelProperty(value = "车队名称")
  38 + @ApiModelProperty("部门")
  39 + @ExcelProperty(value = "部门")
  40 + @ColumnWidth(12)
28 41 private String fleetName;
29 42  
30 43 @ExcelProperty(value = "车辆自编号")
  44 + @ColumnWidth(12)
31 45 private String nbbm;
32 46  
33 47 @ExcelProperty(value = "计划签到时间")
  48 + @ColumnWidth(20)
34 49 private Date planSignInTime;
35 50 @ExcelProperty(value = "实际签到时间")
  51 + @ColumnWidth(20)
36 52 private Date actualSignInTime;
  53 + @ExcelProperty(value = "是否酒精测试")
  54 + @ColumnWidth(12)
  55 + private String alcoholStringIn;
  56 + @ExcelProperty(value = "酒精测试含量")
  57 + @ColumnWidth(12)
  58 + private BigDecimal alcoholIntakeIn;
37 59 @ExcelProperty(value = "签到结果")
  60 + @ColumnWidth(12)
38 61 private String signInResultString;
39 62 @ExcelProperty(value = "计划签退时间")
  63 + @ColumnWidth(20)
40 64 private Date planSignOutTime;
41 65 @ExcelProperty(value = "实际签退时间")
  66 + @ColumnWidth(20)
42 67 private Date actualSignOutTime;
  68 + @ExcelProperty(value = "是否酒精测试")
  69 + @ColumnWidth(12)
  70 + private String alcoholStringOut;
  71 + @ExcelProperty(value = "酒精测试含量")
  72 + @ColumnWidth(12)
  73 + private BigDecimal alcoholIntakeOut;
43 74 @ExcelProperty(value = "签退结果")
44 75 private String signOutResultString;
45 76  
  77 + @ExcelProperty(value = "有无分班")
  78 + private String haveSecondFlagString;
46 79  
47 80 @ExcelProperty(value = "分班计划签到时间")
  81 + @ColumnWidth(20)
48 82 private Date secondPlanSignInTime;
49 83 @ExcelProperty(value = "分班实际签到时间")
  84 + @ColumnWidth(20)
50 85 private Date secondActualSignInTime;
  86 +
  87 + @ExcelProperty(value = "是否酒精测试")
  88 + @ColumnWidth(12)
  89 + private String secondAlcoholStringIn;
  90 + @ExcelProperty(value = "酒精测试含量")
  91 + @ColumnWidth(12)
  92 + private BigDecimal secondAlcoholIntakeIn;
51 93 @ExcelProperty(value = "分班签到结果")
  94 + @ColumnWidth(12)
52 95 private String secondSignInResultString;
53 96 @ExcelProperty(value = "分班计划签退时间")
  97 + @ColumnWidth(20)
54 98 private Date secondPlanSignOutTime;
55 99 @ExcelProperty(value = "分班实际签退时间")
  100 + @ColumnWidth(20)
56 101 private Date secondActualSignOutTime;
  102 +
  103 + @ExcelProperty(value = "是否酒精测试")
  104 + @ColumnWidth(12)
  105 + private String secondAlcoholStringOut;
  106 + @ExcelProperty(value = "酒精测试含量")
  107 + @ColumnWidth(12)
  108 + private BigDecimal secondAlcoholIntakeOut;
57 109 @ExcelProperty(value = "分班签退结果")
  110 + @ColumnWidth(12)
58 111 private String secondSignOutResultString;
59 112  
60 113 @ExcelProperty(value = "排班日期")
61   - private Date schedulingDate;
  114 + @ColumnWidth(20)
  115 + private Date scheduleDate;
  116 +
  117 + public ExportReportViewResponseVo(List<DriverScheduling> driverSchedulings) {
  118 + BeanUtils.copyProperties(driverSchedulings.get(0), this);
  119 + int size = driverSchedulings.size();
  120 + this.setHaveSecondFlagString(size >= 4 ? "有分班":"无分班");
  121 + if (size <= 3) {
  122 + handleFirst(driverSchedulings, size);
  123 + }
  124 + // 有分班
  125 + else {
  126 + // 签到
  127 + handleFirst(driverSchedulings, 2);
  128 + handelSecond(driverSchedulings, size);
  129 + }
  130 + }
  131 +
  132 + private void handelSecond(List<DriverScheduling> driverSchedulings, int size) {
  133 + // 签到
  134 + this.setSecondPlanSignInTime(new Date(driverSchedulings.get(2).getFcsjT()));
  135 + this.setSecondActualSignInTime(driverSchedulings.get(2).getSignTime());
  136 + this.setSecondAlcoholStringIn(ALCOHOL_FLAG_YES.equals(driverSchedulings.get(2).getAlcoholFlag()) ? ALCOHOL_FLAG_YES_STRING : ALCOHOL_FLAG_NO_STRING);
  137 + this.setSecondAlcoholIntakeIn(driverSchedulings.get(2).getAlcoholIntake());
  138 + this.setSecondSignInResultString(Objects.isNull(driverSchedulings.get(2).getSignInId()) ? "未签到" : driverSchedulings.get(2).getRemark());
  139 + // 签退
  140 + this.setSecondPlanSignOutTime(new Date(driverSchedulings.get(size - 1).getZdsjT()));
  141 + this.setSecondActualSignOutTime(driverSchedulings.get(size - 1).getSignTime());
  142 + this.setSecondAlcoholStringOut(ALCOHOL_FLAG_YES.equals(driverSchedulings.get(size - 1).getAlcoholFlag()) ? ALCOHOL_FLAG_YES_STRING : ALCOHOL_FLAG_NO_STRING);
  143 + this.setSecondAlcoholIntakeOut(driverSchedulings.get(size - 1).getAlcoholIntake());
  144 + this.setSecondSignInResultString(Objects.isNull(driverSchedulings.get(size -1).getSignInId()) ? "未签退" : driverSchedulings.get(size -1).getRemark());
  145 + }
62 146  
  147 + private void handleFirst(List<DriverScheduling> driverSchedulings, int size) {
  148 + // 签到
  149 + this.setPlanSignInTime(new Date(driverSchedulings.get(0).getFcsjT()));
  150 + this.setActualSignInTime(driverSchedulings.get(0).getSignTime());
  151 + this.setAlcoholStringIn(ALCOHOL_FLAG_YES.equals(driverSchedulings.get(0).getAlcoholFlag()) ? ALCOHOL_FLAG_YES_STRING : ALCOHOL_FLAG_NO_STRING);
  152 + this.setAlcoholIntakeIn(driverSchedulings.get(0).getAlcoholIntake());
  153 + this.setSignInResultString(Objects.isNull(driverSchedulings.get(0).getSignInId()) ? "未签到": driverSchedulings.get(0).getRemark());
  154 + // 签退
  155 + this.setPlanSignOutTime(new Date(driverSchedulings.get(size - 1).getZdsjT()));
  156 + this.setActualSignOutTime(driverSchedulings.get(size - 1).getSignTime());
  157 + this.setAlcoholStringOut(ALCOHOL_FLAG_YES.equals(driverSchedulings.get(size - 1).getAlcoholFlag()) ? ALCOHOL_FLAG_YES_STRING : ALCOHOL_FLAG_NO_STRING);
  158 + this.setAlcoholIntakeOut(driverSchedulings.get(size - 1).getAlcoholIntake());
  159 + this.setSignOutResultString(Objects.isNull(driverSchedulings.get(size - 1).getSignInId()) ? "未签退": driverSchedulings.get(size - 1).getRemark());
  160 + }
63 161 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/ReportDetailResponseVo.java
... ... @@ -11,10 +11,14 @@ import java.util.Date;
11 11 @Data
12 12 @ApiModel("签到报表查看详情vo")
13 13 public class ReportDetailResponseVo {
  14 + private String jobCode;
14 15 private String name;
15 16 private String posts;
16 17 private String lineName;
17 18 private String lpName;
  19 + private String fleetName;
  20 + private String nbbm;
  21 + private String exString;
18 22 /**
19 23 * 计划操作
20 24 */
... ... @@ -24,15 +28,19 @@ public class ReportDetailResponseVo {
24 28 */
25 29 private String actualAction;
26 30 /**
27   - * 是否酒精测试
  31 + * 打卡时间
28 32 */
29   - private Boolean alcoholFlag;
  33 + private Date planTime;
30 34 /**
31   - * 签到时间
  35 + * 实际打卡时间
32 36 */
33   - private Date createTime;
  37 + private Date actualTime;
34 38 /**
35 39 * 原因
36 40 */
37 41 private String remark;
  42 + /**
  43 + * 是否酒精测试
  44 + */
  45 + private String alcoholString;
38 46 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/ReportErrorResponseVo.java
... ... @@ -18,7 +18,7 @@ import java.util.Date;
18 18 public class ReportErrorResponseVo {;
19 19 @ApiModelProperty("异常类型")
20 20 @ExcelProperty(value = "异常类型")
21   - private String errorType;
  21 + private Integer exType;
22 22 @ApiModelProperty("姓名")
23 23 @ExcelProperty(value = "姓名")
24 24 private String name;
... ... @@ -31,14 +31,18 @@ public class ReportErrorResponseVo {;
31 31 @ApiModelProperty("设备id")
32 32 @ExcelProperty(value = "设备id")
33 33 private String deviceId;
34   - @ApiModelProperty("时间")
35   - @ExcelProperty(value = "时间")
  34 + @ExcelProperty(value = "场地名称")
  35 + private String siteName;
  36 + @ApiModelProperty("发生时间")
  37 + @ExcelProperty(value = "发生时间")
36 38 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
37 39 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
38 40 private Date createTime;
39   - @ApiModelProperty("备注")
40   - @ExcelProperty(value = "备注")
41   - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
42   - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
  41 +
  42 + @ApiModelProperty("标题")
  43 + @ExcelProperty(value = "标题")
  44 + private String title;
  45 + @ApiModelProperty("详情")
  46 + @ExcelProperty(value = "详情")
43 47 private String remark;
44 48 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/ReportViewResponseVo.java
... ... @@ -37,6 +37,7 @@ public class ReportViewResponseVo {
37 37 @ApiModelProperty("车辆自编号")
38 38 private String lpName;
39 39  
  40 +
40 41 private Integer planSignInCount;
41 42 private Integer actualSignInCount;
42 43 private Integer planSignOutCount;
... ...
ruoyi-admin/src/main/java/com/ruoyi/pojo/response/SignInResponseVo.java
... ... @@ -24,6 +24,12 @@ public class SignInResponseVo extends SignIn {
24 24 @Excel( name = "场地名称")
25 25 String siteName;
26 26  
  27 + @ExcelIgnore
  28 + /**
  29 + * 打卡日期
  30 + */
  31 + String date;
  32 +
27 33 public SignInResponseVo(SignIn signIn){
28 34 this.setDeviceId(signIn.getDeviceId());
29 35 this.setId(signIn.getId());
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/ReportService.java
... ... @@ -10,21 +10,28 @@ import com.ruoyi.in.mapper.SignInMapper;
10 10 import com.ruoyi.pojo.entity.DriverScheduling;
11 11 import com.ruoyi.pojo.request.ReportViewRequestVo;
12 12 import com.ruoyi.pojo.request.ReportErrorRequestVo;
13   -import com.ruoyi.pojo.response.ReportDetailResponseVo;
14   -import com.ruoyi.pojo.response.ReportErrorResponseVo;
15   -import com.ruoyi.pojo.response.ReportSignInResponseVo;
16   -import com.ruoyi.pojo.response.ReportViewResponseVo;
  13 +import com.ruoyi.pojo.response.*;
  14 +import com.ruoyi.utils.ConstDateUtil;
  15 +import org.springframework.beans.BeanUtils;
17 16 import org.springframework.beans.factory.annotation.Autowired;
18 17 import org.springframework.stereotype.Service;
19 18  
20 19 import javax.annotation.Resource;
21 20 import javax.servlet.http.HttpServletResponse;
  21 +import javax.validation.constraints.NotBlank;
22 22 import java.text.SimpleDateFormat;
  23 +import java.time.LocalDate;
  24 +import java.time.YearMonth;
  25 +import java.time.format.DateTimeFormatter;
23 26 import java.util.*;
24 27 import java.util.stream.Collectors;
25 28  
  29 +import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT;
  30 +import static com.ruoyi.common.ConstSignInConstSignInProperties.*;
26 31 import static com.ruoyi.common.ErrorTypeProperties.EQUIPMENT_ERROR;
27 32 import static com.ruoyi.common.ErrorTypeProperties.SIGN_IN_ERROR;
  33 +import static com.ruoyi.common.ReportProperties.DAY;
  34 +import static com.ruoyi.common.ReportProperties.MONTH;
28 35  
29 36 /**
30 37 * @author 20412
... ... @@ -51,86 +58,138 @@ public class ReportService {
51 58 * 查询报表信息
52 59 */
53 60 public List<ReportViewResponseVo> getReportScrollViewTable(ReportViewRequestVo requestVo, HttpServletResponse response) {
54   - List<ReportViewResponseVo> reportScrollViewTable = schedulingService.queryReportTableResponseVo(requestVo,response);
  61 + List<ReportViewResponseVo> reportScrollViewTable = schedulingService.queryReportTableResponseVo(requestVo, response);
55 62 return reportScrollViewTable;
56 63 }
57 64  
58 65 public List<ReportErrorResponseVo> getErrorReportList(ReportErrorRequestVo request) {
59   - // 获取基础报表信息
60   - List<SignIn> signInList = signInMapper.getSignErrorList(request);
61   - List<EquipmentException> exceptionList = exceptionMapper.getEquipmentErrorList(request);
62   - // 封装到集合返回前端
63   - List<ReportErrorResponseVo> responses = new ArrayList<>();
64   - // 获取对应名称
65   - Set<String> jobCodes = new HashSet<>();
66   - signInList.stream().forEach(item -> {
67   - jobCodes.add(item.getJobCode());
68   - });
69   - exceptionList.stream().forEach(item -> {
70   - jobCodes.add(item.getJobCode());
71   - });
72   - Map<String, String> names = driverMapper.getNameByJobCode(jobCodes).stream().collect(Collectors.toMap(Driver::getJobCode, Driver::getPersonnelName));
73   - if (SIGN_IN_ERROR.equals(request.getErrorType())) {
74   - copyToResponse(names, signInList, responses);
75   - } else if (EQUIPMENT_ERROR.equals(request.getErrorType())) {
76   - copyToResponseByException(names, exceptionList, responses);
77   - } else {
78   - copyToResponse(names, signInList, responses);
79   - copyToResponseByException(names, exceptionList, responses);
80   - }
81   - responses = sortListByCreateTime(responses);
82   -
83   - // 清除缓存
84   - jobCodes.clear();
85   - signInList.clear();
86   - exceptionList.clear();
87   - return responses;
  66 + List<EquipmentExceptionResponseVo> list = exceptionMapper.selectEquipmentExceptionListByVo(request);
  67 + return list.stream().map(item->{
  68 + ReportErrorResponseVo vo = new ReportErrorResponseVo();
  69 + vo.setRemark(item.getRemark());
  70 + vo.setName(item.getPersonnelName());
  71 + vo.setSiteName(item.getSiteName());
  72 + vo.setImage(item.getImage());
  73 + vo.setJobCode(item.getJobCode());
  74 + vo.setDeviceId(item.getDeviceId());
  75 + vo.setExType(item.getExType());
  76 + vo.setCreateTime(item.getCreateTime());
  77 + vo.setTitle(item.getTitle());
  78 + return vo;
  79 + }).collect(Collectors.toList());
88 80 }
89 81  
90   - private List<ReportErrorResponseVo> sortListByCreateTime(List<ReportErrorResponseVo> responses) {
91   - responses = responses.stream().sorted(Comparator.comparing(ReportErrorResponseVo::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
92   - return responses;
  82 +
  83 +
  84 + public List<ExportReportViewResponseVo> exportReportList(ReportViewRequestVo requestVo, HttpServletResponse response) {
  85 + // 处理天
  86 + if (requestVo.getExportFlag().equals(DAY)){
  87 + return getDayReportTableResponseVo(requestVo.getDate(),response);
  88 + }
  89 + // 处理月
  90 + else if (requestVo.getExportFlag().equals(MONTH)) {
  91 + return getMonthReportTableResponseVo(requestVo, response);
  92 + }
  93 + return null;
93 94 }
94 95  
95   - private void copyToResponseByException(Map<String, String> names, List<EquipmentException> exceptionList, List<ReportErrorResponseVo> responses) {
96   - exceptionList.forEach(item -> {
97   - ReportErrorResponseVo vo = new ReportErrorResponseVo();
98   - vo.setName(names.get(item.getJobCode()));
99   - vo.setImage(item.getImage());
100   - vo.setRemark(item.getRemark());
101   - vo.setCreateTime(item.getCreateTime());
102   - vo.setDeviceId(item.getDeviceId());
103   - vo.setErrorType(EQUIPMENT_ERROR);
104   - responses.add(vo);
105   - });
  96 + private List<ExportReportViewResponseVo> getDayReportTableResponseVo(String date, HttpServletResponse response) {
  97 + List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null);
  98 + Map<String,List<DriverScheduling>> resultMap = new HashMap<>(800);
  99 + List<ExportReportViewResponseVo> vo = new ArrayList<>(800);
  100 + handleResultMap(date,resultMap,schedulingList);
  101 + handleResultList(vo,resultMap);
  102 + return vo;
106 103 }
107 104  
108   - private void copyToResponse(Map<String, String> names, List<SignIn> signInList, List<ReportErrorResponseVo> responses) {
109   - signInList.forEach(item -> {
110   - ReportErrorResponseVo vo = new ReportErrorResponseVo();
111   - vo.setName(names.get(item.getJobCode()));
112   - vo.setImage(item.getImage());
113   - vo.setRemark(item.getRemark());
114   - vo.setCreateTime(item.getCreateTime());
115   - vo.setJobCode(item.getJobCode());
116   -// vo.setDeviceId();
117   - vo.setErrorType(SIGN_IN_ERROR);
118   - responses.add(vo);
119   - });
  105 + private void handleResultList(List<ExportReportViewResponseVo> vo, Map<String, List<DriverScheduling>> resultMap) {
  106 + for (String key : resultMap.keySet()) {
  107 + resultMap.get(key).sort(Comparator.comparing(DriverScheduling::getFcsjT));
  108 + vo.add(new ExportReportViewResponseVo(resultMap.get(key)) );
  109 + }
120 110 }
121 111  
122   - public String getDateDay(Date createTime) {
123   - SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
124   - return simple.format(createTime);
  112 + private void handleResultMap(@NotBlank String date, Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) {
  113 + for (DriverScheduling item : schedulingList) {
  114 + String key = date + item.getJobCode();
  115 + if (Objects.isNull(resultMap.get(key))){
  116 + resultMap.put(key,new ArrayList<>(Arrays.asList(item)));
  117 + }else {
  118 + resultMap.get(key).add(item);
  119 + }
  120 + }
125 121 }
126 122  
127   - public List<ReportViewResponseVo> exportReportList(ReportViewRequestVo requestVo, HttpServletResponse response) {
  123 + private List<ExportReportViewResponseVo> getMonthReportTableResponseVo(ReportViewRequestVo requestVo, HttpServletResponse response) {
  124 + List<ExportReportViewResponseVo> responseVos = new ArrayList<>(10000);
  125 + List<String> days = getNowMonthAllDay(requestVo.getDate());
  126 + for (String day : days) {
  127 + List<ExportReportViewResponseVo> dayReportTableResponseVo = getDayReportTableResponseVo(day, response);
  128 + responseVos.addAll(dayReportTableResponseVo);
  129 + }
  130 + return responseVos;
  131 + }
128 132  
129   - return null;
  133 + private List<String> getNowMonthAllDay(@NotBlank String dateString) {
  134 + // 获取当前年月
  135 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  136 + LocalDate formatDate = LocalDate.parse(dateString, formatter);
  137 + int month = formatDate.getMonthValue();
  138 + int year = formatDate.getYear();
  139 + YearMonth yearMonth = YearMonth.of(year,month);
  140 +
  141 + // 获取当前月份的第一天和最后一天日期
  142 + LocalDate firstDay = yearMonth.atDay(1);
  143 + LocalDate lastDay = yearMonth.atEndOfMonth();
  144 +
  145 + // 获取当前月份的所有日期集合
  146 + List<String> datesInMonth = new ArrayList<>();
  147 + LocalDate date = firstDay;
  148 + while (!date.isAfter(lastDay)) {
  149 + datesInMonth.add(date.toString());
  150 + date = date.plusDays(1);
  151 + }
  152 + return datesInMonth;
130 153 }
131 154  
132 155 public List<ReportDetailResponseVo> getReportDetail(ReportViewRequestVo vo, HttpServletResponse response) {
  156 + List<ReportDetailResponseVo> responseVos = new ArrayList<>();
133 157 List<DriverScheduling> toDay = schedulingMapper.queryToDay(vo.getDate(), vo.getName(), vo.getJobCode(), vo.getLineName());
134   - return null;
  158 + for (DriverScheduling scheduling : toDay) {
  159 + ReportDetailResponseVo reportDetailResponseVo = new ReportDetailResponseVo();
  160 + handleReportDetail(reportDetailResponseVo, scheduling);
  161 + responseVos.add(reportDetailResponseVo);
  162 + }
  163 + responseVos.sort(Comparator.comparing(ReportDetailResponseVo::getPlanTime));
  164 + return responseVos;
  165 + }
  166 +
  167 + private void handleReportDetail(ReportDetailResponseVo reportDetailResponseVo, DriverScheduling scheduling) {
  168 + BeanUtils.copyProperties(scheduling, reportDetailResponseVo);
  169 + reportDetailResponseVo.setPlanAction(scheduling.getBcType().equals(BC_TYPE_OUT) ? SIGN_IN_STRING : SIGN_IN_OUT_STRING);
  170 + reportDetailResponseVo.setPlanTime(scheduling.getBcType().equals(BC_TYPE_OUT) ? new Date(scheduling.getFcsjT()) : new Date(scheduling.getZdsjT()));
  171 + reportDetailResponseVo.setExString(SIGN_NO_EX_NUM.equals(scheduling.getExType()) ? NO_EX : HAVE_EX);
  172 +
  173 + // 设置操作 当前有操作的
  174 + if (!Objects.isNull(scheduling.getSignInId())) {
  175 + reportDetailResponseVo.setActualTime(scheduling.getSignTime());
  176 + reportDetailResponseVo.setActualAction(scheduling.getSignType().equals(SIGN_IN) ? SIGN_IN_STRING : SIGN_IN_OUT_STRING);
  177 + reportDetailResponseVo.setRemark(scheduling.getRemark());
  178 + reportDetailResponseVo.setAlcoholString(ALCOHOL_FLAG_YES.equals(scheduling.getAlcoholFlag()) ? ALCOHOL_FLAG_YES_STRING : ALCOHOL_FLAG_NO_STRING);
  179 + }
  180 + // 当前无操作
  181 + else {
  182 + reportDetailResponseVo.setRemark(scheduling.getBcType().equals(BC_TYPE_OUT) ? "未签到" : "未签退");
  183 + reportDetailResponseVo.setAlcoholString(ALCOHOL_FLAG_NO_STRING);
  184 + }
  185 +
  186 + }
  187 +
  188 + public List<SignInResponseVo> getBigView(ReportViewRequestVo requestVo, HttpServletResponse response) {
  189 + SignInResponseVo vo = new SignInResponseVo();
  190 + vo.setDate(requestVo.getDate());
  191 + vo.setJobCode(requestVo.getJobCode());
  192 + List<SignInResponseVo> vos = signInMapper.selectSignInList(vo);
  193 + return vos;
135 194 }
136 195 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/SchedulingService.java
1 1 package com.ruoyi.service;
2 2  
3 3 import cn.hutool.core.collection.CollectionUtil;
  4 +import com.ruoyi.common.cache.NowSchedulingCache;
4 5 import com.ruoyi.driver.mapper.DriverSchedulingMapper;
5 6 import com.ruoyi.in.domain.SignIn;
6 7 import com.ruoyi.in.mapper.SignInMapper;
... ... @@ -14,6 +15,7 @@ import org.springframework.beans.BeanUtils;
14 15 import org.springframework.beans.factory.annotation.Autowired;
15 16 import org.springframework.stereotype.Service;
16 17  
  18 +import javax.annotation.Resource;
17 19 import javax.servlet.http.HttpServletResponse;
18 20 import java.time.LocalDate;
19 21 import java.time.LocalDateTime;
... ... @@ -34,6 +36,9 @@ import static com.ruoyi.common.ReportProperties.NOW;
34 36 @Service
35 37 public class SchedulingService {
36 38  
  39 + @Resource
  40 + private NowSchedulingCache nowSchedulingCache;
  41 +
37 42 @Autowired
38 43 private DriverSchedulingMapper schedulingMapper;
39 44  
... ... @@ -48,10 +53,9 @@ public class SchedulingService {
48 53 * @return
49 54 */
50 55 public List<DriverScheduling> queryScheduling(String jobCode, Long now) {
51   - // TODO 查表变成缓存查询
52 56 List<DriverScheduling> dto = null;
53 57 for (int i = 0; i > -2; i--) {
54   - dto = schedulingMapper.queryToDay(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(i)), null, jobCode, null);
  58 + dto = nowSchedulingCache.getCacheSchedulingMapValueByHKey(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(i)),jobCode);
55 59 if (!CollectionUtil.isEmpty(dto)) {
56 60 dto.sort(Comparator.comparing(DriverScheduling::getZdsjT));
57 61 if (i == -1) {
... ... @@ -69,6 +73,7 @@ public class SchedulingService {
69 73 return dto;
70 74 }
71 75  
  76 +
72 77 /**
73 78 * 计算签到逻辑
74 79 *
... ... @@ -105,14 +110,19 @@ public class SchedulingService {
105 110 * @param globalIndex
106 111 */
107 112 public void computedSignInBySignIn(List<DriverScheduling> dto, SignIn signIn, GlobalIndex globalIndex) {
  113 + // 无排班不记录不在考勤表不更新
  114 + if (CollectionUtil.isEmpty(dto)) {
  115 + return;
  116 + }
  117 +
108 118 // 更新最新的签到记录判断是否需要更新考勤
109 119 // 记录为空直接插入记录
110 120 if (Objects.isNull(dto.get(globalIndex.getIndex()).getSignInId())) {
111   - schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType());
  121 + schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
112 122 }
113 123 // 之前的无效
114 124 else if (!dto.get(globalIndex.getIndex()).getExType().equals(SIGN_NO_EX_NUM)) {
115   - schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType());
  125 + schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
116 126 }
117 127 // 之前的有效
118 128 else {
... ... @@ -134,9 +144,8 @@ public class SchedulingService {
134 144 signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。"));
135 145 signInMapper.updateSignIn(signIn);
136 146 }
137   -
138 147 // 之前是签到 | 目前无效 -》往后更新
139   - schedulingMapper.updateRoster(dto.get(globalIndex.getIndex() + 1), signIn.getId(), signIn.getExType());
  148 + schedulingMapper.updateRoster(dto.get(globalIndex.getIndex() + 1), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
140 149 }
141 150  
142 151 public List<ReportViewResponseVo> queryReportTableResponseVo(ReportViewRequestVo requestVo, HttpServletResponse response) {
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/ThreadJobService.java
... ... @@ -3,6 +3,7 @@ package com.ruoyi.service;
3 3  
4 4 import cn.hutool.core.collection.CollectionUtil;
5 5 import cn.hutool.http.HttpUtil;
  6 +import com.ruoyi.common.cache.NowSchedulingCache;
6 7 import com.ruoyi.common.config.RuoYiConfig;
7 8 import com.ruoyi.common.exception.file.FileUploadException;
8 9 import com.ruoyi.common.utils.StringUtils;
... ... @@ -10,6 +11,9 @@ import com.ruoyi.common.utils.file.FileUploadUtils;
10 11 import com.ruoyi.driver.domain.Driver;
11 12 import com.ruoyi.driver.mapper.DriverMapper;
12 13 import com.ruoyi.driver.mapper.DriverSchedulingMapper;
  14 +import com.ruoyi.eexception.domain.EquipmentException;
  15 +import com.ruoyi.eexception.mapper.EquipmentExceptionMapper;
  16 +import com.ruoyi.in.domain.SignIn;
13 17 import com.ruoyi.job.DriverJob;
14 18 import com.ruoyi.pojo.entity.DriverScheduling;
15 19 import com.ruoyi.pojo.response.ResponseSchedulingDto;
... ... @@ -29,12 +33,15 @@ import org.springframework.transaction.support.DefaultTransactionDefinition;
29 33 import org.springframework.web.client.RestTemplate;
30 34 import sun.misc.BASE64Decoder;
31 35  
  36 +import javax.annotation.Resource;
32 37 import java.io.*;
33 38 import java.util.*;
34 39 import java.util.stream.Collectors;
35 40  
36 41 import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_IN;
37 42 import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT;
  43 +import static com.ruoyi.common.ConstEquipmentProperties.*;
  44 +import static com.ruoyi.common.ConstSignInConstSignInProperties.SIGN_NO_EX_NUM;
38 45  
39 46  
40 47 /**
... ... @@ -53,10 +60,16 @@ public class ThreadJobService {
53 60 @Autowired
54 61 private DriverSchedulingMapper schedulingMapper;
55 62  
  63 + @Resource
  64 + private NowSchedulingCache nowSchedulingCache;
  65 +
56 66  
57 67 @Autowired
58 68 private PlatformTransactionManager transactionManager;
59 69  
  70 + @Autowired
  71 + private EquipmentExceptionMapper exceptionMapper;
  72 +
60 73 @Value("${api.headImage}")
61 74 private String headImagePre;
62 75  
... ... @@ -115,6 +128,22 @@ public class ThreadJobService {
115 128 }
116 129  
117 130 @Async
  131 + public void asyncInsertExceptionRecord(SignIn signIn){
  132 + if (!SIGN_NO_EX_NUM.equals(signIn.getExType())){
  133 + EquipmentException exception = new EquipmentException();
  134 + exception.setExType(signIn.getExType());
  135 + exception.setDeviceId(signIn.getDeviceId());
  136 + exception.setJobCode(signIn.getJobCode());
  137 + exception.setStatus(EQUIPMENT_PROCESS_FLOW_COMMIT);
  138 + exception.setImage(signIn.getImage());
  139 + exception.setTitle("打卡异常");
  140 + exception.setRemark(signIn.getRemark());
  141 + exception.setCreateTime(signIn.getCreateTime());
  142 + exceptionMapper.insertEquipmentException(exception);
  143 + }
  144 + }
  145 +
  146 + @Async
118 147 public void asyncUploadDriverWithUpdateImageUrl(List<Driver> drivers, String token) {
119 148 // 插入数据
120 149 for (Driver driver : drivers) {
... ... @@ -254,10 +283,18 @@ public class ThreadJobService {
254 283 public void asyncComputedScheduling(Map<String, List<ResponseSchedulingDto>> originSchedulingMap) {
255 284 //查询当天是否保存过考情表 如果存在则保存
256 285 List<DriverScheduling> dto = schedulingMapper.queryToDay(ConstDateUtil.formatDate("yyyy-MM-dd"), null,null,null);
  286 + // 存入缓存
257 287 if (!CollectionUtil.isEmpty(dto) || originSchedulingMap.size() == 0) {
258   -// log.info("今天已获取过考勤数据");
  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 + }
259 294 return;
260 295 }
  296 +
  297 +
261 298 List<DriverScheduling> bcList = new ArrayList<>(1000);
262 299 for (String key : originSchedulingMap.keySet()) {
263 300 List<ResponseSchedulingDto> schedulingList = originSchedulingMap.get(key);
... ... @@ -279,4 +316,15 @@ public class ThreadJobService {
279 316 schedulingMapper.insertRoster(bcList);
280 317 }
281 318  
  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);
  326 + }
  327 + }
  328 + }
  329 +
282 330 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/utils/ConstDateUtil.java
1 1 package com.ruoyi.utils;
2 2  
  3 +import java.text.ParseException;
3 4 import java.text.SimpleDateFormat;
4 5 import java.time.Instant;
5 6 import java.time.LocalDateTime;
... ... @@ -21,6 +22,7 @@ public class ConstDateUtil {
21 22 return simpleDateFormat.format(date);
22 23 }
23 24  
  25 +
24 26 public static Date getTheSpecifiedNumberOfDaysOfTime(Integer amount) {
25 27 // 获取当前日期时间
26 28 Calendar calendar = Calendar.getInstance();
... ...
ruoyi-admin/src/main/resources/mapper/driver_scheduling/DriverSchedulingMapper.xml
... ... @@ -19,7 +19,9 @@
19 19 <result column="zdsj_t" property="zdsjT" jdbcType="BIGINT"/>
20 20 <result column="sign_in_id" property="signInId" jdbcType="BIGINT"/>
21 21 <result column="ex_type" property="exType" jdbcType="TINYINT"/>
22   -
  22 + <result column="sign_time" property="signTime" jdbcType="DATETIMEOFFSET"/>
  23 + <result column="alcohol_flag" property="alcoholFlag" jdbcType="DATETIMEOFFSET"/>
  24 + <result column="alcohol_intake" property="alcoholIntake"/>
23 25 </resultMap>
24 26 <insert id="insertRoster" useGeneratedKeys="true" keyProperty="id">
25 27 insert into scheduling (schedule_date,line_name,job_code,`name`,posts,lp_name,nbbm,bc_type,fcsj_t,zdsj_t)
... ... @@ -45,22 +47,27 @@
45 47 <update id="updateRoster">
46 48 update scheduling
47 49 set sign_in_id = #{signInId},
48   - ex_type = #{exType}
  50 + ex_type = #{exType},
  51 + sign_time = #{signTime},
  52 + remark = #{remark},
  53 + sign_type = #{signType},
  54 + alcohol_flag = #{alcoholFlag},
  55 + alcohol_intake = #{alcoholIntake}
49 56 where id = #{scheduling.id}
50 57 </update>
51 58  
52 59 <select id="queryToDay" resultType="com.ruoyi.pojo.entity.DriverScheduling" resultMap="Scheduling">
53   - select * from
54   - scheduling
  60 + select scheduling.*,driver.fleet_name fleetName from
  61 + scheduling join driver on driver.job_code = scheduling.job_code
55 62 where schedule_date = #{date}
56 63 <if test="jobCode !=null and jobCode != ''">
57   - and job_code = #{jobCode}
  64 + and driver.job_code = #{jobCode}
58 65 </if>
59 66 <if test="name !=null and name != ''">
60 67 and `name` = #{name}
61 68 </if>
62 69 <if test="lineName !=null and lineName != ''">
63   - and line_name = #{lineName}
  70 + and scheduling.line_name like concat('%', #{lineName}, '%')
64 71 </if>
65 72  
66 73 </select>
... ...
ruoyi-admin/src/main/resources/mapper/eexception/EquipmentExceptionMapper.xml
... ... @@ -4,6 +4,19 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
4 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 5 <mapper namespace="com.ruoyi.eexception.mapper.EquipmentExceptionMapper">
6 6  
  7 + <resultMap type="com.ruoyi.pojo.response.EquipmentExceptionResponseVo" id="EquipmentExceptionResponseResult">
  8 + <result property="id" column="id" />
  9 + <result property="title" column="title" />
  10 + <result property="deviceId" column="device_id" />
  11 + <result property="jobCode" column="job_code" />
  12 + <result property="image" column="image" />
  13 + <result property="status" column="status" />
  14 + <result property="createTime" column="create_time" />
  15 + <result property="remark" column="remark" />
  16 + <result property="exType" column="ex_type" />
  17 + <result property="personnelName" column="personnel_name" />
  18 + <result property="siteName" column="site_name" />
  19 + </resultMap>
7 20 <resultMap type="EquipmentException" id="EquipmentExceptionResult">
8 21 <result property="id" column="id" />
9 22 <result property="title" column="title" />
... ... @@ -13,19 +26,22 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
13 26 <result property="status" column="status" />
14 27 <result property="createTime" column="create_time" />
15 28 <result property="remark" column="remark" />
  29 + <result property="exType" column="ex_type" />
16 30 </resultMap>
17 31  
18 32 <sql id="selectEquipmentExceptionVo">
19   - select id, title, device_id, job_code, image, status, create_time, remark from equipment_exception
  33 + select id, title, device_id, job_code, image, status, create_time, remark,ex_type from equipment_exception
20 34 </sql>
21 35  
22   - <select id="selectEquipmentExceptionList" parameterType="EquipmentException" resultMap="EquipmentExceptionResult">
23   - <include refid="selectEquipmentExceptionVo"/>
24   - <where>
  36 + <select id="selectEquipmentExceptionList" parameterType="com.ruoyi.pojo.response.EquipmentExceptionResponseVo" resultMap="EquipmentExceptionResponseResult">
  37 + select equipment_exception.id, title, equipment.site_name , equipment_exception.device_id,driver.personnel_name,driver.job_code, equipment_exception.image, equipment_exception.status, equipment_exception.create_time, equipment_exception.ex_type,equipment_exception.remark
  38 + from
  39 + equipment_exception join driver on driver.job_code = equipment_exception.job_code join equipment on equipment.device_id = equipment_exception.device_id
  40 + <where>
  41 + ex_type = 4
25 42 <if test="title != null and title != ''"> and title = #{title}</if>
26 43 <if test="deviceId != null "> and device_id = #{deviceId}</if>
27   - <if test="jobCode != null and jobCode != ''"> and job_code = #{jobCode}</if>
28   - <if test="image != null and image != ''"> and image = #{image}</if>
  44 + <if test="jobCode != null and jobCode != ''"> and driver.job_code = #{jobCode}</if>
29 45 <if test="status != null "> and status = #{status}</if>
30 46 </where>
31 47 order by id desc
... ... @@ -46,6 +62,25 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
46 62 and job_code = #{jobCode}
47 63 </if>
48 64 </select>
  65 + <select id="selectEquipmentExceptionListByVo"
  66 + resultType="com.ruoyi.pojo.response.EquipmentExceptionResponseVo" resultMap="EquipmentExceptionResponseResult">
  67 +
  68 + select equipment_exception.id, title, equipment.site_name , equipment_exception.device_id,driver.personnel_name,driver.job_code, equipment_exception.image, equipment_exception.status, equipment_exception.create_time, equipment_exception.ex_type,equipment_exception.remark
  69 + from
  70 + equipment_exception join driver on driver.job_code = equipment_exception.job_code join equipment on equipment.device_id = equipment_exception.device_id
  71 + <where>
  72 + equipment_exception.`status` != 1
  73 + <if test="siteName != null and siteName != ''"> and equipment.site_name = #{siteName}</if>
  74 + <if test="jobCode != null and jobCode != ''"> and driver.job_code = #{jobCode}</if>
  75 + <if test="exType != null "> and ex_type = #{exType}</if>
  76 + <if test="id != null "> and equipment_exception.id #{id}</if>
  77 + <if test="date != null "> and equipment_exception.create_time like concat(#{date},'%')</if>
  78 + </where>
  79 + </select>
  80 + <select id="selectEquipmentExceptionByDeviceIdStatus"
  81 + resultType="com.ruoyi.eexception.domain.EquipmentException">
  82 + select id from equipment_exception where device_id = #{deviceId} and ex_type = 4 and `status` != 1 limit 1
  83 + </select>
49 84  
50 85 <insert id="insertEquipmentException" parameterType="EquipmentException" useGeneratedKeys="true" keyProperty="id">
51 86 insert into equipment_exception
... ... @@ -57,6 +92,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
57 92 <if test="status != null">status,</if>
58 93 <if test="createTime != null">create_time,</if>
59 94 <if test="remark != null and remark != ''">remark,</if>
  95 + <if test="exType != null and exType != ''">ex_type,</if>
60 96 </trim>
61 97 <trim prefix="values (" suffix=")" suffixOverrides=",">
62 98 <if test="title != null">#{title},</if>
... ... @@ -66,6 +102,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
66 102 <if test="status != null">#{status},</if>
67 103 <if test="createTime != null">#{createTime},</if>
68 104 <if test="remark != null and remark != ''">#{remark},</if>
  105 + <if test="exType != null and exType != ''">#{exType},</if>
69 106 </trim>
70 107 </insert>
71 108  
... ...
ruoyi-admin/src/main/resources/mapper/equipment/EquipmentMapper.xml
... ... @@ -130,7 +130,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
130 130 <if test="id !=null">
131 131 and id = #{id}
132 132 </if>
133   - <if test="device_id !=null and id == null">
  133 + <if test="deviceId !=null and id == null">
134 134 and device_id = #{deviceId}
135 135 </if>
136 136 </update>
... ...
ruoyi-admin/src/main/resources/mapper/global_exception/GlobalExceptionMapper.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.global_exception.mapper.GlobalExceptionMapper">
6   -
7   - <resultMap type="GlobalException" id="GlobalExceptionResult">
8   - <result property="id" column="id" />
9   - <result property="jobCode" column="job_code" />
10   - <result property="deviceId" column="device_id" />
11   - <result property="type" column="type" />
12   - <result property="remark" column="remark" />
13   - <result property="handle" column="handle" />
14   - <result property="createTime" column="create_time" />
15   - <result property="updateTime" column="update_time" />
16   - </resultMap>
17   -
18   - <sql id="selectGlobalExceptionVo">
19   - select id, job_code, device_id, type, remark, handle, create_time, update_time from global_exception
20   - </sql>
21   -
22   - <select id="selectGlobalExceptionList" parameterType="GlobalException" resultMap="GlobalExceptionResult">
23   - <include refid="selectGlobalExceptionVo"/>
24   - <where>
25   - <if test="jobCode != null and jobCode != ''"> and job_code = #{jobCode}</if>
26   - <if test="deviceId != null and deviceId != ''"> and device_id = #{deviceId}</if>
27   - <if test="type != null "> and type = #{type}</if>
28   - <if test="handle != null "> and handle = #{handle}</if>
29   - </where>
30   - </select>
31   -
32   - <select id="selectGlobalExceptionById" parameterType="Long" resultMap="GlobalExceptionResult">
33   - <include refid="selectGlobalExceptionVo"/>
34   - where id = #{id}
35   - </select>
36   -
37   -
38   - <insert id="insertGlobalException" parameterType="GlobalException">
39   - insert into global_exception
40   - <trim prefix="(" suffix=")" suffixOverrides=",">
41   - <if test="id != null">id,</if>
42   - <if test="jobCode != null">job_code,</if>
43   - <if test="deviceId != null">device_id,</if>
44   - <if test="type != null">type,</if>
45   - <if test="remark != null">remark,</if>
46   - <if test="handle != null">handle,</if>
47   - <if test="createTime != null">create_time,</if>
48   - <if test="updateTime != null">update_time,</if>
49   - </trim>
50   - <trim prefix="values (" suffix=")" suffixOverrides=",">
51   - <if test="id != null">#{id},</if>
52   - <if test="jobCode != null">#{jobCode},</if>
53   - <if test="deviceId != null">#{deviceId},</if>
54   - <if test="type != null">#{type},</if>
55   - <if test="remark != null">#{remark},</if>
56   - <if test="handle != null">#{handle},</if>
57   - <if test="createTime != null">#{createTime},</if>
58   - <if test="updateTime != null">#{updateTime},</if>
59   - </trim>
60   - </insert>
61   -
62   - <update id="updateGlobalException" parameterType="GlobalException">
63   - update global_exception
64   - <trim prefix="SET" suffixOverrides=",">
65   - <if test="jobCode != null">job_code = #{jobCode},</if>
66   - <if test="deviceId != null">device_id = #{deviceId},</if>
67   - <if test="type != null">type = #{type},</if>
68   - <if test="remark != null">remark = #{remark},</if>
69   - <if test="handle != null">handle = #{handle},</if>
70   - <if test="createTime != null">create_time = #{createTime},</if>
71   - <if test="updateTime != null">update_time = #{updateTime},</if>
72   - </trim>
73   - where id = #{id}
74   - </update>
75   -
76   - <delete id="deleteGlobalExceptionById" parameterType="Long">
77   - delete from global_exception where id = #{id}
78   - </delete>
79   -
80   - <delete id="deleteGlobalExceptionByIds" parameterType="String">
81   - delete from global_exception where id in
82   - <foreach item="id" collection="array" open="(" separator="," close=")">
83   - #{id}
84   - </foreach>
85   - </delete>
86   -</mapper>
87 0 \ No newline at end of file
ruoyi-admin/src/main/resources/mapper/in/SignInMapper.xml
... ... @@ -50,12 +50,13 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
50 50 <if test="jobCode != null and jobCode != ''"> and jobCode = #{jobCode}</if>
51 51 <if test="ip != null and ip != ''"> and ip = #{ip}</if>
52 52 <if test="image != null and image != ''"> and image = #{image}</if>
53   - <if test="status != null "> and status = #{status}</if>
  53 + <if test="status != null "> and sign_in.status = #{status}</if>
54 54 <if test="singnIn != null and singnIn != ''"> and singn_in = #{singnIn}</if>
55 55 <if test="alcoholFlag != null "> and alcohol_flag = #{alcoholFlag}</if>
56 56 <if test="type != null "> and type = #{type}</if>
57 57 <if test="alcoholIntake != null "> and alcohol_intake = #{alcoholIntake}</if>
58 58 <if test="siteName != null "> and site_name = #{siteName}</if>
  59 + <if test="date != null "> and sign_in.create_time LIKE concat(#{date},'%')</if>
59 60 order by create_time desc
60 61 </select>
61 62  
... ...
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
... ... @@ -24,6 +24,11 @@ import java.util.Set;
24 24 import java.util.UUID;
25 25 import java.util.stream.Collectors;
26 26 import javax.servlet.http.HttpServletResponse;
  27 +
  28 +import com.alibaba.excel.write.metadata.WriteSheet;
  29 +import com.alibaba.excel.write.metadata.style.WriteCellStyle;
  30 +import com.alibaba.excel.write.metadata.style.WriteFont;
  31 +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
27 32 import org.apache.commons.lang3.ArrayUtils;
28 33 import org.apache.commons.lang3.RegExUtils;
29 34 import org.apache.commons.lang3.reflect.FieldUtils;
... ...