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

📄 ustainfo.pas

📁 人事档案管理
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit uStainfo;

interface                                                                 

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, XPMenu, StdCtrls, Mask, DBCtrls, ADODB, ActnList,
  ImgList, DB, Buttons, Grids, DBGrids, jpeg, Menus, DBCtrlsEh, DateUtils,
  DBGridEh, ToolWin, TeEngine, Series, TeeProcs, Chart, ExtDlgs, uStadetail;

type
  TActState = (asAppend, asEdit, asView);

  TfrmStainfo = class(TForm)
    tvPer: TTreeView;
    sptsta: TSplitter;
    ilTree: TImageList;
    gbPer: TGroupBox;
    btnEdit: TBitBtn;
    btnAdd: TBitBtn;
    btnPrior: TBitBtn;
    btnNext: TBitBtn;
    btnDel: TBitBtn;
    btnClose: TBitBtn;
    btnInqu: TBitBtn;
    pmTree: TPopupMenu;
    miSearch: TMenuItem;
    miAdd: TMenuItem;
    miEdit: TMenuItem;
    miDel: TMenuItem;
    miExpand: TMenuItem;
    miClose: TMenuItem;
    btnPrint: TBitBtn;
    xmStaInfo: TXPMenu;
    meoBirth: TMemo;
    aqStaInfo: TADOQuery;
    rbDetail: TRadioButton;
    rbDisplay: TRadioButton;
    dgStaInfo: TDBGridEh;
    fraStaDetail: TfraStaDetail;
    dsStaInfo: TDataSource;
    pnlLeft: TPanel;
    tvPerv: TTreeView;
    imgBtm: TImage;
    btnOk: TBitBtn;
    btnCancel: TBitBtn;
    alSta: TActionList;
    actAdd: TAction;
    actEdit: TAction;
    actOk: TAction;
    actSearch: TAction;
    actPrior: TAction;
    actNext: TAction;
    actDel: TAction;
    actCancel: TAction;
    actPrint: TAction;
    actExit: TAction;
    ilAct: TImageList;
    imgRight: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormResize(Sender: TObject);
    procedure tvPerGetImageIndex(Sender: TObject; Node: TTreeNode);
    procedure tvPerCollapsed(Sender: TObject; Node: TTreeNode);
    procedure tvPerGetSelectedIndex(Sender: TObject; Node: TTreeNode);
    procedure tvPerClick(Sender: TObject);
    procedure miExpandClick(Sender: TObject);
    procedure miCloseClick(Sender: TObject);
    procedure tvPerChange(Sender: TObject; Node: TTreeNode);
    procedure tvPerMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure rbDetailClick(Sender: TObject);
    procedure rbDisplayClick(Sender: TObject);
    procedure dgStaInfoDblClick(Sender: TObject);
    {Act start here}
    procedure actEditExecute(Sender: TObject);
    procedure actAddExecute(Sender: TObject);
    procedure actOkExecute(Sender: TObject);
    procedure actSearchExecute(Sender: TObject);
    procedure actPriorExecute(Sender: TObject);
    procedure actNextExecute(Sender: TObject);
    procedure actDelExecute(Sender: TObject);
    procedure actCancelExecute(Sender: TObject);
    procedure actPrintExecute(Sender: TObject);
    procedure actExitExecute(Sender: TObject);
  private
    { Private declarations }
    procedure InitData;
    procedure FreeTree;
    {取树节点ADeptNode部门员工信息}
    procedure GetStaffs(const ADeptNode: TTreeNode; IsRoot: Boolean);
    {树节点上附加员工信息}
    procedure GetBrithStaff(IsMonth: Boolean);
    procedure SetActState(AActState: TActState);
  public
    { Public declarations }
    ID: Integer;
    sWhr: string;
    procedure LoadTree(ATreeView: TTreeView; AQrySql: string = '');
    procedure FindStaffs(const AStaID: string);
  end;

var
  frmStainfo: TfrmStainfo;

implementation

uses uMain, uData, uGlobal, uDep, uPrint, uWaiting;

var
  nIndex: Integer;

{$R *.dfm}

procedure TfrmStainfo.InitData;
begin
  actOk.Visible := False;
  actCancel.Visible := False;
  dmPer.OpenSta;
  dmPer.OpenExper;
  dmPer.OpenFami;
  dmPer.OpenAP;
  dmPer.OpenTrain;
