报销单业务笔记
报销单是个通用场景,有通用逻辑,在此基础上进行适度定制,省时省力,所以记录下吧。
涉及的实体。
报销单
发票(用来报销)
总体是多对多关系,单次请求是一对多关系。
业务点
1、号码列表不能重复。
业务点-对公对私
对私 一张发票只允许一张单据号占用。
对公 不进行对私校验。
业务点-多系统标志
允许多业务系统占用。
特殊业务
对公对私 # 对公对私
跨系统标志 # 允许多系统使用
入参
入参报文
{"documentNumber": "Document202403040001","userAccount": "a-chushiyun","sourceSystem": "crm","invoiceList": [{"invoiceCode": "1111122222","invoiceNumber": "66668888","useAmount": "1","businessTypeLh": "1"}]
}
出参
出参报文
中间的逻辑
基于这种特殊的多对多关系,中间的逻辑就比较重要了。
单据号
代码
号码
特殊业务1标志
特殊业务1反馈消息
特殊业务2标志
特殊业务2提示信息
价税合计 # 不变
已占用金额总和 # 求和
可用金额 # 直接查出
本次使用金额 # 入参传
新可用金额 #
金额正确标志 # 校验
金额正确提示信息 #
标志如果全部正确,该条记录放到成功列表。
标志如果不全部正确,该条记录放到失败列表。
可以通过sql直接查出来吗?
多对多关系
其他
应该是整体成功还是可以部分成功
从合理性来说,应该是部分成功更好,例如一个报销单10张发票,9张成功,1张不符合,那么关联9张即可,这样避免事务回滚。
成功列表
代码
号码
失败列表
代码
号码
提示信息
这种多对多关多关系有没有优雅的判断方式
单据 --1:N–> 发票列表 --1:N–> 每张发票关联的记录
全查出来再逐条判断是不是太丑陋了,而且性能超低(目前就是这么做的,好处是实现起来方便些)。
特殊业务概念可以通过分组及开窗等直接算出来,化为一个个定制字段,这样就比较简单了。
连金额等也应该可以直接算出来。
注:统计后的数据也应该是基于发票的,也就是说是多条。