delphi.netclass
unit WXYBDLL;
interface
USES Windows, Messages,ADODB,FORMS,StrUtils;
const
FWJGBH = '1000111'; //服务机构编号
VAR
outstring:PCHAR;
lsh,zqh:String; //流水号,周期号
YBRYLB:string;//无锡用医保人员类别 在读卡时取出该人员类别
ybzycs:String;//医保病人本年住院次数
ybgrbh:String;//医保个人编号
UserID:String='002';
function InOutString(ybjybh,ywzqh,jylsh:string;instring:PChar):Integer; //调用医保DLL动态库文件
function YBLSH(bm:STRING=FWJGBH; FieldName:String='交易流水号'): String;
function ywzqh(jylsh:string):string; //签到后获取该操作员在医保的 业务周期号
procedure YBRCXX; //获取交易流水号和业务周期号 这两个号都不能为空
function getstr(Ystr,Mstr:string;istar:byte):string; //从字符串中截取字符串
procedure ShowMsg(sMsg: string);
function MsgBox(Text, Caption: string; Flags: Longint = MB_OK): Integer;
function ZfInOutString(jybh:string;instring:PChar):Integer; //自费参数 jybh 交易编号信息 (700001批次号 700002挂号 700003明细 700004结算) instring 入参信息 即数据
implementation
uses SysUtils,Dialogs, CFMmain;
function BUSINESS_HANDLE(inputData,outputdata:PCHAR):integer;stdcall;external 'SiInterface.dll';
{
备注:
如果下载的是文件,则必须在服务器的D盘建立一个文件夹,且在本机共享,然后在本机设置镜像盘符为X
,后才能用该系统管理程序,因为下载的文件需要用SQL语句来执行,SQL语句中的路径为数据库服务器的路径,
所以必须指定,否则SQL检测不到这个文件,所以在从医保中心下载完后,必须上传到服务器上,才能够用SQL
语句进行写到数据库中。
}
function InOutString(ybjybh,ywzqh,jylsh:string;instring:PChar):Integer; //调用医保DLL动态库文件 其它医院不用,应该把调用这个程序的全部屏蔽,否则提示找不到动态库文件
VAR
I:Integer;
BEGIN
Result:=0;//成功
instring:=pchar(ybjybh+'^'+FWJGBH+'^'+UserID+'^'+ywzqh+'^1^'+jylsh+'^NULL^'+instring+'^');
try
freemem(outstring,10240000); //放在此处目的是为了,马上不清除出参.后面要用出参
getmem(outstring,10240000);
I:=BUSINESS_HANDLE(instring,outstring);
IF I=-1 THEN
BEGIN
try
I:=StrToInt(getstr(outstring,'^',2));
except
ShowMsg(outstring+' 请检查网络是否正常!');
end;
outstring:=PCHAR(getstr(outstring,'^',1));
IF I=10 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'当前交易成功但是不能进行下一步业务处理(个人封锁等信息)!');
Result:=I;
END;
IF I=71 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'无效的交易类型!');
Result:=I;
END;
IF I=98 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'医院开发商分配输出内存空间太小!');
Result:=I;
END;
IF I=99 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'业务处理失败!');
Result:=I;
END;
Abort;
end;
except
Result:=100;//自己定义的,表示出错后不再继续进行
// freemem(outstring,1024);
Abort;
end;
// freemem(outstring,1024);
END;
///////无锡医保 获取交易流水号 在MAXHM表中必须有 交易流水号 记录,否则系统错误
// bm: 医疗机构编号
//FieldName 意义为字段FNAME的内容 即在这里赋值(交易流水号)
function YBLSH(bm:STRING=FWJGBH; FieldName:String='交易流水号'): String;
var
sInitVal, sSQL : String;
MYQRY:TADOQuery;
begin
try
MYQRY:=TADOQuery.Create(Application);
MYQRY.Connection:=fmmain.ADO_con;
sInitVal:=FormatDateTime('YYYYMMDDhhmmss',Now);
with MYQRY do begin
Close;
SQL.Clear;
SQL.Text := 'select rq,fname from maxh where fname='''+trim(FieldName)+'''';
open;
if (FieldByName('fname').AsString='') then
begin
Close;
SQL.Clear;
SQL.Text := 'insert into maxh (rq,fname,maxhm) values (getdate(),:fname,1)';
MYQRY.Parameters.ParamByName('fname').Value :=trim(FieldName);
execsql;
end
else
if (FormatDateTime('YYYYMMDDhhmm',FieldByName('rq').AsDateTime)<>FormatDateTime('YYYYMMDDhhmm',Now)) then
begin
Close;
SQL.Clear;
SQL.Text := 'update maxh set rq=getdate(),maxhm=1 where fname='''+trim(FieldName)+'''';
execsql;
end
else
begin
Close;
SQL.Clear;
SQL.Text := 'update maxh set maxhm=maxhm+1 where fname='''+trim(FieldName)+'''';
execsql;
end ;
Close;
SQL.Clear;
SQL.Text := 'select fname,maxhm from maxh with(ROWLOCK) where fname='''+trim(FieldName)+'''';
open;
if MYQRY.FieldByName('fname').AsString = '' then
begin
Result := sInitVal+bm+'001';
Exit;
end;
Result :=sInitVal+bm+ RightStr('00000' + trim(IntToStr(MYQRY.FieldByName('maxhm').AsInteger+1)), 3);
MYQRY.Close;
end;
except
Result := sInitVal+bm +RightStr('00000' + trim(IntToStr(MYQRY.FieldByName('maxhm').AsInteger+1)), 3);
MYQRY.Close;
MYQRY.SQL.Clear;
MYQRY.SQL.Text := 'update maxh with(ROWLOCK) set maxhm=maxhm+1 where fname='''+trim(FieldName)+'''';
MYQRY.execsql;
MYQRY.Close;
end;
end;
function ywzqh(jylsh:string):string; //签到后获取该操作员在医保的 业务周期号
begin
//YWZQH 业务周期号 医院编号(7)+操作员编号(最大8位)+时间(14)+流水号(3) --收费员在签到时获以业务周期号
InOutString('931100','',jylsh,'');
Result:=string(getstr( getstr(outstring,'^',1),'|',0)); //医保业务周期号
end;
procedure YBRCXX; //获取交易流水号和业务周期号 这两个号都不能为空 其它医院不用,应该把调用这个程序的全部屏蔽,否则提示找不到动态库文件
BEGIN
lsh:='';
zqh:='';
lsh:=YBLSH; //交易流水号
IF lsh='' THEN
BEGIN
ShowMsg('请与管理员联系,可能是最大号表无此记录!');
Abort;
END;
zqh:=ywzqh(lsh);
IF zqh='' THEN
BEGIN
ShowMsg('请重试!');
Abort;
END;
END;
//获取像 dfsd_ad_中华人民共和国_大_
// 字符串,特征,第几个 例 getstr('dfsd_ad_中华人民共和国_大_','_',2) 得 ad
function getstr(Ystr,Mstr:string;istar:byte):string; //从字符串中截取字符串
var s:string;
i:byte;
begin
result:='';
i:=0;
for i:=0 to length(Ystr) do
if i<>
delete(Ystr,1,pos(Mstr,Ystr)) else
break;
s:=copy(Ystr,i-istar-1,pos(Mstr,Ystr)-1);
delete(s,1,length(Mstr)-1);
if s<>'' then
result:=s else
result:='';//提取串为空串!'
end;
procedure ShowMsg(sMsg: string);
begin
MsgBox(sMsg, '提示', MB_OK);
end;
function MsgBox(Text, Caption: string; Flags: Longint = MB_OK): Integer;
begin
Result := Application.MessageBox(PChar(Text), pChar(Caption), Flags +
MB_ICONASTERISK);
end;
function ZfInOutString(jybh:string;instring:PChar):Integer; //自费参数 jybh 交易编号信息 (700001批次号 700002挂号 700003明细 700004结算) instring 入参信息 即数据
VAR
I:Integer;
BEGIN
Result:=0;//成功
instring:=pchar(jybh+'^'+FWJGBH+'^^^^^^'+instring+'^');
try
freemem(outstring,10240000); //放在此处目的是为了,马上不清除出参.后面要用出参
getmem(outstring,10240000);
I:=BUSINESS_HANDLE(instring,outstring);
IF I=-1 THEN
BEGIN
try
I:=StrToInt(getstr(outstring,'^',2));
except
ShowMsg(outstring+' 请检查网络是否正常!');
end;
outstring:=PCHAR(getstr(outstring,'^',1));
IF I=10 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'当前交易成功但是不能进行下一步业务处理(个人封锁等信息)!');
Result:=I;
END;
IF I=71 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'无效的交易类型!');
Result:=I;
END;
IF I=98 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'医院开发商分配输出内存空间太小!');
Result:=I;
END;
IF I=99 THEN
BEGIN
ShowMessage(outstring+CHR(13)+'业务处理失败!');
Result:=I;
END;
Abort;
end;
except
Result:=100;//自己定义的,表示出错后不再继续进行
// freemem(outstring,1024);
Abort;
end;
// freemem(outstring,1024);
END;
end.