gangyj vor 3 Jahren
Ursprung
Commit
57f58e2a5e

+ 21 - 0
src/api/manager/contractinfo.js

@@ -107,3 +107,24 @@ export const resetPasswordByUserId = (userId) => {
     }
   })
 }
+
+export const submitWbsTreeInContract = (obj) => {
+  return request({
+    url: '/api/blade-manager/contractInfo/submitWbsTreeInContract',
+    method: 'post',
+    data: obj
+  })
+}
+
+export const getContractInfoTree = (wbsId,projectId,contractId) => {
+  return request({
+    url: '/api/blade-manager/contractInfo/tree',
+    method: 'get',
+    params: {
+      wbsId,
+      projectId,
+      contractId,
+    }
+  })
+}
+

+ 30 - 0
src/api/manager/projectinfo.js

@@ -29,3 +29,33 @@ export const getProjectDeatil = (id) => {
     }
   })
 }
+
+export const findWbsTreeList = (type) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/findWbsTreeList',
+    method: 'get',
+    params: {
+      type
+    }
+  })
+}
+
+export const findProjectTree = (projectId,wbsId) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/tree',
+    method: 'get',
+    params: {
+      projectId,
+      wbsId
+    }
+  })
+}
+
+export const submitWbsTreeInProject = (obj) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/submitWbsTreeInProject',
+    method: 'post',
+    data: obj
+  })
+}
+

+ 59 - 1
src/components/tree-tree/main.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="flex pd-20">
     <el-card class="box-card flex1">
-      <div slot="header" class="clearfix">
+      <div slot="header" class="flex jc-sb">
         <span>{{leftNum}}项</span>
+        <el-checkbox v-if="showAllCheck" v-model="allChecked" @change="checkChang">默认全部引用</el-checkbox>
       </div>
       <div>
         <el-scrollbar :style="scrollbarStyle">
@@ -51,6 +52,10 @@ export default {
     scrollbarStyle:{
       type:String,
       default:'height:calc(100vh - 400px)'
+    },
+    showAllCheck:{
+      type:Boolean,
+      default:false
     }
   },
   computed: {
@@ -66,6 +71,7 @@ export default {
       rightTreeData:[],
       rightNum:0,
       rightExpands:[],
+      allChecked:false,
     }
   },
 
@@ -80,6 +86,7 @@ export default {
       //console.log(allTree,'allTree');
       this.getRightTree(allTree,keys);
       this.rightTreeData = allTree;
+      this.$emit('onAddTree',this.rightTreeData);
     },
     getRightTree(arr,keys){
       //对比所有的node和选中的key
@@ -114,6 +121,8 @@ export default {
       })
       this.rightNum = this.$refs.rightTree.getCheckedKeys().length;
       this.leftNum = this.$refs.leftTree.getCheckedKeys().length;
+
+      this.$emit('onDelTree',delNodes);
     },
 
     nodeExpand(data){
@@ -130,6 +139,55 @@ export default {
           break;
       }
     },
+
+    setRightTree(data){
+      this.rightTreeData = data;
+
+      let ids = [];
+      for (let i = 0; i < data.length; i++) {
+        this.getLeafIds(ids,data[i])
+      }
+      //在左边把右边的节点勾选上
+      this.$nextTick(()=>{
+        this.$refs.leftTree.setCheckedKeys(ids,true);
+      })
+    },
+
+    getTreeAllId(treeName){
+      let tree = this.$refs[treeName];
+      if(this.allChecked){
+        tree = this.$refs.leftTree;
+      }
+      //console.log(tree.data);
+      let ids = [];
+      for (let i = 0; i < tree.data.length; i++) {
+        this.getIds(ids,tree.data[i]);
+      }
+      //console.log(obj)
+      return ids.join(',');
+    },
+    getIds(ids,data){
+      ids.push(data.id);
+      if(data.children && data.children.length){
+        for (let i = 0; i < data.children.length; i++) {
+          this.getIds(ids,data.children[i]);
+        }
+      }
+    },
+
+    getLeafIds(ids,data){
+      if(data.children && data.children.length){
+        for (let i = 0; i < data.children.length; i++) {
+          this.getLeafIds(ids,data.children[i]);
+        }
+      }else{
+        ids.push(data.id)
+      }
+    },
+
+    checkChang(){
+      this.$emit('onCheckAll');
+    }
   }
 };
 </script>

