create or replace procedure SP_ZY_MZZRZYCL
(
    Pzyid00    in     number,                     --住院号
    Pczy000    in     number,                     --操作员
    Pczyks0    in     number,                     --操作员科室
    Pyjdjh0    in     varchar2,                   --要转入住院的医技单据号
    Pflag00    in     char,                       --0 转入 1 不转入
    Pcommit    in     varchar2 default 'N' ,      --是否提交
    Pzxcgbz    out    number               ,      --执行成功标志 1成功 0失败
    Ptsxx00    out    varchar2             ,      --执行结果提示信息，成功的情况下也可能有警告信息
    Pxxxx00    out    varchar2             ,      --执行结果详细信息，成功的情况下也可能有警告信息，一般用来显示参数等指标
    Pbrid00    in     number default 0            --病人id
)
-- MODIFICATION HISTORY
--Person       Date        Comment
--liwm         2019.08.28  create by ZYSF9-20190824-001
--liwm         2019.09.02  门诊转入住院收费调整，要求这些门诊费用转入住院时，允许欠费，不需要强制病人交纳预交金。   by ZYSF9-20190902-001
--liwm         2019.09.05  转入住院的费用beizhu栏添加门诊转入字样 ZYSF9-20190831-002
--liwm         2019.09.05  添加同组的处理  ZYSF9-20190904-004
--liwm         2019.09.20  检验新转入的检验单，自动转为已报告状态 ZYSF9-20190923-001
--linzt        2019.12.24  删除主单新开后自动带出的子单，重新从原单生成子单，避免沙县检验报告会被删除的问题 ZYSF9-20190903-001
--liwm         2020.01.03  解决沙县发现的附加项目未找到收费信息问题 ZYSF9-20200103-003
--linzt        2020.01.09  修改门诊转入住院新生成医技单的YJ_YW0000.HBZYXM为'2'   ZYSF9-20200102-001
--liwm         2020.01.10  门诊费用转入住院，沙县检查报告会被删除的问题，HBZYBZ的修改要在医技单冲销之前修改，否则触发器无法获得修改后的HBZYBZ值。ZYSF9-20200110-002
--liwm         2020.01.14  门诊医技单如果状态为已执行，转入后也要变为执行状态，执行人和执行科室同原单一致 ZYSF9-20200113-004
--linzt        2020.02.03  添加新生成的住院医技单号，将转入前后的医技单号做关联     ZYSF9-20200203-004
--linzt        2020.02.06  同时处理多个医技单   ZYSF9-20200113-001
--linzt        2020.02.19  修正处理多个医技单对应一个医技单无法转入问题  ZYSF9-20200219-001
--linzt        2020.02.25  处理原医技单附加单据标志(YJ_YW0000.FJDJBZ)带入新医技单 ZYSF9-20200219-003
--linzt        2020.03.11  处理原医技单开单医生对应的医生组ID带入新医技单   ZYSF9-20200224-002
--linzt        2020.04.16  修改医技单冲销失败提示信息  ZYSF9-20200415-004
--linzetao     2020.04.27  处理检验医技单报告已打印在参数JY_JSBBSFYXCX未启用时无法转入住院问题   ZYSF9-20200320-001
--jiangjh      2023.06.27  SP_YJ_YWCX 冲销备注传入 门诊转住院 执行科室与操作员科室不一致验证调过
--nicl         2023.07.07  添加入参病人id,可以转住院的病人id与门诊的病人id不同的病人
--nicl         2023.09.28  修改执行过程SP_YJ_YJSQWH后，更新开单医师组和开单病区  YJ13H-20230926-001
--chenrh       2023.10.26  新开住院医技单,增加预住院标识  ZYSF13H-20231026-001
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   ZY_BRFY00.DJH000%type;        --收费单据号
    Vyjdjh0   YJ_YW0000.YJDJH0%type;        --医技单据号
    Vnewyjd   YJ_YW0000.YJDJH0%type;        --转入住院新开的医技单号
    Vfyjdjh   YJ_YJDJGL.FYJDJH%type;        --新父医技单据号
    Vnewzd0   YJ_YW0000.YJDJH0%type;        --子医技单
    Vcxyjd0   YJ_YW0000%rowtype;            --要退的主单，考虑不用游标
    Vzyjd00   YJ_YW0000%rowtype;            --同组子医技单
    Vzyjdjh   YJ_YJDJGL%rowtype;            --新生成的子医技单号
    Vyszid0   YJ_YW0000.YSZID0%type;        --医生组ID
    Vsql000    varchar2(100);
    Vzlzd00   BM_ZLZD00%rowtype;
    Vxkh000   BM_YGBM00.XKH000%type;        --胸卡号
    Vdjgyjd   number;
    Vjyzt00   JY_YW0000.JGZT00%type;        --医技单检验状态
    Vkdysz0   YJ_YW0000.KDYSZ0%type;        --开单医师组
    Vkdbq00   YJ_YW0000.KDBQ00%type;        --开单病区
    Vtcnwbz   YJ_YW0000.TCNWBZ%type;        --套餐内外标识，扩展  9：预住院
    VZYSF_YZYXMSFZDZRZYFY char(1);           --预住院项目是否自动转入住院费用 0 否  1 是  默认 0 河北大学附属医院为1  ZYSF13H-20230822-001

    cursor CUR_YJ_TZDJH0 is          --同组医技单
        select ZYJDJH from YJ_YJDJGL a where a.FYJDJH=Vyjdjh0
           --and not exists(select 1 from YJ_YJDJGL where ZYJDJH=a.ZYJDJH and FYJDJH<>a.FYJDJH)
           and not exists(select 1 from ZY_MZZRZY where YJDJH0=a.ZYJDJH)
           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;
    cursor CUR_YJ_CFYJD0 is          --拆分传入的医技单号
        select REGEXP_SUBSTR(Pyjdjh0,'[^,]+',1,rownum) yjdjh0 from dual
           connect by rownum<=length(Pyjdjh0) - length(regexp_replace(Pyjdjh0,',',''))+1;
