一、购销合同模块业务分析
2购销合同的表结构
购销合同表 与 合同下的货物是 一对多关系
购销合同下的货物 与 购销合同下的附件 一对多关系
购销合同下的货物 与 生产厂商 多对多关系
购销合同下的附件 与 生产厂商 多对多关系
二、数据库设计的三大范式
1、数据库设计的三大范式
第一范式 1NF:做到每列不可拆分
第二范式 2NF:确保一表只做一件事情
第三范式 3NF:在满足2NF,消除表中的传递依赖
2、数据库设计的反三大范式
反三范式:在进行数据库设计时,首先确保你所设计的表结构都达到第三范式要求,
但是实际开发时,为类满足 一些用户的特殊需求,开发又会在符合第三范式的表中,
加入冗余字段,结果就导致又不符合第三范式要求,这种情况下,称为反三范式。
三、分散计算思想
如果没有分散计算,在查询购销合同总金额时,就需要关联加载购销合同下的所有货物,并要加载所有货物下的所有附件,这样可能实现购销合同总金额查询消耗时间太久,而用户等不起,此时就可以在平时添加货物时,添加附件时,分别计算出货物总金额,附件总金额,再更新购销合同总,这样就相当将一次集中计算的工作分散到平时的多次计算过程中,所以查询购销合同总金额时速度就会很快。
缺点:就是代码编写量和维护工作量急剧上升
优点:提高了页面数据的检索速度
分散计算思想主要体现在:
1、 购销合同下的货物 :
1)新增销合同下货物是也会 影响 购销合同的总额
1计算货物总金额 = 单价 * 数量
2购销合同总金额 = 购销合同 + 货物总金额
//分散计算
Double amount = 0.0;
//如果货物单价和数量都不为空 进去计算 货物总金额
if(UtilFuns.isNotEmpty(entity.getCnumber()) && UtilFuns.isNotEmpty(entity.getPrice())){
amount = entity.getCnumber() * entity.getPrice();
}
// 货物的总金额 如果货物单价和数量有为空的 总金额初始值为0.0
entity.setAmount(amount);
// 从数据库获取购销合同对象
Contract contract = contractDao.findOne(entity.getContract().getId());
contract.setTotalAmount(contract.getTotalAmount() + amount); //分散计算的新增
contractDao.save(contract);
2)修改购销合同下货物数量和单价直接影响 货物总金额 也影响了 购销合同的总额
购销合同的总金额 = 购销合同的总金额 + 货物的新总金额 - 货物的旧总金额
// 保存旧的总金额
Double oldAmount = entity.getAmount();
//创建一个变量 保存新货物总金额
Double amount = 0.0;
//如果货物单价和数量都不为空 进去计算 货物总金额
if(UtilFuns.isNotEmpty(entity.getCnumber()) && UtilFuns.isNotEmpty(entity.getPrice())){
amount = entity.getCnumber() * entity.getPrice();
}
// 货物的旧总金额与新总金额 判断不等 证明修改了单价或者数量
if(oldAmount != amount){
//修改后的总金额设置到商品上
entity.setAmount(amount);
//从数据库中货物购销合同对象
Contract contract = contractDao.findOne(entity.getContract().getId());
//修改的差值
contract.setTotalAmount(contract.getTotalAmount() + amount - oldAmount);
contractDao.save(contract);
}
3)删除货物也会影响购销合同合同总金额
// 获取货物对象
ContractProduct contractProduct = contractProductDao.findOne(id);
// 1、获取货物旧总金额
Contract contract1 = contractProduct.getContract();
contract1.setTotalAmount(contract1.getTotalAmount()-contractProduct.getAmount());
// 2、删除货物下面所有附件
Set<ExtCproduct> extCproducts = contractProduct.getExtCproducts();
for (ExtCproduct extCproduct : extCproducts) {
contract1.setTotalAmount(contract1.getTotalAmount()-extCproduct.getAmount());
extCproductDao.delete(extCproduct);
}
contractDao.save(contract1);
contractProductDao.delete(id);