Esempio n. 1
0
        /// <summary>
        /// 根据子项和专业列表同步WBS表
        /// </summary>
        public void SynchSubProjectWBSNode(Dictionary <string, string> dic, S_W_WBS rootWBS = null)
        {
            var userInfo        = FormulaHelper.GetUserInfo();
            var projectEntities = FormulaHelper.GetEntities <ProjectEntities>();
            var projectInfo     = projectEntities.Set <S_I_ProjectInfo>().Find(this.ProjectInfoID);

            if (projectInfo == null)
            {
                throw new Formula.Exceptions.BusinessException("根据当前项目策划单,未找到对应的项目信息");
            }
            if (rootWBS == null)
            {
                //获取项目信息
                rootWBS = projectInfo.WBSRoot;
                if (rootWBS == null)
                {
                    throw new Formula.Exceptions.BusinessException("未获取到当前项目的WBS根节点。");
                }
            }

            var roleDefineList = BaseConfigFO.GetRoleDefineList();
            var enumSubProject = WBSNodeType.SubProject.ToString();
            var subwbses       = rootWBS.Children.ToList();

            if (this.T_SC_SchemeForm_SubProjectList.ToList().Count == 0)   //如果没有策划任何子项,则默认建立一个子项,子项名称为项目阶段
            {
                foreach (var item in projectInfo.PhaseValue.Split(','))
                {
                }
                var subProjectListItem = new T_SC_SchemeForm_SubProjectList();
                subProjectListItem.ID         = FormulaHelper.CreateGuid();;
                subProjectListItem.Name       = projectInfo.PhaseName;
                subProjectListItem.Code       = projectInfo.PhaseValue;
                subProjectListItem.Unit       = "";
                subProjectListItem.PhaseValue = projectInfo.PhaseValue;
                this.T_SC_SchemeForm_SubProjectList.Add(subProjectListItem);
                this.SubProjectList = JsonHelper.ToJson(this.T_SC_SchemeForm_SubProjectList);
            }

            foreach (var subProject in this.T_SC_SchemeForm_SubProjectList.OrderBy(d => d.SortIndex).ToList())
            {
                var subWBSNode = subwbses.FirstOrDefault(d => d.WBSValue == subProject.Code && d.WBSType == WBSNodeType.SubProject.ToString());
                if (subWBSNode == null)
                {
                    subWBSNode           = new S_W_WBS();
                    subWBSNode.ID        = FormulaHelper.CreateGuid();
                    subWBSNode.WBSType   = WBSNodeType.SubProject.ToString();
                    subWBSNode.Name      = subProject.Name;
                    subWBSNode.Code      = "";
                    subWBSNode.WBSValue  = subProject.Code;
                    subWBSNode.PhaseCode = subProject.PhaseValue;
                    subWBSNode.ExtField1 = subProject.Area.HasValue ? subProject.Area.ToString() : "";
                    subWBSNode.ExtField2 = subProject.Unit;
                    rootWBS.AddChild(subWBSNode);
                }
                else
                {
                    subWBSNode.Name      = subProject.Name;
                    subWBSNode.PhaseCode = subProject.PhaseValue;
                    subWBSNode.ExtField1 = subProject.Area.HasValue ? subProject.Area.ToString() : "";
                    subWBSNode.ExtField2 = subProject.Unit;
                    subWBSNode.Save();
                    subwbses.Remove(subWBSNode);
                }
                #region 新增单体
                var wonomerList = subWBSNode.S_W_Monomer.ToList();
                if (String.IsNullOrEmpty(subProject.Unit))
                {
                    var wonomer = wonomerList.FirstOrDefault(d => d.Name == subProject.Name);
                    if (wonomer == null)
                    {
                        wonomer                 = new S_W_Monomer();
                        wonomer.ID              = FormulaHelper.CreateGuid();
                        wonomer.Name            = subProject.Name;
                        wonomer.ProjectInfoID   = this.ProjectInfoID;
                        wonomer.Code            = "";
                        wonomer.CreateDate      = DateTime.Now;
                        wonomer.CreateUser      = userInfo.UserName;
                        wonomer.CreateUserID    = userInfo.UserID;
                        wonomer.SchemeFormSubID = this.ID;
                        subWBSNode.S_W_Monomer.Add(wonomer);
                    }
                }
                else
                {
                    foreach (var item in subProject.Unit.Replace(",", ",").Split(','))
                    {
                        var wonomer = subWBSNode.S_W_Monomer.FirstOrDefault(d => d.Name == item);
                        if (wonomer == null)
                        {
                            wonomer                 = new S_W_Monomer();
                            wonomer.ID              = FormulaHelper.CreateGuid();
                            wonomer.Name            = item;
                            wonomer.ProjectInfoID   = this.ProjectInfoID;
                            wonomer.Code            = "";
                            wonomer.CreateDate      = DateTime.Now;
                            wonomer.CreateUser      = userInfo.UserName;
                            wonomer.CreateUserID    = userInfo.UserID;
                            wonomer.SchemeFormSubID = this.ID;
                            subWBSNode.S_W_Monomer.Add(wonomer);
                        }
                        else
                        {
                            wonomerList.Remove(wonomer);
                        }
                    }
                }
                foreach (var delWonomer in wonomerList)   //移除不需要的单体
                {
                    projectEntities.S_W_Monomer.Remove(delWonomer);
                }

                #endregion

                SynchMajorWBSNode(roleDefineList, subWBSNode, subProject.RBSJson);
                //this.InitMileStone(subWBSNode);
            }
            subwbses.ForEach(t => t.Delete());  //删除多余的子项
        }
