日期:2014-05-18  浏览次数:20847 次

问一个单据多对多的问题
我有两个业务流程,一个是收货,一个是发货,分别对应收货单和发货单。
他们是多对多的关系:
一个收货单里面有很多货物,可能要多个承运商来运,也就是一张收货单对应多张发货单。
一个是多张收货单给一个承运商来运,也就是多张收货单对应一张发货单。

我想了一下,可以在系统里面对收货单进行虚拟拆单,因为实际业务中收货单是不能拆分的,拿回来的单据里面是什么就是什么,但是这样的话处理起来会麻烦一点,因为得保证使用人员在操作系统时看到的就是一张收货单。
请问大家是怎么处理的?

------解决方案--------------------
同意你的意思,也就是以单笔操作作为系统内部的标准,然后在系统边界的时候再做composite处理
建模的过程不是对照客观事实1:1建模,二是要分析内在的逻辑
只是简单的看了一下,对你的单据不很了解,只是给个思路
------解决方案--------------------
额,我认为lz没有分清楚 业务流程 和业务凭证的关系

收货单,发货单实际都是业务凭证,而非业务本身。所以我们不纠结这个,业务该怎么做就怎么做,到那一步改发出那个凭证就发出那个凭证。
------解决方案--------------------
而且这里面还有两个状态问题

收货通知单 和 收货确认单 不是一个东西

发货申请单 和 发货确认单 也不是一个东西

当然从凭证的角度上说,发货申请单,收货通知单其实并不能叫凭证,他们其实是管理流上的东西。而真正的凭证其实是确认单
------解决方案--------------------
可否换个角度思考这个问题:

1. 货单:记载一张货单及其包括的各类商品;
2. 承运单:记载某件货物由某个承运人运输。

那么对于开单的用户而言,货单仍旧是货单。而对于承运人,某一次的承运单,就是查询特定承运人、特定订单编号下的商品列表。
------解决方案--------------------
其实这个问题我们可以用借钱来说

我现在急缺钱用,我四处找人借钱。假设我四处给朋友投“借钱申请单”,如果没人理我那也没后面的事情

如果说有2朋友正好有闲钱,也愿意给我,他们把钱借给我了,而我呢则要给他们开一个凭证“借条”,同时呢我在我的记账软件上写上“应付账款xxx元”,备注上写“欠xx多少钱”


=========================================
这里面“借钱申请单”,这个是管理流的东西,无论成不成,没人会把这玩意保存滴。

记账软件上那是实际发生的业务,他怎么发生的就怎么写

而借条是凭证,就是我证明这个业务以发生。他是证明。但不是业务本身,业务本身是人家把钱给我,我把钱入帐,同时开具凭证证明他把钱给了我
------解决方案--------------------
它们没有直接关系。它们跟库存都会发生关系。凡是“多对多关系”的认识,这都说明你的分析不够细致,你没有认识到中间起桥梁作用的对象类型。
------解决方案--------------------
比如说快递,不同的收货的人把货进入到“当日应配货库存”里,然后才统一配货吧!那些小工每晚7点钟就蹲在我们大楼的地下室门口将收来的货再分拣开,没有见过哪一个收货的人中午刚刚在各个公司收货的时候就直接跑出去把货发出去了。
------解决方案--------------------
而就工作流来说,一个工作就是创建了一个独立的任务(或者说单据也不为过)。这就好像孔丘说的“逝者如斯”或者如赫拉克利特所说的“人不能两次踏入同一段河流”。或者就像是电影胶片,虽然有蒙太奇等等表现形式可以让时光倒流,但是电影胶片不会倒流。或者就好象你在电话键盘上拨号码8058.....,第二个8虽然跟第一个8号码相同,但是状态完全不同。或者就好象是配货的车送错了,又重新卸货又重新送了,你不能忽视这个过程记录。

因此就很容看出你纠结的问题,送货怎么就不能按照自己的方便去送货了,就算是一批货物分3批送货,就算有一批货物过了很多天发货,就算有些货物丢失了,就算有五分之一的货物一位内装错了车而又运回公司卸货并重新配货发送,那么也不应该纠结于“得保证使用人员在操作系统时看到的就是一张收货单”而设计不出你的系统吧。

只要你从现实出发,就能找回你总是丢失了的、起桥梁作用对象类型。否则那就是“为了死抠几个编程字眼而忘记了真正要求反应实际应用领域的问题”。