0
点赞
收藏
分享

微信扫一扫

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


生产厂家我们做完了,接下来我们要做一个更加复杂的业务,就是“货运管理”



首先我们先了解一下业务,什么是“货运管理”?


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



a)业务:购销合同



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



购销合同的内容


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



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



购销合同样板:


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


b)分析设计:



1)表


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



2)每个表的每个字段


客户会给我们提供原始的表格,有的还有数据


静态资源内容不在数据中出现。


一定不能拿客户所说的唯一性的内容作为关键字,以UUID或者自增作为主键,代理主键。



3)表之间的关系


合同和货物一对多,货物和附件一对多



4)业务逻辑


购销合同总金额=所有货物的数量*货物的单价的总和 + 所有附件的数量*附件的单价的总和



注意:


在oracle中NUMBER(5,2)


整数2位,小数2位。



11.数据库设计基础原则:三范式


1)表必须有主键


2)字段内容不能是其他的字段加工而成


3)行数据不能相同



12.现今业界主流数据库设计原则:反三范式


1)表不是必须有主键


2)字段存一些加工后的中间的结果,冗余设计


3)记录冗余



三范式追求的目标存储空间尽量小;反三范式追求的目标是查询速度。


创建数据库设计时首先按三范式设计,然后局部优化。


(因为以前的硬件贵,存储空间贵,所以推崇三范式,后来存储空间廉价了,开始追求速度了,这个时候为了提高查询速度来使用冗余设计)



冗余设计有一个致命的缺点,就是数据来源不唯一。


当相关数据发生改变的时候,就要在多出增加修改和维护数据的代码,工作量又大了。所以我们要局部优化



c)购销合同表设+货物表设计


我们使用PowerDesigner来设计合同表与货物表:

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


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

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



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


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




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



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


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



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


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


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



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


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



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



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


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



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


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



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



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


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



在创建表之前,我们注意以下问题:


在实际工作中,如何从PD中挑选执行SQL建表


1)不创建外键


什么时候需要外键什么时候不需要外键?


需求调研  设计

开发 测试 试运行 正式上线运行 维护


  否

           否            否           否            否                   是                  是



2)不创建备注信息


保护软件资源



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



这里是所有的建表语句,我们从Preview中只复制创建表的语句,来一张一张的去创建表。(即“Table: CONTRACT_PRODUCT_C ”等下的语句)


alter table CONTRACT_PRODUCT_C
drop constraint FK_CONTRACT_REFERENCE_CONTRACT;


alter table CONTRACT_PRODUCT_C
drop constraint FK_CONTRACT_REFERENCE_FACTORY_;


alter table EXT_CPRODUCT_C
drop constraint FK_EXT_CPRO_REFERENCE_FACTORY_;


alter table EXT_CPRODUCT_C
drop constraint FK_EXT_CPRO_REFERENCE_CONTRACT;


drop table CONTRACT_C cascade constraints;


drop table CONTRACT_PRODUCT_C cascade constraints;


drop table EXT_CPRODUCT_C cascade constraints;


drop table SYS_CODE_B cascade constraints;


/*==============================================================*/
/* Table: CONTRACT_C */
/*==============================================================*/
create table CONTRACT_C (
CONTRACT_ID VARCHAR2(40) not null,
OFFEROR VARCHAR2(200),
CONTRACT_NO VARCHAR2(50),
SIGNING_DATE TIMESTAMP,
INPUT_BY VARCHAR2(30),
CHECK_BY VARCHAR2(30),
INSPECTOR VARCHAR2(30),
TOTAL_AMOUNT NUMBER(10,2),
IMPORT_NUM INT,
CREQUEST VARCHAR2(2000),
CUSTOM_NAME VARCHAR2(200),
DELIVERY_PERIOD TIMESTAMP,
SHIP_TIME TIMESTAMP,
TRADE_TERMS VARCHAR2(30),
REMARK VARCHAR2(600),
PRINT_STYLE CHAR(1),
OLD_STATE INT,
STATE INT,
OUT_STATE INT,
CREATE_BY VARCHAR2(40),
CREATE_DEPT VARCHAR2(40),
CREATE_TIME TIMESTAMP,
constraint PK_CONTRACT_C primary key (CONTRACT_ID)
);


comment on table CONTRACT_C is
'界面参考用户提供的《供销合同》
八个字段从《购销合同》中获取,加一个“总金额”冗余字段
四个字段从《出货表》中获取
六个控制字段
三个权限字段';


comment on column CONTRACT_C.CONTRACT_NO is
'自动产生';


comment on column CONTRACT_C.TOTAL_AMOUNT is
'冗余,自动计算,数量*单价';


comment on column CONTRACT_C.IMPORT_NUM is
'打印时标识几个星,对应说明中的内容
直接存放星星可以吗?可以CHAR(6)。但jsp页面jstl判断星星特殊字符失败。';


comment on column CONTRACT_C.CUSTOM_NAME is
'出处:出货表';


comment on column CONTRACT_C.DELIVERY_PERIOD is
'出处:出货表';


comment on column CONTRACT_C.SHIP_TIME is
'出处:出货表';


comment on column CONTRACT_C.TRADE_TERMS is
'出处:出货表';


comment on column CONTRACT_C.PRINT_STYLE is
'宽2:一页两个货物 窄1:一页一个货物';


comment on column CONTRACT_C.OLD_STATE is
'归档前状态, 方便回退';


comment on column CONTRACT_C.STATE is
'0草稿 1已上报待报运


