[关闭]
@windwolf 2020-05-19T06:13:29.000000Z 字数 3131 阅读 321

初始化器新探索

Sailing 备忘


2019.6 新探索

初始化器使用过程中遇到了一些不方便甚至需要引入体系之外的措施才能解决的问题. 比如: 单据新建/数据转换/复制时的转换器不能共用; 因为初始化器的功能限制, 新建和复制的总体处理过程 不得不实现的不一样等等. 需要找到一个方案简化上述过程, 增强初始化器的通用性, 具体要求如下:

解决方案

方案一

方案路演

完全新建: new之后再执行初始化 (生成主表, 生成默认费用项)
从其他单据新建: 先单据转换, 在初始化 (转换主表, 转换而来的明细项, 转换而来的费用项, 补充生成缺失的默认费用项)

- 因为指定了source作为target, 那么对target初始化其实就是对source初始化, 而source其实就是原来的target

方案二

方案路演

完全新建: new之后再执行初始化 (生成主表, 生成默认费用项)
从其他单据新建: 先单据转换, 在初始化 (转换主表, 转换而来的明细项, 转换而来的费用项, 补充生成缺失的默认费用项)
复制: 先根据复制选项(复制字段或忽略字段)执行复制, 再执行复制初始化; 复制初始化和新建初始化尽量通用. (复制而来的主表, 复制而来的明细项, 复制而来的费用项, 补充生成缺失的默认费用项);
从其他单据读取, 先初始化后, 再执行转换
明细单选择合同新建, 选择了多个合同的多个明细, 生成一个明细单.

分析

有target 无target

"sourcePath=null
isNew=false" 规则不执行 规则不执行
"sourcePath=null
isNew=true" "在原target基础上执行项下规则
规则执行一遍, source为空" "新建一个target, 执行项下规则
规则执行一遍, source为空"
"sourcePath=XXX
isNew=false" "target如果为entity:
source的分组size必须为1, 规则执行一遍, source为该分组;
target如果为list:
source的每个分组执行一遍规则, 并添加到target中;" "target类型如果为entity:
新建一个target. source的分组size必须为1, 规则执行一遍, source为该分组;
target如果为list:
新建一个hashset作为target. source的每个分组执行一遍规则, 并添加到target中;"
"sourcePath=XXX
isNew=true" 同上 同上
image.png-53.4kB

模拟:

A1. 根scope: sourcePath=null, isNew=ture; 明细: 不处理; 费用: 多个entityscope, sourcePath=null, isNew=true

执行过程: root的target为空, 于是新建;

A2. 根: sourcePath=:targetRoot; target直接采用原值. 明细: sourcePath=明细, 使用source作为target, (初始化出来的值已经在原集合中, 因此不再加入);

结论

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注