Browse Source

箱码合一文件上传逻辑修改
活动列表查询bug修改

tanzhongran 3 years ago
parent
commit
41c45c323a
15 changed files with 493 additions and 114 deletions
  1. 100 16
      abi-cloud-qr-platform-common/src/main/java/com/abi/task/common/tablestore/TableStorePlusUtils.java
  2. 87 28
      abi-cloud-qr-platform-common/src/main/java/com/abi/task/common/tablestore/TableStoreUtils.java
  3. 1 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrBoxCodeUnityController.java
  4. 6 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/tablestore/entity/QrCode.java
  5. 6 2
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/config/RabbitmqConfig.java
  6. 53 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/mq/TableStoreBatchUpdateConsumer.java
  7. 81 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/util/AsyncTableStoreUtil.java
  8. 3 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrBoxMappingService.java
  9. 0 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrPackageService.java
  10. 5 18
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/GenerateCodeServiceImpl.java
  11. 69 26
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrBoxMappingServiceImpl.java
  12. 18 14
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrPackageServiceImpl.java
  13. 5 4
      abi-cloud-qr-platform-server/src/main/resources/dao/mapper/BaseActiveMapper.xml
  14. 0 1
      abi-cloud-qr-platform-server/src/test/java/com/abi/qms/platform/EncryptionTest.java
  15. 59 2
      abi-cloud-qr-platform-server/src/test/java/com/abi/qms/platform/TableStorePlusTest.java

+ 100 - 16
abi-cloud-qr-platform-common/src/main/java/com/abi/task/common/tablestore/TableStorePlusUtils.java

@@ -114,22 +114,8 @@ public class TableStorePlusUtils {
                         continue;
                     }
                     //放入table的column
-                    Column column = null;
-                    if (fieldValue instanceof String) {
-                        column = new Column(underlineFieldName, ColumnValue.fromString(String.valueOf(fieldValue)));
-                    } else if (fieldValue instanceof Integer) {
-                        column = new Column(underlineFieldName, ColumnValue.fromLong(Long.valueOf((Integer) fieldValue)));
-                    } else if (fieldValue instanceof Long) {
-                        column = new Column(underlineFieldName, ColumnValue.fromLong((Long) fieldValue));
-                    } else if (fieldValue instanceof Double) {
-                        column = new Column(underlineFieldName, ColumnValue.fromDouble((Double) fieldValue));
-                    } else if (fieldValue instanceof Boolean) {
-                        column = new Column(underlineFieldName, ColumnValue.fromBoolean((Boolean) fieldValue));
-                    } else if (fieldValue instanceof Date) {
-                        column = new Column(underlineFieldName, ColumnValue.fromString(DateUtil.format((Date) fieldValue, "yyyy-MM-dd HH:mm:ss")));
-                    } else if (fieldValue instanceof LocalDateTime) {
-                        column = new Column(underlineFieldName, ColumnValue.fromString(DateUtil.format((LocalDateTime) fieldValue, "yyyy-MM-dd HH:mm:ss")));
-                    } else {
+                    Column column = buildColumn(fieldValue,underlineFieldName);
+                    if(column==null){
                         log.info("不识别的字段类型 fieldName=" + fieldName);
                         continue;
                     }
@@ -153,6 +139,104 @@ public class TableStorePlusUtils {
         }
     }
 