归档后, 其他选择合同的地方均去除.
表示合同已完成, 不论是否合同的货物是否全部真的走完, 因为有赔付等其他情况';


comment on column CONTRACT_C.OUT_STATE is
'0未走货 1部分 2全部


归档后, 其他选择合同的地方均去除.
表示合同已完成, 不论是否合同的货物是否全部真的走完, 因为有赔付等其他情况';


/*==============================================================*/
/* Table: CONTRACT_PRODUCT_C */
/*==============================================================*/
create table CONTRACT_PRODUCT_C (
CONTRACT_PRODUCT_ID VARCHAR2(40) not null,
CONTRACT_ID VARCHAR2(40),
FACTORY_ID VARCHAR2(40),
FACTORY_NAME VARCHAR2(50),
PRODUCT_NO VARCHAR2(50),
PRODUCT_IMAGE VARCHAR2(200),
PRODUCT_DESC VARCHAR2(600),
CNUMBER INT,
OUT_NUMBER INT,
LOADING_RATE VARCHAR2(10),
BOX_NUM INT,
PACKING_UNIT VARCHAR2(10),
PRICE NUMBER(10,2),
AMOUNT NUMBER(10,2),
FINISHED INT,
EXTS VARCHAR2(50),
ORDER_NO INT,
constraint PK_CONTRACT_PRODUCT_C primary key (CONTRACT_PRODUCT_ID)
);


comment on table CONTRACT_PRODUCT_C is
'装率和箱数报运业务使用,合同业务不使用。';


comment on column CONTRACT_PRODUCT_C.FACTORY_NAME is
'冗余';


comment on column CONTRACT_PRODUCT_C.OUT_NUMBER is
'分次走货';


comment on column CONTRACT_PRODUCT_C.LOADING_RATE is
'报运业务使用X/Y';


comment on column CONTRACT_PRODUCT_C.BOX_NUM is
'报运业务使用=数量除以装率的分母,不够进位为整数
先将玻璃杯装小纸箱子,然后在装集装箱';


comment on column CONTRACT_PRODUCT_C.PACKING_UNIT is
'PCS/SETS';


comment on column CONTRACT_PRODUCT_C.AMOUNT is
'冗余 自动计算: 数量x单价';


comment on column CONTRACT_PRODUCT_C.FINISHED is
'0未完成1完成';


comment on column CONTRACT_PRODUCT_C.EXTS is
'冗余,出处:出货表
附件对应SYS_CODE中的附件分类名称,多个用换行符隔开,没有附件是写无。附件分类相同时合并。';


/*==============================================================*/
/* Table: EXT_CPRODUCT_C */
/*==============================================================*/
create table EXT_CPRODUCT_C (
EXT_CPRODUCT_ID VARCHAR2(40) not null,
CONTRACT_PRODUCT_ID VARCHAR2(40),
FACTORY_ID VARCHAR2(40),
FACTORY_NAME VARCHAR2(50),
CTYPE INT,
PRODUCT_NO VARCHAR2(50),
PRODUCT_IMAGE VARCHAR2(200),
PRODUCT_DESC VARCHAR2(600),
CNUMBER INT,
PACKING_UNIT VARCHAR2(10),
PRICE NUMBER(10,2),
AMOUNT NUMBER(10,2),
PRODUCT_REQUEST VARCHAR2(2000),
ORDER_NO INT,
constraint PK_EXT_CPRODUCT_C primary key (EXT_CPRODUCT_ID)
);


comment on table EXT_CPRODUCT_C is
'附件和货物的不同:多了附件类型和要求;同时货物从属合同,附件从属货物。';


comment on column EXT_CPRODUCT_C.FACTORY_NAME is
'冗余';


comment on column EXT_CPRODUCT_C.CTYPE is
'SYS_CODE_B 0104';


comment on column EXT_CPRODUCT_C.AMOUNT is
'自动计算: 数量x单价';


/*==============================================================*/
/* Table: SYS_CODE_B */
/*==============================================================*/
create table SYS_CODE_B (
SYS_CODE_ID VARCHAR2(40) not null,
NAME VARCHAR2(100),
PARENT_ID VARCHAR2(40),
PARENT_NAME VARCHAR2(100),
LAYER_NUM INT,
IS_LEAF INT,
QUOTE_NUM INT,
CNOTE VARCHAR2(100),
ICO VARCHAR2(20),
ORDER_NO INT,
STATE CHAR(1),
CREATED_BY VARCHAR2(40),
CREATED_TIME TIMESTAMP,
UPDATED_BY VARCHAR2(40),
UPDATED_TIME TIMESTAMP,
constraint PK_SYS_CODE_B primary key (SYS_CODE_ID)
);


comment on table SYS_CODE_B is
'数据字典';


comment on column SYS_CODE_B.STATE is
'0停用1启用';


alter table CONTRACT_PRODUCT_C
add constraint FK_CONTRACT_REFERENCE_CONTRACT foreign key (CONTRACT_ID)
references CONTRACT_C (CONTRACT_ID);


alter table EXT_CPRODUCT_C
add constraint FK_EXT_CPRO_REFERENCE_CONTRACT foreign key (CONTRACT_PRODUCT_ID)
references CONTRACT_PRODUCT_C (CONTRACT_PRODUCT_ID);


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


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



创建成功!


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



附-Oracle数据库备份和恢复


1)备份pl/sql


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


2)恢复


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



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


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


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



举报

相关推荐

0 条评论