From 38805bc66934a7424a416944a8844fef5e5915e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=A3=95=E8=B4=A2?= Date: Sun, 15 Jan 2023 05:09:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/routes_xm.js | 56 +- src/store/getters.js | 2 + src/store/index.js | 4 + src/store/modules/productInfo.js | 17 + src/store/modules/projectInfo.js | 29 + src/views/xm/core/xmMenu/XmMenuMng.vue | 34 +- .../xmProduct/XmProductForLinkComplex.vue | 18 +- src/views/xm/core/xmProject/XmProjectMng.vue | 7 +- .../xmProject/XmProjectOverviewComplex.vue | 218 +++++- src/views/xm/core/xmProject/top-nav.vue | 620 ++---------------- 10 files changed, 379 insertions(+), 626 deletions(-) create mode 100644 src/store/modules/productInfo.js create mode 100644 src/store/modules/projectInfo.js diff --git a/src/router/routes_xm.js b/src/router/routes_xm.js index 47f2a426..249995d5 100644 --- a/src/router/routes_xm.js +++ b/src/router/routes_xm.js @@ -1,5 +1,6 @@ /* Layout */ import Layout from '../views/layout/Layout' +import XmProjectLayout from '../views/xm/core/xmProject/index' const _import = require('./_import_' + process.env.NODE_ENV) export default { @@ -14,7 +15,7 @@ export default { icon: 'project' }, // leaf: true,//只有一个节点 - children: [ + children: [ { path: 'xmProject/XmProjectAllMng', component: _import('xm/core/xmProject/XmProjectAllMng'), name: 'xmProjectAllMng', meta: { title: '项目总览',roles:["user"] }}, { path: 'xmProject/XmProjectMng', component: _import('xm/core/xmProject/XmProjectMng'), name: 'xmProjectMng', meta: { title: '项目(我的)',roles:["user"] }}, { path: 'xmProject/XmProjectRecycle', component: _import('xm/core/xmProject/XmProjectRecycle'), name: 'XmProjectRecycle', meta: { title: '项目回收站',roles:["user"] }}, @@ -25,18 +26,53 @@ export default { { path: 'xmTask/XmMyTaskCenter', component: _import('xm/core/xmTask/XmMyTaskCenter'), name: 'xmMyTaskCenter', meta: { title: '任务(我的)',roles:["user"] }}, { path: 'xmTask/XmTaskDetailRoute', component: _import('xm/core/xmTask/XmTaskDetailRoute'), name: 'XmTaskDetailRoute', meta: { title: '任务详情',roles:["user"] },hidden:true}, + ] - }, - { - path: '/xm/core/xmProject/XmProjectInfoRoute', - component: _import('xm/core/xmProject/XmProjectInfoRoute'), - name: 'XmProjectInfoRoute', + },{ + path: '/xm/core/project', + component: XmProjectLayout, + name: '项目管理', iconCls: 'fa el-icon-menu', meta: { - title: '项目管理-路由跳转', - icon: 'project',roles:["user"] - }, - hidden:true + title: '项目管理', + icon: 'project' + }, + // leaf: true,//只有一个节点 + children: [ + { + path: 'overviewComplex', + component: _import('xm/core/xmProject/XmProjectOverviewComplex'), + name: 'projectOverviewComplex', + iconCls: 'fa el-icon-menu', + meta: { + title: '项目-首页', + icon: 'project',roles:["user"] + }, + hidden:true + }, + { + path: 'productLink', + component: _import('xm/core/xmProduct/XmProductForLinkComplex'), + name: 'projectProductLink', + iconCls: 'fa el-icon-menu', + meta: { + title: '项目-产品', + icon: 'project',roles:["user"] + }, + hidden:true + }, + { + path: 'menu', + component: _import('xm/core/xmMenu/XmMenuMng'), + name: 'projectMenu', + iconCls: 'fa el-icon-menu', + meta: { + title: '项目-需求', + icon: 'project',roles:["user"] + }, + hidden:true + }, + ] }, { path: '/xm/core/testCasedbRoute', component: _import('xm/core/xmTestCasedb/XmTestCasedbRoute'), name: 'XmTestCasedbRoute', meta: { title: '测试库管理',roles:["user"] },hidden:true}, diff --git a/src/store/getters.js b/src/store/getters.js index e6378f16..236ea338 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -21,5 +21,7 @@ const getters = { added: state => state.permission.added, isLoadOk:state=>state.user.isLoadOk, noticeMsg:state=>state.noticeMsg.noticeMsg, + projectInfo:state=>state.projectInfo.projectInfo, + productInfo:state=>state.productInfo.productInfo, } export default getters diff --git a/src/store/index.js b/src/store/index.js index 582f7b79..1f025d7f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -6,6 +6,8 @@ import permission from './modules/permission' import tagsView from './modules/tagsView' import user from './modules/user' import noticeMsg from './modules/noticeMsg' +import projectInfo from './modules/projectInfo' +import productInfo from './modules/productInfo' import getters from './getters' Vue.use(Vuex) @@ -18,6 +20,8 @@ const store = new Vuex.Store({ tagsView, user, noticeMsg, + projectInfo, + productInfo }, getters }) diff --git a/src/store/modules/productInfo.js b/src/store/modules/productInfo.js new file mode 100644 index 00000000..3958162c --- /dev/null +++ b/src/store/modules/productInfo.js @@ -0,0 +1,17 @@ +const productInfo = { + state: { + productInfo: {} + }, + mutations: { + SET_PRODUCT: (state, productInfo) => { + state.productInfo=productInfo + } + }, + actions: { + setProduct({ commit }, productInfo) { + commit('SET_PRODUCT', productInfo) + } + } +} + +export default productInfo diff --git a/src/store/modules/projectInfo.js b/src/store/modules/projectInfo.js new file mode 100644 index 00000000..be28edd5 --- /dev/null +++ b/src/store/modules/projectInfo.js @@ -0,0 +1,29 @@ + +var key='xm-project-info'; +const projectInfo = { + state: { + projectInfo: {} + }, + mutations: { + SET_PROJECT: (state, projectInfo) => { + state.projectInfo=projectInfo + if(projectInfo && projectInfo!='null' && projectInfo!='undefined' ){ + sessionStorage.setItem(key,JSON.stringify(projectInfo)) + }else{ + sessionStorage.removeItem(key) + } + + } + }, + actions: { + setProject({ commit }, projectInfo) { + commit('SET_PROJECT', projectInfo) + } + } +} +var projectStr=sessionStorage.getItem(key) +if(projectStr && projectStr!='null' && projectStr!='undefined' ){ + projectInfo.state.projectInfo=JSON.parse(projectStr) +} + +export default projectInfo diff --git a/src/views/xm/core/xmMenu/XmMenuMng.vue b/src/views/xm/core/xmMenu/XmMenuMng.vue index 166ccf6b..3d42d322 100644 --- a/src/views/xm/core/xmMenu/XmMenuMng.vue +++ b/src/views/xm/core/xmMenu/XmMenuMng.vue @@ -3,7 +3,7 @@ - + @@ -59,7 +59,7 @@ 迭代: - + @@ -86,8 +86,8 @@ - - + + @@ -355,7 +355,7 @@ - + @@ -370,7 +370,7 @@ - + @@ -381,14 +381,14 @@ :visible.sync="taskMngVisible" :with-header="false" size="80%"> - + - + { @@ -745,7 +745,7 @@ this.load.list = false; } this.load.list = true; - if(!this.selProject){ + if(!this.projectInfo){ listXmMenuWithState(params).then( callback ).catch( err => this.load.list = false ); }else{ listXmMenuWithPlan(params).then( callback ).catch( err => this.load.list = false ); diff --git a/src/views/xm/core/xmProduct/XmProductForLinkComplex.vue b/src/views/xm/core/xmProduct/XmProductForLinkComplex.vue index 58febdef..3c16999d 100644 --- a/src/views/xm/core/xmProduct/XmProductForLinkComplex.vue +++ b/src/views/xm/core/xmProduct/XmProductForLinkComplex.vue @@ -6,7 +6,7 @@ @@ -177,7 +177,7 @@ label="配置关联的项目" lazy name="productProjectLink" - v-if="xmProduct && xmProduct.id && !selProject" + v-if="xmProduct && xmProduct.id && !projectInfo" > @@ -220,7 +220,7 @@ ptype="0" :xm-product="xmProduct" :xm-iteration="xmIteration" - :sel-project="selProject" + :sel-project="projectInfo" > @@ -316,7 +316,7 @@ import XmProductAdd from "./XmProductEdit"; //新增界面 export default { computed: { - ...mapGetters(["userInfo", "roles"]), + ...mapGetters(["userInfo", "roles","projectInfo"]), calcProductPstatusStep() { if (this.dicts["xmProductPstatus"] && this.xmProduct) { @@ -333,7 +333,7 @@ export default { } }, }, - props: ["visible", "selProject", "xmIteration"], + props: ["visible", "xmIteration"], watch: { visible: function (visible) { if (visible == true) { diff --git a/src/views/xm/core/xmProject/XmProjectMng.vue b/src/views/xm/core/xmProject/XmProjectMng.vue index c32065d9..ba969a2d 100644 --- a/src/views/xm/core/xmProject/XmProjectMng.vue +++ b/src/views/xm/core/xmProject/XmProjectMng.vue @@ -367,6 +367,8 @@ import XmProjectTplMng from './XmProjectTplMng'; import XmProductSelect from '@/views/xm/core/components/XmProductSelect'; import MdpSelectUserXm from "@/views/xm/core/components/MdpSelectUserXm/index"; + + import store from '@/store' if(!Vue.component("xm-project-info")){ @@ -662,7 +664,10 @@ //进入info界面 intoInfo(row) { this.selectProject = row; - this.$router.push({ name:'XmProjectInfoRoute', query: {id:row.id} }) + store.dispatch("setProject",row).then(res=>{ + this.$router.push({ name:'projectOverviewComplex', query: {id:row.id} }) + }) + localStorage.setItem("xm-project-info-route",JSON.stringify(row)) //this.showInfo = true; }, diff --git a/src/views/xm/core/xmProject/XmProjectOverviewComplex.vue b/src/views/xm/core/xmProject/XmProjectOverviewComplex.vue index 66fc7523..1757d930 100644 --- a/src/views/xm/core/xmProject/XmProjectOverviewComplex.vue +++ b/src/views/xm/core/xmProject/XmProjectOverviewComplex.vue @@ -1,5 +1,120 @@ @@ -58,20 +175,34 @@ import ProcinstMng from '@/views//mdp/workflow/hi/procinst/ProcinstMng'; import { loadTasksToXmProjectState , loadTasksSettleToXmProjectState} from '@/api/xm/core/xmProjectState'; import { listXmProject} from '@/api/xm/core/xmProject'; +import { initDicts,getDefOptions,editXmProjectSomeFields } from "@/api/xm/core/xmProject"; export default { components: { XmProjectOverview, XmProjectDetail, XmProductProjectLinkMng ,TaskMng,ProcinstMng}, computed: { - ...mapGetters(["userInfo"]), - }, - - props:['selProject'], + ...mapGetters(["userInfo","projectInfo"]), + calcProjectStatusStep() { + if (this.dicts["projectStatus"] && this.projectInfo) { + var index = this.dicts["projectStatus"].findIndex((i) => { + if (i.id == this.projectInfo.status) { + return true; + } else { + return false; + } + }); + return index + 1; + } else { + return 0; + } + }, + }, watch:{ }, data() { return { showPanelName:'overview', - + maxTableHeight:500, + dicts: getDefOptions(), load:{calcProject:false,calcSettle:false} }; }, @@ -85,23 +216,23 @@ export default { }, loadTasksToXmProjectState(){ - var row=this.selProject; + var row=this.projectInfo; var params={projectId:row.id} loadTasksToXmProjectState(params).then((res) => { this.load.calcProject=false; var tips=res.data.tips; - listXmProject({id:this.selProject.id}).then(res=>{ + listXmProject({id:this.projectInfo.id}).then(res=>{ var tips = res.data.tips; if(tips.isOk){ - var selProject=res.data.data[0] - this.onEditFields(selProject) + var projectInfo=res.data.data[0] + this.onEditFields(projectInfo) } }) this.$notify({position:'bottom-left',showClose:true,message: tips.msg, type: tips.isOk?'success':'error'}); }).catch( err => this.load.calcProject=false ); }, loadTasksSettleToXmProjectState(){ - var row=this.selProject; + var row=this.projectInfo; var params={projectId:row.id} loadTasksSettleToXmProjectState(params).then((res) => { this.load.calcProject=false; @@ -112,22 +243,67 @@ export default { afterFlowSubmit(){ - listXmProject({id:this.selProject.id}).then(res=>{ + listXmProject({id:this.projectInfo.id}).then(res=>{ var tips = res.data.tips; if(tips.isOk){ - var selProject=res.data.data[0] - this.afterEditSubmit(selProject) + var projectInfo=res.data.data[0] + this.afterEditSubmit(projectInfo) } }) }, onEditFields(row){ - Object.assign(this.selProject,row) + Object.assign(this.projectInfo,row) this.$emit("edit-fields",row); - } + }, + goBack() { + localStorage.setItem("project-infotype", "项目概览"); + this.$router.back(-1); + }, + goHome(){ + localStorage.setItem("project-infotype", "项目概览"); + this.$router.push({path:'/'}) + }, + + showCurrFlow(){ + this.showPanelName='currFlow' + }, + showHisFlow(){ + this.showPanelName='hisFlow' + }, + showDetail(){ + this.showPanelName='detail' + }, + showProjectGaiSuan(){ + this.showPanelName='detail' + this.$nextTick(()=>{ + this.$refs['detail'].$refs['projectEdit'].currTabPane='4' + }) + }, + showProjectShouYi(){ + this.showPanelName='detail' + this.$nextTick(()=>{ + this.$refs['detail'].$refs['projectEdit'].currTabPane='5' + }) + + }, + showMenusPage(){ + this.infotype='需求' + }, + linkProduct(){ + this.showPanelName='productProjectLink' + }, + createProduct(){ + this.infotype='产品' + this.$nextTick(()=>{ + this.$refs['xmProductComplex'].addProductVisible=true + }) + } }, mounted() { + + this.maxTableHeight = util.calcTableMaxHeight(this.$refs.pageBody.$el); this.$nextTick(() => { }); }, diff --git a/src/views/xm/core/xmProject/top-nav.vue b/src/views/xm/core/xmProject/top-nav.vue index 7be1364f..4a5f862e 100644 --- a/src/views/xm/core/xmProject/top-nav.vue +++ b/src/views/xm/core/xmProject/top-nav.vue @@ -9,22 +9,23 @@ background-color="rgb(48, 65, 86)" text-color="rgb(191, 203, 217)" active-text-color="#409eff" + :router="true" > - + -   项目: {{ selProject.name.substring(0, 15) }}  项目: {{ projectInfo.name.substring(0, 15) }}   项目: {{ selProject.name }}  项目: {{ projectInfo.name }} @@ -32,20 +33,20 @@ slot="title" style="color: #ffd04b" class="hidden-md-and-up" - :title="selProject.name" + :title="projectInfo.name" > -   项目: {{ selProject.name.substring(0, 15) }}  项目: {{ projectInfo.name.substring(0, 15) }}   项目: {{ selProject.name }}  项目: {{ projectInfo.name }} - + 产品 - + 需求 @@ -147,124 +148,12 @@ - - -

常用功能快捷导航

- - - - - - 创建产品 - 关联产品 - 环境清单 - 进入售前 - - - 关联产品 - 环境清单 - - - - - 需求管理 - 设为立项中 - - - 需求管理 - - - - - 签订合同 - 创建团队 - 创建计划 - 预算清单 - 项目估算 - 项目收益 - 设为立项中 - - - 合同管理 - 团队管理 - 计划管理 - 预算管理 - 项目估算 - 项目收益 - - - - - 迭代管理 - 任务管理 - 缺陷管理 - 每日工时 - 每月工时 - 费用管理 - 效能分析 - 暂停项目 - 变更申请 - 设为结项中 - - - 迭代管理 - 任务管理 - 缺陷管理 - 每日工时 - 每月工时 - 费用管理 - 效能分析 - 结项申请 - 变更申请 - - - - - 重新激活 - - - - - 结项申请 - 结项审批 - - - 结项审批 - - - - - 转入售后 - - - - - - - 设为已完成 - - - - - 关闭项目 - - - - - - - - - -
+ + > - +
+ --> -