xiejiahao 4 years ago
parent
commit
14dc78adb9
  1. 111
      src/api/mdp/meta/item.js
  2. 4
      src/views/xm/XmOverview.vue
  3. 2
      src/views/xm/core/skill/skillMng.vue
  4. 4
      src/views/xm/core/xmAttachment/XmAttachmentAdd.vue
  5. 4
      src/views/xm/core/xmAttachment/XmAttachmentEdit.vue
  6. 4
      src/views/xm/core/xmAttachment/XmAttachmentMng.vue
  7. 4
      src/views/xm/core/xmBranchState/XmBranchStateAdd.vue
  8. 4
      src/views/xm/core/xmBranchState/XmBranchStateEdit.vue
  9. 8
      src/views/xm/core/xmBranchState/XmBranchStateMng.vue
  10. 4
      src/views/xm/core/xmBranchTaskTypeState/XmBranchTaskTypeStateAdd.vue
  11. 4
      src/views/xm/core/xmBranchTaskTypeState/XmBranchTaskTypeStateEdit.vue
  12. 8
      src/views/xm/core/xmBranchTaskTypeState/XmBranchTaskTypeStateMng.vue
  13. 4
      src/views/xm/core/xmEnvList/XmEnvListAdd.vue
  14. 4
      src/views/xm/core/xmEnvList/XmEnvListEdit.vue
  15. 4
      src/views/xm/core/xmEnvList/XmEnvListMng.vue
  16. 4
      src/views/xm/core/xmExchange/XmExchangeAdd.vue
  17. 4
      src/views/xm/core/xmExchange/XmExchangeEdit.vue
  18. 8
      src/views/xm/core/xmExchange/XmExchangeMng.vue
  19. 4
      src/views/xm/core/xmFile/XmFileAdd.vue
  20. 4
      src/views/xm/core/xmFile/XmFileEdit.vue
  21. 4
      src/views/xm/core/xmFile/XmFileMng.vue
  22. 9
      src/views/xm/core/xmGroup/XmGroupEdit.vue
  23. 32
      src/views/xm/core/xmGroup/XmGroupMng.vue
  24. 50
      src/views/xm/core/xmGroup/XmGroupSelect.vue
  25. 8
      src/views/xm/core/xmGroupState/XmGroupStateMng.vue
  26. 2
      src/views/xm/core/xmGroupState/XmGroupStateOverview.vue
  27. 4
      src/views/xm/core/xmIteration/XmIterationAdd.vue
  28. 38
      src/views/xm/core/xmIteration/XmIterationEdit.vue
  29. 4
      src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue
  30. 10
      src/views/xm/core/xmIteration/XmIterationInfo.vue
  31. 8
      src/views/xm/core/xmIteration/XmIterationMng.vue
  32. 29
      src/views/xm/core/xmIteration/XmIterationOverview.vue
  33. 14
      src/views/xm/core/xmIteration/XmIterationSelect.vue
  34. 4
      src/views/xm/core/xmIterationLink/XmIterationLinkAdd.vue
  35. 4
      src/views/xm/core/xmIterationLink/XmIterationLinkEdit.vue
  36. 8
      src/views/xm/core/xmIterationLink/XmIterationLinkForProduct.vue
  37. 8
      src/views/xm/core/xmIterationLink/XmIterationLinkForProject.vue
  38. 4
      src/views/xm/core/xmIterationMenu/XmIterationMenuAdd.vue
  39. 4
      src/views/xm/core/xmIterationMenu/XmIterationMenuEdit.vue
  40. 8
      src/views/xm/core/xmIterationMenu/XmIterationMenuMng.vue
  41. 4
      src/views/xm/core/xmIterationState/XmIterationStateAdd.vue
  42. 4
      src/views/xm/core/xmIterationState/XmIterationStateEdit.vue
  43. 8
      src/views/xm/core/xmIterationState/XmIterationStateMng.vue
  44. 8
      src/views/xm/core/xmIterationState/XmIterationStateShow.vue
  45. 187
      src/views/xm/core/xmMenu/XmMenuAdd.vue
  46. 198
      src/views/xm/core/xmMenu/XmMenuEdit.vue
  47. 338
      src/views/xm/core/xmMenu/XmMenuMng.vue
  48. 990
      src/views/xm/core/xmMenu/XmMenuMngBatch.vue
  49. 32
      src/views/xm/core/xmMenu/XmMenuOverview.vue
  50. 4
      src/views/xm/core/xmMenu/XmMenuRichDetail.vue
  51. 199
      src/views/xm/core/xmMenu/XmMenuSelect.vue
  52. 16
      src/views/xm/core/xmMenu/XmMenuWithPlan.vue
  53. 8
      src/views/xm/core/xmMenuExchange/XmMenuExchangeMng.vue
  54. 2
      src/views/xm/core/xmMenuExchange/XmMenuExchangeRoute.vue
  55. 4
      src/views/xm/core/xmMenuState/XmMenuStateAdd.vue
  56. 4
      src/views/xm/core/xmMenuState/XmMenuStateEdit.vue
  57. 16
      src/views/xm/core/xmMenuState/XmMenuStateMng.vue
  58. 4
      src/views/xm/core/xmMenuTemplate/XmMenuTemplateAdd.vue
  59. 4
      src/views/xm/core/xmMenuTemplate/XmMenuTemplateEdit.vue
  60. 4
      src/views/xm/core/xmMenuTemplate/XmMenuTemplateMng.vue
  61. 4
      src/views/xm/core/xmMyFocus/XmMyFocusAdd.vue
  62. 4
      src/views/xm/core/xmMyFocus/XmMyFocusEdit.vue
  63. 4
      src/views/xm/core/xmMyFocus/XmMyFocusMng.vue
  64. 12
      src/views/xm/core/xmPhase/XmPhaseAdd.vue
  65. 23
      src/views/xm/core/xmPhase/XmPhaseBatch.vue
  66. 12
      src/views/xm/core/xmPhase/XmPhaseEdit.vue
  67. 16
      src/views/xm/core/xmPhase/XmPhaseForProduct.vue
  68. 16
      src/views/xm/core/xmPhase/XmPhaseMng.vue
  69. 2
      src/views/xm/core/xmPhase/XmPhaseOverview.vue
  70. 18
      src/views/xm/core/xmPhase/XmPhaseSelect.vue
  71. 15
      src/views/xm/core/xmPhaseTemplate/XmPhaseTemplateAdd.vue
  72. 15
      src/views/xm/core/xmPhaseTemplate/XmPhaseTemplateEdit.vue
  73. 4
      src/views/xm/core/xmPhaseTemplate/XmPhaseTemplateMng.vue
  74. 4
      src/views/xm/core/xmProduct/XmProductAdd.vue
  75. 20
      src/views/xm/core/xmProduct/XmProductEdit.vue
  76. 4
      src/views/xm/core/xmProduct/XmProductForProjectComplex.vue
  77. 50
      src/views/xm/core/xmProduct/XmProductInfo.vue
  78. 51
      src/views/xm/core/xmProduct/XmProductMng.vue
  79. 16
      src/views/xm/core/xmProduct/XmProductOverview.vue
  80. 41
      src/views/xm/core/xmProduct/XmProductOverviewComplex.vue
  81. 2
      src/views/xm/core/xmProduct/XmProductProjectForLink.vue
  82. 4
      src/views/xm/core/xmProduct/XmProductRecycle.vue
  83. 11
      src/views/xm/core/xmProduct/XmProductSelect.vue
  84. 4
      src/views/xm/core/xmProduct/XmProductTplMng.vue
  85. 4
      src/views/xm/core/xmProductProjectLink/XmProductProjectLinkAdd.vue
  86. 4
      src/views/xm/core/xmProductProjectLink/XmProductProjectLinkEdit.vue
  87. 8
      src/views/xm/core/xmProductProjectLink/XmProductProjectLinkMng.vue
  88. 4
      src/views/xm/core/xmProductState/XmProductStateAdd.vue
  89. 4
      src/views/xm/core/xmProductState/XmProductStateEdit.vue
  90. 8
      src/views/xm/core/xmProductState/XmProductStateMng.vue
  91. 4
      src/views/xm/core/xmProductTemplate/XmProductTemplateAdd.vue
  92. 4
      src/views/xm/core/xmProductTemplate/XmProductTemplateEdit.vue
  93. 4
      src/views/xm/core/xmProductTemplate/XmProductTemplateMng.vue
  94. 27
      src/views/xm/core/xmProject/XmProjectAdd.vue
  95. 2
      src/views/xm/core/xmProject/XmProjectAssess.vue
  96. 2
      src/views/xm/core/xmProject/XmProjectBudgetCost.vue
  97. 2
      src/views/xm/core/xmProject/XmProjectComplex.vue
  98. 2
      src/views/xm/core/xmProject/XmProjectCost.vue
  99. 2
      src/views/xm/core/xmProject/XmProjectDetail.vue
  100. 50
      src/views/xm/core/xmProject/XmProjectEdit.vue

111
src/api/mdp/meta/item.js

