Browse Source

优化

master
陈裕财 3 years ago
parent
commit
38805bc669
  1. 56
      src/router/routes_xm.js
  2. 2
      src/store/getters.js
  3. 4
      src/store/index.js
  4. 17
      src/store/modules/productInfo.js
  5. 29
      src/store/modules/projectInfo.js
  6. 34
      src/views/xm/core/xmMenu/XmMenuMng.vue
  7. 18
      src/views/xm/core/xmProduct/XmProductForLinkComplex.vue
  8. 7
      src/views/xm/core/xmProject/XmProjectMng.vue
  9. 218
      src/views/xm/core/xmProject/XmProjectOverviewComplex.vue
  10. 620
      src/views/xm/core/xmProject/top-nav.vue

56
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},

2
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

4
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
})

17
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

29
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

34
src/views/xm/core/xmMenu/XmMenuMng.vue

@ -3,7 +3,7 @@
<el-row class="padding-left padding-right">
<el-col :span="24">
<el-row>
<xm-product-select ref="xmProductSelect1" style="display:inline;" v-if="!xmProduct && !xmIteration" :auto-select="false" :link-project-id="selProject?selProject.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClearSelect"></xm-product-select>
<xm-product-select ref="xmProductSelect1" style="display:inline;" v-if="!xmProduct && !xmIteration" :auto-select="false" :link-project-id="projectInfo?projectInfo.id:null" @row-click="onProductSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProductClearSelect"></xm-product-select>
<el-select v-model="filters.priority" placeholder="优先级" clearable style="width: 100px;">
<el-option v-for="i in dicts.priority" :label="i.name" :key="i.id" :value="i.id"></el-option>
@ -59,7 +59,7 @@
<font class="more-label-font">
迭代:
</font>
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" style="display:inline;" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="selProject?selProject.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClearSelect">
<xm-iteration-select v-if="!xmIteration || !xmIteration.id" style="display:inline;" :auto-select="false" :product-id="filters.product?filters.product.id:null" :link-project-id="projectInfo?projectInfo.id:null" placeholder="迭代" @row-click="onIterationSelected" @clear="onIterationClearSelect">
</xm-iteration-select>
</el-row>
<el-row>
@ -86,8 +86,8 @@
<el-select v-model="filters.taskFilterType" placeholder="已分配任务的需求?" clearable style="width: 200px;">
<el-option value="not-join-any-project" label="未分配过任务的需求"></el-option>
<el-option value="join-any-project" label="已分配过任务的需求"></el-option>
<el-option value="not-join-curr-project" :label="'未分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" :label="'已分配任务到项目【'+selProject.name+'】'" v-if="selProject && selProject.id"></el-option>
<el-option value="not-join-curr-project" :label="'未分配任务到项目【'+projectInfo.name+'】'" v-if="projectInfo && projectInfo.id"></el-option>
<el-option value="join-curr-project" :label="'已分配任务到项目【'+projectInfo.name+'】'" v-if="projectInfo && projectInfo.id"></el-option>
</el-select>
</el-row>
<el-row>
@ -355,7 +355,7 @@
</el-row>
<!--编辑 XmMenu xm_project_menu界面-->
<el-dialog title="编辑故事" :visible.sync="editFormVisible" :with-header="false" fullscreen width="90%" top="20px" append-to-body :close-on-click-modal="false" >
<xm-menu-edit :xm-menu="editForm" :sel-project="selProject" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit" @add-sub-menu="onAddSubMenu" @edit-fields="onEditSomeFields"></xm-menu-edit>
<xm-menu-edit :xm-menu="editForm" :sel-project="projectInfo" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit" @add-sub-menu="onAddSubMenu" @edit-fields="onEditSomeFields"></xm-menu-edit>
</el-dialog>
<!--新增 XmMenu xm_project_menu界面-->
@ -370,7 +370,7 @@
<xm-menu-rich-detail :visible="menuDetailVisible" :reload="false" :xm-menu="editForm" ></xm-menu-rich-detail>
</el-drawer>
<el-drawer title="选中任务" :visible.sync="selectTaskVisible" size="80%" append-to-body :close-on-click-modal="false">
<xm-task-list :xm-product="filters.product" :sel-project="selProject" query-scope="planTask" check-scope="task" :is-multi-select="true" @tasks-selected="onSelectedTasks"></xm-task-list>
<xm-task-list :xm-product="filters.product" :sel-project="projectInfo" query-scope="planTask" check-scope="task" :is-multi-select="true" @tasks-selected="onSelectedTasks"></xm-task-list>
</el-drawer>
<el-drawer title="查看任务" :visible.sync="taskListForMenuVisible" :with-header="false" size="80%" append-to-body :close-on-click-modal="false">
<xm-task-list-for-menu :xm-product="filters.product" :is-multi-select="true" :menu-id="editForm.menuId"></xm-task-list-for-menu>
@ -381,14 +381,14 @@
:visible.sync="taskMngVisible"
:with-header="false"
size="80%">
<xm-task-mng :sel-project="selProject" :menu-id="editForm.menuId" :menu-name="editForm.menuName"></xm-task-mng>
<xm-task-mng :sel-project="projectInfo" :menu-id="editForm.menuId" :menu-name="editForm.menuName"></xm-task-mng>
</el-drawer>
</el-col>
</el-row>
<tag-dialog ref="tagDialog" :tagIds="filters.tags?filters.tags.map(i=>i.tagId):[]" :jump="true" @select-confirm="onTagSelected">
</tag-dialog>
<xm-group-dialog ref="xmGroupDialog" :isSelectSingleUser="true" :sel-project="selProject" :xm-product="filters.xmProduct" @user-confirm="onGroupUserSelect">
<xm-group-dialog ref="xmGroupDialog" :isSelectSingleUser="true" :sel-project="projectInfo" :xm-product="filters.xmProduct" @user-confirm="onGroupUserSelect">
</xm-group-dialog>
<el-drawer
append-to-body
@ -440,10 +440,10 @@
import MdpSelectUserXm from "@/views/xm/core/components/MdpSelectUserXm/index";
export default {
props:['selProject','xmIteration','xmProduct','disabledMng','parentMenu','paddingTop'],
props:[ 'xmIteration','xmProduct','disabledMng','parentMenu','paddingTop'],
computed: {
...mapGetters([
'userInfo','roles'
'userInfo','roles','projectInfo'
]),
xmMenusTreeData() {
@ -460,7 +460,7 @@
this.filters.product=this.xmProduct
this.getXmMenus()
},
selProject:function(){
projectInfo:function(){
this.getXmMenus();
}
,
@ -639,15 +639,15 @@
params.taskFilterType=this.filters.taskFilterType
if(params.taskFilterType==='not-join-curr-project'){
params.projectId=this.selProject.id
params.projectId=this.projectInfo.id
}
if(params.taskFilterType==='join-curr-project'){
params.projectId=this.selProject.id
params.projectId=this.projectInfo.id
}
params.ntype="0"
}
if(this.selProject && this.selProject.id){
params.linkProjectId=this.selProject.id
if(this.projectInfo && this.projectInfo.id){
params.linkProjectId=this.projectInfo.id
}
if(this.filters.product){
params.productId=this.filters.product.id
@ -699,7 +699,7 @@
params=this.getParams(params);
this.load.list = true;
var func=listXmMenuWithState
if(this.selProject&&this.selProject.id){
if(this.projectInfo&&this.projectInfo.id){
func=listXmMenuWithPlan
}
func(params).then(res=>{
@ -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 );

18
src/views/xm/core/xmProduct/XmProductForLinkComplex.vue

@ -6,7 +6,7 @@
<xm-product-select
ref="xmProductSelect"
:auto-select="true"
:link-project-id="selProject ? selProject.id : null"
:link-project-id="projectInfo ? projectInfo.id : null"
:iterationId="xmIteration ? xmIteration.id : null"
@row-click="onProductRowClick"
@clear="onProductClearSelect"
@ -159,7 +159,7 @@
<xm-product-overview
v-if="xmProduct && showPanel == 'productOverview'"
:xm-product="xmProduct"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-product-overview>
</el-tab-pane>
@ -177,7 +177,7 @@
label="配置关联的项目"
lazy
name="productProjectLink"
v-if="xmProduct && xmProduct.id && !selProject"
v-if="xmProduct && xmProduct.id && !projectInfo"
>
<xm-product-project-link-mng
v-if="showPanel == 'productProjectLink'"
@ -204,7 +204,7 @@
v-if="xmProduct && showPanel == 'menus'"
:xm-product="xmProduct"
:xm-iteration="xmIteration"
:sel-project="selProject"
:sel-project="projectInfo"
:disabled-mng="true"
></xm-menu-mng>
</el-tab-pane>
@ -220,7 +220,7 @@
ptype="0"
:xm-product="xmProduct"
:xm-iteration="xmIteration"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-task-mng>
</el-tab-pane>
<el-tab-pane
@ -233,7 +233,7 @@
v-if="xmProduct && showPanel == 'bugs'"
:xm-product="xmProduct"
:xm-iteration="xmIteration"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-question-mng>
</el-tab-pane>
<el-tab-pane
@ -284,7 +284,7 @@
>
<xm-product-add op-type="add"
@cancel="addProductVisible = false"
:sel-project="selProject"
:sel-project="projectInfo"
@submit="afterAddProductSubmit"
></xm-product-add>
</el-dialog>
@ -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) {

7
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;
},

218
src/views/xm/core/xmProject/XmProjectOverviewComplex.vue

@ -1,5 +1,120 @@
<template>
<section class="page-container padding-left padding-right">
<el-row ref="pageBody">
<el-col :span="4" class="padding border" :style="{maxHeight:maxTableHeight+'px',overflowY:'auto'}">
<h4 class="padding-bottom">常用功能快捷导航</h4>
<el-steps :active="calcProjectStatusStep" finish-status="success" direction="vertical">
<el-step
v-for="(i, index) in dicts['projectStatus']"
:title="i.name"
:key="index"
>
<el-row slot="description">
<el-row v-if="i.id=='0'"><!--初始-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="createProduct()">创建产品</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="linkProduct()">关联产品</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='环境清单'">环境清单</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','1')">进入售前</el-button>
</span>
<span v-if="projectInfo.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="linkProduct()">关联产品</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='环境清单'">环境清单</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='1'"><!--售前-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showMenusPage">需求管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','2')">设为立项中</el-button>
</span>
<span v-if="projectInfo.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showMenusPage">需求管理</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='2'"><!--立项中-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='合同管理'">签订合同</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='团队'">创建团队</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">创建计划</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='预算'">预算清单</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectGaiSuan()">项目估算</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectShouYi()">项目收益</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','3')">设为立项中</el-button>
</span>
<span v-if="projectInfo.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='合同管理'">合同管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='团队'">团队管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">计划管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='预算'">预算管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectGaiSuan()">项目估算</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectShouYi()">项目收益</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='3'"><!--实施中-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='迭代'">迭代管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">任务管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='缺陷'">缺陷管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每日工时'">每日工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每月工时'">每月工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='费用'">费用管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='效能'">效能分析</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','4')">暂停项目</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="projectChangeRequire()">变更申请</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','5')">设为结项中</el-button>
</span>
<span v-if="projectInfo.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='迭代'">迭代管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">任务管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='缺陷'">缺陷管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每日工时'">每日工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每月工时'">每月工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='费用'">费用管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='效能'">效能分析</el-button>
<el-button v-if="projectInfo.status<i.id" class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','5')">结项申请</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showDetail()">变更申请</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='4'"><!--暂停中-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','3')">重新激活</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='5'"><!--结项中-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showDetail()">结项申请</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showCurrFlow()">结项审批</el-button>
</span>
<span v-if="projectInfo.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showHisFlow()">结项审批</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='6'"><!--已结项-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','7')">转入售后</el-button>
</span>
<span v-if="projectInfo.status!=i.id">
</span>
</el-row>
<el-row v-else-if="i.id=='7'"><!--售后-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','8')">设为已完成</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='8'"><!--已完成-->
<span v-if="projectInfo.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(projectInfo,'status','9')">关闭项目</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='9'"><!--已关闭-->
</el-row>
</el-row>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-menu mode="horizontal" :default-active="showPanelName" @select="onMenuToolBarSelect">
<el-menu-item index="overview">
<span slot="title">项目概览</span>
@ -22,10 +137,10 @@
<span slot="title">历史审批流</span>
</el-menu-item>
</el-menu>
<xm-project-overview v-if="showPanelName=='overview'" :sel-project="selProject"></xm-project-overview>
<xm-project-detail v-if="showPanelName=='detail'" :sel-project="selProject" @submit="afterEditSubmit" @edit-fields="onEditFields" ref="detail"></xm-project-detail>
<xm-product-project-link-mng v-if="showPanelName=='productProjectLink'" :sel-project="selProject"></xm-product-project-link-mng>
<xm-iteration-link-for-project v-if="showPanelName=='iterationProjectLink'" :sel-project="selProject"></xm-iteration-link-for-project>
<xm-project-overview v-if="showPanelName=='overview'" :sel-project="projectInfo"></xm-project-overview>
<xm-project-detail v-if="showPanelName=='detail'" :sel-project="projectInfo" @submit="afterEditSubmit" @edit-fields="onEditFields" ref="detail"></xm-project-detail>
<xm-product-project-link-mng v-if="showPanelName=='productProjectLink'" :sel-project="projectInfo"></xm-product-project-link-mng>
<xm-iteration-link-for-project v-if="showPanelName=='iterationProjectLink'" :sel-project="projectInfo"></xm-iteration-link-for-project>
<div v-if="showPanelName=='projectCalc'" class="padding">
<el-row>
@ -40,8 +155,10 @@
</el-row>
</div>
<task-mng v-if="showPanelName === 'currFlow' " ref="currFlow" :biz-parent-pkid="selProject.id" @submit="afterFlowSubmit"> </task-mng>
<procinst-mng v-if="showPanelName === 'hisFlow' " ref="hisFlow" isAll="true" :biz-parent-pkid="selProject.id"></procinst-mng>
<task-mng v-if="showPanelName === 'currFlow' " ref="currFlow" :biz-parent-pkid="projectInfo.id" @submit="afterFlowSubmit"> </task-mng>
<procinst-mng v-if="showPanelName === 'hisFlow' " ref="hisFlow" isAll="true" :biz-parent-pkid="projectInfo.id"></procinst-mng>
</el-col>
</el-row>
</section>
</template>
@ -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(() => {
});
},

620
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"
>
<el-menu-item index="项目概览">
<el-menu-item index="/xm/core/project/overviewComplex">
<span
slot="title"
style="font-size: 18px; color: #ffd04b"
class="hidden-sm-and-down"
:title="selProject.name"
:title="projectInfo.name"
>
<font v-if="selProject.name.length >= 15"
<font v-if="projectInfo.name.length >= 15"
><strong
>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ selProject.name.substring(0, 15) }}</strong
>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ projectInfo.name.substring(0, 15) }}</strong
></font
>
<font type="danger" v-else
><strong>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ selProject.name }}</strong></font
><strong>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ projectInfo.name }}</strong></font
>
</span>
@ -32,20 +33,20 @@
slot="title"
style="color: #ffd04b"
class="hidden-md-and-up"
:title="selProject.name"
:title="projectInfo.name"
>
<font v-if="selProject.name.length >= 15"
>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ selProject.name.substring(0, 15) }}</font
<font v-if="projectInfo.name.length >= 15"
>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ projectInfo.name.substring(0, 15) }}</font
>
<font type="danger" v-else
>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ selProject.name }}</font
>&nbsp;<el-avatar class="top-icon" icon="el-icon-odometer" style="background-color:#E6A23C"></el-avatar>&nbsp;:&nbsp;{{ projectInfo.name }}</font
>
</span>
</el-menu-item>
<el-menu-item index="产品">
<el-menu-item index="/xm/core/project/productLink">
<span slot="title"><i class="el-icon-s-opportunity"></i>产品</span>
</el-menu-item>
<el-menu-item label="需求" index="需求" class="hidden-md-and-down">
<el-menu-item label="需求" index="/xm/core/project/menu" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-document"></i>需求</span>
</el-menu-item>
<el-menu-item index="迭代">
@ -147,124 +148,12 @@
</el-submenu>
</el-menu>
</el-row>
<el-row ref="pageBody">
<el-col :span="infotype=='项目概览'?4:0" class="padding border" :style="{maxHeight:maxTableHeight+'px',overflowY:'auto'}">
<h4 class="padding-bottom">常用功能快捷导航</h4>
<el-steps :active="calcProjectStatusStep" finish-status="success" direction="vertical">
<el-step
v-for="(i, index) in dicts['projectStatus']"
:title="i.name"
:key="index"
>
<el-row slot="description">
<el-row v-if="i.id=='0'"><!--初始-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="createProduct()">创建产品</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="linkProduct()">关联产品</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='环境清单'">环境清单</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','1')">进入售前</el-button>
</span>
<span v-if="selProject.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="linkProduct()">关联产品</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='环境清单'">环境清单</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='1'"><!--售前-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showMenusPage">需求管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','2')">设为立项中</el-button>
</span>
<span v-if="selProject.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showMenusPage">需求管理</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='2'"><!--立项中-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='合同管理'">签订合同</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='团队'">创建团队</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">创建计划</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='预算'">预算清单</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectGaiSuan()">项目估算</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectShouYi()">项目收益</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','3')">设为立项中</el-button>
</span>
<span v-if="selProject.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='合同管理'">合同管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='团队'">团队管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">计划管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='预算'">预算管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectGaiSuan()">项目估算</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showProjectShouYi()">项目收益</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='3'"><!--实施中-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='迭代'">迭代管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">任务管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='缺陷'">缺陷管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每日工时'">每日工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每月工时'">每月工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='费用'">费用管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='效能'">效能分析</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','4')">暂停项目</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="projectChangeRequire()">变更申请</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','5')">设为结项中</el-button>
</span>
<span v-if="selProject.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='迭代'">迭代管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='计划'">任务管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='缺陷'">缺陷管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每日工时'">每日工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='每月工时'">每月工时</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='费用'">费用管理</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="infotype='效能'">效能分析</el-button>
<el-button v-if="selProject.status<i.id" class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','5')">结项申请</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showDetail()">变更申请</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='4'"><!--暂停中-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','3')">重新激活</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='5'"><!--结项中-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showDetail()">结项申请</el-button>
<el-button class="step-btn" type="warning" size="mini" plain @click="showCurrFlow()">结项审批</el-button>
</span>
<span v-if="selProject.status!=i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="showHisFlow()">结项审批</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='6'"><!--已结项-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','7')">转入售后</el-button>
</span>
<span v-if="selProject.status!=i.id">
</span>
</el-row>
<el-row v-else-if="i.id=='7'"><!--售后-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','8')">设为已完成</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='8'"><!--已完成-->
<span v-if="selProject.status==i.id">
<el-button class="step-btn" type="warning" size="mini" plain @click="editXmProjectSomeFields(selProject,'status','9')">关闭项目</el-button>
</span>
</el-row>
<el-row v-else-if="i.id=='9'"><!--已关闭-->
</el-row>
</el-row>
</el-step>
</el-steps>
</el-col>
<!--
<el-row ref="pageBody">
<el-col :span="infotype=='项目概览'?20:24">
<xm-project-overview-complex
v-if="infotype == '项目概览'"
:sel-project="selProject"
:sel-project="projectInfo"
@submit="afterEditSubmit"
@edit-fields="onEditFields"
ref="项目概览"
@ -272,21 +161,21 @@
<xm-product-for-link-complex
v-if="infotype == '产品'"
ref="xmProductComplex"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-product-for-link-complex>
<xm-iteration-for-link-complex
v-if="infotype == '迭代'"
ref="xmIterationMng"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-iteration-for-link-complex>
<xm-menu-mng
v-if="infotype == '需求'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-menu-mng>
<xm-task-mng
v-if="infotype == '任务'"
ref="xmTaskMng"
:sel-project="selProject"
:sel-project="projectInfo"
ptype="0"
queryScope="task"
key="task"
@ -294,58 +183,57 @@
<xm-question
v-if="infotype == '缺陷'"
:qtype="'1'"
:sel-project="selProject"
:sel-project="projectInfo"
ref="xmQuestion"
></xm-question>
<xm-group-mng
v-if="infotype == '团队'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-group-mng>
<xm-file-mng
v-if="infotype == '文档'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-file-mng>
<xm-plan
v-if="infotype == '计划'"
ref="projectPlan"
ptype="0"
queryScope="planTask"
:sel-project="selProject"
:sel-project="projectInfo"
key="projectPlan"
></xm-plan>
<!-- <xm-phase-mng v-if="infotype=='计划'" ref="xmPhaseMng" :sel-project="selProject" ></xm-phase-mng> -->
></xm-plan>
<xm-test-case-exec-mng
v-if="infotype == '测试计划'"
:visible="infotype == '测试计划'"
:sel-project="selProject"
:sel-project="projectInfo"
ref="xmQuestion"
></xm-test-case-exec-mng>
<xm-budget
v-if="infotype == '预算'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-budget>
<xm-cost v-if="infotype == '费用'" :sel-project="selProject"></xm-cost>
<xm-cost v-if="infotype == '费用'" :sel-project="projectInfo"></xm-cost>
<xm-project-kpi
v-if="infotype == '考核'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-project-kpi>
<xm-record
v-if="infotype == '日志'"
:visible="infotype == '日志'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-record>
<xm-contract
v-if="infotype == '合同管理'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-contract>
<xm-env-list
v-if="infotype == '环境清单'"
:sel-project="selProject"
:sel-project="projectInfo"
></xm-env-list>
<xm-question
v-if="infotype == '风险'"
:qtype="'2'"
:sel-project="selProject"
:sel-project="projectInfo"
ref="xmRisk"
></xm-question>
<el-drawer
@ -356,7 +244,7 @@
:close-on-click-modal="false"
>
<xm-group-select
:sel-project="selProject"
:sel-project="projectInfo"
:visible="groupUserVisible"
is-select-multi-user="1"
@user-confirm="onUserSelected"
@ -365,62 +253,39 @@
<xm-report
v-if="infotype == '效能'"
:xm-project="selProject"
:xm-project="projectInfo"
></xm-report>
<xm-workload-set-day-list
v-if="infotype == '每日工时'"
:xm-project="selProject"
:xm-project="projectInfo"
></xm-workload-set-day-list>
<xm-workload-set-month-list
v-if="infotype == '每月工时'"
:xm-project="selProject"
:xm-project="projectInfo"
></xm-workload-set-month-list>
</el-col>
</el-row>
-->
</section>
</template>
<script>
import util from "@/common/js/util"; //
//import Sticky from '@/components/Sticky' // header
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from "vuex";
import xmTaskMng from "../xmTask/XmTaskMng";
import xmGroupMng from "../xmGroup/XmGroupMng";
import xmGroupSelect from "../xmGroup/XmGroupSelect";
import xmQuestion from "../xmQuestion/XmQuestionMng";
import xmFileMng from "../xmFile/XmFileMng";
import xmDetail from "./XmProjectDetail";
import xmProjectKpi from "../xmProjectKpi/XmProjectKpiMng";
import xmRecord from "../xmRecord/XmRecordMng";
import xmCost from "./XmProjectCost";
import xmBudget from "./XmProjectBudgetCost";
import xmContract from "../xmContract/XmContractMng";
import xmEnvList from "../xmEnvList/XmEnvListMng";
import xmMenuMng from "../xmMenu/XmMenuBox";
import XmIterationForLinkComplex from "../xmIteration/XmIterationForLinkComplex.vue";
import XmProjectOverviewComplex from "./XmProjectOverviewComplex.vue";
import XmProductForLinkComplex from "../xmProduct/XmProductForLinkComplex.vue";
import XmWorkloadSetDayList from "../xmWorkload/WorkloadSetDayList.vue";
import XmWorkloadSetMonthList from "../xmWorkload/WorkloadSetMonthList.vue";
import XmReport from "@/views/xm/rpt/reportIndex";
import XmPlan from "../xmTask/XmPlan.vue";
<script>
import { initDicts,getDefOptions,editXmProjectSomeFields } from "@/api/xm/core/xmProject";
import { mapGetters } from 'vuex'
export default {
props: ["selProject", "visible"],
props: ["visible"],
computed: {
...mapGetters(["userInfo", "roles"]),
...mapGetters(["userInfo", "roles","projectInfo"]),
calcProjectStatusStep() {
if (this.dicts["projectStatus"] && this.selProject) {
if (this.dicts["projectStatus"] && this.projectInfo) {
var index = this.dicts["projectStatus"].findIndex((i) => {
if (i.id == this.selProject.status) {
if (i.id == this.projectInfo.status) {
return true;
} else {
return false;
@ -434,345 +299,21 @@ export default {
},
watch: {},
data() {
return {
platformViewVisible: false,
tabPosition: "left",
infotype: "项目概览",
load: { list: false, edit: false },
groupUserVisible: false,
exportArr: ["任务", "计划", "需求监控"],
dicts: getDefOptions(),
maxTableHeight:300,
return {
infotype:'',
dicts: getDefOptions(),
/**end 自定义属性请在上面加 请加备注**/
};
}, //end data
methods: {
afterEditSubmit: function (project) {
this.selProject = Object.assign(this.selProject, project);
this.$emit("submit", project);
},
toArchive: function () {
this.$router.push({
path: "/mdp/arc/mate/archive/ArchiveMng",
});
},
toIm: function () {
this.groupUserVisible = true;
},
toHelpMe: function () {
this.$router.push({
path: "/mdp/im/messages/crmChat",
query: {
categoryId: "css",
sendContent: "咨询",
},
});
},
onUserSelected: function (users) {
if (this.groupUserVisible == true) {
var query = {};
if (users) {
if (users.length == 1) {
var user = users[0];
query.toUserid = user.userid;
query.toUsername = user.username;
query.msgType = "prichat";
} else if (users.length >= 2) {
query.users = JSON.stringify(
users.map((i) => {
return { userid: i.userid, username: i.username };
})
);
query.categoryId = "common";
query.msgType = "group";
}
}
this.$router.push({
path: "/mdp/im/messages/messageChat",
query: query,
});
}
},
methods: {
setInfotype(infotype) {
if (infotype == "返回") {
this.goBack();
} else {
this.infotype = infotype;
localStorage.setItem("project-infotype", infotype);
}
},
handleExport() {
this.downloadLoading = true;
let list = [];
let header = [];
let keyList = [];
let pageNum = 1;
let infotypeKey = "";
if (this.infotype === "任务") {
header = [
"序号",
"任务名称",
"需求",
"预算(万)",
"工作量(人时)",
"执行人",
"进度",
"任务开始时间",
"任务结束时间",
"任务技能需求",
];
keyList = [
"sortLevel",
"name",
"menuName",
"budgetCost",
"budgetWorkload",
"exeUsernames",
"rate",
"startTime",
"endTime",
"taskSkillNames",
];
list = this.$refs.xmTaskMng.tasksTreeData;
pageNum = this.$refs.xmTaskMng.pageInfo.pageNum;
} else if (this.infotype === "计划") {
header = [
"序号",
"计划名称",
"开始时间",
"结束时间",
"进度(%)",
"状态",
"计划人数",
"实际人数",
"计划工期",
"实际工期",
"计划工作量(人时)",
"实际工作量(人时)",
"计划非人力成本(元)",
"实际非人力成本(元)",
"计划内购人力成本(元)",
"实际内购人力成本(元)",
"计划外购人力成本(元)",
"实际外购人力成本(元)",
"计划成本合计(元)",
"实际成本合计(元)",
"审批状态",
"备注",
];
keyList = [
"seqNo",
"name",
"beginDate",
"endDate",
"actRate",
"phaseStatus",
"budgetOuserCnt",
"actStaffNu",
"budgetHours",
"actHours",
"budgetWorkload",
"actWorkload",
"budgetNouserAt",
"actNouserAt",
"budgetIuserAt",
"actIuserAt",
"budgetOuserAt",
"actOuserAt",
"budgetCostAt",
"actCostAt",
"bizFlowState",
"remark",
];
list = this.$refs.xmPhaseMng.projectPhaseTreeData;
pageNum = this.$refs.xmPhaseMng.pageInfo.pageNum;
} else if (this.infotype === "需求监控") {
header = [
"序号",
"需求名称",
"计划状态",
"负责人",
"上线时间",
"计划开始时间",
"实际开始时间",
"计划结束时间",
"实际结束时间",
"计划工作量(人时)",
"实际工作量(人时)",
"计划成本(元)",
"实际成本(元)",
"总体完成比例%",
"需求完成比例%",
"设计完成比例%",
"开发完成比例%",
"sit完成比例%",
"uat完成比例%",
"上线状态",
];
keyList = [
"seqNo",
"menuName",
"planStatus",
"chargeUsername",
"onlineTime",
"planStartTime",
"actStartTime",
"planEndTime",
"actEndTime",
"planWorkload",
"actWorkload",
"planCostAmount",
"actCostAmount",
"finishRate",
"demandRate",
"designRate",
"devRate",
"sitRate",
"uatRate",
"onlineStatus",
];
list = this.$refs.xmMenuWithPlan.xmMenusTreeData;
pageNum = this.$refs.xmMenuWithPlan.pageInfo.pageNum;
this.infotype = infotype;
}
const filename = `${this.selProject.name}_${this.infotype}_第${pageNum}`;
const data = this.formatJson(keyList, list);
import("@/vendor/Export2Excel").then((excel) => {
excel.export_json_to_excel({
header,
data,
filename,
// autoWidth: this.autoWidth,
bookType: "xlsx",
});
this.downloadLoading = false;
});
},
formatJson(filterVal, jsonData, dataList = []) {
if (this.infotype == "任务") {
jsonData.forEach((v) => {
const row = filterVal.map((j) => {
let key = "";
return v[j];
});
dataList.push(row);
if (v.children && v.children.length) {
dataList = this.formatJson(filterVal, v.children, dataList);
}
});
return dataList;
} else if (this.infotype == "计划") {
const bizFlowStateDict = {
0: "未发审",
1: "审核中",
2: "已通过",
3: "未通过",
4: "已取消",
};
jsonData.forEach((v) => {
const row = filterVal.map((j) => {
let key = "";
if (j == "phaseStatus") {
return this.$refs.xmPhaseMng.formateOption(
"xmPhaseStatus",
v.phaseStatus
);
} else if (j == "bizFlowState") {
return `${bizFlowStateDict[parseInt(v[j]) || 0]}`;
} else {
return v[j];
}
});
dataList.push(row);
if (v.children && v.children.length) {
dataList = this.formatJson(filterVal, v.children, dataList);
}
});
return dataList;
} else if (this.infotype == "需求监控") {
jsonData.forEach((v) => {
const row = filterVal.map((j) => {
let key = "";
if (j == "planStatus") {
key = "xmMenuPlanStatus";
} else if (j == "onlineStatus") {
return parseInt(v[j]) ? "已上线" : "未上线";
} else {
return v[j];
}
const dicts = this.$refs.xmMenuWithPlan.dicts;
if (
dicts[key] == undefined ||
dicts[key] == null ||
dicts[key].length == 0
) {
return v[j];
}
var rowData = dicts[key].filter((i) => i.id == v[j]);
if (rowData.length > 0) {
return rowData[0].name;
} else {
return v[j];
}
});
dataList.push(row);
if (v.children && v.children.length) {
dataList = this.formatJson(filterVal, v.children, dataList);
}
});
return dataList;
}
},
getDateString(dateStr) {
if (dateStr == null || dateStr == "" || dateStr == undefined) {
return "";
} else {
return dateStr.substr(0, 10);
}
},
editXmProjectSomeFields(row,fieldName,$event){
var that=this;
var func=(params)=>{
editXmProjectSomeFields(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.$emit('edit-fields',params)
Object.assign(row,params)
this.selProjectBak=Object.assign({},row)
}else{
Object.assign(this.selProject,this.selProjectBak)
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
}
var params={ids:[row.id]};
params[fieldName]=$event
if(fieldName=='description'){
this.$refs.selProject.validateField('description',err=>{
if(err){
this.$notify({position:'bottom-left',showClose:true,message: err,type: 'error'})
return;
}else{
func(params)
}
})
}else if(fieldName=='name'){
this.$refs.selProject.validateField('name',err=>{
if(err){
this.$notify({position:'bottom-left',showClose:true,message: err,type: 'error'})
return;
}else{
func(params)
}
})
}else{
func(params)
}
},
goBack() {
localStorage.setItem("project-infotype", "项目概览");
this.$router.back(-1);
@ -781,73 +322,16 @@ export default {
localStorage.setItem("project-infotype", "项目概览");
this.$router.push({path:'/'})
},
onEditFields(row){
Object.assign(this.selProject,row)
this.$emit("edit-fields",row);
},
showCurrFlow(){
this.$refs['项目概览'].showPanelName='currFlow'
},
showHisFlow(){
this.$refs['项目概览'].showPanelName='hisFlow'
},
showDetail(){
this.$refs['项目概览'].showPanelName='detail'
},
showProjectGaiSuan(){
this.$refs['项目概览'].showPanelName='detail'
this.$nextTick(()=>{
this.$refs['项目概览'].$refs['detail'].$refs['projectEdit'].currTabPane='4'
})
},
showProjectShouYi(){
this.$refs['项目概览'].showPanelName='detail'
this.$nextTick(()=>{
this.$refs['项目概览'].$refs['detail'].$refs['projectEdit'].currTabPane='5'
})
},
showMenusPage(){
this.infotype='需求'
},
linkProduct(){
this.$refs['项目概览'].showPanelName='productProjectLink'
},
createProduct(){
this.infotype='产品'
this.$nextTick(()=>{
this.$refs['xmProductComplex'].addProductVisible=true
})
}
}, //end methods
components: {
xmTaskMng,
xmGroupMng,
xmQuestion,
xmFileMng,
xmDetail,
xmProjectKpi,
xmRecord,
xmCost,
xmBudget,
xmContract,
xmEnvList,
xmMenuMng,
xmGroupSelect,
XmIterationForLinkComplex,
XmProjectOverviewComplex,
XmProductForLinkComplex,
XmReport,
XmPlan,
XmWorkloadSetDayList,
XmWorkloadSetMonthList,
//
},
mounted() {
this.$nextTick(() => {
this.maxTableHeight = this.source == 'GZT' ? this.maxTableHeight : util.calcTableMaxHeight(this.$refs.pageBody.$el);
//this.maxTableHeight = this.source == 'GZT' ? this.maxTableHeight : util.calcTableMaxHeight(this.$refs.pageBody.$el);
var infotype = localStorage.getItem("project-infotype");
if (infotype) {
this.infotype = infotype;

Loading…
Cancel
Save