+ 73 - 35
src/views/manager/contractinfo/detail.vue

@@ -181,13 +181,8 @@
         </el-tab-pane>
         <el-tab-pane label="分配WBS" name="2">
           <div>
-            <div class="text-align-c">
-              <span class="mg-r-20">选择WBS</span>
-              <el-select v-model="wbsId" @change="wbsChange" placeholder="请选择WBS" style="width:500px;">
-                <el-option v-for="item in wbsList" :key="item.id" :label="item.wbsName" :value="item.id"></el-option>
-              </el-select>
-            </div>
-            <tree-tree :left-tree-data="leftTreeData"></tree-tree>
+            <div v-if="!wbsId" class="text-align-c">项目暂未分配wbs树</div>
+            <tree-tree :left-tree-data="leftTreeData" ref="treetotree" @onAddTree="treeChang" @onDelTree="treeChang" ></tree-tree>
           </div>
         </el-tab-pane>
         <el-tab-pane label="分配项目人员" name="3">
@@ -256,13 +251,12 @@
 </template>
 
 <script>
-  import {getProjectDeatil} from "@/api/manager/projectinfo";
+  import {getProjectDeatil,findProjectTree} from "@/api/manager/projectinfo";
   import {submitContractInfo,getContractInfo,delFileFromUrl,
           findJobByRoleId,findAllUserByCondition,findUserByName,
-          saveUserInfoByProject,removeUsersByIds,resetPasswordByUserId} from "@/api/manager/contractinfo";
+          saveUserInfoByProject,removeUsersByIds,resetPasswordByUserId,
+          submitWbsTreeInContract,getContractInfoTree} from "@/api/manager/contractinfo";
   import {getRoleTree} from "@/api/system/role";
-  import {getList as getwbsList} from "@/api/manager/wbsinfo";
-  import {getAlltree} from "@/api/manager/wbstree";
   import {getDictionary} from "@/api/system/dict";
   import {remove as removeFile} from "@/api/resource/attach";
   import website from '@/config/website';
@@ -318,7 +312,6 @@
         copyText:'',
 
         wbsId:'',
-        wbsList:[],
         leftTreeData:[],
       }
     },
@@ -332,12 +325,13 @@
         },
         deep: true
       },
