在许多业务场景中,订单编号是一项关键的标识符,用于跟踪、管理和识别订单。为了满足不同业务需求,设计一个可靠、灵活且可扩展的订单编号生成器变得至关重要。本文将介绍如何设计一个订单编号生成器,结合了各种生成器,包括日期生成器、随机生成器、步长生成器、序列号生成器、地区码生成器、客户ID生成器、支付方式生成器和批次号生成器。
首先,我们定义一个生成器接口,该接口包含一个 generate 方法,负责生成相应的部分。这是确保所有生成器遵循相同契约的关键。
public interface Generator {
String generate();
}
我们需要设计一些基本的生成器,这些生成器将负责生成订单编号的各个部分。以下是一些基本生成器的设计:
import com.nbsaas.boot.common.ext.apis.Generator;
// 日期生成器实现
public class DateGenerator implements Generator {
private SimpleDateFormat dateFormat;
public DateGenerator(String dateFormatPattern) {
this.dateFormat = new SimpleDateFormat(dateFormatPattern);
}
@Override
public String generate() {
return dateFormat.format(new Date());
}
}
// 随机生成器实现
public class RandomGenerator implements Generator {
private int length;
public RandomGenerator(int length) {
this.length = length;
}
@Override
public String generate() {
Random random = new Random();
StringBuilder randomPart = new StringBuilder();
for (int i = 0; i < length; i++) {
randomPart.append(random.nextInt(10));
}
return randomPart.toString();
}
}
public class StepGenerator implements Generator {
private int stepLength;
private String stepKey;
private NoSequenceApi noSequenceApi;
public StepGenerator(String stepKey, NoSequenceApi noSequenceApi, int stepLength) {
this.stepLength = stepLength;
this.noSequenceApi = noSequenceApi;
this.stepKey = stepKey;
}
@Override
public String generate() {
NoSequenceResponse no = noSequenceApi.oneData(Filter.eq(NoSequenceField.stepKey, stepKey));
if (no==null){
NoSequenceRequest req=new NoSequenceRequest();
req.setStep(1);
req.setStepKey(stepKey);
req.setCurStep(0L);
no = noSequenceApi.createData(req);
}
Long currentStep=no.getCurStep()+no.getStep();
String stepPart = String.format("%0" + stepLength + "d", currentStep);
NoSequenceRequest request=new NoSequenceRequest();
request.setId(no.getId());
request.setCurStep(currentStep);
noSequenceApi.update(request);
return stepPart;
}
}
public class SequenceGenerator implements Generator {
}
public class RegionCodeGenerator implements Generator {
}
为了提高灵活性,我们引入了组合生成器的概念,将基本生成器组合起来以生成更复杂的部分。例如,我们可以创建一个组合生成器来生成日期、随机和步长的组合部分:
Generator compositeDateRandomStepGenerator = new CompositeGenerator(
new DateGenerator("yyyyMMdd"),
new RandomGenerator(4),
new StepGenerator(1)
);
这种设计允许我们轻松地组合生成器以满足不同的业务需求。
@Service
public class NoSequenceExtResource implements NoSequenceExtApi {
@Resource
private NoSequenceApi noSequenceApi;
@Override
public String generate(String key) {
CompositeGenerator generator = new CompositeGenerator(
new KeyGenerator(key),
new DateGenerator("yyyyMMdd"),
new RandomGenerator(4),
new StepGenerator(key,noSequenceApi,6)
);
return generator.generate();
}
}
通过设计一个可灵活扩展的订单编号生成器,我们能够满足不同业务场景的需求。每个生成器负责生成订单编号的一个特定部分,而组合生成器和参数化生成器使得系统更具适应性。通过这种设计,我们可以轻松地适应新的业务需求,确保订单编号的唯一性和可读性。希望这个设计能够为您的业务系统提供一个强大而可维护的订单编号生成解决方案。