Commit 4db44e6f24d2a4f28b4d90c562fd9d5b75eb6e7c

Authored by guzijian
1 parent 3f6190a9

fix: 解决签到非司售工种处理报错空指针异常

ruoyi-admin/src/main/java/com/ruoyi/common/ConstDriverProperties.java
@@ -5,5 +5,8 @@ package com.ruoyi.common; @@ -5,5 +5,8 @@ package com.ruoyi.common;
5 * @author 20412 5 * @author 20412
6 */ 6 */
7 public interface ConstDriverProperties { 7 public interface ConstDriverProperties {
8 - String PERSONNEL_TYPE_DRIVER = "驾驶员"; 8 + String PERSONNEL_POSTS_DRIVER = "驾驶员";
  9 +
  10 +
  11 + String PERSONNEL_POSTS_SALES = "售票员";
9 } 12 }
ruoyi-admin/src/main/java/com/ruoyi/common/global/GlobalDriverInfoCache.java
@@ -2,10 +2,8 @@ package com.ruoyi.common.global; @@ -2,10 +2,8 @@ package com.ruoyi.common.global;
2 2
3 import com.ruoyi.in.domain.SignIn; 3 import com.ruoyi.in.domain.SignIn;
4 import com.ruoyi.pojo.domain.SignInExpand; 4 import com.ruoyi.pojo.domain.SignInExpand;
5 -import com.ruoyi.utils.ConstDateUtil;  
6 import org.springframework.stereotype.Component; 5 import org.springframework.stereotype.Component;
7 6
8 -import java.security.Principal;  
9 import java.util.*; 7 import java.util.*;
10 import java.util.concurrent.ConcurrentHashMap; 8 import java.util.concurrent.ConcurrentHashMap;
11 9
@@ -15,13 +13,9 @@ import java.util.concurrent.ConcurrentHashMap; @@ -15,13 +13,9 @@ import java.util.concurrent.ConcurrentHashMap;
15 @Component 13 @Component
16 public class GlobalDriverInfoCache { 14 public class GlobalDriverInfoCache {
17 /** 15 /**
18 - * 上午签到汇总 16 + * 签到次数汇总
19 */ 17 */
20 - private final ConcurrentHashMap<String, List<SignInExpand>> morningUserSignInMap = new ConcurrentHashMap();  
21 - /**  
22 - * 下午签到汇总  
23 - */  
24 - private final ConcurrentHashMap<String, List<SignInExpand>> afternoonUserSignInMap = new ConcurrentHashMap(); 18 + private final ConcurrentHashMap<String, List<SignInExpand>> userCurrentMap = new ConcurrentHashMap<>();
25 19
26 /** 20 /**
27 * 驾驶员签到成功 21 * 驾驶员签到成功
@@ -30,27 +24,19 @@ public class GlobalDriverInfoCache { @@ -30,27 +24,19 @@ public class GlobalDriverInfoCache {
30 */ 24 */
31 public void putDriverSignInSuccess(SignIn signIn) { 25 public void putDriverSignInSuccess(SignIn signIn) {
32 ConcurrentHashMap<String, List<SignInExpand>> userCurrentMap = null; 26 ConcurrentHashMap<String, List<SignInExpand>> userCurrentMap = null;
33 - int hour = Integer.parseInt(ConstDateUtil.formatDate("HH"));  
34 - if (hour >= 0 && hour < 12) {  
35 - userCurrentMap = morningUserSignInMap;  
36 if (Objects.isNull(userCurrentMap.get(signIn.getJobCode()))) { 27 if (Objects.isNull(userCurrentMap.get(signIn.getJobCode()))) {
37 SignInExpand signInExpand = new SignInExpand(); 28 SignInExpand signInExpand = new SignInExpand();
38 signInExpand.setJobCode(signIn.getJobCode()); 29 signInExpand.setJobCode(signIn.getJobCode());
39 - signInExpand.setMorningSignInIds(signInExpand.getMorningSignInIds() + signIn.getId() + ","); 30 + signInExpand.setSignCount(signIn.getId() + ",");
40 userCurrentMap.put(signIn.getJobCode(), new ArrayList<>(Arrays.asList(signInExpand))); 31 userCurrentMap.put(signIn.getJobCode(), new ArrayList<>(Arrays.asList(signInExpand)));
41 } else { 32 } else {
42 - userCurrentMap.get(signIn.getJobCode()).add(null); 33 + SignInExpand signInExpand = new SignInExpand();
  34 + signInExpand.setJobCode(signIn.getJobCode());
  35 + signInExpand.setSignCount(signInExpand.getSignCount() + signIn.getId() + ",");
  36 + userCurrentMap.get(signIn.getJobCode()).add(signInExpand);
43 } 37 }
44 - }else {  
45 - userCurrentMap = afternoonUserSignInMap;  
46 } 38 }
47 - /**  
48 - * 存在判断 上下午只保留一条作为正式的签到结果  
49 - * 上午签到 -》 成功 | 下午签到 -》异常,成功  
50 - * 上午签到 -》 异常,异常 | 下午签到 -》 成功  
51 - */  
52 39
53 } 40 }
54 41
55 42
56 -}  
ruoyi-admin/src/main/java/com/ruoyi/common/redispre/GlobalRedisPreName.java
@@ -5,7 +5,10 @@ package com.ruoyi.common.redispre; @@ -5,7 +5,10 @@ package com.ruoyi.common.redispre;
5 */ 5 */
6 public interface GlobalRedisPreName { 6 public interface GlobalRedisPreName {
7 String DRIVER_SCHEDULING_PRE = "driver:scheduling:"; 7 String DRIVER_SCHEDULING_PRE = "driver:scheduling:";
8 - String REDIS_SIGN_IN = "sign:in:"; 8 + /**
  9 + * 存储驾驶员酒精测试异常
  10 + */
  11 + String REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW = "sign:in:driver";
9 /** 12 /**
10 * 请求人事系统token 13 * 请求人事系统token
11 */ 14 */
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
@@ -15,7 +15,6 @@ import com.ruoyi.common.constant.Constants; @@ -15,7 +15,6 @@ import com.ruoyi.common.constant.Constants;
15 import com.ruoyi.common.core.domain.AjaxResult; 15 import com.ruoyi.common.core.domain.AjaxResult;
16 import com.ruoyi.common.core.redis.RedisCache; 16 import com.ruoyi.common.core.redis.RedisCache;
17 import com.ruoyi.common.utils.DateUtils; 17 import com.ruoyi.common.utils.DateUtils;
18 -import com.ruoyi.common.ConstSignInConstSignInProperties;  
19 import com.ruoyi.common.utils.StringUtils; 18 import com.ruoyi.common.utils.StringUtils;
20 import com.ruoyi.common.utils.ip.IpUtils; 19 import com.ruoyi.common.utils.ip.IpUtils;
21 import com.ruoyi.common.utils.uuid.Seq; 20 import com.ruoyi.common.utils.uuid.Seq;
@@ -29,6 +28,8 @@ import com.ruoyi.pojo.response.SignInResponseVo; @@ -29,6 +28,8 @@ import com.ruoyi.pojo.response.SignInResponseVo;
29 import com.ruoyi.service.ThreadJobService; 28 import com.ruoyi.service.ThreadJobService;
30 import com.ruoyi.utils.ConstDateUtil; 29 import com.ruoyi.utils.ConstDateUtil;
31 import org.apache.commons.io.FilenameUtils; 30 import org.apache.commons.io.FilenameUtils;
  31 +import org.slf4j.Logger;
  32 +import org.slf4j.LoggerFactory;
32 import org.springframework.beans.factory.annotation.Autowired; 33 import org.springframework.beans.factory.annotation.Autowired;
33 import org.springframework.stereotype.Service; 34 import org.springframework.stereotype.Service;
34 import com.ruoyi.in.mapper.SignInMapper; 35 import com.ruoyi.in.mapper.SignInMapper;
@@ -37,11 +38,11 @@ import com.ruoyi.in.service.ISignInService; @@ -37,11 +38,11 @@ import com.ruoyi.in.service.ISignInService;
37 38
38 import javax.annotation.Resource; 39 import javax.annotation.Resource;
39 40
40 -import static com.ruoyi.common.ConstDriverProperties.PERSONNEL_TYPE_DRIVER; 41 +import static com.ruoyi.common.ConstDriverProperties.PERSONNEL_POSTS_DRIVER;
41 import static com.ruoyi.common.ErrorTypeProperties.*; 42 import static com.ruoyi.common.ErrorTypeProperties.*;
42 import static com.ruoyi.common.ConstSignInConstSignInProperties.*; 43 import static com.ruoyi.common.ConstSignInConstSignInProperties.*;
43 import static com.ruoyi.common.redispre.GlobalRedisPreName.DRIVER_SCHEDULING_PRE; 44 import static com.ruoyi.common.redispre.GlobalRedisPreName.DRIVER_SCHEDULING_PRE;
44 -import static com.ruoyi.common.redispre.GlobalRedisPreName.REDIS_SIGN_IN; 45 +import static com.ruoyi.common.redispre.GlobalRedisPreName.REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW;
45 46
46 /** 47 /**
47 * 签到Service业务层处理 48 * 签到Service业务层处理
@@ -51,6 +52,8 @@ import static com.ruoyi.common.redispre.GlobalRedisPreName.REDIS_SIGN_IN; @@ -51,6 +52,8 @@ import static com.ruoyi.common.redispre.GlobalRedisPreName.REDIS_SIGN_IN;
51 */ 52 */
52 @Service 53 @Service
53 public class SignInServiceImpl implements ISignInService { 54 public class SignInServiceImpl implements ISignInService {
  55 +
  56 + private Logger log = LoggerFactory.getLogger(SignInServiceImpl.class);
54 @Autowired 57 @Autowired
55 private SignInMapper signInMapper; 58 private SignInMapper signInMapper;
56 59
@@ -98,6 +101,7 @@ public class SignInServiceImpl implements ISignInService { @@ -98,6 +101,7 @@ public class SignInServiceImpl implements ISignInService {
98 public AjaxResult insertSignIn(SignIn signIn) { 101 public AjaxResult insertSignIn(SignIn signIn) {
99 // 查询员工信息 102 // 查询员工信息
100 Driver driver = driverMapper.getDriverInfoByJobCode(signIn.getJobCode()); 103 Driver driver = driverMapper.getDriverInfoByJobCode(signIn.getJobCode());
  104 + if (Objects.isNull(driver)) return AjaxResult.error("这个工号的员工不存在!");
101 // 查询地址 105 // 查询地址
102 Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(signIn.getDeviceId()); 106 Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(signIn.getDeviceId());
103 SignInResponseVo vo = getSignInResponseVo(signIn, equipment); 107 SignInResponseVo vo = getSignInResponseVo(signIn, equipment);
@@ -109,14 +113,14 @@ public class SignInServiceImpl implements ISignInService { @@ -109,14 +113,14 @@ public class SignInServiceImpl implements ISignInService {
109 } else { 113 } else {
110 signIn.setStatus(SIGN_IN_FAIL); 114 signIn.setStatus(SIGN_IN_FAIL);
111 } 115 }
112 - // base64转图片  
113 signIn.setIp(IpUtils.getIpAddr()); 116 signIn.setIp(IpUtils.getIpAddr());
  117 + // base64转图片
114 // uploadImage(signIn); 118 // uploadImage(signIn);
115 signInMapper.insertSignIn(signIn); 119 signInMapper.insertSignIn(signIn);
116 // TODO redis 存储每个人的签到 用于后续考勤 120 // TODO redis 存储每个人的签到 用于后续考勤
117 121
118 // 驾驶人员二次签到酒精测试异常 122 // 驾驶人员二次签到酒精测试异常
119 - if (PERSONNEL_TYPE_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) { 123 + if (PERSONNEL_POSTS_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) {
120 AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo); 124 AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo);
121 if (!Objects.isNull(result)) { 125 if (!Objects.isNull(result)) {
122 return result; 126 return result;
@@ -164,6 +168,7 @@ public class SignInServiceImpl implements ISignInService { @@ -164,6 +168,7 @@ public class SignInServiceImpl implements ISignInService {
164 public AjaxResult addSignIn(SignIn signIn) throws IOException { 168 public AjaxResult addSignIn(SignIn signIn) throws IOException {
165 // 查询员工信息 169 // 查询员工信息
166 Driver driver = driverMapper.getDriverInfoByJobCode(signIn.getJobCode()); 170 Driver driver = driverMapper.getDriverInfoByJobCode(signIn.getJobCode());
  171 + if (Objects.isNull(driver)) return AjaxResult.error("这个工号的员工不存在!");
167 // 查询地址 172 // 查询地址
168 Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(signIn.getDeviceId()); 173 Equipment equipment = equipmentMapper.selectEquipmentByDeviceId(signIn.getDeviceId());
169 SignInResponseVo vo = getSignInResponseVo(signIn, equipment); 174 SignInResponseVo vo = getSignInResponseVo(signIn, equipment);
@@ -177,18 +182,18 @@ public class SignInServiceImpl implements ISignInService { @@ -177,18 +182,18 @@ public class SignInServiceImpl implements ISignInService {
177 } 182 }
178 // base64转图片 183 // base64转图片
179 signIn.setIp(IpUtils.getIpAddr()); 184 signIn.setIp(IpUtils.getIpAddr());
  185 +
180 uploadImage(signIn); 186 uploadImage(signIn);
181 signInMapper.insertSignIn(signIn); 187 signInMapper.insertSignIn(signIn);
182 // TODO redis 存储每个人的签到 用于后续考勤 188 // TODO redis 存储每个人的签到 用于后续考勤
183 189
184 // 驾驶人员二次签到酒精测试异常 190 // 驾驶人员二次签到酒精测试异常
185 - if (PERSONNEL_TYPE_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) { 191 + if (PERSONNEL_POSTS_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) {
186 AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo); 192 AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo);
187 if (!Objects.isNull(result)) { 193 if (!Objects.isNull(result)) {
188 return result; 194 return result;
189 } 195 }
190 } 196 }
191 -  
192 return SIGN_IN_SUCCESS.equals(signIn.getStatus()) ? AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo) : AjaxResult.error(SIGN_IN_ERROR + signIn.getRemark(), vo); 197 return SIGN_IN_SUCCESS.equals(signIn.getStatus()) ? AjaxResult.success(SIGN_IN_SUCCESS_STRING, vo) : AjaxResult.error(SIGN_IN_ERROR + signIn.getRemark(), vo);
193 } 198 }
194 199
@@ -203,7 +208,7 @@ public class SignInServiceImpl implements ISignInService { @@ -203,7 +208,7 @@ public class SignInServiceImpl implements ISignInService {
203 } 208 }
204 209
205 private AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn, SignInResponseVo vo) { 210 private AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn, SignInResponseVo vo) {
206 - String key = REDIS_SIGN_IN + ConstDateUtil.formatDate("yyyyMMdd"); 211 + String key = REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW + ConstDateUtil.formatDate("yyyyMMdd");
207 // 驾驶员酒精测试连续超标两次则提示换人 212 // 驾驶员酒精测试连续超标两次则提示换人
208 Integer count = redisCache.getCacheMapValue(key, signIn.getJobCode()); 213 Integer count = redisCache.getCacheMapValue(key, signIn.getJobCode());
209 if (Objects.isNull(count) || count.equals(0)) { 214 if (Objects.isNull(count) || count.equals(0)) {
@@ -228,7 +233,7 @@ public class SignInServiceImpl implements ISignInService { @@ -228,7 +233,7 @@ public class SignInServiceImpl implements ISignInService {
228 result = checkWorkDay(signIn, driver.getPosts()); 233 result = checkWorkDay(signIn, driver.getPosts());
229 234
230 // 酒精测试校验 确定 且员工工种是驾驶员 235 // 酒精测试校验 确定 且员工工种是驾驶员
231 - if (ALCOHOL_FLAG_YES.equals(signIn.getAlcoholFlag()) && PERSONNEL_TYPE_DRIVER.equals(driver.getPosts())) { 236 + if (ALCOHOL_FLAG_YES.equals(signIn.getAlcoholFlag()) && PERSONNEL_POSTS_DRIVER.equals(driver.getPosts())) {
232 if (new BigDecimal(20).compareTo(signIn.getAlcoholIntake()) > 0) { 237 if (new BigDecimal(20).compareTo(signIn.getAlcoholIntake()) > 0) {
233 result = true; 238 result = true;
234 } else { 239 } else {
@@ -269,13 +274,21 @@ public class SignInServiceImpl implements ISignInService { @@ -269,13 +274,21 @@ public class SignInServiceImpl implements ISignInService {
269 // 超时校验司售人员 274 // 超时校验司售人员
270 if (result) { 275 if (result) {
271 // TODO 非司售人员 276 // TODO 非司售人员
272 - result = checkTimeOut(signIn, jobs); 277 + result = checkTimeOut(signIn, jobs, posts);
273 } 278 }
274 return result; 279 return result;
275 } 280 }
276 281
277 - private boolean checkTimeOut(SignIn signIn, List<ResponseScheduling> driver) { 282 + private boolean checkTimeOut(SignIn signIn, List<ResponseScheduling> driver, String posts) {
278 // 那发车时间和到站时间作为开始上班的时间 283 // 那发车时间和到站时间作为开始上班的时间
  284 + if (PERSONNEL_POSTS_DRIVER.equals(posts)) {
  285 + return driverCheckTimeOut(signIn, driver);
  286 + } else {
  287 + return true;
  288 + }
  289 + }
  290 +
  291 + private static boolean driverCheckTimeOut(SignIn signIn, List<ResponseScheduling> driver) {
279 LocalDateTime startTime = ConstDateUtil.getLocalDateTimeByLongTime(driver.get(0).getFcsjT()); 292 LocalDateTime startTime = ConstDateUtil.getLocalDateTimeByLongTime(driver.get(0).getFcsjT());
280 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(driver.get(driver.size() - 1).getZdsjT()); 293 LocalDateTime endTime = ConstDateUtil.getLocalDateTimeByLongTime(driver.get(driver.size() - 1).getZdsjT());
281 LocalDateTime signTime = ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime()); 294 LocalDateTime signTime = ConstDateUtil.getLocalDateTimeByLongTime(signIn.getCreateTime().getTime());
ruoyi-admin/src/main/java/com/ruoyi/pojo/domain/SignInExpand.java
@@ -14,13 +14,9 @@ public class SignInExpand { @@ -14,13 +14,9 @@ public class SignInExpand {
14 private Integer id; 14 private Integer id;
15 private String jobCode; 15 private String jobCode;
16 /** 16 /**
17 - * 上午签到集合 1,2 17 + * 签到集合 1,2
18 */ 18 */
19 - private String morningSignInIds;  
20 - /**  
21 - * 下午签到集合 1,2  
22 - */  
23 - private String afternoonSignInIds; 19 + private String signCount;
24 @DateTimeFormat(pattern = "yyyy-MM-dd") 20 @DateTimeFormat(pattern = "yyyy-MM-dd")
25 private Date dated; 21 private Date dated;
26 } 22 }
ruoyi-admin/src/main/java/com/ruoyi/service/ThreadJobService.java
@@ -74,6 +74,7 @@ public class ThreadJobService { @@ -74,6 +74,7 @@ public class ThreadJobService {
74 outputStream = new FileOutputStream(url); 74 outputStream = new FileOutputStream(url);
75 outputStream.write(photoBase64); 75 outputStream.write(photoBase64);
76 outputStream.flush(); 76 outputStream.flush();
  77 + log.info("文件上传完毕");
77 } catch (Exception e) { 78 } catch (Exception e) {
78 log.error("文件上传异常:{}", e.getMessage()); 79 log.error("文件上传异常:{}", e.getMessage());
79 } finally { 80 } finally {
ruoyi-admin/src/main/java/com/ruoyi/upgrade/controller/VersionUpgradeController.java
@@ -3,7 +3,6 @@ package com.ruoyi.upgrade.controller; @@ -3,7 +3,6 @@ package com.ruoyi.upgrade.controller;
3 import java.util.List; 3 import java.util.List;
4 import javax.servlet.http.HttpServletResponse; 4 import javax.servlet.http.HttpServletResponse;
5 5
6 -import io.swagger.annotations.ApiOperation;  
7 import org.springframework.security.access.prepost.PreAuthorize; 6 import org.springframework.security.access.prepost.PreAuthorize;
8 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.web.bind.annotation.GetMapping; 8 import org.springframework.web.bind.annotation.GetMapping;
@@ -54,7 +53,6 @@ public class VersionUpgradeController extends BaseController @@ -54,7 +53,6 @@ public class VersionUpgradeController extends BaseController
54 @PreAuthorize("@ss.hasPermi('upgrade:upgrade:export')") 53 @PreAuthorize("@ss.hasPermi('upgrade:upgrade:export')")
55 @Log(title = "upgrade", businessType = BusinessType.EXPORT) 54 @Log(title = "upgrade", businessType = BusinessType.EXPORT)
56 @PostMapping("/export") 55 @PostMapping("/export")
57 - @ApiOperation("")  
58 public void export(HttpServletResponse response, VersionUpgrade versionUpgrade) 56 public void export(HttpServletResponse response, VersionUpgrade versionUpgrade)
59 { 57 {
60 List<VersionUpgrade> list = versionUpgradeService.selectVersionUpgradeList(versionUpgrade); 58 List<VersionUpgrade> list = versionUpgradeService.selectVersionUpgradeList(versionUpgrade);