using?System.Collections.Generic;
using?System.Data.Entity;
using?System.Linq;
using?System.Text;
using?System.Web;
using?System.Web.UI;
using?System.Web.UI.WebControls;
namespace?BomListTest
{
public?partial?class?index?:?System.Web.UI.Page
{
protected?void?Page_Load(object?sender,?EventArgs?e)
{
if?(!IsPostBack)
{
DBBomEntities?entity?=?new?DBBomEntities();
var?listBom?=?entity.TbBom;
//加載父Bom
LoadParentPartNo(listBom);
var?bom?=?new?{?b?=?listBom.Where(p?=>?p.PartNo?==?"1000"&&p.ParentPartNo=="").FirstOrDefault(),
c?=?listBom.Where(p?=>?p.PartNo?==?"1000"&&p.ParentPartNo=="").Sum(p=>p.Qty)?};
if?(bom?==?null?||?bom.b?==?null)?return;
TreeNode?node?=?new?TreeNode();
node.Text?=?string.Format("{0}({1})",?bom.b.MaterialName,?bom.c);
node.Value?=?bom.b.MaterialCode;
node.Expanded?=?false;
node.ToolTip?=?"";
node.ImageUrl?=?"~\\image\\true.gif";
mainTree.Nodes.Add(node);
ResolveSubTree(listBom,?bom.b,?node);
}
}
private?void?LoadParentPartNo(DbSet<TbBom>?listBom)
{
var?mCode?=?string.Format("A{0}",?listBom.Max(p?=>?p.PartNo)?==?null"1000"?:?(Convert.ToInt32(listBom.Max(p?=>?p.PartNo))?+?1).ToString());
txtMaterialCode.Text?=?mCode;
listBom.ToList().ForEach(p?=>?ddlParentPartNo.Items.Add(new?ListItem(p.MaterialName,?p.PartNo)));
ddlParentPartNo.DataBind();
}
///?<summary>
///?遞歸展開Bom
///?</summary>
///?<param?name="listBom">所有數據集</param>
///?<param?name="bom">根節點物料</param>
///?<param?name="treeNode">根樹節點</param>
private?void?ResolveSubTree(DbSet<TbBom>?listBom,?TbBom?bom,?TreeNode?treeNode)
{
//獲取所有bom節點物料代碼為父節點代碼的物料
List<TbBom>?subListClone?=?listBom.Where(p?=>?p.ParentPartNo?==?bom.PartNo).ToList();
//獲取所有bom節點物料代碼為父節點代碼的物料(過濾重復物料,用作循環)
var?subList?=?listBom.Where(p?=>?p.ParentPartNo?==?bom.PartNo).GroupBy(p?=>?p.PartNo).Select(p?=>?p.FirstOrDefault()).ToList();
//如果包含子節點
if?(subList.Count?>?0)
{
//樹展開
treeNode.Expanded?=?false;
//循環遍歷子節點
foreach?(TbBom?subBom?in?subList)
{
//查詢出?子節點,和?當前父節點下?子節點的數量匯總
var?sbom?=?new?{?b?=?subBom,?c?=?subListClone.Where(p?=>?p.PartNo?==?subBom.PartNo).Select(p?=>?p.Qty).Sum()?};
//創建節點
TreeNode?node?=?new?TreeNode();
node.Value?=?sbom.b.PartNo;
node.ToolTip?=?GetParentNodeNames(listBom,?bom.ParentNos);
treeNode.ChildNodes.Add(node);
if?(Valied(bom.ParentNos,?sbom.b.PartNo))
{
node.ImageUrl?=?"~\\image\\flase.gif";
node.Text?=?string.Format("{0}",?sbom.b.MaterialName);
continue;
}
else
{
node.ImageUrl?=?"~\\image\\true.gif";
node.Text?=?string.Format("{0}({1})",?sbom.b.MaterialName,?sbom.c);
}
ResolveSubTree(listBom,?subBom,?node);
}
}
}
///?<summary>
///?判斷父節點是否存在
///?</summary>
///?<param?name="parentNo"></param>
///?<param?name="subNo"></param>
///?<returns></returns>
private?bool?Valied(string?parentNo,?string?subNo)
{
int?len?=?parentNo.Length;
for?(int?i?=?0;?i?<?len;?i?+=?4)
{
if?(parentNo.Substring(i,?4)?==?subNo)
{
return?true;
}
}
return?false;
}
///?<summary>
///?追溯父節點名字
///?</summary>
///?<param?name="listBom"></param>
///?<param?name="parentNodeNo"></param>
///?<returns></returns>
private?string?GetParentNodeNames(DbSet<TbBom>?listBom,?string?parentNodeNo)
{
int?len?=?parentNodeNo.Length;
StringBuilder?build?=?new?StringBuilder();
for?(int?i?=?len;?i?>?0;?i?-=?4)
{
var?bom?=?listBom.FirstOrDefault(p?=>?p.PartNo?==?parentNodeNo.Substring(i?-?4,?4));
if?(bom?!=?null)
{
build.Append(bom.MaterialName);
}
if?(i?>?4)
{
build.Append("-");
}
}
return?build.ToString();
}
protected?void?btnAdd_Click(object?sender,?EventArgs?e)
{
TbBom?bom?=?new?TbBom();
bom.MaterialCode?=?txtMaterialCode.Text.Trim();
bom.MaterialName?=?txtMaterialName.Text.Trim();
bom.PartNo?=?txtPartNo.Text.Trim();
bom.ParentPartNo?=?ddlParentPartNo.SelectedValue;
bom.Qty?=?Convert.ToInt32(txtQty.Text.Trim());
DBBomEntities?eneity?=?new?DBBomEntities();
var?parent?=?eneity.TbBom.Where(p?=>?p.PartNo?==?bom.ParentPartNo).FirstOrDefault();
if?(parent?!=?null)
{
//物料父子集
bom.ParentNos?=?string.Format("{0}{1}",?parent.ParentNos,?bom.PartNo);
}
else
{
//物料父子集
bom.ParentNos?=?string.Format("{0}",?bom.PartNo);
}
eneity.TbBom.Add(bom);
eneity.SaveChanges();
Response.Redirect("index.aspx");
}
}
}