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;