web系统中,导入功能的设计要点

相对于玉树临风的功能界面,导入,显得猥琐又懒散。但对于Web系统而言,导入,有时恰是当时境况下的最优解。

一、一个漫不经心的案例

业务场景:物流供应商制定收费规则(如下图),订单发货之后,自动进行物流费用核算。

从上图可见,规则信息项包括:渠道名称、国家、是否计材积重、材积重系数、重量区间、最低起重、运算公式。

并且:

  • 一个渠道,可以对多个国家 。
  • 一个渠道+国家,可以有多个重量区间。
  • 一个渠道+国家,只能有一个最低起重,只能一个是否计材积重、以及材积重系数。
  • 一个渠道+国家+重量区间,只能有一个计算公式。
  • 一个渠道+国家+重量区间+起止时间,是唯一的。
  • ……

了解了以上,基本可以设置一个创建规则的结构:

这个原型的特点之一是丑,第二个特点是存在一定量的前端交互。

但这时,出现一个客观问题——前端开发人员不够。

为了项目进度,第一版,决定采用导入的方式。

为啥呢?因为导入把页面操作都省了。

二、导入方式

在关系型数据库中(参考文章:《后端产品经理笔记之查询数据库》),数据表结构和Excel表结构相似。

所以这样的场景下,导入功能无异是短直快。

导入一般是从最小粒度开始的。一个渠道+国家+重量区间+起止时间,是最小的数据粒度。

但是看上图的表格导入,要考虑挺多问题。比如,我们知道,渠道+国家+起止时间相同的行,可以拟定为一组规则。

所谓一组,就是只有重量区间不同。那么这组拟定规则中,各行的重量区间不能有交叉:

  • 与已经存在的同组规则的重量区间不能交叉;
  • 起止时间不能交叉。
  • 与已经存在的同组规则的起止时间不能交叉;
  • 各行的最低起重要一致;
  • 各行的是否计材积重一致;
  • ……

整理一下要考察的项,基本和下图差不多。

这样导入,看着没毛病,实现起来事倍功半。

首先,Excel不便于做复杂校验。

尽量做轻量校验,把数据带入系统之后,在页面承担更多工作。

其次,尽量提升数据最小粒度的颗粒度。

因为粒度一旦细致,就会倍增式地出现交叉校验。

再次,尽量在摘出具有共性的参数,导入之后再统一页面处理。

基于以上现状和方向,再次回归业务进一步掉研。如下:

业务会定期给卖家提供更新的报价方案。比如对1月份发货的订单定下了价格,结果2月出现疫情,需要涨价,于是2月修订价格,应用于2月发货的订单。而我们所说的起止时间,不是规则生效的时间,而是适用于的订单的发货的时间。

以上可以看出来,其实每一次修订,都可看做一次更新迭代。每次迭代,都可以将所有变化和未变化的都导入一遍。于是就可以将起止时间独立出来,放在最外层。也就是导入的这一批适用的订单的发货时间是一致的。

再看‘是否计材积重’。

它表达的是,一些货物是否按体积折算出重量。比如一车棉花,按实际重收费就亏了。因此,这个判断的场景一般是发货的时候,由渠道定的。

所以可以统一在导入之后,与渠道做关联。也就把这项,从导入的规则明细中剔除出来。

三、做了这个导入功能

于是导入的模板就简化为这样:

正常做:

1)导入框

(2)校验

第一:校验导入的文件是否正确

表文件A-I是否对的上,对不上视为模板错误。直接报告文件错误,不再进入详情校验。

第二,校验内容

  • 必填项不能为空
  • 重量起点(g)<重量止点(g)
  • 单元格内容需被系统识别或格式正确。

先判断不需要查表的项,再判断国家、物流渠道名称这些需要查表的项。

  • 以A+B+C+D列判重,若存在重复的行,则对第二及其后的重复行报错.
  • A+B列相同的行之间,重量区间不能交叉。

交叉的规则:假设重量区间a-b、e-f,若出现a< e<b、e < a < f、a< f<b、e < b < f任一种情况,则视为这两个区间交叉,则对第二及其后的重复行报错。

这里为啥不校验系统已存在的数据呢?

因为我们用起止时间,将这种本次导入与历史数据的重复规避掉了。具体就是:

全部校验通过,导入这一批,生成一个批次号,这个批次号需要编辑一个起止时间,这个起止时间不能与其他批次号的起止时间交叉。

这时候还余下一个参数 :是否计材积重。在编辑时间的时候进行编辑即可。如下图:

总结这个案例,物流费用规则的页面有两层:

(1)列表页:版本号维度。每成功导入一次,则生成一条对应的版本号数据。

每个版本号对应一批规则,对应同一个适用时间,因此通过版本号标定这一批规则,并将适用时间与版本号进行关联,而不与具体的规则明细关联,简单清晰。贴近业务场景。

(2)明细页:显示某一版本号下的全部规则明细。也就是导入的每一行规则。

四、姗姗来迟的小结

(1)导入的本质:

是将Excel的指定列,赋予数据库的某个字段,比如A列对应字段‘渠道名称’。

(2)导入时候的校验项很多,一条数据不止命中一个错误。

一般而言,按规则的顺序,每一行只报一个错误原因。

(3)因为可能需要反复校验多个校验项,所以依次进行,从简到难。比如:

  • 优先是必填项不能为空,单元格内容格式正确。
  • 然后才是核对数据是否存在于基础数据库中;
  • 最后检测本次导入与已存在数的冲突性校验,比如重复。

(4)每校验一项内容,都将全部数据跑完。

比如四个校验项,100条数据。

先跑校验项1,将各行都检测完;都没错,则跑规则2,出错则报错。

下次修复后再次导入,则还是从验项一跑到验项四。

(5)导入的格式与性能有关

CSV格式的系统开心,秒传,但是用户优势不大喜欢。Excel相反。

(6)与历史数据的更新还是覆盖?这个情况让用户选了。

(7)一旦一条出错,是否全部不予导入呢?

一般而言,若是提交给另外的系统,那通过的基本就写入了,就没法回滚了。所以就部分正确则部分导入。

如果是自己系统,一般一旦一个写入错误,则全部回滚,全部检查,直至全部OK才写入。确保完整性。

(8)报错的方式

十几二十条就在弹框说明谁是错的就可以。过多数据的就Excel报错。

(9)Excel 模板可以做什么?

可以加表头标注,加注释说明,加第二分页。但是要开发知道。说明哪些区域是导入区。

(10)导入是猥琐的。但是也有主动使用导入的场景,比如:

从1688导出了订单的采购信息,包括物流单号等。这时候如果要把物流单号加到自己系统中去,一个个加入肯定费劲,直接导入就很快了。

另外其实案例的这个数据量上千,导入也是比较合适的。所以导入的功能是猥琐了点,但是有时候可以大用。

转自:web系统中,导入功能的设计要点

原文链接:http://www.woshipm.com/pd/3465481.html