@ -4,15 +4,116 @@ import config from '@/common/config'
let base = config.getSysBasePath();
/**
* 数据项定义
*1 默认只开放普通查询所有查询只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录数如果是0后台会自动计算总记录数非0不会自动计算}后台都会自动按分页查询 其它 api用到再打开没用到的api请注释掉
*2 查询新增修改的参数格式 params={id:'主键 主键',itemCode:'代码',itemName:'名称',remark:'备注',categoryId:'分类编号',itemSize:'长度',itemType:'类型',branchId:'机构编号',deptid:'部门编号'}
*2 查询新增修改的参数格式 params={id:'主键 主键',itemCode:'代码,小写,下横线分割,请不要用驼峰命名',itemName:'名称',remark:'备注',categoryId:'分类编号',itemSize:'长度',itemType:'类型',branchId:'机构编号',deptid:'部门编号',cmenu:'是否创建菜单',values:'默认值,如果是列表,则存储列表编号,多个逗号分割',names:'默认名称,如果是列表,则存储列表名称,多个则逗号分割',options:'item_type=4,5时的选项列表[{value:值,name:显示名称}]',inputFormat:'输入提示',required:'是否必须0否1是',seq:'排序顺序',table:'表名',show:'是否显示0否1是',qx:'权限,是否可以0-新增,1-删除,2-编辑,3-查询,多个以逗号分割'}
**/
//普通查询 条件之间and关系
export const listItem = params => { return axios.get(`${base}/mdp/meta/item/list`, { params: params }); };
export const getDicts = params => { return axios.get(`${base}/mdp/meta/item/dicts`, { params: params }); };
/** params={categoryId:'all',itemCodes:['sex','grade']}
{
sex: [{id:'1',name:'男'},{id:'2',name:'女'}],
grade:[{id:'1',name:'等级1'},{id:'2',name:'等级2'}]
}
**/
export const initSimpleDicts=function(categoryId,itemCodes){
if(!categoryId){
categoryId="all"
}
return new Promise((resolve, reject) => {
var keys=itemCodes
var localDicts={}
var nolocalDictsKeys=[];
var datetime=new Date().getTime();
var millSec=24*60*60*1000;//一天的毫秒数
keys.forEach(i=>{
var key=categoryId+"_@"+i;
var value= localStorage.getItem(key)
if(value!=null &&value.length>0){
var data=JSON.parse(value)
var time=data.time;
if((datetime-time)>millSec){
nolocalDictsKeys.push(i)
localStorage.removeItem(key);
}else{
localDicts[i]=data.options
}
}else{
nolocalDictsKeys.push(i)
}
})
if(nolocalDictsKeys.length==0){
var res={data:{tips:{isOk:true,msg:"成功"},data:localDicts}}
resolve(res)
}else{
getDicts({categoryId:categoryId,itemCodes:nolocalDictsKeys}).then(res=>{
if(!res.data.tips){
reject(res)
}else if(res.data.tips.isOk){
var data=res.data.data
var dicts=localDicts;
data.forEach(dict=>{
if(dict.optionList){
dict.options=JSON.parse(dict.optionList)
}else{
dict.options=[]
}
dicts[dict.itemCode]=dict.options
localStorage.setItem(categoryId+'_@'+dict.itemCode,JSON.stringify({options:dict.options,time:datetime}))
})
res.data.data=dicts;
resolve(res);
}else{
resolve(res);
}
}).catch(e=>reject(e));
}
});
};
/** params={categoryId:'all',itemCodes:['sex','grade']}
{
sex:{id:'',itemCode:'',itemName:'',itemType:'',values:'',names:'','options':[{id:'1',name:'男'},{id:'2',name:'女'}]}
grade:{id:'',itemCode:'',itemName:'',itemType:'',values:'',names:'','options':[{id:'1',name:'等级1'},{id:'2',name:'等级2'}]}
}
***/
export const initComplexDicts=function(categoryId,itemCodes){
if(!categoryId){
categoryId="all"
}
return new Promise((resolve, reject) => {
getDicts({categoryId:categoryId,itemCodes:itemCodes}).then(res=>{
if(!res.data.tips){
reject(res)
}else if(res.data.tips.isOk){
var data=res.data.data
var dicts={};
data.forEach(dict=>{
if(dict.optionList){
dict.options=JSON.parse(dict.optionList)
}else{
dict.options=[]
}
dicts[dict.itemCode]=dict
})
res.data.data=dicts;
resolve(res);
}else{
resolve(res);
}
}).catch(e=>reject(e));
});
};
//模糊查询数据项定义 条件之间or关系
//export const listItemKey = params => { return axios.get(`${base}/mdp/meta/item/listKey`, { params: params }); };
@ -27,3 +128,11 @@ export const editItem = params => { return axios.post(`${base}/mdp/meta/item/edi
//新增一条数据项定义
export const addItem = params => { return axios.post(`${base}/mdp/meta/item/add`, params); };
//新增一条数据项定义
export const copyToNewCategory = params => { return axios.post(`${base}/mdp/meta/item/copyToNewCategory`, params); };
//新增或者修改
export const insertOrUpdateItem = params => { return axios.post(`${base}/mdp/meta/item/insertOrUpdate`, params); };

4
src/views/xm/XmOverview.vue

@ -335,7 +335,7 @@
<script>
import util from "@/common/js/util"; //
import { mapGetters } from "vuex";
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmBranchState,loadProjectStateToXmBranchState } from '@/api/xm/core/xmBranchState';
import Guider from '@/components/Guider/Index.js';
@ -411,7 +411,7 @@ export default {
isActive: true,
xmBranchState:{},
maxTableHeight:300,
// options: getDefOptions(),// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
// dicts: getDefOptions(),// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
};
},

2
src/views/xm/core/skill/skillMng.vue

@ -104,7 +104,7 @@
<script>
import util from "@/common/js/util"; //
//import Sticky from "@/components/Sticky"; // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import {
getAllHrSkill,
delHrSkillCategory,

4
src/views/xm/core/xmAttachment/XmAttachmentAdd.vue

@ -37,7 +37,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmAttachment } from '@/api/xm/core/xmAttachment';
import { mapGetters } from 'vuex'
@ -60,7 +60,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmAttachment/XmAttachmentEdit.vue

@ -37,7 +37,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmAttachment } from '@/api/xm/core/xmAttachment';
import { mapGetters } from 'vuex'
@ -60,7 +60,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

4
src/views/xm/core/xmAttachment/XmAttachmentMng.vue

@ -43,7 +43,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmAttachment, delXmAttachment, batchDelXmAttachment } from '@/api/xm/core/xmAttachment';
import XmAttachmentAdd from './XmAttachmentAdd';//
import XmAttachmentEdit from './XmAttachmentEdit';//
@ -71,7 +71,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmAttachment
//xmAttachment

4
src/views/xm/core/xmBranchState/XmBranchStateAdd.vue

@ -172,7 +172,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmBranchState } from '@/api/xm/core/xmBranchState';
import { mapGetters } from 'vuex'
@ -195,7 +195,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmBranchState/XmBranchStateEdit.vue

@ -172,7 +172,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmBranchState } from '@/api/xm/core/xmBranchState';
import { mapGetters } from 'vuex'
@ -195,7 +195,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

8
src/views/xm/core/xmBranchState/XmBranchStateMng.vue

@ -90,7 +90,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmBranchState, delXmBranchState, batchDelXmBranchState,loadProjectStateToXmBranchState } from '@/api/xm/core/xmBranchState';
import XmBranchStateAdd from './XmBranchStateAdd';//
import XmBranchStateEdit from './XmBranchStateEdit';//
@ -118,7 +118,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -295,9 +295,9 @@
this.getXmBranchStates();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmBranchTaskTypeState/XmBranchTaskTypeStateAdd.vue

@ -76,7 +76,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmBranchTaskTypeState } from '@/api/xm/core/xmBranchTaskTypeState';
import { mapGetters } from 'vuex'
@ -99,7 +99,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmBranchTaskTypeState/XmBranchTaskTypeStateEdit.vue

@ -76,7 +76,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmBranchTaskTypeState } from '@/api/xm/core/xmBranchTaskTypeState';
import { mapGetters } from 'vuex'
@ -99,7 +99,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

8
src/views/xm/core/xmBranchTaskTypeState/XmBranchTaskTypeStateMng.vue

@ -56,7 +56,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmBranchTaskTypeState, delXmBranchTaskTypeState, batchDelXmBranchTaskTypeState } from '@/api/xm/core/xmBranchTaskTypeState';
import XmBranchTaskTypeStateAdd from './XmBranchTaskTypeStateAdd';//
import XmBranchTaskTypeStateEdit from './XmBranchTaskTypeStateEdit';//
@ -84,7 +84,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -242,9 +242,9 @@
this.getXmBranchTaskTypeStates();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmEnvList/XmEnvListAdd.vue

@ -72,7 +72,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmEnvList } from '@/api/xm/core/xmEnvList';
import { mapGetters } from 'vuex'
@ -119,7 +119,7 @@
};
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
startTime: [

4
src/views/xm/core/xmEnvList/XmEnvListEdit.vue

@ -72,7 +72,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmEnvList } from '@/api/xm/core/xmEnvList';
import { mapGetters } from 'vuex'
@ -98,7 +98,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

4
src/views/xm/core/xmEnvList/XmEnvListMng.vue

@ -57,7 +57,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmEnvList, delXmEnvList, batchDelXmEnvList } from '@/api/xm/core/xmEnvList';
import XmEnvListAdd from './XmEnvListAdd';//
import XmEnvListEdit from './XmEnvListEdit';//
@ -85,7 +85,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmEnvList
//xmEnvList

4
src/views/xm/core/xmExchange/XmExchangeAdd.vue

@ -85,7 +85,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmExchange } from '@/api/xm/core/xmExchange';
import { mapGetters } from 'vuex'
@ -108,7 +108,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmExchange/XmExchangeEdit.vue

@ -85,7 +85,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmExchange } from '@/api/xm/core/xmExchange';
import { mapGetters } from 'vuex'
@ -108,7 +108,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

8
src/views/xm/core/xmExchange/XmExchangeMng.vue

@ -43,7 +43,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmExchange, delXmExchange, batchDelXmExchange,addXmExchange } from '@/api/xm/core/xmExchange';
import TaskUserEditor from './TaskUserEditor'
import { mapGetters } from 'vuex'
@ -77,7 +77,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -262,9 +262,9 @@
this.getXmExchanges();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmFile/XmFileAdd.vue

@ -32,7 +32,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmFile } from '@/api/xm/core/xmFile';
import { mapGetters } from 'vuex';
import VueEditor from '@/components/Tinymce/index';
@ -59,7 +59,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmFile/XmFileEdit.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmFile } from '@/api/xm/core/xmFile';
import { mapGetters } from 'vuex'
import VueEditor from '@/components/Tinymce/index';
@ -59,7 +59,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

4
src/views/xm/core/xmFile/XmFileMng.vue

@ -76,7 +76,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmFile, delXmFile, batchDelXmFile } from '@/api/xm/core/xmFile';
import XmFileAdd from './XmFileAdd';//
import XmFileEdit from './XmFileEdit';//
@ -108,7 +108,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmFile
//xmFile

9
src/views/xm/core/xmGroup/XmGroupEdit.vue

@ -141,7 +141,14 @@
if(this.opType=='edit'){
}else{
if(!this.editForm.leaderUserid){
this.editForm.leaderUserid=this.userInfo.userid
this.editForm.leaderUsername=this.userInfo.username
}
if(!this.editForm.assUserid){
this.editForm.assUserid=this.userInfo.userid
this.editForm.assUsername=this.userInfo.username
}
}
},
showUserSelect(userType){

32
src/views/xm/core/xmGroup/XmGroupMng.vue

@ -2,17 +2,13 @@
<section class="page-container border padding" >
<el-row>
<el-popover v-if="filters.pgClass==='0' && (!selProject || !selProject.id)"
<el-popover v-if="pgClass==='0' && (!selProject || !selProject.id)"
placement="right"
width="400"
trigger="click">
<xm-project-select :auto-select="true" :xm-iteration="xmIteration" :xm-product="xmProduct" @row-click="onProjectRowClick" @clear-select="onProjectClearSelect"></xm-project-select>
<el-link type="warning" slot="reference" icon="el-icon-search"><font style="font-size:14px;">{{filters.selProject?filters.selProject.name:'选择项目'}}</font></el-link>
</el-popover>
<span v-if="xmProduct && xmProduct.id && (!selProject || !selProject.id)">
<el-radio v-model="filters.pgClass" label="1">产品组</el-radio>
<el-radio v-model="filters.pgClass" label="0">项目组</el-radio>
</span>
<el-input v-model="filters.key" style="width:15%;" clearable placeholder="名称过滤"></el-input>
<el-button type="primary" @click="searchXmGroups" icon="el-icon-search">刷新</el-button>
<el-button type="plain" @click="showGroupState" icon="el-icon-s-data">小组进度</el-button>
@ -237,7 +233,7 @@
XmGroupEdit,VueOkrTree,UsersSelect,XmGroupStateMng,XmGroupUserMng,XmProjectList,
XmProductSelect,XmProjectSelect,
},
props:["visible","selProject" ,"isSelectSingleUser","isSelectMultiUser",'xmProduct','xmIteration'],
props:["visible","selProject" ,"isSelectSingleUser","isSelectMultiUser",'xmProduct','xmIteration','pgClass'],
computed: {
...mapGetters(['userInfo']),
expandedKeys(){
@ -323,13 +319,6 @@ XmProductSelect,XmProjectSelect,
"filters.key":function(val) {
this.$refs.tree.filter(val);
},
"filters.pgClass":function(val) {
if(val==='1'){
this.filters.selProject=null;
this.xmGroups=[]
this.searchXmGroups();
}
}
},
data() {
return {
@ -339,7 +328,6 @@ XmProductSelect,XmProjectSelect,
mngUsernamekey:'',
groupUsernameKey:'',
selProject:null,
pgClass:'',
},
xmGroups: [],//
pageInfo:{//
@ -480,6 +468,15 @@ XmProductSelect,XmProjectSelect,
if(this.filters.mngUsernamekey){
params.mngUsernamekey=this.filters.mngUsernamekey
}
if(this.pgClass==='0'||!this.pgClass){
if(!params.projectId){
return;
}
}else if(this.pgClass==='1'){
if(!params.productId){
return;
}
}
var func=getGroups
this.load.list = true;
if( !params.productId && !params.projectId && !params.iterationId){
@ -717,13 +714,6 @@ XmProductSelect,XmProjectSelect,
},
initData: function(){
this.filters.selProject=this.selProject;
if(this.selProject && this.selProject.id){
this.filters.pgClass="0"
}else if(this.xmProduct && this.xmProduct.id){
this.filters.pgClass="1"
}else{
this.filters.pgClass="0"
}
},
renderCurrentClass (node) {
return 'label-bg-blue'

50
src/views/xm/core/xmGroup/XmGroupSelect.vue

@ -1,17 +1,21 @@
<template>
<section class="border padding-left">
<el-row class="padding-top">
<el-col :span="6">
<el-popover v-if="(pgClass==='0'||!pgClass) && (!selProject || !selProject.id)"
placement="right"
width="400"
trigger="click">
<xm-project-select :auto-select="true" :xm-product="xmProduct" @row-click="onProjectRowClick" @clear-select="onProjectClose"></xm-project-select>
<el-link type="warning" slot="reference" icon="el-icon-search"><font style="font-size:14px;">{{filters.selProject?filters.selProject.name:'选择项目'}}</font></el-link>
</el-popover>
<el-popover v-if="pgClass==='1' && (!xmProduct || !xmProduct.id)"
placement="right"
width="400"
trigger="click">
<xm-product-select :auto-select="true" :sel-project="selProject" @row-click="onProductRowClick" @clear-select="onProductClose"></xm-product-select>
<el-link type="warning" slot="reference" icon="el-icon-search"><font style="font-size:14px;">{{filters.xmProduct?filters.xmProduct.productName:'选择项目'}}</font></el-link>
</el-popover>
<el-button type="primary" @click="userConfirm" icon="el-icon-finished">确认选择</el-button>
</el-col>
<el-col :span="18" class="hidden-sm-and-down">
<el-tooltip content="黄色表示选中"><span class="addXmGroupFormworkSquare"></span></el-tooltip>
{{this.filters.selProject?"项目:":""}}<el-tag type="primary" @click="selectProjectVisible=true" v-if="this.filters.selProject" closable @close="onProjectClose">{{this.filters.selProject.name}}</el-tag>
<el-tag v-else type="warning" @click="selectProjectVisible=true"> 选择项目</el-tag>
&nbsp;&nbsp;
{{this.filters.xmProduct?"产品:":""}}<el-tag type="primary" @click="selectProductVisible=true" v-if="this.filters.xmProduct&&this.filters.xmProduct.id" closable @close="onProductClose">{{this.filters.xmProduct.productName}}</el-tag>
<el-tag v-else type="warning" @click="selectProductVisible=true">选择产品</el-tag>
</el-col>
</el-row>
<el-row class="padding-top" v-loading="load.list" :style="{overflowX:'auto',height:maxTableHeight+'px'}" ref="table">
<el-row v-for="(item,index) in xmGroupFormworkSels" :key="index">
@ -28,12 +32,12 @@
</el-row>
<el-drawer title="选中项目团队" :visible.sync="selectProjectVisible" size="80%" append-to-body :close-on-click-modal="false">
<xm-project-list @project-confirm="onPorjectConfirm"></xm-project-list>
<xm-project-list @project-confirm="onProjectRowClick"></xm-project-list>
</el-drawer>
<el-drawer title="选中产品团队" :visible.sync="selectProductVisible" size="80%" append-to-body :close-on-click-modal="false">
<xm-product-select :isSelectProduct="true" @selected="onProductConfirm"></xm-product-select>
<xm-product-select :isSelectProduct="true" @selected="onProductRowClick"></xm-product-select>
</el-drawer>
</section>
</template>
@ -41,9 +45,9 @@
<script>
import util from '@/common/js/util'; //
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { getGroups } from '@/api/xm/core/xmGroup';
import XmProjectList from '../xmProject/XmProjectList';
import XmProjectSelect from '../xmProject/XmProjectSelect';
import {mapGetters} from 'vuex'
import XmProductSelect from '../xmProduct/XmProductSelect.vue';
@ -55,7 +59,7 @@ import XmProductSelect from '../xmProduct/XmProductSelect.vue';
])
},
//
props: ['visible','selProject','isSelectSingleUser','isSelectMultiUser','xmProduct'],
props: ['visible','selProject','isSelectSingleUser','isSelectMultiUser','xmProduct','pgClass'],
watch: {
"selGroups": function(selGroups) {
if(this.selGroups){
@ -94,7 +98,7 @@ import XmProductSelect from '../xmProduct/XmProductSelect.vue';
selGroups:[],
load: {list: false,edit: false,del: false,add: false}, //...
sels: [], //
options: {
dicts: {
projectGroupType:[]
}, // params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -153,14 +157,14 @@ import XmProductSelect from '../xmProduct/XmProductSelect.vue';
if(this.filters.xmProduct && this.filters.xmProduct.id){
params.productId=this.filters.xmProduct.id
}
if(!params.projectId && !params.productId){
this.$notify({showClose:true,message:'产品团队或者项目团队最少选中一个',type:'error'})
if(this.pgClass==='1' && !params.productId){
this.$notify({showClose:true,message:'请选择产品',type:'error'})
return;
}
if(params.projectId && params.productId){
if((this.pgClass==='0' || !this.pgClass )&& !params.projectId){
params.productId=null
this.$notify({showClose:true,message:'产品团队或者项目团队只能选中一个,两个都选以项目团队为准',type:'warning'})
this.$notify({showClose:true,message:'请选择项目',type:'warning'})
}
getGroups(params).then(res=>{
var tips = res.data.tips;
@ -172,7 +176,7 @@ import XmProductSelect from '../xmProduct/XmProductSelect.vue';
})
},
onPorjectConfirm:function(project){
onProjectRowClick:function(project){
this.filters.selProject=project
this.filters.xmProduct=null;
this.selectProjectVisible=false;
@ -180,7 +184,7 @@ import XmProductSelect from '../xmProduct/XmProductSelect.vue';
},
onProductConfirm:function(product){
onProductRowClick:function(product){
this.filters.xmProduct=product
this.filters.selProject=null
this.selectProductVisible=false;
@ -199,7 +203,7 @@ import XmProductSelect from '../xmProduct/XmProductSelect.vue';
}, //end methods
components: {
XmProjectList,XmProductSelect
XmProjectSelect,XmProductSelect
},
mounted() {
this.$nextTick(() => {

8
src/views/xm/core/xmGroupState/XmGroupStateMng.vue

@ -53,7 +53,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmGroupState, delXmGroupState, batchDelXmGroupState,loadTasksToXmGroupState } from '@/api/xm/core/xmGroupState';
import { mapGetters } from 'vuex'
import XmGroupStateOverview from './XmGroupStateOverview.vue';
@ -88,7 +88,7 @@ import XmGroupStateOverview from './XmGroupStateOverview.vue';
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -274,9 +274,9 @@ XmGroupStateOverview
this.getXmGroupStates();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

2
src/views/xm/core/xmGroupState/XmGroupStateOverview.vue

@ -207,7 +207,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'

4
src/views/xm/core/xmIteration/XmIterationAdd.vue

@ -39,7 +39,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmIteration } from '@/api/xm/core/xmIteration';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -67,7 +67,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
iterationName: [

38
src/views/xm/core/xmIteration/XmIterationEdit.vue

@ -1,5 +1,15 @@
<template>
<section class="page-container padding border">
<el-row class="padding-header">
<el-steps :active="calcIterationCurrStep" simple finish-status="success">
<el-step v-for="(i,index) in dicts['iterationStatus']" :title="i.name" :key="index" @click.native.stop="editForm.iphase=i.id">
<el-link slot="title" >
{{i.name}}
</el-link>
</el-step>
</el-steps>
</el-row>
<el-row>
<!--新增界面 XmIteration 迭代定义-->
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm">
@ -19,14 +29,13 @@
<el-date-picker type="date" placeholder="选择日期" v-model="editForm.onlineTime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="负责人姓名" prop="adminUsername">
{{editForm.adminUsername}} <el-button @click="userSelectVisible=true">选择负责人</el-button>
{{editForm.adminUsername}} <el-button type="text" @click="userSelectVisible=true">选择负责人</el-button>
</el-form-item>
<el-form-item label="预算工作量" prop="budgetWorkload">
<el-input v-model="editForm.budgetWorkload" type="number" min="0" style="width:60%;" placeholder="预算工作量"></el-input> 人时 1人工作1日=8人时
</el-form-item>
<el-form-item>
<el-col :span="24" :offset="8">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="editSubmit" :disabled="load.edit==true">提交</el-button>
</el-col>
</el-form-item>
@ -41,7 +50,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmIteration } from '@/api/xm/core/xmIteration';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -51,7 +60,20 @@
computed: {
...mapGetters([
'userInfo','roles'
])
]),
calcIterationCurrStep(){
var istatus= this.dicts.iterationStatus
if(!istatus){
return 1;
}else{
var status=istatus.findIndex(i=>this.editForm.iphase==i.id)
if(status>=0){
return status+1;
}else{
return 1;
}
}
}
},
props:['xmIteration','visible'],
watch: {
@ -65,7 +87,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
iterationName: [
@ -77,7 +99,7 @@
},
//
editForm: {
id:'',branchId:'',iterationName:'',startTime:'',endTime:'',onlineTime:'',pid:'',adminUserid:'',adminUsername:'',ctime:'',budgetCost:'',budgetWorkload:'',distBudgetCost:'',distBudgetWorkload:'',actCost:'',actWorkload:'',actStaffNum:'',seqNo:'',
id:'',branchId:'',iterationName:'',startTime:'',endTime:'',onlineTime:'',pid:'',adminUserid:'',adminUsername:'',ctime:'',budgetCost:'',budgetWorkload:'',distBudgetCost:'',distBudgetWorkload:'',actCost:'',actWorkload:'',actStaffNum:'',seqNo:'',iphase:'0'
},
/**begin 在下面加自定义属性,记得补上面的一个逗号**/
userSelectVisible:false,
@ -135,7 +157,9 @@
UsersSelect
},
mounted() {
initSimpleDicts('all',['iterationStatus'] ).then(res=>{
this.dicts=res.data.data;
})
this.editForm=Object.assign(this.editForm, this.xmIteration);
/**在下面写其它函数***/

4
src/views/xm/core/xmIteration/XmIterationForProjectComplex.vue

@ -16,7 +16,7 @@
</el-tab-pane>
<el-tab-pane lazy name="iterations" disabled>
<el-tab-pane lazy name="iterations2" disabled>
<div slot="label">
<el-popover
placement="bottom"
@ -60,7 +60,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { delXmIterationLink } from '@/api/xm/core/xmIterationLink';
import XmIterationSelect from './XmIterationSelect.vue'

10
src/views/xm/core/xmIteration/XmIterationInfo.vue

@ -50,7 +50,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject,editStatus , delXmProject, batchDelXmProject } from '@/api/xm/core/xmProject';
import XmProjectAdd from '../xmProject/XmProjectAdd';//
import XmProjectEdit from '../xmProject/XmProjectEdit';//
@ -251,13 +251,13 @@
} else {
return v[j];
}
const options = this.$refs.xmMenuWithPlan.options;
if(options[key]==undefined || options[key]==null || options[key].length==0 ){
const dicts = this.$refs.xmMenuWithPlan.dicts;
if(dicts[key]==undefined || dicts[key]==null || dicts[key].length==0 ){
return v[j];
}
var rowData=options[key].filter(i=>i.optionValue==v[j])
var rowData=dicts[key].filter(i=>i.id==v[j])
if(rowData.length>0){
return rowData[0].optionName
return rowData[0].name
}else{
return v[j];
}

8
src/views/xm/core/xmIteration/XmIterationMng.vue

@ -129,7 +129,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIteration,listXmIterationWithState, delXmIteration, batchDelXmIteration,loadTasksToXmIterationState } from '@/api/xm/core/xmIteration';
import { addXmIterationLink,delXmIterationLink } from '@/api/xm/core/xmIterationLink';
@ -191,7 +191,7 @@ import XmIterationSelect from './XmIterationSelect.vue';
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -530,9 +530,9 @@ import XmIterationSelect from './XmIterationSelect.vue';
});
// console.log(this.dateRanger,this.dateRangerOnline);
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

29
src/views/xm/core/xmIteration/XmIterationOverview.vue

@ -5,14 +5,8 @@
<el-card class="box-card" style="padding:0px ;height:100px">
<div>
<el-row style="padding:10px">
<el-steps :active="this.xmIteration.iphase+1" align-center finish-status="success">
<el-step title="未开始"></el-step>
<el-step title="需求评审"></el-step>
<el-step title="计划会"></el-step>
<el-step title="研发中"></el-step>
<el-step title="测试中"></el-step>
<el-step title="迭代上线"></el-step>
<el-step title="已完成"></el-step>
<el-steps :active="calcIterationCurrStep" align-center finish-status="success">
<el-step :title="item.name" v-for="(item,index) in dicts['iterationStatus']" :key="index"></el-step>
</el-steps>
</el-row>
</div>
@ -245,6 +239,7 @@
<script>
import util from "@/common/js/util"; //
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from "vuex";
export default {
@ -303,6 +298,19 @@ export default {
xmIterationStateCpd(){
return this.xmIteration
},
calcIterationCurrStep(){
var istatus= this.dicts.iterationStatus
if(!istatus){
return 1;
}else{
var status=istatus.findIndex(i=>this.xmIteration.iphase==i.id)
if(status>=0){
return status+1;
}else{
return 1;
}
}
}
},
props:['xmIteration'],
@ -318,6 +326,7 @@ export default {
return {
isActive: true,
maxTableHeight:300,
dicts:{},
};
},
@ -574,6 +583,10 @@ export default {
},
mounted() {
initSimpleDicts('all',['iterationStatus'] ).then(res=>{
this.dicts=res.data.data;
})
this.$nextTick(() => {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)
});

14
src/views/xm/core/xmIteration/XmIterationSelect.vue

@ -6,12 +6,12 @@
<el-table-column type="index" label="序号" ></el-table-column>
<el-table-column prop="iterationName" label="迭代名称" >
<template slot="header" slot-scope="scope">
迭代名称 <el-button type="text" @click="clearSelectIteration">清空所选</el-button>
迭代名称 <el-button type="text" @click="clearSelectIteration">清空所选</el-button> &nbsp;<el-button type="text" @click="close">关闭</el-button>
<el-popover v-if=" !menuId && !productId"
placement="top-start"
title=""
width="400"
trigger="click" >
trigger="hover" >
<el-row>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">
@ -54,7 +54,7 @@
<el-button type="primary" icon="el-icon-search" @click="getXmIterations">查询</el-button>
</el-col>
</el-row>
<el-button type="text" slot="reference" icon="el-icon-more">更多条件</el-button>
<el-button type="text" slot="reference">更多条件</el-button>
</el-popover>
</template>
<template slot-scope="scope">
@ -72,7 +72,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIteration,listXmIterationWithState, delXmIteration, batchDelXmIteration,loadTasksToXmIterationState } from '@/api/xm/core/xmIteration';
@ -125,7 +125,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -337,7 +337,9 @@
return 0;
}
},
close(){
this.$emit("close")
},
loadTasksToXmIterationState(row){
this.load.edit=true;

4
src/views/xm/core/xmIterationLink/XmIterationLinkAdd.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmIterationLink } from '@/api/xm/core/xmIterationLink';
import { mapGetters } from 'vuex'
@ -57,7 +57,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
iterationId: [

4
src/views/xm/core/xmIterationLink/XmIterationLinkEdit.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmIterationLink } from '@/api/xm/core/xmIterationLink';
import { mapGetters } from 'vuex'
@ -57,7 +57,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
iterationId: [

8
src/views/xm/core/xmIterationLink/XmIterationLinkForProduct.vue

@ -42,7 +42,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIterationLinkWithProductInfo,addXmIterationLink, delXmIterationLink, batchDelXmIterationLink } from '@/api/xm/core/xmIterationLink';
import { mapGetters } from 'vuex'
@ -82,7 +82,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -287,9 +287,9 @@
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.xmIterationLink.$el)
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

8
src/views/xm/core/xmIterationLink/XmIterationLinkForProject.vue

@ -42,7 +42,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIterationLinkWithProjectInfo,addXmIterationLink, delXmIterationLink, batchDelXmIterationLink } from '@/api/xm/core/xmIterationLink';
import { mapGetters } from 'vuex'
@ -82,7 +82,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -287,9 +287,9 @@
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.xmIterationLink.$el)
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmIterationMenu/XmIterationMenuAdd.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmIterationMenu } from '@/api/xm/core/xmIterationMenu';
import { mapGetters } from 'vuex'
@ -57,7 +57,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmIterationMenu/XmIterationMenuEdit.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmIterationMenu } from '@/api/xm/core/xmIterationMenu';
import { mapGetters } from 'vuex'
@ -57,7 +57,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

8
src/views/xm/core/xmIterationMenu/XmIterationMenuMng.vue

@ -46,7 +46,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIterationMenu, delXmIterationMenu, batchDelXmIterationMenu,batchAddXmIterationMenu } from '@/api/xm/core/xmIterationMenu';
import XmIterationMng from '../xmIteration/XmIterationSelect';//
import { mapGetters } from 'vuex'
@ -86,7 +86,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -336,9 +336,9 @@
this.getXmIterationMenus();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmIterationState/XmIterationStateAdd.vue

@ -79,7 +79,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmIterationState } from '@/api/xm/core/xmIterationState';
import { mapGetters } from 'vuex'
@ -102,7 +102,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmIterationState/XmIterationStateEdit.vue

@ -79,7 +79,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmIterationState } from '@/api/xm/core/xmIterationState';
import { mapGetters } from 'vuex'
@ -102,7 +102,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

8
src/views/xm/core/xmIterationState/XmIterationStateMng.vue

@ -50,7 +50,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIterationState, delXmIterationState, batchDelXmIterationState } from '@/api/xm/core/xmIterationState';
import XmIterationStateAdd from './XmIterationStateAdd';//
import XmIterationStateEdit from './XmIterationStateEdit';//
@ -84,7 +84,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -247,9 +247,9 @@
this.getXmIterationStates();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

8
src/views/xm/core/xmIterationState/XmIterationStateShow.vue

@ -50,7 +50,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmIterationState, delXmIterationState, batchDelXmIterationState } from '@/api/xm/core/xmIterationState';
import XmIterationStateAdd from './XmIterationStateAdd';//
import XmIterationStateEdit from './XmIterationStateEdit';//
@ -84,7 +84,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -246,9 +246,9 @@
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el);
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

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

@ -4,25 +4,105 @@
<!--新增界面 XmMenu 项目需求表-->
<el-form :model="addForm" label-width="120px" :rules="addFormRules" ref="addForm">
<el-form-item v-if="parentMenu" label="所属需求集" prop="pmenuId">
<el-link type="primary" :icon="'el-icon-folder-opened'">{{parentMenu.seqNo}} &nbsp; &nbsp; {{parentMenu.menuName}}</el-link>
<el-collapse value="1" accordion>
<el-collapse-item title="基本信息" name="1" >
<el-form-item label="节点类型" prop="ntype">
<el-radio :disabled="parentMenu&&parentMenu.menuId&&parentMenu.ntype==='0'" v-model="addForm.ntype" label="1">需求池</el-radio>
<el-radio v-model="addForm.ntype" label="0">需求</el-radio>
<br>
<font v-if="addForm.ntype==='0'" color="red" style="font-size:12px;">需求建议按以下逻辑描述一个需求什么人做什么事为什么</font>
<font v-if="addForm.ntype==='1'" color="red" style="font-size:12px;">需求池需求池下可建立子需求池或者需求负责汇总统计下级数据分解上级需求池预算</font>
</el-form-item>
<el-form-item v-if="!parentMenu" label="所属需求集" prop="pmenuId">
无归属需求集
<el-row>
<el-col :span="6">
<el-form-item label="序号名称" prop="seqNo" >
<el-input v-model="addForm.seqNo" style="width:100%;" placeholder="如1.0 , 1.1 , 1.1.1等" ></el-input>
</el-form-item>
<el-form-item label="名称" prop="menuName">
</el-col>
<el-col :span="18">
<el-form-item label="" prop="menuName" label-width="0px">
<el-input v-model="addForm.menuName" placeholder="名称" ></el-input>
</el-form-item>
<el-form-item label="序号" prop="seqNo">
<el-input v-model="addForm.seqNo" placeholder="如1.0 , 1.1 , 1.1.1等" ></el-input>
<span v-if="parentMenu" style="color:red;">建议{{parentMenu.seqNo}}.{{parentMenu.childrenCnt?parentMenu.childrenCnt+1:1}} </span>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="归属产品" prop="productId">
<font v-if="addForm.productId">{{addForm.productName?addForm.productName:addForm.productId}}</font>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="parentMenu" label="需求池" prop="pmenuId">
<el-link type="primary" :icon="'el-icon-folder-opened'">{{parentMenu.seqNo}} &nbsp; &nbsp; {{parentMenu.menuName}}</el-link>
</el-form-item>
<el-form-item v-if="!parentMenu" label="需求池" prop="pmenuId">
无归属需求池
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="需求类型" prop="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-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="需求来源" prop="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-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="需求层次" prop="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-select>
</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-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="mmUserid">
<el-tag type="text" v-if="addForm.mmUserid" closable @close="clearMmUser">{{addForm.mmUsername}}</el-tag>
<el-button type="text" @click="mmUserSelectVisible=true">选跟进人</el-button>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="需求概述" name="4">
<el-form-item label="需求概述" prop="remark">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="addForm.remark" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
<el-form-item label="负责人" prop="mmUserid">
<el-tag v-if="addForm.mmUserid" closable @close="clearPmUser">{{addForm.mmUsername}}</el-tag>
<el-tag v-else>未配置</el-tag>
<el-button @click="selectUser">选负责人</el-button>
</el-collapse-item>
<el-collapse-item title="成本进度预估" name="2">
<el-form-item label="预估工期" prop="budgetHours">
<el-input-number style="width:200px;" v-model="addForm.budgetHours" :precision="2" :step="8" :min="0" placeholder="预计工期(小时)"></el-input-number>&nbsp;小时
</el-form-item>
<el-form-item label="预估工作量" prop="budgetWorkload">
<el-input-number style="width:200px;" v-model="addForm.budgetWorkload" :precision="2" :step="8" :min="0" placeholder="预计总工作量(人时,不包括下一级)"></el-input-number> <el-tag>人时{{this.toFixed(addForm.budgetWorkload/8/20)}}人月</el-tag>
</el-form-item>
<el-form-item label="预估金额" prop="budgetAmount">
<el-input-number style="width:200px;" v-model="addForm.budgetAmount" :precision="2" :step="100" :min="0" placeholder="预算金额"></el-input-number>
</el-form-item>
</el-collapse-item>
<el-collapse-item title="相关链接" name="3">
<el-form-item label="需求链接" prop="demandUrl">
<el-input v-model="addForm.demandUrl" placeholder="需求链接" ></el-input>
</el-form-item>
@ -35,17 +115,20 @@
<el-form-item label="操作手册链接" prop="operDocUrl">
<el-input v-model="addForm.operDocUrl" placeholder="操作手册链接" ></el-input>
</el-form-item>
<el-form-item label="概述" prop="remark">
<el-input type="textarea" :autosize="{ minRows: 4, maxRows: 20}" v-model="addForm.remark" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-collapse-item>
</el-collapse>
</el-form>
<el-drawer title="选择员工" :visible.sync="userSelectVisible" size="60%" append-to-body>
<users-select @confirm="onUserSelected" ref="usersSelect"></users-select>
<el-drawer title="选择提出人" :visible.sync="proposerSelectVisible" size="60%" append-to-body>
<users-select @confirm="onProposerSelected" ref="usersSelect"></users-select>
</el-drawer>
<el-drawer title="选择跟进人" :visible.sync="mmUserSelectVisible" size="60%" append-to-body>
<users-select @confirm="onMmUserSelected" ref="mmUsersSelect"></users-select>
</el-drawer>
</el-row>
<el-row>
<el-row class="padding">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.add" type="primary" @click.native="addSubmit" :disabled="load.add==true">提交</el-button>
</el-row>
@ -54,7 +137,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmMenu } from '@/api/xm/core/xmMenu';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -66,30 +149,31 @@
'userInfo','roles'
])
},
props:['xmMenu','visible','parentMenu','product'],
props:['xmMenu','visible','parentMenu'],
watch: {
'xmMenu':function( xmMenu ) {
this.addForm = xmMenu;
this.addForm = {...xmMenu};
this.addForm.mmUserid=this.userInfo.userid
this.addForm.mmUsername=this.userInfo.username
},
'visible':function(visible) {
if(visible==true){
if(this.parentMenu){
if(this.parentMenu.children){
this.addForm.seqNo=this.parentMenu.seqNo+"."+(this.parentMenu.children.length+1)
debugger;
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
}
}
//
}
}
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
menuId: [
@ -107,9 +191,11 @@
},
//
addForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',seqNo:'1',mmUserid:'',mmUsername:'',ntype:'0',childrenCnt:0,sinceVersion:''
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:''
},
userSelectVisible:false,
proposerSelectVisible:false,
mmUserSelectVisible:false,
/**begin 在下面加自定义属性,记得补上面的一个逗号**/
/**end 在上面加自定义属性**/
@ -122,12 +208,12 @@
},
//XmMenu @submit="afterAddSubmit"
addSubmit: function () {
if(this.parentMenu==null && this.product ==null ){
if(this.addForm.productId==null){
this.$notify({showClose: true, message: '请选择产品/或者上级需求进行新增', type:'error' });
return;
}
if(this.parentMenu && this.parentMenu.ntype=="0"){
this.$notify({showClose: true, message: '需求下不能再建立子需求', type:'error' });
this.$notify({showClose: true, message: '需求下不能再建立子需求', type:'error' });
return;
}
this.$refs.addForm.validate((valid) => {
@ -139,13 +225,14 @@
if(this.parentMenu!=null){
params.productId=this.parentMenu.productId
params.pmenuId=this.parentMenu.menuId
}else if(this.product){
params.productId=this.product.id
}
if(params.productId==null|| params.productId==''){
this.$notify({showClose: true, message: '产品编号不能为空', type:'error' });
return;
}
if(params.remark=='作为 ,我需要 ,以便我能够 。'){
params.remark=""
}
addXmMenu(params).then((res) => {
this.load.add=false
var tips=res.data.tips;
@ -160,22 +247,40 @@
}
});
},
selectUser(){
this.userSelectVisible=true;
selectProposer(){
this.proposerSelectVisible=true;
},
onUserSelected(users){
onProposerSelected(users){
if(users && users.length>0){
this.addForm.proposerId=users[0].userid
this.addForm.proposerName=users[0].username
}
this.proposerSelectVisible=false
},
clearProposer:function(){
this.addForm.proposerId=''
this.addForm.proposerName=''
},
onMmUserSelected(users){
if(users && users.length>0){
this.addForm.mmUserid=users[0].userid
this.addForm.mmUsername=users[0].username
}
this.userSelectVisible=false
this.mmUserSelectVisible=false
},
clearPmUser:function(){
clearMmUser:function(){
this.addForm.mmUserid=''
this.addForm.mmUsername=''
}
},
/**begin 在下面加自定义方法,记得补上面的一个逗号**/
toFixed(floatValue){
if(floatValue ==null || floatValue=='' || floatValue == undefined){
return 0;
}else{
return parseFloat(floatValue).toFixed(2);
}
},
/**end 在上面加自定义方法**/
},//end method
@ -184,6 +289,10 @@
UsersSelect
},
mounted() {
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority'] ).then(res=>{
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

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

@ -5,31 +5,132 @@
<el-tab-pane label="需求详情">
<el-form :model="editForm" label-width="120px" :rules="editFormRules" ref="editForm">
<el-row class="padding-bottom">
<el-steps :active="parseInt(editForm.status)" simple finish-status="success" align-center>
<el-steps :active="calcMenuCurrStep" simple finish-status="success" align-center>
<el-step v-for="(item,index) in dicts.menuStatus" @click.native="on_click(item.id)" :title="item.name" :key="index"></el-step>
</el-steps>
</el-row>
<el-form-item label="名称" prop="menuName">
<el-collapse value="1" accordion>
<el-collapse-item title="基本信息" name="1" >
<el-form-item label="节点类型" prop="ntype">
<el-radio v-model="editForm.ntype" label="1">需求池</el-radio>
<el-radio v-model="editForm.ntype" label="0">需求</el-radio>
<br>
<font v-if="editForm.ntype==='0'" color="red" style="font-size:12px;">需求建议按以下逻辑描述一个需求什么人做什么事为什么</font>
<font v-if="editForm.ntype==='1'" color="red" style="font-size:12px;">需求池需求池下可建立子需求池或者需求负责汇总统计下级数据分解上级需求池预算</font>
</el-form-item>
<el-row>
<el-col :span="6">
<el-form-item label="序号名称" prop="seqNo" >
<el-input v-model="editForm.seqNo" style="width:100%;" placeholder="如1.0 , 1.1 , 1.1.1等" ></el-input>
</el-form-item>
</el-col>
<el-col :span="18">
<el-form-item label="" prop="menuName" label-width="0px">
<el-input v-model="editForm.menuName" placeholder="名称" ></el-input>
</el-form-item>
<el-row class="padding-bottom">
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="归属产品" prop="productId">
<font v-if="editForm.productId">{{editForm.productName?editForm.productName:editForm.productId}}</font>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="!editForm.pmenuId" label="需求池" prop="pmenuId">
无归属需求池
</el-form-item>
<el-form-item v-else label="需求池" prop="pmenuId">
<el-link type="primary" :icon="'el-icon-folder-opened'"> {{editForm.pmenuName?editForm.pmenuName:editForm.pmenuId}}</el-link>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="需求类型" prop="dtype" >
<el-select v-model="editForm.dtype">
<el-option v-for="i in this.dicts.demandType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="需求来源" prop="source">
<el-select v-model="editForm.source">
<el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="需求层次" prop="dlvl" >
<el-select v-model="editForm.dlvl">
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优先级" prop="priority" >
<el-select v-model="editForm.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-row>
<el-row>
<el-col :span="12">
<el-form-item label="序号" prop="seqNo">
<el-input v-model="editForm.seqNo" placeholder="如1.0 , 1.1 , 1.1.1等" ></el-input>
<el-form-item label="提出人" prop="proposerId">
<el-tag type="text" v-if="editForm.proposerId" closable @close="clearProposer">{{editForm.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="ntype">
{{editForm.tagNames?editForm.tagNames:''}}
<el-button type="text" icon="el-icon-plus" @click="tagSelectVisible=true">标签</el-button>
<el-form-item label="跟进人" prop="mmUserid">
<el-tag type="text" v-if="editForm.mmUserid" closable @close="clearMmUser">{{editForm.mmUsername}}</el-tag>
<el-button type="text" @click="mmUserSelectVisible=true">选跟进人</el-button>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="负责人" prop="mmUserid">
<el-tag v-if="editForm.mmUserid" closable @close="clearPmUser">{{editForm.mmUsername}}</el-tag>
<el-tag v-else>未配置</el-tag>
<el-button @click="selectUser">选负责人</el-button>
</el-collapse-item>
<el-collapse-item title="需求概述" name="4">
<el-form-item label="需求概述" prop="remark">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 20}" v-model="editForm.remark" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-collapse-item>
<el-collapse-item title="工期与工作量预估" name="2">
<el-form-item label="预估工期" prop="budgetHours">
<el-input-number style="width:200px;" v-model="editForm.budgetHours" :precision="2" :step="8" :min="0" placeholder="预计工期(小时)"></el-input-number>&nbsp;小时
</el-form-item>
<el-form-item label="预估工作量" prop="budgetWorkload">
<el-input-number style="width:200px;" v-model="editForm.budgetWorkload" :precision="2" :step="8" :min="0" placeholder="预计总工作量(人时,不包括下一级)"></el-input-number> <el-tag>人时{{this.toFixed(editForm.budgetWorkload/8/20)}}人月</el-tag>
</el-form-item>
<el-form-item label="预估金额" prop="budgetAmount">
<el-input-number style="width:200px;" v-model="editForm.budgetAmount" :precision="2" :step="100" :min="0" placeholder="预算金额"></el-input-number>
</el-form-item>
<font color="red" style="font-size:10px;">控制规则下级预估工作量总和不能大于上级预估工作量</font>
</el-collapse-item>
<el-collapse-item title="进度与实际工作量填报" name="3">
<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" v-if="editForm.calcType==='2'">
<el-input-number style="width:200px;" v-model="editForm.mactRate" :precision="2" :step="5" :min="0" :max="100" placeholder="进度"></el-input-number> &nbsp;%
</el-form-item>
<el-form-item label="实际工作量" prop="mactWorkload" v-if="editForm.calcType==='2'">
<el-input-number style="width:200px;" v-model="editForm.mactWorkload" :precision="2" :step="8" :min="0" placeholder="实际总工作量(人时)"></el-input-number> <el-tag>人时{{this.toFixed(editForm.budgetWorkload/8/20)}}人月</el-tag>
</el-form-item>
<el-form-item label="实际金额" prop="mactAmount" v-if="editForm.calcType==='2'">
<el-input-number style="width:200px;" v-model="editForm.mactAmount" :precision="2" :step="100" :min="0" placeholder="实际金额"></el-input-number>
</el-form-item>
<font color="red" style="font-size:10px;">控制规则:
<br>下级往上汇总指需求池的数据来自直接下级的需求池(需求)的数据之和逐级往上汇总
<br>由任务汇总 指需求(不包括需求池)的数据来自与该需求关联的任务的数据之和
<br>手工填报 指需求(不包括需求池)的数据来自手工填报无论是否关联了任务都不从任务汇总
</font>
</el-collapse-item>
<el-collapse-item title="相关链接" name="4">
<el-form-item label="需求链接" prop="demandUrl">
<el-input v-model="editForm.demandUrl" placeholder="需求链接" ></el-input>
</el-form-item>
@ -42,11 +143,10 @@
<el-form-item label="操作手册链接" prop="operDocUrl">
<el-input v-model="editForm.operDocUrl" placeholder="操作手册链接" ></el-input>
</el-form-item>
<el-form-item label="概述" prop="remark">
<el-input type="textarea" v-model="editForm.remark" :autosize="{ minRows: 4, maxRows: 20}" placeholder="什么人?做什么事?,为什么?如: 作为招聘专员,我需要统计员工半年在职/离职人数,以便我能够制定招聘计划" ></el-input>
</el-form-item>
</el-collapse-item>
</el-collapse>
</el-form>
<el-row >
<el-row class="padding">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="editSubmit" :disabled="load.edit==true">提交</el-button>
</el-row>
@ -59,8 +159,12 @@
<xm-menu-exchange-mng :xm-menu="xmMenu"></xm-menu-exchange-mng>
</el-tab-pane>
</el-tabs>
<el-drawer title="选择员工" :visible.sync="userSelectVisible" size="60%" append-to-body>
<users-select @confirm="onUserSelected" ref="usersSelect"></users-select>
<el-drawer title="选择提出人" :visible.sync="proposerSelectVisible" size="60%" append-to-body>
<users-select @confirm="onProposerSelected" ref="usersSelect"></users-select>
</el-drawer>
<el-drawer title="选择跟进人" :visible.sync="mmUserSelectVisible" size="60%" append-to-body>
<users-select @confirm="onMmUserSelected" ref="mmUsersSelect"></users-select>
</el-drawer>
</el-row>
@ -73,7 +177,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmMenu } from '@/api/xm/core/xmMenu';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -86,7 +190,20 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
computed: {
...mapGetters([
'userInfo','roles'
])
]),
calcMenuCurrStep(){
var menuStatus= this.dicts.menuStatus
if(!menuStatus){
return 1;
}else{
var status=menuStatus.findIndex(i=>this.editForm.status==i.id)
if(status>=0){
return status+1;
}else{
return 1;
}
}
}
},
props:['xmMenu','visible','parentMenu','product'],
watch: {
@ -101,7 +218,7 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
//dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
menuId: [
@ -119,9 +236,11 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
},
//
editForm: {
menuId:'',menuName:'',pmenuId:'',productId:'',remark:'',status:'',online:'',demandUrl:'',codeUrl:'',designUrl:'',docUrl:'',helpUrl:'',operDocUrl:'',seqNo:'1',mmUserid:'',mmUsername:'',ntype:'0',childrenCnt:0,sinceVersion:''
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:'',calcType:'1',mactWorkload:0,mactAmount:0,mactRate:0
},
userSelectVisible:false,
proposerSelectVisible:false,
mmUserSelectVisible:false,
dicts:{
menuStatus:[
@ -175,17 +294,28 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
}
});
},
selectUser(){
this.userSelectVisible=true;
selectProposer(){
this.proposerSelectVisible=true;
},
onProposerSelected(users){
if(users && users.length>0){
this.editForm.proposerId=users[0].userid
this.editForm.proposerName=users[0].username
}
this.proposerSelectVisible=false
},
clearProposer:function(){
this.editForm.proposerId=''
this.editForm.proposerName=''
},
onUserSelected(users){
onMmUserSelected(users){
if(users && users.length>0){
this.editForm.mmUserid=users[0].userid
this.editForm.mmUsername=users[0].username
}
this.userSelectVisible=false
this.mmUserSelectVisible=false
},
clearPmUser:function(){
clearMmUser:function(){
this.editForm.mmUserid=''
this.editForm.mmUsername=''
},
@ -205,6 +335,13 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
},
/**end 在上面加自定义方法**/
toFixed(floatValue){
if(floatValue ==null || floatValue=='' || floatValue == undefined){
return 0;
}else{
return parseFloat(floatValue).toFixed(2);
}
},
},//end method
components: {
// 'xm-menu-edit':XmMenuEdit
@ -214,6 +351,11 @@ import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng.vue';
XmMenuExchangeMng,
},
mounted() {
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
this.editForm=Object.assign(this.editForm, this.xmMenu);
/**在下面写其它函数***/

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

@ -1,35 +1,63 @@
<template>
<section class="padding">
<el-row v-if=" !batchEditVisible">
<el-row v-show=" !batchEditVisible">
<el-col :span="24" class="padding-left">
<el-row>
<el-popover
placement="right"
placement="bottom"
width="400"
trigger="click">
<xm-product-select v-if="!xmProduct" :auto-select="true" :sel-project="selProject" @row-click="onProductSelected" ref="xmProductMng" :xm-iteration="xmIteration" :simple="true" @clear-select="filters.product=null"></xm-product-select>
<el-link type="warning" slot="reference" v-if="!xmProduct" icon="el-icon-search"><font style="font-size:14px;">{{filters.product?filters.product.productName:'选择产品'}}</font></el-link>
trigger="manual"
v-model="productVisible">
<xm-product-select v-if="!xmProduct" :auto-select="false" :sel-project="selProject" @row-click="onProductSelected" ref="xmProductMng" :xm-iteration="xmIteration" :simple="true" @clear-select="onProductClearSelect" @close="productVisible=false"></xm-product-select>
<el-link title="产品,点击选择、清除选择" @click="productVisible=true" type="warning" slot="reference" v-if="!xmProduct" icon="el-icon-search"><font style="font-size:14px;">{{filters.product?filters.product.productName:'选择产品'}}</font></el-link>
</el-popover>
<el-select v-model="filters.status" placeholder="需求状态" clearable style="width: 100px;">
<el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.menuStatus" :key="index"></el-option>
</el-select>
<el-select v-model="filters.taskFilterType" placeholder="已关联任务的需求?" clearable style="width: 160px;">
<el-option value="not-join-any-project" label="未关联任务"></el-option>
<el-option value="join-any-project" label="已关联任务"></el-option>
<el-option value="not-join-curr-project" label="未有本项目任务关联"></el-option>
<el-option value="join-curr-project" label="有本项目任务关联"></el-option>
<el-popover
placement="bottom"
width="400"
trigger="manual"
v-model="iterationVisible">
<xm-iteration-select v-if="!xmIteration" :auto-select="false" :sel-project="selProject" @row-click="onIterationSelected" ref="xmProductMng" :xm-product="xmProduct" :simple="true" @clear-select="onIterationClearSelect" @close="iterationVisible=false"></xm-iteration-select>
<el-link title="迭代,点击选择、清除选择" @click="iterationVisible=true" type="warning" slot="reference" v-if="!xmIteration" icon="el-icon-search"><font style="font-size:14px;">{{filters.iteration?filters.iteration.iterationName:'选择迭代'}}</font></el-link>
</el-popover>
<el-select v-model="filters.taskFilterType" placeholder="已分配任务的需求?" clearable style="width: 160px;">
<el-option value="not-join-any-project" label="未分配任务"></el-option>
<el-option value="join-any-project" label="已分配任务"></el-option>
<el-option value="not-join-curr-project" label="未分配任务到本项目" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" label="已分配任务到本项目" v-if="selProject && selProject.id"></el-option>
</el-select>
<el-select v-model="filters.iterationFilterType" placeholder="加入过迭代?" clearable style="width: 160px;">
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
<el-option value="not-join-curr-iteration" label="未加入本迭代"></el-option>
<el-option value="join-curr-iteration" label="已加入本迭代"></el-option>
<el-option value="not-join-curr-iteration" label="未加入本迭代" v-if="filters.iteration && filters.iteration.id"></el-option>
<el-option value="join-curr-iteration" label="已加入本迭代" v-if="filters.iteration && filters.iteration.id"></el-option>
</el-select>
<el-select v-model="filters.dtype" clearable placeholder="需求类型">
<el-option v-for="i in this.dicts.demandType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-select v-model="filters.source" placeholder="需求来源" clearable>
<el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable class="hidden-md-and-down">
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-button class="hidden-md-and-down" v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签条件</el-button>
<el-tag class="hidden-md-and-down" v-else @click="tagSelectVisible=true" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
</el-row>
<el-row>
<el-select v-model="filters.priority" placeholder="优先级" clearable>
<el-option v-for="i in dicts.priority" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-select v-model="filters.status" placeholder="需求状态" clearable style="width: 100px;">
<el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.menuStatus" :key="index"></el-option>
</el-select>
<el-input v-model="filters.key" style="width: 15%;" placeholder="需求名称查询" clearable>
</el-input>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmMenus" icon="el-icon-search"></el-button>
<el-button class="hidden-md-and-down" v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签</el-button>
<el-tag class="hidden-md-and-down" v-else @click="tagSelectVisible=true" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmMenus" icon="el-icon-search">查询</el-button>
<el-popover style="padding-left:10px;"
placement="top-start"
width="250"
@ -44,8 +72,10 @@
</el-row>
<el-button type="primary" slot="reference" icon="el-icon-plus">需求</el-button>
</el-popover>
<el-button type="primary" @click="showParentMenu">更换上级</el-button>
<el-button v-if="!selProject&&!xmIteration&&disabledMng!=false" type="danger" @click="batchDel" icon="el-icon-delete">删除</el-button>
<el-button @click="batchEditVisible=true">批量修改</el-button>
<el-button @click="showParentMenu">更换上级</el-button>
<el-button v-if="disabledMng!=false" type="danger" @click="batchDel" icon="el-icon-delete">删除</el-button>
<el-button class="hidden-md-and-down" v-if=" batchEditVisible==false&&disabledMng!=false " @click="loadTasksToXmMenuState" icon="el-icon-s-marketing">汇总进度</el-button>
<el-popover
@ -56,7 +86,7 @@
<el-row>
<el-col :span="24" style="padding-top:5px;" >
<font class="more-label-font">标签条件:</font>
<el-button v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签</el-button>
<el-button type="text" v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签</el-button>
<el-tag v-else @click="tagSelectVisible=true" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
</el-col>
@ -83,12 +113,13 @@
<el-button v-else @click="selectFiltersMmUser()">选责任人</el-button>
<el-button @click="setFiltersMmUserAsMySelf()">我的</el-button>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求名称:
需求层次:
</font>
<el-input v-model="filters.key" style="width:100%;" placeholder="输入需求名字关键字" clearable>
</el-input>
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable>
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-button type="primary" @click="searchXmMenus" icon="el-icon-search">查询</el-button>
@ -106,7 +137,7 @@
<el-table-column sortable type="selection" width="40"></el-table-column>
<el-table-column prop="menuName" label="需求名称" min-width="260" show-overflow-tooltip>
<template slot-scope="scope">
<span class="vlink" @click="showEdit(scope.row)">{{scope.row.seqNo}} &nbsp; {{scope.row.menuName}} </span>
<span class="vlink" @click="showEdit(scope.row)" :class="scope.row.ntype==='1'?'el-icon-folder-opened':''">{{scope.row.seqNo}} &nbsp; {{scope.row.menuName}} </span>
</template>
</el-table-column>
<el-table-column prop="status" label="状态" min-width="80" show-overflow-tooltip>
@ -114,7 +145,29 @@
{{dicts.menuStatus.some(i=>i.id==scope.row.status)?dicts.menuStatus.find(i=>scope.row.status==i.id).name:''}}
</template>
</el-table-column>
<el-table-column prop="iterationName" label="迭代" min-width="80" show-overflow-tooltip>
<el-table-column prop="dtype" label="类型" width="100" :formatter="formaterByDicts" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="source" label="来源" width="100" :formatter="formaterByDicts" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="dlvl" label="层次" width="100" :formatter="formaterByDicts" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="priority" label="优先级" width="100" :formatter="formaterByDicts" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="iterationName" label="迭代" min-width="120" show-overflow-tooltip>
<template slot="header">
迭代
<el-popover v-if="xmIteration && xmIteration.id"
placement="top"
width="300"
v-model="linkIterationPopoverVisible">
<p>将需求加入还是移出迭代 <span v-if="xmIteration && xmIteration.id">{{xmIteration.iterationName}}</span>?</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="doBatchDelXmIterationMenu">移出</el-button>
<el-button type="primary" size="mini" @click="doBatchAddXmIterationMenu">加入</el-button>
</div>
<el-button type="text" slot="reference" icon="el-icon-edit" title="点击设置需求与迭代的关联关系" @click="linkIterationPopoverVisible=true">关联</el-button>
</el-popover>
</template>
</el-table-column>
<el-table-column prop="taskCnt" label="任务数" min-width="80" show-overflow-tooltip>
@ -146,7 +199,7 @@
<span>{{scope.row.ctime}} </span>
</template>
</el-table-column>
<el-table-column prop="menuName" label="负责人" min-width="100" show-overflow-tooltip>
<el-table-column prop="menuName" label="跟进人" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{scope.row.mmUsername}} </span>
</template>
@ -169,15 +222,15 @@
<el-button type="text" slot="reference" icon="el-icon-plus">{{scope.row.ntype=='1'?'子需求':''}}</el-button>
</el-popover>
<font>
<el-button v-if="scope.row.ntype!='1'" type="text" @click="showTaskListForMenu(scope.row,scope.$index)" icon="el-icon-s-operation">查任务</el-button>
<el-button v-if="scope.row.ntype!='1'" type="text" @click="showTaskList(scope.row,scope.$index)" icon="el-icon-s-operation">关联任务</el-button>
<el-button v-if="scope.row.ntype!=='1'" type="text" @click="showTaskListForMenu(scope.row,scope.$index)" icon="el-icon-s-operation">查任务</el-button>
<el-button v-if="scope.row.ntype!=='1'" type="text" @click="showTaskList(scope.row,scope.$index)" icon="el-icon-s-operation">关联任务</el-button>
</font>
</el-row>
</template>
</el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
</el-row>
<!--编辑 XmMenu xm_project_menu界面-->
@ -187,7 +240,7 @@
<!--新增 XmMenu xm_project_menu界面-->
<el-drawer title="新增需求" :visible.sync="addFormVisible" :with-header="false" size="50%" append-to-body :close-on-click-modal="false">
<xm-menu-add :product="filters.product" :parent-menu="parentMenu" :xm-menu="addForm" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-menu-add>
<xm-menu-add :parent-menu="parentMenu" :xm-menu="addForm" :visible="addFormVisible" @cancel="addFormVisible=false" @submit="afterAddSubmit"></xm-menu-add>
</el-drawer>
<el-drawer title="需求模板" :visible.sync="menuTemplateVisible" size="80%" append-to-body :close-on-click-modal="false">
<xm-menu-template-mng :is-select-menu="true" :visible="menuTemplateVisible" @cancel="menuTemplateVisible=false" @selected-menus="onSelectedMenuTemplates"></xm-menu-template-mng>
@ -196,12 +249,8 @@
<el-drawer title="需求谈论" :visible.sync=" menuDetailVisible" size="80%" append-to-body :close-on-click-modal="false">
<xm-menu-rich-detail :visible="menuDetailVisible" :reload="false" :xm-menu="editForm" ></xm-menu-rich-detail>
</el-drawer>
<el-drawer title="选择产品" :visible.sync="productVisible" size="60%" append-to-body :close-on-click-modal="false">
<xm-product-select :sel-project="selProject" @row-click="onProductSelected" ref="xmProductMng" :simple="true"></xm-product-select>
</el-drawer>
<el-drawer title="选中任务" :visible.sync="selectTaskVisible" size="80%" append-to-body :close-on-click-modal="false">
<xm-task-list :xm-product="filters.product" :sel-project="selProject" :is-multi-select="true" @tasks-selected="onSelectedTasks"></xm-task-list>
<xm-task-list :xm-product="filters.product" :sel-project="selProject" query-scope="planTask" check-scope="task" :is-multi-select="true" @tasks-selected="onSelectedTasks"></xm-task-list>
</el-drawer>
<el-drawer title="查看任务" :visible.sync="taskListForMenuVisible" :with-header="false" size="80%" append-to-body :close-on-click-modal="false">
<xm-task-list-for-menu :xm-product="filters.product" :is-multi-select="true" :menu-id="editForm.menuId"></xm-task-list-for-menu>
@ -214,25 +263,16 @@
size="80%">
<xm-task-mng :sel-project="selProject" :menu-id="editForm.menuId" :menu-name="editForm.menuName"></xm-task-mng>
</el-drawer>
<el-drawer
append-to-body
title="需求关联的迭代查询"
:with-header="false"
size="80%"
:visible.sync="iterationVisible"
>
<xm-iteration-mng :visible="iterationVisible" :product-id="editForm.productId" :menu-id="editForm.menuId" ></xm-iteration-mng>
</el-drawer>
<el-drawer title="选择员工" :visible.sync="selectFiltersMmUserVisible" size="60%" append-to-body>
<users-select @confirm="onFiltersMmUserSelected" ref="selectFiltersMmUser"></users-select>
</el-drawer>
</el-col>
</el-row>
<el-row v-if="batchEditVisible && filters.product" :span="24">
<xm-menu-mng-batch :sel-project="selProject" @no-batch-edit="noBatchEdit" :product="filters.product"></xm-menu-mng-batch>
<el-row v-if="batchEditVisible">
<xm-menu-mng-batch :xm-menus="xmMenus" :dicts="dicts" @no-batch-edit="noBatchEdit" :product="filters.product"></xm-menu-mng-batch>
</el-row>
<el-pagination layout="total, sizes, prev, pager, next" @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10,20, 50, 100, 500]" :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :total="pageInfo.total" style="float:right;"></el-pagination>
<el-drawer append-to-body title="标签条件" :visible.sync="tagSelectVisible" size="60%">
<tag-mng :tagIds="filters.tags?filters.tags.map(i=>i.tagId):[]" :jump="true" @select-confirm="onTagSelected">
@ -261,11 +301,12 @@
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMenu, delXmMenu, batchDelXmMenu,batchAddXmMenu,batchEditXmMenu,listXmMenuWithState,listXmMenuWithPlan,batchChangeParentMenu } from '@/api/xm/core/xmMenu';
import { batchRelTasksWithMenu } from '@/api/xm/core/xmTask';
import { loadTasksToXmMenuState} from '@/api/xm/core/xmMenuState';
import { batchDelXmIterationMenu,batchAddXmIterationMenu } from '@/api/xm/core/xmIterationMenu';
import XmMenuAdd from './XmMenuAdd';//
import XmMenuEdit from './XmMenuEdit';//
@ -276,7 +317,7 @@
import XmTaskList from '../xmTask/XmTaskList';
import XmTaskMng from '../xmTask/XmTaskMng';
import XmTaskListForMenu from '../xmTask/XmTaskListForMenu';
import XmIterationMng from '../xmIteration/XmIterationSelect';//
import XmIterationSelect from '../xmIteration/XmIterationSelect';//
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmMenuSelect from "../xmMenu/XmMenuSelect";
@ -295,21 +336,14 @@
xmMenusTreeData() {
let xmMenus = JSON.parse(JSON.stringify(this.xmMenus || []));
let xmMenusTreeData = treeTool.translateDataToTree(xmMenus,"pmenuId","id");
let xmMenusTreeData = treeTool.translateDataToTree(xmMenus,"pmenuId","menuId");
return xmMenusTreeData;
},
isPmUser(){
if(this.filters.product){
if(this.userInfo.userid==this.filters.product.pmUserid){
return true;
}
}
return false;
}
},
watch:{
xmIteration:function(){
this.filters.iterationFilterType="join-curr-iteration"
this.filters.iteration=this.xmIteration
this.getXmMenus()
},
xmProduct:function(){
@ -333,9 +367,12 @@
iterationFilterType:'',//joinnot-join''
taskFilterType:'',//joinnot-join''
tags:[],
parentMenu:null,
parentMenuList:[],
status:'',
iteration:null,
dlvl:'',
dtype:'',
priority:'',
source:'',
},
xmMenus: [],//
pageInfo:{//
@ -393,6 +430,7 @@
tagSelectVisible:false,
parentMenuVisible:false,
maps:new Map(),
linkIterationPopoverVisible:false,
/**begin 自定义属性请在下面加 请加备注**/
/**end 自定义属性请在上面加 请加备注**/
@ -427,10 +465,6 @@
},
getParams(params){
if(!params.productId){
params.branchId=this.userInfo.branchId
}
if( this.filters.key){
params.key="%"+this.filters.key+"%"
}
@ -440,27 +474,54 @@
}
if(this.filters.iterationFilterType){
params.iterationFilterType=this.filters.iterationFilterType
if(params.iterationFilterType==='not-join-any-iteration'){
}else if(params.iterationFilterType==='join-any-iteration'){
}else if(params.iterationFilterType==='not-join-curr-iteration'){
params.filterIterationId=this.filters.iteration.id
}else if(params.iterationFilterType==='join-curr-iteration'){
params.filterIterationId=this.filters.iteration.id
}
if(this.xmIteration){
params.filterIterationId=this.xmIteration.id
params.ntype="0"
}else{
if(this.filters.iteration){
params.iterationId=this.filters.iteration.id
}
}
if(this.xmIteration && this.xmIteration.id){
params.linkIterationId=this.xmIteration.id
}
if(this.filters.taskFilterType){
params.taskFilterType=this.filters.taskFilterType
}
if(this.selProject){
params.projectId=this.selProject.id
params.ntype="0"
}
if(this.selProject && this.selProject.id){
params.linkProjectId=this.selProject.id
}
if(this.filters.product){
params.productId=this.filters.product.id
}
if(this.filters.parentMenu){
params.pmenuId=this.filters.parentMenu.menuId
}
if(this.filters.status){
params.status=this.filters.status
}
if(this.filters.dlvl){
params.dlvl=this.filters.dlvl
}
if(this.filters.dtype){
params.dtype=this.filters.dtype
}
if(this.filters.priority){
params.priority=this.filters.priority
}
if(this.filters.source){
params.source=this.filters.source
}
if( this.dateRanger && this.dateRanger.length==2){
params.ctimeStart=this.dateRanger[0]
params.ctimeEnd=this.dateRanger[1]
@ -468,9 +529,6 @@
if(this.filters.tags && this.filters.tags.length>0){
params.tagIdList=this.filters.tags.map(i=>i.tagId)
}
if(!(params.ctimeStart||params.pmenuId||params.projectId||params.filterIterationId||params.iterationFilterType||params.mmUserid||params.key||params.taskFilterType||params.tagIdList||params.status)){
params.isTop="1"
}
return params;
},
loadXmMenusLazy(tree, treeNode, resolve) {
@ -513,11 +571,7 @@
}
if( this.filters.product && this.filters.product.id){
params.productId=this.filters.product.id
}else {
//this.$notify({showClose: true, message: "", type: 'warning'});
return;
}
params=this.getParams(params);
params.withParents="1"
//params.isTop="1"
@ -547,13 +601,27 @@
},
// XmMenu xm_project_menu
showAdd: function () {
if(this.filters.product && this.filters.product.id){
this.parentMenu=null;
this.addForm.productId=this.filters.product.id
this.addForm.productName=this.filters.product.productName
this.addFormVisible = true;
}else{
this.productVisible=true;
this.$notify({showClose: true, message: "请先选择一个产品", type: 'error'});
}
//this.addForm=Object.assign({}, this.editForm);
},
showSubAdd:function(row){
this.editForm=row
this.parentMenu=row
this.addForm.productId=row.productId
if(this.filters.product && row.productId==this.filters.product.id){
this.addForm.productName=this.filters.product.productName
}else{
this.addForm.productName=null;
}
this.addFormVisible=true
},
showProdcutAdd:function(){
@ -577,12 +645,28 @@
},
onProductSelected:function(product){
this.filters.product=product
this.filters.parentMenu=null;
this.filters.parentMenuList=[];
this.productVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
onProductClearSelect:function(){
this.filters.product=null
this.productVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
onIterationSelected:function(iteration){
this.filters.iteration=iteration
this.iterationVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
onIterationClearSelect:function(){
this.filters.iteration=null
this.iterationVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
//xmMenu
handleDel: function (row,index) {
this.$confirm('确认删除该记录吗?', '提示', {
@ -606,7 +690,11 @@
},
//xmMenu
batchDel: function () {
this.$confirm('确认删除选中记录吗?', '提示', {
if(this.sels.length==0){
this.$notify({showClose: true, message: "请先选择要删除的需求或者需求池", type: 'error'});
return;
}
this.$confirm('确认删除选中的'+this.sels.length+'条数据吗?删除后数据不可恢复', '提示', {
type: 'warning'
}).then(() => {
this.load.del=true;
@ -846,29 +934,9 @@
this.productVisible=true;
},
searchSubMenus(row,index){
this.filters.parentMenu=row
this.filters.parentMenuList.push(row);
this.pageInfo.count=true;
this.searchXmMenus();
},
clearParentMenu(menu,index){
if(index==0){
this.filters.parentMenu=null;
this.filters.parentMenuList=[];
}else{
this.filters.parentMenu=this.filters.parentMenuList[index-1];
this.filters.parentMenuList.splice(index,this.filters.parentMenuList.length-index)
}
this.pageInfo.count=true
this.searchXmMenus();
},
onParentMenuClick(menu,index){
this.filters.parentMenu=this.filters.parentMenuList[index];
this.filters.parentMenuList.splice(index+1,this.filters.parentMenuList.length-index)
this.pageInfo.count=true
this.searchXmMenus();
},
clearFiltersTag(tag){
var index=this.filters.tags.findIndex(i=>i.tagId==tag.tagId)
this.filters.tags.splice(index,1);
@ -917,6 +985,60 @@
}
this.$notify({showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
})
},
formaterByDicts(row,column,cellValue,index){
var property=column.property
var dict=null;
if(property=='source'){
dict=this.dicts['demandSource']
}else if(property=='dlvl'){
dict=this.dicts['demandLvl']
}else if(property=='dtype'){
dict=this.dicts['demandType']
}else if(property=='priority'){
dict=this.dicts['priority']
}
if(!dict){
return cellValue;
}else{
var item=dict.find(i=>i.id==cellValue)
return item?item.name:cellValue;
}
},
doBatchDelXmIterationMenu(){
if(this.sels.length==0){
this.$notify({showClose:true,message:"请选择一个或者多个需求进行操作",type:'warning'})
return;
}
var params={
menuIds:this.sels.map(i=>i.menuId),
iterationId:this.xmIteration.id
}
batchDelXmIterationMenu(params).then(res=>{
var tips =res.data.tips;
if(tips.isOk){
this.searchXmMenus();
}
this.$notify({showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
})
},
doBatchAddXmIterationMenu(){
if(this.sels.length==0){
this.$notify({showClose:true,message:"请选择一个或者多个需求进行操作",type:'warning'})
return;
}
var params={
menuIds:this.sels.map(i=>i.menuId),
iterationId:this.xmIteration.id
}
batchAddXmIterationMenu(params).then(res=>{
var tips =res.data.tips;
if(tips.isOk){
this.searchXmMenus();
}
this.$notify({showClose:true,message:tips.msg,type:tips.isOk?'success':'error'})
})
}
},//end methods
components: {
@ -928,7 +1050,7 @@
XmTaskList,
XmTaskMng,
XmTaskListForMenu,
XmIterationMng,
XmIterationSelect,
UsersSelect,
XmMenuMngBatch,
TagMng,
@ -936,6 +1058,9 @@
//
},
mounted() {
initSimpleDicts("all",['menuStatus','demandSource','demandLvl','demandType','priority']).then(res=>{
this.dicts=res.data.data;
})
this.filters.product=this.xmProduct
if(this.xmProduct && this.xmProduct.id){
this.productVisible=false;
@ -946,6 +1071,7 @@
if(this.xmIteration && this.xmIteration.id){
this.filters.iterationFilterType='join-curr-iteration'
this.filters.iteration=this.xmIteration
}
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el);

990
src/views/xm/core/xmMenu/XmMenuMngBatch.vue
File diff suppressed because it is too large
View File

32
src/views/xm/core/xmMenu/XmMenuOverview.vue

@ -5,15 +5,8 @@
<el-card class="box-card" style="padding:0px ;height:100px">
<div>
<el-row style="padding:10px">
<el-steps :active="this.xmMenu.menuStatus" finish-status="success" align-center>
<el-step title="初始"></el-step>
<el-step title="设计中"></el-step>
<el-step title="开发中"></el-step>
<el-step title="测试中"></el-step>
<el-step title="uat测试"></el-step>
<el-step title="已上线"></el-step>
<el-step title="已下线"></el-step>
<el-step title="已删除"></el-step>
<el-steps :active="calcMenuCurrStep" finish-status="success" align-center>
<el-step :title="item.name" v-for="(item,index) in dicts['menuStatus']" :key="index"></el-step>
</el-steps>
</el-row>
</div>
@ -237,7 +230,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
@ -306,6 +299,20 @@
return this.xmMenu
},
calcMenuCurrStep(){
var menuStatus= this.dicts.menuStatus
if(!menuStatus){
return 1;
}else{
var status=menuStatus.findIndex(i=>this.xmMenu.status==i.id)
if(status>=0){
return status+1;
}else{
return 1;
}
}
}
},
props:['xmMenu'],
@ -319,6 +326,7 @@
data() {
return {
isActive:true,
dicts:{},
};
},
@ -533,6 +541,10 @@
},
mounted() {
initSimpleDicts('all',['demandSource','demandLvl','demandType','priority','menuStatus'] ).then(res=>{
this.dicts=res.data.data;
})
this.$nextTick(() => {
});
this.drawAllBar();

4
src/views/xm/core/xmMenu/XmMenuRichDetail.vue

@ -39,7 +39,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmMenu,listXmMenu } from '@/api/xm/core/xmMenu';
import { mapGetters } from 'vuex'
import XmMenuExchangeMng from '../xmMenuExchange/XmMenuExchangeMng';//
@ -71,7 +71,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
menuId: [

199
src/views/xm/core/xmMenu/XmMenuSelect.vue

@ -3,25 +3,59 @@
<el-row>
<el-col :span="24" style="padding-left:12px;" >
<el-row>
<el-popover
placement="bottom"
width="400"
trigger="manual"
v-model="productVisible">
<xm-product-select v-if="!xmProduct" :auto-select="false" :sel-project="selProject" @row-click="onProductSelected" ref="xmProductMng" :xm-iteration="xmIteration" :simple="true" @clear-select="onProductClearSelect" @close="productVisible=false"></xm-product-select>
<el-link title="产品,点击选择、清除选择" @click="productVisible=true" type="warning" slot="reference" v-if="!xmProduct" icon="el-icon-search"><font style="font-size:14px;">{{filters.product?filters.product.productName:'选择产品'}}</font></el-link>
</el-popover>
<el-popover v-if="!xmProduct||!xmProduct.id"
placement="right"
<el-popover
placement="bottom"
width="400"
trigger="click">
<xm-product-select :auto-select="true" :sel-project="selProject" v-if="!xmProduct" :xm-iteration="xmIteration" @row-click="onProductSelected" ref="xmProductMng" :simple="true"></xm-product-select>
<el-link type="warning" slot="reference" icon="el-icon-search"><font style="font-size:14px;">{{filters.product?filters.product.productName:'选择产品'}}</font></el-link>
trigger="manual"
v-model="iterationVisible">
<xm-iteration-select v-if="!xmIteration" :auto-select="false" :sel-project="selProject" @row-click="onIterationSelected" ref="xmProductMng" :xm-product="xmProduct" :simple="true" @clear-select="onIterationClearSelect" @close="iterationVisible=false"></xm-iteration-select>
<el-link title="迭代,点击选择、清除选择" @click="iterationVisible=true" type="warning" slot="reference" v-if="!xmIteration" icon="el-icon-search"><font style="font-size:14px;">{{filters.iteration?filters.iteration.iterationName:'选择迭代'}}</font></el-link>
</el-popover>
<el-select class="hidden-md-and-down" v-if="excludeIterationId" v-model="filters.iterationFilterType" placeholder="是否加入过迭代?" clearable >
<el-option value="not-join" label="未加入任何迭代的需求"></el-option>
<el-option value="join" label="已加入迭代的需求"></el-option>
<el-select v-model="filters.taskFilterType" placeholder="已分配任务的需求?" clearable style="width: 160px;">
<el-option value="not-join-any-project" label="未分配任务"></el-option>
<el-option value="join-any-project" label="已分配任务"></el-option>
<el-option value="not-join-curr-project" label="未分配任务到本项目" v-if="selProject && selProject.id"></el-option>
<el-option value="join-curr-project" label="已分配任务到本项目" v-if="selProject && selProject.id"></el-option>
</el-select>
<el-select v-model="filters.iterationFilterType" placeholder="加入过迭代?" clearable style="width: 160px;">
<el-option value="not-join-any-iteration" label="未加入过迭代"></el-option>
<el-option value="join-any-iteration" label="已加入过迭代"></el-option>
<el-option value="not-join-curr-iteration" label="未加入本迭代" v-if="filters.iteration && filters.iteration.id"></el-option>
<el-option value="join-curr-iteration" label="已加入本迭代" v-if="filters.iteration && filters.iteration.id"></el-option>
</el-select>
<el-select v-model="filters.dtype" clearable placeholder="需求类型">
<el-option v-for="i in this.dicts.demandType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-select class="hidden-md-and-down" v-else v-model="filters.taskFilterType" placeholder="是否分配了任务?" clearable >
<el-option value="not-join" label="未分配任何任务的需求"></el-option>
<el-option value="join" label="已分配任务的需求"></el-option>
<el-select v-model="filters.source" placeholder="需求来源" clearable>
<el-option v-for="i in this.dicts.demandSource" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-input v-model="filters.key" closable style="width: 20%;" placeholder="需求名查询">
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable class="hidden-md-and-down">
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-row>
<el-row>
<el-button class="hidden-md-and-down" v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签条件</el-button>
<el-tag class="hidden-md-and-down" v-else @click="tagSelectVisible=true" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
<el-select v-model="filters.priority" placeholder="优先级" clearable>
<el-option v-for="i in dicts.priority" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
<el-select v-model="filters.status" placeholder="需求状态" clearable style="width: 100px;">
<el-option :value="item.id" :label="item.name" v-for="(item,index) in dicts.menuStatus" :key="index"></el-option>
</el-select>
<el-input v-model="filters.key" style="width: 15%;" placeholder="需求名称查询" clearable>
</el-input>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmMenus" icon="el-icon-search"></el-button>
<el-button type="primary" v-loading="load.list" :disabled="load.list==true" v-on:click="searchXmMenus" icon="el-icon-search">查询</el-button>
<el-popover
placement="top-start"
title=""
@ -29,27 +63,21 @@
trigger="click" >
<el-row>
<el-col :span="24" style="padding-top:5px;" >
<el-select v-model="filters.iterationFilterType" placeholder="是否加入过迭代?" clearable >
<el-option value="not-join" label="未加入任何迭代的需求"></el-option>
<el-option value="join" label="已加入迭代的需求"></el-option>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-select v-model="filters.taskFilterType" placeholder="是否分配了任务?" clearable >
<el-option value="not-join" label="未分配任何任务的需求"></el-option>
<el-option value="join" label="已分配任务的需求"></el-option>
</el-select>
<font class="more-label-font">标签条件:</font>
<el-button type="text" v-if="!filters.tags||filters.tags.length==0" @click.native="tagSelectVisible=true">标签</el-button>
<el-tag v-else @click="tagSelectVisible=true" closable @close="clearFiltersTag(filters.tags[0])">{{filters.tags[0].tagName.substr(0,5)}}({{filters.tags.length}})</el-tag>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">创建时间:</font>
<font class="more-label-font">创建日期:</font>
<el-date-picker
v-model="dateRanger"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="完成日期"
start-placeholder="创建日期"
end-placeholder="创建日期"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
@ -63,19 +91,21 @@
<el-button v-else @click="selectFiltersMmUser()">选责任人</el-button>
<el-button @click="setFiltersMmUserAsMySelf()">我的</el-button>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-col :span="24" style="padding-top:5px;" class="hidden-log-and-up">
<font class="more-label-font">
需求名称:
需求层次:
</font>
<el-input v-model="filters.key" style="width:100%;" placeholder="输入需求名字关键字" clearable>
</el-input>
<el-select v-model="filters.dlvl" placeholder="需求层次" clearable>
<el-option v-for="i in this.dicts.demandLvl" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-col>
<el-col :span="24" style="padding-top:5px;">
<el-button type="primary" @click="searchXmMenus" >查询</el-button>
<el-button type="primary" @click="searchXmMenus" icon="el-icon-search">查询</el-button>
</el-col>
</el-row>
<el-button slot="reference" icon="el-icon-more"></el-button>
</el-popover>
<el-button type="primary" v-if="multi" v-on:click="multiSelectedConfirm">确认选择</el-button>
</el-row>
<el-row style="padding-top:12px;">
@ -83,7 +113,7 @@
<el-table-column v-if="multi" type="selection" width="50"></el-table-column>
<el-table-column prop="menuName" label="需求名称" min-width="140" >
<template slot-scope="scope">
<span class="vlink" @click="toMenu(scope.row)">{{scope.row.seqNo}}&nbsp;
<span class="vlink" :class="scope.row.ntype==='1'?'el-icon-folder-opened':''" @click="toMenu(scope.row)">{{scope.row.seqNo}}&nbsp;
{{scope.row.menuName}}</span>
</template>
</el-table-column>
@ -116,12 +146,13 @@
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMenu } from '@/api/xm/core/xmMenu';
import XmProductSelect from '../xmProduct/XmProductSelect';//
import XmMenuRichDetail from './XmMenuRichDetail';
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
import XmIterationSelect from '../xmIteration/XmIterationSelect';//
import {sn} from '@/common/js/sequence'
import { mapGetters } from 'vuex'
@ -174,12 +205,12 @@
pageSize:50,//
count:false,//
pageNum:1,//1
orderFields:[],// ['sex','student_id']
orderDirs:[]// asc,desc ['asc','desc']
orderFields:['seq_no'],// ['sex','student_id']
orderDirs:['asc']// asc,desc ['asc','desc']
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmMenu
//xmMenu
@ -194,6 +225,8 @@
},
menuDetailVisible:false,
selectFiltersMmUserVisible:false,
productVisible:false,
iterationVisible:false,
/**begin 自定义属性请在下面加 请加备注**/
maxTableHeight:300,
dateRanger: [ ],
@ -228,13 +261,8 @@
this.pageInfo.count=true;
this.getXmMenus();
},
getParams(params){
if(!params.productId){
params.branchId=this.userInfo.branchId
}
if( this.filters.key){
params.key="%"+this.filters.key+"%"
}
@ -244,38 +272,65 @@
}
if(this.filters.iterationFilterType){
params.iterationFilterType=this.filters.iterationFilterType
if(params.iterationFilterType==='not-join-any-iteration'){
}else if(params.iterationFilterType==='join-any-iteration'){
}else if(params.iterationFilterType==='not-join-curr-iteration'){
params.filterIterationId=this.filters.iteration.id
}else if(params.iterationFilterType==='join-curr-iteration'){
params.filterIterationId=this.filters.iteration.id
}
params.ntype="0"
}else{
if(this.filters.iteration){
params.iterationId=this.filters.iteration.id
}
if(this.xmIteration){
params.iterationFilterType='join'
params.iterationId=this.xmIteration.id
}
if(this.xmIteration && this.xmIteration.id){
params.linkIterationId=this.xmIteration.id
}
if(this.filters.taskFilterType){
params.taskFilterType=this.filters.taskFilterType
}
if(this.selProject){
params.projectId=this.selProject.id
params.ntype="0"
}
if(this.selProject && this.selProject.id){
params.linkProjectId=this.selProject.id
}
if(this.filters.product){
params.productId=this.filters.product.id
}
if(this.filters.parentMenu){
params.pmenuId=this.filters.parentMenu.menuId
if(this.filters.status){
params.status=this.filters.status
}
if(this.filters.dlvl){
params.dlvl=this.filters.dlvl
}
if(this.filters.dtype){
params.dtype=this.filters.dtype
}
if(this.filters.priority){
params.priority=this.filters.priority
}
if(this.filters.source){
params.source=this.filters.source
}
if( this.dateRanger && this.dateRanger.length==2){
params.ctimeStart=this.dateRanger[0]
params.ctimeEnd=this.dateRanger[1]
}
if(!(params.ctimeStart||params.pmenuId||params.projectId||params.iterationId||params.iterationFilterType||params.mmUserid||params.key||params.taskFilterType)){
params.isTop="1"
if(this.filters.tags && this.filters.tags.length>0){
params.tagIdList=this.filters.tags.map(i=>i.tagId)
}
return params;
},
loadMenusLazy(row, treeNode, resolve) {
if(row.children&&row.children.length>0){
resolve(row.children)
}else{
var params={pmenuId:row.menuId}
params=this.getParams(params);
params.isTop=""
@ -290,7 +345,6 @@
resolve([])
}
}).catch( err => this.load.list = false );
}
},
// XmMenu xm_project_menu
@ -337,10 +391,6 @@
selsChange: function (sels) {
this.sels = sels;
},
onProductSelected:function(product){
this.filters.product=product
this.getXmMenus()
},
rowClick: function(row, event, column){
this.$emit('row-click',row, event, column);// @row-click="rowClick"
@ -379,15 +429,44 @@
this.filters.mmUser=this.userInfo;
this.searchXmMenus();
},
onProductSelected:function(product){
this.filters.product=product
this.productVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
onProductClearSelect:function(){
this.filters.product=null
this.productVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
onIterationSelected:function(iteration){
this.filters.iteration=iteration
this.iterationVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
onIterationClearSelect:function(){
this.filters.iteration=null
this.iterationVisible=false;
this.xmMenus=[]
this.getXmMenus()
},
/**end 自定义函数请在上面加**/
},//end methods
components: {
XmProductSelect,XmMenuRichDetail,UsersSelect
XmProductSelect,XmMenuRichDetail,UsersSelect,XmIterationSelect
//
},
mounted() {
initSimpleDicts("all",['menuStatus','demandSource','demandLvl','demandType','priority']).then(res=>{
this.dicts=res.data.data;
})
this.$nextTick(() => {
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el);

16
src/views/xm/core/xmMenu/XmMenuWithPlan.vue

@ -127,7 +127,7 @@
<el-table-column prop="planStatus" label="计划状态" min-width="80" >
<template slot-scope="scope">
<el-select v-model="scope.row.planStatus" @change="fieldChange(scope.row,'planStatus')" :disabled="!scope.row.projectId">
<el-option v-for="i in options.xmMenuPlanStatus" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in dicts.xmMenuPlanStatus" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</template>
</el-table-column>
@ -164,7 +164,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMenuWithPlan } from '@/api/xm/core/xmMenu';
import { delXmMenuPlan, batchDelXmMenuPlan,batchAddPlanFromTasks, loadTasksToXmMenuPlan,batchEditXmMenuPlan} from '@/api/xm/core/xmMenuPlan';
@ -207,7 +207,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
xmMenuPlanStatus:[]
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -484,12 +484,12 @@
}else{
return cellValue
}
if(this.options[key]==undefined || this.options[key]==null || this.options[key].length==0 ){
if(this.dicts[key]==undefined || this.dicts[key]==null || this.dicts[key].length==0 ){
return cellValue;
}
var list=this.options[key].filter(i=>i.optionValue==cellValue)
var list=this.dicts[key].filter(i=>i.id==cellValue)
if(list.length>0){
return list[0].optionName
return list[0].name
}else{
return cellValue;
}
@ -578,8 +578,8 @@
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el);
this.getXmMenus();
});
listOption([{categoryId:'all',itemCode:'xmMenuPlanStatus'} ]).then(res=>{
this.options=res.data.data;
initSimpleDicts('all',['xmMenuPlanStatus'] ).then(res=>{
this.dicts=res.data.data;
})
}
}

8
src/views/xm/core/xmMenuExchange/XmMenuExchangeMng.vue

@ -43,7 +43,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMenuExchange, delXmMenuExchange, batchDelXmMenuExchange,addXmMenuExchange } from '@/api/xm/core/xmMenuExchange';
import MenuUserEditor from './MenuUserEditor'
import { mapGetters } from 'vuex'
@ -82,7 +82,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -323,9 +323,9 @@
this.getXmMenuExchanges();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

2
src/views/xm/core/xmMenuExchange/XmMenuExchangeRoute.vue

@ -7,7 +7,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import {sn} from '@/common/js/sequence';

4
src/views/xm/core/xmMenuState/XmMenuStateAdd.vue

@ -154,7 +154,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmMenuState } from '@/api/xm/core/xmMenuState';
import { mapGetters } from 'vuex'
@ -177,7 +177,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmMenuState/XmMenuStateEdit.vue

@ -154,7 +154,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmMenuState } from '@/api/xm/core/xmMenuState';
import { mapGetters } from 'vuex'
@ -177,7 +177,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

16
src/views/xm/core/xmMenuState/XmMenuStateMng.vue

@ -121,7 +121,7 @@
<el-table-column prop="planStatus" label="计划状态" min-width="80" >
<template slot-scope="scope">
<el-select v-model="scope.row.planStatus" @change="fieldChange(scope.row,'planStatus')" :disabled="!scope.row.projectId">
<el-option v-for="i in options.xmMenuStateStatus" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in dicts.xmMenuStateStatus" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</template>
</el-table-column>
@ -152,7 +152,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMenuWithState} from '@/api/xm/core/xmMenu';
import { loadTasksToXmMenuState} from '@/api/xm/core/xmMenuState';
@ -195,7 +195,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
xmMenuStateStatus:[]
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -394,12 +394,12 @@
}else{
return cellValue
}
if(this.options[key]==undefined || this.options[key]==null || this.options[key].length==0 ){
if(this.dicts[key]==undefined || this.dicts[key]==null || this.dicts[key].length==0 ){
return cellValue;
}
var list=this.options[key].filter(i=>i.optionValue==cellValue)
var list=this.dicts[key].filter(i=>i.id==cellValue)
if(list.length>0){
return list[0].optionName
return list[0].name
}else{
return cellValue;
}
@ -484,8 +484,8 @@
this.maxTableHeight = util.calcTableMaxHeight(this.$refs.table.$el);
this.getXmMenus();
});
listOption([{categoryId:'all',itemCode:'xmMenuStateStatus'} ]).then(res=>{
this.options=res.data.data;
initSimpleDicts('all',['xmMenuStateStatus'] ).then(res=>{
this.dicts=res.data.data;
})
}
}

4
src/views/xm/core/xmMenuTemplate/XmMenuTemplateAdd.vue

@ -25,7 +25,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmMenuTemplate } from '@/api/xm/core/xmMenuTemplate';
import { mapGetters } from 'vuex'
@ -48,7 +48,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
menuId: [

4
src/views/xm/core/xmMenuTemplate/XmMenuTemplateEdit.vue

@ -25,7 +25,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmMenuTemplate } from '@/api/xm/core/xmMenuTemplate';
import { mapGetters } from 'vuex'
@ -48,7 +48,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
menuId: [

4
src/views/xm/core/xmMenuTemplate/XmMenuTemplateMng.vue

@ -47,7 +47,7 @@
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMenu, delXmMenuTemplate, batchDelXmMenuTemplate,batchEditXmMenuTemplate } from '@/api/xm/core/xmMenu';
import XmProductTplMng from '../xmProduct/XmProductTplMng';//
@ -86,7 +86,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmMenuTemplate
//xmMenuTemplate

4
src/views/xm/core/xmMyFocus/XmMyFocusAdd.vue

@ -40,7 +40,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmMyFocus } from '@/api/xm/core/xmMyFocus';
import { mapGetters } from 'vuex'
@ -63,7 +63,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmMyFocus/XmMyFocusEdit.vue

@ -40,7 +40,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmMyFocus } from '@/api/xm/core/xmMyFocus';
import { mapGetters } from 'vuex'
@ -63,7 +63,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

4
src/views/xm/core/xmMyFocus/XmMyFocusMng.vue

@ -44,7 +44,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmMyFocus, delXmMyFocus, batchDelXmMyFocus } from '@/api/xm/core/xmMyFocus';
import XmMyFocusAdd from './XmMyFocusAdd';//
import XmMyFocusEdit from './XmMyFocusEdit';//
@ -72,7 +72,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmMyFocus
//xmMyFocus

12
src/views/xm/core/xmPhase/XmPhaseAdd.vue

@ -13,12 +13,12 @@
</el-form-item>
<el-form-item label="计划类型" prop="planType">
<el-select v-model="addForm.planType">
<el-option v-for="i in this.options.planType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.planType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="任务类型" prop="taskType">
<el-select v-model="addForm.taskType">
<el-option v-for="i in this.options.taskType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.taskType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
@ -102,7 +102,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmPhase } from '@/api/xm/core/xmPhase';
import { mapGetters } from 'vuex'
@ -194,7 +194,7 @@
const endDate = new Date();
endDate.setTime(beginDate.getTime() + 3600 * 1000 * 24 * 7 * 4);
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [
@ -379,8 +379,8 @@
}
}
listOption([{categoryId:'all',itemCode:'planType'},{categoryId:'all',itemCode:'taskType'}]).then(res=>{
this.options=res.data.data;
initSimpleDicts('all',['planType','taskType']).then(res=>{
this.dicts=res.data.data;
})
}//end mounted
}

23
src/views/xm/core/xmPhase/XmPhaseBatch.vue

@ -276,7 +276,7 @@
import util from "@/common/js/util"; //
import treeTool from "@/common/js/treeTool"; //
//import Sticky from '@/components/Sticky' // header
import { listOption } from "@/api/mdp/meta/itemOption"; //
import { initSimpleDicts } from '@/api/mdp/meta/item'; //
import {
listXmPhase,
delXmPhase,
@ -420,7 +420,7 @@ export default {
},
load: { list: false, edit: false, del: false, add: false }, //...
sels: [], //
options: {
dicts: {
xmPhaseStatus: [],
}, // params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -1587,12 +1587,12 @@ export default {
},
/**end 自定义函数请在上面加**/
formateOption: function (itemCode, value) {
if (this.options[itemCode]) {
var options = this.options[itemCode].filter(
(i) => i.optionValue == value
if (this.dicts[itemCode]) {
var dicts = this.dicts[itemCode].filter(
(i) => i.id == value
);
if (options && options.length > 0) {
return options[0].optionName;
if (dicts && dicts.length > 0) {
return dicts[0].name;
} else {
return value;
}
@ -1740,12 +1740,9 @@ export default {
if (this.selProject) {
this.getXmPhases();
}
listOption([{ categoryId: "all", itemCode: "xmPhaseStatus" }]).then(
(res) => {
this.options = res.data.data;
}
);
initSimpleDicts('all',['xmPhaseStatus']).then(res=>{
this.dicts=res.data.data;
})
});
//
document.body.ondrop = function (event) {

12
src/views/xm/core/xmPhase/XmPhaseEdit.vue

@ -22,12 +22,12 @@
</el-form-item>
<el-form-item label="任务类型" prop="taskType">
<el-select v-model="editForm.taskType">
<el-option v-for="i in this.options.taskType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.taskType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="计划类型" prop="planType">
<el-select v-model="editForm.planType">
<el-option v-for="i in this.options.planType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.planType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
@ -116,7 +116,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmPhase } from '@/api/xm/core/xmPhase';
import { mapGetters } from 'vuex'
import XmPhaseOverview from './XmPhaseOverview';//
@ -202,7 +202,7 @@
const endDate = new Date();
endDate.setTime(beginDate.getTime() + 3600 * 1000 * 24 * 7 * 4);
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
id: [
@ -386,8 +386,8 @@
this.editForm=Object.assign(this.editForm, this.xmPhase);
/**在下面写其它函数***/
this.dateRanger=[this.editForm.beginDate,this.editForm.endDate]
listOption([{categoryId:'all',itemCode:'planType'},{categoryId:'all',itemCode:'taskType'}]).then(res=>{
this.options=res.data.data;
initSimpleDicts('all',['planType','taskType']).then(res=>{
this.dicts=res.data.data;
})
}//end mounted
}

16
src/views/xm/core/xmPhase/XmPhaseForProduct.vue

@ -6,7 +6,7 @@
<el-checkbox v-model="filters.milestone" true-label="1" false-label="" >里程碑</el-checkbox>
<el-checkbox v-model="filters.isKeyPath" true-label="1" false-label="" >关键路径</el-checkbox>
<el-select v-model="filters.phaseStatus" placeholder="计划状态" clearable style="width:100px;">
<el-option :label="item.name" :value="item.id" v-for="(item,index) in options.xmPhaseStatus" :key="index"></el-option>
<el-option :label="item.name" :value="item.id" v-for="(item,index) in dicts.xmPhaseStatus" :key="index"></el-option>
</el-select>
<el-input v-model="filters.key" style="width:200px;" placeholder="模糊查询">
</el-input>
@ -108,7 +108,7 @@
</el-table-column>
<el-table-column prop="phaseStatus" label="计划状态" width="100" >
<template slot-scope="scope">
<font v-if="options.xmPhaseStatus.some(i=>i.id==scope.row.phaseStatus)">{{options.xmPhaseStatus.find(i=>i.id==scope.row.phaseStatus).name}}</font>
<font v-if="dicts.xmPhaseStatus.some(i=>i.id==scope.row.phaseStatus)">{{dicts.xmPhaseStatus.find(i=>i.id==scope.row.phaseStatus).name}}</font>
</template>
</el-table-column>
<el-table-column label="操作" width="200" >
@ -186,7 +186,7 @@
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { batchAddXmPhaseMenu,batchDelXmPhaseMenu } from '@/api/xm/core/xmPhaseMenu';
import { listXmPhase,calcKeyPaths, delXmPhase, batchDelXmPhase,batchImportFromTemplate,batchSaveBudget,loadMenusToXmPhase,setPhaseMngUser,selectTotalProductAndPhaseBudgetCost } from '@/api/xm/core/xmPhase';
@ -268,7 +268,7 @@ import XmTaskList from '../xmTask/XmTaskList.vue';
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
xmPhaseStatus:[
{id:'0',name:'初始'},
{id:'1',name:'执行中'},
@ -1105,10 +1105,10 @@ import XmTaskList from '../xmTask/XmTaskList.vue';
},
/**end 自定义函数请在上面加**/
formateOption:function(itemCode,value){
if(this.options[itemCode]){
var options=this.options[itemCode].filter(i=>i.optionValue==value);
if(options && options.length > 0){
return options[0].optionName
if(this.dicts[itemCode]){
var dicts=this.dicts[itemCode].filter(i=>i.id==value);
if(dicts && dicts.length > 0){
return dicts[0].name
}else{
return value;
}

16
src/views/xm/core/xmPhase/XmPhaseMng.vue

@ -6,7 +6,7 @@
<el-checkbox v-model="filters.milestone" true-label="1" false-label="" >里程碑</el-checkbox>
<el-checkbox v-model="filters.isKeyPath" true-label="1" false-label="" >关键路径</el-checkbox>
<el-select v-model="filters.phaseStatus" placeholder="计划状态" clearable style="width:100px;">
<el-option :label="item.name" :value="item.id" v-for="(item,index) in options.xmPhaseStatus" :key="index"></el-option>
<el-option :label="item.name" :value="item.id" v-for="(item,index) in dicts.xmPhaseStatus" :key="index"></el-option>
</el-select>
<el-input v-model="filters.key" style="width:200px;" placeholder="模糊查询">
</el-input>
@ -121,7 +121,7 @@
</el-table-column>
<el-table-column prop="phaseStatus" label="计划状态" width="100" >
<template slot-scope="scope">
<font v-if="options.xmPhaseStatus.some(i=>i.id==scope.row.phaseStatus)">{{options.xmPhaseStatus.find(i=>i.id==scope.row.phaseStatus).name}}</font>
<font v-if="dicts.xmPhaseStatus.some(i=>i.id==scope.row.phaseStatus)">{{dicts.xmPhaseStatus.find(i=>i.id==scope.row.phaseStatus).name}}</font>
</template>
</el-table-column>
<el-table-column label="操作" width="200" >
@ -207,7 +207,7 @@
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { batchRelTasksWithPhase } from '@/api/xm/core/xmTask';
import { listXmPhase,calcKeyPaths, delXmPhase, batchDelXmPhase,batchImportFromTemplate,batchSaveBudget,loadTasksToXmPhase,setPhaseMngUser,selectTotalProjectAndPhaseBudgetCost } from '@/api/xm/core/xmPhase';
@ -300,7 +300,7 @@ import XmTaskList from '../xmTask/XmTaskList.vue';
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
xmPhaseStatus:[
{id:'0',name:'初始'},
{id:'1',name:'执行中'},
@ -1140,10 +1140,10 @@ import XmTaskList from '../xmTask/XmTaskList.vue';
},
/**end 自定义函数请在上面加**/
formateOption:function(itemCode,value){
if(this.options[itemCode]){
var options=this.options[itemCode].filter(i=>i.optionValue==value);
if(options && options.length > 0){
return options[0].optionName
if(this.dicts[itemCode]){
var dicts=this.dicts[itemCode].filter(i=>i.id==value);
if(dicts && dicts.length > 0){
return dicts[0].name
}else{
return value;
}

2
src/views/xm/core/xmPhase/XmPhaseOverview.vue

@ -224,7 +224,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'

18
src/views/xm/core/xmPhase/XmPhaseSelect.vue

@ -21,7 +21,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmPhase } from '@/api/xm/core/xmPhase';
import {sn} from '@/common/js/sequence'
@ -75,7 +75,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
xmPhaseStatus:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -440,10 +440,10 @@
},
/**end 自定义函数请在上面加**/
formateOption:function(itemCode,value){
if(this.options[itemCode]){
var options=this.options[itemCode].filter(i=>i.optionValue==value);
if(options && options.length > 0){
return options[0].optionName
if(this.dicts[itemCode]){
var dicts=this.dicts[itemCode].filter(i=>i.id==value);
if(dicts && dicts.length > 0){
return dicts[0].name
}else{
return value;
}
@ -467,10 +467,8 @@
this.getXmPhases();
}
listOption([
{categoryId:'all',itemCode:'xmPhaseStatus'}
]).then(res=>{
this.options=res.data.data;
initSimpleDicts('all',['xmPhaseStatus']).then(res=>{
this.dicts=res.data.data;
})
});
}

15
src/views/xm/core/xmPhaseTemplate/XmPhaseTemplateAdd.vue

@ -11,12 +11,12 @@
</el-form-item>
<el-form-item label="计划类型" prop="planType">
<el-select v-model="addForm.planType">
<el-option v-for="i in this.options.planType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.planType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="任务类型" prop="taskType">
<el-select v-model="addForm.taskType">
<el-option v-for="i in this.options.taskType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.taskType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
@ -53,7 +53,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmPhaseTemplate } from '@/api/xm/core/xmPhaseTemplate';
import { mapGetters } from 'vuex'
@ -105,7 +105,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [
@ -209,11 +209,10 @@
this.addForm.projectId=this.selProjectTemplate.id
this.addForm.projectName=this.selProjectTemplate.projectName
}
/**在下面写其它函数***/
listOption([{categoryId:'all',itemCode:'planType'},{categoryId:'all',itemCode:'taskType'}]).then(res=>{
this.options=res.data.data;
})
initSimpleDicts('all',['planType','taskType']).then(res=>{
this.dicts=res.data.data;
})
}//end mounted
}

15
src/views/xm/core/xmPhaseTemplate/XmPhaseTemplateEdit.vue

@ -11,12 +11,12 @@
</el-form-item>
<el-form-item label="计划类型" prop="planType">
<el-select v-model="editForm.planType">
<el-option v-for="i in this.options.planType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.planType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="任务类型" prop="taskType">
<el-select v-model="editForm.taskType">
<el-option v-for="i in this.options.taskType" :label="i.optionName" :key="i.optionValue" :value="i.optionValue"></el-option>
<el-option v-for="i in this.dicts.taskType" :label="i.name" :key="i.id" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
@ -53,7 +53,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmPhaseTemplate } from '@/api/xm/core/xmPhaseTemplate';
import { mapGetters } from 'vuex'
@ -101,7 +101,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
id: [
@ -196,9 +196,10 @@
},
mounted() {
this.editForm=Object.assign(this.editForm, this.xmPhaseTemplate);
/**在下面写其它函数***/
listOption([{categoryId:'all',itemCode:'planType'},{categoryId:'all',itemCode:'taskType'}]).then(res=>{
this.options=res.data.data;
initSimpleDicts('all',['planType','taskType']).then(res=>{
this.dicts=res.data.data;
})

4
src/views/xm/core/xmPhaseTemplate/XmPhaseTemplateMng.vue

@ -83,7 +83,7 @@
import util from '@/common/js/util';//
import treeTool from '@/common/js/treeTool';//
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmPhase } from '@/api/xm/core/xmPhase';
import XmProjectTemplateList from '../xmProjectTemplate/XmProjectTemplateList';//
import { mapGetters } from 'vuex'
@ -129,7 +129,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{projectType:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{projectType:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmPhaseTemplate
//xmPhaseTemplate

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

@ -54,7 +54,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmProduct,createProductCode } from '@/api/xm/core/xmProduct';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -82,7 +82,7 @@
},
data() {
return {
options:{xmProductPstatus:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{xmProductPstatus:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
productName: [

20
src/views/xm/core/xmProduct/XmProductEdit.vue

@ -3,9 +3,9 @@
<el-row class="padding-header">
<el-steps :active="calcXmProductPstatusStep" simple finish-status="success">
<el-step v-for="(i,index) in options['xmProductPstatus']" :title="i.optionName" :key="index" @click.native.stop="editForm.pstatus=i.optionValue">
<el-step v-for="(i,index) in dicts['xmProductPstatus']" :title="i.name" :key="index" @click.native.stop="editForm.pstatus=i.id">
<el-link slot="title" >
{{i.optionName}}
{{i.name}}
</el-link>
</el-step>
</el-steps>
@ -22,7 +22,7 @@
<el-form-item label="状态" prop="pstatus">
<el-select v-model="editForm.pstatus" placeholder="状态" >
<el-option v-for="(item,index) in options['xmProductPstatus']" :label="item.optionName" :value="item.optionValue" :key="index"></el-option>
<el-option v-for="(item,index) in dicts['xmProductPstatus']" :label="item.name" :value="item.id" :key="index"></el-option>
</el-select>
</el-form-item>
<el-row>
@ -64,7 +64,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmProduct } from '@/api/xm/core/xmProduct';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -76,9 +76,9 @@
'userInfo','roles'
]),
calcXmProductPstatusStep(){
if(this.options['xmProductPstatus']){
var index=this.options['xmProductPstatus'].findIndex(i=>{
if(i.optionValue==this.editForm.pstatus){
if(this.dicts['xmProductPstatus']){
var index=this.dicts['xmProductPstatus'].findIndex(i=>{
if(i.id==this.editForm.pstatus){
return true;
}else{
return false;
@ -103,7 +103,7 @@
},
data() {
return {
options:{xmProductPstatus:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{xmProductPstatus:[]},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
id: [
@ -199,9 +199,9 @@
mounted() {
listOption([{categoryId:'all',itemCode:'xmProductPstatus'}] ).then(res=>{
initSimpleDicts('all',['xmProductPstatus'] ).then(res=>{
if(res.data.tips.isOk){
this.options['xmProductPstatus']=res.data.data.xmProductPstatus
this.dicts['xmProductPstatus']=res.data.data.xmProductPstatus
}
});
this.editForm= this.xmProduct;

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

@ -37,7 +37,7 @@
<xm-product-project-for-link v-if="xmProduct && showPanel=='projects'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject"></xm-product-project-for-link>
</el-tab-pane>
<el-tab-pane label="需求" lazy name="menus" v-if="xmProduct && xmProduct.id">
<xm-menu-mng v-if="xmProduct && showPanel=='menus'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject" :disabled-mng="false"></xm-menu-mng>
<xm-menu-mng v-if="xmProduct && showPanel=='menus'" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject" :disabled-mng="true"></xm-menu-mng>
</el-tab-pane>
<el-tab-pane label="任务" lazy name="tasks" v-if="xmProduct && xmProduct.id">
<xm-task-mng v-if="xmProduct && showPanel=='tasks'" queryScope="task" ptype="0" :xm-product="xmProduct" :xm-iteration="xmIteration" :sel-project="selProject"></xm-task-mng>
@ -59,7 +59,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import XmIterationMng from '../xmIteration/XmIterationMng.vue'
import XmMenuMng from '../xmMenu/XmMenuMng.vue'
import XmIterationStateShow from '../xmIterationState/XmIterationStateShow.vue'

50
src/views/xm/core/xmProduct/XmProductInfo.vue

@ -25,18 +25,36 @@
<el-menu-item label="需求" index="需求">
<span slot="title"><i class="el-icon-document" ></i>需求</span>
</el-menu-item>
<el-menu-item index="任务">
<span slot="title"><i class="el-icon-s-operation"></i>任务</span>
<el-submenu index="任务">
<template slot="title">任务</template>
<el-menu-item index="产品任务">
<span slot="title"><i class="el-icon-view"></i>产品任务</span>
</el-menu-item>
<el-menu-item index="项目任务">
<span slot="title"><i class="el-icon-video-camera"></i>项目任务</span>
</el-menu-item>
</el-submenu >
<el-menu-item index="缺陷">
<span slot="title"><i class="el-icon-question" ></i>缺陷</span>
</el-menu-item>
<el-menu-item index="团队">
<span slot="title"><i class="el-icon-user-solid" ></i>团队</span>
<el-submenu index="团队">
<template slot="title">团队</template>
<el-menu-item index="产品团队">
<span slot="title"><i class="el-icon-solid"></i>产品团队</span>
</el-menu-item>
<el-menu-item index="计划">
<span slot="title"><i class="el-icon-odometer"></i>计划</span>
<el-menu-item index="项目团队">
<span slot="title"><i class="el-icon-solid"></i>项目团队</span>
</el-menu-item>
</el-submenu >
<el-submenu index="计划">
<template slot="title">计划</template>
<el-menu-item index="产品计划">
<span slot="title"><i class="el-icon-view"></i>产品计划</span>
</el-menu-item>
<el-menu-item index="项目计划">
<span slot="title"><i class="el-icon-video-camera"></i>项目计划</span>
</el-menu-item>
</el-submenu >
<el-submenu index="财务" class="hidden-sm-and-down">
<template slot="title">财务</template>
<el-menu-item index="合同管理">
@ -136,11 +154,15 @@
<xm-iteration-for-project-complex v-if="infotype=='迭代'" ref="xmIterationMng" :xm-product="xmProduct"></xm-iteration-for-project-complex>
<xm-project-complex v-if="infotype=='项目'" ref="xmProjectForLink" :xm-product="xmProduct"></xm-project-complex>
<xm-menu-mng v-if="infotype=='需求'" :xm-product="xmProduct"></xm-menu-mng>
<xm-task-mng v-if="infotype=='任务'" ptype="1" queryScope="task" ref="xmTaskMng" :xm-product="xmProduct" key="task"></xm-task-mng>
<xm-task-mng v-if="infotype=='产品任务'" ptype="1" queryScope="task" ref="productXmTaskMng" :xm-product="xmProduct" key="productXmTaskMng"></xm-task-mng>
<xm-task-mng v-if="infotype=='项目任务'" ptype="0" queryScope="task" ref="projectXmTaskMng" :xm-product="xmProduct" key="projectXmTaskMng"></xm-task-mng>
<xm-question v-if="infotype=='缺陷'" :qtype="'bug'" :xm-product='xmProduct' ref="xmQuestion"></xm-question>
<xm-group-mng v-if="infotype=='团队'" :xm-product="xmProduct"></xm-group-mng>
<xm-group-mng v-if="infotype=='项目团队'" pgClass="0" :xm-product="xmProduct" key="projectGroup"></xm-group-mng>
<xm-group-mng v-if="infotype=='产品团队'" pgClass="1" :xm-product="xmProduct" key="productGroup"></xm-group-mng>
<xm-file-mng v-if="infotype=='文档'" :xm-product="xmProduct"></xm-file-mng>
<xm-task-mng v-if="infotype=='计划'" ref="productPlan" ptype="1" queryScope="planTask" :xm-product="xmProduct" key="productPlan"></xm-task-mng>
<xm-task-mng v-if="infotype=='产品计划'" ref="productPlan" ptype="1" queryScope="planTask" :xm-product="xmProduct" key="productPlan"></xm-task-mng>
<xm-task-mng v-if="infotype=='项目计划'" ref="projectPlan" ptype="0" queryScope="planTask" :xm-product="xmProduct" key="projectPlan"></xm-task-mng>
<!--<xm-phase-for-product v-if="infotype=='计划'" ref="xmPhaseMng" :xm-product="xmProduct" ></xm-phase-for-product> -->
<xm-test-case-exec-mng v-if="infotype=='测试计划'" :visible="infotype=='测试计划'" :xm-product='xmProduct' ref="xmQuestion"></xm-test-case-exec-mng>
<xm-menu-with-plan v-if="infotype=='需求监控'" ref="xmMenuWithPlan" :xm-product="xmProduct"></xm-menu-with-plan>
@ -162,7 +184,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject,editStatus , delXmProject, batchDelXmProject } from '@/api/xm/core/xmProject';
import XmProjectAdd from '../xmProject/XmProjectAdd';//
import XmProjectEdit from '../xmProject/XmProjectEdit';//
@ -365,13 +387,13 @@ import XmProjectForLink from '../xmProject/XmProjectForLink.vue';
} else {
return v[j];
}
const options = this.$refs.xmMenuWithPlan.options;
if(options[key]==undefined || options[key]==null || options[key].length==0 ){
const dicts = this.$refs.xmMenuWithPlan.dicts;
if(dicts[key]==undefined || dicts[key]==null || dicts[key].length==0 ){
return v[j];
}
var rowData=options[key].filter(i=>i.optionValue==v[j])
var rowData=dicts[key].filter(i=>i.id==v[j])
if(rowData.length>0){
return rowData[0].optionName
return rowData[0].name
}else{
return v[j];
}

51
src/views/xm/core/xmProduct/XmProductMng.vue

@ -12,6 +12,10 @@
<el-option label="我相关的产品" value="compete"></el-option>
<el-option label="按产品编号精确查找" value="productId"></el-option>
</el-select>
<el-select v-model="filters.pstatus" clearable placeholder="状态">
<el-option v-for="(item,index) in dicts['xmProductPstatus']" :value="item.id" :label="item.name" :key="index"></el-option>
</el-select>
<el-input v-if="filters.queryScope=='productId'" style="width:20%;" v-model="filters.id" placeholder="输入产品编号" @keyup.enter.native="searchXmProducts">
</el-input>
<el-input v-model="filters.key" style="width: 20%;" placeholder="名称查询" clearable>
@ -155,6 +159,8 @@
<el-table-column type="index" width="60">
</el-table-column>
<el-table-column prop="code" label="产品代号" min-width="100" sortable >
</el-table-column>
<el-table-column prop="productName" label="产品名称" min-width="200" sortable >
<template slot-scope="scope" >
<el-link id="guider-three" type="primary" @click="intoInfo(scope.row)">{{scope.row.productName}}</el-link>
@ -177,6 +183,33 @@
</template>
</el-table-column>
<el-table-column prop="menuCnt" label="需求数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<span title=" 已完成 / 总需求数">{{scope.row.menuCnt>0?scope.row.menuFinishCnt+'&nbsp;/&nbsp;'+scope.row.menuCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="projectCnt" label="项目数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<span title="实际发生的关联项目数">{{scope.row.projectCnt>0? scope.row.projectCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="iterationCnt" label="迭代数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<span title="实际发生的关联迭代数">{{scope.row.iterationCnt>0? scope.row.iterationCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="taskCnt" label="任务数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<span title=" 已完成 / 总任务数">{{scope.row.taskCnt>0?scope.row.finishTaskCnt+'&nbsp;/&nbsp;'+scope.row.taskCnt:''}}</span>
</template>
</el-table-column>
<el-table-column prop="bugCnt" label="缺陷数" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<span title=" 已关闭 / 总缺陷数 ">{{scope.row.bugCnt>0?scope.row.closedBugs+'&nbsp;/&nbsp;'+scope.row.bugCnt:''}}</span>
</template>
</el-table-column>
<el-table-column label="工作量(人时)" width="200">
<el-table-column prop="planWorkload" label="预计" width="100" show-overflow-tooltip sortable></el-table-column>
<el-table-column prop="actWorkload" label="实际" width="100" show-overflow-tooltip sortable></el-table-column>
@ -185,7 +218,7 @@
<el-table-column label="操作" width="200" fixed="right">
<template slot-scope="scope">
<el-button id="guider-five" type="text" title="通过复制创建新的产品" @click="onCopyToBtnClick(scope.row)" :disabled="load.add" v-loading="load.add">复制</el-button>
<el-button type="text" @click="showProductState(scope.row)" icon="el-icon-s-data">报告</el-button>
<el-button type="text" @click="intoInfo(scope.row)" icon="el-icon-s-data">视图</el-button>
<el-button type="text" v-loading="load.del" @click="handleDel(scope.row)" :disabled="load.del==true" icon="el-icon-delete">删除</el-button>
</template>
</el-table-column>
@ -265,7 +298,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProduct,listXmProductWithState, delXmProduct, batchDelXmProduct,copyTo,createProductCode } from '@/api/xm/core/xmProduct';
import { addXmIterationLink,delXmIterationLink } from '@/api/xm/core/xmIterationLink';
import { loadTasksToXmProductState } from '@/api/xm/core/xmProductState';
@ -308,6 +341,7 @@
queryScope:'compete',//compete/branchId/''/productId
id:'',//
pmUser:null,//
pstatus:'',
},
xmProducts: [],//
pageInfo:{//
@ -320,7 +354,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
xmProductPstatus:[]
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -443,6 +477,9 @@
if(this.filters.pmUser){
params.pmUserid=this.filters.pmUser.userid
}
if(this.filters.pstatus){
params.pstatus=this.filters.pstatus
}
this.load.list = true;
listXmProductWithState(params).then((res) => {
var tips=res.data.tips;
@ -656,9 +693,9 @@
})
},
formatPstatus(row, column, cellValue, index){
var item=this.options.xmProductPstatus.find(i=>i.optionValue==cellValue)
var item=this.dicts.xmProductPstatus.find(i=>i.id==cellValue)
if(item){
return item.optionName
return item.name
}else{
return cellValue;
}
@ -691,9 +728,9 @@
},
mounted() {
listOption([{categoryId:'all',itemCode:'xmProductPstatus'}] ).then(res=>{
initSimpleDicts('all',['xmProductPstatus'] ).then(res=>{
if(res.data.tips.isOk){
this.options['xmProductPstatus']=res.data.data.xmProductPstatus
this.dicts['xmProductPstatus']=res.data.data.xmProductPstatus
}
});
this.$nextTick(() => {

16
src/views/xm/core/xmProduct/XmProductOverview.vue

@ -6,7 +6,7 @@
<div>
<el-row style="padding:10px">
<el-steps :active="calcXmProductPstatusStep" align-center finish-status="success">
<el-step v-for="(i,index) in options['xmProductPstatus']" :title="i.optionName" :key="index" >
<el-step v-for="(i,index) in dicts['xmProductPstatus']" :title="i.name" :key="index" >
</el-step>
</el-steps>
@ -242,7 +242,7 @@
import util from "@/common/js/util"; //
import { mapGetters } from "vuex";
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
export default {
computed: {
@ -309,9 +309,9 @@ export default {
return this.xmProduct;
},
calcXmProductPstatusStep(){
if(this.options['xmProductPstatus']){
var index=this.options['xmProductPstatus'].findIndex(i=>{
if(i.optionValue==this.xmProductCpd.pstatus){
if(this.dicts['xmProductPstatus']){
var index=this.dicts['xmProductPstatus'].findIndex(i=>{
if(i.id==this.xmProductCpd.pstatus){
return true;
}else{
return false;
@ -337,7 +337,7 @@ export default {
data() {
return {
isActive: true,
options:{
dicts:{
xmProductPstatus:[]
},
maxTableHeight:300,
@ -598,9 +598,9 @@ export default {
mounted() {
listOption([{categoryId:'all',itemCode:'xmProductPstatus'}] ).then(res=>{
initSimpleDicts('all',['xmProductPstatus'] ).then(res=>{
if(res.data.tips.isOk){
this.options['xmProductPstatus']=res.data.data.xmProductPstatus
this.dicts['xmProductPstatus']=res.data.data.xmProductPstatus
}
});
this.$nextTick(() => {

41
src/views/xm/core/xmProduct/XmProductOverviewComplex.vue

@ -13,11 +13,26 @@
<el-menu-item index="productProjectLink">
<span slot="title">配置可见项目</span>
</el-menu-item>
<el-menu-item index="productCalc">
<span slot="title">执行数据汇总计划</span>
</el-menu-item>
</el-menu>
<xm-product-overview v-if="showPanelName=='overview'" :xm-product="xmProduct"></xm-product-overview>
<xm-product-edit v-if="showPanelName=='detail'" :xm-product="xmProduct"></xm-product-edit>
<xm-iteration-link-for-product v-if="showPanelName=='iterationProductLink'" :xm-product="xmProduct"></xm-iteration-link-for-product>
<xm-product-project-link-mng v-if="showPanelName=='productProjectLink'" :xm-product="xmProduct"></xm-product-project-link-mng>
<div v-if="showPanelName=='productCalc'" class="padding">
<el-row>
<el-button type="primary" @click="loadTasksToXmProductState" v-loading="load.calcProduct">计算产品汇总数据</el-button>
<br>
<font color="red" style="font-size:10px;">将从项目任务及产品任务中汇总进度预算工作量实际工作量预算金额实际金额缺陷数需求数等数据到产品统计表</font>
</el-row>
<el-row>
<el-button type="primary" @click="loadTasksToXmMenuState" v-loading="load.calcMenu">计算所有需求数据</el-button>
<br>
<font color="red" style="font-size:10px;">将从项目任务汇总进度预算工作量实际工作量预算金额实际金额等数据到需求统计表</font>
</el-row>
</div>
</section>
</template>
@ -29,7 +44,8 @@ import XmProductOverview from './XmProductOverview.vue';
import XmProductEdit from './XmProductEdit.vue';
import XmIterationLinkForProduct from '../xmIterationLink/XmIterationLinkForProduct.vue';
import XmProductProjectLinkMng from '../xmProductProjectLink/XmProductProjectLinkMng.vue';
import { loadTasksToXmProductState } from '@/api/xm/core/xmProductState';
import { loadTasksToXmMenuState} from '@/api/xm/core/xmMenuState';
export default {
components: { XmProductOverview, XmProductEdit, XmIterationLinkForProduct, XmProductProjectLinkMng },
@ -42,12 +58,33 @@ export default {
},
data() {
return {
showPanelName:'overview'
showPanelName:'overview',
load:{calcProduct:false,calcMenu:false}
};
},
methods:{
loadTasksToXmProductState: function () {
this.load.calcProduct=true;
let params = { productId: this.xmProduct.id };
loadTasksToXmProductState(params).then((res) => {
this.load.calcProduct=false;
var tips=res.data.tips;
this.$notify({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.calcProduct=false );
},
loadTasksToXmMenuState: function () {
this.load.calcMenu=true;
let params = { productId: this.xmProduct.id };
loadTasksToXmMenuState(params).then((res) => {
this.load.calcMenu=false;
var tips=res.data.tips;
this.$notify({showClose: true, message: tips.msg, type: tips.isOk?'success':'error' });
}).catch( err => this.load.calcMenu=false );
},
onMenuToolBarSelect(menuIndex){
this.showPanelName=menuIndex;
}

2
src/views/xm/core/xmProduct/XmProductProjectForLink.vue

@ -17,7 +17,7 @@
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
import config from "@/common/config"; //
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProject, } from '@/api/xm/core/xmProject';
import { mapGetters } from 'vuex'
import XmProjectForLink from '../xmProject/XmProjectForLink.vue';

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

@ -130,7 +130,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProductWithState,unDelXmProduct } from '@/api/xm/core/xmProduct';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -175,7 +175,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmProduct
//xmProduct

11
src/views/xm/core/xmProduct/XmProductSelect.vue

@ -8,12 +8,12 @@
<el-table-column v-if="isSelectProduct==true" label="产品代号" prop="code" min-width="100" show-overflow-tooltip > </el-table-column>
<el-table-column prop="productName" label="产品名称" show-overflow-tooltip>
<template slot="header" slot-scope="scope">
产品名称 <el-button type="text" @click="clearSelect">清空所选</el-button>
产品名称 <el-button type="text" @click="clearSelect">清空所选</el-button>&nbsp;<el-button type="text" @click="close">关闭</el-button>
<el-popover
placement="top-start"
title=""
width="400"
trigger="click" >
trigger="hover" >
<el-row>
<el-col :span="24" style="padding-top:5px;">
<font class="more-label-font">
@ -91,7 +91,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProductWithState } from '@/api/xm/core/xmProduct';
import { mapGetters } from 'vuex'
import UsersSelect from "@/views/mdp/sys/user/UsersSelect";
@ -136,7 +136,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmProduct
//xmProduct
@ -315,6 +315,9 @@
clearSelect(){
this.$refs.table.setCurrentRow();
this.$emit("clear-select");
},
close(){
this.$emit("close");
}
},//end methods
components: {

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

@ -121,7 +121,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProduct,listXmProductWithState, delXmProduct, batchDelXmProduct,copyTo,createProductCode } from '@/api/xm/core/xmProduct';
import { addXmIterationLink,delXmIterationLink } from '@/api/xm/core/xmIterationLink';
import { loadTasksToXmProductState } from '@/api/xm/core/xmProductState';
@ -162,7 +162,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmProduct
//xmProduct

4
src/views/xm/core/xmProductProjectLink/XmProductProjectLinkAdd.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmProductProjectLink } from '@/api/xm/core/xmProductProjectLink';
import { mapGetters } from 'vuex'
@ -57,7 +57,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
projectId: [

4
src/views/xm/core/xmProductProjectLink/XmProductProjectLinkEdit.vue

@ -34,7 +34,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmProductProjectLink } from '@/api/xm/core/xmProductProjectLink';
import { mapGetters } from 'vuex'
@ -57,7 +57,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
projectId: [

8
src/views/xm/core/xmProductProjectLink/XmProductProjectLinkMng.vue

@ -35,7 +35,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProductProjectLink,addXmProductProjectLink, delXmProductProjectLink, batchDelXmProductProjectLink } from '@/api/xm/core/xmProductProjectLink';
import XmProductProjectLinkAdd from './XmProductProjectLinkAdd';//
import XmProductProjectLinkEdit from './XmProductProjectLinkEdit';//
@ -74,7 +74,7 @@ import XmProjectSelect from '../xmProject/XmProjectSelect.vue';
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -279,9 +279,9 @@ import XmProjectSelect from '../xmProject/XmProjectSelect.vue';
this.maxTableHeight = util.calcTableMaxHeight(".el-table")
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmProductState/XmProductStateAdd.vue

@ -124,7 +124,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmProductState } from '@/api/xm/core/xmProductState';
import { mapGetters } from 'vuex'
@ -147,7 +147,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmProductState/XmProductStateEdit.vue

@ -124,7 +124,7 @@
<script>
import util from '@/common/js/util';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmProductState } from '@/api/xm/core/xmProductState';
import { mapGetters } from 'vuex'
@ -147,7 +147,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

8
src/views/xm/core/xmProductState/XmProductStateMng.vue

@ -41,7 +41,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProductState, delXmProductState, batchDelXmProductState } from '@/api/xm/core/xmProductState';
import { mapGetters } from 'vuex'
@ -68,7 +68,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{
dicts:{
//sex:[],
},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
@ -231,9 +231,9 @@
this.getXmProductStates();
});
/**
listOption([{categoryId:'all',itemCode:'sex'},{categoryId:'all',itemCode:'grade'}] ).then(res=>{
initSimpleDicts( "all",["sex","grade"] ).then(res=>{
if(res.data.tips.isOk){
this.options=res.data.data
this.dicts=res.data.data
}
});
**/

4
src/views/xm/core/xmProductTemplate/XmProductTemplateAdd.vue

@ -25,7 +25,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmProductTemplate } from '@/api/xm/core/xmProductTemplate';
import { mapGetters } from 'vuex'
@ -48,7 +48,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
addFormRules: {
id: [

4
src/views/xm/core/xmProductTemplate/XmProductTemplateEdit.vue

@ -25,7 +25,7 @@
<script>
import util from '@/common/js/util';//
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmProductTemplate } from '@/api/xm/core/xmProductTemplate';
import { mapGetters } from 'vuex'
@ -48,7 +48,7 @@
},
data() {
return {
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, edit: false, del: false, add: false },//...
editFormRules: {
id: [

4
src/views/xm/core/xmProductTemplate/XmProductTemplateMng.vue

@ -49,7 +49,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { listXmProduct } from '@/api/xm/core/xmProduct';
import XmProductTemplateAdd from './XmProductTemplateAdd';//
import XmProductTemplateEdit from './XmProductTemplateEdit';//
@ -78,7 +78,7 @@
},
load:{ list: false, edit: false, del: false, add: false },//...
sels: [],//
options:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts:{},// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
addFormVisible: false,//xmProductTemplate
//xmProductTemplate

27
src/views/xm/core/xmProject/XmProjectAdd.vue

@ -16,13 +16,13 @@
</el-form-item>
<el-form-item label="项目属性" prop="xmType">
<el-select v-model="addForm.xmType">
<el-option v-for="(i,index) in options['projectType']" :label="i.optionName" :value="i.optionValue" :key="index"></el-option>
<el-option v-for="(i,index) in dicts['projectType']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
<el-select v-model="addForm.urgent">
<el-option v-for="(i,index) in options['urgencyLevel']" :label="i.optionName" :value="i.optionValue" :key="index"></el-option>
<el-option v-for="(i,index) in dicts['urgencyLevel']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
<el-select v-model="addForm.priority">
<el-option v-for="(i,index) in options['priority']" :label="i.optionName" :value="i.optionValue" :key="index"></el-option>
<el-option v-for="(i,index) in dicts['priority']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="预算控制">
@ -167,7 +167,7 @@
import util from '@/common/js/util';//
import {sn} from '@/common/js/sequence';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { addXmProject,createProjectCode } from '@/api/xm/core/xmProject';
import { mapGetters } from 'vuex';
@ -304,7 +304,7 @@
filters: {
ids: [],
},
options:{
dicts:{
projectType:[],
urgencyLevel:[],
priority:[],
@ -505,19 +505,10 @@
mounted() {
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el);
listOption([{categoryId:'all',itemCode:'projectType'},{categoryId:'all',itemCode:'urgencyLevel'},{categoryId:'all',itemCode:'priority'},{categoryId:'all',itemCode:'projectStatus'}] ).then(res=>{
if(res.data.tips.isOk){
this.options['projectType']=res.data.data.projectType
this.options['urgencyLevel']=res.data.data.urgencyLevel
this.options['priority']=res.data.data.priority
this.options['projectStatus']=res.data.data.projectStatus
this.addForm.xmType=this.options['projectType'][0].optionValue
this.addForm.urgent=this.options['urgencyLevel'][0].optionValue
this.addForm.priority=this.options['priority'][0].optionValue
//this.addForm.projectStatus=this.options['projectStatus'][0].optionValue
}
});
initSimpleDicts('all',['projectType','urgencyLevel','priority','projectStatus']).then(res=>{
this.dicts=res.data.data;
})
}
}

2
src/views/xm/core/xmProject/XmProjectAssess.vue

@ -47,7 +47,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex';
import VueEditor from '@/components/Tinymce/index';
import { editAssess, listXmProject, delXmProject, batchDelXmProject } from '@/api/xm/core/xmProject';

2
src/views/xm/core/xmProject/XmProjectBudgetCost.vue

@ -103,7 +103,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex';
import { editBudget } from '@/api/xm/core/xmProject';
import { listSumXmProjectMBudgetCostUser } from '@/api/xm/core/xmProjectMBudgetCostUser';

2
src/views/xm/core/xmProject/XmProjectComplex.vue

@ -64,7 +64,7 @@
<script>
import util from '@/common/js/util';//
import config from '@/common/config';//
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import XmIterationMng from '../xmIteration/XmIterationMng.vue'
import XmMenuMng from '../xmMenu/XmMenuMng.vue'
import XmIterationStateShow from '../xmIterationState/XmIterationStateShow.vue'

2
src/views/xm/core/xmProject/XmProjectCost.vue

@ -101,7 +101,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
//import { listOption } from '@/api/mdp/meta/itemOption';//
//import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex';
import { editBudget } from '@/api/xm/core/xmProject';
import { listSumXmProjectMCostUser } from '@/api/xm/core/xmProjectMCostUser';

2
src/views/xm/core/xmProject/XmProjectDetail.vue

@ -9,7 +9,7 @@
<script>
import util from '@/common/js/util';//
//import Sticky from '@/components/Sticky' // header
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { mapGetters } from 'vuex'
import { listXmProject } from '@/api/xm/core/xmProject';
import XmProjectEdit from './XmProjectEdit';//

50
src/views/xm/core/xmProject/XmProjectEdit.vue

@ -2,27 +2,30 @@
<section class="page-container padding border">
<el-row class="padding-bottom">
<el-steps :active="calcProjectStatusStep" simple finish-status="success">
<el-step v-for="(i,index) in options['projectStatus']" :title="i.optionName" :key="index" @click.native.stop="editForm.status=i.optionValue">
<el-link slot="title" @click.native.stop="editForm.status=i.optionValue">
{{i.optionName}}
<el-step v-for="(i,index) in dicts['projectStatus']" :title="i.name" :key="index" @click.native.stop="editForm.status=i.id">
<el-link slot="title" @click.native.stop="editForm.status=i.id">
{{i.name}}
</el-link>
</el-step>
</el-steps>
</el-row>
<el-row class="page-main" ref="table" :style="{overflowX:'auto',height:maxTableHeight+'px'}">
<el-form :model="editForm" label-width="150px" :rules="editFormRules" ref="editForm" class="editForm">
<el-collapse value="1" accordion>
<el-collapse-item title="基本信息" name="1">
<el-form-item label="项目编号|名称" prop="name">
<el-input v-model="editForm.code" placeholder="项目编号,不可为空" style="width:20%;" ></el-input><el-input style="width:80%;" v-model="editForm.name" placeholder="" ></el-input>
</el-form-item>
<el-form-item label="项目属性" prop="xmType">
<el-select v-model="editForm.xmType">
<el-option v-for="(i,index) in options['projectType']" :label="i.optionName" :value="i.optionValue" :key="index"></el-option>
<el-option v-for="(i,index) in dicts['projectType']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
<el-select v-model="editForm.urgent">
<el-option v-for="(i,index) in options['urgencyLevel']" :label="i.optionName" :value="i.optionValue" :key="index"></el-option>
<el-option v-for="(i,index) in dicts['urgencyLevel']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
<el-select v-model="editForm.priority">
<el-option v-for="(i,index) in options['priority']" :label="i.optionName" :value="i.optionValue" :key="index"></el-option>
<el-option v-for="(i,index) in dicts['priority']" :label="i.name" :value="i.id" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="预算控制">
@ -60,6 +63,11 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="项目描述" prop="description">
<el-input type="textarea" :rows="6" v-model="editForm.description" placeholder="项目描述" ></el-input>
</el-form-item>
</el-collapse-item>
<el-collapse-item title="工期及成本预估" name="2">
<el-form-item label="工期及成本预估" >
<el-row>
<el-date-picker
@ -75,7 +83,7 @@
:default-time="['00:00:00','23:59:59']"
:picker-options="pickerOptions"
></el-date-picker>
<el-input style="width:150px;" type="number" v-model="editForm.planWorkingHours" :precision="2" :step="8" :min="0" placeholder="预计工时"></el-input><el-tag>参考工时{{autoParams.weekday*8}}小时,工作日{{autoParams.weekday}}</el-tag>
<el-input style="width:150px;" type="number" v-model="editForm.planWorkingHours" :precision="2" :step="8" :min="0" placeholder="预计工时"></el-input>小时 &nbsp;&nbsp;<el-tag>参考工时{{autoParams.weekday*8}}小时,工作日{{autoParams.weekday}}</el-tag>
</el-row>
<el-divider></el-divider>
@ -138,9 +146,8 @@
当前毛利率为<el-tag>{{toFixed(parseFloat2(autoParams.currentBudgetMarginRate)*100,2)}}%</el-tag>
</el-row>
</el-form-item>
<el-form-item label="项目描述" prop="description">
<el-input type="textarea" :rows="6" v-model="editForm.description" placeholder="项目描述" ></el-input>
</el-form-item>
</el-collapse-item>
</el-collapse>
</el-form>
</el-row>
<el-row>
@ -167,7 +174,7 @@
import {sn} from '@/common/js/sequence';//
import config from "@/common/config"; //
import { listOption } from '@/api/mdp/meta/itemOption';//
import { initSimpleDicts } from '@/api/mdp/meta/item';//
import { editXmProject,getDefOptions } from '@/api/xm/core/xmProject';
import { uploadBase64 } from '@/api/mdp/arc/image';
@ -276,9 +283,9 @@
return this.editForm.totalReceivables
},
calcProjectStatusStep(){
if(this.options['projectStatus'] && this.editForm){
var index=this.options['projectStatus'].findIndex(i=>{
if(i.optionValue==this.editForm.status){
if(this.dicts['projectStatus'] && this.editForm){
var index=this.dicts['projectStatus'].findIndex(i=>{
if(i.id==this.editForm.status){
return true;
}else{
return false;
@ -366,7 +373,7 @@
filters: {
ids: [],
},
options: getDefOptions(),// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
dicts: getDefOptions(),// params=[{categoryId:'0001',itemCode:'sex'}] {'sex':[{optionValue:'1',optionName:'',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'',seqOrder:'2',fp:'',isDefault:'0'}]}
load:{ list: false, add: false, del: false, edit: false },//...
editFormRules: {
name: [{
@ -738,16 +745,11 @@
this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el);
this.editForm=Object.assign({},this.selProject);
this.dateRanger=[this.editForm.startTime,this.editForm.endTime]
listOption([{categoryId:'all',itemCode:'projectType'},{categoryId:'all',itemCode:'urgencyLevel'},{categoryId:'all',itemCode:'priority'},{categoryId:'all',itemCode:'projectStatus'}] ).then(res=>{
if(res.data.tips.isOk){
this.options['projectType']=res.data.data.projectType
this.options['urgencyLevel']=res.data.data.urgencyLevel
this.options['priority']=res.data.data.priority
this.options['projectStatus']=res.data.data.projectStatus
//this.editForm.projectStatus=this.options['projectStatus'][0].optionValue
}
});
initSimpleDicts('all',['projectType','urgencyLevel','priority','projectStatus']).then(res=>{
this.dicts=res.data.data;
})
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save