end;

procedure TfrmStainfo.LoadTree(ATreeView: TTreeView; AQrySql: string);
  procedure RecurTree(ANode: TTreeNode; AID: string);
  var
    aqDeptc: TADOQuery;
    i: Integer;
    pNode: TTreeNode;
    pId: string;
  begin
    if ATreeView = tvPer then AddStaffs(tvPer, ANode, AID, AQrySql);
    aqDeptc := TADOQuery.Create(Self);
    dmPer.OpenQuery(aqDeptc, 'select id, dep from dept where pid=' + AID);
    if aqDeptc.Eof then Exit;
    for i := 0 to aqDeptc.RecordCount - 1 do
    begin
      pId := aqDeptc.FieldByName('id').AsString;
      pNode := ATreeView.Items.AddChildObject(ANode, aqDeptc.FieldByName('dep').AsString, PInteger(aqDeptc.FieldByName('id').AsInteger));
      RecurTree(pNode, pId);
      aqDeptc.Next;
    end;
    aqDeptc.Free;
  end;

  procedure SetBtnState(AState: Boolean);
  begin
    actEdit.Enabled := AState;
    actAdd.Enabled := AState;
    actSearch.Enabled := AState;
    actPrior.Enabled := AState;
    actNext.Enabled := aState;
    actDel.Enabled := AState;
    actPrint.Enabled := AState;
  end;
  
var
  aqDep, aqSta: TADOQuery;
  i: Integer;
  pId: string;
  tnRoot, tnPar: TTreeNode;
begin
  if AQrySql = '' then AQrySql := 'select [id], stano, sname, ename, depid from stainfo where 0=0 and dutystate&''''<>''离职''';
  ATreeView.Items.Clear;
  aqDep := TADOQuery.Create(Self);
  dmPer.OpenQuery(aqDep, 'select id, dep from dept where pid=0');
  aqSta := TADOQuery.Create(Self);
  dmPer.OpenQuery(aqSta, AQrySql);
  if aqDep.Eof then
  begin
    ATreeView.Items.AddFirst(nil, '请先添加部门!');
    aqDep.Free;
    aqSta.Free;
    SetBtnState(False); 
    Exit;
  end;
  ATreeView.OnChange := nil;
  ATreeView.Items.BeginUpdate;
  tnRoot := ATreeView.Items.AddFirst(nil, '公司机构[' + IntToStr(aqSta.RecordCount) + '人]');
  Waiting := TWaiting.Create(Self);
  Waiting.iMax := aqDep.RecordCount - 1;
  Waiting.Show;
  for i := 0 to aqDep.RecordCount - 1 do
  begin
    Waiting.iPosition := i;
    Waiting.Update;
    pId := aqDep.FieldByName('id').AsString;
    tnPar := ATreeView.Items.AddChildObject(tnRoot, aqDep.FieldByName('dep').AsString, PInteger(aqDep.FieldByName('id').AsInteger));
    tnPar.ImageIndex := 0;
    RecurTree(tnPar, pId);
    aqDep.Next;
  end;
  Waiting.Free;
  ATreeView.Items.EndUpdate;
  ATreeView.OnChange := tvPerChange;
  aqSta.Free;
  aqDep.Free;
  if ATreeView.Enabled then ATreeView.SetFocus;

  {生日员工信息}
  meoBirth.Clear;
  GetBrithStaff(True);
  GetBrithStaff(False);
  {选中有数据的节点}
  for i := 0 to ATreeView.Items.Count - 1 do
    if (ATreeView = tvPer) and (ATreeView.Items[i].Data <> nil) and (ATreeView.Items[i].ImageIndex = 2) then
    begin
      ATreeView.Selected := ATreeView.Items[i];
      fraStaDetail.ID := Integer(PNodeData(ATreeView.Items[i].Data)^.Id);
      Exit;
    end
    else if (ATreeView = tvPerv) and (ATreeView.Items[i].Data <> nil) then
    begin
      ATreeView.Selected := ATreeView.Items[i];
      Exit;
    end;
  actEdit.Enabled := False;
  actDel.Enabled := False;
  if ATreeView.Items.Count > 0 then ATreeView.Items.GetFirstNode.Expanded := True;
end;

