CREATE OR REPLACE PROCEDURE SP_SST_MZ_DAXXDJ_GJYB( as_XML_in in varchar2 ,--[1]输入:入参(XML) rs_XML_out out varchar2 ,--[2]输出:出参(XML) P_ERRMSG out varchar2 --[3]输出:错误信息 ) as -- MODIFICATION HISTORY -- Person Date Comments -- zhangyc 2022.03.29 自助机国家医保建档:SP_SST_MZ_DAXXDJ_GJYB(福建:SP_SST_MZ_DAXXDJ_TKT) -- zhangyc 2022.04.07 修正自助机建档psn_no错误 -- dsm 2023.05.11 p_fzxmc0='自费'时不判断参保地区划 -- --------- ---------- ------- LS_COUNT0 number(12,2); LS_CZRQ00 char(8); LS_CZSJ00 char(8); LS_INTXML varchar2(2000); LS_OUTXML varchar2(2000); LS_BYCC00 varchar2(200); LS_retcode varchar2(10); --00:成功 99:失败 LS_retmsg varchar2(200); in_zdbh00 varchar2(50);-- 终端编号 in_fzxbh0 varchar2(50);-- 分中心编号 in_mdtrt_cert_no varchar2(50);-- 病人卡号:就诊凭证类型为“03” in_id0000 varchar2(50);-- 保险编号 in_sfzhao varchar2(50);-- 身份证号 in_xming0 varchar2(50);-- 姓名 in_xbie00 varchar2(1);-- 性别(1:男;2:女) in_brnl00 varchar2(10);-- 病人年龄 in_rylb00 varchar2(50);-- 人员类别(工作状态) in_csrq00 varchar2(10);-- 出生日期(如:1986-12-02) yyyy-MM-dd in_fzxmc0 varchar2(50);-- 分中心名称 in_gzdwmc varchar2(50);-- 工作单位名称 in_grzhye varchar2(10);-- 个人账户余额 in_lxdh00 varchar2(20);-- 联系电话 in_dqmc00 varchar2(50);-- 地区名称(若his建档需要,可传入,例如:宁德地区) in_sfjzfp varchar2(2);-- 是否精准扶贫(Y:是 N:否) in_byrc00 varchar2(500);-- 备用入参 in_insutype varchar2(10);-- 险种 in_insuplc_admdvs varchar2(10);-- 参保地医保区划 in_mdtrt_cert_type varchar2(10);-- 就诊凭证类型(01:电子凭证 02:身份证 03:社保卡) in_card_sn varchar2(50);-- 卡识别码:就诊凭证类型为“03” in_psn_no varchar2(30);-- 人员编号 in_psn_cert_type varchar2(10);-- 人员证件类型 in_certno varchar2(30);-- 证件号码 in_naty varchar2(10);-- 民族 in_psn_type varchar2(10);-- 人员类别 in_psn_insu_stas varchar2(10);-- 人员参保状态 in_cvlserv_flag varchar2(10);-- 公务员标志 LS_BRID00 number(10); LS_CARDNO varchar2(220); LS_YNYBMC BM_YBXZQH.YNYBMC%type;--院内医保分中心名称=IC_YBBRLB.YBMC00 LS_bke284 varchar2(2); --bke284:份认证类型(01:读卡02:融合码06:医保码20:医疗证) LS_bkc001 SF_YBJKRZ.BKC001%type; --人员待遇类别 LS_bkc001_mc SF_YBJKRZ.BKC001_MC%type; --人员待遇类别名称 LS_aae140 SF_YBJKRZ.AAE140%type; --aae140:险种类型:310 城镇职工基本医疗保险 320:公务员医疗补助 380:新型农村合作医疗 390:城乡居民基本医疗保险 410:工伤保险 510:生育保险 520:机关生育 LS_aae140_mc SF_YBJKRZ.AAE140_MC%type; --aae140_mc:险种类型名称(城乡居民基本医疗保险、城镇职工基本医疗保险等等) begin /* 请求报文: 350400600401350426G17492239 350426196506173527 350426196506173527郑美妹 256.3156001156001 1965-06-17尤溪县中仙乡吉华村一组 018659223771 Y390 35042603 3500000135042619650617352701 010110 错误返回案例:99参保地医保区划编码:[350426]在院内未对照医保中心名称,请联系管理员! 成功返回案例:00 */ LS_INTXML:=substrb(as_XML_in,1,2000); LS_OUTXML:=null; LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:=''; P_ERRMSG:=''; --步骤1:入参数校验 if LS_INTXML is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='请求参数不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --步骤2解析请求参数 in_zdbh00 :=trim(substrb(SF_XT_GETXMLSTR('p_zdbh00',LS_INTXML),1,30)); --varchar2(50);-- 终端编号 in_fzxbh0 :=trim(substrb(SF_XT_GETXMLSTR('p_fzxbh0',LS_INTXML),1,50)); --varchar2(50);-- 分中心编号 in_mdtrt_cert_no :=trim(substrb(SF_XT_GETXMLSTR('p_mdtrt_cert_no',LS_INTXML),1,50)); --varchar2(50);-- 病人卡号:就诊凭证类型为“03” in_id0000 :=trim(substrb(SF_XT_GETXMLSTR('p_id0000',LS_INTXML),1,50)); --varchar2(50);-- 保险编号 in_sfzhao :=trim(substrb(SF_XT_GETXMLSTR('p_sfzhao',LS_INTXML),1,50)); --varchar2(50);-- 身份证号 in_xming0 :=trim(substrb(SF_XT_GETXMLSTR('p_xming0',LS_INTXML),1,50)); --varchar2(50);-- 姓名 in_xbie00 :=trim(substrb(SF_XT_GETXMLSTR('p_xbie00',LS_INTXML),1,1)); --varchar2(1);-- 性别(1:男;2:女) in_brnl00 :=trim(substrb(SF_XT_GETXMLSTR('p_brnl00',LS_INTXML),1,10)); --varchar2(10);-- 病人年龄 in_rylb00 :=trim(substrb(SF_XT_GETXMLSTR('p_rylb00',LS_INTXML),1,50)); --varchar2(50);-- 人员类别(工作状态) in_csrq00 :=trim(substrb(SF_XT_GETXMLSTR('p_csrq00',LS_INTXML),1,10)); --varchar2(10);-- 出生日期(如:1986-12-02) yyyy-MM-dd in_fzxmc0 :=trim(substrb(SF_XT_GETXMLSTR('p_fzxmc0',LS_INTXML),1,50)); --varchar2(50);-- 分中心名称 in_gzdwmc :=trim(substrb(SF_XT_GETXMLSTR('p_gzdwmc',LS_INTXML),1,50)); --varchar2(50);-- 工作单位名称 in_grzhye :=trim(substrb(SF_XT_GETXMLSTR('p_grzhye',LS_INTXML),1,10)); --varchar2(10);-- 个人账户余额 in_lxdh00 :=trim(substrb(SF_XT_GETXMLSTR('p_lxdh00',LS_INTXML),1,20)); --varchar2(20);-- 联系电话 in_dqmc00 :=trim(substrb(SF_XT_GETXMLSTR('p_dqmc00',LS_INTXML),1,50)); --varchar2(50);-- 地区名称(若his建档需要,可传入,例如:宁德地区) in_sfjzfp :=trim(substrb(SF_XT_GETXMLSTR('p_sfjzfp',LS_INTXML),1,1)); --varchar2(2);-- 是否精准扶贫(Y:是 N:否) in_byrc00 :=trim(substrb(SF_XT_GETXMLSTR('p_byrc00',LS_INTXML),1,500)); --varchar2(200);-- 备用入参 in_insutype :=trim(substrb(SF_XT_GETXMLSTR('insutype',LS_INTXML),1,10)); --varchar2(10);-- 险种 in_insuplc_admdvs :=trim(substrb(SF_XT_GETXMLSTR('insuplc_admdvs',LS_INTXML),1,10)); --varchar2(10);-- 参保地医保区划 in_mdtrt_cert_type :=trim(substrb(SF_XT_GETXMLSTR('mdtrt_cert_type',LS_INTXML),1,10)); --varchar2(2);-- 就诊凭证类型(01:电子凭证 02:身份证 03:社保卡) in_card_sn :=trim(substrb(SF_XT_GETXMLSTR('card_sn',LS_INTXML),1,50)); --varchar2(50);-- 卡识别码:就诊凭证类型为“03” in_psn_no :=trim(substrb(SF_XT_GETXMLSTR('psn_no',LS_INTXML),1,30)); --varchar2(20);-- 人员编号 in_psn_cert_type :=trim(substrb(SF_XT_GETXMLSTR('psn_cert_type',LS_INTXML),1,10)); --varchar2(10);-- 人员证件类型 in_certno :=trim(substrb(SF_XT_GETXMLSTR('certno',LS_INTXML),1,30)); --varchar2(30);-- 证件号码 in_naty :=trim(substrb(SF_XT_GETXMLSTR('naty',LS_INTXML),1,10)); --varchar2(10);-- 民族 in_psn_type :=trim(substrb(SF_XT_GETXMLSTR('psn_type',LS_INTXML),1,10)); --varchar2(10);-- 人员类别 in_psn_insu_stas :=trim(substrb(SF_XT_GETXMLSTR('psn_insu_stas',LS_INTXML),1,10)); --varchar2(10);-- 人员参保状态 in_cvlserv_flag :=trim(substrb(SF_XT_GETXMLSTR('cvlserv_flag',LS_INTXML),1,10)); --varchar2(10);-- 公务员标志 --步骤4:各个节点校验--begin--- --p_zdbh00 终端编号 if in_zdbh00 is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='终端编号(p_zdbh00)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --p_sfzhao 身份证号 if in_sfzhao is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='身份证号(p_sfzhao)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --p_xming0 姓名 if in_xming0 is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='姓名(p_xming0)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --p_xbie00 性别(1:男;2:女) if in_xbie00 is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='性别(p_xbie00)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --p_csrq00 出生日期(如:1986-12-02) if in_csrq00 is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='出生日期(p_csrq00)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; else if lengthb(in_csrq00)<>10 then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='出生日期(p_csrq00)格式错误(正确格式:YYYY-MM-DD)!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; in_csrq00:=replace(in_csrq00,'-',''); end if; --insutype 险种 if in_insutype is null and nvl(in_fzxmc0,' ')<>'自费' then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='险种(insutype)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --insuplc_admdvs 参保地医保区划 if in_insuplc_admdvs is null and nvl(in_fzxmc0,' ')<>'自费' then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='参保地医保区划(insuplc_admdvs)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --mdtrt_cert_type 就诊凭证类型(01:电子凭证 02:身份证 03:社保卡) if in_mdtrt_cert_type is null and nvl(in_fzxmc0,' ')<>'自费' then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='就诊凭证类型(01:电子凭证 02:身份证 03:社保卡)(mdtrt_cert_type)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --mdtrt_cert_type: 就诊凭证类型 01:医保凭证,02:身份证 03:社保卡 if in_mdtrt_cert_type is not null then if in_mdtrt_cert_type='01' then LS_bke284:='06';--身份认证类型(01:读卡02:融合码06:医保码20:医疗证) elsif in_mdtrt_cert_type='02' then LS_bke284:='20';--身份认证类型(01:读卡02:融合码06:医保码20:医疗证) elsif in_mdtrt_cert_type='03' then LS_bke284:='01';--身份认证类型(01:读卡02:融合码06:医保码20:医疗证) end if; end if; if in_mdtrt_cert_type in ('03') and in_mdtrt_cert_no is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='病人卡号(p_mdtrt_cert_no)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --psn_no 人员编号 if in_psn_no is null and nvl(in_fzxmc0,' ')<>'自费' then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='人员编号(psn_no)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --psn_type 人员类别 if in_psn_type is null and nvl(in_fzxmc0,' ')<>'自费' then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='人员类别(psn_type)请求参数值不能为空!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --步骤4:各个节点校验--end--- --LS_YNYBMC BM_YBXZQH.YNYBMC%type;--院内医保分中心名称=IC_YBBRLB.YBMC00 if in_insuplc_admdvs is not null and nvl(in_fzxmc0,' ')<>'自费' then begin select A.YNYBMC into LS_YNYBMC from BM_YBXZQH A where A.admdvs_code=in_insuplc_admdvs; exception when others then LS_YNYBMC:=null;--院内医保分中心名称=IC_YBBRLB.YBMC00 end; else LS_YNYBMC:='自费'; end if; IF LS_YNYBMC is null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:='参保地医保区划编码:['||in_insuplc_admdvs||']在院内未对照医保中心名称,请联系管理员!'; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; --分中心名称 in_fzxmc0:=LS_YNYBMC; if in_sfzhao is not null and nvl(in_fzxmc0,' ')<>'自费' then in_id0000:=in_sfzhao; end if; if nvl(in_fzxmc0,' ')='自费' then in_id0000:='0'; end if; -- 人员类别人员待遇类别名称 if in_psn_type is not null then LS_bkc001:=substrb(in_psn_type,1,10); LS_bkc001_mc := substrb(SF_XT_GETYBSXZD('psn_type',LS_bkc001,'3','2'),1,50); end if; --aae140_mc:险种类型名称(城乡居民基本医疗保险、城镇职工基本医疗保险等等) if in_insutype is not null then LS_AAE140:=substrb(in_insutype,1,10); LS_AAE140_MC := substrb(SF_XT_GETYBSXZD('insutype',LS_AAE140,'3','2'),1,50); end if; select SF_SST_GETICKH00_YKT(in_mdtrt_cert_no) into LS_CARDNO from dual; --步骤5:调用过程 SP_SST_MZ_DAXXDJ_YKT( in_zdbh00, --P_ZDBH00 in varchar2, --终端编号 in_fzxbh0, --P_FZXBH0 in varchar2, --参保机构代码 in_mdtrt_cert_no,--P_CARDNO in varchar2, --病人卡号 in_id0000, --P_ID0000 in varchar2, --保险编号 in_sfzhao, --P_SFZHAO in varchar2, --身份证号 in_xming0, --P_XMING0 in varchar2, --姓名 in_xbie00, --P_XBIE00 in varchar2, --性别(0:男;1:女) -->(1:男;2:女) in_brnl00, --P_BRNL00 in varchar2, --病人年龄 in_rylb00, --P_RYLB00 in varchar2,--人员类别(工作状态) in_csrq00, --P_CSRQ00 in varchar2, --出生日期(如:19861202) in_fzxmc0, --P_FZXMC0 in varchar2, --分中心名称 in_gzdwmc, --P_GZDWMC in varchar2, --工作单位名称 nvl(in_grzhye,'0'),--P_GRZHYE in varchar2, --个人账户余额 in_lxdh00,--P_LXDH00 in varchar2, --联系电话 in_byrc00,--P_BYRC00 in varchar2, --备用入参 P_ERRMSG, --P_ERRMSG out varchar2,--无法获取明细的错误信息,空表示正确 LS_BYCC00--P_BYCC00 out varchar2 --备用出参 ); begin select brid00 into LS_BRID00 from ic_yhxx00 where ICKH00 =LS_CARDNO and ZT0000 ='1'; exception when NO_DATA_FOUND then LS_BRID00:=0; end; --就诊凭证类型(01:电子凭证 02:身份证 03:社保卡) if in_mdtrt_cert_type in ('03','01') and lengthb(in_mdtrt_cert_no)=9 then update ic_yhxx00 set CARDNO=in_mdtrt_cert_no where ICKH00 =LS_CARDNO; end if; --修改BM_BRXXB0 if nvl(LS_BRID00,0)>0 then update BM_BRXXB0 a set --bke284=LS_bke284 ,--身份认证类型(01:读卡02:融合码06:医保码20:医疗证) aae140=substrb(nvl(LS_AAE140,AAE140),1,10) ,--险种类型:310 城镇职工基本医疗保险 320:公务员医疗补助 380:新型农村合作医疗 390:城乡居民基本医疗保险 410:工伤保险 510:生育保险 520:机关生育 aae140_mc=substrb(nvl(LS_AAE140_MC,AAE140_MC),1,50) ,--险种类型名称(城乡居民基本医疗保险、城镇职工基本医疗保险等等) brztqk=substrb(nvl(LS_bkc001_mc,BRZTQK),1,40) ,--病人职退情况名称 ZTQKBH=substrb(nvl(LS_bkc001,ZTQKBH),1,10) ,--病人职退情况编码 psn_no=substrb(nvl(in_psn_no,psn_no),1,30) ,--psn_no[国家医保]人员编号 xzqh00=substrb(nvl(in_insuplc_admdvs,xzqh00),1,10) , --行政区号 XBBH00=substrb(nvl(in_xbie00,XBBH00),1,2) ,--性别编号 MZBH00=substrb(nvl(in_naty,MZBH00),1,5) ,--民族编号=VW_BM_naty ZJLXBH=substrb(nvl(in_psn_cert_type,ZJLXBH),1,5) ,--证件类型编号=VW_BM_psn_cert_type YBKSBM=substrb(nvl(in_card_sn,YBKSBM),1,50) ,--医保卡识别码 SFJZFP=substrb(in_sfjzfp,1,1) --是否精准扶贫,Y:是;N:不是 where brid00=LS_BRID00; else update BM_BRXXB0 a set --bke284=LS_bke284 ,--身份认证类型(01:读卡02:融合码06:医保码20:医疗证) aae140=substrb(nvl(LS_AAE140,AAE140),1,10) ,--险种类型:310 城镇职工基本医疗保险 320:公务员医疗补助 380:新型农村合作医疗 390:城乡居民基本医疗保险 410:工伤保险 510:生育保险 520:机关生育 aae140_mc=substrb(nvl(LS_AAE140_MC,AAE140_MC),1,50) ,--险种类型名称(城乡居民基本医疗保险、城镇职工基本医疗保险等等) brztqk=substrb(nvl(LS_bkc001_mc,BRZTQK),1,40) ,--病人职退情况名称 ZTQKBH=substrb(nvl(LS_bkc001,ZTQKBH),1,10) ,--病人职退情况编码 psn_no=substrb(nvl(in_psn_no,psn_no),1,30) ,--psn_no[国家医保]人员编号 xzqh00=substrb(nvl(in_insuplc_admdvs,xzqh00),1,10) , --行政区号 XBBH00=substrb(nvl(in_xbie00,XBBH00),1,2) ,--性别编号 MZBH00=substrb(nvl(in_naty,MZBH00),1,5) ,--民族编号=VW_BM_naty ZJLXBH=substrb(nvl(in_psn_cert_type,ZJLXBH),1,5) ,--证件类型编号=VW_BM_psn_cert_type YBKSBM=substrb(nvl(in_card_sn,YBKSBM),1,50) ,--医保卡识别码 SFJZFP=substrb(in_sfjzfp,1,1) --是否精准扶贫,Y:是;N:不是 where BRXM00=in_xming0 and BRZJBH=in_sfzhao and trim(ybid00)=in_id0000 and trim(ybkh00)=in_mdtrt_cert_no and exists (select 1 from IC_YHXX00 B where B.BRID00=A.BRID00 and B.ZT0000='1') ; end if; if P_ERRMSG is not null then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:=P_ERRMSG; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,500); P_ERRMSG:=LS_retmsg; --输出:错误信息 return; end if; LS_retcode:='00'; --00:成功 99:失败 LS_retmsg:=''; rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,1000); P_ERRMSG:=''; --输出:错误信息 exception when no_data_found then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:=substrb('自助机国家医保建档失败!原因:'||sqlerrm,1,200); rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,1000); P_ERRMSG:=LS_retmsg; rollback; when others then LS_retcode:='99'; --00:成功 99:失败 LS_retmsg:=substrb('自助机国家医保建档失败!原因:'||sqlerrm,1,200); rs_XML_out:=substrb(''||''||LS_retcode||''||''||LS_retmsg||''||'',1,1000); P_ERRMSG:=LS_retmsg; rollback; end;