國際物流雲商專案day7
阿新 • • 發佈:2018-11-09
一、購銷合同模組業務分析
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);