Exemplo n.º 1
0
        public ActionResult WBSMultiUserSelect()
        {
            string projectInfoID = this.Request["ProjectInfoID"];
            var    projectInfo   = this.entities.Set <S_I_ProjectInfo>().Find(projectInfoID);

            if (projectInfo == null)
            {
                throw new Formula.Exceptions.BusinessException("未能找到ID为【" + projectInfoID + "】的项目对象");
            }
            //string wbsTypes = this.Request["WBSTypes"];
            //var mode = BaseConfigFO.GetMode(projectInfo.ModeCode);
            //if (mode == null) throw new Formula.Exceptions.BusinessException("编码为【" + projectInfo.ModeCode + "】的管理模式定义不存在");
            //var roleDefines  = new List<S_T_WBSStructRole>();
            //foreach (var wbsType in wbsTypes.Split(','))
            //{
            //    var wbsStructNode = mode.S_T_WBSStructInfo.FirstOrDefault(d => d.Code == wbsType);
            //    if (wbsStructNode == null) throw new Formula.Exceptions.BusinessException("未找到WBS节点定义,请确认【" + projectInfo.ModeCode + "】管理模式中存在【" + wbsType + "】的WBS定义");
            //    var _roleDefines = wbsStructNode.S_T_WBSStructRole.Where(d => d.RoleCode != ProjectRole.ProjectManager.ToString()).OrderBy(d => d.SortIndex).ToList();
            //    foreach (var _roleDefine in _roleDefines)
            //    {
            //        if (!roleDefines.Any(a => a.RoleCode == _roleDefine.RoleCode && a.RoleName == _roleDefine.RoleName))
            //            roleDefines.Add(_roleDefine);
            //    }
            //}
            var roleCodes = this.GetQueryString("RoleCodes").Split(',');

            ViewBag.RoleDefines = BaseConfigFO.GetRoleDefineList().Where(a => roleCodes.Contains(a.RoleCode)).OrderBy(a => a.SortIndex).ToList();

            ViewBag.ProjectClass = projectInfo.ProjectClass;
            ViewBag.ProjectLevel = projectInfo.ProjectLevel;
            ViewBag.MajorCodes   = GetQueryString("MajorCodes");
            return(View());
        }
Exemplo n.º 2
0
        /// <summary>
        /// 同步项目负责人,项目副经理,主管副总工,计划工程师,质量工程师,文档工程师写进RBS
        /// </summary>
        public void SynchRBSUser(Dictionary <string, string> dic, S_W_WBS rootWBS = null)
        {
            if (rootWBS == null)
            {
                var projectEntities = FormulaHelper.GetEntities <ProjectEntities>();
                //获取项目信息
                var projectInfo = projectEntities.Set <S_I_ProjectInfo>().Find(this.ProjectInfoID);
                if (projectInfo == null)
                {
                    throw new Formula.Exceptions.BusinessException("根据当前项目策划单,未找到对应的项目信息");
                }
                rootWBS = projectInfo.WBSRoot;
                if (rootWBS == null)
                {
                    throw new Formula.Exceptions.BusinessException("未获取到当前项目的WBS根节点。");
                }
            }
            if (rootWBS.WBSType != WBSNodeType.Project.ToString())
            {
                throw new Formula.Exceptions.BusinessException("非根节点WBS,不可将项目主要干系人信息同步至RBS");
            }
            if (rootWBS == null)
            {
                throw new Formula.Exceptions.BusinessException("未获取到当前项目的WBS根节点。");
            }
            //将项目负责人,项目副经理,主管副总工,计划工程师,质量工程师,文档工程师写进RBS
            rootWBS.SetUsers(ProjectRole.ProjectManager.ToString(), this.ChargeUser.Split(','), true, true);//项目负责人
            //c_hua 2018/10/08 根据角色定义与表单字段动态写入RBS
            var roleList = BaseConfigFO.GetRoleDefineList().Where(a => dic.ContainsKey(a.RoleCode) && !string.IsNullOrEmpty(dic.GetValue(a.RoleCode)));

            foreach (var roleDef in roleList)
            {
                rootWBS.SetUsers(roleDef.RoleCode, dic.GetValue(roleDef.RoleCode).Split(','), true, true);
            }
        }
