红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【BudgetMatch】Admin后台展示支付状态和流水信息

运营侧需要查看订单是否已支付,以及支付宝交易号等排障信息。

# 任务

实现

事实上,订单状态和流水在项目里是两套数据,mallrpc只有paytime,其他的都在paymentrpc的表里

因此要先设计一条不会让网关直连数据库、也不会在列表中逐单调用支付宝的查询链路

可以在mallrpc的订单查询读模型,而不是直接接paymentrpc,因为mallorders已经保存了最终确认的订单号,时间等,若在admin网关逐条查流水,会产生n+1调用,并且分页也不准确

n+1查询(n+1调用)本质在于程序为了获取一个“主对象”列表及其关联的“子对象”信息,错误地执行了“一次”用于查询主列表的查询,以及紧随其后的“N次”用于查询每个主对象所关联子对象的、额外的独立查询,从而总共向数据库发起了“N+1”次查询

首先,我们需要自己定义一套支付状态枚举,而不是把订单状态作为支付状态,因为订单状态包括更多业务状态

  • -1表示全部,用于筛选请求
  • 1表示未支付,支付相关的字段全为空(out_trade_no、trade_no、pay_time)
  • 2表示已支付,上面三个字段全存在
  • 3表示异常,只有一部分存在

修改mallRPC相关字段,让他带上payment侧特有的字段包括我们定义的枚举

common.go添加相对应的状态计算和rpc映射函数,根据传入的支付凭证完整性计算运营侧支付状态

并且需要在数据库分页前应用筛选,在mall的model中更改,并且需要在count之前

接下来在admin API文件中补充字段,并修改order_list逻辑向rpc传递status

# 验收标准

# 测试

测试支付状态计算:在logic下新建common_test文件,构造多种状态对应枚举的test

新建vars_test文件,测试订单返回的status是否是符合预期的

最后是全链路测试,模拟一次支付看最后是否是预期的payment_status