begin
    Pzxcgbz := 0;
    Vczrq00 := to_char(sysdate,'YYYYMMDD');
    Vczsj00 := to_char(sysdate,'HH24:MI:SS');
    Vcount0:=0;

    if Pyjdjh0 is null then
        Ptsxx00 := '[传入的医技单据号不能为空]';
        raise Ecustom;
    end if;


    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;
    if nvl(Pbrid00,0) > 0 then
       Vbrid00 := Pbrid00;
    end if;

    Ptsxx00 := '[开始循环执行YJ_YW0000处理]';

    --Vyjdjh0 := Pyjdjh0;
    for ALLYJD in CUR_YJ_CFYJD0 loop
      Vyjdjh0 := ALLYJD.YJDJH0;
      if Pflag00='0' then  --确认转入


        Ptsxx00 := '1.门诊转的标志位修改，避免沙县检验报告会被删除的问题('||Vyjdjh0||')';
        update YJ_YW0000 set HBZYXM = '1' where YJDJH0 = Vyjdjh0;
        --临时变更检验状态为'Z'
        begin
            select JGZT00 into Vjyzt00 from JY_YW0000 where YJDJH0=Vyjdjh0;
            update JY_YW0000 set JGZT00='Z' where YJDJH0=Vyjdjh0;
        exception
          when others then
            Vjyzt00 := '*';
        end;
        --未退的医技单做冲销
        select count(*) into Vcount0 from YJ_YW0000  where BRID00=Vbrid00 and CXDJH0 = Vyjdjh0 and XMZT00 not in('6','7');
        if Vcount0 <= 0 then
            Ptsxx00 := '冲销医技单('||Vyjdjh0||')错误！';
            SP_YJ_YWCX(Vyjdjh0, Pczy000, Pczyks0, 'N', 'N', null, 'N' ,'N', '0', '门诊转住院');
        end if;
        --冲销后恢复检验状态
        if Vjyzt00 <> '*' then
          update JY_YW0000 set JGZT00=Vjyzt00 where YJDJH0=Vyjdjh0;
        end if;
        --这里Vzyjd00还是主医技单
        select * into Vzyjd00 from YJ_YW0000 where YJDJH0 = Vyjdjh0;

        Ptsxx00 := '2.找对应的负单做费用更正('||Vyjdjh0||')';
        select * into Vcxyjd0 from YJ_YW0000 where ZYGHID = Vzyjd00.ZYGHID and MZZYBZ = '0' and CXDJH0 = Vzyjd00.YJDJH0;
        if Vcxyjd0.SFDJH0 >0 then
            Ptsxx00 := '该医技单('||Vyjdjh0||')已经被退费，不能转入！';
            raise Ecustom;
        end if;

        Ptsxx00 := '3.冲销完费用更正('||Vyjdjh0||')';
        select SQ_SF_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 := '旧医技单('||Vyjdjh0||')费用更正错误！';
            raise Ecustom;
        end if;

        Vnewyjd := 0;
        Ptsxx00 := '4.新开住院医技单('||Vyjdjh0||')';
        SP_YJ_YJSQWH(
            2,                   --操作内容 1修改 2增加 3删除
            Vnewyjd,             --操作的医技单据号
            Vzyid00,             --挂号id
            '1',                 --门诊住院标志
            Vzyjd00.ZLXMID,      --诊疗项目id
            null,                --子项目id串,如果没有传入参数，表示使用所有明细项
            null,                --诊断id
            null,                --诊断名称
            null,                --标本ID
            null,                --特殊病种编号
            'N',                 --医技录入标志
            'N',                 --急诊标志
            Vzyjd00.KDYS00,      --开单医生
            Vzyjd00.KDKSBH,      --开单科室编号
            null,                --开单病区
            Vzyjd00.YJKSBH,      --医技科室编号
            Vzyjd00.SL0000,      --数量
            '门诊转住院',        --备注
            '0',                 --附加单据标志
            Pczy000,             --操作员
            Pczyks0,             --操作员科室
            'N',                 --是否提交
            Pzxcgbz,             --执行成功标志 1成功 0失败
            Ptsxx00,             --执行结果提示信息，成功的情况下也可能有警告信息
            Pxxxx00              --执行结果详细信息，成功的情况下也可能有警告信息，一般用来显示参数等指标
        );
        if Pzxcgbz = 0 then
            Ptsxx00 := '('||Vyjdjh0||')转入住院,新开医技单错误！';
            raise Ecustom;
        end if;
   
        begin
             --预住院项目是否自动转入住院费用 0 否  1 是  默认 0 河北大学附属医院为1
           select substrb(trim(VALUE0),1,10) into VZYSF_YZYXMSFZDZRZYFY from XT_XTCS00 where name00 in ('ZYSF_YZYXMSFZDZRZYFY');
        exception
           when no_data_found then
             VZYSF_YZYXMSFZDZRZYFY:='0';
        end;
        if VZYSF_YZYXMSFZDZRZYFY='1' then
            select TCNWBZ into Vtcnwbz from YJ_YW0000 where YJDJH0=Pyjdjh0;
            update YJ_YW0000 set TCNWBZ = Vtcnwbz where YJDJH0=Vnewyjd;
        end if;
        --开单医师组:开单医生的默认医师组（若无默认医师组则取医生所属的第一个医师组，再无则取空）
        select SXYSZ0 into Vkdysz0 from BM_YGBM00 where YGBH00 = Vzyjd00.KDYS00;
        if nvl(Vkdysz0,0) = 0 then
          begin
            select a.YSZID0 into Vkdysz0 from ZS_YSZMX0 A, ZS_YSZ000 B
             where A.YSZID0 = B.YSZID0 and B.YSZZT0 <> '3' and A.YSBH00 = Vzyjd00.KDYS00 and ROWNUM = 1;
          exception
            when others then
              Vkdysz0 := null;
          end;
        end if;
        --开单病区：开单医师组的所属病区
        Vkdbq00 := null;
        if nvl(Vkdysz0,0) > 0 then
          begin
            select SSBQ00 into Vkdbq00 from ZS_YSZ000 where YSZID0 = Vkdysz0;
          exception
            when others then
              Vkdbq00 := null;
          end;
        end if;
        
        update YJ_YW0000 set KDYSZ0 = Vkdysz0,KDBQ00 = Vkdbq00 where YJDJH0=Vnewyjd;
        

        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=Vzyjd00.KDYS00;

        --新生成的医技单YJ_YW0000.HBZYXM写‘2’且将原单据的FJDJBZ栏位带入新单据,原医技单的医生组ID带入新医技单
        Ptsxx00 := '5.将新生成的医技单的YJ_YW0000.HBZYXM栏位写成‘2’('||Vyjdjh0||')';
        update YJ_YW0000 set HBZYXM='2',FJDJBZ=Vzyjd00.FJDJBZ,YSZID0=Vyszid0 where YJDJH0=Vnewyjd;

        Ptsxx00 := '6.删除新医技单号对应的子单('||Vyjdjh0||')';
        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,                --附加单据标志
              Pczy000,             --操作员
              Pczyks0,             --操作员科室
              'N',                 --是否提交
              Pzxcgbz,             --执行成功标志 1成功 0失败
              Ptsxx00,             --执行结果提示信息，成功的情况下也可能有警告信息
              Pxxxx00              --执行结果详细信息，成功的情况下也可能有警告信息，一般用来显示参数等指标
          );
          if Pzxcgbz=0 then
            Ptsxx00 := '删除子医技单('||Vzyjdjh.ZYJDJH||')错误！';
          end if;
        end loop;

        Ptsxx00 := '7.新开单扣费('||Vyjdjh0||')';
        select SQ_ZY_BRJFB0_DJH000.nextval into Vdjh000 from dual;
        SP_ZY_YJDJ00(
           Vnewyjd,      --医技单据号(YJDJH1,YJDJH2,YJDJH3...)
           Vdjh000,      --单据号
           Pczyks0,      --执行科室
           Pczy000,      --执行医生
           to_char(sysdate,'YYYYMMDD'),     --操作日期
           to_char(sysdate,'HH24:MI:SS'),   --操作时间
           Ptsxx00,   --存储过程提示的错误信息
           Pxxxx00,   --系统提示的错误信息
           '1',       --收费员登记 1是 0否
           'Z',
           '0',
           '2'        --是否预扣标志  0要预扣,不允许为负 1不预扣,不允许为负 2要预扣,允许为负 3不预扣,允许为负
        );

        if Ptsxx00 is not null then
            raise Ecustom;
        end if;

        Ptsxx00 := '填写住院费用备注('||Vyjdjh0||')';
        update ZY_FYMX00 set BEIZHU = '门诊转入'||BEIZHU where DJH000 = Vdjh000;

        Ptsxx00 := '9.如果原单('||Vyjdjh0||')是已执行状态，转入后也要是已执行状态';
        select XKH000 into Vxkh000 from BM_YGBM00 where YGBH00 = Vzyjd00.ZXR000;
        if Vzyjd00.XMZT00='3' then
          Ptsxx00 := '执行医技单('||Vnewyjd||')！';
          SP_YJ_YWZX00(
            Vnewyjd,
            0,
            Vzyjd00.ZXSL00,  --原单执行数量
            2,               --大项目执行
            Vxkh000,         --原单执行人胸卡号
            Vzyjd00.YJKSBH,  --原单医技科室编号
            'N'              --默认不提交
          );
        end if;

        Ptsxx00 := '10.如果是检验，标志位修改('||Vyjdjh0||')';
        begin
            select * into Vzlzd00 from BM_ZLZD00 where ZLXMID = Vzyjd00.ZLXMID;
            if Vzlzd00.LBBH00 = '4' then

                Vsql000 := 'update JY_YW0000 set JGZT00=''8'' where YJDJH0 = :v1';
                execute immediate Vsql000 using in Vnewyjd;
            end if;
        exception
            when others then
              Ptsxx00 := '修改检验标志错误('||Vyjdjh0||')！';
        end;

        Ptsxx00 := '11.中间表写入('||Vyjdjh0||')';
        select count(*) into Vcount0 from  ZY_MZZRZY where YJDJH0 = Vyjdjh0;
        if Vcount0>0 then
            update ZY_MZZRZY set ZRZYZT='1' where YJDJH0 = Vyjdjh0;
        else
            insert into ZY_MZZRZY(ID0000, YJDJH0, CZY000, CZYXM0, CZYKS0, ZRZYZT, XYJDJH, ZRRQ00, ZRSJ00)
              values(SQ_ZY_MZZRZY_ID0000.nextval, Vyjdjh0, Pczy000, Vzwxm00, Pczyks0, '1', Vnewyjd, Vczrq00, Vczsj00);
        end if;

      elsif  Pflag00='1' then
        --中间表写入
        select count(*) into Vcount0 from  ZY_MZZRZY where YJDJH0 = Vyjdjh0;
        if Vcount0>0 then
            update ZY_MZZRZY set ZRZYZT='2' where YJDJH0 = Vyjdjh0;
        else
            insert into ZY_MZZRZY(ID0000, YJDJH0, CZY000, CZYXM0, CZYKS0, ZRZYZT, ZRRQ00, ZRSJ00)
              values(SQ_ZY_MZZRZY_ID0000.nextval, Vyjdjh0, Pczy000, Vzwxm00, Pczyks0, '2', Vczrq00, Vczsj00);
        end if;
      end if;

      Ptsxx00 := '12.子单处理('||Vyjdjh0||')';
      for ZYJD in  CUR_YJ_TZDJH0 loop
        select * into Vzyjd00 from YJ_YW0000 where YJDJH0 = ZYJD.ZYJDJH;
        if Pflag00='0' then
          select count(*) into Vcount0 from YJ_YW0000 where BRID00 = Vbrid00 and CXDJH0 = Vzyjd00.YJDJH0 and XMZT00 not in('6','7');
          if Vcount0 > 0 then --有冲销的子单才做处理
            select * into Vcxyjd0 from YJ_YW0000 where ZYGHID = Vzyjd00.ZYGHID and MZZYBZ = '0' and CXDJH0 = Vzyjd00.YJDJH0;
            select SQ_SF_BRJFB0_DJH000.nextval into Vdjh000 from dual;
            if  Vcxyjd0.SFDJH0 <=0 or Vcxyjd0.SFDJH0 is null then
                --门诊转的标志位修改，避免沙县检验报告会被删除的问题
                update YJ_YW0000 set HBZYXM = '1' where YJDJH0 = Vzyjd00.YJDJH0;

                SP_YJ_YWJJGZ(
                  Vcxyjd0.YJDJH0,
                  null,             --负记录计价ID
                  Vdjh000,          --单据号
                  1,                --收费员登记 1是 0否
                  Pczy000,          --操作员编码
                  Pczyks0,          --操作员科室
                  'N',              --是否提交
                  Pzxcgbz,          --执行成功标志 1成功 0失败
                  Ptsxx00,          --执行结果提示信息，成功的情况下也可能有警告信息
                  Pxxxx00           --执行结果详细信息，成功的情况下也可能有警告信息，一般用来显示参数等指标
                );
                if Pzxcgbz = 0 then
                    Ptsxx00 := '旧医技单('||Vzyjd00.YJDJH0||')费用更正错误！';
                    raise Ecustom;
                end if;

                if Vzyjd00.FJDJBZ='9' then
                  Vnewzd0 := 0;
                  for YWJJ in (select * from YJ_YWJJ00 where YJDJH0=ZYJD.ZYJDJH ) loop
                      SP_YJ_YWJJCZ(
                        '2',                 --Popflag  in     number                     ,             --操作内容 1修改 2增加 3删除
                        null,                --Pid0000  in     number                     ,             --YJ_YWJJ00.ID0000 Popflag=2时传空
                        Vnewyjd,             --Pzyjdjh  in     number                     ,             --主医技单据号
                        Vnewzd0,             --Pyjdjh0  in out number                     ,             --医技单据号
                        YWJJ.SFXMID,         --Psfxmid  in     number                     ,             --收费项目ID
                        YWJJ.SL0000,         --Psl0000  in     number                     ,             --数量
                        Pczy000,             --Pczy000  in     number                     ,             --操作员编码
                        Vzyjd00.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        ,             --组套耗材内码(高值耗材,无预入库单)
                        Vzyjd00.yjlrbz       --Pyjlrbz  in     varchar2  default 'Y'                    --医技录入标识 Y医技录入 S手术录入
                      );
                      if Pzxcgbz = 0 then
                          Ptsxx00 := '('||Vzyjd00.YJDJH0||')转入住院,新开子医技单错误！';
                          raise Ecustom;
                      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=Vzyjd00.KDYS00;

                      --将新生成的医技单的YJ_YW0000.HBZYXM栏位写成‘2’, 并将原医技单的FJDJBZ带入新医技单, 原医技单开单医生对应的医生组ID带入新医技单
                      update YJ_YW0000 set HBZYXM='2',FJDJBZ=Vzyjd00.FJDJBZ,YSZID0=Vyszid0 where YJDJH0=Vnewzd0;
                  end loop;
                  Vnewyjd := Vnewzd0;
                else
                  Vnewyjd := 0;
                  
                  --新开住院医技单
                  SP_YJ_YJSQWH(
                      2,                   --操作内容 1修改 2增加 3删除
                      Vnewyjd,             --操作的医技单据号
                      Vzyid00,             --挂号id
                      '1',                 --门诊住院标志
                      Vzyjd00.ZLXMID,      --诊疗项目id
                      null,                --子项目id串,如果没有传入参数，表示使用所有明细项
                      null,                --诊断id
                      null,                --诊断名称
                      null,                --标本ID
                      null,                --特殊病种编号
                      'N',                 --医技录入标志
                      'N',                 --急诊标志
                      Vzyjd00.KDYS00,      --开单医生
                      Vzyjd00.KDKSBH,      --开单科室编号
                      null,                --开单病区
                      Vzyjd00.YJKSBH,      --医技科室编号
                      Vzyjd00.SL0000,      --数量
                      '门诊转住院',        --备注
                      '0',                 --附加单据标志
                      Pczy000,             --操作员
                      Pczyks0,             --操作员科室
                      'N',                 --是否提交
                      Pzxcgbz,             --执行成功标志 1成功 0失败
                      Ptsxx00,             --执行结果提示信息，成功的情况下也可能有警告信息
                      Pxxxx00              --执行结果详细信息，成功的情况下也可能有警告信息，一般用来显示参数等指标
                  );
                  if Pzxcgbz = 0 then
                      Ptsxx00 := '('||Vzyjd00.YJDJH0||')转入住院,新开医技单错误！';
                      raise Ecustom;
                  end if;
                  --开单医师组:开单医生的默认医师组（若无默认医师组则取医生所属的第一个医师组，再无则取空）
                  select SXYSZ0 into Vkdysz0 from BM_YGBM00 where YGBH00 = Vzyjd00.KDYS00;
                  if nvl(Vkdysz0,0) = 0 then
                    begin
                      select a.YSZID0 into Vkdysz0 from ZS_YSZMX0 A, ZS_YSZ000 B
                       where A.YSZID0 = B.YSZID0 and B.YSZZT0 <> '3' and A.YSBH00 = Vzyjd00.KDYS00 and ROWNUM = 1;
                    exception
                      when others then
                        Vkdysz0 := null;
                    end;
                  end if;
                  --开单病区：开单医师组的所属病区
                  Vkdbq00 := null;
                  if nvl(Vkdysz0,0) > 0 then
                    begin
                      select SSBQ00 into Vkdbq00 from ZS_YSZ000 where YSZID0 = Vkdysz0;
                    exception
                      when others then
                        Vkdbq00 := null;
                    end;
                  end if;
                  
                  update YJ_YW0000 set KDYSZ0 = Vkdysz0,KDBQ00 = Vkdbq00 where YJDJH0=Vnewyjd;

                  --将新生成的医技单的YJ_YW0000.HBZYXM栏位写成‘2’, 并将原医技单的FJDJBZ带入新医技单, 原医技单开单医生对应的医生组ID带入新医技单
                  update YJ_YW0000 set HBZYXM='2',FJDJBZ=Vzyjd00.FJDJBZ,YSZID0=Vyszid0 where YJDJH0=Vnewyjd;
                end if;

                select count(*) into Vcount0 from  ZY_MZZRZY where YJDJH0 = Vzyjd00.YJDJH0;
                if Vcount0>0 then
                    update ZY_MZZRZY set ZRZYZT='1' where YJDJH0 = Vzyjd00.YJDJH0;
                else
                    insert into ZY_MZZRZY(ID0000, YJDJH0, CZY000, CZYXM0, CZYKS0, ZRZYZT, XYJDJH, ZRRQ00, ZRSJ00)
                      values(SQ_ZY_MZZRZY_ID0000.nextval, Vzyjd00.YJDJH0, Pczy000, Vzwxm00, Pczyks0, '1', Vnewyjd, Vczrq00, Vczsj00);
                end if;

                --记录新生成的子单与父单的关系
                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;

                select SQ_ZY_BRJFB0_DJH000.nextval into Vdjh000 from dual;

                SP_ZY_YJDJ00(
                   Vnewyjd,        --医技单据号(YJDJH1,YJDJH2,YJDJH3...)
                   Vdjh000,        --单据号
                   Pczyks0,        --执行科室
                   Pczy000,        --执行医生
                   to_char(sysdate,'YYYYMMDD'),     --操作日期
                   to_char(sysdate,'HH24:MI:SS'),   --操作时间
                   Ptsxx00,        --存储过程提示的错误信息
                   Pxxxx00,        --系统提示的错误信息
                   '1',            --收费员登记 1是 0否
                   'Z',
                   '0',
                   '2'             --是否预扣标志  0要预扣,不允许为负 1不预扣,不允许为负 2要预扣,允许为负 3不预扣,允许为负
                );

                if Ptsxx00 is not null then
                    raise Ecustom;
                end if;

                Ptsxx00 := '填写住院费用备注('||Vzyjd00.YJDJH0||')';
                update ZY_FYMX00 set BEIZHU = '门诊转入'||BEIZHU where DJH000 = Vdjh000;

                --如果是检验，
                begin
                    select * into Vzlzd00 from BM_ZLZD00 where ZLXMID = Vzyjd00.ZLXMID;
                    if Vzlzd00.LBBH00 = '4' then
                      Vsql000 := 'update JY_YW0000 set JGZT00=''8'' where YJDJH0 = :v1';
                        execute immediate Vsql000 using in Vnewyjd;
                    end if;
                exception
                    when others then
                      Ptsxx00 := '修改检验标志错误('||Vzyjd00.YJDJH0||')！';
                end;

                if Vzyjd00.XMZT00='3' then
                  select XKH000 into Vxkh000 from BM_YGBM00 where YGBH00 = Vzyjd00.ZXR000;
                  SP_YJ_YWZX00(
                    Vnewyjd,
                    0,
                    Vzyjd00.ZXSL00,  --原单执行数量
                    2,               --大项目执行
                    Vxkh000,         --原单执行人
                    Vzyjd00.YJKSBH,  --原单医技科室编号
                    'N'              --默认不提交
                  );
                end if;

            end if;
          end if;
        end if;
        if Pflag00='1' then
          --子单中间表写入
          select count(*) into Vcount0 from  ZY_MZZRZY where YJDJH0 = Vzyjd00.YJDJH0;
          if Vcount0>0 then
            update ZY_MZZRZY set ZRZYZT='2' where YJDJH0 = Vzyjd00.YJDJH0;
          else
            insert into ZY_MZZRZY(ID0000, YJDJH0, CZY000, CZYXM0, CZYKS0, ZRZYZT, ZRRQ00, ZRSJ00)
              values(SQ_ZY_MZZRZY_ID0000.nextval, Vzyjd00.YJDJH0, Pczy000, Vzwxm00, Pczyks0, '2', Vczrq00, Vczsj00);
          end if;
        end if;
      end loop;
    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_MZZRZYCL',1,255);
        --raise_application_error(-20010, substrb(Ptsxx00||'！*'||nvl(sqlerrm, '原因不明出错！'),1,250));
        rollback;
    when others then
        Pzxcgbz := 0;
        --Ptsxx00:='门诊转住院费用转换失败,请联系管理！';
        Ptsxx00:=substrb(Ptsxx00||'-'||sqlerrm||'执行存储过程错误:SP_ZY_MZZRZYCL',1,255);
        --raise_application_error(-20020, substrb(Ptsxx00||'！*'||nvl(sqlerrm, '原因不明出错！'),1,100));
        rollback;
end;
