作者:秋时 杨昶 转载须说明出处
单据流转主要为了实现业务关系的流转,并记录相互之间的关系。例如从销售订单生成销货单,两张单据之间有对应的关联关系。
单据流转时,各个字段流转均有具体的算法。典型字段如下:
1)表头的往来单位字段,流转后,两张单据往来单位是一致的。此场景相当于直接赋值。
2)表头的单据编码,流转后,两张单据的编码有属于自己的编码规则。此场景相当于走自己的默认规则,与来源单据无关。
3)表体的数量字段,销售订单上有10个,部分流转到销货单3个,那么下次流转时,应该流转7个,而不是10个。此场景相当于需要进行计算才能得出正确值。
1.从单据界面,二次开发,单据流转配置进入单据流转配置
2.新增一行,其中主实体和目标实体均设置为各自实体的表头实体
3.中间转换项目页签,是具体定义了表头到表头字段,表体到表体字段的转换关系
4.设置表头表体具体字段对应,可以使用提取工具,提取所有字段。
5.留下要用的转换字段。表头字段转换内容如下
6.表体字段转换如下,其中数量和金额都是公式计算,设置完成后保存
1.进入回写页签,上游字段指来源实体的字段,下游字段指目标实体的字段。超单验证勾上,超量验证字段填入来源实体的字段。
1.在方案表单界面,把源明细实体和目标明细实体填上,程序会根据主实体和明细实体进行单据转换
1.配置选单脚本,要求往来单位一致且不停用,订单是生效状态,选单时销售订单的累计销货数量小于数量。选单脚本如下:
1 using Demo.Sales.Entity 2 3 using System.Data 4 5 6 7 //发货单 选 销售订单 的 选单条件 8 9 public QueryStruct Generate(IEntity header) 10 11 { 12 13 //header表示当前所在单据发货单 14 15 SalesDelivery delivery = header as SalesDelivery; 16 17 18 19 List<string> QueryList = new List<string>(); 20 21 QueryParameterCollection qpc = new QueryParameterCollection(); 22 23 24 25 //当前往来单位必须和上游的往来单位一致 26 27 if (delivery.Partner != null) 28 29 { 30 31 QueryList.Add("SalesOrder.IdPartner=@SelectedIdPartner"); 32 33 34 35 qpc.Add("@SelectedIdPartner", delivery.IdPartner, DbType.Guid); 36 37 } 38 39 40 41 //已审核 42 43 QueryList.Add("SalesOrder.VoucherState='9AD02BD3-F4CE-466A-BA09-88AB9ED5D484'"); 44 45 46 47 //往来单位不能停用 48 49 QueryList.Add("SalesOrder.Partner.isEnable != 0"); 50 51 52 53 //销售订单的累计销货数量=数量时,则不显示 54 55 QueryList.Add("(SalesOrderDetail.SumDeliveryQuantity IS NULL OR SalesOrderDetail.SumDeliveryQuantity < SalesOrderDetail.Quantity)"); 56 57 58 59 string filter = string.Join(" AND ", QueryList); 60 61 return new QueryStruct(filter, qpc); 62 63 }
2.配置生单脚本
1 using Demo.Sales.Entity 2 3 4 5 // 销售订单生成销货单的条件验证 6 7 public string Validate(IEntity entity) 8 9 { 10 11 SalesOrder salesOrder = entity as SalesOrder; 12 13 14 15 //往来单位不能停用 16 17 if(salesOrder.Partner.isEnable == false} 18 19 { 20 21 return "往来单位已停用,无法生单!"; 22 23 } 24 25 26 27 foreach (SalesOrderDetail detail in salesOrder.SalesOrderDetails) 28 29 { 30 31 //去掉为删除状态的实体明细 32 33 if (detail.EntityState == EntityState.Deleted) 34 35 { 36 37 continue; 38 39 } 40 41 } 42 43 return null; 44 45 }
3.录入完成后保存
暂无