+    /**
+     * 修改多行数据(如果主键key相同,则覆盖)
+     *
+     * @param entityList
+     */
+    public <T> void updateRow(List<T> entityList,String updateColumnFieldName) {
+        if (CollectionUtil.isEmpty(entityList)) {
+            return;
+        }
+        try {
+            String primaryKeyName = null;
+            String tableName = null;
+            List<String> pkValueList = new ArrayList<>();
+            List<List<Column>> columnsList = new ArrayList<>();
+
+            for (T entity : entityList) {
+                List<Column> columns = new ArrayList<>();
+                //1-准备参数
+                //表名
+                TableStore tableStore = entity.getClass().getAnnotation(TableStore.class);
+                if (ObjectUtils.isEmpty(tableStore)){
+                    continue;
+                }
+                tableName = tableStore.tableName();
+                if (StringUtils.isBlank(tableName)) {
+                    throw new BusinessException(ErrorCodeEnum.ERROR_PARAM.getCode(), "存储表名为空");
+                }
+                //主键
+                primaryKeyName = tableStore.primaryKeyName();
+                if (StringUtils.isBlank(primaryKeyName)) {
+                    throw new BusinessException(ErrorCodeEnum.ERROR_PARAM.getCode(), "存储主键为空");
+                }
+                //主键的驼峰转下划线
+                primaryKeyName = IStringUtil.camelToUnderline(primaryKeyName);
+
+                //2-主键值
+                String fieldName = IStringUtil.underlineToCamel(primaryKeyName);
+                //获取method
+                Method method = getMethod(entity.getClass(),fieldName);
+                if (method == null) {
+                    throw new BusinessException("get方法不存在");
+                }
+                //反射调用拿到结果
+                Object fieldValue = method.invoke(entity);
+                String primaryKeyVal = (String) fieldValue;
+
+                //3-更新字段
+                //获取method
+                method = getMethod(entity.getClass(),updateColumnFieldName);
+                if (method == null) {
+                    throw new BusinessException("get方法不存在");
+                }
+                //反射调用拿到结果
+                fieldValue = method.invoke(entity);
+                //更新字段转下划线
+                String underlineFieldName = IStringUtil.camelToUnderline(updateColumnFieldName);
+                //修改的值-->放入table的column
+                Column column = buildColumn(fieldValue,underlineFieldName);
+                if(column==null){
+                    log.info("不识别的字段类型 fieldName=" + fieldName);
+                    continue;
+                }
+                columns.add(column);
+
+                //放入调用入参
+                pkValueList.add(primaryKeyVal);
+                columnsList.add(columns);
+            }
+
+            //真实去调用
+            tableStoreUtils.batchUpdateRow(primaryKeyName, pkValueList, tableName, columnsList);
+
+        } catch (Exception e) {
+            log.warn("setRow error", e);
+            throw new BusinessException("存储table异常");
+        }
+    }
+
+    private Column buildColumn(Object fieldValue,String underlineFieldName){
+        Column column = null;
+        if (fieldValue instanceof String) {
+            column = new Column(underlineFieldName, ColumnValue.fromString(String.valueOf(fieldValue)));
+        } else if (fieldValue instanceof Integer) {
+            column = new Column(underlineFieldName, ColumnValue.fromLong(Long.valueOf((Integer) fieldValue)));
+        } else if (fieldValue instanceof Long) {
+            column = new Column(underlineFieldName, ColumnValue.fromLong((Long) fieldValue));
+        } else if (fieldValue instanceof Double) {
+            column = new Column(underlineFieldName, ColumnValue.fromDouble((Double) fieldValue));
+        } else if (fieldValue instanceof Boolean) {
+            column = new Column(underlineFieldName, ColumnValue.fromBoolean((Boolean) fieldValue));
+        } else if (fieldValue instanceof Date) {
+            column = new Column(underlineFieldName, ColumnValue.fromString(DateUtil.format((Date) fieldValue, "yyyy-MM-dd HH:mm:ss")));
+        } else if (fieldValue instanceof LocalDateTime) {
+            column = new Column(underlineFieldName, ColumnValue.fromString(DateUtil.format((LocalDateTime) fieldValue, "yyyy-MM-dd HH:mm:ss")));
+        }
+        return column;
+    }
+
     /**
      * 反射拿到method(带缓存)
      * @param clz

+ 87 - 28
abi-cloud-qr-platform-common/src/main/java/com/abi/task/common/tablestore/TableStoreUtils.java

@@ -60,8 +60,6 @@ public class TableStoreUtils {
         taskExecutor.initialize();
     }
 
-
-
     /**
      * 创建数据表
      *
@@ -104,6 +102,13 @@ public class TableStoreUtils {
         client.putRow(new PutRowRequest(rowPutChange));
     }
 
+    /**
+     * 批量插入行
+     * @param primaryKeyName
+     * @param pkValueList
+     * @param tableName
+     * @param columnsList
+     */
     public void batchPutRow(String primaryKeyName, List<String> pkValueList, String tableName, List<List<Column>> columnsList) {
         if (CollectionUtil.isEmpty(pkValueList)) {
             throw new BusinessException(ErrorCodeEnum.ERROR_PARAM.getCode(), "主键内容为空");
@@ -117,32 +122,6 @@ public class TableStoreUtils {
 
         doBatchPutRow(primaryKeyName,pkValueList,tableName,columnsList);
 
-//        //<=最大传输数量直接执行
-//        if(CollectionUtil.isEmpty(pkValueList) && pkValueList.size()<=MAX_COUNT_ONCE){
-//            doBatchPutRow(primaryKeyName,pkValueList,tableName,columnsList);
-//            return;
-//        }
-//
-//        //拆成多个list,按核数去拆(200一个list)
-//        List<List<String>> pkValuePartitionList = ListUtils.partition(pkValueList, MAX_COUNT_ONCE);
-//        List<List<List<Column>>> columnsPartitionList = ListUtils.partition(columnsList, MAX_COUNT_ONCE);
-//
-//        log.info("batchPutRow 拆分任务数:"+pkValuePartitionList.size());
-//
-//        //丢给执行器去多线程执行
-//        for(int i=0;i<pkValuePartitionList.size();i++){
-//            final int num = i;
-//            List<String> tempPkList = pkValuePartitionList.get(i);
-//            List<List<Column>> tempColumnsList = columnsPartitionList.get(i);
-//            taskExecutor.execute(()->{
-//                long begin = System.currentTimeMillis();
-//                log.info("第"+num+"个任务开始");
-//                doBatchPutRow(primaryKeyName,tempPkList,tableName,tempColumnsList);
-//                long end = System.currentTimeMillis();
-//                log.info("第"+num+"个任务结束,耗时"+(end-begin));
-//
-//            });
-//        }
     }
 
     /**
@@ -180,6 +159,86 @@ public class TableStoreUtils {
         }
     }
 
+    /**
+     * 批量修改
+     * @param primaryKeyName
+     * @param pkValueList
+     * @param tableName
+     * @param columnsList
+     */
+    public void batchUpdateRow(String primaryKeyName, List<String> pkValueList, String tableName, List<List<Column>> columnsList) {
+        if (CollectionUtil.isEmpty(pkValueList)) {
+            throw new BusinessException(ErrorCodeEnum.ERROR_PARAM.getCode(), "主键内容为空");
+        }
+        if (CollectionUtil.isEmpty(columnsList)) {
+            throw new BusinessException(ErrorCodeEnum.ERROR_PARAM.getCode(), "字段列表为空");
+        }
+        if (pkValueList.size() != columnsList.size()) {
+            throw new BusinessException(ErrorCodeEnum.ERROR_PARAM.getCode(), "主键与字段数量不匹配");
+        }
+
+        doBatchUpdateRow(primaryKeyName,pkValueList,tableName,columnsList);
+
+    }
+
+    /**
+     * 干活的批量修改
+     * @param primaryKeyName
+     * @param pkValueList
+     * @param tableName
+     * @param columnsList
+     */
+    public void doBatchUpdateRow(String primaryKeyName, List<String> pkValueList, String tableName, List<List<Column>> columnsList) {
+        long begin = System.currentTimeMillis();
+
+        BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
+        //构造rowPutChange
+        for (int i = 0; i < pkValueList.size(); i++) {
+            RowUpdateChange rowUpdateChange = buildRowUpdateChange(primaryKeyName, pkValueList.get(i), tableName, columnsList.get(i));
+            //添加到batch操作中。
+            batchWriteRowRequest.addRowChange(rowUpdateChange);
+        }
+        BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
+
+        long end = System.currentTimeMillis();
+
+        log.info("是否全部成功:{} ,耗时{}毫秒", response.isAllSucceed(),end-begin);
+        if (!response.isAllSucceed()) {
+            for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
+                log.warn("失败的行:{}", batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
+                log.warn("失败原因:{}", rowResult.getError());
+            }
+            /**
+             * 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试。此处只给出构造重试请求的部分。
+             * 推荐的重试方法是使用SDK的自定义重试策略功能,支持对batch操作的部分行错误进行重试。设置重试策略后,调用接口处无需增加重试代码。
+             */
+            batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
+        }
+    }
+
+    /**
+     * 构造update的change
+     * @param primaryKeyName
+     * @param pkValue
+     * @param tableName
+     * @param columns
+     * @return
+     */
+    private RowUpdateChange buildRowUpdateChange(String primaryKeyName, String pkValue, String tableName, List<Column> columns) {
+        //构造主键。
+        PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
+        //设置主键名称和主键值
+        primaryKeyBuilder.addPrimaryKeyColumn(primaryKeyName, PrimaryKeyValue.fromString(pkValue));
+        PrimaryKey primaryKey = primaryKeyBuilder.build();
+        //设置数据表名称。
+        RowUpdateChange rowUpdateChange = new RowUpdateChange(tableName, primaryKey);
+
+        //添加属性列
+        rowUpdateChange.put(columns);
+
+        return rowUpdateChange;
+    }
+
     /**
      * 单行读取一行数据
      *

+ 1 - 1
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrBoxCodeUnityController.java

@@ -44,7 +44,7 @@ public class QrBoxCodeUnityController {
     @PostMapping("/generateBarCode")
     public BaseResponse<String> generateBarCode(@RequestBody GenerateBarCodeReq generateBarCodeReq) {
 
-        String boxCode = qrBoxMappingService.generateBarCode(generateBarCodeReq);
+        String boxCode = qrBoxMappingService.addQrBoxMappingByFirstAndLast(generateBarCodeReq);
         return BaseResponse.create(boxCode);
     }
 

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

@@ -34,6 +34,11 @@ public class QrCode implements TableStoreEntity, Serializable {
      */
     private Long batchNumberId;
 
+    /**
+     * 箱码合一文件id
+     */
+    private Long qrBoxMappingId;
+
     /**
      * 创建时间
      */
@@ -54,4 +59,5 @@ public class QrCode implements TableStoreEntity, Serializable {
      * 是否作废 0-未作废 1-已作废
      */
     private Integer invalid;
+
 }

+ 6 - 2
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/config/RabbitmqConfig.java

@@ -1,6 +1,7 @@
 package com.abi.qms.platform.infrastructure.config;
 
 import com.abi.qms.platform.infrastructure.mq.TableStoreBatchInsertConsumer;
+import com.abi.qms.platform.infrastructure.mq.TableStoreBatchUpdateConsumer;
 import org.springframework.amqp.core.Queue;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -14,11 +15,14 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class RabbitmqConfig {
 
-	@Bean
+	@Bean(name = "qms_table_store_queue")
 	public Queue declareTableBatchInsertQueue() {
 		return new Queue(TableStoreBatchInsertConsumer.TABLE_STORE_BATCH_INSERT_QUEUE);
 	}
 
-
+	@Bean(name = "qms_table_store_box_mapping_queue")
+	public Queue declareTableBatchUpdateQueue() {
+		return new Queue(TableStoreBatchUpdateConsumer.TABLE_STORE_BATCH_UPDATE_QUEUE);
+	}
 
 }

+ 53 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/mq/TableStoreBatchUpdateConsumer.java

@@ -0,0 +1,53 @@
+package com.abi.qms.platform.infrastructure.mq;
+
+import cn.hutool.json.JSONUtil;
+import com.abi.ootb.core.utils.JsonUtils;
+import com.abi.qms.platform.dao.tablestore.entity.QrCode;
+import com.abi.qms.platform.infrastructure.util.AsyncTableStoreUtil;
+import com.abi.task.common.tablestore.TableStorePlusUtils;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @className: com.abi.qms.platform.infrastructure.mq-> TableStoreBatchInsertConsumer
+ * @description: tableStore batchInsert
+ * @author: Marko.W
+ * @createDate: 2021-06-16 10:39
+ * @version: 1.0
+ * @todo:
+ */
+@Slf4j
+@Component
+public class TableStoreBatchUpdateConsumer {
+
+    public static final String TABLE_STORE_BATCH_UPDATE_QUEUE = "qms_table_store_box_mapping_queue";
+
+    @Autowired
+    private TableStorePlusUtils tableStorePlusUtils;
+
+    @RabbitHandler
+    @SneakyThrows
+    @RabbitListener(queues = TABLE_STORE_BATCH_UPDATE_QUEUE,ackMode = "AUTO",concurrency = "10-50")
+    public void onMessage(Message message){
+        try {
+            String messageInfo = new String(message.getBody(), "utf-8");
+            updateRows(messageInfo);
+        } catch (Exception e) {
+            log.warn("保存码到TableStore异常:{}", e);
+            //fixme 这里还要处理失败的请求
+        }
+    }
+
+    private void updateRows(String messageInfo) {
+        AsyncTableStoreUtil.UpdateRowBean updateRowBean = JsonUtils.parse(messageInfo, AsyncTableStoreUtil.UpdateRowBean.class);
+        tableStorePlusUtils.updateRow(updateRowBean.getEntityList(),updateRowBean.getUpdateColumnFieldName());
+    }
+
+}

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

@@ -0,0 +1,81 @@
+package com.abi.qms.platform.infrastructure.util;
+
+import com.abi.qms.platform.dao.tablestore.entity.QrCode;
+import com.abi.qms.platform.infrastructure.mq.TableStoreBatchInsertConsumer;
+import com.abi.qms.platform.infrastructure.mq.TableStoreBatchUpdateConsumer;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 异步写入tablestore工具类
+ * @author AndytTan
+ */
+@Component
+public class AsyncTableStoreUtil {
+
+    @Autowired
+    private AmqpTemplate amqpTemplate;
+
+    /**
+     * 批量新增tableStore,码表
+     */
+    public <T>  void mqPutRow(List<QrCode> entityList) {
+        // 开始多线程写tableStore
+        int repeatTimes = entityList.size() / 200;
+        int leftover = entityList.size() % 200;
+        for (int i = 0; i < repeatTimes+1; i++) {
+            if (i == repeatTimes){
+                amqpTemplate.convertAndSend(TableStoreBatchInsertConsumer.TABLE_STORE_BATCH_INSERT_QUEUE, entityList.subList(i*200,i*200+leftover));
+                continue;
+            }
+            amqpTemplate.convertAndSend(TableStoreBatchInsertConsumer.TABLE_STORE_BATCH_INSERT_QUEUE, entityList.subList(i*200,i*200+200));
+        }
+    }
+
+    /**
+     * 批量异步更新tablestore,码表
+     * @param entityList
+     * @param updateColumnFieldName
+     * @param <T>
+     */
+    public <T>  void mqUpdateRow(List<QrCode> entityList,String updateColumnFieldName) {
+        // 开始多线程写tableStore
+        int repeatTimes = entityList.size() / 200;
+        int leftover = entityList.size() % 200;
+        for (int i = 0; i < repeatTimes+1; i++) {
+            if (i == repeatTimes){
+                UpdateRowBean updateRowBean = new UpdateRowBean();
+                updateRowBean.setEntityList(entityList.subList(i*200,i*200+leftover));
+                updateRowBean.setUpdateColumnFieldName(updateColumnFieldName);
+
+                amqpTemplate.convertAndSend(TableStoreBatchUpdateConsumer.TABLE_STORE_BATCH_UPDATE_QUEUE, updateRowBean);
+                continue;
+            }
+
+            UpdateRowBean updateRowBean = new UpdateRowBean();
+            updateRowBean.setEntityList(entityList.subList(i*200,i*200+200));
+            updateRowBean.setUpdateColumnFieldName(updateColumnFieldName);
+            amqpTemplate.convertAndSend(TableStoreBatchUpdateConsumer.TABLE_STORE_BATCH_UPDATE_QUEUE, updateRowBean);
+        }
+    }
+
+    /**
+    * 更新行对象
+    */
+    @Data
+    public static class UpdateRowBean implements Serializable {
+        private List<QrCode> entityList;
+        private String updateColumnFieldName;
+    }
+
+}

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

@@ -25,7 +25,9 @@ public interface QrBoxMappingService {
      *
      * @param generateBarCodeReq
      */
-    String generateBarCode(GenerateBarCodeReq generateBarCodeReq);
+    String addQrBoxMappingByFirstAndLast(GenerateBarCodeReq generateBarCodeReq);
+
+    String addQrBoxMappingByFileUpload(List<String> codeList,Long packageId);
 
     /**
      * 分页查询箱码合一

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

@@ -101,7 +101,6 @@ public interface QrPackageService {
      */
     GetQrSingleCheckDetailRes getQrSingleCheckDetail(GetQrSingleCheckDetailCodeReq getQrSingleCheckDetailCodeReq);
 
-
     /**
      * 作废码包
      *

+ 5 - 18
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/GenerateCodeServiceImpl.java

@@ -14,6 +14,7 @@ import com.abi.qms.platform.feign.BasicServiceClient;
 import com.abi.qms.platform.infrastructure.mq.TableStoreBatchInsertConsumer;
 import com.abi.qms.platform.infrastructure.qr.build.parent.SerialBuildCode;
 import com.abi.qms.platform.infrastructure.util.AesEncodeUtil;
+import com.abi.qms.platform.infrastructure.util.AsyncTableStoreUtil;
 import com.abi.qms.platform.infrastructure.util.BuildCodeUtil;
 import com.abi.qms.platform.infrastructure.util.RandomCodeUtils;
 import com.abi.qms.platform.service.GenerateCodeService;
@@ -100,6 +101,9 @@ public class GenerateCodeServiceImpl implements GenerateCodeService {
     @Autowired
     private QrPackageBookingOrderService qrPackageBookingOrderService;
 
+    @Autowired
+    private AsyncTableStoreUtil asyncTableStoreUtil;
+
     @Value("${qms.encode.key}")
     private String encodeKey;
 
@@ -199,7 +203,7 @@ public class GenerateCodeServiceImpl implements GenerateCodeService {
                 log.info("6 loopGenerateCode transform tableStoreEntityList -->"+System.currentTimeMillis());
 
                 // table数据库  批量插入
-                saveTableStore(qrCodes);
+                asyncTableStoreUtil.mqPutRow(qrCodes);
                 // 累加数量
                 sum = sum + qrCodes.size();
                 log.info("7 loopGenerateCode save tablestore async -->"+System.currentTimeMillis());
@@ -361,23 +365,6 @@ public class GenerateCodeServiceImpl implements GenerateCodeService {
         return qrCodes;
     }
 
-    /**
-     * 批量新增tableStore,码表
-     */
-    private void saveTableStore(List<QrCode> qrCodes) {
-        // 开始多线程写tableStore
-        int repeatTimes = qrCodes.size() / 200;
-        int leftover = qrCodes.size() % 200;
-        for (int i = 0; i < repeatTimes+1; i++) {
-            if (i == repeatTimes){
-                amqpTemplate.convertAndSend(TableStoreBatchInsertConsumer.TABLE_STORE_BATCH_INSERT_QUEUE, qrCodes.subList(i*200,i*200+leftover));
-                continue;
-            }
-            amqpTemplate.convertAndSend(TableStoreBatchInsertConsumer.TABLE_STORE_BATCH_INSERT_QUEUE, qrCodes.subList(i*200,i*200+200));
-        }
-    }
-
-
     /**
      * qrRepertoryColumnList  码库的列
      * qrRepertoryId 码库id

+ 69 - 26
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrBoxMappingServiceImpl.java

@@ -12,6 +12,7 @@ import com.abi.qms.platform.dao.vo.result.*;
 import com.abi.qms.platform.dto.req.*;
 import com.abi.qms.platform.dto.res.*;
 import com.abi.qms.platform.infrastructure.util.AssertUtil;
+import com.abi.qms.platform.infrastructure.util.AsyncTableStoreUtil;
 import com.abi.qms.platform.infrastructure.util.PageUtil;
 import com.abi.qms.platform.infrastructure.util.UserUtil;
 import com.abi.qms.platform.service.QrBoxMappingService;
@@ -25,6 +26,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.google.common.collect.Maps;
+import com.sun.org.apache.bcel.internal.generic.NEW;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,8 +41,6 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
  * @author: fangxinjian
@@ -63,12 +63,20 @@ public class QrBoxMappingServiceImpl implements QrBoxMappingService {
     @Autowired
     private BaseFactoryMapper baseFactoryMapper;
 
+    @Autowired
+    private AsyncTableStoreUtil asyncTableStoreUtil;
+
     private static final String SUCCESS = "success";
 
     private static final String FAIL = "fail";
 
+    /**
+     * 生成箱码合一文件,罐码使用这个逻辑(用首位码段生成)
+     * @param req
+     * @return
+     */
     @Override
-    public String generateBarCode(GenerateBarCodeReq req) {
+    public String addQrBoxMappingByFirstAndLast(GenerateBarCodeReq req) {
 
         //获取登录用户信息
         UserInfo user = userUtil.getUser();
@@ -115,6 +123,55 @@ public class QrBoxMappingServiceImpl implements QrBoxMappingService {
 
     }
 
+    /**
+     * 生成箱码合一文件,盖码使用这个逻辑(每一个码都再tablestore记录箱码合一信息)
+     * @param codeList
+     * @return
+     */
+    @Override
+    public String addQrBoxMappingByFileUpload(List<String> codeList,Long packageId) {
+        //如果入参有问题则短路
+        if(CollectionUtils.isEmpty(codeList)){
+            throw new BusinessException("箱码合一的码数量为0");
+        }
+
+        //获取登录用户信息
+        UserInfo user = userUtil.getUser();
+
+        //1-构造持久化对象
+        QrBoxMapping qrBoxMapping = new QrBoxMapping();
+        qrBoxMapping.setBoxCode(String.valueOf(IdWorker.getId()));
+        qrBoxMapping.setIndexBegin(0L);
+        qrBoxMapping.setIndexEnd(0L);
+        qrBoxMapping.setBeginQrCode(codeList.get(0));
+        qrBoxMapping.setEndQrCode(codeList.get(codeList.size()-1));
+        qrBoxMapping.setQrCodeCount(Long.valueOf(codeList.size()));
+        qrBoxMapping.setActiveStatus(BoxMappingActiveStatusEnum.NOT_ACTIVE.getCode());
+        qrBoxMapping.setCreateUserName(user.getUserName());
+        qrBoxMapping.setCreateBy(user.getId());
+        qrBoxMapping.setPackageId(packageId);
+        qrBoxMapping.setInvalid(InvalidEnum.NOT_INVALID.getCode());
+        qrBoxMappingMapper.insert(qrBoxMapping);
+
+        //2-修改tablestore里面的码的箱码合一文件id
+        Integer max = 10000;
+        List<QrCode> qrCodeList = new ArrayList<>();
+        for(int i=0;i<codeList.size();i++){
+            QrCode qrCode = new QrCode();
+            qrCode.setCode(codeList.get(i));
+            qrCode.setQrBoxMappingId(qrBoxMapping.getId());
+            qrCodeList.add(qrCode);
+            //每一批满了 or 最后一批 就保存一下
+            if((i+1)%max==0 || i==codeList.size()-1){
+                asyncTableStoreUtil.mqUpdateRow(qrCodeList,"qrBoxMappingId");
+                qrCodeList.clear();
+            }
+        }
+
+        return qrBoxMapping.getBoxCode();
+    }
+
+
     @Override
     public ListQrBoxCodeMappingRes listQrBoxCodeMapping(ListQrBoxCodeMappingReq req) {
 
@@ -332,13 +389,12 @@ public class QrBoxMappingServiceImpl implements QrBoxMappingService {
         String filename = file.getName();
         String encryptCodeStr;
 
-        String first = null;
-        String last = null;
-
         try {
             inputStream = file.getInputStream();
             //解决服务器上乱码
             reader = new LineNumberReader(new InputStreamReader(inputStream, "UTF-8"));
+            //待修改的tablestore对象列表
+            List<String> codeList = new ArrayList<>();
 
             //1-逐行读取文件的码
             while ((encryptCodeStr = reader.readLine()) != null) {
@@ -346,30 +402,17 @@ public class QrBoxMappingServiceImpl implements QrBoxMappingService {
                 if (StringUtils.isBlank(encryptCodeStr)) {
                     continue;
                 }
-//                //判断有没有中文标题
-//                Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
-//                Matcher m = p.matcher(encryptCodeStr);
-                if (reader.getLineNumber()>2) {
-                    if (encryptCodeStr.contains(",")) {
-                        throw new BusinessException("码包文件格式错误,建议每行一个码!");
-                    }
-                    //截取 去掉uri
-                    encryptCodeStr = encryptCodeStr.substring(encryptCodeStr.lastIndexOf("/") + 1);
-
-                    if (StringUtils.isBlank(first)) {
-                        first = encryptCodeStr;
-                    }
-                    last = encryptCodeStr;
+                if (encryptCodeStr.contains(",")) {
+                    throw new BusinessException("码包文件格式错误,建议每行一个码!");
                 }
-
+                //截取 去掉uri
+                encryptCodeStr = encryptCodeStr.substring(encryptCodeStr.lastIndexOf("/") + 1);
+                //放入tablestore entity的主键code
+                codeList.add(encryptCodeStr);
             }
 
             //生成条形码
-            GenerateBarCodeReq req = new GenerateBarCodeReq();
-            req.setBeginQrCode(first);
-            req.setEndQrCode(last);
-            req.setPackageId(packageId);
-            generateBarCode(req);
+            addQrBoxMappingByFileUpload(codeList,packageId);
 
         } catch (BusinessException e) {
             throw e;

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

@@ -971,15 +971,15 @@ public class QrPackageServiceImpl implements QrPackageService {
         }
 
         //1-查询码关联激活信息单条数据
-        QrBoxMapping indexQrBoxCodeMappingOne = getPackeageActivation(qrCode);
+        QrBoxMapping qrBoxMapping = getPackeageActivation(qrCode);
 
         //存在激活关联信息
-        if (ObjectUtils.isNotEmpty(indexQrBoxCodeMappingOne)) {
-            qrSingleCheckVO.setBoxCode(indexQrBoxCodeMappingOne.getBoxCode());//条码序号
-            qrSingleCheckVO.setActiveTime(indexQrBoxCodeMappingOne.getActiveTime());//激活时间
-            qrSingleCheckVO.setActiveUserName(indexQrBoxCodeMappingOne.getActiveUserName());//激活人
-            qrSingleCheckVO.setActiveStatus(indexQrBoxCodeMappingOne.getActiveStatus());//激活状态
-            qrSingleCheckVO.setPackageActiveStatus(indexQrBoxCodeMappingOne.getActiveStatus());//赋值原始状态
+        if (ObjectUtils.isNotEmpty(qrBoxMapping)) {
+            qrSingleCheckVO.setBoxCode(qrBoxMapping.getBoxCode());//条码序号
+            qrSingleCheckVO.setActiveTime(qrBoxMapping.getActiveTime());//激活时间
+            qrSingleCheckVO.setActiveUserName(qrBoxMapping.getActiveUserName());//激活人
+            qrSingleCheckVO.setActiveStatus(qrBoxMapping.getActiveStatus());//激活状态
+            qrSingleCheckVO.setPackageActiveStatus(qrBoxMapping.getActiveStatus());//赋值原始状态
         }
 
         //满足废除条件
@@ -1147,19 +1147,23 @@ public class QrPackageServiceImpl implements QrPackageService {
         return false;
     }
 
-
     /**
      * 查询码关联激活信息单条数据
      * @param qrCode code对象
      * @return
      */
+    @Override
     public QrBoxMapping getPackeageActivation(QrCode qrCode) {
-
-        //查询码关联激活信息单条数据
-        QrOneBoxCodeMappingReq qrOneBoxCodeMappingReq = new QrOneBoxCodeMappingReq();
-        qrOneBoxCodeMappingReq.setPackageId(qrCode.getPackageId());
-        qrOneBoxCodeMappingReq.setQrIndex(qrCode.getCodeIndex());
-        QrBoxMapping qrBoxMapping = qrBoxMappingMapper.getIndexQrBoxCodeMappingOne(qrOneBoxCodeMappingReq);
+        QrBoxMapping qrBoxMapping = null;
+        if(qrCode.getQrBoxMappingId()!=null){
+            qrBoxMapping = qrBoxMappingMapper.selectById(qrCode.getQrBoxMappingId());
+        }else{
+            //查询码关联激活信息单条数据
+            QrOneBoxCodeMappingReq qrOneBoxCodeMappingReq = new QrOneBoxCodeMappingReq();
+            qrOneBoxCodeMappingReq.setPackageId(qrCode.getPackageId());
+            qrOneBoxCodeMappingReq.setQrIndex(qrCode.getCodeIndex());
+            qrBoxMapping = qrBoxMappingMapper.getIndexQrBoxCodeMappingOne(qrOneBoxCodeMappingReq);
+        }
 
         return qrBoxMapping;
     }

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

@@ -34,10 +34,11 @@
 
     <select id="listActivePage" resultType="com.abi.qms.platform.dao.vo.result.ListActiveVO">
         select ac.id, ac.active_name, ac.active_type, ac.audit_status,
-        ac.apply_time, ac.apply_user_name, ac.begin_time, ac.end_time,
-        ac.active_url, ac.valid, ac.is_modify_apply,
-        ac.url_tab,
-        ac.audit_status as apply_audit_status
+            ac.apply_time, ac.apply_user_name, ac.begin_time, ac.end_time,
+            ac.active_url, ac.valid, ac.is_modify_apply,
+            ac.url_tab,
+            ap.audit_status as apply_audit_status
+
         from base_active ac
         left join base_active_modify_apply ap on ac.id = ap.active_id and ap.is_delete = 0
         <where>

+ 0 - 1
abi-cloud-qr-platform-server/src/test/java/com/abi/qms/platform/EncryptionTest.java

@@ -3,7 +3,6 @@ package com.abi.qms.platform;
 import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.symmetric.AES;
 import com.abi.qms.platform.infrastructure.util.AesEncodeUtil;
-import com.abi.task.common.api.exception.BusinessException;
 import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
 import lombok.extern.slf4j.Slf4j;
 

+ 59 - 2
abi-cloud-qr-platform-server/src/test/java/com/abi/qms/platform/TableStorePlusTest.java

@@ -1,6 +1,8 @@
 package com.abi.qms.platform;
 
 import com.abi.qms.platform.dao.tablestore.entity.QrCode;
+import com.abi.qms.platform.infrastructure.util.AsyncTableStoreUtil;
+import com.abi.qms.platform.service.QrBoxMappingService;
 import com.abi.task.common.tablestore.TableStorePlusUtils;
 import com.abi.task.common.tablestore.common.TableStoreEntity;
 import com.abi.task.common.tablestore.common.TableStoreReq;
@@ -23,6 +25,12 @@ public class TableStorePlusTest {
     @Autowired
     private TableStorePlusUtils tableStorePlusUtils;
 
+    @Autowired
+    private AsyncTableStoreUtil asyncTableStoreUtil;
+
+    @Autowired
+    private QrBoxMappingService qrBoxMappingService;
+
     @Test
     public void testAddRow() {
         DemoEntity entity = new DemoEntity();
@@ -107,13 +115,62 @@ public class TableStorePlusTest {
         log.info(String.valueOf(res.getTotalCount()));
     }
 
-
-
     @Test
     public void testDeleteRow() {
         tableStorePlusUtils.deleteRow(DemoEntity.class, "10293827182717");
     }
 
+    @Test
+    public void testAsyncPut() {
+        List<String> codeList = new ArrayList<>();
+        codeList.add("5lsi4rHdi3V1");
+        codeList.add("5ls0rL8vL7A1");
+        codeList.add("5ls5I3IwU8R1");
+        codeList.add("5ls129h44eD1");
+        codeList.add("5ls700E97h91");
+        codeList.add("5ls7718P6061");
+        codeList.add("5lsM2193C881");
+        codeList.add("5lsrk95846L1");
+        codeList.add("5lsK79Xzg841");
+        codeList.add("5lsap2iM07D1");
+
+        List<QrCode> qrCodeList = new ArrayList<>();
+        for(String code:codeList){
+            QrCode qrCode = new QrCode();
+            qrCode.setCode(code);
+            qrCode.setQrBoxMappingId(12345L);
+            qrCodeList.add(qrCode);
+        }
+
+        tableStorePlusUtils.updateRow(qrCodeList,"qrBoxMappingId");
+
+    }
+
+    @Test
+    public void addQrBoxMappingByFileUpload() {
+        List<String> codeList = new ArrayList<>();
+        codeList.add("5lsi4rHdi3V1");
+        codeList.add("5ls0rL8vL7A1");
+        codeList.add("5ls5I3IwU8R1");
+        codeList.add("5ls129h44eD1");
+        codeList.add("5ls700E97h91");
+        codeList.add("5ls7718P6061");
+        codeList.add("5lsM2193C881");
+        codeList.add("5lsrk95846L1");
+        codeList.add("5lsK79Xzg841");
+        codeList.add("5lsap2iM07D1");
+
+        qrBoxMappingService.addQrBoxMappingByFileUpload(codeList,1234567L);
+
+        try {
+            Thread.sleep(5000L);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
 
 
 }