做了一版文件上传识别的功能,用于报销系统。
踩了一些坑,记录下可行的实践。
需求:上传图片或局端版式文件,识别出发票信息,一张图可能有多张发票。
流程
上传 | 识别 | 入库。
入参
file
fileName # 其实可以没有,file本身就自带文件名
出参
success # 成功失败标志
message # 提示信息
fileId # 上传的文件id
fileName # 文件名
infoList # 发票列表
- code # 发票代码
- number # 发票号码
- oneSuccess # 单张提示信息
- oneMessage # 单张提示信息
关于出参的处理。
success如果为false,直接展示文件名及提示信息即可。 # 例如调用识别接口报错
sucess如果为true,遍历infoList,根据单张的success来判断。# 例如单张票已报销过
版式文件覆盖逻辑
场景:
一开始传的是图片,后来拿到了版式,很明显,版式才是最正确的文件。
那么版式要覆盖。
这里分为几个场景。
1、无此发票 # 新增报销
2、有此发票 已有版式
3、有此发票 没有版式(有图片或连图片也没有)
4、有此发票 已有版式 新文件是版式
5、有此发票 没有版式 新文件不是版式
上面场景是从最全考虑,实际可以归纳为:
1、无此发票。# 新增报销
2、==有此发票 没有版式 新文件是版式 ==# 只有这种情况需要覆盖
3、其他因为不涉及覆盖,所以都直接提示已报销即可。
当然,如果后来的版式是覆盖的逻辑,也可以为:
1、无此发票。# 新增报销
2、有此发票 新文件是版式 # 和上面的区别是,只要新文件是版式,那么就覆盖
3、其他因为不涉及覆盖,所以都直接提示已报销即可。
反馈结构
反馈结构最初的场景是一对多,例如一个文件多个业务。
每个业务都有单独的成功失败标志,所以不能用最外层的成功标志和提示信息。
一个文件多个业务
前端或业务系统对接时,其实可以不管最外层成功标志如何,只有list有数据,就循环展示list数据即可。
总成功场景
因为肯定是for循环,单条异常单独处理了。
如果单条成功,list.add(oneSuccess);
如果单挑失败,list.add(oneError);
总失败场景
这里说的是总失败场景。
那么返回信息里面补一条错误对象。
Arrays.asList(oneError);
一个文件一个业务
和上面的区别就是没有for循环。
成功场景
list.add(oneSuccess);
失败场景
Arrays.asList(oneError);