diff --git a/config/index.js b/config/index.js index 54b75a90..f3965d23 100644 --- a/config/index.js +++ b/config/index.js @@ -11,7 +11,7 @@ module.exports = { assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { - /** + '/api/m1/xm': { target: 'http://localhost:7067', changeOrigin: true, @@ -19,7 +19,7 @@ module.exports = { '^/api/m1/xm': '/xm' } }, - + /** '/api/m1/workflow': { target: 'http://localhost:7080', changeOrigin: true, diff --git a/src/api/xm/core/xmIterationProductLink.js b/src/api/xm/core/xmIterationProductLink.js new file mode 100644 index 00000000..bfbd5166 --- /dev/null +++ b/src/api/xm/core/xmIterationProductLink.js @@ -0,0 +1,30 @@ +import axios from '@/utils/request' + +import config from '@/common/config' + +let base = config.getCoreBasePath(); + + +/** + * 迭代表与产品表的关联关系,一般由迭代管理员将迭代挂接到产品表 + *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, + *2 查询、新增、修改的参数格式 params={iterationId:'迭代表主键 主键',productId:'产品表主键 主键',ctime:'创建时间',cuserid:'创建人编号',cusername:'创建人姓名',linkStatus:'关联状态1关联0取消关联'} + **/ + +//普通查询 条件之间and关系 +export const listXmIterationProductLink = params => { return axios.get(`${base}/xm/core/xmIterationProductLink/list`, { params: params }); }; + +//模糊查询迭代表与产品表的关联关系,一般由迭代管理员将迭代挂接到产品表 条件之间or关系 +//export const listXmIterationProductLinkKey = params => { return axios.get(`${base}/xm/core/xmIterationProductLink/listKey`, { params: params }); }; + +//删除一条迭代表与产品表的关联关系,一般由迭代管理员将迭代挂接到产品表 params={iterationId:'迭代表主键 主键',productId:'产品表主键 主键'} +export const delXmIterationProductLink = params => { return axios.post(`${base}/xm/core/xmIterationProductLink/del`,params); }; + +//批量删除迭代表与产品表的关联关系,一般由迭代管理员将迭代挂接到产品表 params=[{iterationId:'迭代表主键 主键',productId:'产品表主键 主键'}] +export const batchDelXmIterationProductLink = params => { return axios.post(`${base}/xm/core/xmIterationProductLink/batchDel`, params); }; + +//修改一条迭代表与产品表的关联关系,一般由迭代管理员将迭代挂接到产品表记录 +export const editXmIterationProductLink = params => { return axios.post(`${base}/xm/core/xmIterationProductLink/edit`, params); }; + +//新增一条迭代表与产品表的关联关系,一般由迭代管理员将迭代挂接到产品表 +export const addXmIterationProductLink = params => { return axios.post(`${base}/xm/core/xmIterationProductLink/add`, params); }; \ No newline at end of file diff --git a/src/api/xm/core/xmProductProjectLink.js b/src/api/xm/core/xmProductProjectLink.js new file mode 100644 index 00000000..8528b1c2 --- /dev/null +++ b/src/api/xm/core/xmProductProjectLink.js @@ -0,0 +1,30 @@ +import axios from '@/utils/request' + +import config from '@/common/config' + +let base = config.getCoreBasePath(); + + +/** + * 产品与项目的关联关系表,一般由产品经理挂接项目到产品上 + *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, + *2 查询、新增、修改的参数格式 params={projectId:'项目表中的主键 主键',productId:'产品表中的主键 主键',ctime:'创建时间',cuserid:'创建人编号',cusername:'创建人姓名',linkStatus:'关联状态1关联0取消关联'} + **/ + +//普通查询 条件之间and关系 +export const listXmProductProjectLink = params => { return axios.get(`${base}/xm/core/xmProductProjectLink/list`, { params: params }); }; + +//模糊查询产品与项目的关联关系表,一般由产品经理挂接项目到产品上 条件之间or关系 +//export const listXmProductProjectLinkKey = params => { return axios.get(`${base}/xm/core/xmProductProjectLink/listKey`, { params: params }); }; + +//删除一条产品与项目的关联关系表,一般由产品经理挂接项目到产品上 params={projectId:'项目表中的主键 主键',productId:'产品表中的主键 主键'} +export const delXmProductProjectLink = params => { return axios.post(`${base}/xm/core/xmProductProjectLink/del`,params); }; + +//批量删除产品与项目的关联关系表,一般由产品经理挂接项目到产品上 params=[{projectId:'项目表中的主键 主键',productId:'产品表中的主键 主键'}] +export const batchDelXmProductProjectLink = params => { return axios.post(`${base}/xm/core/xmProductProjectLink/batchDel`, params); }; + +//修改一条产品与项目的关联关系表,一般由产品经理挂接项目到产品上记录 +export const editXmProductProjectLink = params => { return axios.post(`${base}/xm/core/xmProductProjectLink/edit`, params); }; + +//新增一条产品与项目的关联关系表,一般由产品经理挂接项目到产品上 +export const addXmProductProjectLink = params => { return axios.post(`${base}/xm/core/xmProductProjectLink/add`, params); }; \ No newline at end of file diff --git a/src/router/routes_xm.js b/src/router/routes_xm.js index 79c2f9b6..0babb3fa 100644 --- a/src/router/routes_xm.js +++ b/src/router/routes_xm.js @@ -16,7 +16,7 @@ export default { // leaf: true,//只有一个节点 children: [ - { path: 'xmProject/XmProjectAdd', component: _import('xm/core/xmProject/XmProjectAdd'), name: 'xmProjectAdd', meta: { title: '项目立项' }}, + { path: 'xmProject/XmProjectAdd', component: _import('xm/core/xmProject/XmProjectAdd'), name: 'xmProjectAdd',hidden:true, meta: { title: '项目立项' }}, { path: 'xmProject/XmProjectAllMng', component: _import('xm/core/xmProject/XmProjectAllMng'), name: 'xmProjectAllMng', meta: { title: '项目总览' }}, { path: 'xmProject/XmProjectMng', component: _import('xm/core/xmProject/XmProjectMng'), name: 'xmProjectMng', meta: { title: '项目(我的)' }}, { path: 'xmProjectState/XmCockpit', name: 'XmCockpit', meta: { title: '领导驾驶舱' ,openTab:true,outUrl:'${curlDomain}/xm/'+process.env.VERSION+'/#/datav/xm/branch/branchDatavFullScreen'}}, @@ -77,23 +77,46 @@ 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, - name: '用户故事', + name: '产品管理', iconCls: 'fa el-icon-menu', meta: { - title: '用户故事', + title: '产品管理', icon: 'project' }, // leaf: true,//只有一个节点 children: [ - { 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', @@ -106,7 +129,7 @@ export default { }, // leaf: true,//只有一个节点 children: [ - { 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/styles/mdp.scss b/src/styles/mdp.scss index c6ae1bb1..00f73bb8 100644 --- a/src/styles/mdp.scss +++ b/src/styles/mdp.scss @@ -165,14 +165,14 @@ .tips{ position:absolute; - font-size: 10px; - bottom: 0px; + font-size: 14px; + bottom: -10px; color: red; padding-left: 10px; flex: 0 0 auto; display: flex; flex-direction: row; justify-content: flex-start; - align-items: center; + align-items: bottom; overflow-x: hidden; } \ No newline at end of file diff --git a/src/views/xm/core/xmIteration/XmIterationAdd.vue b/src/views/xm/core/xmIteration/XmIterationAdd.vue index e3c81d30..a8db034e 100644 --- a/src/views/xm/core/xmIteration/XmIterationAdd.vue +++ b/src/views/xm/core/xmIteration/XmIterationAdd.vue @@ -128,7 +128,7 @@ var tips=res.data.tips; if(tips.isOk){ this.$refs['addForm'].resetFields(); - this.$emit('submit');// @submit="afterAddSubmit" + this.$emit('submit',res.data.data);// @submit="afterAddSubmit" } this.$message({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' }); }).catch( err => this.load.add=false); diff --git a/src/views/xm/core/xmIteration/XmIterationComplex.vue b/src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue similarity index 68% rename from src/views/xm/core/xmIteration/XmIterationComplex.vue rename to src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue index 248eecd7..57de3866 100644 --- a/src/views/xm/core/xmIteration/XmIterationComplex.vue +++ b/src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue @@ -1,27 +1,31 @@ @@ -129,12 +136,15 @@ import config from '@/common/config';//全局公共库 import { listOption } from '@/api/mdp/meta/itemOption';//下拉框数据查询 import { listXmIteration,listXmIterationWithState, delXmIteration, batchDelXmIteration,loadTasksToXmIterationState } from '@/api/xm/core/xmIteration'; + import { addXmIterationProductLink,delXmIterationProductLink } from '@/api/xm/core/xmIterationProductLink'; + import XmIterationAdd from './XmIterationAdd';//新增界面 import XmIterationEdit from './XmIterationEdit';//修改界面 import XmIterationStateMng from '../xmIterationState/XmIterationStateMng';//修改界面 import XmGantt from '../components/xm-gantt'; import { mapGetters } from 'vuex' +import XmIterationSelect from './XmIterationSelect.vue'; export default { computed: { @@ -146,12 +156,18 @@ return this.translateDataToTree(this.xmIterations); }, }, - props:['productId','menuId','visible'], + props:['xmProduct','selProject','menuId','visible'], watch:{ visible:function(visible){ if(visible==true){ this.getXmIterations(); } + }, + xmProduct:function(){ + this.getXmIterations(); + }, + selProject:function(){ + this.getXmIterations(); } }, data() { @@ -207,17 +223,18 @@ /**begin 自定义属性请在下面加 请加备注**/ valueChangeRows:[], parentIteration:null, - iterationStateVisible:false, - gstcVisible:false, - tableHeight:300, - ganrrColumns: { - children: 'children', - name: 'iterationName', - id: 'id', - pid: 'pid', - startDate: 'startTime', - endDate: 'endTime', - } + iterationStateVisible:false, + iterationSelectVisible:false, + gstcVisible:false, + tableHeight:300, + ganrrColumns: { + children: 'children', + name: 'iterationName', + id: 'id', + pid: 'pid', + startDate: 'startTime', + endDate: 'endTime', + } /**end 自定义属性请在上面加 请加备注**/ } },//end data @@ -270,13 +287,16 @@ if(this.filters.key){ params.key= "%"+this.filters.key+"%" } - if(this.productId){ - params.productId=this.productId + if(this.xmProduct){ + params.productId=this.xmProduct.id + } + if(this.selProject){ + params.projectId=this.selProject.id } if(this.menuId){ params.menuId=this.menuId } - if( !this.menuId && !this.productId ){ + if( !this.menuId && !this.xmProduct && !this.selProject){ params.queryScope=this.filters.queryScope if(this.filters.queryScope=='iterationId'){ if(!this.filters.id){ @@ -329,14 +349,25 @@ this.addFormVisible = true; //this.addForm=Object.assign({}, this.editForm); }, - afterAddSubmit(){ + afterAddSubmit(xmIteration){ this.addFormVisible=false; this.pageInfo.count=true; - this.getXmIterations(); + if(this.xmProduct){//如果是产品试图界面添加的迭代,直接添加产品与迭代的关联关系 + this.onXmIterationSelect(xmIteration); + }else{ + this.getXmIterations(); + } }, afterEditSubmit(){ this.editFormVisible=false; }, + + //进入info界面 + intoInfo(row) { + this.editForm = row; + this.$router.push({ name:'XmIterationInfoRoute', params: row }) + //this.showInfo = true; + }, //选择行xmIteration selsChange: function (sels) { this.sels = sels; @@ -467,13 +498,42 @@ return cellValue; } }, - /**end 自定义函数请在上面加**/ - + onXmIterationSelect:function(row){ + var xmIteration=row; + var xmProduct=this.xmProduct; + this.$confirm('确认将产品【'+xmProduct.productName+'】加入迭代计划【'+xmIteration.iterationName+'】吗?', '提示', { + type: 'warning' + }).then(()=>{ + addXmIterationProductLink({iterationId:xmIteration.id,productId:xmProduct.id}).then(res=>{ + var tips =res.data.tips; + if(tips.isOk){ + this.getXmIterations(); + } + this.$message({showClose: true, message: tips.msg, type: tips.isOk?'success':'error'}); + }) + }) + }, + doDelXmIterationProductLink(row){ + var xmIteration=row; + var xmProduct=this.xmProduct; + this.$confirm('确认将产品【'+xmProduct.productName+'】与迭代【'+xmIteration.iterationName+'】进行脱钩吗?脱钩后,产品与迭代互相查看不到对方信息。', '提示', { + type: 'warning' + }).then(()=>{ + delXmIterationProductLink({iterationId:xmIteration.id,productId:xmProduct.id}).then(res=>{ + var tips =res.data.tips; + if(tips.isOk){ + this.getXmIterations(); + } + this.$message({showClose: true, message: tips.msg, type: tips.isOk?'success':'error'}); + }) + }) + } },//end methods components: { 'xm-iteration-add':XmIterationAdd, 'xm-iteration-edit':XmIterationEdit, XmIterationStateMng,XmGantt, + XmIterationSelect, //在下面添加其它组件 }, mounted() { diff --git a/src/views/xm/core/xmIteration/XmIterationSelect.vue b/src/views/xm/core/xmIteration/XmIterationSelect.vue index d3f98edb..aa8c2ab1 100644 --- a/src/views/xm/core/xmIteration/XmIterationSelect.vue +++ b/src/views/xm/core/xmIteration/XmIterationSelect.vue @@ -98,6 +98,9 @@ this.clearSelectIteration(); this.getXmIterations(); } + }, + productId:function(){ + this.getXmIterations(); } }, data() { diff --git a/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkAdd.vue b/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkAdd.vue new file mode 100644 index 00000000..083de18a --- /dev/null +++ b/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkAdd.vue @@ -0,0 +1,123 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkEdit.vue b/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkEdit.vue new file mode 100644 index 00000000..a9d9bb73 --- /dev/null +++ b/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkEdit.vue @@ -0,0 +1,118 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkMng.vue b/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkMng.vue new file mode 100644 index 00000000..7ae1116e --- /dev/null +++ b/src/views/xm/core/xmIterationProductLink/XmIterationProductLinkMng.vue @@ -0,0 +1,252 @@ + + + + + \ 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 b1aa57ba..c154ea10 100644 --- a/src/views/xm/core/xmMenu/XmMenuMng.vue +++ b/src/views/xm/core/xmMenu/XmMenuMng.vue @@ -1,11 +1,11 @@ - 产品 - - + 将更多产品加入迭代{{xmIteration.iterationName}} + 产品 + 查询条件 + 产品查询范围: - + - - + - 创建时间: - 产品名称: @@ -84,13 +82,66 @@ 选责任人 我的 - + + + + 项目 {{selProject?selProject.name:''}} + + + + + 迭代 {{xmIteration.iterationName}} + + + 查询 + 更多操作 + + + 将更多产品加入迭代{{xmIteration.iterationName}} + + + + + + + +
{{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}} + + 任务完成 +
+
+
+ +
+ +
+
+
+
@@ -110,7 +161,7 @@ @@ -172,6 +236,7 @@ //import Sticky from '@/components/Sticky' // 粘性header组件 //import { listOption } from '@/api/mdp/meta/itemOption';//下拉框数据查询 import { listXmProduct,listXmProductWithState, delXmProduct, batchDelXmProduct } from '@/api/xm/core/xmProduct'; + import { addXmIterationProductLink,delXmIterationProductLink } from '@/api/xm/core/xmIterationProductLink'; import { loadTasksToXmProductState } from '@/api/xm/core/xmProductState'; import XmProductAdd from './XmProductAdd';//新增界面 import XmProductEdit from './XmProductEdit';//修改界面 @@ -180,14 +245,25 @@ import XmProductStateMng from '../xmProductState/XmProductStateMng';//修改界面 import UsersSelect from "@/views/mdp/sys/user/UsersSelect"; - + import XmProjectList from '../xmProject/XmProjectList.vue'; + import XmIterationSelect from '../xmIteration/XmIterationSelect.vue'; +import XmProductSelect from './XmProductSelect.vue'; + export default { - props:['selProject'], + props:['selProject','xmIteration'], computed: { ...mapGetters([ 'userInfo','roles' ]) }, + watch:{ + selProject:function(){ + this.getXmProducts(); + }, + xmIteration:function(){ + this.getXmProducts(); + } + }, data() { const beginDate = new Date(); const endDate = new Date(); @@ -224,6 +300,7 @@ id:'',productName:'',branchId:'',remark:'' }, iterationVisible:false, + iterationSelectVisible:false, productStateVisible:false, selectFiltersPmUserVisible:false, tableHeight:300, @@ -232,6 +309,9 @@ util.formatDate.format(endDate, "yyyy-MM-dd") ], pickerOptions: util.pickerOptions('datarange'), + projectVisible:false, + productSelectVisible:false, + showType:true, /**begin 自定义属性请在下面加 请加备注**/ /**end 自定义属性请在上面加 请加备注**/ @@ -307,18 +387,19 @@ } if(this.filters.queryScope=="branchId"){ - params.branchId=this.userInfo.branchId - params.projectId=null; + params.branchId=this.userInfo.branchId } - if(!this.selProject && this.filters.queryScope!='productId'){ + if(!this.selProject && !this.xmIteration && this.filters.queryScope!='productId' && this.filters.queryScope!='compete'){ if(!this.dateRanger || this.dateRanger.length==0){ this.$message({showClose: true, message: "创建日期范围不能为空", type: 'error' }); return; } params.ctimeStart=this.dateRanger[0]+" 00:00:00" params.ctimeEnd=this.dateRanger[1]+" 23:59:59" + } + if(this.xmIteration){ + params.iterationId=this.xmIteration.id } - if(this.filters.key!==""){ params.key="%"+this.filters.key+"%" } @@ -356,15 +437,26 @@ this.addFormVisible = true; //this.addForm=Object.assign({}, this.editForm); }, - afterAddSubmit(){ + afterAddSubmit(xmProduct){ this.addFormVisible=false; this.pageInfo.count=true; - this.getXmProducts(); + if(this.xmIteration){//如果是迭代试图进入的迭代界面,创建了产品直接添加产品与迭代的关系 + this.onXmProductSelect(xmProduct); + }else{ + this.getXmProducts(); + } }, afterEditSubmit(){ 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; @@ -456,6 +548,43 @@ this.filters.pmUser=this.userInfo; this.searchXmProducts(); }, + onProjectSelected(projects){ + + }, + onXmIterationSelect(){ + + }, + /**end 自定义函数请在上面加**/ + onXmProductSelect:function(row){ + var xmIteration=this.xmIteration; + var xmProduct=row; + this.$confirm('确认将产品【'+xmProduct.productName+'】加入迭代计划【'+xmIteration.iterationName+'】吗?', '提示', { + type: 'warning' + }).then(()=>{ + addXmIterationProductLink({iterationId:xmIteration.id,productId:xmProduct.id}).then(res=>{ + var tips =res.data.tips; + if(tips.isOk){ + this.getXmProducts(); + } + this.$message({showClose: true, message: tips.msg, type: tips.isOk?'success':'error'}); + }) + }) + }, + doDelXmIterationProductLink(row){ + var xmIteration=this.xmIteration; + var xmProduct=row; + this.$confirm('确认将产品【'+xmProduct.productName+'】与迭代【'+xmIteration.iterationName+'】进行脱钩吗?脱钩后,产品下的所有故事将从本迭代计划一并移出。', '提示', { + type: 'warning' + }).then(()=>{ + delXmIterationProductLink({iterationId:xmIteration.id,productId:xmProduct.id}).then(res=>{ + var tips =res.data.tips; + if(tips.isOk){ + this.getXmProducts(); + } + this.$message({showClose: true, message: tips.msg, type: tips.isOk?'success':'error'}); + }) + }) + } /**end 自定义函数请在上面加**/ },//end methods @@ -465,6 +594,9 @@ XmIterationMng, XmProductStateMng, UsersSelect, + XmProjectList, + XmIterationSelect, + XmProductSelect, //在下面添加其它组件 }, mounted() { @@ -491,4 +623,107 @@ .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 new file mode 100644 index 00000000..4eaf08ad --- /dev/null +++ b/src/views/xm/core/xmProduct/XmProductOverview.vue @@ -0,0 +1,699 @@ + + + + + + + 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/xmProduct/XmProductProjectForLink.vue b/src/views/xm/core/xmProduct/XmProductProjectForLink.vue new file mode 100644 index 00000000..28a45a7d --- /dev/null +++ b/src/views/xm/core/xmProduct/XmProductProjectForLink.vue @@ -0,0 +1,73 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProduct/XmProductSelect.vue b/src/views/xm/core/xmProduct/XmProductSelect.vue index 7a780233..d8e195f4 100644 --- a/src/views/xm/core/xmProduct/XmProductSelect.vue +++ b/src/views/xm/core/xmProduct/XmProductSelect.vue @@ -102,12 +102,21 @@ export default { - props:['isSelectProduct','selProject'], + props:['isSelectProduct','selProject','xmIteration'], computed: { ...mapGetters([ 'userInfo','roles' ]) }, + watch:{ + xmIteration(){ + this.getXmProducts(); + }, + + selProject(){ + this.getXmProducts(); + } + }, data() { const beginDate = new Date(); const endDate = new Date(); @@ -208,6 +217,11 @@ if(this.selProject){ params.projectId=this.selProject.id } + + if(this.xmIteration){ + params.iterationId=this.xmIteration.id + } + params.queryScope=this.filters.queryScope if(this.filters.queryScope=='productId'){ if(!this.filters.id){ @@ -221,7 +235,7 @@ params.branchId=this.userInfo.branchId params.projectId=null; } - if(!this.selProject && this.filters.queryScope!='productId'){ + if(!this.selProject && !this.xmIteration && this.filters.queryScope!='productId'){ if(!this.dateRanger || this.dateRanger.length==0){ this.$message({showClose: true, message: "创建日期范围不能为空", type: 'error' }); return; diff --git a/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkAdd.vue b/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkAdd.vue new file mode 100644 index 00000000..caeb1003 --- /dev/null +++ b/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkAdd.vue @@ -0,0 +1,123 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkEdit.vue b/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkEdit.vue new file mode 100644 index 00000000..d0951ebf --- /dev/null +++ b/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkEdit.vue @@ -0,0 +1,118 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkMng.vue b/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkMng.vue new file mode 100644 index 00000000..da8b07a5 --- /dev/null +++ b/src/views/xm/core/xmProductProjectLink/XmProductProjectLinkMng.vue @@ -0,0 +1,252 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProject/XmProjectForLink.vue b/src/views/xm/core/xmProject/XmProjectForLink.vue new file mode 100644 index 00000000..ab6c29da --- /dev/null +++ b/src/views/xm/core/xmProject/XmProjectForLink.vue @@ -0,0 +1,356 @@ + + + + + \ No newline at end of file diff --git a/src/views/xm/core/xmProject/XmProjectInfo.vue b/src/views/xm/core/xmProject/XmProjectInfo.vue index 5abc4bf1..6bd08dd2 100644 --- a/src/views/xm/core/xmProject/XmProjectInfo.vue +++ b/src/views/xm/core/xmProject/XmProjectInfo.vue @@ -141,9 +141,9 @@ - - - + + + @@ -193,10 +193,10 @@ import xmMenuMng from '../xmMenu/XmMenuMng'; import xmMenuWithPlan from '../xmMenu/XmMenuWithPlan'; import xmProjectStateMng from '../xmProjectState/XmProjectStateMng'; - import xmTestCaseExecMng from '../xmTestCaseExec/XmTestCaseExecMng'; - import xmProductMng from '../xmProduct/XmProductMng'; - import XmIterationComplex from '../xmIteration/XmIterationComplex.vue'; - import XmProjectOveriewComplex from './XmProjectOveriewComplex.vue'; + import xmTestCaseExecMng from '../xmTestCaseExec/XmTestCaseExecMng'; + import XmIterationForProjectComplex from '../xmIteration/XmIterationForProjectComplex.vue'; + import XmProjectOverviewComplex from './XmProjectOverviewComplex.vue'; + import XmProductForProjectComplex from '../xmProduct/XmProductForProjectComplex.vue'; export default { @@ -416,9 +416,9 @@ xmProjectStateMng, xmTestCaseExecMng, xmProjectGroupSelect, - XmIterationComplex, - xmProductMng, - XmProjectOveriewComplex, + XmIterationForProjectComplex, + XmProjectOverviewComplex, + XmProductForProjectComplex, //在下面添加其它组件 }, mounted() { diff --git a/src/views/xm/core/xmProject/XmProjectOveriewComplex.vue b/src/views/xm/core/xmProject/XmProjectOverviewComplex.vue similarity index 100% rename from src/views/xm/core/xmProject/XmProjectOveriewComplex.vue rename to src/views/xm/core/xmProject/XmProjectOverviewComplex.vue diff --git a/src/views/xm/core/xmProjectPhase/XmProjectPhaseMng.vue b/src/views/xm/core/xmProjectPhase/XmProjectPhaseMng.vue index 5c2eeade..f4013df0 100644 --- a/src/views/xm/core/xmProjectPhase/XmProjectPhaseMng.vue +++ b/src/views/xm/core/xmProjectPhase/XmProjectPhaseMng.vue @@ -294,10 +294,9 @@ import XmProjectGroupSelect from '../xmProjectGroup/XmProjectGroupSelect.vue'; } }, - props:['selProject'], + props:['selProject','xmIteration'], watch:{ - selProject:function(selProject,old){ - console.log('this.selProject==', selProject); + selProject:function(selProject,old){ if(!selProject){ this.xmProjectPhases=[] @@ -307,6 +306,9 @@ import XmProjectGroupSelect from '../xmProjectGroup/XmProjectGroupSelect.vue'; this.searchXmProjectPhases(); } } + }, + xmIteration(){ + this.searchXmProjectPhases() } }, data() { @@ -419,6 +421,9 @@ import XmProjectGroupSelect from '../xmProjectGroup/XmProjectGroupSelect.vue'; params.projectId=this.selProject.id } + if(this.xmIteration){ + params.iterationId=this.xmIteration.id + } this.load.list = true; listXmProjectPhase(params).then((res) => { var tips=res.data.tips; diff --git a/src/views/xm/core/xmProjectPhase/XmProjectPhaseSelect.vue b/src/views/xm/core/xmProjectPhase/XmProjectPhaseSelect.vue index a305a106..ccdc3ef6 100644 --- a/src/views/xm/core/xmProjectPhase/XmProjectPhaseSelect.vue +++ b/src/views/xm/core/xmProjectPhase/XmProjectPhaseSelect.vue @@ -49,10 +49,9 @@ }, }, - props:['selProject'], + props:['selProject','xmIteration'], watch:{ - selProject:function(selProject,old){ - console.log('this.selProject==', selProject); + selProject:function(selProject,old){ if(!selProject){ this.xmProjectPhases=[] @@ -62,6 +61,9 @@ this.searchXmProjectPhases(); } } + }, + xmIteration(){ + this.searchXmProjectPhases(); } }, data() { @@ -172,6 +174,10 @@ if(this.selProject!=null && this.selProject!=undefined){ params.projectId=this.selProject.id + } + if(this.xmIteration!=null && this.xmIteration!=undefined){ + params.iterationId=this.xmIteration.id + } this.load.list = true; listXmProjectPhase(params).then((res) => { diff --git a/src/views/xm/core/xmQuestion/XmQuestionMng.vue b/src/views/xm/core/xmQuestion/XmQuestionMng.vue index 531bc631..d9355283 100644 --- a/src/views/xm/core/xmQuestion/XmQuestionMng.vue +++ b/src/views/xm/core/xmQuestion/XmQuestionMng.vue @@ -153,8 +153,8 @@ {{qtype=='risk'?'升级':'升级'}} - - {{scope.row.name}} + + {{scope.row.name}} @@ -213,18 +213,20 @@ 'userInfo','roles' ]), }, - props: ["selProject",'qtype','xmTestCaseExec','xmTestCase','visible'], + props: ["selProject",'qtype','xmTestCaseExec','xmTestCase','xmIteration','xmProduct'], watch:{ selProject:function(selProject){ this.filters.selProject=this.selProject //this.getXmQuestions(); + }, + qtype:function(){ + this.getXmQuestions() }, - visible(visible){ - if(visible==true){ - this.getXmQuestions(); - } - }, - qtype(){ + xmIteration:function(){ + this.getXmQuestions() + }, + xmProduct:function(){ + this.filters.product=this.xmProduct this.getXmQuestions() } }, @@ -449,6 +451,9 @@ if(this.xmTestCase){ params.caseId=this.xmTestCase.id } + if(this.xmIteration){ + params.iterationId=this.xmIteration.id + } if(this.filters.key){ params.key='%'+this.filters.key+'%' @@ -874,7 +879,15 @@ } if(row.handlerUsername){ if(row.lremark){ - msg='已指派给'+row.handlerUsername+','+row.lremark + var lremark=row.lremark; + lremark=lremark.replace(/<\w?>/g,""); + lremark=lremark.replace(/<\/\w?>/g,""); + if(lremark.length<=10){ + msg='已指派给'+row.handlerUsername+','+lremark + }else{ + msg='已指派给'+row.handlerUsername+','+lremark.substr(0,10)+"..." + } + }else{ msg='已指派给'+row.handlerUsername; } @@ -895,6 +908,9 @@ if(this.selProject){ this.filters.selProject=this.selProject } + if(this.xmProduct){ + this.filters.product=this.xmProduct + } this.filters.handlerUserid=this.userInfo.userid; this.filters.handlerUsername=this.userInfo.username; this.$nextTick(() => { @@ -932,4 +948,8 @@ margin-top: 7px; padding-bottom: 10px; } +.badge-item { + margin-top: 10px; + margin-right: 40px; +} diff --git a/src/views/xm/core/xmTask/XmTaskMng.vue b/src/views/xm/core/xmTask/XmTaskMng.vue index 7b6c3b51..a28d0a88 100644 --- a/src/views/xm/core/xmTask/XmTaskMng.vue +++ b/src/views/xm/core/xmTask/XmTaskMng.vue @@ -2,7 +2,7 @@
- + @@ -56,7 +56,7 @@ 直接创建 - + {