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

📄 datamodule.pas

📁 某大型医院护士站
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    procedure qryInWardCalcFields(DataSet: TDataSet);
    procedure OrderItemITEMIDChange(Sender: TField);
    procedure OrderItemFilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    procedure OrderItemBeforePost(DataSet: TDataSet);
    procedure OrderItemAfterPost(DataSet: TDataSet);
    procedure OrderItemBeforeDelete(DataSet: TDataSet);
    procedure OrderItemBeforeEdit(DataSet: TDataSet);
    procedure qryPatientAtonceCalcFields(DataSet: TDataSet);
    procedure qrySendPatCalcFields(DataSet: TDataSet);
    procedure qryOtherBillCalcFields(DataSet: TDataSet);
    procedure qryOtherBillNewRecord(DataSet: TDataSet);
    procedure qryOtherBillFilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    procedure qryOtherBillBeforePost(DataSet: TDataSet);
    procedure qryOtherBillBeforeClose(DataSet: TDataSet);
    procedure qryOtherBillBeforeDelete(DataSet: TDataSet);
    procedure tblDtlPatSubCalcFields(DataSet: TDataSet);
  private
    { Private declarations }
  public

    //全局变量
    isNurse    : Boolean;   //是否护士操作权限
    isInCharge : Boolean;   //是否护长操作权限
    isSysAdm   : Boolean;   //是否系统管理员操作权限
    isChecked  : Boolean;   //是否一检查过身份

    currWardid   : string;  //当前病区号
    currWardName : String;  //当前病区名称
    currBedNo    : String;
    currOperatorno   : String;
    currOperatorName : String;
    csRoomfeeClass,
    csOtherFeeClass : String;

    //以下是医嘱录入使用的暂时变量
    LackFlag : SmallInt;       //缺药标志
    IsLongOrder : Boolean;     //是否新增长期医嘱
    IsViewPart : Boolean;      //是否查看部分医嘱
    FKindID : Smallint;        //当前配号
    FStartTime : TDateTime;    //记下上次输入的开始时间

    FUsageId : String;         
    FUsagename : String;
    FUseTimes: Integer;
    FUseTimesName: String;
    FIsPayBill   :SmallInt;      // 是否需要记账
    FExcost      :SmallInt;      // 是否贵重药品
    FIsDanger    :SmallInt;      // 是否麻毒药品
    FOpenDoc :string;            //记下上次输入的开医嘱医生
    OrderItemFilterNo : Integer; //医嘱过滤状态字
    EditingField : TField;       //当前选中的医嘱字段
    FPayBillDate : TDate;

    itemid  : String;
    LScount : Integer;
    modiopno : string;
    workdate : TDate;
    monthdate1 : TDate;
    monthdate2 : TDate;
    maxendtime : tdatetime;
    maxamt : double;

    //系统参数
    SUserName :string;           //用户名称
    SStartPoint    :TTime;       //费用起始时间
    SStrTimeCnstn  :Integer;     //医嘱开始时间的录入限制
    SEndTimeCnstn  :Integer;     //医嘱停止时间的录入限制
    SIsAutoAddIvdrip :Integer;   //是否自动添加滴注附加项目
    SSendStrTime   :TTime;       //指示发药起始时间
    SSendEndTime   :TTime;       //指示发药截止时间
    SSendMaxSnap   :Integer;     //指示发送的最大间距
    SBillDateCnst  :Integer;     //帐单日期录入时间限制
    SIsCalcHl      :Integer;     //最后一天护理费是否计算
    SRecallCnstn   :Integer;     //医嘱召回时间限制
    SEMStrTime     :TTime;       //紧急发送起始时间
    SEMEndTime     :TTime;       //紧急发送截至时间
    SIsStopConfirm :Integer;     //停医嘱是否确认
    SCanModiExorder:Integer;     //是否可以修改附加项目

    //运行环境参数
    RIsAutoStopOrder :Integer;   //转科是否自动停止医嘱


    procedure SetSystemTime;          //计算机日期时间
    procedure DownLoadData;           //下载基本数据
    procedure ReadRunParams;           //装载运行环境参数
    procedure LoadSysParams;           //装载系统参数
    function  GetSerialID() :string;  //获得唯一标识
  end;

