本文来自微信公众号 “晓乐同学产品笔记品”,作者: Leroy,纷传经授权发布。
在跨境出口电商业务中,我们知道当买家购买了某个店铺的商品时,即创建了一个电商订单,接下来卖家将为买家拣货打包,并通过合作的国际出口物流公司获取包裹的物流单号,回填到电商系统给买家查看,这样就完成了订单商品的出库发货。
那么卖家是如何获取物流单号的呢?
卖家通过物流系统获取物流单号其实是一个下单的过程,即卖家在第三方物流系统中,创建了一个物流订单,下单成功后,物流系统会给出物流单号并打印面单。
创建一个出口国际物流订单,如USPS、UPS快递等,需要录入的字段包括但不限于:
发件人姓名、电话、发件地址、收件人姓名、电话、收件地址、包裹重量、运输方式、服务渠道、订单号、商品中英文品名、数量、单价、海关编码等多个商品或包裹属性信息
以上字段中的收发件信息,以及商品信息都来自于电商订单,也就是说卖家需要将电商订单的相关字段信息录入到物流系统,才能据此获取到物流单号。
针对解决卖家将电商订单信息录入到物流系统中这一问题,目前市场上有以下一些方式:
(1)较大的外贸电商企业会自研ERP系统,或者企业自行采购行业流行的ERP系统,都与主流的物流公司做了系统间的API对接,自动化程度较高;
(2)但是还有一部分小卖家由于体量较小,没有使用ERP做发货管理,仍在使用物流公司提供的系统;
(3)另外,还存在一部分卖家的ERP系统没有实现与物流公司API的对接,一方面由于市场上的物流公司比较繁杂,参差不齐,只与主流的物流公司做了API对接,另一方面原因是卖家只是想暂时性短期试用而已,也是在单独使用物流公司提供的系统;
综上所述,相对于第一种方式,后两种方式的自动化程度较低,都需要独立使用物流系统。
由于Amazon、eBay等跨境电商平台要求卖家的发货时效,而且发货订单量较多(上万单比较常见),这种情况下卖家根本无法依靠在第三方物流系统中一个个录入来完成,因为表单需要提交的字段非常多,人工的方式带来的是更高的错误率和更久的工作时间,一旦录入错误,将严重影响包裹的投递,可能会导致理赔的产生,造成经济损失。
因此,订单逐个录入的方式在降低卖家的工作效率的同时,也严重影响店铺的时效性和买家满意度,对物流提供商的好感度也随之降低。
01
定位问题
通过上述场景我们发现,客户想寻求短时间内快速将大量的订单数据录入到系统中的方式,一方面需要节省时间,另一方面要避免数据录入错误,所面临的问题本质上是提升效率的问题,这包括数据录入的便捷性和准确性,减少操作时间和操作人员,满足企业降本增效的诉求。
如果无法完成大量数据的快速录入,企业将无法及时的获取物流单号,为企业赢得市场竞争力,降低买家购物满意度,同时这也会使得我们流失卖家客户。
02
功能方案
当客户需要提交大量且多条重复性的数据时,如果要一条条录入,的确花费大量时间,错误率也会提升。依据经验,我们知道针对数据的批量录入,除了通过数据库间的API自动传输方式,更高效的方式就是使用程序来读取数据文件,实现线下数据到线上的批量导入,可以快速完成数据写入。
需要导入的线下数据为卖家提供的外贸发货订单数据,此数据需要从外贸平台中导出Excel表格文件,同时由于Excel文件天生又具有数据存储和维护的优越性,与数据库字段信息的存储方式具有高度一致性,因此我们把Excel格式作为线下数据导入文件的格式是比较合适的。
但是,不是任何Excel文件都可以随意导入,由于创建出口物流订单需要指定的字段信息,这就对要导入的的Excel文件有一定的要求,一方面要包括这些指定字段信息的名称,另一方面在导入时可以被程序正确的读取,并写入数据库,而需要导入的数据可能来自很多外贸电商平台,字段信息的存储方式五花八门,没有统一规则,因此就必须要统一一份系统要求的模板,规定需要哪些字段、字段的名称、字段的格式等,作为系统之间的数据桥梁,来自任何平台的订单数据文件,都要依照模板文件,统一字段名称和字段格式之后才能被程序正确识别。
而且后续功能迭代过程中,如果导入规则发生变化,涉及到模板文件需要更改,这时候只需要更新一份对外的模板文件即可。
有了批量导入功能,卖家就可以预先把发货订单数据从外贸电商系统中导出,再批量复制字段信息填入系统提供的标准Excel模板文件中,将此文件上传后,就可以导入所有订单数据,批量获取物流发货单号了。
那么,简单的批量导入功能,如何更好的设计使用体验,才能在提升工作效率的同时,又能降低数据录入的错误率呢?
回到功能的场景中,我们把批量导入功能分成三个环节来设计使用体验。
导入前:设计Excel模板
由于导入数据的模板需要客户手动维护完整,确保各个字段的格式填写正确,否则会导致第一步就出现导入失败的结果,使用者却很茫然,不知如何修改,反复导入错误,带来工作烦恼。
例如,客户在从源数据表格中复制“订单号”这一列值,粘贴到目标模板文件“订单编号”列的过程中,连同源数据表头名称一起复制,导致粘贴操作后,模板文件的表头名称“订单编号”也被修改为“订单号”,客户没有察觉,程序也无法正确识别。
再比如,客户预报的包裹重量单位,有些平台导出的是克,有些是千克,如果客户没有注意到模板文件的重量单位,模板也没有对字段值做数据有效性校验,也将会造成运费计算错误的严重后果。
因此,一份清晰易维护的模板,可以让客户在填写表格阶段加快维护数据的速度,降低后期导入错误的发生率。设计模板时要依据业务要求梳理出所有相关字段以及业务字段的格式要求,将网页表单输入的要求映射到Excel单元格中,并着重考虑数据的完整性和规范性,需要注意以下几点:
(1)字段是否必须填写
在创建一个物流订单所需要提交的字段中,有些是必须要填写,而有些可以选择性填写,目的仅仅是为了增加业务的准确度,但是不填写并不会影响获取物流单号。因此,模板文件中可以使用标识,比如使用*号或者标记颜色,加快客户完成模板文件的速度;
例如收件人信息部分,红色表头为必填项:
(2)选择项字段的填写
由于有些业务字段有多个规定值,需要在系统规定的类型值中选择一个,无法让客户输入自定义文本值,对于这些字段的录入,单元格必须采用下拉选择的方式,如果采用输入的方式,会发生填写值与规定值不一致的问题,导入时系统无法正确匹配,就会发生错误;
例如模板中“包裹商品是否带电”这一字段,若让客户习惯性的填写“是”或“否”,导入就会失败,却不易察觉,因此模板采用下拉列表的方式,要求填写“Y”或"N"。
(3)字段的长度与格式
为了确保写入数据库的字段值具备业务正确性,成功创建物流订单,起初在模板中就要针对相关字段录入做出要求与规定。
例如美国境内“收件人手机号”字段不能少于10位,字段“商品英文品名”,要求不能含中文字符,字段“申报价格”仅能填写数值。
(4)锁定表头字段
模板导入数据有两种方式,分别为顺序匹配和列名匹配,顺序匹配即指定模板固定列字段与数据库中指定字段映射匹配,写入数据库,而列名匹配是依据模板中列字段名称与数据库字段名称相同则匹配为原理,无论哪一种方式,随意更改模板文件的表头,都无法按照程序的规则读取数据。
例如前文所提到的案例,模板文件中的“订单编号”误被客户改为“订单号”,但程序读取仅识别“订单编号”。
表头,即表格的字段所在行,在读取数据过程中是重要的识别信息,模板中会提前预设。
为了避免客户误修改表格的表头名称、顺序,需要使用Excel功能锁定表头,禁止修改,以免导致导入时字段名称与数据库字段名称无法匹配或字段值与数据库字段匹配错误的结果,这种错误发生后是很难被觉察的;
(5)友好的输入引导
对于一些业务特别要求或者其它事宜,需要在表格中给予明显的文字提示,引导客户正确录入,例如输入重量,要告知重量单位,输入收件国家,要使用国家简称,如US,最好可以给予一些输入案例。
(6)易辨识的文件名称
回到功能场景中,当客户下载完模板文件后,并录入数据后,需要重新从本地选择该文件。如果下载的模板文件名称难以辨识,如"template.xls"、“RSVp8ApVpZUt.xls”等,选择文件的时候会产生困扰,也会导致出错的可能。
例如“CreateParcelTemplate0810”作为文件名称,其中"CreateParcelTemplate"表示此模板的场景用途是用于创建物流包裹的,类似的有“ImportCustomerTemplate”,表示用途为导入客户资料模板,“0810”是此模板的下载日期,表示是今天获取的模板文件,避免和本地的历史模板文件混淆。
依据场景用途和模板文件日期作为标识,相对来说就比较方便的从本地选择,否则如果导入了错误的文件,会直接得到系统的报错,客户却怀疑是模板数据维护错误还是文件选择错误?
(7)模板文件的版本
由于业务变动的原因,模板文件可能会随之变化,如果客户仍然使用本地下载的历史模板录入数据,会导致导入失败的情况,因此模板文件需要支持后台上传新版本的模板文件,并在客户的前端页面相应位置提醒客户重新下载模板文件,模板中也要标明文件的版本号,以防用错。
导入中:读取写入
(1)写入前校验
导入模板文件后,系统首先需要检查文件格式是否正确,非Excel表格文件禁止读取。
其次,校验表格文件的表头。表格在导入的过程中,会将表头字段名与数据库字段表作校验匹配,只有只有完全一致才可以成功写入数据库,否则程序会报告某个字段名无法匹配的错误结果。
另外还需要检查表格记录间是否有空行或空列,否则程序在读取数据的过程中遇到空行记录认为读取完全,遇到空列认为字段已经读取完全,从而终止程序的进行,导致读取不完整或读取报错。
(2)忽略问题数据
当程序遇到字段值格式不合法时,直接跳过该行记录的导入,继续执行下一行即可,不需要直接报错。否则,由于某一行的错误会导致其它所有数据都会无法导入,只有当人工找出错误行记录并修正后,才能全部导入,客户可能会没有耐心。更有效率的做法是,程序先写入绝大部分正确的数据,有问题的记录在导入结束后统一将导入报告反馈给客户,修改后重新导入。
(3)处理重复导入
考虑到手动维护模板文件过程中难免存在失误的情况,重复导入就可能会发生。那什么特征的数据下会被认为是重复导入的数据呢?这就需要先了解数据记录的唯一性。
由于的数据库中的数据表在存储信息时,会把某个字段用来标识数据记录行唯一性,其值不得重复,也称作主键字段或一级索引,例如导入员工薪水,工号为主键字段,表示员工薪水的唯一性,导入外贸订单,订单号为主键字段表示订单的唯一性,一旦多条数据记录之间的主键字段值相同,就被程序认定为它们是重复记录。
例如在导入订单中中,存在两行订单号号均为“20062734325435345”的订单记录,第12行导入完成后,第15行会被认为是重复记录。
当程序读取到重复记录时,是直接覆盖更新原先已导入的数据,还是直接停止导入,或者交给用户选择呢?不同的方式就会导致不同的导入结果,因此我们需要给出相应的处理方案,来确保导入结果的准确性。
回到客户获取物流单号的业务逻辑中,我们先分析一下为什么会导致重复导入的情况发生?有以下3种原因:
第一种,标识唯一性的订单号是相同的,但其它字段值有不同,例如上图的“运输方式”,这种情况下由于系统无法判断第15行的数据是否有效,就需要在导入完成后交给用户自行选择:不导入还是覆盖第12行数据;
第二种,由于获取物流单号是需要从客户账户扣除费用的,在第一次导入后由于余额不足,导致大量外贸订单即使已经导入物流系统,生成了物流订单,但扣费不成功,导致获取物流单号的状态都是:获取失败,充值后又需要再次导入一遍,重新批量获取单号。因此对于物流单号获取失败的订单记录,可以允许再次导入重复的记录;
最后一种纯粹是操作失误导致的,多条记录行的各个字段值都完全相同。由于上述第二种情况的存在,这种情况可以禁止再次导入重复的记录,但要求原导入的记录已经成功获取物流单号;
综上,是否重复导入由两个因素决定:字段是否完全重复和获取单号状态,处理方式如下图所示。
(4)导入进度反馈
更重要的是,当客户在导入成千上万甚至更大量的数据过程中,加上程序性能、网络环境等影响,会花费更多的时间等待,而客户的心理可能是焦急的,对于当前导入的进度,当前的导入程序是否在正常运行,接下来会不会导入失败,是渴望知晓的。因此友好的导入进度反馈必不可少,通过页面的提示,客户可以知道当前已导入数量,做到心里有数。
(5)异步处理
从技术的角度说,针对较大数据量的导入场景,可以采用异步的处理方式,进一步降低客户的焦急心理。所谓异步,就是页面导入模板后,后端接收请求并执行读取和写入任务,而此时客户可以不用停留在原处等待,离开当前页面去处理其它工作任务,等待片刻后再打开导入页面查看导入结果,避免了因采用同步的处理方式导致长时间等待的结果,客户体验会更好,工作效率也会更高。
导入后:反馈结果
辛辛苦苦维护数据并完成导入,现在到了查看导入结果的时候了。
导入结果中,主要关心以下几点:
(1)核对数量
由于手动维护的模板文件中,难免会出现字段值填写不合法、重复数据记录等错误情况发生,这就会导致无法正确的一次性顺利导入所有模板数据,为便于客户知晓错误发生的具体情况,就有必要知道导入成功数量、导入失败数量和导入重复数量,并确保:失败+重复+成功=总数量,这样的导入结果反馈才会让客户觉得比较清晰、直观,不会出现漏数据的情况。
如果没有导入数量的核对,直接告诉客诉"导入成功"或“导入失败”的结果,会让人很迷惑,对模板数据的导入结果不清不楚,客户可能还需要去相关的页面上通过查询来判断哪些数据已经导入成功了,哪些数据没有导入,容易核对混乱。
(2)处理失败记录
核对完数量之后,由于数据未导入完全,接下来就需要给出未导入成功的具体原因了,方便客户快速定位问题、查明原因,可以有目的性的去做相应修改调整,再次导入。
同时,针对失败原因,我们要给出操作引导:
字段格式长度错误的数据,提示客户修改模板后,重新导入即可;
扣费失败的数据,提示客户重新充值后,再次导入即可;
对于上文所说的第一种重复导入情况,需要客户自行决定导入还是直接跳过;
需要再次导入的数据,可以支持汇总导出为Excel文件,方便直接修改,在导出的文件中对于字段不合法导致的问题,直接标红数据所在单元格,客户查找修改也比较方便;
03
总结回顾
批量导入功能在B端产品设计中很常见,是企业降本增效的重要功能形式。
例如:
企业内部系统上线,需要批量导入企业客户资料,做数据初始化
企业财务做账时,需要批量导入线下账单,确保系统中财务数据完整性
批量导入外部数据源,对数据源做系统化加工处理,再导出使用
......
上述的解决方案从导入前、导入中和导入后三个阶段,解释了相应设计是如何为客户带来效率提升的,要考虑的细节体验还是挺多的,稍有疏忽,都可能会导致数据写入失败,或者导入结果反馈不够,但客户却不知道问题发生的原因,如何解决。