瀏覽代碼

Merge branch 'feature/1.0.0' of github.com:ab-inbev-apac/abi-cloud-qr-platform into feature/1.0.0

 Conflicts:
	abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrPackageService.java
	abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrPackageServiceImpl.java
tanzhongran 4 年之前
父節點
當前提交
f1b402563f
共有 20 個文件被更改,包括 841 次插入390 次删除
  1. 7 0
      abi-cloud-qr-platform-server/pom.xml
  2. 0 35
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrDataController.java
  3. 6 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrPackageController.java
  4. 9 9
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/entity/QrPackage.java
  5. 49 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/tablestore/entity/QrCode.java
  6. 27 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/vo/result/QrPackageBatchVO.java
  7. 17 8
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/vo/result/QrPackageVO.java
  8. 1 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/ListQrPackageReq.java
  9. 53 5
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/SaveQrPackageReq.java
  10. 27 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/ValidSAPOrderNoAndMaterialReq.java
  11. 28 7
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/GetQrPackageDetailRes.java
  12. 0 3
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/ListQrPackageRes.java
  13. 37 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/ValidSAPOrderNoAndMaterialRes.java
  14. 175 55
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/mq/GenerateCodeConsumer.java
  15. 7 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrPackageService.java
  16. 1 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/FactoryServiceImpl.java
  17. 222 222
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrDataServiceImpl.java
  18. 137 23
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrPackageServiceImpl.java
  19. 34 16
      abi-cloud-qr-platform-server/src/main/resources/dao/mapper/QrPackageMapper.xml
  20. 4 4
      abi-cloud-qr-platform-server/src/main/resources/dao/mapper/QrRepertoryMapper.xml

+ 7 - 0
abi-cloud-qr-platform-server/pom.xml

@@ -151,6 +151,13 @@
             <artifactId>spring-boot-starter-amqp</artifactId>
         </dependency>
 
+        <!--生成加密压缩包依赖-->
+        <dependency>
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+
         <!-- redisson -->
         <dependency>
             <groupId>org.redisson</groupId>

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

@@ -1,35 +0,0 @@
-package com.abi.qms.platform.controller.console;
-
-import com.abi.qms.platform.dto.req.ImportQrDataReq;
-import com.abi.qms.platform.service.QrDataService;
-import com.abi.task.common.api.base.BaseResponse;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-/**
- * 码数据 Controller
- *
- * @author WeiganCai
- * @date 2021-05-11
- */
-@Slf4j
-@RestController
-@Api(tags = "码数据管理")
-@RequestMapping("/qrData")
-public class QrDataController {
-    @Autowired
-    private QrDataService qrDataService;
-
-    @ApiOperation("/导入码数据")
-    @PostMapping("/importQrData")
-    public BaseResponse importQrData(@Validated ImportQrDataReq importQrDataReq) {
-        qrDataService.importQrData(importQrDataReq);
-        return BaseResponse.create();
-    }
-
-}

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

@@ -76,4 +76,10 @@ public class QrPackageController {
         qrPackageService.downloadQrPackage(downloadQrPackageReq, response);
     }
 
+    @ApiOperation("校验是否存在SAP订单号和物料重复数据")
+    @PostMapping("/validSAPOrderNoAndMaterial")
+    public BaseResponse validSAPOrderNoAndMaterial(@Validated @RequestBody ValidSAPOrderNoAndMaterialReq req) {
+        return BaseResponse.create(qrPackageService.validSAPOrderNoAndMaterial(req));
+    }
+
 }

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

