1.问题描述
本文涉及到的情况为人民币银行账户未勾选币别导致下载的交易明细重复,如未其他币别的账户需要根据具体情况而定。
切记!!!
下载回单报错:
System.ArgumentException: 已添加了具有相同键的项。
在 System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
在 System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
在 Kingdee.K3.FIN.WB.App.Core.QueryReceipts.QueryReceipt.GetBankFlow(Context ctxt, Int64 accId, IEnumerable`1 code)
在 Kingdee.K3.FIN.WB.App.Core.QueryReceipts.SaveReceiptInfo.FillData(Context ctxt)
在 Kingdee.K3.FIN.WB.App.Core.QueryReceipts.QueryReceipt.Download(Context ctxt, Int64 orgId, Int64 accId, Int64 currency, DateTime startDate, DateTime endDate, String accNo, Int64 bankId, String currencyCode)
在 Kingdee.K3.FIN.WB.App
2.问题分析
2.1检查了下电子回单关联的数据库表(T_WB_Receipt)
SELECT * FROM T_WB_RECEIPT WHERE FID IN (SELECT FID FROM T_WB_RECEIPT GROUP BY FID HAVING COUNT(FID)>1)
检查FID无重复
初步排除非电子回单数据表问题。
2.2报错中有一处信息值得关注:GetBankFlow-获取银行流水
7.5.1.202010版本优化:下载电子回单之前先自动下载交易明细
怀疑是交易明细下载重复了,
之前提单咨询自动下载电子回单执行计划的时候,如果银行账号币别不填的话,会导致下载到的自动下载到的交易明细会把所有币别的账号的都下载一遍。
2.3检查确认发现:报错的银行账户确实没有选币别
维护币别为人民币
2.4接收银行交易明细中检查该账户是否下载其他币别(非人民币)的流水
发现确实重复下载了港元和美元币别的流水
数据库中校验是否重复下载了电子回单关联标记重复的回单
SELECT * FROM T_CN_BANKCASHFLOW WHERE FRECEIPTNO IN (SELECT FRECEIPTNO FROM T_CN_BANKCASHFLOW GROUP BY FRECEIPTNO HAVING COUNT(FRECEIPTNO)>1)
-- FRECEIPTNO 电子回单关联标记
-- T_CN_BANKCASHFLOW 接受银行交易明细
查询到的结果和在星空界面查询到的结果一致
3.解决办法
3.1将重复的交易明细删掉,只保留人民币币别的(根据实际情况来,我这边这个账户是人民币币别的)
3.2该银行账户币别记得选择
3.3星空中重新下载报错期间的电子回单
2022-03-12到2022-03-13
3.4清理银企平台中出现的重复的交易明细
我这边报错的原因是不同币别的流水都会下载一次,星空中设置的币别是三种,所以下载了三次重复的。
这边报错的主要是2022-03-11到2022-03-13中出现的美元和港元的交易明细数据
参考文档:【银企平台】交易明细重复问题处理
因为是近2个月的
所以我这边主要查T_EBG_DetailInfo
先查
因为我这边这个客户的银企账户不涉及外币的,所以我通过排除币别不等于人民币的排除,具体别的项目别的情况可参考具体情况而定,加上账号限制等等,请勿直接使用此处的语句。仅供参考使用。
SELECT * FROM T_EBG_DetailInfo WHERE currency <> 'CNY'
再备份
SELECT * INTO T_EBG_DetailInfo_bk20220321 from T_EBG_DetailInfo
再删除限定范围数据
DELETE FROM T_EBG_DetailInfo WHERE currency <> 'CNY'
检查下流水是否删除掉指定的条数了
确认没问题即可
最后检查下是否还有脏数据
SELECT * FROM T_EBG_DetailInfo WHERE currency <> 'CNY'
4.原理分析
为什么不同币别的流水都会下载呢?
确认下兴业银行下载交易明细流水中是否请求和返回是否包含币别信息?
猜测是银企平台流水赋值的时候只是把星空币别赋值过来存值了导致流水出现重复。
目前该块还需总部老师进一步优化,毕竟银行有返回币别,为啥流水还会出现下载不同币别的流水
之前咨询过星空的老师,老师是说执行计划中“自动下载交易明细”如果银行账户不选择币别的话,会赋值所有流水*币别数都下载一遍,导致出现重复,这个本身是星空的BUG。
涉及提单:R20220304-4457
推荐阅读