unit uCard;
interface
uses Classes, SysUtils, DB, ADODB, DateUtils, StrUtils, uCellPrintInterface,
Sys_ADOQ_Interface, uInterface, uReadCard_Interface, uReadCardDllLoader,
Graphics,uPubData,uSecIDCARDinterface,uIDCardLoader,Dialogs,Contnrs;
type
TCategory = (SP, ID, YB, TL, ZG, NH); //卡类别
TRecCardType = record //字段取自
Name: Integer; //0手工,1身份证,2医保卡
Sex: Integer;
Birth: Integer;
Age: Integer;
end;
TCardInfo=record
CardNo:Int64;
IDNo:string;
YbNo:string;
iSex:Integer;
Birthday:string;
iAge:Integer;
Area:string;
end;
TData = class(TObject)
private
FAge: Integer;
FBirthDay: string;
FSex: string;
FArea: string;
FS1, FS2, FS3, FS4: string; //冗余字段
FI1, FI2, FI3, FI4: Integer; //冗余字段
procedure SetAge(const Value: Integer);
procedure SetBirthDay(const Value: string);
public
property Age: Integer read FAge write SetAge;
property BirthDay: string read FBirthDay write SetBirthDay;
property Sex: string read FSex write FSex;
property Area: string read FArea write FArea;
property S1: string read FS1 write FS1;
property S2: string read FS2 write FS2;
property S3: string read FS3 write FS3;
property S4: string read FS4 write FS4;
property I1: Integer read FI1 write FI1;
property I2: Integer read FI2 write FI2;
property I3: Integer read FI3 write FI3;
property I4: Integer read FI4 write FI4;
end;
TCard = class(TObject)
private
FCardNo: string;
//FCardData: TData;
FPriority, FOldPriority: Integer;
FCardInfo:TCardInfo;
//1:射频卡 2:身份证 3:医保卡(4:铁路医保卡,5:职工医保卡,6:农合卡)
FCardType, FOldCardType: TRecCardType;
function GetCardInfo(var RecCardInfo:TCardInfo): Integer; virtual; abstract;
protected
procedure SetToCardType(Card: TRecCardType; i: Integer);
public
procedure SetCardType(iName, iSex, iBirth, iAge: Integer);
function ReadCard: Integer; virtual;
property CardNo: string read FCardNo write FCardNo;
//property CardData: TData read FCardData write FCardData;
property CardType: TRecCardType read FCardType write FCardType;
property OldCardType: TRecCardType read FOldCardType write FOldCardType;
property Priority: Integer read FPriority write FPriority;
property OldPriority: Integer read FOldPriority write FOldPriority;
property CardInfo:TCardInfo read FCardInfo write FCardInfo;
constructor Create; virtual;
destructor Destroy; override;
end;
TSPCard = class(TCard)
private
FReadCardClass: IReadCard;
FCount: Integer;
public
function GetCardInfo(var RecCardInfo:TCardInfo): Integer; override;
property Count: Integer read FCount write FCount;
property ReadCardClass: IReadCard read FReadCardClass write FReadCardClass;
constructor Create; override;
destructor Destroy;override;
end;
TIDCard = class(TCard)
private
FSEIDCard:TIDCardLoader;
FIDCardInfo:TIDCARDALLINFO;
FBitmap:TBitmap;
FErrMessage:String;
procedure IDCardErr(ErrMsg: Integer);
public
function GetIDInfoGetDInfo(const CardNo: string; var Sex, BirthDay: string; var Age: Integer;
var Area: string): Integer;
property SEIDCard:TIDCardLoader read FSEIDCard write FSEIDCard;
property IDCardInfo:TIDCARDALLINFO read FIDCardInfo write FIDCardInfo;
property Bitmap:TBitmap read FBitmap write FBitmap;
property ErrMessage:string read FErrMessage write FErrMessage;
constructor Create; override;
destructor Destroy;override;
end;
TYbCard = class(TCard)
private
constructor Create; override;
end;
TTlCard = class(TYbCard)
private
constructor Create; override;
end;
TZgCard = class(TYbCard)
private
constructor Create; override;
end;
TNhCard = class(TYbCard)
private
constructor Create; override;
end;
TCardFactory = class(TObject)
private
AList: TList;
FPriority, FOldPriority: Integer;
FCardType, FOldCardType: TRecCardType;
function SetCreate(sClassName: string): TCard;
procedure SetCardType(CardType: TRecCardType; iName, iSex, iBirth, iAge: Integer);
public
constructor Create;
destructor Destroy; override;
property Priority: Integer read FPriority write FPriority;
property OldPriority: Integer read FOldPriority write FOldPriority;
property CardType: TRecCardType read FCardType write FCardType;
property OldCardType: TRecCardType read FOldCardType write FOldCardType;
function CreateCard(Category: TCategory): TCard;
end;
implementation
{ TData }
procedure TData.SetAge(const Value: Integer);
begin
if Value > 120 then
FAge := -1 //表示年龄错误
else
FAge := Value;
end;
procedure TData.SetBirthDay(const Value: string);
begin
FBirthDay := Value;
end;
{ TCard }
constructor TCard.Create;
begin
//FCardData := TData.Create;
{if not Assigned(ReadCardLoader) then
ReadCardLoader := TReadCardLoader.Create;
FReadCardClass := ReadCardLoader.GetIReadCard;}
end;
destructor TCard.Destroy;
begin
//FreeAndNil(FCardData);
inherited;
end;
procedure TCard.SetCardType(iName, iSex, iBirth, iAge: Integer);
begin
with FCardType do
begin
Name := iName;
Sex := iSex;
Birth := iBirth;
Age := iAge;
end;
end;
function TCard.ReadCard: Integer;
begin
//
end;
procedure TCard.SetToCardType(Card: TRecCardType; i: Integer);
begin
with Card do
begin
Name := i;
Sex := i;
Birth := i;
Age := i;
end;
end;
{ TIDCard }
constructor TIDCard.Create;
begin
inherited;
FSEIDCard := TIDCardLoader.Create;
FSEIDCard.GetIReadCard.initDriver;
SetToCardType(FCardType, 2);
FPriority := 2;
end;
///
/// 获得身份证信息
///
/// 身份证号
/// 性别
/// 生日
/// 年龄
/// 省份
/// 返回值,0表示成功 1:位长不对 2:为非数字 3:生日格式不对 4:年龄错误
destructor TIDCard.Destroy;
begin
if Assigned(FSEIDCard) then
FSEIDCard.Free;
inherited;
end;
function TIDCard.GetIDInfoGetDInfo(const CardNo: string; var Sex,
BirthDay: string; var Age: Integer; var Area: string): Integer;
var
iCardNo: Int64;
iYear, iSex: Integer;
sBirth, fBirth: string;
dBirth: TDateTime;
begin
Result := 0; //表示身份证输入正确
if (Length(CardNo) <> 15) and (Length(CardNo) <> 18) then
begin
Result := 1; //位长不对
Exit;
end;
if Length(CardNo) = 15 then
begin
if not TryStrToInt64(CardNo, iCardNo) then
begin
Result := 2; //必须为数字
Exit;
end;
sBirth := '19' + Copy(CardNo, 7, 6);
iSex := StrToInt(Copy(CardNo, 15, 1));
if Odd(iSex) then
Sex := '男'
else
Sex := '女';
end
else
begin
if not TryStrToInt64(Copy(CardNo, 1, 17), iCardNo) then
begin
Result := 2; //前17位必须为数字
Exit;
end;
sBirth := Copy(CardNo, 7, 8);
iSex := StrToInt(Copy(CardNo, 17, 1));
case iSex of
0: Sex := '未知';
1: Sex := '男';
2: Sex := '女';
9: Sex := '未说明';
end;
end;
fBirth := Format('%s-%s-%s', [Copy(sBirth, 1, 4),
Copy(sBirth, 5, 2), Copy(sBirth, 7, 2)]);
if not TryStrToDate(fBirth, dBirth) then
begin
Result := 3; //生日格式不对
Exit;
end;
iYear := YearsBetween(Date, dBirth);
if (iYear < 0) or (iYear >= 120) then
begin
Result := 4; //年龄错误
Exit;
end;
BirthDay := sBirth;
Age := iYear;
Area := GetArea(StrToInt(Copy(CardNo, 1, 2)));
end;
///
/// 获取身份证读取错误信心
///
///
procedure TIDCard.IDCardErr(ErrMsg: Integer);
begin
case Errmsg of
0: FErrMessage :='读卡错误';
-1: FErrMessage :='相片解码错误';
-2: FErrMessage :='wlt文件后缀错误';
-3: FErrMessage :='wlt文件打开错误';
-4: FErrMessage :='wlt文件格式错误';
-5: FErrMessage :='软件未授权';
-11: FErrMessage :='无效参数';
end;
end;
{ TSPCard }
///
/// 就医卡的初始化
///
constructor TSPCard.Create;
begin
inherited;
if not Assigned(ReadCardLoader) then
ReadCardLoader := TReadCardLoader.Create;
FReadCardClass := ReadCardLoader.GetIReadCard;
FReadCardClass.UsePosition :=0;
FReadCardClass.Active :=True;
SetToCardType(FCardType, 1);
FPriority := 1;
end;
destructor TSPCard.Destroy;
begin
//if Assigned(ReadCardLoader) then
// ReadCardLoader.Free;
inherited;
end;
///
/// 获得卡信息
///
///
///
function TSPCard.GetCardInfo(var RecCardInfo:TCardInfo): Integer;
begin
RecCardInfo.CardNo := ReadCardClass.CardNo;
with ReadCardClass.IDCardInfo do
begin
RecCardInfo.iSex := Sex;
RecCardInfo.iAge := Age;
RecCardInfo.BirthDay := BirthDate;
RecCardInfo.Area := Address;
RecCardInfo.IDNo := IdentityCard;
SetCardType(NameSource, SexSource, BirthSource, AgeSource);
end;
end;
{ TYbCard }
constructor TYbCard.Create;
begin
inherited;
SetToCardType(FCardType, 3);
FPriority := 3;
end;
{ TNhCard }
constructor TNhCard.Create;
begin
inherited;
SetToCardType(FCardType, 6);
FPriority := 6;
end;
{ TZgCard }
constructor TZgCard.Create;
begin
inherited;
SetToCardType(FCardType, 5);
FPriority := 5;
end;
{ TTlCard }
constructor TTlCard.Create;
begin
inherited;
SetToCardType(FCardType, 4);
FPriority := 4
end;
{ TCardFactory }
constructor TCardFactory.Create;
begin
AList := TList.Create;
end;
function TCardFactory.CreateCard(Category: TCategory): TCard;
var
i: Integer;
FNo: Boolean;
begin
FNo := False;
case Category of
SP: Result := SetCreate('TSPCard');
ID: Result := SetCreate('TIDCard');
YB: Result := SetCreate('TYbCard');
TL: Result := SetCreate('TTlCard');
ZG: Result := SetCreate('TZgCard');
NH: Result := SetCreate('TNhCard');
end;
end;
destructor TCardFactory.Destroy;
var
i: Integer;
begin
for i := 0 to AList.Count-1 do
begin
//if TObject(AList.Items[i]).ClassName='TSPCard' then
// TSPCard(Alist.Items[i]).Free;
if Assigned(AList[i]) then
TObject(AList[i]).Free;
end;
{
for i:=Alist.count-1 downto 0 do
begin
Alist.Delete(i);
end;
}
AList.clear;
AList.Free;
inherited;
end;
procedure TCardFactory.SetCardType(CardType: TRecCardType; iName, iSex, iBirth, iAge: Integer);
begin
CardType.Name := iName;
CardType.Sex := iSex;
CardType.Birth := iBirth;
CardType.Age := iAge;
end;
function TCardFactory.SetCreate(sClassName: string): TCard;
var
i: Integer;
FNo: Boolean;
begin
FNo := False;
for i := 0 to Alist.Count - 1 do
begin
if TObject(AList.Items[i]).ClassName = sClassName then
begin
FNo := True;
Result := Alist[i];
Break;
end;
end;
if not FNo then
begin
//还没有生成该类的实例
if AList.Count = 0 then
begin
FOldPriority := 0;
SetCardType(FOldCardType, 0, 0, 0, 0);
end
else
begin
FOldPriority := FPriority;
SetCardType(FOldCardType, FCardType.Name, FCardType.Sex,
FCardType.Birth, FCardType.Age);
end;
if sClassName = 'TSPCard' then
begin
FPriority := 1;
Result := TSPCard.Create;
AList.Add(Result as TSPCard);
end
else if sClassName = 'TIDCard' then
begin
FPriority := 2;
Result := TIDCard.Create;
AList.Add(Result as TIDCard);
end
else if sClassName = 'TYbCard' then
begin
FPriority := 3;
Result := TYbCard.Create;
AList.Add(Result as TYbCard);
end
else if sClassName = 'TTlCard' then
begin
FPriority := 4;
Result := TTlCard.Create;
AList.Add(Result as TTlCard);
end
else if sClassName = 'TZgCard' then
begin
FPriority := 5;
Result := TZgCard.Create;
AList.Add(Result as TZgCard);
end
else if sClassName = 'TNhCard' then
begin
FPriority := 6;
Result := TNhCard.Create;
AList.Add(Result as TNhCard);
end;
end
else
begin
//已生成该类实例
if sClassName = 'TSPCard' then
begin
FOldPriority := 1;
FPriority := 1;
end
else if sClassName = 'TIDCard' then
begin
FOldPriority := 2;
FPriority := 2;
end
else if sClassName = 'TYbCard' then
begin
FOldPriority := 3;
FPriority := 3;
end
else if sClassName = 'TTlCard' then
begin
FOldPriority := 4;
FPriority := 4;
end
else if sClassName = 'TZgCard' then
begin
FOldPriority := 5;
FPriority := 5;
end
else if sClassName = 'TNhCard' then
begin
FOldPriority := 6;
FPriority := 6;
end;
end;
end;
end.