#EAS Cloud资金-融资管理#非多次发放的借款单新增,合同开始日和合同结束日一致问题修复!原创
金蝶云社区-言鱼
言鱼
11人赞赏了该文章 172次浏览 未经作者许可,禁止转载编辑于2023年09月04日 15:57:54
封面

非多次发放的借款单新增,合同开始日和合同结束日一致问题修复!


一、问题描述

在我的项目实施和服务运维中,发现了融资管理的一个业务系统bug,并提单由总部代码优化处理;

具体如下:

工单号:R20230811-3368

问题描述:非多次发放借款的“主合同借款”中(借款单.多次发放)页签显示的“合同开始日”和“合同结束日”都是一样的,均为该笔借款的创建日期,此问题为本次资金新bug,请尽快处理!


解决方案:补丁处理;

补丁号:PT172976


后台查询分析器语句:

select * from T_FIN_MainConLoan where FCREATETIME >={ts'2023-08-16 00:00:00'}


--涉及表:主合同借款

T_FIN_MainConLoan


image.png





二、关键步骤

1、更新补丁PT172976

可在社区主页的“服务工具”找到补丁下载;

image.png




image.png



进入后,选择“金蝶EAS Cloud”,输入补丁号:PT172976,点击搜索,可下载该补丁,注意前置补丁一并下载;


image.png



关于剩下的打补丁,可参考论坛官方知识:补丁管理易掌握


2、历史错误数据修正;


对于已经更新补丁后的新增借款单业务,“多次发放”页签的合同开始日和合同结束日就不会再更新为创建日期;


那么多于历史业务数据,如何修正呢?


提供一下oracle语句修正:


原理是:A借款合同是非多次发放合同,将A合同对应的借款单F上的最早“起息日”和最晚“到期日”更新到主合同借款的“合同开始日”和“合同到期日”;


【之所以是最早“起息日”和最晚“到期日”,就是害怕更新到多次发放的合同

ps:其实我是只更新了“合同开始日=合同结束日”的主合同借款


--------------------------------------------------------------------------------


--合同开始日=合同结束日的主合同借款
select * from T_FIN_MainConLoan where FSTARTDATE = FENDDATE 
order by FCREATETIME 


--创建日期=指定日期的主合同借款
select * from T_FIN_MainConLoan where FCREATETIME >={ts'2023-08-28 00:00:00'}
order by FCREATETIME 


--连接表查询借款单与主合同借款
select  B.FID 主合同ID,
           B.FCREATETIME 创建日期,
           B.FLASTUPDATETIME 最后修改日,
           B.FBIZDATE 主合同业务日期,
           B.FCOMPANYID 公司,
           B.FCONNUMBER 合同号,
           B.FSTARTDATE 合同开始日,
           B.FENDDATE 合同结束日,
           B.FISMULCON 是否多次发放主合同,
           A.FISSUEDATE 借款单起始日,
           A.FEXPIREDDATE 借款单到期日,
           A.FNUMBER 借款单号
from T_FIN_MainConLoan B
LEFT JOIN T_FIN_Loan A
ON A.FMAINCONLOANID = B.FID 

where B.FSTARTDATE = B.FENDDATE --合同开始日=合同结束日
order by B.FID   -用创建日期排序


--需要更新数据的借款单集合
select A.FCONTRACTNUM 借款单合同号,min(A.FISSUEDATE) 借款单起始日,max(A.FEXPIREDDATE) 借款单到期日
from  T_FIN_Loan A
group by A.FMAINCONLOANID    --用主合同ID排序


 
--查询更新 '某个合同' 的主合同借款
select  B.FID 主合同ID,
           B.FCREATETIME 创建日期,
           B.FLASTUPDATETIME 最后修改日,
           B.FBIZDATE 主合同业务日期,
           B.FCOMPANYID 公司,
           B.FCONNUMBER 合同号,
           B.FSTARTDATE 合同开始日,
           B.FENDDATE 合同结束日,
           B.FISMULCON 是否多次发放主合同,
           A.FISSUEDATE 借款单起始日,
           A.FEXPIREDDATE 借款单到期日,
           A.FNUMBER 借款单号
from T_FIN_MainConLoan B
LEFT JOIN T_FIN_Loan A
ON A.FMAINCONLOANID = B.FID

