Browse Source

优化

master
陈裕财 3 years ago
parent
commit
7b090e5587
  1. 4
      src/router/routes_xm.js
  2. 2
      src/store/getters.js
  3. 7
      src/store/index.js
  4. 29
      src/store/modules/iterationInfo.js
  5. 17
      src/store/modules/productInfo.js
  6. 8
      src/store/modules/projectInfo.js
  7. 29
      src/store/modules/xmProduct.js
  8. 16
      src/views/xm/core/xmIteration/XmIterationForLinkComplex.vue
  9. 9
      src/views/xm/core/xmMenu/XmMenuBox.vue
  10. 4
      src/views/xm/core/xmProduct/XmProductForLinkComplex.vue
  11. 7
      src/views/xm/core/xmProject/XmProjectMng.vue
  12. 416
      src/views/xm/core/xmProject/index.vue
  13. 34
      src/views/xm/core/xmProject/top-nav.vue
  14. 8
      src/views/xm/core/xmTask/XmPlan.vue

4
src/router/routes_xm.js

@ -40,9 +40,9 @@ export default {
// leaf: true,//只有一个节点
children: [
{
path: 'overviewComplex',
path: 'overview',
component: _import('xm/core/xmProject/XmProjectOverviewComplex'),
name: 'projectOverviewComplex',
name: 'projectOverview',
iconCls: 'fa el-icon-menu',
meta: {
title: '项目-首页',

2
src/store/getters.js

@ -22,6 +22,6 @@ const getters = {
isLoadOk:state=>state.user.isLoadOk,
noticeMsg:state=>state.noticeMsg.noticeMsg,
projectInfo:state=>state.projectInfo.projectInfo,
productInfo:state=>state.productInfo.productInfo,
xmProduct:state=>state.xmProduct.xmProduct,
}
export default getters

7
src/store/index.js

@ -7,7 +7,9 @@ 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 xmProduct from './modules/xmProduct'
import iterationInfo from './modules/iterationInfo'
import getters from './getters'
Vue.use(Vuex)
@ -21,7 +23,8 @@ const store = new Vuex.Store({
user,
noticeMsg,
projectInfo,
productInfo
xmProduct,
iterationInfo,
},
getters
})

29
src/store/modules/iterationInfo.js

@ -0,0 +1,29 @@
var key='xm-iteration-info';
const iterationInfo = {
state: {
iterationInfo: null,
},
mutations: {
SET_ITERATION_INFO: (state, iterationInfo) => {
state.iterationInfo=iterationInfo
if(iterationInfo && iterationInfo!='null' && iterationInfo!='undefined' ){
sessionStorage.setItem(key,JSON.stringify(iterationInfo))
}else{
sessionStorage.removeItem(key)
}
}
},
actions: {
setIterationInfo({ commit }, iterationInfo) {
commit('SET_ITERATION_INFO', iterationInfo)
}
}
}
var iterationStr=sessionStorage.getItem(key)
if(iterationStr && iterationStr!='null' && iterationStr!='undefined' ){
iterationInfo.state.iterationInfo=JSON.parse(iterationStr)
}
export default iterationInfo

17
src/store/modules/productInfo.js

@ -1,17 +0,0 @@
const productInfo = {
state: {
productInfo: {}
},
mutations: {
SET_PRODUCT: (state, productInfo) => {
state.productInfo=productInfo
}
},
actions: {
setProduct({ commit }, productInfo) {
commit('SET_PRODUCT', productInfo)
}
}
}
export default productInfo

8
src/store/modules/projectInfo.js

@ -2,10 +2,10 @@
var key='xm-project-info';
const projectInfo = {
state: {
projectInfo: {}
projectInfo: null,
},
mutations: {
SET_PROJECT: (state, projectInfo) => {
SET_PROJECT_INFO: (state, projectInfo) => {
state.projectInfo=projectInfo
if(projectInfo && projectInfo!='null' && projectInfo!='undefined' ){
sessionStorage.setItem(key,JSON.stringify(projectInfo))
@ -16,8 +16,8 @@ const projectInfo = {
}
},
actions: {
setProject({ commit }, projectInfo) {
commit('SET_PROJECT', projectInfo)
setProjectInfo({ commit }, projectInfo) {
commit('SET_PROJECT_INFO', projectInfo)
}
}
}

29
src/store/modules/xmProduct.js

@ -0,0 +1,29 @@
var key='xm-product';
const xmProduct = {
state: {
xmProduct: null,
},
mutations: {
SET_XM_PRODUCT: (state, xmProduct) => {
state.xmProduct=xmProduct
if(xmProduct && xmProduct!='null' && xmProduct!='undefined' ){
sessionStorage.setItem(key,JSON.stringify(xmProduct))
}else{
sessionStorage.removeItem(key)
}
}
},
actions: {
setXmProduct({ commit }, xmProduct) {
commit('SET_XM_PRODUCT', xmProduct)
}
}
}
var xmProductStr=sessionStorage.getItem(key)
if(xmProductStr && xmProductStr!='null' && xmProductStr!='undefined' ){
xmProduct.state.xmProduct=JSON.parse(xmProductStr)
}
export default xmProduct

16
src/views/xm/core/xmIteration/XmIterationForLinkComplex.vue

@ -4,7 +4,7 @@
<el-col :span="4" class="padding">
<el-row>
<el-col :span="24">
<xm-iteration-select ref="xmIterationSelect" :auto-select="true" :link-project-id="selProject?selProject.id:null" :product-id="xmProduct?xmProduct.id:null" @row-click="onIterationRowClick" @clear="onIterationClearSelect"></xm-iteration-select>
<xm-iteration-select ref="xmIterationSelect" :auto-select="true" :link-project-id="projectInfo?projectInfo.id:null" :product-id="xmProduct?xmProduct.id:null" @row-click="onIterationRowClick" @clear="onIterationClearSelect"></xm-iteration-select>
</el-col>
</el-row>
<el-row ref="pageMainRef" class="padding" :class="{border:xmIteration&&xmIteration.id}" :style="{ maxHeight: maxTableHeight + 'px', overflowY: 'auto' }">
@ -280,7 +280,7 @@
<el-tabs :value="showPanel" @tab-click="tabClick">
<el-tab-pane label="迭代概览" lazy name="iterationOverview" v-if="xmIteration && xmIteration.id">
<xm-iteration-overview v-if="xmIteration && showPanel=='iterationOverview'" :xm-iteration="xmIteration" :sel-project="selProject"></xm-iteration-overview>
<xm-iteration-overview v-if="xmIteration && showPanel=='iterationOverview'" :xm-iteration="xmIteration" :sel-project="projectInfo"></xm-iteration-overview>
</el-tab-pane>
<el-tab-pane label="执行统计" lazy name="iterationCalc" v-if="xmIteration && xmIteration.id">
@ -301,16 +301,16 @@
<xm-iteration-edit v-if="showPanel=='detail'" :xm-iteration="xmIteration" @edit-fields="onEditFields"></xm-iteration-edit>
</el-tab-pane>
<el-tab-pane label="需求列表" lazy name="menus" v-if="xmIteration&&xmIteration.id">
<xm-menu-mng v-if="xmIteration && showPanel=='menus'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject"></xm-menu-mng>
<xm-menu-mng v-if="xmIteration && showPanel=='menus'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="projectInfo"></xm-menu-mng>
</el-tab-pane>
<el-tab-pane label="配置需求范围" lazy name="iterationMenuMng" v-if="xmIteration&&xmIteration.id">
<xm-iteration-menu-mng v-if="showPanel=='iterationMenuMng'" :xm-iteration="xmIteration"></xm-iteration-menu-mng>
</el-tab-pane>
<el-tab-pane label="任务列表" lazy name="tasks" v-if="xmIteration&&xmIteration.id">
<xm-task-mng v-if="xmIteration && showPanel=='tasks'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject"></xm-task-mng>
<xm-task-mng v-if="xmIteration && showPanel=='tasks'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="projectInfo"></xm-task-mng>
</el-tab-pane>
<el-tab-pane label="缺陷列表" lazy name="bugs" v-if="xmIteration&&xmIteration.id">
<xm-question-mng v-if="xmIteration && showPanel=='bugs'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject"></xm-question-mng>
<xm-question-mng v-if="xmIteration && showPanel=='bugs'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="projectInfo"></xm-question-mng>
</el-tab-pane>
<el-tab-pane label="效能分析" lazy name="效能" v-if="xmIteration&&xmIteration.id">
<xm-report v-if="xmIteration && showPanel=='效能'" :xm-iteration="xmIteration" ></xm-report>
@ -325,7 +325,7 @@
</el-row>
<el-dialog width="60%" top="20px" :visible.sync="iterationAddVisible" append-to-body>
<xm-iteration-add op-type="add" :xm-product="xmProduct" :sel-project="selProject" :visible="iterationAddVisible" @cancel="iterationAddVisible=false" @submit="afterIterationAddSubmit"></xm-iteration-add>
<xm-iteration-add op-type="add" :xm-product="xmProduct" :sel-project="projectInfo" :visible="iterationAddVisible" @cancel="iterationAddVisible=false" @submit="afterIterationAddSubmit"></xm-iteration-add>
</el-dialog>
</section>
</template>
@ -356,7 +356,7 @@
export default {
computed: {
...mapGetters([
'userInfo','roles'
'userInfo','roles','projectInfo','xmProduct'
]),
calcIterationStatusStep() {
@ -374,7 +374,7 @@
}
},
},
props:['visible','selProject','xmProduct'],
props:['visible'],
watch:{
visible:function(visible){
if(visible==true){

9
src/views/xm/core/xmMenu/XmMenuBox.vue

@ -4,13 +4,13 @@
<el-col :span="8">
<!--
<el-row class="padding-left padding-right" v-if="!xmProduct||!xmProduct.id" >
<xm-product-select ref="xmProductSelect1" style="display:inline;" :auto-select="true" :link-project-id="selProject?selProject.id:null" @row-click="onProductSelected" @clear="onProductClearSelect" ></xm-product-select>
<xm-product-select ref="xmProductSelect1" style="display:inline;" :auto-select="true" :link-project-id="projectInfo?projectInfo.id:null" @row-click="onProductSelected" @clear="onProductClearSelect" ></xm-product-select>
</el-row>
-->
<xm-epic-features :xm-product="xmProduct" :sel-project="selProject" @row-click="onEpicFeaturesRowClick" :disabled-mng="xmIteration&&xmIteration.id?true:false" @product-selected="onProductSelected" @product-clear="onProductClearSelect"></xm-epic-features>
<xm-epic-features :xm-product="xmProduct" :sel-project="projectInfo" @row-click="onEpicFeaturesRowClick" :disabled-mng="xmIteration&&xmIteration.id?true:false" @product-selected="onProductSelected" @product-clear="onProductClearSelect"></xm-epic-features>
</el-col>
<el-col :span="16" v-if="filters.xmProduct && filters.xmProduct.id">
<xm-menu-mng class="padding-left" :xm-product="filters.xmProduct" :sel-project="selProject" :parent-menu="parentMenu" :xm-iteration="xmIteration" :disabled-mng="xmIteration&&xmIteration.id?true:false"></xm-menu-mng>
<xm-menu-mng class="padding-left" :xm-product="filters.xmProduct" :sel-project="projectInfo" :parent-menu="parentMenu" :xm-iteration="xmIteration" :disabled-mng="xmIteration&&xmIteration.id?true:false"></xm-menu-mng>
</el-col>
</el-row>
</section>
@ -29,10 +29,9 @@
components: {
XmEpicFeatures,XmMenuMng,XmProductSelect
},
props:['xmProduct','selProject','xmIteration'],
computed: {
...mapGetters([
'userInfo','roles'
'userInfo','roles','projectInfo','xmProduct','xmIteration'
]),

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

@ -316,7 +316,7 @@ import XmProductAdd from "./XmProductEdit"; //新增界面
export default {
computed: {
...mapGetters(["userInfo", "roles","projectInfo"]),
...mapGetters(["userInfo", "roles","projectInfo","xmIteration"]),
calcProductPstatusStep() {
if (this.dicts["xmProductPstatus"] && this.xmProduct) {
@ -333,7 +333,7 @@ export default {
}
},
},
props: ["visible", "xmIteration"],
props: ["visible"],
watch: {
visible: function (visible) {
if (visible == true) {

7
src/views/xm/core/xmProject/XmProjectMng.vue

@ -664,12 +664,9 @@
//info
intoInfo(row) {
this.selectProject = row;
store.dispatch("setProject",row).then(res=>{
this.$router.push({ name:'projectOverviewComplex', query: {id:row.id} })
store.dispatch("setProjectInfo",row).then(res=>{
this.$router.push({ name:'projectOverview', query: {projectId:row.id} })
})
localStorage.setItem("xm-project-info-route",JSON.stringify(row))
//this.showInfo = true;
},
//

416
src/views/xm/core/xmProject/index.vue

@ -11,423 +11,55 @@ import util from "@/common/js/util"; //全局公共库
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from "vuex";
import topNav from './top-nav.vue'
import { initDicts,getDefOptions,editXmProjectSomeFields } from "@/api/xm/core/xmProject";
import store from '@/store'
import { listXmProject } from '@/api/xm/core/xmProject';
export default {
computed: {
...mapGetters(["userInfo", "roles"]),
calcProjectStatusStep() {
if (this.dicts["projectStatus"] && this.selProject) {
var index = this.dicts["projectStatus"].findIndex((i) => {
if (i.id == this.selProject.status) {
return true;
} else {
return false;
}
});
return index + 1;
} else {
return 0;
}
},
...mapGetters(["userInfo", "roles","projectInfo"]),
},
watch: {},
data() {
return {
platformViewVisible: false,
tabPosition: "left",
infotype: "项目概览",
load: { list: false, edit: false },
groupUserVisible: false,
exportArr: ["任务", "计划", "需求监控"],
dicts: getDefOptions(),
maxTableHeight:300,
/**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,
});
}
},
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;
}
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;
}
}, //end methods
components: {
topNav
//
},
getDateString(dateStr) {
if (dateStr == null || dateStr == "" || dateStr == undefined) {
return "";
} else {
return dateStr.substr(0, 10);
mounted() {
if(!this.$route.query.projectId){
this.$message.error("地址不合规")
this.$route.back(-1)
}
},
editXmProjectSomeFields(row,fieldName,$event){
var that=this;
var func=(params)=>{
editXmProjectSomeFields(params).then(res=>{
if(!this.projectInfo||this.projectInfo.id!=this.$route.query.projectId){
listXmProject({id:this.$route.query.projectId}).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.$emit('edit-fields',params)
Object.assign(row,params)
this.selProjectBak=Object.assign({},row)
if(tips.isOk ){
if( res.data.data.length==1){
store.dispatch('setProjectInfo',res.data.data[0])
}else{
Object.assign(this.selProject,this.selProjectBak)
this.$notify({position:'bottom-left',showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
this.$message.error("项目不存在,请确保项目编号正确")
this.$router.push({
path:'/xm/core/xmProject/XmProjectMng'
})
}
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)
}
this.$message.error(tips.msg)
this.$router.push({
path:'/xm/core/xmProject/XmProjectMng'
})
}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);
},
goHome(){
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
})
beforeDestroy(){
store.dispatch('setProjectInfo',null)
}
}, //end methods
components: {
topNav
//
},
mounted() {
},
};
</script>

34
src/views/xm/core/xmProject/top-nav.vue

@ -12,7 +12,7 @@
:router="true"
>
<el-menu-item index="/xm/core/project/overviewComplex">
<el-menu-item :index="'/xm/core/project/overview?projectId='+projectInfo.id">
<span
slot="title"
style="font-size: 18px; color: #ffd04b"
@ -43,64 +43,64 @@
>
</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/product">
<el-menu-item :index="'/xm/core/project/product?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-s-opportunity"></i>产品</span>
</el-menu-item>
<el-menu-item label="需求" index="/xm/core/project/menu" class="hidden-md-and-down">
<el-menu-item label="需求" :index="'/xm/core/project/menu?projectId='+projectInfo.id" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-document"></i>需求</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/iteration">
<el-menu-item :index="'/xm/core/project/iteration?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-connection"></i>迭代</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/plan">
<el-menu-item :index="'/xm/core/project/plan?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-time"></i>计划</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/task" class="hidden-md-and-down">
<el-menu-item :index="'/xm/core/project/task?projectId='+projectInfo.id" class="hidden-md-and-down">
<span slot="title"><i class="el-icon-s-operation"></i>任务</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/question">
<el-menu-item :index="'/xm/core/project/question?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-question"></i>缺陷</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/group">
<el-menu-item :index="'/xm/core/project/group?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-user-solid"></i>团队</span>
</el-menu-item>
<el-submenu index="caiwu" class="hidden-sm-and-down">
<template slot="title"><i class="el-icon-coin"></i>财务</template>
<el-menu-item index="/xm/core/project/contract">
<el-menu-item :index="'/xm/core/project/contract?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-s-data"></i>合同管理</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/budget">
<el-menu-item :index="'/xm/core/project/budget?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-coin"></i>预算</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/cost">
<el-menu-item :index="'/xm/core/project/cost?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-coin"></i>费用</span>
</el-menu-item>
</el-submenu>
<el-menu-item index="/xm/core/project/report">
<el-menu-item :index="'/xm/core/project/report?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-s-data"></i>效能</span>
</el-menu-item>
<el-submenu index="zhishi" class="hidden-md-and-down">
<template slot="title">知识</template>
<el-menu-item index="/xm/core/project/file">
<el-menu-item :index="'/xm/core/project/file?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-document"></i>文档</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/env">
<el-menu-item :index="'/xm/core/project/env?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-setting"></i>环境清单</span>
</el-menu-item>
<el-menu-item index="/xm/core/project/record">
<el-menu-item :index="'/xm/core/project/record?projectId='+projectInfo.id">
<span slot="title"><i class="el-icon-edit-outline"></i>日志</span>
</el-menu-item>
</el-submenu>
<el-submenu index="更多">
<template slot="title">更多 </template>
<el-menu-item index="/xm/core/project/workloadDay">
<el-menu-item :index="'/xm/core/project/workloadDay?projectId='+projectInfo.id">
<span slot="title"
><i class="el-icon-video-camera"></i>每日工时</span
>
</el-menu-item>
<el-menu-item index="/xm/core/project/workloadMonth">
<el-menu-item :index="'/xm/core/project/workloadMonth?projectId='+projectInfo.id">
<span slot="title"
><i class="el-icon-video-camera"></i>每月工时</span
>

8
src/views/xm/core/xmTask/XmPlan.vue

@ -2,10 +2,10 @@
<section>
<el-row class="box">
<el-col :span="8" class="left">
<xm-phase :xm-product="xmProduct" :sel-project="selProject" queryScope="plan" @row-click="onPhaseRowClick"></xm-phase>
<xm-phase :xm-product="xmProduct" :sel-project="projectInfo" queryScope="plan" @row-click="onPhaseRowClick"></xm-phase>
</el-col>
<el-col :span="16">
<xm-task-mng :xm-product="xmProduct" :sel-project="selProject" queryScope="task" :parent-task="parentTask"></xm-task-mng>
<xm-task-mng :xm-product="xmProduct" :sel-project="projectInfo" queryScope="task" :parent-task="parentTask"></xm-task-mng>
</el-col>
</el-row>
</section>
@ -23,10 +23,10 @@
components: {
XmPhase,XmTaskMng
},
props:['xmProduct','selProject'],
props:[],
computed: {
...mapGetters([
'userInfo','roles'
'userInfo','roles','xmProduct','projectInfo'
]),

Loading…
Cancel
Save