Ver código fonte

码包上传oss

tanzhongran 3 anos atrás
pai
commit
ea8f2d6adc

+ 8 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/constant/RedisKeysConstant.java

@@ -0,0 +1,8 @@
+package com.abi.qms.platform.constant;
+
+public class RedisKeysConstant {
+
+    //下载发送短信验证
+    public static final String DOWNLOAD_MOBILE_MSG = "qms.download.key:" ;
+
+}

+ 9 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrPackageController.java

@@ -70,6 +70,15 @@ public class QrPackageController {
         return BaseResponse.create();
     }
 
+    @GetMapping("/sendMsg")
+    @ApiOperation("发送短信")
+    public BaseResponse sendMobileMsg(@Validated SendMobileMsgReq req) {
+        //发送短信
+        qrPackageService.sendMobileMsg(req);
+        //包装出参
+        return BaseResponse.create();
+    }
+
     @ApiOperation("/下载码包")
     @GetMapping("/downloadQrPackage")
     public void downloadQrPackage(@Validated DownloadQrPackageReq downloadQrPackageReq, HttpServletResponse response) {

+ 3 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/entity/QrPackage.java

@@ -57,6 +57,9 @@ public class QrPackage implements Serializable {
 	@Schema(name = "下载路径")
 	private String downloadPath;
 
+	@Schema(name = "下载压缩文件密码")
+	private String zipPassword;
+
 	@Schema(name = "是否已下载")
     private Integer isDownload;
 

+ 3 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/DownloadQrPackageReq.java

@@ -21,4 +21,7 @@ public class DownloadQrPackageReq implements Serializable {
 	@ApiModelProperty(value = "id")
 	private Long id;
 
+	@ApiModelProperty(value = "验证码")
+	private String captcha;
+
 }

+ 22 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/SendMobileMsgReq.java

@@ -0,0 +1,22 @@
+package com.abi.qms.platform.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author:Andy.Tan
+ * @Description: 获取手机验证码入参
+ */
+@Data
+@ApiModel
+public class SendMobileMsgReq implements Serializable {
+
+  @NotNull(message = "id为空")
+  @ApiModelProperty(value = "id")
+  private Long id;
+
+}

+ 12 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/feign/BaseServiceFallback.java

@@ -0,0 +1,12 @@
+package com.abi.qms.platform.feign;
+
+import org.springframework.web.multipart.MultipartFile;
+
+public class BaseServiceFallback implements BasicServiceClient{
+
+    @Override
+    public Object uploadFileOss(MultipartFile uploadFile) {
+        return null;
+    }
+
+}

+ 18 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/feign/BasicServiceClient.java

@@ -0,0 +1,18 @@
+package com.abi.qms.platform.feign;
+
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+@FeignClient(name="basic-service", url="${basic-service.url}",
+        fallbackFactory = BaseServiceFallback.class)
+public interface BasicServiceClient {
+
+    @PostMapping(value = "file-upload-oss",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    Object uploadFileOss(@RequestPart("uploadFile") MultipartFile uploadFile);
+
+}
+

+ 69 - 13
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/mq/GenerateCodeConsumer.java

@@ -15,9 +15,12 @@ import com.abi.qms.platform.dao.tablestore.entity.QrCode;
 import com.abi.qms.platform.dao.vo.result.QrPackageVO;
 import com.abi.qms.platform.dao.vo.result.QrRepertoryColumnVO;
 import com.abi.qms.platform.dao.vo.result.QrRepertoryVO;
+import com.abi.qms.platform.feign.BasicServiceClient;
 import com.abi.qms.platform.infrastructure.qr.build.parent.SerialBuildCode;
 import com.abi.qms.platform.infrastructure.util.BuildCodeUtil;
+import com.abi.qms.platform.infrastructure.util.RandomCodeUtils;
 import com.abi.qms.platform.service.QrPackageService;
+import com.abi.task.common.api.exception.BusinessException;
 import com.abi.task.common.tablestore.TableStorePlusUtils;
 import com.abi.task.common.tablestore.common.TableStoreEntity;
 import com.abi.task.common.tablestore.entity.DemoEntity;
@@ -30,6 +33,9 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.rabbitmq.client.Channel;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -44,9 +50,13 @@ import net.lingala.zip4j.core.ZipFile;
 import net.lingala.zip4j.exception.ZipException;
 import net.lingala.zip4j.model.ZipParameters;
 import net.lingala.zip4j.util.Zip4jConstants;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -74,9 +84,6 @@ public class GenerateCodeConsumer {
 	@Autowired
 	private QrRepertorySerialNumberMapper qrRepertorySerialNumberMapper;
 
-//	@Autowired
-//	private QrDataService qrDataService;
-
 	@Autowired
 	private QrPackageService qrPackageService;
 
@@ -89,6 +96,9 @@ public class GenerateCodeConsumer {
 	@Autowired
     private QrPackageBatchMapper qrPackageBatchMapper;
 
+	@Autowired
+	private BasicServiceClient basicServiceClient;
+
 	//生成码数据
 	final List<QrData> qrDataList = new LinkedList<>();
 
@@ -130,6 +140,9 @@ public class GenerateCodeConsumer {
 	 * 生成码
 	 */
 	private void loopGenerateCode(QrPackage qrPackage) {
+		//刷新码包信息
+		qrPackage = qrPackageMapper.selectById(qrPackage.getId());
+
 		// 查询码包关联的幅面关联的码库的信息
 		QrPackageVO qrPackageVo = qrPackageMapper.selectQrPackageDetailById(qrPackage.getId());
 
@@ -139,8 +152,8 @@ public class GenerateCodeConsumer {
 		}
 
 		// 更改生成状态为生成中
-		QrPackage qrPackageUpdate = new QrPackage().setId(qrPackageVo.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATING.getCode());
-		qrPackageMapper.updateById(qrPackageUpdate);
+		qrPackage.setGenerateStatus(QrPackageGenerateStatusEnum.GENERATING.getCode());
+		qrPackageMapper.updateById(qrPackage);
 
 		// 码库 & 码库的列
 		QrRepertoryVO qrRepertory = qrRepertoryMapper.selectQrRepertoryDetailById(qrPackageVo.getQrRepertoryId());
@@ -164,6 +177,7 @@ public class GenerateCodeConsumer {
 		param.eq("package_id", qrPackageVo.getId());
 		List<QrPackageBatch> qrPackageBatches = qrPackageBatchMapper.selectList(param);
 
+		//1-生成二维码
 		for (QrPackageBatch qrPackageBatch:qrPackageBatches) {
 			// 这批下的申请数量
 			Long qrNumber = qrPackageBatch.getBatchQrNumber();
@@ -191,20 +205,62 @@ public class GenerateCodeConsumer {
 			createCodeFile(qrRepertory,batchNumber);
 
 		}
-		// 更改生成状态为已生成
-		qrPackageUpdate = new QrPackage().setId(qrPackageVo.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_SUCCESS.getCode());
-		qrPackageMapper.updateById(qrPackageUpdate);
+
+		//2-保存压缩文件并上传oss
 		//压缩后得名字
 		String zipName = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now())+".zip";
-//		压缩密码
-		String pas = String.valueOf((int) (Math.random()*9+1)*100000);
+		//压缩密码
+		String pas = RandomCodeUtils.getStr(6);
 		log.info("生成密码:"+pas);
 		//压缩加密文件
 		zipEncryption(file,files,pas,zipName);
-		// TODO:上传阿里云,并更新码包的下载路径 保存zip密码
+		//上传阿里云,并更新码包的下载路径 保存zip密码
+		try{
+			MultipartFile multipartFile = toMultipartFile(file.getCanonicalPath(), file.getName());
+			Object result = basicServiceClient.uploadFileOss(multipartFile);
+			String ossUrl = JSONObject.parseObject(JSONObject.toJSONString(result)).getString("data");
+			//放入oss地址和密码
+			qrPackage.setDownloadPath(ossUrl);
+			qrPackage.setZipPassword(pas);
+			//删除生成文件
+			FileUtil.del(file);
+		}catch (Exception e){
+			throw new BusinessException("上传OSS失败");
+		}
+
+		//3-更改生成状态为已生成
+		qrPackage.setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_SUCCESS.getCode());
+		qrPackageMapper.updateById(qrPackage);
+	}
+
+	/**
+	 * 转换成 MultipartFile
+	 * @param filePath
+	 * @param fileName
+	 * @return
+	 */
+	private MultipartFile toMultipartFile(String filePath, String fileName){
+
+		File file = new File(filePath);
+
+		FileItemFactory factory = new DiskFileItemFactory(16, null);
+		FileItem fileItem = factory.createItem(fileName, "text/plain", true, file.getName());
+		int bytesRead = 0;
+		byte[] buffer = new byte[8192];
+		try {
+			FileInputStream fis = new FileInputStream(file);
+			OutputStream os = fileItem.getOutputStream();
+			while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
+				os.write(buffer, 0, bytesRead);
+			}
+			os.close();
+			fis.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
 
-		//删除生成文件
-		FileUtil.del(file);
+		MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
+		return multipartFile;
 	}
 
 	/**

+ 44 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/util/RandomCodeUtils.java

@@ -0,0 +1,44 @@
+package com.abi.qms.platform.infrastructure.util;
+
+import java.util.Random;
+
+/**
+ * 随机码工具类
+ * @author AndyTan
+ */
+public class RandomCodeUtils {
+
+    /**
+     * 返回长度为n的随机字符串(随机包含数字or小写字母)
+     * @param n
+     * @return
+     */
+    public static String getStr(int n) {
+        String string = "0123456789abcdefghijklmnopqrstuvwxyz";//保存数字0-9 和 大小写字母
+        char[] ch = new char[n]; //声明一个字符数组对象ch 保存 验证码
+        for (int i = 0; i < n; i++) {
+            Random random = new Random();//创建一个新的随机数生成器
+            int index = random.nextInt(string.length());//返回[0,string.length)范围的int值    作用:保存下标
+            ch[i] = string.charAt(index);//charAt() : 返回指定索引处的 char 值   ==》保存到字符数组对象ch里面
+        }
+        //将char数组类型转换为String类型保存到result
+        String result = String.valueOf(ch);
+        return result;
+    }
+
+    /**
+     * 返回长度为n的验证码 内容纯数字
+     * @return
+     */
+    public static String getCaptcha(int n) {
+        StringBuilder result = new StringBuilder();
+        char[] ch = new char[n];
+        for (int i = 0; i < n; i++) {
+            Integer e = new Random().nextInt(10);
+            result.append(e.toString());
+        }
+
+        return result.toString();
+    }
+
+}

+ 9 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrPackageService.java

@@ -81,4 +81,13 @@ public interface QrPackageService {
 	 * @return
 	 */
 	ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterial(ValidSAPOrderNoAndMaterialReq req);
+
+	/**
+	 * 发送短信验证码
+	 * @param req
+	 */
+	void sendMobileMsg(SendMobileMsgReq req);
+
+
+
 }

+ 90 - 16
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrPackageServiceImpl.java

@@ -3,12 +3,16 @@ package com.abi.qms.platform.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
+import com.abi.base.foundation.util.RedisClient;
+import com.abi.qms.platform.constant.RedisKeysConstant;
+import com.abi.qms.platform.dao.entity.BaseFactory;
 import com.abi.qms.platform.dao.entity.QrPackage;
 import com.abi.qms.platform.dao.entity.QrPackageBatch;
 import com.abi.qms.platform.dao.entity.QrPackageDownloadRecord;
 import com.abi.qms.platform.dao.enums.QrPackageApplyStatusEnum;
 import com.abi.qms.platform.dao.enums.QrPackageGenerateStatusEnum;
 import com.abi.qms.platform.dao.enums.QrRepertoryTypeEnum;
+import com.abi.qms.platform.dao.mapper.BaseFactoryMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageBatchMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageDownloadRecordMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageMapper;
@@ -18,24 +22,19 @@ import com.abi.qms.platform.dto.res.GetQrPackageDetailRes;
 import com.abi.qms.platform.dto.res.ListQrPackageRes;
 import com.abi.qms.platform.dto.res.ValidSAPOrderNoAndMaterialRes;
 import com.abi.qms.platform.infrastructure.mq.GenerateCodeConsumer;
-import com.abi.qms.platform.infrastructure.util.AssertUtil;
-import com.abi.qms.platform.infrastructure.util.PageUtil;
-import com.abi.qms.platform.infrastructure.util.UserUtil;
 import com.abi.qms.platform.infrastructure.util.*;
-import com.abi.qms.platform.service.QrDataService;
 import com.abi.qms.platform.service.QrPackageService;
 import com.abi.task.common.api.exception.BusinessException;
 import com.abi.task.common.api.exception.ErrorCodeEnum;
-import com.abi.task.common.utils.ICollectionUtil;
 import com.abi.task.common.utils.PojoConverterUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.sun.xml.internal.bind.v2.TODO;
 import freemarker.template.Template;
 import lombok.extern.slf4j.Slf4j;
-import org.redisson.misc.Hash;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.amqp.core.AmqpTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -45,12 +44,10 @@ import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Objects;
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-import java.util.Map;
 
 /**
  * 码包 Service业务层处理
@@ -66,10 +63,7 @@ public class QrPackageServiceImpl implements QrPackageService {
 	private QrPackageMapper qrPackageMapper;
 
 	@Autowired
-	private AmqpTemplate amqpTemplate;
-
-//	@Autowired
-//	private QrDataService qrDataService;
+	private BaseFactoryMapper baseFactoryMapper;
 
 	@Autowired
 	private QrPackageDownloadRecordMapper qrPackageDownloadRecordMapper;
@@ -77,9 +71,18 @@ public class QrPackageServiceImpl implements QrPackageService {
 	@Autowired
 	private QrPackageBatchMapper qrPackageBatchMapper;
 
+	@Autowired
+	private AmqpTemplate amqpTemplate;
+
 	@Autowired
 	private SendmailUtil sendmailUtil;
 
+	@Autowired
+	private SmsUtil smsUtil;
+
+	@Autowired
+	private RedisClient redisClient;
+
 	/**
 	 * 保存码包
 	 */
@@ -321,8 +324,15 @@ public class QrPackageServiceImpl implements QrPackageService {
 
 	@Override
 	public void downloadQrPackage(DownloadQrPackageReq req, HttpServletResponse response) {
+		//查询码包
 		QrPackage qrPackage = qrPackageMapper.selectById(req.getId());
 		AssertUtil.isNull(qrPackage, "码包不存在");
+		//查询包材厂
+		BaseFactory factory = baseFactoryMapper.selectById(qrPackage.getFactoryCoverId());
+		AssertUtil.isNull(factory, "包材厂不存在");
+		if(StringUtils.isBlank(factory.getKeymanMobile())){
+			throw new BusinessException("包材厂手机号不存在");
+		}
 
 		// 只有已生成状态下才可下载
 		Integer generateStatus = qrPackage.getGenerateStatus();
@@ -330,6 +340,13 @@ public class QrPackageServiceImpl implements QrPackageService {
 			throw new BusinessException("码包不可下载");
 		}
 
+		//特殊:校验验证码是否正确,正确才可以下载
+		boolean verifyCaptchaResult = verifyCaptcha(factory.getKeymanMobile(), req.getCaptcha(), qrPackage.getId());
+		if(!verifyCaptchaResult){
+			throw new BusinessException("验证码错误");
+		}
+
+		//开始下载
 		BufferedInputStream in = null;
 		BufferedOutputStream out = null;
 		try {
@@ -433,4 +450,61 @@ public class QrPackageServiceImpl implements QrPackageService {
 		}
 	}
 
+	/**
+	 * 发送短信验证码
+	 *
+	 * @param req
+	 */
+	@Override
+	public void sendMobileMsg(SendMobileMsgReq req) {
+		//查询码包
+		QrPackage qrPackage = qrPackageMapper.selectById(req.getId());
+		AssertUtil.isNull(qrPackage, "码包不存在");
+		//查询包材厂
+		BaseFactory factory = baseFactoryMapper.selectById(qrPackage.getFactoryCoverId());
+		AssertUtil.isNull(factory, "包材厂不存在");
+		if(StringUtils.isBlank(factory.getKeymanMobile())){
+			throw new BusinessException("包材厂手机号不存在");
+		}
+
+		//key:packId:mobile
+		Long packId = qrPackage.getId();
+		String mobile = factory.getKeymanMobile();
+		String key = MessageFormat.format("{0}{1}:{2}",RedisKeysConstant.DOWNLOAD_MOBILE_MSG, packId, mobile);
+
+		//获取随机验证码
+		String captcha = RandomCodeUtils.getCaptcha(6);
+
+		//发送短信
+		smsUtil.sendCode(mobile, captcha);
+
+		//将验证码存入redis
+		redisClient.getRedisTemplate().opsForValue().set(key, captcha, 30 * 60, TimeUnit.SECONDS);
+	}
+
+	/**
+	 * 校验校验码
+	 * @param mobile
+	 * @param inputCaptcha
+	 * @param packId
+	 * @return
+	 */
+	private boolean verifyCaptcha(String mobile, String inputCaptcha, Long packId) {
+		String key = MessageFormat.format("{0}{1}:{2}",RedisKeysConstant.DOWNLOAD_MOBILE_MSG, packId, mobile);
+		log.info("验证下载key:{}", key);
+		String captcha = redisClient.get(key);
+		log.info(inputCaptcha + "--------------------" + captcha);
+
+		//不一致返回false
+		if (!inputCaptcha.equals(captcha)) {
+			return false;
+		}
+
+		//删除校验码
+		redisClient.delete(key);
+
+		return true;
+	}
+
+
 }