Esempio n. 2
0
        public void Push()
        {
            var    allUser       = FormulaHelper.GetService <IUserService>().GetAllUsers();
            var    userInfo      = FormulaHelper.GetUserInfo();
            var    fo            = FormulaHelper.CreateFO <ProjectInfoFO>();
            var    roleDefine    = BaseConfigFO.GetRoleDefineList();
            string formData      = HttpContext.Current.Request["FormData"];
            var    dic           = JsonHelper.ToObject(formData);
            var    DB            = SQLHelper.CreateSqlHelper(ConnEnum.Project);
            var    newRbsDt      = DB.ExecuteDataTable("SELECT * FROM S_W_RBS WITH(NOLOCK) WHERE 1<>1");
            var    wbsDt         = DB.ExecuteDataTable("SELECT 'false' as AddState,* FROM S_W_WBS WITH(NOLOCK) WHERE PROJECTINFOID='" + this.ProjectInfoID + "'");
            var    monomerDt     = DB.ExecuteDataTable("SELECT * FROM S_W_Monomer WHIT(NOLOCK) WHERE PROJECTINFOID='" + this.ProjectInfoID + "'");
            var    projectInfoDt = DB.ExecuteDataTable(String.Format("SELECT * FROM S_I_PROJECTINFO WHERE ID='{0}'", this.ProjectInfoID));

            if (projectInfoDt.Rows.Count == 0)
            {
                throw new Formula.Exceptions.BusinessException("根据当前项目策划单,未找到对应的项目信息");
            }
            var projectRow = projectInfoDt.Rows[0];
            var rootWBS    = wbsDt.AsEnumerable().FirstOrDefault(c => c["WBSType"].ToString() == "Project");

            if (rootWBS == null)
            {
                throw new Formula.Exceptions.BusinessException("未获取到当前项目的WBS根节点。");
            }
            var configBaseEntities = FormulaHelper.GetEntities <BaseConfigEntities>();
            var modeCode           = projectRow["ModeCode"].ToString();
            var mode = configBaseEntities.S_T_ProjectMode.FirstOrDefault(c => c.ModeCode == modeCode);

            if (mode == null)
            {
                throw new Formula.Exceptions.BusinessValidationException("没有找到对应的项目模式,策划失败");
            }
            var structList = mode.S_T_WBSStructInfo.ToList();

            var sqlCommand   = new StringBuilder();
            var newMonomerDT = monomerDt.Clone();

            #region 设置项目的RBS
            //重设项目经理
            if (!String.IsNullOrEmpty(this.ChargeUser))
            {
                var pmRoleDefine = roleDefine.FirstOrDefault(c => c.RoleCode == ProjectRole.ProjectManager.ToString());
                if (pmRoleDefine == null)
                {
                    throw new Formula.Exceptions.BusinessException("没有项目负责人的角色定义,无法设置项目负责人。");
                }
                sqlCommand.AppendLine(String.Format("DELETE FROM S_W_RBS WHERE WBSID='{0}' AND ROLECODE='{1}'", rootWBS["ID"], ProjectRole.ProjectManager.ToString()));
                foreach (var userID in this.ChargeUser.Split(','))
                {
                    var user = allUser.SingleOrDefault(c => c.UserID == userID);
                    if (user == null)
                    {
                        continue;
                    }
                    addRbsDt(userInfo, newRbsDt, rootWBS, pmRoleDefine);
                }
            }
            var roleList = BaseConfigFO.GetRoleDefineList().Where(a => dic.ContainsKey(a.RoleCode) && !string.IsNullOrEmpty(dic.GetValue(a.RoleCode)));
            foreach (var roleDef in roleList)
            {
                sqlCommand.AppendLine(String.Format("DELETE FROM S_W_RBS WHERE WBSID='{0}' AND ROLECODE='{1}'", rootWBS["ID"], roleDef.RoleCode));
                foreach (var userID in dic.GetValue(roleDef.RoleCode).Split(','))
                {
                    var user = allUser.SingleOrDefault(c => c.UserID == userID);
                    if (user == null)
                    {
                        continue;
                    }
                    addRbsDt(user, newRbsDt, rootWBS, roleDef);
                }
            }
            #endregion

            wbsDt.PrimaryKey = new DataColumn[] { wbsDt.Columns["ID"] };
            var subwbsList = wbsDt.AsEnumerable().Where(c => c["ParentID"] != DBNull.Value && c["ParentID"].ToString() == rootWBS["ID"].ToString());

            #region 设置WBS
            if (this.T_SC_SchemeForm_SubProjectList.ToList().Count == 0)   //如果没有策划任何子项,则默认建立一个子项,子项名称为项目阶段
            {
                var subProjectListItem = new T_SC_SchemeForm_SubProjectList();
                subProjectListItem.ID         = FormulaHelper.CreateGuid();;
                subProjectListItem.Name       = projectRow["PhaseName"] == null || projectRow["PhaseName"] == DBNull.Value ? "" : projectRow["PhaseName"].ToString();
                subProjectListItem.Code       = projectRow["PhaseValue"] == null || projectRow["PhaseValue"] == DBNull.Value ? "" : projectRow["PhaseValue"].ToString();
                subProjectListItem.Unit       = "";
                subProjectListItem.PhaseValue = projectRow["PhaseValue"] == null || projectRow["PhaseValue"] == DBNull.Value ? "" : projectRow["PhaseValue"].ToString();
                this.T_SC_SchemeForm_SubProjectList.Add(subProjectListItem);
                this.SubProjectList = JsonHelper.ToJson(this.T_SC_SchemeForm_SubProjectList);
            }
            var subProjectStr  = WBSNodeType.SubProject.ToString();
            var subPrjWBSNodes = wbsDt.AsEnumerable().Where(a => a["WBSType"].ToString() == subProjectStr).ToList();
            //需要删除的子项
            var subPrjIDWBSIDs = T_SC_SchemeForm_SubProjectList.Select(a => a.WBSID).ToArray();
            var delSubProjects = subPrjWBSNodes.Where(a => !subPrjIDWBSIDs.Contains(a["ID"].ToString()));
            foreach (var item in delSubProjects)
            {
                sqlCommand.AppendLine("delete from S_W_WBS where FullID like '" + item["FullID"].ToString() + "%'");
            }
            foreach (var subProject in this.T_SC_SchemeForm_SubProjectList.OrderBy(d => d.SortIndex).ToList())
            {
                if (String.IsNullOrEmpty(subProject.WBSID))
                {
                    subProject.WBSID = FormulaHelper.CreateGuid();
                }
                var subWBSNode = wbsDt.Rows.Find(subProject.WBSID);  //subwbsList.FirstOrDefault(d => d["ID"].ToString() == subProject.WBSID);
                if (subWBSNode == null)
                {
                    subWBSNode              = wbsDt.NewRow();
                    subWBSNode["ID"]        = subProject.WBSID;
                    subWBSNode["Name"]      = subProject.Name;
                    subWBSNode["WBSType"]   = WBSNodeType.SubProject.ToString();
                    subWBSNode["WBSValue"]  = subProject.Code;
                    subWBSNode["PhaseCode"] = subProject.PhaseValue;
                    subWBSNode["ExtField1"] = subProject.Area.HasValue ? subProject.Area.ToString() : "";
                    subWBSNode["ExtField2"] = subProject.Unit;
                    fo.AddWBSChildWithAdo(rootWBS, subWBSNode, wbsDt, structList);
                }
                else
                {
                    sqlCommand.AppendLine(String.Format("update S_W_WBS set Name='{0}', PhaseCode='{1}',ExtField1='{2}',ExtField2='{3}' where ID ='{4}'",
                                                        subProject.Name,
                                                        subProject.PhaseValue,
                                                        subProject.Area.HasValue ? subProject.Area.ToString() : "",
                                                        subProject.Unit,
                                                        subWBSNode["ID"]
                                                        ));
                    var allChildren = wbsDt.AsEnumerable().Where(c => c["FullID"].ToString().StartsWith(subWBSNode["FullID"].ToString()) && c["ID"].ToString() != subWBSNode["ID"].ToString());
                    foreach (DataRow item in allChildren)
                    {
                        sqlCommand.AppendLine(String.Format("update S_W_WBS set PhaseCode='{0}' where ID ='{1}'", subProject.PhaseValue, item["ID"]));
                    }
                }
                #region 新增单体
                var wonomerList = monomerDt.AsEnumerable().Where(c => c["WBSID"].ToString() == subWBSNode["ID"].ToString()).ToList();
                if (String.IsNullOrEmpty(subProject.Unit))
                {
                    var wonomer = wonomerList.FirstOrDefault(d => d["Name"].ToString() == subProject.Name);
                    if (wonomer == null)
                    {
                        wonomer                    = newMonomerDT.NewRow();
                        wonomer["ID"]              = FormulaHelper.CreateGuid();
                        wonomer["WBSID"]           = subWBSNode["ID"].ToString();
                        wonomer["ProjectInfoID"]   = this.ProjectInfoID;
                        wonomer["Name"]            = subProject.Name;
                        wonomer["CreateDate"]      = DateTime.Now;
                        wonomer["CreateUser"]      = userInfo.UserName;
                        wonomer["CreateUserID"]    = userInfo.UserID;
                        wonomer["SchemeFormSubID"] = this.ID;
                        wonomer["Code"]            = String.IsNullOrEmpty(subProject.Code) ? subProject.Name : subProject.Code;
                        newMonomerDT.Rows.Add(wonomer);
                    }
                }
                else
                {
                    foreach (var item in subProject.Unit.Replace(",", ",").Split(','))
                    {
                        var wonomer = wonomerList.FirstOrDefault(d => d["Name"].ToString() == item);
                        if (wonomer == null)
                        {
                            wonomer                    = newMonomerDT.NewRow();
                            wonomer["ID"]              = FormulaHelper.CreateGuid();
                            wonomer["WBSID"]           = subWBSNode["ID"].ToString();
                            wonomer["ProjectInfoID"]   = this.ProjectInfoID;
                            wonomer["Name"]            = item;
                            wonomer["CreateDate"]      = DateTime.Now;
                            wonomer["CreateUser"]      = userInfo.UserName;
                            wonomer["CreateUserID"]    = userInfo.UserID;
                            wonomer["SchemeFormSubID"] = this.ID;
                            wonomer["Code"]            = item;
                            newMonomerDT.Rows.Add(wonomer);
                        }
                        else
                        {
                            wonomerList.Remove(wonomer);
                        }
                    }
                }
                sqlCommand.AppendLine("delete from S_W_Monomer where ID in ('" + String.Join(",", wonomerList.Select(c => c["ID"].ToString())).Replace(",", "','") + "')");

                #endregion

                setMajorNodes(subWBSNode, wbsDt, newRbsDt, roleDefine, subProject.RBSJson, sqlCommand, structList, allUser);
            }
            #endregion

            var newWBSDt  = wbsDt.Clone();
            var addesRows = wbsDt.AsEnumerable().Where(c => c["AddState"] != null && c["AddState"] != DBNull.Value && c["AddState"].ToString() == "true").ToList();
            foreach (var item in addesRows)
            {
                newWBSDt.ImportRow(item);
            }
            newWBSDt.Columns.Remove("AddState");
            if (!String.IsNullOrEmpty(sqlCommand.ToString()))
            {
                DB.ExecuteNonQuery(sqlCommand.ToString());
            }
            DB.BulkInsertToDB(newWBSDt, "S_W_WBS");
            DB.BulkInsertToDB(newMonomerDT, "S_W_Monomer");
            DB.BulkInsertToDB(newRbsDt, "S_W_RBS");
            fo.ResetOBSUserFromRBSWithAdo(this.ProjectInfoID);
        }