问题描述:在开完蓝票进行退款后系统应自动回收蓝票并开冲红发票
退款的流程:
- 加载子订单信息
- 子订单进行验证与冻结
- 判断冻结结果,如果结果失败的话拒绝批量退款申请并取消冻结,如果成功进行下一步
- 审核批退款(由管理员手动操作同意或者拒绝),如果拒绝则取消冻结,如果同意则进入下一步
- 进行回收资源,如果回收失败则重试,如果回收成功更新回收状态
- 判断批量退款模式,如果是线上支付,需由管理员手动操作是否允许退款(如果是则退款后进入下一步,否则直接进行下一步),如果是线下支付,确认线下批量退款后结束
- 判断批审核结果,如果有符合退款条件则处理批量退款,否则直接结束
- 如果处理批量退款成功则进行发票冲红处理,若失败则重新尝试批量退款
- 发票冲红是通过事件处理,使用MQ将数据存放到ES上,查询数据时通过ES查询。
遇到的问题:
-
申请退款时:has a non-private no-argument constructor
解决方案:
通过k8s日志查看定位出错误位置与信息
错误原因是没有构造器,因为内部类并没有声明是static,因此构造器无法被其他类所访问,导致错误。
-
批次退款申请成功,但无法开出冲红发票:
排查流程:
- zeebe上查看确保流程全部走完。
- 控制台查看日志,是否出现错误(无),查询数据库并未发现冲红发票的数据。
- 使用Remote进行断点调试,发现数据库中并没有查询到需要冲红的发票(定位到查询参数问题)。
- 发现查询参数的一个字段写死;导致未能查询到需要冲红的发票。
- 将写死的字段改为空后,数据库出现冲红发票数据,但页面展示中并没有冲红数据(因此出现问题的地方只会在MQ发送事件或者ES)。
- 打开RocketMQ的控制台中,确认MQ已经发送,并且已经被消费。
- 有了报错日志就可以定位到错误的位置(当时打开k8s控制台也并没有报出错误,其实应该会报错的,但由于MQ消费到了其他机子上并未消费到开发环境的机子中,没有获得报错日志)。如果没有日志可以通过MQ重发,在消费者消费事件中调试。
- 最后是因按 批量退款订单编号查找批量退款订单的方法 传入参数时,使用的是订单号传入,因为导致没有查找到数据,最后需要返回一个int类型的值,导致的空指针异常。