-      activeType: function (newValue) {
+      activeType: async function (newValue) {
         if(newValue == '3'){
           this.getRoleList();
           this.getUserByName();
         }else if(newValue == '2'){
-          this.getWBSList();
+          await this.getLeftTree();
+          this.getRightTree();
         }
       },
       rId:function(newValue){
@@ -371,20 +365,20 @@
       })
     },
     methods: {
-      init(){
+      async init(){
         this.pid = this.$route.query.pid;
         this.cid = this.$route.query.cid;
         if(!this.cid){
           this.contractForm.pid = this.pid;
         }else{
-          this.getContractInfo();
+          await this.getContractInfo();
         }
+        await this.getProjectDeatil();
         if(this.$route.query.type){
           this.activeType = this.$route.query.type;
         }
 
         this.getContractTypeList();
-        this.getProjectDeatil();
         this.setHeaders(); 
       },
       beforeLeave(activeName, oldActiveName){
@@ -418,21 +412,31 @@
       },
 
       getProjectDeatil(){
-        getProjectDeatil(this.pid).then((res)=>{
-          this.projectInfo = res.data.data;
+        return new Promise((resolve)=>{
+          getProjectDeatil(this.pid).then((res)=>{
+            this.projectInfo = res.data.data;
+            this.wbsId = this.projectInfo.referenceWbsTemplateId;
+            resolve();
+          }).finally(()=>{
+            resolve();
+          })
         })
       },
       getContractInfo(){
-        getContractInfo(this.cid).then((res)=>{
-          this.contractForm = res.data.data;
-          if(this.contractForm.startFileUrl){
-            this.isBackShow = true;
-          }
-          if(this.contractForm.projectPlace){
-            this.flageData = ['','',this.contractForm.projectPlace]
-          }
-          this.$nextTick(()=>{
-            this.typeChang['1'] = false;
+        return new Promise((resolve)=>{
+          getContractInfo(this.cid).then((res)=>{
+            this.contractForm = res.data.data;
+            if(this.contractForm.startFileUrl){
+              this.isBackShow = true;
+            }
+            if(this.contractForm.projectPlace){
+              this.flageData = ['','',this.contractForm.projectPlace]
+            }
+            this.$nextTick(()=>{
+              this.typeChang['1'] = false;
+            })
+          }).finally(()=>{
+            resolve();
           })
         })
       },
@@ -440,6 +444,8 @@
       async saveQuit(){
         if(this.activeType == '1'){
           await this.savecontract();
+        }else if(this.activeType == '2'){
+          await this.saveWbsTree();
         }
         this.$message({
           type: "success",
@@ -451,6 +457,8 @@
         if(this.activeType == '1'){
           let res = await this.savecontract();
           this.contractForm.id = res.data.data.id;
+        }else if(this.activeType == '2'){
+          await this.saveWbsTree();
         }
         this.$message({
           type: "success",
@@ -666,17 +674,47 @@
        })
      },
 
-    getWBSList(){
-      getwbsList().then((res)=>{
-        this.wbsList = res.data.data.records;
+    getLeftTree(){
+      return new Promise((resolve)=>{
+        if(!this.leftTreeData.length){
+          findProjectTree(this.projectInfo.id,this.wbsId).then((res)=>{
+            if(Array.isArray(res.data.data)){
+              this.leftTreeData = res.data.data;
+            }else{
+              this.leftTreeData = [];
+            }
+            resolve();
+          }).finally(()=>{
+            resolve();
+          })
+        }
+        resolve();
       })
     },
-    wbsChange(wbsid){
-      getAlltree(this.userInfo.tenant_id,'',wbsid).then((res)=>{
-        this.leftTreeData = res.data.data;
+    getRightTree(){
+      getContractInfoTree(this.wbsId,this.projectInfo.id,this.contractForm.id).then((res)=>{
+        if(Array.isArray(res.data.data)){
+          this.$refs.treetotree.setRightTree(res.data.data);
+        }
       })
     },
 
+    saveWbsTree(){
+      let obj = {};
+      let ids = this.$refs.treetotree.getTreeAllId('rightTree');
+      obj = {
+        wbsId:this.wbsId,
+        projectId:this.projectInfo.id,
+        contractId:this.contractForm.id,
+        wbsTreeIds:ids
+      }
+      return submitWbsTreeInContract(obj);
+     },
+
+     treeChang(){
+      this.typeChang[2] = true;
+    }
+
     }
   };
 </script>

+ 119 - 8
src/views/manager/projectinfo/detail.vue

@@ -62,17 +62,27 @@
           <div>
             <div class="text-align-c">
               <el-radio-group v-model="templateType">
-                <el-radio :label="1">试验</el-radio>
-                <el-radio :label="2">质检</el-radio>
+                <el-radio :label="2">试验</el-radio>
+                <el-radio :label="1">质检</el-radio>
               </el-radio-group>
             </div>
             <div class="text-align-c mg-t-20">
               <span class="mg-r-20">选择WBS</span>
               <el-select v-model="wbsId" @change="wbsChange" placeholder="请选择WBS" style="width:500px;">
-                <el-option v-for="item in wbsList" :key="item.id" :label="item.wbsName" :value="item.id"></el-option>
+                <el-option-group
+                  v-for="group in treeList"
+                  :key="group.label"
+                  :label="group.label">
+                  <el-option
+                    v-for="(item,index) in group.options"
+                    :key="index"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-option-group>
               </el-select>
             </div>
-            <tree-tree :left-tree-data="leftTreeData" scrollbarStyle="height:calc(100vh - 500px)"></tree-tree>
+            <tree-tree :left-tree-data="leftTreeData" scrollbarStyle="height:calc(100vh - 500px)" ref="treetotree" :show-all-check="true" @onAddTree="treeChang" @onDelTree="treeChang" @onCheckAll="treeChang"></tree-tree>
           </div>
         </el-tab-pane>
         <el-tab-pane label="分配系统维护人员" name="3">
@@ -136,10 +146,11 @@
 </template>
 
 <script>
-  import {submitProject,getProjectDeatil} from "@/api/manager/projectinfo";
+  import {submitProject,getProjectDeatil,findWbsTreeList,findProjectTree,submitWbsTreeInProject} from "@/api/manager/projectinfo";
   import {findContractByProjectId,saveUserInfoByProject,findUserListByCondition,
           findUserByName,removeUsersByIds} from "@/api/manager/contractinfo";
   import {getRoleTree} from "@/api/system/role";
+  import {getAlltree} from "@/api/manager/wbstree";
   import {getDictionary} from "@/api/system/dict";
   import {mapGetters} from "vuex";
 
@@ -184,8 +195,10 @@
           value:"id"
         },
 
-        templateType:2,
-
+        templateType:1,
+        treeList:[],
+        wbsId:'',
+        leftTreeData:[],
       }
     },
     computed: {
@@ -198,12 +211,31 @@
         },
         deep: true
       },
-      activeType: function (newValue) {
+      activeType: async function (newValue) {
         if(newValue == '3'){
           this.getContractList();
           this.getRoleList();
           this.getUserByCondition();
           this.getUserByName();
+        }else if(newValue == '2'){
+          let refId = this.projectForm.referenceWbsTemplateId;
+          if(refId && refId>0){
+            //有引用id,回显
+            this.wbsId = refId;
+            let projectTree = await findProjectTree(this.projectForm.id,refId)
+            if(Array.isArray(projectTree.data.data)){
+              this.templateType = projectTree.data.data[0].wbsType;
+              let leftData = await getAlltree(this.userInfo.tenant_id,'1',refId)
+              if(Array.isArray(leftData.data.data)){
+                this.leftTreeData = leftData.data.data;
+              }else{
+                this.leftTreeData = [];
+              }
+              this.$refs.treetotree.setRightTree(projectTree.data.data);
+            }
+          }
+          
+          this.getTreeList();
         }
       }
     },
@@ -270,6 +302,8 @@
      async saveQuit(){
        if(this.activeType == '1'){
           await this.saveProject();
+        }else if(this.activeType == '2'){
+          await this.saveWbsTree();
         }
        this.$message({
           type: "success",
@@ -281,6 +315,8 @@
         if(this.activeType == '1'){
           let res = await this.saveProject();
           this.projectForm.id = res.data.data.id;
+        }else if(this.activeType == '2'){
+          await this.saveWbsTree();
         }
         this.$message({
           type: "success",
@@ -309,6 +345,17 @@
        })
      },
 
+     saveWbsTree(){
+      let obj = {};
+      let ids = this.$refs.treetotree.getTreeAllId('rightTree');
+      obj = {
+        wbsId:this.wbsId,
+        projectId:this.projectForm.id,
+        wbsTreeIds:ids
+      }
+      return submitWbsTreeInProject(obj);
+     },
+
      addUserToProject(){
        if(!this.userId){
          this.$message({
@@ -417,6 +464,70 @@
         getRoleTree().then((res)=>{
           this.roleList = res.data.data
         })
+      },
+
+      wbsChange(value){
+        //console.log(value)
+        if(value.toString().indexOf(',') >= 0){
+          //私有库
+          let ids = value.toString().split(',');
+          findProjectTree(ids[1],ids[0]).then((res)=>{
+            if(Array.isArray(res.data.data)){
+              this.leftTreeData = res.data.data;
+            }else{
+              this.leftTreeData = [];
+            }
+          })
+        }else{
+          //公有库
+          getAlltree(this.userInfo.tenant_id,'1',value).then((res)=>{
+            if(Array.isArray(res.data.data)){
+              this.leftTreeData = res.data.data;
+            }else{
+              this.leftTreeData = [];
+            }
+          })
+        }
+      },
+
+      getTreeList(){
+        return new Promise((resolve)=>{
+          if(this.treeList.length){
+            resolve();
+          }
+          findWbsTreeList(this.templateType).then((res)=>{
+            let arr = [{
+              label:'公有库',
+              options:[],
+            },
+            {
+              label:'私有库',
+              options:[],
+            }];
+            let data = res.data.data;
+            if(data.wbsInfos && data.wbsInfos.length){
+              data.wbsInfos.forEach((element)=>{
+                element.label = element.wbsName;
+                element.value = element.id;
+              })
+              arr[0].options = data.wbsInfos;
+            }
+            if(data.wbsTreePrivates && data.wbsTreePrivates.length){
+              data.wbsTreePrivates.forEach((element)=>{
+                element.label = element.projectName;
+                element.value = element.wbsId +','+ element.projectId;
+              })
+              arr[1].options = data.wbsTreePrivates;
+            }
+            this.treeList = arr;
+          }).finally(()=>{
+            resolve();
+          })
+        })
+      },
+
+      treeChang(){
+        this.typeChang[2] = true;
       }
 
     }