create or replace function SF_ZY_BSDJPJ_JSON
( 
  PZYID00 number,    --住院ID
  PJZDH00 number,    --结账单号
  PHJJE00 number,    --合计金额
  PFHLXBH number     --返回类型编码 1：chargeDetail 收费项目明细列表 2:listDetail   清单项目明细列表 3：otherInfo   其它扩展信息列表  4：otherMedicalList   其它医保信息列表 5:payChannelDetail 交费渠道列表    
)
-- modification history
-- Person     Date        Comments
-- zhangyc    2020.12.07  create by     [住院][易惠博思电子发票]报文组成 by     ZYSF9-20201207-003
-- zhangyc    2020.12.09  增加to_char(xxx,'999999990.99')否报文会显示为.xxx by ZYSF9-20201210-001
-- zhangyc    2021.02.05  chargeCode:收费项目代码增加前缀 by    ZYSF9-20210204-001
-- zhangyc    2021.04.12  根据参数控制number_std_amt 数量、单价、金额保留位数 by ZYSF9-20210412-001
-- jlg        2021.08.31  重新缩进排版下函数 ZYSF9-20210827-002  
-- chenHeyi   2022.01.10  交费渠道列表，如果是CDRG病人，合计金额重取ZY_JZB000表nvl(a.YBYL39,0)+nvl(a.YBYL43,0)+nvl(a.YBYL44,0)+nvl(a.YBYL45,0)+nvl(a.CBYPF0,0)之和  ZYSF9-20220104-002
-- jlg        2022.04.06  将'LS_number_std_amt'改回为'number_std_amt'   ZYSF9-20220330-002
-- chenHeyi   2022.04.13  调整CUR_otherInfo   ZYSF9-20220408-003
-- linzetao   2022.11.16  增加精神病例发票格式       ZYSF9-20221115-001
-- linzetao   2022.11.29  增加单病种床日发票格式   ZYSF9-20221121-003
return varchar2  is
  LS_FHXX00          varchar2(4000);  --
  LS_JSONSTR         varchar2(1000);  --
  LS_JFQDLBHJ        number(12,2);    --交费渠道列表    合计
  LS_TEPNUM          number(12,2);    --临时变量
  LS_TEPSTR          varchar2(400);   --
  LS_infoNo          number(5);       --序列号
  LS_DJ_format       varchar2(20);    --单价格式化
  LS_SL_format       varchar2(20);    --数量格式化
  LS_JE_format       varchar2(20);    --金额格式化
  LS_SFDMQZ          varchar2(10);    --chargeCodeQzdm:收费项目代码增加前缀
  LS_number_std_amt  varchar2(100);   --博思电子发票清单明细数量、单价、金额小数点保留位数格式化参数设置,用|隔开,(.9999标识保留4位)
  LS_HJJE00          ZY_JZB000.HJJE00%type;
  V_ZY_JZB000_ROW    ZY_JZB000%rowtype;
  ls_YBDBZJSFSPTBCTS XT_XTCS00.VALUE0%type;  --住院医保特殊病种病人结算是否发送普通病床天数(ptbcts)值给医保, 0否1单病种2按科室(通用字典[发送普通病床天数科室编号])3按病情编码(通用字典[发送普通病床天数病情编码])4按科室及病情编码, 默认0
    

  --1：chargeDetail 收费项目明细列表 
  cursor CUR_chargeDetail is
    select aa.*,rownum as sortNo from VW_ZY_chargeDetail aa where aa.JZDH00=PJZDH00;
    
  --2:listDetail    清单项目明细列表
  cursor CUR_listDetail is
    select aa.*,rownum as sortNo from VW_ZY_listDetail aa where aa.JZDH00=PJZDH00; 
    --and rownum<=5;

  --3：otherInfo    其它扩展信息列表
  cursor CUR_otherInfo is
    select aa.* from VW_ZY_otherInfo aa where aa.JZDH00=PJZDH00;

  --4：otherMedicalList 其它医保信息列表
  cursor CUR_otherMedicalList is
    select aa.*,rownum as infoNo from VW_ZY_otherMedicalList aa where aa.JZDH00=PJZDH00;

  --5:payChannelDetail  交费渠道列表    
  cursor CUR_payChannelDetail is
  select aa.*,rownum as infoNo from VW_ZY_payChannelDetail aa
    where aa.JZDH00=PJZDH00
      and aa.ZFFS00 not  in (1,2,8,18,20,24,25,28)--扣除掉非医保补偿
    ;
            
