【springmvc+mybatis项目实战】杰信商贸-11.购销合同业务

本文详细介绍了购销合同业务流程及数据库设计过程,包括合同、货物、附件等表的设计细节,以及利用PowerDesigner生成SQL语句的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们先了解一下业务,什么是“货运管理”?
“货运管理”是国际物流的概念,往常我们货物送到国内没有那么多事情,但是货物发往国外就多了很多手续,依靠小物流公司我们是很不可能的,需要行业的大背景的支撑。下面我们来看看它是怎么做的

a)业务:购销合同

当我们的客户通过展会、其它渠道跟杰信公司联系上以后,他们看上杰信的货物样品,他们会跟杰信签订一个购买合同(样式要求,货物数量),客户就要支付一笔定金。然后杰信就拿这个定金去找下游的生产厂家,把一部分定金给生产厂家下定金,要生产客户需要的产品,这个时候杰信就要和生产厂家签订一个“购销合同”,所以我们的“购销合同”就是这么来的。

购销合同的内容
购销合同包括合同主信息,多个货物信息,多个附件信息。(整个购销合同是体现客户的订单,具体货物由哪个生产厂家制作,把整个购销合同分拆,分成每一个厂家一份)。一个购销合同包括多个货物信息,一个货物信息包括多个附件信息。两层一对多。

在购销合同打印时,默认一个页面只能放两款货物,货物必须是同一个生产厂家的货物,如果不是一个厂家的,另起一页。

购销合同样板:

b)分析设计:

1)表
名词:合同表、货物表、附件表

2)每个表的每个字段
客户会给我们提供原始的表格,有的还有数据
静态资源内容不在数据中出现。
一定不能拿客户所说的唯一性的内容作为关键字,以UUID或者自增作为主键,代理主键。

3)表之间的关系
合同和货物一对多,货物和附件一对多

4)业务逻辑
购销合同总金额=所有货物的数量*货物的单价的总和 + 所有附件的数量*附件的单价的总和

注意:
在oracle中NUMBER(5,2)
整数2位,小数2位。

11.数据库设计基础原则:三范式
1)表必须有主键
2)字段内容不能是其他的字段加工而成
3)行数据不能相同

12.现今业界主流数据库设计原则:反三范式
1)表不是必须有主键
2)字段存一些加工后的中间的结果,冗余设计
3)记录冗余

三范式追求的目标存储空间尽量小;反三范式追求的目标是查询速度。
创建数据库设计时首先按三范式设计,然后局部优化。
(因为以前的硬件贵,存储空间贵,所以推崇三范式,后来存储空间廉价了,开始追求速度了,这个时候为了提高查询速度来使用冗余设计)

冗余设计有一个致命的缺点,就是数据来源不唯一。
当相关数据发生改变的时候,就要在多出增加修改和维护数据的代码,工作量又大了。所以我们要局部优化

c)购销合同表设+货物表设计
我们使用PowerDesigner来设计合同表与货物表:


图6.3-购销合同下的货物表设计



三张表的关系如图(货物表拥有生产厂家以及购销合同的外键):



关于购销合同中的货物还有包装盒等附件,这个我们下面来讨论附件信息+PD创建表原则

其实附件和货物需要的基本信息是差不多的,我们根据用户需求设计好附件表,看看它和货物表有什么区别:


差异我们发现,在附件中有一个附件的“类型”这个字段,附件“类型”的内容是从哪里来的呢?我们有一个基本信息表,

其中有附件的分类信息,回头用到再说具体字段的用处。

好,这样就构成了我们的3张表,附件与生产厂家(附件也要有生产厂家生产)和货物(货物需要附件来包装)都有关系,所以加了外键。


接下来就要把我们的建模自动生成的SQL语句进行执行。我们要把我们上面的四张表全部建立起来怎么办?

我们点击PowerDesigner的“数据库(D)”按钮选项,选择其中的Generate Database选项,从这里我们可以选取整个数据库建模的SQL语句:


我们点击后会弹出一个对话框,其中包含“Option:建表语句约束设置”、“Format:备注信息的语言格式”等,在Preview中我们可以看到所有的建表语句:


我们可以在Selection选项中选择我们要创建的是那几张表的sql语句(默认是全选的)

选择完毕之后,回到General选项,指定sql文件的输出目录之后,在对应的盘下就可以看到生成的sql文件了,将sql文件导入数据库就可以建表了。(或者回到Preview中复制相应的sql语句来建表)