Exemplo n.º 3
0
        protected override void OnFlowEnd(T_SC_PetrifactionProjectScheme entity, Workflow.Logic.Domain.S_WF_InsTaskExec taskExec, Workflow.Logic.Domain.S_WF_InsDefRouting routing)
        {
            var projectInfo = this.BusinessEntities.Set <S_I_ProjectInfo>().Find(entity.ProjectInfoID);

            if (projectInfo == null)
            {
                throw new Formula.Exceptions.BusinessException("根据当前项目策划单,未找到对应的项目信息");
            }
            List <Dictionary <string, object> > majorUserList = null;

            if (!string.IsNullOrEmpty(entity.MajorList))
            {
                majorUserList = JsonHelper.ToList(entity.MajorList);
            }
            projectInfo.SynchMajorData(entity.Major);
            //从RBS同步人员到obs
            projectInfo.ResetOBSUserFromRBS();
            //人员加到obs表,以便wbs策划时快速选人
            if (majorUserList != null)
            {
                var roleDefineList = BaseConfigFO.GetRoleDefineList();
                foreach (var majorNode in majorUserList)
                {
                    var roleList = roleDefineList.Where(a => majorNode.ContainsKey(a.RoleCode) && !string.IsNullOrEmpty(majorNode.GetValue(a.RoleCode)));
                    foreach (var roleDef in roleList)
                    {
                        foreach (var userID in majorNode.GetValue(roleDef.RoleCode).Split(','))
                        {
                            var user = FormulaHelper.GetService <IUserService>().GetUserInfoByID(userID);
                            projectInfo.SetOBSUser(user, roleDef.RoleCode, majorNode.GetValue("MajorCode"), majorNode.GetValue("MajorName"));
                        }
                    }
                }
            }


            //base.OnFlowEnd(entity, taskExec, routing);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 根据阶段、子项信息、专业信息同步WBS节点
        /// </summary>
        public void SynchWBSNode(Dictionary <string, string> dic, S_W_WBS rootWBS = null)
        {
            var enumService     = FormulaHelper.GetService <IEnumService>();
            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 detailList = this.T_SC_SchemeForm_OEM_Szsow_SubProjectList.OrderBy(d => d.SortIndex).ToList();

            var roleDefineList = BaseConfigFO.GetRoleDefineList();
            var phaseWBSes     = rootWBS.Children.ToList();
            var phaseAttrs     = BaseConfigFO.GetWBSAttrList(WBSNodeType.Phase);

            foreach (var phaseValue in projectInfo.PhaseValue.Split(','))
            {
                #region 阶段节点

                var phaseName = enumService.GetEnumText("Project.Phase", phaseValue);
                var attr      = phaseAttrs.FirstOrDefault(a => a.Code == phaseValue);
                if (attr == null)
                {
                    throw new Formula.Exceptions.BusinessException("未定义阶段【" + phaseValue + "】" + phaseName + ",操作失败");
                }
                var phaseWBSNode = phaseWBSes.FirstOrDefault(d => d.WBSValue == phaseValue &&
                                                             d.WBSType == WBSNodeType.Phase.ToString());
                if (phaseWBSNode == null)
                {
                    phaseWBSNode          = new S_W_WBS();
                    phaseWBSNode.ID       = FormulaHelper.CreateGuid();
                    phaseWBSNode.WBSType  = WBSNodeType.Phase.ToString();
                    phaseWBSNode.Name     = phaseName;
                    phaseWBSNode.Code     = attr.WBSCode;
                    phaseWBSNode.WBSValue = attr.Code;
                    rootWBS.AddChild(phaseWBSNode);
                }
                else
                {
                    phaseWBSNode.Name     = phaseName;
                    phaseWBSNode.Code     = attr.WBSCode;
                    phaseWBSNode.WBSValue = attr.Code;
                    phaseWBSNode.Save();
                    phaseWBSes.Remove(phaseWBSNode);
                }
                #endregion

                #region 子项节点
                var subwbses = phaseWBSNode.Children.ToList();
                foreach (var subProject in detailList.Where(a => a.PhaseValue.Split(',').Contains(phaseValue)).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.ExtField1 = subProject.Area.HasValue ? subProject.Area.ToString() : "";
                        subWBSNode.ExtField2 = subProject.Unit;
                        phaseWBSNode.AddChild(subWBSNode);
                    }
                    else
                    {
                        subWBSNode.Name      = subProject.Name;
                        subWBSNode.WBSValue  = subProject.Code;
                        subWBSNode.ExtField1 = subProject.Area.HasValue ? subProject.Area.ToString() : "";
                        subWBSNode.ExtField2 = subProject.Unit;
                        subWBSNode.Save();
                        subwbses.Remove(subWBSNode);
                    }
                    subProject.PhaseWBSID = phaseWBSNode.ID;
                    #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 if (!string.IsNullOrEmpty(subProject.Name))
                    {
                        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

                    //增加名称判断逻辑
                    if (string.IsNullOrEmpty(subProject.Name))
                    {
                        //将空名子项的专业挂到阶段下
                        SynchMajorWBSNode(roleDefineList, subWBSNode.Parent, subProject.RBSJson);
                        //删除空名子项
                        subWBSNode.Delete();

                        //排除在阶段下的专业
                        var rbsDicList = JsonHelper.ToList(subProject.RBSJson ?? MajorList);
                        subwbses.RemoveAll(a => rbsDicList.Any(b => a.WBSValue == b.GetValue("MajorCode")));
                    }
                    else
                    {
                        subProject.SubProjectWBSID = subWBSNode.ID;
                        SynchMajorWBSNode(roleDefineList, subWBSNode, subProject.RBSJson);
                    }
                    //this.InitMileStone(subWBSNode);
                }
                #endregion

                //删除阶段节点下多余的子项和专业
                subwbses.ForEach(t =>
                {
                    if (t.WBSType == WBSNodeType.Major.ToString())
                    {
                        //删除阶段下层专业时,同时删除挂在阶段下的专业计划、发图计划
                        projectEntities.Set <S_P_MileStone>().Delete(d => d.WBSID == phaseWBSNode.ID && d.MajorValue == t.WBSValue);
                    }
                    t.Delete();
                });
            }
            phaseWBSes.ForEach(t => t.Delete());  //删除多余的阶段

            this.SubProjectList = JsonHelper.ToJson <List <T_SC_SchemeForm_OEM_Szsow_SubProjectList> >(detailList);
        }
Exemplo n.º 5
0
        public void Push(Dictionary <string, string> dic)
        {
            var projectEntities = FormulaHelper.GetEntities <ProjectEntities>();
            var projectInfo     = projectEntities.Set <S_I_ProjectInfo>().Find(this.ProjectInfoID);

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

            if (rootWBS == null)
            {
                throw new Formula.Exceptions.BusinessException("未获取到当前项目的WBS根节点。");
            }
            if (!String.IsNullOrEmpty(this.Code))
            {
                projectInfo.Code = this.Code;
            }

            if (this.PlanStartDate.HasValue)
            {
                projectInfo.PlanStartDate = this.PlanStartDate;
            }
            if (this.PlanFinishDate.HasValue)
            {
                projectInfo.PlanFinishDate = this.PlanFinishDate;
            }

            this.SynchRBSUser(dic);
            var selectMajorList = this.Major.Split(',');

            #region 回写专业信息
            //移除未选中的专业
            var removeMajorList = projectInfo.S_W_WBS.Where(d => d.WBSType == WBSNodeType.Major.ToString() &&
                                                            !selectMajorList.Contains(d.WBSValue)).ToList();
            foreach (var item in removeMajorList)
            {
                item.Delete();
            }

            var roleDefineList = BaseConfigFO.GetRoleDefineList();
            var majorAttrList  = BaseConfigFO.GetWBSAttrList(WBSNodeType.Major);

            if (!string.IsNullOrEmpty(this.MajorList))
            {
                var majorNodes = JsonHelper.ToList(this.MajorList);
                foreach (var item in majorNodes)
                {
                    var majorCode = item.GetValue("MajorCode");
                    var attr      = majorAttrList.FirstOrDefault(d => d.Code == majorCode);
                    if (attr == null)
                    {
                        throw new Formula.Exceptions.BusinessException("未定义专业【" + majorCode + "】" + item.GetValue("MajorName") + ",操作失败");
                    }
                    var major = projectInfo.S_W_WBS.FirstOrDefault(d => d.WBSValue == majorCode && d.WBSType == WBSNodeType.Major.ToString());
                    if (major == null)
                    {
                        major           = new S_W_WBS();
                        major.Name      = attr.Name;
                        major.Code      = attr.WBSCode;
                        major.WBSValue  = attr.Code;
                        major.MajorCode = attr.Code;
                        major.WBSType   = WBSNodeType.Major.ToString();
                        major.SortIndex = attr.SortIndex;
                        projectInfo.WBSRoot.AddChild(major);
                    }
                    else
                    {
                        major.PhaseCode = projectInfo.PhaseValue;
                    }
                    //if (!string.IsNullOrEmpty(item.MajorPrinciple))
                    //    major.SetUsers(ProjectRole.MajorPrinciple.ToString(), item.MajorPrinciple.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.MajorEngineer))
                    //    major.SetUsers(ProjectRole.MajorEngineer.ToString(), item.MajorEngineer.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Designer))
                    //    major.SetUsers(ProjectRole.Designer.ToString(), item.Designer.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Collactor))
                    //    major.SetUsers(ProjectRole.Collactor.ToString(), item.Collactor.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Auditor))
                    //    major.SetUsers(ProjectRole.Auditor.ToString(), item.Auditor.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Approver))
                    //    major.SetUsers(ProjectRole.Approver.ToString(), item.Approver.Split(','), true, true, true, true);
                    var roleList = roleDefineList.Where(a => item.ContainsKey(a.RoleCode) && !string.IsNullOrEmpty(item.GetValue(a.RoleCode)));
                    foreach (var roleDef in roleList)
                    {
                        major.SetUsers(roleDef.RoleCode, item.GetValue(roleDef.RoleCode).Split(','), true, true, true, true);
                    }
                }
            }
            var wbsMajorList = projectInfo.S_W_WBS.Where(d => d.WBSType == WBSNodeType.Major.ToString()).
                               Select(d => new { Name = d.Name, Value = d.WBSValue, SortIndex = d.SortIndex }).OrderBy(c => c.SortIndex).ToList();
            projectInfo.Major = JsonHelper.ToJson(wbsMajorList);
            var wonomerList = projectInfo.WBSRoot.S_W_Monomer.ToList();
            var userInfo    = FormulaHelper.GetUserInfo();
            if (wonomerList.Count == 0)
            {
                var wonomer = new S_W_Monomer();
                wonomer.ID              = FormulaHelper.CreateGuid();
                wonomer.Name            = projectInfo.Name;
                wonomer.ProjectInfoID   = this.ProjectInfoID;
                wonomer.Code            = "";
                wonomer.CreateDate      = DateTime.Now;
                wonomer.CreateUser      = userInfo.UserName;
                wonomer.CreateUserID    = userInfo.UserID;
                wonomer.SchemeFormSubID = this.ID;
                projectInfo.WBSRoot.S_W_Monomer.Add(wonomer);
            }
            #endregion

            var detailMileStoneList = this.T_SC_SingleProjectScheme_MileStoneList.ToList();
            #region  除里程碑
            var selectCodes         = detailMileStoneList.Select(a => a.Code).ToList();
            var deleteMileStoneList = projectInfo.S_P_MileStone.Where(a => !selectCodes.Contains(a.Code)).ToList();
            foreach (var item in deleteMileStoneList)
            {
                item.Delete();
            }
            #endregion
            #region 更新进度计划
            for (int i = 0; i < detailMileStoneList.Count; i++)
            {
                var item      = detailMileStoneList.ToList()[i];
                var mileStone = projectEntities.S_P_MileStone.FirstOrDefault(d => d.Code == item.Code && d.WBSID == projectInfo.WBSRoot.ID &&
                                                                             d.ProjectInfoID == this.ProjectInfoID);
                if (mileStone == null)
                {
                    mileStone                   = new S_P_MileStone();
                    mileStone.ID                = FormulaHelper.CreateGuid();
                    mileStone.Name              = item.Name;
                    mileStone.Code              = item.Code;
                    mileStone.MileStoneValue    = item.Code;
                    mileStone.WBSID             = projectInfo.WBSRoot.ID;
                    mileStone.ProjectInfoID     = projectInfo.ID;
                    mileStone.OrlPlanFinishDate = item.PlanEndDate;
                    mileStone.S_I_ProjectInfo   = projectInfo;
                }
                if (mileStone.State == ProjectCommoneState.Finish.ToString())
                {
                    continue;
                }
                mileStone.PlanFinishDate = item.PlanEndDate;
                mileStone.Weight         = item.Weight;
                mileStone.MajorValue     = item.Major;
                mileStone.TemplateID     = item.TemplateID;
                mileStone.MileStoneType  = item.MileStoneType;
                mileStone.Name           = item.Name;
                if (projectInfo.ProjectMode.ExtentionObject.GetValue("Ext_MsDataIsFromLastVertion") == TrueOrFalse.True.ToString())
                {
                    mileStone.SortIndex = Convert.ToInt32(item.SortIndex.HasValue ? Convert.ToDecimal(item.SortIndex) * 100 : i);
                }
                else
                {
                    var template = projectInfo.ProjectMode.S_T_MileStone.FirstOrDefault(d => d.ID == item.TemplateID);
                    if (template != null)
                    {
                        mileStone.SortIndex = template.SortIndex;
                    }
                    if (!mileStone.SortIndex.HasValue)
                    {
                        mileStone.SortIndex = item.SortIndex.HasValue ? Convert.ToInt32(item.SortIndex) : i;
                    }
                }
                mileStone.Description = item.Remark;
                mileStone.Save();
                if (mileStone.MileStoneType == MileStoneType.Cooperation.ToString())
                {
                    mileStone.OutMajorValue = item.InMajor;
                    var cooperationPlan = projectEntities.S_P_CooperationPlan.FirstOrDefault(d => d.SchemeWBSID == projectInfo.WBSRoot.ID &&
                                                                                             d.CooperationValue == mileStone.MileStoneValue);
                    if (cooperationPlan == null)
                    {
                        cooperationPlan = new S_P_CooperationPlan();
                        cooperationPlan.InMajorValue       = item.InMajor;
                        cooperationPlan.OutMajorValue      = item.OutMajor;
                        cooperationPlan.MileStoneID        = mileStone.ID;
                        cooperationPlan.ID                 = FormulaHelper.CreateGuid();
                        cooperationPlan.CooperationContent = mileStone.Name;
                        cooperationPlan.CooperationValue   = mileStone.MileStoneValue;
                        cooperationPlan.OrPlanFinishDate   = item.PlanEndDate;
                        cooperationPlan.PlanFinishDate     = item.PlanEndDate;
                    }
                    if (!cooperationPlan.OrPlanFinishDate.HasValue)
                    {
                        cooperationPlan.OrPlanFinishDate = item.PlanEndDate;
                    }
                    cooperationPlan.PlanFinishDate = item.PlanEndDate;
                    if (projectInfo.WBSRoot != null)
                    {
                        projectInfo.WBSRoot.SaveCooperationPlan(cooperationPlan);
                    }
                }
            }
            #endregion
            //根据RBS更新OBS
            projectInfo.ResetOBSUserFromRBS();
            projectInfo.State = ProjectCommoneState.Execute.ToString();
        }
        public void Push(Dictionary <string, string> dic)
        {
            var projectEntities = FormulaHelper.GetEntities <ProjectEntities>();
            var projectInfo     = projectEntities.Set <S_I_ProjectInfo>().Find(this.ProjectInfoID);

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

            if (rootWBS == null)
            {
                throw new Formula.Exceptions.BusinessException("未获取到当前项目的WBS根节点。");
            }
            if (!String.IsNullOrEmpty(this.Code))
            {
                projectInfo.Code = this.Code;
            }

            if (this.PlanStartDate.HasValue)
            {
                projectInfo.PlanStartDate = this.PlanStartDate;
            }
            if (this.PlanFinishDate.HasValue)
            {
                projectInfo.PlanFinishDate = this.PlanFinishDate;
            }

            this.SynchRBSUser(dic);
            var selectMajorList = this.Major.Split(',');

            #region 更新预留工时、管理工时CBS
            var cbsRoot      = projectInfo.CBSRoot;
            var nodeType     = CBSNodeType.Category.ToString();
            var categoryType = CBSCategoryType.Reserve.ToString();
            var enums        = EnumBaseHelper.GetEnumDef(typeof(CBSCategoryType));
            //预留工时
            var reserveCBS = cbsRoot.Children.FirstOrDefault(d => d.NodeType == nodeType && d.Code == categoryType);
            if (reserveCBS == null)
            {
                reserveCBS              = new S_C_CBS();
                reserveCBS.Name         = enums.EnumItem.FirstOrDefault(a => a.Code == categoryType).Name;
                reserveCBS.Code         = categoryType;
                reserveCBS.NodeType     = nodeType;
                reserveCBS.CBSType      = CBSType.LabourExpense.ToString();
                reserveCBS.SortIndex    = 0;
                reserveCBS.CreateUserID = this.CreateUserID;
                reserveCBS.CreateUser   = this.CreateUser;
                cbsRoot.AddChild(reserveCBS);
            }
            reserveCBS.Quantity   = this.ReserveWorkload ?? 0;
            reserveCBS.TotalPrice = reserveCBS.Quantity.Value * reserveCBS.UnitPrice.Value;
            //管理工时
            categoryType = CBSCategoryType.Manage.ToString();
            var manageCBS = cbsRoot.Children.FirstOrDefault(d => d.NodeType == nodeType && d.Code == categoryType);
            if (manageCBS == null)
            {
                manageCBS              = new S_C_CBS();
                manageCBS.Name         = enums.EnumItem.FirstOrDefault(a => a.Code == categoryType).Name;
                manageCBS.Code         = categoryType;
                manageCBS.NodeType     = nodeType;
                manageCBS.CBSType      = CBSType.LabourExpense.ToString();
                manageCBS.SortIndex    = 1;
                manageCBS.CreateUserID = this.CreateUserID;
                manageCBS.CreateUser   = this.CreateUser;
                cbsRoot.AddChild(manageCBS);
            }
            //删除不存在的
            var subManageWorkloadList = this.T_SC_ElectricalPowerProjectScheme_ManageWorkloadList.ToList();
            var removeManageList      = manageCBS.Children.Where(d => !subManageWorkloadList.Select(a => a.Item).Contains(d.Code)).ToList();
            foreach (var item in removeManageList)
            {
                item.Delete();
            }
            foreach (var item in subManageWorkloadList)
            {
                var _mcbs = manageCBS.Children.FirstOrDefault(a => a.Code == item.Item);
                if (_mcbs == null)
                {
                    _mcbs              = new S_C_CBS();
                    _mcbs.Name         = item.ItemName;
                    _mcbs.Code         = item.Item;
                    _mcbs.NodeType     = CBSNodeType.CBS.ToString();
                    _mcbs.CBSType      = CBSType.LabourExpense.ToString();
                    _mcbs.SortIndex    = item.SortIndex;
                    _mcbs.CreateUserID = this.CreateUserID;
                    _mcbs.CreateUser   = this.CreateUser;
                    manageCBS.AddChild(_mcbs);
                }
                else
                {
                    _mcbs.ModifyUserID = this.CreateUserID;
                    _mcbs.ModifyUser   = this.CreateUser;
                    _mcbs.ModifyDate   = DateTime.Now;
                }
                _mcbs.Quantity   = item.ManageWorkload ?? 0;
                _mcbs.TotalPrice = _mcbs.Quantity.Value * _mcbs.UnitPrice.Value;
            }
            manageCBS.SummayQuantity();
            #endregion

            var ProjectTaskWorkList = new List <S_W_TaskWork>();
            var DetailTaskWorkList  = this.T_SC_ElectricalPowerProjectScheme_TaskWorkList.ToList();
            #region  除卷册
            if (!string.IsNullOrEmpty(this.TaskWorkList))
            {
                var selectids = DetailTaskWorkList.Select(a => a.TaskWorkID).ToList();
                ProjectTaskWorkList = projectEntities.Set <S_W_TaskWork>().Where(a => a.ProjectInfoID == projectInfo.ID).ToList();
                var deleteList = ProjectTaskWorkList.Where(a => !selectids.Contains(a.ID)).ToList();
                foreach (var item in deleteList)
                {
                    item.Delete();
                    ProjectTaskWorkList.Remove(item);
                }
            }
            #endregion

            #region 回写专业信息,专业工时CBS
            //移除未选中的专业
            var removeMajorList = projectInfo.S_W_WBS.Where(d => d.WBSType == WBSNodeType.Major.ToString() &&
                                                            !selectMajorList.Contains(d.WBSValue)).ToList();
            foreach (var item in removeMajorList)
            {
                item.Delete();
            }

            #region 专业工时

            categoryType = CBSCategoryType.Product.ToString();
            var productCBS = cbsRoot.Children.FirstOrDefault(d => d.NodeType == nodeType && d.Code == categoryType);
            if (productCBS == null)
            {
                productCBS              = new S_C_CBS();
                productCBS.Name         = enums.EnumItem.FirstOrDefault(a => a.Code == categoryType).Name;
                productCBS.Code         = categoryType;
                productCBS.NodeType     = nodeType;
                productCBS.CBSType      = CBSType.LabourExpense.ToString();
                productCBS.SortIndex    = 2;
                productCBS.CreateUserID = this.CreateUserID;
                productCBS.CreateUser   = this.CreateUser;
                cbsRoot.AddChild(productCBS);
            }
            //删除不存在的
            var removeMajorWorkloadList = productCBS.Children.Where(d => !selectMajorList.Contains(d.Code)).ToList();
            foreach (var item in removeMajorWorkloadList)
            {
                item.Delete();
            }
            #endregion

            var roleDefineList = BaseConfigFO.GetRoleDefineList();
            var majorAttrList  = BaseConfigFO.GetWBSAttrList(WBSNodeType.Major);
            if (!string.IsNullOrEmpty(this.MajorList))
            {
                var majorNodes = JsonHelper.ToList(this.MajorList);
                foreach (var item in majorNodes)
                {
                    var majorCode = item.GetValue("MajorCode");
                    var majorName = item.GetValue("MajorName");
                    var attr      = majorAttrList.FirstOrDefault(d => d.Code == majorCode);
                    if (attr == null)
                    {
                        throw new Formula.Exceptions.BusinessException("未定义专业【" + majorCode + "】" + majorName + ",操作失败");
                    }
                    var major = projectInfo.S_W_WBS.FirstOrDefault(d => d.WBSValue == majorCode && d.WBSType == WBSNodeType.Major.ToString());
                    if (major == null)
                    {
                        major           = new S_W_WBS();
                        major.Name      = attr.Name;
                        major.Code      = attr.WBSCode;
                        major.WBSValue  = attr.Code;
                        major.WBSType   = WBSNodeType.Major.ToString();
                        major.SortIndex = attr.SortIndex;
                        projectInfo.WBSRoot.AddChild(major);
                    }
                    //if (!string.IsNullOrEmpty(item.MajorPrinciple))
                    //    major.SetUsers(ProjectRole.MajorPrinciple.ToString(), item.MajorPrinciple.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.MajorEngineer))
                    //    major.SetUsers(ProjectRole.MajorEngineer.ToString(), item.MajorEngineer.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Designer))
                    //    major.SetUsers(ProjectRole.Designer.ToString(), item.Designer.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Collactor))
                    //    major.SetUsers(ProjectRole.Collactor.ToString(), item.Collactor.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Auditor))
                    //    major.SetUsers(ProjectRole.Auditor.ToString(), item.Auditor.Split(','), true, true, true, true);
                    //if (!string.IsNullOrEmpty(item.Approver))
                    //    major.SetUsers(ProjectRole.Approver.ToString(), item.Approver.Split(','), true, true, true, true);
                    var roleList = roleDefineList.Where(a => item.ContainsKey(a.RoleCode) && !string.IsNullOrEmpty(item.GetValue(a.RoleCode)));
                    foreach (var roleDef in roleList)
                    {
                        major.SetUsers(roleDef.RoleCode, item.GetValue(roleDef.RoleCode).Split(','), true, true, true, true);
                    }

                    #region 卷册
                    if (!string.IsNullOrEmpty(this.TaskWorkList))
                    {
                        var list = DetailTaskWorkList.Where(a => a.Major == major.WBSValue).ToList();
                        foreach (var detail in list)
                        {
                            var task = ProjectTaskWorkList.FirstOrDefault(a => a.ID == detail.TaskWorkID);
                            if (task == null)
                            {
                                task       = new S_W_TaskWork();
                                task.State = TaskWorkState.Plan.ToString();
                            }
                            task.Name       = detail.Name;
                            task.Code       = detail.Code;
                            task.MajorValue = detail.Major;
                            task.PhaseValue = detail.Phase;
                            if (string.IsNullOrEmpty(task.ID))
                            {
                                task.ID = detail.TaskWorkID;
                                //根据专业同步人员
                                task.FillWBSUser(major);
                                major.AddTaskWork(task);
                            }
                            else
                            {
                                task.Save();
                            }
                            task.DossierCode       = detail.DossierCode;
                            task.DossierName       = detail.DossierName;
                            task.S_W_WBS.PhaseCode = task.PhaseValue;
                            //修改成果的阶段、专业、卷号
                            foreach (var product in task.S_W_WBS.S_E_Product.ToList())
                            {
                                product.PhaseValue  = task.PhaseValue;
                                product.MajorValue  = task.MajorValue;
                                product.MonomerCode = task.DossierCode;
                                product.MonomerInfo = task.DossierName;
                                product.PackageCode = task.Code;
                                product.PackageName = task.Name;
                            }
                            if (task.Version == null)
                            {
                                task.Version = 1;
                            }
                        }
                    }
                    #endregion

                    #region 专业工时CBS数据
                    var _mcbs = productCBS.Children.FirstOrDefault(a => a.Code == majorCode);
                    if (_mcbs == null)
                    {
                        _mcbs           = new S_C_CBS();
                        _mcbs.Name      = majorName;
                        _mcbs.Code      = majorCode;
                        _mcbs.NodeType  = CBSNodeType.Major.ToString();
                        _mcbs.CBSType   = CBSType.LabourExpense.ToString();
                        _mcbs.SortIndex = 0;
                        if (!string.IsNullOrEmpty(item.GetValue("SortIndex")))
                        {
                            _mcbs.SortIndex = Convert.ToDouble(item.GetValue("SortIndex"));
                        }
                        _mcbs.CreateUserID = this.CreateUserID;
                        _mcbs.CreateUser   = this.CreateUser;
                        productCBS.AddChild(_mcbs);
                    }
                    else
                    {
                        _mcbs.ModifyUserID = this.CreateUserID;
                        _mcbs.ModifyUser   = this.CreateUser;
                        _mcbs.ModifyDate   = DateTime.Now;
                    }
                    _mcbs.Quantity = 0;
                    if (!string.IsNullOrEmpty(item.GetValue("MajorWorkload")))
                    {
                        _mcbs.Quantity = Convert.ToDecimal(item.GetValue("MajorWorkload"));
                    }
                    _mcbs.TotalPrice = _mcbs.Quantity.Value * _mcbs.UnitPrice.Value;

                    #endregion
                }
            }

            productCBS.SummayQuantity();

            var wbsMajorList = projectInfo.S_W_WBS.Where(d => d.WBSType == WBSNodeType.Major.ToString()).
                               Select(d => new { Name = d.Name, Value = d.WBSValue, SortIndex = d.SortIndex }).OrderBy(c => c.SortIndex).ToList();
            projectInfo.Major = JsonHelper.ToJson(wbsMajorList);
            var wonomerList = projectInfo.WBSRoot.S_W_Monomer.ToList();
            var userInfo    = FormulaHelper.GetUserInfo();
            if (wonomerList.Count == 0)
            {
                var wonomer = new S_W_Monomer();
                wonomer.ID              = FormulaHelper.CreateGuid();
                wonomer.Name            = projectInfo.Name;
                wonomer.ProjectInfoID   = this.ProjectInfoID;
                wonomer.Code            = "";
                wonomer.CreateDate      = DateTime.Now;
                wonomer.CreateUser      = userInfo.UserName;
                wonomer.CreateUserID    = userInfo.UserID;
                wonomer.SchemeFormSubID = this.ID;
                projectInfo.WBSRoot.S_W_Monomer.Add(wonomer);
            }
            #endregion

            var detailMileStoneList = this.T_SC_ElectricalPowerProjectScheme_MileStoneList.ToList();
            #region  除里程碑
            var selectCodes         = detailMileStoneList.Select(a => a.Code).ToList();
            var deleteMileStoneList = projectInfo.S_P_MileStone.Where(a => !selectCodes.Contains(a.Code)).ToList();
            foreach (var item in deleteMileStoneList)
            {
                item.Delete();
            }
            #endregion
            #region 更新进度计划
            for (int i = 0; i < detailMileStoneList.Count; i++)
            {
                var item      = detailMileStoneList.ToList()[i];
                var mileStone = projectEntities.S_P_MileStone.FirstOrDefault(d => d.Code == item.Code && d.WBSID == projectInfo.WBSRoot.ID &&
                                                                             d.ProjectInfoID == this.ProjectInfoID);
                if (mileStone == null)
                {
                    mileStone                   = new S_P_MileStone();
                    mileStone.ID                = FormulaHelper.CreateGuid();
                    mileStone.Name              = item.Name;
                    mileStone.Code              = item.Code;
                    mileStone.MileStoneValue    = item.Code;
                    mileStone.WBSID             = projectInfo.WBSRoot.ID;
                    mileStone.ProjectInfoID     = projectInfo.ID;
                    mileStone.OrlPlanFinishDate = item.PlanEndDate;
                    mileStone.S_I_ProjectInfo   = projectInfo;
                }
                if (mileStone.State == ProjectCommoneState.Finish.ToString())
                {
                    continue;
                }
                mileStone.PlanFinishDate = item.PlanEndDate;
                mileStone.Weight         = item.Weight;
                mileStone.MajorValue     = item.Major;
                mileStone.TemplateID     = item.TemplateID;
                mileStone.MileStoneType  = item.MileStoneType;
                mileStone.Name           = item.Name;
                if (projectInfo.ProjectMode.ExtentionObject.GetValue("Ext_MsDataIsFromLastVertion") == TrueOrFalse.True.ToString())
                {
                    mileStone.SortIndex = Convert.ToInt32(item.SortIndex.HasValue ? Convert.ToDecimal(item.SortIndex) * 100 : i);
                }
                else
                {
                    var template = projectInfo.ProjectMode.S_T_MileStone.FirstOrDefault(d => d.ID == item.TemplateID);
                    if (template != null)
                    {
                        mileStone.SortIndex = template.SortIndex;
                    }
                    if (!mileStone.SortIndex.HasValue)
                    {
                        mileStone.SortIndex = item.SortIndex.HasValue ? Convert.ToInt32(item.SortIndex) : i;
                    }
                }
                mileStone.Description = item.Remark;
                mileStone.Save();
                if (mileStone.MileStoneType == MileStoneType.Cooperation.ToString())
                {
                    mileStone.OutMajorValue = item.InMajor;
                    var cooperationPlan = projectEntities.S_P_CooperationPlan.FirstOrDefault(d => d.SchemeWBSID == projectInfo.WBSRoot.ID &&
                                                                                             d.CooperationValue == mileStone.MileStoneValue);
                    if (cooperationPlan == null)
                    {
                        cooperationPlan = new S_P_CooperationPlan();
                        cooperationPlan.InMajorValue       = item.InMajor;
                        cooperationPlan.OutMajorValue      = item.OutMajor;
                        cooperationPlan.MileStoneID        = mileStone.ID;
                        cooperationPlan.ID                 = FormulaHelper.CreateGuid();
                        cooperationPlan.CooperationContent = mileStone.Name;
                        cooperationPlan.CooperationValue   = mileStone.MileStoneValue;
                        cooperationPlan.OrPlanFinishDate   = item.PlanEndDate;
                        cooperationPlan.PlanFinishDate     = item.PlanEndDate;
                    }
                    if (!cooperationPlan.OrPlanFinishDate.HasValue)
                    {
                        cooperationPlan.OrPlanFinishDate = item.PlanEndDate;
                    }
                    cooperationPlan.PlanFinishDate = item.PlanEndDate;
                    if (projectInfo.WBSRoot != null)
                    {
                        projectInfo.WBSRoot.SaveCooperationPlan(cooperationPlan);
                    }
                }
            }
            #endregion

            //根据RBS更新OBS
            projectInfo.ResetOBSUserFromRBS();
            projectInfo.State = ProjectCommoneState.Execute.ToString();
        }
Exemplo n.º 7
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_MixProjectScheme_SubProjectList.ToList().Count == 0)
            {
                SynchMajorWBSNode(roleDefineList, rootWBS, "");
                subwbses.RemoveWhere(a => a.WBSType == WBSNodeType.Major.ToString());
            }

            foreach (var subProject in this.T_SC_MixProjectScheme_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());  //删除多余的子项
        }
        protected override void AfterGetData(DataTable dt, bool isNew, string upperVersionID)
        {
            if (isNew)
            {
                var projectInfoID = dt.Rows[0]["ProjectInfoID"].ToString();
                var sql           = string.Format("select * from S_W_WBS with(nolock) where ProjectInfoID = '{0}'", projectInfoID);
                var wbsDT         = this.ProjectSQLDB.ExecuteDataTable(sql);
                sql = string.Format("select * from S_W_RBS where ProjectInfoID = '{0}'", projectInfoID);
                var rbsDT            = this.ProjectSQLDB.ExecuteDataTable(sql);
                var schemeSubProject = JsonHelper.ToList(dt.Rows[0]["SubProjectList"].ToString());
                var schemeMajorList  = JsonHelper.ToList(dt.Rows[0]["MajorList"].ToString());
                var roleCodes        = BaseConfigFO.GetRoleDefineList().Select(a => a.RoleCode).ToArray();
                if (schemeMajorList.Count() > 0)
                {
                    var attendRoles = schemeMajorList[0].Keys.Where(a => roleCodes.Contains(a)).ToArray();
                    foreach (var subProject in schemeSubProject)
                    {
                        var subProjectWBSID = subProject.GetValue("SubProjectWBSID");
                        //如果没有子项WBSID,则说明异构结构中,专业直接挂在了阶段节点下
                        if (String.IsNullOrEmpty(subProjectWBSID))
                        {
                            subProjectWBSID = subProject.GetValue("PhaseWBSID");
                        }
                        if (string.IsNullOrEmpty(subProject.GetValue("RBSJson")))
                        {
                            #region 没有RBSJson
                            //没有RBSJson,说明所有专业都参与
                            //没有RBSJson,需要判断是否修改过专业人员
                            var schemeToWrite = new List <Dictionary <string, object> >();
                            var flag          = false;
                            for (int i = 0; i < schemeMajorList.Count(); i++)
                            {
                                var schemeMajor = schemeMajorList[i];
                                var rbsToWrite  = new Dictionary <string, object>();
                                rbsToWrite.SetValue("SortIndex", i);
                                rbsToWrite.SetValue("MajorName", schemeMajor.GetValue("MajorName"));
                                rbsToWrite.SetValue("MajorCode", schemeMajor.GetValue("MajorCode"));
                                rbsToWrite.SetValue("Valid", "1");
                                rbsToWrite.SetValue("IsChange", false);

                                var majorWBS = wbsDT.AsEnumerable().Where(a => a["ParentID"].ToString() == subProjectWBSID &&
                                                                          a["Code"].ToString() == schemeMajor.GetValue("MajorCode")).ToArray();
                                if (majorWBS.Length == 0)
                                {
                                    continue;
                                }
                                foreach (var aRole in attendRoles)
                                {
                                    var rbsList = rbsDT.AsEnumerable().Where(a => a["WBSID"].ToString() == majorWBS[0]["ID"].ToString() &&
                                                                             a["RoleCode"].ToString() == aRole).ToArray();
                                    var userIDs   = rbsList.Select(a => a["UserID"].ToString()).ToArray();
                                    var userNames = rbsList.Select(a => a["UserName"].ToString()).ToArray();
                                    rbsToWrite.SetValue(aRole, string.Join(",", userIDs));
                                    rbsToWrite.SetValue(aRole + "Name", string.Join(",", userNames));
                                    //判断aRole角色在rbs中和策划的专业人员是否相同
                                    var isSame         = true;
                                    var schemeMajorRBS = schemeMajor.GetValue(aRole).Split(',');
                                    if (userIDs.Length == schemeMajorRBS.Length)
                                    {
                                        var q = (from a in userIDs join b in schemeMajorRBS on a equals b select a).ToArray();
                                        if (q.Length != userIDs.Length)
                                        {
                                            isSame = false;
                                        }
                                    }
                                    //schemeMajor.GetValue(aRole)会产生空字符串
                                    else if (!(userIDs.Length == 0 && schemeMajor.GetValue(aRole) == ""))
                                    {
                                        isSame = false;
                                    }
                                    if (!isSame)
                                    {
                                        flag = true;
                                        rbsToWrite.SetValue("IsChange", true);
                                    }
                                }
                                schemeToWrite.Add(rbsToWrite);
                            }
                            if (flag)
                            {
                                subProject.SetValue("RBSJson", JsonHelper.ToJson(schemeToWrite));
                            }
                            #endregion
                        }
                        else
                        {
                            #region  RBSJson
                            //有RBSJson,替换人员
                            var schemeRBS = JsonHelper.ToList(subProject.GetValue("RBSJson"));
                            var tmpRBS    = JsonHelper.ToList(JsonHelper.ToJson(schemeRBS));
                            for (int i = 0; i < schemeRBS.Count(); i++)
                            {
                                var sRBS = schemeRBS[i];
                                if (sRBS.GetValue("Valid") == "1")
                                {
                                    var majorWBS = wbsDT.AsEnumerable().Where(a => a["ParentID"].ToString() == subProjectWBSID &&
                                                                              a["Code"].ToString() == sRBS.GetValue("MajorCode")).ToArray();
                                    if (majorWBS.Length == 0)
                                    {
                                        continue;
                                    }
                                    var roleDefines = sRBS.Keys.Where(a => roleCodes.Contains(a));
                                    foreach (var roleDefine in roleDefines)
                                    {
                                        var rbsList = rbsDT.AsEnumerable().Where(a => a["WBSID"].ToString() == majorWBS[0]["ID"].ToString() &&
                                                                                 a["RoleCode"].ToString() == roleDefine).ToArray();
                                        var userIDs       = rbsList.Select(a => a["UserID"].ToString()).ToArray();
                                        var userNames     = rbsList.Select(a => a["UserName"].ToString()).ToArray();
                                        var schemeUserIDs = tmpRBS[i].GetValue(roleDefine).Split(',');
                                        tmpRBS[i].SetValue(roleDefine, string.Join(",", userIDs));
                                        tmpRBS[i].SetValue(roleDefine + "Name", string.Join(",", userNames));
                                        var isSame = true;
                                        if (userIDs.Length == schemeUserIDs.Length)
                                        {
                                            var q = (from a in userIDs join b in schemeUserIDs on a equals b select a).ToArray();
                                            if (q.Length != userIDs.Length)
                                            {
                                                isSame = false;
                                            }
                                        }
                                        //schemeMajor.GetValue(aRole)会产生空字符串
                                        else if (!(userIDs.Length == 0 && tmpRBS[i].GetValue(roleDefine) == ""))
                                        {
                                            isSame = false;
                                        }
                                        if (!isSame)
                                        {
                                            tmpRBS[i].SetValue("IsChange", true);
                                        }
                                    }
                                }
                            }
                            subProject.SetValue("RBSJson", JsonHelper.ToJson(tmpRBS));
                            #endregion
                        }
                    }
                    dt.Rows[0]["SubProjectList"] = JsonHelper.ToJson(schemeSubProject);
                }
            }
        }
Exemplo n.º 9
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);
        }