create or replace procedure SP_ZS_SCCYDY
(
    p_yzid00  in  number,--医嘱ID
    p_qyrq00  in  char,--起用日期
    p_qysj00  in  char,--起用时间
    p_pxsj00  in  char,--排序时间
    p_lrrxm0  in  char,--录入人姓名
    p_zyh000  in  ZY_BRXXB0.ZYH000%type,--住院号
    V_ERROR0  out number,--是否库存不足：0：没有错误，1：某些药品库存不足，2：其他错误
    V_KCBZYP  out varchar2, --库存不足的药品信息给出提示。
    p_czy000  in  number default 0,      --操作员
    p_zqs000  in  number, --周期数
    p_kdksbh  in  number, --开单科室编号
    p_yyrq00  in  char--用药日期
)AS
-- MODIFICATION HISTORY
-- Person      Date        Comments
-- YANGY      2008.06.24   医嘱复制没有复制bq_ypyzmx表的dmbz00字段的值
-- chenqw     2009.01.07   复制的医嘱应默认为现在的药房
-- chenqw     2009.04.13   要求不同病人间的医嘱也能复制
-- yangy      2009.04.24   医嘱复制可以不考虑库存下限。 --有参数控制
-- csf        2009.12.30   增加单个药品默认药房的处理
-- xuxm       2014.06.25   医嘱界面，选择医嘱右键“生成出院带药”报错 for DZBL-20140619-002  
-- 阮炳辉     2014.12.11   重命名调用的过程和视图(加_ZYDZBL) DZBL-20141210-007
-- wuzy       2018.06.05   过程加上日志 SP_TransLog for ZYDZBL-20180531-002
-- caishb     2020.02.03   中药生成出院带药医嘱的天数为输入的天数，贴数、代煎数和煎药方式同原医嘱 for ZYDZBL-20191231-004。
-- caishb     2020.05.21   中药生成出院带药医嘱的天数、贴数、代煎等于输入的天数 for ZYDZBL-20200520-002。
-- zouqc      2020.05.26   增加ZS_CYDYXYYFBMBH参数值是否属于本院科室判断的判断 for  ZYDZBL-20200526-002
-- zouqc      2020.06.08   v_jycs00赋默认值0 for    ZYDZBL-20200607-001
    v_zyid00 ZY_BRXXB0.ZYID00%type;--住院ID
    v_yplbbh BQ_YPYZ00.YPLBBH%type;--药品类别编号
    v_bqh000 BQ_YPYZ00.BQH000%type;--病区号
    v_ksh000 BQ_YPYZ00.KSH000%type;--科室号
    v_yzid00 BQ_YPYZ00.YZID00%type;--医嘱ID
    v_yfbmbh XT_YPFWFX.YFBMBH%type; --领药药房
    v_Count1 number;--记数器1
    v_Count2 number;--记数器2
    v_count3  number;--记数器3
    v_count4 number;--记数器4
    v_yfbmbh3 XT_YPFWFX.YFBMBH%type;--领药药房
    v_yzfzkcxx char(1); --药品医嘱复制是否考虑库存下限  Y:是 N:否 默认为：Y
   -- E_YPYZFZ_YPKC Exception;--药品医嘱复制药品库存低于下限
    v_qzfs00 char;--取整方式
    v_zqcs00 number;--周期次数
    CURSOR CUR_ZS_YPYZMX IS
    select a.*
    from  BQ_YPYZMX a,
          VW_BQ_YFYPSC_ZYDZBL b,
         -- XT_YPFWFX c
         YF_YPKCXX c
    where a.YZID00 = p_yzid00
      and a.YPNM00 = b.YPNM00--药品内码
      --and c.YPLBBH = v_yplbbh--药品类别
      --and c.SLBMBH = v_bqh000--申请病区
      --and c.MRBZ00 = 'Y'     --默认药房
      and c.YPNM00 = a.YPNM00--药品内码
      and c.YFBMBH = b.YFBMBH --药房部门
      and c.YFBMBH=v_yfbmbh
      and ((v_yzfzkcxx='N' and b.SJKCSL > 0) or (v_yzfzkcxx='Y' and b.KCSL00 > 0));      --库存高于下限

    CURSOR CUR_ZS_KCBZYP IS
    SELECT X.YPNM00 YPNM00,Y.YPMC00 YPMC00
    FROM BQ_YPYZMX X, BM_YD0000 Y
    WHERE X.YZID00 = p_yzid00 AND X.YPNM00=Y.YPNM00
    AND X.YPNM00 NOT IN
    (select a.YPNM00
    from  BQ_YPYZMX a,
          VW_BQ_YFYPSC_ZYDZBL b
    where a.YZID00 = p_yzid00
      and a.YPNM00 = b.YPNM00--药品内码
      and b.YFBMBH = v_yfbmbh--药房部门
      and ((v_yzfzkcxx='N' and b.SJKCSL > 0) or (v_yzfzkcxx='Y' and b.KCSL00 > 0))      --库存高于下限
      );
      v_yysj00 BQ_YPYZ00.YYSJ00%type; --用药时间
      v_ZS_CYDYXYYFBMBH varchar2(100);--出院带药西药药房部门编号
      v_zqcyts BQ_YPYZ00.ZQCYTS%type; --草药贴数
      v_jycs00 bq_ypyz00.jycs00%type;
begin
    SP_TRANSLOG(sysdate,'SP_ZS_SCCYDY',p_czy000,0,
            'SP_ZS_SCCYDY:p_yzid00:'||To_Char(p_yzid00)||'p_qyrq00:'||p_qyrq00
            ||'p_qysj00:'||p_qysj00||'p_pxsj00:'||p_pxsj00||'p_lrrxm0:'||p_lrrxm0);
    V_ERROR0:=0;
    V_KCBZYP:='';
    v_jycs00:=0;
    --取住院ID
    SELECT NVL(MAX(TRIM(VALUE0)),'Y') INTO v_yzfzkcxx FROM XT_XTCS00 WHERE NAME00='ZS_YZFZKLKCXX';
    select max(ZYID00) into v_zyid00 from ZY_BRXXB0 where ZYH000 = p_zyh000;
    select YPLBBH,ZQCYTS into v_yplbbh,v_zqcyts from BQ_YPYZ00 where YZID00 = p_yzid00;
    if v_yplbbh='2' then
       select YPLBBH,p_zqs000,jycs00 into v_yplbbh,v_zqcyts,v_jycs00 from BQ_YPYZ00 where YZID00 = p_yzid00;
        if v_jycs00>0 then
           v_jycs00:=v_zqcyts;
         end if;
      end if;
    --取病人当前科室、当前病区
    select DQBQ00,DQKS00 into v_bqh000,v_ksh000 from ZY_BRXXB0 where ZYID00 = v_zyid00;
    --取默认药房
    begin
            select YFBMBH into v_yfbmbh from XT_YPFWFX
              where SLBMBH = v_bqh000
              and YPLBBH = v_yplbbh
              and MRBZ00 = 'Y'
              and ROWNUM = 1;
        exception
            when No_Data_Found then
                v_yfbmbh := 0;
    end;
    select NVL(MAX(TRIM(VALUE0)),'0') into v_ZS_CYDYXYYFBMBH from xt_xtcs00 where name00='ZS_CYDYXYYFBMBH';
    select count(1) into v_count4 from BM_BMBM00 where BMBH00=v_ZS_CYDYXYYFBMBH; 
    if v_yplbbh = 0 and v_ZS_CYDYXYYFBMBH <>'0' and v_count4>0 then
      --出院带药西药药房部门编号
      v_yfbmbh:=v_ZS_CYDYXYYFBMBH;
    end if;
    --判断药品库存是否高于下限的条数
    select Count(1) into v_Count1
    from  BQ_YPYZMX a,
          VW_BQ_YFYPSC_ZYDZBL b
    where a.YZID00 = p_yzid00
      and a.YPNM00 = b.YPNM00--药品内码?
      and b.YFBMBH = v_yfbmbh--药房部门
      and ((v_yzfzkcxx='N' and b.SJKCSL > 0) or (v_yzfzkcxx='Y' and b.KCSL00 > 0));      --库存高于下限
    select Count(1) into v_Count2 from BQ_YPYZMX where YZID00 = p_yzid00;
    --比较条数
    if v_Count1 < v_Count2 then
        V_ERROR0:=1;
    end if;
  --按单个药品判断，库存足够药品数目最多的药房
    if  v_Count1 < v_Count2 then
      --判断药品库存是否高于下限的条数
      begin
        select * into v_yfbmbh3,v_count3 from (
          select YFBMBH,max(count1) count1 from (
            select c.YFBMBH,count(*)  count1
              from  BQ_YPYZMX a,
                VW_BQ_YFYPSC_ZYDZBL b,
                YF_YPKCXX c
            where a.YZID00 = p_yzid00
              and a.YPNM00 = b.YPNM00--药品内码
              and b.YFBMBH = c.YFBMBH--药房部门编号
              and b.YPNM00=c.YPNM00
              and c.BQKDYF='Y'
             -- and b.KCSL00 > 0  --库存高于下限
              and ((v_yzfzkcxx='N' and b.SJKCSL > 0) or (v_yzfzkcxx='Y' and b.KCSL00 > 0))     --库存高于下限
            group by c.YFBMBH)
          group by yfbmbh )
        where rownum=1;
      exception
        when others then
          v_yfbmbh3:=0;
      end;
    end if;
    if v_yfbmbh3>0 then
      v_yfbmbh:=v_yfbmbh3;
      v_count1:=v_count3;
      --比较条数
      if v_Count1 < v_Count2 then
          V_ERROR0:=1;
      end if;
    end if;
    --取医嘱ID
   if v_Count1>0 then
    select SQ_BQ_YZMX00_YZMXID.NextVal into v_yzid00 FROM DUAL WHERE ROWNUM=1;
    --用药时间yysj00,如果用药日期(yyrq00)是当天取起用时间(qysj00),否则取00:00:00
        if p_yyrq00 = p_qyrq00 then
          v_yysj00 := p_qysj00;
        elsif p_yyrq00 > p_qyrq00 then
          v_yysj00 := '00:00:00';
        end if;
    --插入药品医嘱主表
   insert into BQ_YPYZ00(
                         YZID00,--NUMBER(12)  , --ID号，序列号(分组号)
                         ZYID00,--NUMBER(10)  , --住院ID
                         YEXM00,--CHAR(10)    , --婴儿姓名
                         YPLBBH,--CHAR(1)     , --药品大类编号‘0’西药‘1’成药‘2’草药
                         DMBZ00,--CHAR(1)     , --'0'正常 '1'毒麻神经
                         CLBZ00,--CHAR(1)     , --长期/临时标志'0'-临时，'1'-长期
                         PXSJ00,--CHAR(8)     , --排序时间(医嘱根据启用日期+排序时间排序)
                         KZYS00,--NUMBER(5)   , --开嘱医生
                         LRRQ00,--CHAR(8)     , --录入日期
                         LRSJ00,--CHAR(8)     , --录入时间
                         LRRXM0,--CHAR(10)    , --录入人姓名
                         HDRXM0,--CHAR(10)    , --核对人姓名
                         QYRQ00,--CHAR(8)     , --启用日期
                         QYSJ00,--CHAR(8)     , --启用时间
                         TZRQ00,--CHAR(8)     , --停止日期
                         TZSJ00,--CHAR(8)     , --停止时间
                         TQRQ00,--CHAR(8)     , --提取日期
                         TQSJ00,--CHAR(8)     , --提取时间
                         TZYS00,--NUMBER(5)   , --停止医生
                         TZRXM0,--CHAR(10)    , --停止人姓名
                         ZQS000,--NUMBER(3)   , --(短嘱)周期数
                         ZQCD00,--NUMBER(2)   , --周期长度(周的长度只能为1)
                         ZQDW00,--CHAR(4)     , --(短嘱)周期单位
                         ZQCYTS,--NUMBER(5)   , --一个周期草药贴数(仅供草药用)2.18
                         JYCS00,--NUMBER(1)   , --(中药)煎药次数
                         BQH000,--NUMBER(5)   , --病区号
                         KSH000,--NUMBER(5)   , --科室号
                         YFBMBH,--NUMBER(5)   , --(药房)执行科室
                         PCID00,--NUMBER(4)   , --频次ID
                         PCMC00,--CHAR(20)    , --药品用法频次名称
                         YFID00,--CHAR(3)     , --药品用法ID
                         YPYFMC,--CHAR(20)    , --药品用法名称
                         YYZF00,--CHAR(40)    , --用药嘱咐(饭前，饭后等)
                         YZZT00,--CHAR(1)     , --医嘱状态‘0’新开‘1’已核对‘2’已提取‘3’停止‘4’撤消‘5’暂停‘6’疑问
                         YZMXSM,--NUMBER(2)   , --医嘱明细(同组)数目(由触发器保证)
                         BZID00,--NUMBER(6)   , --病症ID号(主要用于毒麻处方)
                         BZ0000, --CHAR(10)      --备注
                         YSZID0,--医生组id
                         KDKSBH,--开单科室编号
                         YYRQ00,--用药日期
                         YYSJ00, --用药时间
                         JYFS00,   --煎药方式
                         DJFSMC   --代煎   
                         )
                 select
                       v_yzid00,
                       v_zyid00,
                       YEXM00,
                       YPLBBH,
                       DMBZ00,
                       1,--临嘱
                       p_pxsj00,
                       p_czy000,
                       To_Char(SYSDATE,'YYYYMMDD'),
                       To_Char(SYSDATE,'HH24:MI:SS'),
                       p_lrrxm0,
                       null,--hdrxm0,
                       p_qyrq00,
                       p_qysj00,
                       null,--tzrq00,
                       null,--tzsj00,
                       null,--tqrq00,
                       null,--tqsj00,
                       null,--tzys00,
                       null,--tzrxm0,
                      -- decode(v_yplbbh,'2',1,p_zqs000),
                       p_zqs000,
                       ZQCD00,
                       ZQDW00,
                       decode(v_yplbbh,'2',v_zqcyts,1),
                       v_jycs00,--代煎数
                     --  0,
                       v_bqh000,
                       v_ksh000,
                       v_yfbmbh,
                       PCID00,
                       PCMC00,
                       YFID00,
                       YPYFMC,
                       YYZF00,
                       '7',--yzzt00,
                       null,--yzmxsm,
                       BZID00,
                       BZ0000,
                       (select yszid0 from zy_brxxb0 where zyid00=v_zyid00),
                       p_kdksbh,
                       p_yyrq00,
                       v_yysj00,
                       JYFS00,   --煎药方式
                       DJFSMC    --代煎
    from BQ_YPYZ00 where YZID00 = p_yzid00;
    --插入药品医嘱明细表
    FOR REC IN CUR_ZS_YPYZMX LOOP
    select qzfs00 into v_qzfs00 from bm_yd0000 where ypnm00=REC.YPNM00;
    select zqcs00 into v_zqcs00 from bm_pc0000 where pcid00=(select pcid00 from BQ_YPYZ00 where yzid00=p_yzid00);
    insert into BQ_YPYZMX(
                       YZID00,  --医嘱ID(分组号)
                       YZMXID,  --ID号，序列号(分组号)
                       YPNM00,  --药品内部编号
                       SFDZGG,  --'0'是,'1'否
                       YPMC00,  --药品名称
                       YPGG00,  --药品规格
                       PSID00,  --皮试ID             对应MZ_PS0000表
                       PSMC00,  --皮试名称(冗余)
                       MCSL00,  --每次数量(剂量单位的每次剂量)
                       JLDW00,  --剂量单位(J)(冗余)
                       LYL000,  --领药量(发药单位,临时、用药医嘱使用)
                       ZYFYDW,  --住院发药单位(Z)(住院药房维护)(冗余)
                       Z2J000,  --住院发药/基本单位转换率(默认药房)
                       XMYFMC,  --草药细目用法名称
                       TQFS00,  --提取方式'0'正常提取，不收费'1'正常提取，收费'2'不提取，不收费
                       YZCLLB,  --'正常','嘱托','基数药','自备','门诊处理','领药','出院带药'
                       BZ0000,  --备注
                       ZFBL00,  --自付比率
                       YBLB00,  --医保类别
                       QZFSID,   --取整方式
                       DMBZ00,    --毒麻标志
                       zffsbz
                       )
                       VALUES
                   --select
                   (
                       v_yzid00,--YZID00
                       SQ_BQ_YZMX00_YZMXID.NextVal,--YZMXID,
                       REC.YPNM00,
                       REC.SFDZGG,
                       REC.YPMC00,
                       REC.YPGG00,
                       REC.PSID00,
                       REC.PSMC00,
                       REC.MCSL00,
                       REC.JLDW00,
                       decode(v_yplbbh,'2',ceil(rec.mcsl00*v_zqcyts/REC.Z2J000),
                                  decode(v_qzfs00,0,ceil(rec.mcsl00*nvl(rec.j2j000,1)/rec.z2j000)*v_zqcs00*p_zqs000,
                                        1,ceil(rec.mcsl00*nvl(rec.j2j000,1)/rec.z2j000*v_zqcs00)*p_zqs000,
                                        2,ceil(rec.mcsl00*nvl(rec.j2j000,1)/rec.z2j000*v_zqcs00*p_zqs000),
                                        3,round(rec.mcsl00*nvl(rec.j2j000,1)/rec.z2j000*v_zqcs00*p_zqs000,2),
                                        4,ceil(rec.mcsl00*nvl(rec.j2j000,1)/rec.z2j000*v_zqcs00*p_zqs000)
                                       )
                             ),
                       REC.ZYFYDW,
                       REC.Z2J000,
                       REC.XMYFMC,
                       REC.TQFS00,
                       '出院带药',--'正常','嘱托','基数药','自备','门诊处理','领药','出院带药'
                       REC.BZ0000,
                       REC.ZFBL00,
                       REC.YBLB00,
                       REC.QZFSID,
                       REC.DMBZ00,
                       REC.zffsbz
                    );
     END LOOP;
     --close CUR_ZS_YPYZMX;
    --自动生成附加费用
    SP_BQ_YPFJFY_ZYDZBL(v_yzid00,0);
   END IF;
    --from BQ_YPYZMX where YZID00 = p_yzid00;
    v_count3:=0;
    IF V_ERROR0=1 THEN
      V_KCBZYP:='(';
      FOR REC IN CUR_ZS_KCBZYP LOOP
      V_KCBZYP:=V_KCBZYP||REC.YPMC00||',';
      v_count3:=v_count3+1;
      END LOOP;
      --close CUR_ZS_KCBZYP;
      V_KCBZYP:=SUBSTR(V_KCBZYP,1,(length(V_KCBZYP)-1));
      V_KCBZYP:=V_KCBZYP||')';
    END IF;
    if v_count3=0 then
      V_KCBZYP:='';
      V_ERROR0:=0;
    end if;

exception
    when others then
        Raise_Application_Error(-20002,substrb(NVL(SQLERRM, '原因不明出错')||'！*',1,220));
          --||'SP_BQ_YPYZFZ:p_yzid00:'||To_Char(p_yzid00)||'p_qyrq00:'||p_qyrq00
          --||'p_qysj00:'||p_qysj00||'p_pxsj00:'||p_pxsj00||'p_lrrxm0:'||p_lrrxm0
end;
