create or replace procedure SP_YF_JPTMYWCZ -- MODIFICATION HISTORY -- Person Date Comments -- qks 2013.01.23 Create: 注意,一定要按操作的先后顺序扫描(以后步骤再做成可定制) -- qks 2013.01.28 汇总核对:修正配制表的核对人等信息 -- qks 2013.02.02 1、注意!单瓶药品不进入配制间:少掉"3:配制 4:出仓"两个步骤;2、发药已退药申请或退药确认,业务操作终止。 -- qks 2013.03.26 增加入参PPSPC00; -- qks 2013.04.02 单瓶药品不允许"3:配制 4:出仓"两个步骤;配制和出仓都要进行批次验证;04.07 改为有传入PPSPC00,就要验证。 -- qks 2013.04.10 修改汇总标签配制扫描错误;04.11: 修改汇总标签扫描错误提示信息 -- qks 2013.04.17 增加POPFLAG=T -- qks 2013.04.23 配制扫描汇总标签后,明细标签只允许其他人再扫描确认一次! --扫描汇总标签,如果退药未进行 静配退药确认(即YF_JPMXBQ.TYBZ00<>0并且<>3),也要报警! -- qks 2013.05.02 出仓核对:遇到退药袋对应被替换药品袋时,会打印出替换标签,再对替换袋进行出仓核对。 --“配制”操作步骤允许不要:增加条件 or CZLX00='2' and POPFLAG_P='4' -- qks 2013.05.07 增加入参PYYRQ00; -- qks 2013.05.09 被退换的标签直接出仓确认;已退药确认过的才算"已退药",申退的不算 -- qks 2013.05.19 参数ZYJP_LSYZTSCL控制:短嘱直接从核对状态到已发药状态;第5批次允许从核对进入发药,不限制是否已“出仓核对” -- qks 2013.05.29 护士接收操作(POPFLAG=6),不要验证标签的前一状态 -- qks 2013.06.06 核对扫描汇总标签:要提示退药多少袋; -- qks 2013.06.22 重贴标签也要考虑是否被退药掉 -- qks 2013.08.08 短嘱也要进行出仓核对,状态直接改为发药 -- qks 2013.08.21 增加入参Pbqbmbh -- qks 2013.09.05 短嘱也要进行出仓核对,状态直接改为发药:未写入YF_JPLZJL; -- qks 2013.10.18 汇总扫描控制先后业务的顺序; -- qks 2013.11.20 汇总扫描要同时录入配送批次校验; -- qks 2014.01.23 PDA退药确认功能:POPFLAG=P;配制扫描时,如果是申请退药状态,要返回失败信息; -- qks 2014.01.27 化疗药一定要经过“配制”步骤操作; -- qks 2014.08.04 发药扫描一定要先指定“病区” -- qks 2014.11.13 增加支持V7.0,SP_YF_ZYBRTY改用SP_YF_ZYBRTY_JP -- qks 2015.11.20 明细标签不允许往之前的状态进行扫描操作 by JMPZ-20151120-001 ( POPFLAG in varchar2, --操作标志,2:核对 3:配制 4:出仓 5:发药 6:护士接收 7:病人挂瓶 T:退药确认 P:PDA退药 PTXM000 in varchar2, --条码 PSFHZBQ in varchar2, --是否汇总标签:Y是 PCZY000 in number, --操作员 PXTCZY0 in number, --系统操作员 PCZYKS0 in number, --操作员科室 PCOMMIT in varchar2 default 'N', --是否提交 PZXCGBZ out number, --执行成功标志 1成功 0失败 PTSXX00 out varchar2, --执行结果提示信息,成功的情况下也可能有警告信息 PXXXX00 out varchar2, --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 PPSPC00 in varchar2 default '', --配送批次 PYYRQ00 in varchar2 default '', --用药日期 Pbqbmbh in number default 0 --病区部门编号 ) as VCOUNT0 number; Vsysdate date; --日期变量 VPZPCID YF_JPPZD0.PZPCID%type; --汇总标签ID VMXBQID YF_JPMXBQ.MXBQID%type; --明细标签ID VTYBZ00 YF_JPMXYZ.TYBZ00%type; --退药标志 0 正常 1申退 2已退 VYZYPGS YF_JPMXBQ.YZYPGS%type; --对应医嘱药品个数 VJYLX00 YF_JPPZD0.JYLX00%type; --加药类型(0单个多个,1单瓶,2单个,3多个,4遗漏) VPSPC00 YF_JPMXBQ.PSPC00%type; --配送批次 VDQCZLX YF_JPMXBQ.CZLX00%type; --标签的当前操作类型 VHDR000 YF_JPPZD0.HDR000%type; --汇总标签核对人 VTDBQID YF_JPTYDY.TDBQID%type; --替代标签ID VTDTXM0 YF_JPMXBQ.TXM000%type; --替代标签条码 VYYRQ00 YF_JPMXBQ.YYRQ00%type; --用药日期 VBQBMBH YF_JPMXBQ.BQBMBH%type; --病区部门编号 VLSYZCL XT_XTCS00.VALUE0%type; --临时医嘱特殊处理 VZDS000 YF_JPPZD0.ZDS000%type; --总袋数(不包含退药) VCLBZ00 char(1); --长临标志:0长期1临时 VCZLXMC varchar2(20); --操作类型名称 VCZLXMC_D varchar2(20); --标签的当前操作类型名称 VBQLXMC varchar2(20); --标签类型名称 VMXTXM0 varchar2(20); --条码变量 VTYBZMC varchar2(30); --退药标志名称 POPFLAG_P char(1); --前一状态 VCZLXMC_P varchar2(20); --操作类型名称(前一状态) VSFHZBQ char(1); --是否汇总标签 VYear0 number(4); VTYQLPC varchar2(500); --退药请领批次 V_EXE_SQL varchar2(500); ECUSTOM exception; --错误变量 cursor C_MXBQ IS select TXM000,CH0000,BQMC00 from VW_YF_JPMXBQ where PZPCID = VPZPCID and BQTYBZ in ('2'); cursor C_TDBQID IS select TDBQID from (select rownum XH,TDBQID from (select TYBQID,TDBQID from YF_JPTYDY a where TDBQID<>VMXBQID) start with TYBQID=VMXBQID connect by prior TDBQID=TYBQID) a order by a.XH desc; cursor C_TYQLPC is SELECT a.ypqlpc FROM yf_yzypsq a, yf_jpmxbq b, yf_jpmxyz c WHERE b.mxbqid = VMXBQID AND b.mxbqid = c.mxbqid AND a.yzid00 = b.yzid00 AND a.cxbz00 = '-' AND a.yyrq00 = b.yyrq00 AND a.cxpcid = c.ypqlpc AND a.pspc00 = b.pspc00 AND nvl(a.DJH000,0)=0; begin PZXCGBZ := 0; Vsysdate := sysdate; VSFHZBQ := nvl(PSFHZBQ,'N'); VYear0 := to_number(to_char(Vsysdate,'YYYY')); if length(PTXM000)=14 and VSFHZBQ<>'Y' and (substrb(PTXM000,1,4)=to_char(Vsysdate,'YYYY') or substrb(PTXM000,1,4)=to_char(VYear0-1) or substrb(PTXM000,1,4)=to_char(VYear0+1) ) then VSFHZBQ := 'Y'; end if; VCZLXMC := SF_YF_GETCZLXMC(POPFLAG,'0'); VCZLXMC_P := SF_YF_GETCZLXMC(POPFLAG,'1'); POPFLAG_P := SF_YF_GETCZLXMC(POPFLAG,'2'); if VSFHZBQ = 'Y' then VBQLXMC := '汇总'; select nvl(max(PZPCID),0),nvl(max(JYLX00),'0'),nvl(max(HDR000),0),nvl(max(YYRQ00),''),nvl(max(ZDS000),0),nvl(max(PSPC00),'0') into VPZPCID,VJYLX00,VHDR000,VYYRQ00,VZDS000,VPSPC00 from YF_JPPZD0 where TXM000 = PTXM000; if POPFLAG='2' and PPSPC00 is null then PTSXX00:='核对汇总扫描:要求前台录入配送批次'; raise Ecustom; end if; else VBQLXMC := '明细'; select nvl(max(MXBQID),0),nvl(max(PZPCID),0),nvl(max(PSPC00),'0'),nvl(max(CZLX00),'0'),nvl(max(TYBZ00),'0'),nvl(max(YYRQ00),''),nvl(max(CLBZ00),''),nvl(max(BQBMBH),0) into VMXBQID,VPZPCID,VPSPC00,VDQCZLX,VTYBZ00,VYYRQ00,VCLBZ00,VBQBMBH from YF_JPMXBQ where TXM000 = substrb(PTXM000,3,16); VCZLXMC_D := SF_YF_GETCZLXMC(VDQCZLX,'0'); --明细标签不允许往之前的状态进行扫描操作 if VDQCZLX>POPFLAG and POPFLAG not in ('T','P') then PTSXX00:='该标签属于 '||VCZLXMC_D||' 状态'; raise Ecustom; end if; end if; if VPZPCID = 0 or VMXBQID = 0 then PTSXX00:='没找到'||VBQLXMC||'标签【'||PTXM000||'】'; raise Ecustom; end if; /* if POPFLAG='5' and nvl(Pbqbmbh,0)=0 then PTSXX00:='发药扫描要求先指定病区!'; raise Ecustom; end if; */ if PPSPC00 is not null and PPSPC00<>VPSPC00 then PTSXX00:='配送批次'||VPSPC00||',跟设定值'||PPSPC00||' 不一致!'; raise Ecustom; end if; if nvl(Pbqbmbh,0)>0 and (VSFHZBQ<>'Y') and Pbqbmbh<>VBQBMBH then select bmmc00 into VTYBZMC from BM_BMBM00 where BMBH00=VBQBMBH; PTSXX00:='属于“'||VTYBZMC||'”,跟设定值不一致!'; raise Ecustom; end if; if PYYRQ00 is not null and PYYRQ00<>VYYRQ00 then PTSXX00:='用药日期'||substr(VYYRQ00,1,4)||'-'||substr(VYYRQ00,5,2)||'-'||substr(VYYRQ00,7,2) ||',跟设定值'||substr(PYYRQ00,1,4)||'-'||substr(PYYRQ00,5,2)||'-'||substr(PYYRQ00,7,2)||' 不一致!'; raise Ecustom; end if; /* --2014.02.07 暂时放开限制 if POPFLAG='3' and PPSPC00 is null then PTSXX00:='配制扫描:要求前台录入配送批次'; raise Ecustom; end if; */ --取参数 select nvl(max(value0),'N') into VLSYZCL from xt_xtcs00 where name00='ZYJP_LSYZTSCL'; --注意直接退出 if POPFLAG = 'T' then if VTYBZ00 = '3' then PTSXX00:='明细标签【'||PTXM000||'】已退药确认过,请重新确认!'; raise Ecustom; end if; Update YF_JPMXBQ set TYBZ00='3',ZHXGR0=PCZY000,ZHXGRQ=to_char(Vsysdate,'YYYYMMDD'),ZHXGSJ=to_char(Vsysdate,'HH24:MI:SS') where MXBQID=VMXBQID and TYBZ00='2'; if sql%notfound then PTSXX00:='明细标签【'||PTXM000||'】还未“退药执行”,请重新确认!'; raise Ecustom; end if; PZXCGBZ := 1; if PCOMMIT = 'Y' then commit; end if; return; end if; --2014.01.23 注意直接退出 if POPFLAG = 'P' then if VTYBZ00='2' or VTYBZ00='3' then PTSXX00:='明细标签【'||PTXM000||'】已退药确认过,请重新确认!'; raise Ecustom; elsif VTYBZ00<>'1' then PTSXX00:='明细标签【'||PTXM000||'】还未申请退药,请重新确认!'; raise Ecustom; end if; for TYSQ in C_TYQLPC loop if VTYQLPC is null then VTYQLPC := to_char(TYSQ.YPQLPC); else VTYQLPC := VTYQLPC||','||to_char(TYSQ.YPQLPC); end if; end loop; if VTYQLPC is null then PTSXX00:='明细标签【'||PTXM000||'】找不到满足条件的申请退药,请重新确认!'; raise Ecustom; end if; --SP_YF_ZYBRTY( SP_YF_ZYBRTY_JP( VTYQLPC, PXTCZY0, --退药人 Pczy000, --操作员编码 Pczyks0, --操作员科室 Pcommit, --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 Ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00, --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 'N' , --是否转借药单:N不转Y转 'N' --片剂是否转借药单:N不转Y转 ); return; end if; if VSFHZBQ = 'Y' then --汇总标签 select nvl(max(a.TXM000),'0') into VMXTXM0 from YF_JPMXBQ a,YF_JPLZJL b where a.PZPCID = VPZPCID and a.MXBQID=b.MXBQID and b.CZLX00=POPFLAG and rownum=1; if VMXTXM0 <> '0' then if POPFLAG = '2' and VHDR000>0 then PTSXX00:='汇总标签【'||PTXM000||'】已进行'||VCZLXMC||'操作'; else PTSXX00:='明细标签【'||VMXTXM0||'】已处理,不允许再对汇总标签【'||PTXM000||'】进行'||VCZLXMC||'操作'; end if; raise Ecustom; end if; --提示未进行 静配退药确认 PTSXX00:=''; select count(1) into VCOUNT0 from YF_JPMXBQ where PZPCID = VPZPCID and TYBZ00 in ('2'); VZDS000 := VZDS000 - VCOUNT0; if VCOUNT0>0 then PTSXX00:='已退药【'||to_char(VCOUNT0)||'】袋'; end if; insert into YF_JPLZJL ( MXBQID, --明细标签ID号 F.K=YF_JPMXBQ.MXID00 CZLX00, --操作类型:0审方,1调剂,2核对,3配制,4出仓(成品)核对,5发药核对,6护士接收,7病人挂瓶 PZPCID, --配制批次 YF_JPPZD0.PZPCID CZY000, --操作员 CZRQ00, --操作日期 CZSJ00 --操作时间 ) select MXBQID, POPFLAG, VPZPCID, PCZY000, to_char(Vsysdate,'YYYYMMDD'), to_char(Vsysdate,'HH24:MI:SS') from YF_JPMXBQ where PZPCID = VPZPCID and TYBZ00 not in ('2'); --2013.05.19 短嘱直接从核对状态到已发药状态 --2013.08.08 短嘱直接从出仓状态到已发药状态 --if VLSYZCL='Y' and POPFLAG = '2' then if VLSYZCL='Y' and POPFLAG = '4' then insert into YF_JPLZJL ( MXBQID, --明细标签ID号 F.K=YF_JPMXBQ.MXID00 CZLX00, --操作类型:0审方,1调剂,2核对,3配制,4出仓(成品)核对,5发药核对,6护士接收,7病人挂瓶 PZPCID, --配制批次 YF_JPPZD0.PZPCID CZY000, --操作员 CZRQ00, --操作日期 CZSJ00 --操作时间 ) select MXBQID, '5', VPZPCID, PCZY000, to_char(Vsysdate,'YYYYMMDD'), to_char(Vsysdate,'HH24:MI:SS') from YF_JPMXBQ where PZPCID = VPZPCID and TYBZ00 not in ('2') and CLBZ00='1'; end if; if (VJYLX00='1') and (POPFLAG_P='4') then --单瓶 POPFLAG_P:='2'; VCZLXMC_P:='核对'; end if; --2013.05.19 短嘱直接从核对状态到已发药状态 --2013.08.08 短嘱直接从出仓状态到已发药状态 Update YF_JPMXBQ set CZLX00=decode(CLBZ00,'1',decode(VLSYZCL,'Y',decode(POPFLAG,'4','5',POPFLAG),POPFLAG),POPFLAG), ZHXGR0=PCZY000,ZHXGRQ=to_char(Vsysdate,'YYYYMMDD'),ZHXGSJ=to_char(Vsysdate,'HH24:MI:SS') where PZPCID = VPZPCID and CZLX00=POPFLAG_P and TYBZ00 not in ('2'); --2013.10.18 --if sql%notfound and PTSXX00 is null then if sql%notfound and VZDS000>0 then PTSXX00:='标签还未进行【'||VCZLXMC_P||'】,请重新确认'; raise Ecustom; end if; --汇总核对:修正配制表的核对人等信息 if POPFLAG = '2' then update YF_JPPZD0 set HDR000=PCZY000,HDRQ00=to_char(Vsysdate,'YYYYMMDD'),HDSJ00=to_char(Vsysdate,'HH24:MI:SS') where PZPCID = VPZPCID; end if; --汇总配制 if POPFLAG = '3' then update YF_JPPZD0 set PZR000=PCZY000,PZRQ00=to_char(Vsysdate,'YYYYMMDD'),PZSJ00=to_char(Vsysdate,'HH24:MI:SS') where PZPCID = VPZPCID; end if; else --明细标签 VTYBZMC := ''; select nvl(max(TYBZ00),'0'),count(1) into VTYBZ00,VYZYPGS from YF_JPMXYZ where MXBQID=VMXBQID; if VTYBZ00 = '1' then VTYBZMC :='申请退药!'; elsif VTYBZ00 = '2' then VTYBZMC :='已退药!'; end if; --2014.01.23 if POPFLAG = '3' and VTYBZMC is not null then PTSXX00:='标签【'||PTXM000||'】'||VTYBZMC; raise Ecustom; end if; --if VTYBZ00 <> '0' then if VTYBZ00 = '2' then --2013.05.08 已退药确认过的才算"已退药",申退的不算 if VCLBZ00 = '1' then PTSXX00:='短嘱'||VTYBZMC||' 标签【'||PTXM000||'】,请重新确认'; raise Ecustom; end if; if POPFLAG = '4' then select nvl(max(TDBQID),0) into VTDBQID from YF_JPTYDY where TYBQID=VMXBQID; if VTDBQID>0 then --2013.06.22 重贴标签也要考虑是否被退药掉 if VTDBQID<>VMXBQID then for TDBQ in C_TDBQID loop select nvl(max(TXM000),'') into VTDTXM0 from YF_JPMXBQ where MXBQID=TDBQ.TDBQID and TYBZ00 in ('0','1') and CZLX00<'4'; if VTDTXM0 is not null then VMXBQID:=TDBQ.TDBQID; end if; exit; --只取最后一次绑定记录 end loop; end if; end if; end if; if VTDTXM0 is not null then PTSXX00:= '需要重贴标签['||VTDTXM0||']!原退药标签【'||PTXM000||'】'; else PTSXX00:=VTYBZMC||' 标签【'||PTXM000||'】,请重新确认'; raise Ecustom; end if; end if; if (VYZYPGS = 1) and (POPFLAG='3' or POPFLAG='4') then PTSXX00:='明细标签【'||PTXM000||'】是单瓶,不需要【'||VCZLXMC||'】,请重新确认'; raise Ecustom; end if; if (VYZYPGS <=1) and (POPFLAG = '5') then --单瓶 POPFLAG_P:='2'; VCZLXMC_P:='核对'; end if; --2013.04.23 配制:配制单跟标签时间一样时,允许修改(即第1次)。 if POPFLAG='3' and VCZLXMC_D=POPFLAG then select count(1) into VCOUNT0 from YF_JPLZJL a,YF_JPPZD0 b where a.PZPCID=b.PZPCID and a.MXBQID=VMXBQID and a.CZRQ00=b.PZRQ00 and a.CZSJ00=b.PZSJ00 and a.CZLX00='3'; if VCOUNT0>0 then Update YF_JPLZJL set CZY000=PCZY000,CZRQ00=to_char(Vsysdate,'YYYYMMDD'),CZSJ00=to_char(Vsysdate,'HH24:MI:SS') where MXBQID=VMXBQID and CZLX00='3'; else PTSXX00:='明细标签【'||PTXM000||'】属于【'||VCZLXMC_D||'】状态,请重新确认'; raise Ecustom; end if; else --2013.05.02 增加条件 or CZLX00='2' and POPFLAG_P='4' --2013.05.19 第5批次允许从核对进入发药,不限制是否已“出仓核对” or PSPC00='5' and POPFLAG='5' and CZLX00>='2' and CZLX00<'5' --2013.05.29 护士接收操作(POPFLAG=6),不要验证标签的前一状态 or POPFLAG='6' --2013.08.08 短嘱直接从出仓状态到已发药状态 --2014.01.27 化疗药一定要经过“配制”步骤操作 Update YF_JPMXBQ set CZLX00=decode(CLBZ00,'1',decode(VLSYZCL,'Y',decode(POPFLAG,'4','5',POPFLAG),POPFLAG),POPFLAG), ZHXGR0=PCZY000,ZHXGRQ=to_char(Vsysdate,'YYYYMMDD'),ZHXGSJ=to_char(Vsysdate,'HH24:MI:SS') where MXBQID = VMXBQID --and (CZLX00=POPFLAG_P or CZLX00='2' and POPFLAG='4' or PSPC00='5' and POPFLAG='5' and CZLX00>='2' and CZLX00<'5' or POPFLAG='6'); and (CZLX00=POPFLAG_P or CZLX00='2' and POPFLAG='4' and not (ZJLB00='2' and YZYPGS>1) or PSPC00='5' and POPFLAG='5' and CZLX00>='2' and CZLX00<'5' or POPFLAG='6'); if sql%notfound then PTSXX00:='明细标签【'||PTXM000||'】属于【'||VCZLXMC_D||'】状态,请重新确认'; raise Ecustom; end if; begin insert into YF_JPLZJL ( MXBQID, --明细标签ID号 F.K=YF_JPMXBQ.MXID00 CZLX00, --操作类型:0审方,1调剂,2核对,3配制,4出仓(成品)核对,5发药核对,6护士接收,7病人挂瓶 PZPCID, --配制批次 YF_JPPZD0.PZPCID CZY000, --操作员 CZRQ00, --操作日期 CZSJ00 --操作时间 ) values ( VMXBQID, POPFLAG, VPZPCID, PCZY000, to_char(Vsysdate,'YYYYMMDD'), to_char(Vsysdate,'HH24:MI:SS') ); --2013.05.19 短嘱直接从核对状态到已发药状态 --2013.08.08 短嘱直接从出仓状态到已发药状态 --if VLSYZCL='Y' and VCLBZ00='1' and POPFLAG = '2' then --2013.09.05 if VLSYZCL='Y' and VCLBZ00='1' and POPFLAG = '4' then insert into YF_JPLZJL ( MXBQID, --明细标签ID号 F.K=YF_JPMXBQ.MXID00 CZLX00, --操作类型:0审方,1调剂,2核对,3配制,4出仓(成品)核对,5发药核对,6护士接收,7病人挂瓶 PZPCID, --配制批次 YF_JPPZD0.PZPCID CZY000, --操作员 CZRQ00, --操作日期 CZSJ00 --操作时间 ) select MXBQID, '5', VPZPCID, PCZY000, to_char(Vsysdate,'YYYYMMDD'), to_char(Vsysdate,'HH24:MI:SS') from YF_JPMXBQ --where PZPCID = VPZPCID and TYBZ00 not in ('2') --2013.08.08 where MXBQID = VMXBQID and TYBZ00 not in ('2') and CLBZ00='1'; end if; exception when others then Ptsxx00 := '明细标签【'||PTXM000||'】已'||VCZLXMC||'过,请重新确认!*'; raise Ecustom; end; end if; end if; 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;