Commit a19ff945f64143d7c630fd775d061e10774e4d9b

Authored by guzijian
1 parent 62e6c99d

feat: 修改应用更新逻辑,维护两个应用版本

ruoyi-admin/src/main/java/com/ruoyi/controller/ApplicationUpdateController.java
... ... @@ -33,8 +33,8 @@ public class ApplicationUpdateController {
33 33 */
34 34 @GetMapping("/version/check/{currentVersion}")
35 35 @ApiOperation("校验版本号")
36   - public AjaxResult checkVersionNum(@PathVariable("currentVersion") Integer currentVersion) {
37   - return AjaxResult.success(appService.checkVersionNum(currentVersion));
  36 + public AjaxResult checkVersionNum(@PathVariable("currentVersion") Integer currentVersion, @RequestParam(value = "deviceId", required = false) String deviceId) {
  37 + return AjaxResult.success(appService.checkVersionNum(currentVersion,deviceId));
38 38 }
39 39  
40 40 /**
... ... @@ -61,6 +61,18 @@ public class ApplicationUpdateController {
61 61 }
62 62 }
63 63  
  64 +
  65 + @PostMapping("/uploadApk/other")
  66 + @ApiOperation("上传apk文件")
  67 + public AjaxResult uploadApkOther(MultipartFile file) {
  68 + try {
  69 + return appService.uploadApkOther(file);
  70 + } catch (Exception e) {
  71 + return AjaxResult.error("上传失败,请重试,再次失败请联系管理员,失败原因:" + e.getMessage());
  72 + }
  73 + }
  74 +
  75 +
64 76 @GetMapping("/checkDeviceHeart")
65 77 @ApiOperation("设备心跳检测")
66 78 public Result<?> checkAppHeart(@Validated @ApiParam @ModelAttribute HeartPackageVo vo) {
... ...
ruoyi-admin/src/main/java/com/ruoyi/driver/service/impl/DriverServiceImpl.java
... ... @@ -357,7 +357,7 @@ public class DriverServiceImpl implements IDriverService {
357 357 return vos;
358 358 }
359 359  
360   - private boolean doCheckDevice(String deviceId) {
  360 + public static boolean doCheckDevice(String deviceId) {
361 361 if (StringUtil.isEmpty(deviceId)){
362 362 return true;
363 363 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/in/controller/SignInController.java
... ... @@ -77,16 +77,16 @@ public class SignInController extends BaseController {
77 77 return success(signInService.selectSignInById(id));
78 78 }
79 79  
80   -// /**
81   -// * 新增签到
82   -// */
83   -//// @PreAuthorize("@ss.hasPermi('in:in:add')")
84   -// @Log(title = "签到", businessType = BusinessType.INSERT)
85   -// @PostMapping
86   -// @ApiOperation("新增签到(通过后台管理页面)")
87   -// public AjaxResult add(@ApiParam @RequestBody SignIn signIn) {
88   -// return signInService.insertSignIn(signIn);
89   -// }
  80 + /**
  81 + * 补签
  82 + */
  83 +// @PreAuthorize("@ss.hasPermi('in:in:add')")
  84 + @Log(title = "补签", businessType = BusinessType.INSERT)
  85 + @PutMapping("/supplementarySignature")
  86 + @ApiOperation("补签(通过后台管理页面)")
  87 + public AjaxResult supplementarySignature(@ApiParam @RequestBody SignIn signIn) {
  88 + return signInService.supplementarySignature(signIn);
  89 + }
90 90  
91 91  
92 92 /**
... ...
ruoyi-admin/src/main/java/com/ruoyi/in/service/ISignInService.java
... ... @@ -68,4 +68,6 @@ public interface ISignInService
68 68 String repairSignRecord(HttpServletRequest request);
69 69  
70 70 String repairAllSignRecord(HttpServletRequest request,String date);
  71 +
  72 + AjaxResult supplementarySignature(SignIn signIn);
71 73 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
... ... @@ -19,12 +19,14 @@ import com.ruoyi.common.constant.Constants;
19 19 import com.ruoyi.common.core.domain.AjaxResult;
20 20 import com.ruoyi.common.core.redis.RedisCache;
21 21 import com.ruoyi.common.utils.DateUtils;
  22 +import com.ruoyi.common.utils.SecurityUtils;
22 23 import com.ruoyi.common.utils.StringUtils;
23 24 import com.ruoyi.common.utils.ip.IpUtils;
24 25 import com.ruoyi.common.utils.uuid.Seq;
25 26 import com.ruoyi.common.utils.uuid.UUID;
26 27 import com.ruoyi.driver.domain.Driver;
27 28 import com.ruoyi.driver.mapper.DriverMapper;
  29 +import com.ruoyi.driver.mapper.DriverSchedulingMapper;
28 30 import com.ruoyi.equipment.domain.Equipment;
29 31 import com.ruoyi.equipment.mapper.EquipmentMapper;
30 32 import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
... ... @@ -72,6 +74,9 @@ public class SignInServiceImpl implements ISignInService {
72 74 @Autowired
73 75 private IErrorJobcodeService errorJobcodeService;
74 76  
  77 + @Autowired
  78 + private DriverSchedulingMapper schedulingMapper;
  79 +
75 80 @Resource
76 81 private SchedulingCache schedulingCache;
77 82 @Autowired
... ... @@ -161,17 +166,7 @@ public class SignInServiceImpl implements ISignInService {
161 166 GlobalIndex globalIndex = new GlobalIndex();
162 167 long now = signIn.getCreateTime().getTime();
163 168 List<DriverScheduling> dto = schedulingService.queryScheduling(signIn.getJobCode(), now);
164   - // 签到检查
165   - if (checkSignIn(now, dto, globalIndex, signIn, driver)) {
166   - signIn.setStatus(SIGN_IN_SUCCESS);
167   - signIn.setExType(SIGN_NO_EX_NUM);
168   - signIn.setRemark("正常");
169   - } else {
170   - signIn.setStatus(SIGN_IN_FAIL);
171   - signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。"));
172   - }
173   - // base64转图片
174   - signIn.setIp(IpUtils.getIpAddr());
  169 + handleSignBody(signIn, driver, globalIndex, now, dto);
175 170  
176 171 uploadImage(signIn, vo);
177 172 signInMapper.insertSignIn(signIn);
... ... @@ -185,6 +180,20 @@ public class SignInServiceImpl implements ISignInService {
185 180 return handleAjaxResult(signIn, driver, vo);
186 181 }
187 182  
  183 + private void handleSignBody(SignIn signIn, Driver driver, GlobalIndex globalIndex, long now, List<DriverScheduling> dto) {
  184 + // 签到检查
  185 + if (checkSignIn(now, dto, globalIndex, signIn, driver)) {
  186 + signIn.setStatus(SIGN_IN_SUCCESS);
  187 + signIn.setExType(SIGN_NO_EX_NUM);
  188 + signIn.setRemark("正常");
  189 + } else {
  190 + signIn.setStatus(SIGN_IN_FAIL);
  191 + signIn.setRemark(signIn.getRemark().replaceFirst(",$", "。"));
  192 + }
  193 + // base64转图片
  194 + signIn.setIp(IpUtils.getIpAddr());
  195 + }
  196 +
188 197 private AjaxResult handleAjaxResult(SignIn signIn, Driver driver, SignInResponseVo vo) {
189 198 if (PERSONNEL_POSTS_DRIVER.equals(driver.getPosts()) && SIGN_IN_FAIL.equals(signIn.getStatus()) && signIn.getRemark().contains(ALCOHOL_SIGN_IN_ERROR)) {
190 199 AjaxResult result = getAjaxResultByDriverSignInfo(signIn, vo);
... ... @@ -250,6 +259,31 @@ public class SignInServiceImpl implements ISignInService {
250 259 return null;
251 260 }
252 261  
  262 + @Override
  263 + public AjaxResult supplementarySignature(SignIn signIn) {
  264 + signIn.setRemark("");
  265 + Driver driver = driverMapper.getDriverInfoByJobCode(signIn.getJobCode());
  266 + if (Objects.isNull(driver)) return AjaxResult.warn("这个工号的员工不存在!");
  267 + GlobalIndex globalIndex = new GlobalIndex();
  268 + long now = signIn.getCreateTime().getTime();
  269 + List<DriverScheduling> dto = schedulingService.queryScheduling(signIn.getJobCode(), now);
  270 + handleSignBody(signIn, driver, globalIndex, now, dto);
  271 + signIn.setUpdateBy(SecurityUtils.getUsername());
  272 +
  273 + signInMapper.insertSignIn(signIn);
  274 + // 更新考勤
  275 + if (CollectionUtil.isNotEmpty(dto)) {
  276 + schedulingMapper.updateRoster(dto.get(globalIndex.getIndex()), signIn.getId(), signIn.getExType(), signIn.getCreateTime(), signIn.getRemark(), signIn.getType(), signIn.getAlcoholFlag(), signIn.getAlcoholIntake());
  277 + // 更新缓存
  278 + nowSchedulingCache.updateCacheByJobCode(ConstDateUtil.formatDate(dto.get(0).getScheduleDate()), globalIndex.getIndex(), signIn);
  279 + }
  280 +
  281 + // 异常保存到异常异常中
  282 + threadJobService.asyncInsertExceptionRecord(signIn, driver, dto, globalIndex);
  283 +
  284 + return AjaxResult.success("补签成功");
  285 + }
  286 +
253 287 private String handleDate(String dateString) {
254 288 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
255 289 // 解析字符串日期为 LocalDate 对象
... ... @@ -490,19 +524,19 @@ public class SignInServiceImpl implements ISignInService {
490 524 // 给出签到范围
491 525 // 上一次无记|签到,type:签退 当前时间小于最近签到时间 -> 超时签退
492 526 if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getBcType().equals(BC_TYPE_IN)) {
493   - signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。");
  527 + signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。");
494 528 globalIndex.setIndex(lastClosestTimestamp.getIndex());
495 529 result = false;
496 530 }
497 531 // 上一次无记无|签到,type:签退 当前时间小于最近签到时间 -> 超时签退
498 532 else if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_OUT) && lastClosestTimestamp.getIndex().equals(currentScheduling.getIndex())) {
499   - signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。");
  533 + signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。");
500 534 globalIndex.setIndex(currentScheduling.getIndex());
501 535 result = false;
502 536 }
503 537 // 当前最近无记录|签到,type:签到|签退 -> 签到超时给上
504 538 else {
505   - signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。");
  539 + signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。");
506 540 globalIndex.setIndex(currentScheduling.getIndex());
507 541 result = false;
508 542 }
... ... @@ -512,20 +546,20 @@ public class SignInServiceImpl implements ISignInService {
512 546 DriverSignInRecommendation lastClosestTimestamp = schedulingService.computedTheCurrentClosestTimestamp(dto, now, -1);
513 547 // 上一次无记|签退,type:签到 当前时间小于最近签退时间 -> 签到异常
514 548 if (nowBetween < -60L && Objects.isNull(lastClosestTimestamp.getSignInId()) && signIn.getType().equals(SIGN_IN)) {
515   - signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。");
  549 + signIn.setRemark(SIGN_IN_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(lastClosestTimestamp.getTimestamps())) + "前后一小时内打卡。");
516 550 globalIndex.setIndex(lastClosestTimestamp.getIndex());
517 551 result = false;
518 552 }
519 553 // 当前无记|签退 , type:签退|签到 ——> 签退异常
520 554 else {
521   - signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。");
  555 + signIn.setRemark(SIGN_OUT_TIMEOUT + "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。");
522 556 globalIndex.setIndex(currentScheduling.getIndex());
523 557 result = false;
524 558 }
525 559 }
526 560 // 签退|签到 当前有记录
527 561 if (!Objects.isNull(currentScheduling.getSignInId())) {
528   - String prompt = "请在" + ConstDateUtil.formatDate("HH:mm",new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。";
  562 + String prompt = "请在" + ConstDateUtil.formatDate("HH:mm", new Date(currentScheduling.getTimestamps())) + "前后一小时内打卡。";
529 563 signIn.setRemark((currentScheduling.getBcType().equals(BC_TYPE_IN) ? SIGN_OUT_TIMEOUT : SIGN_IN_TIMEOUT) + prompt);
530 564 globalIndex.setIndex(currentScheduling.getIndex());
531 565 result = false;
... ...
ruoyi-admin/src/main/java/com/ruoyi/service/AppService.java
... ... @@ -5,6 +5,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
5 5 import com.ruoyi.common.utils.StringUtils;
6 6 import com.ruoyi.common.utils.file.FileUploadUtils;
7 7 import com.ruoyi.common.utils.file.FileUtils;
  8 +import com.ruoyi.driver.service.impl.DriverServiceImpl;
8 9 import com.ruoyi.equipment.domain.Equipment;
9 10 import com.ruoyi.equipment.mapper.EquipmentMapper;
10 11 import com.ruoyi.framework.config.ServerConfig;
... ... @@ -24,8 +25,6 @@ import java.nio.file.Paths;
24 25 import java.util.Date;
25 26 import java.util.Objects;
26 27  
27   -import static com.ruoyi.common.ConstEquipmentProperties.DEVICE_ONLINE;
28   -
29 28 /**
30 29 * 应用service
31 30 */
... ... @@ -43,15 +42,35 @@ public class AppService {
43 42 @Autowired
44 43 private VersionUpgradeMapper versionUpgradeMapper;
45 44  
46   - public ApplicationResponseVo checkVersionNum(Integer versionNum) {
  45 + public ApplicationResponseVo checkVersionNum(Integer versionNum, String deviceId) {
  46 + boolean result = DriverServiceImpl.doCheckDevice(deviceId);
  47 + if (result) {
  48 + return getApplicationResponseVoByDeviceId(versionNum);
  49 + } else {
  50 + return getApplicationResponseVo(versionNum);
  51 + }
  52 + }
  53 +
  54 + private ApplicationResponseVo getApplicationResponseVoByDeviceId(Integer versionNum) {
  55 + // 比对版本 需要更新 判断是否需要强制更新
  56 + VersionUpgrade vu = versionUpgradeMapper.queryLatestVersionNum(1);
  57 + // 无需更新
  58 + if (!Objects.isNull(vu) && vu.getVersionCode().equals(versionNum)) {
  59 + return ApplicationResponseVo.ApplicationResponseVoBuild().appNoUpdate(versionNum);
  60 + }
  61 + // 更新判断
  62 + return ApplicationResponseVo.ApplicationResponseVoBuild().appForceUpdate(vu.getVersionCode(), vu.getApkUrl());
  63 + }
  64 +
  65 + private ApplicationResponseVo getApplicationResponseVo(Integer versionNum) {
47 66 // 比对版本 需要更新 判断是否需要强制更新
48   - VersionUpgrade vu = versionUpgradeMapper.queryLatestVersionNum();
  67 + VersionUpgrade vu = versionUpgradeMapper.queryLatestVersionNum(2);
49 68 // 无需更新
50   - if (!Objects.isNull(vu) && vu.getVersionCode().equals(versionNum)){
  69 + if (!Objects.isNull(vu) && vu.getVersionCode().equals(versionNum)) {
51 70 return ApplicationResponseVo.ApplicationResponseVoBuild().appNoUpdate(versionNum);
52 71 }
53 72 // 更新判断
54   - return ApplicationResponseVo.ApplicationResponseVoBuild().appForceUpdate(vu.getVersionCode(),vu.getApkUrl());
  73 + return ApplicationResponseVo.ApplicationResponseVoBuild().appForceUpdate(vu.getVersionCode(), vu.getApkUrl());
55 74 }
56 75  
57 76 public void downloadApk(String url, HttpServletResponse response) throws IOException {
... ... @@ -86,7 +105,7 @@ public class AppService {
86 105  
87 106 private void checkFile(MultipartFile file) {
88 107  
89   - if (StringUtils.isEmpty(file.getOriginalFilename()) ){
  108 + if (StringUtils.isEmpty(file.getOriginalFilename())) {
90 109 throw new RuntimeException("不是apk文件请重新上传");
91 110 }
92 111 if (!file.getOriginalFilename().endsWith(".apk")) {
... ... @@ -101,4 +120,26 @@ public class AppService {
101 120 equipment.setRemark("版本号:" + vo.getVersionNum());
102 121 equipmentMapper.updateEquipmentByDeviceId(equipment);
103 122 }
  123 +
  124 + public AjaxResult uploadApkOther(MultipartFile file) throws IOException {
  125 + // 校验文件
  126 + checkFile(file);
  127 + // 上传文件路径
  128 + String filePath = RuoYiConfig.getUploadPath() + apkPath + "/other";
  129 + // 上传并返回新文件名称
  130 + String fileName = "app.apk";
  131 + // 获取相对路径
  132 + String absPath = FileUploadUtils.getAbsoluteFile(filePath, fileName).getAbsolutePath();
  133 + // 上传文件
  134 + file.transferTo(Paths.get(absPath));
  135 + fileName = FileUploadUtils.getPathFileName(filePath, fileName);
  136 + // 返回url
  137 + String url = serverConfig.getUrl() + fileName;
  138 + AjaxResult ajax = AjaxResult.success();
  139 + ajax.put("url", url);
  140 + ajax.put("fileName", fileName);
  141 + ajax.put("newFileName", FileUtils.getName(fileName));
  142 + ajax.put("originalFilename", file.getOriginalFilename());
  143 + return ajax;
  144 + }
104 145 }
... ...
ruoyi-admin/src/main/java/com/ruoyi/upgrade/mapper/VersionUpgradeMapper.java
... ... @@ -2,6 +2,7 @@ package com.ruoyi.upgrade.mapper;
2 2  
3 3 import java.util.List;
4 4 import com.ruoyi.upgrade.domain.VersionUpgrade;
  5 +import org.apache.ibatis.annotations.Param;
5 6  
6 7 /**
7 8 * upgradeMapper接口
... ... @@ -59,5 +60,10 @@ public interface VersionUpgradeMapper
59 60 */
60 61 public int deleteVersionUpgradeByIds(String[] ids);
61 62  
62   - VersionUpgrade queryLatestVersionNum();
  63 + /**
  64 + * 获取appurl
  65 + * @param appType
  66 + * @return
  67 + */
  68 + VersionUpgrade queryLatestVersionNum(@Param("appType") Integer appType);
63 69 }
... ...
ruoyi-admin/src/main/resources/mapper/upgrade/VersionUpgradeMapper.xml
... ... @@ -42,6 +42,7 @@ PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
42 42 </select>
43 43 <select id="queryLatestVersionNum" resultType="com.ruoyi.upgrade.domain.VersionUpgrade">
44 44 <include refid="selectVersionUpgradeVo"></include>
  45 + where app_id = #{appType}
45 46 order by version_code desc
46 47 limit 1
47 48 </select>
... ...