在创建表之前,我们注意以下问题:
在实际工作中,如何从PD中挑选执行SQL建表
1)不创建外键
什么时候需要外键什么时候不需要外键?
需求调研  设计 开发  测试 试运行  正式上线运行 维护
  否            否            否           否            否                   是                  是

2)不创建备注信息
保护软件资源

所以刚刚我们最好不要去创建外键和备注信息,因为在开发和测试阶段,我们录入数据的时候会非常麻烦,备注信息泄露了也不利于软件资源的保护。所以我们暂时不需要

这里是所有的建表语句,我们从Preview中只复制创建表的语句,来一张一张的去创建表。(即“Table: CONTRACT_PRODUCT_C ”等下的语句)
[sql]  view plain copy
  1. alter table CONTRACT_PRODUCT_C  
  2.    drop constraint FK_CONTRACT_REFERENCE_CONTRACT;  
  3.   
  4.   
  5. alter table CONTRACT_PRODUCT_C  
  6.    drop constraint FK_CONTRACT_REFERENCE_FACTORY_;  
  7.   
  8.   
  9. alter table EXT_CPRODUCT_C  
  10.    drop constraint FK_EXT_CPRO_REFERENCE_FACTORY_;  
  11.   
  12.   
  13. alter table EXT_CPRODUCT_C  
  14.    drop constraint FK_EXT_CPRO_REFERENCE_CONTRACT;  
  15.   
  16.   
  17. drop table CONTRACT_C cascade constraints;  
  18.   
  19.   
  20. drop table CONTRACT_PRODUCT_C cascade constraints;  
  21.   
  22.   
  23. drop table EXT_CPRODUCT_C cascade constraints;  
  24.   
  25.   
  26. drop table SYS_CODE_B cascade constraints;  
  27.   
  28.   
  29. /*==============================================================*/  
  30. /* Table: CONTRACT_C                                            */  
  31. /*==============================================================*/  
  32. create table CONTRACT_C  (  
  33.    CONTRACT_ID          VARCHAR2(40)                    not null,  
  34.    OFFEROR              VARCHAR2(200),  
  35.    CONTRACT_NO          VARCHAR2(50),  
  36.    SIGNING_DATE         TIMESTAMP,  
  37.    INPUT_BY             VARCHAR2(30),  
  38.    CHECK_BY             VARCHAR2(30),  
  39.    INSPECTOR            VARCHAR2(30),  
  40.    TOTAL_AMOUNT         NUMBER(10,2),  
  41.    IMPORT_NUM           INT,  
  42.    CREQUEST             VARCHAR2(2000),  
  43.    CUSTOM_NAME          VARCHAR2(200),  
  44.    DELIVERY_PERIOD      TIMESTAMP,  
  45.    SHIP_TIME            TIMESTAMP,  
  46.    TRADE_TERMS          VARCHAR2(30),  
  47.    REMARK               VARCHAR2(600),  
  48.    PRINT_STYLE          CHAR(1),  
  49.    OLD_STATE            INT,  
  50.    STATE                INT,  
  51.    OUT_STATE            INT,  
  52.    CREATE_BY            VARCHAR2(40),  
  53.    CREATE_DEPT          VARCHAR2(40),  
  54.    CREATE_TIME          TIMESTAMP,  
  55.    constraint PK_CONTRACT_C primary key (CONTRACT_ID)  
  56. );  
  57.   
  58.   
  59. comment on table CONTRACT_C is  
  60. '界面参考用户提供的《供销合同》  
  61. 八个字段从《购销合同》中获取,加一个“总金额”冗余字段  
  62. 四个字段从《出货表》中获取  
  63. 六个控制字段  
  64. 三个权限字段';  
  65.   
  66.   
  67. comment on column CONTRACT_C.CONTRACT_NO is  
  68. '自动产生';  
  69.   
  70.   
  71. comment on column CONTRACT_C.TOTAL_AMOUNT is  
  72. '冗余,自动计算,数量*单价';  
  73.   
  74.   
  75. comment on column CONTRACT_C.IMPORT_NUM is  
  76. '打印时标识几个星,对应说明中的内容  
  77. 直接存放星星可以吗?可以CHAR(6)。但jsp页面jstl判断星星特殊字符失败。';  
  78.   
  79.   
  80. comment on column CONTRACT_C.CUSTOM_NAME is  
  81. '出处:出货表';  
  82.   
  83.   
  84. comment on column CONTRACT_C.DELIVERY_PERIOD is  
  85. '出处:出货表';  
  86.   
  87.   
  88. comment on column CONTRACT_C.SHIP_TIME is  
  89. '出处:出货表';  
  90.   
  91.   
  92. comment on column CONTRACT_C.TRADE_TERMS is  
  93. '出处:出货表';  
  94.   
  95.   
  96. comment on column CONTRACT_C.PRINT_STYLE is  
  97. '宽2:一页两个货物  窄1:一页一个货物';  
  98.   
  99.   
  100. comment on column CONTRACT_C.OLD_STATE is  
  101. '归档前状态, 方便回退';  
  102.   
  103.   
  104. comment on column CONTRACT_C.STATE is  
  105. '0草稿 1已上报待报运  
  106.   
  107.   
  108. 归档后, 其他选择合同的地方均去除.  
  109. 表示合同已完成, 不论是否合同的货物是否全部真的走完, 因为有赔付等其他情况';  
  110.   
  111.   
  112. comment on column CONTRACT_C.OUT_STATE is  
  113. '0未走货 1部分 2全部  
  114.   
  115.   
  116. 归档后, 其他选择合同的地方均去除.  
  117. 表示合同已完成, 不论是否合同的货物是否全部真的走完, 因为有赔付等其他情况';  
  118.   
  119.   
  120. /*==============================================================*/  
  121. /* Table: CONTRACT_PRODUCT_C                                    */  
  122. /*==============================================================*/  
  123. create table CONTRACT_PRODUCT_C  (  
  124.    CONTRACT_PRODUCT_ID  VARCHAR2(40)                    not null,  
  125.    CONTRACT_ID          VARCHAR2(40),  
  126.    FACTORY_ID           VARCHAR2(40),  
  127.    FACTORY_NAME         VARCHAR2(50),  
  128.    PRODUCT_NO           VARCHAR2(50),  
  129.    PRODUCT_IMAGE        VARCHAR2(200),  
  130.    PRODUCT_DESC         VARCHAR2(600),  
  131.    CNUMBER              INT,  
  132.    OUT_NUMBER           INT,  
  133.    LOADING_RATE         VARCHAR2(10),  
  134.    BOX_NUM              INT,  
  135.    PACKING_UNIT         VARCHAR2(10),  
  136.    PRICE                NUMBER(10,2),  
  137.    AMOUNT               NUMBER(10,2),  
  138.    FINISHED             INT,  
  139.    EXTS                 VARCHAR2(50),  
  140.    ORDER_NO             INT,  
  141.    constraint PK_CONTRACT_PRODUCT_C primary key (CONTRACT_PRODUCT_ID)  
  142. );  
  143.   
  144.   
  145. comment on table CONTRACT_PRODUCT_C is  
  146. '装率和箱数报运业务使用,合同业务不使用。';  
  147.   
  148.   
  149. comment on column CONTRACT_PRODUCT_C.FACTORY_NAME is  
  150. '冗余';  
  151.   
  152.   
  153. comment on column CONTRACT_PRODUCT_C.OUT_NUMBER is  
  154. '分次走货';  
  155.   
  156.   
  157. comment on column CONTRACT_PRODUCT_C.LOADING_RATE is  
  158. '报运业务使用X/Y';  
  159.   
  160.   
  161. comment on column CONTRACT_PRODUCT_C.BOX_NUM is  
  162. '报运业务使用=数量除以装率的分母,不够进位为整数  
  163. 先将玻璃杯装小纸箱子,然后在装集装箱';  
  164.   
  165.   
  166. comment on column CONTRACT_PRODUCT_C.PACKING_UNIT is  
  167. 'PCS/SETS';  
  168.   
  169.   
  170. comment on column CONTRACT_PRODUCT_C.AMOUNT is  
  171. '冗余 自动计算: 数量x单价';  
  172.   
  173.   
  174. comment on column CONTRACT_PRODUCT_C.FINISHED is  
  175. '0未完成1完成';  
  176.   
  177.   
  178. comment on column CONTRACT_PRODUCT_C.EXTS is  
  179. '冗余,出处:出货表  
  180. 附件对应SYS_CODE中的附件分类名称,多个用换行符隔开,没有附件是写无。附件分类相同时合并。';  
  181.   
  182.   
  183. /*==============================================================*/  
  184. /* Table: EXT_CPRODUCT_C                                        */  
  185. /*==============================================================*/  
  186. create table EXT_CPRODUCT_C  (  
  187.    EXT_CPRODUCT_ID      VARCHAR2(40)                    not null,  
  188.    CONTRACT_PRODUCT_ID  VARCHAR2(40),  
  189.    FACTORY_ID           VARCHAR2(40),  
  190.    FACTORY_NAME         VARCHAR2(50),  
  191.    CTYPE                INT,  
  192.    PRODUCT_NO           VARCHAR2(50),  
  193.    PRODUCT_IMAGE        VARCHAR2(200),  
  194.    PRODUCT_DESC         VARCHAR2(600),  
  195.    CNUMBER              INT,  
  196.    PACKING_UNIT         VARCHAR2(10),  
  197.    PRICE                NUMBER(10,2),  
  198.    AMOUNT               NUMBER(10,2),  
  199.    PRODUCT_REQUEST      VARCHAR2(2000),  
  200.    ORDER_NO             INT,  
  201.    constraint PK_EXT_CPRODUCT_C primary key (EXT_CPRODUCT_ID)  
  202. );  
  203.   
  204.   
  205. comment on table EXT_CPRODUCT_C is  
  206. '附件和货物的不同:多了附件类型和要求;同时货物从属合同,附件从属货物。';  
  207.   
  208.   
  209. comment on column EXT_CPRODUCT_C.FACTORY_NAME is  
  210. '冗余';  
  211.   
  212.   
  213. comment on column EXT_CPRODUCT_C.CTYPE is  
  214. 'SYS_CODE_B 0104';  
  215.   
  216.   
  217. comment on column EXT_CPRODUCT_C.AMOUNT is  
  218. '自动计算: 数量x单价';  
  219.   
  220.   
  221. /*==============================================================*/  
  222. /* Table: SYS_CODE_B                                            */  
  223. /*==============================================================*/  
  224. create table SYS_CODE_B  (  
  225.    SYS_CODE_ID          VARCHAR2(40)                    not null,  
  226.    NAME                 VARCHAR2(100),  
  227.    PARENT_ID            VARCHAR2(40),  
  228.    PARENT_NAME          VARCHAR2(100),  
  229.    LAYER_NUM            INT,  
  230.    IS_LEAF              INT,  
  231.    QUOTE_NUM            INT,  
  232.    CNOTE                VARCHAR2(100),  
  233.    ICO                  VARCHAR2(20),  
  234.    ORDER_NO             INT,  
  235.    STATE                CHAR(1),  
  236.    CREATED_BY           VARCHAR2(40),  
  237.    CREATED_TIME         TIMESTAMP,  
  238.    UPDATED_BY           VARCHAR2(40),  
  239.    UPDATED_TIME         TIMESTAMP,  
  240.    constraint PK_SYS_CODE_B primary key (SYS_CODE_ID)  
  241. );  
  242.   
  243.   
  244. comment on table SYS_CODE_B is  
  245. '数据字典';  
  246.   
  247.   
  248. comment on column SYS_CODE_B.STATE is  
  249. '0停用1启用';  
  250.   
  251.   
  252. alter table CONTRACT_PRODUCT_C  
  253.    add constraint FK_CONTRACT_REFERENCE_CONTRACT foreign key (CONTRACT_ID)  
  254.       references CONTRACT_C (CONTRACT_ID);  
  255.   
  256.   
  257. alter table EXT_CPRODUCT_C  
  258.    add constraint FK_EXT_CPRO_REFERENCE_CONTRACT foreign key (CONTRACT_PRODUCT_ID)  
  259.       references CONTRACT_PRODUCT_C (CONTRACT_PRODUCT_ID);  

现在我们使用这个sql语句来创建“合同货物”、“合同附件”、“购销合同”以及“系统代码”这四张表:


创建成功!
下一片总结我们就开始对购销合同的业务进行编写

附-Oracle数据库备份和恢复
1)备份pl/sql

2)恢复


SQL形式备份(.sql),备份不能含有大字段,但是.bmp文件可以含有大字段

如果sql在导入时出现二进制乱码时,不直接用工具,直接拷贝sql语句,进行执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值