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 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; --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; --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); elsif V_ZY_JZB000_ROW.PTBCTS > 0 and V_ZY_JZB000_ROW.YBSM10='07' then --精神科按床位天数结算病例 LS_HJJE00:=dnvl(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); 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;