-- Start of DDL Script for Procedure SD_HOSPITAL.SP_YF_ZYCFCL -- Generated 7-二月-2013 12:12:25 from SD_HOSPITAL@PHXYY CREATE OR REPLACE PROCEDURE sp_yf_zycfcl( P_CFLSH0 IN CHAR, --处方流水号 P_CFJSZT IN CHAR, --处方结束状态 P_YFBMBH IN NUMBER, --输入:药房部门编号 P_CZYBH0 IN NUMBER, --操作员编码 P_DJH000 IN OUT NUMBER, --输出入:收费单据号 P_SFHY00 IN CHAR default 'N' --输入是否换药 Y 换药 N 不换药 )AS CURSOR C_ZYCFMX IS SELECT * FROM YF_ZYCFMX WHERE CFLSH0=P_CFLSH0 AND SFZBY0='N'; V_ZYCFMX C_ZYCFMX%ROWTYPE; VYF_ZYCF00 YF_ZYCF00%ROWTYPE; V_BMXZ00 BM_BMBM00.BMXZ00%TYPE; V_CFZT00 YF_ZYCF00.CFZT00%TYPE; V_SFKSLY YF_ZYCF00.SFKSLY%TYPE; V_CFZTBC YF_ZYCF00.CFZT00%TYPE; --被冲处方单状态 V_CFZJE0 YF_ZYCF00.CFZJE0%TYPE; V_ZYID00 YF_ZYCF00.ZYID00%TYPE; V_BRID00 YF_ZYCF00.BRID00%TYPE; V_ZYH000 YF_ZYCF00.ZYH000%TYPE; V_YFBMBH YF_ZYCF00.YFBMBH%TYPE; V_DQLSDJ YF_ZYCFMX.LSDJ00%TYPE; V_FBBH00 SF_BRXXB0.FBBH00%TYPE; --费别编号 P_CFLSHB YF_ZYCF00.BCCFH0%TYPE; --被冲处方单号 V_SFYXQY XT_XTCS00.VALUE0%TYPE; --是否允许药房抢处方 v_DLSJGL XT_XTCS00.VALUE0%TYPE; V_K2J000 BM_YD0000.K2J000%TYPE; V_DJH000 YF_ZYCF00.djh000%TYPE; V_SFQYDJGLMK xt_xtcs00.value0%type; V_PSZT00 YF_ZYCF00.PSZT00%TYPE; V_DQRQ00 CHAR(8); V_DQSJ00 CHAR(8); V_SFJS00 NUMBER(1); --是否结束,:0:未结束;1:已结束 VERRMSG VARCHAR2(100); V_COUNTE NUMBER; V_COUNT0 NUMBER(3,0); v_SFCFZYJJ CHAR(1); --是否处方转预缴金。 ls_YHMSG0 varchar2(400); ls_SYSMSG varchar2(400); V_DJDH00 number;--返回代煎单号 V_psypsl number(2); ----皮试药品数量 V_params varchar2(255); --参数变量 V_errmsg varchar2(255); --错误提示变量 E_custom exception; --错误变量 E_TriStrop1 EXCEPTION; --触发器停止异常变量 -- MODIFICATION HISTORY -- Person Date Comments -- JETHUA 2004.03.25 CREATE:所有关于住院处方单的操作在此处理 -- JETHUA 2004.06.07 增加是否抢药 -- JETHUA 2004.06.14 更新标志时,增加状态条件,避免错误 -- JETHUA 2004.07.08 规范错误提示 -- JETHUA 2005.01.07 处理前增加状态判断,解决并发问题 -- JETHUA 2005.02.24 完善处理前,处方状态判断。避免并行处理错误 -- JETHUA 2005.05.16 抢药判断是否多价格管理 -- JETHUA 2005.05.20 BUG:抢药功能,可以发其他药房的处方并扣其他药房的库存 -- CSF 2008.11.21 bug: 没有还原原药房的yf_ypkcxx.ykkcsl 没有扣除抢药药房的yf_ypkcxx.ykkcsl.改由触发器处理 -- CSF 2009.07.30 六院处方转预交金,不做预扣也不扣实际库存 ,但不处理退药和科室领药 -- CSF 2009.09.06 六院处方转预交金,发药的时候,选择是否换药 -- CSF 2009.12.25 判断触发器tr_yf_zycf00_bfupddet是否停用,停用不允许操作该过程 -- chenyw 2010.04.14 抢药时修改住院收费表执行科室、执行日期,执行时间 -- CSF 2011.11.18 农本方接口新格式处理。 -- laijg 2012.07.11 住院零散处方参数YF_SFQYDJGLGN启用后写入煎药信息 by YF-20120711-001 -- --------- ---------- ------------------------------------------- BEGIN --正处方结束状态只能:0,1,2 (3:作废,这里久不处理了) --负处方结束状态只能:5,6 --被冲销处方2(已发药):0(正常)--->5(已退药)--->6(已退费) --被冲销处方1(已记帐):0(正常)--->(负正)6(已退费) --正常处方:0(正常)--->1(已记帐)--->2(已发药) --*****************************取基本信息*********************************-- V_errmsg:=''; V_params:='调用过程: SP_YF_ZYCFCL('||P_CFLSH0||','||P_CFJSZT||','||TO_CHAR(P_YFBMBH)|| ','||TO_CHAR(P_CZYBH0)||','||TO_CHAR(P_DJH000)||') ; '; --传参数SPACK_YF_BRXX00 以便触发器 调用 --SPACK_YF_BRXX00.PACK_SFHY00:=P_SFHY00; select count(*) into v_count0 from ALL_TRIGGERS where TRIGGER_NAME='TR_YF_ZYCF00_BFUPDDET' and STATUS='ENABLED'; if v_count0=0 then raise E_TriStrop1; end if; V_SFJS00:=0; SELECT TO_CHAR(SYSDATE,'YYYYMMDD'),TO_CHAR(SYSDATE,'HH24:MI:SS') INTO V_DQRQ00,V_DQSJ00 FROM DUAL; --取部门性质, SELECT BMXZ00 INTO V_BMXZ00 FROM BM_YGBM00 A,BM_BMBM00 B WHERE A.BMBH00=B.BMBH00 AND A.YGBH00=P_CZYBH0; --取参数:是否允许药房抢药 BEGIN SELECT VALUE0 INTO V_SFYXQY FROM XT_XTCS00 WHERE NAME00='YF_SFYXYFQY'; EXCEPTION WHEN OTHERS THEN V_SFYXQY:='N'; END; --取出是否多零售价管理 JETHUA BEGIN SELECT Trim(VALUE0) INTO v_DLSJGL FROM XT_XTCS00 WHERE NAME00='YF_SFDLSJGL'; EXCEPTION WHEN OTHERS THEN v_DLSJGL:='N'; END; --是否启用代煎管理系统 BEGIN SELECT Trim(VALUE0) INTO V_SFQYDJGLMK FROM XT_XTCS00 WHERE NAME00='YF_SFQYDJGLGN'; EXCEPTION WHEN OTHERS THEN V_SFQYDJGLMK:='N'; END; --取处方当前状态以及被冲销单号(冲销或正常) BEGIN SELECT CFZT00,CFZJE0,BCCFH0,ZYID00,ZYH000,PSZT00,YFBMBH,SFKSLY,BRID00, (select count(*) from yf_zycfmx b where a.cflsh0=b.cflsh0 and exists(select 1 from bm_ps0000 c where b.pslbid=c.psid00 and c.psmc00 not like '%免试%') and rownum=1) psypsl INTO V_CFZT00,V_CFZJE0,P_CFLSHB,V_ZYID00,V_ZYH000,V_PSZT00,V_YFBMBH,V_SFKSLY,V_BRID00,V_PSYPSL FROM YF_ZYCF00 a WHERE CFLSH0=P_CFLSH0; EXCEPTION WHEN OTHERS THEN V_errmsg:='处方 ['||P_CFLSH0||'] 不存在'; RAISE E_custom; END; IF V_CFZT00='2' OR V_CFZT00='3' OR V_CFZT00='5' THEN --2已发药 V_errmsg:='处方 ['||P_CFLSH0||'] 不为发药状态,无法处理!'; RAISE E_custom; END IF; --取费别编号 SELECT FBBH00 INTO V_FBBH00 FROM ZY_BRXXB0 WHERE ZYID00=V_ZYID00; --如果抢药的进行预扣库存处理已经改由触发器处理 --病人是否存在自费消费账户 v_SFCFZYJJ:='N'; select count(*) into V_COUNT0 from BM_BRXTB0 where to_char(sysdate,'YYYYMMDD')>=QYRQ00 and to_char(sysdate,'YYYYMMDDHH24:MI:SS')>=QYRQ00||QYSJ00 and TZRQ00>=to_char(sysdate,'YYYYMMDD') and TZRQ00||TZSJ00>=to_char(sysdate,'YYYYMMDDHH24:MI:SS') and BRID00=V_BRID00; IF (V_COUNT0>0) and V_SFKSLY='N' and V_CFZJE0>0 THEN v_SFCFZYJJ:='Y'; END IF; --***************************业务开始********************** IF V_CFZJE0<0 THEN --退药处理 --取被冲处方当前状态 SELECT CFZT00 INTO V_CFZTBC FROM YF_ZYCF00 WHERE CFLSH0=P_CFLSHB; --如果为1(已记帐) IF V_CFZTBC='1' THEN IF V_CFZT00='0' AND V_SFJS00=0 THEN --判断是否传入单据号,无则再取 IF P_DJH000>0 THEN P_DJH000:=P_DJH000; ELSE SELECT SQ_ZY_BRJFB0_DJH000.NEXTVAL INTO P_DJH000 FROM DUAL; END IF; --修改处方状态 UPDATE YF_ZYCF00 SET CFZT00='6',FYR000=P_CZYBH0,DJH000=P_DJH000, FYRQ00=V_DQRQ00,FYSJ00=V_DQSJ00, JZRQ00=V_DQRQ00,JZSJ00=V_DQSJ00 WHERE CFLSH0=P_CFLSH0 AND CFZT00='0'; --记帐 IF SQL%FOUND = TRUE THEN SP_YF_ZYCFJZ(P_CFLSH0,V_DQRQ00,V_DQSJ00,P_CZYBH0,P_DJH000); UPDATE YF_ZYCF00 SET CFZT00='6' WHERE CFLSH0=P_CFLSHB; END IF; V_CFZT00:='6'; V_SFJS00:=1; END IF; ELSIF V_CFZTBC='2' THEN --如果为2(已发药) --退药 IF V_CFZT00='0' AND V_SFJS00=0 THEN --修改处方状态 UPDATE YF_ZYCF00 SET CFZT00='5',FYR000=P_CZYBH0, FYRQ00=V_DQRQ00,FYSJ00=V_DQSJ00 WHERE CFLSH0=P_CFLSH0 AND CFZT00='0'; V_CFZT00:='5'; IF V_CFZT00=P_CFJSZT THEN V_SFJS00:=1; END IF; END IF; --退费 IF V_CFZT00='5' AND V_SFJS00=0 THEN --判断是否传入单据号,无则再取 IF P_DJH000>0 THEN P_DJH000:=P_DJH000; ELSE SELECT SQ_ZY_BRJFB0_DJH000.NEXTVAL INTO P_DJH000 FROM DUAL; END IF; --修改处方状态 UPDATE YF_ZYCF00 SET CFZT00='6',DJH000=P_DJH000, JZRQ00=V_DQRQ00,JZSJ00=V_DQSJ00 WHERE CFLSH0=P_CFLSH0 AND CFZT00='5'; --记帐 IF SQL%FOUND = TRUE THEN SP_YF_ZYCFJZ(P_CFLSH0,V_DQRQ00,V_DQSJ00,P_CZYBH0,P_DJH000); END IF; V_CFZT00:='6'; V_SFJS00:=1; END IF; END IF; ------------------------------------------------------------------------ ELSE--正常处方处理 --记帐 IF V_CFZT00='0' AND V_SFJS00=0 THEN --皮试状态:'0'非皮试,'1'需皮试,'2'皮试未通过不能发药,'3',皮试通过可发药 IF ((V_PSZT00='1' and V_PSYPSL>0) OR (V_PSZT00='2')) THEN V_errmsg:='病人需皮试,或皮试不正常'; RAISE E_custom; END IF; --判断是否传入单据号,无则再取 IF P_DJH000>0 THEN P_DJH000:=P_DJH000; ELSE SELECT SQ_ZY_BRJFB0_DJH000.NEXTVAL INTO P_DJH000 FROM DUAL; END IF; --是否允许抢药 IF V_SFYXQY='Y' THEN UPDATE YF_ZYCF00 SET YFBMBH=P_YFBMBH WHERE CFLSH0=P_CFLSH0; V_YFBMBH:=P_YFBMBH; END IF; if v_SFCFZYJJ='Y' then--如果处方转预交金不做预扣处理所以先将cfzt00改成8 --修改处方状态 UPDATE YF_ZYCF00 SET CFZT00='8',DJH000=P_DJH000, JZRQ00=V_DQRQ00,JZSJ00=V_DQSJ00 WHERE CFLSH0=P_CFLSH0 AND CFZT00='0'; else --修改处方状态 UPDATE YF_ZYCF00 SET CFZT00='1',DJH000=P_DJH000, JZRQ00=V_DQRQ00,JZSJ00=V_DQSJ00 WHERE CFLSH0=P_CFLSH0 AND CFZT00='0'; end if; --记帐 IF SQL%FOUND = TRUE THEN SP_YF_ZYCFJZ(P_CFLSH0,V_DQRQ00,V_DQSJ00,P_CZYBH0,P_DJH000); END IF; if v_SFCFZYJJ='Y' then--如果处方转预交金不做预扣处理所以先将cfzt00改成8 update YF_ZYCF00 set CFZT00='1' where CFLSH0=P_CFLSH0; end if; V_CFZT00:='1'; --判断是否结束 IF V_CFZT00=P_CFJSZT THEN V_SFJS00:=1; END IF; END IF; --发药 IF V_CFZT00='1' AND V_SFJS00=0 THEN --是否允许抢药 IF V_YFBMBH<>P_YFBMBH AND V_SFYXQY='Y' THEN --抢药,先修改药房部门编号 UPDATE YF_ZYCF00 SET YFBMBH=P_YFBMBH WHERE CFLSH0=P_CFLSH0; begin select DJH000 into V_DJH000 from YF_ZYCF00 where CFLSH0=P_CFLSH0; exception when others then V_DJH000:=0; end; if v_djh000>0 then/*修改住院收费表执行科室、执行日期,执行时间*/ update zy_fymx00 set zxks00=P_YFBMBH,ZXRQ00=V_DQRQ00,ZXSJ00=V_DQSJ00 where djh000=V_DJH000; end if; END IF; --如为多价格管理,则重新计算批次预扣 /* IF v_DLSJGL='Y' THEN OPEN C_ZYCFMX; FETCH C_ZYCFMX INTO V_ZYCFMX; WHILE C_ZYCFMX%FOUND LOOP --取K2J000 SELECT K2J000 INTO V_K2J000 FROM BM_YD0000 WHERE YPNM00=v_ZYCFMX.YPNM00; --原来药房退预扣 SP_YF_PCKCCK(V_YFBMBH,V_ZYCFMX.YPNM00,-ROUND(V_ZYCFMX.YPZSL0*V_ZYCFMX.ZHL000,3),ROUND(V_ZYCFMX.LSDJ00/V_ZYCFMX.ZHL000*V_K2J000,4),P_CFLSH0,V_DQRQ00,V_DQSJ00,0); --现在药房再新扣 SP_YF_PCKCYK(P_YFBMBH,V_ZYCFMX.YPNM00,V_ZYCFMX.YPZSL0*V_ZYCFMX.ZHL000,1,V_DQLSDJ); --如果预扣零售价不等处方零售价,因为此时病人已记账,不可以再改处方零售价,所以再退预扣 IF ROUND(V_DQLSDJ,2)<>ROUND(V_ZYCFMX.LSDJ00/V_ZYCFMX.ZHL000*V_K2J000,2) THEN SP_YF_PCKCCK(P_YFBMBH,V_ZYCFMX.YPNM00,-ROUND(V_ZYCFMX.YPZSL0*V_ZYCFMX.ZHL000,3),V_DQLSDJ,P_CFLSH0,V_DQRQ00,V_DQSJ00,0); END IF; FETCH C_ZYCFMX INTO V_ZYCFMX; END LOOP; CLOSE C_ZYCFMX; END IF; */ --修改处方状态 UPDATE YF_ZYCF00 SET CFZT00='2',FYR000=P_CZYBH0, FYRQ00=V_DQRQ00,FYSJ00=V_DQSJ00, SFHY00=P_SFHY00 WHERE CFLSH0=P_CFLSH0 AND CFZT00='1'; V_CFZT00:='2'; V_SFJS00:=1; END IF; END IF; --处理农本方接口 select count(*) into V_COUNT0 from XT_XTCS00 where NAME00='YF_NBFJKXGS' and VALUE0='Y'; if V_COUNT0>0 then execute immediate 'begin SP_YF_GETNBFJKXX(''1'','''||P_CFLSH0||'''); end;'; end if; --写入煎药信息 select a.* into VYF_ZYCF00 from yf_zycf00 a where a.cflsh0=P_CFLSH0; IF ((V_SFQYDJGLMK='Y') and (VYF_ZYCF00.YPDLBH='2') AND (VYF_ZYCF00.ZYDJS0>0) ) THEN --by YF-20120711-001 SP_PY_INSERTZYJYXX(P_CFLSH0,0,0,'0',ls_YHMSG0,ls_SYSMSG,V_DJDH00); END if; COMMIT; EXCEPTION WHEN no_data_found THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20001,substrb('数据没有找到!*'||SQLERRM||','||V_params,1,120)); WHEN E_custom THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20010,substrb(V_errmsg||'!*'||V_params,1,120)); WHEN E_TriStrop1 THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20010,substrb('触发器TR_YF_ZYCF00_BFUPDDET被停止,不能继续本发药过程,请找管理员处理!'||V_params,1,120)); WHEN OTHERS THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20266,substrb(nvl(SQLERRM, '原因不明出错')||'!*'||V_params,1,120)); END; / -- End of DDL Script for Procedure SD_HOSPITAL.SP_YF_ZYCFCL