Преглед изворни кода

使用线程池验证码格式重复率

bess-WeiganCai пре 4 година
родитељ
комит
2ccaf290dd
22 измењених фајлова са 498 додато и 79 уклоњено
  1. 30 11
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrFormatController.java
  2. 8 8
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrVariableController.java
  3. 3 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/entity/QrFormat.java
  4. 7 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/mapper/QrFormatMapper.java
  5. 64 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/vo/result/QrFormatVO.java
  6. 23 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/DeleteQrFormatReq.java
  7. 25 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/DisableQrFormatReq.java
  8. 25 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/EnableQrFormatReq.java
  9. 4 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/ListQrVariableReq.java
  10. 1 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/PreviewVariableReq.java
  11. 8 7
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/SaveFormatReq.java
  12. 3 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/GetQrFormatDetailRes.java
  13. 5 2
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/ListQrFormatRes.java
  14. 1 1
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/PreviewVariableRes.java
  15. 23 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/config/ThreadPoolConfig.java
  16. 7 4
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/qr/build/parent/SerialBuildCode.java
  17. 115 0
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/task/VerifyUniqueTask.java
  18. 18 6
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrFormatService.java
  19. 3 3
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrVariableService.java
  20. 87 26
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrFormatServiceImpl.java
  21. 12 9
      abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrVariableServiceImpl.java
  22. 26 1
      abi-cloud-qr-platform-server/src/main/resources/dao/mapper/QrFormatMapper.xml

+ 30 - 11
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/controller/console/QrFormatController.java

@@ -1,8 +1,6 @@
 package com.abi.qms.platform.controller.console;
 
-import com.abi.qms.platform.dto.req.GetQrFormatDetailReq;
-import com.abi.qms.platform.dto.req.ListQrFormatReq;
-import com.abi.qms.platform.dto.req.SaveFormatReq;
+import com.abi.qms.platform.dto.req.*;
 import com.abi.qms.platform.dto.res.GetQrFormatDetailRes;
 import com.abi.qms.platform.dto.res.ListQrFormatRes;
 import com.abi.qms.platform.service.QrFormatService;
@@ -23,30 +21,51 @@ import org.springframework.web.bind.annotation.*;
 @Slf4j
 @RestController
 @Api(tags = "码格式管理")
