java 实现,将一条数据的code 按照这种方式保存: 'BSGK'+当前年份+当前月份+序号(比如0001,0002,0003四位数),序号取当前月份的最大序号+1,如果当前月份没得数据,而保存的数据正好是当前月份,那么编号就为0001,以2023年6月为例子,当前月没有数据,本次编号就为BSGK2023060001,本月的第二条数据为BSGK2023060002,判断当前月的本条数据序号是多少,根据当前月的上一条数据序号,如果上一条数据序号为0002,则当前条序号为0003
时间: 2024-03-03 14:51:07 浏览: 148
好的,以下是Java实现的代码:
```java
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DataCodeGenerator {
private static final String PREFIX = "BSGK";
private static final int SEQUENCE_LENGTH = 4;
private static final DateTimeFormatter YEAR_FORMATTER = DateTimeFormatter.ofPattern("yyyy");
private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("MM");
private String lastDataCode;
private String currentYear;
private String currentMonth;
private int currentSequence;
public DataCodeGenerator() {
lastDataCode = "";
currentYear = "";
currentMonth = "";
currentSequence = 0;
}
public String generateDataCode() {
LocalDate now = LocalDate.now();
String year = YEAR_FORMATTER.format(now);
String month = MONTH_FORMATTER.format(now);
if (!year.equals(currentYear) || !month.equals(currentMonth)) {
lastDataCode = getLastDataCodeFromDatabase(year, month);
currentYear = year;
currentMonth = month;
currentSequence = 0;
} else {
currentSequence = Integer.parseInt(lastDataCode.substring(lastDataCode.length() - SEQUENCE_LENGTH)) + 1;
}
String sequenceString = String.format("%0" + SEQUENCE_LENGTH + "d", currentSequence);
String dataCode = PREFIX + currentYear + currentMonth + sequenceString;
return dataCode;
}
private String getLastDataCodeFromDatabase(String year, String month) {
// 从数据库中查询当前月份的数据编号,如果没有则返回当前月份的第一条数据编号
List<String> dataCodes = new ArrayList<>(); // 模拟数据库中的数据编号列表
for (String dataCode : dataCodes) {
if (dataCode.startsWith(PREFIX + year + month)) {
return dataCode;
}
}
return PREFIX + year + month + "0000";
}
public static void main(String[] args) {
DataCodeGenerator generator = new DataCodeGenerator();
// 模拟生成10条数据编号
List<String> dataCodes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
String dataCode = generator.generateDataCode();
dataCodes.add(dataCode);
System.out.println(dataCode);
}
// 检查生成的数据编号是否按照要求递增
Collections.sort(dataCodes);
for (int i = 0; i < dataCodes.size(); i++) {
String expectedSequenceString = String.format("%0" + SEQUENCE_LENGTH + "d", i + 1);
String actualSequenceString = dataCodes.get(i).substring(dataCodes.get(i).length() - SEQUENCE_LENGTH);
if (!expectedSequenceString.equals(actualSequenceString)) {
System.out.println("Error: Data code sequence is not correct!");
break;
}
}
}
}
```
该类的核心方法是`generateDataCode()`,它会根据当前时间和数据库中已有的数据编号来生成新的数据编号。如果当前时间与上一次调用该方法的时间不在同一个月份,就从数据库中查询当前月份的最大数据编号,并将序列号设置为该最大编号+1;否则,就将序列号设置为上一次生成的数据编号的序列号+1。最后,将当前时间和序列号拼接在一起,生成新的数据编号。
为了测试生成的数据编号是否按照要求递增,我们在`main`方法中生成了10条数据编号,并将它们保存在一个列表中。然后,我们对这些数据编号进行排序,并逐一检查它们的序列号是否按照要求递增。如果有一个数据编号的序列号不正确,就输出错误信息并退出循环。
阅读全文