1/10用友股份-LE支持服务业务本部产品方案--《资金监控中账户余额查询的期初余额有错》建立日期:2013-12-10修改日期:xxxx-xx-xx文档属性:客户文控编号:LE-DY-CP-2013-10572/10文档控制创建记录适用范围审阅人日期审阅签字所属部门发布范围内部员工伙伴客户发布人姓名所属部门发布时间日期作者所属部门邮件地址版本2013-12-10用友NC产品支持部V1。0版本领域模块备注3/10目录资金监控中账户余额查询的期初余额有错............................................................4一、问题描述............................................................................................................4二、问题分析及解决................................................................................................61、网银对账单下载功能........................................................................................62、网银余额调整功能............................................................................................63、余额调整算法....................................................................................................74、资金监控期初期未余额取值算法....................................................................85、资金监控取期期未余额实现............................................................................94/10资金监控中账户余额查询的期初余额有错注:此解决方案涉及数据库操作或代码操作,请由计算机专业人士操作,并且操作前请做好备份工作!一、问题描述账户余额查询结果明显错误(期初余额出现负数)结算中心2011年9月1日上线,结算中心的四个账户,在上线前无论是在银行实际存款余额、还是在NC中的期初余额应该都是0(在8月25日有进行过正式小额测试),但在下表农行的余额为负数,兴业的有1300多万,这都是错误的,不知道该数据是怎么来的,要如何验证,下图为农行资金监控——账户余额查询及其联查明细、对账单、期初余额的相关数据。农行数据联查明细结果5/10对账单(查询日期:期初余额:6/10二、问题分析及解决监控查询取数就是银企直联中网上银行帐号余额查询节点的数据,出现负数或数据不正确的情况是需要在《网上银行帐号余额查询》点击调整余额,将期初那天(对帐号135101XXXXXX1来说是8.24日)的期末余额设置为0,则系统会自动根据对账单重算即可。需要设置期初余额的原因是系统需要基准点开始计算余额。以下是网银余额的算法,比较复杂,有兴趣可以参考一下网银-对账单下载及余额重算算法1、网银对账单下载功能网银提供的对账单下载,从银行下载了某账号在某日期区间发生的所有交易流水信息,并把记录保存在NC网银产品对账单表ebank_dzd中。该银行账号对账单下载后,网银系统根据交易记录计算出该银行账号在一定时间段的所有每日余额,形成每日余额记录保存在ebank_balance表中。网银对账单数据及每日余额数据提供给资金产品中以下功能使用:资金监控查询账号期初、期未余额,日均余额统计。账号联查查询账号的交易流水。2、网银余额调整功能通过银企直联下载余额记录只能为当天实时记录,企业隔天或隔多天的查询下载会使某些日余额记录缺失,此时可通过余额调整功能弥补,形成连续不间断的账号日余额记录。7/103、余额调整算法某日余额重算:某日余额等于期初余额加上当日的余额变化额,变化额等于流入金额合计-流出金额合计。根据从银行下载的对账单记录来计算账户每日资金流入流出合计。所以变化额计算法则为:Ct=Ct流入-Ct流出=∑n0(Dzdt资金流入)-∑n0(Dzdt资金流出)正向计算:T+1日的余额计算:Yet+1=Yet+Ct+1T+n日的余额计算为:Yet+n=Yet+n-1+Ct+n=Yet+∑t+nt+1(Cx流入)-∑t+nt+1(Cx流出)逆向计算:T-1日的余额计算为:Yet-1=Yet–CtT-n日的余额计算为:Yet-n==Yet-n+1-Ct-n+1=Yet-∑tt-n(Cx流入)+∑tt-n(Cx流出)其中:基准日期T:页面触发余额调整,从页面输入。如果是对账单下载后触发余额调整,则根据下载的对账单确定,其值等于下载开始日期对应的期初余额日期(见期初余额算法)。基准余额Yet:页面触发余额调整,从页面上输入。如果是对账单下载触发余额调整取基准日期对应余额记录值。调整结束日期:正向=Max(账号在余额记录表中最大日期,对账单中有交易记录的最大日期)。8/10逆向=Min(账号在余额记录表中最小日期,对账单中有交易记录的最小日期-1)每次调整形成从基准日到结束日连续的余额记录存放于余额表EBAND_BALANCE中。计算过程中遇到的已存在额记录,只更新余额记录的余额值一项,其它项保持不变。对于连续日的余额计算,NC5.7使用如下方式实现进行正向计算,假定计算日期初余额Ye0:使Ye0=Yet得到Yet+1=Ye0+Ct+1;使Ye0=Yet+1得到Yet+2=Ye0+Ct+2;…使Ye0=Yet+n-1得到Yet+n=Ye0+Ct+n进行逆向计算,假定计算日期余额Ye0:使Ye0=Yet得到Yet-1=Ye0-Ct;使Ye0=Yet-1得到Yet-2=Ye0-Ct-1;…使Ye0=Yet-n+1得到Yet-n=Ye0+Ct-n+14、资金监控期初期未余额取值算法期初日期:QC_DATE,期未日期:QM_DATE期初余额取法(QC_YE):先以QC_DATE为基准按天向前找最近余额值,没有再向后搜索,无此账号余额记录,记0。9/10期未余额取法(QM_YE):先以QM_DATE为基准按天向后找最近余额值,没有再向前搜索,无此账号余额记录,记0。5、资金监控取期期未余额实现网银系统对监控产品提供的服务接口实现:ObmFVMSourceimplementsIFVMSource实现监控余额:FvmBalanceVO[]queryBalance(FvmBalanceQueryVO[]qvos)交易明细查询:FvmDetailVO[]queryDetail(FvmDetailQueryVO[]qvos);当监控产品提出查询账户期初期末余额请求时,网银系统通过queryBalance()返回从期初日到期末日的连续余额记录。由于余额记录,可能存在不连续性,通过以下算法,进行补充://填充所有日期的数据UFDoublebalance=newUFDouble(0,2);for(UFDatea=date;a.compareTo(enddate)<=0;a=a.getDateAfter(1)){if(a==date){//开始日期取期初数据balance=qcBalanceVO.getBalance();}elseif(a.compareTo(enddate)==0){//结束日期取期未数据balance=qmBalanceVO.getBalance();10/10}else{//中间填充数据如果有对应日期余额,以此余额为数据值,否则以上一条余额记录为数据值for(BalanceVOfindVo:vo){if(findVo.getCurdate().compareTo(a)==0){balance=findVo.getBalance();break;}}}FvmBalanceVOfvmvo=newFvmBalanceVO();fvmvo.setBalance(balance);。。。balancelist.add(fvmvo);}