Commit bde82a60213d4787537628fff5902ce1beac69b8
1 parent
9c7fbffa
fix: 新增异步上传
Showing
9 changed files
with
206 additions
and
35 deletions
ruoyi-admin/src/main/java/com/ruoyi/driver/controller/DriverController.java
| ... | ... | @@ -125,4 +125,17 @@ public class DriverController extends BaseController { |
| 125 | 125 | public AjaxResult remove(@ApiParam @PathVariable Long[] ids) { |
| 126 | 126 | return toAjax(driverService.deleteDriverByIds(ids)); |
| 127 | 127 | } |
| 128 | + | |
| 129 | + /** | |
| 130 | + * 校验工号 | |
| 131 | + * @param jobCode | |
| 132 | + * @return | |
| 133 | + */ | |
| 134 | + @GetMapping("/check/{jobCode}") | |
| 135 | + @ApiOperation("校验jobCode是否存入当前系统") | |
| 136 | + public AjaxResult checkJobCode(@PathVariable("jobCode") String jobCode){ | |
| 137 | + return driverService.checkJobCode(jobCode); | |
| 138 | + } | |
| 139 | + | |
| 140 | +// @ApiOperation("保存员工大头像") | |
| 128 | 141 | } | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/driver/mapper/DriverMapper.java
| ... | ... | @@ -85,4 +85,11 @@ public interface DriverMapper |
| 85 | 85 | * @return |
| 86 | 86 | */ |
| 87 | 87 | List<Driver> getNameByJobCode(@Param("jobCodes") Set<String> jobCodes); |
| 88 | + | |
| 89 | + /** | |
| 90 | + * 是否存在对应工号在数据库中 | |
| 91 | + * @param jobCode | |
| 92 | + * @return | |
| 93 | + */ | |
| 94 | + Integer jobCodeIsEmpty(@Param("jobCode") String jobCode); | |
| 88 | 95 | } | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/driver/service/IDriverService.java
ruoyi-admin/src/main/java/com/ruoyi/driver/service/impl/DriverServiceImpl.java
| ... | ... | @@ -109,7 +109,7 @@ public class DriverServiceImpl implements IDriverService { |
| 109 | 109 | @Override |
| 110 | 110 | public AjaxResult getDriverSchedulingInfo(String schedulingDate, String jobCode) { |
| 111 | 111 | String key = DRIVER_SCHEDULING_PRE + schedulingDate; |
| 112 | - List<ResponseScheduling> cacheMapValue = redisCache.getCacheMapValue(key , jobCode); | |
| 112 | + List<ResponseScheduling> cacheMapValue = redisCache.getCacheMapValue(key, jobCode); | |
| 113 | 113 | // 优先从缓存中读取 |
| 114 | 114 | if (cacheMapValue != null && cacheMapValue.size() > 0) { |
| 115 | 115 | return AjaxResult.success(cacheMapValue); |
| ... | ... | @@ -131,4 +131,16 @@ public class DriverServiceImpl implements IDriverService { |
| 131 | 131 | public AjaxResult getDriverSchedulingAll() { |
| 132 | 132 | return AjaxResult.success(redisCache.getHashKeys(DRIVER_SCHEDULING_PRE + ConstDateUtil.formatDate("yyyyMMdd"))); |
| 133 | 133 | } |
| 134 | + | |
| 135 | + @Override | |
| 136 | + public AjaxResult checkJobCode(String jobCode) { | |
| 137 | + Integer result = driverMapper.jobCodeIsEmpty(jobCode); | |
| 138 | + Map<String, Boolean> resultMap = new HashMap<>(); | |
| 139 | + if (result > 0) { | |
| 140 | + resultMap.put("result", true); | |
| 141 | + } else { | |
| 142 | + resultMap.put("result", false); | |
| 143 | + } | |
| 144 | + return AjaxResult.success(resultMap); | |
| 145 | + } | |
| 134 | 146 | } | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/in/domain/SignIn.java
| ... | ... | @@ -30,6 +30,18 @@ public class SignIn extends BaseEntity |
| 30 | 30 | @ApiModelProperty("工号") |
| 31 | 31 | private String jobCode; |
| 32 | 32 | |
| 33 | + @Excel(name = "设备号") | |
| 34 | + @ApiModelProperty("设备号") | |
| 35 | + private String deviceId; | |
| 36 | + | |
| 37 | + public String getDeviceId() { | |
| 38 | + return deviceId; | |
| 39 | + } | |
| 40 | + | |
| 41 | + public void setDeviceId(String deviceId) { | |
| 42 | + this.deviceId = deviceId; | |
| 43 | + } | |
| 44 | + | |
| 33 | 45 | /** 设备地址 */ |
| 34 | 46 | @Excel(name = "设备地址") |
| 35 | 47 | @ApiModelProperty("设备ip 不用填写") | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/in/service/impl/SignInServiceImpl.java
| ... | ... | @@ -17,6 +17,7 @@ import com.ruoyi.common.utils.StringUtils; |
| 17 | 17 | import com.ruoyi.common.utils.ip.IpUtils; |
| 18 | 18 | import com.ruoyi.common.utils.uuid.Seq; |
| 19 | 19 | import com.ruoyi.common.utils.uuid.UUID; |
| 20 | +import com.ruoyi.service.ThreadJobService; | |
| 20 | 21 | import org.apache.commons.io.FilenameUtils; |
| 21 | 22 | import org.springframework.beans.factory.annotation.Autowired; |
| 22 | 23 | import org.springframework.stereotype.Service; |
| ... | ... | @@ -25,6 +26,8 @@ import com.ruoyi.in.domain.SignIn; |
| 25 | 26 | import com.ruoyi.in.service.ISignInService; |
| 26 | 27 | import sun.misc.BASE64Decoder; |
| 27 | 28 | |
| 29 | +import javax.annotation.Resource; | |
| 30 | + | |
| 28 | 31 | /** |
| 29 | 32 | * 签到Service业务层处理 |
| 30 | 33 | * |
| ... | ... | @@ -36,6 +39,9 @@ public class SignInServiceImpl implements ISignInService { |
| 36 | 39 | @Autowired |
| 37 | 40 | private SignInMapper signInMapper; |
| 38 | 41 | |
| 42 | + @Resource | |
| 43 | + private ThreadJobService threadJobConfig; | |
| 44 | + | |
| 39 | 45 | /** |
| 40 | 46 | * 查询签到 |
| 41 | 47 | * |
| ... | ... | @@ -123,12 +129,12 @@ public class SignInServiceImpl implements ISignInService { |
| 123 | 129 | fileName = extractFilename(fileName); |
| 124 | 130 | // 获取相对路径 |
| 125 | 131 | String absPath = getAbsoluteFile(filePath, fileName).getAbsolutePath(); |
| 126 | - // 上传文件 | |
| 127 | - startUpload(absPath, base64); | |
| 132 | + | |
| 128 | 133 | // 获取文件上传路径 |
| 129 | 134 | String pathFileName = getPathFileName(filePath, fileName); |
| 130 | 135 | signIn.setImage(pathFileName); |
| 131 | - | |
| 136 | + // 异步上传文件 | |
| 137 | + threadJobConfig.startUpload(absPath,base64); | |
| 132 | 138 | return signInMapper.insertSignIn(signIn); |
| 133 | 139 | } |
| 134 | 140 | |
| ... | ... | @@ -174,35 +180,6 @@ public class SignInServiceImpl implements ISignInService { |
| 174 | 180 | return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; |
| 175 | 181 | } |
| 176 | 182 | |
| 177 | - public void startUpload(String url, String base64) throws FileUploadException, IOException { | |
| 178 | - FileOutputStream outputStream = null; | |
| 179 | - base64 = base64.replaceAll(" ", ""); | |
| 180 | -// byte[] imageBytes = Base64.getDecoder().decode(base64); | |
| 181 | - BASE64Decoder decoder = new BASE64Decoder(); | |
| 182 | - byte[] photoBase64 = decoder.decodeBuffer(base64); | |
| 183 | - for (int i = 0; i < photoBase64.length; ++i) { | |
| 184 | - //调整异常数据 | |
| 185 | - if (photoBase64[i] < 0) { | |
| 186 | - photoBase64[i] += 256; | |
| 187 | - } | |
| 188 | - } | |
| 189 | - try { | |
| 190 | - outputStream = new FileOutputStream(url); | |
| 191 | - outputStream.write(photoBase64); | |
| 192 | - outputStream.flush(); | |
| 193 | - } catch (Exception e) { | |
| 194 | - throw new FileUploadException("文件上传异常"); | |
| 195 | - } finally { | |
| 196 | - try { | |
| 197 | - if (!Objects.isNull(outputStream)) { | |
| 198 | - outputStream.close(); | |
| 199 | - } | |
| 200 | - } catch (IOException e) { | |
| 201 | - throw new RuntimeException(e); | |
| 202 | - } | |
| 203 | - } | |
| 204 | - } | |
| 205 | - | |
| 206 | 183 | /** |
| 207 | 184 | * 检查文件类型 |
| 208 | 185 | * | ... | ... |
ruoyi-admin/src/main/java/com/ruoyi/service/ThreadJobService.java
0 → 100644
| 1 | +package com.ruoyi.service; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.ruoyi.common.config.RuoYiConfig; | |
| 5 | +import com.ruoyi.common.constant.Constants; | |
| 6 | +import com.ruoyi.common.exception.file.FileUploadException; | |
| 7 | +import com.ruoyi.common.utils.DateUtils; | |
| 8 | +import com.ruoyi.common.utils.StringUtils; | |
| 9 | +import com.ruoyi.common.utils.uuid.Seq; | |
| 10 | +import com.ruoyi.common.utils.uuid.UUID; | |
| 11 | +import com.ruoyi.in.mapper.SignInMapper; | |
| 12 | +import lombok.extern.slf4j.Slf4j; | |
| 13 | +import org.apache.commons.io.FilenameUtils; | |
| 14 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 15 | +import org.springframework.scheduling.annotation.Async; | |
| 16 | +import org.springframework.scheduling.annotation.EnableAsync; | |
| 17 | +import org.springframework.stereotype.Component; | |
| 18 | +import sun.misc.BASE64Decoder; | |
| 19 | + | |
| 20 | +import java.io.File; | |
| 21 | +import java.io.FileOutputStream; | |
| 22 | +import java.io.IOException; | |
| 23 | +import java.util.Base64; | |
| 24 | +import java.util.Objects; | |
| 25 | + | |
| 26 | + | |
| 27 | +/** | |
| 28 | + * 多线程任务 | |
| 29 | + * | |
| 30 | + * @author 20412 | |
| 31 | + */ | |
| 32 | +@EnableAsync | |
| 33 | +@Component | |
| 34 | +@Slf4j | |
| 35 | +public class ThreadJobService { | |
| 36 | + | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * 异步上传图片 | |
| 40 | + * | |
| 41 | + * @param url | |
| 42 | + * @param base64 | |
| 43 | + * @throws FileUploadException | |
| 44 | + * @throws IOException | |
| 45 | + */ | |
| 46 | + @Async | |
| 47 | + public void startUpload(String url, String base64) { | |
| 48 | + FileOutputStream outputStream = null; | |
| 49 | + base64 = base64.replaceAll(" ", ""); | |
| 50 | +// byte[] imageBytes = Base64.getDecoder().decode(base64); | |
| 51 | + BASE64Decoder decoder = new BASE64Decoder(); | |
| 52 | + try { | |
| 53 | + byte[] photoBase64 = decoder.decodeBuffer(base64); | |
| 54 | + for (int i = 0; i < photoBase64.length; ++i) { | |
| 55 | + //调整异常数据 | |
| 56 | + if (photoBase64[i] < 0) { | |
| 57 | + photoBase64[i] += 256; | |
| 58 | + } | |
| 59 | + } | |
| 60 | + outputStream = new FileOutputStream(url); | |
| 61 | + outputStream.write(photoBase64); | |
| 62 | + outputStream.flush(); | |
| 63 | + } catch (Exception e) { | |
| 64 | + log.error("文件上传异常:{}", e.getMessage()); | |
| 65 | + } finally { | |
| 66 | + try { | |
| 67 | + if (!Objects.isNull(outputStream)) { | |
| 68 | + outputStream.close(); | |
| 69 | + } | |
| 70 | + } catch (IOException e) { | |
| 71 | + throw new RuntimeException(e); | |
| 72 | + } | |
| 73 | + } | |
| 74 | + } | |
| 75 | + | |
| 76 | + /** | |
| 77 | + * 检查文件类型 | |
| 78 | + * | |
| 79 | + * @param base64ImgData | |
| 80 | + * @return | |
| 81 | + */ | |
| 82 | + public static String checkImageBase64Format(String base64ImgData) { | |
| 83 | + byte[] b = Base64.getDecoder().decode(base64ImgData); | |
| 84 | + String type = ""; | |
| 85 | + if (0x424D == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) { | |
| 86 | + type = "bmp"; | |
| 87 | + } else if (0x8950 == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) { | |
| 88 | + type = "png"; | |
| 89 | + } else { | |
| 90 | + type = "jpg"; | |
| 91 | + } | |
| 92 | +// else if (0xFFD8 == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) { | |
| 93 | +// type = "jpg"; | |
| 94 | +// } | |
| 95 | + return type; | |
| 96 | + } | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * 获取相对路径名 | |
| 100 | + * | |
| 101 | + * @param uploadDir | |
| 102 | + * @param fileName | |
| 103 | + * @return | |
| 104 | + * @throws IOException | |
| 105 | + */ | |
| 106 | + public File getAbsoluteFile(String uploadDir, String fileName) throws IOException { | |
| 107 | + File desc = new File(uploadDir + File.separator + fileName); | |
| 108 | + | |
| 109 | + if (!desc.exists()) { | |
| 110 | + if (!desc.getParentFile().exists()) { | |
| 111 | + desc.getParentFile().mkdirs(); | |
| 112 | + } | |
| 113 | + } | |
| 114 | + return desc; | |
| 115 | + } | |
| 116 | + | |
| 117 | + /** | |
| 118 | + * 获取扩展文件名 | |
| 119 | + * | |
| 120 | + * @param extendFileName | |
| 121 | + * @return | |
| 122 | + */ | |
| 123 | + public String extractFilename(String extendFileName) { | |
| 124 | + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), | |
| 125 | + FilenameUtils.getBaseName(UUID.randomUUID().toString().replace("-", "")), Seq.getId(Seq.uploadSeqType), extendFileName); | |
| 126 | + } | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * @param uploadDir | |
| 130 | + * @param fileName | |
| 131 | + * @return | |
| 132 | + * @throws IOException | |
| 133 | + */ | |
| 134 | + public String getPathFileName(String uploadDir, String fileName) throws IOException { | |
| 135 | + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; | |
| 136 | + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); | |
| 137 | + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; | |
| 138 | + } | |
| 139 | + | |
| 140 | +} | ... | ... |
ruoyi-admin/src/main/resources/mapper/driver/DriverMapper.xml
| ... | ... | @@ -99,6 +99,11 @@ |
| 99 | 99 | |
| 100 | 100 | </where> |
| 101 | 101 | </select> |
| 102 | + <select id="jobCodeIsEmpty" resultType="java.lang.Integer"> | |
| 103 | + select count(*) | |
| 104 | + from driver | |
| 105 | + where job_code = #{jobCode} | |
| 106 | + </select> | |
| 102 | 107 | |
| 103 | 108 | <insert id="insertDriver" parameterType="Driver" useGeneratedKeys="true" keyProperty="id"> |
| 104 | 109 | insert into driver | ... | ... |
ruoyi-admin/src/main/resources/mapper/in/SignInMapper.xml
| ... | ... | @@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| 8 | 8 | <result property="id" column="id" /> |
| 9 | 9 | <result property="createTime" column="create_time" /> |
| 10 | 10 | <result property="jobCode" column="jobCode" /> |
| 11 | + <result property="deviceId" column="device_id" /> | |
| 11 | 12 | <result property="ip" column="ip" /> |
| 12 | 13 | <result property="image" column="image" /> |
| 13 | 14 | <result property="status" column="status" /> |
| ... | ... | @@ -21,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| 21 | 22 | </resultMap> |
| 22 | 23 | |
| 23 | 24 | <sql id="selectSignInVo"> |
| 24 | - select id, create_time, jobCode, ip,image, status, update_by, singn_in, alcohol_flag, type, update_time, alcohol_intake, remark from sign_in | |
| 25 | + select id, create_time, jobCode, device_id,ip,image, status, update_by, singn_in, alcohol_flag, type, update_time, alcohol_intake, remark from sign_in | |
| 25 | 26 | </sql> |
| 26 | 27 | |
| 27 | 28 | <select id="selectSignInList" parameterType="SignIn" resultMap="SignInResult"> |
| ... | ... | @@ -92,12 +93,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| 92 | 93 | <if test="createTime != null">create_time,</if> |
| 93 | 94 | <if test="jobCode != null">jobCode,</if> |
| 94 | 95 | <if test="ip != null">ip,</if> |
| 96 | + <if test="deviceId != null">device_id,</if> | |
| 95 | 97 | <if test="image != null">image,</if> |
| 96 | 98 | <if test="status != null">status,</if> |
| 97 | 99 | <if test="updateBy != null">update_by,</if> |
| 98 | 100 | <if test="singnIn != null">singn_in,</if> |
| 99 | 101 | <if test="alcoholFlag != null">alcohol_flag,</if> |
| 100 | - <if test="type != null">type,</if> | |
| 102 | + <if test="type != null">`type`,</if> | |
| 101 | 103 | <if test="updateTime != null">update_time,</if> |
| 102 | 104 | <if test="alcoholIntake != null">alcohol_intake,</if> |
| 103 | 105 | <if test="remark != null">remark,</if> |
| ... | ... | @@ -106,6 +108,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| 106 | 108 | <if test="createTime != null">#{createTime},</if> |
| 107 | 109 | <if test="jobCode != null">#{jobCode},</if> |
| 108 | 110 | <if test="ip != null">#{ip},</if> |
| 111 | + <if test="deviceId != null">#{deviceId},</if> | |
| 109 | 112 | <if test="image != null">#{image},</if> |
| 110 | 113 | <if test="status != null">#{status},</if> |
| 111 | 114 | <if test="updateBy != null">#{updateBy},</if> |
| ... | ... | @@ -124,6 +127,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| 124 | 127 | <if test="createTime != null">create_time = #{createTime},</if> |
| 125 | 128 | <if test="jobCode != null">jobCode = #{jobCode},</if> |
| 126 | 129 | <if test="ip != null">ip = #{ip},</if> |
| 130 | + <if test="deviceId != null">device_id = #{deviceId},</if> | |
| 127 | 131 | <if test="image != null">image = #{image},</if> |
| 128 | 132 | <if test="status != null">status = #{status},</if> |
| 129 | 133 | <if test="updateBy != null">update_by = #{updateBy},</if> | ... | ... |