create or replace procedure SP_YF_YZYPSQ_CXCZ( -- modification history -- Person Date Comments -- lintj 2012.07.20 create -- laijg 2013.01.21 增加输入参数Ptyyy00,插入字段YYRQ00 -- laijg 2013.01.24 发药日期、记账日期、领药日期、发药人、领药人该处不写入 -- qks 2013.02.01 1、增加入参Pjpmxid: 静配批次明细医嘱流水号(=YF_JPMXYZ.LSH000) -- 2、寄存药品: 原单寄存JCYPZSL+GHZSL0>0,那么BCCXSL-SFSL00>0时,这部分数量按负数寄存。 -- qks 2013.02.17 药房静配明细标签表YF_JPMXBQ增加字段TYBZ00 -- qks 2013.03.21 增加入参Pbccxsl -- qks 2013.04.02 写入表yf_yzypsq增加字段HJJE00,部分金额字段取值 -- qks 2013.04.08 增加退药条件判断:1、参数YF_ZYYFYJSSFYXTY控制已结算是否允许退药;2、进入包药机药品,不允许病区退药申请,药房退药不限制; -- 3、参数BQ_PSPCJZTYSJ控制 每个配送批次截止申请退药时间,药房退药不限制 -- qks 2013.04.16 取消负数寄存(原:2013.02.01 2、);04.17 Pjpmxid -> nvl(Pjpmxid,0),replace(PTSXX00,':',':') -- qks 2013.04.24 yf_yzypsq.pspc00写入值; -- qks 2013.05.04 写入表yf_yzypsq增加字段:CLBZ00,YSZID0,YFID00,PCID00 -- qks 2013.05.09 modify:Update YF_JPMXBQ.TYBZ00='1',增加条件TYBZ00='0' -- qks 2013.05.11 modify:修改总冲销数量是否超过药品总量 -- qks 2013.05.15 modify:限制代配退药一定要传入Pjpmxid>0 -- qks 2013.05.17 麻醉医嘱(麻醉科非毒麻医嘱)退药直接寄存 -- qks 2013.05.22 写入表YF_YZYPSQ.CFYZID -- qks 2013.06.19 写入表YF_YZYPSQ.TDYPID -- qks 2014.10.21 重新计算YF_YZYPSQ.JZJE00取值 -- qks 2016.03.12 医生停嘱自动退药,调用本过程,如果出现异常,直接屏蔽,导致部分修改会被提交,所以需要将异常判断前移; by YF9-20160313-001 -- linyx 2017.09.12 参数BQ_FBQKSSQYPBNTY控制:非病区科室申请药品,是否不能提出退药申请 For BQHS9.0-20170911-002 -- gzj 2019.05.28 住院病人诊疗带出处方流程改造 YJ9-20190518-002 -- dongxb 2020.01.07 修改医保药品病人自费使用的情况,在病区发起退费退药,生成的负单ZFFSBZ错写为"N"的问题,该字段的值,同原单保持一致。 for BQHS9.0-20191203-002 -- --------- ---------- ------------------------------------------- Pypqlpc in number , --药品请领批次 Pcxqlpc out number , --冲销请领批次 Pczy000 in number , --输入:操作员编码 Pczyks0 in number , --操作员科室 Ptyyy00 in varchar2 , --退药原因 Pcommit in varchar2 default 'N' , --是否提交 Pzxcgbz out number , --执行成功标志 1成功 0失败 Ptsxx00 out varchar2 , --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 out varchar2 , --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 Pjpmxid in number default 0 , --静配批次明细医嘱流水号 Pbccxsl in number default 0 , --本次冲销数量 Pcflsh0 in varchar2 default null --冲销单据号 ) as Vyzypsq YF_YZYPSQ%rowtype; Vjczsl0 YF_YZYPSQ.JCZSL0%type; Vfbbh00 ZY_BRXXB0.FBBH00%type; VJSFYTY XT_XTCS00.VALUE0%type; VJZTYSJ XT_XTCS00.VALUE0%type; Vjzdh00 ZY_FYMX00.JZDH00%type; Vmxbqid YF_JPMXYZ.MXBQID%type; Vpspc00 YF_JPMXYZ.PSPC00%type; Vsytysj varchar2(200); Vpctysj varchar2(20); Vcounter number; --记数器 Vsysdate date; Ecustom exception; --错误变量 Vpdssks varchar2(20);--非病区科室申请药品,是否不能提出退药申请 Vbmxz00 BM_BMBM00.BMXZ00%type; --开单科室部门性质 Vczbmxz BM_BMBM00.BMXZ00%type; --操作员科室部门性质 begin Pzxcgbz:=0; Vsysdate:=sysdate; Pxxxx00 :=nvl(to_char(Pypqlpc),'null')||','||nvl(to_char(Pczy000),'null')||','|| nvl(to_char(Pczyks0),'null')||','||nvl(to_char(Pcommit),'null')||','||nvl(to_char(Pjpmxid),'null'); SP_TransLog(Vsysdate,'SP_YF_YZYPSQ_CXCZ',Pczy000,Pczyks0,Pxxxx00); --取出已结算病人是否退药参数 select nvl(max(Trim(VALUE0)),'Y') into VJSFYTY from XT_XTCS00 where NAME00='YF_ZYYFYJSSFYXTY'; --取出每个配送批次截止申请退药时间 select nvl(max(Trim(VALUE0)),'Y') into VJZTYSJ from XT_XTCS00 where NAME00='BQ_PSPCJZTYSJ'; --非病区科室申请药品,是否不能提出退药申请 select nvl(max(Trim(VALUE0)),'N') into Vpdssks from XT_XTCS00 where NAME00='BQ_FBQKSSQYPBNTY'; select * into Vyzypsq from YF_YZYPSQ where YPQLPC = Pypqlpc; if Vpdssks='Y' then --判断操作员科室的部门性质 select BMXZ00 into Vczbmxz from BM_BMBM00 where BMBH00=Pczyks0; --操作员科室属于'0'住院临床科室 或者 '9'病区 if Vczbmxz='0' or Vczbmxz='9' then --判断开单科室是否为病区科室申请 select BMXZ00 into Vbmxz00 from BM_BMBM00 where BMBH00 in(select DQKS00 from YF_YZYPSQ where YZID00=Vyzypsq.YZID00 and TQDJH0=Vyzypsq.TQDJH0 and rownum=1); if Vbmxz00!='0' then Ptsxx00:='非病区科室申请药品,不能提出退药申请!'; raise Ecustom; end if; end if; end if; --限制代配退药一定要传入Pjpmxid if (nvl(Vyzypsq.PSPC00,'0')<>'0') and (nvl(Pjpmxid,0)=0) then PTSXX00:='请领批次='||to_char(Pypqlpc)||'属于代配药品,请使用【代配退药申请】'; raise Ecustom; end if; --判断是否允许退药 if VJSFYTY='N' then select nvl(min(JZDH00),0) into Vjzdh00 from ZY_FYMX00 where DJH000=Vyzypsq.DJH000 and JZDH00<>0; if Vjzdh00>0 then PTSXX00:='此处方费用已结算,请取消结算后再退药!'; raise Ecustom; end if; end if; if Pjpmxid>0 then update YF_JPMXYZ set TYBZ00='1' where LSH000=Pjpmxid and TYBZ00='0'; if sql%notfound then PTSXX00:='找不到 静配明细医嘱流水号为【'||to_char(Pjpmxid)||'】未退药记录,请重新确认'; raise Ecustom; end if; select min(mxbqid),min(pspc00) into Vmxbqid,Vpspc00 from YF_JPMXYZ where LSH000=Pjpmxid and TYBZ00='1'; Update YF_JPMXBQ set TYBZ00='1' where MXBQID=Vmxbqid and TYBZ00='0'; --Update YF_YZYPSQ a set (ZCXSL0,BCCXSL)=(select a.ZCXSL0+round(SYZSL0*ZHL000/a.ZHL000,3),round(SYZSL0*ZHL000/a.ZHL000,3) Update YF_YZYPSQ a set BCCXSL=(select round(SYZSL0*ZHL000/a.ZHL000,3) from YF_JPMXYZ where LSH000=Pjpmxid) where YPQLPC=Pypqlpc; elsif Pbccxsl>0 then Update YF_YZYPSQ set BCCXSL=Pbccxsl where YPQLPC=Pypqlpc; end if; select * into Vyzypsq from YF_YZYPSQ where YPQLPC = Pypqlpc; if Vyzypsq.zcxsl0+Vyzypsq.BCCXSL>Vyzypsq.ypzsl0 then PTSXX00:='本次冲销数量:'||to_char(Vyzypsq.BCCXSL)||',退药合计:'||to_char(Vyzypsq.zcxsl0+Vyzypsq.BCCXSL)||',大于 药品总量:'||to_char(Vyzypsq.ypzsl0)||',请重新输入!'||'请领批次='||to_char(Pypqlpc); raise Ecustom; end if; --进入包药机药品,不允许病区退药申请,本药房允许。 -- if Vyzypsq.BYTJ00 = '1' then -- if Pczyks0<>Vyzypsq.yfbmbh then -- PTSXX00:='进入包药机药品,只允许药房进行退药申请!'; -- raise Ecustom; -- end if; -- end if; --静配药品,每个配送批次,只允许病区在规定时间点之前退药申请,本药房都允许。 if VJZTYSJ<>'N' and Pjpmxid>0 then if Pczyks0<>Vyzypsq.yfbmbh then Vsytysj := VJZTYSJ ||','; --for i in 1..5 loop for i in 1..9 loop Vpctysj := substr(Vsytysj,1,instr(Vsytysj,',')-1); Vsytysj := substr(Vsytysj,instr(Vsytysj,',')+1,length(Vsytysj)); exit when Vpspc00 = to_char(i); end loop; if length(Vpctysj)<8 then Vpctysj := Vpctysj ||':00'; end if; if to_char(Vsysdate,'YYYYMMDDHH24:MI:SS')>Vyzypsq.YYRQ00||Vpctysj then PTSXX00:='已经超过该配送批次退药截止时间: '||Vyzypsq.YYRQ00||' '||Vpctysj; PTSXX00:=replace(PTSXX00,':',':'); raise Ecustom; end if; end if; end if; select SQ_YF_YZYPSQ_YPQLPC.nextval into Pcxqlpc from dual; select FBBH00 into Vfbbh00 from zy_brxxb0 where zyid00=Vyzypsq.zyid00; insert into YF_YZYPSQ( YPQLPC, --药品请领批次 SQ_YF_YZYPSQ_YPQLPC CKDH00, --出库单号 YF_YPCKD0_CKDH00 TQDJH0, --(提取)单据号 YFBMBH, --药房部门编号 BQBMBH, --病区部门编号 DQKS00, --当前病人住院科室 ZYID00, --住院病人信息流水号(SQ_ZY_BRXXB0_ZYID00) CH0000, --床号 ZYH000, --住院号,病人每次住院,住院号可以变化,病案号不变 BRXM00, --病人姓名 YFLBID, --用法类别ID BQ_YFLB00 HZBZ00, --汇总标志 --'0'汇总,'1'明细 YZID00, --医嘱ID号,(作为草药打包分组号) YZMXID, --医嘱明细ID CLBZ00, --长临标志 DJH000, --单据号 ZYTS00, --中药贴数 YSGZH0, --医师工作号 对应BM_YGBM00表 YSZID0, --医生组ID SSKS00, --所属科室(医师) 对应BM_BMBM00表 QLZT00, --请领状态:--0未记账,1已记账,2已发药 FYBZ00, --发药标志,0正常,1发药状态(表示数据锁定) FJFDJH, --附加费单据号 YPDLBH, --药品大类编号 对应BM_YPLB00表 --‘0’西药,‘2’草药‘1’成药 YPNM00, --药品内码 对应BM_YD0000表 YPMC00, --药品名称 YPGG00, --规格 QLDW00, --请领单位 ZHL000, --转换率(请领单位/剂量单位) GJDJ00, --购进单价(请领单位) LSDJ00, --零售单价(请领单位) PFDJ00, --批发单价(请领单位) CSL000, --次数量(剂量单位) JLDW00, --剂量单位(J) YPZSL0, --药品总数量(请领单位) YFID00, --用法ID YPYFMC, --药品用法名称 对应MZ_YPYF00表 PCID00, --频次ID PCMC00, --频次名称 对应BM_PC0000表 YFSMMC, --用法说明名称 对应MZ_YPYFSM表 ZJYFMC, --中药整剂用法名称 vw_BM_YPZJYF_ZJYFMC XMYFMC, --中药细目用法名称 vw_BM_YPXMYF_XMYFMC CXBZ00, --冲销标志'Z'-->正常,'-'冲销记录,'+'被冲记录 CXPCID, --冲销批次ID(自动记录被冲销的批次) CXJPID, --冲销配制批次明细医嘱ID=YF_JPMXYZ.LSH000 SFZSL0, --实发总数量(请领单位,乘以贴数后) JCZSL0, --寄存总数量(请领单位,乘以贴数后) SFXS00, --是否显示'Y'显示,'N'不显示,协定处方用 THBZ00, --退回标志--'0',正常,'1',错误,'2',缺药,--'3'缺钱,'4',其他. CZY000, --操作员 SRRQ00, --输入日期 SRSJ00, --输入时间 ZFBL00, --自付比例 HJJE00, --合计金额 GFJE00, --公费金额 QZFJE0, --全自负金额(首次自负金额) ZFJE00, --自负金额 JZJE00, --记账金额 BZ0000, --备注 YEXM00, --婴儿姓名 TYYY00, --退药原因 YYRQ00, --用药日期 PSPC00, --配送批次 YZXZ00, --0普通1手术医嘱2麻醉医嘱3出院带药 CFYZID, --处方医嘱ID TDYPID, --特定药品ID ZFFSBZ --自费方式标志 ) select Pcxqlpc, null, nvl(Pcflsh0,TQDJH0), --(提取)单据号 YFBMBH, --药房部门编号 BQBMBH, --病区部门编号 DQKS00, --当前病人住院科室 ZYID00, --住院病人信息流水号(SQ_ZY_BRXXB0_ZYID00) CH0000, --床号 ZYH000, --住院号,病人每次住院,住院号可以变化,病案号不变 BRXM00, --病人姓名 YFLBID, --用法类别ID BQ_YFLB00 HZBZ00, --汇总标志 --'0'汇总,'1'明细 YZID00, --医嘱ID号,(作为草药打包分组号) YZMXID, --医嘱明细ID CLBZ00, --长临标志 null, --单据号 ZYTS00, --中药贴数 YSGZH0, --医师工作号 对应BM_YGBM00表 YSZID0, --医生组ID SSKS00, --所属科室(医师) 对应BM_BMBM00表 '0', --0未记账,1已记账,2已发药,3作废,4已领药,5已退药,6已退费 FYBZ00, --发药标志,0正常,1发药状态(表示数据锁定) FJFDJH, --附加费单据号 YPDLBH, --药品大类编号 对应BM_YPLB00表 --‘0’西药,‘2’草药‘1’成药 YPNM00, --药品内码 对应BM_YD0000表 YPMC00, --药品名称 YPGG00, --规格 QLDW00, --请领单位 ZHL000, --转换率(请领单位/剂量单位) GJDJ00, --购进单价(请领单位) LSDJ00, --零售单价(请领单位) PFDJ00, --批发单价(请领单位) CSL000, --次数量(剂量单位) JLDW00, --剂量单位(J) -nvl(BCCXSL,YPZSL0), --药品总数量(请领单位) YFID00, --用法ID YPYFMC, --药品用法名称 对应MZ_YPYF00表 PCID00, --频次ID PCMC00, --频次名称 对应BM_PC0000表 YFSMMC, --用法说明名称 对应MZ_YPYFSM表 ZJYFMC, --中药整剂用法名称 vw_BM_YPZJYF_ZJYFMC XMYFMC, --中药细目用法名称 vw_BM_YPXMYF_XMYFMC '-', --冲销标志'Z'-->正常,'-'冲销记录,'+'被冲记录 YPQLPC, --冲销批次ID(自动记录被冲销的批次) nvl(Pjpmxid,0), --冲销配制批次明细医嘱ID=YF_JPMXYZ.LSH000 ---nvl(BCCXSL,YPZSL0)-VJCZSL0, --实发总数量(请领单位,乘以贴数后) -nvl(BCCXSL,YPZSL0), --实发总数量(请领单位,乘以贴数后) --VJCZSL0, --寄存总数量(请领单位,乘以贴数后) --注意,也是用负数表示 0, --寄存总数量 SFXS00, --是否显示'Y'显示,'N'不显示,协定处方用 THBZ00, --退回标志--'0',正常,'1',错误,'2',缺药,--'3'缺钱,'4',其他. Pczy000, --操作员 to_char(sysdate,'yyyymmdd'), to_char(sysdate,'hh24:mi:ss'), ZFBL00, --自付比例 -round(LSDJ00*nvl(BCCXSL,YPZSL0),2), --合计金额 --round(HJJE00*BCCXSL/YPZSL0,2) -round(GFJE00*nvl(BCCXSL,YPZSL0)/YPZSL0,2), --公费金额 门诊使用0 -round(QZFJE0*nvl(BCCXSL,YPZSL0)/YPZSL0,2), --全自负金额(首次自负金额) -((round(LSDJ00*nvl(BCCXSL,YPZSL0),2)-round(QZFJE0*nvl(BCCXSL,YPZSL0)/YPZSL0,2))*DECODE(Vfbbh00,3,1,ZFBL00)+round(QZFJE0*nvl(BCCXSL,YPZSL0)/YPZSL0,2)),--自付金额 ---decode(BCCXSL,null,JZJE00, round(JZJE00*BCCXSL/YPZSL0,2)), --记账金额 -(round(LSDJ00*nvl(BCCXSL,YPZSL0),2)-round(QZFJE0*nvl(BCCXSL,YPZSL0)/YPZSL0,2))*DECODE(Vfbbh00,3,0,1,0,1-ZFBL00), --记账金额 CKDH00, --备注 YEXM00, --婴儿姓名 Ptyyy00, --退药原因 YYRQ00, --用药日期 Vpspc00, --配送批次 YZXZ00, --0普通1手术医嘱2麻醉医嘱3出院带药 CFYZID, --处方医嘱ID TDYPID, --特定药品ID ZFFSBZ --自费方式标志 from YF_YZYPSQ where YPQLPC=Pypqlpc; update YF_YZYPSQ set CXBZ00='+' where YPQLPC=Pypqlpc; --,ZCXSL0=nvl(ZCXSL0,0)+nvl(Vyzypsq.BCCXSL,Vyzypsq.YPZSL0) --if nvl(Pjpmxid,0)=0 then Update YF_YZYPSQ set ZCXSL0=nvl(ZCXSL0,0)+nvl(Vyzypsq.BCCXSL,Vyzypsq.YPZSL0), BCCXSL=0 where YPQLPC=Pypqlpc; --end if; update BQ_YZZXJL set ZT0000='2' where ZYID00=Vyzypsq.ZYID00 and TQDJH0=Vyzypsq.TQDJH0 and YZMXID=Vyzypsq.YZMXID and DJHLB0='0' and ZT0000 not in ('2','5') and exists(select 1 from YF_YZYPSQ where YPQLPC=Pypqlpc and QLZT00 in ('2','4')); 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;