validator定义

前面提到,在项目后端的meta中定义明细类型时,设置了validator。关于validator验证器的概念,请参见:表单验证

schema

validator验证器由json schema组成。这里仍然以模块test-flow为例,来具体说明采购订单明细的schema定义

src/module/test-flow/backend/src/config/validation/schema/purchaseOrderDetail.js

module.exports = app => {
  const schemas = {};
  // detail
  const __atomParams = {
    target: '_self',
    atomClass: {
      module: 'test-flow',
      atomClassName: 'product',
    },
    selectOptions: {},
    atomId: 'detailCodeId',
    mapper: {
      detailCodeId: 'atomId',
      detailCode: 'productCode',
      detailName: 'atomName',
      price: 'productPrice',
    },
  };
  schemas.purchaseOrderDetail = {
    type: 'object',
    properties: {
      detailCodeId: {
        type: 'number',
      },
      detailCode: {
        type: 'string',
        ebType: 'text',
        ebTitle: 'Product Code',
        ebReadOnly: true,
        notEmpty: true,
      },
      detailName: {
        type: 'string',
        ebType: 'atom',
        ebTitle: 'Product Name',
        ebParams: __atomParams,
        notEmpty: true,
      },
      price: {
        type: 'number',
        ebType: 'text',
        ebTitle: 'Price',
        ebCurrency: true,
      },
      quantity: {
        type: 'number',
        ebType: 'text',
        ebTitle: 'Quantity',
      },
      amount: {
        type: 'number',
        ebType: 'text',
        ebTitle: 'Amount',
        ebComputed: {
          expression: 'price * quantity',
          dependencies: 'price,quantity',
        },
        ebCurrency: true,
        ebReadOnly: true,
      },
    },
  };
  return schemas;
};
  • detailCodeId、detailCode、detailName

为了让演示更贴近实际场景,模块test-flow还提供了另外一个原子类型--产品采购订单明细的数据通过选择原子操作,从原子类型--产品中选择数据。因此,明细基础表aDetail中的三个字段detailCodeId、detailCode、detailName分别来自原子类型-产品数据中的atomId、productCode、atomName

  • detailCodeId:不设置ebType,从而不渲染
  • detailCode:ebReadOnly设为true,从而渲染为只读模式
  • detailName:ebType设为atom,从而支持选择原子操作
    • ebParams:与选择原子相关的参数
      • target:指定选择页面在哪里打开
      • atomClass:要选择的原子类型,这里是产品
      • selectOptions:可选参数,用于原子的select操作
      • atomId:当前选中的原子Id
      • mapper:字段映射。当选择原子返回后,通过该字段映射设置明细数据
  • price:ebCurrency设为true,从而按货币格式进行渲染(两位小数)
  • quantity:
  • amount:金额=价格*数量。当前端修改价格或者数量时,金额需要同步更新
    • ebComputed:动态计算
      • expression:动态表达式
      • dependencies:依赖项,只有指定的依赖项有变动时,才会启动动态计算,进而实现同步更新