diff --git a/src/router/routes_xm.js b/src/router/routes_xm.js index bd1037ec..0babb3fa 100644 --- a/src/router/routes_xm.js +++ b/src/router/routes_xm.js @@ -77,6 +77,17 @@ export default { ] }, + { + path: '/xm/core/xmProduct/XmProductInfoRoute', + component: _import('xm/core/xmProduct/XmProductInfoRoute'), + name: 'XmProductInfoRoute', + iconCls: 'fa el-icon-menu', + meta: { + title: '产品管理', + icon: 'project', + hidden:true + }, + }, { path: '/xm/core', component: Layout, @@ -89,13 +100,23 @@ export default { // leaf: true,//只有一个节点 children: [ - { path: 'xmProduct/XmProductComplex', component: _import('xm/core/xmProduct/XmProductComplex'), name: 'XmProductComplex', meta: { title: '产品总览' }}, - { path: 'xmProduct/XmProductMng', component: _import('xm/core/xmProduct/XmProductMng'), name: 'XmProductMng', meta: { title: '产品管理' }}, + { path: 'xmProduct/XmProductMng', component: _import('xm/core/xmProduct/XmProductMng'), name: 'XmProductMng', meta: { title: '产品管理' }}, { path: 'xmMenu/XmMenuMng', component: _import('xm/core/xmMenu/XmMenuMng'), name: 'XmMenuMng', meta: { title: '故事管理' }}, { path: 'xmMenuExchange/XmMenuExchangeMng', component: _import('xm/core/xmMenuExchange/XmMenuExchangeMng'), name: 'XmMenuExchangeMng', meta: { title: '互动评论' }}, { path: 'xmMenuTemplate/XmMenuTemplateMng', component: _import('xm/core/xmMenuTemplate/XmMenuTemplateMng'), name: 'XmMenuTemplateMng', meta: { title: '故事模板' }}, ] + },, + { + path: '/xm/core/xmIteration/XmIterationInfoRoute', + component: _import('xm/core/xmIteration/XmIterationInfoRoute'), + name: 'XmIterationInfoRoute', + iconCls: 'fa el-icon-menu', + meta: { + title: '迭代管理', + icon: 'project', + hidden:true + }, }, { path: '/xm/core', @@ -108,8 +129,7 @@ export default { }, // leaf: true,//只有一个节点 children: [ - { path: 'xmIteration/XmIterationComplex', component: _import('xm/core/xmIteration/XmIterationComplex'), name: 'XmIterationComplex', meta: { title: '迭代总览' }}, - { path: 'xmIteration/XmIterationMng', component: _import('xm/core/xmIteration/XmIterationMng'), name: 'XmIterationMng', meta: { title: '迭代管理' }}, + { path: 'xmIteration/XmIterationMng', component: _import('xm/core/xmIteration/XmIterationMng'), name: 'XmIterationMng', meta: { title: '迭代管理' }}, { path: 'xmIterationMenu/XmIterationMenuMng', component: _import('xm/core/xmIterationMenu/XmIterationMenuMng'), name: 'XmIterationMenuMng', meta: { title: '故事迭代' }}, ] } diff --git a/src/views/xm/core/xmIteration/XmIterationComplex.vue b/src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue similarity index 83% rename from src/views/xm/core/xmIteration/XmIterationComplex.vue rename to src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue index 7db348bf..57de3866 100644 --- a/src/views/xm/core/xmIteration/XmIterationComplex.vue +++ b/src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue @@ -12,17 +12,20 @@ 迭代概览 - - + + + + + - + - + - + @@ -45,6 +48,7 @@ import XmIterationStateShow from '../xmIterationState/XmIterationStateShow.vue' import { mapGetters } from 'vuex' import XmProductMng from '../xmProduct/XmProductMng.vue'; +import XmProjectForLink from '../xmProject/XmProjectForLink.vue'; import XmTaskMng from '../xmTask/XmTaskMng.vue'; import XmQuestionMng from '../xmQuestion/XmQuestionMng.vue'; @@ -55,7 +59,7 @@ import XmQuestionMng from '../xmQuestion/XmQuestionMng.vue'; 'userInfo','roles' ]), }, - props:['visible','selProject'], + props:['visible','selProject','xmProduct'], watch:{ visible:function(visible){ if(visible==true){ @@ -143,7 +147,8 @@ import XmQuestionMng from '../xmQuestion/XmQuestionMng.vue'; XmIterationStateShow, XmProductMng, XmTaskMng, - XmQuestionMng + XmQuestionMng, + XmProjectForLink, }, mounted() { this.$nextTick(() => { diff --git a/src/views/xm/core/xmIteration/XmIterationInfo.vue b/src/views/xm/core/xmIteration/XmIterationInfo.vue new file mode 100644 index 00000000..12ba0dce --- /dev/null +++ b/src/views/xm/core/xmIteration/XmIterationInfo.vue @@ -0,0 +1,444 @@ + + + + + + + + + + {{selProject.name.substring(0,10)}} + {{selProject.name}} + 概览 + + + + 迭代 + + + + 产品 + + + + 故事 + + + + + 任务 + + + + + 缺陷 + + + + + 团队 + + + 文档 + + + 规划与里程碑 + + 阶段计划及里程碑 + + + 测试计划 + + + + + 项目监控 + + + 故事监控 + + + + 合同管理 + + + 预算 + + + + + 费用 + + + + + 考核 + + + + + 日志 + + + + + 环境清单 + + + + 风险 + + + 更多 + + 故事监控 + + + 项目监控 + + + 预算 + + + + + 费用 + + + + + 考核 + + + + + 日志 + + + + + 合同管理 + + + + + 环境清单 + + + + 风险 + + + 论坛 + + + 即聊 + + + 客服 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/xm/core/xmIteration/XmIterationInfoRoute.vue b/src/views/xm/core/xmIteration/XmIterationInfoRoute.vue new file mode 100644 index 00000000..2b790321 --- /dev/null +++ b/src/views/xm/core/xmIteration/XmIterationInfoRoute.vue @@ -0,0 +1,61 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmMenu/XmMenuMng.vue b/src/views/xm/core/xmMenu/XmMenuMng.vue index 03d40451..c154ea10 100644 --- a/src/views/xm/core/xmMenu/XmMenuMng.vue +++ b/src/views/xm/core/xmMenu/XmMenuMng.vue @@ -27,8 +27,8 @@ - 故事 - 修改 + 故事 + 修改 描述 - + + + + + + + + + + {{xmProduct.productName.substring(0,10)}} + {{xmProduct.productName}} + 概览 + + + + 迭代 + + + + 项目 + + + 故事 + + + + + 任务 + + + + + 缺陷 + + + + + 团队 + + + 文档 + + + 规划与里程碑 + + 阶段计划及里程碑 + + + 测试计划 + + + + + 项目监控 + + + 故事监控 + + + + 合同管理 + + + 预算 + + + + + 费用 + + + + + 考核 + + + + + 日志 + + + + + 环境清单 + + + + 风险 + + + 更多 + + 故事监控 + + + 项目监控 + + + 预算 + + + + + 费用 + + + + + 考核 + + + + + 日志 + + + + + 合同管理 + + + + + 环境清单 + + + + 风险 + + + 论坛 + + + 即聊 + + + 客服 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/xm/core/xmProduct/XmProductInfoRoute.vue b/src/views/xm/core/xmProduct/XmProductInfoRoute.vue new file mode 100644 index 00000000..72cd1ee6 --- /dev/null +++ b/src/views/xm/core/xmProduct/XmProductInfoRoute.vue @@ -0,0 +1,61 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProduct/XmProductMng.vue b/src/views/xm/core/xmProduct/XmProductMng.vue index 8653e1f6..df96fd93 100644 --- a/src/views/xm/core/xmProduct/XmProductMng.vue +++ b/src/views/xm/core/xmProduct/XmProductMng.vue @@ -8,6 +8,7 @@ + - 产品 + 将更多产品加入迭代{{xmIteration.iterationName}} + 产品 查询条件 @@ -104,6 +106,42 @@ + + + + + + {{p.productName}} + {{p.code}} + + + {{p.totalBugCnt==null?0:p.totalBugCnt}} + 缺陷 + + + {{p.totalFileCnt==null?0:p.totalFileCnt}} + 文档 + + + + {{p.totalCompleteTaskCnt==null?0:p.totalCompleteTaskCnt}} + / + {{p.totalTaskCnt==null?0:p.totalTaskCnt}} + + 任务完成 + + + + + + + + + + @@ -273,6 +311,7 @@ import XmProductSelect from './XmProductSelect.vue'; pickerOptions: util.pickerOptions('datarange'), projectVisible:false, productSelectVisible:false, + showType:true, /**begin 自定义属性请在下面加 请加备注**/ /**end 自定义属性请在上面加 请加备注**/ @@ -411,6 +450,13 @@ import XmProductSelect from './XmProductSelect.vue'; this.editFormVisible=false; this.getXmProducts() }, + + //进入info界面 + intoInfo(row) { + this.editForm = row; + this.$router.push({ name:'XmProductInfoRoute', params: row }) + //this.showInfo = true; + }, //选择行xmProduct selsChange: function (sels) { this.sels = sels; @@ -504,6 +550,9 @@ import XmProductSelect from './XmProductSelect.vue'; }, onProjectSelected(projects){ + }, + onXmIterationSelect(){ + }, /**end 自定义函数请在上面加**/ onXmProductSelect:function(row){ @@ -547,7 +596,7 @@ import XmProductSelect from './XmProductSelect.vue'; UsersSelect, XmProjectList, XmIterationSelect, -XmProductSelect, + XmProductSelect, //在下面添加其它组件 }, mounted() { @@ -574,4 +623,107 @@ XmProductSelect, .align-right{ float: right; } + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProduct/XmProductOverview.vue b/src/views/xm/core/xmProduct/XmProductOverview.vue index e369c2f5..4eaf08ad 100644 --- a/src/views/xm/core/xmProduct/XmProductOverview.vue +++ b/src/views/xm/core/xmProduct/XmProductOverview.vue @@ -1,331 +1,699 @@ - - - - - - - 产品名称 - - - - - 产品查询范围: - - - - - - - - - - - - - - - 创建时间: - - - - - - 产品名称: - - - - - - - 产品经理: - - {{filters.pmUser.username}} - 选责任人 - 我的 - - - 查询 - - - - - - - {{scope.row.productName}} - {{scope.row.finishRate}}% - - {{scope.row.pmUsername}} - - - - - - - - 选择 - - - - - - - - - - + + + + + + + + 项目信息 + + + + + + + 项目负责人 + + + + + + + + + + + 总任务量 + + + + + + + + + + + + 待完成 + + + + + + + + + + + + 已完成 + + + + + + + + + + + + + 项目计划周期 + + + + + + + + + + 需求数: {{this.xmProjectState.menuCnt}} + + + + + + + + + + 迭代数: {{(this.xmProjectState.iterationCnt==null?0:this.xmProjectState.iterationCnt)}} + + + + + + + + + + + + + 任务进度 + + + + + + + + + 所有工作项及其完成情况 + + + + + + + + + + 缺陷情况 + + + + + + + + + + + + 任务每日状态趋势 + + + + + + + + + + 项目工时 + + + + + + + + + h + + 预估工时 + + + + + + + h + + 登记工时 + + + + + + + % + + 工时进度 + + + + + + + + + + + h + + 剩余工时 + + + + + + + h + + 预估偏差 + + + + + + + % + + 预估偏差率 + + + + + + 项目预计进度 + + + + 项目实际进度 + + + + + + + + + + + 项目阶段 + + + + + + + {{i.optionName}} + + + + + + + + + + - + + \ No newline at end of file + diff --git a/src/views/xm/core/xmProduct/XmProductOverviewComplex.vue b/src/views/xm/core/xmProduct/XmProductOverviewComplex.vue new file mode 100644 index 00000000..7413173c --- /dev/null +++ b/src/views/xm/core/xmProduct/XmProductOverviewComplex.vue @@ -0,0 +1,130 @@ + + + + + 项目概览 + + + 项目详情 + + + + 项目变更 + + + 基础信息修改 + + + 立项申请 + + + 预算+- + + + 成本+- + + + 收款 + + + 结项申请 + + + 暂停申请 + + + 激活申请 + + + 转售后申请 + + + 项目经理变更申请 + + + 组长变更申请 + + + + + 需求变更 + + + 需求评审 + + + 需求边界异动 + + + + + + 迭代变更 + + + 迭代计划评审 + + + 迭代上线申请 + + + + + + 阶段计划变更 + + + 计划评审 + + + 预算变更 + + + + + + + + + + + diff --git a/src/views/xm/core/xmProject/XmProjectForLink.vue b/src/views/xm/core/xmProject/XmProjectForLink.vue index f6627291..ab6c29da 100644 --- a/src/views/xm/core/xmProject/XmProjectForLink.vue +++ b/src/views/xm/core/xmProject/XmProjectForLink.vue @@ -6,6 +6,10 @@ + + + 加入更多项目到产品中 + @@ -15,9 +19,8 @@ - 选中 - - + 移出产品 + @@ -25,6 +28,10 @@ + + + + @@ -37,11 +44,13 @@ //import { listOption } from '@/api/mdp/meta/itemOption';//下拉框数据查询 import { listXmProject, } from '@/api/xm/core/xmProject'; import { mapGetters } from 'vuex' - + import { delXmProductProjectLink, addXmProductProjectLink,batchDelXmProductProjectLink } from '@/api/xm/core/xmProductProjectLink'; +import XmProjectList from './XmProjectList.vue'; + export default { - props:['xmProduct'], + props:['xmProduct','xmIteration'], computed: { ...mapGetters([ 'userInfo','roles' @@ -50,6 +59,9 @@ watch:{ xmProduct:function(){ this.getXmProjects(); + }, + xmIteration:function(){ + this.getXmProjects(); } }, data() { @@ -82,7 +94,7 @@ editForm: { id:'',code:'',name:'',xmType:'',startTime:'',endTime:'',urgent:'',priority:'',description:'',createUserid:'',createUsername:'',createTime:'',assess:'',assessRemarks:'',status:'',branchId:'',planTotalCost:'',bizProcInstId:'',bizFlowState:'',planNouserAt:'',planInnerUserAt:'',planOutUserAt:'',locked:'',baseTime:'',baseRemark:'',baselineId:'',planWorkload:'',totalReceivables:'',budgetMarginRate:'',contractAmt:'',planInnerUserPrice:'',budgetOutUserPrice:'',planOutUserCnt:'',planInnerUserCnt:'',planWorkingHours:'' }, - + xmProjectListVisible:false, /**end 自定义属性请在上面加 请加备注**/ } @@ -125,6 +137,10 @@ if(this.xmProduct){ params.productId=this.xmProduct.id } + + if(this.xmIteration){ + params.iterationId=this.xmIteration.id + } if(this.filters.key){ params.key='%'+this.filters.key+'%' } @@ -153,11 +169,46 @@ selectProject:function(row){ this.editForm=row this.$emit('project-confirm',this.editForm); + }, + /**end 自定义函数请在上面加**/ + onXmProjectSelect:function(row){ + var xmProject=row; + var xmProduct=this.xmProduct; + this.$confirm('确认将项目【'+xmProject.name+'】加入产品【'+xmProduct.productName+'】吗?', '提示', { + type: 'warning' + }).then(()=>{ + addXmProductProjectLink({projectId:xmProject.id,productId:xmProduct.id}).then(res=>{ + var tips =res.data.tips; + if(tips.isOk){ + this.getXmProjects(); + } + this.$message({showClose: true, message: tips.msg, type: tips.isOk?'success':'error'}); + }) + }) + }, + doDelXmProductProjectLink(row){ + + var xmProduct=this.xmProduct; + var selProject=row; + this.$confirm('确认将项目【'+selProject.projectName+'】从产品【'+xmProduct.productName+'】移出吗?移出后,项目试图中将看不到该产品信息', '提示', { + type: 'warning' + }).then(()=>{ + var params={productId:xmProduct.id,projectId:selProject.id} + delXmProductProjectLink(params).then(res=>{ + var tips = res.data.tips; + if(tips.isOk){ + this.getXmProjects(); + this.$message({showClose: true, message: "移出成功", type: 'success' }); + } + }); + }) + } /**end 自定义函数请在上面加**/ },//end methods - components: { + components: { +XmProjectList //在下面添加其它组件 }, diff --git a/src/views/xm/core/xmProject/XmProjectInfo.vue b/src/views/xm/core/xmProject/XmProjectInfo.vue index e89c43e7..6bd08dd2 100644 --- a/src/views/xm/core/xmProject/XmProjectInfo.vue +++ b/src/views/xm/core/xmProject/XmProjectInfo.vue @@ -141,9 +141,9 @@ - - - + + + @@ -194,9 +194,9 @@ import xmMenuWithPlan from '../xmMenu/XmMenuWithPlan'; import xmProjectStateMng from '../xmProjectState/XmProjectStateMng'; import xmTestCaseExecMng from '../xmTestCaseExec/XmTestCaseExecMng'; - import XmIterationComplex from '../xmIteration/XmIterationComplex.vue'; + import XmIterationForProjectComplex from '../xmIteration/XmIterationForProjectComplex.vue'; import XmProjectOverviewComplex from './XmProjectOverviewComplex.vue'; -import XmProductComplex from '../xmProduct/XmProductComplex.vue'; + import XmProductForProjectComplex from '../xmProduct/XmProductForProjectComplex.vue'; export default { @@ -416,9 +416,9 @@ import XmProductComplex from '../xmProduct/XmProductComplex.vue'; xmProjectStateMng, xmTestCaseExecMng, xmProjectGroupSelect, - XmIterationComplex, + XmIterationForProjectComplex, XmProjectOverviewComplex, - XmProductComplex, + XmProductForProjectComplex, //在下面添加其它组件 }, mounted() { diff --git a/src/views/xm/core/xmTask/XmTaskMng.vue b/src/views/xm/core/xmTask/XmTaskMng.vue index 67199e95..a28d0a88 100644 --- a/src/views/xm/core/xmTask/XmTaskMng.vue +++ b/src/views/xm/core/xmTask/XmTaskMng.vue @@ -56,7 +56,7 @@ 直接创建 - +