快生活 - 生活常识大全

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


  相对于玉树临风的功能界面,导入,显得猥琐又懒散。但对于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导出了订单的采购信息,包括物流单号等。这时候如果要把物流单号加到自己系统中去,一个个加入肯定费劲,直接导入就很快了。
  另外其实案例的这个数据量上千,导入也是比较合适的。所以导入的功能是猥琐了点,但是有时候可以大用。
网站目录投稿:冰梦