CREATE OR REPLACE FUNCTION SF_BQ_KYJE00 ( PZYID00 IN NUMBER, --住院流水号 PBRID00 IN NUMBER, --病人ID PKYESF0 in number default '-1' ) RETURN NUMBER IS COUNTER NUMBER(3); VBRID00 BM_BRXXB0.BRID00%TYPE; VJFLBID BM_BRJFLB.JFLBID%TYPE; VYBYXQF ZY_BRZHXX.WJSJE0%TYPE; --医保可支付的最高金额 VWJSJE0 ZY_BRZHXX.WJSJE0%TYPE; --未结算金额 VYJSJE0 ZY_BRZHXX.WJSJE0%TYPE; --已结算金额 VSYWJS0 ZY_BRZHXX.WJSJE0%TYPE; --所有未结算金额 VZYE000 ZY_BRZHXX.ZYE000%TYPE; --总余额 VKYJE00 ZY_BRZHXX.ZYE000%TYPE; --可用金额 VYBZFJE ZY_BRZHXX.ZYE000%TYPE; --可用金额 VBRXJYE ZY_BRZHXX.ZYE000%TYPE; --病人现金余额(现金,转账,担保都视为现金) VYKZYE0 ZY_BRZHXX.YKZYE0%TYPE; --预扣后总余额 VTYJE00 ZY_BRZHXX.TYJE00%TYPE; --停用金额 VYXQFJE ZY_BRZHXX.YXQFJE%TYPE; --允许欠费金额 VYBZHYE ZY_BRZHXX.YBZHYE%TYPE; --医保账户余额 VYBYJS0 ZY_BRZHXX.YBYJS0%TYPE; --医保预结算金额 VYBYZF0 ZY_BRZHXX.YBYZF0%TYPE; --医保预支付金额 VZYZFSX VW_BQ_YBZFBL.ZYZFSX%TYPE;--医保支付上限 VYBQFBZ VW_BQ_YBZFBL.ZYZFSX%TYPE;--医保起付标准 VYBZFBL VW_BQ_YBZFBL.ZYZFSX%TYPE;--医保支付比例 VZYYJXX bm_ybbrlb.ZYYJXX%type; --住院预交金下限 VJFJE00 ZY_BRJFB0.JFJE00%type; --预交金总额 VKYJESF char(1); VZFY000 ZY_BRFY00.HJJE00%type; VZYID00 ZY_BRXXB0.ZYID00%type; VFBBH00 ZY_BRXXB0.FBBH00%type; VDBZDE0 ZY_BRZHXX.ZYE000%type; VDBZNFY ZY_BRZHXX.ZYE000%type; VDBZWFY ZY_BRZHXX.ZYE000%type; LS_BZYBZX varchar2(10); VYZFJE0 ZY_BRZHXX.ZYE000%type; VDBZCWF ZY_BRZHXX.DBZCWF%type; VDBZHCF ZY_BRZHXX.DBZHCF%type; VDBZBM0 ZY_BRXXB0.DBZBM0%type; VKYJESF_DBZ varchar2(10); -- MODIFICATION HISTORY -- Person Date Comments -- qks 2009.11.24 当BM_YBBRLB.ZYYJXX>0时:如果住院预交金总额=0 then VKYJESF:=PKYESF0; end if; IF PBRID00>0 THEN VBRID00:=PBRID00; ELSE SELECT BRID00 INTO VBRID00 FROM ZY_BRXXB0 WHERE ZYID00=PZYID00; END IF; BEGIN SELECT JFLBID INTO VJFLBID FROM BM_BRJFLB WHERE SYBZ00='1' AND SFYX00='Y'; EXCEPTION WHEN OTHERS THEN RETURN 0; END; BEGIN --SELECT WJSJE0,ZYE000,YKZYE0,decode(sign(TYJE00),-1,0,TYJE00),YBYJS0,YBYZF0,YXQFJE,YJSJE0,WJSJE0+ZYE000-YKZYE0,YBZHYE 要求停用金额设置负数时也能体现 SELECT WJSJE0,ZYE000,YKZYE0,TYJE00,YBYJS0,YBYZF0,YXQFJE,YJSJE0,WJSJE0+ZYE000-YKZYE0,YBZHYE INTO VWJSJE0,VZYE000,VYKZYE0,VTYJE00,VYBYJS0,VYBYZF0,VYXQFJE,VYJSJE0,VSYWJS0,VYBZHYE FROM ZY_BRZHXX WHERE BRID00=VBRID00 AND JFLBID=VJFLBID AND SFDJ00='0'; EXCEPTION WHEN OTHERS THEN RETURN 0; END; --重新计算担保金额,担保可能过期,反映到YXQFJE字段 BEGIN SELECT NVL(SUM(DBJE00),0) INTO VYXQFJE FROM ZY_BRDB00 WHERE BRID00=VBRID00 AND JFLBID=VJFLBID AND SFYX00='Y' AND NVL(DBJSRQ,TO_CHAR(SYSDATE,'YYYYMMDD'))||NVL(DBJSSJ,TO_CHAR(SYSDATE,'HH24:MI:SS'))>=TO_CHAR(SYSDATE,'YYYYMMDD')||TO_CHAR(SYSDATE,'HH24:MI:SS'); EXCEPTION WHEN OTHERS THEN VYXQFJE:=0; END; select ZYID00,FBBH00,nvl(DBZBM0,' ') into VZYID00,VFBBH00,VDBZBM0 from ( select ZYID00,FBBH00,DBZBM0 from ZY_BRXXB0 where BRID00=VBRID00 order by ZYID00 desc) where rownum=1; begin select SF_ZY_SFQYDBZJK(VZYID00) into LS_BZYBZX from dual; exception when others then LS_BZYBZX:='-1'; end; if LS_BZYBZX<>'-1' and VFBBH00=3 and VDBZBM0<>' ' then begin select substrb(value0,1,1) into VKYJESF_DBZ from xt_xtcs00 where name00='ZY_DBZKYESF'; exception when others then VKYJESF_DBZ:='0';--'0'有计算医保预结算返回参与计算可用额,'1'按医保预结算+院内支付比例计算+许可欠费 end; VKYJESF:='7'; end if; if VKYJESF='0' then--按医保支付比例计算允许欠费 BEGIN --取住院支付上限,医保起伏线,医保自付比例 SELECT ZYZFSX,YBQFBZ,YBZFBL,ZYYJXX INTO VZYZFSX,VYBQFBZ,VYBZFBL,VZYYJXX FROM VW_BQ_YBZFBL Y WHERE --EXISTS (SELECT 1 FROM BM_BRXXB0 B -- WHERE B.YBLB00=Y.YBLB00 AND B.YBBRLB=Y.YBBRLB AND -- B.FBBH00=Y.FBBH00 AND BRID00=VBRID00); (Y.YBLB00,Y.YBBRLB,Y.FBBH00) in (SELECT B.YBLB00,B.YBBRLB,B.FBBH00 from BM_BRXXB0 B where B.BRID00=VBRID00); if VZYYJXX>0 then select NVL(sum(JFJE00),0) into VJFJE00 from zy_brjfb0 where brid00 =VBRID00 and JFLBID = 2 and jzdh00 = 0; if VJFJE00=VZYZFSX THEN--预结>上限 IF VYBYJS0>VSYWJS0 THEN--预结>未结,病人有退费 VYBYXQF:=VYBYZF0; ELSE--预结<=未结 VYBYXQF:=VYBYZF0; END IF; ELSE--VYBYJS0VYBQFBZ THEN --预结>起付 VYBYXQF:=VYBYZF0+(VZYZFSX-VYBYJS0)*VYBZFBL;--(上限-预结)*比率 ELSE--VYBYJS0<=VYBQFBZ 预结<起付 IF VSYWJS0>=VYBQFBZ THEN VYBYXQF:=VYBYZF0+(VZYZFSX-VYBQFBZ)*VYBZFBL; ELSE--VSYWJS0VSYWJS0 THEN --VKYJE00:=VBRXJYE+VYBYXQF; VKYJE00:=VYKZYE0-VTYJE00+VYXQFJE+VYBYXQF; ELSE VKYJE00:=VBRXJYE; END IF; ELSE -- VKYJE00:=VBRXJYE+LEAST(GREATEST(VBRXJYE,0)/(1-VYBZFBL)*VYBZFBL,VYBYXQF); VKYJE00:=VYKZYE0-VTYJE00+VYXQFJE+LEAST(GREATEST(VBRXJYE,0)/(1-VYBZFBL)*VYBZFBL+VYBZFJE,VYBYXQF); END IF; elsif VKYJESF='1' then --直接返回帐户的预扣总余额 VKYJE00:=VYKZYE0;--+VYXQFJE+VYBYZF0-VTYJE00; elsif VKYJESF='2' then --按医保预结算的计算+许可欠费计算 VKYJE00:=VYKZYE0+VYXQFJE+VYBYZF0+VYBZHYE-VTYJE00; elsif VKYJESF='3' then --只按医保预结算的计算 VKYJE00:=VYKZYE0+VYBYZF0+VYBZHYE-VTYJE00; elsif VKYJESF='4' then --按医保预结算且不将医保个人账户余额计算在内 VKYJE00:=VYKZYE0+VYBYZF0-VTYJE00; elsif VKYJESF='5' then --按医保预结算+按自费比例允许欠费,且不将医保个人账户余额计算在内 select nvl(max(ZYID00),0) into VZYID00 from ZY_BRXXB0 where BRID00=VBRID00; SELECT YBZFBL INTO VYBZFBL FROM VW_BQ_YBZFBL Y WHERE EXISTS (SELECT 1 FROM BM_BRXXB0 B WHERE B.YBLB00=Y.YBLB00 AND B.YBBRLB=Y.YBBRLB AND B.FBBH00=Y.FBBH00 AND BRID00=VBRID00); select NVL(sum(JFJE00),0) into VJFJE00 from zy_brjfb0 where brid00 =VBRID00 and JFLBID = 2 and jzdh00 = 0; select nvl(sum(HJJE00),0) into VZFY000 from ZY_BRFY00 where ZYID00=VZYID00 and nvl(JZDH00,0)=0; VKYJE00:=VJFJE00-VZFY000*(1-VYBZFBL); elsif VKYJESF='6' then --按医保自费比例(莆田秀屿) select nvl(max(ZYID00),0) into VZYID00 from ZY_BRXXB0 where BRID00=VBRID00; SELECT YBZFBL,YBQFBZ INTO VYBZFBL,VYBQFBZ FROM VW_BQ_YBZFBL Y WHERE EXISTS (SELECT 1 FROM BM_BRXXB0 B WHERE B.YBLB00=Y.YBLB00 AND B.YBBRLB=Y.YBBRLB AND B.FBBH00=Y.FBBH00 AND BRID00=VBRID00); select NVL(sum(JFJE00),0) into VJFJE00 from zy_brjfb0 where brid00 =VBRID00 and JFLBID = 2 and jzdh00 = 0; select nvl(sum(WJSJE0),0) into VZFY000 from ZY_BRZHXX where BRID00=VBRID00 ; IF VYBZHYE<=1000 THEN VYBZHYE:=0; ELSE VYBZHYE:=VYBZHYE-1000; END IF; VKYJE00:=VJFJE00+VYXQFJE+VYBZHYE-(VZFY000-(VZFY000-VYBQFBZ)*VYBZFBL); if VKYJE00