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;
---摘自收费管理-学生学杂费-导入银行交费信息