where B.FCONNUMBER  ='某个合同号'



————————————————
--UPDATE T_FIN_MainConLoan B 
   SET (B.FSTARTDATE,B.FENDDATE) =
        (select min(A.FISSUEDATE),max(A.FEXPIREDDATE) from T_FIN_Loan A where A.FMAINCONLOANID = B.FID and B.FCONNUMBER  ='某个合同号'  group by A.FMAINCONLOANID)
WHERE EXISTS (select 1 from  T_FIN_Loan A where A.FMAINCONLOANID = B.FID and B.FCONNUMBER  ='某个合同号')
————————————————

此处值得注意的是:order by中不能同时使用min和max两个函数;会报错!因为当一个主合同借款对应多张借款单时,每个借款单均有起始日和到期日,那么如果到期日一致,可能是第一行借款单的起息日与第二行借款单的到期日,去更新一行主合同借款,那么sql就会报“多行返回一行”的错误;【简而言之,就是多对一更新;】

而上面的sql中,我却在order by前,放了两个函数,这是为什么呢?
因为我在结果集和条件中都where了一个准确的合同;因此就是一对一的,此时测试是可以update的;



-------------------------正式更新---------------------------


--使用借款单的开始日和起始日更新主合同借款的合同开始日和合同结束日
select  B.FID 主合同ID,
           B.FCREATETIME 创建日期,
           B.FLASTUPDATETIME 最后修改日,
           B.FBIZDATE 主合同业务日期,
           B.FCOMPANYID 公司,
           B.FCONNUMBER 合同号,
           B.FSTARTDATE 合同开始日,
           B.FENDDATE 合同结束日,
           B.FISMULCON 是否多次发放主合同,
           A.FISSUEDATE 借款单起始日,
           A.FEXPIREDDATE 借款单到期日,
           A.FNUMBER 借款单号
from T_FIN_MainConLoan B
LEFT JOIN T_FIN_Loan A
ON A.FMAINCONLOANID = B.FID

where B.FSTARTDATE = B.FENDDATE --合同开始日=合同结束日
order by B.FCREATETIME --用创建日期排序



--将“借款单.起息日”更新到对应合同的“合同开始日”
————————————————

UPDATE T_FIN_MainConLoan B 
   SET B.FSTARTDATE =
        (select min(A.FISSUEDATE) from T_FIN_Loan A where A.FMAINCONLOANID = B.FID group by A.FMAINCONLOANID)
WHERE EXISTS (select 1 from T_FIN_Loan A where A.FMAINCONLOANID = B.FID group by A.FMAINCONLOANID)


--将“借款单.到期日”更新到对应合同的“合同到期日”
————————————————

UPDATE T_FIN_MainConLoan B 
   SET B.FENDDATE =
        (select max(A.FEXPIREDDATE) from T_FIN_Loan A where A.FMAINCONLOANID = B.FID group by A.FMAINCONLOANID)
WHERE EXISTS (select 1 from T_FIN_Loan A where A.FMAINCONLOANID = B.FID group by A.FMAINCONLOANID)

————————————————



更新后的异常数据排查
————————————————
--检查主合同借款的开始日、结束日是否与借款单的起息日和到期日一致;
select  B.FID 主合同ID,
           B.FCREATETIME 创建日期,
           B.FLASTUPDATETIME 最后修改日,
           B.FBIZDATE 主合同业务日期,
           B.FCOMPANYID 公司,
           B.FCONNUMBER 合同号,
           B.FSTARTDATE 合同开始日,
           B.FENDDATE 合同结束日,
           B.FISMULCON 是否多次发放主合同,
           A.FISSUEDATE 借款单起始日,
           A.FEXPIREDDATE 借款单到期日,
           A.FNUMBER 借款单号
from T_FIN_MainConLoan B
LEFT JOIN T_FIN_Loan A
ON A.FMAINCONLOANID = B.FID
where (B.FSTARTDATE!=A.FISSUEDATE  --合同开始日 不等于 借款单.起息日 或者 合同到期日 不等于 借款单.到期日
or B.FENDDATE!=A.FEXPIREDDATE)



有问题可以跟帖留言哈!


赞 11