瀏覽代碼

fix: update

fangxinjian 4 年之前
父節點
當前提交
75ec5a8726

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

@@ -17,12 +17,26 @@ import com.abi.qms.platform.dao.mapper.QrPackageBatchMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageDownloadRecordMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageMapper;
 import com.abi.qms.platform.dao.vo.result.QrPackageVO;
-import com.abi.qms.platform.dto.req.*;
+import com.abi.qms.platform.dto.req.DeleteQrPackageReq;
+import com.abi.qms.platform.dto.req.DownloadQrPackageReq;
+import com.abi.qms.platform.dto.req.GetQrPackageDetailReq;
+import com.abi.qms.platform.dto.req.ListQrPackageReq;
+import com.abi.qms.platform.dto.req.PassQrPackageReq;
+import com.abi.qms.platform.dto.req.RefuseQrPackageReq;
+import com.abi.qms.platform.dto.req.SaveQrPackageReq;
+import com.abi.qms.platform.dto.req.SendMobileMsgReq;
+import com.abi.qms.platform.dto.req.ValidSAPOrderNoAndMaterialReq;
 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.*;
+import com.abi.qms.platform.infrastructure.util.AssertUtil;
+import com.abi.qms.platform.infrastructure.util.FreeMarkerUtils;
+import com.abi.qms.platform.infrastructure.util.PageUtil;
+import com.abi.qms.platform.infrastructure.util.RandomCodeUtils;
+import com.abi.qms.platform.infrastructure.util.SendmailUtil;
+import com.abi.qms.platform.infrastructure.util.SmsUtil;
+import com.abi.qms.platform.infrastructure.util.UserUtil;
 import com.abi.qms.platform.service.QrPackageService;
 import com.abi.task.common.api.exception.BusinessException;
 import com.abi.task.common.api.exception.ErrorCodeEnum;
