From 0e4a1e2b73d16fca22f6526a9ea45d90e9a0b204 Mon Sep 17 00:00:00 2001 From: my_ong <429426262@qq.com> Date: Fri, 13 Dec 2024 13:23:22 +0800 Subject: [PATCH] =?UTF-8?q?:new:=20=E7=94=9F=E6=88=90=E6=9D=A1=E5=BD=A2?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/material/MaterialController.java | 19 ++++++ .../tech/riemann/ims/utils/BarcodeUtil.java | 60 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/main/java/tech/riemann/ims/utils/BarcodeUtil.java diff --git a/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java b/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java index 83e4d8c..efc8be3 100644 --- a/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java +++ b/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java @@ -19,8 +19,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import tech.riemann.ims.entity.material.Material; import tech.riemann.ims.service.material.IMaterialService; +import tech.riemann.ims.utils.BarcodeUtil; import javax.annotation.Nonnull; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -127,4 +129,21 @@ public class MaterialController { throw BizException.create("删除物料失败!"); } } + + // 批量生成条形码 + @PostMapping("material/{id}/generate-barcodes") + @Operation(summary = "批量生成条形码") + public List generateBarcodes(@Parameter(description = "物料id", required = true) @PathVariable Long id, + @Parameter(description = "条形码数量", required = true) @RequestParam(name = "count") int count) { + List res = new ArrayList<>(); + Material byId = materialService.getById(id); + if (byId != null && count > 0) { + String code = byId.getCode(); + while (count-- > 0) { + res.add(code + BarcodeUtil.generateBarcode()); + } + } + log.info("生成条形码成功,条形码列表:{}", res); + return res; + } } diff --git a/src/main/java/tech/riemann/ims/utils/BarcodeUtil.java b/src/main/java/tech/riemann/ims/utils/BarcodeUtil.java new file mode 100644 index 0000000..f2ca3f5 --- /dev/null +++ b/src/main/java/tech/riemann/ims/utils/BarcodeUtil.java @@ -0,0 +1,60 @@ +package tech.riemann.ims.utils; + +import lombok.experimental.UtilityClass; + +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadLocalRandom; + +/** + * @author mayong + * @since 2024/12/12 20:39 + */ +@UtilityClass +public class BarcodeUtil { + + // 用于存储每天已经生成的条码的最后三位 + private static final ConcurrentHashMap> dailySequences = new ConcurrentHashMap<>(); + + // 日期格式化为年份后两位和一年中的某一天 + private static final SimpleDateFormat sdf = new SimpleDateFormat("yyDDD"); + + /** + * 生成一个7位数字条码,前4位表示年份后两位和一年中的某一天,后3位随机且当天不重复 + */ + public static synchronized String generateBarcode() { + // 获取当前日期部分(简化为年份后两位和一年中的第几天) + String datePart = sdf.format(new Date()); + + // 如果当天的序列号集合不存在,则初始化一个新的集合 + dailySequences.putIfAbsent(datePart, Collections.synchronizedSet(new HashSet<>())); + + // 获取当天的序列号集合 + Set sequencesToday = dailySequences.get(datePart); + + // 生成随机且不重复的三位数 + int sequence; + do { + sequence = ThreadLocalRandom.current().nextInt(0, 9999); + } while (sequencesToday.contains(sequence)); + + // 将新生成的序列号添加到当天的集合中 + sequencesToday.add(sequence); + + // 格式化序列号为3位字符串,不足前面补0 + String sequencePart = String.format("%04d", sequence); + + return datePart + sequencePart; + } + + /** + * 模拟新的一天开始,重置当天的序列号集合 + */ + public static void resetDailySequence() { + dailySequences.clear(); + } +}