银行交费处理顺序(LISTAGG 列转行)

create or replace procedure SFGL_SYNCYH_TEMP(p_xn    in varchar2,
                                             p_czr    in varchar2,
                                             res_str  OUT VARCHAR2,
                                             res_code OUT VARCHAR2,
                                             res_count OUT number) is
  /**
  *  同步银行交费临时表
  *  功能:遍历学生临时表(保存银行交费信息),先根据银行账号、姓名查找应缴费用,再遍历这些费用跟银行交费费用比较,
      导入的金额处理顺序
      医保费
      住宿费
      学费
      金额是有顺序的,首先交医保费、多出来的钱再交住宿费(非走读生)、再多出来的钱交学费、
      再多出来的钱交其他费用;如果一开始交的金额不够交医保费或者住宿费,那么直接交学费;

  *  处理完后更新应缴费用表的'已缴费用'字段(银行交费就相当于已缴),
  *  然后插入一条银行划扣数据到缴费记录表中。
  *  2015年11月18日
  *   p_xn 当前学年
  *   p_czr 操作人
  *   res_str 返回执行结果
  *   res_code 返回结果代码
  *   res_count 返回导入结果数
  */
  
  p_xm varchar2(1000);  ---银行账号不对应的学生姓名
  p_yjje sfgl_xsxx_temp.yjje%TYPE; --- 已缴金额
  p_count number :=0;  --记录导入条数

begin

  ----先判断哪些学生的银行账号不存在或不对应,列转行---
  SELECT LISTAGG(tp.xm, ',') WITHIN GROUP(ORDER BY tp.xm) xm into p_xm FROM sfgl_xsxx_temp tp,sfgl_xsxx xs
  WHERE tp.yxzh != xs.yxzh and trim(tp.xm) = trim(xs.xm);

  ---遍历可以导入银行交费的学生
  for rec_xsxx in (SELECT xs.xsid,tp.yjje FROM sfgl_xsxx_temp tp,sfgl_xsxx xs WHERE tp.yxzh = xs.yxzh and trim(tp.xm) = trim(xs.xm)) loop
  --根据应缴用户、学年找应缴费用的id
     p_yjje := rec_xsxx.yjje;
     for rec_yjfy in(SELECT * FROM sfgl_yjfy WHERE yjyh=rec_xsxx.xsid and xn=p_xn 
                    order by case fylx when '3' then 1
                                       when '2' then 2
                                       when '1' then 3
                                       when '4' then 4 end) loop  
         ------------判断导入的费用是否大于未缴的医保费----------
         if rec_yjfy.fylx =3 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then  
           update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
            
            p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完医保费所剩          
          
         ------------判断导入的费用是否大于未缴的住宿费----------
          elsif rec_yjfy.fylx =2 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then  
            update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
              
              p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完住宿费所剩
             
           ------------判断导入的费用是否大于未缴的学费(导入金额金额大于等于未缴学费)---------- 
           elsif rec_yjfy.fylx =1 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then 
            update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
              
              p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完学费所剩
            
           ------------判断导入的费用是否小于未缴的学费(导入金额小于未缴学费并且大于0)---------- 
           elsif rec_yjfy.fylx =1 and p_yjje < rec_yjfy.wjfy and p_yjje > 0 and rec_yjfy.wjfy > 0 then  
            update sfgl_yjfy set YJFY = YJFY+p_yjje,wjfy =wjfy-p_yjje,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',p_yjje,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
              
              p_yjje :=0;  ---扣完学费所剩      
           
            ------------判断导入的费用是否大于未缴的其他费用(导入金额大于等于未缴学费)----------    
            elsif rec_yjfy.fylx =4 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then  
              update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
              insert into sfgl_jfjl
                (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
              values
                (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr);  --插入缴费记录表 
                
                p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完其他费所剩  
           
           ------------判断导入的费用是否小于未缴的其他费用(导入金额小于其他学费并且大于0)----------     
            elsif rec_yjfy.fylx =4 and p_yjje < rec_yjfy.wjfy and p_yjje > 0 and rec_yjfy.wjfy > 0 then  
              update sfgl_yjfy set YJFY = YJFY+p_yjje,wjfy =wjfy-p_yjje,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表 
              insert into sfgl_jfjl
                (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) 
              values
                (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',p_yjje,'0',sysdate,p_czr,sysdate,p_czr);   --插入缴费记录表 
                
                p_yjje :=0;  ---扣完其他费所剩     
            
         end if;
     end loop;
     
      p_count :=p_count+1;
      
  end loop;

  COMMIT;
  res_str  := p_xm;
  res_count := p_count;
  res_code := 'S';
exception
     when others then
       --res_str:=res_str||':程序运行出现内部错误,请联系管理员。'||dbms_utility.format_error_backtrace()||'---'||SQLCODE||'---'||SQLERRM;
       res_str  := '执行失败';
       res_count := 0;
       res_code := 'E';
       rollback;
end SFGL_SYNCYH_TEMP;

 ---摘自收费管理-学生学杂费-导入银行交费信息

你可能感兴趣的:(银行交费处理顺序(LISTAGG 列转行))