@@ -31,7 +45,6 @@ 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.sun.xml.internal.bind.v2.TODO;
 import freemarker.template.Template;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -42,10 +55,18 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
 import java.net.URLEncoder;
 import java.text.MessageFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -59,452 +80,455 @@ import java.util.stream.Collectors;
 @Slf4j
 public class QrPackageServiceImpl implements QrPackageService {
 
-	@Autowired
-	private QrPackageMapper qrPackageMapper;
-
-	@Autowired
-	private BaseFactoryMapper baseFactoryMapper;
-
-	@Autowired
-	private QrPackageDownloadRecordMapper qrPackageDownloadRecordMapper;
-	
-	@Autowired
-	private QrPackageBatchMapper qrPackageBatchMapper;
-
-	@Autowired
-	private AmqpTemplate amqpTemplate;
-
-	@Autowired
-	private SendmailUtil sendmailUtil;
-
-	@Autowired
-	private SmsUtil smsUtil;
-
-	@Autowired
-	private RedisClient redisClient;
-
-	/**
-	 * 保存码包
-	 */
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void saveQrPackage(SaveQrPackageReq req) {
-		Long qrPackageId = req.getId();
-		// 修改码包时的条件限制
-		QrPackage qrPackage;
-		if (qrPackageId != null) {
-			qrPackage = qrPackageMapper.selectById(qrPackageId);
-			AssertUtil.isNull(qrPackage, "码包不存在");
-			// 只有待审核、审核拒绝状态下才可编辑
-			Integer applyStatus = qrPackage.getApplyStatus();
-			if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
-				throw new BusinessException("码包不可编辑");
-			}
-		}
-		//如果SAP订单号和物料有重复数据,需提交额外申请原因
-		ValidSAPOrderNoAndMaterialReq reqValid =  new ValidSAPOrderNoAndMaterialReq();
-		reqValid.setMaterialId(req.getMaterialId());
-		reqValid.setSapOrderNo(req.getSapOrderNo());
-		ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterialRes = validSAPOrderNoAndMaterial(reqValid);
-		if(Objects.nonNull(validSAPOrderNoAndMaterialRes) && CollectionUtil.isNotEmpty(validSAPOrderNoAndMaterialRes.getPackageBeanList())){
-			Long id = validSAPOrderNoAndMaterialRes.getPackageBeanList().get(0).getId();
-			if(validSAPOrderNoAndMaterialRes.getPackageBeanList().size() > 1) {
-				if (Objects.isNull(req.getReasonApply())) {
-					throw new BusinessException("该SAP订单号和物料与码包" + id + "重复,若仍需申请需要提交额外码包申请原因");
-				}
-			}
-			if(validSAPOrderNoAndMaterialRes.getPackageBeanList().size() == 1) {
-				if(req.getId() == null){
-					if (Objects.isNull(req.getReasonApply())) {
-						throw new BusinessException("该SAP订单号和物料与码包" + id + "重复,若仍需申请需要提交额外码包申请原因");
-					}
-				}
-				if (!id.equals(req.getId())) {
-					if (Objects.isNull(req.getReasonApply())) {
-						throw new BusinessException("该SAP订单号和物料与码包" + id + "重复,若仍需申请需要提交额外码包申请原因");
-					}
-				}
-			}
-		}
-
-		if(CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())){
-			//同一个码包内,不同批次的批次号不一样
-			List<SaveQrPackageReq.PackageBatchBean> packageBatchBeanList = req.getPackageBatchBeanList();
-			//聚合批次号
-			List<String> batchNumberList = packageBatchBeanList.stream().map(SaveQrPackageReq.PackageBatchBean::getBatchNumber).distinct().collect(Collectors.toList());
-			if(batchNumberList.size() < req.getPackageBatchBeanList().size()){
-				throw new BusinessException("批次号重复,请确认后重试");
-			}
-			//同一个码包内,批次加起来的总数量和码包数量一致
-			//计算码包数量总和
-			Long sum = packageBatchBeanList.stream().mapToLong(SaveQrPackageReq.PackageBatchBean::getBatchQrNumber).sum();
-			if(sum != req.getQrNumber()){
-				throw new BusinessException("批次码数量与申请码总量不匹配,请确认后重试");
-			}
-		}
-
-		// copy属性值
-		qrPackage = PojoConverterUtils.copy(req, QrPackage.class);
-		//若当前登录用户为包材厂用户,则该选项默认选择该用户所在的包材厂,不可修改
-		qrPackage.setFactoryCoverId(UserUtil.getUser().getFactoryId() != null ? UserUtil.getUser().getFactoryId() : req.getFactoryCoverId());
-		// 新增or修改
-		Long userId = UserUtil.getUser().getId();
-		qrPackage.setUpdateBy(userId);
-		if (qrPackageId != null) {
-			// 修改时,需要重置码包的状态为待审核
-			qrPackage.setApplyStatus(QrPackageApplyStatusEnum.WAIT_REVIEW.getCode());
-			qrPackageMapper.updateById(qrPackage);
-			//更新批次号的数据
-			QueryWrapper<QrPackageBatch> qrPackageBatchQuery = new QueryWrapper<>();
-			qrPackageBatchQuery.eq("package_id", qrPackageId);
-			qrPackageBatchQuery.eq("is_delete", 0);
-			List<QrPackageBatch> qrPackageBatches = qrPackageBatchMapper.selectList(qrPackageBatchQuery);
-			List<Long> batchOldId = qrPackageBatches.stream().map(QrPackageBatch::getId).collect(Collectors.toList());
-			if(CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())) {
-				//提取出更新的批次数据
-				List<Long> batchNewId = req.getPackageBatchBeanList().stream().map(SaveQrPackageReq.PackageBatchBean::getId).collect(Collectors.toList());
-				//整理需删除的数据
-				List<Long> deleteBatch = new ArrayList<>(batchOldId);
-				deleteBatch.removeAll(batchNewId);
-				if(CollectionUtil.isNotEmpty(deleteBatch)){
-					UpdateWrapper<QrPackageBatch> qrPackageBatchDeleteParam = new UpdateWrapper<>();
-					qrPackageBatchDeleteParam.in("id", deleteBatch)
-							.set("is_delete", 1);
-					qrPackageBatchMapper.update(null, qrPackageBatchDeleteParam);
-				}
-				//循环添加或更新
-				for(SaveQrPackageReq.PackageBatchBean packageBatchBean: req.getPackageBatchBeanList()) {
-					if(packageBatchBean.getId() == null){
-						QrPackageBatch qrPackageBatch = new QrPackageBatch();
-						qrPackageBatch.setPackageId(qrPackage.getId());
-						qrPackageBatch.setBatchNumber(packageBatchBean.getBatchNumber());
-						qrPackageBatch.setBatchQrNumber(packageBatchBean.getBatchQrNumber());
-						qrPackageBatch.setUpdateBy(userId);
-						qrPackageBatch.setCreateBy(userId);
-						qrPackageBatchMapper.insert(qrPackageBatch);
-					}else{
-						QueryWrapper<QrPackageBatch> qrPackageBatchQ = new QueryWrapper<>();
-						qrPackageBatchQ.eq("id", packageBatchBean.getId());
-						qrPackageBatchQ.eq("is_delete", 0);
-						QrPackageBatch qrPackageBatch = qrPackageBatchMapper.selectOne(qrPackageBatchQ);
-						if(Objects.isNull(qrPackageBatch)){
-							throw new BusinessException(ErrorCodeEnum.NO_EXISTS_DATA.getCode(), "批次对象不存在");
-						}
-						qrPackageBatch.setBatchQrNumber(packageBatchBean.getBatchQrNumber());
-						qrPackageBatch.setBatchNumber(packageBatchBean.getBatchNumber());
-						qrPackageBatch.setUpdateBy(userId);
-						qrPackageBatchMapper.updateById(qrPackageBatch);
-					}
-				}
-			}else{
-				//入参没有批次信息,数据库有,则全删除
-				if(CollectionUtil.isNotEmpty(qrPackageBatches)){
-					UpdateWrapper<QrPackageBatch> qrPackageBatchDeleteParam = new UpdateWrapper<>();
-					qrPackageBatchDeleteParam.in("id", batchOldId)
-							.set("is_delete", 1);
-					qrPackageBatchMapper.update(null, qrPackageBatchDeleteParam);
-				}
-			}
-		} else {
-			qrPackage.setCreateBy(userId);
-			int insert = qrPackageMapper.insert(qrPackage);
-			if(CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())) {
-				//插入批次号的数据
-				for(SaveQrPackageReq.PackageBatchBean packageBatchBean: req.getPackageBatchBeanList()) {
-					QrPackageBatch qrPackageBatch = new QrPackageBatch();
-					qrPackageBatch.setPackageId(qrPackage.getId());
-					qrPackageBatch.setBatchNumber(packageBatchBean.getBatchNumber());
-					qrPackageBatch.setBatchQrNumber(packageBatchBean.getBatchQrNumber());
-					qrPackageBatch.setUpdateBy(userId);
-					qrPackageBatch.setCreateBy(userId);
-					qrPackageBatchMapper.insert(qrPackageBatch);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * 码包分页查询
-	 */
-	@Override
-	public ListQrPackageRes listQrPackage(ListQrPackageReq req) {
-		//数据权限隔离,如果登录账号是包材厂,只能看账号包材厂的数据。否则看全部
-		if(UserUtil.getUser().getFactoryId() != null){
-			req.setFactoryCoverId(UserUtil.getUser().getFactoryId());
-		}
-
-		// 分页查询
-		IPage<QrPackageVO> iPage = qrPackageMapper.listQrPackage(PageUtil.createPage(req), req);
-		List<QrPackageVO> qrPackageList = iPage.getRecords();
-
-		// 封装出参、放入分页信息
-		ListQrPackageRes res = new ListQrPackageRes();
-		PageUtil.copyPageInfo(res, iPage);
-		List<ListQrPackageRes.QrPackageBean> qrPackageBeanList = PojoConverterUtils.copyList(qrPackageList, ListQrPackageRes.QrPackageBean.class);
-		res.setQrRepertoryBeanList(qrPackageBeanList);
-
-		return res;
-	}
-
-	/**
-	 * 码包查询详情
-	 */
-	@Override
-	public GetQrPackageDetailRes getQrPackageDetail(GetQrPackageDetailReq req) {
-		// 查询码包对象
-		QrPackageVO qrPackage = qrPackageMapper.selectQrPackageDetailById(req.getId());
-		AssertUtil.isNull(qrPackage, "码包不存在");
-
-		return PojoConverterUtils.copy(qrPackage, GetQrPackageDetailRes.class);
-	}
-
-	/**
-	 * 删除码包
-	 */
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void deleteQrPackage(DeleteQrPackageReq req) {
-		QrPackage qrPackage = qrPackageMapper.selectById(req.getId());
-		AssertUtil.isNull(qrPackage, "码包不存在");
-		// 只有待审核、审核拒绝状态下才可删除
-		Integer applyStatus = qrPackage.getApplyStatus();
-		if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
-			throw new BusinessException("码包不可删除");
-		}
-
-		// 逻辑删除
-		QrPackage update = new QrPackage().setId(req.getId()).setIsDelete(1);
-		qrPackageMapper.updateById(update);
-	}
-
-	/**
-	 * 审核通过码包
-	 */
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void passQrPackage(PassQrPackageReq req) {
-		QrPackageVO qrPackage = qrPackageMapper.selectQrPackageDetailById(req.getId());
-		AssertUtil.isNull(qrPackage, "码包不存在");
-
-		// 只有待审核、审核拒绝状态下才可通过
-		Integer applyStatus = qrPackage.getApplyStatus();
-		if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
-			throw new BusinessException("码包不可通过");
-		}
-
-		QrPackage update = new QrPackage().setId(req.getId()).setApplyStatus(QrPackageApplyStatusEnum.REVIEW_PASS.getCode());
-		qrPackageMapper.updateById(update);
-
-		// 码库类型为系统生成时,放入rabbitmq,生成码
-		if (QrRepertoryTypeEnum.SYSTEM_GENERATE.is(qrPackage.getQrRepertoryType())) {
-			amqpTemplate.convertAndSend(GenerateCodeConsumer.GENERATE_CODE_BY_REPERTORY_QUEUE, JSONObject.toJSONString(qrPackage) );
-			System.out.println("rabbitmq结束。。。。。。。。。。。。。。。。");
-		}
-	}
-
-	/**
-	 * 审核拒绝码包
-	 */
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void refuseQrPackage(RefuseQrPackageReq req) {
-		QrPackage qrPackage = qrPackageMapper.selectById(req.getId());
-		AssertUtil.isNull(qrPackage, "码包不存在");
-
-		// 只有待审核、审核拒绝状态下才可拒绝
-		Integer applyStatus = qrPackage.getApplyStatus();
-		if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
-			throw new BusinessException("码包不可拒绝");
-		}
-
-		QrPackage update = new QrPackage().setId(req.getId()).setApplyStatus(QrPackageApplyStatusEnum.REVIEW_REFUSE.getCode());
-		qrPackageMapper.updateById(update);
-	}
-
-	@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();
-		if (!QrPackageGenerateStatusEnum.GENERATE_SUCCESS.is(generateStatus)) {
-			throw new BusinessException("码包不可下载");
-		}
-
-		//特殊:校验验证码是否正确,正确才可以下载
-		boolean verifyCaptchaResult = verifyCaptcha(factory.getKeymanMobile(), req.getCaptcha(), qrPackage.getId());
-		if(!verifyCaptchaResult){
-			throw new BusinessException("验证码错误");
-		}
-
-		//开始下载
-		BufferedInputStream in = null;
-		BufferedOutputStream out = null;
-		try {
-			// TODO 从阿里云OSS读取文件,替换下面的测试代码
-			// TODO in = new BufferedInputStream(ossObject.getObjectContent());
-			in = new BufferedInputStream(new FileInputStream(new File("E:\\firefox_download\\202104161027287567357.zip")));
-			out = new BufferedOutputStream(response.getOutputStream());
-
-			String fileName = qrPackage.getSapOrderNo() + ".zip";
-			response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"utf-8"));
-
-			byte [] b = new byte[1024];
-			int len = 0;
-			while(-1 != (len = in.read(b))) {
-				out.write(b, 0, len);
-			}
-			out.flush();
-		} catch (IOException e) {
-			log.error("IOException", e);
-		} finally {
-			IoUtil.close(in);
-			IoUtil.close(out);
-		}
-
-		// 插入码包下载记录
-		Long userId = UserUtil.getUser().getId();
-		QrPackageDownloadRecord downloadRecord = new QrPackageDownloadRecord()
-				.setCreateBy(userId)
-				.setQrPackageId(qrPackage.getId());
-		qrPackageDownloadRecordMapper.insert(downloadRecord);
-
-	}
-
-	/**
-	 * 删除生成的临时文件,并更新码包的下载路径
-	 * @param txtFile txt文件
-	 * @param zipFile 压缩文件
-	 */
-	@Override
-	public void delFileAndUpdatePath(File txtFile, File zipFile, Long qrPackageId) {
-		// TODO 上传zip包到阿里云OSS后,删除本次生成的txt和zip文件
-		FileUtil.del(txtFile);
-		FileUtil.del(zipFile);
-
-		// TODO 更新下载路径
-		String downloadPath = "";
-		QrPackage update = new QrPackage().setId(qrPackageId).setDownloadPath(downloadPath);
-		qrPackageMapper.updateById(update);
-	}
-
-	/**
-	 * 码生成失败回滚
-	 */
-	@Override
-	public void failedRollback(QrPackage qrPackage) {
-		// 更改生成状态为生成失败
-		QrPackage qrPackageUpdate = new QrPackage().setId(qrPackage.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_FAIL.getCode());
-		qrPackageMapper.updateById(qrPackageUpdate);
-	}
-
-	@Override
-	public ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterial(ValidSAPOrderNoAndMaterialReq req) {
-		QueryWrapper<QrPackage> qrPackageQuery = new QueryWrapper<>();
-		qrPackageQuery.eq("material_id", req.getMaterialId());
-		qrPackageQuery.eq("sap_order_no", req.getSapOrderNo());
-		qrPackageQuery.eq("is_delete", 0);
-		List<QrPackage> qrPackages = qrPackageMapper.selectList(qrPackageQuery);
-		ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterialRes = new ValidSAPOrderNoAndMaterialRes();
-		List<ValidSAPOrderNoAndMaterialRes.PackageBean> packageBeans = PojoConverterUtils.copyList(qrPackages, ValidSAPOrderNoAndMaterialRes.PackageBean.class);
-		validSAPOrderNoAndMaterialRes.setPackageBeanList(packageBeans);
-		return validSAPOrderNoAndMaterialRes;
-	}
-
-	/**
-	 * 码包生成完成后发送邮件给码包厂负责人邮箱
-	 * @param targetEmail
-	 * @param sapOrderNo
-	 * @param filename
-	 * @param password
-	 */
-	@Override
-	public void sendEmailForQrPackageCreated(String targetEmail,String sapOrderNo,String filename,String password){
-		try{
-			//拿到freemarker模板
-			Template template = FreeMarkerUtils.getTemplate("factory.ftl");
-
-			//填充的内容
-			Map paramMap = new HashMap<>();
-			paramMap.put("sapOrderNo", sapOrderNo);
-			paramMap.put("filename", filename);
-			paramMap.put("password", password);
-
-			//生成需要发送的内容
-			String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(template, paramMap);
-
-			sendmailUtil.doSendHtmlEmail("QMS系统通知",emailContent,targetEmail);
-
-		}catch(Exception e){
-			log.info("发送码包通知邮件异常",e);
-			throw new BusinessException("发送码包通知邮件异常");
-		}
-	}
-
-	/**
-	 * 发送短信验证码
-	 *
-	 * @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;
-	}
+    @Autowired
+    private QrPackageMapper qrPackageMapper;
+
+    @Autowired
+    private BaseFactoryMapper baseFactoryMapper;
+
+    @Autowired
+    private QrPackageDownloadRecordMapper qrPackageDownloadRecordMapper;
+
+    @Autowired
+    private QrPackageBatchMapper qrPackageBatchMapper;
+
+    @Autowired
+    private AmqpTemplate amqpTemplate;
+
+    @Autowired
+    private SendmailUtil sendmailUtil;
+
+    @Autowired
+    private SmsUtil smsUtil;
+
+    @Autowired
+    private RedisClient redisClient;
+
+    /**
+     * 保存码包
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveQrPackage(SaveQrPackageReq req) {
+        Long qrPackageId = req.getId();
+        // 修改码包时的条件限制
+        QrPackage qrPackage;
+        if (qrPackageId != null) {
+            qrPackage = qrPackageMapper.selectById(qrPackageId);
+            AssertUtil.isNull(qrPackage, "码包不存在");
+            // 只有待审核、审核拒绝状态下才可编辑
+            Integer applyStatus = qrPackage.getApplyStatus();
+            if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
+                throw new BusinessException("码包不可编辑");
+            }
+        }
+        //如果SAP订单号和物料有重复数据,需提交额外申请原因
+        ValidSAPOrderNoAndMaterialReq reqValid = new ValidSAPOrderNoAndMaterialReq();
+        reqValid.setMaterialId(req.getMaterialId());
+        reqValid.setSapOrderNo(req.getSapOrderNo());
+        ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterialRes = validSAPOrderNoAndMaterial(reqValid);
+        if (Objects.nonNull(validSAPOrderNoAndMaterialRes) && CollectionUtil.isNotEmpty(validSAPOrderNoAndMaterialRes.getPackageBeanList())) {
+            Long id = validSAPOrderNoAndMaterialRes.getPackageBeanList().get(0).getId();
+            if (validSAPOrderNoAndMaterialRes.getPackageBeanList().size() > 1) {
+                if (Objects.isNull(req.getReasonApply())) {
+                    throw new BusinessException("该SAP订单号和物料与码包" + id + "重复,若仍需申请需要提交额外码包申请原因");
+                }
+            }
+            if (validSAPOrderNoAndMaterialRes.getPackageBeanList().size() == 1) {
+                if (req.getId() == null) {
+                    if (Objects.isNull(req.getReasonApply())) {
+                        throw new BusinessException("该SAP订单号和物料与码包" + id + "重复,若仍需申请需要提交额外码包申请原因");
+                    }
+                }
+                if (!id.equals(req.getId())) {
+                    if (Objects.isNull(req.getReasonApply())) {
+                        throw new BusinessException("该SAP订单号和物料与码包" + id + "重复,若仍需申请需要提交额外码包申请原因");
+                    }
+                }
+            }
+        }
+
+        if (CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())) {
+            //同一个码包内,不同批次的批次号不一样
+            List<SaveQrPackageReq.PackageBatchBean> packageBatchBeanList = req.getPackageBatchBeanList();
+            //聚合批次号
+            List<String> batchNumberList = packageBatchBeanList.stream().map(SaveQrPackageReq.PackageBatchBean::getBatchNumber).distinct().collect(Collectors.toList());
+            if (batchNumberList.size() < req.getPackageBatchBeanList().size()) {
+                throw new BusinessException("批次号重复,请确认后重试");
+            }
+            //同一个码包内,批次加起来的总数量和码包数量一致
+            //计算码包数量总和
+            Long sum = packageBatchBeanList.stream().mapToLong(SaveQrPackageReq.PackageBatchBean::getBatchQrNumber).sum();
+            if (sum != req.getQrNumber()) {
+                throw new BusinessException("批次码数量与申请码总量不匹配,请确认后重试");
+            }
+        }
+
+        // copy属性值
+        qrPackage = PojoConverterUtils.copy(req, QrPackage.class);
+        //若当前登录用户为包材厂用户,则该选项默认选择该用户所在的包材厂,不可修改
+        qrPackage.setFactoryCoverId(UserUtil.getUser().getFactoryId() != null ? UserUtil.getUser().getFactoryId() : req.getFactoryCoverId());
+        // 新增or修改
+        Long userId = UserUtil.getUser().getId();
+        qrPackage.setUpdateBy(userId);
+        if (qrPackageId != null) {
+            // 修改时,需要重置码包的状态为待审核
+            qrPackage.setApplyStatus(QrPackageApplyStatusEnum.WAIT_REVIEW.getCode());
+            qrPackageMapper.updateById(qrPackage);
+            //更新批次号的数据
+            QueryWrapper<QrPackageBatch> qrPackageBatchQuery = new QueryWrapper<>();
+            qrPackageBatchQuery.eq("package_id", qrPackageId);
+            qrPackageBatchQuery.eq("is_delete", 0);
+            List<QrPackageBatch> qrPackageBatches = qrPackageBatchMapper.selectList(qrPackageBatchQuery);
+            List<Long> batchOldId = qrPackageBatches.stream().map(QrPackageBatch::getId).collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())) {
+                //提取出更新的批次数据
+                List<Long> batchNewId = req.getPackageBatchBeanList().stream().map(SaveQrPackageReq.PackageBatchBean::getId).collect(Collectors.toList());
+                //整理需删除的数据
+                List<Long> deleteBatch = new ArrayList<>(batchOldId);
+                deleteBatch.removeAll(batchNewId);
+                if (CollectionUtil.isNotEmpty(deleteBatch)) {
+                    UpdateWrapper<QrPackageBatch> qrPackageBatchDeleteParam = new UpdateWrapper<>();
+                    qrPackageBatchDeleteParam.in("id", deleteBatch)
+                            .set("is_delete", 1);
+                    qrPackageBatchMapper.update(null, qrPackageBatchDeleteParam);
+                }
+                //循环添加或更新
+                for (SaveQrPackageReq.PackageBatchBean packageBatchBean : req.getPackageBatchBeanList()) {
+                    if (packageBatchBean.getId() == null) {
+                        QrPackageBatch qrPackageBatch = new QrPackageBatch();
+                        qrPackageBatch.setPackageId(qrPackage.getId());
+                        qrPackageBatch.setBatchNumber(packageBatchBean.getBatchNumber());
+                        qrPackageBatch.setBatchQrNumber(packageBatchBean.getBatchQrNumber());
+                        qrPackageBatch.setUpdateBy(userId);
+                        qrPackageBatch.setCreateBy(userId);
+                        qrPackageBatchMapper.insert(qrPackageBatch);
+                    } else {
+                        QueryWrapper<QrPackageBatch> qrPackageBatchQ = new QueryWrapper<>();
+                        qrPackageBatchQ.eq("id", packageBatchBean.getId());
+                        qrPackageBatchQ.eq("is_delete", 0);
+                        QrPackageBatch qrPackageBatch = qrPackageBatchMapper.selectOne(qrPackageBatchQ);
+                        if (Objects.isNull(qrPackageBatch)) {
+                            throw new BusinessException(ErrorCodeEnum.NO_EXISTS_DATA.getCode(), "批次对象不存在");
+                        }
+                        qrPackageBatch.setBatchQrNumber(packageBatchBean.getBatchQrNumber());
+                        qrPackageBatch.setBatchNumber(packageBatchBean.getBatchNumber());
+                        qrPackageBatch.setUpdateBy(userId);
+                        qrPackageBatchMapper.updateById(qrPackageBatch);
+                    }
+                }
+            } else {
+                //入参没有批次信息,数据库有,则全删除
+                if (CollectionUtil.isNotEmpty(qrPackageBatches)) {
+                    UpdateWrapper<QrPackageBatch> qrPackageBatchDeleteParam = new UpdateWrapper<>();
+                    qrPackageBatchDeleteParam.in("id", batchOldId)
+                            .set("is_delete", 1);
+                    qrPackageBatchMapper.update(null, qrPackageBatchDeleteParam);
+                }
+            }
+        } else {
+            qrPackage.setCreateBy(userId);
+            int insert = qrPackageMapper.insert(qrPackage);
+            if (CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())) {
+                //插入批次号的数据
+                for (SaveQrPackageReq.PackageBatchBean packageBatchBean : req.getPackageBatchBeanList()) {
+                    QrPackageBatch qrPackageBatch = new QrPackageBatch();
+                    qrPackageBatch.setPackageId(qrPackage.getId());
+                    qrPackageBatch.setBatchNumber(packageBatchBean.getBatchNumber());
+                    qrPackageBatch.setBatchQrNumber(packageBatchBean.getBatchQrNumber());
+                    qrPackageBatch.setUpdateBy(userId);
+                    qrPackageBatch.setCreateBy(userId);
+                    qrPackageBatchMapper.insert(qrPackageBatch);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 码包分页查询
+     */
+    @Override
+    public ListQrPackageRes listQrPackage(ListQrPackageReq req) {
+        //数据权限隔离,如果登录账号是包材厂,只能看账号包材厂的数据。否则看全部
+        if (UserUtil.getUser().getFactoryId() != null) {
+            req.setFactoryCoverId(UserUtil.getUser().getFactoryId());
+        }
+
+        // 分页查询
+        IPage<QrPackageVO> iPage = qrPackageMapper.listQrPackage(PageUtil.createPage(req), req);
+        List<QrPackageVO> qrPackageList = iPage.getRecords();
+
+        // 封装出参、放入分页信息
+        ListQrPackageRes res = new ListQrPackageRes();
+        PageUtil.copyPageInfo(res, iPage);
+        List<ListQrPackageRes.QrPackageBean> qrPackageBeanList = PojoConverterUtils.copyList(qrPackageList, ListQrPackageRes.QrPackageBean.class);
+        res.setQrRepertoryBeanList(qrPackageBeanList);
+
+        return res;
+    }
+
+    /**
+     * 码包查询详情
+     */
+    @Override
+    public GetQrPackageDetailRes getQrPackageDetail(GetQrPackageDetailReq req) {
+        // 查询码包对象
+        QrPackageVO qrPackage = qrPackageMapper.selectQrPackageDetailById(req.getId());
+        AssertUtil.isNull(qrPackage, "码包不存在");
+
+        return PojoConverterUtils.copy(qrPackage, GetQrPackageDetailRes.class);
+    }
+
+    /**
+     * 删除码包
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteQrPackage(DeleteQrPackageReq req) {
+        QrPackage qrPackage = qrPackageMapper.selectById(req.getId());
+        AssertUtil.isNull(qrPackage, "码包不存在");
+        // 只有待审核、审核拒绝状态下才可删除
+        Integer applyStatus = qrPackage.getApplyStatus();
+        if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
+            throw new BusinessException("码包不可删除");
+        }
+
+        // 逻辑删除
+        QrPackage update = new QrPackage().setId(req.getId()).setIsDelete(1);
+        qrPackageMapper.updateById(update);
+    }
+
+    /**
+     * 审核通过码包
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void passQrPackage(PassQrPackageReq req) {
+        QrPackageVO qrPackage = qrPackageMapper.selectQrPackageDetailById(req.getId());
+        AssertUtil.isNull(qrPackage, "码包不存在");
+
+        // 只有待审核、审核拒绝状态下才可通过
+        Integer applyStatus = qrPackage.getApplyStatus();
+        if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
+            throw new BusinessException("码包不可通过");
+        }
+
+        QrPackage update = new QrPackage().setId(req.getId()).setApplyStatus(QrPackageApplyStatusEnum.REVIEW_PASS.getCode());
+        qrPackageMapper.updateById(update);
+
+        // 码库类型为系统生成时,放入rabbitmq,生成码
+        if (QrRepertoryTypeEnum.SYSTEM_GENERATE.is(qrPackage.getQrRepertoryType())) {
+            amqpTemplate.convertAndSend(GenerateCodeConsumer.GENERATE_CODE_BY_REPERTORY_QUEUE, JSONObject.toJSONString(qrPackage));
+            System.out.println("rabbitmq结束。。。。。。。。。。。。。。。。");
+        }
+    }
+
+    /**
+     * 审核拒绝码包
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void refuseQrPackage(RefuseQrPackageReq req) {
+        QrPackage qrPackage = qrPackageMapper.selectById(req.getId());
+        AssertUtil.isNull(qrPackage, "码包不存在");
+
+        // 只有待审核、审核拒绝状态下才可拒绝
+        Integer applyStatus = qrPackage.getApplyStatus();
+        if (QrPackageApplyStatusEnum.REVIEW_PASS.is(applyStatus)) {
+            throw new BusinessException("码包不可拒绝");
+        }
+
+        QrPackage update = new QrPackage().setId(req.getId()).setApplyStatus(QrPackageApplyStatusEnum.REVIEW_REFUSE.getCode());
+        qrPackageMapper.updateById(update);
+    }
+
+    @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();
+        if (!QrPackageGenerateStatusEnum.GENERATE_SUCCESS.is(generateStatus)) {
+            throw new BusinessException("码包不可下载");
+        }
+
+        //特殊:校验验证码是否正确,正确才可以下载
+        boolean verifyCaptchaResult = verifyCaptcha(factory.getKeymanMobile(), req.getCaptcha(), qrPackage.getId());
+        if (!verifyCaptchaResult) {
+            throw new BusinessException("验证码错误");
+        }
+
+        //开始下载
+        BufferedInputStream in = null;
+        BufferedOutputStream out = null;
+        try {
+            // TODO 从阿里云OSS读取文件,替换下面的测试代码
+            // TODO in = new BufferedInputStream(ossObject.getObjectContent());
+            in = new BufferedInputStream(new FileInputStream(new File("E:\\firefox_download\\202104161027287567357.zip")));
+            out = new BufferedOutputStream(response.getOutputStream());
+
+            String fileName = qrPackage.getSapOrderNo() + ".zip";
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
+
+            byte[] b = new byte[1024];
+            int len = 0;
+            while (-1 != (len = in.read(b))) {
+                out.write(b, 0, len);
+            }
+            out.flush();
+        } catch (IOException e) {
+            log.error("IOException", e);
+        } finally {
+            IoUtil.close(in);
+            IoUtil.close(out);
+        }
+
+        // 插入码包下载记录
+        Long userId = UserUtil.getUser().getId();
+        QrPackageDownloadRecord downloadRecord = new QrPackageDownloadRecord()
+                .setCreateBy(userId)
+                .setQrPackageId(qrPackage.getId());
+        qrPackageDownloadRecordMapper.insert(downloadRecord);
+
+    }
+
+    /**
+     * 删除生成的临时文件,并更新码包的下载路径
+     *
+     * @param txtFile txt文件
+     * @param zipFile 压缩文件
+     */
+    @Override
+    public void delFileAndUpdatePath(File txtFile, File zipFile, Long qrPackageId) {
+        // TODO 上传zip包到阿里云OSS后,删除本次生成的txt和zip文件
+        FileUtil.del(txtFile);
+        FileUtil.del(zipFile);
+
+        // TODO 更新下载路径
+        String downloadPath = "";
+        QrPackage update = new QrPackage().setId(qrPackageId).setDownloadPath(downloadPath);
+        qrPackageMapper.updateById(update);
+    }
+
+    /**
+     * 码生成失败回滚
+     */
+    @Override
+    public void failedRollback(QrPackage qrPackage) {
+        // 更改生成状态为生成失败
+        QrPackage qrPackageUpdate = new QrPackage().setId(qrPackage.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_FAIL.getCode());
+        qrPackageMapper.updateById(qrPackageUpdate);
+    }
+
+    @Override
+    public ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterial(ValidSAPOrderNoAndMaterialReq req) {
+        QueryWrapper<QrPackage> qrPackageQuery = new QueryWrapper<>();
+        qrPackageQuery.eq("material_id", req.getMaterialId());
+        qrPackageQuery.eq("sap_order_no", req.getSapOrderNo());
+        qrPackageQuery.eq("is_delete", 0);
+        List<QrPackage> qrPackages = qrPackageMapper.selectList(qrPackageQuery);
+        ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterialRes = new ValidSAPOrderNoAndMaterialRes();
+        List<ValidSAPOrderNoAndMaterialRes.PackageBean> packageBeans = PojoConverterUtils.copyList(qrPackages, ValidSAPOrderNoAndMaterialRes.PackageBean.class);
+        validSAPOrderNoAndMaterialRes.setPackageBeanList(packageBeans);
+        return validSAPOrderNoAndMaterialRes;
+    }
+
+    /**
+     * 码包生成完成后发送邮件给码包厂负责人邮箱
+     *
+     * @param targetEmail
+     * @param sapOrderNo
+     * @param filename
+     * @param password
+     */
+    @Override
+    public void sendEmailForQrPackageCreated(String targetEmail, String sapOrderNo, String filename, String password) {
+        try {
+            //拿到freemarker模板
+            Template template = FreeMarkerUtils.getTemplate("factory.ftl");
+
+            //填充的内容
+            Map paramMap = new HashMap<>();
+            paramMap.put("sapOrderNo", sapOrderNo);
+            paramMap.put("filename", filename);
+            paramMap.put("password", password);
+
+            //生成需要发送的内容
+            String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(template, paramMap);
+
+            sendmailUtil.doSendHtmlEmail("QMS系统通知", emailContent, targetEmail);
+
+        } catch (Exception e) {
+            log.info("发送码包通知邮件异常", e);
+            throw new BusinessException("发送码包通知邮件异常");
+        }
+    }
+
+    /**
+     * 发送短信验证码
+     *
+     * @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;
+    }
 
 
 }