create or replace procedure SP_YF_BQFY00( -- modification history -- Person Date Comments -- lintj 2013.01.09 create -- qks 2013.01.31 1、静配生成 配制批次对应明细医嘱;2、非代配、非毒麻、长期拆分片剂,默认进入自动摆药; --3、寄存或自动归还:目前都按“寄存自动归还”处理,手术麻醉室跟BM_YD0000.FYLB00='1',都不直接发药。 -- qks 2013.03.11 注释:判断病区发药状态 以及 close CUR_YZYPSQ; 修改:SP_YF_KSJYMX入参值 -- qks 2013.03.12 增加入参Pbytjid;摆药条件:属于非标准流程 -- lintj 2013.03.14 modify 加入扣库存 及 按人员发药 -- qks 2013.03.19 SP_YF_YZYPSQ_FYCZ增加入参Pyyrq00 -- lintj 2013.03.19 加Pzyid00,并重整 -- qks 2013.03.26 BM_YD0000.FYLB00 in ('2','3'),都不直接发药;03.31:YF_KSJYML记录也不直接发药;04.06 手术麻醉室用药"寄存"科室使用YF_YZYPSQ.DQKS00 -- zhangwz 2013.04.10 SP_YF_YZYPSQ_FYCZ 增加入参 Pfyrqsj ,更改本脚本使其能匹配 -- qks 2013.04.12 只有手术麻醉室改为自动寄存;BM_YD0000.FYLB00 in ('2','3')跟YF_KSJYML改为前台二次确认。 -- qks 2013.04.25 增加入参Pbcfyid;SP_YF_YZYPSQ_FYCZ增加入参PCFYZID; -- qks 2013.04.28 modify:手术麻醉室,判断改用YF_YZYPSQ.YZXZ00 -- qks 2013.05.03 modify:门诊类药房不进入自动摆药 -- qks 2013.05.13 modify:"其他"摆药条件发药的,默认不进入摆药机;根据用药次数YF_YZYPSQ.YYCS00来生成配送明细医嘱标签 -- qks 2013.05.14 modify:CUR_YZYPSQ增加条件and a.CKDH00=b.CKDH00;手术麻醉科自动寄存增加条件:if Vdmbz00='000' then -- qks 2013.05.15 modify:修改进包药机条件 -- qks 2013.05.24 modify:修改进包药机条件,去掉条件and Vzjzycf='1';YPYZSX=11803条件改用"西药拆分药" -- qks 2013.05.28 modify:大批量发药,速度比较慢:修改部分写法 -- qks 2013.06.03 modify:YF_YZYPSQ.FYSJ00改用当前时间,SP_YF_YZYPSQ_FYCZ、SP_YF_YZYPSQ_CKD000入参Pyzid00改用Pypqlpc -- qks 2013.06.06 modify:片剂拆分药[长期] 才默认进包药机 -- qks 2013.06.07 modify:单瓶代配特殊处理,每次剂量如果大于1个发药单位,那么要拆分成多个配送袋 -- qks 2013.07.08 modify:YF_ZYFYJL增加字段YPQLPC,允许同组分开发药(注意:静配不允许分开);各个游标增加条件:and a.YPQLPC=b.YPQLPC -- qks 2014.07.10 静配不允许同组分开发药 -- xuzw 2016.02.01 增加传入参数Psfksfy YF9-20160126-001 -- qks 2016.08.10 由于增加了另外一台新的住院摆药机,“非代配、非毒麻、长期拆分片剂,默认进入自动摆药”条件修改: and row.BYTJ00<>'3' --> and row.BYTJ00='0'; by YF9-20160810-002 -- qks 2017.04.12 当YF_YZYPSQ.PSPC00不为空,并且length(PSPC00)<>YYCS00时,不允许发药; for YF9-20170412-001 -- qks 2017.11.07 当摆药条件为"其他"时,限制所有药品都不能进入摆药机; for YF9-20171107-002 -- liwm 2018.05.31 如果开启相关参数(BQ_YPYZTQSFKF=Y,BQ_YPYZTQKFSBSFTQ=N)后,静配系统无法收到护士提取的药单 for JMPZ-20180516-001 -- qks 2018.11.01 已被冲销的医嘱药品申请记录,不允许进行发药操作; for YF9-20181102-001 -- qks 2021.04.17 处理:存在同组其他药品未摆药,不允许过滤摆药! for YF9-20210417-001 -- qks 2021.04.22 参数YF_ZYBYZDJCGH功能扩展:增加 第3个设置不寄存不归还的医嘱性质(手术麻醉用药); for YF9-20210422-001 -- --------- ---------- ------------------------------------------- Pbcfyid in number , --本次发药ID Pzyid00 in number , --住院ID Pyfbmbh in number , --药房部门编号 Pbqbmbh in number , --病区部门编号 Plyrbh0 in number , --领药人编码 Pczy000 in number , --操作员编码 Pczyks0 in number , --操作员科室 Pcommit in varchar2 default 'N' , --是否提交 Pzxcgbz out number , --执行成功标志 1成功 0失败 Ptsxx00 out varchar2 , --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 out varchar2 , --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 Pbytjid in number default null , --摆药条件ID Psfksfy in varchar2 default '0' --是否科室统计 ) as Vypckpc YF_YPCKMX.YPCKPC%type; Vypqlpc YF_YZYPSQ.YPQLPC%type; Vpspc00 YF_YZYPSQ.PSPC00%type; Vk2j000 BM_YD0000.K2J000%TYPE; Vbyfl00 BM_YD0000.BYFL00%TYPE; Vzjzycf BM_YD0000.ZJZYCF%TYPE; Vfylb00 BM_YD0000.FYLB00%TYPE; VJCZSL0 YF_YZYPSQ.JCZSL0%type; Vsfbzlc YF_BYTJ00.SFBZLC%type; Vpdyxfy XT_XTCS00.VALUE0%type; --盘点允许发药 Vyzid00 YF_YZYPSQ.YZID00%type; Vbmxz00 BM_BMBM00.BMBH00%type; Vyycs00 YF_YZYPSQ.YYCS00%type; Vpspcdq YF_YZYPSQ.PSPC00%type; VYPYZSX BM_YD0000.YPYZSX%type; VYZYPGS YF_JPMXBQ.YZYPGS%type; --对应医嘱药品个数 VBQYZGS YF_JPMXBQ.YZYPGS%type; --对应医嘱药品个数(医嘱) VSYZSL0 YF_JPMXYZ.SYZSL0%type; VSYZSL1 YF_JPMXYZ.SYZSL0%type; Vyzypsq YF_YZYPSQ%rowtype; Vdmbz00 varchar2(4); --毒麻标志 Vsysdate date; --日期变量 Vfyrqsj date; --日期变量 Vckdh00 YF_ZYFYJL.CKDH00%type ; --出库单号 Vcounter number(14,4); --计数器变 Ecustom exception; --错误变量 VZNXH00 number; Vsfyp00 number(5); --是否实发药品:>0是,=0否 Vqtbytj number(1); --是否属于其他摆药条件:1其他,2片剂拆分药[长期] Vksbmbh YF_KSJYHZ.KSBMBH%type; --寄存科室部门编号 Vminyzh YF_YZYPSQ.ZYID00%type; Vch0000 YF_YZYPSQ.CH0000%type; VBYJCGH XT_XTCS00.VALUE0%type; --摆药确认后设置寄存归还3个参数 cursor CUR_YZYPJZ is select distinct a.YYRQ00,a.YZID00,replace(a.pspc00,'0','') PSPC00,a.YYCS00 from YF_YZYPSQ a,YF_ZYFYJL b where b.CZY000+0=Pczy000 and b.FYSBYY is null and a.YZID00=b.YZID00 and a.YYRQ00=b.YYRQ00 and a.YFBMBH+0=Pyfbmbh and decode(Psfksfy,'0',a.BQBMBH,'1',a.DQKS00,a.BQBMBH)=Pbqbmbh and a.QLZT00='0' and a.CXBZ00='Z' and b.ID0000=Pbcfyid and b.ZYID00=Pzyid00 and a.YPQLPC=b.YPQLPC; --order by a.YYRQ00,a.YZID00; --静配记录生成 cursor CUR_YZYP_JP is select distinct a.YYRQ00,a.YZID00,replace(a.PSPC00,'0','') PSPC00,a.YYCS00 from YF_YZYPSQ a,YF_ZYFYJL b where b.CZY000+0=Pczy000 and b.FYSBYY is null and a.YZID00=b.YZID00 and a.YYRQ00=b.YYRQ00 and a.YFBMBH+0=Pyfbmbh and decode(Psfksfy,'0',a.BQBMBH,'1',a.DQKS00,a.BQBMBH)=Pbqbmbh and a.QLZT00='1' and a.CXBZ00='Z' and b.ID0000=Pbcfyid and b.ZYID00=Pzyid00 and a.YPQLPC=b.YPQLPC and length(replace(a.PSPC00,'0','')) > 0 --2021.04.17 and not exists (select 1 from yf_jpmxyz where ypqlpc=a.ypqlpc); cursor CUR_YZYPFY is select a.YPQLPC,b.CKDH00,a.YYRQ00,a.YZID00 from YF_YZYPSQ a,YF_ZYFYJL b where b.CZY000+0=Pczy000 and b.FYSBYY is null and a.YZID00=b.YZID00 and a.YYRQ00=b.YYRQ00 and a.YFBMBH+0=Pyfbmbh and decode(Psfksfy,'0',a.BQBMBH,'1',a.DQKS00,a.BQBMBH)=Pbqbmbh and a.QLZT00='1' and a.CXBZ00='Z' and b.ID0000=Pbcfyid and b.ZYID00=Pzyid00 and a.YPQLPC=b.YPQLPC order by a.YPNM00; cursor CUR_YZYPSQ is select a.* from YF_YZYPSQ a,YF_ZYFYJL b where b.CZY000+0=Pczy000 and b.FYSBYY is null and a.YZID00=b.YZID00 and a.YYRQ00=b.YYRQ00 and a.YFBMBH+0=Pyfbmbh and decode(Psfksfy,'0',a.BQBMBH,'1',a.DQKS00,a.BQBMBH)=Pbqbmbh and a.QLZT00='2' and a.CXBZ00='Z' and a.CKDH00=b.CKDH00 and b.ID0000=Pbcfyid and b.ZYID00=Pzyid00 and a.YPQLPC=b.YPQLPC order by a.YPNM00; begin Pzxcgbz:=0; Vsysdate:=sysdate; Pxxxx00 :=substr(nvl(to_char(Pbcfyid),'null')||','||nvl(to_char(Pzyid00),'null')||','||nvl(to_char(Pyfbmbh),'null')||','||nvl(to_char(Pbqbmbh),'null')||','||nvl(to_char(Plyrbh0),'null')||','|| nvl(to_char(Pczy000),'null')||','||nvl(to_char(Pczyks0),'null')||','||nvl(to_char(Pcommit),'null'),1,3500); SP_TransLog(Vsysdate,'SP_YF_BQFY00',Pczy000,Pczyks0,Pxxxx00); --判断病区发药状态 -- if SF_YF_JudgeBQFYZT(Pbqbmbh, Pyfbmbh) = 0 then --不是发药状态,不能进行发药操作 -- Ptsxx00 := '该病区发药状态被强行复位了,不能再进行发药操作!*'; -- raise Ecustom; -- end if; select nvl(max(trim(VALUE0)),'N') into Vpdyxfy from XT_XTCS00 where NAME00='YF_PDQJSFYXFY'; --摆药确认后设置寄存归还3个参数(格式为N|0|12,默认值为N) select nvl(max(trim(VALUE0)),'N') into VBYJCGH from XT_XTCS00 where NAME00='YF_ZYBYZDJCGH'; if instrb(VBYJCGH,'|',1,2)>0 then VBYJCGH := nvl(SF_XT_RETURNINDEXEH(VBYJCGH,'|',3),'0'); else VBYJCGH := '0'; end if; if Vpdyxfy='N' then select count(*) into Vcounter from BM_BMBM00 where BMBH00=Pyfbmbh and FYBZ00='3'; if Vcounter > 0 then Ptsxx00:='药房正在盘点,不能进行进出库确认'; raise Ecustom; end if; end if; --select count(1) into Vqtbytj from yf_bytj00 where ID0000=nvl(Pbytjid,0) and MC0000='其他' and rownum=1; --select count(1) into Vqtbytj from yf_bytj00 where ID0000=nvl(Pbytjid,0) and MC0000='片剂拆分药[长期]' and rownum=1; select max(decode(MC0000,'其他',1,'片剂拆分药[长期]',2,0)) into Vqtbytj from yf_bytj00 where ID0000=nvl(Pbytjid,0); select nvl(max(BMXZ00),'0') into Vbmxz00 from BM_BMBM00 where BMBH00=Pyfbmbh; for row in CUR_YZYPJZ loop SP_YF_ZYYZJZ_NEW( Pzyid00, --住院ID row.YYRQ00, --用药日期 row.YZID00, --医嘱ID(ID1,ID2,ID3......) Pczy000, --操作员编码 Pczyks0, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 Ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00, --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 'N', --错误退出 Y弹出错误 N不弹出 2, --处方总金额(医保)--舍入位数(小数位保留位数) 0, --处方总金额(医保)--取整方式0--四舍五入,1--向前取整 Pbcfyid --YF_ZYFYJL.ID0000 ); if Pzxcgbz = 0 then return; end if; end loop; for row in CUR_YZYP_JP loop --1、静配生成 配制批次对应明细医嘱 Vpspc00 := row.PSPC00; Vyycs00 := row.YYCS00; VZNXH00 := 0; if length(row.PSPC00)>0 then select count(1),nvl(max(round(YPZSL0/row.YYCS00,3)),0),max(CH0000) into VYZYPGS,VSYZSL0,Vch0000 from YF_YZYPSQ where YZID00=row.YZID00 and YYRQ00=row.YYRQ00 and QLZT00='1'; select count(1) into VBQYZGS from BQ_YPYZMX where yzid00=row.YZID00 and nvl(YZCLLB,'正常')<>'自备药'; if VYZYPGS0 then Ptsxx00:='床号='||Vch0000||',医嘱ID号='||to_char(row.YZID00)||'存在同组其他药品未摆药,不允许过滤摆药!'; raise Ecustom; end if; if length(row.PSPC00)<>row.YYCS00 then Ptsxx00:='床号='||Vch0000||',医嘱ID号='||to_char(row.YZID00)||'配送批次'||row.PSPC00||'不等于用药次数'||to_char(row.YYCS00)||'次,不允许摆药!'; raise Ecustom; end if; end if; while length(row.PSPC00)>0 and Vyycs00>0 loop VZNXH00:=VZNXH00+1; VSYZSL1:=VSYZSL0; if Vpspc00 is not null then Vpspcdq:=substr(Vpspc00,1,1); else Vpspcdq:=to_char(least(to_number(Vpspcdq)+1,5)); end if; --静配批次扩展修改 --if to_number(Vpspcdq)>5 then -- Ptsxx00:='医嘱ID='||to_char(row.YZID00)||'存在配送批次为'||to_char(Vpspcdq)||',请退回病区!'; -- raise Ecustom; --end if; insert into YF_JPMXYZ( LSH000 , --流水号 SQ_YF_JPMXYZ_LSH000 PZPCID , --配制批次 YF_JPPZD0.PZPCID MXBQID , --明细标签ID号 F.K=YF_JPMXBQ.MXBQID YPQLPC , --药品请领批次 F.K=YF_YZYPSQ.YPQLPC YPNM00 , --药品内码 YYRQ00 , --用药日期 PSPC00 , --配送批次135 ZNXH00 , --组内序号tid-123 YZMXID , --医嘱明细ID; QLDW00 , --请领单位 SYZSL0 , --送药总数量(请领单位) ZHL000 , --转换率(请领单位/剂量单位) TYBZ00 , --退药标志 1退药 0 正常 TYQLPC , --退药记录对应的YPQLPC BZ0000 --备注 ) select SQ_YF_JPMXYZ_LSH000.nextval, 0, 0, YPQLPC , YPNM00 , YYRQ00 , Vpspcdq, VZNXH00, YZMXID, QLDW00, case when VYZYPGS = 1 and VSYZSL1>1 then 1 else round(YPZSL0/row.YYCS00,3) end, ZHL000, 0, 0, '' from YF_YZYPSQ where YZID00=row.YZID00 and YYRQ00=row.YYRQ00 and QLZT00='1'; --单瓶代配特殊处理,每次剂量如果大于1个发药单位,那么要拆分成多个配送袋 while VYZYPGS = 1 and VSYZSL1>1 loop VZNXH00:=VZNXH00+1; VSYZSL1:=VSYZSL1-1; insert into YF_JPMXYZ( LSH000 , --流水号 SQ_YF_JPMXYZ_LSH000 PZPCID , --配制批次 YF_JPPZD0.PZPCID MXBQID , --明细标签ID号 F.K=YF_JPMXBQ.MXBQID YPQLPC , --药品请领批次 F.K=YF_YZYPSQ.YPQLPC YPNM00 , --药品内码 YYRQ00 , --用药日期 PSPC00 , --配送批次135 ZNXH00 , --组内序号tid-123 YZMXID , --医嘱明细ID; QLDW00 , --请领单位 SYZSL0 , --送药总数量(请领单位) ZHL000 , --转换率(请领单位/剂量单位) TYBZ00 , --退药标志 1退药 0 正常 TYQLPC , --退药记录对应的YPQLPC BZ0000 --备注 ) select SQ_YF_JPMXYZ_LSH000.nextval, 0, 0, YPQLPC , YPNM00 , YYRQ00 , Vpspcdq, VZNXH00, YZMXID, QLDW00, least(VSYZSL1,1), ZHL000, 0, 0, '' from YF_YZYPSQ where YZID00=row.YZID00 and YYRQ00=row.YYRQ00 and QLZT00='1'; end loop; Vpspc00:= substr(Vpspc00,2,length(Vpspc00)-1); Vyycs00:=Vyycs00-1; end loop; end loop; -- select min(b.CKDH00) into Vckdh00 from YF_YZYPSQ a,YF_ZYFYJL b -- where b.CZY000+0=Pczy000 and b.FYSBYY is null and a.YZID00=b.YZID00 and a.YYRQ00=b.YYRQ00 -- and a.YFBMBH+0=Pyfbmbh and a.BQBMBH=Pbqbmbh and a.QLZT00='1' -- and b.ID0000=Pbcfyid -- and b.ZYID00=Pzyid00; -- select least((select nvl(min(to_date(FYRQ00||FYSJ00,'YYYYMMDDHH24:MI:SS')),sysdate) from YF_YZYPSQ where CKDH00=Vckdh00),sysdate) into Vfyrqsj from dual; Vfyrqsj := sysdate; for row in CUR_YZYPFY loop if nvl(Vminyzh,0)=0 then Vminyzh := row.YZID00; end if; SP_YF_YZYPSQ_FYCZ(row.YPQLPC, row.CKDH00, Pczy000, Pczyks0, 'N', Pzxcgbz, Ptsxx00, Pxxxx00, '1',row.YYRQ00,Vfyrqsj,Vminyzh); if Pzxcgbz = 0 then return; end if; SP_YF_YZYPSQ_CKD000(row.CKDH00, Pyfbmbh, Pbqbmbh, row.YPQLPC, Pbytjid, Pczy000, Pczyks0, 'N', Pzxcgbz, Ptsxx00, Pxxxx00, '1',row.YYRQ00); if Pzxcgbz = 0 then return; end if; end loop; for row in CUR_YZYPSQ loop select K2J000,BYFL00,ZJZYCF,DPDJ00||MZDJ00||decode(SJDJ00,'1','1','0'),nvl(FYLB00,'0'),YPYZSX into Vk2j000,Vbyfl00,Vzjzycf,Vdmbz00,Vfylb00,VYPYZSX from BM_YD0000 where YPNM00=row.YPNM00; if Plyrbh0 is not null then --修改病区领药单领药状态 SP_YF_YZYPSQ_LYCZ(row.YPQLPC, Plyrbh0, Pczy000, Pczyks0, 'N', Pzxcgbz, Ptsxx00, Pxxxx00); end if; Vsfyp00 := 1; --2、非代配、非毒麻、长期拆分片剂,默认进入自动摆药; --2013.05.03 门诊类药房不进入自动摆药 and Vbmxz00='3' --2016.08.09 默认进入自动摆药条件修改: and row.BYTJ00<>'3' --> and row.BYTJ00='0' --2017.11.07 and Vqtbytj>0->and Vqtbytj=2 --if row.pspc00 is null and Vdmbz00='000' and row.clbz00='0' and nvl(Vbyfl00,'1')='1' and row.BYTJ00<>'3' if row.pspc00 is null and Vdmbz00='000' and row.clbz00='0' and nvl(Vbyfl00,'1')='1' and row.BYTJ00='0' and Vbmxz00='3' and Vqtbytj=2 and nvl(VYPYZSX,0)>0 then select count(1) into Vcounter from VW_YK_YDYZSX where NBBH00=VYPYZSX and MC0000='西药拆分药'; if Vcounter>0 then Update YF_YZYPSQ set BYTJ00='1' where ypqlpc=row.YPQLPC; Vsfyp00 := 0; end if; end if; --if row.BYTJ00='1' then --2017.11.07 if nvl(row.BYTJ00,'0')<>'0' then if Vqtbytj = 1 then Update YF_YZYPSQ set BYTJ00='0' where ypqlpc=row.YPQLPC; else Vsfyp00 := 0; end if; end if; --3、寄存或自动归还 --3.1手术麻醉室寄存后自动归还; if (row.PSPC00 is null) and (Vsfyp00>0) then VJCZSL0 := 0; if row.YZXZ00 in ('1','2') then --2021.04.22 增加条件 and instrb(VBYJCGH,row.YZXZ00)=0 if Vdmbz00='000' and instrb(VBYJCGH,row.YZXZ00)=0 then Update yf_yzypsq set SFZSL0=0,JCZSL0=YPZSL0 where ypqlpc=row.YPQLPC; VJCZSL0 := row.YPZSL0; Vksbmbh := row.DQKS00; end if; else VJCZSL0 := nvl(row.JCZSL0,0) + nvl(row.GHZSL0,0); Vksbmbh := row.BQBMBH; end if; if VJCZSL0>0 then SP_YF_KSJYMX( 1, --1寄药2借药3取出(用于归还)4归还VJYGH00 '1', --单据类型 1:YF_YZYPSQ.YPQLPC,2:YF_YPCKMX.YPCKPC,3:YF_KSJYJL.LSH000,4:YF_YZYPSQ.YPQLPC(自动归还),5:YF_YPCKMX.YPCKPC(手工归还) row.YPQLPC, --来源单据号 row.yfbmbh, --药房部门编号 --row.DQKS00, --科室部门编号 --row.BQBMBH, --病区部门编号 Vksbmbh, --寄存科室部门编号 row.ypnm00, --药品内码 VJCZSL0, --出库数量(处方单位)(病区退药传入寄存负数,其他情况为正数) row.QLDW00, --处方单位 row.ZHL000, --转换率 --row.LSDJ00, --零售单价(库存单位) round(row.LSDJ00*(Vk2j000/row.ZHL000),4), --零售单价(按KCDW00) Pczy000 , --操作员 Pczyks0 , --操作员科室 'N' , --是否提交 Pzxcgbz , --执行成功标志 1成功 0失败 Ptsxx00 , --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 , --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 '1' , --寄存同时是否做自动归还处理:0否1是 '1' --错误提示 0报错提示 1不提示直接退出 ); end if; if Pzxcgbz = 0 then return; end if; end if; end loop; update YF_ZYFYJL set FYCGBZ='1' where CZY000+0=Pczy000 and FYSBYY is null and ID0000=Pbcfyid and ZYID00=Pzyid00; Pzxcgbz:=1; if pcommit='Y' then commit; end if; exception when No_Data_Found then raise_application_error(-20001,substrb('没有找到数据!*'||sqlerrm||Ptsxx00,1,240)); when Ecustom then raise_application_error(-20010,substrb(Ptsxx00||'!*',1,240)); when others then raise_application_error(-20002,substrb(nvl(sqlerrm, '原因不明出错')||'!*',1,240)); end;