Browse Source

新增需求优化

master
陈裕财 4 years ago
parent
commit
57389935ee
  1. 8
      src/components/dateRange/index.vue
  2. 229
      src/views/xm/core/xmMenu/XmMenuAdd.vue
  3. 27
      src/views/xm/core/xmMenu/XmMenuMng.vue

8
src/components/dateRange/index.vue

@ -1,5 +1,5 @@
<template>
<el-date-picker :type="type" :style="styleObj" v-model="dateRange" :value-format="valueFormat" :format="format"
<template>
<el-date-picker :type="type" :style="styleObj" v-model="dateRange" :value-format="valueFormat" :format="format"
unlink-panels unlink-panels
:range-separator="rangeSepaSrator" :range-separator="rangeSepaSrator"
:start-placeholder="startPlaceholder" :start-placeholder="startPlaceholder"
@ -7,7 +7,7 @@
:default-range="[-30,0]" :default-range="[-30,0]"
@change="onDateRangeChange" @change="onDateRangeChange"
:picker-options="pickerOptions" :picker-options="pickerOptions"
></el-date-picker>
></el-date-picker>
</template> </template>
<script> <script>
@ -52,7 +52,7 @@ export default {
styleObj:{ styleObj:{
typeof:Object, typeof:Object,
default:function(){return {'display':'inline'}}
default:function(){return {'display':'block-inline'}}
}, },
endKey: { endKey: {

229
src/views/xm/core/xmMenu/XmMenuAdd.vue

@ -3,7 +3,7 @@
<el-row class="page-main "> <el-row class="page-main ">
<!--新增界面 XmMenu 项目需求表--> <!--新增界面 XmMenu 项目需求表-->
<el-form :model="addForm" label-width="120px" label-position="left" :rules="addFormRules" ref="addForm"> <el-form :model="addForm" label-width="120px" label-position="left" :rules="addFormRules" ref="addForm">
<el-row gutter="10">
<el-row :gutter="10">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="序号名称" prop="seqNo" > <el-form-item label="序号名称" prop="seqNo" >
<template slot="label"> <template slot="label">
@ -49,138 +49,49 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row gutter="10">
<el-col :span="8">
<el-form-item label="需求状态" prop="status">
<el-select style="display:block;width:100px;" v-model="addForm.status">
<el-option v-for="i in this.dicts.menuStatus" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="进度" prop="finishRate">
<el-progress :percentage="addForm.mactRate"></el-progress>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="截止时间" prop="startTime">
<el-date-picker style="width:220px;" type="daterange" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" v-model="dateRanger"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-tabs value="1" >
<el-tab-pane label="基本信息" name="1" >
<el-row> <el-row>
<el-col :span="12">
<el-form-item label="提出人" prop="proposerId">
<el-tag type="text" v-if="addForm.proposerId" closable @close="clearProposer">{{addForm.proposerName}}</el-tag>
<el-button type="text" @click="selectProposer">选提出人</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="提出时间" prop="ctime">
<el-date-picker value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" v-model="addForm.ctime"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="需求类型" prop="dtype" > <el-form-item label="需求类型" prop="dtype" >
<el-select v-model="addForm.dtype"> <el-select v-model="addForm.dtype">
<el-option v-for="i in this.dicts.demandType" :label="i.name" :key="i.id" :value="i.id"></el-option> <el-option v-for="i in this.dicts.demandType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="需求来源" prop="source"> <el-form-item label="需求来源" prop="source">
<el-select v-model="addForm.source"> <el-select v-model="addForm.source">
<el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option> <el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="需求层次" prop="dlvl" > <el-form-item label="需求层次" prop="dlvl" >
<el-select v-model="addForm.dlvl"> <el-select v-model="addForm.dlvl">
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option> <el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优先级" prop="priority" >
<el-select v-model="addForm.priority">
<el-option v-for="i in dicts.priority" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-col>
</el-row> </el-row>
</el-tab-pane>
<el-tab-pane label="概述" name="4">
<el-row>
<el-col :span="8">
<el-form-item label="提出人" prop="proposerId">
<el-tag type="text" v-if="addForm.proposerId" closable @close="clearProposer">{{addForm.proposerName}}</el-tag>
<el-button type="text" @click="selectProposer">选提出人</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="截止时间" prop="startTime">
<date-range type="daterange" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" v-model="addForm" start-key="startTime" end-key="endTime"></date-range>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="需求概述" prop="remark"> <el-form-item label="需求概述" prop="remark">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="addForm.remark" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input> <el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="addForm.remark" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item> </el-form-item>
</el-tab-pane>
<el-tab-pane label="子工作项" name="6">
<xm-work-item>史诗下面是特性特性下面是用户故事故事下面是工作项任务/bug</xm-work-item>
</el-tab-pane>
<el-tab-pane label="工时" name="2">
<el-form-item label="数据收集方式" prop="calcType">
<el-radio v-model="addForm.calcType" label="3" placeholder="下级往上级汇总" :disabled="addForm.ntype==='0'">下级往上级汇总</el-radio>
<el-radio v-model="addForm.calcType" label="1" placeholder="由任务汇总" :disabled="addForm.ntype==='1'">由任务汇总</el-radio>
<el-radio v-model="addForm.calcType" label="2" placeholder="手工填报" :disabled="addForm.ntype==='1'">手工填报</el-radio>
</el-form-item>
<el-form-item label="工时进度" prop="mactRate" >
<el-progress style="width:60%;" :text-inside="true" :stroke-width="15" :percentage="addForm.mactRate?addForm.mactRate:0"></el-progress>
</el-form-item>
<el-form-item label="预估工期" prop="budgetHours">
<el-input-number :disabled="addForm.calcType!=='2' " style="width:200px;" v-model="addForm.budgetHours" :precision="2" :step="8" :min="0" placeholder="预计工期(小时)"></el-input-number> &nbsp;h
</el-form-item>
<el-form-item label="预估工时" prop="budgetWorkload">
<el-input-number :disabled="addForm.calcType!=='2' " style="width:200px;" v-model="addForm.budgetWorkload" :precision="2" :step="8" :min="0" placeholder="预计工时(小时)"></el-input-number> &nbsp;h
</el-form-item>
<el-form-item label="实际工时" prop="mactWorkload">
<el-input-number :disabled="addForm.calcType!=='2' " style="width:200px;" v-model="addForm.mactWorkload" :precision="2" :step="8" :min="0" placeholder="实际工时(小时)"></el-input-number> &nbsp;h
</el-form-item>
<font color="blue" style="font-size:10px;">控制规则:
<br>下级往上汇总指工时数据按 &nbsp;用户故事->特性->史诗 &nbsp;这样的汇总关系将数据逐级往上汇总
<br>由任务汇总 指用户故事的工时数据由任务汇总
<br>手工填报 指用户故事的工时数据来自手工填报无论是否关联了任务都不从任务汇总
</font>
</el-tab-pane>
<el-tab-pane label="成本" name="3">
<el-form-item label="预估金额" prop="budgetAmount">
<el-input-number :disabled="addForm.calcType!=='2' " style="width:200px;" v-model="addForm.budgetAmount" :precision="2" :step="100" :min="0" placeholder="预算金额"></el-input-number>
</el-form-item>
<el-form-item label="实际金额" prop="mactAmount">
<el-input-number :disabled="addForm.calcType!=='2' " style="width:200px;" v-model="addForm.mactAmount" :precision="2" :step="100" :min="0" placeholder="实际金额"></el-input-number>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="链接" name="5">
<el-form-item label="需求链接" prop="demandUrl">
<el-input v-model="addForm.demandUrl" placeholder="需求链接" ></el-input>
</el-form-item>
<el-form-item label="代码链接" prop="codeUrl">
<el-input v-model="addForm.codeUrl" placeholder="代码链接" ></el-input>
</el-form-item>
<el-form-item label="设计链接" prop="designUrl">
<el-input v-model="addForm.designUrl" placeholder="设计链接" ></el-input>
</el-form-item>
<el-form-item label="操作手册链接" prop="operDocUrl">
<el-input v-model="addForm.operDocUrl" placeholder="操作手册链接" ></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="wiki" name="7">
关联知识库
</el-tab-pane>
<el-tab-pane label="附件" name="8">
上传附件
</el-tab-pane>
</el-tabs>
</el-row>
</el-form> </el-form>
<el-drawer title="选择提出人" :visible.sync="proposerSelectVisible" size="60%" append-to-body> <el-drawer title="选择提出人" :visible.sync="proposerSelectVisible" size="60%" append-to-body>
@ -214,7 +125,7 @@
]), ]),
calcMenuLabel(){ calcMenuLabel(){
var params={label:'工作项',icon:'',color:''};
var params={label:'用户故事',icon:'el-icon-document',color:' rgb(79, 140, 255)'};
if(this.addForm.dclass==='1'){ if(this.addForm.dclass==='1'){
params={label:'史诗',icon:'el-icon-s-promotion',color:'rgb(255, 153, 51)'}; params={label:'史诗',icon:'el-icon-s-promotion',color:'rgb(255, 153, 51)'};
}else if(this.addForm.dclass==='2'){ }else if(this.addForm.dclass==='2'){
@ -229,31 +140,7 @@
watch: { watch: {
'visible':function(visible) { 'visible':function(visible) {
if(visible==true){ if(visible==true){
this.addForm={...this.xmMenu}
if(this.parentMenu && this.parentMenu.menuId){
if(this.parentMenu.childrenCnt){
this.addForm.seqNo=this.parentMenu.seqNo+"."+(this.parentMenu.childrenCnt+1)
}else{
this.addForm.seqNo=this.parentMenu.seqNo+"."+1
}
this.addForm.pmenuId=this.parentMenu.menuId
this.addForm.pmenuName=this.parentMenu.menuName
if(this.parentMenu.dclass==='3'){
this.addForm.dclass='4'
}else if(this.parentMenu.dclass==='2'){
this.addForm.dclass='3'
}else if(this.parentMenu.dclass==='1'){
this.addForm.dclass='2'
}else if(this.parentMenu.dclass==='0'){
this.addForm.dclass='1'
}
}else{
this.addForm.dclass=this.xmMenu.dclass
}
this.addForm.mmUserid=this.userInfo.userid
this.addForm.mmUsername=this.userInfo.username
this.initData();
} }
} }
}, },
@ -277,8 +164,8 @@
}, },
// //
addForm: { addForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',seqNo:'1',mmUserid:'',mmUsername:'',ntype:'0',childrenCnt:0,sinceVersion:'',
proposerId:'',proposerName:'',dlvl:'',dtype:'',priority:'',source:''
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'0',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',seqNo:'1',mmUserid:'',mmUsername:'',ntype:'0',childrenCnt:0,sinceVersion:'',
proposerId:'',proposerName:'',dlvl:'0',dtype:'0',priority:'0',source:'1'
}, },
proposerSelectVisible:false, proposerSelectVisible:false,
mmUserSelectVisible:false, mmUserSelectVisible:false,
@ -370,7 +257,38 @@
} }
}, },
/**end 在上面加自定义方法**/ /**end 在上面加自定义方法**/
initData(){
Object.assign(this.addForm, this.xmMenu);
this.addForm.mmUserid=this.userInfo.userid
this.addForm.mmUsername=this.userInfo.username
this.addForm.remark="作为 ,我需要 ,以便我能够 。"
if(this.parentMenu){
if(this.parentMenu.childrenCnt){
this.addForm.seqNo=this.parentMenu.seqNo+"."+(this.parentMenu.childrenCnt+1)
}else{
this.addForm.seqNo=this.parentMenu.seqNo+"."+1
}
this.addForm.pmenuId=this.parentMenu.menuId
this.addForm.pmenuName=this.parentMenu.menuName
this.addForm.menuName=this.parentMenu.menuName+'-请修改补充'
if(this.parentMenu.dclass==='3'){
this.addForm.dclass='4'
}else if(this.parentMenu.dclass==='2'){
this.addForm.dclass='3'
}else if(this.parentMenu.dclass==='1'){
this.addForm.dclass='2'
}else if(this.parentMenu.dclass==='0'){
this.addForm.dclass='1'
}
if(this.addForm.dclass<3){
this.addForm.calcType="3"
}else{
this.addForm.calcType="1"
}
}
}
},//end method },//end method
components: { components: {
// 'xm-menu-edit':XmMenuEdit // 'xm-menu-edit':XmMenuEdit
@ -381,34 +299,9 @@
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{ initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data; this.dicts=res.data.data;
}) })
this.addForm=Object.assign(this.addForm, this.xmMenu);
this.addForm.mmUserid=this.userInfo.userid
this.addForm.mmUsername=this.userInfo.username
this.addForm.remark="作为 ,我需要 ,以便我能够 。"
if(this.parentMenu){
if(this.parentMenu.childrenCnt){
this.addForm.seqNo=this.parentMenu.seqNo+"."+(this.parentMenu.childrenCnt+1)
}else{
this.addForm.seqNo=this.parentMenu.seqNo+"."+1
}
this.addForm.pmenuId=this.parentMenu.menuId
this.addForm.pmenuName=this.parentMenu.menuName
if(this.parentMenu.dclass==='3'){
this.addForm.dclass='4'
}else if(this.parentMenu.dclass==='2'){
this.addForm.dclass='3'
}else if(this.parentMenu.dclass==='1'){
this.addForm.dclass='2'
}else if(this.parentMenu.dclass==='0'){
this.addForm.dclass='1'
}
if(this.addForm.dclass<3){
this.addForm.calcType="3"
}else{
this.addForm.calcType="1"
}
}
this.initData()
/**在下面写其它函数***/ /**在下面写其它函数***/
}//end mounted }//end mounted

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