@@ -24,14 +24,14 @@ public class QrPackage implements Serializable {
 	@Schema(name = "码包id")
 	private Long id;
 
-	@Schema(name = "部门id")
-	private Long deptId;
+	@Schema(name = "包材厂id")
+	private Long factoryCoverId;
 
 	@Schema(name = "物料id")
 	private Long materialId;
 
-	@Schema(name = "包材厂id")
-	private Long factoryId;
+	@Schema(name = "啤酒厂id")
+	private Long factoryBeerId;
 
 	@Schema(name = "箱码幅面id")
 	private Long boxCodeFormatId;
@@ -39,15 +39,15 @@ public class QrPackage implements Serializable {
 	@Schema(name = "SAP单号")
 	private String sapOrderNo;
 
-	@Schema(name = "批次号")
-	private String batchNumber;
-
-	@Schema(name = "码包名称")
-	private String name;
+	@Schema(name = "备用码包")
+	private String standbyRatio;
 
 	@Schema(name = "码数量")
 	private Long qrNumber;
 
+	@Schema(name = "申请原因")
+	private String reasonApply;
+
 	@Schema(name = "申请状态 0-待审核 1-审核通过 2-审核拒绝")
 	private Integer applyStatus;
 

+ 49 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/tablestore/entity/QrCode.java

@@ -0,0 +1,49 @@
+package com.abi.qms.platform.dao.tablestore.entity;
+
+import com.abi.task.common.tablestore.common.TableStore;
+import com.abi.task.common.tablestore.common.TableStoreEntity;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * ludashi
+ * tablestore
+ */
+@Data
+@NoArgsConstructor
+@TableStore(tableName = "qr_code",primaryKeyName = "id")
+public class QrCode implements TableStoreEntity, Serializable {
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 码
+     */
+    private String code;
+
+    /**
+     * 码包id
+     */
+    private Long packageId;
+
+    /**
+     * 批次id
+     */
+    private Long batchNumberId;
+
+    /**
+     * url
+     */
+    private String url;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 27 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/vo/result/QrPackageBatchVO.java

@@ -0,0 +1,27 @@
+package com.abi.qms.platform.dao.vo.result;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Eurus
+ * @date 2021/5/19 20:39
+ * @Description: 码包批次信息对象 qr_package_batch
+ */
+@Data
+@ApiModel
+public class QrPackageBatchVO {
+
+    @ApiModelProperty(value = "码包批次id")
+    private Long id;
+
+    @ApiModelProperty(value = "码包id")
+    private Long packageId;
+
+    @ApiModelProperty(value = "批次号")
+    private String batchNumber;
+
+    @ApiModelProperty(value = "批次内码数量")
+    private Long batchQrNumber;
+}

+ 17 - 8
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/vo/result/QrPackageVO.java

@@ -29,10 +29,19 @@ public class QrPackageVO implements Serializable {
 	private String materialName;
 
 	@ApiModelProperty(value = "包材厂id")
-	private Long factoryId;
+	private Long factoryCoverId;
 
 	@ApiModelProperty("包材厂名称")
-	private String factoryName;
+	private String factoryCoverName;
+
+	@ApiModelProperty(value = "啤酒厂id")
+	private Long factoryBeerId;
+
+	@ApiModelProperty("啤酒厂名称")
+	private String factoryBeerName;
+
+	@ApiModelProperty(value = "备用码包")
+	private String standbyRatio;
 
 	@ApiModelProperty("箱码幅面id")
 	private Long boxCodeFormatId;
@@ -52,12 +61,6 @@ public class QrPackageVO implements Serializable {
 	@ApiModelProperty("SAP单号")
 	private String sapOrderNo;
 
-	@ApiModelProperty("批次号")
-	private String batchNumber;
-
-	@ApiModelProperty("码包名称")
-	private String name;
-
 	@ApiModelProperty("码数量")
 	private Long qrNumber;
 
@@ -67,6 +70,9 @@ public class QrPackageVO implements Serializable {
 	@ApiModelProperty("生成状态 0-未生成 1-生成中 2-已生成 3-失败")
 	private Integer generateStatus;
 
+	@ApiModelProperty(value = "申请原因")
+	private String reasonApply;
+
 	@ApiModelProperty("下载路径")
 	private String downloadPath;
 
@@ -92,4 +98,7 @@ public class QrPackageVO implements Serializable {
 	@ApiModelProperty(value = "修改人id")
 	private Long updateBy;
 
+	@ApiModelProperty(value = "码包批次列表")
+	private List<QrPackageBatchVO> qrPackageBatchVOList;
+
 }

+ 1 - 1
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/ListQrPackageReq.java

@@ -27,7 +27,7 @@ public class ListQrPackageReq extends PageReq implements Serializable {
 	private Long materialId;
 
 	@ApiModelProperty(value = "包材厂id")
-	private Long factoryId;
+	private Long factoryCoverId;
 
 	@ApiModelProperty("申请状态 0-待审核 1-审核通过 2-审核拒绝")
 	private Integer applyStatus;

+ 53 - 5
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/SaveQrPackageReq.java

@@ -1,12 +1,20 @@
 package com.abi.qms.platform.dto.req;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
 
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 码包新增修改入参
@@ -21,21 +29,61 @@ public class SaveQrPackageReq implements Serializable {
 	@ApiModelProperty("码包id")
 	private Long id;
 
+	@NotEmpty(message = "SAP单号为空")
+	@Size(max = 20, message = "SAP单号不能超过20字")
+	@ApiModelProperty("SAP单号")
+	private String sapOrderNo;
+
+	@NotNull(message = "物料名称为空")
+	@ApiModelProperty(value = "物料id")
+	private Long materialId;
+
 	@NotNull(message = "包材厂为空")
 	@ApiModelProperty(value = "包材厂id")
-	private Long factoryId;
+	private Long factoryCoverId;
+
+	@NotNull(message = "啤酒厂为空")
+	@ApiModelProperty(value = "啤酒厂id")
+	private Long factoryBeerId;
 
 	@NotNull(message = "箱码幅面为空")
 	@ApiModelProperty("箱码幅面id")
 	private Long boxCodeFormatId;
 
-	@NotNull(message = "码包名称为空")
-	@Pattern(regexp = "^[a-zA-Z-z0-9\\u4e00-\\u9fa5]{1,20}$", message = "码包名称限制20字内的汉字or字母or数字")
-	@ApiModelProperty("码包名称")
-	private String name;
+	@NotEmpty(message = "备用码包为空")
+	@ApiModelProperty(value = "备用码包")
+	private String standbyRatio;
 
 	@NotNull(message = "码数量为空")
 	@ApiModelProperty("码数量")
 	private Long qrNumber;
 
+	@Size(max = 50, message = "申请原因超过50字")
+	@ApiModelProperty(value = "申请原因")
+	private String reasonApply;
+
+	@ApiModelProperty(value = "批次列表")
+	private List<PackageBatchBean> packageBatchBeanList;
+
+	/**
+	 * 批次号bean
+	 */
+	@Data
+	@NoArgsConstructor
+	@AllArgsConstructor
+	@ToString
+	@ApiModel(value = "SaveQrPackageReq_PackageBatchBean")
+	public static class PackageBatchBean implements Serializable {
+
+		@ApiModelProperty("批次号id")
+		private Long id;
+
+		@NotEmpty(message = "批次号为空")
+		@ApiModelProperty(value = "批次号")
+		private String batchNumber;
+
+		@NotNull(message = "批次内码数量为空")
+		@ApiModelProperty(value = "批次内码数量")
+		private Long batchQrNumber;
+	}
 }

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

@@ -0,0 +1,27 @@
+package com.abi.qms.platform.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Eurus
+ * @date 2021/5/19 20:16
+ * @Description: 校验是否存在SAP订单号和物料重复数据 入参
+ */
+@Data
+@ApiModel
+public class ValidSAPOrderNoAndMaterialReq implements Serializable{
+
+    @NotNull(message = "物料名称为空")
+    @ApiModelProperty(value = "物料id")
+    private Long materialId;
+
+    @NotEmpty(message = "SAP单号为空")
+    @ApiModelProperty("SAP单号")
+    private String sapOrderNo;
+}

+ 28 - 7
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/GetQrPackageDetailRes.java

@@ -1,5 +1,6 @@
 package com.abi.qms.platform.dto.res;
 
+import com.abi.qms.platform.dao.vo.result.QrPackageBatchVO;
 import com.abi.qms.platform.dao.vo.result.QrPackageDownloadRecordVO;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -23,11 +24,26 @@ public class GetQrPackageDetailRes implements Serializable {
 	@ApiModelProperty("码包id")
 	private Long id;
 
+	@ApiModelProperty(value = "物料id")
+	private Long materialId;
+
+	@ApiModelProperty("物料名称")
+	private String materialName;
+
 	@ApiModelProperty(value = "包材厂id")
-	private Long factoryId;
+	private Long factoryCoverId;
 
 	@ApiModelProperty("包材厂名称")
-	private String factoryName;
+	private String factoryCoverName;
+
+	@ApiModelProperty(value = "啤酒厂id")
+	private Long factoryBeerId;
+
+	@ApiModelProperty("啤酒厂名称")
+	private String factoryBeerName;
+
+	@ApiModelProperty(value = "备用码包")
+	private String standbyRatio;
 
 	@ApiModelProperty("箱码幅面id")
 	private Long boxCodeFormatId;
@@ -44,11 +60,8 @@ public class GetQrPackageDetailRes implements Serializable {
 	@ApiModelProperty("码库类型")
 	private Integer qrRepertoryType;
 
-	@ApiModelProperty("批次号")
-	private String batchNumber;
-
-	@ApiModelProperty("码包名称")
-	private String name;
+	@ApiModelProperty("SAP单号")
+	private String sapOrderNo;
 
 	@ApiModelProperty("码数量")
 	private Long qrNumber;
@@ -59,9 +72,15 @@ public class GetQrPackageDetailRes implements Serializable {
 	@ApiModelProperty("生成状态 0-未生成 1-生成中 2-已生成 3-失败")
 	private Integer generateStatus;
 
+	@ApiModelProperty(value = "申请原因")
+	private String reasonApply;
+
 	@ApiModelProperty("下载路径")
 	private String downloadPath;
 
+	@ApiModelProperty("是否已下载")
+	private Integer isDownload;
+
 	@ApiModelProperty(value = "创建时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private LocalDateTime createTime;
@@ -82,4 +101,6 @@ public class GetQrPackageDetailRes implements Serializable {
 	@ApiModelProperty(value = "码包下载记录")
 	private List<QrPackageDownloadRecordVO> qrPackageDownloadRecordList;
 
+	@ApiModelProperty(value = "码包批次列表")
+	private List<QrPackageBatchVO> qrPackageBatchVOList;
 }

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

@@ -60,9 +60,6 @@ public class ListQrPackageRes extends PageResp implements Serializable {
 		@ApiModelProperty("箱码幅面名称")
 		private String boxCodeFormatName;
 
-		@ApiModelProperty("码包名称")
-		private String name;
-
 		@ApiModelProperty("码数量")
 		private Long qrNumber;
 

+ 37 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/ValidSAPOrderNoAndMaterialRes.java

@@ -0,0 +1,37 @@
+package com.abi.qms.platform.dto.res;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Eurus
+ * @date 2021/5/19 20:20
+ * @Description: 校验是否存在SAP订单号和物料重复数据 出参
+ */
+@Data
+@ApiModel
+public class ValidSAPOrderNoAndMaterialRes implements Serializable {
+
+    @ApiModelProperty("码包bean列表")
+    private List<PackageBean> packageBeanList;
+
+    /**
+     * 码包bean
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ToString
+    @ApiModel(value = "ValidSAPOrderNoAndMaterialRes_PackageBean")
+    public static class PackageBean implements Serializable {
+        @ApiModelProperty(value = "码包id")
+        private Long id;
+    }
+}

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

@@ -1,25 +1,32 @@
 package com.abi.qms.platform.infrastructure.mq;
 
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.file.FileWriter;
 import cn.hutool.core.util.ZipUtil;
-import com.abi.qms.platform.dao.entity.QrData;
-import com.abi.qms.platform.dao.entity.QrInnerData;
-import com.abi.qms.platform.dao.entity.QrPackage;
-import com.abi.qms.platform.dao.entity.QrRepertorySerialNumber;
+import com.abi.qms.platform.dao.entity.*;
 import com.abi.qms.platform.dao.enums.QrFormatUrlEnum;
 import com.abi.qms.platform.dao.enums.QrPackageGenerateStatusEnum;
 import com.abi.qms.platform.dao.enums.QrRepertoryTypeEnum;
+import com.abi.qms.platform.dao.mapper.QrPackageBatchMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageMapper;
 import com.abi.qms.platform.dao.mapper.QrRepertoryMapper;
 import com.abi.qms.platform.dao.mapper.QrRepertorySerialNumberMapper;
+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.infrastructure.qr.build.parent.SerialBuildCode;
 import com.abi.qms.platform.infrastructure.util.BuildCodeUtil;
-import com.abi.qms.platform.service.QrDataService;
 import com.abi.qms.platform.service.QrPackageService;
+import com.abi.task.common.tablestore.TableStorePlusUtils;
+import com.abi.task.common.tablestore.common.TableStoreEntity;
+import com.abi.task.common.tablestore.entity.DemoEntity;
+import com.abi.task.common.utils.TableStoreUtils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alicloud.openservices.tablestore.model.search.query.BoolQuery;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.rabbitmq.client.Channel;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -33,9 +40,15 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.messaging.Message;
 import org.springframework.stereotype.Component;
+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 java.io.File;
+import java.io.IOException;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -61,8 +74,8 @@ public class GenerateCodeConsumer {
 	@Autowired
 	private QrRepertorySerialNumberMapper qrRepertorySerialNumberMapper;
 
-	@Autowired
-	private QrDataService qrDataService;
+//	@Autowired
+//	private QrDataService qrDataService;
 
 	@Autowired
 	private QrPackageService qrPackageService;
@@ -70,6 +83,21 @@ public class GenerateCodeConsumer {
 	@Autowired
 	private RedissonClient redissonClient;
 
+	@Autowired
+	private TableStorePlusUtils tableStorePlusUtils;
+
+	@Autowired
+    private QrPackageBatchMapper qrPackageBatchMapper;
+
+	//生成码数据
+	final List<QrData> qrDataList = new LinkedList<>();
+
+	//生成码包路径
+	private File file = new File(this.getClass().getResource("/").getPath()+"/code");
+
+	//批量添加文件
+	private ArrayList<File> files = new ArrayList<>();
+
 	/** 允许单个码生成重复的次数 */
 	private static final int REPEAT_BUILD_CODE_TIMES = 10;
 
@@ -82,7 +110,8 @@ public class GenerateCodeConsumer {
 
 	@SneakyThrows
 	@RabbitHandler
-	public void onMessage(QrPackage qrPackage, Message message, Channel channel) {
+	public void onMessage(String objeQrPackage, Message message, Channel channel) {
+		QrPackage qrPackage = JSONObject.parseObject(objeQrPackage,QrPackage.class);
 		try {
 			// 生成码
 			loopGenerateCode(qrPackage);
@@ -126,48 +155,99 @@ public class GenerateCodeConsumer {
 		// child_index用于标记同一列的第几个码格式变量
 		Map<String, QrRepertorySerialNumber> qrRepertorySerialNumberMap = new LinkedHashMap<>();
 
-		// 处理url和流水号
+		// 处理url和流水号--后续生成码要用到
 		getUrlAndSerialNumber(qrRepertoryColumnList, qrRepertoryId, deptUrl, urlMap, qrRepertorySerialNumberMap);
 
-		// 申请数量、批次号、创建时间、重复次数
-		Long qrNumber = qrPackageVo.getQrNumber();
-		String batchNumber = qrPackageVo.getBatchNumber();
-		LocalDateTime localDateTime = LocalDateTime.now();
-		int repeatTimes = 0;
-
-		// 循环生成码
-		loopGenerateCode(qrRepertoryColumnList, qrRepertoryId, urlMap, qrRepertorySerialNumberMap, qrNumber, batchNumber, localDateTime, repeatTimes);
-
-		// 更新码库流水号
-		if (!qrRepertorySerialNumberMap.isEmpty()) {
-			for (Map.Entry<String, QrRepertorySerialNumber> entry : qrRepertorySerialNumberMap.entrySet()) {
-				QrRepertorySerialNumber qrRepertorySerialNumber = entry.getValue();
-				QrRepertorySerialNumber updateSerialNumber = new QrRepertorySerialNumber()
-						.setId(qrRepertorySerialNumber.getId())
-						.setSerialNumber(qrRepertorySerialNumber.getSerialNumber());
-				qrRepertorySerialNumberMapper.updateById(updateSerialNumber);
-			}
-		}
-
-		// 创建码文件
-		createCodeFile(qrPackage, qrRepertory);
+		//码包id
+        //根据码包id查询,获取批次号
+		QueryWrapper<QrPackageBatch> param = new QueryWrapper<>();
+		param.eq("package_id", qrPackageVo.getId());
+		List<QrPackageBatch> qrPackageBatches = qrPackageBatchMapper.selectList(param);
+
+		for (QrPackageBatch qrPackageBatch:qrPackageBatches) {
+			// 这批下的申请数量
+			Long qrNumber = qrPackageBatch.getBatchQrNumber();
+			//批次号
+			String batchNumber = qrPackageBatch.getBatchNumber();
+			//重复次数
+			int repeatTimes = 0;
+
+			/**
+			 * qrRepertoryColumnList  码库的列
+			 * qrRepertoryId 码库id
+			 * urlMap 存放每列的url
+			 * qrRepertorySerialNumberMap 用于标记同一列的第几个码格式变量
+			 * qrNumber 码数量
+			 * batchNumber 批次号
+			 * localDateTime 创建时间
+			 */
+			// 循环生成码
+			List<QrData> codeList = loopGenerateCode(qrRepertoryColumnList, qrRepertoryId, urlMap, qrRepertorySerialNumberMap, qrNumber, batchNumber, repeatTimes);
+
+			// table数据库  批量插入
+			saveTableStore(qrPackageBatch, codeList);
+
+			// 创建码文件
+			createCodeFile(qrRepertory,batchNumber);
 
+		}
 		// 更改生成状态为已生成
 		qrPackageUpdate = new QrPackage().setId(qrPackageVo.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_SUCCESS.getCode());
 		qrPackageMapper.updateById(qrPackageUpdate);
+		//压缩后得名字
+		String zipName = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now())+".zip";
+//		压缩密码
+		String pas = String.valueOf((int) (Math.random()*9+1)*100000);
+		log.info("生成密码:"+pas);
+		//压缩加密文件
+		zipEncryption(file,files,pas,zipName);
+		// TODO:上传阿里云,并更新码包的下载路径 保存zip密码
+
+		//删除生成文件
+		FileUtil.del(file);
 	}
 
 	/**
-	 * 循环生成码
+	 * 批量新增tableStore,码表
 	 */
-	private void loopGenerateCode(List<QrRepertoryColumnVO> qrRepertoryColumnList, Long qrRepertoryId, Map<Long, String> urlMap, Map<String, QrRepertorySerialNumber> qrRepertorySerialNumberMap, Long qrNumber, String batchNumber, LocalDateTime localDateTime, int repeatTimes) {
-		// 生成码
-		while (true) {
-			// 查询已生成的数量
-			long alreadyGenerateNumber = qrDataService.selectCountByBatchNumber(batchNumber);
+	private void saveTableStore(QrPackageBatch qrPackageBatch, List<QrData> codeList) {
+		List<TableStoreEntity> codeSave = new ArrayList<>();
+		for (QrData qrData:codeList) {
+			List<QrInnerData> innerDataList = qrData.getInnerDataList();
+			for (QrInnerData qrInnerData:innerDataList) {
+				QrCode qrCode = new QrCode();
+				qrCode.setId(String.valueOf(IdWorker.getId()));
+				//码
+				qrCode.setCode(qrInnerData.getCode());
+				//批次id
+				qrCode.setBatchNumberId(qrPackageBatch.getId());
+				//码包id
+				qrCode.setPackageId(qrPackageBatch.getPackageId());
+				//要拼接的url
+				qrCode.setUrl(qrInnerData.getUrl());
+				//创建时间
+				qrCode.setCreateTime(LocalDateTime.now());
+				codeSave.add(qrCode);
+			}
+		}
+		tableStorePlusUtils.putRow(codeSave);
+	}
 
+	/**
+     * qrRepertoryColumnList  码库的列
+     * qrRepertoryId 码库id
+     * urlMap 存放每列的url
+     * qrRepertorySerialNumberMap 用于标记同一列的第几个码格式变量
+     * qrNumber 码数量
+     * batchNumber 批次号
+     * localDateTime 创建时间
+     * repeatTimes 失败次数
+     */
+	private List<QrData> loopGenerateCode(List<QrRepertoryColumnVO> qrRepertoryColumnList, Long qrRepertoryId, Map<Long, String> urlMap, Map<String, QrRepertorySerialNumber> qrRepertorySerialNumberMap, Long qrNumber, String batchNumber, int repeatTimes) {
+        LocalDateTime localDateTime = LocalDateTime.now();
+		while (true) {
 			// 计算还需生成的数量
-			long needGenerateNumber = qrNumber - alreadyGenerateNumber;
+			long needGenerateNumber = qrNumber --;
 
 			if (needGenerateNumber <= 0) {
 				log.info("批次号:{},码生成完毕", batchNumber);
@@ -177,7 +257,6 @@ public class GenerateCodeConsumer {
 			// 计算本次最多生成多少码
 			long currentMaxGenerateNumber = needGenerateNumber <= ONCE_GENERATE_NUMBER ? needGenerateNumber : ONCE_GENERATE_NUMBER;
 
-			List<QrData> qrDataList = new LinkedList<>();
 			// 用Set存放不重复的码
 			HashSet<String> uniqueSet = new HashSet<>();
 			// 生成码要用的参数
@@ -222,19 +301,18 @@ public class GenerateCodeConsumer {
 
 				qrData.setInnerDataList(qrInnerDataList);
 				qrDataList.add(qrData);
-
 			}
 
 			try {
-				qrDataService.batchInsert(qrDataList);
+				return qrDataList;
 			} catch (Exception e) {
-				// mongoDB唯一索引冲突导致插入失败,继续生成码
-				log.error("mongo insert error", e);
+				log.error("封装码失败", e);
 				if (++repeatTimes >= REPEAT_BUILD_CODE_TIMES) {
 					throw new RuntimeException("生成码失败,重复生成码次数超过" + REPEAT_BUILD_CODE_TIMES + "次");
 				}
 			}
 		}
+		return null;
 	}
 
 	/**
@@ -299,15 +377,12 @@ public class GenerateCodeConsumer {
 	/**
 	 * 创建码文件
 	 */
-	private void createCodeFile(QrPackage qrPackage, QrRepertoryVO qrRepertory) {
-		String batchNumber = qrPackage.getBatchNumber();
-		List<QrData> qrDataList = qrDataService.selectCodeByBatch(batchNumber);
+	private void createCodeFile( QrRepertoryVO qrRepertory,String batchNumber) {
 		List<QrRepertoryColumnVO> qrRepertoryColumnList = qrRepertory.getQrRepertoryColumnList();
 		StringBuilder content = new StringBuilder();
 		// 第一行为每列的名称,用“,”分隔
 		String dataComposition = qrRepertoryColumnList.stream().map(col -> col.getAlias()).collect(Collectors.joining(","));
 		content.append(dataComposition).append("\r\n");
-
 		// 拼接码
 		List<QrInnerData> innerDataList;
 		String innerData;
@@ -316,16 +391,19 @@ public class GenerateCodeConsumer {
 			innerData = innerDataList.stream().map(qrInnerData -> qrInnerData.getUrl() + qrInnerData.getCode()).collect(Collectors.joining(","));
 			content.append(innerData).append("\r\n");
 		}
+		//如果文件不存在,创建一个文件
+		try{
+			if (!file.exists()) {
+				file.mkdir();
+			}
+		}catch (Exception e){
+			log.error("创建文件异常",e);
+		}
 
-		// 生成txt和zip文件
-		FileWriter fileWriter = new FileWriter(batchNumber + ".txt");
+		// 生成txt
+		FileWriter fileWriter = new FileWriter(file.getPath()+"/"+ batchNumber + ".txt");
 		fileWriter.write(content.toString());
-		File txtFile = fileWriter.getFile();
-		File zipFile = ZipUtil.zip(txtFile);
-
-		// 删除生成的临时文件,上传阿里云,并更新码包的下载路径
-		qrPackageService.delFileAndUpdatePath(txtFile, zipFile, qrPackage.getId());
-
+		files.add(new File(file.getPath()+"/"+ batchNumber + ".txt"));
 	}
 
 	/**
@@ -376,4 +454,46 @@ public class GenerateCodeConsumer {
 		}
 	}
 
+	/**
+	 * zip加密
+	 * @param file
+	 * @param files txt文件
+	 * @param pas 密码
+	 * @param zipName 压缩后的名字
+	 */
+	private void zipEncryption(File file  ,ArrayList<File> files,String pas,String zipName){
+		try {
+			//创建压缩文件
+			ZipFile zipFile = new ZipFile(file.getPath()+"/"+zipName);
+			//设置压缩文件参数
+			ZipParameters parameters = new ZipParameters();
+			//设置压缩方法
+			parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
+
+			//设置压缩级别
+			//DEFLATE_LEVEL_FASTEST     - Lowest compression level but higher speed of compression
+			//DEFLATE_LEVEL_FAST        - Low compression level but higher speed of compression
+			//DEFLATE_LEVEL_NORMAL  - Optimal balance between compression level/speed
+			//DEFLATE_LEVEL_MAXIMUM     - High compression level with a compromise of speed
+			//DEFLATE_LEVEL_ULTRA       - Highest compression level but low speed
+			parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
+
+			//设置压缩文件加密
+			parameters.setEncryptFiles(true);
+
+			//设置加密方法
+			parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
+
+			//设置aes加密强度
+			parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
+
+			//设置密码
+			parameters.setPassword(pas);
+
+			//添加文件到压缩文件
+			zipFile.addFiles(files, parameters);
+		} catch (ZipException e) {
+			e.printStackTrace();
+		}
+	}
 }

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

@@ -5,6 +5,7 @@ import com.abi.qms.platform.dao.entity.QrPackage;
 import com.abi.qms.platform.dto.req.*;
 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 javax.servlet.http.HttpServletResponse;
 import java.io.File;
@@ -74,5 +75,10 @@ public interface QrPackageService {
 	 */
 	void sendEmailForQrPackageCreated(String targetEmail,String sapOrderNo,String filename,String password);
 
-
+	/**
+	 * 校验是否存在SAP订单号和物料重复数据
+	 * @param req
+	 * @return
+	 */
+	ValidSAPOrderNoAndMaterialRes validSAPOrderNoAndMaterial(ValidSAPOrderNoAndMaterialReq req);
 }

+ 1 - 1
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/FactoryServiceImpl.java

@@ -210,7 +210,7 @@ public class FactoryServiceImpl implements FactoryService {
             qrPackageQuery.eq("is_delete", 0);
             List<QrPackage> qrPackages = qrPackageMapper.selectList(qrPackageQuery);
             if(CollectionUtil.isNotEmpty(qrPackages)){
-                throw  new BusinessException("供应商" + factory.getFactoryName() + "已与码包" + qrPackages.get(0).getName()+ "绑定,请解绑后再停用。");
+                throw  new BusinessException("供应商" + factory.getFactoryName() + "已与码包" + qrPackages.get(0).getId()+ "绑定,请解绑后再停用。");
             }
 
             //2-修改状态

+ 222 - 222
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrDataServiceImpl.java

@@ -40,227 +40,227 @@ import java.util.List;
  */
 @Service
 @Slf4j
-public class QrDataServiceImpl implements QrDataService {
-
+public class QrDataServiceImpl {
+//
+////	@Autowired
+////	private MongoTemplate mongoTemplate;
+//
 //	@Autowired
-//	private MongoTemplate mongoTemplate;
-
-	@Autowired
-	private QrPackageMapper qrPackageMapper;
-
-	@Autowired
-	private QrRepertoryMapper qrRepertoryMapper;
-
-	@Autowired
-	private QrPackageService qrPackageService;
-
-	/**
-	 * 根据批次号查询码数量
-	 */
-	@Override
-	public long selectCountByBatchNumber(String batchNumber) {
-//		Query query = new Query();
-//		query.addCriteria(Criteria.where("batchNumber").is(batchNumber));
-//		return mongoTemplate.count(query, QrData.class);
-		return 0L;
-	}
-
-	/**
-	 * 根据批次号删除码
-	 */
-	@Override
-	public void deleteCodeByBatchNumber(String batchNumber) {
-//		Query query = new Query();
-//		query.addCriteria(Criteria.where("batchNumber").is(batchNumber));
-//		mongoTemplate.remove(query, QrData.class);
-	}
-
-	/**
-	 * 根据批次号查询码
-	 */
-	@Override
-	public List<QrData> selectCodeByBatch(String batchNumber) {
-//		Query query = new Query();
-//		query.addCriteria(Criteria.where("batchNumber").is(batchNumber));
-//		return mongoTemplate.find(query, QrData.class);
-		return null;
-	}
-
-	/**
-	 * 批量插入
-	 */
-	@Override
-	public void batchInsert(List<QrData> qrDataList) {
-//		mongoTemplate.insert(qrDataList, QrData.class);
-	}
-
-	/**
-	 * 导入码数据
-	 */
-	@Override
-	public void importQrData(ImportQrDataReq req) {
-		// 校验txt文件
-		MultipartFile file = req.getFile();
-		checkTxtFile(file);
-
-		// 查询码包
-		QrPackageVO qrPackageVo = qrPackageMapper.selectQrPackageDetailById(req.getQrPackageId());
-
-		List<QrData> qrDataList = new LinkedList<>();
-
-		// 从txt中提取码数据
-		txtToQrData(file, qrPackageVo, qrDataList);
-
-		try {
-			// 插入文本中的数据
-			insertImportData(qrPackageVo, qrDataList);
-
-			// 压缩文件
-			zipFile(file, qrPackageVo);
-
-			// 更改生成状态为已生成
-			QrPackage update = new QrPackage().setId(qrPackageVo.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_SUCCESS.getCode());
-			qrPackageMapper.updateById(update);
-
-		} catch (Exception e) {
-			log.error("导入码失败", e);
-			qrPackageService.failedRollback(new QrPackage().setId(qrPackageVo.getId()).setBatchNumber(qrPackageVo.getBatchNumber()));
-		}
-	}
-
-	/**
-	 * 压缩文件
-	 */
-	private void zipFile(MultipartFile file, QrPackageVO qrPackageVo) {
-		try {
-			File txtFile = File.createTempFile(qrPackageVo.getBatchNumber(), "txt");
-			file.transferTo(txtFile);
-			// 按照批次号.txt的方式重命名
-			txtFile = FileUtil.rename(txtFile, qrPackageVo.getBatchNumber() + ".txt", true, true);
-
-			// 压缩文件
-			File zipFile = ZipUtil.zip(txtFile);
-
-			// 删除生成的临时文件,上传阿里云,并更新码包的下载路径
-			qrPackageService.delFileAndUpdatePath(txtFile, zipFile, qrPackageVo.getId());
-		} catch (IOException e) {
-			log.error("IOException", e);
-			throw new BusinessException("压缩文件错误");
-		}
-	}
-
-	/**
-	 * 从txt中提取码数据
-	 * @param file txt文件
-	 * @param qrPackageVo 码包
-	 * @param qrDataList 码数据
-	 */
-	private void txtToQrData(MultipartFile file, QrPackageVO qrPackageVo, List<QrData> qrDataList) {
-		// 码库 & 码库的列
-		QrRepertoryVO qrRepertory = qrRepertoryMapper.selectQrRepertoryDetailById(qrPackageVo.getQrRepertoryId());
-		List<QrRepertoryColumnVO> qrRepertoryColumnList = qrRepertory.getQrRepertoryColumnList();
-
-		// 用于比较申请数量和txt中的数量是否一致
-		Long qrNumber = qrPackageVo.getQrNumber();
-		long txtCodeNumber = 0;
-
-		BufferedReader br = null;
-		try {
-			br = new BufferedReader(new InputStreamReader(file.getInputStream()));
-			LocalDateTime localDateTime = LocalDateTime.now();
-			String line = null;
-			while ((line = br.readLine()) != null) {
-				if (StringUtils.isBlank(line)) {
-					continue;
-				}
-
-				line = line.replace(",", ",");
-				// 跳过特殊字符
-				if (!line.matches("[0-9a-zA-Z\\.\\,\\:\\-/]*")) {
-					continue;
-				}
-
-				String[] codeArr = line.split(",");
-				// 验证导入的码列数是否与定义的码库列数一致
-				if (codeArr.length != qrRepertoryColumnList.size()) {
-					throw new BusinessException("导入文件的码列数与码库定义的码列数不一致,导入失败");
-				}
-
-				txtCodeNumber++;
-				QrData qrData = new QrData();
-				List<QrInnerData> qrInnerDataList = new LinkedList<>();
-
-				for (int i = 0; i < codeArr.length; i++) {
-					String urlCode = codeArr[i];
-					// 分离url与code
-					int urlIndex = urlCode.lastIndexOf("/") + 1;
-					QrInnerData qrInnerData = new QrInnerData();
-					qrInnerData.setUrl(urlCode.substring(0, urlIndex));
-					qrInnerData.setCode(urlCode.substring(urlIndex));
-					qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnList.get(i).getId());
-					qrInnerData.setSortNumber(i);
-
-					qrInnerDataList.add(qrInnerData);
-				}
-
-				qrData.setQrRepertoryId(qrRepertory.getId());
-				qrData.setBatchNumber(qrPackageVo.getBatchNumber());
-				qrData.setQrRepertoryType(qrRepertory.getType());
-				qrData.setInnerDataList(qrInnerDataList);
-				qrData.setCreateTime(localDateTime);
-
-				qrDataList.add(qrData);
-			}
-		} catch (IOException e) {
-			log.error("读取码文件出错", e);
-			throw new BusinessException("读取码文件出错");
-		} finally {
-			IoUtil.close(br);
-		}
-
-		if (qrNumber.longValue() != txtCodeNumber) {
-			throw new BusinessException("申请数量与导入数量不一致,无法导入");
-		}
-	}
-
-	/**
-	 * 校验txt文件
-	 * @param file
-	 */
-	private void checkTxtFile(MultipartFile file) {
-		if (file != null && file.getSize() > 0) {
-			String fileName = file.getOriginalFilename();
-			String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
-			if (!"txt".equals(suffix)) {
-				throw new BusinessException("上传文件格式不正确");
-			}
-		} else {
-			throw new BusinessException("上传文件为空");
-		}
-	}
-
-	/**
-	 * 插入文本中的数据
-	 * @param qrPackageVo 码包
-	 * @param qrDataList 码数据List
-	 */
-	private void insertImportData(QrPackageVO qrPackageVo, List<QrData> qrDataList) {
-		try {
-			List<QrData> batchInsertList = new ArrayList<>();
-			for (int i = 0; i < qrDataList.size(); i++) {
-				batchInsertList.add(qrDataList.get(i));
-				// 每5000个插入一次
-				if (i > 0 && i % GenerateCodeConsumer.ONCE_GENERATE_NUMBER == 0) {
-					batchInsert(batchInsertList);
-					batchInsertList.clear();
-				}
-			}
-			if (!batchInsertList.isEmpty()) {
-				batchInsert(batchInsertList);
-			}
-		} catch (Exception e) {
-			log.error("导入的码插入mongodb失败", e);
-			throw new BusinessException("导入的码重复或与系统中的码重复,导入失败");
-		}
-	}
+//	private QrPackageMapper qrPackageMapper;
+//
+//	@Autowired
+//	private QrRepertoryMapper qrRepertoryMapper;
+//
+//	@Autowired
+//	private QrPackageService qrPackageService;
+//
+//	/**
+//	 * 根据批次号查询码数量
+//	 */
+//	@Override
+//	public long selectCountByBatchNumber(String batchNumber) {
+////		Query query = new Query();
+////		query.addCriteria(Criteria.where("batchNumber").is(batchNumber));
+////		return mongoTemplate.count(query, QrData.class);
+//		return 0L;
+//	}
+//
+//	/**
+//	 * 根据批次号删除码
+//	 */
+//	@Override
+//	public void deleteCodeByBatchNumber(String batchNumber) {
+////		Query query = new Query();
+////		query.addCriteria(Criteria.where("batchNumber").is(batchNumber));
+////		mongoTemplate.remove(query, QrData.class);
+//	}
+//
+//	/**
+//	 * 根据批次号查询码
+//	 */
+//	@Override
+//	public List<QrData> selectCodeByBatch(String batchNumber) {
+////		Query query = new Query();
+////		query.addCriteria(Criteria.where("batchNumber").is(batchNumber));
+////		return mongoTemplate.find(query, QrData.class);
+//		return null;
+//	}
+//
+//	/**
+//	 * 批量插入
+//	 */
+//	@Override
+//	public void batchInsert(List<QrData> qrDataList) {
+////		mongoTemplate.insert(qrDataList, QrData.class);
+//	}
+//
+//	/**
+//	 * 导入码数据
+//	 */
+//	@Override
+//	public void importQrData(ImportQrDataReq req) {
+//		// 校验txt文件
+//		MultipartFile file = req.getFile();
+//		checkTxtFile(file);
+//
+//		// 查询码包
+//		QrPackageVO qrPackageVo = qrPackageMapper.selectQrPackageDetailById(req.getQrPackageId());
+//
+//		List<QrData> qrDataList = new LinkedList<>();
+//
+//		// 从txt中提取码数据
+//		txtToQrData(file, qrPackageVo, qrDataList);
+//
+//		try {
+//			// 插入文本中的数据
+//			insertImportData(qrPackageVo, qrDataList);
+//
+//			// 压缩文件
+//			zipFile(file, qrPackageVo);
+//
+//			// 更改生成状态为已生成
+//			QrPackage update = new QrPackage().setId(qrPackageVo.getId()).setGenerateStatus(QrPackageGenerateStatusEnum.GENERATE_SUCCESS.getCode());
+//			qrPackageMapper.updateById(update);
+//
+//		} catch (Exception e) {
+//			log.error("导入码失败", e);
+//			qrPackageService.failedRollback(new QrPackage().setId(qrPackageVo.getId()).setBatchNumber(qrPackageVo.getBatchNumber()));
+//		}
+//	}
+//
+//	/**
+//	 * 压缩文件
+//	 */
+//	private void zipFile(MultipartFile file, QrPackageVO qrPackageVo) {
+//		try {
+//			File txtFile = File.createTempFile(qrPackageVo.getBatchNumber(), "txt");
+//			file.transferTo(txtFile);
+//			// 按照批次号.txt的方式重命名
+//			txtFile = FileUtil.rename(txtFile, qrPackageVo.getBatchNumber() + ".txt", true, true);
+//
+//			// 压缩文件
+//			File zipFile = ZipUtil.zip(txtFile);
+//
+//			// 删除生成的临时文件,上传阿里云,并更新码包的下载路径
+//			qrPackageService.delFileAndUpdatePath(txtFile, zipFile, qrPackageVo.getId());
+//		} catch (IOException e) {
+//			log.error("IOException", e);
+//			throw new BusinessException("压缩文件错误");
+//		}
+//	}
+//
+//	/**
+//	 * 从txt中提取码数据
+//	 * @param file txt文件
+//	 * @param qrPackageVo 码包
+//	 * @param qrDataList 码数据
+//	 */
+//	private void txtToQrData(MultipartFile file, QrPackageVO qrPackageVo, List<QrData> qrDataList) {
+//		// 码库 & 码库的列
+//		QrRepertoryVO qrRepertory = qrRepertoryMapper.selectQrRepertoryDetailById(qrPackageVo.getQrRepertoryId());
+//		List<QrRepertoryColumnVO> qrRepertoryColumnList = qrRepertory.getQrRepertoryColumnList();
+//
+//		// 用于比较申请数量和txt中的数量是否一致
+//		Long qrNumber = qrPackageVo.getQrNumber();
+//		long txtCodeNumber = 0;
+//
+//		BufferedReader br = null;
+//		try {
+//			br = new BufferedReader(new InputStreamReader(file.getInputStream()));
+//			LocalDateTime localDateTime = LocalDateTime.now();
+//			String line = null;
+//			while ((line = br.readLine()) != null) {
+//				if (StringUtils.isBlank(line)) {
+//					continue;
+//				}
+//
+//				line = line.replace(",", ",");
+//				// 跳过特殊字符
+//				if (!line.matches("[0-9a-zA-Z\\.\\,\\:\\-/]*")) {
+//					continue;
+//				}
+//
+//				String[] codeArr = line.split(",");
+//				// 验证导入的码列数是否与定义的码库列数一致
+//				if (codeArr.length != qrRepertoryColumnList.size()) {
+//					throw new BusinessException("导入文件的码列数与码库定义的码列数不一致,导入失败");
+//				}
+//
+//				txtCodeNumber++;
+//				QrData qrData = new QrData();
+//				List<QrInnerData> qrInnerDataList = new LinkedList<>();
+//
+//				for (int i = 0; i < codeArr.length; i++) {
+//					String urlCode = codeArr[i];
+//					// 分离url与code
+//					int urlIndex = urlCode.lastIndexOf("/") + 1;
+//					QrInnerData qrInnerData = new QrInnerData();
+//					qrInnerData.setUrl(urlCode.substring(0, urlIndex));
+//					qrInnerData.setCode(urlCode.substring(urlIndex));
+//					qrInnerData.setQrRepertoryColumnId(qrRepertoryColumnList.get(i).getId());
+//					qrInnerData.setSortNumber(i);
+//
+//					qrInnerDataList.add(qrInnerData);
+//				}
+//
+//				qrData.setQrRepertoryId(qrRepertory.getId());
+//				qrData.setBatchNumber(qrPackageVo.getBatchNumber());
+//				qrData.setQrRepertoryType(qrRepertory.getType());
+//				qrData.setInnerDataList(qrInnerDataList);
+//				qrData.setCreateTime(localDateTime);
+//
+//				qrDataList.add(qrData);
+//			}
+//		} catch (IOException e) {
+//			log.error("读取码文件出错", e);
+//			throw new BusinessException("读取码文件出错");
+//		} finally {
+//			IoUtil.close(br);
+//		}
+//
+//		if (qrNumber.longValue() != txtCodeNumber) {
+//			throw new BusinessException("申请数量与导入数量不一致,无法导入");
+//		}
+//	}
+//
+//	/**
+//	 * 校验txt文件
+//	 * @param file
+//	 */
+//	private void checkTxtFile(MultipartFile file) {
+//		if (file != null && file.getSize() > 0) {
+//			String fileName = file.getOriginalFilename();
+//			String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+//			if (!"txt".equals(suffix)) {
+//				throw new BusinessException("上传文件格式不正确");
+//			}
+//		} else {
+//			throw new BusinessException("上传文件为空");
+//		}
+//	}
+//
+//	/**
+//	 * 插入文本中的数据
+//	 * @param qrPackageVo 码包
+//	 * @param qrDataList 码数据List
+//	 */
+//	private void insertImportData(QrPackageVO qrPackageVo, List<QrData> qrDataList) {
+//		try {
+//			List<QrData> batchInsertList = new ArrayList<>();
+//			for (int i = 0; i < qrDataList.size(); i++) {
+//				batchInsertList.add(qrDataList.get(i));
+//				// 每5000个插入一次
+//				if (i > 0 && i % GenerateCodeConsumer.ONCE_GENERATE_NUMBER == 0) {
+//					batchInsert(batchInsertList);
+//					batchInsertList.clear();
+//				}
+//			}
+//			if (!batchInsertList.isEmpty()) {
+//				batchInsert(batchInsertList);
+//			}
+//		} catch (Exception e) {
+//			log.error("导入的码插入mongodb失败", e);
+//			throw new BusinessException("导入的码重复或与系统中的码重复,导入失败");
+//		}
+//	}
 }

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

@@ -1,28 +1,36 @@
 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 cn.hutool.json.JSONUtil;
 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.QrPackageBatchMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageDownloadRecordMapper;
 import com.abi.qms.platform.dao.mapper.QrPackageMapper;
-import com.abi.qms.platform.dao.mapper.QrRepertoryMapper;
 import com.abi.qms.platform.dao.vo.result.QrPackageVO;
 import com.abi.qms.platform.dto.req.*;
 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 freemarker.template.Template;
@@ -30,7 +38,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.redisson.misc.Hash;
 import org.springframework.amqp.core.AmqpTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
@@ -38,8 +45,11 @@ 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.util.stream.Collectors;
 import java.util.Map;
 
 /**
@@ -58,12 +68,15 @@ public class QrPackageServiceImpl implements QrPackageService {
 	@Autowired
 	private AmqpTemplate amqpTemplate;
 
-	@Autowired
-	private QrDataService qrDataService;
+//	@Autowired
+//	private QrDataService qrDataService;
 
 	@Autowired
 	private QrPackageDownloadRecordMapper qrPackageDownloadRecordMapper;
 
+	@Autowired
+	private QrPackageBatchMapper qrPackageBatchMapper;
+
 	@Autowired
 	private SendmailUtil sendmailUtil;
 
@@ -85,22 +98,52 @@ public class QrPackageServiceImpl implements QrPackageService {
 				throw new BusinessException("码包不可编辑");
 			}
 		}
-
-		// 码包名称不可重复
-		QueryWrapper<QrPackage> qrPackageQw = new QueryWrapper<>();
-		qrPackageQw.eq("name", req.getName());
-		qrPackageQw.eq("is_delete", 0);
-		if (qrPackageId != null) {
-			qrPackageQw.ne("id", qrPackageId);
+		//如果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 + "重复,若仍需申请需要提交额外码包申请原因");
+					}
+				}
+			}
 		}
-		Integer count = qrPackageMapper.selectCount(qrPackageQw);
-		if (!count.equals(0)) {
-			throw new BusinessException("码包名称已存在");
+
+		if(CollectionUtil.isNotEmpty(req.getPackageBatchBeanList())){
+			//同一个码包内,不同批次的批次号不一样
+			List<SaveQrPackageReq.PackageBatchBean> packageBatchBeanList = req.getPackageBatchBeanList();
+			//聚合批次号
+			List<String> batchNumberList = packageBatchBeanList.stream().map(SaveQrPackageReq.PackageBatchBean::getBatchNumber).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);
@@ -108,11 +151,72 @@ public class QrPackageServiceImpl implements QrPackageService {
 			// 修改时,需要重置码包的状态为待审核
 			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.setBatchNumber(IdWorker.getIdStr());
 			qrPackage.setCreateBy(userId);
 			int insert = qrPackageMapper.insert(qrPackage);
-			System.out.println(insert);
+			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);
+				}
+			}
 		}
 
 	}
@@ -124,7 +228,7 @@ public class QrPackageServiceImpl implements QrPackageService {
 	public ListQrPackageRes listQrPackage(ListQrPackageReq req) {
 		//数据权限隔离,如果登录账号是包材厂,只能看账号包材厂的数据。否则看全部
 		if(UserUtil.getUser().getFactoryId() != null){
-			req.setFactoryId(UserUtil.getUser().getFactoryId());
+			req.setFactoryCoverId(UserUtil.getUser().getFactoryId());
 		}
 
 		// 分页查询
@@ -234,7 +338,7 @@ public class QrPackageServiceImpl implements QrPackageService {
 			in = new BufferedInputStream(new FileInputStream(new File("E:\\firefox_download\\202104161027287567357.zip")));
 			out = new BufferedOutputStream(response.getOutputStream());
 
-			String fileName = qrPackage.getBatchNumber() + ".zip";
+			String fileName = qrPackage.getSapOrderNo() + ".zip";
 			response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"utf-8"));
 
 			byte [] b = new byte[1024];
@@ -281,14 +385,24 @@ public class QrPackageServiceImpl implements QrPackageService {
 	 */
 	@Override
 	public void failedRollback(QrPackage qrPackage) {
-		// 删除本次生成的码
-		qrDataService.deleteCodeByBatchNumber(qrPackage.getBatchNumber());
-
 		// 更改生成状态为生成失败
 		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

+ 34 - 16
abi-cloud-qr-platform-server/src/main/resources/dao/mapper/QrPackageMapper.xml

@@ -7,11 +7,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="com.abi.qms.platform.dao.vo.result.QrPackageVO" id="QrPackageResult">
         <result property="id" column="id"/>
         <result property="materialId" column="material_id"/>
-        <result property="factoryId" column="factory_id"/>
+        <result property="factoryCoverId" column="factory_cover_id"/>
+        <result property="factoryBeerId" column="factory_beer_id"/>
+        <result property="standbyRatio" column="standby_ratio"/>
+        <result property="reasonApply" column="reason_apply"/>
         <result property="boxCodeFormatId" column="box_code_format_id"/>
         <result property="sapOrderNo" column="sap_order_no"/>
-        <result property="batchNumber" column="batch_number"/>
-        <result property="name" column="name"/>
         <result property="qrNumber" column="qr_number"/>
         <result property="applyStatus" column="apply_status"/>
         <result property="generateStatus" column="generate_status"/>
@@ -21,8 +22,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createBy" column="create_by"/>
         <result property="updateTime" column="update_time"/>
         <result property="updateBy" column="update_by"/>
-        <!-- 部门 -->
-        <result property="factoryName" column="factory_name"/>
+        <!-- 包材厂 -->
+        <result property="factoryCoverName" column="factory_cover_name"/>
+        <!-- 啤酒厂 -->
+        <result property="factoryBeerName" column="factory_beer_name"/>
         <!-- 码库 -->
         <result property="qrRepertoryId" column="qr_Repertory_id"/>
         <result property="qrRepertoryName" column="qr_repertory_name"/>
@@ -32,16 +35,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <result property="createTime" column="download_time"/>
             <result property="createByName" column="download_user_name"/>
         </collection>
+
+        <!-- 码包批次列表 -->
+        <collection property="qrPackageBatchVOList" javaType="java.util.List" ofType="com.abi.qms.platform.dao.vo.result.QrPackageBatchVO">
+            <result property="id" column="batch_id"/>
+            <result property="packageId" column="package_id"/>
+            <result property="batchNumber" column="batch_number"/>
+            <result property="batchQrNumber" column="batch_qr_number"/>
+        </collection>
     </resultMap>
 
     <select id="listQrPackage" resultType="com.abi.qms.platform.dao.vo.result.QrPackageVO">
         SELECT
             qp.id,
             qp.material_id,
-            qp.factory_id,
+            qp.factory_cover_id,
             qp.box_code_format_id,
             qp.sap_order_no,
-            qp.name,
             qp.qr_number,
             qp.apply_status,
             qp.is_download,
@@ -55,7 +65,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             qr_package qp
         LEFT JOIN qr_box_code_format bcf ON qp.box_code_format_id = bcf.id
         LEFT JOIN base_material bm ON qp.material_id = bm.id
-        LEFT JOIN base_factory bf ON qp.factory_id = bf.id
+        LEFT JOIN base_factory bf ON qp.factory_cover_id = bf.id
         LEFT JOIN user_info ui ON qp.create_by = ui.id
         <where>
             qp.is_delete = 0
@@ -68,8 +78,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="param.sapOrderNo != null and param.sapOrderNo != ''">
                 AND qp.sap_order_no like concat('%',#{param.sapOrderNo},'%')
             </if>
-            <if test="param.factoryId != null">
-                AND qp.factory_id = #{param.factoryId}
+            <if test="param.factoryCoverId != null">
+                AND qp.factory_cover_id = #{param.factoryCoverId}
             </if>
             <if test="param.applyStatus != null">
                 AND qp.apply_status = #{param.applyStatus}
@@ -81,11 +91,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             qp.id,
             qp.material_id,
-            qp.factory_id,
+            qp.factory_cover_id,
+            qp.factory_beer_id,
+            qp.standby_ratio,
+            qp.reason_apply,
             qp.box_code_format_id,
             qp.sap_order_no,
-            qp.batch_number,
-            qp.name,
             qp.qr_number,
             qp.apply_status,
             qp.generate_status,
@@ -96,19 +107,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             qp.update_time,
             qp.update_by,
             bm.material_name,
-            bf.factory_name,
+            bfc.factory_name as factory_cover_name,
+            bfb.factory_name as factory_beer_name,
             qr.id AS qr_Repertory_id,
             qr.name AS qr_repertory_name,
             qr.type AS qr_repertory_type,
             qpdr.create_time AS download_time,
-            ui.user_name AS download_user_name
+            ui.user_name AS download_user_name,
+            qpb.id as batch_id,
+            qpb.package_id,
+            qpb.batch_number,
+            qpb.batch_qr_number
         FROM
             qr_package qp
         LEFT JOIN qr_box_code_format bcf ON qp.box_code_format_id = bcf.id
         LEFT JOIN qr_repertory qr ON bcf.qr_repertory_id = qr.id
         LEFT JOIN base_material bm ON qp.material_id = bm.id
-        LEFT JOIN base_factory bf ON qp.factory_id = bf.id
+        LEFT JOIN base_factory bfc ON qp.factory_cover_id = bfc.id
+        LEFT JOIN base_factory bfb ON qp.factory_beer_id = bfb.id
         LEFT JOIN qr_package_download_record qpdr ON qpdr.qr_package_id = qp.id
+        LEFT JOIN qr_package_batch qpb ON qpb.package_id = qp.id
         LEFT JOIN user_info ui ON ui.id = qpdr.create_by
         WHERE qp.id = #{id}
     </select>

+ 4 - 4
abi-cloud-qr-platform-server/src/main/resources/dao/mapper/QrRepertoryMapper.xml

@@ -35,8 +35,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 码包 -->
     <resultMap id="QrPackageResult" type="com.abi.qms.platform.dao.vo.result.QrPackageVO">
-        <result property="batchNumber" column="batch_number"/>
-        <result property="name" column="qr_package_name"/>
+<!--        <result property="batchNumber" column="batch_number"/>-->
+<!--        <result property="name" column="qr_package_name"/>-->
         <result property="qrNumber" column="qr_number"/>
         <result property="createTime" column="qr_package_create_time"/>
         <result property="createByName" column="qr_package_create_by_name"/>
@@ -140,8 +140,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             qrc.remark,
             qf.code_variable_build_class,
             bd.dept_url,
-            qp.batch_number,
-            qp.name AS qr_package_name,
+<!--            qp.batch_number,-->
+<!--            qp.name AS qr_package_name,-->
             qp.qr_number,
             qp.create_time AS qr_package_create_time,
             ui.user_name AS qr_package_create_by_name