prompt 6.门诊处方发药 SP_YF_MZCFFY create or replace procedure SP_YF_MZCFFY( -- modification history -- Person Date Comments -- lintj 2012.07.20 modify -- zhanghr 2012.08.06 modify -- qks 2012.08.27 SP_YF_MZCF00_YFBMBH参数“药房部门编号”重新取值 -- zhanhr 2012.10.07 增加传入配方人参数,发药类型 -- qks 2019.08.27 增加入参Pcwts00;修正参数SF_QZJSFB启用判断条件:JZDH00=0 -> JZDH00+0=0; for YJ9-20190827-003 -- luowf 2020.08.28 参数SF_QZJSFB允许区分控制发药与医技部分 YF9-20200827-001 -- linshu 2023.11.17 共享处方发药DJH000为0时,可以发药 -- --------- ---------- -------------------------------------------------- Pcflsh0 in char, --输入:处方流水号 Pfhrbh0 in number default null, --输入:复核人编码 Ppfr000 in number, --输入:配方人编码 Pflag00 in char default '0', --'0'直接发药 '1'排队叫号发药 Pczy000 in number , --操作员、发药人编码 Pczyks0 in number , --操作员科室 Pcommit in varchar2 default 'N', --是否提交 Pzxcgbz out number, --执行成功标志 1成功 0失败 Ptsxx00 out varchar2, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 out varchar2, --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 Pcwts00 in varchar2 default '0' --错误提示 0报错提示 1不提示直接退出 )as Vdjh000 SF_BRJFB0.DJH000%type; Vdjh001 SF_BRJFB0.DJH000%type; Vfjfdjh SF_BRJFB0.DJH000%type; Vcfzt00 YF_MZCF00.CFZT00%type; Vpszt00 YF_MZCF00.PSZT00%type; Vbrid00 SF_BRXXB0.BRID00%type; Vghh000 SF_BRXXB0.GHH000%type; Vdqrq00 YF_MZCF00.FYRQ00%type; Vdqsj00 YF_MZCF00.FYSJ00%type; Vzydjs0 YF_MZCF00.ZYDJS0%type; Vypdlbh YF_MZCF00.YPDLBH%type; Vsfksly YF_MZCF00.SFKSLY%type; Vfyckbh YF_CFDL00.FYCKBH%type; --发药窗口编号 Vsfyxqy XT_XTCS00.VALUE0%type; --是否允许药房抢处方 Vqhzjfy XT_XTCS00.value0%type; --自助取号是否直接发药 Vpdyxfy XT_XTCS00.value0%type; --盘点期间是否允许发药 ,Y允许 N不允许 Vczyxck XT_XTCS00.value0%type; --是否要求存在有效的窗口 Y要求 N不要求 默认为Y VYFBMBH YF_MZCF00.YFBMBH%type; VWGCFBZ YF_MZCF00.WGCFBZ%type; Vcount0 number; Verrmsg varchar2(100); Ecustom exception; begin ------------------------------完成功能:门诊处方记账、发药------------------------ Pzxcgbz:=0; Pxxxx00 :=nvl(to_char(Pcflsh0),'null')||','||nvl(to_char(Pfhrbh0),'null')||','||nvl(to_char(Pczy000),'null')||','||nvl(to_char(Pczyks0),'null')||','||nvl(to_char(Pcommit),'null'); SP_TransLog(sysdate,'SP_YF_MZCFFY',Pczy000,Pczyks0,Pxxxx00); --参数自助取号是否直接发药 select nvl(max(trim(VALUE0)),'N') into Vqhzjfy from xt_xtcs00 where name00='MZPY_JZHSFZJFY'; --取参数:是否要求存在有效的窗口 Y要求 N不要求 默认为Y select nvl(max(trim(VALUE0)),'Y') into Vczyxck from XT_XTCS00 where NAME00='YF_SFYQCZYXCK'; --取参数:是否允许药房抢药 select nvl(max(trim(VALUE0)),'N') into Vsfyxqy from XT_XTCS00 where NAME00='YF_SFYXYFQY'; /* select count(*) into Vcount0 from YF_MZCFMX where CFLSH0=Pcflsh0 and (THBZ00<>'0' OR CXBZ00<>'Z'); if Vcount0>0 then Verrmsg:='该处方被退回或者被冲销,已经失效,不能再发药!*'; raise Ecustom; end if; */ select to_char(sysdate,'yyyymmdd'),to_char(sysdate,'hh24:mi:ss') into Vdqrq00,Vdqsj00 from dual; select YFBMBH into VYFBMBH from YF_MZCF00 where CFLSH0=Pcflsh0; --是否允许抢药 if Vsfyxqy='Y' then SP_YF_MZCF00_YFBMBH( Pcflsh0, --处方流水号 --Pczyks0, --药房部门编号 VYFBMBH, --药房部门编号 Pczy000, --输入:操作员编码 --null, --操作员科室 Pczyks0, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); end if; select BRID00,GHH000,CFZT00,PSZT00,ZYDJS0,YPDLBH,DJH000,SFKSLY,nvl(WGCFBZ,'0') into Vbrid00,Vghh000,Vcfzt00, Vpszt00,Vzydjs0,Vypdlbh,Vdjh001,Vsfksly,VWGCFBZ from YF_MZCF00 where CFLSH0=Pcflsh0; if Vcfzt00='1' and Vsfksly<>'Y' then --判断参数为SF_QZJSFB,中费别的病人必须结算才能发药 select count(*) into Vcount0 from BM_BRXXB0 a,XT_XTCS00 b where BRID00=Vbrid00 and NAME00='SF_QZJSFB' and instrb(','||case when instr(Value0,'|')=0 then VALUE0 else substr(VALUE0,1,instr(VALUE0,'|')-1) end||',',','||to_char(FBBH00)||',')>0; --and instrb(','||trim(Value0)||',',','||to_char(FBBH00)||',')>0; --2020.08.28 YF9-20200827-001 if Vcount0>0 then if ( Vdjh001=0 ) and (VWGCFBZ <> '3') then Ptsxx00:='该类费别的病人必须到收费处先记账并结算,才能发药'; if Pcwts00='0'then raise Ecustom; else return; end if; else select count(*) into Vcount0 from SF_FYMX00 where DJH000=Vdjh001 and JZDH00+0=0; if Vcount0>0 then Ptsxx00:='该类费别的病人必须到收费处先结算,才能发药'; if Pcwts00='0'then raise Ecustom; else return; end if; end if; end if; end if; end if; if (Vcfzt00='2') then --2已发药 -- if (Vqhzjfy='Y') then --自助取号后直接发药话就直接跳出过程; -- update YF_MZCF00 set FYR000=Pczy000 where CFLSH0=Pcflsh0 and FYR000 is null; -- end if; goto BOTTOM; elsif Vczyxck='Y' then --不能在配药系统发药,而应该直接到药房读卡发药 if Vcfzt00='1' then select nvl(MAX(FYCKBH),0) into Vfyckbh from YF_CFDL00 where CFLSH0=Pcflsh0; if Vfyckbh=0 then goto BOTTOM; end if; end if; end if; if ((Vpszt00='1') OR (Vpszt00='2')) then --皮试状态:'0'非皮试,'1'需皮试,'2'皮试未通过,不能发药,'3',皮试通过,可发药 Ptsxx00:='该处方皮试未通过不能发药!*'; if Pcwts00='0'then raise Ecustom; else return; end if; end if; /* 处方收费或发药时,通过函数可判定需皮试的处方是否能够发药。 判定函数为SF_MZ_PSCFYS(PGHH000,PCFLSH0) 参数说明:PGHH000挂号号 PCFLSH0处方流水号 返回值 0:能发药/收费 -1:不能发药,原因病人皮试过敏 -2:不能发药,原因病人未做皮试 */ Vcount0:=SF_MZ_PSCFYS(Vghh000,Pcflsh0); if Vcount0=-1 then Ptsxx00:='病人皮试不正常!'; if Pcwts00='0'then raise Ecustom; else return; end if; elsif Vcount0=-2 then Ptsxx00:='病人需要先皮试!'; if Pcwts00='0'then raise Ecustom; else return; end if; end if; select count(CFID00) into Vcount0 from YF_MZCFMX where CFLSH0=Pcflsh0 and YPZSL0<0; if ((Vcount0>0) and (Vcfzt00<>'1') and (Vsfksly<>'Y')) then Ptsxx00 := '数量为负数的处方,必须先到收费处记账方可退药!*'; if Pcwts00='0'then raise Ecustom; else return; end if; end if; Vfjfdjh:=NULL; --判断药房是否出于盘点状态 select nvl(max(trim(VALUE0)),'N') into Vpdyxfy from XT_XTCS00 where NAME00='YF_PDQJSFYXFY'; if Vpdyxfy='N' then select count(*) into Vcount0 from BM_BMBM00 where BMBH00=Pczyks0 and FYBZ00='3'; if Vcount0>0 then Ptsxx00 := '药房正在盘点,无法发药!*'; if Pcwts00='0'then raise Ecustom; else return; end if; end if; end if; --1、记账操作 if ((Vcfzt00='0') or (Vcfzt00='4')) then --0未记账,4未审核 select SQ_SF_BRJFB0_DJH000.NEXTVAL into Vdjh000 from dual; SP_YF_MZCFJZ( Pcflsh0, --处方流水号 Vdqrq00, --日期 Vdqsj00, --时间 Pczy000, --操作员编码 Vdjh000, --输入:收费单据号 Pczyks0 ); SP_YF_MZCF00_JZCZ( Pcflsh0, --处方流水号 Vdjh000, --单据号 null, --附加费单据号 Vdqrq00, --记账日期 Vdqsj00, --记账时间 Pczy000, --输入:操作员编码 null, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); end if; --2、发药操作 --判断是否有需要收取的煎药费未收 /* if ((Vypdlbh='2') and (Vzydjs0>0)) then select FJFDJH into Vfjfdjh from YF_MZCF00 where CFLSH0=Pcflsh0; if ((nvl(Vfjfdjh,0)=0) and (Vzydjs0>0)) then --同步收取代煎费 --Verrmsg := '该处方必须先到收费处记账方可发药!*'; --raise Ecustom; end if; end if; */ SP_YF_MZCF00_FYTY( 0, Pcflsh0, --处方流水号 Pczy000, --发药人 Pfhrbh0, --复核人 Ppfr000, --配方人 Pflag00, --'0'直接发药 '1'排队叫号发药 Vdqrq00, --发药日期 Vdqsj00, --发药时间 Pczy000, --输入:操作员编码 null, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); --处理农本方接口 select count(*) into Vcount0 from XT_XTCS00 where NAME00='YF_NBFJKXGS' and VALUE0='Y'; if Vcount0>0 then execute immediate 'begin SP_YF_GETNBFJKXX(''0'','''||Pcflsh0||'''); end;'; end if; <> if Pcommit='Y' then commit;--在delphi前台处理 end if; exception when Ecustom then rollback; raise_application_error(-20286, trim(substrb(ptsxx00||'!*'|| '调用过程: SP_YF_MZCFFY('||to_char(Pczyks0)||','||Pcflsh0|| ','||to_char(Pczy000)||','||to_char(Pfhrbh0)||') ; '||sqlerrm,1,200))); when others then rollback; raise_application_error(-20221, trim(substrb('修改记录时发生意外错误!*返回信息:'|| '调用过程: SP_YF_MZCFFY('||to_char(Pczyks0)||','||Pcflsh0|| ','||to_char(Pczy000)||','||to_char(Pfhrbh0)||') ; '||sqlerrm,1,200))); end; / show error; --%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%