prompt 门诊转出住院项目 prompt 门诊转出住院项目 SP_ZY_MZZCZYCL create or replace procedure SP_ZY_MZZCZYCL ( Pzyid00 in number, --住院号 Pyyid00 in varchar2 default '0', --医院ID Pczy000 in number, --操作员 Pczyks0 in number, --操作员科室 Pcommit in varchar2 default 'N' , --是否提交 Pzxcgbz out number , --执行成功标志 1成功 0失败 Ptsxx00 out varchar2 , --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 out varchar2 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ) -- MODIFICATION HISTORY --Person Date Comment --linzetao 2020.02.04 create by ZYSF9-20200113-002 --linzetao 2020.02.19 修正处理多个医技单对应一个医技单无法转入问题 ZYSF9-20200219-001 --linzetao 2020.02.25 处理原医技单附加单据标志(YJ_YW0000.FJDJBZ)带入新医技单 ZYSF9-20200219-003 --linzetao 2020.02.28 处理公用附加项目医技单无法转出住院问题 ZYSF9-20200228-003 --linzetao 2020.03.11 处理医技单转出住院时新开门诊医技单的医生组ID需填入住院医技单对应转入的原门诊医技单开单医生对应的医生组ID ZYSF9-20200311-003 --linzetao 2020.04.13 处理医保病人门诊费用转出住院后冲销的医技单HBZYXM写2 YJ9-20200402-001 --linzetao 2020.06.28 修正单据号取值问题 ZYSF9-20200525-002 --linzetao 2021.11.14 处理转出检验项目JY_YW0000.JGZT00调整成0(原为8) ZYSF9-20211103-001 --linzetao 2023.04.10 调整主医技单退费判断 ZYSF9-20230330-002 --linzetao 2024.02.23 调整新增医技单子单条件判断 as Vczrq00 char(8); Vczsj00 char(8); Vzyid00 ZY_BRXXB0.ZYID00%type; Vbrid00 ZY_BRXXB0.BRID00%type; Vcount0 number(5); Vdqbq00 ZY_BRXXB0.DQBQ00%type; Vdqks00 ZY_BRXXB0.DQKS00%type; Vrycwh0 ZY_BRXXB0.RYCWH0%type; Vxm0000 ZY_BRXXB0.XM0000%type; Vxb0000 ZY_BRXXB0.XB0000%type; Vzwxm00 BM_YGBM00.ZWXM00%type; Ecustom exception; --错误变量 Vdjh000 SF_BRFY00.DJH000%type; --收费单据号jhuy Vyjdjh0 YJ_YW0000.YJDJH0%type; --医技单据号 Vnewyjd YJ_YW0000.YJDJH0%type; --转入住院新开的医技单号 Vfyjdjh YJ_YJDJGL.FYJDJH%type; --新父医技单据号 Vnewzd0 YJ_YW0000.YJDJH0%type; --子医技单 Vzryjdh ZY_MZZRZY.XYJDJH%type; --门诊转入住院医技单据号 Vyszid0 YJ_YW0000.YSZID0%type; --医生组ID Vcxyjd0 YJ_YW0000%rowtype; --要退的主单,考虑不用游标 Vzyjd00 YJ_YW0000%rowtype; --主医技单 Vtzyjd0 YJ_YW0000%rowtype; --同组医技单 Vzyjdjh YJ_YJDJGL%rowtype; --新生成的子医技单号 Vymzyjd YJ_YW0000%rowtype; --转入住院的原门诊医技单 Vsql000 varchar2(100); Vzlzd00 BM_ZLZD00%rowtype; Vxkh000 BM_YGBM00.XKH000%type; --胸卡号 Vzcyjdh varchar(3000); --已转出医技单 Vxzyjdh YJ_YW0000.YJDJH0%type; --新生成的子医技单号 Vfjgyxm XT_XTCS00.VALUE0%type; --附加公用项目 cursor CUR_YJ_MZZRZY is --门诊转入住院的医技单 select YJDJH0 from VW_ZY_MZZCZY_YJ a where a.ZYGHID=Pzyid00 and (Pyyid00='0' or a.YYID00=Pyyid00) and not exists(select 1 from ZY_MZZCZY where YJDJH0=a.YJDJH0 and ZCZYZT='1'); cursor CUR_YJ_TZDJH0 is --原门诊医技单同组医技单 select ZYJDJH from YJ_YJDJGL a where a.FYJDJH=Vymzyjd.YJDJH0 --and not exists(select 1 from YJ_YJDJGL where ZYJDJH=a.ZYJDJH and FYJDJH<>a.FYJDJH) and not exists(select 1 from YJ_YW0000 where YJDJH0=a.ZYJDJH and XMZT00 in ('6','7')) and exists (select 1 from YJ_YW0000 where YJDJH0=a.ZYJDJH); cursor CUR_YJ_ZFDJH0 is --主医技单 select * from YJ_YJDJGL a where a.FYJDJH=Vnewyjd and exists (select 1 from YJ_YW0000 where YJDJH0=a.ZYJDJH and XMZT00 in ('0','1')); begin Pzxcgbz := 0; Vczrq00 := to_char(sysdate,'YYYYMMDD'); Vczsj00 := to_char(sysdate,'HH24:MI:SS'); Vcount0:=0; Vzcyjdh := ','; if Pzyid00 is null or Pzyid00=0 then Ptsxx00 := '[传入的病人住院ID不能为空]'; raise Ecustom; end if; --取得附加公用项目 select trim(nvl(max(VALUE0),'0')) into Vfjgyxm from XT_XTCS00 where NAME00='XT_FJGYXMID'; Ptsxx00 := '[查找住院病人信息]'; select ZWXM00 into Vzwxm00 from BM_YGBM00 where YGBH00=Pczy000; begin select ZYID00,DQBQ00,DQKS00,RYCWH0,XM0000,XB0000,BRID00 into Vzyid00,Vdqbq00,Vdqks00,Vrycwh0,Vxm0000,Vxb0000,Vbrid00 from ZY_BRXXB0 where ZYID00 = Pzyid00 and BRZT00 not in ('4','5','9') ; exception when no_data_found then Ptsxx00 :='未找到有效的住院病人信息!'; Pxxxx00 := Ptsxx00||sqlerrm; raise Ecustom; end; Ptsxx00 := '[开始循环执行转出医技单处理'; for MZZR in CUR_YJ_MZZRZY loop Vyjdjh0 := MZZR.YJDJH0; --这里Vzyjd00还是主医技单 select * into Vzyjd00 from YJ_YW0000 where YJDJH0 = Vyjdjh0; --未退的医技单做冲销 Ptsxx00 := '1.未退的医技单做冲销处理'; select count(*) into Vcount0 from YJ_YW0000 where BRID00=Vbrid00 and CXDJH0 = Vzyjd00.YJDJH0 and XMZT00 not in('6','7'); if Vcount0 <= 0 then SP_YJ_YWCX(Vyjdjh0, Pczy000, Pczyks0, 'N', 'N', null, 'N'); else Ptsxx00 := '2.找对应的负单做费用更正'; select * into Vcxyjd0 from YJ_YW0000 where ZYGHID = Vzyjd00.ZYGHID and MZZYBZ = '1' and CXDJH0 = Vzyjd00.YJDJH0; if Vcxyjd0.SFDJH0 >0 then Ptsxx00 := '该医技单已经被退费,不能转出'; raise Ecustom; end if; end if; Ptsxx00 := '2.找对应的负单做费用更正'; select * into Vcxyjd0 from YJ_YW0000 where ZYGHID = Vzyjd00.ZYGHID and MZZYBZ = '1' and CXDJH0 = Vzyjd00.YJDJH0; --以下判断移到上方处理 --if Vcxyjd0.SFDJH0 >0 then -- Ptsxx00 := '该医技单已经被退费,不能转出'; -- raise Ecustom; --end if; --门诊费用转出住院后, 冲销医技单HBZYXM写2 update YJ_YW0000 set HBZYXM='2' where YJDJH0=Vcxyjd0.YJDJH0; if Vcxyjd0.SFDJH0 <= 0 or Vcxyjd0.SFDJH0 is null then Ptsxx00 := '3.冲销完费用更正'; select SQ_ZY_BRJFB0_DJH000.nextval into Vdjh000 from dual; SP_YJ_YWJJGZ( Vcxyjd0.YJDJH0, null, --负记录计价ID Vdjh000, --单据号 1, --收费员登记 1是 0否 Pczy000, --操作员编码 Pczyks0, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 Ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); if Pzxcgbz = 0 then Ptsxx00 := '旧医技单费用更正错误'; raise Ecustom; end if; end if; --判断当前医技单是否为子医技单,如果非子单,则继续处理 select count(*) into Vcount0 from YJ_YJDJGL a where a.ZYJDJH=Vzyjd00.YJDJH0; if Vcount0<=0 then Ptsxx00 := '4.找出转入住院的原门诊医技单'; begin select * into Vymzyjd from YJ_YW0000 where YJDJH0=(select YJDJH0 from ZY_MZZRZY where XYJDJH=Vzyjd00.YJDJH0); exception when NO_DATA_FOUND then Ptsxx00 := '未找到转入住院的原门诊医技单'; raise Ecustom; end; Vnewyjd := 0; Ptsxx00 := '5.新开住院医技单'; SP_YJ_YJSQWH( 2, --操作内容 1修改 2增加 3删除 Vnewyjd, --操作的医技单据号 --Vzyid00, --挂号id Vymzyjd.ZYGHID, --原门诊挂号ID '0', --门诊住院标志 Vymzyjd.ZLXMID, --诊疗项目id null, --子项目id串,如果没有传入参数,表示使用所有明细项 null, --诊断id null, --诊断名称 null, --标本ID null, --特殊病种编号 'N', --医技录入标志 'N', --急诊标志 Vymzyjd.KDYS00, --开单医生 Vymzyjd.KDKSBH, --开单科室编号 null, --开单病区 Vymzyjd.YJKSBH, --医技科室编号 Vymzyjd.SL0000, --数量 null, --备注 '0', --附加单据标志 Pczy000, --操作员 Pczyks0, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 Ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); if Pzxcgbz = 0 then Ptsxx00 := '转出住院,新开医技单错误'; raise Ecustom; end if; Vfyjdjh := Vnewyjd; --取得门诊开单医生对应的医生组id select nvl(max(a.YSZID0),0) into Vyszid0 from ZS_YSZMX0 a,ZS_YSZ000 b,BM_BMBM00 c where a.YSZID0=b.YSZID0 and b.SSKSBH=c.BMBH00 and c.BMXZ00='0' and a.YSBH00=Vymzyjd.KDYS00; --将新医技单的HBZYXM写‘1’,并将原医技单的FJDJBZ带入新医技单,原门诊医技单的医生组ID带入新医技单 Ptsxx00 := '6.将新生成的医技单的YJ_YW0000.HBZYXM栏位写成‘1’'; update YJ_YW0000 set HBZYXM='1',FJDJBZ=Vymzyjd.FJDJBZ,YSZID0=Vyszid0 where YJDJH0=Vnewyjd; Ptsxx00 := '7.删除新医技单号对应的子单'; for Vzyjdjh in CUR_YJ_ZFDJH0 loop SP_YJ_YJSQWH( 3, --操作内容 1修改 2增加 3删除 Vzyjdjh.ZYJDJH, --操作的医技单据号 null, --挂号id null, --门诊住院标志 null, --诊疗项目id null, --子项目id串,如果没有传入参数,表示使用所有明细项 null, --诊断id null, --诊断名称 null, --标本ID null, --特殊病种编号 null, --医技录入标志 null, --急诊标志 null, --开单医生 null, --开单科室编号 null, --开单病区 null, --医技科室编号 null, --数量 null, --备注 null, --附加单据标志 Pczy000, --操作员 Pczyks0, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 Ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); end loop; Ptsxx00 := '8.新开单扣费'; select SQ_SF_BRJFB0_DJH000.nextval into Vdjh000 from dual; SP_SF_YJDJ00( Vnewyjd, --医技单据号(YJDJH1,YJDJH2,YJDJH3...) Vdjh000, --单据号 Pczyks0, --执行科室 Pczy000, --执行医生 to_char(sysdate,'YYYYMMDD'), --操作日期 to_char(sysdate,'HH24:MI:SS'), --操作时间 Ptsxx00, --存储过程提示的错误信息 Pxxxx00, --系统提示的错误信息 '1', --收费员登记 1是 0否 'Z', '2' --是否预扣标志 0要预扣,不允许为负 1不预扣,不允许为负 2要预扣,允许为负 3不预扣,允许为负 ); if Ptsxx00 is not null then raise Ecustom; end if; --Ptsxx00 := '填写住院费用备注'; --update ZY_FYMX00 set BEIZHU = '门诊转入'||BEIZHU where DJH000 = Vdjh000; Ptsxx00 := '9.如果原单是已执行状态,转入后也要是已执行状态'; select XKH000 into Vxkh000 from BM_YGBM00 where YGBH00 = Vzyjd00.ZXR000; if Vzyjd00.XMZT00='3' then SP_YJ_YWZX00( Vnewyjd, 0, Vzyjd00.ZXSL00, --原单执行数量 2, --大项目执行 Vxkh000, --原单执行人胸卡号 Vzyjd00.YJKSBH, --原单医技科室编号 'N' --默认不提交 ); end if; Ptsxx00 := '10.如果是检验,标志位修改'; begin select * into Vzlzd00 from BM_ZLZD00 where ZLXMID = Vzyjd00.ZLXMID; if Vzlzd00.LBBH00 = '4' then Vsql000 := 'update JY_YW0000 set JGZT00=''0'' where YJDJH0 = :v1'; execute immediate Vsql000 using in Vnewyjd; end if; exception when others then Ptsxx00 := '修改检验标志错误'; end; Ptsxx00 := '11.中间表写入'; select count(*) into Vcount0 from ZY_MZZCZY where YJDJH0 = Vzyjd00.YJDJH0; if Vcount0>0 then update ZY_MZZCZY set ZCZYZT='1' where YJDJH0 = Vzyjd00.YJDJH0; else insert into ZY_MZZCZY(ID0000, YJDJH0, CZY000, CZYXM0, CZYKS0, ZCZYZT, XYJDJH, ZCRQ00, ZCSJ00) values(SQ_ZY_MZZRZY_ID0000.nextval, Vzyjd00.YJDJH0, Pczy000, Vzwxm00, Pczyks0, '1', Vnewyjd, Vczrq00, Vczsj00); end if; Ptsxx00 := '12.子单处理'; for ZYJD in CUR_YJ_TZDJH0 loop --处理同一个子医技单对应两个父医技单,判断子医技单是否已经处理 if instr(Vzcyjdh, ','||ZYJD.ZYJDJH||',')>0 then select nvl(max((select XYJDJH from ZY_MZZCZY where YJDJH0=a.XYJDJH)),-1) into Vxzyjdh from zy_mzzrzy a where a.YJDJH0=ZYJD.ZYJDJH; if Vxzyjdh<>-1 then select count(*) into Vcount0 from YJ_YJDJGL where FYJDJH=Vfyjdjh and ZYJDJH=Vxzyjdh; if Vcount0<=0 then insert into YJ_YJDJGL(FYJDJH,ZYJDJH) values(Vfyjdjh,Vxzyjdh); end if; end if; else Vzcyjdh := Vzcyjdh||ZYJD.ZYJDJH||','; Ptsxx00 := '12.1 取出同组子医技单'; select * into Vtzyjd0 from YJ_YW0000 where YJDJH0 = ZYJD.ZYJDJH; Ptsxx00 := '12.2 新开同组子医技单'; Vnewyjd := 0; if Vtzyjd0.FJDJBZ = '9' and Vtzyjd0.ZLXMID=Vfjgyxm then --子医技单附加单据标志(YJ_YW0000.FJDJBZ)等于‘9’, 且诊疗项目ID(YJ_YW0000.ZLXMID)等于公用附加项目ID(系统参数XT_FJGYXMID的设定值) for YWJJ in (select * from YJ_YWJJ00 where YJDJH0=Vtzyjd0.YJDJH0 ) loop SP_YJ_YWJJCZ( '2', --Popflag in number , --操作内容 1修改 2增加 3删除 null, --Pid0000 in number , --YJ_YWJJ00.ID0000 Popflag=2时传空 Vfyjdjh, --Pzyjdjh in number , --主医技单据号 Vnewyjd, --Pyjdjh0 in out number , --医技单据号 YWJJ.SFXMID, --Psfxmid in number , --收费项目ID YWJJ.SL0000, --Psl0000 in number , --数量 Pczy000, --Pczy000 in number , --操作员编码 Vtzyjd0.YJKSBH, --Pczyks0 in number , --操作员科室 'N', --Pcommit in varchar2 default 'N' , --是否提交 Pzxcgbz, --Pzxcgbz out number , --执行成功标志 1成功 0失败 Ptsxx00, --Ptsxx00 out varchar2 , --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00, --Pxxxx00 out varchar2 , --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 YWJJ.SFCS00, --Psfcs00 in number default 0 , --收费次数,可以不传 0, --Pbhmxid in number default 0 , --备货明细ID(高值耗材预入库) 0, --Pypnm00 in number default 0 , --耗材内码(高值耗材,无预入库单) null, --Ppctxm0 in varchar2 default null , --批次条形码(高值耗材,无预入库单) 0, --Pbzypnm in number default 0 , --组套耗材内码(高值耗材,无预入库单) Vtzyjd0.YJLRBZ --Pyjlrbz in varchar2 default 'Y' --医技录入标识 Y医技录入 S手术录入 ); if Pzxcgbz = 0 then Ptsxx00 := '('||Vtzyjd0.YJDJH0||')转出住院,新开同组子医技单错误'; raise Ecustom; end if; end loop; else --其它子医技单新开住院医技单 SP_YJ_YJSQWH( 2, --操作内容 1修改 2增加 3删除 Vnewyjd, --操作的医技单据号 --Vzyid00, --挂号id Vtzyjd0.ZYGHID, --原门诊挂号ID '0', --门诊住院标志 Vtzyjd0.ZLXMID, --诊疗项目id null, --子项目id串,如果没有传入参数,表示使用所有明细项 null, --诊断id null, --诊断名称 null, --标本ID null, --特殊病种编号 'N', --医技录入标志 'N', --急诊标志 Vtzyjd0.KDYS00, --开单医生 Vtzyjd0.KDKSBH, --开单科室编号 null, --开单病区 Vtzyjd0.YJKSBH, --医技科室编号 Vtzyjd0.SL0000, --数量 null, --备注 '0', --附加单据标志 Pczy000, --操作员 Pczyks0, --操作员科室 'N', --是否提交 Pzxcgbz, --执行成功标志 1成功 0失败 Ptsxx00, --执行结果提示信息,成功的情况下也可能有警告信息 Pxxxx00 --执行结果详细信息,成功的情况下也可能有警告信息,一般用来显示参数等指标 ); if Pzxcgbz = 0 then Ptsxx00 := '('||Vtzyjd0.YJDJH0||')转出住院,新开同组子医技单错误'; raise Ecustom; end if; end if; --取得门诊开单医生对应的医生组id select nvl(max(a.YSZID0),0) into Vyszid0 from ZS_YSZMX0 a,ZS_YSZ000 b,BM_BMBM00 c where a.YSZID0=b.YSZID0 and b.SSKSBH=c.BMBH00 and c.BMXZ00='0' and a.YSBH00=Vtzyjd0.KDYS00; --将新生成的医技单的YJ_YW0000.HBZYXM栏位写成‘1’, 并将原医技单的FJDJBZ带入新医技单,原门诊医技单的医生组ID带入新医技单 update YJ_YW0000 set HBZYXM='1',FJDJBZ=Vtzyjd0.FJDJBZ,YSZID0=Vyszid0 where YJDJH0=Vnewyjd; --记录新生成的子单与父单的关系 select count(*) into Vcount0 from YJ_YJDJGL where FYJDJH=Vfyjdjh and ZYJDJH=vnewyjd; if Vcount0<=0 then insert into YJ_YJDJGL(FYJDJH,ZYJDJH) values(Vfyjdjh,Vnewyjd); end if; --找出转入住院时生成的医技单据号 begin select XYJDJH into Vzryjdh from ZY_MZZRZY where YJDJH0=Vtzyjd0.YJDJH0; exception when NO_DATA_FOUND then Ptsxx00 := '同组子单未找到转入住院医技单号'; raise Ecustom; end; --记录转出中间表 select count(*) into Vcount0 from ZY_MZZCZY where YJDJH0 = Vzryjdh; if Vcount0>0 then update ZY_MZZCZY set ZCZYZT='1' where YJDJH0 = Vzryjdh; else insert into ZY_MZZCZY(ID0000, YJDJH0, CZY000, CZYXM0, CZYKS0, ZCZYZT, XYJDJH, ZCRQ00, ZCSJ00) values(SQ_ZY_MZZRZY_ID0000.nextval, Vzryjdh, Pczy000, Vzwxm00, Pczyks0, '1', Vnewyjd, Vczrq00, Vczsj00); end if; select SQ_SF_BRJFB0_DJH000.nextval into Vdjh000 from dual; SP_SF_YJDJ00( Vnewyjd, --医技单据号(YJDJH1,YJDJH2,YJDJH3...) Vdjh000, --单据号 Pczyks0, --执行科室 Pczy000, --执行医生 to_char(sysdate,'YYYYMMDD'), --操作日期 to_char(sysdate,'HH24:MI:SS'), --操作时间 Ptsxx00, --存储过程提示的错误信息 Pxxxx00, --系统提示的错误信息 '1', --收费员登记 1是 0否 'Z', '2' --是否预扣标志 0要预扣,不允许为负 1不预扣,不允许为负 2要预扣,允许为负 3不预扣,允许为负 ); if Ptsxx00 is not null then raise Ecustom; end if; --Ptsxx00 := '填写住院费用备注'; --update ZY_FYMX00 set BEIZHU = '门诊转入'||BEIZHU where DJH000 = Vdjh000; --如果是检验, begin select * into Vzlzd00 from BM_ZLZD00 where ZLXMID = Vtzyjd0.ZLXMID; if Vzlzd00.LBBH00 = '4' then Vsql000 := 'update JY_YW0000 set JGZT00=''0'' where YJDJH0 = :v1'; execute immediate Vsql000 using in Vnewyjd; end if; exception when others then Ptsxx00 := '修改检验标志错误'; end; if Vtzyjd0.XMZT00='3' then select XKH000 into Vxkh000 from BM_YGBM00 where YGBH00 = Vtzyjd0.ZXR000; SP_YJ_YWZX00( Vnewyjd, 0, Vzyjd00.ZXSL00, --原单执行数量 2, --大项目执行 Vxkh000, --原单执行人 Vtzyjd0.YJKSBH, --原单医技科室编号 'N' --默认不提交 ); end if; end if; end loop; end if; end loop; if Pcommit = 'Y' then commit; end if; Pzxcgbz := 1; exception when Ecustom then Pzxcgbz := 0; rollback; when no_data_found then Pzxcgbz := 0; --Ptsxx00 := '门诊转住院费用转换失败,请联系管理!'; Ptsxx00 := substrb(Ptsxx00||'-'||sqlerrm||'执行存储过程错误:SP_ZY_MZZCZYCL',1,255); rollback; when others then Pzxcgbz := 0; --Ptsxx00:='门诊转住院费用转换失败,请联系管理!'; Ptsxx00:=substrb(Ptsxx00||'-'||sqlerrm||'执行存储过程错误:SP_ZY_MZZCZYCL',1,255); rollback; end; / show error;