Browse Source

优化

master
陈裕财 4 years ago
parent
commit
da68c65a43
  1. 46
      src/views/xm/core/xmMenu/XmMenuEdit.vue
  2. 0
      src/views/xm/core/xmMenuWorkItem/XmSubBugList.vue
  3. 0
      src/views/xm/core/xmMenuWorkItem/XmSubMenuList.vue
  4. 10
      src/views/xm/core/xmMenuWorkItem/XmSubTaskList.vue
  5. 0
      src/views/xm/core/xmMenuWorkItem/XmSubWorkItem.vue
  6. 56
      src/views/xm/core/xmTask/XmTaskEdit.vue
  7. 2
      src/views/xm/core/xmTask/XmTaskMng.vue
  8. 391
      src/views/xm/core/xmTaskWorkItem/XmSubTaskList.vue
  9. 94
      src/views/xm/core/xmTaskWorkItem/XmSubWorkItem.vue
  10. 26
      src/views/xm/core/xmTaskWorkload/XmTaskWorkloadRecord.vue

46
src/views/xm/core/xmMenu/XmMenuEdit.vue

@ -131,11 +131,7 @@
<xm-sub-work-item :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item> <xm-sub-work-item :parent-xm-menu="editForm" :link-project-id="selProject?selProject.id:null" @sub-work-item-num="setSubWorkItemNum" @add-sub-menu="onAddSubMenu"></xm-sub-work-item>
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="'工时('+editForm.mactWorkload+' h)'" name="2"> <el-tab-pane :label="'工时('+editForm.mactWorkload+' h)'" name="2">
<el-form-item label="数据收集方式" prop="calcType">
<el-radio v-model="editForm.calcType" label="3" placeholder="下级往上级汇总" :disabled="editForm.ntype==='0'">下级往上级汇总</el-radio>
<el-radio v-model="editForm.calcType" label="1" placeholder="由任务汇总" :disabled="editForm.ntype==='1'">由任务汇总</el-radio>
<el-radio v-model="editForm.calcType" label="2" placeholder="手工填报" :disabled="editForm.ntype==='1'">手工填报</el-radio>
</el-form-item>
<el-form-item label="工时进度" prop="mactRate" > <el-form-item label="工时进度" prop="mactRate" >
<el-progress style="width:60%;" :text-inside="true" :stroke-width="15" :percentage="editForm.mactRate?editForm.mactRate:0"></el-progress> <el-progress style="width:60%;" :text-inside="true" :stroke-width="15" :percentage="editForm.mactRate?editForm.mactRate:0"></el-progress>
</el-form-item> </el-form-item>
@ -147,13 +143,7 @@
</el-form-item> </el-form-item>
<el-form-item label="实际工时" prop="mactWorkload"> <el-form-item label="实际工时" prop="mactWorkload">
<el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.mactWorkload" :precision="2" :step="8" :min="0" placeholder="实际工时(小时)"></el-input-number> &nbsp;h <el-input-number :disabled="editForm.calcType!=='2' " style="width:200px;" v-model="editForm.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-form-item>
<el-row class="padding"> <el-row class="padding">
<el-button v-loading="load.edit" type="primary" @click.native="editXmMenuSomeFields(editForm,'workload',{mactWorkload:editForm.mactWorkload,budgetWorkload:editForm.budgetWorkload,mactRate:editForm.mactRate,budgetHours:editForm.budgetHours})" :disabled="load.edit==true">提交</el-button> <el-button v-loading="load.edit" type="primary" @click.native="editXmMenuSomeFields(editForm,'workload',{mactWorkload:editForm.mactWorkload,budgetWorkload:editForm.budgetWorkload,mactRate:editForm.mactRate,budgetHours:editForm.budgetHours})" :disabled="load.edit==true">提交</el-button>
</el-row> </el-row>
@ -217,13 +207,13 @@
<script> <script>
import util from '@/common/js/util';// import util from '@/common/js/util';//
import { initSimpleDicts } from '@/api/mdp/meta/item';// import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmMenu,editXmMenuSomeFields } from '@/api/xm/core/xmMenu';
import {listXmMenuWithState,editXmMenu,editXmMenuSomeFields } from '@/api/xm/core/xmMenu';
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect"; import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmMenuOverview from './XmMenuOverview.vue'; import XmMenuOverview from './XmMenuOverview.vue';
import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue'; import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
import TagMng from "@/views/mdp/arc/tag/TagMng"; import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmSubWorkItem from "@/views/xm/core/xmWorkItem/XmSubWorkItem";
import XmSubWorkItem from "@/views/xm/core/xmMenuWorkItem/XmSubWorkItem";
export default { export default {
computed: { computed: {
@ -255,17 +245,21 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
return params; return params;
}, },
}, },
props:['xmMenu','visible','parentMenu','product','dclass','selProject'],
props:['xmMenu','visible','parentMenu','product','dclass','selProject','reload'],
watch: { watch: {
'xmMenu':function( xmMenu ) { 'xmMenu':function( xmMenu ) {
this.editForm = xmMenu; this.editForm = xmMenu;
}, },
'visible':function(visible) { 'visible':function(visible) {
if(visible==true){ if(visible==true){
if(this.editForm.startTime && this.editForm.endTime){ if(this.editForm.startTime && this.editForm.endTime){
this.dateRanger.push(this.editForm.startTime) this.dateRanger.push(this.editForm.startTime)
this.dateRanger.push(this.editForm.endTime) this.dateRanger.push(this.editForm.endTime)
} }
if(this.reload==true){
this.searchXmMenus();
}
} }
}, },
'editForm.mactWorkload':function(val,oldVal){ 'editForm.mactWorkload':function(val,oldVal){
@ -474,6 +468,25 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
onAddSubMenu(menu){ onAddSubMenu(menu){
debugger; debugger;
this.$emit("add-sub-menu",menu) this.$emit("add-sub-menu",menu)
},
searchXmMenus(){
let callback= (res)=>{
var tips=res.data.tips;
if(tips.isOk){
this.editForm=res.data.data[0]
if(this.editForm.startTime && this.editForm.endTime){
this.dateRanger=[]
this.dateRanger.push(this.editForm.startTime)
this.dateRanger.push(this.editForm.endTime)
}
}else{
this.$notify({showClose: true, message: tips.msg, type: 'error' });
}
this.load.list = false;
}
this.load.list = true;
var params={menuId:this.xmMenu.menuId}
listXmMenuWithState(params).then( callback ).catch( err => this.load.list = false );
} }
},//end method },//end method
components: { components: {
@ -495,6 +508,9 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
this.dateRanger.push(this.editForm.startTime) this.dateRanger.push(this.editForm.startTime)
this.dateRanger.push(this.editForm.endTime) this.dateRanger.push(this.editForm.endTime)
} }
if(this.reload==true){
this.searchXmMenus();
}
/**在下面写其它函数***/ /**在下面写其它函数***/
}//end mounted }//end mounted

src/views/xm/core/xmWorkItem/XmSubBugList.vue → src/views/xm/core/xmMenuWorkItem/XmSubBugList.vue

src/views/xm/core/xmWorkItem/XmSubMenuList.vue → src/views/xm/core/xmMenuWorkItem/XmSubMenuList.vue

src/views/xm/core/xmWorkItem/XmSubTaskList.vue → src/views/xm/core/xmMenuWorkItem/XmSubTaskList.vue

src/views/xm/core/xmWorkItem/XmSubWorkItem.vue → src/views/xm/core/xmMenuWorkItem/XmSubWorkItem.vue

56
src/views/xm/core/xmTask/XmTaskEdit.vue

@ -164,43 +164,11 @@
</el-col> </el-col>
</el-row> </el-row>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="子工作项" name="4" v-if="editForm.ntype==='1'">
<el-tab-pane :label="'子工作项('+subWorkItemNum+')'" name="4" v-if="editForm.ntype==='1'">
<xm-sub-work-item :parent-xm-task="editForm" @sub-work-item-num="setSubWorkItemNum" @add-sub-task="onAddSubTask"></xm-sub-work-item>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="工时" name="5"> <el-tab-pane label="工时" name="5">
<el-row>
<el-col :span="8">
<el-form-item label="报工方式" prop="wtype" >
<el-select v-model="editForm.wtype">
<el-option label="无须报工" value="0"></el-option>
<el-option label="强制每日报工" value="1"></el-option>
<el-option label="工期内报工" value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工时进度" prop="rate" >
<el-progress style="width:60%;" :text-inside="true" :stroke-width="15" :percentage="editForm.rate?editForm.rate:0"></el-progress>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="预估工作量" prop="budgetWorkload">
<el-input type="number" style="width:150px;" v-model="editForm.budgetWorkload" @change="onBudgetWorkloadChange" :precision="2" :step="8" :min="0" placeholder="预计总工作量(人时,不包括下一级)"></el-input type="number"> <el-tag>h</el-tag>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="完工时间" prop="actEndTime">
<el-date-picker style="display:inline;" type="daterange" unlink-panels value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd" v-model="actDateRanger"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实际工作量" prop="actWorkload">
<el-input type="number" style="width:150px;" v-model="editForm.actWorkload" @change="onActWorkloadChange" :precision="2" :step="8" :min="0" placeholder="实际总工作量(人时,不包括下一级)"></el-input type="number"> <el-tag>h</el-tag>
</el-form-item>
</el-col>
</el-row>
<xm-task-workload-record :xm-task="editForm"></xm-task-workload-record>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="成本" name="6"> <el-tab-pane label="成本" name="6">
<el-form-item label="预估金额" prop="budgetCost"> <el-form-item label="预估金额" prop="budgetCost">
@ -273,9 +241,9 @@
<xm-execuser-mng :visible="execUserVisible" :xm-task="editForm" @after-add-submit="afterAddExecSubmit" @after-edit-submit="afterEditExecSubmit" @after-delete-submit="afterEditExecSubmit" ref="execuserMng"></xm-execuser-mng> <xm-execuser-mng :visible="execUserVisible" :xm-task="editForm" @after-add-submit="afterAddExecSubmit" @after-edit-submit="afterEditExecSubmit" @after-delete-submit="afterEditExecSubmit" ref="execuserMng"></xm-execuser-mng>
</el-drawer> </el-drawer>
<el-drawer append-to-body title="需求明细" :visible.sync="menuDetailVisible" size="80%" :close-on-click-modal="false">
<xm-menu-rich-detail :visible="menuDetailVisible" :reload="true" :xm-menu="{menuId:editForm.menuId,menuName:editForm.menuName}" ></xm-menu-rich-detail>
</el-drawer>
<el-dialog append-to-body title="需求明细" :visible.sync="menuDetailVisible" width="80%" top="20px" :close-on-click-modal="false">
<xm-menu-edit :visible="menuDetailVisible" :reload="true" :xm-menu="{menuId:editForm.menuId,menuName:editForm.menuName}" ></xm-menu-edit>
</el-dialog>
<el-drawer append-to-body title="标签" :visible.sync="tagSelectVisible" size="60%"> <el-drawer append-to-body title="标签" :visible.sync="tagSelectVisible" size="60%">
<tag-mng :tagIds="editForm.tagIds?editForm.tagIds.split(','):[]" :jump="true" @select-confirm="onTagSelected"> <tag-mng :tagIds="editForm.tagIds?editForm.tagIds.split(','):[]" :jump="true" @select-confirm="onTagSelected">
@ -300,6 +268,9 @@
import XmMenuRichDetail from '../xmMenu/XmMenuRichDetail'; import XmMenuRichDetail from '../xmMenu/XmMenuRichDetail';
import TagMng from "@/views/mdp/arc/tag/TagMng"; import TagMng from "@/views/mdp/arc/tag/TagMng";
import XmSubWorkItem from "@/views/xm/core/xmTaskWorkItem/XmSubWorkItem";
import XmTaskWorkloadRecord from "../xmTaskWorkload/XmTaskWorkloadRecord"
import XmMenuEdit from '../xmMenu/XmMenuEdit.vue';
export default { export default {
computed: { computed: {
...mapGetters([ ...mapGetters([
@ -406,10 +377,14 @@
], ],
pickerOptions: util.pickerOptions('datarange'), pickerOptions: util.pickerOptions('datarange'),
tagSelectVisible:false, tagSelectVisible:false,
subWorkItemNum:0,
/**end 在上面加自定义属性**/ /**end 在上面加自定义属性**/
}//end return }//end return
},//end data },//end data
methods: { methods: {
setSubWorkItemNum(val){
this.subWorkItemNum=val;
},
// @cancel="editFormVisible=false" // @cancel="editFormVisible=false"
handleCancel:function(){ handleCancel:function(){
this.$emit('cancel'); this.$emit('cancel');
@ -637,10 +612,13 @@
this.editForm.tagNames="" this.editForm.tagNames=""
} }
}, },
onAddSubTask(val){
}
},//end method },//end method
components: { components: {
xmSkillMng, xmSkillMng,
skillMng,xmMenuSelect,XmTaskList,XmExecuserMng,XmGroupSelect,XmMenuRichDetail,TagMng,
skillMng,xmMenuSelect,XmTaskList,XmExecuserMng,XmGroupSelect,XmMenuRichDetail,TagMng,XmSubWorkItem,XmTaskWorkloadRecord,XmMenuEdit,
// 'xm-task-edit':XmTaskEdit // 'xm-task-edit':XmTaskEdit
}, },
mounted() { mounted() {

2
src/views/xm/core/xmTask/XmTaskMng.vue

@ -395,7 +395,7 @@
:tree-props="{ children: 'children', hasChildren: 'childrenCnt' }" :tree-props="{ children: 'children', hasChildren: 'childrenCnt' }"
row-key="id" row-key="id"
ref="table" ref="table"
row-style="height:60px;"
:row-style="{height:'60px'}"
> >
<el-table-column <el-table-column
label="全选" label="全选"

391
src/views/xm/core/xmTaskWorkItem/XmSubTaskList.vue

@ -0,0 +1,391 @@
<template>
<el-row v-show="xmTasks.length>0">
<el-row>
<span style="float:right;">
<el-button @click="batchDel" type="danger" icon="el-icon-delete" plain></el-button>
</span>
</el-row>
<el-row>
<el-table :data="xmTasks" :max-height="400" v-loading="load.list" @selection-change="selsChange" @row-click="rowClick">
<el-table-column type="selection" label="全选"></el-table-column>
<el-table-column prop="name" label="名称">
<template slot-scope="scope">
<div class="icon" :style="{backgroundColor: scope.row.ntype==='1'?'#E6A23C':'#409EFF'}">
<i :class="scope.row.ntype==='1'?'el-icon-odometer':'el-icon-s-operation'" ></i>
</div> {{scope.row.name}}
</template>
</el-table-column>
<el-table-column
label="状态"
type="taskState"
width="100"
>
<template slot-scope="scope">
<div class="cell-text">
<el-button style="display:block;" :type="item.className" plain round v-for="(item,index) in formatterTaskStateDicts(scope.row.taskState)" :key="index">{{item.name}}</el-button>
</div>
<span class="cell-bar">
<el-select v-model="scope.row.taskState" placeholder="任务状态" style="display:block;" @change="editXmTaskSomeFields(scope.row,'taskState',$event)">
<el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.taskState" :key="index"></el-option>
</el-select>
</span>
</template>
</el-table-column>
<el-table-column prop="budgetWorkload" label="工时" width="100">
<template slot-scope="scope">
<div class="cell-text">
<span title="实际工时 / 预估工时 " >{{scope.row.actWorkload>0?scope.row.actWorkload:0}}&nbsp;/&nbsp;{{scope.row.budgetWorkload>0?scope.row.budgetWorkload:0}}</span>
</div>
<span class="cell-bar">
<el-button @click="workloadRecord(scope.row)">登记工时</el-button>
</span>
</template>
</el-table-column>
<el-table-column
label="优先级"
type="level"
width="100"
>
<template slot-scope="scope">
<div class="cell-text">
<el-button style="display:block;" :type="item.className" plain round v-for="(item,index) in formatterPriorityDicts(scope.row.level)" :key="index">{{item.name}}</el-button>
</div>
<span class="cell-bar">
<el-select v-model="scope.row.level" placeholder="优先级" style="display:block;" @change="editXmTaskSomeFields(scope.row,'level',$event)">
<el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.priority" :key="index"></el-option>
</el-select>
</span>
</template>
</el-table-column>
<el-table-column
sortable
prop="createUsername"
label="负责人"
width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<div class="cell-text">
{{scope.row.createUsername}}
</div>
<span class="cell-bar">
<el-button @click="$refs.xmGroupDialog.open({data:scope.row,action:'createUserid'})">选负责人</el-button>
</span>
</template>
</el-table-column>
</el-table>
</el-row>
<xm-group-dialog ref="xmGroupDialog" :isSelectSingleUser="true" :sel-project="linkProjectId?{id:linkProjectId}:null" :xm-product="parentXmTask?{id:parentXmTask.productId}:null" @user-confirm="selectCreateUserConfirm">
</xm-group-dialog>
<xm-task-workload-record-dialog ref="workloadRecordDialog" @submi="afterWorkloadSubmit" @edit-xm-task-some-fields="onEditXmTaskSomeFields" @submit="onWorkloadSubmit"></xm-task-workload-record-dialog>
</el-row>
</template>
<script>
import Vue from "vue";
import util from "@/common/js/util"; //
import treeTool from "@/common/js/treeTool"; //
import { initSimpleDicts } from '@/api/mdp/meta/item'; //
import { listXmTask ,addTask,editXmTaskSomeFields,batchDelXmTask } from '@/api/xm/core/xmTask';
import XmGroupDialog from '@/views/xm/core/xmGroup/XmGroupDialog';//
import { mapGetters } from 'vuex'
import XmTaskWorkloadRecordDialog from '../xmTaskWorkload/XmTaskWorkloadRecordDialog.vue';
export default {
computed: {
...mapGetters(["userInfo", "roles"]),
calcMenuLabel(){
var params={label:'工作项',icon:'',color:''};
if(this.parentXmTask.dclass==='0'){
params={label:'史诗',icon:'el-icon-s-promotion',color:'rgb(255, 153, 51)'};
}else if(this.parentXmTask.dclass==='1'){
params={label:'特性',icon:'el-icon-s-flag',color:'rgb(0, 153, 51)'};
}else if(this.parentXmTask.dclass==='2'){
params={label:'故事',icon:'el-icon-document',color:' rgb(79, 140, 255)'};
}
return params;
},
},
props: [
'parentXmTask','linkProjectId'
],
watch: {
'parentXmTask.id':function(){
this.initData();
},
'xmTasks':function(){
this.$emit("tasks-change",this.xmTasks)
}
},
data() {
return{
load:{edit:false,list:false,add:false,del:false,},
xmTasks:[],
editForm:{},
sels:[],
dicts: {
priority: [],
taskType: [],
planType: [],
priority: [],
xmTaskSettleSchemel: [],
taskState:[],
}, // params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
}
}, //end data
methods: {
//xmTask
selsChange: function (sels) {
this.sels = sels;
},
getXmTasks(){
listXmTask({parentTaskid:this.parentXmTask.id}).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
this.xmTasks=res.data.data
}else{
this.xmTasks=[];
}
})
},
workloadRecord(row){
this.editForm=row
this.$refs.workloadRecordDialog.open(row)
},
initData(){
this.xmTasks=[]
if(!this.parentXmTask || !this.parentXmTask.menuId){
return;
}
var dclass=this.parentXmTask.dclass;
if(dclass==='3'){
this.getXmTasks();
}
},
addXmTask(name){
var task={...this.parentXmTask,name:name,id:null,parentTaskid:this.parentXmTask.id,parentTaskname:this.parentXmTask.name}
task.priority='3'
task.verNum=this.parentXmTask.sinceVersion;
task.pverNum=this.parentXmTask.sinceVersion;
task.askUserid=this.userInfo.userid
task.askUsername=this.userInfo.username
task.qtype="1"
task.ntype=this.ntype
task.ptype="0"
task.id=null;
task.name=name
addTask(task).then((res) => {
this.load.edit=false
var tips=res.data.tips;
if(tips.isOk){
this.$emit('submit',res.data.data);// @submit="afterAddSubmit"
this.xmTasks.push(res.data.data)
}
this.$notify({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.edit=false);
},
showAdd(ntype) {
this.ntype=ntype;
this.$prompt('请输入'+(ntype==='0'?'子任务':'子计划')+'标题', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(({ value }) => {
this.addXmTask(value);
}).catch(() => {
});
},
//
selectCreateUserConfirm(groupUsers,option) {
if(option && option.action==='createUserid'){
if (groupUsers && groupUsers.length > 0) {
var user= groupUsers[0];
this.editXmTaskSomeFields(option.data,option.action,user)
}
}
},
editXmTaskSomeFields(row,fieldName,$event){
var params={ids:[row.id]};
if(this.sels.length>0){
if(!this.sels.some(k=>k.id==row.id)){
this.$notify({showClose:true,message:'请操作选中的行或者取消选中的行再操作其它行',type:'warning'})
return;
}
params.ids=this.sels.map(i=>i.id)
}
if(fieldName==='menuId'){
if($event){
params[fieldName]=$event.menuId;
params.menuName=$event.menuName
params.productId=$event.productId
}else{
return;
}
}else if(fieldName==='tagIds'){
if($event){
params[fieldName]=$event.map(i=>i.tagId).join(",");
params.tagNames=$event.map(i=>i.tagName).join(",");
}else{
return;
}
}else if(fieldName==='workload'){
params={...params,...$event}
}else if(fieldName==='executorUserid'){
params.executorUserid=$event[0].userid
params.executorUsername=$event[0].username
}else if(fieldName==='createUserid'){
params.createUserid=$event[0].userid
params.createUsername=$event[0].username
}else{
params[fieldName]=$event
}
editXmTaskSomeFields(params).then(res=>{
var tips = res.data.tips;
if(tips.isOk){
if(this.sels.length>0){
this.sels.forEach(i=>{
this.fieldTagVisible=false;
Object.assign(i,params)
})
}else{
Object.assign(row,params)
}
}else{
this.$notify({showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
}
})
},
//xmTask
batchDel: function () {
if(this.sels.length==0){
this.$notify.warning("请先选中要删除的记录")
return;
}
this.$confirm("确认删除选中记录吗?", "提示", {
type: "warning",
}).then(() => {
this.load.del = true;
batchDelXmTask(this.sels)
.then((res) => {
this.load.del = false;
var tips = res.data.tips;
if (tips.isOk) {
this.getXmTasks()
}
this.$notify({
showClose: true,
message: tips.msg,
type: tips.isOk ? "success" : "error",
});
})
.catch((err) => (this.load.del = false));
});
},
rowClick: function (row) {
this.editForm = row;
// this.$emit('row-click',row,);// @row-click="rowClick"
},
formatterPriorityDicts(cellValue){
if(!cellValue && cellValue!=='0'){
return []
}
var key="priority";
if(this.dicts[key]==undefined || this.dicts[key]==null || this.dicts[key].length==0 ){
return [{id:cellValue,name:cellValue,className:'primary'}];
}
var list=this.dicts[key].filter(i=>i.id==cellValue)
if(list.length>0){
var data= {...list[0],className:'primary'}
if(data.id=='0'){
data.className='danger'
}else if(data.id=='1'){
data.className='warning'
}else if(data.id=='2'){
data.className='success'
}else if(data.id=='3'){
data.className='primary'
}else if(data.id=='4'){
data.className='info'
}else{
data.className='primary'
}
return [data];
}else{
return [{id:cellValue,name:cellValue,className:'primary'}]
}
},
formatterTaskStateDicts: function(cellValue){
if(!cellValue && cellValue!=='0'){
return []
}
var key="taskState";
if(this.dicts[key]==undefined || this.dicts[key]==null || this.dicts[key].length==0 ){
return [{id:cellValue,name:cellValue,className:'primary'}];
}
var list=this.dicts[key].filter(i=>i.id==cellValue)
if(list.length>0){
var data= {...list[0],className:'primary'}
if(data.id=='0'){
data.className='primary'
}else if(data.id=='1'){
data.className='warning'
}else if(data.id=='2'){
data.className='success'
}else if(data.id=='3'){
data.className='info'
} else{
data.className='danger'
}
return [data];
}else{
return [{id:cellValue,name:cellValue,className:'primary'}]
}
},
afterWorkloadSubmit(xmTask){
},
onEditXmTaskSomeFields(data){
debugger;
Object.assign(this.editForm,data)
this.$emit('edit-xm-task-some-fields',data);
},
onWorkloadSubmit(data){
Object.assign(this.editForm,data)
this.$emit('workload-submit',data)
}
}, //end methods
components: {
XmTaskWorkloadRecordDialog,XmGroupDialog,
},
mounted() {
this.initData();
initSimpleDicts( "all", ["planType","taskType","priority","xmTaskSettleSchemel","priority","taskState" ]).then((res) => {
this.dicts = res.data.data;
});
},
};
</script>
<style scoped>
</style>

94
src/views/xm/core/xmTaskWorkItem/XmSubWorkItem.vue

@ -0,0 +1,94 @@
<template>
<section class="padding">
<el-row>
<font>{{subWorkItemNum}}个子工作项</font>
<span style="float:right;">
<el-button v-if="parentXmTask.ntype==='1'" icon="el-icon-plus" @click="showAdd('1')">
<div class="icon" style="background-color: #E6A23C;">
<i class="el-icon-odometer"></i>
</div>
添加子计划
</el-button>
<el-button icon="el-icon-plus" @click="showAdd('0')">
<div class="icon" style="background-color: #409EFF;">
<i class="el-icon-s-operation"></i>
</div>
添加任务</el-button>
</span>
</el-row>
<xm-sub-task-list ref="taskList" :parentXmTask="parentXmTask" @tasks-change="onTasksChange" @workload-submit="onWorkloadSubmit"></xm-sub-task-list>
</section>
</template>
<script>
import Vue from "vue";
import util from "@/common/js/util"; //
import treeTool from "@/common/js/treeTool"; //
import { initSimpleDicts } from '@/api/mdp/meta/item'; //
import { mapGetters } from 'vuex'
import XmSubTaskList from './XmSubTaskList.vue'
export default {
computed: {
...mapGetters(["userInfo", "roles"]),
calcMenuLabel(){
var params={label:'工作项',icon:'',color:''};
if(this.parentXmTask.ntype==='0'){
params={label:'计划',icon:'el-icon-odometer',color:'#E6A23C'};
}else if(this.parentXmTask.ntype==='1'){
params={label:'任务',icon:'el-icon-s-operation',color:'#409EFF'};
}
return params;
},
subWorkItemNum(){
var num= this.xmTasks.length;
this.$emit('sub-work-item-num',num);
return num;
}
},
props: [
'parentXmTask','linkProductId'
],
watch: {
'parentXmTask.id':function(){
this.initData();
}
},
data() {
return{
load:{edit:false,list:false,add:false},
xmTasks:[],
}
}, //end data
methods: {
initData(){
this.xmTasks=[]
},
showAdd(ntype) {
this.$refs.taskList.showAdd(ntype);
},
onTasksChange(tasks){
this.xmTasks=tasks
},
onWorkloadSubmit(xmTask){
this.$emit('workload-submit',xmTask)
}
/**end 自定义函数请在上面加**/
}, //end methods
components: {
XmSubTaskList
},
mounted() {
this.initData();
},
};
</script>
<style scoped>
</style>

26
src/views/xm/core/xmTaskWorkload/XmTaskWorkloadRecord.vue

@ -5,7 +5,7 @@
<el-row class="page-main" ref="table"> <el-row class="page-main" ref="table">
<!--编辑界面 XmTaskWorkload 工时登记表--> <!--编辑界面 XmTaskWorkload 工时登记表-->
<el-form :model="editForm" label-width="100px" :rules="editFormRules" ref="editFormRef"> <el-form :model="editForm" label-width="100px" :rules="editFormRules" ref="editFormRef">
<el-row>
<el-row v-if="editForm.ntype==='0'">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="预估工时" prop="budgetWorkload"> <el-form-item label="预估工时" prop="budgetWorkload">
<el-input :controls="false" type="number" :step="8" style="width:80%;" v-model="editForm.budgetWorkload" placeholder="预估工时" @change="editXmTaskSomeFields(editForm,'budgetWorkload',$event)"></el-input> &nbsp;小时 <el-input :controls="false" type="number" :step="8" style="width:80%;" v-model="editForm.budgetWorkload" placeholder="预估工时" @change="editXmTaskSomeFields(editForm,'budgetWorkload',$event)"></el-input> &nbsp;小时
@ -27,10 +27,32 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row v-else>
<el-col :span="6">
<el-form-item label="预估工时" prop="budgetWorkload">
{{scope.row.budgetWorkload}} &nbsp;小时
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="已登工时" prop="actWorkload">
{{editForm.actWorkload?editForm.actWorkload:0}} &nbsp; 小时
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="剩余工时" prop="rworkload">
{{editForm.rworkload?editForm.rworkload:0}} &nbsp;小时
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="工时进度" prop="rate">
<el-progress :percentage="editForm.rate>0?editForm.rate:0" placeholder="工时进度"></el-progress>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
</el-row> </el-row>
<el-row> <el-row>
<xm-task-workload-list :visible="visible" :xm-task="xmTask" @submit="onWorkloadSubmit"></xm-task-workload-list>
<xm-task-workload-list v-if="xmTask.ntype==='0'" :visible="visible" :xm-task="xmTask" @submit="onWorkloadSubmit"></xm-task-workload-list>
</el-row> </el-row>
</section> </section>
</template> </template>

Loading…
Cancel
Save