procedure TfrmStainfo.FormCreate(Sender: TObject);
begin
  Log.Write('进入员工信息管理模块');
  Application.OnHint := nil;
  fraStaDetail.pcSta.ActivePageIndex := 0;
  fraStaDetail.FillData;
  InitData;
  DoubleBuffered := True;
  if frmPer.WindowState <> wsMaximized then WindowState := wsMaximized;
end;

procedure TfrmStainfo.FormDestroy(Sender: TObject);
begin
  FreeTree;
  Application.OnHint := frmPer.OnHint;
end;

procedure TfrmStainfo.FormShow(Sender: TObject);
begin
  meoBirth.Visible := App.StaBirth;
  {载入员工树信息}
  LoadTree(tvPer);
  {载入浏览树信息}
  LoadTree(tvPerv);
  fraStaDetail.SetState(0, True);
  fraStaDetail.pcStaChange(fraStaDetail.pcSta);
  meoBirth.Left := tvPer.Left;
  meoBirth.Top := tvPer.Top + tvPer.Height - meoBirth.Height;
  meoBirth.Width := tvPer.Width;
end;

procedure TfrmStainfo.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := True;
  if fraStaDetail.aqStaDetail.State in [dsInsert, dsEdit] then
  begin
    if MessageBox(Handle, '还有信息没有保存,确定要退出吗?', '提示', mb_IconQuestion + mb_YesNo) = idYes then
      fraStaDetail.aqStaDetail.CancelBatch
    else CanClose := False;
  end;
end;

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

procedure TfrmStainfo.FormResize(Sender: TObject);
begin
  meoBirth.Left := tvPer.Left;
  meoBirth.Top := tvPer.Top + tvPer.Height - meoBirth.Height;
  meoBirth.Width := tvPer.Width;
end;

procedure TfrmStainfo.miExpandClick(Sender: TObject);
begin
  tvPer.FullExpand;
  tvPerv.FullExpand;
end;

procedure TfrmStainfo.miCloseClick(Sender: TObject);
begin
  tvPer.FullCollapse;
  tvPerv.FullCollapse;
end;

procedure Tfrmstainfo.tvPerGetImageIndex(Sender: TObject; Node: TTreeNode);
begin
  if not Node.IsFirstNode then
  begin
    if Node.HasChildren then
    begin
      if Node.Expanded then
        Node.ImageIndex := 1
      else Node.ImageIndex := 0;
    end;
  end
  else if Node.Expanded then
    Node.ImageIndex := 4
  else Node.ImageIndex := 3;
end;

procedure TfrmStainfo.tvPerGetSelectedIndex(Sender: TObject;
  Node: TTreeNode);
begin
  Node.SelectedIndex := Node.ImageIndex;
end;

procedure TfrmStainfo.FreeTree;
var
  i: Integer;
begin
  for i := 0 to tvPer.Items.Count - 1 do
    if (tvPer.Items[i].data <> nil) and (tvPer.Items[i].ImageIndex = 2) then
      Dispose(tvPer.Items[i].data);
end;

procedure TfrmStainfo.SetActState(AActState: TActState);
begin
  case AActState of
    asAppend, asEdit:
    begin
      tvPer.Enabled := False;
      actEdit.Visible := False;
      actAdd.Visible := False;
      actSearch.Visible := False;
      actPrior.Visible := False;
      actNext.Visible := False;
      actDel.Visible := False;
      actPrint.Visible := False;
      actExit.Visible := False;
      actOk.Visible := True;
      actCancel.Visible := True;
      if AActState = asEdit then
      begin
        actOk.Caption := '确 定';
        fraStaDetail.deStano.Color := ViewColor;
        fraStaDetail.deStano.ReadOnly := True;
      end
      else actOk.Caption := '提 交';
    end;
    asView:
    begin
      actOk.Caption := '提 交';
      actOk.Visible := False;
      actCancel.Visible := False;
      tvPer.Enabled := True;
      actEdit.Visible := True;
      actAdd.Visible := True;
      actSearch.Visible := True;
      actPrior.Visible := True;
      actNext.Visible := True;
      actDel.Visible := True;
      actPrint.Visible := True;
      actExit.Visible := True;
    end;
  end;
end;

procedure TfrmStainfo.tvPerCollapsed(Sender: TObject; Node: TTreeNode);
begin
  tvPer.Repaint;
  tvPerv.Repaint;

⌨️ 快捷键说明

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