掘金 后端 ( ) • 2024-03-04 09:52

背景介绍 这个接口的背景是这样的,tms(运输管理系统)会下发出库任务给我们的系统,我们的系统是wms(仓库管理系统),一个调度单会调用一个我们的接口一次。一个调度单里面会有很多的包件,一辆车上会有很多的调度单,一个月台(可以理解为仓库前面的停车装货的地方),一次发货会发几个月台的数据。对面是开启并发来调用我这个接口的,并发量大概一瞬间最高的时候可能会有300左右。

业务流程介绍 首先会把接收到的数据插入到接口表中(接口入参如下),headers中的每条数据都会插入一条数据

image.png

image.png

然后开启异步线程,判断传参中headerDTO承运商(vendorCode)在承运商表是否存在,不存在的话需要插入A库和B库。插入B库的时候时使用db_link,最后把集合headers中的每条数据都插入到发货头表中。

具体代码 把所有的参数校验放在最前面(因为最开始对接口的时候字段和全局返回的字段不一样,这个报错只能自己手写),校验的字段太多,截图没有截全。 image.png

幂等性校验

image.png

我这里是在数据库里面加了调度单Id(departId)的唯一索引。如果有这个这个调度单了直接返回成功。这里我理解,单个插入和批量插入应该都是可以这样做的。各位大佬如果看了觉得有问题可以提醒一下小弟。

然后开启异步线程执行后面的插入承运商和发货计划 插入承运商表,这里因为需要根据每个的订单ID去查订单,然后还要查工厂,为了省事,这里就直接在循环中国写插入的sql。

image.png

插入承运商的时候是调用的一个已经写好的存储过程

image.png

先查询有没有,没有就使用db_link两个数据库都会插入一条数据,这里db_link会非常慢,这里会导致接口超时,这也是我使用异步的原因。

image.png

接下来就是插入接口头表,因为我需要把每条数据插入的失败的原因写入到数据库的接口表中(使用attribute9和10来表示插入是否成功,以及失败的原因,方便到时候人工介入。所以我能想到的就是循环里面写sql去插入。然后通过try catch去驳货插入发货头表失败的原因然后写入到接口表中,表示这条数据插入失败,然后人工介入)

image.png

以上就是所有的流程了。我感觉这样能够满足幂等性,然后还能提高接口的效率。可能还有很多不完善的地方。希望各位比我还新手的人能够得到借鉴,然后能够比我写的好很多,我扪心自问觉得自己写的这个比较垃圾。希望能够得到各位优秀的程序员的指点。