@ -125,6 +125,19 @@
<el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.menuStatus" :key="index"></el-option> <el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.menuStatus" :key="index"></el-option>
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="24" style="padding-top:5px;" >
<font class="more-label-font">
需求编号:
</font>
<el-input v-model="filters.menuId" style="width: 220px;" placeholder="需求编号查询" clearable></el-input>
</el-col>
<el-col :span="24" style="padding-top:5px;" >
<font class="more-label-font">
产品编号:
</font>
<el-input v-model="filters.productId" style="width: 220px;" placeholder="产品编号查询" clearable></el-input>
</el-col>
<el-col :span="24" style="padding-top:5px;"> <el-col :span="24" style="padding-top:5px;">
<el-button type="primary" @click="searchXmMenus" icon="el-icon-search">查询</el-button> <el-button type="primary" @click="searchXmMenus" icon="el-icon-search">查询</el-button>
</el-col> </el-col>
@ -476,6 +489,8 @@
priority:'', priority:'',
source:'', source:'',
dclasss:[], dclasss:[],
menuId:'',//
productId:'',//
}, },
xmMenus: [],// xmMenus: [],//
pageInfo:{// pageInfo:{//
@ -508,15 +523,15 @@
addFormVisible: false,//xmMenu addFormVisible: false,//xmMenu
//xmMenu //xmMenu
addForm: { addForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',ntype:'0',childrenCnt:0,sinceVersion:''
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'0',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',ntype:'0',childrenCnt:0,sinceVersion:'',proposerId:'',proposerName:'',dlvl:'0',dtype:'0',priority:'0',source:'1'
}, },
addFormInit: { addFormInit: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',ntype:'0',childrenCnt:0,sinceVersion:''
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',ntype:'0',childrenCnt:0,sinceVersion:'',proposerId:'',proposerName:'',dlvl:'0',dtype:'0',priority:'0',source:'1'
}, },
editFormVisible: false,// editFormVisible: false,//
//xmMenu //xmMenu
editForm: { editForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',ntype:'0',childrenCnt:0,sinceVersion:''
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',ntype:'0',childrenCnt:0,sinceVersion:'',proposerId:'',proposerName:'',dlvl:'0',dtype:'0',priority:'0',source:'1'
}, },
parentMenu:null, parentMenu:null,
menuTemplateVisible:false, menuTemplateVisible:false,
@ -649,6 +664,12 @@
if(this.filters.dclasss){ if(this.filters.dclasss){
params.dclasss=this.filters.dclasss params.dclasss=this.filters.dclasss
} }
if(this.filters.menuId){
params.menuId=this.filters.menuId
}
if(this.filters.productId){
params.productId=this.filters.productId
}
return params; return params;
}, },
loadXmMenusLazy(tree, treeNode, resolve) { loadXmMenusLazy(tree, treeNode, resolve) {

Loading…
Cancel
Save