2. 生成編號
Code
1 function TNumberRule.GetNextNumber(const number: string): string;
2 begin
3 ParseNumber(number);
4 BuildNumber;
5 Result := GenerateNumber;
6 end;
7
8 // ParseNumber負責根據各個NumberPart的Length把編號拆成多個段,BuildNumber中封裝了規則的更新邏輯,GenerateNumber則生成編號。
9
10 procedure TNumberRule.BuildNumber;
11 var
12 part: TNumberPart;
13 value: string; // 拆分的編號
14 carrIEd: Boolean; // 進位標志
15 i: Integer;
16 begin
17 Assert(fParts.Count = fList.Count);
18 carrIEd := False;
19 for i := fParts.Count - 1 downto 0 do // 由低位向高位遍歷
20 begin
21 part := TNumberPart(fParts[i]);
22 value := fList[i];
23 if part is TSequenceNumberPart then
24 begin
25 TSequenceNumberPart(part).SetValue(value);
26 if carrIEd or (i = fParts.Count - 1) then
27 begin
28 TSequenceNumberPart(part).Next(carrIEd);
29 end
30 end
31 else if (part is TDateTimeNumberPart) and
32 not SameText(TDateTimeNumberPart(part).Value, value) then
33 begin
34 ResetSequenceParts(part); // 如果日期不同則重置序列部分編號
35 end;
36 end;
37 if carrIEd then
38 begin
39 raise ENumberException.Create(SNumberOutOfRange);
40 end;
41 end
P.S. 序列部分(TSequenceNumberPart)的核心功能實現委托給任意進制計算器(BaseNCalculator),具體可參考源代碼。