apzl_leasing/src_sql/procedure/proc_contract_discount_month_temp.sql

106 lines
3.9 KiB
SQL

create procedure proc_contract_discount_month_temp()
BEGIN
/*
*
*/
-- 定义全局变量
DECLARE p_contract_id VARCHAR(32); -- 合同id
DECLARE p_discount DECIMAL(22,2) ; -- 贴息金额
DECLARE tax_rate DECIMAL(22,2) ; -- 租息税率, 当前1.06(回租)
DECLARE p_recive_date VARCHAR(32); -- 贴息导入日期
DECLARE p_lease_term VARCHAR(32); -- 最大期次
DECLARE v_discount DECIMAL(22,2) DEFAULT 0.00; -- 未计提贴息金额
DECLARE done BOOLEAN DEFAULT FALSE; -- 用于判断最外层循环是否结束
-- 开启游标
DECLARE contract_info CURSOR FOR SELECT
lci.id,
MAX(ld.discount_money),
MAX(ld.discount_money),
getTax(MIN(lci.leas_form),'租息',MIN(lcc.start_date)),
DATE_FORMAT(MAX(ld.INPUTTIME),'%Y/%m/%d'),
MAX(lcc.LEASE_TERM)
FROM
LB_DISCOUNT ld
INNER JOIN
lb_contract_info lci ON lci.contract_no=ld.contract_no
INNER JOIN
lc_calc_condition lcc ON lcc.contract_id=lci.id
INNER JOIN
contract_rent_month crm ON crm.contract_id=lci.id
WHERE
crm.discount IS NULL
GROUP BY lci.id;
-- 如果上边SQL没有值, 将done赋值为true, 用于结束循环
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 开启游标
OPEN contract_info;
-- 控制循环
clyLoop:LOOP
-- 将上边SQL查到的值, 赋值给全局变量
FETCH contract_info INTO p_contract_id,p_discount,v_discount,tax_rate,p_recive_date,p_lease_term;
-- 如果done=true, 结束循环
IF done THEN LEAVE clyLoop; END IF;
BEGIN
-- 定义当前代码块全局变量
DECLARE al_discount DECIMAL(22,2) DEFAULT 0.00; -- 已计提贴息金额
DECLARE r_discount DECIMAL(22,2) DEFAULT 0.00; -- 当期贴息金额
DECLARE r_list VARCHAR(10); --
DECLARE r_date VARCHAR(10); --
DECLARE bilv DECIMAL(22,6) DEFAULT 0.00; --
DECLARE subdone BOOLEAN DEFAULT FALSE; -- 用于判断下方循环是否结束
-- 定义游标
DECLARE rent_info CURSOR FOR SELECT
crm.formula,
crm.rent_list,
lrp.plan_date
FROM
contract_rent_month crm
LEFT JOIN
lc_rent_plan lrp ON lrp.contract_id=crm.contract_id
AND
lrp.plan_list=crm.rent_list
WHERE
crm.contract_id =p_contract_id
ORDER BY
crm.contract_id,rent_list;
-- 判断上边SQL是否还有数据, 没有则变更subdone为true
DECLARE CONTINUE HANDLER FOR NOT FOUND SET subdone = TRUE;
-- 开启游标
OPEN rent_info;
-- 控制循环
subLoop:LOOP
-- 给全局变量赋值
FETCH rent_info INTO bilv,r_list,r_date;
-- 如果没数据了, 关闭循环
IF subdone THEN LEAVE subLoop; END IF;
BEGIN
-- 如果最后一期, 贴息金额等于总金额-已分摊的所有金额
IF r_list=p_lease_term THEN
UPDATE contract_rent_month SET discout_tax=p_discount-al_discount,discount=ROUND((p_discount-al_discount)/tax_rate,2),leftdiscount=0 WHERE contract_id=p_contract_id AND rent_list=r_list;
SET v_discount=v_discount-r_discount;
-- 导入之前的分摊金额都为0
ELSE IF DATE_FORMAT(r_date,'%Y%m%d')-DATE_FORMAT(p_recive_date,'%Y%m%d')<0 THEN
UPDATE contract_rent_month SET discout_tax=0,discount=0,leftdiscount=p_discount WHERE contract_id=p_contract_id AND rent_list=r_list;
SET r_discount=r_discount+ROUND(bilv*IFNULL(p_discount,0),2);
ELSE
-- 其他的每一期都按照一定的逻辑算
SET r_discount=r_discount+ROUND(bilv*IFNULL(p_discount,0),2);
UPDATE contract_rent_month SET discout_tax=r_discount,discount=ROUND(r_discount/tax_rate,2),leftdiscount=v_discount-r_discount WHERE contract_id=p_contract_id AND rent_list=r_list;
SET v_discount=v_discount-r_discount;
SET al_discount=al_discount+r_discount;
SET r_discount=0;
END IF;
END IF;
END;
END LOOP;
CLOSE rent_info;
END;
END LOOP;
CLOSE contract_info;
END;