void DeleteChangeEx(ContractBoiChangeNode Node) { if (Node.ChangeDetailEx == null) { Node.ChangeDetailEx = HDAutoMapper.DynamicMap <ContractBoqChangeDetailEx>(Node); ChangeDetailExList.Add(Node.ChangeDetailEx); } Node.ChangeDetailEx.AfAmount = 0; Node.ChangeDetailEx.AfPrice = 0; Node.ChangeDetailEx.AfQty = 0; Node.ChangeDetailEx.BefAmount = Node.OriginalBoi.CtrctAmount; Node.ChangeDetailEx.BefPrjPrice = Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.BefQty = Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangeQty = 0 - Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangePrice = 0 - Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.ChangeAmount = 0 - Node.OriginalBoi.CtrctAmount; //if (Node.StatId == 0) //{ // Node.ChangeDetailEx.ChangeType = ChangeType.Disable; //} //else //{ Node.ChangeDetailEx.ChangeType = ChangeType.Delete; //} }
private void InitChanged() { List <ContractBoqChangeDetailEx> lstDetail = ChangeDetailExList.ToList(); List <ContractBoqChangeDetailEx> lstDelete = lstDetail.FindAll(m => m.ChangeType == ChangeType.Delete).OrderByDescending(m => m.ItemCode).ToList(); List <ContractBoqChangeDetailEx> lstUpdate = lstDetail.FindAll(m => m.ChangeType == ChangeType.Update).OrderByDescending(m => m.ItemCode).ToList(); List <ContractBoqChangeDetailEx> lstNew = lstDetail.FindAll(m => m.ChangeType == ChangeType.Add).OrderBy(m => m.ItemCode).ToList(); List <ContractBoqChangeDetailEx> lstDiable = lstDetail.FindAll(m => m.ChangeType == ChangeType.Disable).OrderByDescending(m => m.ItemCode).ToList(); List <ContractBoqChangeDetailEx> lstEnable = lstDetail.FindAll(m => m.ChangeType == ChangeType.Enable).OrderByDescending(m => m.ItemCode).ToList(); List <ContractBoiChangeNode> lstNode = NodeList.ToList(); lstDelete.ForEach(m => { ContractBoiChangeNode node = lstNode.FirstOrDefault(n => n.ItemNo == m.ItemNo); node.ChangeDetailEx = m; ChangeNodeStat(node, false); }); lstNew.ForEach(m => { ContractBoiChangeNode nodeAdd = HDAutoMapper.DynamicMap <ContractBoiChangeNode>(m); nodeAdd.CtrctPrjPrice = m.AfPrice; nodeAdd.CtrctQty = m.AfQty; nodeAdd.CtrctAmount = m.AfAmount; nodeAdd.ChangeDetailEx = m; ContractBoiChangeNode parentNode = lstNode.FirstOrDefault(n => n.ItemCode == nodeAdd.ParentCode); if (parentNode != null) { parentNode.Children.Add(nodeAdd); } else { RootList.Add(nodeAdd); } NodeList.Add(nodeAdd); }); lstUpdate.ForEach(m => { ContractBoiChangeNode node = lstNode.Find(n => n.ItemNo == m.ItemNo); node.CtrctAmount = m.AfAmount; node.CtrctPrjPrice = m.AfPrice; node.CtrctQty = m.AfQty; node.IItemCoe = m.IItemCoe; node.Uom = m.Uom; node.ItemName = m.ItemName; node.ChangeDetailEx = m; }); lstDiable.ForEach(m => { ContractBoiChangeNode node = lstNode.Find(n => n.ItemNo == m.ItemNo); node.ChangeDetailEx = m; ChangeNodeStat(node, false); }); lstEnable.ForEach(m => { ContractBoiChangeNode node = lstNode.Find(n => n.ItemNo == m.ItemNo); node.ChangeDetailEx = m; ChangeNodeStat(node, true); }); }
/// <summary> /// 检查节点基本信息是否变化 /// </summary> /// <param name="Node"></param> /// <returns></returns> bool HasInfoChanged(ContractBoiChangeNode Node) { ContractBoi boi = Node; return(boi.IItemCoe != Node.IItemCoe || boi.ItemCode == Node.ItemCode || boi.ItemName != Node.ItemName || boi.Uom != Node.Uom); }
/// <summary> /// 插入节点 /// </summary> /// <param name="ParentNode"></param> public ContractBoiChangeNode InsertNode(ContractBoiChangeNode ParentNode = null) { String strParentCode; String strMaxCode; String strNewCode; int iNewCode; ContractBoiChangeNode nodeNew = new ContractBoiChangeNode(); if (ParentNode != null) { strParentCode = ParentNode.ItemCode; strMaxCode = ParentNode.Children.Max(m => m.ItemCode); if (String.IsNullOrEmpty(strMaxCode)) { strNewCode = strParentCode + "001"; } else { iNewCode = System.Convert.ToInt32(strMaxCode.Substring(strMaxCode.Length - 3, 3)) + 1; if (iNewCode > 999) { throw new BusinessException("清单项超出限制(子项不多余999项)"); } strNewCode = strParentCode + iNewCode.ToString().PadLeft(3, '0'); } ParentNode.Children.Add(nodeNew); nodeNew.ParentCode = ParentNode.ItemCode; } else { strMaxCode = RootList.Max(m => m.ItemCode); if (String.IsNullOrEmpty(strMaxCode)) { strNewCode = "01"; } else { iNewCode = System.Convert.ToInt32(strMaxCode) + 1; if (iNewCode > 99) { throw new BusinessException("清单项超出限制(顶层项不多余99项)"); } strNewCode = iNewCode.ToString().PadLeft(2, '0'); } RootList.Add(nodeNew); nodeNew.PropertyChanged += M_PropertyChanged; } nodeNew.ItemCode = strNewCode; nodeNew.ProjectNo = ProjectNo; nodeNew.BoQNo = Boq.BoQNo; nodeNew.ParentBoiNode = ParentNode; CalcNode(nodeNew); NodeList.Add(nodeNew); return(nodeNew); }
/// <summary> /// 清单父项值计算 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CalcParentNode(ContractBoiChangeNode ParentNode) { if (ParentNode.Children.Count == 0) { ParentNode.CtrctAmount = Math.Round(ObjectHelper.GetDefaultDecimal(ParentNode.CtrctQty) * ObjectHelper.GetDefaultDecimal(ParentNode.CtrctPrjPrice), 2, MidpointRounding.AwayFromZero); } else { ParentNode.CtrctQty = null; ParentNode.CtrctPrjPrice = null; ParentNode.CtrctAmount = ParentNode.Children.Sum(m => m.StatId == 1 ? m.CtrctAmount : 0); } }
/// <summary> /// 检查节点是否变化 /// </summary> /// <param name="Node"></param> /// <returns></returns> bool HasNodeChanged(ContractBoiChangeNode Node) { ContractBoi boi = Node; return(boi.IItemCoe != Node.IItemCoe || boi.ItemCode == Node.ItemCode || boi.ItemName != Node.ItemName || boi.Uom != Node.Uom || boi.CtrctAmount != Node.CtrctAmount || boi.CtrctPrjPrice != Node.CtrctPrjPrice || boi.CtrctQty != Node.CtrctQty || boi.StatId != Node.StatId); }
/// <summary> /// 列表项更改处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnNodeList_ListChanged(object sender, ListChangedEventArgs e) { //修改项 if (e.ListChangedType == ListChangedType.ItemChanged) { ContractBoiChangeNode boiNode = NodeList[e.NewIndex]; CalcNode(boiNode); if (!updateList.Contains(boiNode)) { updateList.Add(boiNode); } } }
/// <summary> /// 处理变化的节点 /// </summary> /// <param name="Node"></param> void HandleChange(ContractBoiChangeNode Node) { bool hasChanged = HasNodeChanged(Node); if (hasChanged) { UpdateChangeEx(Node); } else if (Node.ChangeDetailEx != null) { ChangeDetailExList.Remove(Node.ChangeDetailEx); Node.ChangeDetailEx = null; } }
/// <summary> /// 递归创建父子关系 /// </summary> /// <param name="NodeList"></param> /// <param name="Parent"></param> private void RecursionNode(List <ContractBoiChangeNode> NodeList, ContractBoiChangeNode Parent) { List <ContractBoiChangeNode> lstChildren = NodeList.FindAll(m => m.ParentCode == Parent.ItemCode); if (lstChildren.Count > 0) { Parent.Children.AddRange(lstChildren); lstChildren.ForEach(m => { m.ParentBoiNode = Parent; RecursionNode(NodeList, m); }); } }
private void ChangeCode(ContractBoiChangeNode node, String newCode) { String strOldCode = node.ItemCode; node.ItemCode = newCode; if (node.Children.Count > 0) { node.Children.ForEach(m => { m.ParentCode = newCode; ChangeCode(m, newCode + m.ItemCode.Substring(m.ItemCode.Length - 3, 3)); }); } }
/// <summary> /// 禁用和启用项 /// </summary> /// <param name="Node"></param> /// <param name="Stat">true-启用项,false-禁用项</param> public void ChangeNodeStat(ContractBoiChangeNode Node, Boolean Stat) { for (int i = Node.Children.Count - 1; i >= 0; i--) { ChangeNodeStat(Node.Children[i], Stat); //if (!Stat && !Node.Children[i].IsUse) //{ // Node.Children.RemoveAt(i); // RecursionDeleteNode(Node.Children[i]); //} } //updated by stang 20170603 //规则更改:关联原始清单项,则只能禁用 if (Node.OriginalBoi != null) // if (Node.IsUse) { Node.StatId = Stat ? 1 : 0; if (!Stat) { if (!deleteList.Contains(Node)) { deleteList.Add(Node); } } else { if (deleteList.Contains(Node)) { deleteList.Remove(Node); } } } else { if (Node.ParentBoiNode != null) { Node.ParentBoiNode.Children.Remove(Node); } DeleteNode(Node); } }
/// <summary> /// 将Boi列表转换为Node列表 /// </summary> /// <param name="BoiList"></param> /// <returns></returns> private List <ContractBoiChangeNode> Convert(List <ContractBoi> BoiList) { List <ContractBoiChangeNode> lstBoiNode; List <ContractBoiChangeNode> lstRoot; lstBoiNode = BoiList.ConvertAll <ContractBoiChangeNode>(m => { ContractBoiChangeNode node = HDAutoMapper.DynamicMap <ContractBoiChangeNode>(m); //生成变更的编辑界面使用合同字段作为最新的值,因此 将变更后的值赋值给合同字段 node.CtrctAmount = node.LatestAmount; node.CtrctPrjPrice = node.LatestPrice; node.CtrctQty = node.LatestQty; node.OriginalBoi = m; return(node); }); lstRoot = lstBoiNode.FindAll(m => String.IsNullOrEmpty(m.ParentCode)); RootList.AddRange(lstRoot); lstRoot.ForEach(m => { RecursionNode(lstBoiNode, m); }); return(lstBoiNode); }
/// <summary> /// 更新扩展对象新增和修改的值 /// </summary> /// <param name="Node"></param> void UpdateChangeEx(ContractBoiChangeNode Node) { if (Node.ChangeDetailEx == null) { Node.ChangeDetailEx = HDAutoMapper.DynamicMap <ContractBoqChangeDetailEx>(Node); ChangeDetailExList.Add(Node.ChangeDetailEx); } Node.ChangeDetailEx.AfAmount = Node.CtrctAmount; Node.ChangeDetailEx.AfPrice = Node.CtrctPrjPrice; Node.ChangeDetailEx.AfQty = Node.CtrctQty; Node.ChangeDetailEx.ItemCode = Node.ItemCode; Node.ChangeDetailEx.IItemCoe = Node.IItemCoe; Node.ChangeDetailEx.ItemName = Node.ItemName; Node.ChangeDetailEx.ParentCode = Node.ParentCode; Node.ChangeDetailEx.ItemNo = Node.ItemNo; Node.ChangeDetailEx.Uom = Node.Uom; if (Node.OriginalBoi != null) { Node.ChangeDetailEx.BefAmount = Node.OriginalBoi.CtrctAmount; Node.ChangeDetailEx.BefPrjPrice = Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.BefQty = Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangeQty = Node.CtrctQty - Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangePrice = Node.CtrctPrjPrice - Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.ChangeAmount = Node.CtrctAmount - Node.OriginalBoi.CtrctAmount; if (Node.StatId != Node.OriginalBoi.StatId) { Node.ChangeDetailEx.ChangeType = Node.StatId == 1 ? ChangeType.Enable : ChangeType.Disable; if (Node.StatId == 0) { Node.ChangeDetailEx.BefAmount = Node.OriginalBoi.CtrctAmount; Node.ChangeDetailEx.BefPrjPrice = Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.BefQty = Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.AfAmount = 0; Node.ChangeDetailEx.AfPrice = 0; Node.ChangeDetailEx.AfQty = 0; Node.ChangeDetailEx.ChangeQty = 0 - Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangePrice = 0 - Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.ChangeAmount = 0 - Node.OriginalBoi.CtrctAmount; } else { Node.ChangeDetailEx.BefAmount = 0; Node.ChangeDetailEx.BefPrjPrice = 0; Node.ChangeDetailEx.BefQty = 0; Node.ChangeDetailEx.AfAmount = Node.OriginalBoi.CtrctAmount; Node.ChangeDetailEx.AfPrice = Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.AfQty = Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangeQty = Node.OriginalBoi.CtrctQty; Node.ChangeDetailEx.ChangePrice = Node.OriginalBoi.CtrctPrjPrice; Node.ChangeDetailEx.ChangeAmount = Node.OriginalBoi.CtrctAmount; } } else { Node.ChangeDetailEx.ChangeType = ChangeType.Update; Node.ChangeDetailEx.IsUpQty = HasQtyChanged(Node); Node.ChangeDetailEx.IsUpPrice = HasPriceChanged(Node); Node.ChangeDetailEx.IsUpInfo = HasInfoChanged(Node); } } else { Node.ChangeDetailEx.BefAmount = 0; Node.ChangeDetailEx.BefPrjPrice = 0; Node.ChangeDetailEx.BefQty = 0; Node.ChangeDetailEx.ChangeQty = Node.CtrctQty; Node.ChangeDetailEx.ChangePrice = Node.CtrctPrjPrice; Node.ChangeDetailEx.ChangeAmount = Node.CtrctAmount; Node.ChangeDetailEx.ChangeType = ChangeType.Add; } }
/// <summary> /// 检查节点数量是否变化 /// </summary> /// <param name="Node"></param> /// <returns></returns> bool HasQtyChanged(ContractBoiChangeNode Node) { ContractBoi boi = Node.OriginalBoi; return(boi.CtrctQty != Node.CtrctQty); }
/// <summary> /// 删除节点 /// </summary> /// <param name="Node"></param> public void DeleteNode(ContractBoiChangeNode Node) { //已删除过,则返回 if (!NodeList.Contains(Node)) { return; } List <ContractBoiChangeNode> lstChildren = Node.Children.ToList(); for (int i = lstChildren.Count - 1; i >= 0; i--) { DeleteNode(lstChildren[i]); } if (NodeList.Contains(Node)) { NodeList.Remove(Node); } if (updateList.Contains(Node)) { updateList.Remove(Node); } if (!deleteList.Contains(Node)) { deleteList.Add(Node); } String strCode = null; int iCode = 0; if (Node.ParentBoiNode != null) { //删除节点的序号 int iIndex = Node.ParentBoiNode.Children.IndexOf(Node); //删除节点不是最后一个 if (iIndex < Node.ParentBoiNode.Children.Count - 1) { //移除节点 Node.ParentBoiNode.Children.Remove(Node); for (int i = iIndex; i < Node.ParentBoiNode.Children.Count; i++) { //对后面的节点的序号 统一减1 strCode = Node.ParentBoiNode.Children[i].ItemCode; iCode = System.Convert.ToInt32(strCode.Substring(strCode.Length - 3, 3)); iCode = iCode - 1; strCode = Node.ParentBoiNode.ItemCode + iCode.ToString().PadLeft(3, '0'); ChangeCode(Node.ParentBoiNode.Children[i], strCode); } } CalcParentNode(Node.ParentBoiNode); } else { int iIndex = RootList.IndexOf(Node); //删除节点不是最后一个 if (iIndex < RootList.Count - 1) { //移除节点 RootList.Remove(Node); for (int i = iIndex; i < RootList.Count; i++) { //对后面的节点的序号 统一减1 strCode = RootList[i].ItemCode; iCode = System.Convert.ToInt32(strCode); iCode = iCode - 1; strCode = iCode.ToString().PadLeft(2, '0'); RootList[i].ItemCode = strCode; ChangeCode(RootList[i], strCode); } } else { RootList.Remove(Node); } } }
/// <summary> /// 检查节点单价是否变化 /// </summary> /// <param name="Node"></param> /// <returns></returns> bool HasPriceChanged(ContractBoiChangeNode Node) { ContractBoi boi = Node.OriginalBoi; return(boi.CtrctPrjPrice != Node.CtrctPrjPrice); }
/// <summary> /// 检查节点是否禁用、启用变化 /// </summary> /// <param name="Node"></param> /// <returns></returns> bool HasDisableChanged(ContractBoiChangeNode Node) { ContractBoi boi = Node; return(boi.StatId != Node.StatId); }