⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 card_firini.pas

📁 亚惠快餐管理信息系统 包括亚惠快餐管理的各项功能
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit Card_FirIni;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ToolWin, ComCtrls, ExtCtrls, DBCtrls, StdCtrls, Buttons, Mask,
  Grids, DBGrids, DB, IniFiles, Spin, ImgList;

type
  TFrmCard_FirIni = class(TForm)
    Bevel1: TBevel;
    DataSource1: TDataSource;
    Panel1: TPanel;
    CoolBar1: TCoolBar;
    ToolBar1: TToolBar;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    BitBtn4: TBitBtn;
    ToolBar3: TToolBar;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    Panel2: TPanel;
    DBGrid1: TDBGrid;
    Panel3: TPanel;
    Panel4: TPanel;
    ToolButton1: TToolButton;
    ImageList1: TImageList;
    Panel5: TPanel;
    Label1: TLabel;
    DBEdit1: TDBEdit;
    Label2: TLabel;
    DBText1: TDBText;
    Label3: TLabel;
    DBEdit2: TDBEdit;
    Panel6: TPanel;
    Label6: TLabel;
    Label4: TLabel;
    Label12: TLabel;
    DBText3: TDBText;
    Panel7: TPanel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Panel8: TPanel;
    Label5: TLabel;
    SpinEdit1: TSpinEdit;
    Memo1: TMemo;
    Panel9: TPanel;
    DBComboBox2: TDBComboBox;
    DBComboBox1: TDBComboBox;
    Button2: TButton;
    DBText4: TDBText;
    DBText5: TDBText;
    DBEdit3: TDBEdit;
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure DBEdit1DblClick(Sender: TObject);
    procedure DBEdit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBEdit1Exit(Sender: TObject);
    procedure DBEdit2Exit(Sender: TObject);
    procedure DBEdit7Enter(Sender: TObject);
    procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    procedure BitBtn4Click(Sender: TObject);
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBEdit3DblClick(Sender: TObject);
    procedure DBEdit3Change(Sender: TObject);
    procedure DBEdit5DblClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DBComboBox2Change(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    procedure GetIniValue;
    procedure SetValue;
  public
    { Public declarations }
    PassWord1: string;
    Comhm: integer;
    OldCardFlag: Boolean;
    IsNewMul: Boolean;
    procedure ScanData;
    function IfEditNull: Boolean;
    function SaveToDb: Boolean;
    //function IfAlreadyIni(Rq: TDate; Kh, CardStatus: string): Boolean;
    //function IfAlreadySold(Rq: TDate; CardStatus, Kh: string): Boolean;
    function DeleteFromDB(rq: TDate; cardno, machineno, cardstatus, czyname:
      string): Boolean;
    function DeleteFromSubDB(rq: TDate; cardno, machineno, cardstatus, czyname:
      string): Boolean;
    function InsertToDb(rq: TDate; IcKh: string; CkJe, TkJe, Yj: Double; KhName:
      string; ValDaynum: integer; CardStatus, CardLx, CzyName, MachineNo,
      CardValue: string; Ye: Double): BooLean;
    function InsertToSubDb(rq: TDate; IcKh: string; Yj: Double; ValDaynum:
      integer; CardStatus, CardLx, CzyName, MachineNo, CardValue: string):
      BooLean;
    function WriteToCard(PassWord: Pchar; Comh: smallint; Cardh: PChar; ValDay:
      PChar; CardType: string; UserPass1: string; Discount: string; Ye: string):
      smallint;
    function ReadFromDll(filelx: string; comh: smallint; passwordz: PChar):
      smallint;
    procedure GetCardNo;
    procedure IniMulCard;
    function GetIcKh(CardLx, CardValue: string; var First:
      string; var Second: string): Boolean;
    function SaveToDb1(rq: TDate; IcKh, KhName, CardStatus, CardLx, CzyName,
      MachineNo, CardValue, ValDate: string;
      CkJe, TkJe, Yj, Ye: Double; ValDayNum: integer): Boolean;
    function GetMaxKh(CardLx, CardValue: string; var MaxKh: string): Boolean;
    procedure IniComboBox;
    function ChangeKh(CardLx, CardValue: string): Boolean;
    procedure GetPreCardXx(CardNo: string);
    function ReadKh(var CardNo: string; comh: smallint; pass:
      Pchar): Boolean;
    function GetCardStatus(Rq: TDate; Kh: string): Boolean;
    function GetNewCardStatus(Rq: TDate; Kh: string): Boolean;

  end;

procedure SetWork;
implementation
uses Card_DataModule, DI_DataModul1, PublicUnit, DI_DBCalendar, main,
  DI_DBDictionery, PZ_DmDic, Card_ChangePsw, ADODB, Card_ScanXx,
  Card_BackBadCard, Card_Result, PZ_RqXz;

{$R *.dfm}

procedure SetWork;
var
  FrmCard_FirIni: TFrmCard_FirIni;
begin
  Screen.Cursor := crHourGlass;
  Application.CreateForm(TFrmCard_FirIni,FrmCard_FirIni);
  FrmCard_FirIni.Show;
  Screen.Cursor := CrDefault;
end;

{与窗体有关}

procedure TFrmCard_FirIni.FormShow(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  with CardSell_DataModule.ADOConnection1 do
  begin
    Close;
    ConnectionString := 'Provider=SqlOLEDB.1;Persist Security Info=True;User ID='
      + PublicUnit.DBUser + ';Password=' + PublicUnit.DBPass +
      ';Initial Catalog='
      + PublicUnit.DbName + ';Data Source=' + PublicUnit.ServerName;
    try
      Open;
    except
      Screen.Cursor := crDefault;
      ShowMessage('连接业务数据库失败,该系统无法正常工作!');
      Exit;
    end;
  end;
  IniComboBox;
  ScanData;
  PublicUnit.IfSaveClick := False;
  PublicUnit.IfSaveClick := False;
  Screen.Cursor := crDefault;
  //InitialEdit;
end;

procedure TFrmCard_FirIni.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;

{-------------------------------------------------------------------------------}

procedure TFrmCard_FirIni.ScanData;
var
  CardStatus: string;
  k, wid: integer;
begin
  Screen.Cursor := crHourGlass;
  DataSource1.DataSet := CardSell_DataModule.ADOQuery2;
  CardStatus := '未使用';
  with CardSell_DataModule.ADOQuery2 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Select * ');
    Sql.Add('From SCSJ_TSKXX Where 卡片状态=''' + Trim(CardStatus) +
      ''' Order By 日期');
    try
      Open;
    except
      Screen.Cursor := crDefault;
      ShowMessage('无法浏览售卡信息!');
      Exit;
    end;
    for k := 0 to FieldCount - 1 do
    begin
      if k = 1 then
        wid := 40
      else
        wid := 50;
      DBGrid1.Columns[k].Title.Alignment := taCenter;
      DBGrid1.Columns[k].Width := DBGrid1.Columns[k].Field.DisplayWidth + wid;
    end;
    Screen.Cursor := crDefault;
    if PublicUnit.IfSaveClick then
      PublicUnit.IfSaveClick := False;
    if PublicUnit.IfDeleteClick then
      PublicUnit.IfDeleteClick := False;
  end;
  SetDBGridFieldsDisplay(DbGrid1);
end;

//判断是否有退卡记录

function TFrmCard_FirIni.GetCardStatus(Rq: TDate; Kh: string): Boolean;
var
  Status1: string;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery3 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Select top 1 卡片状态');
    Sql.Add('From SCSJ_TSKXX Where');
    Sql.Add('Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
    Sql.Add('And IC卡号=''' + Trim(Kh) + '''');
    Sql.Add('Order by 序号 DESC');
    //Sql.SaveToFile('c:\dd.sql');
    try
      Open;
    except
      Screen.Cursor := crDefault;
      ShowMessage('无法浏览卡片状态信息!');
      Exit;
    end;
    if RecordCount = 0 then
    begin
      ShowMessage('此卡片还未退还,不能初始化!');
      Exit;
    end;
    if FieldByName('卡片状态').AsString <> '退卡' then
    begin
      ShowMessage('此卡片还未退还,不能初始化!');
      Exit;
    end;
  end;
  Result := True;
end;
//判断新卡的卡号是否在数据库中已经存在,如果存在,说明卡号不合法

function TFrmCard_FirIni.GetNewCardStatus(Rq: TDate; Kh: string): Boolean;
begin
  Result := False;
  with CardSell_DataModule.ADOQuery3 do
  begin
    Close;
    Sql.Clear;
    Sql.Add('Select *');
    Sql.Add('From SCSJ_TSKXX Where');
    Sql.Add('Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
    Sql.Add('And IC卡号=''' + Trim(Kh) + '''');
    try
      Open;
    except
      Screen.Cursor := crDefault;
      ShowMessage('无法浏览卡片状态信息!');
      Exit;
    end;
    if RecordCount <> 0 then
    begin
      ShowMessage('此卡片不是新卡!');
      Exit;
    end;
  end;
  Result := True;
end;

function TFrmCard_FirIni.SaveToDb: Boolean;
var
  rq: TDate;
  ValDayNum: integer;
  IcKh, KhName, CardStatus, CardLx, CzyName, MachineNo, CardValue, ValDate,
    Ckje1, ResultString: string;
  CkJe, TkJe, Yj, Ye: Double;
  returnvalue: smallint;
  pass: PChar;
begin
  Result := False;
  ResultString := '';
  pass := Pchar(Trim(PassWord1));
  //校验密码
  returnvalue := ReadFromDll('checkpass', Comhm, pass);
  if returnvalue <> 1 then
    Exit;
  with CardSell_DataModule.ADOQuery2 do
  begin
    FieldByName('有效天数').AsInteger := 0;
    rq := StrToDate(DateTimeToStr(Fields[0].AsDateTime));
    IcKh := Trim(Fields[1].AsString);
    CkJe := Fields[2].AsFloat;
    TkJe := 0;
    Yj := Fields[4].AsFloat;
    KhName := '';
    ValDayNum := FieldByName('有效天数').AsInteger;
    CardStatus := '未使用';
    CardLx := Trim(Fields[8].AsString);
    CzyName := Trim(Fields[9].AsString);
    MachineNo := Trim(Fields[10].AsString);
    CardValue := Trim(Fields[11].AsString);
    Ye := CKJe;
    ValDate := '0';
  end;
  CkJe1 := FloatToStr(CkJe * 100);
  //写卡(密码,端口号,卡号,有效期,卡片类型,用户密码,折扣率,卡内余额)
  returnvalue := WriteToCard(Pchar(pass), Comhm, Pchar(IcKh), '00000000', '04',
    '0000', '15', Trim(CkJe1));
  if returnvalue = 0 then
  begin
    ShowMessage('写卡错误!');
    Exit;
  end;
  {if not DeleteFromDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
    Exit;
  if not DeleteFromSubDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
    Exit;}
  if not InsertToDb(rq, IcKh, CkJe, TkJe, Yj, KhName, ValDayNum, CardStatus,
    CardLx, CzyName, MachineNo, CardValue, Ye) then
    Exit;
  if not InsertToSubDb(rq, IcKh, Yj, ValDayNum, CardStatus, CardLx, CzyName,
    MachineNo, CardValue) then
    Exit;
  Result := True;
  ResultString := '初始化日期: ' + DateToStr(rq) + #13 + #10;
  ResultString := ResultString + '卡号:       ' + IcKh + #13 + #10;
  ResultString := ResultString + '卡片面值:   ' + CardValue + #13 + #10;
  ResultString := ResultString + '押金:       ' + FloatToStr(Yj) + #13 + #10;
  ResultString := ResultString + '存款金额:   ' + FloatToStr(CkJe) + #13 + #10;
  ResultString := ResultString + '卡片状态:   ' + CardStatus + #13 + #10;
  ResultString := ResultString + '卡片类型:   ' + CardLx + #13 + #10;
  ResultString := ResultString + '操作员姓名: ' + CzyName + #13 + #10;
  ResultString := ResultString + '售卡机编码: ' + MachineNo + #13 + #10;
  ShowMessage('卡片初始化成功!');
  Card_Result.SetWork(ResultString, '卡片初始化结果');
end;

//同时初始化多张卡片

function TFrmCard_FirIni.SaveToDb1(rq: TDate; IcKh, KhName, CardStatus, CardLx,
  CzyName, MachineNo, CardValue, ValDate: string;
  CkJe, TkJe, Yj, Ye: Double; ValDayNum: integer): Boolean;
var
  CkJe1: string;
  returnvalue: smallint;
  pass: PChar;
begin
  Result := False;
  pass := Pchar(Trim(PassWord1));
  //校验密码
  returnvalue := ReadFromDll('checkpass', Comhm, pass);
  if returnvalue <> 1 then
    Exit;
  CkJe1 := FloatToStr(CkJe * 100);
  //写卡(密码,端口号,卡号,有效期,卡片类型,用户密码,折扣率,卡内余额)
  returnvalue := WriteToCard(Pchar(pass), Comhm, Pchar(IcKh), '00000000', '04',
    '0000', '15', Trim(CkJe1));
  if returnvalue = 0 then
  begin
    ShowMessage('写卡错误!');
    Exit;
  end;
  if not DeleteFromDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
    Exit;
  if not DeleteFromSubDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
    Exit;
  if not InsertToDb(rq, IcKh, CkJe, TkJe, Yj, KhName, ValDayNum, CardStatus,
    CardLx, CzyName, MachineNo, CardValue, Ye) then
    Exit;
  if not InsertToSubDb(rq, IcKh, Yj, ValDayNum, CardStatus, CardLx, CzyName,
    MachineNo, CardValue) then
    Exit;
  Result := True;
end;

{判断Edit是否有为空的字段}

function TFrmCard_FirIni.IfEditNull: Boolean;
var
  i: integer;
  Temp: TComponent;
begin
  Result := True;
  for i := 0 to ComponentCount - 1 do
  begin
    Temp := Components[i];
    if (Temp is TDBEdit) then
      if TDBEdit(Temp).Text = '' then
      begin
        ShowMessage(TDBEdit(Temp).Hint + '不能为空');
        TDBEdit(Temp).SetFocus;
        Exit;
      end;
  end;
  Result := False;
end;

//向卡中写入数据

function TFrmCard_FirIni.WriteToCard(PassWord: Pchar; Comh: smallint; Cardh:
  PChar; ValDay: PChar; CardType: string; UserPass1: string; Discount: string;
  Ye:
  string): smallint;
type
  TDllFunc = function(pass: Pchar; comh: smallint; cardno: PChar; valdate:
    PChar; dyte: string; userpass: string; disc: string; blance: string):
    smallint; stdcall;
var
  alib: THandle;
  proc: TDllFunc;
  FileName: string;
  x: FARPROC;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
  alib := LoadLibrary(PChar(FileName));
  if alib = 0 then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('无法访问ic卡机的函数iccardp.dll!');
    Exit;
  end;
  x := GetProcAddress(alib, PChar('writeCard'));
  if x = nil then
  begin
    Screen.Cursor := crDefault;
    ShowMessage('写卡函数writeCard调用失败!');
    FreeLibrary(alib);
    Exit;
  end;
  Proc := TDllFunc(x);
  if @Proc = nil then
  begin
    Screen.Cursor := crDefault;
    x := nil;
    FreeLibrary(alib);
    ShowMessage('无法访问ic卡机写卡函数!');
    Exit;
  end;
  try
    Result := Proc(PassWord, Comh, Cardh, ValDay, CardType, UserPass1, Discount,
      Ye);
  except
    ShowMessage('写卡函数运行失败!');
    proc := nil;
    FreeLibrary(alib);
  end;
  proc := nil;
  FreeLibrary(alib);
end;

{删除售卡信息SCSJ_TSKXX表中相同的记录}

function TFrmCard_FirIni.DeleteFromDB(rq: TDate; cardno, machineno, cardstatus,
  czyname: string): Boolean;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -