create or replace procedure peis_sign(TASKID_IN in Varchar2) as
   n_登记ID Number(18);
   n_人员ID Number(18);
   v_操作员姓名 varchar2(20);
   v_签到批次 Varchar2(10);
   v_计费批次 Varchar2(10);
   V_发送批次 Varchar2(10);
   n_任务id Number(18);
   n_发送号 Number(18);
   v_姓名 Varchar2(100);
   v_性别 Varchar2(10);
   v_年龄 Varchar2(10);
   v_年龄数字 Varchar2(10);
   v_组合id  Varchar2(10);
   v_申请人  Varchar2(100);
   d_申请时间 date;
   v_申请科室  Varchar2(50);
   v_健康号 VARCHAR2(50);
   v_病人科室 VARCHAR2(50);
   v_挂号单 VARCHAR2(8);
   n_门诊号 NUMBER(18);
   d_出生日期 date;
   V_病区  VARCHAR2(100);
   V_病区编码 VARCHAR2(10);
   v_样本条码 VARCHAR2(18);
   n_计费状态 NUMBER(3);
begin
  select 姓名 into v_操作员姓名 from 上机人员表 s, 人员表 r where s.人员id=r.id and s.用户名=user;
  select nextno(160) into v_签到批次 from dual;
  select 任务登记id,登记记录ID, 体检人员ID into n_任务id,n_登记ID,n_人员ID from 体检分组人员 r where r.体检编号=TASKID_IN;
  zl_体检分组人员_sign(n_登记ID, n_人员ID, v_操作员姓名, sysdate, v_签到批次);
  Select NextNO('153','0','','1') into v_计费批次 From Dual;
  zl_体检人员项目_Billing(n_任务id||','||n_人员ID,v_计费批次,'1');
  zl_体检人员费用_Insert(v_计费批次,'0');
  
  for c in (Select a.任务登记id,a.体检人员id,a.体检人员id As 病人id,a.登记项目id, a.体检项目id,a.计价方式, 序号, a.从属父号,a.价格父号,a.加班标志,a.附加标志,a.付数,a.操作员姓名, a.操作员编号, 
       a.收费类别, a.计算单位, a.收费细目id, a.收费项目id, a.收入项目id,a.收据费目, a.收费项目, a.时价, a.分批, a.可否分零, a.剂量系数, 
       a.应收金额, a.实收金额, a.标准金额, a.体检金额, a.数次, a.医嘱id,a.门诊号, a.姓名, a.性别, a.年龄, a.费别, a.费用单据, a.费用对象, a.费用性质, a.记录性质, 
       a.体检部门id, a.开单部门id, a.开单人, a.执行科室, a.执行科室id,a.执行科室id As 执行部门id, round(nvl(a.标准单价,0), 2 ) as 单价, a.登记时间, a.病人科室id, 发生时间,'' As 划价人  
From ( 
      Select RowNum As 序号, Null As 从属父号,Null As 价格父号,0 As 加班标志,0 as 附加标志,1 as 付数, A.发送人员 as 操作员姓名,'zlhis' as 操作员编号,A.任务登记id, A.登记项目id, A.体检项目id, A.收费类别, A.计算单位, 
             A.收费项目id as 收费细目ID,A.收费项目id,A.收入项目id ,a.收据费目,A.收费项目, A.时价, A.分批, A.可否分零, 
             A.剂量系数, A.执行科室id, 0 As 应收金额, 0 As 实收金额, A.标准金额, A.体检金额, A.数次, A.医嘱id, A.体检人员id, A.姓名, A.性别, a.门诊号,
             A.年龄, A.费别, A.费用单据, A.费用对象, A.费用性质, A.记录性质, A.体检部门id, A.开单科室id as 开单部门id, A.开单医生 as 开单人, 
             B.名称 As 执行科室,A.标准单价,A.登记时间,A.体检部门id As 病人科室id,Sysdate As 发生时间,A.计价方式  
      From (Select C.任务登记id, C.体检人员id, E.登记项目ID, C.体检项目id, K.计价方式,D.类别 As 收费类别, D.计算单位, A.收费项目id, D.名称 As 收费项目, 
       Nvl(D.是否变价, 0) As 时价, Nvl(Decode(D.类别, '4', I.在用分批, H.药房分批), 0) As 分批, H.门诊可否分零 as 可否分零, 
       H.剂量系数, Decode(A.执行科室id, B.执行科室id, C.执行科室id, A.执行科室id) As 执行科室id, 
       A.体检金额, 
       Nvl(A.收费数次, 1) As 数次, 
       Decode(D.是否变价, 1, A.体检金额, Z.现价) as 标准单价, Z.现价*Nvl(A.收费数次, 1) As 标准金额, 
       Decode(E.费用对象, 1, C.医嘱记录id, C.采集医嘱id) As 医嘱id,  F.姓名, 
       f.门诊号,F.性别, F.年龄, F.费别, E.费用单据, E.费用对象, E.费用性质, E.记录性质, G.体检部门id, B.开单科室id, B.开单医生,  Sysdate As 登记时间,Z.收入项目ID,Q.收据费目,C.发送人员  
From 体检分组计价 A, 
     体检分组项目 B, 
     体检人员项目 C, 
     收费项目目录 D, 
     病人信息 F, 
     (       Select Distinct x.费用单据, x.费用对象, x.费用性质, x.记录性质, y.Id As 人员项目id,y.登记项目ID, x.项目对象 
       From 体检人员项目 Y, 体检人员费用 X 
       Where y.计费批次 =v_计费批次 And x.人员项目id = y.Id and X.项目对象=1 
       Union  
       Select Distinct x.费用单据, x.费用对象, x.费用性质, x.记录性质, y.Id As 人员项目id,Z.ID as 登记项目ID, x.项目对象 
       From 体检人员项目 Y, 体检人员费用 X,体检分组项目 Z 
       Where y.计费批次 =v_计费批次 And x.人员项目id = y.Id and (Y.登记项目id=Z.相关id Or Y.登记项目id=Z.id) and Y.体检人员id=Z.体检人员id And Z.是否职业=1 and X.项目对象=2 
     ) E, 
     体检任务登记 G,体检分组记录 K, 
     药品规格 H, 
     材料特性 I, 
     收费价目 Z,
     收入项目 Q    Where C.计费批次 =v_计费批次  AND Z.收入项目id = Q.ID AND (Q.撤档时间 is Null Or Q.撤档时间 > Sysdate) 
                   And A.登记项目id = B.Id  
                   And B.Id=E.登记项目ID   
                   And C.Id = E.人员项目id  
                   And D.ID =A.收费项目id 
                   And D.ID =Z.收费细目ID 
                   And z.执行日期 <= Sysdate  And (Z.终止日期 Is Null Or Z.终止日期 > Sysdate) 
                   And G.ID = B.任务登记id 
                   And C.体检人员id = F.病人id 
                   And H.药品id(+) = D.ID 
                   And I.材料id(+) = D.ID 
                   And K.ID=B.登记记录id  
                   And A.收费对象 = E.费用对象 And Z.价格等级 is Null              Order By C.任务登记id,C.体检人员id,C.登记项目id,A.检查部位,A.收费项目id, Nvl(Z.序号,0) 
        ) A, 
        部门表 B 
Where A.执行科室id = B.ID(+) 
/*  and (a.费用单据,a.记录性质) not in (Select b.费用单据, b.记录性质 
From 体检人员项目 A, 体检人员费用 B, 门诊费用记录 C 
Where a.计费批次 =v_计费批次 And a.Id = b.人员项目id And b.费用单据 = c.No And b.记录性质 = c.记录性质) */
) A Order by a.任务登记id,a.体检人员id,a.登记项目id,a.记录性质,a.费用单据,a.收费项目id  )  loop   Zl_门诊记帐记录_Insert(c.费用单据,c.序号,c.病人id,c.门诊号,c.姓名,c.性别,c.年龄,c.费别,'','',c.病人科室id,c.开单部门id,c.开单人,'',c.收费项目,c.收费类别,
   c.计算单位,c.付数,c.数次,c.附加标志,c.执行科室id,c.价格父号,c.收入项目id,c.收据费目,c.单价,c.应收金额,c.实收金额,c.发生时间,c.登记时间,'','0',c.操作员编号,c.操作员姓名,
   '','','','','','','4');
   Select max(m.发送批次),max(n.发送号) into V_发送批次,n_发送号 From 体检人员项目 m,病人医嘱发送 n Where m.医嘱记录id = n.医嘱id and m.任务登记id=n_任务id And m.体检人员id=n_人员ID;
   zl_体检人员项目_Send(n_登记ID,n_人员ID,c.登记项目id,c.操作员姓名,sysdate,V_发送批次,n_发送号); 
     end loop;
     
for z in ( Select a.医嘱记录id,a.采集医嘱id,a.检验标本,b.编码 As 执行科室编码,d.名称 as 采集方式,e.名称 as 采集科室,
  f.费别,Sum(f.应收金额) As 应收金额,Sum(Decode(f.记录状态, 1, f.实收金额, 0)) as 实收金额
From 体检人员项目 a,部门表 b,病人医嘱记录 c,诊疗项目目录 d,部门表 e,门诊费用记录 f 
Where c.id =a.采集医嘱id and c.诊疗项目id = d.id and c.执行科室id = e.id and a.执行科室id = b.Id and f.医嘱序号 = a.医嘱记录id and f.执行状态<>'9'
And a.医嘱记录id Is Not Null And a.采集医嘱id Is Not Null And a.任务登记id = n_任务id /*And a.发送批次 = V_发送批次*/ and a.体检人员id=n_人员ID  
 group by a.医嘱记录id,a.采集医嘱id,a.检验标本,b.编码,d.名称,e.名称,f.费别 ) loop
  
Select C.姓名 into v_姓名,decode(C.性别,'男','1','女','2','未知','9','0') into v_性别,a.年龄 into v_年龄,substr(a.年龄,1,instr(a.年龄,'岁','1','1')-1) into v_年龄数字,
       A.开嘱医生 into v_申请人,A.开嘱时间 into d_申请时间, D.名称 into v_申请科室,  
       C.健康号 into v_健康号, E.名称 into v_病人科室, A.挂号单 into v_挂号单, C.门诊号 into n_门诊号, C.出生日期 into d_出生日期,  
       b.样本条码 into v_样本条码,b.计费状态 into n_计费状态,g.编码 into V_病区编码,g.名称 into v_病区,m.id into v_组合id  
  From 病人医嘱记录 A, 病人医嘱发送 B, 病人信息 C, 部门表 D, 部门表 E,诊疗项目目录 F,部门表 g,病案主页 s,检验组合项目 m   
  Where A.Id = B.医嘱id And A.病人id = C.病人id And A.开嘱科室id = D.Id And A.病人科室id = E.Id and a.诊疗项目id = f.id and a.病人id= s.病人id(+) and a.主页id = s.主页id(+) 
  and c.当前病区ID = g.id(+) and m.编码 = f.编码 and a.id = z.医嘱记录id;
   
  Zl_检验申请单_Insert(z.采集医嘱id,z.医嘱记录id,'4',n_人员ID,'0',v_姓名,v_性别,v_年龄,v_年龄数字,'岁',v_组合id,z.检验标本,v_申请人,d_申请时间,v_申请科室,'',v_健康号,v_病人科室,'0',v_挂号单,n_门诊号,'',d_出生日期,'','',Null,'',Null,'',Null,n_计费状态,'','',v_病区,V_病区编码,'','',v_样本条码,z.采集方式,z.采集科室,z.应收金额,z.实收金额,z.费别,'','','','','',''); end loop;end;