[关闭]
@windwolf 2019-04-02T05:53:17.000000Z 字数 5506 阅读 311

Sailing - 备忘 - 对初始化器的反思

Sailing


目前方案及困境

初始化器这个名字取得不好. 其实, 除了初始化实体数据的工作外, 它还可以更新实体内容; 除了从空白开始创建实体外, 还可以从其他实体作为参考来对实体赋值.

总结一下目前初始化器的使用场景, 在单据的新建, 从其他单据新建, 选择商品后添加, 下推, 根据上游单据更新等处都使用了初始化器.

以上是目前已经使用初始化器完成的功能. 还有其他场景也需要类似初始化的功能, 例如数据智能导入和财务智能凭证.


总结一下上述场景中的数据来源:

总结一下数据目标:


而各种场景下转换规则的变化十分大.


新方案探索

以上这些生成规则中, 比较麻烦的一个步骤是二级甚至是三级子对象的装配. 这恰恰是现有初始化器的优势.
现有初始化器根据目标结构来进行导航, 正对每个不同的字段类型, 调用恰当的初始化规则, 如果是一对一子对象, 则新建对象; 如果是一对多集合对象, 则新建对象并加入集合.

能不能继续使用这个结构? 还能解决上面的场景?

其实这个结构的一个不足是无法生成多个目标对象, 如果可以解决这个问题, 那么其他应该都能适应, 用下面的场景验证下:


从上述规则执行过程的描述来看, 新方案和原有初始化器最大的区别在于对数据源的处理.
新方案允许实体节点规则和集合节点规则可以更自由的确定数据源.

  1. 切换数据源
    • 在上下文中根据path导航
    • 切换另一个数据源, 并根据path导航
  2. 对数据源过滤(可选)
    • 对上一步中的数据源根据指定条件过滤. 条件表达式中可以带有上下文信息.
    • 如果不过滤, 则使用完整的数据源参与下一步处理.
  3. 对数据源分组(可选)
    • 正常模式: 根据指定分组线索对上一步中的数据源分组, 分组线索表达式中可以带有上下文信息.
    • 合并模式: 实际上的效果是把所有的数据分在同一个默认分组中.
    • 拆分模式: 为每条数据创建了一个单独的分组.
  4. 遍历每个分组(如果是一对一节点, 则只允许一个分组, 超过一个就报错), 执行以下动作:
  5. 对分组内数据过滤(可选)
    • 对每个分组中的数据, 根据执行的条件过滤. 条件表达式中也可以带有上下文信息.
    • 如果不过滤, 则使用分组内的完整数据源参与下一步处理.
  6. 创建对应的目标对象
    • 应用下级初始化规则

新方案的另一个改进是需要支持多个多种数据源. 一次转换会涉及到多个数据源, 每个数据源可能是单一实体, 实体数组, 二维表对象中的一种.


新方案下的各场景规则设置:

  1. 明细单选外销合同后新建(来源数据组织成一个对象数组, 目标单据为一个对象)

    • 明细单根对象(entity): 数据源[:root], 分组模式[合并]
      • 明细单数量合计(field): script[#sum(s.商品明细.金额)]
      • 起运港(field): copy[起运港] //复制模式下, 默认去分组中的第一行数据的XXX. 下同
      • 成本预测(entity): 数据源[成本预测], 分组模式[合并]
        • XX(field): copy[xxx]
      • 商品明细(collection):
        • (entity): 数据源[商品明细], 分组模式[拆分]
          • XX(field): copy[xxx]
          • XX(field): copy[xxx]
  2. 明细单选外销合同后新建(来源数据组织成两个对象数组, 一个外销合同数组, 一个外销合同明细实体数组; 目标单据为一个对象)

    • 明细单根对象(entity): 数据源[:root.外销合同], 分组模式[合并]
      • 明细单数量合计(field): script[#sum(:root.外销合同明细.金额)]
      • 起运港(field): copy[起运港]
      • 成本预测(entity): 数据源[成本预测], 分组模式[合并]
        • XX(field): script[#sum(s.外销合同明细)]
      • 商品明细(collection):
        • (entity): 数据源[:root.外销合同明细], 分组模式[拆分]
          • XX(field): copy[xxx]
          • XX(field): copy[xxx]
  3. 明细单新建后, 再从合同中选择添加商品(来源数据组织成一个对象数组, 目标为明细对象数组)

    • 明细单商品(entity): 数据源[:root.外销合同明细], 分组模式[拆分]
      • XX(field): copy[xxx]
      • XX(field): copy[xxx]
  4. 外销合同下推生成采购合同, 分单(来源数据为一个对象(数组), 目标单据为一个对象数据)

    • 采购订单根对象(entity): 数据源[:root.商品明细], 分组模式[普通 group=生产厂家]
      • 销货方(field): copy[生产厂家]
      • 出口国家(field): copy[owner.出口国家]
      • 商品明细(collection):
        • (entity): 数据源[] 分组模式[拆分]
          • XX(field): copy[xxx]
          • XX(field): copy[xxx]
  5. 导入预录单数据(来源数据为一个对象数组, 目标数据为一个复杂对象数组)

    • 预录单数据(entity): 数据源[:root.第一页], 分组模式[普通 group=报关单号]
      • 报关单号(field): copy[报关单号]
      • 报关明细(collection):
        • (entity): 数据源[] 分组模式[拆分]
          • XX(field): copy[xxx]
          • XX(field): copy[xxx]
  6. 导入某个单据模板(来源数据为: 第一页-一个表单(单一对象), 第二页-一个成本核算部分信息, 第三页-一个对象数组(商品列表), 第四页-第三层对象数组(组件列表)的组合, 目标数据为一个复杂对象)

    • 根实体(entity): 数据源[:root.第一页], 分组模式[合并]
      • XX(field): copy[xxx]
      • XX(field): script[#first(:root.第二个).XX]
      • 成本核算(entity): 数据源[:root.第二个], 分组模式[合并]
        • XX(field): copy[xxx]
      • 商品(collection):
        • (entity): 数据源[:root.第三个] 分组模式[拆分]
          • XX(field): copy[xxx]
          • 附加信息(entity): 数据源[], 分组模式[合并]
            • XX(field): copy[xxx]
          • 组件信息(collection):
            • (entity): 数据源[:root.第四个 filter=>s.商品编码==#first(商品编码)] , 分组模式[拆分]
              • XX(field): copy[xxx]
  7. 简单的智能凭证(来源数据为N组对象, 目标数据为一个复杂对象)

    • 凭证分录(entity): 数据源[:root], 分组模式[合并]
      • XX(field): copy[xxx]
    • 凭证分录(entity): 数据源[:root.XX], 分组模式[拆分]
      • XX(field): copy[xxx]
    • 凭证分录(entity): 数据源[:root.XX.XX], 分组模式[拆分]
      • XX(field): copy[xxx]
    • 凭证分录(entity): 数据源[:root.XX.XX], 分组模式[普通 owner.编码]
      • XX(field): copy[xxx]
  8. 批量智能凭证(来源数据为多个N组对象, 目标数据为多个复杂对象)
    暂不考虑, 通过为每份数据源调用一遍规则来实现;


其他事项

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