使用daas建模笔记

166 阅读5分钟

2022-12-8

原始输入

今天开始建模,输入是另外一位同学的思维导图。

思维导图初稿

这个图还在持续更新中,后面会根据思维导图的更新同步更新模型

准备工作

  1. 首先我把所有的模型放在一个目录下(在我的电脑上,这个目录就是 projectModels),这样方便查找和引用:

image.png

在这里我建了几个目录

  • public: 这里放一些可能很多项目都会用到的模型
  • project_cdbp: 这里放 cdbp 这个项目的模型
  • project_erpdemo: 这里放erpdemo这个项目的模型

够直白吧!

  1. 然后找一个习惯的编辑器,我用的VSCODE,它可以打开目录,比单纯的文本编辑器方便点。
image.png
  1. 最后给自己定一个命名规则,不然后面找模型都不好找。

    我给自己定的命名规则如下:

    1. 公共的模型放在 public 目录里
    2. 每个项目的模型放在 project_<项目> 目录里
    3. 每个项目的主入口模型文件名字叫做 main.xml
    4. 每个项目里的每个模块,单独建立一个目录,用汉字命名。
    5. 每个模块的主入口文件名叫做 all.xml. 这个文件里全是import,不写任何具体的模型定义。

按照以上的准备工作,我把之前的模型文件夹结构重新命名如下图:

image.png

开始建模

建立文件

先根据上面的命名规则,参照思维导图,把目录建起来。

现在的模块有这么些个:

1670465526533.png

我现在建立的模型的文件夹结构就是这样

image.png

其中project_erpdemo中的main.xml的内容如下,主要就是3个基本对象,再加一系列的import:

image.png

看了下XmlMerger的源代码,想起来一个模型文件语法糖: 在 #import 指令中,可以指定一个参数 with_global_attribute ,这个参数指定是不是在import文件内容的时候,把此文件的 root 中定义的 global_xxx 这种形式定义的属性,附加到所有此文件的属性中。

例如,在main.xml里写

<#import file="./销售管理/事件定义.xml" with_global_attribute="true" />

然后在文件 ./销售管理/事件定义.xml 的开头可以这么写:

<root global__features="event" global_change_request="change_request()">

就会自动给每个“事件定义”里的模型加上 _features="event"change_request="change_request()" 这两个属性定义

这个特性很方便用于 create_time, last_update_time, _features="event" 这类场景 (注意:属性开头是下划线的时候,这里是两个下划线,例如 global__features)

第一个模型

先看思维导图定义的业务模型

image.png

就照这个来写字段。 先是把字段都命名

image.png

如上所示,可以看到还有很多信息没有定义,例如码表和必要的对象定义。

我们先来加码表,在这个模块的all.xml里增加如下内容:

<#import file="./常量定义.xml" with_global_attribute="true"/>

然后创建这个文件

image.png

接着在这个文件里写一下内容

    <root
        global_name="value()"
        global_code="value()"
        global_platform="platform()"
        global__features_delta="status"
        >

        <sales_type _name="销售类型">
            <#value name="批发" code="PIFA"/>
            <#value name="零售" code="LINGSHOU"/>
            <#value name="大客户" code="DAKEHU"/>
            <#value name="集采" code="JICAI"/>
        </sales_type>

        <document_status _name="单据状态">
            <#value name="草稿" code="DRAFT"/>
            <#value name="待审核" code="NEED_APPROVE"/>
            <#value name="审核通过" code="APPROVED"/>
            <#value name="重新提交" code="NEED_REDO"/>
            <#value name="已关闭" code="CANCELLED"/>
            <#value name="已完成" code="FINISHED"/>
        </document_status>
    </root>

然后在使用的地方,把对这些常量的引用写进去

image.png

再接着下来,挨个处理每个字段,给它加样例数据和约束。

首先是 booked_deliver_date 这个字段。

我们假设它是以“日”为基本粒度的,最长可以支持到2199年年底,那么我们可以这么写:

booked_deliver_date="预约交货日期:2199-12-31"

  1. booked_deliver_date 是它的字段名,会在代码里用到
  2. 预约交货日期 是这个字段的中译名,会出现在控制台的字段名
  3. 中译名后有一个冒号,这个冒号是表示,前面是翻译,后面是样例数据
  4. 2199-12-31 是一个样例数据,表示日期,最大值为2199-12-31

image.png

接下来是 owner_merchant 字段。

它应该是一个完整的模型定义,现在我们还没写到它,所以只写一个空值就可以。

  1. 计划把owner_merchant引用的对象放到基础数据里,所以建立一个文件 组织和单位.xml
  2. 计划无论是 owner_merchant 还是 client_merchant 都是用merchant来表示的,那么在这个文件里写个空定义:
<root>
    <merchant   _name="商家"
    />
</root>

从前面的思维导图里

image.png

可以看到它至少有编码,简称,全称 三个信息。 其中编码和全称应该是它固有的属性,所以直接在merchant模型本身上;而‘简称’有可能是每个厂家对客商有自己的简称,所以应该有个类似“合作关系”这样的模型里面有简称这个字段。

所以我们先加两个字段:ID 和 name

image.png

image.png

然后咱们的模型就可以引用它了:

image.png

2022-12-9

今天继续完成模型 sales_order 的其他字段。

接下来是 shipping_address ,收货地址字段。

这个字段很简单,就是个文本字符串,所以我先写个例子:

shipping_address="收货地址:成都市高新区天府大道北段1700号8栋1单元13层1305号"

然后加上约束条件:最大最小长度

shipping_address="收货地址:成都市高新区天府大道北段1700号8栋1单元13层1305号|[10,200]"

现在模型效果如下:

image.png

下来是 product 字段。

显而易见,它是个复杂对象模型,和merchant的操作类似,我们在基础数据里创建一个 产品定义.xml

image.png

image.png

image.png

下面是 quantity 字段

这个字段有个比较明显特性:在整个系统中,势必会出现很多个‘数量’。这些数量理论上应该具有相同的规则:数据类型和取值范围。

所以我们定义了一个 "基础类型.xml", 在这里用 type_definition 来定义一些公共的数据,然后再引用:

image.png

image.png

然后在模型中引用它

image.png

下面是几个价格字段 和quantity一样,我们定义几个基本“价格”类型:单价不超过100万,总价不超过1万亿

先定义基本类型

image.png (注:使用type_definition需要专题学习。)

再引用

image.png