1. 程式人生 > >國際物流雲商專案day7

國際物流雲商專案day7

一、購銷合同模組業務分析

在這裡插入圖片描述
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);