2022-12-8
原始输入
今天开始建模,输入是另外一位同学的思维导图。
这个图还在持续更新中,后面会根据思维导图的更新同步更新模型
准备工作
- 首先我把所有的模型放在一个目录下(在我的电脑上,这个目录就是 projectModels),这样方便查找和引用:
在这里我建了几个目录
- public: 这里放一些可能很多项目都会用到的模型
- project_cdbp: 这里放 cdbp 这个项目的模型
- project_erpdemo: 这里放erpdemo这个项目的模型
够直白吧!
- 然后找一个习惯的编辑器,我用的VSCODE,它可以打开目录,比单纯的文本编辑器方便点。
-
最后给自己定一个命名规则,不然后面找模型都不好找。
我给自己定的命名规则如下:
- 公共的模型放在 public 目录里
- 每个项目的模型放在 project_<项目> 目录里
- 每个项目的主入口模型文件名字叫做 main.xml
- 每个项目里的每个模块,单独建立一个目录,用汉字命名。
- 每个模块的主入口文件名叫做 all.xml. 这个文件里全是import,不写任何具体的模型定义。
按照以上的准备工作,我把之前的模型文件夹结构重新命名如下图:
开始建模
建立文件
先根据上面的命名规则,参照思维导图,把目录建起来。
现在的模块有这么些个:
我现在建立的模型的文件夹结构就是这样
其中project_erpdemo中的main.xml的内容如下,主要就是3个基本对象,再加一系列的import:
看了下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)
第一个模型
先看思维导图定义的业务模型
就照这个来写字段。 先是把字段都命名
如上所示,可以看到还有很多信息没有定义,例如码表和必要的对象定义。
我们先来加码表,在这个模块的all.xml里增加如下内容:
<#import file="./常量定义.xml" with_global_attribute="true"/>
然后创建这个文件
接着在这个文件里写一下内容
<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>
然后在使用的地方,把对这些常量的引用写进去
再接着下来,挨个处理每个字段,给它加样例数据和约束。
首先是 booked_deliver_date 这个字段。
我们假设它是以“日”为基本粒度的,最长可以支持到2199年年底,那么我们可以这么写:
booked_deliver_date="预约交货日期:2199-12-31"
- booked_deliver_date 是它的字段名,会在代码里用到
- 预约交货日期 是这个字段的中译名,会出现在控制台的字段名
- 中译名后有一个冒号,这个冒号是表示,前面是翻译,后面是样例数据
- 2199-12-31 是一个样例数据,表示日期,最大值为2199-12-31
接下来是 owner_merchant 字段。
它应该是一个完整的模型定义,现在我们还没写到它,所以只写一个空值就可以。
- 计划把owner_merchant引用的对象放到基础数据里,所以建立一个文件
组织和单位.xml - 计划无论是 owner_merchant 还是 client_merchant 都是用merchant来表示的,那么在这个文件里写个空定义:
<root>
<merchant _name="商家"
/>
</root>
从前面的思维导图里
可以看到它至少有编码,简称,全称 三个信息。 其中编码和全称应该是它固有的属性,所以直接在merchant模型本身上;而‘简称’有可能是每个厂家对客商有自己的简称,所以应该有个类似“合作关系”这样的模型里面有简称这个字段。
所以我们先加两个字段:ID 和 name
然后咱们的模型就可以引用它了:
2022-12-9
今天继续完成模型 sales_order 的其他字段。
接下来是 shipping_address ,收货地址字段。
这个字段很简单,就是个文本字符串,所以我先写个例子:
shipping_address="收货地址:成都市高新区天府大道北段1700号8栋1单元13层1305号"
然后加上约束条件:最大最小长度
shipping_address="收货地址:成都市高新区天府大道北段1700号8栋1单元13层1305号|[10,200]"
现在模型效果如下:
下来是 product 字段。
显而易见,它是个复杂对象模型,和merchant的操作类似,我们在基础数据里创建一个 产品定义.xml
下面是 quantity 字段
这个字段有个比较明显特性:在整个系统中,势必会出现很多个‘数量’。这些数量理论上应该具有相同的规则:数据类型和取值范围。
所以我们定义了一个 "基础类型.xml", 在这里用 type_definition 来定义一些公共的数据,然后再引用:
然后在模型中引用它
下面是几个价格字段 和quantity一样,我们定义几个基本“价格”类型:单价不超过100万,总价不超过1万亿
先定义基本类型
(注:使用type_definition需要专题学习。)
再引用