create or replace procedure SP_SF_PAY_YNYXTK( PDDLSH0 in varchar2 ,--输入:订单流水号 PBRID00 in number ,--输入:BRID00 PCZY000 in number ,--输入:操作员编码 PCZYXM0 in varchar2 ,--输入:操作员姓名 PZFFS00 in number ,--输入:支付编码 PZFFSMC in varchar2 ,--输入:支付名称 PJFJE00 in number ,--输入:缴费金额 PCOMMIT in varchar2 default 'N' ,--输入:是否提交事务 Y:提交 N:不提交 PZXZT00 out number ,--输出:执行状态 0:失败 1:成功 PERRMSG out varchar2 --输出:错误信息 ) as -- MODIFICATION HISTORY -- Person Date Comments -- qiulf 2021.12.15 creteed 院内微信支付宝院内优先退款 by MZSF9EX-20211215-003 -- qks 2022.03.31 修正"获取收费员的票据序号"不对问题,改为通过SF_SF_GETYJJPJXH获取; by MZSF9EX-20220321-011 -- chenrenhai 2023.03.20 增加退款金额大于账户余额,不允许退款的限制 by MZSF13X-20230320-002 -- --------- ---------- ------- LS_COUNT0 number(10); LS_ZHYE00 number(12,2);--账户余额 LS_JYJE00 number(12,2);--交易金额 LS_CZRQ00 varchar2(8); LS_CZSJ00 varchar2(8); LS_ZFQDBM BM_ZFRZ00.JGBM00%type;--支付渠道编码 LS_YJJXH0 BM_ZFRZ00.PJXH00%type; LS_DJH000 SF_BRJFB0.DJH000%type; LS_ZFFSBH SF_BRJFB0.ZFFS00%type; LS_ZFFSMC BM_BRZFFS.ZFFSMC%type; LS_ZPH000 SF_BRJFB0.ZPH000%type; LS_ZPZH00 SF_BRJFB0.ZPZH00%type; LS_ZPKHYH SF_BRJFB0.ZPKHYH%type; LS_ZPDWMC SF_BRJFB0.ZPDWMC%type; LS_JYLSH0 SF_BRJFB0.JYLSH0%type;--交易流水号 LS_YKTSH0 SF_BRJFB0.YKTSH0%type;--健康通流水号 LS_JYLXMC SF_BRJFB0.JYLXMC%type;--交易类型名称 LS_JGBM00 SF_BRJFB0.JGBM00%type;--机构编码 LS_JGMC00 SF_BRJFB0.JGMC00%type;--机构名称 LS_DDLSH0 SF_BRJFB0.DDLSH0%type;--订单流水号 LS_SHH000 SF_BRJFB0.SHH000%type; LS_YGBH00 BM_YGBM00.YGBH00%type; --操作员编号 LS_YGXM00 BM_YGBM00.ZWXM00%type; --操作员姓名 LS_CZYKS0 BM_YGBM00.BMBH00%type; LS_PJXH00 SF_PJSYQK.PJXH00%type; LS_PLBH00 BM_PJLYQK.PJLXBM%type; LS_TKDDH0 varchar2(50); --原退款订单流水号 LS_BRID00 BM_BRXXB0.BRID00%type; LS_BRXM00 BM_BRXXB0.BRXM00%type; LS_BRXB00 BM_BRXXB0.BRXB00%type; LS_YBKH00 BM_BRXXB0.YBKH00%type; LS_YBID00 BM_BRXXB0.YBID00%type; LS_BRZJBH BM_BRXXB0.BRZJBH%type; LS_BRDH00 BM_BRXXB0.BRDH00%type; --LS_TTBRID BM_BRXXB0.TTBRID%type; RZFRZ BM_ZFRZ00%rowtype; LS_JYMC00 varchar2(20); LS_ZFMXBH BM_ZFRZ00.ZFMXBH%type; ls_JFLBMC BM_BRJFLB.JFLBMC%type; ls_SYSMSG varchar2(200); begin PZXZT00:=0; --执行状态 0:失败 1:成功 LS_CZRQ00:=to_char(sysdate,'YYYYMMDD'); LS_CZSJ00:=to_char(sysdate,'HH24:MI:ss'); LS_YGBH00:=PCZY000; LS_YGXM00:=PCZYXM0; LS_DDLSH0:=PDDLSH0; LS_JYJE00:=PJFJE00; LS_ZFFSBH:=PZFFS00; LS_ZFFSMC:=PZFFSMC; select count(1) into LS_COUNT0 from BM_ZFRZ00 where DDLSH0=LS_DDLSH0; if LS_COUNT0<=0 then PERRMSG:='未找到有效的记录!'; return; end if; --获取病人基本信息 begin select BRID00,BRXM00,BRXB00,YBKH00,YBID00,BRZJBH,BRDH00--,TTBRID into LS_BRID00,LS_BRXM00,LS_BRXB00,LS_YBKH00,LS_YBID00,LS_BRZJBH,LS_BRDH00--,LS_TTBRID from BM_BRXXB0 where BRID00=PBRID00; exception when others then PERRMSG:='未找到有效的基本信息(BM_BRXXB0)'; return; end; -- PZFQDBM 渠道编码 YHZF/YHPAY:易惠支付 YLZF/YXPAY:医信支付 LKWL/LKWLPAY:联空网络 QYYJJ:区域预交金 ZHLDZF:中行联迪支付(泉州) JHJHZF:建行聚合支付 JKZLPAY:健康之路当面付 select * into RZFRZ from BM_ZFRZ00 where DDLSH0=LS_DDLSH0 and BRID00=PBRID00; LS_ZFQDBM:=trim(nvl(RZFRZ.ZFQDBM,'YLZF')) ;--支付渠道编码 LS_ZPH000:=substrb(trim(RZFRZ.ZPH000),1,30); LS_ZPDWMC:=substrb(trim(RZFRZ.ZPDWMC),1,50); LS_ZPKHYH:=substrb(trim(RZFRZ.ZPKHYH),1,30); LS_YJJXH0:=substrb(trim(RZFRZ.PJXH00),1,30); LS_SHH000:=substrb(LS_ZFQDBM,1,30); LS_ZFMXBH:=RZFRZ.ZFMXBH; LS_JYLSH0 := '优先退款'; if LS_ZFMXBH is null then --支付明细编码H:现金I:转账J:POS离线K:POS刷卡L:龙支付M:银联二维码D:微信离线E:微信扫码F:支付宝离线G:支付宝扫码A:榕医通B:聚合支付C:健康通N:银医通P:一卡通 begin select substrb(SF_SF_ZFMXBH(LS_ZFFSBH,LS_ZFQDBM,''),1,2) into LS_ZFMXBH from dual; exception when others then LS_ZFMXBH:=null; end; end if; LS_JYLXMC:=substrb(trim(LS_ZFQDBM)||'|'||trim(LS_JYMC00)||'|'||trim(LS_ZFFSMC),1,50);--交易类型名称 --获取收费员的票据序号-- --改为通过SF_SF_GETYJJPJXH获取 -- begin -- select PJDQH0 into LS_PJXH00 from BM_PJLYQK -- where PJLXBM =LS_PLBH00 and SYBZ00='Y' and PJSYR0=LS_YGBH00; -- exception -- when others then -- LS_PJXH00:='0'; -- end; select BMBH00 into LS_CZYKS0 from BM_YGBM00 where YGBH00 = LS_YGBH00; if LS_YJJXH0 is not null then LS_PJXH00:=LS_YJJXH0; else --改为通过SF_SF_GETYJJPJXH获取 LS_PJXH00:=SF_SF_GETYJJPJXH('1',LS_YGBH00,LS_CZYKS0); end if; --执行余额 --0 门诊 1住院 /BRID00 /交费类型 1:门诊 2:住院/返回类型 0:可用余额 1:总余额 2:现金余额 3:停用金额 begin select SF_SF_GETBRZHYE(0,LS_BRID00,1,0) into LS_ZHYE00 from dual; exception when others then LS_ZHYE00:=0; end; if abs(LS_JYJE00)>LS_ZHYE00 then PERRMSG:='退款金额大于账户余额!'; return; end if; select nvl(max(JFLBMC),'门诊预交金') into LS_JFLBMC from BM_BRJFLB where JFLBID=1; SP_SF_BRZHXX(ls_BRID00, --病人ID LS_YGBH00, --操作员ID LS_YGXM00, --操作员姓名 LS_JFLBMC, --账户类别、或称为交费类别 LS_JYJE00, --病人现金余额 0 , --病人转账余额 0 , --报警金额 0 , --停用金额 0 , --允许病人的欠费的最大金额 LS_ZFFSMC, --支付方式 LS_ZPH000, --支票号 LS_ZPKHYH, --出票的开户银行 LS_ZPDWMC, --出票单位/出票人 LS_PJXH00, --预交金票据号 '1', --'0'或'1','0':交款,'1':退款 '0', --'0':可以退转账款,'1':不可以退转账款,'2':可以退转账款(不受医院参数控制) LS_DJH000, --内部票据号 PERRMSG, --存储过程提示的错误信息 ls_SYSMSG, --系统提示的错误信息 'N', --是否提交 默认提交 LS_ZPZH00, --出票单位帐号或医保中心帐号 LS_CZYKS0, --操作员科室 null, --转账单位ID LS_JYLSH0, --交易流水号 LS_YKTSH0, --健康通流水号 LS_JYLXMC, --交易类型名称 LS_JGBM00, --机构编码 LS_JGMC00, --机构名称 LS_DDLSH0 --订单流水号 ); if PERRMSG is not null then PERRMSG:=substrb('充值错误(SP_SF_PAY_YNZFQR)!'||PERRMSG||ls_SYSMSG||sqlerrm,1,250); rollback; return; end if; --成功要写ZFMXBH update SF_BRJFB0 set ZFMXBH = LS_ZFMXBH, SHH000=LS_SHH000 where DJH000 = LS_DJH000; --0 门诊 1住院 /BRID00 /交费类型 1:门诊 2:住院/返回类型 0:可用余额 1:总余额 2:现金余额 3:停用金额 begin select SF_SF_GETBRZHYE(0,LS_BRID00,1,0) into LS_ZHYE00 from dual; exception when others then LS_ZHYE00:=0; end; update BM_ZFRZ00 set DJH000=LS_DJH000, JFJE00=LS_JYJE00, JFRQ00=LS_CZRQ00, JFSJ00=LS_CZSJ00, ZXZTBZ='1',--状态标志 0:失败 1:成功 BRYE00=LS_ZHYE00, PTDDH0=LS_YKTSH0,--支付渠道流水号 支付宝、微信等平台流水号 --ZFQD00=IN_CHANNELTYPE,--支付渠道=tradeMode JYCGSJ=to_char(sysdate,'YYYYMMDD')||to_char(sysdate,'HH24MIss'), PTGZH0=LS_JYLSH0,--支付平台跟踪号=traceNo JYLSH0=LS_JYLSH0,--交易流水号 YKTSH0=LS_YKTSH0,--健康通流水号 JYLXMC=LS_JYLXMC,--交易类型名称 JGBM00=LS_JGBM00 where DDLSH0=LS_DDLSH0 and BRID00=PBRID00; select TKDDH0 into LS_TKDDH0 from BM_ZFRZ00 where DDLSH0=LS_DDLSH0 and BRID00=PBRID00; if LS_TKDDH0 is not null then update BM_ZFRZ00 set TKJE00=nvl(TKJE00,0)+LS_JYJE00 where DDLSH0=LS_TKDDH0 and BRID00=PBRID00; end if; PZXZT00:=1;--输出:执行状态 0:失败 1:成功 if PCOMMIT='Y' then commit; end if; exception when no_data_found then PZXZT00:=0; PERRMSG:=substrb('执行过程SP_SF_PAY_YNYXTK错误!'||sqlerrm,1,200); when others then PZXZT00:=0; PERRMSG:=substrb('执行过程SP_SF_PAY_YNYXTK错误!'||sqlerrm,1,200); end;