var
  DM: TDM;

implementation

uses HisUtilitis, OrderItem, PRNDataModule;

{$R *.DFM}

procedure TDM.DataModuleCreate(Sender: TObject);
begin
  IsNurse    := False;      //是否护士操作权限
  IsInCharge := False;   //是否护长操作权限
  IsSysAdm   := False;     //是否系统管理员操作权限
  IsChecked  := False;

  currWardid   := '';   //当前病区号
  currWardName := '';  //当前病区名称
  currBedNo    := '';
  currOperatorno   := '';
  currOperatorName := '';
  IsLongOrder := True;    //缺省是选择长嘱
  csRoomFeeClass := '01';
  csOtherFeeClass := '08';
  RIsAutoStopOrder := 1;
end;

procedure TDM.SetSystemTime;
var
  SystemTime : TSystemTime;
begin
  with DM.spServerTime do
  begin
    Execproc;
    DateTimeToSystemTime(
        DM.spServerTime.Params[0].AsDateTime, SystemTime);
    SetLocalTime(SystemTime);
    Close;
  end;
end;

procedure TDM.DownLoadData;    //下载基本数据
begin
  Screen.Cursor := crHourGlass;
  OrderCost.Close;
  Frequency.Close;
  Usage.Close;
  Doctor.Close;
  ExcutePos.Close;
  tblWard.Close;
  Dept.Close;

  bmOrderCost.Execute;
  OrderCost.AddIndex('PK_ORDERCOST' ,'COSTID' ,[ixPrimary]);
  bmFrequency.Execute;
  bmUsage.Execute;
  bmDoctor.Execute;
  bmExcutePos.Execute;
  bmWard.Execute;
  bmDept.Execute;

  Screen.Cursor := crDefault;
end;

function TDM.GetSerialID() :string;
begin
  with DM do
  begin
    qryGetSerialID.Active := False;
    qryGetSerialID.Active := True;
    Result := qryGetSerialID.Fields[0].AsString;
    qryGetSerialID.Active := False;
  end;
end;

procedure TDM.ReadRunParams;    //下载基本数据
var
  b_iniFile : TIniFile ;
begin
 b_IniFile := TIniFile.Create('His2001.ini') ;
 RIsAutoStopOrder := b_IniFile.ReadInteger('CHGOPTION', 'ISAUTOSTOPORDER', 2);

 if ( RIsAutoStopOrder = 2 ) then
     b_iniFile.WriteInteger('CHGOPTION', 'ISAUTOSTOPORDER', 1 );

  b_inifile.Free ;
end ;