-@RequestMapping("/qr/format")
+@RequestMapping("/qrFormat")
 public class QrFormatController {
     @Autowired
     private QrFormatService qrFormatService;
 
     @ApiOperation("码格式新增修改")
-    @PostMapping("/saveFormat")
-    public BaseResponse saveFormat(@Validated @RequestBody SaveFormatReq saveFormatReq) {
-        qrFormatService.saveFormat(saveFormatReq);
+    @PostMapping("/saveQrFormat")
+    public BaseResponse saveQrFormat(@Validated @RequestBody SaveQrFormatReq saveQrFormatReq) {
+        qrFormatService.saveQrFormat(saveQrFormatReq);
         return BaseResponse.create();
     }
 
     @ApiOperation("码格式查询分页")
-    @GetMapping("/listFormat")
-    public BaseResponse<ListQrFormatRes> listFormat(@Validated ListQrFormatReq listQrFormatReq) {
+    @GetMapping("/listQrFormat")
+    public BaseResponse<ListQrFormatRes> listQrFormat(@Validated ListQrFormatReq listQrFormatReq) {
         ListQrFormatRes result = qrFormatService.listQrFormat(listQrFormatReq);
         return BaseResponse.create(result);
     }
 
     @ApiOperation("码格式查询详情")
-    @GetMapping("/getFormatDetail")
-    public BaseResponse<GetQrFormatDetailRes> getFormatDetail(@Validated GetQrFormatDetailReq getQrFormatDetailReq) {
+    @GetMapping("/getQrFormatDetail")
+    public BaseResponse<GetQrFormatDetailRes> getQrFormatDetail(@Validated GetQrFormatDetailReq getQrFormatDetailReq) {
         GetQrFormatDetailRes result = qrFormatService.getQrFormatDetail(getQrFormatDetailReq);
         return BaseResponse.create(result);
     }
 
+    @ApiOperation("码格式启用")
+    @PostMapping("/enableQrFormat")
+    public BaseResponse enableQrFormat(@Validated @RequestBody EnableQrFormatReq enableQrFormatReq) {
+        qrFormatService.enableQrFormat(enableQrFormatReq);
+        return BaseResponse.create();
+    }
+
+    @ApiOperation("码格式禁用")
+    @PostMapping("/disableQrFormat")
+    public BaseResponse disableQrFormat(@Validated @RequestBody DisableQrFormatReq disableQrFormatReq) {
+        qrFormatService.disableFormat(disableQrFormatReq);
+        return BaseResponse.create();
+    }
+
+    @ApiOperation("删除码格式")
+    @PostMapping("/deleteQrFormat")
+    public BaseResponse deleteQrFormat(@Validated @RequestBody DeleteQrFormatReq deleteQrFormatReq) {
+        qrFormatService.deleteQrFormat(deleteQrFormatReq);
+        return BaseResponse.create();
+    }
+
 }

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

@@ -1,9 +1,9 @@
 package com.abi.qms.platform.controller.console;
 
 import com.abi.qms.platform.dto.req.ListQrVariableReq;
-import com.abi.qms.platform.dto.req.PreviewVariableReq;
+import com.abi.qms.platform.dto.req.PreviewQrVariableReq;
 import com.abi.qms.platform.dto.res.ListQrVariableRes;
-import com.abi.qms.platform.dto.res.PreviewVariableRes;
+import com.abi.qms.platform.dto.res.PreviewQrVariableRes;
 import com.abi.qms.platform.service.QrVariableService;
 import com.abi.task.common.api.base.BaseResponse;
 import io.swagger.annotations.Api;
@@ -24,23 +24,23 @@ import org.springframework.web.bind.annotation.RestController;
 @Slf4j
 @RestController
 @Api(tags = "码格式变量管理")
-@RequestMapping("/qr/variable")
+@RequestMapping("/qrVariable")
 public class QrVariableController {
 
     @Autowired
     private QrVariableService qrVariableService;
 
     @ApiOperation("码格式变量查询分页")
-    @GetMapping("/listVariable")
-    public BaseResponse<ListQrVariableRes> listFactory(@Validated ListQrVariableReq listQrVariableReq) {
+    @GetMapping("/listQrVariable")
+    public BaseResponse<ListQrVariableRes> listQrVariable(@Validated ListQrVariableReq listQrVariableReq) {
         ListQrVariableRes result = qrVariableService.listQrVariable(listQrVariableReq);
         return BaseResponse.create(result);
     }
 
     @ApiOperation("码格式变量生成预览")
-    @GetMapping("/previewVariable")
-    public BaseResponse<PreviewVariableRes> generatePreview(@Validated PreviewVariableReq previewVariableReq) {
-        PreviewVariableRes result = qrVariableService.generatePreview(previewVariableReq);
+    @GetMapping("/previewQrVariable")
+    public BaseResponse<PreviewQrVariableRes> previewQrVariable(@Validated PreviewQrVariableReq previewQrVariableReq) {
+        PreviewQrVariableRes result = qrVariableService.previewQrVariable(previewQrVariableReq);
         return BaseResponse.create(result);
     }
 

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

@@ -65,6 +65,9 @@ public class QrFormat {
     @ApiModelProperty(value = "修改时间")
     private LocalDateTime updateTime;
 
+    @ApiModelProperty(value = "修改人id")
+    private Long updateBy;
+
     @ApiModelProperty("是否删除")
     private Integer isDelete;
 

+ 7 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dao/mapper/QrFormatMapper.java

@@ -1,7 +1,10 @@
 package com.abi.qms.platform.dao.mapper;
 
 import com.abi.qms.platform.dao.entity.QrFormat;
+import com.abi.qms.platform.dao.vo.result.QrFormatVO;
+import com.abi.qms.platform.dto.req.ListQrFormatReq;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * 码格式 Mapper接口
@@ -11,4 +14,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface QrFormatMapper extends BaseMapper<QrFormat> {
 
+	/**
+	 * 分页查询码格式信息
+	 */
+	IPage<QrFormatVO> listQrFormat(IPage page, ListQrFormatReq param);
 }

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

@@ -0,0 +1,64 @@
+package com.abi.qms.platform.dao.vo.result;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 码格式 对象 qr_format
+ * 
+ * @author WeiganCai
+ * @date 2021-04-19
+ */
+@Data
+@ApiModel
+public class QrFormatVO {
+
+    @ApiModelProperty("码格式id")
+    private Long id;
+
+    @ApiModelProperty("部门名称")
+    private String deptName;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("数据类型")
+    private Integer dataType;
+
+    @ApiModelProperty("码变量")
+    private String codeVariable;
+
+    @ApiModelProperty("码变量对应的类")
+    private String codeVariableBuildClass;
+
+    @ApiModelProperty("码组成简介")
+    private String brief;
+
+    @ApiModelProperty("说明")
+    private String illustrate;
+
+    @ApiModelProperty("是否验证唯一性 0-不验证,1-验证")
+    private Integer verifyUnique;
+
+    @ApiModelProperty("重复率状态 0-未验证 1-验证中  2-验证不通过  3-验证通过")
+    private Integer uniqueStatus;
+
+    @ApiModelProperty("使用状态 0-未使用 1-使用中  2-停用")
+    private Integer useStatus;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人id")
+    private Long createBy;
+
+    @ApiModelProperty(value = "修改时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "修改人id")
+    private Long updateBy;
+
+}

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

@@ -0,0 +1,23 @@
+package com.abi.qms.platform.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 删除码格式入参
+ *
+ * @author WeiganCai
+ * @date: 2021-04-22
+ */
+@Data
+@ApiModel
+public class DeleteQrFormatReq implements Serializable {
+
+	@NotNull(message = "id为空")
+	@ApiModelProperty(value = "ids")
+	private Long id;
+}

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

@@ -0,0 +1,25 @@
+package com.abi.qms.platform.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 码格式禁用入参
+ *
+ * @author WeiganCai
+ * @date: 2021-04-22
+ */
+@Data
+@ApiModel
+public class DisableQrFormatReq implements Serializable {
+
+	@NotNull(message = "id为空")
+	@ApiModelProperty(value = "ids")
+	private List<Long> ids;
+
+}

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

@@ -0,0 +1,25 @@
+package com.abi.qms.platform.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 码格式启用入参
+ *
+ * @author WeiganCai
+ * @date: 2021-04-22
+ */
+@Data
+@ApiModel
+public class EnableQrFormatReq implements Serializable {
+
+	@NotNull(message = "id为空")
+	@ApiModelProperty(value = "ids")
+	private List<Long> ids;
+
+}

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

@@ -22,4 +22,8 @@ public class ListQrVariableReq extends PageReq implements Serializable {
 
 	@ApiModelProperty("参数类型 0-时间参数 1-随机参数 2-流水号参数 3-固定值参数")
 	private Integer paramType;
+
+	@ApiModelProperty(value = "是否有效 0-无效 1-有效")
+	private Integer valid;
+
 }

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

@@ -15,7 +15,7 @@ import java.io.Serializable;
  */
 @Data
 @ApiModel
-public class PreviewVariableReq implements Serializable {
+public class PreviewQrVariableReq implements Serializable {
 
   @NotNull(message = "id为空")
   @ApiModelProperty(value = "id")

+ 8 - 7
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/req/SaveFormatReq.java

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 
 /**
@@ -14,23 +16,28 @@ import java.io.Serializable;
  */
 @Data
 @ApiModel
-public class SaveFormatReq implements Serializable {
+public class SaveQrFormatReq implements Serializable {
 
 	@ApiModelProperty("码格式id")
 	private Long id;
 
+	@NotNull(message = "部门为空")
 	@ApiModelProperty("部门id")
 	private Long deptId;
 
+	@NotNull(message = "码格式名称为空")
+	@Pattern(regexp = "^[a-zA-Z-z0-9\\u4e00-\\u9fa5]{1,20}$", message = "码格式名称限制20字内的汉字or字母or数字")
 	@ApiModelProperty("名称")
 	private String name;
 
+	@NotNull(message = "数据类型为空")
 	@ApiModelProperty("数据类型")
 	private Integer dataType;
 
 	@ApiModelProperty("码变量")
 	private String codeVariable;
 
+	@NotNull(message = "选择参数为空")
 	@ApiModelProperty("码变量对应的类")
 	private String codeVariableBuildClass;
 
@@ -43,10 +50,4 @@ public class SaveFormatReq implements Serializable {
 	@ApiModelProperty("是否验证唯一性 0-不验证,1-验证")
 	private Integer verifyUnique;
 
-	@ApiModelProperty("重复率状态 0-未验证 1-验证中  2-验证不通过  3-验证通过")
-	private Integer uniqueStatus;
-
-	@ApiModelProperty("使用状态 0-未使用 1-使用中  2-停用")
-	private Integer useStatus;
-
 }

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

@@ -61,4 +61,7 @@ public class GetQrFormatDetailRes implements Serializable {
 	@ApiModelProperty(value = "修改时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private LocalDateTime updateTime;
+
+	@ApiModelProperty(value = "修改人id")
+	private Long updateBy;
 }

+ 5 - 2
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/dto/res/ListQrFormatRes.java

@@ -37,8 +37,8 @@ public class ListQrFormatRes extends PageResp implements Serializable {
 		@ApiModelProperty("码格式id")
 		private Long id;
 
-		@ApiModelProperty("部门id")
-		private Long deptId;
+		@ApiModelProperty("部门名称")
+		private String deptName;
 
 		@ApiModelProperty("名称")
 		private String name;
@@ -78,5 +78,8 @@ public class ListQrFormatRes extends PageResp implements Serializable {
 		@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 		private LocalDateTime updateTime;
 
+		@ApiModelProperty(value = "修改人id")
+		private Long updateBy;
+
 	}
 }

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

@@ -15,7 +15,7 @@ import java.io.Serializable;
  */
 @Data
 @ApiModel
-public class PreviewVariableRes implements Serializable {
+public class PreviewQrVariableRes implements Serializable {
 
   @ApiModelProperty(value = "生成的码")
   private String code;

+ 23 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/config/ThreadPoolConfig.java

@@ -0,0 +1,23 @@
+package com.abi.qms.platform.infrastructure.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.*;
+
+/**
+ * 线程池配置
+ *
+ * @author WeiganCai
+ * @date: 2021-04-21
+ */
+@Configuration
+public class ThreadPoolConfig {
+
+	@Bean
+	public ExecutorService init() {
+		return new ThreadPoolExecutor(4, 4,
+				0L, TimeUnit.MILLISECONDS,
+				new LinkedBlockingQueue<Runnable>());
+	}
+}

+ 7 - 4
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/qr/build/parent/SerialBuildCode.java

@@ -11,7 +11,10 @@ import java.util.Map;
 public abstract class SerialBuildCode extends BuildCode {
 
     /** paramMap中存放流水号的key */
-    public static final String COUNTER = "counter";
+    public static final String SERIAL_KEY = "serial";
+
+    /** 流水号变量名称的前缀 */
+    public static final String SERIAL_START_WITH = "SD";
 
     /**
      * 生成码
@@ -20,10 +23,10 @@ public abstract class SerialBuildCode extends BuildCode {
      */
     @Override
     public String buildCode(Map<String, Object> paramMap) {
-        if (paramMap == null || paramMap.get(COUNTER) == null) {
+        if (paramMap == null || paramMap.get(SERIAL_KEY) == null) {
             return structCode(0L);
         }
-        return structCode(Long.parseLong(paramMap.get(COUNTER).toString()));
+        return structCode(Long.parseLong(paramMap.get(SERIAL_KEY).toString()));
     }
 
     /**
@@ -47,7 +50,7 @@ public abstract class SerialBuildCode extends BuildCode {
             counter = 0L;
         }
 
-        counter ++;
+        counter++;
 
         // 在counter之前补零:0-前面补充0,serialLength-长度,d-参数为正数
         return String.format("%0" + serialLength + "d", counter);

+ 115 - 0
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/infrastructure/task/VerifyUniqueTask.java

@@ -0,0 +1,115 @@
+package com.abi.qms.platform.infrastructure.task;
+
+import com.abi.qms.platform.dao.entity.QrFormat;
+import com.abi.qms.platform.dao.enums.QrFormatUniqueStatusEunm;
+import com.abi.qms.platform.dao.mapper.QrFormatMapper;
+import com.abi.qms.platform.infrastructure.qr.build.parent.SerialBuildCode;
+import com.abi.qms.platform.infrastructure.util.BuildCodeUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+
+/**
+ * 验证重复率线程
+ *
+ * @author WeiganCai
+ * @date 2021-04-21
+ */
+@Slf4j
+public class VerifyUniqueTask implements Runnable {
+
+    /** 测试重复率时生成码的数量 */
+    private static final int BUILD_CODE_NUMBER = 500000;
+
+    /** 允许单个码生成重复的次数 */
+    private static final int REPEAT_BUILD_CODE_TIMES = 10;
+
+    private QrFormat qrFormat;
+
+    private QrFormatMapper qrFormatMapper;
+
+    public VerifyUniqueTask(QrFormat qrFormat, QrFormatMapper qrFormatMapper) {
+        this.qrFormat = qrFormat;
+        this.qrFormatMapper = qrFormatMapper;
+    }
+
+    @Override
+    public void run() {
+        log.info("正在对[id:{}, name:{}]码格式进行重复率验证", qrFormat.getId(), qrFormat.getName());
+        // 验证开始时间
+        long startTime = System.currentTimeMillis();
+        // 码格式验证标识
+        boolean flag = true;
+
+        try {
+            // 获取用于生成码的class类
+            String[] buildClassArray = qrFormat.getCodeVariableBuildClass().split(",");
+            // 用Set存放不重复的码
+            HashSet<String> uniqueSet = new HashSet<>();
+            // 生成码要用的参数
+            Map<String, Object> paramMap = new HashMap<>();
+            // 码
+            StringBuilder codeSb = new StringBuilder();
+
+            for (int i = 0; i < BUILD_CODE_NUMBER; i++) {
+                String code = buildUniqueCode(buildClassArray, uniqueSet, codeSb, paramMap, 0);
+                if (code == null) {
+                    log.info("第{}个码生成失败", i + 1);
+                    flag = false;
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            log.error("码格式验证error", e);
+            flag = false;
+        } finally {
+            // 修改重复率验证状态
+            Integer uniqueStatus = flag ? QrFormatUniqueStatusEunm.VERIFY_SUCCESS.getCode() : QrFormatUniqueStatusEunm.VERIFY_FAIL.getCode();
+            QrFormat update = new QrFormat().setId(qrFormat.getId()).setUniqueStatus(uniqueStatus);
+            qrFormatMapper.updateById(update);
+
+            log.info("[id:{}, name:{}]码格式重复率验证{},耗时{}ms", qrFormat.getId(), qrFormat.getName(),
+                    flag ? "通过" : "不通过", System.currentTimeMillis() - startTime );
+        }
+
+    }
+
+    /**
+     * 生成不重复的码
+     */
+    private String buildUniqueCode(String[] buildClassArray, HashSet<String> uniqueSet, StringBuilder codeSb, Map<String, Object> paramMap, int buildTimes) {
+        // 生成码
+        buildCodeByClass(buildClassArray, codeSb, paramMap);
+        String code = codeSb.toString();
+
+        // add成功,说明码没有重复
+        if (uniqueSet.add(code)) {
+            return code;
+        }
+
+        // 单个码重复次数大于上限
+        if (buildTimes >= REPEAT_BUILD_CODE_TIMES) {
+            return null;
+        }
+
+        // 码重复,递归执行下一次
+        return buildUniqueCode(buildClassArray, uniqueSet, codeSb, paramMap, ++buildTimes);
+    }
+
+    /**
+     * 清空codeSb,调用buildSingleCode方法生成码
+     */
+    private void buildCodeByClass(String[] buildClassArray, StringBuilder codeSb, Map<String, Object> paramMap) {
+        // 使用一个对象,删除内容,不每次都新建一个对象
+        codeSb.delete(0, codeSb.length());
+        for (String buildClass : buildClassArray) {
+            String code = BuildCodeUtil.buildSingleCode(buildClass, paramMap);
+            // 如果是流水号类型的变量,需要将返回的流水号存入map中,使流水号连贯
+            if (buildClass.startsWith(SerialBuildCode.SERIAL_START_WITH)) {
+                paramMap.put(SerialBuildCode.SERIAL_KEY, code);
+            }
+            codeSb.append(code);
+        }
+    }
+
+}

+ 18 - 6
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/QrFormatService.java

@@ -1,12 +1,8 @@
 package com.abi.qms.platform.service;
 
-import com.abi.qms.platform.dto.req.GetQrFormatDetailReq;
-import com.abi.qms.platform.dto.req.ListQrFormatReq;
+import com.abi.qms.platform.dto.req.*;
 import com.abi.qms.platform.dto.res.GetQrFormatDetailRes;
 import com.abi.qms.platform.dto.res.ListQrFormatRes;
-import com.abi.qms.platform.dao.entity.QrFormat;
-import com.abi.qms.platform.dto.req.SaveFormatReq;
-import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
  * 码格式 Service接口
@@ -19,7 +15,7 @@ public interface QrFormatService {
 	/**
 	 * 保存码格式
 	 */
-	void saveFormat(SaveFormatReq saveFormatReq);
+	void saveQrFormat(SaveQrFormatReq saveQrFormatReq);
 
 	/**
 	 * 码格式查询分页
@@ -30,4 +26,20 @@ public interface QrFormatService {
 	 * 码格式查询详情
 	 */
 	GetQrFormatDetailRes getQrFormatDetail(GetQrFormatDetailReq getQrFormatDetailReq);
+
+	/**
+	 * 码格式启用
+	 */
+	void enableQrFormat(EnableQrFormatReq enableQrFormatReq);
+
+	/**
+	 * 码格式禁用
+	 */
+	void disableFormat(DisableQrFormatReq disableQrFormatReq);
+
+	/**
+	 * 删除码格式
+	 */
+	void deleteQrFormat(DeleteQrFormatReq deleteQrFormatReq);
+
 }

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

@@ -1,9 +1,9 @@
 package com.abi.qms.platform.service;
 
 import com.abi.qms.platform.dto.req.ListQrVariableReq;
-import com.abi.qms.platform.dto.req.PreviewVariableReq;
+import com.abi.qms.platform.dto.req.PreviewQrVariableReq;
 import com.abi.qms.platform.dto.res.ListQrVariableRes;
-import com.abi.qms.platform.dto.res.PreviewVariableRes;
+import com.abi.qms.platform.dto.res.PreviewQrVariableRes;
 
 /**
  * 码格式变量 Service接口
@@ -21,5 +21,5 @@ public interface QrVariableService {
 	/**
 	 * 码格式变量生成码预览
 	 */
-	PreviewVariableRes generatePreview(PreviewVariableReq previewVariableReq);
+	PreviewQrVariableRes previewQrVariable(PreviewQrVariableReq previewQrVariableReq);
 }

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

@@ -1,21 +1,18 @@
 package com.abi.qms.platform.service.impl;
 
 import com.abi.qms.platform.dao.entity.QrFormat;
-import com.abi.qms.platform.dao.entity.QrVariable;
 import com.abi.qms.platform.dao.enums.QrFormatUniqueStatusEunm;
 import com.abi.qms.platform.dao.enums.QrFormatUseStatusEnum;
+import com.abi.qms.platform.dao.enums.QrFormatVerifyUniqueEnum;
 import com.abi.qms.platform.dao.mapper.QrFormatMapper;
-import com.abi.qms.platform.dao.mapper.QrVariableMapper;
-import com.abi.qms.platform.dto.req.GetQrFormatDetailReq;
-import com.abi.qms.platform.dto.req.ListQrFormatReq;
-import com.abi.qms.platform.dto.req.SaveFormatReq;
-import com.abi.qms.platform.dto.res.GetFactoryDetailRes;
+import com.abi.qms.platform.dao.vo.result.QrFormatVO;
+import com.abi.qms.platform.dto.req.*;
 import com.abi.qms.platform.dto.res.GetQrFormatDetailRes;
 import com.abi.qms.platform.dto.res.ListQrFormatRes;
-import com.abi.qms.platform.dto.res.ListQrVariableRes;
 import com.abi.qms.platform.infrastructure.task.VerifyUniqueTask;
 import com.abi.qms.platform.infrastructure.util.AssertUtil;
 import com.abi.qms.platform.infrastructure.util.PageUtil;
+import com.abi.qms.platform.service.BoxCodeFormatService;
 import com.abi.qms.platform.service.QrFormatService;
 import com.abi.task.common.api.exception.BusinessException;
 import com.abi.task.common.utils.PojoConverterUtils;
@@ -23,6 +20,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.concurrent.ExecutorService;
@@ -42,12 +40,25 @@ public class QrFormatServiceImpl implements QrFormatService {
 	@Autowired
 	private ExecutorService executorService;
 
+	@Autowired
+	private BoxCodeFormatService boxCodeFormatService;
+
 	/**
 	 * 保存码格式
 	 */
 	@Override
-	public void saveFormat(SaveFormatReq req) {
-		// 汉字or字母or数字,20字内
+	@Transactional
+	public void saveQrFormat(SaveQrFormatReq req) {
+		// 修改码格式时的条件限制
+		QrFormat qrFormat;
+		if (req.getId() != null) {
+			qrFormat = qrFormatMapper.selectById(req.getId());
+			AssertUtil.isNull(qrFormat, "码格式不存在");
+			// 只有未使用状态下才可编辑
+			if (QrFormatUseStatusEnum.UN_USE.is(qrFormat.getUseStatus())) {
+				throw new BusinessException("码格式不可编辑");
+			}
+		}
 
 		// 同部门下码格式名称不可重复
 		QueryWrapper<QrFormat> qrFormatQw = new QueryWrapper<>();
@@ -61,12 +72,6 @@ public class QrFormatServiceImpl implements QrFormatService {
 			throw new BusinessException("码格式名称已存在");
 		}
 
-		// 声明对象
-		QrFormat qrFormat;
-		if (req.getId() != null) {
-			qrFormat = qrFormatMapper.selectById(req.getId());
-			AssertUtil.isNull(qrFormat, "码格式不存在");
-		}
 		qrFormat = PojoConverterUtils.copy(req, QrFormat.class);
 		PojoConverterUtils.copy(req, qrFormat);
 		// 重复率状态 未验证
@@ -74,15 +79,18 @@ public class QrFormatServiceImpl implements QrFormatService {
 		// 使用状态 未使用
 		qrFormat.setUseStatus(QrFormatUseStatusEnum.UN_USE.getCode());
 
-		// 新增or修改
+		// 新增or修改 TODO 设置createBy和updateBy
 		if (req.getId() != null) {
 			qrFormatMapper.updateById(qrFormat);
 		} else {
 			qrFormatMapper.insert(qrFormat);
 		}
 
-		// 重复率验证
-		executorService.execute(new VerifyUniqueTask(qrFormat, qrFormatMapper));
+		// 是否进行重复率验证
+		if (QrFormatVerifyUniqueEnum.VERIFY_UNIQUE.is(qrFormat.getVerifyUnique())) {
+			executorService.execute(new VerifyUniqueTask(qrFormat, qrFormatMapper));
+		}
+
 	}
 
 	/**
@@ -90,15 +98,12 @@ public class QrFormatServiceImpl implements QrFormatService {
 	 */
 	@Override
 	public ListQrFormatRes listQrFormat(ListQrFormatReq req) {
-		// 1-拼接条件
-		QueryWrapper<QrFormat> qrFormatQw = new QueryWrapper<>();
-		qrFormatQw.eq(req.getUniqueStatus() != null, "unique_status", req.getUniqueStatus());
 
-		// 2-分页查询
-		IPage<QrFormat> iPage  = qrFormatMapper.selectPage(PageUtil.createPage(req), qrFormatQw);
-		List<QrFormat> qrFormatList = iPage.getRecords();
+		// 分页查询
+		IPage<QrFormatVO> iPage  = qrFormatMapper.listQrFormat(PageUtil.createPage(req), req);
+		List<QrFormatVO> qrFormatList = iPage.getRecords();
 
-		// 3-封装出参、放入分页信息
+		// 封装出参、放入分页信息
 		ListQrFormatRes res = new ListQrFormatRes();
 		PageUtil.copyPageInfo(res, iPage);
 		List<ListQrFormatRes.QrFormatBean> qrFormatBeanList = PojoConverterUtils.copyList(qrFormatList, ListQrFormatRes.QrFormatBean.class);
@@ -112,11 +117,67 @@ public class QrFormatServiceImpl implements QrFormatService {
 	 */
 	@Override
 	public GetQrFormatDetailRes getQrFormatDetail(GetQrFormatDetailReq req) {
-		// 1-查询码格式对象
+		// 查询码格式对象
 		QrFormat qrFormat = qrFormatMapper.selectById(req.getId());
 		AssertUtil.isNull(qrFormat, "码格式不存在");
 
 		GetQrFormatDetailRes res = PojoConverterUtils.copy(qrFormat, GetQrFormatDetailRes.class);
 		return res;
 	}
+
+	/**
+	 * 码格式启用
+	 */
+	@Override
+	public void enableQrFormat(EnableQrFormatReq req) {
+		List<Long> idList = req.getIds();
+		for (Long id : idList) {
+			QrFormat qrFormat = qrFormatMapper.selectById(id);
+			AssertUtil.isNull(qrFormat, "码格式不存在");
+			// 如果不是停用状态的码格式,跳过循环
+			if (!QrFormatUseStatusEnum.DISABLE.is(qrFormat.getUseStatus())) {
+				continue;
+			}
+
+			// TODO 根据是否被码库使用,决定更新状态为未使用还是使用中
+			QrFormat update = new QrFormat().setId(id).setUseStatus(QrFormatUseStatusEnum.UN_USE.getCode());
+			qrFormatMapper.updateById(update);
+		}
+	}
+
+	/**
+	 * 码格式禁用
+	 */
+	@Override
+	public void disableFormat(DisableQrFormatReq req) {
+		List<Long> idList = req.getIds();
+		for (Long id : idList) {
+			QrFormat qrFormat = qrFormatMapper.selectById(id);
+			AssertUtil.isNull(qrFormat, "码格式不存在");
+			// 如果是停用状态的码格式,跳过循环
+			if (QrFormatUseStatusEnum.DISABLE.is(qrFormat.getUseStatus())) {
+				continue;
+			}
+
+			QrFormat update = new QrFormat().setId(id).setUseStatus(QrFormatUseStatusEnum.DISABLE.getCode());
+			qrFormatMapper.updateById(update);
+		}
+	}
+
+	/**
+	 * 删除码格式
+	 */
+	@Override
+	public void deleteQrFormat(DeleteQrFormatReq req) {
+		QrFormat qrFormat = qrFormatMapper.selectById(req.getId());
+		AssertUtil.isNull(qrFormat, "码格式不存在");
+		// 只有未使用状态下才可删除
+		if (QrFormatUseStatusEnum.UN_USE.is(qrFormat.getUseStatus())) {
+			throw new BusinessException("码格式不可删除");
+		}
+
+		// 逻辑删除
+		QrFormat update = new QrFormat().setId(req.getId()).setIsDelete(1);
+		qrFormatMapper.updateById(update);
+	}
 }

+ 12 - 9
abi-cloud-qr-platform-server/src/main/java/com/abi/qms/platform/service/impl/QrVariableServiceImpl.java

@@ -3,9 +3,9 @@ package com.abi.qms.platform.service.impl;
 import com.abi.qms.platform.dao.entity.QrVariable;
 import com.abi.qms.platform.dao.mapper.QrVariableMapper;
 import com.abi.qms.platform.dto.req.ListQrVariableReq;
-import com.abi.qms.platform.dto.req.PreviewVariableReq;
+import com.abi.qms.platform.dto.req.PreviewQrVariableReq;
 import com.abi.qms.platform.dto.res.ListQrVariableRes;
-import com.abi.qms.platform.dto.res.PreviewVariableRes;
+import com.abi.qms.platform.dto.res.PreviewQrVariableRes;
 import com.abi.qms.platform.infrastructure.util.AssertUtil;
 import com.abi.qms.platform.infrastructure.util.BuildCodeUtil;
 import com.abi.qms.platform.infrastructure.util.PageUtil;
@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -35,17 +36,19 @@ public class QrVariableServiceImpl implements QrVariableService {
 	 */
 	@Override
 	public ListQrVariableRes listQrVariable(ListQrVariableReq req) {
-		// 1-拼接条件
+		// 拼接条件
 		QueryWrapper<QrVariable> qrVariableQw = new QueryWrapper<>();
+		qrVariableQw.eq("is_delete", 0);
+		qrVariableQw.eq(req.getValid() != null, "valid", req.getValid());
 		qrVariableQw.eq(req.getDataType() != null, "data_type", req.getDataType());
 		qrVariableQw.eq(req.getParamType() != null, "param_type", req.getParamType());
 		qrVariableQw.orderByAsc("sort_number");
 
-		// 2-分页查询
+		// 分页查询
 		IPage<QrVariable> iPage = qrVariableMapper.selectPage(PageUtil.createPage(req), qrVariableQw);
 		List<QrVariable> qrVariableList = iPage.getRecords();
 
-		// 3-封装出参、放入分页信息
+		// 封装出参、放入分页信息
 		ListQrVariableRes res = new ListQrVariableRes();
 		PageUtil.copyPageInfo(res, iPage);
 		List<ListQrVariableRes.QrVariableBean> qrVariableBeanList = PojoConverterUtils.copyList(qrVariableList, ListQrVariableRes.QrVariableBean.class);
@@ -58,14 +61,14 @@ public class QrVariableServiceImpl implements QrVariableService {
 	 * 码格式变量生成码预览
 	 */
 	@Override
-	public PreviewVariableRes generatePreview(PreviewVariableReq req) {
-		// 1-查询码格式变量
+	public PreviewQrVariableRes previewQrVariable(PreviewQrVariableReq req) {
+		// 查询码格式变量
 		QrVariable qrVariable = qrVariableMapper.selectById(req.getId());
 		AssertUtil.isNull(qrVariable,"码格式变量不存在");
 
-		// 2-生成单个码
+		// 生成单个码
 		String code = BuildCodeUtil.buildSingleCode(qrVariable.getBuildCodeClass(), null);
-		PreviewVariableRes res = new PreviewVariableRes();
+		PreviewQrVariableRes res = new PreviewQrVariableRes();
 		res.setCode(code);
 
 		return res;

+ 26 - 1
abi-cloud-qr-platform-server/src/main/resources/dao/mapper/QrFormatMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.abi.qms.platform.mapper.QrFormatMapper">
+<mapper namespace="com.abi.qms.platform.dao.mapper.QrFormatMapper">
 
     <resultMap type="com.abi.qms.platform.dao.entity.QrFormat" id="QrFormatResult">
         <result property="id" column="id"/>
@@ -19,8 +19,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
         <result property="updateTime" column="update_time"/>
+        <result property="updateBy" column="update_by"/>
         <result property="isDelete" column="is_delete"/>
     </resultMap>
 
+    <select id="listQrFormat" resultType="com.abi.qms.platform.dao.vo.result.QrFormatVO">
+        SELECT
+            qf.id, bd.dept_name, qf.name, qf.data_type, qf.code_variable,
+            qf.code_variable_build_class, qf.brief, qf.illustrate, qf.verify_unique,
+            qf.unique_status, qf.use_status, qf.create_time, qf.create_by, qf.update_time, qf.update_by
+        FROM qr_format qf
+        LEFT JOIN base_department bd ON qf.dept_id = bd.id
+        <where>
+            qf.is_delete = 0
+            <if test="param.deptId != null">
+                AND qf.dept_id = #{param.deptId}
+            </if>
+            <if test="param.name != null and param.name != ''">
+                AND qf.name LIKE CONCAT('%',#{param.name},'%')
+            </if>
+            <if test="param.uniqueStatus != null">
+                AND qf.unique_status = #{param.uniqueStatus}
+            </if>
+            <if test="param.useStatus != null">
+                AND qf.use_status = #{param.useStatus}
+            </if>
+        </where>
+    </select>
+
 
 </mapper>