begin
    LS_FHXX00:='';
    LS_JFQDLBHJ:=0;--交费渠道列表   合计
    LS_TEPNUM:=0;
    --chargeCodeQzdm:收费项目代码增加前缀
  LS_SFDMQZ:=trim(substrb(SF_SF_RETURNINDEXEH(substrb(trim(SF_SF_TYZD00('第三方电子发票平台接口','chargeCodeQzdm')),1,100),'|', 2),1,10));--chargeCodeQzdm:收费项目代码增加前缀
  --博思电子发票清单明细数量、单价、金额小数点保留位数格式化参数设置,用|隔开,(.9999标识保留4位)
    LS_number_std_amt:=substrb(trim(SF_SF_TYZD00('第三方电子发票平台接口','number_std_amt')),1,100);
  if LS_number_std_amt is not null then
    LS_SL_format:=substrb(SF_SF_RETURNINDEXEH(trim(LS_number_std_amt),'|', 1),1,20);--数量格式化(保留4位) 
    LS_DJ_format:=substrb(SF_SF_RETURNINDEXEH(trim(LS_number_std_amt),'|', 2),1,20);--单价格式化(保留4位)
    LS_JE_format:=substrb(SF_SF_RETURNINDEXEH(trim(LS_number_std_amt),'|', 3),1,20);--金额格式化(保留2位)
  else
    LS_SL_format:='999999990.9999';--数量格式化(保留4位)
    LS_DJ_format:='999999990.9999';--单价格式化(保留4位)
    LS_JE_format:='999999990.99';  --金额格式化(保留2位)
  end if;
  select trim(nvl(max(VALUE0),'0')) into ls_YBDBZJSFSPTBCTS  from  XT_XTCS00 where NAME00='ZY_YBDBZJSFSPTBCTS'; --住院医保特殊病种病人结算是否发送普通病床天数(ptbcts)值给医保, 0否1单病种2按科室(通用字典[发送普通病床天数科室编号])3按病情编码(通用字典[发送普通病床天数病情编码])4按科室及病情编码, 默认0
  
    
    --1：chargeDetail   收费项目明细列表--begin--
    if PFHLXBH=1 then 
        for REC in CUR_chargeDetail loop
      LS_JSONSTR:='';
      LS_JSONSTR:=substrb('{'
      ||'"sortNo":'||'"'||REC.sortNo||'",'                               --sortNo        序号   Integer 不限    是  默认从1开始，每个收费项目序号值递增1，本次不允许重复
      ||'"chargeCode":'||'"'||LS_SFDMQZ||REC.chargeCode||'",'            --chargeCode    收费项目代码   String  50  是  填写业务系统内部编码值，由医疗平台配置对照
      ||'"chargeName":'||'"'||REC.chargeName||'",'                       --chargeName    收费项目名称   String  100 是  填写业务系统内部项目名称
      ||'"std":'||'"'||trim(to_char(REC.std,LS_JE_format))||'",'         --std         收费标准 Number  14,2    是  
      ||'"number":'||'"'||trim(to_char(REC.num,LS_JE_format))||'",'      --number        数量   Number  14,2    是  
      ||'"amt":'||'"'||trim(to_char(REC.amt,LS_JE_format))||'",'         --amt         金额 Number  14,2    是  
      ||'"selfAmt":'||'"'||trim(to_char(REC.selfAmt,LS_JE_format))||'",' --selfAmt     自费金额 Number  14,2    是  如无金额，填写0
      ||'"remark":'||'"'||REC.remark||'",'                               --remark        备注   String  200 否  
      ||'"unit":'||'"'||REC.unit||'"'                                    --unit        计量单位 String  20  否
            ||'}',1,1000);
            
          if    LS_FHXX00 is not null then 
            LS_FHXX00:=substrb(LS_FHXX00||','||LS_JSONSTR,1,4000);
          else
            LS_FHXX00:=substrb(LS_JSONSTR,1,4000);
          end if;   
        end loop;
    end if;
    --1：chargeDetail   收费项目明细列表--end--
    
    --2:listDetail  清单项目明细列表--begin--
    if PFHLXBH=2 then 
        for REC in CUR_listDetail loop
      LS_JSONSTR:='';
      LS_JSONSTR:=substrb('{'
      ||'"name":'||'"'||REC.name||'",'                                   --name             药品名称    String  50  是  如药品名称，器材名称等
      ||'"std":'||'"'||REC.std||'",'                                     --std              单价    Number  14,6    是  
      ||'"number":'||'"'||REC.num||'",'                                  --number             数量  Number  14,6    是  
      ||'"amt":'||'"'||REC.amt||'",'                                     --amt              金额    Number  14,6    是  
      ||'"selfAmt":'||'"'||REC.selfAmt||'",'                             --selfAmt          自费金额    Number  14,6    是  如无金额，填写0
      ||'"listDetailNo":'||'"'||REC.listDetailNo||'",'                   --listDetailNo     明细流水号  String  60  否  明细流水号
      ||'"chargeCode":'||'"'||LS_SFDMQZ||REC.chargeCode||'",'            --chargeCode         收费项目代码  String  50  否  填写业务系统内部编码值，由医疗平台配置对照,如：床位费、检查费
      ||'"chargeName":'||'"'||REC.chargeName||'",'                       --chargeName         收费项目名称  String  100 否  
      ||'"prescribeCode":'||'"'||REC.prescribeCode||'",'                 --prescribeCode      处方编码  String  60  否  
      ||'"listTypeCode":'||'"'||REC.listTypeCode||'",'                   --listTypeCode     药品类别编码    String  50  否  如药品分类编码01，有则填写
      ||'"listTypeName":'||'"'||REC.listTypeName||'",'                   --listTypeName     药品类别名称    String  50  否  如药品分类名称，抗生素类抗感染药物
      ||'"code":'||'"'||REC.code||'",'                                   --code             编码    String  50  否  如药品编码，有则填写
      ||'"form":'||'"'||REC.form||'",'                                   --form             剂型    String  50  否  
      ||'"specification":'||'"'||REC.specification||'",'                 --specification      规格  String  50  否  
      ||'"unit":'||'"'||REC.unit||'",'                                   --unit             计量单位    String  20  否  
      ||'"receivableAmt":'||'"'||REC.receivableAmt||'",'                 --receivableAmt      应收费用  Number  14,6    否  
      ||'"medicalCareType":'||'"'||REC.medicalCareType||'",'             --medicalCareType  医保药品分类    String  1   否 1：无自负/甲2：有自负/乙3：全自负/丙 
      ||'"medCareItemType":'||'"'||REC.medCareItemType||'",'             --medCareItemType  医保项目类型    String  100 否  
      ||'"medReimburseRate":'||'"'||REC.medReimburseRate||'",'           --medReimburseRate 医保报销比例    Number  3,2 否  
      ||'"remark":'||'"'||REC.remark||'",'                               --remark             备注  String  200 否  
      ||'"sortNo":'||'"'||REC.sortNo||'",'                               --sortNo             序号  Integer 不限    否  序号
      ||'"chrgtype":'||'"'||REC.chrgtype||'"'                            --chrgtype         费用类型    String      50  否
            ||'}',1,1000);
            
          if    LS_FHXX00 is not null then 
            LS_FHXX00:=substrb(LS_FHXX00||','||LS_JSONSTR,1,4000);
          else
            LS_FHXX00:=substrb(LS_JSONSTR,1,4000);
          end if;   
        end loop;
    end if;
    --2:listDetail  清单项目明细列表--end--
    
    --3：otherInfo  其它扩展信息列表--begin--
    if PFHLXBH=3 then 
        for REC in CUR_otherInfo loop
      LS_JSONSTR:='';
      LS_JSONSTR:=substrb('{'
      ||'"infoNo":'||'"'||REC.infoNo||'",'         --infoNo     序号    Integer 不限    是  默认从1开始，每项数据序号值递增1，本次不允许重复
      ||'"infoName":'||'"'||REC.infoName||'",'     --infoName     扩展信息名称  String  100 是  
      ||'"infoValue":'||'"'||REC.infoValue||'"'    --infoValue  扩展信息值  String  500 是  
            ||'}',1,1000);
            
          if    LS_FHXX00 is not null then 
            LS_FHXX00:=substrb(LS_FHXX00||','||LS_JSONSTR,1,4000);
          else
            LS_FHXX00:=substrb(LS_JSONSTR,1,4000);
          end if;   
        end loop;
    end if;
    --3：otherInfo  其它扩展信息列表--end--
    
    --4：otherMedicalList   其它医保信息列表--begin--
    if PFHLXBH=4 then 
        for REC in CUR_otherMedicalList loop
      LS_JSONSTR:='';
      LS_JSONSTR:=substrb('{'
      ||'"infoNo":'||'"'||REC.infoNo||'",'                                    --infoNo    序号  Integer 不限    是  认从1开始，每项数据序号值递增1，本次不允许重复
      ||'"infoName":'||'"'||REC.infoName||'",'                                --infoName    医保信息名称    String  100 是  如费用报销类型编码，可参考附录7医保报销类型列表
      ||'"infoValue":'||'"'||trim(to_char(REC.infoValue,LS_JE_format))||'",'  --infoValue   医保信息值  String  100 是  如费用报销金额
      ||'"infoOther":'||'"'||REC.infoOther||'"'                               --infoOther   医保其它信息    String  100 否  如医保报销比例。
            ||'}',1,1000);
            
          if    LS_FHXX00 is not null then 
            LS_FHXX00:=substrb(LS_FHXX00||','||LS_JSONSTR,1,4000);
          else
            LS_FHXX00:=substrb(LS_JSONSTR,1,4000);
          end if;   
        end loop;
    end if;
    --4：otherMedicalList   其它医保信息列表--end--

  --5:payChannelDetail  交费渠道列表--begin--
    if PFHLXBH=5 then 
      --交费渠道列表，如果是CDRG病人，合计金额重取ZY_JZB000表nvl(a.YBYL39,0)+nvl(a.YBYL43,0)+nvl(a.YBYL44,0)+nvl(a.YBYL45,0)+nvl(a.CBYPF0,0)之和  ZYSF9-20220104-002
        select * into V_ZY_JZB000_ROW  from ZY_JZB000 a where ZYID00=PZYID00 and JZDH00=PJZDH00;
        if V_ZY_JZB000_ROW.YBSM09 is not null and V_ZY_JZB000_ROW.YBSM10 in ('01','02','03') then 
          LS_HJJE00:=nvl(V_ZY_JZB000_ROW.YBYL39,0)+nvl(V_ZY_JZB000_ROW.YBYL43,0)+nvl(V_ZY_JZB000_ROW.YBYL44,0)+nvl(V_ZY_JZB000_ROW.YBYL45,0)+nvl(V_ZY_JZB000_ROW.CBYPF0,0)+nvl(V_ZY_JZB000_ROW.WPCWFY,0);
          
        elsif nvl(V_ZY_JZB000_ROW.PTBCTS,0) > 0 and V_ZY_JZB000_ROW.YBSM10='07' then  --精神科按床位天数结算病例
      LS_HJJE00:=nvl(V_ZY_JZB000_ROW.RBZFY0,0)*V_ZY_JZB000_ROW.PTBCTS+nvl(V_ZY_JZB000_ROW.YBYL43,0)
                        +nvl(V_ZY_JZB000_ROW.YBYL44,0)+nvl(V_ZY_JZB000_ROW.YBYL45,0)+nvl(V_ZY_JZB000_ROW.CBYPF0,0)+nvl(V_ZY_JZB000_ROW.WPCWFY,0);
        
        elsif ls_YBDBZJSFSPTBCTS = '1' and nvl(V_ZY_JZB000_ROW.PTBCTS,0) > 0 and V_ZY_JZB000_ROW.FFBZBM is not null then
      LS_HJJE00:=nvl(V_ZY_JZB000_ROW.YBYL04,0)*nvl(V_ZY_JZB000_ROW.PTBCTS,0)
              +nvl(V_ZY_JZB000_ROW.YBYL33,0)+nvl(V_ZY_JZB000_ROW.YBYL34,0)+nvl(V_ZY_JZB000_ROW.YBYL69,0);
                        
        else
          LS_HJJE00:=PHJJE00;
      end if;
        
        LS_JFQDLBHJ:=0;--临时
        for REC in CUR_payChannelDetail loop
      LS_JSONSTR:='';
      LS_JSONSTR:=substrb('{'
      ||'"infoNo":'||'"'||REC.infoNo||'",'                                              --infoNo            序号    Integer 不限    是  认从1开始，每项数据序号值递增1，本次不允许重复
      ||'"payChannelCode":'||'"'||REC.payChannelCode||'",'                              --payChannelCode    交费渠道编码    String  10  是
      ||'"payChannelValue":'||'"'||trim(to_char(REC.payChannelValue,LS_JE_format))||'"' --payChannelValue   交费渠道金额    Number  14,2    是
            ||'}',1,1000);
            
          if    LS_FHXX00 is not null then 
              LS_FHXX00:=substrb(LS_FHXX00||','||LS_JSONSTR,1,4000);
          else
              LS_FHXX00:=substrb(LS_JSONSTR,1,4000);
          end if;
          LS_infoNo:=REC.infoNo;--序列号 
          LS_JFQDLBHJ:=nvl(LS_JFQDLBHJ,0)+nvl(REC.JFJE00,0);  
        end loop;
        
        --由于博思校验payChannelDetail 合计金额要等于  totalAmt 如果不等于会报  业务执行异常：交费渠道合计金额不等于开票总金额
        --模拟生成一条报文 12 预交金
        LS_TEPNUM:=nvl(LS_HJJE00,0)-nvl(LS_JFQDLBHJ,0);
        if LS_TEPNUM<>0  then  --合计金额
            if nvl(LS_JFQDLBHJ,0)=0 then 
                LS_infoNo:=1;
          else
            LS_infoNo:=LS_infoNo+1;
          end if;
            LS_TEPSTR:=substrb('{'
      ||'"infoNo":'||'"'||LS_infoNo||'",'                                      --infoNo           序号  Integer 不限    是  认从1开始，每项数据序号值递增1，本次不允许重复
      ||'"payChannelCode":'||'"'||'12'||'",'                                   --payChannelCode   交费渠道编码  String  10  是
      ||'"payChannelValue":'||'"'||trim(to_char(LS_TEPNUM,LS_JE_format))||'"'  --payChannelValue    交费渠道金额    Number  14,2    是
            ||'}',1,400);
         
          if    LS_FHXX00 is not null then 
              LS_FHXX00:=substrb(LS_FHXX00||','||LS_TEPSTR,1,4000);
          else
              LS_FHXX00:=substrb(LS_TEPSTR,1,4000);
          end if;           
        end if;     
    end if;
    --5:payChannelDetail    交费渠道列表--end--
 
    LS_FHXX00:=substrb('['||LS_FHXX00||']',1,4000);  
    return trim(LS_FHXX00);     
end;