procedure TDM.LoadSysParams;   //装载系统参数
begin
  with DM.tblFixedcode do
  begin
    if Not Active then Open;
    if Locate('ParamID' ,1 ,[]) then
       DM.SUserName := Trim(FieldByName('ParamValue').AsString)
    else
       DM.SUserName := '样板医院';

    if Locate('ParamID' ,2 ,[]) then
       DM.SStartPoint := StrtoTime(Trim(FieldByName('ParamEname').AsString))
    else
       DM.SStartPoint := StrtoTime('12:00:00');

    if Locate('ParamID' ,9000 ,[]) then
       DM.SStrTimeCnstn := StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SStrTimeCnstn := 24;

    if Locate('ParamID' ,9001 ,[]) then
       DM.SEndTimeCnstn := StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SEndTimeCnstn := 24;

    if Locate('ParamID' ,9002 ,[]) then
       DM.SIsAutoAddIvdrip :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SIsAutoAddIvdrip := 1;

    if Locate('ParamID' ,9004 ,[]) then
       DM.SSendStrTime :=
              StrToTime(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SSendStrTime := StrtoTime('9:00:00');

    if Locate('ParamID' ,9005 ,[]) then
       DM.SSendEndTime :=
              StrToTime(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SSendEndTime := StrtoTime('18:00:00');;

    if Locate('ParamID' ,9006 ,[]) then
       DM.SSendMaxSnap :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SSendMaxSnap := 1;

    if Locate('ParamID' ,9007 ,[]) then
       DM.SBillDateCnst :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SBillDateCnst := 2;

    if Locate('ParamID' ,9008 ,[]) then
       DM.SIsCalcHl :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SIsCalcHl := 0;

    if Locate('ParamID' ,9009 ,[]) then
       DM.SRecallCnstn :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SRecallCnstn := 24;

    if Locate('ParamID' ,9010 ,[]) then
       DM.SEMStrTime :=
              StrToTime(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SEMStrTime := StrtoTime('18:30:00');

    if Locate('ParamID' ,9011 ,[]) then
       DM.SEMEndTime :=
              StrToTime(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SEMEndTime := StrtoTime('7:00:00');

    if Locate('ParamID' ,9012 ,[]) then
       DM.SIsStopConfirm :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SIsStopConfirm := 0;

    if Locate('ParamID' ,9013 ,[]) then
       DM.SCanModiExorder :=
              StrToInt(Trim(FieldByName('ParamValue').AsString))
    else
       DM.SCanModiExorder := 1;

    Close;
  end;
end;

procedure TDM.tblPatientSubCalcFields(DataSet: TDataSet);
var
  BirthYear, Year, Month, Day : Word;
begin
  if not tblPatientSubBirthday.IsNull then
  begin
    DecodeDate(tblPatientSubBirthday.AsDateTime,Birthyear, Month, Day);
    DecodeDate(Now, Year, Month, Day);
    tblPatientSubAge.AsInteger := Year - Birthyear + 1;
  end;
end;

procedure TDM.OrderItemNewRecord(DataSet: TDataSet);
begin
{
  if (maxamt<>0) and (orderitemorderkind.asinteger = 0) and (maxamt<>500) then
  begin
    Hiserrorprompt('病人费用不够,不能录入长嘱!');
    sysutils.Abort;
  end;
}
  OrderItemSERIALID.AsString := DM.GetSerialID();

  OrderItemDeptNum.Value := qryPatientBedNoDeptNum.Value;

  OrderItemInid.AsInteger := qryPatientBedNoInid.AsInteger; //住院号
  if IsLongOrder then                           //当前是否输入长嘱
    OrderItemOrderKind.AsInteger := 0           //输入长嘱
  else
    OrderItemOrderKind.AsInteger := 1;              //输入临嘱
  OrderItemWardId.AsString       := currWardId; //病区号
  OrderItemBedId.AsString        := qryPatientBedNoBed.AsString; //病床

  //记下上次输入的开始时间
  if trunc( FStartTime) = 0 then
    OrderItemStartTime.AsDateTime := Now
  else
    OrderItemStartTime.AsDateTime := FStartTime;

  //住院号
  OrderItemInid.AsInteger        := tblPatientSubInid.AsInteger;

  //住院次数
  OrderItemTimes.AsInteger       := tblPatientSubTimes.AsInteger;

  //病人序号
  OrderItemSQID.AsInteger        := tblPatientSubSQID.AsInteger;

  OrderItemKindID.AsInteger      := FKindID;         //配号
  OrderItemOpenDoc.AsString      := FOpenDoc;        //开医嘱医生
  OrderItemOperator.AsString     := currOperatorNo;  //操作员
  OrderItemConfirm.AsInteger     := 0;               //确认
  OrderItemAtOnce.AsInteger      := 0;               //立即发药
  //是否指示发药缺省为0,表示未指示发药
  OrderItemSendMsg.AsInteger     := 0;

  //医嘱停止类型:0为永久,1为临时
  OrderItemStopType.AsInteger := 0;

  //医嘱实发药次数
  OrderItemInActual.AsInteger := 0;

  //赋值显示顺序号
  OrderItemDisplayId.AsDateTime := Now;
end;

procedure TDM.qryInWardCalcFields(DataSet: TDataSet);
var
  BirthYear, Year, Month, Day : Word;
begin
  if not qryInWardBirthday.IsNull then
  begin
    DecodeDate(qryInWardBirthday.AsDateTime,Birthyear, Month, Day);
    DecodeDate(Now, Year, Month, Day);
    qryInWardAge.AsInteger := Year - Birthyear + 1;
  end;
end;

procedure TDM.OrderItemITEMIDChange(Sender: TField);
begin
  qrySelOrderCost.Close;
  qrySelOrderCost.Params[0].AsString := OrderItemItemId.AsString;
  qrySelOrderCost.Open;

  OrderItemItemName.AsString   := qrySelOrderCost.Fields[0].AsString;
  OrderItemDoseunit.AsString   := qrySelOrderCost.Fields[1].AsString;

  if OrderItemKindID.Value = FKindID  then
  begin
    Orderitemusageid.AsString := FUsageID;
    Orderitemusetimes.Value   := FUseTimes;
  end;

  if OrderItemUsageId.IsNull then
  begin
    OrderItemUsageid.AsString    := qrySelOrderCost.Fields[2].AsString;
    OrderItemUseTimes.AsInteger  := qrySelOrderCost.Fields[3].AsInteger;
  end;

  OrderItemExcuPlace.AsInteger := qrySelOrderCost.Fields[4].AsInteger;


  LackFlag   := qrySelOrderCost.Fields[5].AsInteger;

  FIsPayBill := qrySelOrderCost.Fields[6].AsInteger;
  FExcost    := qrySelOrderCost.Fields[7].AsInteger;
  FIsDanger  := qrySelOrderCost.Fields[14].AsInteger;

  qrySelOrderCost.Active := False;
end;

procedure TDM.OrderItemFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
   case OrderItemFilterNo of
    {选有效长嘱,医嘱类型为0,停止时间为今天或将来或为空}
    0 : begin
          Accept := (OrderItemOrderKind.AsInteger = 0)
                    and ( OrderItemEndTime.IsNull
                          or ( OrderItemEndTime.AsDateTime > Now - 1 )
                        )
                    and (OrderItemWardid.Value = tblPatientSubWardid.Value);
        end;
    {选所有长嘱,医嘱类型为0}
    1 : begin
          Accept := (OrderItemOrderKind.AsInteger = 0)
                   and (OrderItemWardid.Value = tblPatientSubWardid.Value)  ;
        end;
    {选有效临嘱,医嘱类型为1,开始时间为今天或将来}
    2 : begin
          Accept := ( OrderItemOrderKind.AsInteger = 1 )   and
                    ( OrderItemStartTime.AsDateTime > Now - 1 ) and
                    ( OrderItemWardid.Value = tblPatientSubWardid.Value );
        end;
    {选所有临嘱,医嘱类型为1}
    3 : begin
          Accept := ( OrderItemOrderKind.AsInteger = 1 ) and
                    ( OrderItemWardid.Value = tblPatientSubWardid.Value ) ;
        end;
    {不符合以上条件的过滤不接受}
    else
      Accept := False;
  end;
end;

procedure TDM.OrderItemBeforePost(DataSet: TDataSet);
var
  tmpDosage : Variant;  //基本用量
begin
  { if maxamt<>0 then
  begin
    if (orderitemstarttime.AsDateTime > maxendtime) and (maxamt=3000) then
    begin
      qryendpass.close;
      qryendpass.ParamByName('inid').asinteger := orderiteminid.AsInteger;
      qryendpass.ParamByName('type').asinteger := 2;
      qryendpass.ExecSQL;
      Hiserrorprompt('急救通道已过期,请与收费处联系!');
      sysutils.Abort;
    end;

    if (orderitemstarttime.AsDateTime > maxendtime) and (maxamt=100) then
    begin
      HisErrorprompt('基本医疗通道已过期,请与收费处联系!');

⌨️ 快捷键说明

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