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;
