工作问题总结-----付款
背景:付款成功后需要给外围系统回写付款成功状态,一个定时任务发送需要支付的信息给第三方(cbs),一个定时任务从第三方同步支付状态,然后调用外围系统接口回写付款状态。
涉及的表:单据头表heder,单据支付表boepayment,待支付表efspayment
问题:出现零星几笔付款成功后没有回写的数据。
分析:1、在数据库里面日志表中查询,这几笔单据表里面没有存付款成功的报文,两个原因:
a.对方接口返回结果为null(排除,接口是稳定的)
b.我方系统在调用对方接口前出现异常,没有调用对方接口(排除,查看当天日志没有异常)
2、以上两个原因都排除了,我就去查当天打印的日志,之前做这一块的时候添加了一些打印信息为了方便查找,查日志也没有查出具体原因,但是缩小了范围,日志中可以看到程序没有执行到我做了标记的那行。但是分析了程序,只要同步了付款状态过来,就一定能到达这一行,因为中间只查询了一次,而且不可能查不到,查到了就放到map中,做了一次去重处理,所以一直想不到原因。
3、分析了上面的两点之后不知道从哪里下手了,当时怀疑是查询boeheader没查出来导致的,但是又不可能查不出来,有付款行信息,肯定是能通过付款行信息查到头信息的,这很矛盾,但是又没有别的想法,基于此拿了这几笔没有成功回写的单据,改了一部分不影响的数据后在本地进行调试,没有任何问题。无解了,没有任何头绪。
4、周天早上7点有了一点方向,想试图从付款时间方面分析一下,结果如下:
付款时间:04/12/ 11:30:14
定时任务开始时间:04/12/ 11:30:00 结束时间:04/12/ 11:30:28
思考是不是有一种可能是定时任务开始同步的时候,拿到的状态还是付款中,然后在定时任务结束之前,付款成功了,但是我们系统这时候是付款中。但是马上否认了,因为即便刚好有这个时间差,我们系统表里面的状态还是付款中,这样就会6分钟以后重新去cbs同步付款状态过来,这时候拿到付款成功,然后也会回写。
但是付款时间是从待付款表中拿出来的,说明14的时候已经同步过来了,付款状态是成功,那为什么没有回写呢?回写的逻辑是取单据头表中支付状态判断,是待付款表更新了状态,头表没有更新吗?
5、再查看日志,结合时间看,发现问题:
系统在11:30:28发送过一次,付款中。28时待付款表已经时付款成功了。 ???
然后在11:35有一条语句更改单据头标状态。
初步想法是,在同步付款状态过来的时候,待付款表状态更改为了付款中,但是头表没有同步成付款中,之后有某个地方再更改了头表状态。
6、查看代码
付款逻辑:一个单据可能包含多个支付行,支付行存在【单据支付表】中,在【确认付款】操作的时候,从【单据支付表】生成记录到【待支付表】中,【待支付表】只存一定需要付款的结算信息(【单据支付表】可能存在不需要付款的记录,比如质保金)
同步付款状态逻辑:查询出【待付款表】中的支付中的数据,同步这些数据,过来的状态更新【待付款表】,更新【单据支付表】,然后再判断如果每一行都为支付成功状态,更新【单据头表】,表明这个单据已经付款成功。
逻辑上没啥问题,但是仔细一翻,发现在判断是否每一行都支付成功的时候,取的是【单据支付表】中的记录来做判断,之前说过了,这个表里面可能存在不需要付款的记录(或者是暂时不需要付款),这个时候就会是存在有还没付款成功的行,所以此时,【单据头表】变成了付款中,而【待付款表】和【单据支付表】的对应行是付款成功,出现了状态不一致了,而我回传付款状态的时候,是要取【单据头表】的付款状态,此时为付款中所以没有回写,而下一次定时任务再执行的时候,因为【待付款表】已经为付款完成了,所以不会再同步这些数据的状态,也就是说这几个单据在第一次执行完定时任务之后,就不会再被这个定时任务执行了(为了防止重付发送)。
至于最后【单据头表】状态又是在哪里更新为付款成功的,查看到有另一个定时任务:查询付款成功(查的【单据支付表】)但单据付款状态为支付中的单据,并更新这个单据为付款成功。
所以看到这个时间差是合理的,最后验证,打开这几个单据查看,发现每个单据中都包含不需要付款的行信息。确定了分析正确。
解决方案:在判断是否所有行都支付成功的时候,不查询【单据支付表】,而是查询【待付款表】
总结:没有仔细看过同步支付状态这块的逻辑,不是很清楚,如果是比较清楚的话,可能从单据页面上就能发现问题,就不会花费这么多时间去查原因了,而且如果没有仔细查看这个时间问题,很可能会一直找不到原因,在写代码的时候,还是需要考虑到各种场景,最好是能够画出图来,这样比较能够理得清逻辑。
转载于:https://www.cnblogs.com/ckgame/p/10704091.html
工作问题总结-----付款相关推荐
- SAP 银企直连付款 DMEEX 格式树维护工具
SAP 银企直连付款通过 DMEE 格式树维护工具生成付款报文. 描述 注意:这只是一个示例,不在生产系统中使用.应将此示例"付款媒介工作台"(PMW)格式复制到自有命名空间,并按 ...
- atitit.Sealink2000国际海运信息管理系统
atitit.Sealink2000国际海运信息管理系统 操作手册 目录 第一章 使用说明 第一节 系统登录 双击桌面的系统执行程序图标,进入选择数据库的对话框,如图1-1所示.选择相应的数据库后,点 ...
- 创业新手应避免的十大常见错误
编者按:互联网的兴起,引得大批优秀人才投入创业浪潮.但是,对于大多数的工作"老姜"而言,创业还是一件新鲜的事儿,算的上是创业的新手.对创业新手来说,创业相当复杂棘手,不了解的东西可 ...
- 如何用P6软件编制项目进度计划
卷首语 工程项目执行过程中,许多工作在操作层面完成之后即可测量物理进度,但取得相应证明文件并履行请款程序后才能取得付款进度,所以物理进度和付款进度的时间差是切实存在的. 1建立计划与进度控制管理体系 ...
- Solidity:编写一个简单的支付通道
目录 什么是支付通道? 注解 打开支付通道 进行支付 关闭状态通道 通道有效期 代码 什么是支付通道? 支付通道允许在无需发生交易的情况下多次转移以太.这意味着可以避免与交易相关的延迟和费用. 我们将 ...
- SAP FICO 银企直连
本人诚心接ABAP远程开发任务,价格公道,有需要的联系我,欢迎个人,甲方爸爸,乙方私信联系. 银企直联或者自动付款的目的是和银行做一个接口,把SAP中的到期应付款(也包括预付款)按照一定格式(银行要求 ...
- 工作中InnoDB引擎数据库主从复制同步心得
近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用的是DRBD+Heartbeat双主一从,由于此过程还是有别 ...
- 网络安全从事工作分类_那么,您想从事安全工作吗?
网络安全从事工作分类 by Parisa Tabriz 由Parisa Tabriz 那么,您想从事安全工作吗? (So, you want to work in security?) Every o ...
- 10年工作经验老程序员推荐的7个开发类工具
做.NET软件工作已经10年了,从程序员做到高级程序员,再到技术主管,技术总监.见证了Visual Studio .NET 2003,Visul Studio 2005, Visual Studio ...
最新文章
- nodejs async
- Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析
- 深度学习编译:MLIR初步
- jquery.prompt.js 弹窗的使用
- java native方法
- windows挂载linux共享,永久挂载 Windows 共享
- DT大数据梦工厂 第55,56讲
- Vue 数组封装和组件data定义为函数一些猜测
- linux进程泄漏如何定位,定位Linux下定位进程被谁KILL
- 如何预防网站被篡改,劫持
- 计算机维修5级,电脑芯片级维修教程
- 中国菜刀与一句话木马之间的原理分析
- 2020 GDUT Winter Personal Training Contest I (Div. 2) B - Divisors of Two Integers题解
- 笔记本跑python 90多度会坏吗_cpu温度多高才安全?90度会烧坏吗??
- 一度智信:拼多多商家被恶搞怎么办
- 如何让Excel的表头产生筛选条件?
- 4094. Spiral matrix
- 人工智能算法对发明创造的知识产权保护
- python笔记 基础语法·第14课 【三局两胜角斗场小游戏,类与对象】
- 《西游记》之“趣经女儿国”
热门文章
- Centos7部署轻量级自动化运维工具pssh (亲测)
- ssh远程登录报错Warning: Permanently added ‘111.124.131.312‘ (ECDSA) to the list of known hosts.
- 华为防火墙USG6320透明模式配置
- Zabbix监控Dell服务器主机和网络设备
- Debian完全卸载清理MySQL服务器
- ubuntu 16源码安装zabbix4.2
- 升级阿里云主机系统镜像
- 关于对于工作方式的一些总结。
- 用visio制作机柜服务器,ibm visio 服务器机柜图标
- 酷派手机android版本,酷派大神F2的手机系统是什么?能升级安卓4.3吗?